@flood-md/agent 0.2.10 → 0.2.12

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 (140) hide show
  1. package/DESIGN.md +8 -5
  2. package/README.md +1 -1
  3. package/SKILL.md +11 -0
  4. package/dist/catalog.json +1914 -278
  5. package/dist/materials/component-app-shell.md +49 -0
  6. package/dist/materials/component-app-top-bar.md +36 -0
  7. package/dist/materials/component-autocomplete.md +54 -0
  8. package/dist/materials/component-bulk-action-bar.md +52 -0
  9. package/dist/materials/component-button.md +1 -0
  10. package/dist/materials/component-card.md +2 -2
  11. package/dist/materials/component-collapsible.md +1 -0
  12. package/dist/materials/component-collection-toolbar.md +69 -0
  13. package/dist/materials/component-collection-view-switcher.md +49 -0
  14. package/dist/materials/component-combobox.md +10 -0
  15. package/dist/materials/component-command-palette.md +53 -0
  16. package/dist/materials/component-copy-button.md +1 -0
  17. package/dist/materials/component-data-table.md +34 -4
  18. package/dist/materials/component-date-picker.md +1 -0
  19. package/dist/materials/component-date-range-picker.md +1 -0
  20. package/dist/materials/component-date-time-picker.md +2 -0
  21. package/dist/materials/component-date-time-range-picker.md +4 -0
  22. package/dist/materials/component-drawer.md +1 -0
  23. package/dist/materials/component-editable.md +4 -0
  24. package/dist/materials/component-figure.md +1 -1
  25. package/dist/materials/component-filter-condition.md +53 -0
  26. package/dist/materials/component-filter-group.md +55 -0
  27. package/dist/materials/component-heading.md +1 -1
  28. package/dist/materials/component-icon-button.md +2 -0
  29. package/dist/materials/component-menubar.md +41 -0
  30. package/dist/materials/component-multi-select.md +10 -0
  31. package/dist/materials/component-navigation-group.md +51 -0
  32. package/dist/materials/component-navigation-item.md +59 -0
  33. package/dist/materials/component-navigation-tree.md +8 -0
  34. package/dist/materials/component-overflow-actions.md +47 -0
  35. package/dist/materials/component-page-header.md +40 -0
  36. package/dist/materials/component-popover.md +2 -1
  37. package/dist/materials/component-radio-card.md +2 -2
  38. package/dist/materials/component-section.md +1 -1
  39. package/dist/materials/component-segmented-control.md +6 -4
  40. package/dist/materials/component-sheet.md +49 -0
  41. package/dist/materials/component-sidebar.md +64 -0
  42. package/dist/materials/component-sparkline.md +41 -0
  43. package/dist/materials/component-table.md +2 -0
  44. package/dist/materials/component-tabs.md +2 -0
  45. package/dist/materials/component-text.md +2 -2
  46. package/dist/materials/component-toggle.md +1 -0
  47. package/dist/materials/component-toolbar.md +5 -0
  48. package/dist/materials/component-tooltip.md +1 -1
  49. package/dist/materials/guide-agent-knowledge.md +13 -6
  50. package/dist/materials/guide-agents.md +8 -1
  51. package/dist/materials/guide-foundations.md +45 -2
  52. package/dist/materials/guide-installation.md +6 -6
  53. package/dist/materials/guide-interface-content.md +1 -1
  54. package/dist/materials/guide-introduction.md +4 -2
  55. package/dist/materials/guide-layout.md +39 -10
  56. package/dist/materials/guide-motion.md +66 -0
  57. package/dist/materials/guide-skills.md +9 -0
  58. package/dist/materials/recipe-collection-views.md +670 -0
  59. package/dist/materials/recipe-command-palette.md +31 -52
  60. package/dist/materials/recipe-filter-bar.md +12 -3
  61. package/dist/materials/recipe-grouped-form.md +5 -0
  62. package/dist/materials/recipe-navigation-workspace.md +222 -0
  63. package/dist/materials/recipe-record-management.md +310 -0
  64. package/dist/materials/recipe-record-workspace.md +207 -0
  65. package/dist/materials/recipe-settings-workspace.md +232 -0
  66. package/dist/materials/token-sys.color.context.base.action-disabled.json +41 -0
  67. package/dist/materials/token-sys.color.context.base.action-hover.json +41 -0
  68. package/dist/materials/token-sys.color.context.base.action-pressed.json +41 -0
  69. package/dist/materials/token-sys.color.context.base.action-rest.json +41 -0
  70. package/dist/materials/token-sys.color.context.base.avatar-background.json +41 -0
  71. package/dist/materials/token-sys.color.context.base.border-decorative.json +41 -0
  72. package/dist/materials/token-sys.color.context.base.divider-decorative.json +41 -0
  73. package/dist/materials/token-sys.color.context.base.field-background.json +41 -0
  74. package/dist/materials/token-sys.color.context.base.field-border.json +41 -0
  75. package/dist/materials/token-sys.color.context.base.field-disabled.json +41 -0
  76. package/dist/materials/token-sys.color.context.base.field-readonly.json +41 -0
  77. package/dist/materials/token-sys.color.context.base.indicator-track.json +41 -0
  78. package/dist/materials/token-sys.color.context.base.loading-placeholder.json +41 -0
  79. package/dist/materials/token-sys.color.context.base.muted-background.json +41 -0
  80. package/dist/materials/token-sys.color.context.base.on-surface-action-disabled.json +41 -0
  81. package/dist/materials/token-sys.color.context.base.on-surface-action-hover.json +41 -0
  82. package/dist/materials/token-sys.color.context.base.on-surface-action-pressed.json +41 -0
  83. package/dist/materials/token-sys.color.context.base.on-surface-action-rest.json +41 -0
  84. package/dist/materials/token-sys.color.context.base.selection-background.json +41 -0
  85. package/dist/materials/token-sys.color.context.base.supporting-background.json +41 -0
  86. package/dist/materials/token-sys.color.context.filled.action-disabled.json +41 -0
  87. package/dist/materials/token-sys.color.context.filled.action-hover.json +41 -0
  88. package/dist/materials/token-sys.color.context.filled.action-pressed.json +41 -0
  89. package/dist/materials/token-sys.color.context.filled.action-rest.json +41 -0
  90. package/dist/materials/token-sys.color.context.filled.avatar-background.json +41 -0
  91. package/dist/materials/token-sys.color.context.filled.border-decorative.json +41 -0
  92. package/dist/materials/token-sys.color.context.filled.divider-decorative.json +41 -0
  93. package/dist/materials/token-sys.color.context.filled.field-background.json +41 -0
  94. package/dist/materials/token-sys.color.context.filled.field-border.json +41 -0
  95. package/dist/materials/token-sys.color.context.filled.field-disabled.json +41 -0
  96. package/dist/materials/token-sys.color.context.filled.field-readonly.json +41 -0
  97. package/dist/materials/token-sys.color.context.filled.indicator-track.json +41 -0
  98. package/dist/materials/token-sys.color.context.filled.loading-placeholder.json +41 -0
  99. package/dist/materials/token-sys.color.context.filled.muted-background.json +41 -0
  100. package/dist/materials/token-sys.color.context.filled.selection-background.json +41 -0
  101. package/dist/materials/token-sys.color.context.filled.supporting-background.json +41 -0
  102. package/dist/materials/token-sys.color.field.readonly.json +41 -0
  103. package/dist/materials/token-sys.color.surface.avatar.json +41 -0
  104. package/dist/materials/token-sys.color.surface.current.json +41 -0
  105. package/dist/materials/token-sys.color.surface.muted.json +41 -0
  106. package/dist/materials/token-sys.color.surface.supporting.json +41 -0
  107. package/dist/materials/token-sys.motion.distance-panel.json +36 -0
  108. package/dist/materials/token-sys.motion.distance-small.json +36 -0
  109. package/dist/materials/token-sys.motion.duration-enter.json +36 -0
  110. package/dist/materials/token-sys.motion.duration-exit.json +36 -0
  111. package/dist/materials/token-sys.motion.duration-layer.json +36 -0
  112. package/dist/materials/token-sys.motion.duration-loop.json +36 -0
  113. package/dist/materials/token-sys.motion.duration-press.json +36 -0
  114. package/dist/materials/token-sys.motion.easing-enter.json +38 -0
  115. package/dist/materials/token-sys.motion.easing-exit.json +38 -0
  116. package/knowledge.json +115 -2
  117. package/lib/inspect.mjs +11 -0
  118. package/manifest.json +11 -1
  119. package/package.json +9 -3
  120. package/references/component-families.md +150 -0
  121. package/references/composition.md +16 -4
  122. package/references/customization.md +14 -0
  123. package/references/flood-composition/SKILL.md +4 -0
  124. package/references/flood-data-display/SKILL.md +146 -0
  125. package/references/flood-feedback/SKILL.md +37 -0
  126. package/references/flood-forms/SKILL.md +31 -0
  127. package/references/flood-foundations/SKILL.md +36 -0
  128. package/references/flood-hierarchy/SKILL.md +27 -7
  129. package/references/flood-interface-content/SKILL.md +33 -5
  130. package/references/flood-motion/SKILL.md +47 -0
  131. package/references/flood-navigation/SKILL.md +195 -0
  132. package/references/flood-overlays/SKILL.md +41 -0
  133. package/references/flood-records/SKILL.md +65 -2
  134. package/references/flood-spacing/SKILL.md +45 -0
  135. package/references/flood-verification/SKILL.md +20 -0
  136. package/references/interface-content-examples.md +4 -0
  137. package/references/rendered-review.md +5 -0
  138. package/references/spacing.md +30 -0
  139. package/rules.json +98 -8
  140. package/workflows.json +28 -3
