azamat-ui-kit-cli 0.2.2

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 (213) hide show
  1. package/README.md +8 -0
  2. package/dist/index.js +432 -0
  3. package/package.json +34 -0
  4. package/vendor/package.json +4 -0
  5. package/vendor/src/components/actions/action-bar.tsx +35 -0
  6. package/vendor/src/components/actions/action-menu.tsx +120 -0
  7. package/vendor/src/components/actions/button-group.tsx +47 -0
  8. package/vendor/src/components/actions/copy-button.tsx +91 -0
  9. package/vendor/src/components/actions/copy-field.tsx +31 -0
  10. package/vendor/src/components/actions/floating-action-button.tsx +33 -0
  11. package/vendor/src/components/actions/index.ts +7 -0
  12. package/vendor/src/components/actions/public.ts +5 -0
  13. package/vendor/src/components/actions/quick-action-grid.tsx +162 -0
  14. package/vendor/src/components/calendar/calendar.tsx +328 -0
  15. package/vendor/src/components/calendar/date-picker.tsx +78 -0
  16. package/vendor/src/components/calendar/date-range-picker.tsx +96 -0
  17. package/vendor/src/components/calendar/date-utils.ts +89 -0
  18. package/vendor/src/components/calendar/index.ts +4 -0
  19. package/vendor/src/components/charts/charts.tsx +275 -0
  20. package/vendor/src/components/charts/horizontal-bar-chart.tsx +46 -0
  21. package/vendor/src/components/charts/index.ts +4 -0
  22. package/vendor/src/components/charts/kpi.tsx +68 -0
  23. package/vendor/src/components/charts/progress-ring.tsx +45 -0
  24. package/vendor/src/components/charts/public.ts +1 -0
  25. package/vendor/src/components/command/command-palette.tsx +375 -0
  26. package/vendor/src/components/command/index.ts +1 -0
  27. package/vendor/src/components/data-table/data-table-actions-column.tsx +58 -0
  28. package/vendor/src/components/data-table/data-table-bulk-actions.tsx +84 -0
  29. package/vendor/src/components/data-table/data-table-column-visibility-menu.tsx +79 -0
  30. package/vendor/src/components/data-table/data-table-pagination.tsx +91 -0
  31. package/vendor/src/components/data-table/data-table-row-actions.tsx +48 -0
  32. package/vendor/src/components/data-table/data-table-select-column.tsx +59 -0
  33. package/vendor/src/components/data-table/data-table-sortable-header.tsx +45 -0
  34. package/vendor/src/components/data-table/data-table-toolbar.tsx +76 -0
  35. package/vendor/src/components/data-table/data-table-view-presets.tsx +128 -0
  36. package/vendor/src/components/data-table/data-table.tsx +507 -0
  37. package/vendor/src/components/data-table/index.ts +12 -0
  38. package/vendor/src/components/data-table/public.ts +10 -0
  39. package/vendor/src/components/data-table/table-export-menu.tsx +56 -0
  40. package/vendor/src/components/data-table/table-import-button.tsx +43 -0
  41. package/vendor/src/components/display/activity-feed.tsx +97 -0
  42. package/vendor/src/components/display/avatar.tsx +131 -0
  43. package/vendor/src/components/display/code-block.tsx +33 -0
  44. package/vendor/src/components/display/data-state.tsx +63 -0
  45. package/vendor/src/components/display/description-list.tsx +119 -0
  46. package/vendor/src/components/display/descriptions.tsx +83 -0
  47. package/vendor/src/components/display/entity-card.tsx +53 -0
  48. package/vendor/src/components/display/file-card.tsx +54 -0
  49. package/vendor/src/components/display/index.ts +30 -0
  50. package/vendor/src/components/display/kanban.tsx +104 -0
  51. package/vendor/src/components/display/keyboard-shortcut.tsx +31 -0
  52. package/vendor/src/components/display/list.tsx +100 -0
  53. package/vendor/src/components/display/metric-grid.tsx +86 -0
  54. package/vendor/src/components/display/progress.tsx +162 -0
  55. package/vendor/src/components/display/property-grid.tsx +54 -0
  56. package/vendor/src/components/display/result.tsx +90 -0
  57. package/vendor/src/components/display/smart-card.tsx +168 -0
  58. package/vendor/src/components/display/statistic.tsx +107 -0
  59. package/vendor/src/components/display/status-legend.tsx +108 -0
  60. package/vendor/src/components/display/tag-list.tsx +52 -0
  61. package/vendor/src/components/display/timeline.tsx +132 -0
  62. package/vendor/src/components/display/tree-view.tsx +116 -0
  63. package/vendor/src/components/feedback/alert.tsx +69 -0
  64. package/vendor/src/components/feedback/empty-state.tsx +56 -0
  65. package/vendor/src/components/feedback/index.ts +5 -0
  66. package/vendor/src/components/feedback/loading-state.tsx +39 -0
  67. package/vendor/src/components/feedback/page-state.tsx +69 -0
  68. package/vendor/src/components/feedback/status-badge.tsx +62 -0
  69. package/vendor/src/components/filters/filter-bar.tsx +89 -0
  70. package/vendor/src/components/filters/filter-chips.tsx +69 -0
  71. package/vendor/src/components/filters/index.ts +2 -0
  72. package/vendor/src/components/form/form-actions.tsx +53 -0
  73. package/vendor/src/components/form/form-async-select.tsx +26 -0
  74. package/vendor/src/components/form/form-date-input.tsx +19 -0
  75. package/vendor/src/components/form/form-date-picker.tsx +54 -0
  76. package/vendor/src/components/form/form-date-range-input.tsx +79 -0
  77. package/vendor/src/components/form/form-date-range-picker.tsx +57 -0
  78. package/vendor/src/components/form/form-field-shell.tsx +191 -0
  79. package/vendor/src/components/form/form-input.tsx +480 -0
  80. package/vendor/src/components/form/form-number-input.tsx +19 -0
  81. package/vendor/src/components/form/form-password-input.tsx +19 -0
  82. package/vendor/src/components/form/form-phone-input.tsx +22 -0
  83. package/vendor/src/components/form/form-search-input.tsx +19 -0
  84. package/vendor/src/components/form/form-section.tsx +29 -0
  85. package/vendor/src/components/form/form-select.tsx +194 -0
  86. package/vendor/src/components/form/form-switch.tsx +145 -0
  87. package/vendor/src/components/form/form-textarea.tsx +103 -0
  88. package/vendor/src/components/form/index.ts +17 -0
  89. package/vendor/src/components/form/public.ts +14 -0
  90. package/vendor/src/components/form/smart-form-shell.tsx +59 -0
  91. package/vendor/src/components/inputs/async-select.tsx +1143 -0
  92. package/vendor/src/components/inputs/clearable-input.tsx +78 -0
  93. package/vendor/src/components/inputs/color-input.tsx +47 -0
  94. package/vendor/src/components/inputs/combobox.tsx +89 -0
  95. package/vendor/src/components/inputs/date-input.tsx +32 -0
  96. package/vendor/src/components/inputs/date-range-input.tsx +67 -0
  97. package/vendor/src/components/inputs/index.ts +19 -0
  98. package/vendor/src/components/inputs/input-chrome.tsx +37 -0
  99. package/vendor/src/components/inputs/input-decorator.tsx +64 -0
  100. package/vendor/src/components/inputs/input-value.ts +42 -0
  101. package/vendor/src/components/inputs/masked-input.tsx +51 -0
  102. package/vendor/src/components/inputs/money-input.tsx +73 -0
  103. package/vendor/src/components/inputs/number-input.tsx +87 -0
  104. package/vendor/src/components/inputs/numeric-value.ts +39 -0
  105. package/vendor/src/components/inputs/otp-input.tsx +102 -0
  106. package/vendor/src/components/inputs/password-input.tsx +85 -0
  107. package/vendor/src/components/inputs/phone-input.tsx +46 -0
  108. package/vendor/src/components/inputs/quantity-input.tsx +116 -0
  109. package/vendor/src/components/inputs/quantity-stepper.tsx +49 -0
  110. package/vendor/src/components/inputs/rating.tsx +98 -0
  111. package/vendor/src/components/inputs/search-input.tsx +26 -0
  112. package/vendor/src/components/inputs/simple-select.tsx +72 -0
  113. package/vendor/src/components/inputs/slider.tsx +149 -0
  114. package/vendor/src/components/inputs/tag-input.tsx +104 -0
  115. package/vendor/src/components/layout/app-header.tsx +46 -0
  116. package/vendor/src/components/layout/app-shell.tsx +243 -0
  117. package/vendor/src/components/layout/app-sidebar.tsx +179 -0
  118. package/vendor/src/components/layout/breadcrumbs.tsx +72 -0
  119. package/vendor/src/components/layout/index.ts +11 -0
  120. package/vendor/src/components/layout/page-container.tsx +30 -0
  121. package/vendor/src/components/layout/page-header.tsx +60 -0
  122. package/vendor/src/components/layout/public.ts +10 -0
  123. package/vendor/src/components/layout/section.tsx +76 -0
  124. package/vendor/src/components/layout/sidebar-nav.tsx +147 -0
  125. package/vendor/src/components/layout/stat-card.tsx +88 -0
  126. package/vendor/src/components/layout/sticky-footer-bar.tsx +23 -0
  127. package/vendor/src/components/layout/workspace-shell.tsx +50 -0
  128. package/vendor/src/components/navigation/anchor-nav.tsx +44 -0
  129. package/vendor/src/components/navigation/index.ts +4 -0
  130. package/vendor/src/components/navigation/page-tabs.tsx +67 -0
  131. package/vendor/src/components/navigation/pagination.tsx +179 -0
  132. package/vendor/src/components/navigation/stepper-tabs.tsx +67 -0
  133. package/vendor/src/components/notifications/index.ts +1 -0
  134. package/vendor/src/components/notifications/toast.tsx +259 -0
  135. package/vendor/src/components/overlay/confirm-dialog.tsx +66 -0
  136. package/vendor/src/components/overlay/dialog-actions.tsx +68 -0
  137. package/vendor/src/components/overlay/index.ts +4 -0
  138. package/vendor/src/components/overlay/modal-shell.tsx +93 -0
  139. package/vendor/src/components/overlay/sheet-shell.tsx +212 -0
  140. package/vendor/src/components/patterns/action-system.tsx +116 -0
  141. package/vendor/src/components/patterns/crud-system.tsx +53 -0
  142. package/vendor/src/components/patterns/data-view.tsx +84 -0
  143. package/vendor/src/components/patterns/entity-details.tsx +66 -0
  144. package/vendor/src/components/patterns/filter-builder.tsx +113 -0
  145. package/vendor/src/components/patterns/form-builder-presets.ts +131 -0
  146. package/vendor/src/components/patterns/form-builder.tsx +334 -0
  147. package/vendor/src/components/patterns/index.ts +12 -0
  148. package/vendor/src/components/patterns/public.ts +4 -0
  149. package/vendor/src/components/patterns/resource-detail-page.tsx +160 -0
  150. package/vendor/src/components/patterns/resource-page.tsx +159 -0
  151. package/vendor/src/components/patterns/resource-system.tsx +61 -0
  152. package/vendor/src/components/patterns/settings-section.tsx +46 -0
  153. package/vendor/src/components/patterns/status-system.tsx +89 -0
  154. package/vendor/src/components/theme-provider.tsx +51 -0
  155. package/vendor/src/components/ui/badge.tsx +52 -0
  156. package/vendor/src/components/ui/button.tsx +61 -0
  157. package/vendor/src/components/ui/card.tsx +103 -0
  158. package/vendor/src/components/ui/checkbox.tsx +82 -0
  159. package/vendor/src/components/ui/collapse.tsx +126 -0
  160. package/vendor/src/components/ui/command.tsx +194 -0
  161. package/vendor/src/components/ui/dialog.tsx +160 -0
  162. package/vendor/src/components/ui/divider.tsx +46 -0
  163. package/vendor/src/components/ui/dropdown-menu.tsx +266 -0
  164. package/vendor/src/components/ui/input-group.tsx +158 -0
  165. package/vendor/src/components/ui/input.tsx +20 -0
  166. package/vendor/src/components/ui/popover.tsx +90 -0
  167. package/vendor/src/components/ui/segmented-control.tsx +78 -0
  168. package/vendor/src/components/ui/select.tsx +201 -0
  169. package/vendor/src/components/ui/skeleton.tsx +75 -0
  170. package/vendor/src/components/ui/spinner.tsx +50 -0
  171. package/vendor/src/components/ui/switch.tsx +71 -0
  172. package/vendor/src/components/ui/table.tsx +114 -0
  173. package/vendor/src/components/ui/tabs.tsx +55 -0
  174. package/vendor/src/components/ui/textarea.tsx +18 -0
  175. package/vendor/src/components/ui/tooltip.tsx +38 -0
  176. package/vendor/src/components/upload/file-upload.tsx +483 -0
  177. package/vendor/src/components/upload/image-upload.tsx +118 -0
  178. package/vendor/src/components/upload/index.ts +2 -0
  179. package/vendor/src/components/wizard/index.ts +2 -0
  180. package/vendor/src/components/wizard/stepper.tsx +53 -0
  181. package/vendor/src/components/wizard/wizard.tsx +60 -0
  182. package/vendor/src/families/card-family.ts +28 -0
  183. package/vendor/src/families/catalog.ts +96 -0
  184. package/vendor/src/families/data-table-family.ts +31 -0
  185. package/vendor/src/families/docs-adoption.ts +103 -0
  186. package/vendor/src/families/docs-groups.ts +209 -0
  187. package/vendor/src/families/docs-queries.ts +84 -0
  188. package/vendor/src/families/docs-routing.ts +89 -0
  189. package/vendor/src/families/form-family.ts +45 -0
  190. package/vendor/src/families/index.ts +17 -0
  191. package/vendor/src/families/input-family.ts +61 -0
  192. package/vendor/src/families/member-metadata.ts +466 -0
  193. package/vendor/src/families/member-queries.ts +28 -0
  194. package/vendor/src/families/member-snippet-queries.ts +54 -0
  195. package/vendor/src/families/member-snippets.ts +673 -0
  196. package/vendor/src/families/migration-map.ts +79 -0
  197. package/vendor/src/families/queries.ts +63 -0
  198. package/vendor/src/families/select-family.ts +33 -0
  199. package/vendor/src/families/views.ts +81 -0
  200. package/vendor/src/hooks/index.ts +6 -0
  201. package/vendor/src/hooks/use-before-unload-when-dirty.ts +21 -0
  202. package/vendor/src/hooks/use-data-table-view-state.ts +122 -0
  203. package/vendor/src/hooks/use-debounce.ts +52 -0
  204. package/vendor/src/hooks/use-disclosure.ts +38 -0
  205. package/vendor/src/hooks/use-is-mobile.ts +28 -0
  206. package/vendor/src/hooks/use-session-storage-state.ts +85 -0
  207. package/vendor/src/index.ts +38 -0
  208. package/vendor/src/lib/utils.ts +6 -0
  209. package/vendor/templates/components/button.tsx +0 -0
  210. package/vendor/templates/components/data-table.tsx +0 -0
  211. package/vendor/templates/components/input.tsx +0 -0
  212. package/vendor/templates/lib/utils.ts +0 -0
  213. package/vendor/templates/styles/globals.css +0 -0
