@gridui/grid 2.3.6 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,91 @@
1
+ # Dashboard frames
2
+
3
+ `DashboardFrame` is a full-height, full-width page host with inline gutters and
4
+ structural edges. Unlike `PageFrame`, it renders no `main`; the composed workspace
5
+ owns that landmark. Give its parent a definite height. Four independent CVA
6
+ variants configure its logical start and end gutters:
7
+
8
+ | Prop | Applies to | Default |
9
+ | --- | --- | --- |
10
+ | `startSize` | Start gutter from 40rem | `medium` |
11
+ | `endSize` | End gutter from 40rem | `medium` |
12
+ | `compactStartSize` | Start gutter below 40rem | `small` |
13
+ | `compactEndSize` | End gutter below 40rem | `small` |
14
+
15
+ Every option accepts `none`, `small`, `medium`, or `large`. `none` is exactly 0px;
16
+ the other options use spacing tokens 8, 16, and 24. Start/end mean left/right in LTR and right/left in RTL. Configure both
17
+ wide-screen options for symmetric gutters; compact defaults remain independent.
18
+ The breakpoint is viewport-based, like the other Grid frame styles. Nonzero size
19
+ options retain at least the theme hover/focus outline extent, even when spacing
20
+ tokens are reduced. `none` bypasses that minimum and disables ornaments on that
21
+ edge; the structural border remains. `DashboardFrameSize` exports the common size
22
+ type.
23
+
24
+ ## Composed frame regions
25
+
26
+ `FrameRegion` declares which physical frame edge a composition touches through
27
+ `edge="left" | "right" | "both" | "none"` (default `none`). It does not change
28
+ its host's layout. Use `asChild` to retain a semantic element. Grid resolves the
29
+ adjacent gutter and structural-border distances; consumers do not calculate
30
+ negative offsets or read frame capacity variables. Nested regions start with no
31
+ outer-frame capacity unless a new `DashboardFrame` establishes it.
32
+
33
+ `FrameRegionRow` is a grid canvas within that region. It extends through the
34
+ selected outer gutter and owns these public grid lines:
35
+
36
+ | Lines | Purpose |
37
+ | --- | --- |
38
+ | `frame-left / frame-right` (or `1 / -1`) | Entire canvas, including the gutter |
39
+ | `surface-left / surface-right` | Original composition surface |
40
+ | `content-left / content-right` | Default child content column |
41
+ | `accessory-left / surface-right` | Intrinsic column at the physical right edge |
42
+
43
+ `contentInset` accepts a CSS length or pixel number (default 0). It reserves a
44
+ right content inset before the accessory column and any left inset that the
45
+ outer gutter cannot supply. An accessory such as a scrollbar sizes its column
46
+ intrinsically. Row text keeps its inherited direction; physical line names and
47
+ accessory placement stay stable in RTL. Rows support `asChild`, including a
48
+ scroll-area root, and nested CSS subgrids can reuse these lines.
49
+
50
+ `FrameBoundary extent="frame"` spans the full row. Its default `"content"`
51
+ uses the content column. These are normal-flow grid spans, not translated
52
+ pseudo-elements. Sidebar composes these primitives for fixed and scrolling
53
+ boundaries and uses an unframed region for its Drawer and main content.
54
+
55
+ `Split order="physical"` keeps row/row-reverse ordering and seams at the same
56
+ physical edges in RTL; its default `"logical"` follows writing direction.
57
+ Column ordering is unaffected. Sidebar uses physical ordering because its
58
+ `side="left" | "right"` API describes physical positions.
59
+
60
+ `decoration` accepts `none` (default), `nodes`, `marks`, `corners`, or `ticks`
61
+ and supplies the default for both edges. `startDecoration` and `endDecoration`
62
+ accept the same styles and override only their logical edge; an explicit `none`
63
+ hides that edge's ornament without changing its gutter width or structural border.
64
+ Omitted overrides inherit `decoration`. Start/end follow the same LTR/RTL mapping
65
+ as the size options. Both sides still hide their ornaments below 40rem.
66
+ Dashboard and Landing frames use the same package-local single-edge decoration
67
+ renderer and styles. Each ornament paints only its own edge; zero-width gutters
68
+ produce a zero-width ornament. Dashboard constrains their outsets to its gutter width and viewport
69
+ height, including small, asymmetric gutters; it hides ornaments below 40rem while preserving
70
+ outline clearance. Decorations are inert and never intercept pointer events.
71
+
72
+ It owns no navigation, collapse state, scroll region, or application header.
73
+
74
+ ```tsx
75
+ <DashboardFrame
76
+ startSize="large"
77
+ endSize="small"
78
+ compactStartSize="small"
79
+ compactEndSize="medium"
80
+ decoration="ticks"
81
+ endDecoration="corners"
82
+ >
83
+ <SidebarLayout>
84
+ <Sidebar>{navigation}</Sidebar>
85
+ <SidebarMain>{content}</SidebarMain>
86
+ </SidebarLayout>
87
+ </DashboardFrame>
88
+ ```
89
+
90
+ Import `DashboardFrame` from `@gridui/grid`; Sidebar components belong to
91
+ `@gridui/sidebar`. Sidebar and main scroll independently inside the fixed frame.
@@ -0,0 +1,126 @@
1
+ # Grid and responsive tracks
2
+
3
+ Theme's `src/tokens.css`, loaded through `@gridui/theme/styles.css`, owns spacing, content widths, and semantic
4
+ colors. Spacing values are `0 / 4 / 8 / 16 / 24 / 32 / 48 / 64`, expressed in rem
5
+ except zero. The page gutter is 16 at the base breakpoint and 24 from 40rem.
6
+ Sites may override tokens at their root; components do not add external margins.
7
+
8
+ `@gridui/grid` exports grid primitives and page frame components;
9
+ its `styles.css` is a separate explicit export. Follow the shared
10
+ [stylesheet integration order](https://github.com/sudo-ui/GridUI-React-Monorepo/blob/main/docs/usage/integration.md). Geometry
11
+ uses owned component CSS alongside generated utility classes. Class composition
12
+ uses clsx and tailwind-merge;
13
+ container width and grid framing use typed CVA variants.
14
+
15
+ - `Container` defines `full-start`, `content-start`, `content-end`, and
16
+ `full-end` lines. Direct children align to content by default; a direct child
17
+ with `data-width="full"` spans the whole container. Its `width` selects
18
+ `narrow` (48rem), `standard` (72rem), or `wide` (90rem).
19
+ - `Grid` owns columns and gap. Supported column counts are 1, 2, 3, 4, 6, and
20
+ 12. A nonempty track array combines `"1fr"` and `"auto"` tracks, for example
21
+ `["1fr", "1fr", "1fr", "1fr", "auto"]` for four equal fields and an
22
+ automatic-width action. Counts and track arrays support the same responsive
23
+ breakpoints. The default is one column with gap 16. `frame="all"` draws the outer perimeter and shared
24
+ cell boundaries, sets gap to zero, and disallows a gap prop. Its direct
25
+ children must be `GridItem` components. `frame="internal"` also disallows
26
+ a gap prop but draws internal seams with a 1px gap and the grid's border-color
27
+ background, without an outer perimeter. Its `GridItem` children have an opaque `--gridui-background` surface;
28
+ consumer background styles can override it. It does not clip content or
29
+ interaction outlines and needs no selectors that assume item order or spans.
30
+ Hovered items paint above ordinary neighbors. Items with visible focus on
31
+ themselves or a descendant paint above hovered items; retained pointer focus
32
+ alone does not raise an item. This priority uses the existing local content
33
+ and interaction layers, independently of selection state. Frame surfaces
34
+ containing an active internal grid paint above frame boundaries. Keep rows filled, using
35
+ spans where appropriate: unoccupied cells expose the grid's border-color
36
+ background. Menus continue to use portals for viewport positioning.
37
+ Optional `fillLastRow` expands the final item in each incomplete row, including
38
+ a row preceding a full-width item. It plans spans for every breakpoint from
39
+ rendered direct `GridItem` children, excluding null children. It requires
40
+ direct items with valid spans; wrappers whose rendered spans are unknown are
41
+ rejected. No browser measurement or business item-count calculation is needed.
42
+ Explicit item style overrides still take precedence.
43
+ - `Grid columns="auto"` selects adaptive, unframed tracks. Required `minItemWidth`
44
+ accepts a positive number in pixels or a CSS length such as `"14rem"`, including
45
+ responsive values. The template uses `auto-fit` and caps its minimum at 100%
46
+ of the available space, so a narrow container never needs a wider track.
47
+ Gap retains its usual responsive behavior. Fixed/adaptive planning modes cannot
48
+ be mixed at breakpoints; change the adaptive minimum width instead.
49
+ Adaptive columns do not support `frame="all"`, `frame="internal"`, or
50
+ `fillLastRow`: their track count is resolved by CSS, without measuring in JS.
51
+ - `Grid asChild` merges its geometry, classes, styles, native props, handlers,
52
+ and refs onto one prop-forwarding child through Radix Slot. Use native `ul` or
53
+ `ol` roots with `GridItem asChild` and `li` children to retain list semantics.
54
+ Place host-specific attributes and refs on the child. Child styles take
55
+ precedence; child handlers run before Grid handlers. This does not introduce
56
+ cancellation or routing behavior. `asChild` cannot be combined with
57
+ `fillLastRow`, whose span planner requires direct React GridItem children.
58
+ Unsupported combinations fail at the type boundary and throw for JS callers.
59
+ - `GridItem asChild` applies its geometry, native props, and merged refs to its
60
+ single child through Radix Slot. This supports interactive cells such as
61
+ SortableItem without adding a DOM layer. Keep GridItem as the direct React
62
+ child when using `fillLastRow`; the child must forward props and refs to its
63
+ root element. Grid does not own or import the child's interaction behavior.
64
+ - `GridItem` owns its column span and internal padding. Span defaults to 1,
65
+ padding to 0. `span="full"` spans the explicitly defined columns. Numeric
66
+ spans must not exceed the parent column count at any breakpoint, or CSS
67
+ Grid will create implicit columns.
68
+ - `Stack` owns vertical gap (default 16), without adding external margins
69
+ or changing the margins of children. Consumers own text resets.
70
+
71
+ Responsive props accept a scalar or `{ base, sm?, md?, lg? }`. `sm` starts at
72
+ 40rem, `md` at 48rem, and `lg` at 64rem. Missing values inherit from the preceding breakpoint.
73
+ Import the shared `Space`, `Responsive<T>`, `resolveResponsive`, `spaceValue`,
74
+ and `spacingVariables` from `@gridui/style-utils/responsive`. Grid exports its
75
+ geometry types (`Columns`, `GridColumns`, `GridTrack`, and `Span`) and components.
76
+ Columns, spans, gap, and padding are resolved through CSS, with no viewport
77
+ JavaScript. Grid and GridItem render divs by default; use their `asChild` prop
78
+ when retaining a semantic host. Other primitives follow their documented native
79
+ hosts. Components forward native props, styles, and refs.
80
+
81
+ ```tsx
82
+ <Container>
83
+ <div data-width="full" className="site-rule" />
84
+ <Grid columns={{ base: 1, sm: 4 }} frame="all">
85
+ <GridItem span={{ base: 1, sm: 3 }} padding={{ base: 16, sm: 24 }}>
86
+ <Stack gap={16}>...</Stack>
87
+ </GridItem>
88
+ <GridItem padding={16}>...</GridItem>
89
+ </Grid>
90
+ </Container>
91
+ ```
92
+
93
+
94
+ ## Adaptive native lists
95
+
96
+ ```tsx
97
+ <Grid asChild columns="auto" minItemWidth="14rem" gap={16}>
98
+ <ul aria-label="Resources" className="m-0 list-none p-0">
99
+ {resources.map((resource) => (
100
+ <GridItem key={resource.href} asChild padding={16}>
101
+ <li><a href={resource.href}>{resource.label}</a></li>
102
+ </GridItem>
103
+ ))}
104
+ </ul>
105
+ </Grid>
106
+ ```
107
+
108
+ The server output already contains the native list and CSS track plan. No
109
+ hydration or viewport measurement is needed. `auto-fit` collapses unused tracks;
110
+ this is distinct from filling the last row of a fixed-column plan. Adaptive
111
+ items normally use the default span of one. Explicit numeric spans must fit the
112
+ number of tracks available in their container or CSS can create implicit tracks.
113
+ The application owns list markers/margins, labels, links, and data.
114
+
115
+ ## Segmented filter bars
116
+
117
+ Keep framed filter cells stretched to the same row height so seams remain
118
+ continuous. Bottom-align their contents with `flex flex-col justify-end` on
119
+ `GridItem`; do not bottom-align the grid items themselves. Fields keep their
120
+ full available width. This aligns controls and action rows when labels wrap.
121
+ Use equal fractional tracks for fields and an automatic track for actions,
122
+ stacking or spanning the action cell at smaller breakpoints.
123
+
124
+ Within a table cell, pair primary content and a trailing action with a full-width
125
+ flex row, centered cross-axis alignment, `justify-between`, and a spacing-token
126
+ gap. Keep icon actions non-shrinking and retain the cell's existing padding.
@@ -0,0 +1,137 @@
1
+ # Page frames
2
+
3
+ Named areas such as `filters`, `results`, or `methodology` belong in site CSS,
4
+ where their responsive order can be defined. The shared package owns geometry
5
+ and never imports or names business regions. The page shell is shared rather
6
+ than implemented in website CSS:
7
+
8
+ - `PageFrame` takes optional `header` and `footer` slots, a content width, and any number
9
+ of sections as children. It renders one main landmark and a flexible framed
10
+ filler inside main before the footer. Main fills the remaining page height.
11
+ Short pages fill at least 100svh without stretching
12
+ content sections. On longer pages the filler shrinks to zero.
13
+ - `FrameHeader` and `FrameFooter` render native landmarks with a full-width
14
+ boundary and an aligned inner region. Their padding defaults to 16 at base
15
+ and 24 at md/lg; `padding` accepts the same responsive values as GridItem.
16
+ Chrome children wrap instead of overflowing narrow screens. `FrameHeader`
17
+ defaults to `justify="between"`; use `justify="start"` for an adjacent brand
18
+ and navigation row. `FrameFooter` defaults to `contentLayout="flex"`; use
19
+ `contentLayout="block"` when its children own their internal layout.
20
+ Its `signatureAppearance="cropped"` selects the cropped signature treatment
21
+ through a public prop; the default is `standard`.
22
+ - `FrameSection` renders a semantic section, full-width leading boundary, and
23
+ aligned vertical edges. Compose it with `Grid frame="internal"` so the
24
+ section owns the outer borders and the grid owns internal seams.
25
+ `paddingInline` and `paddingBlock` accept responsive spacing tokens and default
26
+ to zero. They pad the inner content surface without moving its leading boundary
27
+ or inline edges. Use these props instead of targeting private frame elements.
28
+ - `FrameSections` groups sections from a dynamic React view and forwards native
29
+ div props. It inherits page tracks without adding a landmark. The shared
30
+ stylesheet supports React section groups. Framework host elements require an
31
+ application-owned adapter; see the [Astro migration example](https://github.com/sudo-ui/GridUI-React-Monorepo/blob/main/docs/usage/framework-adapters.md).
32
+
33
+ Keep inline-size containment, including `container-type: inline-size`, off roots
34
+ that propagate the frame's column subgrid. Applying it to `FrameSections` or a
35
+ `FrameSection` breaks inherited track sizing. Put query containers on
36
+ application-owned content wrappers inside the section instead; tune Grid tracks
37
+ with the public responsive props. See
38
+ [narrative pages and artwork](https://github.com/sudo-ui/GridUI-React-Monorepo/blob/main/docs/usage/narrative-pages.md#keep-query-containers-inside-the-frame)
39
+ for a complete composition and the corresponding browser fixture.
40
+
41
+ `FrameRail` supplies the narrow surface and forwards native div props, including
42
+ accessible labels or `aria-hidden` for decorative content. Its default
43
+ `placement="start"` keeps content at the top. Callers own text direction and
44
+ control layout; the shared rail does not force vertical text.
45
+ `placement="sticky-bottom"` places content at the natural bottom and uses CSS
46
+ sticky with a viewport-bottom inset and safe-area allowance. The control stays
47
+ inside its group's bounds. The rail does not clip focus outlines or create a
48
+ scroll container.
49
+
50
+ `FrameRailGroup` scopes a rail to consecutive children. Multiple sibling groups
51
+ describe disjoint ranges without adding landmarks, querying positions, or
52
+ measuring heights. Each group defines gutter, rail, and content columns once.
53
+ The rail track is a normal-flow grid item beside the content column, spanning
54
+ the group's body row. The body uses column subgrid so sections inherit the same
55
+ tracks, including full-width boundaries that cross the rail and both gutters.
56
+ Boundary layers paint above the rail surface; controls retain native focus.
57
+
58
+ `PageFrame` accepts the same `rail` and `railWidth` props. Its default
59
+ `railScope="page"` covers header through footer. `railScope="main"` covers main's
60
+ content and filler, excluding header and footer. Page rows allocate natural
61
+ header/footer heights and remaining space to main. Main separates natural-height
62
+ sections from a flexible filler, which collapses to zero on long pages.
63
+ No viewport/chrome measurements are needed. A main without a rail does not add a
64
+ second rail group. Choose a page or main rail, or local section groups; do not
65
+ nest rail-bearing groups. Group width comes from the surrounding frame, falling
66
+ back to the standard content width.
67
+
68
+ `railWidth` accepts responsive spacing tokens and defaults to `{ base: 0, sm: 32 }`.
69
+ Zero hides the rail, including its contents, and reserves no space. Missing
70
+ breakpoints inherit. The rail column sits inside the existing content boundary,
71
+ reducing content width while retaining outer gutters, right alignment, full-width
72
+ bands, and exterior marks. Column subgrid is part of the modern CSS baseline for
73
+ the frame. No hydration or measurement is required. FrameRail owns surface and
74
+ placement; the group owns width and range.
75
+ `--gridui-page-gutter-start` optionally overrides only the start gutter; the end
76
+ gutter continues to use `--gridui-page-gutter`. Sites can make small-screen rails
77
+ flush with the viewport without changing header/footer gutters.
78
+
79
+ ```tsx
80
+ <PageFrame header={header} footer={footer}>
81
+ <FrameRailGroup
82
+ rail={<FrameRail><span className="site-vertical-label">Research</span></FrameRail>}
83
+ railWidth={{ base: 0, sm: 24, lg: 32 }}
84
+ >
85
+ <FrameSection>Overview</FrameSection>
86
+ <FrameSection>Resources</FrameSection>
87
+ </FrameRailGroup>
88
+ <FrameSection>Outside the rail range</FrameSection>
89
+ </PageFrame>
90
+ ```
91
+
92
+ `FrameBoundary` is a public primitive from `@gridui/grid`. It accepts `boundary`
93
+ (default `line`), native div props and a ref; it has no children. Its CVA variants
94
+ own only appearance and normal-flow height. Parent layouts choose its width and
95
+ Grid span. It is inert, hidden from assistive technology and pointer-transparent.
96
+ Landing sections and Sidebar regions use this same renderer; no package-private
97
+ imports or duplicate line implementations are needed.
98
+
99
+ Standalone and nested boundaries use the current palette's border color.
100
+ Only a section or footer's direct leading boundary applies the adjacent-region
101
+ seam color. This keeps section transitions from recoloring internal dividers.
102
+
103
+ Each section and footer own their leading boundary through FrameBoundary. A line
104
+ uses one top rule; a band adds its tint and bottom rule in normal flow. A stripe
105
+ uses the same band height and rules with a repeating brand-colored diagonal pattern.
106
+ Space reserves `--gridui-boundary-space-size` (2.5rem) without a rule or fill; none
107
+ renders no boundary and reserves no space. These choices do not change content
108
+ padding or inline edges. Stripe and space default to no decoration. The header
109
+ has no trailing rule. The filler paints a top rule only when it has visible
110
+ height, so a collapsed filler contributes no extra seam. No negative margin,
111
+ rail-bottom correction, or last-section selector is needed. Vertical edges stay
112
+ with each content surface. Websites own copy, semantic heading levels, and
113
+ responsive column/span choices. The frame owns alignment, chrome padding,
114
+ boundaries, and footer placement.
115
+
116
+ `src/shared/page.css` owns page rows, subgrid propagation, and remaining height.
117
+ `src/shared/rail.css` owns rail tracks, surfaces, and sticky placement. Boundary,
118
+ decoration, and texture keep their own styles. The public stylesheet imports
119
+ these owners; sites do not depend on private paths.
120
+
121
+ ```tsx
122
+ <PageFrame
123
+ header={<FrameHeader>Site name</FrameHeader>}
124
+ footer={<FrameFooter>Source notes</FrameFooter>}
125
+ >
126
+ <FrameSection aria-label="Overview">
127
+ <Grid columns={{ base: 1, sm: 2 }} frame="internal">
128
+ <GridItem padding={{ base: 16, sm: 24 }}>...</GridItem>
129
+ <GridItem padding={{ base: 16, sm: 24 }}>...</GridItem>
130
+ </Grid>
131
+ </FrameSection>
132
+ </PageFrame>
133
+ ```
134
+
135
+ SSR tests cover breakpoint inheritance, prop forwarding, framed gaps, and
136
+ class overrides. Browser checks must confirm actual alignment and reflow;
137
+ serialized styles alone do not prove the grid works.
@@ -0,0 +1,49 @@
1
+ # Split and linear regions
2
+
3
+ Import `Split`, `SplitProps`, and `SplitDirection` from `@gridui/grid`.
4
+ Split renders one div and lays out its direct children as a single flex sequence.
5
+ It does not wrap the sequence or add wrappers around individual children.
6
+ Use direct child region elements such as `section`, `nav`, or `div`; place
7
+ buttons, inputs, tables, and other components with functional borders inside
8
+ those regions. Split owns region edge styles and must not be applied directly
9
+ to those components' bordered roots. Split resets the structural borders of
10
+ following direct regions before assigning the owned seam. A direct region must
11
+ therefore not rely on its own border for control appearance.
12
+
13
+ Each structural edge has one owner. The enclosing frame owns the outer perimeter;
14
+ Split owns the boundary between regions; a nested Grid uses `frame="internal"`
15
+ for its own cell seams. A standalone Grid uses `frame="all"`. Do not place a Grid
16
+ with `frame="all"` flush inside another frame or directly on a Split-owned edge.
17
+ Keep a bordered input, button, or standalone table inside a region with spacing;
18
+ its functional border is independent and must not be removed globally.
19
+
20
+ | Prop | Values | Default |
21
+ | --- | --- | --- |
22
+ | `direction` | `row`, `column`, `row-reverse`, `column-reverse`, or responsive values | `row` |
23
+ | `seam` | `line`, `none`, or responsive values | `line` |
24
+
25
+ Both use `{ base, sm?, md?, lg? }` with 40rem, 48rem, and 64rem breakpoints and preceding-value
26
+ fallback. A line is one logical edge between visible sibling regions, without
27
+ an outer frame. Reversed directions move the seam to the corresponding edge;
28
+ they change visual order, not DOM, reading, or keyboard order. Regions with the
29
+ native `hidden` attribute do not contribute seams. CSS-only responsive hiding
30
+ is not detectable by sibling selectors: when only one region remains visible,
31
+ set the owning Split to `seam={{ base: "none", lg: "line" }}` (using the same
32
+ breakpoint as visibility). Keep the DOM order meaningful.
33
+
34
+ ```tsx
35
+ import { Split } from "@gridui/grid";
36
+
37
+ <Split
38
+ direction={{ base: "column", sm: "row" }}
39
+ seam={{ base: "none", sm: "line" }}
40
+ >
41
+ <section aria-label="Overview">...</section>
42
+ <section aria-label="Details">...</section>
43
+ </Split>
44
+ ```
45
+
46
+ Children control their content size and flex sizing; Split does not assign equal
47
+ widths. Use Grid/GridItem for two-dimensional tracks or wrapping rows. A parent
48
+ frame supplies outer edges. Layout compositions choose these primitives instead
49
+ of drawing duplicate seams.
@@ -0,0 +1,21 @@
1
+ <!-- Generated by pnpm docs:storybook. -->
2
+ # Component reference
3
+
4
+ - [Container](container.md)
5
+ - [DashboardFrame](dashboard-frame.md)
6
+ - [FrameBoundary](frame-boundary.md)
7
+ - [FrameFooter](frame-footer.md)
8
+ - [FrameHeader](frame-header.md)
9
+ - [FrameRail](frame-rail.md)
10
+ - [FrameRailGroup](frame-rail-group.md)
11
+ - [FrameRegion](frame-region.md)
12
+ - [FrameRegionRow](frame-region-row.md)
13
+ - [FrameSection](frame-section.md)
14
+ - [FrameSections](frame-sections.md)
15
+ - [FrameTexture](frame-texture.md)
16
+ - [Grid](grid.md)
17
+ - [GridItem](grid-item.md)
18
+ - [PageFrame](page-frame.md)
19
+ - [Row](row.md)
20
+ - [Split](split.md)
21
+ - [Stack](stack.md)
@@ -0,0 +1,63 @@
1
+ <!-- Generated from public Props and owned stories. Run pnpm docs:storybook. -->
2
+ # Container
3
+
4
+ Constrains and aligns a content region. Use it to keep page content within a consistent width.
5
+
6
+ Import from ``@gridui/grid`` and load Theme before this family's stylesheet.
7
+
8
+ ```tsx
9
+ import { Container } from "@gridui/grid";
10
+ import "@gridui/theme/styles.css";
11
+ import "@gridui/grid/styles.css";
12
+ ```
13
+
14
+ Read the [package contract](https://github.com/sudo-ui/GridUI-React-Monorepo/blob/main/packages-layout/grid/README.md) for shared behavior and stylesheet dependencies.
15
+
16
+ The [working composition](https://github.com/sudo-ui/GridUI-React-Monorepo/blob/main/packages-layout/grid/stories/container.stories.tsx) demonstrates required context, state, and related components. Use View code in Storybook to inspect the actual implementation.
17
+
18
+ ## API
19
+
20
+ The public Props type is the source of these signatures. Defaults below are explicit implementation defaults; story presets are separate. Native attributes remain available through the exported Props type.
21
+
22
+ ### children
23
+
24
+ ``ReactNode`` · Optional
25
+
26
+ Content rendered inside the component.
27
+
28
+ ### onFocus
29
+
30
+ ``(event: FocusEvent<HTMLDivElement, Element>): void`` · Optional
31
+
32
+ Called when the corresponding interaction occurs; inspect the arguments in Actions.
33
+
34
+ ### onBlur
35
+
36
+ ``(event: FocusEvent<HTMLDivElement, Element>): void`` · Optional
37
+
38
+ Called when the corresponding interaction occurs; inspect the arguments in Actions.
39
+
40
+ ### onChange
41
+
42
+ ``(event: ChangeEvent<HTMLDivElement, Element>): void`` · Optional
43
+
44
+ Called when the corresponding interaction occurs; inspect the arguments in Actions.
45
+
46
+ ### onSubmit
47
+
48
+ ``(event: SubmitEvent<HTMLDivElement>): void`` · Optional
49
+
50
+ Called when the corresponding interaction occurs; inspect the arguments in Actions.
51
+
52
+ ### onClick
53
+
54
+ ``(event: MouseEvent<HTMLDivElement, MouseEvent>): void`` · Optional
55
+
56
+ Called when the corresponding interaction occurs; inspect the arguments in Actions.
57
+
58
+ ### width
59
+
60
+ ``ContainerWidth | undefined`` · Optional
61
+
62
+ Default: ``"standard"``
63
+
@@ -0,0 +1,99 @@
1
+ <!-- Generated from public Props and owned stories. Run pnpm docs:storybook. -->
2
+ # DashboardFrame
3
+
4
+ Public DashboardFrame component from @gridui/grid. See the package guide for its composition contract.
5
+
6
+ Import from ``@gridui/grid`` and load Theme before this family's stylesheet.
7
+
8
+ ```tsx
9
+ import { DashboardFrame } from "@gridui/grid";
10
+ import "@gridui/theme/styles.css";
11
+ import "@gridui/grid/styles.css";
12
+ ```
13
+
14
+ Read the [package contract](https://github.com/sudo-ui/GridUI-React-Monorepo/blob/main/packages-layout/grid/README.md) for shared behavior and stylesheet dependencies.
15
+
16
+ The [working composition](https://github.com/sudo-ui/GridUI-React-Monorepo/blob/main/storybook/scenarios/layout/dashboard-frame.stories.tsx) demonstrates required context, state, and related components. Use View code in Storybook to inspect the actual implementation.
17
+
18
+ ## API
19
+
20
+ The public Props type is the source of these signatures. Defaults below are explicit implementation defaults; story presets are separate. Native attributes remain available through the exported Props type.
21
+
22
+ ### children
23
+
24
+ ``ReactNode`` · Optional
25
+
26
+ Content rendered inside the component.
27
+
28
+ ### onFocus
29
+
30
+ ``(event: FocusEvent<HTMLDivElement, Element>): void`` · Optional
31
+
32
+ Called when the corresponding interaction occurs; inspect the arguments in Actions.
33
+
34
+ ### onBlur
35
+
36
+ ``(event: FocusEvent<HTMLDivElement, Element>): void`` · Optional
37
+
38
+ Called when the corresponding interaction occurs; inspect the arguments in Actions.
39
+
40
+ ### onChange
41
+
42
+ ``(event: ChangeEvent<HTMLDivElement, Element>): void`` · Optional
43
+
44
+ Called when the corresponding interaction occurs; inspect the arguments in Actions.
45
+
46
+ ### onSubmit
47
+
48
+ ``(event: SubmitEvent<HTMLDivElement>): void`` · Optional
49
+
50
+ Called when the corresponding interaction occurs; inspect the arguments in Actions.
51
+
52
+ ### onClick
53
+
54
+ ``(event: MouseEvent<HTMLDivElement, MouseEvent>): void`` · Optional
55
+
56
+ Called when the corresponding interaction occurs; inspect the arguments in Actions.
57
+
58
+ ### decoration
59
+
60
+ ``FrameDecorationStyle | undefined`` · Optional
61
+
62
+ Default: ``"none"``
63
+
64
+ ### startDecoration
65
+
66
+ ``FrameDecorationStyle | undefined`` · Optional
67
+
68
+ Default: ``decoration``
69
+
70
+ ### endDecoration
71
+
72
+ ``FrameDecorationStyle | undefined`` · Optional
73
+
74
+ Default: ``decoration``
75
+
76
+ ### startSize
77
+
78
+ ``DashboardFrameSize | undefined`` · Optional
79
+
80
+ Default: ``"medium"``
81
+
82
+ ### endSize
83
+
84
+ ``DashboardFrameSize | undefined`` · Optional
85
+
86
+ Default: ``"medium"``
87
+
88
+ ### compactStartSize
89
+
90
+ ``DashboardFrameSize | undefined`` · Optional
91
+
92
+ Default: ``"small"``
93
+
94
+ ### compactEndSize
95
+
96
+ ``DashboardFrameSize | undefined`` · Optional
97
+
98
+ Default: ``"small"``
99
+
@@ -0,0 +1,61 @@
1
+ <!-- Generated from public Props and owned stories. Run pnpm docs:storybook. -->
2
+ # FrameBoundary
3
+
4
+ Public FrameBoundary component from @gridui/grid. See the package guide for its composition contract.
5
+
6
+ Import from ``@gridui/grid`` and load Theme before this family's stylesheet.
7
+
8
+ ```tsx
9
+ import { FrameBoundary } from "@gridui/grid";
10
+ import "@gridui/theme/styles.css";
11
+ import "@gridui/grid/styles.css";
12
+ ```
13
+
14
+ Read the [package contract](https://github.com/sudo-ui/GridUI-React-Monorepo/blob/main/packages-layout/grid/README.md) for shared behavior and stylesheet dependencies.
15
+
16
+ ## API
17
+
18
+ The public Props type is the source of these signatures. Defaults below are explicit implementation defaults; story presets are separate. Native attributes remain available through the exported Props type.
19
+
20
+ ### onFocus
21
+
22
+ ``(event: FocusEvent<HTMLDivElement, Element>): void`` · Optional
23
+
24
+ Called when the corresponding interaction occurs; inspect the arguments in Actions.
25
+
26
+ ### onBlur
27
+
28
+ ``(event: FocusEvent<HTMLDivElement, Element>): void`` · Optional
29
+
30
+ Called when the corresponding interaction occurs; inspect the arguments in Actions.
31
+
32
+ ### onChange
33
+
34
+ ``(event: ChangeEvent<HTMLDivElement, Element>): void`` · Optional
35
+
36
+ Called when the corresponding interaction occurs; inspect the arguments in Actions.
37
+
38
+ ### onSubmit
39
+
40
+ ``(event: SubmitEvent<HTMLDivElement>): void`` · Optional
41
+
42
+ Called when the corresponding interaction occurs; inspect the arguments in Actions.
43
+
44
+ ### onClick
45
+
46
+ ``(event: MouseEvent<HTMLDivElement, MouseEvent>): void`` · Optional
47
+
48
+ Called when the corresponding interaction occurs; inspect the arguments in Actions.
49
+
50
+ ### boundary
51
+
52
+ ``FrameBoundaryStyle | undefined`` · Optional
53
+
54
+ Default: ``"line"``
55
+
56
+ ### extent
57
+
58
+ ``"content" | "frame" | undefined`` · Optional
59
+
60
+ Default: ``"content"``
61
+