@thewhatmatters/wmds 0.4.35 → 0.4.37
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/CHANGELOG.md +30 -0
- package/dist/colors.css +23 -8
- package/dist/components/molecules/PageHeader/pageHeaderStyles.d.ts.map +1 -1
- package/dist/components/molecules/PageHeader/pageHeaderStyles.js +1 -1
- package/dist/components/organisms/AppShell/AppShell.d.ts +18 -2
- package/dist/components/organisms/AppShell/AppShell.d.ts.map +1 -1
- package/dist/components/organisms/AppShell/AppShell.js +160 -115
- package/dist/components/organisms/AppShell/appShellStyles.d.ts +7 -2
- package/dist/components/organisms/AppShell/appShellStyles.d.ts.map +1 -1
- package/dist/components/organisms/AppShell/appShellStyles.js +2 -2
- package/dist/components/organisms/Dialog/Dialog.js +31 -31
- package/dist/components/organisms/IntakeConfirmation/intakeConfirmationStyles.d.ts +1 -1
- package/dist/components/organisms/Panel/Panel.js +28 -28
- package/dist/components/organisms/Sheet/Sheet.js +28 -28
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +47 -47
- package/dist/stateColors.css +5 -5
- package/dist/styles.css +1 -1
- package/dist/theme.css +3 -1
- package/docs/components.md +1 -1
- package/docs/exports.json +1 -1
- package/docs/patterns/components-accordion--flush.tsx +1 -1
- package/docs/patterns/components-appshell--portal-dashboard-pattern.tsx +1 -1
- package/docs/patterns/components-avatar--dropdown-row.tsx +1 -1
- package/docs/patterns/components-badge--outline-tags.tsx +1 -1
- package/docs/patterns/components-badge--status-pill.tsx +1 -1
- package/docs/patterns/components-badge--with-avatar.tsx +1 -1
- package/docs/patterns/components-band--page-in-bands.tsx +1 -1
- package/docs/patterns/components-breadcrumb--editorial.tsx +1 -1
- package/docs/patterns/components-breadcrumb--long-path.tsx +1 -1
- package/docs/patterns/components-breadcrumb--path.tsx +1 -1
- package/docs/patterns/components-breadcrumb--router-links.tsx +1 -1
- package/docs/patterns/components-button-button--copy-button.tsx +1 -1
- package/docs/patterns/components-button-button--destructive-action.tsx +1 -1
- package/docs/patterns/components-button-button--external-link.tsx +1 -1
- package/docs/patterns/components-button-button--ghost-action.tsx +1 -1
- package/docs/patterns/components-button-button--inverse-action.tsx +1 -1
- package/docs/patterns/components-button-button--link-render.tsx +1 -1
- package/docs/patterns/components-button-button--multi-state-badge.tsx +1 -1
- package/docs/patterns/components-button-button--outline-mono.tsx +1 -1
- package/docs/patterns/components-button-button--primary-action.tsx +1 -1
- package/docs/patterns/components-button-button--row-hug.tsx +1 -1
- package/docs/patterns/components-button-button--row-layout.tsx +1 -1
- package/docs/patterns/components-button-button--secondary-action.tsx +1 -1
- package/docs/patterns/components-button-button--suggestion-pills.tsx +1 -1
- package/docs/patterns/components-button-button--with-count.tsx +1 -1
- package/docs/patterns/components-button-button--with-icon.tsx +1 -1
- package/docs/patterns/components-button-floatingactionbutton--vertical-actions.tsx +1 -1
- package/docs/patterns/components-calembed--pattern-skip-above.tsx +1 -1
- package/docs/patterns/components-card-card--body-slot-occupancy-history.tsx +1 -1
- package/docs/patterns/components-card-card--headerless-media.tsx +1 -1
- package/docs/patterns/components-card-card--outlined-layout.tsx +1 -1
- package/docs/patterns/components-card-card--pinned-height.tsx +1 -1
- package/docs/patterns/components-card-card--terminal-frame.tsx +1 -1
- package/docs/patterns/components-card-selectablecard--selectable-cards-pattern.tsx +1 -1
- package/docs/patterns/components-carousel--image-carousel.tsx +1 -1
- package/docs/patterns/components-chart--audience-activity-heatmap.tsx +1 -1
- package/docs/patterns/components-chart--cartesian-no-data-gaps.tsx +1 -1
- package/docs/patterns/components-chart--occupancy-history-in-card.tsx +1 -1
- package/docs/patterns/components-chart--occupancy-in-card.tsx +1 -1
- package/docs/patterns/components-chart--post-reach-distribution.tsx +1 -1
- package/docs/patterns/components-chart--ranked-audience-breakdown.tsx +1 -1
- package/docs/patterns/components-chart--revenue-by-line.tsx +1 -1
- package/docs/patterns/components-chart--segmented-ring-pattern.tsx +1 -1
- package/docs/patterns/components-chart--unit-grid-composition.tsx +1 -1
- package/docs/patterns/components-chatdock--pattern-chat-dock.tsx +1 -1
- package/docs/patterns/components-chatdock--pattern-start-project-gate.tsx +1 -1
- package/docs/patterns/components-chatqa--pattern-qa-with-reply.tsx +1 -1
- package/docs/patterns/components-checkbox-checkbox--default.tsx +1 -1
- package/docs/patterns/components-checkbox-checkbox--with-count.tsx +1 -1
- package/docs/patterns/components-checkbox-checkbox--with-description.tsx +1 -1
- package/docs/patterns/components-checkbox-checkboxgroup--default.tsx +1 -1
- package/docs/patterns/components-checkbox-checkboxgroup--option-counts.tsx +1 -1
- package/docs/patterns/components-copyfield--clipboard-blocked.tsx +1 -1
- package/docs/patterns/components-copyfield--copied.tsx +1 -1
- package/docs/patterns/components-copyfield--copy-key.tsx +1 -1
- package/docs/patterns/components-copyfield--on-navy.tsx +1 -1
- package/docs/patterns/components-descriptionlist--details.tsx +1 -1
- package/docs/patterns/components-descriptionlist--post-metadata.tsx +1 -1
- package/docs/patterns/components-dialog--alert-dialog-destructive.tsx +1 -1
- package/docs/patterns/components-dialog--alert-dialog-typed-confirmation.tsx +1 -1
- package/docs/patterns/components-dialog--default-dialog.tsx +1 -1
- package/docs/patterns/components-dialog--form-dialog.tsx +1 -1
- package/docs/patterns/components-displaycontrols--page-utilities.tsx +1 -1
- package/docs/patterns/components-displaycontrols--theme-switch.tsx +1 -1
- package/docs/patterns/components-errorsummary--contact-form.tsx +1 -1
- package/docs/patterns/components-field--horizontal-input.tsx +1 -1
- package/docs/patterns/components-field--horizontal-text-area.tsx +1 -1
- package/docs/patterns/components-field--multi-control.tsx +1 -1
- package/docs/patterns/components-filterpanel--panel.tsx +1 -1
- package/docs/patterns/components-footerreveal--marketing-hero-pattern.tsx +1 -1
- package/docs/patterns/components-footerreveal--marketing-hero-ruled-pattern.tsx +1 -1
- package/docs/patterns/components-footerreveal--marketing-hero-with-gallery-intro.tsx +1 -1
- package/docs/patterns/components-footerreveal--marketing-page-pattern.tsx +1 -1
- package/docs/patterns/components-footerreveal--ruled-grid-footer-pattern.tsx +1 -1
- package/docs/patterns/components-footerreveal--sequenced-marketing-hero.tsx +1 -1
- package/docs/patterns/components-herointro--two-line-intro.tsx +1 -1
- package/docs/patterns/components-herointro--with-actions.tsx +1 -1
- package/docs/patterns/components-herotilestack--marketing-hero-pattern.tsx +1 -1
- package/docs/patterns/components-herotilestack--marketing-hero-text-sequence.tsx +1 -1
- package/docs/patterns/components-herotilestack--marketing-hero-with-gallery-intro.tsx +1 -1
- package/docs/patterns/components-indexlist--post-index.tsx +1 -1
- package/docs/patterns/components-intakeconfirmation--booked-pattern.tsx +1 -1
- package/docs/patterns/components-intakeconfirmation--emailed-pattern.tsx +1 -1
- package/docs/patterns/components-intakeform--about-you-pattern.tsx +1 -1
- package/docs/patterns/components-intakeform--short-form-pattern.tsx +1 -1
- package/docs/patterns/components-intakemodal--intake-modal-pattern.tsx +1 -1
- package/docs/patterns/components-kbd--command-row.tsx +1 -1
- package/docs/patterns/components-kbd--numbered-choices.tsx +1 -1
- package/docs/patterns/components-kbd--shortcut.tsx +1 -1
- package/docs/patterns/components-linktile--resource-tile.tsx +1 -1
- package/docs/patterns/components-linktile--router-link.tsx +1 -1
- package/docs/patterns/components-logview--detail-pane.tsx +1 -1
- package/docs/patterns/components-logview--log-viewer.tsx +1 -1
- package/docs/patterns/components-moremenu--action-menu.tsx +1 -1
- package/docs/patterns/components-moremenu--in-card-header.tsx +1 -1
- package/docs/patterns/components-navlist--app-sidebar.tsx +1 -1
- package/docs/patterns/components-navlist--side-nav-settings.tsx +1 -1
- package/docs/patterns/components-pageheader--app-header-pattern.tsx +1 -1
- package/docs/patterns/components-pageheader--page-section-header.tsx +1 -1
- package/docs/patterns/components-pageheader--toolbar-header.tsx +1 -1
- package/docs/patterns/components-panel--end-detail-rail.tsx +1 -1
- package/docs/patterns/components-pillgroup--pill-group-pattern.tsx +1 -1
- package/docs/patterns/components-promptbar--pattern-prompt-bar.tsx +1 -1
- package/docs/patterns/components-prose--article-body.tsx +1 -1
- package/docs/patterns/components-radio-radiogroup--default.tsx +1 -1
- package/docs/patterns/components-scrollhorizontal--project-gallery-pattern.tsx +1 -1
- package/docs/patterns/components-scrollhorizontal--with-intro.tsx +1 -1
- package/docs/patterns/components-sectioncaption--column-caption.tsx +1 -1
- package/docs/patterns/components-sectioncaption--with-action.tsx +1 -1
- package/docs/patterns/components-sheet--bottom-sheet.tsx +1 -1
- package/docs/patterns/components-sheet--end-sheet.tsx +1 -1
- package/docs/patterns/components-sheet--side-sheet-header-actions.tsx +1 -1
- package/docs/patterns/components-sheet--side-sheet-url-deep-link.tsx +1 -1
- package/docs/patterns/components-sheet--side-sheet.tsx +1 -1
- package/docs/patterns/components-sitenav--brand-and-cta.tsx +1 -1
- package/docs/patterns/components-sitenav--centered-links.tsx +1 -1
- package/docs/patterns/components-sitenav--compact.tsx +1 -1
- package/docs/patterns/components-sitenav--marketing-header.tsx +1 -1
- package/docs/patterns/components-sitenav--mega-menu.tsx +1 -1
- package/docs/patterns/components-stat--hero-stat.tsx +1 -1
- package/docs/patterns/components-stat--insights-row.tsx +1 -1
- package/docs/patterns/components-stepprogress--step-progress-pattern.tsx +1 -1
- package/docs/patterns/components-switch--default.tsx +1 -1
- package/docs/patterns/components-switch--settings-row.tsx +1 -1
- package/docs/patterns/components-tab--settings-pages.tsx +1 -1
- package/docs/patterns/components-table--approvals-with-sheet.tsx +1 -1
- package/docs/patterns/components-table--approvals.tsx +1 -1
- package/docs/patterns/components-table--basic.tsx +1 -1
- package/docs/patterns/components-taskrows--action-details.tsx +1 -1
- package/docs/patterns/components-taskrows--capsules.tsx +1 -1
- package/docs/patterns/components-taskrows--card-with-status-rows.tsx +1 -1
- package/docs/patterns/components-taskrows--controlled-expand.tsx +1 -1
- package/docs/patterns/components-taskrows--custom-slots.tsx +1 -1
- package/docs/patterns/components-taskrows--needs-you-table.tsx +1 -1
- package/docs/patterns/components-taskrows--status-list.tsx +1 -1
- package/docs/patterns/components-taskrows--tag-chips.tsx +1 -1
- package/docs/patterns/components-textarea--save-status.tsx +1 -1
- package/docs/patterns/components-textlink--external-destination.tsx +1 -1
- package/docs/patterns/components-textlink--inline-prose.tsx +1 -1
- package/docs/patterns/components-textlink--quiet-title.tsx +1 -1
- package/docs/patterns/components-textlink--supporting-copy.tsx +1 -1
- package/docs/patterns/components-textsequence--default.tsx +1 -1
- package/docs/patterns/components-textsequence--reduced-motion.tsx +1 -1
- package/docs/patterns/components-textsequence--shapes.tsx +1 -1
- package/docs/patterns/components-tilegrid--masonry.tsx +1 -1
- package/docs/patterns/components-toast--stacked-notifications.tsx +1 -1
- package/docs/patterns/components-tooltip--controlled.tsx +1 -1
- package/docs/patterns/components-tooltip--disabled-control.tsx +1 -1
- package/docs/patterns/components-tooltip--icon-action.tsx +1 -1
- package/docs/patterns/components-tooltip--keyboard-shortcut.tsx +1 -1
- package/docs/patterns/components-tooltip--placement.tsx +1 -1
- package/docs/patterns/foundations-scroll-fade--horizontal-rail.tsx +1 -1
- package/docs/patterns/foundations-scroll-fade--overflowing-list.tsx +1 -1
- package/docs/patterns/guides-chart-explorations--comparison-gallery.tsx +1 -1
- package/docs/patterns/guides-filter-panel--filtered-grid.tsx +1 -1
- package/docs/patterns/guides-filter-panel--filtered-index.tsx +1 -1
- package/docs/patterns/guides-overlay-flows--notification-preferences.tsx +1 -1
- package/docs/patterns/guides-post-page--post-page.tsx +1 -1
- package/docs/patterns/guides-profile-typography--editorial-profile.tsx +1 -1
- package/docs/patterns/guides-resource-detail--detail.tsx +1 -1
- package/docs/patterns/index.json +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,36 @@ Every release of `@thewhatmatters/wmds` is listed here, newest first.
|
|
|
7
7
|
- **Pasted patterns:** when a release changes a **Pattern — …** story's Show code, it is named under Consumer actions so apps re-copy it.
|
|
8
8
|
- **How to add an entry** (contributors): add your change to the top entry. If that version is already on npm (`npm view @thewhatmatters/wmds versions`), start a new entry above it and bump `version` in `package.json` to match. `npm run check:changelog` enforces the format.
|
|
9
9
|
|
|
10
|
+
## 0.4.37
|
|
11
|
+
|
|
12
|
+
**AppShell: a docked aside you can use while watching the page, a labelled phone menu button, and titles that end in an ellipsis.**
|
|
13
|
+
|
|
14
|
+
- **AppShell** `asideMode` (new): `overlay` (default, unchanged) or `docked`. Docked, from `lg`, the aside is a raised column beside the page (320px), and the page narrows to make room instead of being covered: for controls you use while watching the page change, like a font panel. It's a `complementary` landmark named by its title; Close or Escape from inside returns focus to the button that opened it. Below `lg` it's the overlay **Panel** either way. New exports `appShellAsideModes`, `AppShellAsideMode`.
|
|
15
|
+
- **AppShell** `menuButton` (new): `icon` (default, unchanged) or `label`, the icon plus `labels.menu` as visible text on the phone menu button (Header rule N7), for when the glyph alone doesn't say what the menu holds. New exports `appShellMenuButtons`, `AppShellMenuButton`.
|
|
16
|
+
- **PageHeader** `variant="app"`: a long title ends in an ellipsis on one line instead of wrapping out of the 56px band.
|
|
17
|
+
- Stories **AppShell → State — aside docked** and **State — phone, labelled menu**, with interaction tests (the page narrows, no dialog, focus returns on Close and Escape; the labelled button opens the menu).
|
|
18
|
+
|
|
19
|
+
### Consumer actions
|
|
20
|
+
|
|
21
|
+
- None.
|
|
22
|
+
|
|
23
|
+
## 0.4.36
|
|
24
|
+
|
|
25
|
+
**Colour fixes from building every component in light and dark: fills that vanished, the navy on the dark body, invalid hovers, and a primary Button on a band.**
|
|
26
|
+
|
|
27
|
+
- **`--color-accent-muted`** (and `--color-secondary`, which reads it): `#ebebeb` light (was the body's `#f8f8f8`), `#363636` dark (was the surface's `#262626`). The selected NavList pill, empty StepProgress segments, secondary Badges and Buttons, the AppShell avatar, Chips, and the Dropdown and Select item hover now show on the body and the surface.
|
|
28
|
+
- **`--color-brand` in dark** is `#5566e0`, the navy's hue lifted (was `#011272`, 1.09:1 on the dark body): 3.58:1 on the body, 3.14:1 on the surface, white on it 4.81:1. The PromptBar send button, the selected SelectableCard border, the filled StepProgress segment, FooterReveal, TextSequence and TextSequenceShape marks now read in dark. **`--color-brand-surface` defaults to `#011272` itself** (it was `var(--color-brand)`), so `tone="inverse"` bands keep the deep navy in dark, and a client's own brand surface still wins.
|
|
29
|
+
- **Dark status hovers:** `--color-{error,success,warning,info}-hover` mixed `108%` with white, which is invalid, so the browser dropped them. They're `88%` with white now, the same lift as the primary.
|
|
30
|
+
- **Primary on a field band:** inside `tone="field"`, `--color-primary` inverts to the field's ink with the field colour as its label (Randy, 2026-10-29). A primary Button on a field band was the band's own colour, since the field defaults to the primary. Inverse bands are unchanged (they take the dark, or the client's dark, primary).
|
|
31
|
+
- **Type scale metadata:** `astryxTypeScale` lists display line heights 1.05 / 1.1 / 1.15, matching typography.css (it said 1.15 / 1.2 / 1.24).
|
|
32
|
+
- **FooterReveal.Ruled** in dark keeps the deep navy ink on its white field.
|
|
33
|
+
- Tests: no `color-mix` above 100%; the secondary fill separates from body and surface in both themes; the dark brand's contrast; the field primary inversion; the type metadata matches the CSS.
|
|
34
|
+
|
|
35
|
+
### Consumer actions
|
|
36
|
+
|
|
37
|
+
- None required. Look at dark mode where you use `bg-brand` / `text-brand` as a large field: it's the lighter `#5566e0` now. Use `--color-brand-surface` (or a `tone="inverse"` Band) for a deep navy section in dark.
|
|
38
|
+
- If your brand stylesheet sets `--color-brand` for dark, keep it at 3:1 or more on `--color-background-body` and white at 4.5:1 or more on it.
|
|
39
|
+
|
|
10
40
|
## 0.4.35
|
|
11
41
|
|
|
12
42
|
**Contact and booking forms: two steps, booking after the request, a way out above the calendar, and nothing lost on close.**
|
package/dist/colors.css
CHANGED
|
@@ -28,7 +28,12 @@
|
|
|
28
28
|
|
|
29
29
|
/* Accent (neutral UI chrome — not brand) */
|
|
30
30
|
--color-accent: #262626;
|
|
31
|
-
|
|
31
|
+
/*
|
|
32
|
+
* `--color-secondary` (selected pills, empty progress segments, secondary badges, item hover).
|
|
33
|
+
* It must differ from both the body (#f8f8f8) and the surface (#fff), or those fills vanish:
|
|
34
|
+
* #ebebeb is 1.12:1 on the body and 1.19:1 on the surface.
|
|
35
|
+
*/
|
|
36
|
+
--color-accent-muted: #ebebeb;
|
|
32
37
|
--color-on-accent: #ffffff;
|
|
33
38
|
|
|
34
39
|
/* Overlays & neutral fills */
|
|
@@ -114,7 +119,8 @@
|
|
|
114
119
|
* - field: a saturated section colour (`tone="field"`). Default: the primary.
|
|
115
120
|
* `*-muted` is the secondary text step on that colour; it must clear 4.5:1 too.
|
|
116
121
|
*/
|
|
117
|
-
|
|
122
|
+
/* The navy itself, not var(--color-brand): the dark brand is lifted for dark grounds, and a dark section stays deep. */
|
|
123
|
+
--color-brand-surface: #011272;
|
|
118
124
|
--color-on-brand-surface: var(--color-on-brand);
|
|
119
125
|
--color-field: var(--color-primary);
|
|
120
126
|
--color-on-field: var(--color-on-primary);
|
|
@@ -189,7 +195,8 @@
|
|
|
189
195
|
--color-text-accent: #ebebeb;
|
|
190
196
|
|
|
191
197
|
--color-accent: #ebebeb;
|
|
192
|
-
|
|
198
|
+
/* Off the body (#1b1b1b, 1.43:1) and the surface (#262626, 1.26:1), so fills and item hover show on both. */
|
|
199
|
+
--color-accent-muted: #363636;
|
|
193
200
|
--color-on-accent: #171717;
|
|
194
201
|
|
|
195
202
|
--color-neutral: #ffffff1a;
|
|
@@ -226,11 +233,11 @@
|
|
|
226
233
|
--color-on-primary: #fafaf8;
|
|
227
234
|
|
|
228
235
|
/*
|
|
229
|
-
*
|
|
230
|
-
*
|
|
231
|
-
* (
|
|
236
|
+
* #011272 on #1b1b1b is 1.09:1, so the dark brand is the same navy hue lifted to #5566e0:
|
|
237
|
+
* 3.58:1 on the body and 3.14:1 on the surface (marks, borders, fills), and white on it is 4.81:1
|
|
238
|
+
* (send button, selected pill). Inverse bands keep the deep navy (`--color-brand-surface` is #011272 on :root).
|
|
232
239
|
*/
|
|
233
|
-
--color-brand: #
|
|
240
|
+
--color-brand: #5566e0;
|
|
234
241
|
--color-on-brand: #ffffff;
|
|
235
242
|
--color-brand-outline: color-mix(in srgb, var(--color-brand) 45%, white);
|
|
236
243
|
--color-brand-soft: color-mix(in srgb, var(--color-on-brand) 40%, var(--color-brand));
|
|
@@ -338,7 +345,15 @@
|
|
|
338
345
|
/* Default: the ink itself, since a lighter step on a mid-tone field would fall under 4.5:1. */
|
|
339
346
|
--tone-muted: var(--color-on-field-muted, var(--color-on-field));
|
|
340
347
|
/* A tinted card would pull a mid-tone field under 4.5:1, so cards sit flat on the field. */
|
|
341
|
-
--tone-raised: var(--tone-bg);
|
|
348
|
+
--tone-raised: var(--tone-bg); /*
|
|
349
|
+
* The field defaults to the primary, so a primary Button would vanish into it. On a field the primary
|
|
350
|
+
* inverts: the field's ink as the fill, the field colour as the label (Randy, 2026-10-29).
|
|
351
|
+
* Inverse bands keep the primary: they carry data-theme="dark", so it takes the dark (or client's dark) value.
|
|
352
|
+
*/
|
|
353
|
+
--color-primary: var(--tone-fg);
|
|
354
|
+
--color-on-primary: var(--tone-bg);
|
|
355
|
+
--color-primary-hover: color-mix(in srgb, var(--tone-fg) 88%, var(--tone-bg));
|
|
356
|
+
--color-primary-active: color-mix(in srgb, var(--tone-fg) 80%, var(--tone-bg));
|
|
342
357
|
}
|
|
343
358
|
|
|
344
359
|
[data-tone="inverse"],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pageHeaderStyles.d.ts","sourceRoot":"","sources":["../../../../src/components/molecules/PageHeader/pageHeaderStyles.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,kBAAkB,qCAAsC,CAAC;AAEtE,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE,4FAA4F;AAC5F,eAAO,MAAM,8BAA8B,uCAAuC,CAAC;AAEnF,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAWpE,CAAC;AAEF,eAAO,MAAM,sBAAsB,oCAAoC,CAAC;AAExE,eAAO,MAAM,oBAAoB,qCAAqC,CAAC;AAEvE,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"pageHeaderStyles.d.ts","sourceRoot":"","sources":["../../../../src/components/molecules/PageHeader/pageHeaderStyles.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,kBAAkB,qCAAsC,CAAC;AAEtE,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE,4FAA4F;AAC5F,eAAO,MAAM,8BAA8B,uCAAuC,CAAC;AAEnF,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAWpE,CAAC;AAEF,eAAO,MAAM,sBAAsB,oCAAoC,CAAC;AAExE,eAAO,MAAM,oBAAoB,qCAAqC,CAAC;AAEvE,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAKpE,CAAC"}
|
|
@@ -12,7 +12,7 @@ var r = [
|
|
|
12
12
|
page: "flex items-center justify-between gap-4",
|
|
13
13
|
toolbar: e("flex items-center justify-between gap-2", n.md)
|
|
14
14
|
}, o = "flex min-w-0 items-center gap-3", s = "flex shrink-0 items-center gap-2", c = {
|
|
15
|
-
app: e(t("section-heading"), "text-fg"),
|
|
15
|
+
app: e(t("section-heading"), "min-w-0 truncate text-fg"),
|
|
16
16
|
page: e(t("section-heading"), "text-fg"),
|
|
17
17
|
toolbar: e(t("ui-label"), "font-medium text-fg")
|
|
18
18
|
};
|
|
@@ -13,6 +13,10 @@ export interface AppShellLabels {
|
|
|
13
13
|
/** The skip link, the first tab stop, which moves focus to the page content. */
|
|
14
14
|
skipToContent: string;
|
|
15
15
|
}
|
|
16
|
+
export declare const appShellAsideModes: readonly ["overlay", "docked"];
|
|
17
|
+
export type AppShellAsideMode = (typeof appShellAsideModes)[number];
|
|
18
|
+
export declare const appShellMenuButtons: readonly ["icon", "label"];
|
|
19
|
+
export type AppShellMenuButton = (typeof appShellMenuButtons)[number];
|
|
16
20
|
export interface AppShellProps {
|
|
17
21
|
/** Page title — the `h1` in the title bar. */
|
|
18
22
|
title: string;
|
|
@@ -33,11 +37,22 @@ export interface AppShellProps {
|
|
|
33
37
|
sidebarOpen?: boolean;
|
|
34
38
|
defaultSidebarOpen?: boolean;
|
|
35
39
|
onSidebarOpenChange?: (open: boolean) => void;
|
|
40
|
+
/**
|
|
41
|
+
* `overlay` (default): the aside is a non-blocking **Panel** over the page.
|
|
42
|
+
* `docked`: from `lg` it sits beside the page, which narrows to make room, for controls you use while
|
|
43
|
+
* watching the page change (a font panel). Below `lg` it's the overlay **Panel** either way.
|
|
44
|
+
*/
|
|
45
|
+
asideMode?: AppShellAsideMode;
|
|
36
46
|
/** Aside open — controlled. */
|
|
37
47
|
asideOpen?: boolean;
|
|
38
48
|
defaultAsideOpen?: boolean;
|
|
39
49
|
onAsideOpenChange?: (open: boolean) => void;
|
|
40
50
|
labels?: Partial<AppShellLabels>;
|
|
51
|
+
/**
|
|
52
|
+
* The phone menu button (below `lg`): `icon` (default) or `label`, the icon plus `labels.menu` as visible
|
|
53
|
+
* text ("Patterns"), when the glyph alone wouldn't say what the menu holds.
|
|
54
|
+
*/
|
|
55
|
+
menuButton?: AppShellMenuButton;
|
|
41
56
|
/** Page content. **AppShell.Brand**, **Sidebar**, **Header**, and **Aside** children fill their slots instead. */
|
|
42
57
|
children?: ReactNode;
|
|
43
58
|
className?: AppShellLayoutClassName;
|
|
@@ -68,10 +83,11 @@ export interface AppShellContextValue {
|
|
|
68
83
|
}
|
|
69
84
|
/** State of the nearest **AppShell** — for a header button that opens the aside. */
|
|
70
85
|
export declare function useAppShell(): AppShellContextValue;
|
|
71
|
-
declare function AppShellRoot({ title, brand: brandProp, sidebar: sidebarProp, sidebarFooter: sidebarFooterProp, header: headerProp, aside: asideProp, asideTitle, asideDescription, sidebarOpen: sidebarOpenProp, defaultSidebarOpen, onSidebarOpenChange, asideOpen: asideOpenProp, defaultAsideOpen, onAsideOpenChange, labels: labelsProp, children, className, }: AppShellProps): import("react").JSX.Element;
|
|
86
|
+
declare function AppShellRoot({ title, brand: brandProp, sidebar: sidebarProp, sidebarFooter: sidebarFooterProp, header: headerProp, aside: asideProp, asideTitle, asideDescription, sidebarOpen: sidebarOpenProp, defaultSidebarOpen, onSidebarOpenChange, asideOpen: asideOpenProp, defaultAsideOpen, onAsideOpenChange, asideMode, menuButton, labels: labelsProp, children, className, }: AppShellProps): import("react").JSX.Element;
|
|
72
87
|
/**
|
|
73
88
|
* App chrome — a sidebar on the page background and the page as an inset, raised surface with a
|
|
74
|
-
* title bar. Below `lg` the sidebar is a start **Sheet**; the optional aside is a non-blocking **Panel
|
|
89
|
+
* title bar. Below `lg` the sidebar is a start **Sheet**; the optional aside is a non-blocking **Panel**,
|
|
90
|
+
* or with `asideMode="docked"`, from `lg`, a column beside the page.
|
|
75
91
|
*/
|
|
76
92
|
export declare const AppShell: typeof AppShellRoot & {
|
|
77
93
|
Brand: typeof AppShellBrand;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppShell.d.ts","sourceRoot":"","sources":["../../../../src/components/organisms/AppShell/AppShell.tsx"],"names":[],"mappings":"AAAA,OAAO,EAYL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"AppShell.d.ts","sourceRoot":"","sources":["../../../../src/components/organisms/AppShell/AppShell.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,218 +1,263 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { cn as e } from "../../../lib/cn.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
3
|
+
import { Button as t } from "../../atoms/Button/Button.js";
|
|
4
|
+
import { IconButton as n } from "../../atoms/IconButton/IconButton.js";
|
|
5
|
+
import { Kbd as r } from "../../atoms/Kbd/Kbd.js";
|
|
6
|
+
import { Tooltip as i } from "../../atoms/Tooltip/Tooltip.js";
|
|
7
|
+
import { PageHeader as ee } from "../../molecules/PageHeader/PageHeader.js";
|
|
8
|
+
import { overlayPanelBodyScrollClasses as te, overlayPanelSectionStackClasses as ne } from "../Dialog/dialogStyles.js";
|
|
9
|
+
import { OverlayPanelHeader as re } from "../Dialog/OverlayPanelHeader.js";
|
|
10
|
+
import { Panel as ie } from "../Panel/Panel.js";
|
|
11
|
+
import { Sheet as ae } from "../Sheet/Sheet.js";
|
|
12
|
+
import { appShellAsideDockedClasses as oe, appShellBrandClasses as se, appShellCanvasClasses as ce, appShellMainClasses as le, appShellRootClasses as ue, appShellSheetBodyClasses as de, appShellSidebarBodyClasses as a, appShellSidebarClasses as fe, appShellSidebarFooterClasses as pe, appShellSkipLinkClasses as me, appShellSurfaceClasses as he, appShellToggleDesktopClasses as ge, appShellToggleMobileClasses as o } from "./appShellStyles.js";
|
|
13
|
+
import { Children as s, createContext as c, isValidElement as l, useCallback as u, useContext as d, useEffect as f, useId as _e, useMemo as ve, useRef as p, useState as m } from "react";
|
|
14
|
+
import { PanelLeft as h } from "lucide-react";
|
|
15
|
+
import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
|
|
13
16
|
//#region src/components/organisms/AppShell/AppShell.tsx
|
|
14
|
-
var
|
|
17
|
+
var ye = {
|
|
15
18
|
collapse: "Collapse sidebar",
|
|
16
19
|
expand: "Expand sidebar",
|
|
17
20
|
menu: "Menu",
|
|
18
21
|
aside: "Details",
|
|
19
22
|
skipToContent: "Skip to content"
|
|
20
|
-
};
|
|
23
|
+
}, y = ["overlay", "docked"], b = ["icon", "label"];
|
|
21
24
|
function x({ children: e }) {
|
|
22
|
-
return /* @__PURE__ */
|
|
25
|
+
return /* @__PURE__ */ _(g, { children: e });
|
|
23
26
|
}
|
|
24
27
|
function S({ children: e }) {
|
|
25
|
-
return /* @__PURE__ */
|
|
28
|
+
return /* @__PURE__ */ _(g, { children: e });
|
|
26
29
|
}
|
|
27
30
|
function C({ children: e }) {
|
|
28
|
-
return /* @__PURE__ */
|
|
31
|
+
return /* @__PURE__ */ _(g, { children: e });
|
|
29
32
|
}
|
|
30
33
|
function w({ children: e }) {
|
|
31
|
-
return /* @__PURE__ */
|
|
34
|
+
return /* @__PURE__ */ _(g, { children: e });
|
|
32
35
|
}
|
|
33
36
|
function T({ children: e }) {
|
|
34
|
-
return /* @__PURE__ */
|
|
37
|
+
return /* @__PURE__ */ _(g, { children: e });
|
|
35
38
|
}
|
|
36
|
-
var E =
|
|
39
|
+
var E = c(null);
|
|
37
40
|
function D() {
|
|
38
|
-
let e =
|
|
41
|
+
let e = d(E);
|
|
39
42
|
if (e == null) throw Error("useAppShell must be used inside <AppShell>.");
|
|
40
43
|
return e;
|
|
41
44
|
}
|
|
42
45
|
function O(e, t, n) {
|
|
43
|
-
let [r, i] =
|
|
44
|
-
return [e ?? r,
|
|
46
|
+
let [r, i] = m(t);
|
|
47
|
+
return [e ?? r, u((t) => {
|
|
45
48
|
e ?? i(t), n?.(t);
|
|
46
49
|
}, [e, n])];
|
|
47
50
|
}
|
|
48
51
|
var k = "(min-width: 1024px)";
|
|
49
|
-
function
|
|
52
|
+
function be(e) {
|
|
50
53
|
return e instanceof HTMLElement && e.isContentEditable;
|
|
51
54
|
}
|
|
52
|
-
function
|
|
55
|
+
function xe(e) {
|
|
53
56
|
let t = { content: [] };
|
|
54
|
-
return
|
|
55
|
-
if (!
|
|
57
|
+
return s.forEach(e, (e) => {
|
|
58
|
+
if (!l(e)) {
|
|
56
59
|
e != null && e !== !1 && t.content.push(e);
|
|
57
60
|
return;
|
|
58
61
|
}
|
|
59
62
|
e.type === x ? t.brand = e.props.children : e.type === S ? t.sidebar = e.props.children : e.type === C ? t.sidebarFooter = e.props.children : e.type === w ? t.header = e.props.children : e.type === T ? t.aside = e.props : t.content.push(e);
|
|
60
63
|
}), t;
|
|
61
64
|
}
|
|
62
|
-
function A({ title:
|
|
65
|
+
function A({ title: s, brand: c, sidebar: l, sidebarFooter: d, header: g, aside: y, asideTitle: b, asideDescription: x, sidebarOpen: S, defaultSidebarOpen: C = !0, onSidebarOpenChange: w, asideOpen: T, defaultAsideOpen: D = !1, onAsideOpenChange: A, asideMode: j = "overlay", menuButton: Se = "icon", labels: Ce, children: we, className: Te }) {
|
|
63
66
|
let M = {
|
|
64
|
-
...
|
|
65
|
-
...
|
|
66
|
-
}, N =
|
|
67
|
-
!e &&
|
|
68
|
-
}, [
|
|
69
|
-
window.matchMedia(k).matches ? J(!
|
|
70
|
-
}, [J,
|
|
71
|
-
|
|
67
|
+
...ye,
|
|
68
|
+
...Ce
|
|
69
|
+
}, N = xe(we), P = c ?? N.brand, F = l ?? N.sidebar, I = d ?? N.sidebarFooter, Ee = g ?? N.header, L = y ?? N.aside?.children, R = F != null, z = L != null, [B, V] = O(S, C, w), [H, U] = O(T, D, A), [W, G] = m(!1), [De, Oe] = m(!1), K = _e(), ke = p(null), q = p(null), J = u((e) => {
|
|
70
|
+
!e && ke.current?.contains(document.activeElement) && q.current?.focus(), V(e);
|
|
71
|
+
}, [V]), Y = u(() => {
|
|
72
|
+
window.matchMedia(k).matches ? J(!B) : G((e) => !e);
|
|
73
|
+
}, [J, B]);
|
|
74
|
+
f(() => {
|
|
72
75
|
let e = window.matchMedia(k);
|
|
76
|
+
Oe(e.matches);
|
|
73
77
|
function t(e) {
|
|
74
|
-
e.matches &&
|
|
78
|
+
Oe(e.matches), e.matches && G(!1);
|
|
75
79
|
}
|
|
76
80
|
return e.addEventListener("change", t), () => e.removeEventListener("change", t);
|
|
77
|
-
}, []),
|
|
81
|
+
}, []), f(() => {
|
|
78
82
|
if (!R) return;
|
|
79
83
|
function e(e) {
|
|
80
|
-
e.defaultPrevented || e.altKey || e.shiftKey || !(e.metaKey || e.ctrlKey) || e.key.toLowerCase() !== "b" ||
|
|
84
|
+
e.defaultPrevented || e.altKey || e.shiftKey || !(e.metaKey || e.ctrlKey) || e.key.toLowerCase() !== "b" || be(e.target) || (e.preventDefault(), Y());
|
|
81
85
|
}
|
|
82
86
|
return document.addEventListener("keydown", e), () => document.removeEventListener("keydown", e);
|
|
83
87
|
}, [R, Y]);
|
|
84
|
-
let
|
|
85
|
-
sidebarOpen:
|
|
88
|
+
let Ae = ve(() => ({
|
|
89
|
+
sidebarOpen: B,
|
|
86
90
|
setSidebarOpen: J,
|
|
87
|
-
menuOpen:
|
|
88
|
-
setMenuOpen:
|
|
89
|
-
asideOpen:
|
|
90
|
-
setAsideOpen:
|
|
91
|
+
menuOpen: W,
|
|
92
|
+
setMenuOpen: G,
|
|
93
|
+
asideOpen: H,
|
|
94
|
+
setAsideOpen: U,
|
|
91
95
|
toggleSidebar: Y
|
|
92
96
|
}), [
|
|
93
|
-
V,
|
|
94
|
-
U,
|
|
95
97
|
H,
|
|
98
|
+
W,
|
|
99
|
+
U,
|
|
96
100
|
J,
|
|
97
|
-
|
|
101
|
+
B,
|
|
98
102
|
Y
|
|
99
103
|
]);
|
|
100
|
-
function
|
|
101
|
-
e.target.closest("nav a[href], nav button") != null &&
|
|
104
|
+
function je(e) {
|
|
105
|
+
e.target.closest("nav a[href], nav button") != null && G(!1);
|
|
106
|
+
}
|
|
107
|
+
let X = z && j === "docked" && De, Z = `${K}-aside`, Me = p(null), Q = p(null);
|
|
108
|
+
f(() => {
|
|
109
|
+
X && (H ? Q.current = document.activeElement : Q.current = null);
|
|
110
|
+
}, [H, X]);
|
|
111
|
+
function Ne() {
|
|
112
|
+
let e = Q.current, t = Me.current?.contains(document.activeElement) ?? !1;
|
|
113
|
+
U(!1), t && (e?.isConnected ? e.focus() : document.getElementById(`${K}-main`)?.focus());
|
|
102
114
|
}
|
|
103
|
-
let
|
|
104
|
-
className:
|
|
115
|
+
let Pe = B ? M.collapse : M.expand, $ = `${K}-main`, Fe = P == null ? null : /* @__PURE__ */ _("div", {
|
|
116
|
+
className: se,
|
|
105
117
|
children: P
|
|
106
|
-
}),
|
|
107
|
-
className:
|
|
118
|
+
}), Ie = I == null ? null : /* @__PURE__ */ _("div", {
|
|
119
|
+
className: pe,
|
|
108
120
|
children: I
|
|
109
|
-
}),
|
|
121
|
+
}), Le = R ? /* @__PURE__ */ v(i.Provider, { children: [/* @__PURE__ */ v(i, { children: [/* @__PURE__ */ _(i.Trigger, { render: /* @__PURE__ */ _(n, {
|
|
110
122
|
ref: q,
|
|
111
123
|
role: "ghost",
|
|
112
124
|
size: "sm",
|
|
113
125
|
title: "",
|
|
114
|
-
icon: /* @__PURE__ */
|
|
115
|
-
"aria-label":
|
|
116
|
-
"aria-expanded":
|
|
117
|
-
"aria-controls":
|
|
126
|
+
icon: /* @__PURE__ */ _(h, { strokeWidth: 2 }),
|
|
127
|
+
"aria-label": Pe,
|
|
128
|
+
"aria-expanded": B,
|
|
129
|
+
"aria-controls": K,
|
|
118
130
|
"aria-keyshortcuts": "Control+B Meta+B",
|
|
119
|
-
className:
|
|
120
|
-
onClick: () => J(!
|
|
121
|
-
}) }), /* @__PURE__ */
|
|
131
|
+
className: ge,
|
|
132
|
+
onClick: () => J(!B)
|
|
133
|
+
}) }), /* @__PURE__ */ _(i.Content, { children: /* @__PURE__ */ v("span", {
|
|
122
134
|
className: "inline-flex items-center gap-2",
|
|
123
135
|
children: [
|
|
124
|
-
|
|
125
|
-
/* @__PURE__ */
|
|
136
|
+
Pe,
|
|
137
|
+
/* @__PURE__ */ _(r, {
|
|
126
138
|
size: "sm",
|
|
127
139
|
children: "Ctrl"
|
|
128
140
|
}),
|
|
129
|
-
/* @__PURE__ */
|
|
141
|
+
/* @__PURE__ */ _(r, {
|
|
130
142
|
size: "sm",
|
|
131
143
|
children: "B"
|
|
132
144
|
})
|
|
133
145
|
]
|
|
134
|
-
}) })] }), /* @__PURE__ */
|
|
146
|
+
}) })] }), Se === "label" ? /* @__PURE__ */ _(t, {
|
|
135
147
|
role: "ghost",
|
|
136
148
|
size: "sm",
|
|
137
|
-
icon: /* @__PURE__ */
|
|
149
|
+
icon: /* @__PURE__ */ _(h, { strokeWidth: 2 }),
|
|
150
|
+
"aria-expanded": W,
|
|
151
|
+
"aria-haspopup": "dialog",
|
|
152
|
+
"aria-keyshortcuts": "Control+B Meta+B",
|
|
153
|
+
className: e(o, "shrink-0"),
|
|
154
|
+
onClick: () => G(!0),
|
|
155
|
+
children: M.menu
|
|
156
|
+
}) : /* @__PURE__ */ _(n, {
|
|
157
|
+
role: "ghost",
|
|
158
|
+
size: "sm",
|
|
159
|
+
icon: /* @__PURE__ */ _(h, { strokeWidth: 2 }),
|
|
138
160
|
"aria-label": M.menu,
|
|
139
|
-
"aria-expanded":
|
|
161
|
+
"aria-expanded": W,
|
|
140
162
|
"aria-haspopup": "dialog",
|
|
141
163
|
"aria-keyshortcuts": "Control+B Meta+B",
|
|
142
|
-
className:
|
|
143
|
-
onClick: () =>
|
|
164
|
+
className: o,
|
|
165
|
+
onClick: () => G(!0)
|
|
144
166
|
})] }) : null;
|
|
145
|
-
return /* @__PURE__ */
|
|
146
|
-
value:
|
|
147
|
-
children: /* @__PURE__ */
|
|
148
|
-
className: e(
|
|
167
|
+
return /* @__PURE__ */ _(E.Provider, {
|
|
168
|
+
value: Ae,
|
|
169
|
+
children: /* @__PURE__ */ v("div", {
|
|
170
|
+
className: e(ue, Te),
|
|
149
171
|
children: [
|
|
150
|
-
/* @__PURE__ */
|
|
151
|
-
href: `#${
|
|
152
|
-
className:
|
|
172
|
+
/* @__PURE__ */ _("a", {
|
|
173
|
+
href: `#${$}`,
|
|
174
|
+
className: me,
|
|
153
175
|
onClick: (e) => {
|
|
154
|
-
e.preventDefault(), document.getElementById(
|
|
176
|
+
e.preventDefault(), document.getElementById($)?.focus();
|
|
155
177
|
},
|
|
156
178
|
children: M.skipToContent
|
|
157
179
|
}),
|
|
158
|
-
R ? /* @__PURE__ */
|
|
159
|
-
ref:
|
|
160
|
-
id:
|
|
161
|
-
className: e(
|
|
180
|
+
R ? /* @__PURE__ */ v("div", {
|
|
181
|
+
ref: ke,
|
|
182
|
+
id: K,
|
|
183
|
+
className: e(fe, !B && "lg:!hidden"),
|
|
162
184
|
children: [
|
|
163
|
-
|
|
164
|
-
/* @__PURE__ */
|
|
165
|
-
className:
|
|
185
|
+
Fe,
|
|
186
|
+
/* @__PURE__ */ _("div", {
|
|
187
|
+
className: a,
|
|
166
188
|
children: F
|
|
167
189
|
}),
|
|
168
|
-
|
|
190
|
+
Ie
|
|
169
191
|
]
|
|
170
192
|
}) : null,
|
|
171
|
-
/* @__PURE__ */
|
|
172
|
-
className:
|
|
173
|
-
children: /* @__PURE__ */
|
|
174
|
-
className:
|
|
175
|
-
children: [/* @__PURE__ */
|
|
193
|
+
/* @__PURE__ */ v("div", {
|
|
194
|
+
className: ce,
|
|
195
|
+
children: [/* @__PURE__ */ v("div", {
|
|
196
|
+
className: he,
|
|
197
|
+
children: [/* @__PURE__ */ _(ee, {
|
|
176
198
|
variant: "app",
|
|
177
|
-
title:
|
|
178
|
-
"aria-label":
|
|
179
|
-
start:
|
|
180
|
-
end:
|
|
181
|
-
}), /* @__PURE__ */
|
|
182
|
-
id:
|
|
199
|
+
title: s,
|
|
200
|
+
"aria-label": s,
|
|
201
|
+
start: Le,
|
|
202
|
+
end: Ee
|
|
203
|
+
}), /* @__PURE__ */ _("main", {
|
|
204
|
+
id: $,
|
|
183
205
|
tabIndex: -1,
|
|
184
|
-
className:
|
|
206
|
+
className: le,
|
|
185
207
|
children: N.content
|
|
186
208
|
})]
|
|
187
|
-
})
|
|
209
|
+
}), X && H ? /* @__PURE__ */ _("aside", {
|
|
210
|
+
ref: Me,
|
|
211
|
+
id: Z,
|
|
212
|
+
"aria-labelledby": `${Z}-title`,
|
|
213
|
+
className: oe,
|
|
214
|
+
onKeyDown: (e) => {
|
|
215
|
+
e.key === "Escape" && !e.defaultPrevented && (e.preventDefault(), Ne());
|
|
216
|
+
},
|
|
217
|
+
children: /* @__PURE__ */ v("div", {
|
|
218
|
+
className: ne,
|
|
219
|
+
children: [/* @__PURE__ */ _(re, {
|
|
220
|
+
titleId: `${Z}-title`,
|
|
221
|
+
descriptionId: `${Z}-description`,
|
|
222
|
+
title: b ?? N.aside?.title ?? M.aside,
|
|
223
|
+
description: x ?? N.aside?.description,
|
|
224
|
+
closeLabel: "Close panel",
|
|
225
|
+
onClose: Ne,
|
|
226
|
+
delineated: !0
|
|
227
|
+
}), /* @__PURE__ */ _("div", {
|
|
228
|
+
className: e(te, "pb-4"),
|
|
229
|
+
children: L
|
|
230
|
+
})]
|
|
231
|
+
})
|
|
232
|
+
}) : null]
|
|
188
233
|
}),
|
|
189
|
-
R ? /* @__PURE__ */
|
|
190
|
-
open:
|
|
191
|
-
onOpenChange:
|
|
192
|
-
children: /* @__PURE__ */
|
|
234
|
+
R ? /* @__PURE__ */ _(ae, {
|
|
235
|
+
open: W,
|
|
236
|
+
onOpenChange: G,
|
|
237
|
+
children: /* @__PURE__ */ _(ae.Content, {
|
|
193
238
|
side: "start",
|
|
194
239
|
title: M.menu,
|
|
195
|
-
children: /* @__PURE__ */
|
|
196
|
-
className:
|
|
197
|
-
onClick:
|
|
240
|
+
children: /* @__PURE__ */ v("div", {
|
|
241
|
+
className: de,
|
|
242
|
+
onClick: je,
|
|
198
243
|
children: [
|
|
199
|
-
|
|
200
|
-
/* @__PURE__ */
|
|
201
|
-
className:
|
|
244
|
+
Fe,
|
|
245
|
+
/* @__PURE__ */ _("div", {
|
|
246
|
+
className: a,
|
|
202
247
|
children: F
|
|
203
248
|
}),
|
|
204
|
-
|
|
249
|
+
Ie
|
|
205
250
|
]
|
|
206
251
|
})
|
|
207
252
|
})
|
|
208
253
|
}) : null,
|
|
209
|
-
|
|
210
|
-
open:
|
|
211
|
-
onOpenChange:
|
|
212
|
-
children: /* @__PURE__ */
|
|
254
|
+
z && !X ? /* @__PURE__ */ _(ie, {
|
|
255
|
+
open: H,
|
|
256
|
+
onOpenChange: U,
|
|
257
|
+
children: /* @__PURE__ */ _(ie.Content, {
|
|
213
258
|
side: "end",
|
|
214
|
-
title:
|
|
215
|
-
description:
|
|
259
|
+
title: b ?? N.aside?.title ?? M.aside,
|
|
260
|
+
description: x ?? N.aside?.description,
|
|
216
261
|
children: L
|
|
217
262
|
})
|
|
218
263
|
}) : null
|
|
@@ -228,4 +273,4 @@ var j = Object.assign(A, {
|
|
|
228
273
|
Aside: T
|
|
229
274
|
});
|
|
230
275
|
//#endregion
|
|
231
|
-
export { j as AppShell, D as useAppShell };
|
|
276
|
+
export { j as AppShell, y as appShellAsideModes, b as appShellMenuButtons, D as useAppShell };
|
|
@@ -7,8 +7,13 @@ export declare const appShellBrandClasses: string;
|
|
|
7
7
|
export declare const appShellSidebarBodyClasses = "min-h-0 flex-1 overflow-y-auto";
|
|
8
8
|
/** Pinned under the scrolling nav — the same 16px inset as the brand row. */
|
|
9
9
|
export declare const appShellSidebarFooterClasses = "box-border shrink-0 px-4 py-3";
|
|
10
|
-
/** 8px inset around the raised surface. */
|
|
11
|
-
export declare const appShellCanvasClasses = "flex min-h-0 min-w-0 flex-1 p-2";
|
|
10
|
+
/** 8px inset around the raised surface (and a docked aside beside it, 8px apart). */
|
|
11
|
+
export declare const appShellCanvasClasses = "flex min-h-0 min-w-0 flex-1 gap-2 p-2";
|
|
12
|
+
/**
|
|
13
|
+
* `asideMode="docked"` from `lg`: a second raised surface beside the page, which narrows to make room,
|
|
14
|
+
* so the page stays visible and usable while the aside is open (live controls, a font panel).
|
|
15
|
+
*/
|
|
16
|
+
export declare const appShellAsideDockedClasses: string;
|
|
12
17
|
/** Raised surface — the Card shell radius and the soft card shadow. */
|
|
13
18
|
export declare const appShellSurfaceClasses: string;
|
|
14
19
|
/** First tab stop: hidden until focused, then pinned over the top-start corner. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appShellStyles.d.ts","sourceRoot":"","sources":["../../../../src/components/organisms/AppShell/appShellStyles.ts"],"names":[],"mappings":"AAIA,4DAA4D;AAC5D,eAAO,MAAM,mBAAmB,yDAAyD,CAAC;AAE1F,sFAAsF;AACtF,eAAO,MAAM,sBAAsB,mEAAmE,CAAC;AAEvG,wEAAwE;AACxE,eAAO,MAAM,oBAAoB,QAGhC,CAAC;AAEF,eAAO,MAAM,0BAA0B,mCAAmC,CAAC;AAE3E,6EAA6E;AAC7E,eAAO,MAAM,4BAA4B,kCAAkC,CAAC;AAE5E,
|
|
1
|
+
{"version":3,"file":"appShellStyles.d.ts","sourceRoot":"","sources":["../../../../src/components/organisms/AppShell/appShellStyles.ts"],"names":[],"mappings":"AAIA,4DAA4D;AAC5D,eAAO,MAAM,mBAAmB,yDAAyD,CAAC;AAE1F,sFAAsF;AACtF,eAAO,MAAM,sBAAsB,mEAAmE,CAAC;AAEvG,wEAAwE;AACxE,eAAO,MAAM,oBAAoB,QAGhC,CAAC;AAEF,eAAO,MAAM,0BAA0B,mCAAmC,CAAC;AAE3E,6EAA6E;AAC7E,eAAO,MAAM,4BAA4B,kCAAkC,CAAC;AAE5E,qFAAqF;AACrF,eAAO,MAAM,qBAAqB,0CAA0C,CAAC;AAE7E;;;GAGG;AACH,eAAO,MAAM,0BAA0B,QAGtC,CAAC;AAEF,uEAAuE;AACvE,eAAO,MAAM,sBAAsB,QAGlC,CAAC;AAEF,mFAAmF;AACnF,eAAO,MAAM,uBAAuB,QAGqB,CAAC;AAE1D,eAAO,MAAM,mBAAmB,2FAC0D,CAAC;AAE3F,eAAO,MAAM,4BAA4B,mBAAmB,CAAC;AAE7D,eAAO,MAAM,2BAA2B,eAAe,CAAC;AAExD,eAAO,MAAM,wBAAwB,iCAAiC,CAAC"}
|
|
@@ -3,6 +3,6 @@ import { cn as e } from "../../../lib/cn.js";
|
|
|
3
3
|
import { cardLayoutShellShapeClasses as t } from "../../molecules/Card/cardStyles.js";
|
|
4
4
|
import { pageHeaderAppBandHeightClasses as n } from "../../molecules/PageHeader/pageHeaderStyles.js";
|
|
5
5
|
//#region src/components/organisms/AppShell/appShellStyles.ts
|
|
6
|
-
var r = "flex h-full min-h-0 w-full bg-body font-sans text-fg", i = "flex h-full min-h-0 w-60 shrink-0 flex-col pt-2 max-lg:!hidden", a = e("box-border flex shrink-0 items-center gap-2 px-4", n), o = "min-h-0 flex-1 overflow-y-auto", s = "box-border shrink-0 px-4 py-3", c = "flex min-h-0 min-w-0 flex-1 p-2", l = e("flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden bg-surface shadow-soft-card", t.rounded),
|
|
6
|
+
var r = "flex h-full min-h-0 w-full bg-body font-sans text-fg", i = "flex h-full min-h-0 w-60 shrink-0 flex-col pt-2 max-lg:!hidden", a = e("box-border flex shrink-0 items-center gap-2 px-4", n), o = "min-h-0 flex-1 overflow-y-auto", s = "box-border shrink-0 px-4 py-3", c = "flex min-h-0 min-w-0 flex-1 gap-2 p-2", l = e("flex min-h-0 w-80 shrink-0 flex-col overflow-hidden bg-surface shadow-soft-card", t.rounded), u = e("flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden bg-surface shadow-soft-card", t.rounded), d = "sr-only focus:not-sr-only focus:fixed focus:start-4 focus:top-4 focus:z-50 focus:rounded-[var(--radius-control)] focus:bg-body focus:px-4 focus:py-2 focus:text-sm focus:font-medium focus:text-fg focus:outline-none focus:ring-2 focus:ring-focus-ring", f = "min-h-0 flex-1 overflow-y-auto px-[var(--grid-margin)] py-6 focus-visible:outline-none", p = "max-lg:!hidden", m = "lg:!hidden", h = "flex h-full min-h-0 flex-col";
|
|
7
7
|
//#endregion
|
|
8
|
-
export { a as appShellBrandClasses, c as appShellCanvasClasses,
|
|
8
|
+
export { l as appShellAsideDockedClasses, a as appShellBrandClasses, c as appShellCanvasClasses, f as appShellMainClasses, r as appShellRootClasses, h as appShellSheetBodyClasses, o as appShellSidebarBodyClasses, i as appShellSidebarClasses, s as appShellSidebarFooterClasses, d as appShellSkipLinkClasses, u as appShellSurfaceClasses, p as appShellToggleDesktopClasses, m as appShellToggleMobileClasses };
|