@mich8060/unified-design-system 0.2.34 → 0.2.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/dist/ai/discovery.json +7 -1
  2. package/dist/ai/examples/admin-users-table-uds.jsonl +5 -0
  3. package/dist/ai/examples/calendar-events-layout-uds.jsonl +5 -0
  4. package/dist/ai/examples/dashboard-statistics-uds.jsonl +5 -0
  5. package/dist/ai/examples/dataset.index.json +42 -0
  6. package/dist/ai/examples/kanban-board-uds.jsonl +5 -0
  7. package/dist/ai/examples/settings-preferences-uds.jsonl +5 -0
  8. package/dist/ai/examples/signin-flow-uds.jsonl +9 -0
  9. package/dist/ai/examples/training.examples.cjs +1 -1
  10. package/dist/ai/examples/training.examples.js +1 -1
  11. package/dist/ai/examples/uds-governed-training.jsonl +5 -0
  12. package/dist/ai/figma-make.contract.json +11 -1
  13. package/dist/ai/figma-make.md +53 -7
  14. package/dist/ai/layout/architecture.json +39 -0
  15. package/dist/ai/manifest/composition.manifest.cjs +1 -1
  16. package/dist/ai/manifest/composition.manifest.js +1 -1
  17. package/dist/ai/manifest/intent-mappings.manifest.cjs +1 -1
  18. package/dist/ai/manifest/intent-mappings.manifest.js +1 -1
  19. package/dist/ai/manifest/patterns.manifest.cjs +1 -1
  20. package/dist/ai/manifest/patterns.manifest.js +1 -1
  21. package/dist/ai/manifest.json +538 -66
  22. package/dist/ai/navigation/brand-menus.json +7 -0
  23. package/dist/ai/policies/policy.engine.cjs +1 -1
  24. package/dist/ai/policies/policy.engine.js +1 -1
  25. package/dist/ai/policies/rules/pattern-structure.rules.cjs +1 -0
  26. package/dist/ai/policies/rules/pattern-structure.rules.js +1 -0
  27. package/dist/ai/policies/rules/props.rules.cjs +1 -1
  28. package/dist/ai/policies/rules/props.rules.js +1 -1
  29. package/dist/ai/prompts/figma-make.prompt.md +7 -0
  30. package/dist/ai/prompts/system.prompt.md +4 -1
  31. package/dist/ai/schemas/ai-output.schema.json +1 -0
  32. package/dist/ai/templates/layouts.json +5 -0
  33. package/dist/ai/tokens/catalog.json +72 -0
  34. package/dist/ai/validation/validateAIOutput.cjs +1 -1
  35. package/dist/ai/validation/validateAIOutput.js +1 -1
  36. package/dist/app-shell/AppShell.d.ts +4 -0
  37. package/dist/components/ActionMenu/ActionMenu.cjs +1 -1
  38. package/dist/components/ActionMenu/ActionMenu.js +1 -1
  39. package/dist/components/Dropdown/Dropdown.cjs +1 -1
  40. package/dist/components/Dropdown/Dropdown.js +1 -1
  41. package/dist/components/Layout/Layout.cjs +1 -0
  42. package/dist/components/Layout/Layout.js +1 -0
  43. package/dist/components/Link/Link.cjs +1 -0
  44. package/dist/components/Link/Link.js +1 -0
  45. package/dist/components/Menu/Menu.cjs +1 -1
  46. package/dist/components/Menu/Menu.js +1 -1
  47. package/dist/components/ProvidersCard/ProvidersCard.cjs +1 -1
  48. package/dist/components/ProvidersCard/ProvidersCard.js +1 -1
  49. package/dist/components/SectionHeader/SectionHeader.cjs +1 -1
  50. package/dist/components/SectionHeader/SectionHeader.js +1 -1
  51. package/dist/design-system/ai/examples/training.examples.d.ts +1 -0
  52. package/dist/design-system/ai/manifest/intent-mappings.manifest.d.ts +1 -1
  53. package/dist/design-system/ai/policies/policy.engine.d.ts +3 -1
  54. package/dist/design-system/ai/policies/policy.types.d.ts +1 -0
  55. package/dist/design-system/ai/policies/rules/pattern-structure.rules.d.ts +2 -0
  56. package/dist/design-system/components/ActionMenu/ActionMenu.d.ts +1 -1
  57. package/dist/design-system/components/ActionMenu/ActionMenu.types.d.ts +3 -0
  58. package/dist/design-system/components/Dropdown/Dropdown.d.ts +1 -2
  59. package/dist/design-system/components/Dropdown/Dropdown.types.d.ts +0 -1
  60. package/dist/design-system/components/Flex/index.d.ts +2 -2
  61. package/dist/design-system/components/Layout/Layout.d.ts +16 -0
  62. package/dist/design-system/components/{Flex/Flex.types.d.ts → Layout/Layout.types.d.ts} +2 -6
  63. package/dist/design-system/components/Layout/index.d.ts +3 -0
  64. package/dist/design-system/components/Link/Link.d.ts +4 -0
  65. package/dist/design-system/components/Link/Link.types.d.ts +8 -0
  66. package/dist/design-system/components/Link/index.d.ts +3 -0
  67. package/dist/design-system/constants.d.ts +1 -1
  68. package/dist/design-system/figma-make/index.d.ts +1 -1
  69. package/dist/design-system/generated/component-api.d.ts +111 -16
  70. package/dist/design-system/index.d.ts +2 -1
  71. package/dist/design-system/version.d.ts +1 -1
  72. package/dist/figma-make/index.cjs +1 -1
  73. package/dist/figma-make/index.js +1 -1
  74. package/dist/generated/component-api.cjs +1 -1
  75. package/dist/generated/component-api.js +1 -1
  76. package/dist/index.cjs +1 -1
  77. package/dist/index.js +1 -1
  78. package/dist/src/app-shell/AppShell.cjs +1 -1
  79. package/dist/src/app-shell/AppShell.js +1 -1
  80. package/dist/style.css +1 -1
  81. package/dist/version.cjs +1 -1
  82. package/dist/version.js +1 -1
  83. package/package.json +15 -2
  84. package/dist/components/Flex/Flex.cjs +0 -1
  85. package/dist/components/Flex/Flex.js +0 -1
  86. package/dist/design-system/components/Flex/Flex.d.ts +0 -10
@@ -8,6 +8,7 @@
8
8
  "@mich8060/unified-design-system/ai/schema",
9
9
  "@mich8060/unified-design-system/ai/icons",
10
10
  "@mich8060/unified-design-system/ai/icons.json",
11
+ "@mich8060/unified-design-system/ai/token-catalog",
11
12
  "@mich8060/unified-design-system/ai/figma-make.json",
12
13
  "@mich8060/unified-design-system/ai/figma-make",
13
14
  "@mich8060/unified-design-system/ai/prompts/figma-make",
@@ -15,8 +16,10 @@
15
16
  "@mich8060/unified-design-system/ai/prompts/repair",
16
17
  "@mich8060/unified-design-system/ai/prompts/starter",
17
18
  "@mich8060/unified-design-system/ai/navigation",
19
+ "@mich8060/unified-design-system/ai/layout-architecture",
18
20
  "@mich8060/unified-design-system/ai/templates",
19
21
  "@mich8060/unified-design-system/ai/examples",
22
+ "@mich8060/unified-design-system/ai/examples/dataset",
20
23
  "@mich8060/unified-design-system/ai/validation",
21
24
  "@mich8060/unified-design-system/ai/sdk"
22
25
  ],
@@ -26,6 +29,7 @@
26
29
  "schema": "@mich8060/unified-design-system/ai/schema",
27
30
  "iconCatalog": "@mich8060/unified-design-system/ai/icons",
28
31
  "iconCatalogJson": "@mich8060/unified-design-system/ai/icons.json",
32
+ "tokenCatalog": "@mich8060/unified-design-system/ai/token-catalog",
29
33
  "figmaMakeContractJson": "@mich8060/unified-design-system/ai/figma-make.json",
30
34
  "figmaMakeContract": "@mich8060/unified-design-system/ai/figma-make",
31
35
  "figmaMakePrompt": "@mich8060/unified-design-system/ai/prompts/figma-make",
@@ -33,16 +37,18 @@
33
37
  "repairPrompt": "@mich8060/unified-design-system/ai/prompts/repair",
34
38
  "starterPrompt": "@mich8060/unified-design-system/ai/prompts/starter",
35
39
  "brandMenus": "@mich8060/unified-design-system/ai/navigation",
40
+ "layoutArchitecture": "@mich8060/unified-design-system/ai/layout-architecture",
36
41
  "templatesCatalog": "@mich8060/unified-design-system/ai/templates",
37
42
  "runtimeApi": "@mich8060/unified-design-system/ai",
38
43
  "manifestModule": "@mich8060/unified-design-system/ai/manifest",
39
44
  "validationModule": "@mich8060/unified-design-system/ai/validation",
40
45
  "helperSdk": "@mich8060/unified-design-system/ai/sdk",
41
46
  "examplesModule": "@mich8060/unified-design-system/ai/examples",
47
+ "examplesDataset": "@mich8060/unified-design-system/ai/examples/dataset",
42
48
  "validateAlias": "@mich8060/unified-design-system/ai/validate"
43
49
  },