@@ -0,0 +1,45 @@
1
+ import {
2
+ FormActions,
3
+ FormAsyncSelect,
4
+ FormDateInput,
5
+ FormDatePicker,
6
+ FormDateRangeInput,
7
+ FormDateRangePicker,
8
+ FormFieldShell,
9
+ FormInput,
10
+ FormNumberInput,
11
+ FormPasswordInput,
12
+ FormPhoneInput,
13
+ FormSearchInput,
14
+ FormSection,
15
+ FormSelect,
16
+ FormSwitch,
17
+ FormTextarea,
18
+ SmartFormShell,
19
+ } from "@/components/form"
20
+ import { FormBuilder } from "@/components/patterns/form-builder"
21
+ import * as FormBuilderPresets from "@/components/patterns/form-builder-presets"
22
+
23
+ const FormFamily = {
24
+ Field: FormFieldShell,
25
+ Section: FormSection,
26
+ Actions: FormActions,
27
+ Shell: SmartFormShell,
28
+ Input: FormInput,
29
+ Textarea: FormTextarea,
30
+ Select: FormSelect,
31
+ AsyncSelect: FormAsyncSelect,
32
+ Switch: FormSwitch,
33
+ Search: FormSearchInput,
34
+ Password: FormPasswordInput,
35
+ Number: FormNumberInput,
36
+ Phone: FormPhoneInput,
37
+ Date: FormDateInput,
38
+ DateRange: FormDateRangeInput,
39
+ DatePicker: FormDatePicker,
40
+ DateRangePicker: FormDateRangePicker,
41
+ Builder: FormBuilder,
42
+ Presets: FormBuilderPresets,
43
+ } as const
44
+
45
+ export { FormFamily }
@@ -0,0 +1,17 @@
1
+ export * from "./input-family"
2
+ export * from "./select-family"
3
+ export * from "./card-family"
4
+ export * from "./form-family"
5
+ export * from "./data-table-family"
6
+ export * from "./catalog"
7
+ export * from "./docs-groups"
8
+ export * from "./docs-queries"
9
+ export * from "./docs-adoption"
10
+ export * from "./docs-routing"
11
+ export * from "./member-metadata"
12
+ export * from "./member-queries"
13
+ export * from "./member-snippets"
14
+ export * from "./member-snippet-queries"
15
+ export * from "./migration-map"
16
+ export * from "./queries"
17
+ export * from "./views"
@@ -0,0 +1,61 @@
1
+ import {
2
+ ClearableInput,
3
+ ColorInput,
4
+ DateInput,
5
+ DateRangeInput,
6
+ MaskedInput,
7
+ MoneyInput,
8
+ NumberInput,
9
+ OtpInput,
10
+ PasswordInput,
11
+ PhoneInput,
12
+ QuantityInput,
13
+ QuantityStepper,
14
+ Rating,
15
+ RangeSlider,
16
+ SearchInput,
17
+ Slider,
18
+ TagInput,
19
+ } from "@/components/inputs"
20
+ import {
21
+ FormDateInput,
22
+ FormDateRangeInput,
23
+ FormInput,
24
+ FormNumberInput,
25
+ FormPasswordInput,
26
+ FormPhoneInput,
27
+ FormSearchInput,
28
+ } from "@/components/form"
29
+ import { Input } from "@/components/ui/input"
30
+
31
+ const InputFamily = {
32
+ Root: Input,
33
+ Clearable: ClearableInput,
34
+ Search: SearchInput,
35
+ Password: PasswordInput,
36
+ Number: NumberInput,
37
+ Date: DateInput,
38
+ DateRange: DateRangeInput,
39
+ Money: MoneyInput,
40
+ Quantity: QuantityInput,
41
+ Masked: MaskedInput,
42
+ Phone: PhoneInput,
43
+ Otp: OtpInput,
44
+ Color: ColorInput,
45
+ Tag: TagInput,
46
+ Rating,
47
+ Slider,
48
+ RangeSlider,
49
+ QuantityStepper,
50
+ Form: {
51
+ Input: FormInput,
52
+ Search: FormSearchInput,
53
+ Password: FormPasswordInput,
54
+ Number: FormNumberInput,
55
+ Phone: FormPhoneInput,
56
+ Date: FormDateInput,
57
+ DateRange: FormDateRangeInput,
58
+ },
59
+ } as const
60
+
61
+ export { InputFamily }
@@ -0,0 +1,466 @@
1
+ import type { ComponentFamilyName } from "@/families/catalog"
2
+
3
+ export type ComponentMemberMaturity = "canonical" | "member" | "transitional" | "advanced"
4
+
5
+ export type ComponentMemberMetadata = {
6
+ component: string
7
+ family: ComponentFamilyName
8
+ section:
9
+ | "primitives"
10
+ | "presets"
11
+ | "form-wrappers"
12
+ | "wrappers"
13
+ | "extensions"
14
+ | "advanced"
15
+ | "transitional"
16
+ maturity: ComponentMemberMaturity
17
+ summary: string
18
+ useWhen: string
19
+ }
20
+
21
+ export const componentMemberMetadata: ComponentMemberMetadata[] = [
22
+ {
23
+ component: "Input",
24
+ family: "InputFamily",
25
+ section: "primitives",
26
+ maturity: "canonical",
27
+ summary: "Base text field primitive.",
28
+ useWhen: "Use for standard single-line entry before reaching for formatted or decorated presets.",
29
+ },
30
+ {
31
+ component: "ClearableInput",
32
+ family: "InputFamily",
33
+ section: "presets",
34
+ maturity: "member",
35
+ summary: "Input with built-in clear affordance.",
36
+ useWhen: "Use for filters and quick-search surfaces where clearing the field should be one click.",
37
+ },
38
+ {
39
+ component: "SearchInput",
40
+ family: "InputFamily",
41
+ section: "presets",
42
+ maturity: "member",
43
+ summary: "Search-flavored clearable input with icon defaults.",
44
+ useWhen: "Use for search bars, table filters, and command-style query fields.",
45
+ },
46
+ {
47
+ component: "PasswordInput",
48
+ family: "InputFamily",
49
+ section: "presets",
50
+ maturity: "member",
51
+ summary: "Password field with visibility toggle.",
52
+ useWhen: "Use in auth and credential forms where reveal/hide improves accuracy.",
53
+ },
54
+ {
55
+ component: "NumberInput",
56
+ family: "InputFamily",
57
+ section: "presets",
58
+ maturity: "member",
59
+ summary: "Text-backed numeric field with parsed value callbacks.",
60
+ useWhen: "Use when you need browser-friendly number entry without relying on native spinner UX.",
61
+ },
62
+ {
63
+ component: "MaskedInput",
64
+ family: "InputFamily",
65
+ section: "presets",
66
+ maturity: "member",
67
+ summary: "Formatting adapter around the base input.",
68
+ useWhen: "Use when raw and displayed values differ, such as identifiers and custom entry masks.",
69
+ },
70
+ {
71
+ component: "PhoneInput",
72
+ family: "InputFamily",
73
+ section: "presets",
74
+ maturity: "member",
75
+ summary: "Phone preset built on masking behavior.",
76
+ useWhen: "Use for phone capture when you want readable formatting while storing digits.",
77
+ },
78
+ {
79
+ component: "MoneyInput",
80
+ family: "InputFamily",
81
+ section: "presets",
82
+ maturity: "member",
83
+ summary: "Money-style field with prefix and suffix slots.",
84
+ useWhen: "Use for finance and pricing fields that need currency context in the chrome.",
85
+ },
86
+ {
87
+ component: "QuantityInput",
88
+ family: "InputFamily",
89
+ section: "presets",
90
+ maturity: "member",
91
+ summary: "Numeric entry with optional step controls.",
92
+ useWhen: "Use for cart counts, stock edits, and compact quantity adjustments.",
93
+ },
94
+ {
95
+ component: "OtpInput",
96
+ family: "InputFamily",
97
+ section: "presets",
98
+ maturity: "member",
99
+ summary: "Multi-cell one-time-code input.",
100
+ useWhen: "Use for verification and short secure code flows that benefit from per-digit focus management.",
101
+ },
102
+ {
103
+ component: "ColorInput",
104
+ family: "InputFamily",
105
+ section: "presets",
106
+ maturity: "member",
107
+ summary: "Color picker field.",
108
+ useWhen: "Use when the browser-native color picker is enough for theme or label selection.",
109
+ },
110
+ {
111
+ component: "DateInput",
112
+ family: "InputFamily",
113
+ section: "presets",
114
+ maturity: "member",
115
+ summary: "Native date field wrapper.",
116
+ useWhen: "Use for lightweight date capture where a full calendar popover is unnecessary.",
117
+ },
118
+ {
119
+ component: "DateRangeInput",
120
+ family: "InputFamily",
121
+ section: "presets",
122
+ maturity: "member",
123
+ summary: "Two-field date range input.",
124
+ useWhen: "Use for admin filters and reports that only need from/to entry, not a visual calendar.",
125
+ },
126
+ {
127
+ component: "FormInput",
128
+ family: "InputFamily",
129
+ section: "form-wrappers",
130
+ maturity: "member",
131
+ summary: "Universal React Hook Form wrapper for text-like inputs.",
132
+ useWhen: "Use as the primary RHF entry for text, search, password, number, phone, and date flows by switching the kind prop instead of learning many wrapper names.",
133
+ },
134
+ {
135
+ component: "FormSearchInput",
136
+ family: "InputFamily",
137
+ section: "transitional",
138
+ maturity: "transitional",
139
+ summary: "Compatibility alias for FormInput kind=\"search\".",
140
+ useWhen: "Use only when migrating existing forms; prefer FormInput with kind=\"search\" for new work.",
141
+ },
142
+ {
143
+ component: "FormPasswordInput",
144
+ family: "InputFamily",
145
+ section: "transitional",
146
+ maturity: "transitional",
147
+ summary: "Compatibility alias for FormInput kind=\"password\".",
148
+ useWhen: "Use only when migrating existing forms; prefer FormInput with kind=\"password\" for new work.",
149
+ },
150
+ {
151
+ component: "FormNumberInput",
152
+ family: "InputFamily",
153
+ section: "transitional",
154
+ maturity: "transitional",
155
+ summary: "Compatibility alias for FormInput kind=\"number\".",
156
+ useWhen: "Use only when migrating existing forms; prefer FormInput with kind=\"number\" for new work.",
157
+ },
158
+ {
159
+ component: "FormPhoneInput",
160
+ family: "InputFamily",
161
+ section: "transitional",
162
+ maturity: "transitional",
163
+ summary: "Compatibility alias for FormInput kind=\"phone\".",
164
+ useWhen: "Use only when migrating existing forms; prefer FormInput with kind=\"phone\" for new work.",
165
+ },
166
+ {
167
+ component: "FormDateInput",
168
+ family: "InputFamily",
169
+ section: "transitional",
170
+ maturity: "transitional",
171
+ summary: "Compatibility alias for FormInput kind=\"date\".",
172
+ useWhen: "Use only when migrating existing forms; prefer FormInput with kind=\"date\" for new work.",
173
+ },
174
+ {
175
+ component: "FormDateRangeInput",
176
+ family: "InputFamily",
177
+ section: "form-wrappers",
178
+ maturity: "member",
179
+ summary: "RHF wrapper around DateRangeInput.",
180
+ useWhen: "Use for filter and reporting forms that submit a plain from/to range object.",
181
+ },
182
+ {
183
+ component: "TagInput",
184
+ family: "InputFamily",
185
+ section: "advanced",
186
+ maturity: "advanced",
187
+ summary: "Multi-token freeform entry surface.",
188
+ useWhen: "Use only when a basic input or select cannot represent repeated tokens cleanly.",
189
+ },
190
+ {
191
+ component: "QuantityStepper",
192
+ family: "InputFamily",
193
+ section: "advanced",
194
+ maturity: "advanced",
195
+ summary: "Stepper-only quantity control.",
196
+ useWhen: "Use for compact increment/decrement interactions where free typing should be avoided.",
197
+ },
198
+
199
+ {
200
+ component: "Select",
201
+ family: "SelectFamily",
202
+ section: "primitives",
203
+ maturity: "canonical",
204
+ summary: "Base select primitive.",
205
+ useWhen: "Use for standard single-select flows before introducing remote data or combobox behavior.",
206
+ },
207
+ {
208
+ component: "SimpleSelect",
209
+ family: "SelectFamily",
210
+ section: "presets",
211
+ maturity: "member",
212
+ summary: "Opinionated simple option select.",
213
+ useWhen: "Use for straightforward app settings and filter lists with static options.",
214
+ },
215
+ {
216
+ component: "AsyncSelect",
217
+ family: "SelectFamily",
218
+ section: "presets",
219
+ maturity: "member",
220
+ summary: "Remote-search single select.",
221
+ useWhen: "Use when options are loaded on demand from a server or large local source.",
222
+ },
223
+ {
224
+ component: "AsyncMultiSelect",
225
+ family: "SelectFamily",
226
+ section: "presets",
227
+ maturity: "member",
228
+ summary: "Remote-search multi select.",
229
+ useWhen: "Use when users need to pick many remote items and review selected tags inline.",
230
+ },
231
+ {
232
+ component: "Combobox",
233
+ family: "SelectFamily",
234
+ section: "presets",
235
+ maturity: "member",
236
+ summary: "Searchable command-style select surface.",
237
+ useWhen: "Use when fast keyboard filtering matters more than strict select semantics.",
238
+ },
239
+ {
240
+ component: "FormSelect",
241
+ family: "SelectFamily",
242
+ section: "form-wrappers",
243
+ maturity: "member",
244
+ summary: "Universal RHF wrapper for simple and async select flows.",
245
+ useWhen: "Use as the main select entry for submitted form state, keeping simple and async modes behind one consistent wrapper contract.",
246
+ },
247
+ {
248
+ component: "FormAsyncSelect",
249
+ family: "SelectFamily",
250
+ section: "transitional",
251
+ maturity: "transitional",
252
+ summary: "Compatibility alias for FormSelect kind=\"async\".",
253
+ useWhen: "Use only when migrating existing forms; prefer FormSelect with kind=\"async\" for new work.",
254
+ },
255
+
256
+ {
257
+ component: "Card",
258
+ family: "CardFamily",
259
+ section: "primitives",
260
+ maturity: "canonical",
261
+ summary: "Base card primitive.",
262
+ useWhen: "Use for neutral content framing before adopting dashboard-specific presets.",
263
+ },
264
+ {
265
+ component: "InfoCard",
266
+ family: "CardFamily",
267
+ section: "primitives",
268
+ maturity: "canonical",
269
+ summary: "Reusable composed information card.",
270
+ useWhen: "Use for common metric and summary content where teams need a faster default than raw Card composition.",
271
+ },
272
+ {
273
+ component: "StatCard",
274
+ family: "CardFamily",
275
+ section: "presets",
276
+ maturity: "member",
277
+ summary: "Compact stat display card.",
278
+ useWhen: "Use for dashboard KPI rows and overview panels.",
279
+ },
280
+ {
281
+ component: "StatisticCard",
282
+ family: "CardFamily",
283
+ section: "presets",
284
+ maturity: "member",
285
+ summary: "Structured statistic card.",
286
+ useWhen: "Use when a metric needs trend, label, and support copy in one tile.",
287
+ },
288
+ {
289
+ component: "EntityCard",
290
+ family: "CardFamily",
291
+ section: "presets",
292
+ maturity: "member",
293
+ summary: "Entity-oriented card surface.",
294
+ useWhen: "Use for users, records, or business entities with compact metadata.",
295
+ },
296
+ {
297
+ component: "FileCard",
298
+ family: "CardFamily",
299
+ section: "presets",
300
+ maturity: "member",
301
+ summary: "File preview card.",
302
+ useWhen: "Use for uploads, attachments, and lightweight asset lists.",
303
+ },
304
+ {
305
+ component: "SmartCard",
306
+ family: "CardFamily",
307
+ section: "transitional",
308
+ maturity: "transitional",
309
+ summary: "Older card alias kept for migration compatibility.",
310
+ useWhen: "Use only when migrating existing surfaces; prefer Card or InfoCard for new usage.",
311
+ },
312
+
313
+ {
314
+ component: "FormFieldShell",
315
+ family: "FormFamily",
316
+ section: "primitives",
317
+ maturity: "canonical",
318
+ summary: "Base shell for label, description, and validation copy.",
319
+ useWhen: "Use as the common structure for any custom form control that needs consistent field framing.",
320
+ },
321
+ {
322
+ component: "FormTextarea",
323
+ family: "FormFamily",
324
+ section: "wrappers",
325
+ maturity: "member",
326
+ summary: "RHF textarea wrapper.",
327
+ useWhen: "Use for multi-line text in forms that need shared field-shell behavior.",
328
+ },
329
+ {
330
+ component: "FormSwitch",
331
+ family: "FormFamily",
332
+ section: "wrappers",
333
+ maturity: "member",
334
+ summary: "RHF switch wrapper.",
335
+ useWhen: "Use for boolean toggles tied to validation and descriptive copy.",
336
+ },
337
+ {
338
+ component: "FormDatePicker",
339
+ family: "FormFamily",
340
+ section: "wrappers",
341
+ maturity: "member",
342
+ summary: "RHF wrapper around calendar date picker.",
343
+ useWhen: "Use when the form needs a richer date picker than a native date input.",
344
+ },
345
+ {
346
+ component: "FormDateRangePicker",
347
+ family: "FormFamily",
348
+ section: "wrappers",
349
+ maturity: "member",
350
+ summary: "RHF wrapper around calendar date range picker.",
351
+ useWhen: "Use when a form needs a visual range-selection experience instead of plain from/to inputs.",
352
+ },
353
+ {
354
+ component: "FormBuilder",
355
+ family: "FormFamily",
356
+ section: "advanced",
357
+ maturity: "advanced",
358
+ summary: "Schema-like abstraction over field wrappers.",
359
+ useWhen: "Use only when repeated internal forms justify abstraction over direct wrapper composition.",
360
+ },
361
+ {
362
+ component: "SmartFormShell",
363
+ family: "FormFamily",
364
+ section: "advanced",
365
+ maturity: "transitional",
366
+ summary: "Older shell abstraction kept during migration.",
367
+ useWhen: "Use only for migration or legacy screens; prefer FormFieldShell and explicit wrappers for new work.",
368
+ },
369
+
370
+ {
371
+ component: "DataTable",
372
+ family: "DataTableFamily",
373
+ section: "primitives",
374
+ maturity: "canonical",
375
+ summary: "Canonical tabular data surface.",
376
+ useWhen: "Use when rows, sorting, selection, and pagination belong in one reusable grid.",
377
+ },
378
+ {
379
+ component: "DataTableToolbar",
380
+ family: "DataTableFamily",
381
+ section: "extensions",
382
+ maturity: "member",
383
+ summary: "Toolbar scaffold for table actions and filters.",
384
+ useWhen: "Use when the table needs a structured top bar instead of ad-hoc controls.",
385
+ },
386
+ {
387
+ component: "DataTablePagination",
388
+ family: "DataTableFamily",
389
+ section: "extensions",
390
+ maturity: "member",
391
+ summary: "Pagination control for the data table.",
392
+ useWhen: "Use when pagination UI should remain visually aligned with the table system.",
393
+ },
394
+ {
395
+ component: "DataTableColumnVisibilityMenu",
396
+ family: "DataTableFamily",
397
+ section: "extensions",
398
+ maturity: "member",
399
+ summary: "Hide/show columns control.",
400
+ useWhen: "Use when dense tables need user-level column personalization.",
401
+ },
402
+ {
403
+ component: "DataTableSortableHeader",
404
+ family: "DataTableFamily",
405
+ section: "extensions",
406
+ maturity: "member",
407
+ summary: "Sortable header helper.",
408
+ useWhen: "Use when a column header needs consistent sort affordance and state rendering.",
409
+ },
410
+ {
411
+ component: "DataTableRowActions",
412
+ family: "DataTableFamily",
413
+ section: "extensions",
414
+ maturity: "member",
415
+ summary: "Row-level actions surface.",
416
+ useWhen: "Use when each row needs contextual actions without custom menu plumbing.",
417
+ },
418
+ {
419
+ component: "DataTableBulkActions",
420
+ family: "DataTableFamily",
421
+ section: "extensions",
422
+ maturity: "member",
423
+ summary: "Bulk selection action surface.",
424
+ useWhen: "Use when multi-row operations should appear only after selection.",
425
+ },
426
+ {
427
+ component: "DataTableViewPresets",
428
+ family: "DataTableFamily",
429
+ section: "extensions",
430
+ maturity: "member",
431
+ summary: "Preset view controls for table states.",
432
+ useWhen: "Use when users need quick switching between saved or opinionated table views.",
433
+ },
434
+ {
435
+ component: "createDataTableSelectColumn",
436
+ family: "DataTableFamily",
437
+ section: "extensions",
438
+ maturity: "member",
439
+ summary: "Selection column factory.",
440
+ useWhen: "Use when you want standard row-selection behavior without rewriting the column definition.",
441
+ },
442
+ {
443
+ component: "createDataTableActionsColumn",
444
+ family: "DataTableFamily",
445
+ section: "extensions",
446
+ maturity: "member",
447
+ summary: "Actions column factory.",
448
+ useWhen: "Use when row action menus should follow the shared table contract.",
449
+ },
450
+ {
451
+ component: "TableExportMenu",
452
+ family: "DataTableFamily",
453
+ section: "advanced",
454
+ maturity: "advanced",
455
+ summary: "Export helpers for tables.",
456
+ useWhen: "Use only after the core table experience is already clear and export is truly required.",
457
+ },
458
+ {
459
+ component: "TableImportButton",
460
+ family: "DataTableFamily",
461
+ section: "advanced",
462
+ maturity: "advanced",
463
+ summary: "Import trigger tied to table workflows.",
464
+ useWhen: "Use only when import belongs directly beside a data table management flow.",
465
+ },
466
+ ] as const
@@ -0,0 +1,28 @@
1
+ import {
2
+ componentMemberMetadata,
3
+ type ComponentMemberMetadata,
4
+ type ComponentMemberMaturity,
5
+ } from "@/families/member-metadata"
6
+ import type { ComponentFamilyName } from "@/families/catalog"
7
+
8
+ const memberMetadataByComponent = new Map<string, ComponentMemberMetadata>(
9
+ componentMemberMetadata.map((entry) => [entry.component, entry])
10
+ )
11
+
12
+ function getComponentMemberMetadata(component: string) {
13
+ return memberMetadataByComponent.get(component)
14
+ }
15
+
16
+ function getFamilyMemberMetadata(family: ComponentFamilyName) {
17
+ return componentMemberMetadata.filter((entry) => entry.family === family)
18
+ }
19
+
20
+ function listComponentsByMaturity(maturity: ComponentMemberMaturity) {
21
+ return componentMemberMetadata.filter((entry) => entry.maturity === maturity)
22
+ }
23
+
24
+ export {
25
+ getComponentMemberMetadata,
26
+ getFamilyMemberMetadata,
27
+ listComponentsByMaturity,
28
+ }
@@ -0,0 +1,54 @@
1
+ import {
2
+ componentSnippetExamples,
3
+ type ComponentSnippetExample,
4
+ type ComponentSnippetVariant,
5
+ } from "@/families/member-snippets"
6
+ import type { ComponentFamilyName } from "@/families/catalog"
7
+ import { getComponentMemberMetadata } from "@/families/member-queries"
8
+
9
+ const snippetsByComponent = new Map<string, ComponentSnippetExample[]>()
10
+
11
+ for (const snippet of componentSnippetExamples) {
12
+ const existing = snippetsByComponent.get(snippet.component) ?? []
13
+ existing.push(snippet)
14
+ snippetsByComponent.set(snippet.component, existing)
15
+ }
16
+
17
+ function getComponentSnippets(component: string) {
18
+ return snippetsByComponent.get(component) ?? []
19
+ }
20
+
21
+ function getPrimaryComponentSnippet(component: string) {
22
+ return getComponentSnippets(component)[0]
23
+ }
24
+
25
+ function getComponentSnippetsByVariant(component: string) {
26
+ const grouped = new Map<ComponentSnippetVariant, ComponentSnippetExample[]>()
27
+
28
+ for (const snippet of getComponentSnippets(component)) {
29
+ const existing = grouped.get(snippet.variant) ?? []
30
+ existing.push(snippet)
31
+ grouped.set(snippet.variant, existing)
32
+ }
33
+
34
+ return grouped
35
+ }
36
+
37
+ function getFamilySnippets(family: ComponentFamilyName) {
38
+ return componentSnippetExamples.filter((snippet) => {
39
+ const metadata = getComponentMemberMetadata(snippet.component)
40
+ return metadata?.family === family
41
+ })
42
+ }
43
+
44
+ function listSnippetVariants() {
45
+ return [...new Set(componentSnippetExamples.map((snippet) => snippet.variant))]
46
+ }
47
+
48
+ export {
49
+ getComponentSnippets,
50
+ getComponentSnippetsByVariant,
51
+ getFamilySnippets,
52
+ getPrimaryComponentSnippet,
53
+ listSnippetVariants,
54
+ }