{"id":15170608,"url":"https://github.com/capturecontext/swiftui-dynamic-forms","last_synced_at":"2025-09-18T22:44:37.047Z","repository":{"id":44820260,"uuid":"449311282","full_name":"CaptureContext/swiftui-dynamic-forms","owner":"CaptureContext","description":null,"archived":false,"fork":false,"pushed_at":"2023-01-05T01:01:22.000Z","size":58,"stargazers_count":8,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-18T03:00:02.155Z","etag":null,"topics":["combine","dynamic","forms","swift","swiftui","udf"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/CaptureContext.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-01-18T14:13:10.000Z","updated_at":"2023-11-14T16:57:04.000Z","dependencies_parsed_at":"2022-08-25T13:00:43.863Z","dependency_job_id":null,"html_url":"https://github.com/CaptureContext/swiftui-dynamic-forms","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/CaptureContext/swiftui-dynamic-forms","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CaptureContext%2Fswiftui-dynamic-forms","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CaptureContext%2Fswiftui-dynamic-forms/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CaptureContext%2Fswiftui-dynamic-forms/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CaptureContext%2Fswiftui-dynamic-forms/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CaptureContext","download_url":"https://codeload.github.com/CaptureContext/swiftui-dynamic-forms/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CaptureContext%2Fswiftui-dynamic-forms/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":275845311,"owners_count":25538996,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-18T02:00:09.552Z","response_time":77,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["combine","dynamic","forms","swift","swiftui","udf"],"created_at":"2024-09-27T08:04:13.760Z","updated_at":"2025-09-18T22:44:37.008Z","avatar_url":"https://github.com/CaptureContext.png","language":"Swift","readme":"# swiftui-dynamic-forms\n\n\u003e The package is early alpha (prototyping stage)\n\u003e Run `make workspace` from the terminal to generate `.xcworkspace` for the example\n\n\n\n## TODO\n\n- **Components**\n  - [x] `DynamicText`\n  - [x] `DynamicButton`\n  - [x] `DynamicStack`\n  - [x] `DynamicTextField`\n  - [x] `DynamicTextView`\n  - [x] `DynamicSpacer`\n  - [ ] `DynamicImage`\n  - [x] `DynamicToggle`\n  - [ ] `DynamicImage`\n  - [ ] `DynamicConfirmationDialog`\n  - [ ] `DynamicAlert`\n  - [ ] `DynamicDragField`\n  - [ ] `DynamicDropField`\n  - [ ] `DynamicLink`\n  - [ ] `DynamicNavigationView`\n- **Features**\n  - [ ] Codable support\n  - [ ] Remove SwiftUI Dependency\n    - Create SwiftUI-independent DynamicText modifiers for `Color` and `Font`\n  - [ ] Custom modifiers\n- **To-think-about**\n  - API improvements for state management\n  - API improvements for action handling\n  - Helper for derived (optional/collection) `Binding`s\n\n\n\n## Usage\n\n[**Example**](Example/Shared/ContentView.swift)\n\n- Import `DynamicForms`\n\n- Declare your dynamic form model\n\n  ```swift\n  DynamicForm {\n    DynamicStack(.vertical) {\n      DynamicText(\"Title\").bold()\n      DynamicText(\"Description\")\n      DynamicStack(.horizontal) {\n        DynamicText(\"State: \")\n        DynamicText(\"Initial\")\n      }\n      DynamicStack(.horizontal) {\n        DynamicButton(\n          DynamicText(\"OK\"),\n          action: \"content.ok\"\n        )\n        DynamicButton(\n          DynamicText(\"Cancel\"),\n          action: \"content.cancel\"\n        )\n      }\n    }\n  }\n  ```\n\n  \u003e Equivalent for\n  \u003e\n  \u003e ```swift\n  \u003e VStack {\n  \u003e   Text(\"Title\").bold()\n  \u003e   Text(\"Description\")\n  \u003e   HStack {\n  \u003e     Text(\"State: \")\n  \u003e     Text(\"Initial\")\n  \u003e   }\n  \u003e   HStack {\n  \u003e     Button { \n  \u003e       DynamicFormClient.shared.send(\"content.id\")\n  \u003e     } label: {\n  \u003e       Text(\"OK\")\n  \u003e     }\n  \u003e     Button { \n  \u003e       DynamicFormClient.shared.send(\"content.cancel\")\n  \u003e     } label: {\n  \u003e       Text(\"Cancel\")\n  \u003e     }\n  \u003e   }\n  \u003e }\n  \u003e ```\n\n- Specify body for your dynamic-form-based view using `DynamicFormView`\n\n  ```swift\n  DynamicFormView($form)\n  ```\n\n- Handle button actions\n\n  ```swift\n  // Returns AnyPublisher\u003cEvent, Never\u003e where Event is\n  // Event {\n  //   id: DynamicElementIdentifier\n  //   action: DynamicElementActionIdentifier\n  // }\n  DynamicFormClient.shared.publisher\n  \n  // Filters events and returns AnyPublisher\u003cVoid, Never\u003e\n  DynamicFormClient.shared.publisher(\n    for: .init(id: \"element\", action: \"tap\")\n  )\n  \n  // Filters events by actionID and returns AnyPublisher\u003cVoid, Never\u003e\n  DynamicFormClient.shared.publisher(\n    for: \"actionID\"\n  )\n  ```\n\n\n\n## Installation\n\n### Basic\n\nYou can add DynamicForms to an Xcode project by adding it as a package dependency.\n\n1. From the **File** menu, select **Swift Packages › Add Package Dependency…**\n2. Enter [`\"https://github.com/capturecontext/swiftui-dynamic-forms.git\"`](https://github.com/capturecontext/swiftui-dynamic-forms.git) into the package repository URL text field\n3. Choose products you need to link them to your project.\n\n### Recommended\n\nIf you use SwiftPM for your project, you can add StandardClients to your package file.\n\n```swift\n.package(\n  name: \"swiftui-dynamic-forms\",\n  url: \"https://github.com/capturecontext/swiftui-dynamic-forms.git\", \n  .branch(\"0.1.0\")\n)\n```\n\nDo not forget about target dependencies:\n\n```swift\n.product(\n  name: \"DynamicFormss\", \n  package: \"swiftui-dynamic-forms\"\n)\n```\n\n\n\n## License\n\nThis library is released under the MIT license. See [LICENSE](LICENSE) for details.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcapturecontext%2Fswiftui-dynamic-forms","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcapturecontext%2Fswiftui-dynamic-forms","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcapturecontext%2Fswiftui-dynamic-forms/lists"}