44
50
  "versioning": {
45
- "system": "0.2.12",
51
+ "system": "0.2.35",
46
52
  "token": "1.0.0",
47
53
  "manifest": "1.0.0",
48
54
  "governance": "1.0.0",
@@ -0,0 +1,5 @@
1
+ {"id":"users-page-shell","schemaVersion":"1.1.0","task":"Render users admin page with UDS shell","input":"Create a users management page with header, filters, and table.","output":{"component":"Layout","props":{"direction":"column","gap":"16","fullWidth":true},"children":[{"name":"SectionHeader","props":{"title":"Users","description":"Manage active users, roles, and account status."}},{"name":"Layout","props":{"direction":"row","justifyContent":"space-between","alignItems":"center","gap":"12","wrap":true},"children":[{"name":"SearchInput","props":{"placeholder":"Search users...","size":"default"}},{"name":"Button","props":{"label":"Invite User","appearance":"primary","icon":"UserPlus"}}]},{"name":"Table","props":{"columns":"usersColumns","data":"usersRows"}}]}}
2
+ {"id":"users-table-row","schemaVersion":"1.1.0","task":"Render rich cell content in users table","input":"Build one user row with avatar, role tag, and status.","output":{"name":"usersRows[0]","value":{"name":{"component":"Layout","props":{"direction":"row","alignItems":"center","gap":"8"},"children":[{"name":"Avatar","props":{"name":"Emily Brown","size":"small"}},{"name":"Text","props":{"as":"span","variant":"body-14"},"children":"Emily Brown"}]},"email":"emily.brown@company.com","role":{"component":"Tag","props":{"label":"Admin","color":"purple","solid":true}},"status":{"component":"Status","props":{"label":"Active","variant":"green"}},"lastActive":"2h ago"}}}
3
+ {"id":"users-filter-bar","schemaVersion":"1.1.0","task":"Render filter controls above users table","input":"Show role and status filters with action menu.","output":{"component":"Layout","props":{"direction":"row","gap":"8","wrap":true},"children":[{"name":"Dropdown","props":{"label":"Role","placeholder":"All roles","options":[{"value":"all","label":"All roles"},{"value":"admin","label":"Admin"},{"value":"manager","label":"Manager"},{"value":"recruiter","label":"Recruiter"}]}},{"name":"Dropdown","props":{"label":"Status","placeholder":"All statuses","options":[{"value":"all","label":"All statuses"},{"value":"active","label":"Active"},{"value":"suspended","label":"Suspended"}]}},{"name":"ActionMenu","props":{"trigger":{"component":"Button","props":{"label":"More","appearance":"outline"}},"items":[{"label":"Export CSV","icon":"DownloadSimple"},{"label":"Bulk Suspend","icon":"UserMinus","destructive":true}]}}]}}
4
+ {"id":"users-pagination-footer","schemaVersion":"1.1.0","task":"Render users table footer controls","input":"List has 126 users across multiple pages.","output":{"component":"Layout","props":{"direction":"row","justifyContent":"space-between","alignItems":"center","gap":"12","wrap":true},"children":[{"name":"Text","props":{"as":"p","variant":"body-14"},"children":"Showing 1-25 of 126 users"},{"name":"Pagination","props":{"currentPage":1,"totalPages":6}}]}}
5
+ {"id":"users-empty-state","schemaVersion":"1.1.0","task":"Render no-results state when filters return no users","input":"Current search and filters return empty results.","output":{"component":"EmptyState","props":{"icon":"UsersThree","title":"No users found","description":"Try changing your filters or search term.","action":{"component":"Button","props":{"label":"Clear Filters","appearance":"outline"}},"align":"center"}}}
@@ -0,0 +1,5 @@
1
+ {"id":"calendar-events-shell","schemaVersion":"1.1.0","task":"Render calendar and events workspace layout","input":"Create a scheduling workspace with a calendar rail and events content panel.","output":{"component":"Layout","props":{"direction":"row","gap":"16","alignItems":"flex-start","wrap":true,"fullWidth":true},"children":[{"name":"Container","props":{"appearance":"default","padding":"default","className":"calendar-rail"},"children":[{"name":"Text","props":{"as":"h3","variant":"heading-24","weight":"medium"},"children":"Calendar"},{"name":"Calendar","props":{"size":"default","events":"calendarEvents"}}]},{"name":"Container","props":{"appearance":"default","padding":"default","className":"events-panel"},"children":[{"name":"SectionHeader","props":{"title":"Upcoming Events","description":"Review interviews, onboarding sessions, and reminders for the selected date range."}}]}]}}
2
+ {"id":"calendar-toolbar-controls","schemaVersion":"1.1.0","task":"Render calendar toolbar and filters","input":"Allow users to switch date range and apply event-type filters.","output":{"component":"Layout","props":{"direction":"row","justifyContent":"space-between","alignItems":"center","gap":"8","wrap":true},"children":[{"name":"Layout","props":{"direction":"row","gap":"8","wrap":true},"children":[{"name":"DateRangeInput","props":{"startPlaceholder":"Start date","endPlaceholder":"End date"}},{"name":"Dropdown","props":{"label":"Event Type","placeholder":"All events","options":[{"value":"all","label":"All events"},{"value":"interview","label":"Interviews"},{"value":"onboarding","label":"Onboarding"},{"value":"meeting","label":"Meetings"}]}}]},{"name":"ButtonGroup","props":{"size":"small","appearance":"outline","buttons":[{"label":"Day"},{"label":"Week"},{"label":"Month"}]}}]}}
3
+ {"id":"calendar-events-list-item","schemaVersion":"1.1.0","task":"Render one event card row","input":"Build one event item with metadata and quick actions.","output":{"component":"Container","props":{"appearance":"default","padding":"default"},"children":[{"name":"Layout","props":{"direction":"row","justifyContent":"space-between","alignItems":"flex-start","gap":"12","wrap":true},"children":[{"name":"Layout","props":{"direction":"column","gap":"6"},"children":[{"name":"Text","props":{"as":"p","variant":"body-16","weight":"semibold"},"children":"Candidate Interview: Sarah Miller"},{"name":"Layout","props":{"direction":"row","alignItems":"center","gap":"8","wrap":true},"children":[{"name":"Tag","props":{"label":"Interview","color":"blue","solid":true}},{"name":"Status","props":{"label":"Scheduled","variant":"green","appearance":"transparent"}}]},{"name":"Text","props":{"as":"p","variant":"body-14"},"children":"Tue, Apr 9 • 10:30 AM - 11:00 AM • Virtual"}]},{"name":"Layout","props":{"direction":"row","gap":"8"},"children":[{"name":"Button","props":{"label":"Reschedule","appearance":"outline","size":"small"}},{"name":"Button","props":{"label":"Join","appearance":"primary","size":"small"}}]}]}]}}
4
+ {"id":"calendar-events-list-layout","schemaVersion":"1.1.0","task":"Render grouped events for selected day","input":"Show grouped event list sections for Morning and Afternoon.","output":{"component":"Layout","props":{"direction":"column","gap":"12"},"children":[{"name":"Text","props":{"as":"h3","variant":"heading-24","weight":"medium"},"children":"Morning"},{"name":"ScrollView","props":{"maxHeight":"280px"},"children":[{"name":"Layout","props":{"direction":"column","gap":"10"},"children":"map(morningEvents => EventRow)"}]},{"name":"Divider","props":{"variant":"solid"}},{"name":"Text","props":{"as":"h3","variant":"heading-24","weight":"medium"},"children":"Afternoon"},{"name":"ScrollView","props":{"maxHeight":"280px"},"children":[{"name":"Layout","props":{"direction":"column","gap":"10"},"children":"map(afternoonEvents => EventRow)"}]}]}}
5
+ {"id":"calendar-empty-state","schemaVersion":"1.1.0","task":"Render empty state for no events","input":"Selected date has no scheduled events.","output":{"component":"EmptyState","props":{"icon":"CalendarBlank","title":"No events scheduled","description":"Select another date or create a new event to get started.","action":{"component":"Button","props":{"label":"Create Event","appearance":"primary"}},"secondaryAction":{"component":"Button","props":{"label":"Clear Filters","appearance":"outline"}},"align":"center"}}}
@@ -0,0 +1,5 @@
1
+ {"id":"dashboard-statistics-loop","schemaVersion":"1.0.0","task":"Render dashboard statistic cards from a data array","input":"Map over `statisticsItems` and render a `<Statistics />` component for each item.","output":{"component":"DashboardPage","layout":{"component":"Layout","props":{"direction":"row","gap":"16","fullWidth":true}},"mapping":{"source":"statisticsItems","key":"item.label","target":"Statistics","propBindings":{"label":"item.label","value":"item.value","helperText":"item.helperText","icon":"item.icon","iconAccent":"item.iconAccent"}}}}
2
+ {"id":"stat-requests-with-presents","schemaVersion":"1.0.0","task":"Dashboard statistics card item","input":"Create the first statistics data object from DashboardPage.","output":{"label":"Requests with presents","value":"05","helperText":"Awaiting review","icon":"Warning","iconAccent":"red"}}
3
+ {"id":"stat-providers-expiring-privileges","schemaVersion":"1.0.0","task":"Dashboard statistics card item","input":"Create the second statistics data object from DashboardPage.","output":{"label":"Providers expiring privileges","value":"03","helperText":"within 30 days","icon":"Warning","iconAccent":"red"}}
4
+ {"id":"stat-providers-traveling","schemaVersion":"1.0.0","task":"Dashboard statistics card item","input":"Create the third statistics data object from DashboardPage.","output":{"label":"Providers traveling","value":"03","helperText":"this week","icon":"Warning","iconAccent":"yellow"}}
5
+ {"id":"stat-unfinished-drafts","schemaVersion":"1.0.0","task":"Dashboard statistics card item","input":"Create the fourth statistics data object from DashboardPage.","output":{"label":"Unfinished drafts","value":"01","helperText":"needs completion","icon":"FileText","iconAccent":"blue"}}
@@ -0,0 +1,42 @@
1
+ {
2
+ "contractName": "uds.ai.examples-dataset",
3
+ "schemaVersion": "1.0.0",
4
+ "description": "Curated JSONL datasets for AI training and few-shot grounding.",
5
+ "files": [
6
+ {
7
+ "id": "signin-flow",
8
+ "path": "@mich8060/unified-design-system/ai/examples/signin-flow-uds.jsonl",
9
+ "kind": "scenario-flow"
10
+ },
11
+ {
12
+ "id": "dashboard-statistics",
13
+ "path": "@mich8060/unified-design-system/ai/examples/dashboard-statistics-uds.jsonl",
14
+ "kind": "scenario-layout"
15
+ },
16
+ {
17
+ "id": "settings-preferences",
18
+ "path": "@mich8060/unified-design-system/ai/examples/settings-preferences-uds.jsonl",
19
+ "kind": "scenario-layout"
20
+ },
21
+ {
22
+ "id": "calendar-events",
23
+ "path": "@mich8060/unified-design-system/ai/examples/calendar-events-layout-uds.jsonl",
24
+ "kind": "scenario-layout"
25
+ },
26
+ {
27
+ "id": "admin-users-table",
28
+ "path": "@mich8060/unified-design-system/ai/examples/admin-users-table-uds.jsonl",
29
+ "kind": "scenario-layout"
30
+ },
31
+ {
32
+ "id": "kanban-board",
33
+ "path": "@mich8060/unified-design-system/ai/examples/kanban-board-uds.jsonl",
34
+ "kind": "scenario-layout"
35
+ },
36
+ {
37
+ "id": "uds-governed-training",
38
+ "path": "@mich8060/unified-design-system/ai/examples/uds-governed-training.jsonl",
39
+ "kind": "governed-valid-invalid"
40
+ }
41
+ ]
42
+ }
@@ -0,0 +1,5 @@
1
+ {"id":"kanban-board-layout","schemaVersion":"1.1.0","task":"Render project kanban board using UDS primitives","input":"Create a three-column task board for Backlog, In Progress, and Done.","output":{"component":"ProjectBoardPage","layout":{"root":"Layout","props":{"direction":"column","gap":"16","fullWidth":true},"children":[{"component":"SectionHeader","props":{"title":"Project Board","description":"Track work across delivery stages."}},{"component":"Layout","props":{"direction":"row","gap":"16","wrap":true,"alignItems":"flex-start"},"children":[{"component":"Container","props":{"padding":"default","appearance":"default","className":"board-column backlog"}},{"component":"Container","props":{"padding":"default","appearance":"default","className":"board-column in-progress"}},{"component":"Container","props":{"padding":"default","appearance":"default","className":"board-column done"}}]}]}}}
2
+ {"id":"kanban-column-header","schemaVersion":"1.1.0","task":"Render kanban column header","input":"Build a reusable column header for each task status.","output":{"component":"Layout","props":{"direction":"row","justifyContent":"space-between","alignItems":"center","gap":"8"},"children":[{"name":"Text","props":{"as":"h3","variant":"heading-24","weight":"medium"},"children":"Backlog"},{"name":"Badge","props":{"count":12}}]}}
3
+ {"id":"kanban-task-card","schemaVersion":"1.1.0","task":"Render task card in a kanban column","input":"Show title, priority, assignee, and due date for a task.","output":{"component":"Container","props":{"padding":"default","appearance":"default"},"children":[{"name":"Layout","props":{"direction":"column","gap":"8"},"children":[{"name":"Text","props":{"as":"p","variant":"body-16","weight":"semibold"},"children":"Implement provider filtering"},{"name":"Tag","props":{"label":"High Priority","color":"red","solid":true}},{"name":"Layout","props":{"direction":"row","justifyContent":"space-between","alignItems":"center","gap":"8"},"children":[{"name":"Avatar","props":{"name":"Alex Jordan","size":"small"}},{"name":"Text","props":{"as":"span","variant":"body-12"},"children":"Due Apr 4"}]}]}]}}
4
+ {"id":"kanban-empty-state","schemaVersion":"1.1.0","task":"Render empty state when column has no cards","input":"The Done column has zero tasks.","output":{"component":"EmptyState","props":{"icon":"CheckCircle","title":"No completed tasks yet","description":"Completed work will appear here once cards are moved into Done.","align":"center"}}}
5
+ {"id":"kanban-quick-actions","schemaVersion":"1.1.0","task":"Render quick actions for board-level controls","input":"Provide actions to add tasks and open filters.","output":{"component":"Layout","props":{"direction":"row","gap":"8","wrap":true},"children":[{"name":"Button","props":{"label":"New Task","appearance":"primary"}},{"name":"Button","props":{"label":"Filter","appearance":"outline","icon":"Funnel"}},{"name":"Button","props":{"label":"Sort","appearance":"outline","icon":"ArrowsDownUp"}}]}}
@@ -0,0 +1,5 @@
1
+ {"id":"settings-page-layout","schemaVersion":"1.1.0","task":"Render account settings page sections","input":"Create profile, notifications, and security sections using UDS components.","output":{"component":"Layout","props":{"direction":"column","gap":"24","fullWidth":true},"children":[{"name":"SectionHeader","props":{"title":"Account Settings","description":"Manage your profile, notifications, and security preferences."}},{"name":"Container","props":{"appearance":"default","padding":"large","className":"settings-section profile"}},{"name":"Container","props":{"appearance":"default","padding":"large","className":"settings-section notifications"}},{"name":"Container","props":{"appearance":"default","padding":"large","className":"settings-section security"}}]}}
2
+ {"id":"settings-profile-form","schemaVersion":"1.1.0","task":"Render editable profile form","input":"Show editable profile name, title, and contact fields.","output":{"component":"Layout","props":{"direction":"column","gap":"12"},"children":[{"name":"Text","props":{"as":"h3","variant":"heading-24","weight":"medium"},"children":"Profile"},{"name":"Field","props":{"label":"Full Name","required":true},"children":[{"name":"TextInput","props":{"value":"Emily Brown","placeholder":"Enter full name"}}]},{"name":"Field","props":{"label":"Job Title"},"children":[{"name":"TextInput","props":{"value":"Operations Manager","placeholder":"Enter title"}}]},{"name":"Field","props":{"label":"Phone"},"children":[{"name":"PhoneInput","props":{"placeholder":"(555) 123-4567"}}]}]}}
3
+ {"id":"settings-notification-toggles","schemaVersion":"1.1.0","task":"Render notification preferences","input":"User can control email, SMS, and digest notification preferences.","output":{"component":"Layout","props":{"direction":"column","gap":"10"},"children":[{"name":"Text","props":{"as":"h3","variant":"heading-24","weight":"medium"},"children":"Notifications"},{"name":"Toggle","props":{"label":"Email notifications","checked":true}},{"name":"Toggle","props":{"label":"SMS notifications","checked":false}},{"name":"Checkbox","props":{"label":"Weekly activity digest","checked":true}}]}}
4
+ {"id":"settings-security-actions","schemaVersion":"1.1.0","task":"Render security controls and call-to-action buttons","input":"Provide password reset and session management controls.","output":{"component":"Layout","props":{"direction":"column","gap":"12"},"children":[{"name":"Text","props":{"as":"h3","variant":"heading-24","weight":"medium"},"children":"Security"},{"name":"Field","props":{"label":"Current Password"},"children":[{"name":"PasswordInput","props":{"placeholder":"Enter current password"}}]},{"name":"Field","props":{"label":"New Password"},"children":[{"name":"PasswordInput","props":{"placeholder":"Enter new password"}}]},{"name":"Layout","props":{"direction":"row","gap":"8","wrap":true},"children":[{"name":"Button","props":{"label":"Update Password","appearance":"primary"}},{"name":"Button","props":{"label":"Sign Out Other Sessions","appearance":"outline"}}]}]}}
5
+ {"id":"settings-save-banner","schemaVersion":"1.1.0","task":"Render unsaved-changes footer actions","input":"Form has pending changes.","output":{"component":"Container","props":{"appearance":"default","padding":"default"},"children":[{"name":"Layout","props":{"direction":"row","justifyContent":"space-between","alignItems":"center","gap":"12","wrap":true},"children":[{"name":"Status","props":{"label":"Unsaved changes","variant":"orange","appearance":"transparent"}},{"name":"Layout","props":{"direction":"row","gap":"8"},"children":[{"name":"Button","props":{"label":"Discard","appearance":"text"}},{"name":"Button","props":{"label":"Save Changes","appearance":"primary"}}]}]}]}}
@@ -0,0 +1,9 @@
1
+ {"id":"layout-shell-contract","schemaVersion":"1.1.0","task":"Render sign-in flow inside UDS shell contract","input":"Create auth UI within AppShell scaffolding and canonical brand menu contract.","output":{"layout":{"root":["AppShell","AppShell.Menu","AppShell.Content","AppShell.Main"],"mainContentIn":"AppShell.Main","containerDefaults":{"outer":{"appearance":"transparent","padding":"large"},"form":{"appearance":"default","padding":"large","style":{"width":"100%","maxWidth":"480px"}}}},"menu":{"source":"@mich8060/unified-design-system/ai/navigation","props":{"showBrand":true,"showSearch":true,"showBrandSwitcher":true,"showNav":true,"showModeToggle":true,"showUser":false}},"branding":{"component":"Branding","props":{"inherit":true,"size":"default"},"requirements":["Set html[data-brand] from activeBrand via effect."]}}}
2
+ {"id":"signin-default","schemaVersion":"1.1.0","task":"Render initial sign-in state","input":"Show sign-in form before user enters credentials.","output":{"view":"sign-in","title":"Welcome back","subtitle":"Sign in to access your dashboard.","state":{"email":"","password":"","rememberMe":false,"signInError":"","forgotStatus":"idle"},"components":[{"name":"Field","props":{"label":"Email","required":true,"state":"default","helperMessage":"Use the email associated with your account."},"children":[{"name":"TextInput","props":{"id":"sign-in-email","type":"email","placeholder":"name@company.com","state":"default"}}]},{"name":"Field","props":{"label":"Password","required":true,"state":"default"},"children":[{"name":"TextInput","props":{"id":"sign-in-password","type":"password","placeholder":"Enter your password","state":"default"}}]},{"name":"Checkbox","props":{"id":"remember-me","label":"Remember me on this device","checked":false}},{"name":"Button","props":{"type":"submit","label":"Sign in","appearance":"primary","layout":"label-only","size":"default","disabled":true}},{"name":"Button","props":{"type":"button","label":"Forgot password?","appearance":"text","layout":"label-only","size":"default"}}]}}
3
+ {"id":"signin-ready","schemaVersion":"1.1.0","task":"Enable sign-in submit when credentials exist","input":"Email and password are both non-empty strings.","output":{"view":"sign-in","state":{"canSubmitSignIn":true},"components":[{"name":"Button","selector":"submit-sign-in","props":{"disabled":false}}],"notes":["Remember-me does not gate submit.","On submit, clear signInError and set forgotStatus to idle."]}}
4
+ {"id":"signin-error-missing-credentials","schemaVersion":"1.1.0","task":"Render sign-in validation error","input":"User submits sign-in without both email and password.","output":{"view":"sign-in","error":"Enter both email and password to continue.","components":[{"name":"Field","props":{"label":"Email","required":true,"state":"error"},"children":[{"name":"TextInput","props":{"id":"sign-in-email","state":"error","errorText":"Enter both email and password to continue."}}]},{"name":"Field","props":{"label":"Password","required":true,"state":"error"},"children":[{"name":"TextInput","props":{"id":"sign-in-password","state":"error","errorText":"Enter both email and password to continue."}}]}]}}
5
+ {"id":"forgot-open-default","schemaVersion":"1.1.0","task":"Transition to forgot-password default view","input":"User clicks Forgot password? button in sign-in view.","output":{"transition":{"action":"setView('forgot')","sideEffects":["setForgotStatus('idle')","setSignInError('')"]},"view":"forgot","title":"Reset your password","subtitle":"Enter your email and we will send reset instructions.","components":[{"name":"Field","props":{"label":"Email","required":true,"state":"default","helperMessage":"Password reset links expire after 30 minutes."},"children":[{"name":"TextInput","props":{"id":"forgot-email","type":"email","placeholder":"name@company.com","state":"default"}}]},{"name":"Button","props":{"type":"submit","label":"Send reset link","appearance":"primary","layout":"label-only","size":"default","disabled":true}},{"name":"Button","props":{"type":"button","label":"Back to sign in","appearance":"text","layout":"label-only","size":"default"}}]}}
6
+ {"id":"forgot-submitting","schemaVersion":"1.1.0","task":"Render forgot-password submitting state","input":"User submits forgot-password form with a non-empty email.","output":{"view":"forgot","status":"submitting","components":[{"name":"Text","props":{"variant":"body-14"},"children":"Sending reset instructions..."},{"name":"Button","props":{"type":"submit","label":"Sending...","appearance":"primary","layout":"label-only","size":"default","disabled":true}},{"name":"Button","props":{"type":"button","label":"Back to sign in","appearance":"text","layout":"label-only","size":"default"}}],"timing":{"asyncDelayMs":900}}}
7
+ {"id":"forgot-success","schemaVersion":"1.1.0","task":"Render forgot-password success state","input":"Forgot-password request resolves and email does not end with @example.com.","output":{"view":"forgot","status":"success","components":[{"name":"Text","props":{"variant":"body-14"},"children":"Reset instructions sent. Check your inbox for the next steps."},{"name":"Button","props":{"type":"submit","label":"Send reset link","appearance":"primary","layout":"label-only","size":"default","disabled":false}}]}}
8
+ {"id":"forgot-error","schemaVersion":"1.1.0","task":"Render forgot-password error state","input":"Forgot-password request fails or user submits with empty email.","output":{"view":"forgot","status":"error","components":[{"name":"Field","props":{"label":"Email","required":true,"state":"error"},"children":[{"name":"TextInput","props":{"id":"forgot-email","state":"error","errorText":"Unable to send reset email. Check the address and try again."}}]},{"name":"Button","props":{"type":"submit","label":"Send reset link","appearance":"primary","layout":"label-only","size":"default","disabled":false}}],"notes":["Typing in forgot email resets forgotStatus back to idle."]}}
9
+ {"id":"forgot-back-to-signin","schemaVersion":"1.1.0","task":"Transition from forgot-password back to sign-in","input":"User clicks Back to sign in button.","output":{"transition":{"action":"setView('sign-in')","sideEffects":["setForgotStatus('idle')","setSignInError('')"]},"view":"sign-in","components":[{"name":"Button","selector":"back-to-signin","props":{"type":"button","label":"Back to sign in"}}]}}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=[{id:"valid-auth-form",scenario:"Simple authentication container with semantic layout and one primary action.",kind:"valid",tags:["form","auth","field-wrapping"],output:{tree:{type:"Container",props:{gap:"--uds-spacing-24"},children:[{type:"Container",children:[{type:"Text",props:{variant:"heading-24"}},{type:"Field",children:[{type:"TextInput",props:{type:"email",iconPosition:"left"}}]},{type:"Field",children:[{type:"TextInput",props:{type:"password"}}]},{type:"Flex",children:[{type:"Button",props:{appearance:"primary",label:"Sign in"}},{type:"Button",props:{appearance:"text",label:"Forgot password?"}}]}]}]}},expected:{status:"pass"},rationale:{why:"Uses allowed composition (Container > Field/Text/Button), valid spacing token, and a single primary action."}},{id:"valid-table-summary",scenario:"Data summary area with table-related indicators and a single primary action.",kind:"valid",tags:["table","status","dashboard"],output:{tree:{type:"Container",children:[{type:"Flex",children:[{type:"Text",props:{variant:"heading-24"}},{type:"Button",props:{appearance:"primary",label:"Create row"}}]},{type:"Table",children:[{type:"Status",props:{variant:"success",text:"Ready"}},{type:"Tag",props:{variant:"blue",label:"Active"}},{type:"DotStatus",props:{status:"positive"}},{type:"ActionMenu",props:{triggerLabel:"Row actions"}}]}]}},expected:{status:"pass"},rationale:{why:"Uses allowed Table children and keeps primary action count within limit."}},{id:"invalid-two-primary-actions",scenario:"Section contains two primary buttons.",kind:"invalid",tags:["actions","policy"],output:{tree:{type:"Container",children:[{type:"Button",props:{appearance:"primary",label:"Save"}},{type:"Button",props:{appearance:"primary",label:"Publish"}}]}},expected:{status:"fail",violationCodes:["RULE_MAX_PRIMARY_ACTIONS"]},rationale:{why:"Violates max primary actions per section.",fix:"Keep one primary action and convert the rest to secondary appearances."}},{id:"invalid-raw-html-and-inline-style",scenario:"Output includes raw HTML and inline style values.",kind:"invalid",tags:["raw-html","inline-style","governance"],output:{tree:{type:"Container",children:[{type:"div",props:{style:{color:"#ff0000"}},children:[{type:"Text",props:{variant:"body-16"}}]}]}},expected:{status:"fail",violationCodes:["RULE_UNKNOWN_COMPONENT","RULE_RAW_HTML_DISALLOWED","RULE_INLINE_STYLE_DISALLOWED"]},rationale:{why:"Governance forbids raw HTML tags and inline styling in generated output.",fix:"Replace raw HTML with UDS components and use tokenized component props."}},{id:"invalid-spacing-token",scenario:"Spacing prop uses a non-system token.",kind:"invalid",tags:["tokens","spacing"],output:{tree:{type:"Container",props:{gap:"--uds-spacing-999"},children:[{type:"Text",props:{variant:"body-16"}}]}},expected:{status:"fail",violationCodes:["RULE_UNKNOWN_SPACING_TOKEN"]},rationale:{why:"Spacing token is outside allowed spacing system.",fix:"Use an allowed token such as --uds-spacing-8/12/16/24."}},{id:"invalid-custom-css-variable",scenario:"Uses non-UDS CSS variable references in component props.",kind:"invalid",tags:["tokens","css-variables","governance"],output:{tree:{type:"Container",props:{surfaceColor:"var(--brand-primary-500)"},children:[{type:"Text",props:{color:"--custom-text-color",variant:"body-16"}}]}},expected:{status:"fail",violationCodes:["RULE_CUSTOM_CSS_VAR_DISALLOWED"]},rationale:{why:"Generated output must not introduce custom CSS variables outside --uds-* namespace.",fix:"Use --uds-* references or hardcoded literal values."}},{id:"invalid-tailwind-classname",scenario:"Output includes Tailwind utility classes.",kind:"invalid",tags:["tailwind","className","governance"],output:{tree:{type:"Container",props:{className:"p-4 bg-blue-600 text-white"},children:[{type:"Text",props:{variant:"body-16",text:"Example"}}]}},expected:{status:"fail",violationCodes:["RULE_TAILWIND_CLASS_DISALLOWED"]},rationale:{why:"Figma Make output must not fall back to Tailwind utility classes.",fix:"Use UDS components and governed tokenized props instead of className utilities."}},{id:"invalid-menu-ant-props",scenario:"Menu uses Ant-style props that are not part of the UDS contract.",kind:"invalid",tags:["menu","props","contract-drift"],output:{tree:{type:"Menu",props:{items:[{label:"Dashboard",icon:"House",path:"/"}],selectedKeys:["/"],mode:"inline"}}},expected:{status:"fail",violationCodes:["RULE_FORBIDDEN_PROP"]},rationale:{why:"Menu must use UDS canonical props, not Ant-style API props.",fix:"Use navItems plus activeMode/app state driven selection."}},{id:"invalid-flex-ant-props",scenario:"Flex uses vertical/justify/align aliases from non-UDS APIs.",kind:"invalid",tags:["flex","props","contract-drift"],output:{tree:{type:"Flex",props:{vertical:!0,justify:"space-between",align:"center"},children:[{type:"Text",props:{variant:"body-16"}}]}},expected:{status:"fail",violationCodes:["RULE_FORBIDDEN_PROP"]},rationale:{why:"Flex layout must use canonical props for deterministic cross-model behavior.",fix:"Use direction, justifyContent, and alignItems props."}},{id:"invalid-composition-parent-child",scenario:"Composition places a form field directly inside Menu.",kind:"invalid",tags:["composition","parent-child","layout"],output:{tree:{type:"Menu",children:[{type:"Field",children:[{type:"TextInput",props:{type:"text"}}]}]}},expected:{status:"fail",violationCodes:["RULE_INVALID_COMPOSITION","RULE_INVALID_PARENT_COMPOSITION"]},rationale:{why:"Field is not an allowed Menu child and Field requires a form/container context.",fix:"Use Menu-approved children or move Field under Container/Modal/Tabs."}},{id:"invalid-ambiguous-prop-alias",scenario:"Uses an ambiguous legacy alias prop instead of canonical prop.",kind:"invalid",tags:["props","aliases","governance"],output:{tree:{type:"Chip",props:{label:"Demo",iconplacement:"left",icon:"User"}}},expected:{status:"fail",violationCodes:["RULE_AMBIGUOUS_PROP_ALIAS"]},rationale:{why:"Alias props create inconsistent generation behavior across models.",fix:"Use canonical prop name `iconPlacement`."}},{id:"invalid-version-mismatch",scenario:"Output version fields do not match current governance contract.",kind:"invalid",tags:["versioning","contract","governance"],output:{manifestVersion:"0.0.1",governanceVersion:"0.0.1",policyVersion:"0.0.1",tree:{type:"Container",children:[{type:"Text",props:{variant:"body-16"}}]}},expected:{status:"fail",violationCodes:["RULE_VERSION_MISMATCH_MANIFESTVERSION","RULE_VERSION_MISMATCH_GOVERNANCEVERSION","RULE_VERSION_MISMATCH_POLICYVERSION"]},rationale:{why:"Generated output must declare versions that match the active AI contract.",fix:"Use the current manifest/governance/policy versions from UDSGovernance."}},{id:"invalid-schema-node-type",scenario:"Malformed output with missing node type.",kind:"invalid",tags:["schema","malformed"],output:{tree:{type:"",children:[{type:"Text",props:{variant:"body-16"}}]}},expected:{status:"fail",violationCodes:["SCHEMA_NODE_TYPE"]},rationale:{why:"Schema requires each node to have a non-empty string `type`.",fix:"Set a valid UDS component type for every node."}}];exports.UDS_TRAINING_EXAMPLES=e;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=[{id:"valid-auth-form",scenario:"Simple authentication container with semantic layout and one primary action.",kind:"valid",tags:["form","auth","field-wrapping","composition"],output:{tree:{type:"Container",props:{gap:"--uds-spacing-24"},children:[{type:"Text",props:{variant:"heading-24"}},{type:"Field",children:[{type:"TextInput",props:{type:"email",iconPosition:"left"}}]},{type:"Field",children:[{type:"TextInput",props:{type:"password"}}]},{type:"Button",props:{appearance:"primary",label:"Sign in"}},{type:"Button",props:{appearance:"text",label:"Forgot password?"}}]}},expected:{status:"pass"},rationale:{why:"Uses allowed composition (Container > Field/Text/Button), valid spacing token, and a single primary action."}},{id:"valid-table-summary",scenario:"Data summary area with table-related indicators and a single primary action.",kind:"valid",tags:["table","status","dashboard"],output:{tree:{type:"Container",children:[{type:"Text",props:{variant:"heading-24"}},{type:"Button",props:{appearance:"primary",label:"Create row"}},{type:"Table",children:[{type:"Status",props:{variant:"success",text:"Ready"}},{type:"Tag",props:{variant:"blue",label:"Active"}},{type:"DotStatus",props:{status:"positive"}},{type:"ActionMenu",props:{triggerLabel:"Row actions"}}]}]}},expected:{status:"pass"},rationale:{why:"Uses allowed Table children and keeps primary action count within limit."}},{id:"valid-pattern-authform",scenario:"Auth form output declares patternId and satisfies required structure components.",kind:"valid",tags:["pattern","auth","deterministic"],output:{tree:{type:"Container",props:{gap:"--uds-spacing-24"},children:[{type:"Text",props:{variant:"heading-24",text:"Sign in"}},{type:"Field",children:[{type:"TextInput",props:{type:"email"}}]},{type:"Field",children:[{type:"TextInput",props:{type:"password"}}]},{type:"Button",props:{appearance:"primary",label:"Sign in"}}]},audit:{patternId:"AuthForm",source:"training-example"}},expected:{status:"pass"},rationale:{why:"Declares patternId and includes all required AuthForm components in canonical order."}},{id:"invalid-pattern-missing-required-component",scenario:"Pattern-bound output omits a required component from declared pattern.",kind:"invalid",tags:["pattern","structure","governance"],output:{tree:{type:"Container",children:[{type:"Text",props:{variant:"heading-24",text:"Sign in"}},{type:"Field",children:[{type:"TextInput",props:{type:"email"}}]},{type:"Field",children:[{type:"TextInput",props:{type:"password"}}]}]},audit:{patternId:"AuthForm",source:"training-example"}},expected:{status:"fail",violationCodes:["RULE_PATTERN_REQUIRED_COMPONENT_MISSING"]},rationale:{why:"AuthForm requires a primary submit Button and it is missing.",fix:"Add Button with appearance='primary' in the form action section."}},{id:"invalid-pattern-id-unknown",scenario:"Output declares a patternId not present in the pattern registry.",kind:"invalid",tags:["pattern","contract"],output:{tree:{type:"Container",children:[{type:"Text",props:{variant:"body-16",text:"Hello"}}]},audit:{patternId:"UnknownPattern123"}},expected:{status:"fail",violationCodes:["RULE_UNKNOWN_PATTERN_ID"]},rationale:{why:"Pattern-bound generation must reference known patterns only.",fix:"Use a valid patternId from PatternRegistry."}},{id:"invalid-two-primary-actions",scenario:"Section contains two primary buttons.",kind:"invalid",tags:["actions","policy"],output:{tree:{type:"Container",children:[{type:"Button",props:{appearance:"primary",label:"Save"}},{type:"Button",props:{appearance:"primary",label:"Publish"}}]}},expected:{status:"fail",violationCodes:["RULE_MAX_PRIMARY_ACTIONS"]},rationale:{why:"Violates max primary actions per section.",fix:"Keep one primary action and convert the rest to secondary appearances."}},{id:"invalid-raw-html-and-inline-style",scenario:"Output includes raw HTML and inline style values.",kind:"invalid",tags:["raw-html","inline-style","governance"],output:{tree:{type:"Container",children:[{type:"div",props:{style:{color:"#ff0000"}},children:[{type:"Text",props:{variant:"body-16"}}]}]}},expected:{status:"fail",violationCodes:["RULE_UNKNOWN_COMPONENT","RULE_RAW_HTML_DISALLOWED","RULE_INLINE_STYLE_DISALLOWED"]},rationale:{why:"Governance forbids raw HTML tags and inline styling in generated output.",fix:"Replace raw HTML with UDS components and use tokenized component props."}},{id:"invalid-spacing-token",scenario:"Spacing prop uses a non-system token.",kind:"invalid",tags:["tokens","spacing"],output:{tree:{type:"Container",props:{gap:"--uds-spacing-999"},children:[{type:"Text",props:{variant:"body-16"}}]}},expected:{status:"fail",violationCodes:["RULE_UNKNOWN_SPACING_TOKEN"]},rationale:{why:"Spacing token is outside allowed spacing system.",fix:"Use an allowed token such as --uds-spacing-8/12/16/24."}},{id:"invalid-custom-css-variable",scenario:"Uses non-UDS CSS variable references in component props.",kind:"invalid",tags:["tokens","css-variables","governance"],output:{tree:{type:"Container",props:{surfaceColor:"var(--brand-primary-500)"},children:[{type:"Text",props:{color:"--custom-text-color",variant:"body-16"}}]}},expected:{status:"fail",violationCodes:["RULE_CUSTOM_CSS_VAR_DISALLOWED"]},rationale:{why:"Generated output must not introduce custom CSS variables outside --uds-* namespace.",fix:"Use --uds-* references or hardcoded literal values."}},{id:"invalid-tailwind-classname",scenario:"Output includes Tailwind utility classes.",kind:"invalid",tags:["tailwind","className","governance"],output:{tree:{type:"Container",props:{className:"p-4 bg-blue-600 text-white"},children:[{type:"Text",props:{variant:"body-16",text:"Example"}}]}},expected:{status:"fail",violationCodes:["RULE_TAILWIND_CLASS_DISALLOWED"]},rationale:{why:"Figma Make output must not fall back to Tailwind utility classes.",fix:"Use UDS components and governed tokenized props instead of className utilities."}},{id:"invalid-menu-ant-props",scenario:"Menu uses Ant-style props that are not part of the UDS contract.",kind:"invalid",tags:["menu","props","contract-drift"],output:{tree:{type:"Menu",props:{items:[{label:"Dashboard",icon:"House",path:"/"}],selectedKeys:["/"],mode:"inline"}}},expected:{status:"fail",violationCodes:["RULE_FORBIDDEN_PROP"]},rationale:{why:"Menu must use UDS canonical props, not Ant-style API props.",fix:"Use navItems plus activeMode/app state driven selection."}},{id:"invalid-flex-ant-props",scenario:"Flex uses vertical/justify/align aliases from non-UDS APIs.",kind:"invalid",tags:["flex","props","contract-drift"],output:{tree:{type:"Flex",props:{vertical:!0,justify:"space-between",align:"center"},children:[{type:"Text",props:{variant:"body-16"}}]}},expected:{status:"fail",violationCodes:["RULE_FORBIDDEN_PROP"]},rationale:{why:"Flex layout must use canonical props for deterministic cross-model behavior.",fix:"Use direction, justifyContent, and alignItems props."}},{id:"invalid-composition-parent-child",scenario:"Composition places a form field directly inside Menu.",kind:"invalid",tags:["composition","parent-child","layout"],output:{tree:{type:"Menu",children:[{type:"Field",children:[{type:"TextInput",props:{type:"text"}}]}]}},expected:{status:"fail",violationCodes:["RULE_INVALID_COMPOSITION","RULE_INVALID_PARENT_COMPOSITION"]},rationale:{why:"Field is not an allowed Menu child and Field requires a form/container context.",fix:"Use Menu-approved children or move Field under Container/Modal/Tabs."}},{id:"invalid-ambiguous-prop-alias",scenario:"Uses an ambiguous legacy alias prop instead of canonical prop.",kind:"invalid",tags:["props","aliases","governance"],output:{tree:{type:"Chip",props:{label:"Demo",iconplacement:"left",icon:"User"}}},expected:{status:"fail",violationCodes:["RULE_AMBIGUOUS_PROP_ALIAS"]},rationale:{why:"Alias props create inconsistent generation behavior across models.",fix:"Use canonical prop name `iconPlacement`."}},{id:"invalid-version-mismatch",scenario:"Output version fields do not match current governance contract.",kind:"invalid",tags:["versioning","contract","governance"],output:{manifestVersion:"0.0.1",governanceVersion:"0.0.1",policyVersion:"0.0.1",tree:{type:"Container",children:[{type:"Text",props:{variant:"body-16"}}]}},expected:{status:"fail",violationCodes:["RULE_VERSION_MISMATCH_MANIFESTVERSION","RULE_VERSION_MISMATCH_GOVERNANCEVERSION","RULE_VERSION_MISMATCH_POLICYVERSION"]},rationale:{why:"Generated output must declare versions that match the active AI contract.",fix:"Use the current manifest/governance/policy versions from UDSGovernance."}},{id:"invalid-schema-node-type",scenario:"Malformed output with missing node type.",kind:"invalid",tags:["schema","malformed"],output:{tree:{type:"",children:[{type:"Text",props:{variant:"body-16"}}]}},expected:{status:"fail",violationCodes:["SCHEMA_NODE_TYPE"]},rationale:{why:"Schema requires each node to have a non-empty string `type`.",fix:"Set a valid UDS component type for every node."}}];exports.UDS_TRAINING_EXAMPLES=e;
@@ -1 +1 @@
1
- const e=[{id:"valid-auth-form",scenario:"Simple authentication container with semantic layout and one primary action.",kind:"valid",tags:["form","auth","field-wrapping"],output:{tree:{type:"Container",props:{gap:"--uds-spacing-24"},children:[{type:"Container",children:[{type:"Text",props:{variant:"heading-24"}},{type:"Field",children:[{type:"TextInput",props:{type:"email",iconPosition:"left"}}]},{type:"Field",children:[{type:"TextInput",props:{type:"password"}}]},{type:"Flex",children:[{type:"Button",props:{appearance:"primary",label:"Sign in"}},{type:"Button",props:{appearance:"text",label:"Forgot password?"}}]}]}]}},expected:{status:"pass"},rationale:{why:"Uses allowed composition (Container > Field/Text/Button), valid spacing token, and a single primary action."}},{id:"valid-table-summary",scenario:"Data summary area with table-related indicators and a single primary action.",kind:"valid",tags:["table","status","dashboard"],output:{tree:{type:"Container",children:[{type:"Flex",children:[{type:"Text",props:{variant:"heading-24"}},{type:"Button",props:{appearance:"primary",label:"Create row"}}]},{type:"Table",children:[{type:"Status",props:{variant:"success",text:"Ready"}},{type:"Tag",props:{variant:"blue",label:"Active"}},{type:"DotStatus",props:{status:"positive"}},{type:"ActionMenu",props:{triggerLabel:"Row actions"}}]}]}},expected:{status:"pass"},rationale:{why:"Uses allowed Table children and keeps primary action count within limit."}},{id:"invalid-two-primary-actions",scenario:"Section contains two primary buttons.",kind:"invalid",tags:["actions","policy"],output:{tree:{type:"Container",children:[{type:"Button",props:{appearance:"primary",label:"Save"}},{type:"Button",props:{appearance:"primary",label:"Publish"}}]}},expected:{status:"fail",violationCodes:["RULE_MAX_PRIMARY_ACTIONS"]},rationale:{why:"Violates max primary actions per section.",fix:"Keep one primary action and convert the rest to secondary appearances."}},{id:"invalid-raw-html-and-inline-style",scenario:"Output includes raw HTML and inline style values.",kind:"invalid",tags:["raw-html","inline-style","governance"],output:{tree:{type:"Container",children:[{type:"div",props:{style:{color:"#ff0000"}},children:[{type:"Text",props:{variant:"body-16"}}]}]}},expected:{status:"fail",violationCodes:["RULE_UNKNOWN_COMPONENT","RULE_RAW_HTML_DISALLOWED","RULE_INLINE_STYLE_DISALLOWED"]},rationale:{why:"Governance forbids raw HTML tags and inline styling in generated output.",fix:"Replace raw HTML with UDS components and use tokenized component props."}},{id:"invalid-spacing-token",scenario:"Spacing prop uses a non-system token.",kind:"invalid",tags:["tokens","spacing"],output:{tree:{type:"Container",props:{gap:"--uds-spacing-999"},children:[{type:"Text",props:{variant:"body-16"}}]}},expected:{status:"fail",violationCodes:["RULE_UNKNOWN_SPACING_TOKEN"]},rationale:{why:"Spacing token is outside allowed spacing system.",fix:"Use an allowed token such as --uds-spacing-8/12/16/24."}},{id:"invalid-custom-css-variable",scenario:"Uses non-UDS CSS variable references in component props.",kind:"invalid",tags:["tokens","css-variables","governance"],output:{tree:{type:"Container",props:{surfaceColor:"var(--brand-primary-500)"},children:[{type:"Text",props:{color:"--custom-text-color",variant:"body-16"}}]}},expected:{status:"fail",violationCodes:["RULE_CUSTOM_CSS_VAR_DISALLOWED"]},rationale:{why:"Generated output must not introduce custom CSS variables outside --uds-* namespace.",fix:"Use --uds-* references or hardcoded literal values."}},{id:"invalid-tailwind-classname",scenario:"Output includes Tailwind utility classes.",kind:"invalid",tags:["tailwind","className","governance"],output:{tree:{type:"Container",props:{className:"p-4 bg-blue-600 text-white"},children:[{type:"Text",props:{variant:"body-16",text:"Example"}}]}},expected:{status:"fail",violationCodes:["RULE_TAILWIND_CLASS_DISALLOWED"]},rationale:{why:"Figma Make output must not fall back to Tailwind utility classes.",fix:"Use UDS components and governed tokenized props instead of className utilities."}},{id:"invalid-menu-ant-props",scenario:"Menu uses Ant-style props that are not part of the UDS contract.",kind:"invalid",tags:["menu","props","contract-drift"],output:{tree:{type:"Menu",props:{items:[{label:"Dashboard",icon:"House",path:"/"}],selectedKeys:["/"],mode:"inline"}}},expected:{status:"fail",violationCodes:["RULE_FORBIDDEN_PROP"]},rationale:{why:"Menu must use UDS canonical props, not Ant-style API props.",fix:"Use navItems plus activeMode/app state driven selection."}},{id:"invalid-flex-ant-props",scenario:"Flex uses vertical/justify/align aliases from non-UDS APIs.",kind:"invalid",tags:["flex","props","contract-drift"],output:{tree:{type:"Flex",props:{vertical:!0,justify:"space-between",align:"center"},children:[{type:"Text",props:{variant:"body-16"}}]}},expected:{status:"fail",violationCodes:["RULE_FORBIDDEN_PROP"]},rationale:{why:"Flex layout must use canonical props for deterministic cross-model behavior.",fix:"Use direction, justifyContent, and alignItems props."}},{id:"invalid-composition-parent-child",scenario:"Composition places a form field directly inside Menu.",kind:"invalid",tags:["composition","parent-child","layout"],output:{tree:{type:"Menu",children:[{type:"Field",children:[{type:"TextInput",props:{type:"text"}}]}]}},expected:{status:"fail",violationCodes:["RULE_INVALID_COMPOSITION","RULE_INVALID_PARENT_COMPOSITION"]},rationale:{why:"Field is not an allowed Menu child and Field requires a form/container context.",fix:"Use Menu-approved children or move Field under Container/Modal/Tabs."}},{id:"invalid-ambiguous-prop-alias",scenario:"Uses an ambiguous legacy alias prop instead of canonical prop.",kind:"invalid",tags:["props","aliases","governance"],output:{tree:{type:"Chip",props:{label:"Demo",iconplacement:"left",icon:"User"}}},expected:{status:"fail",violationCodes:["RULE_AMBIGUOUS_PROP_ALIAS"]},rationale:{why:"Alias props create inconsistent generation behavior across models.",fix:"Use canonical prop name `iconPlacement`."}},{id:"invalid-version-mismatch",scenario:"Output version fields do not match current governance contract.",kind:"invalid",tags:["versioning","contract","governance"],output:{manifestVersion:"0.0.1",governanceVersion:"0.0.1",policyVersion:"0.0.1",tree:{type:"Container",children:[{type:"Text",props:{variant:"body-16"}}]}},expected:{status:"fail",violationCodes:["RULE_VERSION_MISMATCH_MANIFESTVERSION","RULE_VERSION_MISMATCH_GOVERNANCEVERSION","RULE_VERSION_MISMATCH_POLICYVERSION"]},rationale:{why:"Generated output must declare versions that match the active AI contract.",fix:"Use the current manifest/governance/policy versions from UDSGovernance."}},{id:"invalid-schema-node-type",scenario:"Malformed output with missing node type.",kind:"invalid",tags:["schema","malformed"],output:{tree:{type:"",children:[{type:"Text",props:{variant:"body-16"}}]}},expected:{status:"fail",violationCodes:["SCHEMA_NODE_TYPE"]},rationale:{why:"Schema requires each node to have a non-empty string `type`.",fix:"Set a valid UDS component type for every node."}}];export{e as UDS_TRAINING_EXAMPLES};
1
+ const e=[{id:"valid-auth-form",scenario:"Simple authentication container with semantic layout and one primary action.",kind:"valid",tags:["form","auth","field-wrapping","composition"],output:{tree:{type:"Container",props:{gap:"--uds-spacing-24"},children:[{type:"Text",props:{variant:"heading-24"}},{type:"Field",children:[{type:"TextInput",props:{type:"email",iconPosition:"left"}}]},{type:"Field",children:[{type:"TextInput",props:{type:"password"}}]},{type:"Button",props:{appearance:"primary",label:"Sign in"}},{type:"Button",props:{appearance:"text",label:"Forgot password?"}}]}},expected:{status:"pass"},rationale:{why:"Uses allowed composition (Container > Field/Text/Button), valid spacing token, and a single primary action."}},{id:"valid-table-summary",scenario:"Data summary area with table-related indicators and a single primary action.",kind:"valid",tags:["table","status","dashboard"],output:{tree:{type:"Container",children:[{type:"Text",props:{variant:"heading-24"}},{type:"Button",props:{appearance:"primary",label:"Create row"}},{type:"Table",children:[{type:"Status",props:{variant:"success",text:"Ready"}},{type:"Tag",props:{variant:"blue",label:"Active"}},{type:"DotStatus",props:{status:"positive"}},{type:"ActionMenu",props:{triggerLabel:"Row actions"}}]}]}},expected:{status:"pass"},rationale:{why:"Uses allowed Table children and keeps primary action count within limit."}},{id:"valid-pattern-authform",scenario:"Auth form output declares patternId and satisfies required structure components.",kind:"valid",tags:["pattern","auth","deterministic"],output:{tree:{type:"Container",props:{gap:"--uds-spacing-24"},children:[{type:"Text",props:{variant:"heading-24",text:"Sign in"}},{type:"Field",children:[{type:"TextInput",props:{type:"email"}}]},{type:"Field",children:[{type:"TextInput",props:{type:"password"}}]},{type:"Button",props:{appearance:"primary",label:"Sign in"}}]},audit:{patternId:"AuthForm",source:"training-example"}},expected:{status:"pass"},rationale:{why:"Declares patternId and includes all required AuthForm components in canonical order."}},{id:"invalid-pattern-missing-required-component",scenario:"Pattern-bound output omits a required component from declared pattern.",kind:"invalid",tags:["pattern","structure","governance"],output:{tree:{type:"Container",children:[{type:"Text",props:{variant:"heading-24",text:"Sign in"}},{type:"Field",children:[{type:"TextInput",props:{type:"email"}}]},{type:"Field",children:[{type:"TextInput",props:{type:"password"}}]}]},audit:{patternId:"AuthForm",source:"training-example"}},expected:{status:"fail",violationCodes:["RULE_PATTERN_REQUIRED_COMPONENT_MISSING"]},rationale:{why:"AuthForm requires a primary submit Button and it is missing.",fix:"Add Button with appearance='primary' in the form action section."}},{id:"invalid-pattern-id-unknown",scenario:"Output declares a patternId not present in the pattern registry.",kind:"invalid",tags:["pattern","contract"],output:{tree:{type:"Container",children:[{type:"Text",props:{variant:"body-16",text:"Hello"}}]},audit:{patternId:"UnknownPattern123"}},expected:{status:"fail",violationCodes:["RULE_UNKNOWN_PATTERN_ID"]},rationale:{why:"Pattern-bound generation must reference known patterns only.",fix:"Use a valid patternId from PatternRegistry."}},{id:"invalid-two-primary-actions",scenario:"Section contains two primary buttons.",kind:"invalid",tags:["actions","policy"],output:{tree:{type:"Container",children:[{type:"Button",props:{appearance:"primary",label:"Save"}},{type:"Button",props:{appearance:"primary",label:"Publish"}}]}},expected:{status:"fail",violationCodes:["RULE_MAX_PRIMARY_ACTIONS"]},rationale:{why:"Violates max primary actions per section.",fix:"Keep one primary action and convert the rest to secondary appearances."}},{id:"invalid-raw-html-and-inline-style",scenario:"Output includes raw HTML and inline style values.",kind:"invalid",tags:["raw-html","inline-style","governance"],output:{tree:{type:"Container",children:[{type:"div",props:{style:{color:"#ff0000"}},children:[{type:"Text",props:{variant:"body-16"}}]}]}},expected:{status:"fail",violationCodes:["RULE_UNKNOWN_COMPONENT","RULE_RAW_HTML_DISALLOWED","RULE_INLINE_STYLE_DISALLOWED"]},rationale:{why:"Governance forbids raw HTML tags and inline styling in generated output.",fix:"Replace raw HTML with UDS components and use tokenized component props."}},{id:"invalid-spacing-token",scenario:"Spacing prop uses a non-system token.",kind:"invalid",tags:["tokens","spacing"],output:{tree:{type:"Container",props:{gap:"--uds-spacing-999"},children:[{type:"Text",props:{variant:"body-16"}}]}},expected:{status:"fail",violationCodes:["RULE_UNKNOWN_SPACING_TOKEN"]},rationale:{why:"Spacing token is outside allowed spacing system.",fix:"Use an allowed token such as --uds-spacing-8/12/16/24."}},{id:"invalid-custom-css-variable",scenario:"Uses non-UDS CSS variable references in component props.",kind:"invalid",tags:["tokens","css-variables","governance"],output:{tree:{type:"Container",props:{surfaceColor:"var(--brand-primary-500)"},children:[{type:"Text",props:{color:"--custom-text-color",variant:"body-16"}}]}},expected:{status:"fail",violationCodes:["RULE_CUSTOM_CSS_VAR_DISALLOWED"]},rationale:{why:"Generated output must not introduce custom CSS variables outside --uds-* namespace.",fix:"Use --uds-* references or hardcoded literal values."}},{id:"invalid-tailwind-classname",scenario:"Output includes Tailwind utility classes.",kind:"invalid",tags:["tailwind","className","governance"],output:{tree:{type:"Container",props:{className:"p-4 bg-blue-600 text-white"},children:[{type:"Text",props:{variant:"body-16",text:"Example"}}]}},expected:{status:"fail",violationCodes:["RULE_TAILWIND_CLASS_DISALLOWED"]},rationale:{why:"Figma Make output must not fall back to Tailwind utility classes.",fix:"Use UDS components and governed tokenized props instead of className utilities."}},{id:"invalid-menu-ant-props",scenario:"Menu uses Ant-style props that are not part of the UDS contract.",kind:"invalid",tags:["menu","props","contract-drift"],output:{tree:{type:"Menu",props:{items:[{label:"Dashboard",icon:"House",path:"/"}],selectedKeys:["/"],mode:"inline"}}},expected:{status:"fail",violationCodes:["RULE_FORBIDDEN_PROP"]},rationale:{why:"Menu must use UDS canonical props, not Ant-style API props.",fix:"Use navItems plus activeMode/app state driven selection."}},{id:"invalid-flex-ant-props",scenario:"Flex uses vertical/justify/align aliases from non-UDS APIs.",kind:"invalid",tags:["flex","props","contract-drift"],output:{tree:{type:"Flex",props:{vertical:!0,justify:"space-between",align:"center"},children:[{type:"Text",props:{variant:"body-16"}}]}},expected:{status:"fail",violationCodes:["RULE_FORBIDDEN_PROP"]},rationale:{why:"Flex layout must use canonical props for deterministic cross-model behavior.",fix:"Use direction, justifyContent, and alignItems props."}},{id:"invalid-composition-parent-child",scenario:"Composition places a form field directly inside Menu.",kind:"invalid",tags:["composition","parent-child","layout"],output:{tree:{type:"Menu",children:[{type:"Field",children:[{type:"TextInput",props:{type:"text"}}]}]}},expected:{status:"fail",violationCodes:["RULE_INVALID_COMPOSITION","RULE_INVALID_PARENT_COMPOSITION"]},rationale:{why:"Field is not an allowed Menu child and Field requires a form/container context.",fix:"Use Menu-approved children or move Field under Container/Modal/Tabs."}},{id:"invalid-ambiguous-prop-alias",scenario:"Uses an ambiguous legacy alias prop instead of canonical prop.",kind:"invalid",tags:["props","aliases","governance"],output:{tree:{type:"Chip",props:{label:"Demo",iconplacement:"left",icon:"User"}}},expected:{status:"fail",violationCodes:["RULE_AMBIGUOUS_PROP_ALIAS"]},rationale:{why:"Alias props create inconsistent generation behavior across models.",fix:"Use canonical prop name `iconPlacement`."}},{id:"invalid-version-mismatch",scenario:"Output version fields do not match current governance contract.",kind:"invalid",tags:["versioning","contract","governance"],output:{manifestVersion:"0.0.1",governanceVersion:"0.0.1",policyVersion:"0.0.1",tree:{type:"Container",children:[{type:"Text",props:{variant:"body-16"}}]}},expected:{status:"fail",violationCodes:["RULE_VERSION_MISMATCH_MANIFESTVERSION","RULE_VERSION_MISMATCH_GOVERNANCEVERSION","RULE_VERSION_MISMATCH_POLICYVERSION"]},rationale:{why:"Generated output must declare versions that match the active AI contract.",fix:"Use the current manifest/governance/policy versions from UDSGovernance."}},{id:"invalid-schema-node-type",scenario:"Malformed output with missing node type.",kind:"invalid",tags:["schema","malformed"],output:{tree:{type:"",children:[{type:"Text",props:{variant:"body-16"}}]}},expected:{status:"fail",violationCodes:["SCHEMA_NODE_TYPE"]},rationale:{why:"Schema requires each node to have a non-empty string `type`.",fix:"Set a valid UDS component type for every node."}}];export{e as UDS_TRAINING_EXAMPLES};
@@ -0,0 +1,5 @@
1
+ {"id":"governed-authform-valid","schemaVersion":"1.0.0","kind":"valid","tags":["auth","pattern","governed"],"input":"Build a sign-in form using the governed auth pattern.","output":{"manifestVersion":"1.0.0","governanceVersion":"1.0.0","policyVersion":"1.0.0","tree":{"type":"Container","props":{"gap":"--uds-spacing-24"},"children":[{"type":"Layout","props":{"direction":"column","gap":"16"},"children":[{"type":"Text","props":{"variant":"heading-24","text":"Sign in"}},{"type":"Field","children":[{"type":"TextInput","props":{"type":"email"}}]},{"type":"Field","children":[{"type":"TextInput","props":{"type":"password"}}]},{"type":"Button","props":{"appearance":"primary","label":"Sign in"}}]}]},"audit":{"source":"dataset","patternId":"AuthForm"}}}
2
+ {"id":"governed-authform-invalid-no-submit","schemaVersion":"1.0.0","kind":"invalid","tags":["auth","pattern","missing-required"],"input":"Build a sign-in form but omit submit button.","output":{"manifestVersion":"1.0.0","governanceVersion":"1.0.0","policyVersion":"1.0.0","tree":{"type":"Container","props":{"gap":"--uds-spacing-24"},"children":[{"type":"Layout","props":{"direction":"column","gap":"16"},"children":[{"type":"Text","props":{"variant":"heading-24","text":"Sign in"}},{"type":"Field","children":[{"type":"TextInput","props":{"type":"email"}}]},{"type":"Field","children":[{"type":"TextInput","props":{"type":"password"}}]}]}]},"audit":{"source":"dataset","patternId":"AuthForm","expectedViolation":"RULE_PATTERN_REQUIRED_COMPONENT_MISSING"}}}
3
+ {"id":"governed-datatable-valid","schemaVersion":"1.0.0","kind":"valid","tags":["table","pattern","dashboard"],"input":"Create a data table page with one primary action and pagination.","output":{"manifestVersion":"1.0.0","governanceVersion":"1.0.0","policyVersion":"1.0.0","tree":{"type":"Container","props":{"gap":"--uds-spacing-24"},"children":[{"type":"Text","props":{"variant":"heading-24","text":"Providers"}},{"type":"Button","props":{"appearance":"primary","label":"Add Provider"}},{"type":"Table","children":[{"type":"Status","props":{"variant":"success","text":"Ready"}},{"type":"Tag","props":{"variant":"blue","label":"Active"}},{"type":"ActionMenu","props":{"triggerLabel":"Row actions"}}]},{"type":"Pagination","props":{"currentPage":1,"totalPages":12}}]},"audit":{"source":"dataset","patternId":"DataTablePage"}}}
4
+ {"id":"governed-no-tailwind","schemaVersion":"1.0.0","kind":"invalid","tags":["tailwind","governance"],"input":"Generate output with utility classes.","output":{"manifestVersion":"1.0.0","governanceVersion":"1.0.0","policyVersion":"1.0.0","tree":{"type":"Container","props":{"className":"flex p-4 bg-blue-500"},"children":[{"type":"Text","props":{"variant":"body-16","text":"Bad"}}]},"audit":{"source":"dataset","expectedViolation":"RULE_TAILWIND_CLASS_DISALLOWED"}}}
5
+ {"id":"governed-no-custom-vars","schemaVersion":"1.0.0","kind":"invalid","tags":["tokens","css-vars"],"input":"Generate output using custom css variables.","output":{"manifestVersion":"1.0.0","governanceVersion":"1.0.0","policyVersion":"1.0.0","tree":{"type":"Container","props":{"surfaceColor":"var(--brand-primary-500)"},"children":[{"type":"Text","props":{"variant":"body-16","text":"Bad"}}]},"audit":{"source":"dataset","expectedViolation":"RULE_CUSTOM_CSS_VAR_DISALLOWED"}}}
@@ -73,11 +73,21 @@
73
73
  "brands",
74
74
  "showBrandSwitcher",
75
75
  "showModeToggle",
76
+ "showSearch",
77
+ "accountMenuItems",
76
78
  "activeMode",
77
79
  "onBrandChange",
78
80
  "onModeChange"
79
81
  ],
