@marktiderman/genesis-ui 2.13.0 → 2.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/SKILL.md CHANGED
@@ -134,7 +134,9 @@ and use it the same way.
134
134
  | A whole CRUD list page over a resource | `ResourcePage` | `/data` |
135
135
  | Record detail side panel | `DetailPanel` | `/data` |
136
136
  | Dashboard / settings / form / detail page shape | `DashboardPage`, `SettingsPage`, `FormPage`, `DetailPage` | `/dashboard-page`, `/settings-page`, `/form-page`, `/detail-page` |
137
+ | A builder's outline, editor and live preview columns | `BuilderLayout` (no tabs, rail or header: those are the shell's) | `/builder-layout` |
137
138
  | KPI tile | `StatCard` | `/data` |
139
+ | The page around one publishable thing (a form, a course, a lesson): header, readiness chip, headline numbers, summary cards, follow-ups, settings with jump links, Share | `ResourceHeader`, `ReadinessChip`, `HeadlineNumbers`, `SummaryCard`, `FollowUpList`, `ResponsesToolbar`, `ResourceSettingsPage`, `SettingsSection`, `ShareDialog` (+ `readinessOf`, `dayLabel`, `prefilledUrl` on the server) | `/resource` (`/resource/rules`) |
138
140
  | Table cells: dates, numbers, money, badges, links, thumbnails | `DateCell`, `NumberCell`, `CurrencyCell`, `BadgeCell`, `LinkCell`, `ThumbnailCell` | `/data` |
139
141
  | Search, sort, filters, status chips/tabs, saved views | `DataFilters` | `/data` |
140
142
  | Create/edit form bound to a resource | `ResourceForm` / `useResourceForm` | `/data` / `@marktiderman/genesis-core/hooks` |
@@ -147,6 +149,37 @@ and use it the same way.
147
149
  | Persisted page size / density | `useViewSettings` | `/hooks/use-view-settings` |
148
150
  | Client-side links, navigate, URL filters on your router | `ReactRouterLink` / `TanStackRouterLink` and their `use…Navigate`, `use…SearchParams`, `use…ActivePath` hooks | `/router/react-router`, `/router/tanstack-router` |
149
151
 
152
+ ## Builder columns
153
+
154
+ `BuilderLayout` lays out a builder (forms, courses, lessons): `outline` on the left, `editor` in
155
+ the centre (the only required slot), `preview` on the right. Container queries, so it follows
156
+ the space it is given: three columns from a 56rem container (13rem / editor / 20rem), wider side
157
+ columns from 76rem (16rem / editor / 24.5rem), the preview under the editor below 56rem, and
158
+ everything stacked below 34rem. Outline and editor alone: 13rem from 34rem, 16rem from 48rem.
159
+ The preview keeps its place in the tree, so swapping `editor` (another section, another selected
160
+ item) never remounts it; `previewHidden` hides it without unmounting and gives its column to the
161
+ editor. `sticky` pins the outline and/or preview (`{ preview: true }` for one), `scrollSticky`
162
+ gives a pinned column its own scroll, and `outlineLabel` / `previewLabel` make them `nav` /
163
+ `aside` landmarks. `outlineProps`, `editorProps` and `previewProps` pass a class or test id to
164
+ each wrapper.
165
+
166
+ It does not own tabs, the app rail or a header. A builder's sections go in `useAppShellSubNav`
167
+ (or your own tabs inside `editor`), its title, status and actions in `AppShellPageHeader`. To
168
+ keep one preview across sections, render one `BuilderLayout` around them and swap `editor`;
169
+ nest an outline-and-editor `BuilderLayout` inside a section that has an outline (genesis-forms-builder
170
+ does both).
171
+
172
+ ```tsx
173
+ <BuilderLayout
174
+ outline={<StepList />}
175
+ outlineLabel="Outline"
176
+ editor={<StepEditor key={selectedId} />}
177
+ preview={<LivePreview />}
178
+ previewLabel="Preview"
179
+ sticky
180
+ />
181
+ ```
182
+
150
183
  ## Import rule
151
184
 
152
185
  Import by subpath, never the root barrel in app code: `@marktiderman/genesis-ui/button`,
@@ -4,10 +4,10 @@ import { Collapsible, CollapsibleContent } from './chunk-B2GIBUQD.js';
4
4
  import { Badge } from './chunk-NPNADZHM.js';
5
5
  import { Tooltip } from './chunk-G5YKBPBF.js';
6
6
  import { Popover, PopoverTrigger, PopoverContent } from './chunk-22XB3Q6H.js';
7
+ import { Button } from './chunk-NWSCYLPT.js';
7
8
  import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem } from './chunk-QJ6P2DW6.js';
8
9
  import { Switch } from './chunk-27ELYTGE.js';
9
10
  import { Label } from './chunk-F47U5KNW.js';
10
- import { Button } from './chunk-NWSCYLPT.js';
11
11
  import { cn } from './chunk-NZ5WBA4R.js';
12
12
  import { isPathActive, resolveNavigation, DefaultLink } from './chunk-J45FHL7D.js';
13
13
  import { createContext, useId, useState, useEffect, useMemo, useCallback, useContext, useRef, useLayoutEffect, useSyncExternalStore } from 'react';
@@ -1855,5 +1855,5 @@ function AppShell({
1855
1855
  }
1856
1856
 
1857
1857
  export { AppShell, AppShellPageHeader, AppShellSubNavEnd, PageHeader, SubNavTabs, useAppShellSubNav };
1858
- //# sourceMappingURL=chunk-5OFA2CQR.js.map
1859
- //# sourceMappingURL=chunk-5OFA2CQR.js.map
1858
+ //# sourceMappingURL=chunk-DTQHAZWN.js.map
1859
+ //# sourceMappingURL=chunk-DTQHAZWN.js.map