docs(wiki): document LayrzStepper's minimum height constraint
LayrzStepper needs roughly 150px of height before it can render a step
body at all, regardless of direction. Names the four irreducible
pieces of fixed chrome that make up that floor — the indicator band,
label line, spacing gap, and Back/Next button row — so the number stays
comprehensible if the underlying tokens change. Cross-references the
showroom's regression test and its deliberately excluded 320x300 case.
5594595
docs(wiki): document LayrzStepper's required direction parameter
The page previously described layout selection as derived from
context.isCompact; it now documents the required LayrzStepperDirection
parameter, adds a section for the enum, includes the migration snippet
for callers who want the old responsive behaviour, and records that the
component needs roughly 150px of height for its own chrome before it can
render a step body.
1d9101b
docs(wiki): add the LayrzStepper page and catalog entries
Adds a new wiki page documenting LayrzStepper's two layouts (full-width
wide header, compact vertical accordion), the icon-vs-state-glyph rule,
tappability including error steps, and accessibility notes. Registers
the page in the sidebar under Menus and Navigation, and adds two
Component-Catalog rows for LayrzStepper and LayrzStepIndicator.
30ec5b3
docs(wiki): document LayrzBottomSheet's new actions slot
- LayrzBottomSheet: document the actions parameter added in d020037 -- a
right-aligned button row pinned as a sibling of the Expanded content (not
nested in its scroll view), never pushed behind the keyboard, and not a
substitute for a close ("X") button. Rewrite the canDismiss section's
no-actions-slot line: the slot now exists, but canDismiss deliberately
does not infer its default from actions the way the dialog does, since a
freeform builder makes actions-presence a weaker signal on the sheet.
Add matching usage examples (an actions row; non-dismissible answered only
through actions) verified against test/sheets/bottom_sheet_actions_test.dart.
- LayrzResponsiveModal: verified against responsive_modal.dart that show()
has no actions parameter and forwards none to either branch. Extend "The
Builder-vs-Slots Limitation" to cover the sheet's new actions slot
symmetrically with the dialog's title/content/actions, rather than leaving
the sheet described as having no slotted shape at all.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
770bea8
docs(wiki): document LayrzBottomSheet canDismiss, fix stale asymmetry note
- LayrzResponsiveModal: canDismiss now forwards to both branches (af002a4
fixed the sheet-branch gap this page previously documented as permanent);
rewrite "The canDismiss Asymmetry" as "The canDismiss Defaulting Asymmetry",
covering the one surviving difference -- an unset canDismiss maps to
actions-inferred on the dialog branch vs. an unconditional true on the
sheet branch, since LayrzBottomSheet.show's parameter is non-nullable.
- LayrzBottomSheet: document the new canDismiss parameter (barrier, Escape,
back gesture, and drag-to-dismiss; composes with isPersistent on a separate
axis); document the real PopScope backing the back gesture, replacing the
previously-inaccurate claim that back-gesture handling already existed;
note the drag handle keeps rendering and resizing when non-dismissible;
note there is no close ("X") button on a sheet by design.
- LayrzBottomSheet: also remove the useRootNavigator parameter and its usage
example/section, which 908d020 deleted before af002a4 landed but this page
had not caught up to -- root-navigator presentation is now intrinsic, same
as the dialog.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
47617d8
docs(wiki): correct slider geometry/bubble, dialog canDismiss rename, modal asymmetry
- LayrzSlider: fix stale 20px/circular-thumb hit-slop numbers to the shipped
36px painted area (28px square thumb, 8px track); document the drag-value
bubble (LayrzSliderValueBubble) that now supplements the static label
instead of the removed "no bubble" scope limit; document state-varying
thumb elevation.
- LayrzDialog: rename barrierDismissible -> canDismiss throughout and
document its broadened four-route contract (barrier, Escape, X icon, back
gesture); document the X close affordance and its non-render when
non-dismissible; remove the deleted useRootNavigator parameter in favor of
documenting the dialog's always-root-navigator behavior; document content's
unbounded-height constraint and its workarounds.
- LayrzResponsiveModal: same canDismiss rename and useRootNavigator removal;
document the canDismiss forwarding asymmetry (dialog branch only, silently
ignored by the sheet branch).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
12aabee
docs(dialogs): add LayrzDialog and LayrzResponsiveModal pages, register sidebar entries
Documents LayrzDialog.show<T>() (title/content/actions slots, the child
escape hatch, the double-pop guard shared with LayrzBottomSheet via
LayrzModalRoute, barrierDismissible defaulting on actions presence, focus
restoration, and the v1 no-stacking rule) and LayrzResponsiveModal.show<T>()
(viewport-driven via context.isCompact, the decide-once non-goal stated
prominently, the two config objects, and the builder-vs-slots limitation).
Registers LayrzDialog and LayrzResponsiveModal under Navigation and
LayrzSlider under Inputs in the sidebar.
ccd6bfc
docs(slider): add LayrzSlider widget page
Documents the new single-value slider control: full API, divisions
quantisation with a worked example, keyboard interaction, D63
exclusion from LayrzInputChrome composition, D15/D7 compliance notes,
and the v1 scope limits (no range variant, no tick marks, no
draggable value bubble).
c83c5bc
fix(input-contract): align composition claim with D63
The "Central Architectural Fact" stated that LayrzTextInput is the
base of the input family and that every other Layrz*Input composes
it internally. D63 (2026-08-23) decided the opposite after that
wrapping pattern produced three shipped defects (dropped errors on
LayrzNumberInput, LayrzSearchInput unable to show an error, duplicated
chrome border). Replace the claim with D63's actual rule — every input
composes its own editing primitive plus LayrzInputChrome directly —
and record D63's exclusion for LayrzCheckboxInput, LayrzSwitchInput,
LayrzRadioInput, and the in-progress LayrzSlider. Also fixes two
downstream restatements of the old claim in the Shared Contract intro
and the Value Display and Formatting section.
15a3357
docs(sheets): add LayrzBottomSheet page, register in sidebar (0.0.14)
LayrzBottomSheet shipped with zero documentation despite being the
most-changed component in 0.0.14 and the mobile/narrow-band presentation
surface for three picker inputs and LayrzScaffoldShell's detail sheet.
Modeled on LayrzAnchoredPanel.md's structure (Overview / API Structure /
Usage Examples / Behavior / Placement in the UI), since both are
static-surface, behaviour-heavy overlay components rather than stateful
widgets with a long constructor.
Documents, read directly from lib/src/sheets/src/bottom_sheet.dart:
- The full show<T>() parameter list, including snapSizes/minSize/maxSize/
showDragHandle/scrollable, none of which were in the release brief.
- Safe area: content inset clear of system bars while the surface stays
edge-to-edge under them, and why SafeArea alone composes with the
keyboard for free (paddingOf collapses to zero under the keyboard,
unlike viewPadding).
- Keyboard shrink-and-pin, inert expansion controls, working drag-to-
dismiss via a separate dismiss-only gesture path, and exact-size restore
on keyboard close -- cross-linked to D65, which LayrzLayout.md also
documents for the same underlying pattern.
- The ModalRoute.isCurrent double-pop guard on every pop site (barrier tap,
Escape, both drag-to-dismiss paths), stated plainly that the unguarded
version silently dismissed the caller's own page in a release build.
- isPersistent's full behavioral matrix (barrier, Escape, double-pop guard,
route semantics -- vs. keyboard handling and drag, which apply to both).
- useRootNavigator, with the same go_router ShellRoute rationale already
on LayrzScaffoldShell.md, cross-linked both ways.
- scrollable: false and the PrimaryScrollController handoff it enables.
Registered in Widgets/_Sidebar.md under Navigation, alphabetically between
LayrzAnchoredPanel and LayrzDropdownMenu -- the closest existing widgets in
kind (anchor/overlay presentation surfaces), matching the sidebar's
alphabetical-within-group ordering.
Cross-linked LayrzScaffoldShell.md's two existing prose mentions of
LayrzBottomSheet to the new page, plus a Related entry.
44e86c6
docs: align wiki with v0.0.14 — dense padding uniform, type scale, sheet nav, keyboard
isCompact no longer varies input chrome padding (D66 follow-up): padding is
now pd2/dense pd1 identically on every viewport, not pd3/pd2 compact vs
pd2/pd1 wide. This obsoleted the 14px-compact/10px-wide split documented
earlier today in Input-Contract.md and 6 chrome-owning input pages
(LayrzTextInput, LayrzTextAreaInput, LayrzSearchInput, LayrzSelectInput,
LayrzDurationInput, LayrzComboBoxInput) -- corrected all of them, and added
the measured flat field heights (43px default / 35px dense) with an explicit
statement of the touch-target trade-off accepted in D66.
Icon size in LayrzInputChrome no longer tracks body.fontSize -- it is now
fixed at 20px. Documented in LayrzTextInput.md's key invariants.
Removed isRequired from LayrzSearchInput.md's shipped-additions table; the
parameter was deleted from the widget (it had no labelText to mark).
Corrected the type scale to the new figures (display 40->30, title 20->18,
body 16->14, label 14->12) in Design-Tokens.md and Theming.md, plus two
call sites that quoted absolute sizes (LayrzLayout.md user block name,
LayrzSelectionToolbar.md text style).
Documented previously-unwritten 0.0.14 behavior:
- LayrzScaffoldShell.md: detail sheet now presents on the root navigator
(fixes selection bleed-through and barrier coverage under go_router
ShellRoute), and DetailPane content is independently selectable in both
presentations.
- LayrzLayout.md: new "Keyboard Handling" section documenting D65 (body and
navigator panel resize for the on-screen keyboard, Scaffold-style).
Left untouched, per the "Reference: Current/ThemedX layrz_theme API"
convention: LayrzNumberInput.md, LayrzTextAreaInput.md's, LayrzSelectInput.md's,
LayrzDurationInput.md's and LayrzComboBoxInput.md's historical mirror tables,
which correctly describe the old Material-based widgets and are unaffected
by this release.
No LayrzBottomSheet.md page exists; its new keyboard/safe-area/barrier
behavior from 0.0.14 is intentionally left undocumented pending a decision
on creating a new sidebar-registered page.
7746646
docs(search): fix stale labelText reference in shipped isRequired doc
LayrzSearchInput.md:122 said isRequired renders the marker next to
labelText, but labelText was removed from the widget's public API
(4cee030). The current parameter is hintText
(search_input.dart:147). Source-verified against current HEAD before
correcting.
690f18e
docs: correct stale padding docs on checkbox/radio and Input-Contract (DESIGN-126)
LayrzCheckboxInput.md and LayrzRadioInput.md still documented a live
`padding` parameter that DESIGN-126 removed with no replacement -- these
widgets have no input chrome, so unlike the 7 chrome-owning inputs they
gained no `dense` either. Their padding is fixed internally at pd2 (10px).
This left the public wiki instructing consumers to write code that will
not compile.
Input-Contract.md carried the same wrong "pd2 (8 logical pixels)" figure
that LayrzTextInput.md had, plus a "Customizable per-field via the
padding parameter" claim that is now false for every chrome-owning input.
Corrected both, added the density table, and stated the checkbox/switch/
radio asymmetry explicitly. Cross-linked D66 throughout.
Left untouched: the "Reference: ThemedXInput API" historical blocks, the
generic sp1-sp5 spacing-scale prose (separate, already-tracked doc rot in
spacing.dart itself), and the unrelated r2/8px radius mentions.
60c1d52
docs(inputs): document dense parameter (DESIGN-126, BREAKING), fix pd2/8px error
Documents the new `bool dense` parameter (default false) on the 7
chrome-owning inputs -- LayrzTextInput, LayrzTextAreaInput, LayrzSearchInput,
LayrzNumberInput, LayrzSelectInput, LayrzDurationInput, LayrzComboBoxInput --
and the removal of the public `padding` parameter they previously exposed
(D66).
Also corrects a pre-existing documentation defect independent of this
change: LayrzTextInput.md stated padding "defaults to pd2 (8 logical
pixels)". Both figures were wrong -- pd2 is 10px, and the compact default
was never pd2 at all, it is pd3/14px. Verified against
lib/src/tokens/src/spacing.dart (sp1=6, sp2=10, sp3=14) and did not carry
the 8px figure into any dense documentation.
Left untouched: the "Reference: Current layrz_theme API" / historical
sections on each page (old ThemedXInput padding is real, unrelated to
this row), and unrelated `inputPadding` on LayrzSearchInput.
1527a58
docs: document the v0.0.13 picker-input changes
Update LayrzSelectInput, LayrzComboBoxInput, and LayrzDurationInput wiki
pages to match the behaviour shipping in v0.0.13: the elevated-panel
redesign, the removed combobox confirmation row, panel width/dismissal
changes on duration input, and the error-footer label-gating fix shared
by select and combobox.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y2CdNZfLDUJjYDWQ9Sfnmk
1bbf0cd
docs(select): document LayrzSelectItem's reduction to value/child/searchableStrings (BREAKING, DESIGN-142)
- labelText is gone; child is now required as the item's only presentation,
rendered in the field itself while idle as well as in the surface's list.
- searchableAttributes renamed searchableStrings, now the sole search key.
- Documents the RichText-vs-Text.rich trap (RichText does not inherit
DefaultTextStyle, so a child built with it renders with no forced color).
- Documents the radio accessibility migration note: an icon-only child now
announces with no label unless it supplies its own Semantics(label:).
f25e9af
docs(select): correct the chrome-tap note -- LayrzTappable fallback restores full-chrome tap
The field-as-searcher redesign initially narrowed the tappable area to the
field's own text (matching LayrzComboBoxInput). A transparent LayrzTappable
fallback around the chrome region restores tapping anywhere in the chrome,
matching pre-redesign behavior, without disturbing text selection/drag/long-press.
af5ae34
docs(select): document the field-as-searcher redesign (BREAKING)
Documents the field-as-searcher change: the field is now the searcher when
enableSearch is true, self-displays from internal state on both enableSearch
values, the dropdown chevron moved to an external sibling, and
LayrzInputChrome.readOnly is now always false. Corrects the now-stale
readOnly/SDK-primitive/conformance claims left over from before this change.
2cadfe6
docs: document LayrzDurationInput's external clock affordance icon (duration-external-affordance)
5045c9b
docs: remove maxOptionsToDisplay, document the fixed 300px overlay height and the onChanged/onSubmit selection-callback split (DESIGN-35)
ff72bec
docs: correct LayrzSelectInput height rule and focus wiring (DESIGN-40/144)
Adds a "Shipped behavior" section documenting the actual desktop/mobile
selection surface height rule (height = min(content, 300), scroll past 300,
enforced once via LayrzAnchoredPanel.maxHeight) and the focusNode wiring
(Focus(focusNode: ...) on both platforms, plus childFocusNode on the desktop
anchored panel). Flags the remainder of the page as a pre-implementation
design sketch that predates the shipped API and still needs a full
documentation pass -- out of scope for this fix.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CbPdzx9WGe9ch9N2hb4KrZ
4170d1b
docs: correct LayrzScaffoldShell narrow-band sheet description
The narrow band's detail sheet was described as full-height and
drag-down-to-dismiss; it actually opens at half the screen (per
LayrzBottomSheet's own defaults) and dismisses by dragging the handle
past the 50% snap point, not by any drag-down gesture.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CbPdzx9WGe9ch9N2hb4KrZ
fa7a285
docs: document LayrzSearchInput.preferredSide (DESIGN-143)
6bf12db
docs: document preferredSide, cross-axis alignment, and width clamp on LayrzAnchoredPanel
9083988
docs: rename LayrzTooltipPosition to LayrzPreferredSide
The tooltip's four-value side vocabulary moves to a new shared
package-level type, LayrzPreferredSide, also consumed by
LayrzAnchoredPanel. Same four values, same semantics.
6a6a0a7
docs: require container: true on caller-supplied slot Semantics
Closes the gap where following the 'pass a real, focusable, labelled
widget' advice for prefix:/suffix: could recreate the DESIGN-148 defect
if the caller's Semantics node lacked container: true and merged onto
the field's own semantics node.
88e6297
docs: document prefix/suffix slot semantics contract
Adds a Semantics subsection under Prefix and Suffix: the four-category
accounting (decorative / merged-into-name / pointer-only / caller's own
responsibility), why the callback forms are pointer-only today, and the
"pass a real focusable widget instead" contract that already works.
Cross-links D64.
DESIGN-148
fa2e3b2
LayrzSearchInput: document errors, isRequired, help text and readOnly
These five parameters did not exist on the widget before DESIGN-142 -- it
could not display an error at all. Also documents that the clear affordance
now appears while typing; it previously appeared only when the field was
seeded with an initial value, because nothing listened to the controller.
5052681
docs(scaffold-shell): update narrow band to use modal bottom sheet instead of back affordance
- List pane always visible on narrow (sm/xs) breakpoints
- Detail presented in modal LayrzBottomSheet (50% initialSize, snaps [0.5, 0.95], maxSize 95%)
- Selection persists across breakpoint crossing
- Navigator ancestor required (debug assert if missing)
- Sheet not customizable; uses LayrzBottomSheet defaults
- Lifting DESIGN-62 deferral per DESIGN-140
Last updated 2026-08-23
5be5013
docs: add LayrzAnchoredPanel widget documentation
- Add LayrzAnchoredPanel.md with API structure, usage examples, and behavior documentation
- Register component in Widgets/_Sidebar.md under Navigation section
- Document width policies (matchAnchor and contentSized), positioning logic, and keyboard/a11y support
- Distinguish from LayrzDropdownMenu with comparison table and placement guidance
fdcdb91