@@ -38,6 +38,13 @@ Do not hide essential instructions or risks behind a tooltip merely
38
38
  to make a screen quieter. Preserve accessible names and associations when reducing
39
39
  visible copy; use the component's documented hideLabel API where appropriate.
40
40
 
41
+ For a bulk confirmation, put the action and its scope first. Use the title for
42
+ the count when it reads naturally there. If the count belongs in the body, give
43
+ it the first sentence. Put a meaningful consequence on a separate line or in a
44
+ separate paragraph. Let each thought wrap naturally on narrow screens. Preserve
45
+ the dialog's accessible description and check singular and plural copy.
46
+ AlertDialog preserves a newline in its string description.
47
+
41
48
  ## Separate prototype provenance from product state
42
49
 
43
50
  An explicitly requested local prototype or fixture-backed test app does not need
@@ -78,6 +85,14 @@ affected object named again, a long form may repeat its primary action at the en
78
85
  and a printed document has its own content hierarchy. Do not remove those merely
79
86
  because similar words appear elsewhere on the screen.
80
87
 
88
+ Review shared context across the shell, page header, toolbar, list and open
89
+ record. A page title can carry the task, a section can name the collection, and
90
+ column labels can carry units or field meaning. Trace each repeated fact to its
91
+ visible owner. Temporarily remove optional subtitles, count captions and labels
92
+ beside values. Restore a string when its absence hides scope, changes a decision
93
+ or makes a pane ambiguous when it opens on its own. Keep names required by
94
+ assistive technology when the corresponding visible caption goes away.
95
+
81
96
  ## Explain only what changes a decision
82
97
 
83
98
  Prefer a clear label or unit to an added helper paragraph. Add a field hint for a
@@ -128,11 +143,16 @@ location, remove it. Read the decision examples when uncertain; reading this
128
143
  workflow without applying that review does not satisfy it. Preserve essential
129
144
  consequences and actionable errors rather than stripping every explanation.
130
145
 