80
- "iconInput": "Phosphor icon string names only"
82
+ "iconInput": "Phosphor icon string names only",
83
+ "defaults": {
84
+ "showSearch": false,
85
+ "accountMenuItems": [
86
+ { "label": "Contact", "icon": "Phone" },
87
+ { "label": "Feedback", "icon": "ChatCenteredText" },
88
+ { "label": "Sign out", "icon": "SignOut", "destructive": true }
89
+ ]
90
+ }
81
91
  },
82
92
  "Badge": {
83
93
  "variant": [
@@ -2,6 +2,42 @@
2
2
 
3
3
  Use this contract when generating interfaces from Figma Make into code for `@mich8060/unified-design-system`.
4
4
 
5
+ ## Setup Instructions
6
+
7
+ Run this setup flow before generating UI:
8
+
9
+ 1. Verify local toolchain
10
+ - Ensure `git`, `node` (LTS), and `npm` are installed.
11
+ - Confirm with:
12
+ - `node -v`
13
+ - `npm -v`
14
+ - `git --version`
15
+
16
+ 2. Install dependencies
17
+ - Run `npm install`.
18
+ - Resolve and rerun if install fails.
19
+
20
+ 3. Select brand (required before scaffolding)
21
+ - Ask which brand to use: `default`, `comphealth`, `weatherby`, `connect`, `locumsmart`, `modio`, `gms`, or `wireframe`.
22
+ - Do not generate routes/menu until brand is selected.
23
+
24
+ 4. Load AI contracts in order
25
+ - `@mich8060/unified-design-system/ai/discovery.json`
26
+ - `@mich8060/unified-design-system/ai/manifest.json`
27
+ - `@mich8060/unified-design-system/ai/schema`
28
+ - `@mich8060/unified-design-system/ai/icons` (or `@mich8060/unified-design-system/ai/icons.json`)
29
+ - `@mich8060/unified-design-system/ai/navigation`
30
+ - `@mich8060/unified-design-system/ai/templates`
31
+
32
+ 5. Build required scaffold
33
+ - Wrap app root with `BrowserRouter` (or `RouterProvider`) before any route-aware UDS components.
34
+ - Use `AppShell > AppShell.Menu > AppShell.Content > AppShell.Main` as root layout.
35
+ - Build `Menu.navItems` from selected brand in `brand-menus.json`.
36
+
37
+ 6. Validate
38
+ - Run `npm run build` and `npm run ci:ai` (if available).
39
+ - Fix failures and rerun until passing.
40
+
5
41
  ## Required Stack
6
42
 
7
43
  - Use only imports from `@mich8060/unified-design-system` (or `@mich8060/unified-design-system/figma-make`).
@@ -18,6 +54,7 @@ Use this contract when generating interfaces from Figma Make into code for `@mic
18
54
  - No Ant-style prop APIs on UDS components:
19
55
  - `Menu.items`, `Menu.selectedKeys`, `Menu.mode`
20
56
  - `Flex.vertical`, `Flex.justify`, `Flex.align`
57
+ - `Layout.vertical`, `Layout.justify`, `Layout.align`
21
58
  - `Button.type`
22
59
  - `Text.type`, `Text.strong`
23
60
  - `Badge.status`, `Badge.color`
@@ -33,19 +70,19 @@ Use this contract when generating interfaces from Figma Make into code for `@mic
33
70
  ## Starter Layout Recipes
34
71
 
35
72
  1. `auth-form-card`
36
- - `Container(gap="--uds-spacing-24") > Card > Text + Field(TextInput) + Field(TextInput) + Flex(Button primary + Button text)`
73
+ - `Container(gap="--uds-spacing-24") > Card > Text + Field(TextInput) + Field(TextInput) + Layout(Button primary + Button text)`
37
74
 
38
75
  2. `dashboard-table-summary`
39
- - `Container(gap="--uds-spacing-16") > Flex(Text heading + Button primary) + Table(Status/Tag/ActionMenu)`
76
+ - `Container(gap="--uds-spacing-16") > Layout(Text heading + Button primary) + Table(Status/Tag/ActionMenu)`
40
77
 
41
78
  3. `settings-two-column`
42
- - `Container > Text heading + Flex(gap="--uds-spacing-24") > Card(form) + Card(summary)`
79
+ - `Container > Text heading + Layout(gap="--uds-spacing-24") > Card(form) + Card(summary)`
43
80
 
44
81
  4. `modal-confirmation`
45
- - `Modal > Text heading + Text body + Flex(Button text + Button destructive)`
82
+ - `Modal > Text heading + Text body + Layout(Button text + Button destructive)`
46
83
 
47
84
  5. `wizard-steps-form`
48
- - `Container > Text heading + Steps + Card(Field + Field + Flex(Button text + Button primary))`
85
+ - `Container > Text heading + Steps + Card(Field + Field + Layout(Button text + Button primary))`
49
86
 
50
87
  ## Icon Guidance
51
88
 
@@ -57,6 +94,15 @@ Use this contract when generating interfaces from Figma Make into code for `@mic
57
94
  - Load brand menu definitions from `@mich8060/unified-design-system/ai/navigation`.
58
95
  - Do not hardcode brand nav links when this contract is available.
59
96
  - Build `Menu.navItems` directly from the brand entry in `brand-menus.json`.
97
+ - Default `Menu.showSearch` to `false` unless explicitly requested.
98
+
99
+ ## Account ActionMenu Guidance
100
+
101
+ - In the `Menu` account section, default `accountMenuItems` to:
102
+ 1. `Contact` with icon `Phone`
103
+ 2. `Feedback` with icon `ChatCenteredText`
104
+ 3. `Sign out` with icon `SignOut` (`destructive: true`)
105
+ - Keep this order unless explicit product requirements override it.
60
106
 
61
107
  ## Enforcement Notes
62
108
 
@@ -68,10 +114,10 @@ Use this contract when generating interfaces from Figma Make into code for `@mic
68
114
 
69
115
  Bad (rejected):
70
116
  - `Menu` with `items`/`selectedKeys`/`mode`
71
- - `Flex` with `vertical`/`justify`/`align`
117
+ - `Layout` with `vertical`/`justify`/`align`
72
118
  - `Button` with `type="primary"`
73
119
 
74
120
  Good (accepted):
75
121
  - `Menu` with `navItems` and `activeMode`
76
- - `Flex` with `direction`, `justifyContent`, `alignItems`
122
+ - `Layout` with `direction`, `justifyContent`, `alignItems`
77
123
  - `Button` with `appearance="primary"`
@@ -0,0 +1,39 @@
1
+ {
2
+ "contractName": "uds.ai.layout-architecture",
3
+ "schemaVersion": "1.0.0",
4
+ "rootPatterns": {
5
+ "application": {
6
+ "requiredRoot": "AppShell",
7
+ "requiredChildren": ["AppShell.Content", "AppShell.Main"],
8
+ "optionalChildren": ["AppShell.Menu", "AppShell.Header", "AppShell.Footer", "AppShell.SubNav"],
9
+ "rules": [
10
+ "Wrap route-aware views in BrowserRouter or RouterProvider.",
11
+ "Render AppShell.Menu only when nav data is present.",
12
+ "Attach page content routes under AppShell.Main."
13
+ ]
14
+ }
15
+ },
16
+ "defaults": {
17
+ "container": {
18
+ "appearance": "transparent",
19
+ "padding": "large"
20
+ },
21
+ "menu": {
22
+ "showSearch": false
23
+ }
24
+ },
25
+ "blueprints": [
26
+ {
27
+ "id": "dashboard",
28
+ "structure": ["Toolbar", "Container", "Statistics", "Card"]
29
+ },
30
+ {
31
+ "id": "data-table-page",
32
+ "structure": ["Toolbar", "Container", "Table", "Pagination"]
33
+ },
34
+ {
35
+ "id": "settings-page",
36
+ "structure": ["Toolbar", "Container", "Tabs", "Card", "Field", "Button"]
37
+ }
38
+ ]
39
+ }
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e={AppShell:["Menu","Container","Flex","Text","Button"],Container:["Flex","Table","Text","Button","Field","Divider","Tag"],Field:["TextInput","Input","Dropdown","Datepicker","Textarea","Checkbox","Radio","Toggle","Slider","FileUpload"],Modal:["Text","Button","Divider","Field","TextInput","Dropdown","Datepicker","Textarea","Tag"],Table:["Tag","Status","Avatar","Button","ActionMenu","ProgressIndicator","DotStatus"],Tabs:["Text","Tag","Button","Table","Field"],Menu:["ActionMenu","Dropdown","Toggle","Text","Icon"]},a={ActionMenu:["Menu","Table"],Avatar:["Table"],Button:["AppShell","Container","Flex","Modal","Table","Tabs"],Checkbox:["Field"],Container:["AppShell","root"],Datepicker:["Field","Modal"],Divider:["Container","Modal"],DotStatus:["Table"],Dropdown:["Field","Menu","Modal"],Field:["Container","Modal","Tabs"],FileUpload:["Field"],Flex:["AppShell","Container"],Icon:["Menu"],Input:["Field"],Menu:["AppShell","root"],Modal:["AppShell","Container","root"],ProgressIndicator:["Table"],Radio:["Field"],Slider:["Field"],Status:["Table"],Table:["Container","Tabs"],Tag:["Container","Modal","Table","Tabs"],Text:["AppShell","Container","Flex","Menu","Modal","Tabs"],TextInput:["Field","Modal"],Textarea:["Field","Modal"],Toggle:["Field","Menu"]},o=[{parent:"Modal",child:"Modal",reason:"Nested modals create inaccessible focus traps."},{parent:"Dialog",child:"Dialog",reason:"Nested dialogs reduce escape behavior predictability."},{parent:"Toast",child:"Modal",reason:"Toast surfaces must remain non-blocking."},{parent:"Toast",child:"Dialog",reason:"Toast surfaces must remain non-blocking."},{parent:"Table",child:"Table",reason:"Nested tables reduce readability and responsiveness."},{parent:"Button",child:"Button",reason:"Interactive controls cannot be nested."}],t={allowedChildrenByParent:e,allowedParentsByChild:a,disallowedPairs:o};exports.CompositionRules=t;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e={AppShell:["Menu","Container","Layout","Text","Button"],Container:["Layout","Table","Text","Button","Field","Divider","Tag"],Field:["TextInput","Input","Dropdown","Datepicker","Textarea","Checkbox","Radio","Toggle","Slider","FileUpload"],Modal:["Text","Button","Divider","Field","TextInput","Dropdown","Datepicker","Textarea","Tag"],Table:["Tag","Status","Avatar","Button","ActionMenu","ProgressIndicator","DotStatus"],Tabs:["Text","Tag","Button","Table","Field"],Menu:["ActionMenu","Dropdown","Toggle","Text","Icon"]},a={ActionMenu:["Menu","Table"],Avatar:["Table"],Button:["AppShell","Container","Layout","Modal","Table","Tabs"],Checkbox:["Field"],Container:["AppShell","root"],Datepicker:["Field","Modal"],Divider:["Container","Modal"],DotStatus:["Table"],Dropdown:["Field","Menu","Modal"],Field:["Container","Modal","Tabs"],FileUpload:["Field"],Layout:["AppShell","Container"],Icon:["Menu"],Input:["Field"],Menu:["AppShell","root"],Modal:["AppShell","Container","root"],ProgressIndicator:["Table"],Radio:["Field"],Slider:["Field"],Status:["Table"],Table:["Container","Tabs"],Tag:["Container","Modal","Table","Tabs"],Text:["AppShell","Container","Layout","Menu","Modal","Tabs"],TextInput:["Field","Modal"],Textarea:["Field","Modal"],Toggle:["Field","Menu"]},o=[{parent:"Modal",child:"Modal",reason:"Nested modals create inaccessible focus traps."},{parent:"Dialog",child:"Dialog",reason:"Nested dialogs reduce escape behavior predictability."},{parent:"Toast",child:"Modal",reason:"Toast surfaces must remain non-blocking."},{parent:"Toast",child:"Dialog",reason:"Toast surfaces must remain non-blocking."},{parent:"Table",child:"Table",reason:"Nested tables reduce readability and responsiveness."},{parent:"Button",child:"Button",reason:"Interactive controls cannot be nested."}],t={allowedChildrenByParent:e,allowedParentsByChild:a,disallowedPairs:o};exports.CompositionRules=t;
@@ -1 +1 @@
1
- const e={AppShell:["Menu","Container","Flex","Text","Button"],Container:["Flex","Table","Text","Button","Field","Divider","Tag"],Field:["TextInput","Input","Dropdown","Datepicker","Textarea","Checkbox","Radio","Toggle","Slider","FileUpload"],Modal:["Text","Button","Divider","Field","TextInput","Dropdown","Datepicker","Textarea","Tag"],Table:["Tag","Status","Avatar","Button","ActionMenu","ProgressIndicator","DotStatus"],Tabs:["Text","Tag","Button","Table","Field"],Menu:["ActionMenu","Dropdown","Toggle","Text","Icon"]},a={ActionMenu:["Menu","Table"],Avatar:["Table"],Button:["AppShell","Container","Flex","Modal","Table","Tabs"],Checkbox:["Field"],Container:["AppShell","root"],Datepicker:["Field","Modal"],Divider:["Container","Modal"],DotStatus:["Table"],Dropdown:["Field","Menu","Modal"],Field:["Container","Modal","Tabs"],FileUpload:["Field"],Flex:["AppShell","Container"],Icon:["Menu"],Input:["Field"],Menu:["AppShell","root"],Modal:["AppShell","Container","root"],ProgressIndicator:["Table"],Radio:["Field"],Slider:["Field"],Status:["Table"],Table:["Container","Tabs"],Tag:["Container","Modal","Table","Tabs"],Text:["AppShell","Container","Flex","Menu","Modal","Tabs"],TextInput:["Field","Modal"],Textarea:["Field","Modal"],Toggle:["Field","Menu"]},o=[{parent:"Modal",child:"Modal",reason:"Nested modals create inaccessible focus traps."},{parent:"Dialog",child:"Dialog",reason:"Nested dialogs reduce escape behavior predictability."},{parent:"Toast",child:"Modal",reason:"Toast surfaces must remain non-blocking."},{parent:"Toast",child:"Dialog",reason:"Toast surfaces must remain non-blocking."},{parent:"Table",child:"Table",reason:"Nested tables reduce readability and responsiveness."},{parent:"Button",child:"Button",reason:"Interactive controls cannot be nested."}],t={allowedChildrenByParent:e,allowedParentsByChild:a,disallowedPairs:o};export{t as CompositionRules};
1
+ const e={AppShell:["Menu","Container","Layout","Text","Button"],Container:["Layout","Table","Text","Button","Field","Divider","Tag"],Field:["TextInput","Input","Dropdown","Datepicker","Textarea","Checkbox","Radio","Toggle","Slider","FileUpload"],Modal:["Text","Button","Divider","Field","TextInput","Dropdown","Datepicker","Textarea","Tag"],Table:["Tag","Status","Avatar","Button","ActionMenu","ProgressIndicator","DotStatus"],Tabs:["Text","Tag","Button","Table","Field"],Menu:["ActionMenu","Dropdown","Toggle","Text","Icon"]},a={ActionMenu:["Menu","Table"],Avatar:["Table"],Button:["AppShell","Container","Layout","Modal","Table","Tabs"],Checkbox:["Field"],Container:["AppShell","root"],Datepicker:["Field","Modal"],Divider:["Container","Modal"],DotStatus:["Table"],Dropdown:["Field","Menu","Modal"],Field:["Container","Modal","Tabs"],FileUpload:["Field"],Layout:["AppShell","Container"],Icon:["Menu"],Input:["Field"],Menu:["AppShell","root"],Modal:["AppShell","Container","root"],ProgressIndicator:["Table"],Radio:["Field"],Slider:["Field"],Status:["Table"],Table:["Container","Tabs"],Tag:["Container","Modal","Table","Tabs"],Text:["AppShell","Container","Layout","Menu","Modal","Tabs"],TextInput:["Field","Modal"],Textarea:["Field","Modal"],Toggle:["Field","Menu"]},o=[{parent:"Modal",child:"Modal",reason:"Nested modals create inaccessible focus traps."},{parent:"Dialog",child:"Dialog",reason:"Nested dialogs reduce escape behavior predictability."},{parent:"Toast",child:"Modal",reason:"Toast surfaces must remain non-blocking."},{parent:"Toast",child:"Dialog",reason:"Toast surfaces must remain non-blocking."},{parent:"Table",child:"Table",reason:"Nested tables reduce readability and responsiveness."},{parent:"Button",child:"Button",reason:"Interactive controls cannot be nested."}],t={allowedChildrenByParent:e,allowedParentsByChild:a,disallowedPairs:o};export{t as CompositionRules};
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e={primaryAction:{component:"Button",props:{appearance:"primary"},notes:"Use one primary action per section max."},secondaryAction:{component:"Button",props:{appearance:"text"},notes:"Use non-primary appearance for secondary actions."},sectionContainer:{component:"Container",props:{appearance:"transparent",padding:"large"},notes:"Default section wrapper: transparent surface with 24px padding."},contentStack:{component:"Flex",props:{direction:"column",gap:"--uds-spacing-16"},notes:"Primary stack for vertical rhythm."},formFieldWrapper:{component:"Field",notes:"Wrap inputs that require label/helper/error messaging."},textInputControl:{component:"TextInput",notes:"Use TextInput for freeform single-line text."},selectionControl:{component:"Dropdown",notes:"Use Dropdown for controlled selection."},statusIndicator:{component:"Status",notes:"Use semantic status component for state communication."},badgeLabel:{component:"Tag",notes:"Use Tag for concise categorical labels."},contextualActions:{component:"ActionMenu",notes:"Use ActionMenu for row/object-level secondary actions."},dataPresentation:{component:"Table",notes:"Use Table for tabular datasets and structured records."},confirmationDialog:{component:"Modal",notes:"Use Modal for confirmation/destructive decision points."}};exports.IntentComponentMappings=e;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n={primaryAction:{component:"Button",props:{appearance:"primary"},notes:"Use one primary action per section max."},secondaryAction:{component:"Button",props:{appearance:"text"},notes:"Use non-primary appearance for secondary actions."},sectionContainer:{component:"Container",props:{appearance:"transparent",padding:"large"},notes:"Default section wrapper: transparent surface with 24px padding."},contentStack:{component:"Layout",props:{direction:"column",gap:"--uds-spacing-16"},notes:"Primary stack for vertical rhythm."},formFieldWrapper:{component:"Field",notes:"Wrap inputs that require label/helper/error messaging."},textInputControl:{component:"TextInput",notes:"Use TextInput for freeform single-line text."},selectionControl:{component:"Dropdown",notes:"Use Dropdown for controlled selection."},statusIndicator:{component:"Status",notes:"Use semantic status component for state communication."},badgeLabel:{component:"Tag",notes:"Use Tag for concise categorical labels."},contextualActions:{component:"ActionMenu",notes:"Use ActionMenu for row/object-level secondary actions."},dataPresentation:{component:"Table",notes:"Use Table for tabular datasets and structured records."},confirmationDialog:{component:"Modal",notes:"Use Modal for confirmation/destructive decision points."}};exports.IntentComponentMappings=n;
@@ -1 +1 @@
1
- const n={primaryAction:{component:"Button",props:{appearance:"primary"},notes:"Use one primary action per section max."},secondaryAction:{component:"Button",props:{appearance:"text"},notes:"Use non-primary appearance for secondary actions."},sectionContainer:{component:"Container",props:{appearance:"transparent",padding:"large"},notes:"Default section wrapper: transparent surface with 24px padding."},contentStack:{component:"Flex",props:{direction:"column",gap:"--uds-spacing-16"},notes:"Primary stack for vertical rhythm."},formFieldWrapper:{component:"Field",notes:"Wrap inputs that require label/helper/error messaging."},textInputControl:{component:"TextInput",notes:"Use TextInput for freeform single-line text."},selectionControl:{component:"Dropdown",notes:"Use Dropdown for controlled selection."},statusIndicator:{component:"Status",notes:"Use semantic status component for state communication."},badgeLabel:{component:"Tag",notes:"Use Tag for concise categorical labels."},contextualActions:{component:"ActionMenu",notes:"Use ActionMenu for row/object-level secondary actions."},dataPresentation:{component:"Table",notes:"Use Table for tabular datasets and structured records."},confirmationDialog:{component:"Modal",notes:"Use Modal for confirmation/destructive decision points."}};export{n as IntentComponentMappings};
1
+ const n={primaryAction:{component:"Button",props:{appearance:"primary"},notes:"Use one primary action per section max."},secondaryAction:{component:"Button",props:{appearance:"text"},notes:"Use non-primary appearance for secondary actions."},sectionContainer:{component:"Container",props:{appearance:"transparent",padding:"large"},notes:"Default section wrapper: transparent surface with 24px padding."},contentStack:{component:"Layout",props:{direction:"column",gap:"--uds-spacing-16"},notes:"Primary stack for vertical rhythm."},formFieldWrapper:{component:"Field",notes:"Wrap inputs that require label/helper/error messaging."},textInputControl:{component:"TextInput",notes:"Use TextInput for freeform single-line text."},selectionControl:{component:"Dropdown",notes:"Use Dropdown for controlled selection."},statusIndicator:{component:"Status",notes:"Use semantic status component for state communication."},badgeLabel:{component:"Tag",notes:"Use Tag for concise categorical labels."},contextualActions:{component:"ActionMenu",notes:"Use ActionMenu for row/object-level secondary actions."},dataPresentation:{component:"Table",notes:"Use Table for tabular datasets and structured records."},confirmationDialog:{component:"Modal",notes:"Use Modal for confirmation/destructive decision points."}};export{n as IntentComponentMappings};
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e={AuthForm:{name:"AuthForm",layout:"vertical",requiredComponents:["Container","Field","TextInput","Button","Text"],structure:[{type:"Container",role:"container"},{type:"Text",role:"heading",props:{variant:"heading-24"}},{type:"Field",role:"email-field"},{type:"TextInput",role:"email-input",props:{type:"email"}},{type:"Field",role:"password-field"},{type:"TextInput",role:"password-input",props:{type:"password"}},{type:"Button",role:"primary-submit",props:{appearance:"primary"}}],spacing:"--uds-spacing-16",widthConstraint:"var(--uds-spacing-480, 480px)",rules:{maxPrimaryActionsPerSection:1,requiredFieldWrapper:!0}},ModalConfirmation:{name:"ModalConfirmation",layout:"vertical",requiredComponents:["Modal","Text","Button"],structure:[{type:"Modal",role:"overlay"},{type:"Text",role:"title",props:{variant:"heading-20"}},{type:"Text",role:"body",props:{variant:"body-16"}},{type:"Button",role:"secondary-cancel",props:{appearance:"ghost"}},{type:"Button",role:"primary-confirm",props:{appearance:"primary"}}],spacing:"--uds-spacing-16",widthConstraint:"var(--uds-spacing-640, 640px)",rules:{maxPrimaryActionsPerSection:1,disallowNestedModal:!0}},DataTablePage:{name:"DataTablePage",layout:"vertical",requiredComponents:["Container","Text","Table","Pagination","Button"],structure:[{type:"Container",role:"page-shell"},{type:"Flex",role:"header-row"},{type:"Text",role:"title",props:{variant:"heading-24"}},{type:"Button",role:"primary-page-action",props:{appearance:"primary"}},{type:"Table",role:"data-table"},{type:"Pagination",role:"table-pagination"}],spacing:"--uds-spacing-24",widthConstraint:"100%",rules:{maxPrimaryActionsPerSection:1,tableRequiresPaginationForLargeData:!0}},FilterPanel:{name:"FilterPanel",layout:"vertical",requiredComponents:["Container","Field","Dropdown","Datepicker","Button"],structure:[{type:"Container",role:"panel"},{type:"Field",role:"status-filter"},{type:"Dropdown",role:"status-select"},{type:"Field",role:"date-filter"},{type:"Datepicker",role:"date-select"},{type:"Button",role:"apply-filters",props:{appearance:"primary"}}],spacing:"--uds-spacing-12",widthConstraint:"var(--uds-spacing-320, 320px)",rules:{maxPrimaryActionsPerSection:1,requiredFieldWrapper:!0}},DashboardSection:{name:"DashboardSection",layout:"grid",requiredComponents:["Container","Text","Tag","ProgressIndicator"],structure:[{type:"Container",role:"dashboard-container"},{type:"Flex",role:"section-header"},{type:"Text",role:"section-title",props:{variant:"heading-20"}},{type:"Container",role:"metric-card"},{type:"Tag",role:"metric-status"},{type:"ProgressIndicator",role:"metric-progress"}],spacing:"--uds-spacing-16",widthConstraint:"100%",rules:{maxPrimaryActionsPerSection:1,cardGridColumns:[1,2,3]}}};exports.PatternRegistry=e;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e={AuthForm:{name:"AuthForm",layout:"vertical",requiredComponents:["Container","Field","TextInput","Button","Text"],structure:[{type:"Container",role:"container"},{type:"Text",role:"heading",props:{variant:"heading-24"}},{type:"Field",role:"email-field"},{type:"TextInput",role:"email-input",props:{type:"email"}},{type:"Field",role:"password-field"},{type:"TextInput",role:"password-input",props:{type:"password"}},{type:"Button",role:"primary-submit",props:{appearance:"primary"}}],spacing:"--uds-spacing-16",widthConstraint:"var(--uds-spacing-480, 480px)",rules:{maxPrimaryActionsPerSection:1,requiredFieldWrapper:!0}},ModalConfirmation:{name:"ModalConfirmation",layout:"vertical",requiredComponents:["Modal","Text","Button"],structure:[{type:"Modal",role:"overlay"},{type:"Text",role:"title",props:{variant:"heading-20"}},{type:"Text",role:"body",props:{variant:"body-16"}},{type:"Button",role:"secondary-cancel",props:{appearance:"ghost"}},{type:"Button",role:"primary-confirm",props:{appearance:"primary"}}],spacing:"--uds-spacing-16",widthConstraint:"var(--uds-spacing-640, 640px)",rules:{maxPrimaryActionsPerSection:1,disallowNestedModal:!0}},DataTablePage:{name:"DataTablePage",layout:"vertical",requiredComponents:["Container","Text","Table","Pagination","Button"],structure:[{type:"Container",role:"page-shell"},{type:"Flex",role:"header-row"},{type:"Text",role:"title",props:{variant:"heading-24"}},{type:"Button",role:"primary-page-action",props:{appearance:"primary"}},{type:"Table",role:"data-table"},{type:"Pagination",role:"table-pagination"}],spacing:"--uds-spacing-24",widthConstraint:"100%",rules:{maxPrimaryActionsPerSection:1,tableRequiresPaginationForLargeData:!0}},FilterPanel:{name:"FilterPanel",layout:"vertical",requiredComponents:["Container","Field","Dropdown","Datepicker","Button"],structure:[{type:"Container",role:"panel"},{type:"Field",role:"status-filter"},{type:"Dropdown",role:"status-select"},{type:"Field",role:"date-filter"},{type:"Datepicker",role:"date-select"},{type:"Button",role:"apply-filters",props:{appearance:"primary"}}],spacing:"--uds-spacing-12",widthConstraint:"var(--uds-spacing-320, 320px)",rules:{maxPrimaryActionsPerSection:1,requiredFieldWrapper:!0}},DashboardSection:{name:"DashboardSection",layout:"grid",requiredComponents:["Container","Text","Tag","ProgressIndicator"],structure:[{type:"Container",role:"dashboard-container"},{type:"Flex",role:"section-header"},{type:"Text",role:"section-title",props:{variant:"heading-20"}},{type:"Container",role:"metric-card"},{type:"Tag",role:"metric-status"},{type:"ProgressIndicator",role:"metric-progress"}],spacing:"--uds-spacing-16",widthConstraint:"100%",rules:{maxPrimaryActionsPerSection:1,cardGridColumns:[1,2,3]}},AppShellDashboard:{name:"AppShellDashboard",layout:"vertical",requiredComponents:["AppShell","Menu","Toolbar","Container","Statistics","Card"],structure:[{type:"AppShell",role:"app-shell"},{type:"Menu",role:"primary-navigation"},{type:"Toolbar",role:"page-toolbar"},{type:"Container",role:"page-container"},{type:"Statistics",role:"kpi-row"},{type:"Card",role:"content-card"}],spacing:"--uds-spacing-24",widthConstraint:"100%",rules:{maxPrimaryActionsPerSection:1,requiresAppShellRoot:!0}},SettingsWorkspace:{name:"SettingsWorkspace",layout:"horizontal",requiredComponents:["Container","Tabs","Card","Field","TextInput","Button"],structure:[{type:"Container",role:"settings-page"},{type:"Tabs",role:"settings-tabs"},{type:"Card",role:"settings-panel"},{type:"Field",role:"settings-field"},{type:"TextInput",role:"settings-input",props:{type:"text"}},{type:"Button",role:"save-settings",props:{appearance:"primary"}}],spacing:"--uds-spacing-24",widthConstraint:"100%",rules:{maxPrimaryActionsPerSection:1,requiredFieldWrapper:!0}},WizardChecklist:{name:"WizardChecklist",layout:"horizontal",requiredComponents:["Container","Checklist","Card","Field","TextInput","Button"],structure:[{type:"Container",role:"wizard-page"},{type:"Checklist",role:"wizard-progress"},{type:"Card",role:"wizard-step-content"},{type:"Field",role:"step-field"},{type:"TextInput",role:"step-input",props:{type:"text"}},{type:"Button",role:"step-continue",props:{appearance:"primary"}}],spacing:"--uds-spacing-20",widthConstraint:"100%",rules:{maxPrimaryActionsPerSection:1,requiredFieldWrapper:!0}},CalendarPlanningPage:{name:"CalendarPlanningPage",layout:"vertical",requiredComponents:["Container","Toolbar","Calendar","EventCard","Button"],structure:[{type:"Container",role:"calendar-page"},{type:"Toolbar",role:"calendar-toolbar"},{type:"Calendar",role:"calendar-grid"},{type:"EventCard",role:"event-summary"},{type:"Button",role:"calendar-primary-action",props:{appearance:"primary"}}],spacing:"--uds-spacing-16",widthConstraint:"100%",rules:{maxPrimaryActionsPerSection:1}},AnalyticsOverview:{name:"AnalyticsOverview",layout:"grid",requiredComponents:["Container","Toolbar","Statistics","Card","Table","Pagination"],structure:[{type:"Container",role:"analytics-page"},{type:"Toolbar",role:"analytics-toolbar"},{type:"Statistics",role:"analytics-kpis"},{type:"Card",role:"analytics-chart-or-summary"},{type:"Table",role:"analytics-table"},{type:"Pagination",role:"analytics-pagination"}],spacing:"--uds-spacing-24",widthConstraint:"100%",rules:{maxPrimaryActionsPerSection:1,tableRequiresPaginationForLargeData:!0}}};exports.PatternRegistry=e;