@flowstack-ui/brick 0.1.4 → 0.1.6
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/README.md +14 -2
- package/dist/agents/accordion.json +80 -0
- package/dist/agents/accordion.md +48 -0
- package/dist/agents/app-bar.json +20 -3
- package/dist/agents/app-bar.md +7 -2
- package/dist/agents/appearance.json +84 -0
- package/dist/agents/appearance.md +48 -0
- package/dist/agents/badge.json +64 -0
- package/dist/agents/badge.md +41 -0
- package/dist/agents/card.json +5 -0
- package/dist/agents/card.md +1 -0
- package/dist/agents/carousel.json +131 -0
- package/dist/agents/carousel.md +64 -0
- package/dist/agents/collapsible.json +81 -0
- package/dist/agents/collapsible.md +49 -0
- package/dist/agents/container.json +10 -4
- package/dist/agents/container.md +4 -2
- package/dist/agents/divider.json +11 -5
- package/dist/agents/divider.md +5 -3
- package/dist/agents/drawer.json +34 -4
- package/dist/agents/drawer.md +10 -2
- package/dist/agents/frame.json +74 -0
- package/dist/agents/frame.md +47 -0
- package/dist/agents/grid.json +18 -0
- package/dist/agents/grid.md +4 -0
- package/dist/agents/icon.json +98 -0
- package/dist/agents/icon.md +51 -0
- package/dist/agents/image.json +18 -2
- package/dist/agents/image.md +5 -1
- package/dist/agents/interface-composition.json +153 -6
- package/dist/agents/interface-composition.md +42 -6
- package/dist/agents/layer-selection.json +13 -1
- package/dist/agents/layer-selection.md +4 -0
- package/dist/agents/list.json +80 -0
- package/dist/agents/list.md +48 -0
- package/dist/agents/manifest.json +61 -1
- package/dist/agents/nav-list.json +16 -5
- package/dist/agents/nav-list.md +6 -3
- package/dist/agents/navigation-menu.json +15 -1
- package/dist/agents/navigation-menu.md +4 -1
- package/dist/agents/scroll-area.json +8 -3
- package/dist/agents/scroll-area.md +4 -3
- package/dist/agents/section.json +65 -0
- package/dist/agents/section.md +42 -0
- package/dist/agents/stack.json +29 -5
- package/dist/agents/stack.md +14 -4
- package/dist/agents/surface.json +42 -4
- package/dist/agents/surface.md +13 -2
- package/dist/agents/tabs.json +17 -2
- package/dist/agents/tabs.md +8 -1
- package/dist/agents/text.json +19 -4
- package/dist/agents/text.md +6 -3
- package/dist/agents/z-stack.json +66 -0
- package/dist/agents/z-stack.md +41 -0
- package/dist/appearance.d.ts +2 -0
- package/dist/appearance.d.ts.map +1 -0
- package/dist/appearance.js +2 -0
- package/dist/appearance.js.map +1 -0
- package/dist/carousel.d.ts +3 -0
- package/dist/carousel.d.ts.map +1 -0
- package/dist/carousel.js +3 -0
- package/dist/carousel.js.map +1 -0
- package/dist/components/_responsive-value/ResponsiveValue.d.ts +9 -0
- package/dist/components/_responsive-value/ResponsiveValue.d.ts.map +1 -0
- package/dist/components/_responsive-value/ResponsiveValue.js +22 -0
- package/dist/components/_responsive-value/ResponsiveValue.js.map +1 -0
- package/dist/components/alert-dialog/AlertDialog.d.ts +7 -0
- package/dist/components/alert-dialog/AlertDialog.d.ts.map +1 -1
- package/dist/components/alert-dialog/AlertDialog.js +2 -2
- package/dist/components/alert-dialog/AlertDialog.js.map +1 -1
- package/dist/components/alert-dialog/index.d.ts +1 -1
- package/dist/components/alert-dialog/index.d.ts.map +1 -1
- package/dist/components/alert-dialog/index.js.map +1 -1
- package/dist/components/appearance/Appearance.d.ts +14 -0
- package/dist/components/appearance/Appearance.d.ts.map +1 -0
- package/dist/components/appearance/Appearance.js +39 -0
- package/dist/components/appearance/Appearance.js.map +1 -0
- package/dist/components/appearance/index.d.ts +2 -0
- package/dist/components/appearance/index.d.ts.map +1 -0
- package/dist/components/appearance/index.js +2 -0
- package/dist/components/appearance/index.js.map +1 -0
- package/dist/components/card/Card.d.ts +1 -0
- package/dist/components/card/Card.d.ts.map +1 -1
- package/dist/components/card/Card.js +2 -1
- package/dist/components/card/Card.js.map +1 -1
- package/dist/components/carousel/Carousel.d.ts +80 -0
- package/dist/components/carousel/Carousel.d.ts.map +1 -0
- package/dist/components/carousel/Carousel.js +90 -0
- package/dist/components/carousel/Carousel.js.map +1 -0
- package/dist/components/carousel/index.d.ts +2 -0
- package/dist/components/carousel/index.d.ts.map +1 -0
- package/dist/components/carousel/index.js +2 -0
- package/dist/components/carousel/index.js.map +1 -0
- package/dist/components/dialog/Dialog.d.ts +7 -0
- package/dist/components/dialog/Dialog.d.ts.map +1 -1
- package/dist/components/dialog/Dialog.js +2 -2
- package/dist/components/dialog/Dialog.js.map +1 -1
- package/dist/components/dialog/index.d.ts +1 -1
- package/dist/components/dialog/index.d.ts.map +1 -1
- package/dist/components/dialog/index.js.map +1 -1
- package/dist/components/divider/Divider.js +2 -2
- package/dist/components/divider/Divider.js.map +1 -1
- package/dist/components/drawer/Drawer.d.ts +8 -1
- package/dist/components/drawer/Drawer.d.ts.map +1 -1
- package/dist/components/drawer/Drawer.js +3 -2
- package/dist/components/drawer/Drawer.js.map +1 -1
- package/dist/components/drawer/index.d.ts +1 -1
- package/dist/components/drawer/index.d.ts.map +1 -1
- package/dist/components/drawer/index.js.map +1 -1
- package/dist/components/frame/Frame.d.ts +28 -0
- package/dist/components/frame/Frame.d.ts.map +1 -0
- package/dist/components/frame/Frame.js +84 -0
- package/dist/components/frame/Frame.js.map +1 -0
- package/dist/components/frame/index.d.ts +2 -0
- package/dist/components/frame/index.d.ts.map +1 -0
- package/dist/components/frame/index.js +2 -0
- package/dist/components/frame/index.js.map +1 -0
- package/dist/components/grid/Grid.d.ts +28 -11
- package/dist/components/grid/Grid.d.ts.map +1 -1
- package/dist/components/grid/Grid.js +77 -14
- package/dist/components/grid/Grid.js.map +1 -1
- package/dist/components/grid/index.d.ts +1 -1
- package/dist/components/grid/index.d.ts.map +1 -1
- package/dist/components/grid/index.js.map +1 -1
- package/dist/components/image/Image.d.ts +4 -0
- package/dist/components/image/Image.d.ts.map +1 -1
- package/dist/components/image/Image.js +4 -4
- package/dist/components/image/Image.js.map +1 -1
- package/dist/components/image/index.d.ts +1 -1
- package/dist/components/image/index.d.ts.map +1 -1
- package/dist/components/image/index.js +1 -1
- package/dist/components/image/index.js.map +1 -1
- package/dist/components/navigation-menu/NavigationMenu.d.ts +6 -3
- package/dist/components/navigation-menu/NavigationMenu.d.ts.map +1 -1
- package/dist/components/navigation-menu/NavigationMenu.js +2 -2
- package/dist/components/navigation-menu/NavigationMenu.js.map +1 -1
- package/dist/components/navigation-menu/index.d.ts +1 -1
- package/dist/components/navigation-menu/index.d.ts.map +1 -1
- package/dist/components/navigation-menu/index.js.map +1 -1
- package/dist/components/section/Section.d.ts +18 -0
- package/dist/components/section/Section.d.ts.map +1 -0
- package/dist/components/section/Section.js +29 -0
- package/dist/components/section/Section.js.map +1 -0
- package/dist/components/section/index.d.ts +2 -0
- package/dist/components/section/index.d.ts.map +1 -0
- package/dist/components/section/index.js +2 -0
- package/dist/components/section/index.js.map +1 -0
- package/dist/components/stack/Stack.d.ts +33 -8
- package/dist/components/stack/Stack.d.ts.map +1 -1
- package/dist/components/stack/Stack.js +71 -14
- package/dist/components/stack/Stack.js.map +1 -1
- package/dist/components/stack/index.d.ts +1 -1
- package/dist/components/stack/index.d.ts.map +1 -1
- package/dist/components/stack/index.js.map +1 -1
- package/dist/components/surface/Surface.d.ts +41 -3
- package/dist/components/surface/Surface.d.ts.map +1 -1
- package/dist/components/surface/Surface.js +79 -6
- package/dist/components/surface/Surface.js.map +1 -1
- package/dist/components/surface/index.d.ts +1 -1
- package/dist/components/surface/index.d.ts.map +1 -1
- package/dist/components/surface/index.js +1 -1
- package/dist/components/surface/index.js.map +1 -1
- package/dist/components/tabs/Tabs.d.ts +27 -6
- package/dist/components/tabs/Tabs.d.ts.map +1 -1
- package/dist/components/tabs/Tabs.js +10 -6
- package/dist/components/tabs/Tabs.js.map +1 -1
- package/dist/components/tabs/index.d.ts +1 -1
- package/dist/components/tabs/index.d.ts.map +1 -1
- package/dist/components/tabs/index.js.map +1 -1
- package/dist/components/text/Text.d.ts +1 -1
- package/dist/components/text/Text.d.ts.map +1 -1
- package/dist/components/text/Text.js.map +1 -1
- package/dist/components/z-stack/ZStack.d.ts +43 -0
- package/dist/components/z-stack/ZStack.d.ts.map +1 -0
- package/dist/components/z-stack/ZStack.js +70 -0
- package/dist/components/z-stack/ZStack.js.map +1 -0
- package/dist/components/z-stack/index.d.ts +2 -0
- package/dist/components/z-stack/index.d.ts.map +1 -0
- package/dist/components/z-stack/index.js +2 -0
- package/dist/components/z-stack/index.js.map +1 -0
- package/dist/drawer.d.ts +1 -0
- package/dist/drawer.d.ts.map +1 -1
- package/dist/drawer.js +1 -0
- package/dist/drawer.js.map +1 -1
- package/dist/frame.d.ts +2 -0
- package/dist/frame.d.ts.map +1 -0
- package/dist/frame.js +2 -0
- package/dist/frame.js.map +1 -0
- package/dist/grid.d.ts +1 -1
- package/dist/grid.d.ts.map +1 -1
- package/dist/grid.js.map +1 -1
- package/dist/image.d.ts +1 -1
- package/dist/image.d.ts.map +1 -1
- package/dist/image.js +1 -1
- package/dist/image.js.map +1 -1
- package/dist/index.d.ts +12 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -3
- package/dist/index.js.map +1 -1
- package/dist/section.d.ts +2 -0
- package/dist/section.d.ts.map +1 -0
- package/dist/section.js +2 -0
- package/dist/section.js.map +1 -0
- package/dist/stack.d.ts +1 -1
- package/dist/stack.d.ts.map +1 -1
- package/dist/stack.js.map +1 -1
- package/dist/styles/accordion.css +1 -1
- package/dist/styles/accordion.css.map +1 -1
- package/dist/styles/alert-dialog.css +1 -1
- package/dist/styles/alert-dialog.css.map +1 -1
- package/dist/styles/app-bar.css +1 -1
- package/dist/styles/app-bar.css.map +1 -1
- package/dist/styles/appearance.css +2 -0
- package/dist/styles/appearance.css.map +1 -0
- package/dist/styles/aspect-ratio.css +1 -1
- package/dist/styles/aspect-ratio.css.map +1 -1
- package/dist/styles/avatar.css +1 -1
- package/dist/styles/avatar.css.map +1 -1
- package/dist/styles/badge.css +1 -1
- package/dist/styles/badge.css.map +1 -1
- package/dist/styles/bottom-navigation.css +1 -1
- package/dist/styles/bottom-navigation.css.map +1 -1
- package/dist/styles/breadcrumb.css +1 -1
- package/dist/styles/breadcrumb.css.map +1 -1
- package/dist/styles/button.css +1 -1
- package/dist/styles/button.css.map +1 -1
- package/dist/styles/card.css +1 -1
- package/dist/styles/card.css.map +1 -1
- package/dist/styles/carousel.css +2 -0
- package/dist/styles/carousel.css.map +1 -0
- package/dist/styles/checkbox-group.css +1 -1
- package/dist/styles/checkbox-group.css.map +1 -1
- package/dist/styles/checkbox.css +1 -1
- package/dist/styles/checkbox.css.map +1 -1
- package/dist/styles/chip.css +1 -1
- package/dist/styles/chip.css.map +1 -1
- package/dist/styles/code-block.css +1 -1
- package/dist/styles/code-block.css.map +1 -1
- package/dist/styles/code.css +1 -1
- package/dist/styles/code.css.map +1 -1
- package/dist/styles/collapsible.css +1 -1
- package/dist/styles/collapsible.css.map +1 -1
- package/dist/styles/combobox.css +1 -1
- package/dist/styles/combobox.css.map +1 -1
- package/dist/styles/container.css +1 -1
- package/dist/styles/container.css.map +1 -1
- package/dist/styles/context-menu.css +1 -1
- package/dist/styles/context-menu.css.map +1 -1
- package/dist/styles/core.css +1 -1
- package/dist/styles/core.css.map +1 -1
- package/dist/styles/data-grid.css +1 -1
- package/dist/styles/data-grid.css.map +1 -1
- package/dist/styles/dialog.css +1 -1
- package/dist/styles/dialog.css.map +1 -1
- package/dist/styles/divider.css +1 -1
- package/dist/styles/divider.css.map +1 -1
- package/dist/styles/drawer.css +1 -1
- package/dist/styles/drawer.css.map +1 -1
- package/dist/styles/dropdown-menu.css +1 -1
- package/dist/styles/dropdown-menu.css.map +1 -1
- package/dist/styles/feed.css +1 -1
- package/dist/styles/feed.css.map +1 -1
- package/dist/styles/field.css +1 -1
- package/dist/styles/field.css.map +1 -1
- package/dist/styles/fieldset.css +1 -1
- package/dist/styles/fieldset.css.map +1 -1
- package/dist/styles/file-upload.css +1 -1
- package/dist/styles/file-upload.css.map +1 -1
- package/dist/styles/form.css +1 -1
- package/dist/styles/form.css.map +1 -1
- package/dist/styles/frame.css +2 -0
- package/dist/styles/frame.css.map +1 -0
- package/dist/styles/grid.css +1 -1
- package/dist/styles/grid.css.map +1 -1
- package/dist/styles/hide.css +1 -1
- package/dist/styles/hide.css.map +1 -1
- package/dist/styles/hover-card.css +1 -1
- package/dist/styles/hover-card.css.map +1 -1
- package/dist/styles/icon-button.css +1 -1
- package/dist/styles/icon-button.css.map +1 -1
- package/dist/styles/icon.css +1 -1
- package/dist/styles/icon.css.map +1 -1
- package/dist/styles/image.css +1 -1
- package/dist/styles/image.css.map +1 -1
- package/dist/styles/input.css +1 -1
- package/dist/styles/input.css.map +1 -1
- package/dist/styles/link.css +1 -1
- package/dist/styles/link.css.map +1 -1
- package/dist/styles/list.css +1 -1
- package/dist/styles/list.css.map +1 -1
- package/dist/styles/menubar.css +1 -1
- package/dist/styles/menubar.css.map +1 -1
- package/dist/styles/multi-select.css +1 -1
- package/dist/styles/multi-select.css.map +1 -1
- package/dist/styles/nav-list.css +1 -1
- package/dist/styles/nav-list.css.map +1 -1
- package/dist/styles/navigation-menu.css +1 -1
- package/dist/styles/navigation-menu.css.map +1 -1
- package/dist/styles/number-input.css +1 -1
- package/dist/styles/number-input.css.map +1 -1
- package/dist/styles/otp-field.css +1 -1
- package/dist/styles/otp-field.css.map +1 -1
- package/dist/styles/pagination.css +1 -1
- package/dist/styles/pagination.css.map +1 -1
- package/dist/styles/password-toggle-field.css +1 -1
- package/dist/styles/password-toggle-field.css.map +1 -1
- package/dist/styles/popover.css +1 -1
- package/dist/styles/popover.css.map +1 -1
- package/dist/styles/progress-circle.css +1 -1
- package/dist/styles/progress-circle.css.map +1 -1
- package/dist/styles/progress.css +1 -1
- package/dist/styles/progress.css.map +1 -1
- package/dist/styles/radio-group.css +1 -1
- package/dist/styles/radio-group.css.map +1 -1
- package/dist/styles/rating.css +1 -1
- package/dist/styles/rating.css.map +1 -1
- package/dist/styles/scroll-area.css +1 -1
- package/dist/styles/scroll-area.css.map +1 -1
- package/dist/styles/section.css +2 -0
- package/dist/styles/section.css.map +1 -0
- package/dist/styles/select.css +1 -1
- package/dist/styles/select.css.map +1 -1
- package/dist/styles/show.css +1 -1
- package/dist/styles/show.css.map +1 -1
- package/dist/styles/sidebar.css +1 -1
- package/dist/styles/sidebar.css.map +1 -1
- package/dist/styles/skeleton.css +1 -1
- package/dist/styles/skeleton.css.map +1 -1
- package/dist/styles/skip-link.css +1 -1
- package/dist/styles/skip-link.css.map +1 -1
- package/dist/styles/slider.css +1 -1
- package/dist/styles/slider.css.map +1 -1
- package/dist/styles/stack.css +1 -1
- package/dist/styles/stack.css.map +1 -1
- package/dist/styles/surface.css +1 -1
- package/dist/styles/surface.css.map +1 -1
- package/dist/styles/swipeable-item.css +1 -1
- package/dist/styles/swipeable-item.css.map +1 -1
- package/dist/styles/switch.css +1 -1
- package/dist/styles/switch.css.map +1 -1
- package/dist/styles/table.css +1 -1
- package/dist/styles/table.css.map +1 -1
- package/dist/styles/tabs.css +1 -1
- package/dist/styles/tabs.css.map +1 -1
- package/dist/styles/text.css +1 -1
- package/dist/styles/text.css.map +1 -1
- package/dist/styles/textarea.css +1 -1
- package/dist/styles/textarea.css.map +1 -1
- package/dist/styles/toast.css +1 -1
- package/dist/styles/toast.css.map +1 -1
- package/dist/styles/toggle-group.css +1 -1
- package/dist/styles/toggle-group.css.map +1 -1
- package/dist/styles/toggle.css +1 -1
- package/dist/styles/toggle.css.map +1 -1
- package/dist/styles/toolbar.css +1 -1
- package/dist/styles/toolbar.css.map +1 -1
- package/dist/styles/tooltip.css +1 -1
- package/dist/styles/tooltip.css.map +1 -1
- package/dist/styles/tree-grid.css +1 -1
- package/dist/styles/tree-grid.css.map +1 -1
- package/dist/styles/tree.css +1 -1
- package/dist/styles/tree.css.map +1 -1
- package/dist/styles/visually-hidden.css +1 -1
- package/dist/styles/visually-hidden.css.map +1 -1
- package/dist/styles/z-stack.css +2 -0
- package/dist/styles/z-stack.css.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/styles.css.map +1 -1
- package/dist/surface.d.ts +1 -1
- package/dist/surface.d.ts.map +1 -1
- package/dist/surface.js +1 -1
- package/dist/surface.js.map +1 -1
- package/dist/tokens.css +1 -1
- package/dist/tokens.css.map +1 -1
- package/dist/z-stack.d.ts +2 -0
- package/dist/z-stack.d.ts.map +1 -0
- package/dist/z-stack.js +2 -0
- package/dist/z-stack.js.map +1 -0
- package/docs/guides/appearance-and-tokens.md +91 -1
- package/package.json +22 -2
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Frame agent guide
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
Own responsive logical size constraints for one local element without taking over layout, paint, spacing, or overflow.
|
|
6
|
+
|
|
7
|
+
## Use when
|
|
8
|
+
|
|
9
|
+
- A rail, copy region, media canvas, or scroll boundary needs an explicit inline or block size constraint.
|
|
10
|
+
|
|
11
|
+
## Choose something else when
|
|
12
|
+
|
|
13
|
+
- The need is shared page measure, child arrangement, paint, aspect ratio, or scrolling. Use Container, Stack/Grid, Surface, AspectRatio, or ScrollArea.
|
|
14
|
+
|
|
15
|
+
## Required composition
|
|
16
|
+
|
|
17
|
+
- Use Frame inside a layout Item, or let Stack.Item/Grid.Item compose asChild around Frame when one host must own both parent participation and internal constraints.
|
|
18
|
+
- For bounded long content, put ScrollArea inside a maxBlockSize Frame; Frame constrains and ScrollArea scrolls.
|
|
19
|
+
|
|
20
|
+
## Rules
|
|
21
|
+
|
|
22
|
+
- **MUST:** Use Frame only for inlineSize, minInlineSize, maxInlineSize, blockSize, minBlockSize, or maxBlockSize.
|
|
23
|
+
- **MUST:** Prefer logical size constraints and responsive values rather than physical width/height application classes.
|
|
24
|
+
- **MUST:** Keep flex/grid participation on Stack.Item or Grid.Item; Frame owns the constrained element's internal geometry.
|
|
25
|
+
- **MUST:** Use nested Frames when separate ancestors need separate constraints; each Frame keeps its base and responsive values locally scoped.
|
|
26
|
+
- **MUST:** Do not treat maxBlockSize as scrolling; compose ScrollArea when overflow must remain reachable.
|
|
27
|
+
- **MUST:** Load styles.css or core.css plus frame.css.
|
|
28
|
+
|
|
29
|
+
## Common mistakes
|
|
30
|
+
|
|
31
|
+
- **Avoid:** Turning Frame into a universal Box with paint, spacing, position, overflow, and typography props. **Instead:** Keep Frame to six logical constraints and compose the existing Brick owner for every other responsibility.
|
|
32
|
+
|
|
33
|
+
## Validation checklist
|
|
34
|
+
|
|
35
|
+
- Check responsive carry-forward, zoom/reflow, long content, RTL, vertical writing, and focus visibility.
|
|
36
|
+
- Confirm every constrained node has one clear job and that ScrollArea owns any required overflow.
|
|
37
|
+
|
|
38
|
+
## Related guidance
|
|
39
|
+
|
|
40
|
+
- `stack`
|
|
41
|
+
- `grid`
|
|
42
|
+
- `container`
|
|
43
|
+
- `section`
|
|
44
|
+
- `surface`
|
|
45
|
+
- `aspect-ratio`
|
|
46
|
+
- `scroll-area`
|
|
47
|
+
- `interface-composition`
|
package/dist/agents/grid.json
CHANGED
|
@@ -24,6 +24,16 @@
|
|
|
24
24
|
"level": "must",
|
|
25
25
|
"statement": "Keep DOM order meaningful; visual placement must not create a confusing keyboard or reading sequence."
|
|
26
26
|
},
|
|
27
|
+
{
|
|
28
|
+
"id": "grid-responsive-relationships",
|
|
29
|
+
"level": "must",
|
|
30
|
+
"statement": "Use responsive columns, gaps, unanchored spans, and alignment when the same authored Grid changes at Brick breakpoints; keep explicit line starts and ends static."
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": "grid-item-as-child",
|
|
34
|
+
"level": "must",
|
|
35
|
+
"statement": "Use Grid.Item asChild when an existing link, Surface, or component should itself receive placement; provide exactly one element and preserve its native semantics."
|
|
36
|
+
},
|
|
27
37
|
{
|
|
28
38
|
"id": "grid-css",
|
|
29
39
|
"level": "must",
|
|
@@ -34,6 +44,14 @@
|
|
|
34
44
|
{
|
|
35
45
|
"mistake": "Keeping too many columns until cards become unreadably narrow.",
|
|
36
46
|
"correction": "Reduce columns at the content's real minimum width, not at a device-name breakpoint."
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"mistake": "Combining a responsive Item span with explicit line placement.",
|
|
50
|
+
"correction": "Let the responsive item auto-place, or keep one deliberate static line placement."
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"mistake": "Adding a Grid.Item wrapper and height CSS around an element that should itself stretch as the grid item.",
|
|
54
|
+
"correction": "Compose that one element with Grid.Item asChild."
|
|
37
55
|
}
|
|
38
56
|
],
|
|
39
57
|
"validation": [
|
package/dist/agents/grid.md
CHANGED
|
@@ -19,11 +19,15 @@ Arrange content on tokenized two-dimensional tracks with public column, row, gap
|
|
|
19
19
|
## Rules
|
|
20
20
|
|
|
21
21
|
- **MUST:** Keep DOM order meaningful; visual placement must not create a confusing keyboard or reading sequence.
|
|
22
|
+
- **MUST:** Use responsive columns, gaps, unanchored spans, and alignment when the same authored Grid changes at Brick breakpoints; keep explicit line starts and ends static.
|
|
23
|
+
- **MUST:** Use Grid.Item asChild when an existing link, Surface, or component should itself receive placement; provide exactly one element and preserve its native semantics.
|
|
22
24
|
- **MUST:** Load styles.css or core.css plus grid.css.
|
|
23
25
|
|
|
24
26
|
## Common mistakes
|
|
25
27
|
|
|
26
28
|
- **Avoid:** Keeping too many columns until cards become unreadably narrow. **Instead:** Reduce columns at the content's real minimum width, not at a device-name breakpoint.
|
|
29
|
+
- **Avoid:** Combining a responsive Item span with explicit line placement. **Instead:** Let the responsive item auto-place, or keep one deliberate static line placement.
|
|
30
|
+
- **Avoid:** Adding a Grid.Item wrapper and height CSS around an element that should itself stretch as the grid item. **Instead:** Compose that one element with Grid.Item asChild.
|
|
27
31
|
|
|
28
32
|
## Validation checklist
|
|
29
33
|
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "flowstack.agent-component.v1",
|
|
3
|
+
"id": "icon",
|
|
4
|
+
"name": "Icon",
|
|
5
|
+
"package": "@flowstack-ui/brick",
|
|
6
|
+
"layer": "brick",
|
|
7
|
+
"kind": "component",
|
|
8
|
+
"purpose": "Normalize one consumer-authored SVG with Brick sizing, semantic foreground, alignment, direction, and decorative-or-informative accessibility semantics.",
|
|
9
|
+
"useWhen": [
|
|
10
|
+
"An authored SVG needs Brick size, currentColor-based tone, alignment, or opt-in directional RTL mirroring."
|
|
11
|
+
],
|
|
12
|
+
"avoidWhen": [
|
|
13
|
+
{
|
|
14
|
+
"condition": "The graphic performs an action or needs its own touch target.",
|
|
15
|
+
"useInstead": "Button, IconButton, Toggle, or the owning interactive component"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"condition": "The content is a photo, raster asset, responsive media object, fallback, or loading state.",
|
|
19
|
+
"useInstead": "Image"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"condition": "The graphic is a logo, illustration, chart, or multiregion visual with independent semantics.",
|
|
23
|
+
"useInstead": "an application-owned SVG or media composition with explicit semantics"
|
|
24
|
+
}
|
|
25
|
+
],
|
|
26
|
+
"composition": [
|
|
27
|
+
"Pass exactly one consumer-authored SVG element; prefer the default span wrapper and use asChild only when the direct root must remain that SVG.",
|
|
28
|
+
"When visible nearby text already provides the meaning, keep Icon decorative; when a standalone icon conveys information, provide label or aria-labelledby.",
|
|
29
|
+
"Inside an icon-only control, label the control and leave its nested Icon decorative."
|
|
30
|
+
],
|
|
31
|
+
"rules": [
|
|
32
|
+
{
|
|
33
|
+
"id": "icon-not-control",
|
|
34
|
+
"level": "must",
|
|
35
|
+
"statement": "Use Icon only for visual content; never use it as an interactive host or touch target."
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"id": "icon-accessibility-mode",
|
|
39
|
+
"level": "must",
|
|
40
|
+
"statement": "Keep the decorative default when meaning is redundant, or provide exactly one nonempty label or aria-labelledby reference when the standalone graphic is informative."
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"id": "icon-control-name",
|
|
44
|
+
"level": "must",
|
|
45
|
+
"statement": "Give an icon-only Button, IconButton, Toggle, or other control its accessible name on the control, not on its nested Icon."
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"id": "icon-current-color",
|
|
49
|
+
"level": "should",
|
|
50
|
+
"statement": "Use currentColor for single-color SVG fills or strokes so Brick tone and inherited control state can apply."
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"id": "icon-directional",
|
|
54
|
+
"level": "must",
|
|
55
|
+
"statement": "Enable directional only for glyphs whose meaning reverses in RTL, such as arrows and forward/back controls."
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"id": "icon-as-child",
|
|
59
|
+
"level": "must",
|
|
60
|
+
"statement": "Use asChild only with one direct non-interactive SVG; never compose Icon onto a button, anchor, input, or other interactive host."
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"id": "icon-layout",
|
|
64
|
+
"level": "must",
|
|
65
|
+
"statement": "Use Brick Stack, layout components, or an owning component icon slot for sibling alignment instead of wrapper spans or application offsets."
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"id": "icon-css",
|
|
69
|
+
"level": "must",
|
|
70
|
+
"statement": "Load styles.css or core.css plus icon.css."
|
|
71
|
+
}
|
|
72
|
+
],
|
|
73
|
+
"commonMistakes": [
|
|
74
|
+
{
|
|
75
|
+
"mistake": "Using a raw SVG with ad hoc width, color, alignment, or ARIA inside ordinary Brick composition.",
|
|
76
|
+
"correction": "Wrap the authored SVG in Icon, choose the semantic size/tone recipe, and let the owning Stack or control align it."
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"mistake": "Giving both the control and its nested Icon the same accessible label.",
|
|
80
|
+
"correction": "Label the control and keep the nested Icon decorative to prevent duplicate announcements."
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"mistake": "Using directional on logos, status symbols, checks, clocks, or other glyphs that do not reverse meaning in RTL.",
|
|
84
|
+
"correction": "Leave directional false unless the glyph itself communicates direction."
|
|
85
|
+
}
|
|
86
|
+
],
|
|
87
|
+
"validation": [
|
|
88
|
+
"Check decorative and informative accessibility trees, icon-only control naming, all sizes and tones, currentColor adoption, flex shrinking, and RTL directional mirroring.",
|
|
89
|
+
"Confirm asChild targets only one SVG and that CSS is present."
|
|
90
|
+
],
|
|
91
|
+
"related": [
|
|
92
|
+
"icon-button",
|
|
93
|
+
"image",
|
|
94
|
+
"button",
|
|
95
|
+
"stack",
|
|
96
|
+
"text"
|
|
97
|
+
]
|
|
98
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Icon agent guide
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
Normalize one consumer-authored SVG with Brick sizing, semantic foreground, alignment, direction, and decorative-or-informative accessibility semantics.
|
|
6
|
+
|
|
7
|
+
## Use when
|
|
8
|
+
|
|
9
|
+
- An authored SVG needs Brick size, currentColor-based tone, alignment, or opt-in directional RTL mirroring.
|
|
10
|
+
|
|
11
|
+
## Choose something else when
|
|
12
|
+
|
|
13
|
+
- The graphic performs an action or needs its own touch target. Use Button, IconButton, Toggle, or the owning interactive component.
|
|
14
|
+
- The content is a photo, raster asset, responsive media object, fallback, or loading state. Use Image.
|
|
15
|
+
- The graphic is a logo, illustration, chart, or multiregion visual with independent semantics. Use an application-owned SVG or media composition with explicit semantics.
|
|
16
|
+
|
|
17
|
+
## Required composition
|
|
18
|
+
|
|
19
|
+
- Pass exactly one consumer-authored SVG element; prefer the default span wrapper and use asChild only when the direct root must remain that SVG.
|
|
20
|
+
- When visible nearby text already provides the meaning, keep Icon decorative; when a standalone icon conveys information, provide label or aria-labelledby.
|
|
21
|
+
- Inside an icon-only control, label the control and leave its nested Icon decorative.
|
|
22
|
+
|
|
23
|
+
## Rules
|
|
24
|
+
|
|
25
|
+
- **MUST:** Use Icon only for visual content; never use it as an interactive host or touch target.
|
|
26
|
+
- **MUST:** Keep the decorative default when meaning is redundant, or provide exactly one nonempty label or aria-labelledby reference when the standalone graphic is informative.
|
|
27
|
+
- **MUST:** Give an icon-only Button, IconButton, Toggle, or other control its accessible name on the control, not on its nested Icon.
|
|
28
|
+
- **SHOULD:** Use currentColor for single-color SVG fills or strokes so Brick tone and inherited control state can apply.
|
|
29
|
+
- **MUST:** Enable directional only for glyphs whose meaning reverses in RTL, such as arrows and forward/back controls.
|
|
30
|
+
- **MUST:** Use asChild only with one direct non-interactive SVG; never compose Icon onto a button, anchor, input, or other interactive host.
|
|
31
|
+
- **MUST:** Use Brick Stack, layout components, or an owning component icon slot for sibling alignment instead of wrapper spans or application offsets.
|
|
32
|
+
- **MUST:** Load styles.css or core.css plus icon.css.
|
|
33
|
+
|
|
34
|
+
## Common mistakes
|
|
35
|
+
|
|
36
|
+
- **Avoid:** Using a raw SVG with ad hoc width, color, alignment, or ARIA inside ordinary Brick composition. **Instead:** Wrap the authored SVG in Icon, choose the semantic size/tone recipe, and let the owning Stack or control align it.
|
|
37
|
+
- **Avoid:** Giving both the control and its nested Icon the same accessible label. **Instead:** Label the control and keep the nested Icon decorative to prevent duplicate announcements.
|
|
38
|
+
- **Avoid:** Using directional on logos, status symbols, checks, clocks, or other glyphs that do not reverse meaning in RTL. **Instead:** Leave directional false unless the glyph itself communicates direction.
|
|
39
|
+
|
|
40
|
+
## Validation checklist
|
|
41
|
+
|
|
42
|
+
- Check decorative and informative accessibility trees, icon-only control naming, all sizes and tones, currentColor adoption, flex shrinking, and RTL directional mirroring.
|
|
43
|
+
- Confirm asChild targets only one SVG and that CSS is present.
|
|
44
|
+
|
|
45
|
+
## Related guidance
|
|
46
|
+
|
|
47
|
+
- `icon-button`
|
|
48
|
+
- `image`
|
|
49
|
+
- `button`
|
|
50
|
+
- `stack`
|
|
51
|
+
- `text`
|
package/dist/agents/image.json
CHANGED
|
@@ -16,7 +16,8 @@
|
|
|
16
16
|
}
|
|
17
17
|
],
|
|
18
18
|
"composition": [
|
|
19
|
-
"Compose Image.Content and optional Image.Fallback inside Image.Root; use Brick Stack or layout components around it rather than wrapper spans for alignment."
|
|
19
|
+
"Compose Image.Content and optional Image.Fallback inside Image.Root; use Brick Stack or layout components around it rather than wrapper spans for alignment.",
|
|
20
|
+
"In a React Server Component, import ImageRoot, ImageContent, and ImageFallback directly; the compound Image namespace is intended for client module composition."
|
|
20
21
|
],
|
|
21
22
|
"rules": [
|
|
22
23
|
{
|
|
@@ -34,10 +35,25 @@
|
|
|
34
35
|
"level": "should",
|
|
35
36
|
"statement": "Reserve dimensions or aspect ratio to prevent layout shift."
|
|
36
37
|
},
|
|
38
|
+
{
|
|
39
|
+
"id": "image-parent-fill",
|
|
40
|
+
"level": "must",
|
|
41
|
+
"statement": "Use explicit fill when Image must consume a parent-established block size, such as Surface.Media; retain fit and position for the intended crop."
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"id": "image-parent-owner",
|
|
45
|
+
"level": "must",
|
|
46
|
+
"statement": "Name and preserve the parent sizing box when fill is used; Image propagates into available geometry but does not create that geometry."
|
|
47
|
+
},
|
|
37
48
|
{
|
|
38
49
|
"id": "image-css",
|
|
39
50
|
"level": "must",
|
|
40
51
|
"statement": "Load styles.css or core.css plus image.css."
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"id": "image-rsc-parts",
|
|
55
|
+
"level": "must",
|
|
56
|
+
"statement": "Use direct named Image parts across a React Server Component boundary instead of wrapping the complete consumer in use client."
|
|
41
57
|
}
|
|
42
58
|
],
|
|
43
59
|
"commonMistakes": [
|
|
@@ -47,7 +63,7 @@
|
|
|
47
63
|
}
|
|
48
64
|
],
|
|
49
65
|
"validation": [
|
|
50
|
-
"Check loaded, loading, error, cached, responsive size, crop, layout shift, alt text, contrast of fallback content, and RTL where relevant.",
|
|
66
|
+
"Check loaded, loading, error, cached, responsive size, parent-fill geometry, crop, layout shift, alt text, contrast of fallback content, and RTL where relevant.",
|
|
51
67
|
"Confirm CSS and any adapter report are complete."
|
|
52
68
|
],
|
|
53
69
|
"related": [
|
package/dist/agents/image.md
CHANGED
|
@@ -15,13 +15,17 @@ Provide styled resilient media with Atom loading/fallback behavior, sizing recip
|
|
|
15
15
|
## Required composition
|
|
16
16
|
|
|
17
17
|
- Compose Image.Content and optional Image.Fallback inside Image.Root; use Brick Stack or layout components around it rather than wrapper spans for alignment.
|
|
18
|
+
- In a React Server Component, import ImageRoot, ImageContent, and ImageFallback directly; the compound Image namespace is intended for client module composition.
|
|
18
19
|
|
|
19
20
|
## Rules
|
|
20
21
|
|
|
21
22
|
- **MUST:** Use Brick Image for ordinary interface media; document any native or framework image fallback and the missing capability.
|
|
22
23
|
- **MUST:** Provide meaningful alt text, or alt="" for a decorative image.
|
|
23
24
|
- **SHOULD:** Reserve dimensions or aspect ratio to prevent layout shift.
|
|
25
|
+
- **MUST:** Use explicit fill when Image must consume a parent-established block size, such as Surface.Media; retain fit and position for the intended crop.
|
|
26
|
+
- **MUST:** Name and preserve the parent sizing box when fill is used; Image propagates into available geometry but does not create that geometry.
|
|
24
27
|
- **MUST:** Load styles.css or core.css plus image.css.
|
|
28
|
+
- **MUST:** Use direct named Image parts across a React Server Component boundary instead of wrapping the complete consumer in use client.
|
|
25
29
|
|
|
26
30
|
## Common mistakes
|
|
27
31
|
|
|
@@ -29,7 +33,7 @@ Provide styled resilient media with Atom loading/fallback behavior, sizing recip
|
|
|
29
33
|
|
|
30
34
|
## Validation checklist
|
|
31
35
|
|
|
32
|
-
- Check loaded, loading, error, cached, responsive size, crop, layout shift, alt text, contrast of fallback content, and RTL where relevant.
|
|
36
|
+
- Check loaded, loading, error, cached, responsive size, parent-fill geometry, crop, layout shift, alt text, contrast of fallback content, and RTL where relevant.
|
|
33
37
|
- Confirm CSS and any adapter report are complete.
|
|
34
38
|
|
|
35
39
|
## Related guidance
|
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
"decisionOrder": [
|
|
10
10
|
"Map the page into landmarks, bounded regions, layout relationships, content, navigation, actions, media, and responsive changes.",
|
|
11
11
|
"Choose the Brick owner for each relationship and read every selected component guide before implementation.",
|
|
12
|
-
"Compose from the outside inward: AppBar or page landmark, Container, Grid or Stack, Surface or Card, then content and controls.",
|
|
12
|
+
"Compose from the outside inward: AppBar or page landmark, Section, Container, Grid or Stack, Surface or Card, then content and controls.",
|
|
13
|
+
"Decide how each child participates in its parent: content-sized, fixed, automatic, proportional, placed, stretched, or deliberately constrained.",
|
|
13
14
|
"Follow the customization order completely: component owner, supported props, semantic theme tokens, component tokens, public parts, and only then a narrow stable-hook escape hatch.",
|
|
14
15
|
"Audit responsive behavior, accessibility, CSS delivery, and native fallbacks before treating the composition as complete."
|
|
15
16
|
],
|
|
@@ -19,10 +20,35 @@
|
|
|
19
20
|
"use": "Container",
|
|
20
21
|
"note": "Do not reproduce max-width and inline padding on every section."
|
|
21
22
|
},
|
|
23
|
+
{
|
|
24
|
+
"intent": "major page-region rhythm",
|
|
25
|
+
"use": "Section",
|
|
26
|
+
"note": "Keep paint in Surface, width and gutters in Container, and local child relationships in Stack or Grid."
|
|
27
|
+
},
|
|
22
28
|
{
|
|
23
29
|
"intent": "row or column relationship",
|
|
24
|
-
"use": "HStack or
|
|
25
|
-
"note": "Use Stack when
|
|
30
|
+
"use": "HStack, VStack, or responsive Stack",
|
|
31
|
+
"note": "Use fixed-axis conveniences when the axis stays fixed and Stack when the same content changes axis at a Brick breakpoint."
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"intent": "child flex allocation",
|
|
35
|
+
"use": "Stack.Item",
|
|
36
|
+
"note": "Choose content-sized, fixed, automatic, or proportional growth before writing flex CSS."
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"intent": "child grid participation",
|
|
40
|
+
"use": "Grid.Item",
|
|
41
|
+
"note": "Use spans, placement, or self-alignment; keep a real wrapper when it establishes the participation box and use asChild only when the child should be that box."
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"intent": "local logical size constraint",
|
|
45
|
+
"use": "Frame",
|
|
46
|
+
"note": "Use only for inline/block size or min/max constraints; keep parent participation on the owning layout Item and overflow in ScrollArea."
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"intent": "overlapping depth relationship",
|
|
50
|
+
"use": "ZStack",
|
|
51
|
+
"note": "Prefer Surface media anatomy for ordinary media, scrim, and foreground compositions."
|
|
26
52
|
},
|
|
27
53
|
{
|
|
28
54
|
"intent": "track-based responsive layout",
|
|
@@ -34,11 +60,21 @@
|
|
|
34
60
|
"use": "Surface or Card",
|
|
35
61
|
"note": "Use Card for titled or actionable contained content and Surface for a general visual boundary."
|
|
36
62
|
},
|
|
63
|
+
{
|
|
64
|
+
"intent": "local light or dark semantic-token boundary",
|
|
65
|
+
"use": "Appearance",
|
|
66
|
+
"note": "Pass exactly one existing host; it may contain any number of descendants, and Appearance adds no paint, layout, or wrapper."
|
|
67
|
+
},
|
|
37
68
|
{
|
|
38
69
|
"intent": "brand or content image",
|
|
39
70
|
"use": "Image",
|
|
40
71
|
"note": "Keep alt text and fallback behavior intentional."
|
|
41
72
|
},
|
|
73
|
+
{
|
|
74
|
+
"intent": "one of several peer campaigns or authored content regions",
|
|
75
|
+
"use": "Carousel",
|
|
76
|
+
"note": "Keep invariant evidence outside; let each Slide own a complete Surface when its media and message belong together."
|
|
77
|
+
},
|
|
42
78
|
{
|
|
43
79
|
"intent": "site navigation",
|
|
44
80
|
"use": "NavigationMenu or NavList",
|
|
@@ -47,12 +83,22 @@
|
|
|
47
83
|
{
|
|
48
84
|
"intent": "responsive desktop and mobile alternatives",
|
|
49
85
|
"use": "Show and Hide",
|
|
50
|
-
"note": "
|
|
86
|
+
"note": "Use only when interface or content changes; use responsive Stack when only arrangement changes."
|
|
51
87
|
},
|
|
52
88
|
{
|
|
53
89
|
"intent": "grouped application actions",
|
|
54
90
|
"use": "Toolbar",
|
|
55
91
|
"note": "Do not use AppBar.Toolbar as an ARIA toolbar."
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"intent": "several related disclosure sections",
|
|
95
|
+
"use": "Accordion",
|
|
96
|
+
"note": "Preserve Header, Trigger, Content, and ContentInner ownership; use Collapsible for one disclosure."
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"intent": "semantic item or sequence content",
|
|
100
|
+
"use": "List",
|
|
101
|
+
"note": "Use structured row parts only when needed and keep Trailing compact on narrow screens."
|
|
56
102
|
}
|
|
57
103
|
],
|
|
58
104
|
"rules": [
|
|
@@ -61,6 +107,46 @@
|
|
|
61
107
|
"level": "must",
|
|
62
108
|
"statement": "Assign page structure to Brick components before writing element-level CSS."
|
|
63
109
|
},
|
|
110
|
+
{
|
|
111
|
+
"id": "interface-section-rhythm",
|
|
112
|
+
"level": "must",
|
|
113
|
+
"statement": "Use Section's named responsive rhythm for major page regions; use as=div when spacing is needed without thematic section semantics."
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"id": "interface-painted-section",
|
|
117
|
+
"level": "must",
|
|
118
|
+
"statement": "When Surface paint must cover Section rhythm, compose Surface asChild around Section so one host keeps the responsibilities separate."
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"id": "interface-blueprint-first",
|
|
122
|
+
"level": "must",
|
|
123
|
+
"statement": "Build from a blueprint, select the owning Brick components, render their defaults, choose supported props, then apply Theme, Block, or application customization in that order."
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"id": "interface-responsive-single-content",
|
|
127
|
+
"level": "must",
|
|
128
|
+
"statement": "Keep one copy of content when only its layout changes; use responsive Stack values instead of duplicated Show/Hide trees."
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"id": "interface-responsive-layout-grammar",
|
|
132
|
+
"level": "must",
|
|
133
|
+
"statement": "Use responsive Grid tracks, gaps, spans, and alignment or responsive ZStack logical placement when only those relationships change; do not duplicate content or change semantic order."
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"id": "interface-parent-participation",
|
|
137
|
+
"level": "must",
|
|
138
|
+
"statement": "Separate component internal geometry from parent participation; configure the finished component for its anatomy and the owning layout or Item part for its relationship to siblings."
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"id": "interface-frame-constraints",
|
|
142
|
+
"level": "must",
|
|
143
|
+
"statement": "Use Frame for a qualified local logical size constraint instead of repeating width/height CSS or adding size props to a finished component; do not use Frame when Container measure, layout participation, AspectRatio, or ScrollArea owns the actual job."
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"id": "interface-definite-size-owner",
|
|
147
|
+
"level": "must",
|
|
148
|
+
"statement": "Keep a real layout-item wrapper when it establishes flex or grid participation or the definite parent size required by ScrollArea, Carousel fill, or Image fill; asChild is not a wrapper-removal goal by itself."
|
|
149
|
+
},
|
|
64
150
|
{
|
|
65
151
|
"id": "interface-correct-owner",
|
|
66
152
|
"level": "must",
|
|
@@ -71,11 +157,41 @@
|
|
|
71
157
|
"level": "must",
|
|
72
158
|
"statement": "Preserve document landmarks and semantic elements when Brick does not provide an owner; Brick-first is not permission to erase HTML meaning."
|
|
73
159
|
},
|
|
160
|
+
{
|
|
161
|
+
"id": "interface-responsive-navigation-data",
|
|
162
|
+
"level": "must",
|
|
163
|
+
"statement": "When desktop and mobile require distinct navigation components, share application-owned destination labels, hrefs, values, and ordering while preserving each pattern's correct Brick anatomy; do not duplicate navigation content or force one interaction tree across breakpoints."
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"id": "interface-responsive-overlay-state",
|
|
167
|
+
"level": "must",
|
|
168
|
+
"statement": "Use Show and Hide for first-paint visibility; when a controlled interactive overlay may remain open across a breakpoint, synchronize its application state at that boundary so a hidden modal cannot retain focus, scroll lock, or isolation."
|
|
169
|
+
},
|
|
74
170
|
{
|
|
75
171
|
"id": "interface-theme-first",
|
|
76
172
|
"level": "should",
|
|
77
173
|
"statement": "Express reusable brand values through semantic Brick tokens and a theme rather than repeating literal application values."
|
|
78
174
|
},
|
|
175
|
+
{
|
|
176
|
+
"id": "interface-local-appearance-scope",
|
|
177
|
+
"level": "must",
|
|
178
|
+
"statement": "For a locally dark or light region, pass the existing region owner as the one direct child of Appearance and provide complete appearance-dependent color and shadow values for explicit light and dark re-entry; keep typography, density, geometry, and motion on the shared Theme root, and do not recolor descendants independently or add a Surface only to carry appearance."
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"id": "interface-portal-appearance",
|
|
182
|
+
"level": "must",
|
|
183
|
+
"statement": "When a portal leaves a local appearance scope, either target a portal container inside that scope or apply Appearance to every portalled visual root; never assume the trigger's CSS ancestry crosses the portal."
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
"id": "interface-depth-layout",
|
|
187
|
+
"level": "should",
|
|
188
|
+
"statement": "Use ZStack for reusable nine-position overlap; retain narrow application positioning only for artwork coordinates that ZStack intentionally does not own."
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
"id": "interface-ownership-classification",
|
|
192
|
+
"level": "must",
|
|
193
|
+
"statement": "Classify findings before changing a package: behavior and accessibility belong to Atom, finished reusable component paint belongs to Brick, brand values belong to Theme, repeated responsive section composition may belong to Block or Blueprint, and one-page art direction remains application-owned."
|
|
194
|
+
},
|
|
79
195
|
{
|
|
80
196
|
"id": "interface-document-foundation",
|
|
81
197
|
"level": "must",
|
|
@@ -100,6 +216,16 @@
|
|
|
100
216
|
"id": "interface-extract-evidence",
|
|
101
217
|
"level": "should",
|
|
102
218
|
"statement": "Classify repeated purposeful sections as Block candidates and repeated page arrangements as Blueprint candidates only after real reuse evidence."
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"id": "interface-source-organization",
|
|
222
|
+
"level": "should",
|
|
223
|
+
"statement": "Split long product compositions by stable responsibility—authored content, repeated item, invariant supporting region, and outer assembly—without pretending those local modules are reusable Brick components."
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
"id": "interface-comment-intent",
|
|
227
|
+
"level": "must",
|
|
228
|
+
"statement": "Comment non-obvious ownership, accessibility order, breakpoint, sizing, and browser-lifecycle constraints; do not add comments that only translate a component name or prop into prose."
|
|
103
229
|
}
|
|
104
230
|
],
|
|
105
231
|
"customization": {
|
|
@@ -147,6 +273,17 @@
|
|
|
147
273
|
]
|
|
148
274
|
}
|
|
149
275
|
},
|
|
276
|
+
"planningRecord": {
|
|
277
|
+
"purpose": "Record the layout decision before generated implementation so Engine and TemplateFlow preserve ownership.",
|
|
278
|
+
"fields": [
|
|
279
|
+
"relationship",
|
|
280
|
+
"owner",
|
|
281
|
+
"parentParticipation",
|
|
282
|
+
"responsiveChange",
|
|
283
|
+
"constraintSource",
|
|
284
|
+
"fallbackReport"
|
|
285
|
+
]
|
|
286
|
+
},
|
|
150
287
|
"nativeFallback": {
|
|
151
288
|
"check": "Review the interface map against the manifest and selected component guides, including layout, text, image, visibility, and navigation owners.",
|
|
152
289
|
"use": "Keep native landmarks and product-specific semantic structures where no Brick component adds a useful contract; add only narrow composition classes.",
|
|
@@ -155,20 +292,30 @@
|
|
|
155
292
|
"validation": [
|
|
156
293
|
"Inspect the rendered DOM, accessible names, heading order, landmarks, focus order, keyboard operation, touch targets, contrast, zoom, and RTL behavior.",
|
|
157
294
|
"Test every adopted breakpoint without JavaScript-dependent first-paint flicker.",
|
|
158
|
-
"Confirm layout primitives own ordinary gap, alignment, wrapping, width, and visibility before accepting custom CSS.",
|
|
295
|
+
"Confirm layout primitives own ordinary gap, alignment, wrapping, width, and visibility before accepting custom CSS; verify separately meaningful inline nodes use layout gap rather than literal spaces or offsets.",
|
|
296
|
+
"Confirm every ScrollArea, Carousel fill, and Image fill composition can name the ancestor that establishes its definite size; use Frame when that ancestor needs an explicit logical size constraint, and never expect the child to invent it.",
|
|
297
|
+
"Confirm light to dark to light and dark to light to dark scopes restore the theme's complete semantic foreground, background, boundary, action, focus, status, scrim, shadow, and interaction-state pairs without child-by-child recoloring.",
|
|
298
|
+
"Confirm every portalled visual root either remains inside the intended theme/appearance container or receives an explicit Appearance scope.",
|
|
159
299
|
"Confirm repeated CSS values are theme tokens, component-specific values use documented component tokens, and every remaining direct stable-hook declaration has a complete customization gap report.",
|
|
300
|
+
"Confirm source order follows rendered ownership, static content is separate from interaction assembly when it obscures the component tree, and comments explain why a constraint exists rather than what an obvious line does.",
|
|
160
301
|
"Run the package's CSS-delivery check and the application's accessibility, browser, and performance checks."
|
|
161
302
|
],
|
|
162
303
|
"related": [
|
|
163
304
|
"layer-selection",
|
|
305
|
+
"appearance",
|
|
164
306
|
"app-bar",
|
|
307
|
+
"section",
|
|
165
308
|
"container",
|
|
166
309
|
"stack",
|
|
310
|
+
"z-stack",
|
|
167
311
|
"grid",
|
|
312
|
+
"frame",
|
|
168
313
|
"surface",
|
|
169
314
|
"card",
|
|
170
315
|
"navigation-menu",
|
|
171
316
|
"show",
|
|
172
|
-
"hide"
|
|
317
|
+
"hide",
|
|
318
|
+
"accordion",
|
|
319
|
+
"list"
|
|
173
320
|
]
|
|
174
321
|
}
|