131
- Read the whole screen in task order, including navigation, heading, fields,
132
- actions and the state after an action. Review visible strings together with
133
- accessible names, placeholders and announcements. Check repeated meaning across
134
- locations, not just repeated words in one file. Removing a subtitle should not
135
- leave its reserved space or an empty banner behind.
146
+ Read the whole screen in task order, including navigation, heading, fields and
147
+ actions. For a collection, repeat with populated and empty results, then with the
148
+ record open. Compare count scope before dropping duplicates. An active filter
149
+ count and a footer range may differ when search or pagination is active. If all
150
+ receipts are already visible in their column, omit a routine completion caption;
151
+ keep a missing-receipt signal if it affects approval. Name totals when two
152
+ simultaneously visible amounts represent different scopes.
153
+
154
+ Review visible strings together with accessible names, placeholders and
155
+ announcements. Removing a subtitle should also remove its reserved space.
136
156
 
137
157
  For a writing pass, report the consequential keep/rewrite/move/remove decisions
138
158
  outside the product UI, and exercise the affected action or error. Automated
@@ -140,3 +160,11 @@ phrase scans cannot establish editorial quality. Use [decision examples](../inte
140
160
  when a similar-looking string needs different treatment in another context.
141
161
  Do not claim an independent agent evaluation when the author already knows the
142
162
  implementation or corrected the initial output manually.
163
+
164
+ ## Make canonical examples teach the same standard
165
+
166
+ Apply these decisions to playground defaults and copied recipes. Optional
167
+ descriptions start absent. When demonstrating one, use a real distinction or
168
+ constraint, such as a plan's member limit, rather than a friendly sentence
169
+ repeating its title. Marketing prose belongs to a deliberate marketing surface,
170
+ not default field/dialog content. Review the printed example as well as its DOM.
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: flood-motion
3
+ description: Design and verify motion for Flood controls, overlays, disclosure, feedback and loading states. Use for animation, transitions, reduced motion and component motion reviews.
4
+ ---
5
+
6
+ # Choose the event before the animation
7
+
8
+ Read the installed motion tokens and the component's behavior contract.
9
+ Choose motion by what changed and how far the eye needs to travel.
10
+
11
+ | Event | Flood recipe |
12
+ | --- | --- |
13
+ | Hover, press, current or checked | Brief paint transition. Standalone controls may compress slightly while held, then return to rest. Selection can move a glyph or thumb that represents the state. |
14
+ | Disclosure | Change content availability immediately. Rotate the indicator and reveal newly shown content only where the component owns that region. |
15
+ | Anchored popup, modal or drawer | Start from the anchor direction, a small opacity change, or the drawer edge. Larger layers get more time. Dismissal should be shorter where the lifecycle can preserve it safely. |
16
+ | Progress, loading or result | Animate the indicator or arriving message. Keep text and state legible during the motion. |
17
+ | Focus, validation, drag, resize, scrubbing or text input | Immediate focus, feedback and geometry. The pointer and selection own their position. |
18
+ | Typography, layout and static content | Inherit motion from the interactive owner. Avoid mount effects on structural wrappers and ordinary rows. |
19
+
20
+ Use Flood semantic timing roles and narrow transition-property lists. Prefer
21
+ opacity and transform on bounded visual parts. Keep an anchored overlay's
22
+ positioning root stable while a child moves. Animate color only where the old and
23
+ new colors keep required information legible. Keep focus outlines and error
24
+ messages immediate. Apply hover treatment only to devices that can hover.
25
+ For ToastRegion, animate each arriving card as a unit from its placement edge.
26
+ Keep the region anchored and its announcement available as soon as it appears.
27
+ Inline toasts can fade without moving surrounding content.
28
+ Keep compression off disabled controls, text editors and joined control
29
+ surfaces. Verify release and cancellation without a layout shift.
30
+ Treat disclosure headers as part of their enclosing surface. Keep their
31
+ background flush during press and rotate the centered glyph around its own center.
32
+
33
+ Keep focus, ARIA, routing, scroll locks and form state independent from animation
34
+ completion. For native top-layer exits, verify that content, inertness and focus
35
+ all remain correct. Use an immediate close when an exit would keep an empty or
36
+ interactive shell visible. Rapid reversal must settle to the accepted state.
37
+
38
+ Honor `prefers-reduced-motion: reduce` with immediate state changes and static
39
+ loading indicators. Never require motion to distinguish two states. For infinite
40
+ motion, verify the activity ends with its actual loading state.
41
+
42
+ Review actual controls in the same screen and at their supported density. Verify
43
+ pointer, keyboard, touch, interrupted transitions and reduced motion. For
44
+ overlays, also check repeated open/close, focus restoration and nested dismissal
45
+ in Chromium, Firefox and WebKit. Record deliberately static behavior by family.
46
+ Use the Motion guide in the matching catalog for the component-by-component
47
+ contract. When adding a component, give its states an owner in that guide.
@@ -11,6 +11,13 @@ object selection; Tabs for associated panels; Accordion/Collapsible for disclosu
11
11
  SegmentedControl selects one value and is not a tab panel controller. Do not use
12
12
  Menu just because links appear vertically.
13
13
 
14
+ For the 0.2.11 source candidate, NavigationItem is the shared small row owner and
15
+ NavigationGroup owns an optional section heading/action, separator and independent
16
+ group disclosure. NavigationTree composes rows into a hierarchy; Sidebar owns
17
+ fixed regions and bounded scrolling. Consumers must discover these APIs in their
18
+ installed version before using them. Atomic composition separates responsibilities;
19
+ it does not require a new export for every wrapper or spacing token.
20
+
14
21
  ## Preserve browser and keyboard behavior
15
22
 
16
23
  - Links retain real href, modifier/open-in-new-tab behavior and current-page
@@ -23,6 +30,58 @@ Menu just because links appear vertically.
23
30
  Avoid adding generic arrow-key handlers around nested interactive content.
24
31
  - Disclosure state must match its trigger and panel. Check whether content remains
25
32
  mounted, and preserve any native form/focus consequences of the installed API.
33
+ - A branch with no destination can use one full-row disclosure button. A branch
34
+ with a destination uses a real link plus a separate sibling disclosure action.
35
+ Do not nest the toggle inside the link or make a normal link click also toggle
36
+ expansion. Command rows retain Button semantics; vertical navigation is not
37
+ automatically an application Menu.
38
+
39
+ ## Shared rows and configurable groups
40
+
41
+ Use AppShell for workspace regions and AppTopBar for shared application
42
+ context and actions. PageHeader belongs inside the main region. Sidebar and
43
+ NavigationTree own the destinations and expanded branches. Keep the selected
44
+ route, responsive presentation and a mobile Drawer's open state separate.
45
+ Use AppShell navigationDrawer for a single dock that needs to switch based on
46
+ container width. Verify the switch inside a narrow parent at a wide viewport,
47
+ including resizing while a navigation link or the Drawer has focus.
48
+
49
+ Hide the visible caption of a single group when its title repeats the app or
50
+ workspace context. Keep the group's accessible name with `hideLabel`. Align
51
+ visible captions with destination labels, and check both settled sidebar widths.
52
+
53
+ NavigationItem owns the complete row surface, including the visual relationship
54
+ between its primary control and disclosure. A shorter selected background behind
55
+ only the label/link makes the trailing action look unrelated. Keep distinct click
56
+ and focus targets within a coherent current/hover surface; current destination,
57
+ ancestor-current, expansion and focus remain separate. Budget actual trailing
58
+ anatomy once rather than adding another empty inset or column in the shell.
59
+ Align disclosure and badge centers on the trailing track. The disclosure target
60
+ already contributes half its width as clearance, so use the compact edge inset
61
+ there and preserve the full target.
62
+ Use trailing for noninteractive metadata and trailingAction for an independent
63
+ named action. Keep both visible on the trailing track at rest and during
64
+ interaction. On an already filled row, use a glyph-level hover response for a
65
+ ghost accessory and keep its keyboard focus visible. Use branchGuides for dense hierarchies where
66
+ indentation alone is hard to follow. Keep section separators optional and
67
+ distinct from branch guides.
68
+ Use Sidebar headerLayout inline when the expanded identity and toggle should
69
+ share a row. Use the stacked recipe when the toggle must stay on the same axis
70
+ through collapse and expansion.
71
+
72
+ NavigationGroup starts with optional presentation empty. Add a heading to name a
73
+ real group, headingAction for a real command, and separator for a relationship
74
+ that needs one. Do not fill every slot to make a demo look complete. A collapsible
75
+ group requires a label; hiding its visual label does not remove the disclosure's
76
+ accessible name. collapseDisabled disables that disclosure, not its child links.
77
+ Group expansion is not NavigationTree expandedValues and is not Sidebar compact
78
+ state. A proposal callback does not prove the host accepted the change.
79
+
80
+ Compact groups keep destinations available without requiring an invisible group
81
+ toggle. Preserve the accepted expanded choice for the return to expanded mode;
82
+ do not overwrite it merely to reveal compact destinations. Meaningful heading
83
+ actions remain available. Test headed/unheaded groups, actions present/absent,
84
+ separator on/off, accepted/refused collapse and compact transitions separately.
26
85
 
27
86
  ## Evidence
28
87
 
@@ -33,3 +92,139 @@ new line can indicate a sizing error rather than a legitimate responsive layout.
33
92
  For sidebar navigation, scroll/focus the final item and keep its selected surface
34
93
  clear of the scrollbar. Verify the actual navigation composition at narrow width
35
94
  and enlarged text; an isolated item's screenshot is insufficient.
95
+ Verify shared inline tracks from header through footer: leading glyph center,
96
+ text start and trailing badge/disclosure center. Group labels inherit the chosen
97
+ text track. Missing peer icons reserve their column; iconless nested links use
98
+ an intentional parent-text indent. Sidebar places its scrollbar in existing edge
99
+ spacing, without a permanent extra column or a shift when overflow appears.
100
+ Other scroll surfaces must still protect content that reaches their tracks.
101
+ In compact mode compare the actual brand, pane-toggle, destination and account
102
+ control centers against the full rail center. A balanced body or centered footer
103
+ container does not prove its Menu trigger is on the same axis. Adapt the fixed
104
+ identity/utility slots through the accepted compact state instead of inserting
105
+ an unrelated small button and assuming inherited alignment will fix it.
106
+
107
+ Use Sidebar for bounded workspace navigation: NavigationTree owns the destinations
108
+ and disclosure, ScrollArea owns the middle scroll viewport, and fixed header/footer
109
+ slots adapt through the collapsed render state. Give the host a meaningful height;
110
+ do not add several competing scroll owners. Route/current value, compact width and
111
+ branch expansion are independent controlled states. A callback is a proposal,
112
+ not acceptance. Keep groups and item IDs stable; item values are globally unique.
113
+ Collapsed branches open a full NavigationTree in Popover, not an application Menu.
114
+ Leaf links preserve href and modifier behavior. Do not claim an active ancestor
115
+ is the current page. Count metadata uses trailing with Badge; icons retain explicit
116
+ IconSlot sizing. Compact destinations use Flood Tooltip on hover and keyboard
117
+ focus while keeping their actual Link or disclosure button. Do not layer a
118
+ native title with the same text over the tooltip. Suppress the branch hint while
119
+ its flyout is open; tooltip behavior must not replace navigation or steal focus.
120
+ Sidebar owns no routing, preference persistence, mobile drawer or keyboard shortcut.
121
+ Add those in the host only for an explicit requirement. On a programmatic width
122
+ change, keep surviving focus or restore it within the navigation; do not move
123
+ unrelated outside focus. Verify footer reachability and flyout text at both widths.
124
+
125
+ ## Compose global and contextual navigation
126
+
127
+ For a multi-domain application, distinguish global module choice, contextual
128
+ page destination, branch expansion and context-pane visibility. A GlobalRail
129
+ profile can compose a flat, permanently compact Sidebar; the adjacent ContextBar
130
+ profile composes another Sidebar for the accepted module. Use distinct landmark
131
+ names and keep global utilities separate from contextual destinations.
132
+
133
+ Do not duplicate the context list in both an open ContextBar and a rail flyout.
134
+ Re-clicking the active module does not implicitly hide its context: give that
135
+ pane an explicit visibility control. Use currentKind="location" for a current
136
+ global module and the default page kind for an actual contextual destination.
137
+ Keep genuine hrefs and derive accepted routes from the host router. Modifier
138
+ clicks/open-in-new-tab must not change the current tab's accepted module.
139
+
140
+ Read recipe:navigation-workspace from the installed catalog for the full host
141
+ composition. Keep filters/search scoped to the accepted module; resetting one
142
+ module must not change another module's query. Validate complete route identities
143
+ before deriving titles and current state. If a focused row/pane/action disappears,
144
+ restore a stable host destination only after the previous focus was disconnected
145
+ and focus fell to the document body. Do not reset surviving focus on every render.
146
+ Include dialog-close after its original trigger disappeared in that check.
147
+
148
+ SidebarGroup.hideLabel omits a redundant visual heading while retaining the
149
+ named nav landmark. Start optional headings, captions, counters and helper slots
150
+ empty; add them only for information needed for recognition or a decision.
151
+ Group headingAction, separator and collapse configuration belong to the section;
152
+ Sidebar headerSeparator/footerSeparator are independent opt-in shell choices.
153
+ Do not equate every group boundary with a visible line.
154
+ Use the live workspace composition before introducing separate public aliases:
155
+ an identical wrapper name is not a new component responsibility.
156
+
157
+ Keep a shared top reading anchor across composed panes. A header without a
158
+ collapse action still needs the family header height; removing an optional button
159
+ must not shift its entire navigation above the neighboring rail.
160
+
161
+ Evaluate the navigation with its main workspace at real desktop width and height,
162
+ not only as a centered object in a docs column. Keep visible chrome subdued
163
+ relative to task content, expose current destinations clearly, and budget badges.
164
+ Record deliberate scoped semantic theme overrides rather than styling around
165
+ the reused primitives. Evidence from another product informs a decision; it does
166
+ not authorize copying implementation or presenting an undated page as a new release.
167
+
168
+ ## Give navigation a deliberate visual grammar
169
+
170
+ NavigationItem owns a row, not a hidden hierarchy. For a compact row that has
171
+ both a destination and children, use NavigationTree's branch composition: its
172
+ flyout retains the parent destination and the children. Do not hide one of two
173
+ actions merely to fit an icon target. Keep Tooltip mounted and disable its hint
174
+ while the interactive flyout is open; replacing that wrapper can remount the
175
+ trigger and break focus return.
176
+
177
+ Separate destination artwork from supporting disclosure. Use the IconButton
178
+ iconSize capability to reduce a chevron independently of its size/hit area;
179
+ never shrink the clickable target just to make the glyph quieter. Compare the
180
+ actual artwork, not merely its SVG box. Sidebar's sm/md disclosure uses 2xs
181
+ artwork, lg uses xs; these are the current family recipe, not universal pixel
182
+ requirements for every action. Keep the shared trailing action center.
183
+
184
+ A pane toggle depicts the pane, with distinct open/close directional states.
185
+ A multi-panel layout icon is not automatically a recognizable visibility action.
186
+ Keep its accessible name and aria-expanded synchronized with the accepted state;
187
+ resolve side and RTL before choosing the arrow direction. Check inherited
188
+ direction changes after mount too: panel edge, arrow and flyout side must update
189
+ together without requiring an unrelated interaction to refresh them.
190
+
191
+ Do not make every relationship a new pill, divider or group title. Peer items,
192
+ children, separate groups and fixed footer actions need distinct parent-owned
193
+ spacing. Start optional captions, counters and descriptions empty. Give each
194
+ visible addition a recognition, navigation or task purpose; remove decorative
195
+ status claims and labels that repeat their inherited context. Apply the content
196
+ workflow to the actual rendered navigation, including hidden and empty states.
197
+
198
+ A professional result requires both a coherent family and a working interaction.
199
+ Review expanded/compact side by side with real short/long labels and a populated
200
+ workspace. Check whether a user can identify destinations, discover hidden labels,
201
+ change the current route and reopen a pane. A generic "anti-slop" checklist or
202
+ passing build is not evidence that these rendered checks passed. Learn from
203
+ references without importing another product's branding or taste bans wholesale.
204
+
205
+ ## Coordinate actions and workspace anchors
206
+
207
+ For a persistent pane toggle, keep its viewport position while its pane changes
208
+ width or visibility and test consecutive clicks at the same coordinates. If a
209
+ compact rail swaps the service mark for the toggle, keep both in the same slot
210
+ and reveal the toggle on hover and keyboard focus. Keep the toggle visible on
211
+ devices without hover. When context is hidden, a rail module can open its
212
+ destinations in a compact NavigationTree flyout. Keep links and expansion state
213
+ shared with the docked context. Escape dismisses the flyout without changing the
214
+ route or pinning the pane.
215
+
216
+ For a rail hover preview, use the compact item's flyout options. Opening from
217
+ hover preserves focus and allows the pointer to cross the gap into the panel.
218
+ Explicit activation still opens the same destinations on keyboard and touch.
219
+ Anchor a tall context flyout to the rail so it shares the workspace top edge.
220
+
221
+ Menubar coordinates desktop commands and one open menu, not website destinations.
222
+ Reuse Menu for its child menus; native links still own destinations. OverflowActions
223
+ composes Toolbar/Button/Menu. Preserve command identity, disabled state and danger
224
+ tone when moving into More. Choose priorities by task, not label length. Exercise
225
+ focus when resize hides an action or removes the More trigger.
226
+
227
+ Keep a common top reading anchor across short/long workspace pages. Use logical
228
+ inline centering for content width: margin:auto on a grid child can also center
229
+ a short page vertically. Name each pane's scroll owner. Check short/long lists,
230
+ detail and editor at the same viewport; a Drawer/table cannot fix its parent.
@@ -10,6 +10,9 @@ Use the actual installed overlay and trigger contract; see
10
10
  noninteractive help; interactive content needs the appropriate Popover or dialog.
11
11
  Do not put an action inside a tooltip or apply application-menu roles to site links.
12
12
 
13
+ For a short Select trigger, verify that the open list can fit the longest
14
+ ordinary label, then repeat near the viewport edge with a very long label.
15
+
13
16
  ## Preserve trigger and state
14
17
 
15
18
  Forward trigger props/ref onto one mounted native action. Preserve its accessible
@@ -17,6 +20,13 @@ name and open/controls semantics. Choose host-controlled open state or a default
17
20
  and test a host refusing an open/close request. Do not claim control state changed
18
21
  merely because a callback ran. The host owns persistent values in unmounted panels.
19
22
 
23
+ Tooltip can attach to a real Link or Button through HTMLElement-safe trigger
24
+ props. Preserve the ref, hover/focus handlers and descriptions together with the
25
+ host handlers. Do not turn a navigation link into a button to add a hint. Raw
26
+ tooltip buttons in forms keep an explicit type="button". A control sharing Tooltip
27
+ and Popover composes both refs and suppresses its hint while the popover is open;
28
+ the interactive layer owns Escape and focus then.
29
+
20
30
  Modal and nonmodal focus are different: do not add a trap to every floating
21
31
  surface or remove a modal's background inertness. Escape dismisses the active
22
32
  layer; a nested menu/select must not also close its parent dialog. Restore opener
@@ -26,8 +36,39 @@ Task Dialog titles and body insets use their own recipe; do not reuse compact
26
36
  popup caption typography for the modal task. The
27
37
  [hierarchy workflow](../flood-hierarchy/SKILL.md) owns title/group/field relations.
28
38
 
39
+ Use CommandPalette for modal search. Its search header and results share one
40
+ overlay surface. Forward the trigger and keep the modal title and input label
41
+ specific to the task. Use loading for an in-flight request, and let the host
42
+ control permissions, navigation and shortcuts.
43
+
29
44
  ## Inspect the actual host
30
45
 
46
+ Use a Drawer for a short record task that needs the list as context. Use a
47
+ route when the record needs a shareable address, substantial editing space, or
48
+ its own navigation and history. After a Drawer save, restore the initiating
49
+ control if it remains in the result set. Choose a stable list control when the
50
+ edit changes filter membership. See `recipe:record-management`.
51
+
52
+ Choose Drawer width using the longest real title, body copy and form controls.
53
+ Compare `md` and `lg` with a populated record. Use the description slot for
54
+ brief context and compose independent body sections with Section, Stack,
55
+ DescriptionList or Fieldset as appropriate. Put the next action in the footer
56
+ when it must stay reachable during scrolling. Avoid repeating the heading
57
+ as a section name or showing two equivalent dismiss actions in a clean state.
58
+
59
+ Use Sheet when a short touch task, navigation list or option list needs the
60
+ width of the phone. Keep the current choice visible on its trigger and compose
61
+ single-choice options with ListBox. Commit on selection, keep the previous value
62
+ on dismissal, and return focus to the trigger. Use one scrolling body and keep
63
+ long content, the close action and safe-area padding reachable.
64
+
65
+ Overlay material establishes the nested neutral control context automatically.
66
+ Compare its fields, secondary actions, selection and supporting chips with their
67
+ canvas counterparts. Avoid opaque dark action islands or hiding the entire
68
+ surface distinction behind a strong border/shadow. Glass needs an opaque
69
+ fallback and a reduced-transparency path. A nested Surface resets its own
70
+ material; a nested chooser becomes a new floating owner. Verify both cases.
71
+
31
72
  Check placement at viewport edges, resize, narrow/enlarged text, RTL and parent
32
73
  scrolling. Selection popups and calendar popups have distinct content geometry;
33
74
  use the supported field/anchor sizing behavior, not a universal fixed width.
@@ -25,8 +25,9 @@ planning text in the interface. Read the
25
25
  - If users compare several independent attributes across records, use Table or
26
26
  DataTable with actual named columns. A long Inline of unrelated values at each
27
27
  row end is not a substitute for comparison columns.
28
- - Use DescriptionList for named values in details. A detail view can expose more
29
- information than a list; it does not need to repeat the list's chip arrangement.
28
+ - Use DescriptionList for named values in details. Each item requires a unique,
29
+ stable string `id` alongside `term` and `description`. A detail view can expose
30
+ more information than a list; it does not need to repeat the list's chip arrangement.
30
31
  - Selection is not navigation. A record list does not become ListBox merely
31
32
  because users click its entries. Retain a real Link and independent actions.
32
33
 
@@ -61,6 +62,57 @@ a default low/medium priority does not automatically need a separate visual acce
61
62
 
62
63
  ## Distribute information between list and details
63
64
 
65
+ For a table row whose main action opens an in-place Drawer, use DataTable's
66
+ `primaryAction` when the installed version provides it. Title and metadata
67
+ share a compact cell, pointer activation extends across the row, and a native
68
+ button provides the keyboard entry. Keep checkbox, links and menus independent.
69
+ For a real destination, preserve a Link. Use the table toolbar and matching
70
+ edge inset when the heading, filters, cells and footer share one surface.
71
+
72
+ For transient selection commands, look up `recipe:collection-views` in the
73
+ installed catalog. For a full-window record workspace with a changing row count,
74
+ use `AppShell scroll="content" scrollOrientation="vertical"` as the vertical
75
+ scroll owner, including when the page has no app chrome. Keep fixed actions
76
+ outside that ScrollArea. Test a populated view and a filtered or empty view in a
77
+ browser with space-reserving scrollbars. Compare the table's inline edges
78
+ and the document's client width across those views.
79
+
80
+ Place BulkActionBar in a fixed host centered near the bottom
81
+ of the viewport. Keep the host outside the table toolbar. Budget any needed
82
+ bottom clearance in the base layout so selecting rows preserves both the table
83
+ position and the scroll height. Use `showSelection={false}` when BulkActionBar displays the count.
84
+ The table still announces selection and can show its result range and pagination.
85
+ When a bordered Surface wraps a flush table, apply `overflow: clip` to that
86
+ frame. Keep horizontal scrolling on the table's own ScrollArea. Verify the
87
+ outline at both lower corners with a visible footer and check keyboard focus at
88
+ the frame's edges.
89
+
90
+ If a detail table's total summarizes its rows, put it in Table's `tfoot`. Use a
91
+ row header for the label and align the amount with the corresponding numeric
92
+ column. The existing footer border separates it from the last item. Use an
93
+ external summary when its scope includes data beyond the table.
94
+
95
+ Give a queue's summaries only the prominence they earn in the task. If a
96
+ count changes which work to pick up, make the relevant scope clear. If the
97
+ table already exposes the decision, compare a quiet inline count with a
98
+ separate metric surface before spending the first viewport on summaries.
99
+
100
+ Classify a collection toolbar control by the thing it changes:
101
+
102
+ | What changes | Owner |
103
+ | --- | --- |
104
+ | One selected value filters the same table | SegmentedControl for a few visible choices, Select when the choices need a compact menu |
105
+ | The current panel and its associated content | Tabs |
106
+ | The current destination | Link |
107
+ | An operation runs | Button |
108
+
109
+ For example, Pending and Reviewed can filter one table even when each state shows
110
+ different columns. Use the installed SegmentedControl when its value model fits.
111
+ Read its component contract before composing the toolbar. Keep one table and
112
+ preserve applicable search and sorting; reset a page or close a detail only when
113
+ the new result invalidates it. Keep focus on the selected control. Exercise arrow
114
+ keys and check that the selected value updates the rows and accessible state.
115
+
64
116
  Protect enough width for the identity and useful summary. Category and recency
65
117
  can read as secondary information near the title; status may stay in a stable
66
118
  trailing position. This is one pattern, not a required arrangement. DataListItem
@@ -81,6 +133,17 @@ instead of suppressing the distinction based only on equal formatted dates.
81
133
 
82
134
  ## Compose collection states deliberately
83
135
 
136
+ Use the `recipe:record-management` material when users need to find a record,
137
+ edit it and continue working through the same list. Keep the applied query,
138
+ filters, ordering, page and scroll with the mounted collection. After saving,
139
+ reapply the current filter to the updated data. If the source row disappears,
140
+ return focus to a surviving list control such as search. In a long list, verify
141
+ the scroll position and focus separately after both Save and Cancel.
142
+
143
+ Keep search and a frequently used filter visible when there is room. Put
144
+ occasional or grouped criteria behind a named Filters action. Show applied
145
+ criteria at the list edge so users can tell why a record is missing.
146
+
84
147
  First-use empty, filtered no-results, loading and read failure are different
85
148
  states. Keep a relevant reset/action and meaningful feedback. A result count can
86
149
  help filtering or pagination; do not automatically add Found: 0 beside an empty
@@ -7,6 +7,8 @@ description: Diagnose Flood spacing, density, nested radii and alignment from re
7
7
 
8
8
  Read the [spacing reference](../spacing.md), installed component anatomy and
9
9
  host content requirements. Existing user-approved geometry governs the task.
10
+ Use the [visible spacing review](../spacing.md#judge-the-space-you-can-see)
11
+ when a rendered relationship feels crowded or loose despite matching tokens.
10
12
 
11
13
  Identify what a gap separates: indicator/text, title/description, related choices,
12
14
  independent actions, sections, or nested surfaces. Do not propagate one gap to
@@ -47,6 +49,44 @@ Distinguish a real component from its preview scene. Fixed preview height and
47
49
  reserved feedback space can prevent a demo from jumping; they should not impose
48
50
  an empty message row or fixed height on every production field.
49
51
 
52
+ ## Establish shared alignment tracks
53
+
54
+ Before composing repeated rows, define the logical start inset, leading glyph
55
+ column, text start and trailing action center. Header, group label, body rows and
56
+ footer that belong to one navigation/record surface must inherit those tracks;
57
+ independent local padding on every row is not a shared grid. Reserve a missing
58
+ icon column when peer rows have icons. Align badges and disclosure controls by
59
+ their centers even when their visible shapes and hit areas differ.
60
+
61
+ Nested content needs a deliberate rule: an iconless child can begin on its
62
+ parent's text track; a deeper hierarchy may have another consistent indent.
63
+ Do not let a child start between the parent icon and label merely because a
64
+ generic padding token happened to fit. Larger brand art is an intentional size
65
+ exception, not permission to move its label off the shared text track.
66
+
67
+ Keep alignment stable when a scrollbar appears. Budget its clearance once at the
68
+ surface owner; use existing edge spacing when it safely contains the track rather
69
+ than adding a permanent empty column to every slot. Sidebar uses that edge lane.
70
+ Generic ScrollArea still needs contentInset="scrollbar" when content would reach
71
+ under its track. Do not disable that protection globally.
72
+ Compare outer start/end clearance against the actual container in both expanded
73
+ and compact states. Center an icon-only rail against the full rail, not the
74
+ remainder after a one-sided gutter. A scrollbar appearing must not shift body
75
+ tracks relative to the fixed header/footer. Full-viewport workspaces without
76
+ document overflow must not reserve a document scrollbar strip.
77
+ For a floating action bar, size its host to the actual count, commands and close
78
+ control. Keep the count slot stable across digit changes and bound the panel to
79
+ the viewport. Measure the clearance below the last row with the panel open.
80
+ Compare scroll height, available content width and table position before and
81
+ after selection. Check a viewport where all rows fit and one where the last
82
+ row needs scrolling. Put required clearance in the base layout so selection
83
+ keeps the same scroll geometry.
84
+ Test expanded/compact, missing icons, badges/disclosures, long labels, RTL and
85
+ enlarged text. Measure rendered glyph centers, text starts and action centers
86
+ across distant rows; include the header and footer. Correct the owning primitive
87
+ or parent track instead of adding per-item offsets, transforms or replacement UI.
88
+ A build, equal row height or zero overflow does not prove these axes align.
89
+
50
90
  ## Evidence
51
91
 
52
92
  Check short/wrapping labels, optional descriptions/messages/actions, all relevant
@@ -60,3 +100,8 @@ remaining copy width and body height after padding, title/description, fixed
60
100
  actions and scrollbar space. A thin scrolling slot or words broken into fragments
61
101
  is a failure even when every rectangle technically fits. Correct the owning
62
102
  container's responsive budget without shrinking the user's enlarged text.
103
+ For settings and detail drawers, measure title-to-description,
104
+ description-to-body, and the pitch between visible controls independently.
105
+ An optional description should sit in the header slot. Separate that group
106
+ from the body with more space than the gap inside it. For repeated switches,
107
+ count their existing hit-area height before adding row gaps.
@@ -11,6 +11,12 @@ rule IDs; it is an index of guidance, not an automatic pass/fail policy engine.
11
11
 
12
12
  ## Bound the coverage
13
13
 
14
+ Run the screen's task trace with real interactions. Check the starting state,
15
+ the accepted result and a relevant refusal or empty result. After rejection,
16
+ verify that the user can find the correction, keep their input and try again.
17
+ After success, inspect the updated data and the next focus target. For read-only
18
+ screens, use a reachable navigation or recovery path where one applies.
19
+
14
20
  Record the affected primitive, its real consumers, supported states and ownership.
15
21
  Mark an inapplicable check with a reason rather than forcing keyboard behavior
16
22
  onto decoration or readOnly onto every control. Distinguish existing test coverage
@@ -36,11 +42,21 @@ visual changes inspect rendered geometry, long/optional content, narrow/wide,
36
42
  enlarged text and the relevant pointer/RTL/forced-color modes. A CSS declaration
37
43
  or component count is not evidence that the user-visible relationship works.
38
44
 
45
+ Check that key controls have usable visible space. For search, read the
46
+ placeholder and enter a realistic query at each relevant layout breakpoint.
47
+ Inspect the field and text area width, including when a clear action appears.
48
+ Check computed layout if a host class changes an existing layout primitive.
49
+
39
50
  For geometry and screenshots, wait for fonts, pending animations and a settled
40
51
  rendering frame. A zero running-animation count alone may precede final
41
52
  presentation. Preserve real motion and strict geometry tolerances; distinguish
42
53
  an entry frame from the final layout rather than accepting either as proof.
43
54
 
55
+ For a spacing or typography decision, keep two settled renders of the same
56
+ state and compare them at the working size. State which visible relationship
57
+ improved and use measurements to explain why. Test enlarged text separately
58
+ from the user's line, paragraph, letter and word spacing overrides.
59
+
44
60
  During local iteration run focused checks and show the result promptly. A shared
45
61
  primitive correction also checks its consumers. At a consolidated Flood source
46
62
  candidate run npm run verify and the required applicable browser matrix; use the
@@ -55,6 +71,10 @@ For record composition, apply the [records workflow](../flood-records/SKILL.md):
55
71
  compare several varied rows, their copy width and scan positions, then review the
56
72
  detail and empty/filter states. Passing an overflow check or presenting valid
57
73
  metadata is not evidence that all those values belong at the same visual level.
74
+ When the same table has a view selector, use the keyboard to change its value.
75
+ Verify the selected state, matching rows, surviving query and focus. Read the
76
+ shell, toolbar, list and opened detail together and record one concrete decision
77
+ about repeated copy or metadata in the verification notes.
58
78
 
59
79
  ## Report a usable result
60
80
 
@@ -24,6 +24,10 @@ Keep the user's language, task and domain vocabulary.
24
24
  | A record is Draft or a camera is Offline inside a prototype | Keep the meaningful record state | Removing prototype narration is not permission to strip operational information |
25
25
  | A mixed production list includes sample records that could be mistaken for real ones | Keep a clear sample distinction on the affected records | It prevents a concrete misunderstanding |
26
26
  | A printed invoice has a document title, number and party headings | Keep the meaningful document hierarchy | A document is not the application's decorative page header |
27
+ | An approval queue has a task title, an instruction to review the queue, and a workspace label that adds no scope | Keep the task title and remove the redundant supporting copy | The title, rows and available decisions already describe the task |
28
+ | The selected filter says “Reviewed 4” and the footer says “1–4 of 4” in an unpaginated list | Keep one count if useful; check both again when search or pagination changes their meaning | A total for all reviewed records and a range in the current results can serve different decisions |
29
+ | The detail pane repeats “3 receipts attached” beside three visible receipt rows | Omit the routine caption; surface a missing receipt when it affects approval | The ordinary state is visible, and the exception changes the decision |
30
+ | The page shows a queue-wide amount and the open record's amount | Keep short labels distinguishing the amounts | Nearby values alone cannot identify their scope |
27
31
 
28
32
  ## Contextual adaptation
29
33
 
@@ -41,6 +41,11 @@ does not open controls or wait for layout on your behalf. It traverses the curre
41
41
  document, not iframes or shadow roots. It performs no network requests or writes.
42
42
  Keep reports local: labels and copy inventories may contain the host's user data.
43
43
 
44
+ For a visual layout change, compare screenshots of the same content, viewport
45
+ and settled state. Name what should stand out and which elements should read
46
+ together. Use measured boxes to explain the difference. The observer cannot
47
+ judge painted glyph edges, perceived contrast or the balance of empty space.
48
+
44
49
  Observations include likely text glyphs used as button icons, unslotted SVGs,
45
50
  passive cells offset from neighbouring input centres and complete cell blocks in
46
51
  record/action rows, supporting copy echoing a visible action label, a copy inventory