@ankhorage/zora 1.2.0 → 1.4.0
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.
- package/CHANGELOG.md +12 -0
- package/README.md +207 -0
- package/dist/components/app-bar/meta.d.ts +9 -0
- package/dist/components/app-bar/meta.d.ts.map +1 -0
- package/dist/components/app-bar/meta.js +9 -0
- package/dist/components/app-bar/meta.js.map +1 -0
- package/dist/components/avatar/meta.d.ts +9 -0
- package/dist/components/avatar/meta.d.ts.map +1 -0
- package/dist/components/avatar/meta.js +9 -0
- package/dist/components/avatar/meta.js.map +1 -0
- package/dist/components/avatar-group/meta.d.ts +9 -0
- package/dist/components/avatar-group/meta.d.ts.map +1 -0
- package/dist/components/avatar-group/meta.js +9 -0
- package/dist/components/avatar-group/meta.js.map +1 -0
- package/dist/components/badge/meta.d.ts +9 -0
- package/dist/components/badge/meta.d.ts.map +1 -0
- package/dist/components/badge/meta.js +9 -0
- package/dist/components/badge/meta.js.map +1 -0
- package/dist/components/button/meta.d.ts +45 -0
- package/dist/components/button/meta.d.ts.map +1 -0
- package/dist/components/button/meta.js +45 -0
- package/dist/components/button/meta.js.map +1 -0
- package/dist/components/card/meta.d.ts +44 -0
- package/dist/components/card/meta.d.ts.map +1 -0
- package/dist/components/card/meta.js +45 -0
- package/dist/components/card/meta.js.map +1 -0
- package/dist/components/checkbox/meta.d.ts +17 -0
- package/dist/components/checkbox/meta.d.ts.map +1 -0
- package/dist/components/checkbox/meta.js +17 -0
- package/dist/components/checkbox/meta.js.map +1 -0
- package/dist/components/chip/meta.d.ts +9 -0
- package/dist/components/chip/meta.d.ts.map +1 -0
- package/dist/components/chip/meta.js +9 -0
- package/dist/components/chip/meta.js.map +1 -0
- package/dist/components/chip-group/meta.d.ts +9 -0
- package/dist/components/chip-group/meta.d.ts.map +1 -0
- package/dist/components/chip-group/meta.js +9 -0
- package/dist/components/chip-group/meta.js.map +1 -0
- package/dist/components/drawer/meta.d.ts +9 -0
- package/dist/components/drawer/meta.d.ts.map +1 -0
- package/dist/components/drawer/meta.js +9 -0
- package/dist/components/drawer/meta.js.map +1 -0
- package/dist/components/form/meta.d.ts +79 -0
- package/dist/components/form/meta.d.ts.map +1 -0
- package/dist/components/form/meta.js +79 -0
- package/dist/components/form/meta.js.map +1 -0
- package/dist/components/heading/meta.d.ts +69 -0
- package/dist/components/heading/meta.d.ts.map +1 -0
- package/dist/components/heading/meta.js +66 -0
- package/dist/components/heading/meta.js.map +1 -0
- package/dist/components/icon/meta.d.ts +9 -0
- package/dist/components/icon/meta.d.ts.map +1 -0
- package/dist/components/icon/meta.js +9 -0
- package/dist/components/icon/meta.js.map +1 -0
- package/dist/components/icon-button/meta.d.ts +9 -0
- package/dist/components/icon-button/meta.d.ts.map +1 -0
- package/dist/components/icon-button/meta.js +9 -0
- package/dist/components/icon-button/meta.js.map +1 -0
- package/dist/components/image/meta.d.ts +9 -0
- package/dist/components/image/meta.d.ts.map +1 -0
- package/dist/components/image/meta.js +9 -0
- package/dist/components/image/meta.js.map +1 -0
- package/dist/components/input/meta.d.ts +45 -0
- package/dist/components/input/meta.d.ts.map +1 -0
- package/dist/components/input/meta.js +45 -0
- package/dist/components/input/meta.js.map +1 -0
- package/dist/components/media-card/meta.d.ts +9 -0
- package/dist/components/media-card/meta.d.ts.map +1 -0
- package/dist/components/media-card/meta.js +9 -0
- package/dist/components/media-card/meta.js.map +1 -0
- package/dist/components/metric-card/meta.d.ts +9 -0
- package/dist/components/metric-card/meta.d.ts.map +1 -0
- package/dist/components/metric-card/meta.js +9 -0
- package/dist/components/metric-card/meta.js.map +1 -0
- package/dist/components/modal/meta.d.ts +9 -0
- package/dist/components/modal/meta.d.ts.map +1 -0
- package/dist/components/modal/meta.js +9 -0
- package/dist/components/modal/meta.js.map +1 -0
- package/dist/components/navigation-item/meta.d.ts +9 -0
- package/dist/components/navigation-item/meta.d.ts.map +1 -0
- package/dist/components/navigation-item/meta.js +9 -0
- package/dist/components/navigation-item/meta.js.map +1 -0
- package/dist/components/navigation-list/meta.d.ts +9 -0
- package/dist/components/navigation-list/meta.d.ts.map +1 -0
- package/dist/components/navigation-list/meta.js +9 -0
- package/dist/components/navigation-list/meta.js.map +1 -0
- package/dist/components/progress/meta.d.ts +9 -0
- package/dist/components/progress/meta.d.ts.map +1 -0
- package/dist/components/progress/meta.js +9 -0
- package/dist/components/progress/meta.js.map +1 -0
- package/dist/components/radio/meta.d.ts +17 -0
- package/dist/components/radio/meta.d.ts.map +1 -0
- package/dist/components/radio/meta.js +17 -0
- package/dist/components/radio/meta.js.map +1 -0
- package/dist/components/rating/meta.d.ts +9 -0
- package/dist/components/rating/meta.d.ts.map +1 -0
- package/dist/components/rating/meta.js +9 -0
- package/dist/components/rating/meta.js.map +1 -0
- package/dist/components/search-bar/meta.d.ts +9 -0
- package/dist/components/search-bar/meta.d.ts.map +1 -0
- package/dist/components/search-bar/meta.js +9 -0
- package/dist/components/search-bar/meta.js.map +1 -0
- package/dist/components/select/meta.d.ts +9 -0
- package/dist/components/select/meta.d.ts.map +1 -0
- package/dist/components/select/meta.js +9 -0
- package/dist/components/select/meta.js.map +1 -0
- package/dist/components/tabs/meta.d.ts +9 -0
- package/dist/components/tabs/meta.d.ts.map +1 -0
- package/dist/components/tabs/meta.js +9 -0
- package/dist/components/tabs/meta.js.map +1 -0
- package/dist/components/text/meta.d.ts +71 -0
- package/dist/components/text/meta.d.ts.map +1 -0
- package/dist/components/text/meta.js +68 -0
- package/dist/components/text/meta.js.map +1 -0
- package/dist/components/textarea/meta.d.ts +45 -0
- package/dist/components/textarea/meta.d.ts.map +1 -0
- package/dist/components/textarea/meta.js +45 -0
- package/dist/components/textarea/meta.js.map +1 -0
- package/dist/components/toolbar/meta.d.ts +17 -0
- package/dist/components/toolbar/meta.d.ts.map +1 -0
- package/dist/components/toolbar/meta.js +17 -0
- package/dist/components/toolbar/meta.js.map +1 -0
- package/dist/foundation/meta.d.ts +93 -0
- package/dist/foundation/meta.d.ts.map +1 -0
- package/dist/foundation/meta.js +84 -0
- package/dist/foundation/meta.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/layout/app-shell/meta.d.ts +9 -0
- package/dist/layout/app-shell/meta.d.ts.map +1 -0
- package/dist/layout/app-shell/meta.js +9 -0
- package/dist/layout/app-shell/meta.js.map +1 -0
- package/dist/layout/auth-layout/meta.d.ts +33 -0
- package/dist/layout/auth-layout/meta.d.ts.map +1 -0
- package/dist/layout/auth-layout/meta.js +34 -0
- package/dist/layout/auth-layout/meta.js.map +1 -0
- package/dist/layout/page/meta.d.ts +19 -0
- package/dist/layout/page/meta.d.ts.map +1 -0
- package/dist/layout/page/meta.js +20 -0
- package/dist/layout/page/meta.js.map +1 -0
- package/dist/layout/page-header/meta.d.ts +38 -0
- package/dist/layout/page-header/meta.d.ts.map +1 -0
- package/dist/layout/page-header/meta.js +38 -0
- package/dist/layout/page-header/meta.js.map +1 -0
- package/dist/layout/page-section/meta.d.ts +28 -0
- package/dist/layout/page-section/meta.d.ts.map +1 -0
- package/dist/layout/page-section/meta.js +29 -0
- package/dist/layout/page-section/meta.js.map +1 -0
- package/dist/layout/settings-layout/meta.d.ts +9 -0
- package/dist/layout/settings-layout/meta.d.ts.map +1 -0
- package/dist/layout/settings-layout/meta.js +9 -0
- package/dist/layout/settings-layout/meta.js.map +1 -0
- package/dist/layout/sidebar-layout/meta.d.ts +9 -0
- package/dist/layout/sidebar-layout/meta.d.ts.map +1 -0
- package/dist/layout/sidebar-layout/meta.js +9 -0
- package/dist/layout/sidebar-layout/meta.js.map +1 -0
- package/dist/layout/topbar-layout/meta.d.ts +9 -0
- package/dist/layout/topbar-layout/meta.d.ts.map +1 -0
- package/dist/layout/topbar-layout/meta.js +9 -0
- package/dist/layout/topbar-layout/meta.js.map +1 -0
- package/dist/metadata/allowedChildren.d.ts +4 -0
- package/dist/metadata/allowedChildren.d.ts.map +1 -0
- package/dist/metadata/allowedChildren.js +26 -0
- package/dist/metadata/allowedChildren.js.map +1 -0
- package/dist/metadata/componentMeta.d.ts +3 -0
- package/dist/metadata/componentMeta.d.ts.map +1 -0
- package/dist/metadata/componentMeta.js +141 -0
- package/dist/metadata/componentMeta.js.map +1 -0
- package/dist/metadata/index.d.ts +3 -0
- package/dist/metadata/index.d.ts.map +1 -0
- package/dist/metadata/index.js +2 -0
- package/dist/metadata/index.js.map +1 -0
- package/dist/metadata/types.d.ts +49 -0
- package/dist/metadata/types.d.ts.map +1 -0
- package/dist/metadata/types.js +2 -0
- package/dist/metadata/types.js.map +1 -0
- package/dist/patterns/auth/meta.d.ts +33 -0
- package/dist/patterns/auth/meta.d.ts.map +1 -0
- package/dist/patterns/auth/meta.js +34 -0
- package/dist/patterns/auth/meta.js.map +1 -0
- package/dist/patterns/collection-editor/meta.d.ts +9 -0
- package/dist/patterns/collection-editor/meta.d.ts.map +1 -0
- package/dist/patterns/collection-editor/meta.js +9 -0
- package/dist/patterns/collection-editor/meta.js.map +1 -0
- package/dist/patterns/confirm-dialog/meta.d.ts +9 -0
- package/dist/patterns/confirm-dialog/meta.d.ts.map +1 -0
- package/dist/patterns/confirm-dialog/meta.js +9 -0
- package/dist/patterns/confirm-dialog/meta.js.map +1 -0
- package/dist/patterns/disclosure-section/meta.d.ts +9 -0
- package/dist/patterns/disclosure-section/meta.d.ts.map +1 -0
- package/dist/patterns/disclosure-section/meta.js +9 -0
- package/dist/patterns/disclosure-section/meta.js.map +1 -0
- package/dist/patterns/empty-state/meta.d.ts +33 -0
- package/dist/patterns/empty-state/meta.d.ts.map +1 -0
- package/dist/patterns/empty-state/meta.js +33 -0
- package/dist/patterns/empty-state/meta.js.map +1 -0
- package/dist/patterns/filter-bar/meta.d.ts +9 -0
- package/dist/patterns/filter-bar/meta.d.ts.map +1 -0
- package/dist/patterns/filter-bar/meta.js +9 -0
- package/dist/patterns/filter-bar/meta.js.map +1 -0
- package/dist/patterns/image-preview/meta.d.ts +9 -0
- package/dist/patterns/image-preview/meta.d.ts.map +1 -0
- package/dist/patterns/image-preview/meta.js +9 -0
- package/dist/patterns/image-preview/meta.js.map +1 -0
- package/dist/patterns/image-upload-field/meta.d.ts +9 -0
- package/dist/patterns/image-upload-field/meta.d.ts.map +1 -0
- package/dist/patterns/image-upload-field/meta.js +9 -0
- package/dist/patterns/image-upload-field/meta.js.map +1 -0
- package/dist/patterns/inspector-field/meta.d.ts +9 -0
- package/dist/patterns/inspector-field/meta.d.ts.map +1 -0
- package/dist/patterns/inspector-field/meta.js +9 -0
- package/dist/patterns/inspector-field/meta.js.map +1 -0
- package/dist/patterns/list/meta.d.ts +25 -0
- package/dist/patterns/list/meta.d.ts.map +1 -0
- package/dist/patterns/list/meta.js +26 -0
- package/dist/patterns/list/meta.js.map +1 -0
- package/dist/patterns/notice/meta.d.ts +34 -0
- package/dist/patterns/notice/meta.d.ts.map +1 -0
- package/dist/patterns/notice/meta.js +35 -0
- package/dist/patterns/notice/meta.js.map +1 -0
- package/dist/patterns/panel/meta.d.ts +44 -0
- package/dist/patterns/panel/meta.d.ts.map +1 -0
- package/dist/patterns/panel/meta.js +45 -0
- package/dist/patterns/panel/meta.js.map +1 -0
- package/dist/patterns/responsive-panel/meta.d.ts +9 -0
- package/dist/patterns/responsive-panel/meta.d.ts.map +1 -0
- package/dist/patterns/responsive-panel/meta.js +9 -0
- package/dist/patterns/responsive-panel/meta.js.map +1 -0
- package/dist/patterns/section-header/meta.d.ts +33 -0
- package/dist/patterns/section-header/meta.d.ts.map +1 -0
- package/dist/patterns/section-header/meta.js +33 -0
- package/dist/patterns/section-header/meta.js.map +1 -0
- package/dist/patterns/selection/SelectableItem.d.ts +4 -0
- package/dist/patterns/selection/SelectableItem.d.ts.map +1 -0
- package/dist/patterns/selection/SelectableItem.js +72 -0
- package/dist/patterns/selection/SelectableItem.js.map +1 -0
- package/dist/patterns/selection/SelectionProvider.d.ts +5 -0
- package/dist/patterns/selection/SelectionProvider.d.ts.map +1 -0
- package/dist/patterns/selection/SelectionProvider.js +64 -0
- package/dist/patterns/selection/SelectionProvider.js.map +1 -0
- package/dist/patterns/selection/index.d.ts +4 -0
- package/dist/patterns/selection/index.d.ts.map +1 -0
- package/dist/patterns/selection/index.js +3 -0
- package/dist/patterns/selection/index.js.map +1 -0
- package/dist/patterns/selection/meta.d.ts +17 -0
- package/dist/patterns/selection/meta.d.ts.map +1 -0
- package/dist/patterns/selection/meta.js +18 -0
- package/dist/patterns/selection/meta.js.map +1 -0
- package/dist/patterns/selection/resolveSelectionNextIds.d.ts +15 -0
- package/dist/patterns/selection/resolveSelectionNextIds.d.ts.map +1 -0
- package/dist/patterns/selection/resolveSelectionNextIds.js +44 -0
- package/dist/patterns/selection/resolveSelectionNextIds.js.map +1 -0
- package/dist/patterns/selection/types.d.ts +38 -0
- package/dist/patterns/selection/types.d.ts.map +1 -0
- package/dist/patterns/selection/types.js +2 -0
- package/dist/patterns/selection/types.js.map +1 -0
- package/dist/patterns/settings-row/meta.d.ts +39 -0
- package/dist/patterns/settings-row/meta.d.ts.map +1 -0
- package/dist/patterns/settings-row/meta.js +39 -0
- package/dist/patterns/settings-row/meta.js.map +1 -0
- package/dist/patterns/switch-field/meta.d.ts +9 -0
- package/dist/patterns/switch-field/meta.d.ts.map +1 -0
- package/dist/patterns/switch-field/meta.js +9 -0
- package/dist/patterns/switch-field/meta.js.map +1 -0
- package/dist/patterns/theme-composer/meta.d.ts +9 -0
- package/dist/patterns/theme-composer/meta.d.ts.map +1 -0
- package/dist/patterns/theme-composer/meta.js +9 -0
- package/dist/patterns/theme-composer/meta.js.map +1 -0
- package/dist/patterns/tile-grid/meta.d.ts +17 -0
- package/dist/patterns/tile-grid/meta.d.ts.map +1 -0
- package/dist/patterns/tile-grid/meta.js +18 -0
- package/dist/patterns/tile-grid/meta.js.map +1 -0
- package/dist/patterns/timeline/meta.d.ts +9 -0
- package/dist/patterns/timeline/meta.d.ts.map +1 -0
- package/dist/patterns/timeline/meta.js +9 -0
- package/dist/patterns/timeline/meta.js.map +1 -0
- package/dist/patterns/tree-view/meta.d.ts +17 -0
- package/dist/patterns/tree-view/meta.d.ts.map +1 -0
- package/dist/patterns/tree-view/meta.js +18 -0
- package/dist/patterns/tree-view/meta.js.map +1 -0
- package/dist/patterns/zora-drawer-content/meta.d.ts +9 -0
- package/dist/patterns/zora-drawer-content/meta.d.ts.map +1 -0
- package/dist/patterns/zora-drawer-content/meta.js +9 -0
- package/dist/patterns/zora-drawer-content/meta.js.map +1 -0
- package/dist/patterns/zora-tab-bar/meta.d.ts +9 -0
- package/dist/patterns/zora-tab-bar/meta.d.ts.map +1 -0
- package/dist/patterns/zora-tab-bar/meta.js +9 -0
- package/dist/patterns/zora-tab-bar/meta.js.map +1 -0
- package/package.json +1 -1
- package/src/components/app-bar/meta.ts +10 -0
- package/src/components/avatar/meta.ts +10 -0
- package/src/components/avatar-group/meta.ts +10 -0
- package/src/components/badge/meta.ts +10 -0
- package/src/components/button/meta.ts +46 -0
- package/src/components/card/meta.ts +46 -0
- package/src/components/checkbox/meta.ts +19 -0
- package/src/components/chip/meta.ts +10 -0
- package/src/components/chip-group/meta.ts +10 -0
- package/src/components/drawer/meta.ts +10 -0
- package/src/components/form/meta.ts +83 -0
- package/src/components/heading/meta.ts +67 -0
- package/src/components/icon/meta.ts +10 -0
- package/src/components/icon-button/meta.ts +10 -0
- package/src/components/image/meta.ts +10 -0
- package/src/components/input/meta.ts +46 -0
- package/src/components/media-card/meta.ts +10 -0
- package/src/components/metric-card/meta.ts +10 -0
- package/src/components/modal/meta.ts +10 -0
- package/src/components/navigation-item/meta.ts +10 -0
- package/src/components/navigation-list/meta.ts +10 -0
- package/src/components/progress/meta.ts +10 -0
- package/src/components/radio/meta.ts +19 -0
- package/src/components/rating/meta.ts +10 -0
- package/src/components/search-bar/meta.ts +10 -0
- package/src/components/select/meta.ts +10 -0
- package/src/components/tabs/meta.ts +10 -0
- package/src/components/text/meta.ts +69 -0
- package/src/components/textarea/meta.ts +46 -0
- package/src/components/toolbar/meta.ts +19 -0
- package/src/foundation/meta.ts +85 -0
- package/src/index.ts +22 -0
- package/src/layout/app-shell/meta.ts +10 -0
- package/src/layout/auth-layout/meta.ts +35 -0
- package/src/layout/page/meta.ts +21 -0
- package/src/layout/page-header/meta.ts +39 -0
- package/src/layout/page-section/meta.ts +30 -0
- package/src/layout/settings-layout/meta.ts +10 -0
- package/src/layout/sidebar-layout/meta.ts +10 -0
- package/src/layout/topbar-layout/meta.ts +10 -0
- package/src/metadata/allowedChildren.ts +27 -0
- package/src/metadata/componentMeta.test.ts +204 -0
- package/src/metadata/componentMeta.ts +147 -0
- package/src/metadata/index.ts +13 -0
- package/src/metadata/types.ts +74 -0
- package/src/patterns/auth/meta.ts +39 -0
- package/src/patterns/collection-editor/meta.ts +10 -0
- package/src/patterns/confirm-dialog/meta.ts +10 -0
- package/src/patterns/disclosure-section/meta.ts +10 -0
- package/src/patterns/empty-state/meta.ts +34 -0
- package/src/patterns/filter-bar/meta.ts +10 -0
- package/src/patterns/image-preview/meta.ts +10 -0
- package/src/patterns/image-upload-field/meta.ts +10 -0
- package/src/patterns/inspector-field/meta.ts +10 -0
- package/src/patterns/list/meta.ts +30 -0
- package/src/patterns/notice/meta.ts +36 -0
- package/src/patterns/panel/meta.ts +46 -0
- package/src/patterns/responsive-panel/meta.ts +10 -0
- package/src/patterns/section-header/meta.ts +34 -0
- package/src/patterns/selection/SelectableItem.tsx +93 -0
- package/src/patterns/selection/SelectionProvider.tsx +102 -0
- package/src/patterns/selection/index.ts +10 -0
- package/src/patterns/selection/meta.ts +21 -0
- package/src/patterns/selection/resolveSelectionNextIds.test.ts +61 -0
- package/src/patterns/selection/resolveSelectionNextIds.ts +71 -0
- package/src/patterns/selection/types.ts +43 -0
- package/src/patterns/settings-row/meta.ts +40 -0
- package/src/patterns/switch-field/meta.ts +10 -0
- package/src/patterns/theme-composer/meta.ts +10 -0
- package/src/patterns/tile-grid/meta.ts +21 -0
- package/src/patterns/timeline/meta.ts +10 -0
- package/src/patterns/tree-view/meta.ts +21 -0
- package/src/patterns/zora-drawer-content/meta.ts +10 -0
- package/src/patterns/zora-tab-bar/meta.ts +10 -0
- package/src/showcaseCoverage.test.ts +3 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { ZoraComponentMeta } from '../../metadata';
|
|
2
|
+
|
|
3
|
+
export const textareaMeta = {
|
|
4
|
+
name: 'Textarea',
|
|
5
|
+
category: 'component',
|
|
6
|
+
directManifestNode: true,
|
|
7
|
+
allowedChildren: [],
|
|
8
|
+
blueprint: {
|
|
9
|
+
label: 'Textarea',
|
|
10
|
+
defaultProps: {
|
|
11
|
+
placeholder: 'Enter text…',
|
|
12
|
+
value: '',
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
props: {
|
|
16
|
+
placeholder: {
|
|
17
|
+
type: 'string',
|
|
18
|
+
category: 'Content',
|
|
19
|
+
label: 'Placeholder',
|
|
20
|
+
},
|
|
21
|
+
value: {
|
|
22
|
+
type: 'string',
|
|
23
|
+
category: 'Content',
|
|
24
|
+
label: 'Value',
|
|
25
|
+
default: '',
|
|
26
|
+
},
|
|
27
|
+
size: {
|
|
28
|
+
type: 'enum',
|
|
29
|
+
category: 'Style',
|
|
30
|
+
label: 'Size',
|
|
31
|
+
enum: ['s', 'm', 'l'],
|
|
32
|
+
},
|
|
33
|
+
disabled: {
|
|
34
|
+
type: 'boolean',
|
|
35
|
+
category: 'State',
|
|
36
|
+
label: 'Disabled',
|
|
37
|
+
default: false,
|
|
38
|
+
},
|
|
39
|
+
readOnly: {
|
|
40
|
+
type: 'boolean',
|
|
41
|
+
category: 'State',
|
|
42
|
+
label: 'Read-only',
|
|
43
|
+
default: false,
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
} as const satisfies ZoraComponentMeta;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ZoraComponentMeta } from '../../metadata';
|
|
2
|
+
|
|
3
|
+
export const toolbarMeta = {
|
|
4
|
+
name: 'Toolbar',
|
|
5
|
+
category: 'component',
|
|
6
|
+
directManifestNode: false,
|
|
7
|
+
allowedChildren: [],
|
|
8
|
+
note: 'Action bar component; not represented as a manifest node in v1.',
|
|
9
|
+
props: {},
|
|
10
|
+
} as const satisfies ZoraComponentMeta;
|
|
11
|
+
|
|
12
|
+
export const toolbarActionMeta = {
|
|
13
|
+
name: 'ToolbarAction',
|
|
14
|
+
category: 'component',
|
|
15
|
+
directManifestNode: false,
|
|
16
|
+
allowedChildren: [],
|
|
17
|
+
note: 'Action bar item; not represented as a manifest node in v1.',
|
|
18
|
+
props: {},
|
|
19
|
+
} as const satisfies ZoraComponentMeta;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { ZoraComponentMetaRegistry } from '../metadata';
|
|
2
|
+
import { CONTAINER_ALLOWED_CHILDREN } from '../metadata/allowedChildren';
|
|
3
|
+
|
|
4
|
+
export const foundationMetas = {
|
|
5
|
+
Box: {
|
|
6
|
+
name: 'Box',
|
|
7
|
+
category: 'foundation',
|
|
8
|
+
directManifestNode: true,
|
|
9
|
+
allowedChildren: [...CONTAINER_ALLOWED_CHILDREN],
|
|
10
|
+
blueprint: { label: 'Box' },
|
|
11
|
+
props: {},
|
|
12
|
+
},
|
|
13
|
+
Center: {
|
|
14
|
+
name: 'Center',
|
|
15
|
+
category: 'foundation',
|
|
16
|
+
directManifestNode: false,
|
|
17
|
+
allowedChildren: [],
|
|
18
|
+
note: 'Layout helper component; not represented as a manifest node in v1.',
|
|
19
|
+
props: {},
|
|
20
|
+
},
|
|
21
|
+
Container: {
|
|
22
|
+
name: 'Container',
|
|
23
|
+
category: 'foundation',
|
|
24
|
+
directManifestNode: true,
|
|
25
|
+
allowedChildren: [...CONTAINER_ALLOWED_CHILDREN],
|
|
26
|
+
blueprint: { label: 'Container' },
|
|
27
|
+
props: {},
|
|
28
|
+
},
|
|
29
|
+
Divider: {
|
|
30
|
+
name: 'Divider',
|
|
31
|
+
category: 'foundation',
|
|
32
|
+
directManifestNode: true,
|
|
33
|
+
allowedChildren: [],
|
|
34
|
+
blueprint: { label: 'Divider' },
|
|
35
|
+
props: {},
|
|
36
|
+
},
|
|
37
|
+
Grid: {
|
|
38
|
+
name: 'Grid',
|
|
39
|
+
category: 'foundation',
|
|
40
|
+
directManifestNode: true,
|
|
41
|
+
allowedChildren: [...CONTAINER_ALLOWED_CHILDREN],
|
|
42
|
+
blueprint: { label: 'Grid' },
|
|
43
|
+
props: {},
|
|
44
|
+
},
|
|
45
|
+
Inline: {
|
|
46
|
+
name: 'Inline',
|
|
47
|
+
category: 'foundation',
|
|
48
|
+
directManifestNode: false,
|
|
49
|
+
allowedChildren: [],
|
|
50
|
+
note: 'Layout helper component; not represented as a manifest node in v1.',
|
|
51
|
+
props: {},
|
|
52
|
+
},
|
|
53
|
+
Show: {
|
|
54
|
+
name: 'Show',
|
|
55
|
+
category: 'foundation',
|
|
56
|
+
directManifestNode: false,
|
|
57
|
+
allowedChildren: [],
|
|
58
|
+
note: 'Responsive utility component; not represented as a manifest node in v1.',
|
|
59
|
+
props: {},
|
|
60
|
+
},
|
|
61
|
+
Spacer: {
|
|
62
|
+
name: 'Spacer',
|
|
63
|
+
category: 'foundation',
|
|
64
|
+
directManifestNode: false,
|
|
65
|
+
allowedChildren: [],
|
|
66
|
+
note: 'Spacing utility component; not represented as a manifest node in v1.',
|
|
67
|
+
props: {},
|
|
68
|
+
},
|
|
69
|
+
Stack: {
|
|
70
|
+
name: 'Stack',
|
|
71
|
+
category: 'foundation',
|
|
72
|
+
directManifestNode: true,
|
|
73
|
+
allowedChildren: [...CONTAINER_ALLOWED_CHILDREN],
|
|
74
|
+
blueprint: { label: 'Stack' },
|
|
75
|
+
props: {},
|
|
76
|
+
},
|
|
77
|
+
Surface: {
|
|
78
|
+
name: 'Surface',
|
|
79
|
+
category: 'foundation',
|
|
80
|
+
directManifestNode: false,
|
|
81
|
+
allowedChildren: [],
|
|
82
|
+
note: 'Low-level surface wrapper; not represented as a manifest node in v1.',
|
|
83
|
+
props: {},
|
|
84
|
+
},
|
|
85
|
+
} as const satisfies ZoraComponentMetaRegistry;
|
package/src/index.ts
CHANGED
|
@@ -137,6 +137,19 @@ export type { SidebarLayoutProps } from './layout/sidebar-layout';
|
|
|
137
137
|
export { SidebarLayout } from './layout/sidebar-layout';
|
|
138
138
|
export type { TopbarLayoutProps } from './layout/topbar-layout';
|
|
139
139
|
export { TopbarLayout } from './layout/topbar-layout';
|
|
140
|
+
export type {
|
|
141
|
+
ZoraComponentBlueprint,
|
|
142
|
+
ZoraComponentCategory,
|
|
143
|
+
ZoraComponentI18nMeta,
|
|
144
|
+
ZoraComponentMeta,
|
|
145
|
+
ZoraComponentMetaRegistry,
|
|
146
|
+
ZoraComponentPropArrayItemSchema,
|
|
147
|
+
ZoraComponentPropSchema,
|
|
148
|
+
ZoraComponentPropType,
|
|
149
|
+
ZoraComponentPropValue,
|
|
150
|
+
ZoraComponentSlotMeta,
|
|
151
|
+
} from './metadata';
|
|
152
|
+
export { ZORA_COMPONENT_META } from './metadata';
|
|
140
153
|
export type {
|
|
141
154
|
AuthFormBaseProps,
|
|
142
155
|
AuthIdentifierKind,
|
|
@@ -200,6 +213,15 @@ export type {
|
|
|
200
213
|
export { ResponsivePanel } from './patterns/responsive-panel';
|
|
201
214
|
export type { SectionHeaderProps } from './patterns/section-header';
|
|
202
215
|
export { SectionHeader } from './patterns/section-header';
|
|
216
|
+
export type {
|
|
217
|
+
SelectableItemProps,
|
|
218
|
+
SelectableItemState,
|
|
219
|
+
SelectionMode,
|
|
220
|
+
SelectionProviderProps,
|
|
221
|
+
SelectionTrigger,
|
|
222
|
+
UseSelectionResult,
|
|
223
|
+
} from './patterns/selection';
|
|
224
|
+
export { SelectableItem, SelectionProvider, useSelection } from './patterns/selection';
|
|
203
225
|
export type { SettingsRowProps } from './patterns/settings-row';
|
|
204
226
|
export { SettingsRow } from './patterns/settings-row';
|
|
205
227
|
export type { SwitchFieldProps } from './patterns/switch-field';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ZoraComponentMeta } from '../../metadata';
|
|
2
|
+
|
|
3
|
+
export const appShellMeta = {
|
|
4
|
+
name: 'AppShell',
|
|
5
|
+
category: 'layout',
|
|
6
|
+
directManifestNode: false,
|
|
7
|
+
allowedChildren: [],
|
|
8
|
+
note: 'Application shell layout; not represented as a manifest node in v1.',
|
|
9
|
+
props: {},
|
|
10
|
+
} as const satisfies ZoraComponentMeta;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ZoraComponentMeta } from '../../metadata';
|
|
2
|
+
import { PAGE_SECTION_ALLOWED_CHILDREN } from '../../metadata/allowedChildren';
|
|
3
|
+
|
|
4
|
+
export const authLayoutMeta = {
|
|
5
|
+
name: 'AuthLayout',
|
|
6
|
+
category: 'layout',
|
|
7
|
+
directManifestNode: true,
|
|
8
|
+
allowedChildren: [...PAGE_SECTION_ALLOWED_CHILDREN],
|
|
9
|
+
blueprint: {
|
|
10
|
+
label: 'Auth layout',
|
|
11
|
+
defaultProps: {
|
|
12
|
+
title: 'Welcome',
|
|
13
|
+
description: 'Sign in to continue.',
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
props: {
|
|
17
|
+
title: {
|
|
18
|
+
type: 'string',
|
|
19
|
+
category: 'Content',
|
|
20
|
+
label: 'Title',
|
|
21
|
+
default: 'Welcome',
|
|
22
|
+
},
|
|
23
|
+
description: {
|
|
24
|
+
type: 'string',
|
|
25
|
+
category: 'Content',
|
|
26
|
+
label: 'Description',
|
|
27
|
+
default: 'Sign in to continue.',
|
|
28
|
+
},
|
|
29
|
+
eyebrow: {
|
|
30
|
+
type: 'string',
|
|
31
|
+
category: 'Content',
|
|
32
|
+
label: 'Eyebrow',
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
} as const satisfies ZoraComponentMeta;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ZoraComponentMeta } from '../../metadata';
|
|
2
|
+
import { PAGE_ALLOWED_CHILDREN } from '../../metadata/allowedChildren';
|
|
3
|
+
|
|
4
|
+
export const pageMeta = {
|
|
5
|
+
name: 'Page',
|
|
6
|
+
category: 'layout',
|
|
7
|
+
directManifestNode: true,
|
|
8
|
+
allowedChildren: [...PAGE_ALLOWED_CHILDREN],
|
|
9
|
+
blueprint: {
|
|
10
|
+
label: 'Page',
|
|
11
|
+
},
|
|
12
|
+
props: {
|
|
13
|
+
width: {
|
|
14
|
+
type: 'enum',
|
|
15
|
+
category: 'Layout',
|
|
16
|
+
label: 'Width',
|
|
17
|
+
enum: ['narrow', 'default', 'wide'],
|
|
18
|
+
default: 'default',
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
} as const satisfies ZoraComponentMeta;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { ZoraComponentMeta } from '../../metadata';
|
|
2
|
+
|
|
3
|
+
export const pageHeaderMeta = {
|
|
4
|
+
name: 'PageHeader',
|
|
5
|
+
category: 'layout',
|
|
6
|
+
directManifestNode: true,
|
|
7
|
+
allowedChildren: [],
|
|
8
|
+
blueprint: {
|
|
9
|
+
label: 'Page header',
|
|
10
|
+
defaultProps: {
|
|
11
|
+
title: 'Page title',
|
|
12
|
+
description: 'Short description.',
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
props: {
|
|
16
|
+
title: {
|
|
17
|
+
type: 'string',
|
|
18
|
+
category: 'Content',
|
|
19
|
+
label: 'Title',
|
|
20
|
+
default: 'Page title',
|
|
21
|
+
},
|
|
22
|
+
description: {
|
|
23
|
+
type: 'string',
|
|
24
|
+
category: 'Content',
|
|
25
|
+
label: 'Description',
|
|
26
|
+
default: 'Short description.',
|
|
27
|
+
},
|
|
28
|
+
eyebrow: {
|
|
29
|
+
type: 'string',
|
|
30
|
+
category: 'Content',
|
|
31
|
+
label: 'Eyebrow',
|
|
32
|
+
},
|
|
33
|
+
meta: {
|
|
34
|
+
type: 'string',
|
|
35
|
+
category: 'Content',
|
|
36
|
+
label: 'Meta',
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
} as const satisfies ZoraComponentMeta;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ZoraComponentMeta } from '../../metadata';
|
|
2
|
+
import { PAGE_SECTION_ALLOWED_CHILDREN } from '../../metadata/allowedChildren';
|
|
3
|
+
|
|
4
|
+
export const pageSectionMeta = {
|
|
5
|
+
name: 'PageSection',
|
|
6
|
+
category: 'layout',
|
|
7
|
+
directManifestNode: true,
|
|
8
|
+
allowedChildren: [...PAGE_SECTION_ALLOWED_CHILDREN],
|
|
9
|
+
blueprint: {
|
|
10
|
+
label: 'Page section',
|
|
11
|
+
defaultProps: {
|
|
12
|
+
title: 'Section',
|
|
13
|
+
description: 'Section description.',
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
props: {
|
|
17
|
+
title: {
|
|
18
|
+
type: 'string',
|
|
19
|
+
category: 'Content',
|
|
20
|
+
label: 'Title',
|
|
21
|
+
default: 'Section',
|
|
22
|
+
},
|
|
23
|
+
description: {
|
|
24
|
+
type: 'string',
|
|
25
|
+
category: 'Content',
|
|
26
|
+
label: 'Description',
|
|
27
|
+
default: 'Section description.',
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
} as const satisfies ZoraComponentMeta;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ZoraComponentMeta } from '../../metadata';
|
|
2
|
+
|
|
3
|
+
export const settingsLayoutMeta = {
|
|
4
|
+
name: 'SettingsLayout',
|
|
5
|
+
category: 'layout',
|
|
6
|
+
directManifestNode: false,
|
|
7
|
+
allowedChildren: [],
|
|
8
|
+
note: 'Application layout; not represented as a manifest node in v1.',
|
|
9
|
+
props: {},
|
|
10
|
+
} as const satisfies ZoraComponentMeta;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ZoraComponentMeta } from '../../metadata';
|
|
2
|
+
|
|
3
|
+
export const sidebarLayoutMeta = {
|
|
4
|
+
name: 'SidebarLayout',
|
|
5
|
+
category: 'layout',
|
|
6
|
+
directManifestNode: false,
|
|
7
|
+
allowedChildren: [],
|
|
8
|
+
note: 'Application layout; not represented as a manifest node in v1.',
|
|
9
|
+
props: {},
|
|
10
|
+
} as const satisfies ZoraComponentMeta;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ZoraComponentMeta } from '../../metadata';
|
|
2
|
+
|
|
3
|
+
export const topbarLayoutMeta = {
|
|
4
|
+
name: 'TopbarLayout',
|
|
5
|
+
category: 'layout',
|
|
6
|
+
directManifestNode: false,
|
|
7
|
+
allowedChildren: [],
|
|
8
|
+
note: 'Application layout; not represented as a manifest node in v1.',
|
|
9
|
+
props: {},
|
|
10
|
+
} as const satisfies ZoraComponentMeta;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export const CONTAINER_ALLOWED_CHILDREN = [
|
|
2
|
+
'Box',
|
|
3
|
+
'Stack',
|
|
4
|
+
'Grid',
|
|
5
|
+
'Container',
|
|
6
|
+
'Divider',
|
|
7
|
+
'Text',
|
|
8
|
+
'Heading',
|
|
9
|
+
'Button',
|
|
10
|
+
'Input',
|
|
11
|
+
'Textarea',
|
|
12
|
+
'FormField',
|
|
13
|
+
'Card',
|
|
14
|
+
'Panel',
|
|
15
|
+
'Notice',
|
|
16
|
+
'EmptyState',
|
|
17
|
+
'SectionHeader',
|
|
18
|
+
'SettingsRow',
|
|
19
|
+
] as const;
|
|
20
|
+
|
|
21
|
+
export const PAGE_SECTION_ALLOWED_CHILDREN = [...CONTAINER_ALLOWED_CHILDREN] as const;
|
|
22
|
+
|
|
23
|
+
export const PAGE_ALLOWED_CHILDREN = [
|
|
24
|
+
'PageHeader',
|
|
25
|
+
'PageSection',
|
|
26
|
+
...CONTAINER_ALLOWED_CHILDREN,
|
|
27
|
+
] as const;
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
|
|
4
|
+
import { describe, expect, test } from 'bun:test';
|
|
5
|
+
|
|
6
|
+
import { ZORA_COMPONENT_META } from './componentMeta';
|
|
7
|
+
|
|
8
|
+
const ROOT = process.cwd();
|
|
9
|
+
const SRC_ROOT = join(ROOT, 'src');
|
|
10
|
+
|
|
11
|
+
const INDEX_PATH = join(SRC_ROOT, 'index.ts');
|
|
12
|
+
const THEME_INDEX_PATH = join(SRC_ROOT, 'theme', 'index.ts');
|
|
13
|
+
|
|
14
|
+
function parseReexportBlocks(source: string): { names: string[]; from: string; isType: boolean }[] {
|
|
15
|
+
const pattern = /\bexport\s+(type\s+)?\{([\s\S]*?)\}\s*from\s*['"]([^'"]+)['"]/g;
|
|
16
|
+
const blocks: { names: string[]; from: string; isType: boolean }[] = [];
|
|
17
|
+
|
|
18
|
+
for (const match of source.matchAll(pattern)) {
|
|
19
|
+
const isType = match[1] !== undefined;
|
|
20
|
+
const rawNames = match[2] ?? '';
|
|
21
|
+
const from = match[3] ?? '';
|
|
22
|
+
|
|
23
|
+
const names = rawNames
|
|
24
|
+
.split(',')
|
|
25
|
+
.map((item) => item.trim())
|
|
26
|
+
.filter(Boolean)
|
|
27
|
+
.map((item) =>
|
|
28
|
+
item
|
|
29
|
+
.replace(/^type\s+/, '')
|
|
30
|
+
.split(/\s+as\s+/)[0]
|
|
31
|
+
?.trim(),
|
|
32
|
+
)
|
|
33
|
+
.filter((item): item is string => Boolean(item));
|
|
34
|
+
|
|
35
|
+
blocks.push({ names, from, isType });
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return blocks;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function readSource(filePath: string): string {
|
|
42
|
+
return readFileSync(filePath, 'utf8');
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function isComponentExportName(name: string): boolean {
|
|
46
|
+
return /^[A-Z][A-Za-z0-9]*$/.test(name);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function isJsonSerializable(value: unknown): boolean {
|
|
50
|
+
if (value === null) return true;
|
|
51
|
+
if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean')
|
|
52
|
+
return true;
|
|
53
|
+
if (Array.isArray(value)) return value.every((item) => isJsonSerializable(item));
|
|
54
|
+
if (typeof value !== 'object') return false;
|
|
55
|
+
|
|
56
|
+
const record = value as Record<string, unknown>;
|
|
57
|
+
return Object.values(record).every((item) => isJsonSerializable(item));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
describe('ZORA_COMPONENT_META public API', () => {
|
|
61
|
+
test('src/index.ts re-exports ZORA_COMPONENT_META', () => {
|
|
62
|
+
const indexSource = readSource(INDEX_PATH);
|
|
63
|
+
expect(indexSource).toContain('ZORA_COMPONENT_META');
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
describe('ZORA_COMPONENT_META registry coverage', () => {
|
|
68
|
+
test('covers every public UI React component export (foundation/components/patterns/layout)', () => {
|
|
69
|
+
// Avoid importing the full src/index.ts barrel here; Bun has been observed to crash when executing
|
|
70
|
+
// module graphs that touch react-native. We do drift checks via static source parsing instead.
|
|
71
|
+
const indexSource = readSource(INDEX_PATH);
|
|
72
|
+
const blocks = parseReexportBlocks(indexSource).filter((block) => !block.isType);
|
|
73
|
+
|
|
74
|
+
const uiComponentNames = new Set(
|
|
75
|
+
blocks
|
|
76
|
+
.filter((block) => {
|
|
77
|
+
return (
|
|
78
|
+
block.from.startsWith('./foundation') ||
|
|
79
|
+
block.from.startsWith('./components') ||
|
|
80
|
+
block.from.startsWith('./patterns') ||
|
|
81
|
+
block.from.startsWith('./layout')
|
|
82
|
+
);
|
|
83
|
+
})
|
|
84
|
+
.flatMap((block) => block.names)
|
|
85
|
+
.filter(isComponentExportName),
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
const registryKeys = new Set(Object.keys(ZORA_COMPONENT_META));
|
|
89
|
+
expect([...uiComponentNames].sort()).toEqual([...registryKeys].sort());
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
test('does not treat providers/scopes as UI component registry entries', () => {
|
|
93
|
+
const indexSource = readSource(INDEX_PATH);
|
|
94
|
+
expect(indexSource).toContain("export * from './theme';");
|
|
95
|
+
|
|
96
|
+
const themeSource = readSource(THEME_INDEX_PATH);
|
|
97
|
+
const themeBlocks = parseReexportBlocks(themeSource).filter((block) => !block.isType);
|
|
98
|
+
const themeValueExports = new Set(
|
|
99
|
+
themeBlocks.flatMap((block) => block.names).filter(isComponentExportName),
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
const providerExports = new Set(['ZoraProvider', 'ZoraThemeScope']);
|
|
103
|
+
|
|
104
|
+
for (const providerExport of providerExports) {
|
|
105
|
+
expect(themeValueExports.has(providerExport)).toBe(true);
|
|
106
|
+
expect(Object.prototype.hasOwnProperty.call(ZORA_COMPONENT_META, providerExport)).toBe(false);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
describe('ZORA_COMPONENT_META invariants', () => {
|
|
112
|
+
test('every key matches meta.name', () => {
|
|
113
|
+
for (const [key, meta] of Object.entries(ZORA_COMPONENT_META)) {
|
|
114
|
+
expect(meta.name).toBe(key);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test('allowedChildren always points to a known direct manifest node', () => {
|
|
119
|
+
for (const [key, meta] of Object.entries(ZORA_COMPONENT_META)) {
|
|
120
|
+
for (const child of meta.allowedChildren) {
|
|
121
|
+
const childMeta = ZORA_COMPONENT_META[child];
|
|
122
|
+
expect(childMeta, `${key} allowedChildren includes unknown key '${child}'`).toBeDefined();
|
|
123
|
+
expect(
|
|
124
|
+
childMeta.directManifestNode,
|
|
125
|
+
`${key} allowedChildren includes non-directManifestNode key '${child}'`,
|
|
126
|
+
).toBe(true);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
test('direct manifest node leaf/container rules', () => {
|
|
132
|
+
const expectedLeafNodes = new Set([
|
|
133
|
+
'PageHeader',
|
|
134
|
+
'SectionHeader',
|
|
135
|
+
'SettingsRow',
|
|
136
|
+
'EmptyState',
|
|
137
|
+
'Button',
|
|
138
|
+
'Input',
|
|
139
|
+
'Textarea',
|
|
140
|
+
'Text',
|
|
141
|
+
'Heading',
|
|
142
|
+
'Divider',
|
|
143
|
+
]);
|
|
144
|
+
|
|
145
|
+
const expectedContainerNodes = new Set([
|
|
146
|
+
'FormField',
|
|
147
|
+
'Page',
|
|
148
|
+
'PageSection',
|
|
149
|
+
'AuthLayout',
|
|
150
|
+
'Card',
|
|
151
|
+
'Panel',
|
|
152
|
+
'Notice',
|
|
153
|
+
'Box',
|
|
154
|
+
'Stack',
|
|
155
|
+
'Grid',
|
|
156
|
+
'Container',
|
|
157
|
+
]);
|
|
158
|
+
|
|
159
|
+
for (const [key, meta] of Object.entries(ZORA_COMPONENT_META)) {
|
|
160
|
+
if (!meta.directManifestNode) continue;
|
|
161
|
+
|
|
162
|
+
if (expectedLeafNodes.has(key)) {
|
|
163
|
+
expect(meta.allowedChildren.length, `${key} should be a leaf manifest node`).toBe(0);
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (expectedContainerNodes.has(key)) {
|
|
168
|
+
expect(
|
|
169
|
+
meta.allowedChildren.length,
|
|
170
|
+
`${key} should be a container manifest node`,
|
|
171
|
+
).toBeGreaterThan(0);
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
throw new Error(
|
|
176
|
+
`Direct manifest node '${key}' must be categorized as leaf or container in the test.`,
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
test('non-direct manifest nodes include an explicit note', () => {
|
|
182
|
+
for (const [key, meta] of Object.entries(ZORA_COMPONENT_META)) {
|
|
183
|
+
if (meta.directManifestNode) continue;
|
|
184
|
+
|
|
185
|
+
expect(
|
|
186
|
+
typeof meta.note === 'string' && meta.note.trim().length > 0,
|
|
187
|
+
`${key} must include a note when directManifestNode is false`,
|
|
188
|
+
).toBe(true);
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
test('registry and blueprints are JSON serializable', () => {
|
|
193
|
+
expect(() => JSON.stringify(ZORA_COMPONENT_META)).not.toThrow();
|
|
194
|
+
|
|
195
|
+
for (const [key, meta] of Object.entries(ZORA_COMPONENT_META)) {
|
|
196
|
+
if (!meta.blueprint?.defaultProps) continue;
|
|
197
|
+
|
|
198
|
+
expect(
|
|
199
|
+
isJsonSerializable(meta.blueprint.defaultProps),
|
|
200
|
+
`${key} blueprint.defaultProps contains a non-serializable value`,
|
|
201
|
+
).toBe(true);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
});
|