@setsquare/ui 0.1.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/CHANGELOG.md +70 -0
- package/LICENSE +202 -0
- package/NOTICE +49 -0
- package/README.md +313 -0
- package/dist/index.d.ts +129 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +78 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/cn.d.ts +4 -0
- package/dist/lib/cn.d.ts.map +1 -0
- package/dist/lib/cn.js +59 -0
- package/dist/lib/cn.js.map +1 -0
- package/dist/lib/tokens.d.ts +5 -0
- package/dist/lib/tokens.d.ts.map +1 -0
- package/dist/lib/tokens.js +22 -0
- package/dist/lib/tokens.js.map +1 -0
- package/dist/lib/use-element-width.d.ts +4 -0
- package/dist/lib/use-element-width.d.ts.map +1 -0
- package/dist/lib/use-element-width.js +17 -0
- package/dist/lib/use-element-width.js.map +1 -0
- package/dist/lint/index.d.ts +41 -0
- package/dist/lint/index.d.ts.map +1 -0
- package/dist/lint/index.js +648 -0
- package/dist/lint/index.js.map +1 -0
- package/dist/shell/app-header.d.ts +13 -0
- package/dist/shell/app-header.d.ts.map +1 -0
- package/dist/shell/app-header.js +11 -0
- package/dist/shell/app-header.js.map +1 -0
- package/dist/shell/dashboard-shell.d.ts +67 -0
- package/dist/shell/dashboard-shell.d.ts.map +1 -0
- package/dist/shell/dashboard-shell.js +168 -0
- package/dist/shell/dashboard-shell.js.map +1 -0
- package/dist/shell/page-header.d.ts +19 -0
- package/dist/shell/page-header.d.ts.map +1 -0
- package/dist/shell/page-header.js +11 -0
- package/dist/shell/page-header.js.map +1 -0
- package/dist/shell/right-panel.d.ts +25 -0
- package/dist/shell/right-panel.d.ts.map +1 -0
- package/dist/shell/right-panel.js +37 -0
- package/dist/shell/right-panel.js.map +1 -0
- package/dist/shell/sidebar.d.ts +68 -0
- package/dist/shell/sidebar.d.ts.map +1 -0
- package/dist/shell/sidebar.js +68 -0
- package/dist/shell/sidebar.js.map +1 -0
- package/dist/shell/site-footer.d.ts +28 -0
- package/dist/shell/site-footer.d.ts.map +1 -0
- package/dist/shell/site-footer.js +15 -0
- package/dist/shell/site-footer.js.map +1 -0
- package/dist/shell/site-header-padding.d.ts +7 -0
- package/dist/shell/site-header-padding.d.ts.map +1 -0
- package/dist/shell/site-header-padding.js +27 -0
- package/dist/shell/site-header-padding.js.map +1 -0
- package/dist/shell/site-header.d.ts +23 -0
- package/dist/shell/site-header.d.ts.map +1 -0
- package/dist/shell/site-header.js +13 -0
- package/dist/shell/site-header.js.map +1 -0
- package/dist/shell/site-menu.d.ts +27 -0
- package/dist/shell/site-menu.d.ts.map +1 -0
- package/dist/shell/site-menu.js +56 -0
- package/dist/shell/site-menu.js.map +1 -0
- package/dist/shell/site-nav-link.d.ts +24 -0
- package/dist/shell/site-nav-link.d.ts.map +1 -0
- package/dist/shell/site-nav-link.js +35 -0
- package/dist/shell/site-nav-link.js.map +1 -0
- package/dist/shell/site-nav.d.ts +12 -0
- package/dist/shell/site-nav.d.ts.map +1 -0
- package/dist/shell/site-nav.js +9 -0
- package/dist/shell/site-nav.js.map +1 -0
- package/dist/shell/site-path.d.ts +8 -0
- package/dist/shell/site-path.d.ts.map +1 -0
- package/dist/shell/site-path.js +11 -0
- package/dist/shell/site-path.js.map +1 -0
- package/dist/shell/site-shell.d.ts +25 -0
- package/dist/shell/site-shell.d.ts.map +1 -0
- package/dist/shell/site-shell.js +17 -0
- package/dist/shell/site-shell.js.map +1 -0
- package/dist/styles/styles.css +10 -0
- package/dist/styles/theme.css +579 -0
- package/dist/styles/tokens.css +295 -0
- package/dist/testing/index.d.ts +321 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +1175 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/tokens.json +982 -0
- package/dist/ui/alert.d.ts +35 -0
- package/dist/ui/alert.d.ts.map +1 -0
- package/dist/ui/alert.js +65 -0
- package/dist/ui/alert.js.map +1 -0
- package/dist/ui/avatar.d.ts +16 -0
- package/dist/ui/avatar.d.ts.map +1 -0
- package/dist/ui/avatar.js +13 -0
- package/dist/ui/avatar.js.map +1 -0
- package/dist/ui/badge.d.ts +13 -0
- package/dist/ui/badge.d.ts.map +1 -0
- package/dist/ui/badge.js +24 -0
- package/dist/ui/badge.js.map +1 -0
- package/dist/ui/breadcrumbs.d.ts +13 -0
- package/dist/ui/breadcrumbs.d.ts.map +1 -0
- package/dist/ui/breadcrumbs.js +12 -0
- package/dist/ui/breadcrumbs.js.map +1 -0
- package/dist/ui/button-styles.d.ts +24 -0
- package/dist/ui/button-styles.d.ts.map +1 -0
- package/dist/ui/button-styles.js +50 -0
- package/dist/ui/button-styles.js.map +1 -0
- package/dist/ui/button.d.ts +27 -0
- package/dist/ui/button.d.ts.map +1 -0
- package/dist/ui/button.js +30 -0
- package/dist/ui/button.js.map +1 -0
- package/dist/ui/calendar.d.ts +19 -0
- package/dist/ui/calendar.d.ts.map +1 -0
- package/dist/ui/calendar.js +52 -0
- package/dist/ui/calendar.js.map +1 -0
- package/dist/ui/card.d.ts +30 -0
- package/dist/ui/card.d.ts.map +1 -0
- package/dist/ui/card.js +18 -0
- package/dist/ui/card.js.map +1 -0
- package/dist/ui/checkbox.d.ts +36 -0
- package/dist/ui/checkbox.d.ts.map +1 -0
- package/dist/ui/checkbox.js +38 -0
- package/dist/ui/checkbox.js.map +1 -0
- package/dist/ui/code-block.d.ts +20 -0
- package/dist/ui/code-block.d.ts.map +1 -0
- package/dist/ui/code-block.js +22 -0
- package/dist/ui/code-block.js.map +1 -0
- package/dist/ui/combo-box.d.ts +17 -0
- package/dist/ui/combo-box.d.ts.map +1 -0
- package/dist/ui/combo-box.js +14 -0
- package/dist/ui/combo-box.js.map +1 -0
- package/dist/ui/copy-button.d.ts +14 -0
- package/dist/ui/copy-button.d.ts.map +1 -0
- package/dist/ui/copy-button.js +36 -0
- package/dist/ui/copy-button.js.map +1 -0
- package/dist/ui/date-field.d.ts +38 -0
- package/dist/ui/date-field.d.ts.map +1 -0
- package/dist/ui/date-field.js +78 -0
- package/dist/ui/date-field.js.map +1 -0
- package/dist/ui/dialog.d.ts +41 -0
- package/dist/ui/dialog.d.ts.map +1 -0
- package/dist/ui/dialog.js +69 -0
- package/dist/ui/dialog.js.map +1 -0
- package/dist/ui/disclosure.d.ts +18 -0
- package/dist/ui/disclosure.d.ts.map +1 -0
- package/dist/ui/disclosure.js +15 -0
- package/dist/ui/disclosure.js.map +1 -0
- package/dist/ui/empty-state.d.ts +17 -0
- package/dist/ui/empty-state.d.ts.map +1 -0
- package/dist/ui/empty-state.js +9 -0
- package/dist/ui/empty-state.js.map +1 -0
- package/dist/ui/error-state.d.ts +45 -0
- package/dist/ui/error-state.d.ts.map +1 -0
- package/dist/ui/error-state.js +88 -0
- package/dist/ui/error-state.js.map +1 -0
- package/dist/ui/field.d.ts +46 -0
- package/dist/ui/field.d.ts.map +1 -0
- package/dist/ui/field.js +79 -0
- package/dist/ui/field.js.map +1 -0
- package/dist/ui/file-upload.d.ts +54 -0
- package/dist/ui/file-upload.d.ts.map +1 -0
- package/dist/ui/file-upload.js +170 -0
- package/dist/ui/file-upload.js.map +1 -0
- package/dist/ui/form.d.ts +56 -0
- package/dist/ui/form.d.ts.map +1 -0
- package/dist/ui/form.js +137 -0
- package/dist/ui/form.js.map +1 -0
- package/dist/ui/grid-list.d.ts +24 -0
- package/dist/ui/grid-list.d.ts.map +1 -0
- package/dist/ui/grid-list.js +21 -0
- package/dist/ui/grid-list.js.map +1 -0
- package/dist/ui/hero.d.ts +36 -0
- package/dist/ui/hero.d.ts.map +1 -0
- package/dist/ui/hero.js +19 -0
- package/dist/ui/hero.js.map +1 -0
- package/dist/ui/icon-button.d.ts +18 -0
- package/dist/ui/icon-button.d.ts.map +1 -0
- package/dist/ui/icon-button.js +13 -0
- package/dist/ui/icon-button.js.map +1 -0
- package/dist/ui/icon.d.ts +20 -0
- package/dist/ui/icon.d.ts.map +1 -0
- package/dist/ui/icon.js +26 -0
- package/dist/ui/icon.js.map +1 -0
- package/dist/ui/kbd.d.ts +7 -0
- package/dist/ui/kbd.d.ts.map +1 -0
- package/dist/ui/kbd.js +7 -0
- package/dist/ui/kbd.js.map +1 -0
- package/dist/ui/link-card.d.ts +23 -0
- package/dist/ui/link-card.d.ts.map +1 -0
- package/dist/ui/link-card.js +19 -0
- package/dist/ui/link-card.js.map +1 -0
- package/dist/ui/list-box.d.ts +17 -0
- package/dist/ui/list-box.d.ts.map +1 -0
- package/dist/ui/list-box.js +18 -0
- package/dist/ui/list-box.js.map +1 -0
- package/dist/ui/menu.d.ts +31 -0
- package/dist/ui/menu.d.ts.map +1 -0
- package/dist/ui/menu.js +40 -0
- package/dist/ui/menu.js.map +1 -0
- package/dist/ui/number-field.d.ts +19 -0
- package/dist/ui/number-field.d.ts.map +1 -0
- package/dist/ui/number-field.js +19 -0
- package/dist/ui/number-field.js.map +1 -0
- package/dist/ui/prose.d.ts +12 -0
- package/dist/ui/prose.d.ts.map +1 -0
- package/dist/ui/prose.js +11 -0
- package/dist/ui/prose.js.map +1 -0
- package/dist/ui/radio-group.d.ts +20 -0
- package/dist/ui/radio-group.d.ts.map +1 -0
- package/dist/ui/radio-group.js +16 -0
- package/dist/ui/radio-group.js.map +1 -0
- package/dist/ui/scroll-region.d.ts +18 -0
- package/dist/ui/scroll-region.d.ts.map +1 -0
- package/dist/ui/scroll-region.js +29 -0
- package/dist/ui/scroll-region.js.map +1 -0
- package/dist/ui/search-field.d.ts +12 -0
- package/dist/ui/search-field.d.ts.map +1 -0
- package/dist/ui/search-field.js +12 -0
- package/dist/ui/search-field.js.map +1 -0
- package/dist/ui/search.d.ts +43 -0
- package/dist/ui/search.d.ts.map +1 -0
- package/dist/ui/search.js +45 -0
- package/dist/ui/search.js.map +1 -0
- package/dist/ui/section.d.ts +50 -0
- package/dist/ui/section.d.ts.map +1 -0
- package/dist/ui/section.js +25 -0
- package/dist/ui/section.js.map +1 -0
- package/dist/ui/segmented-control.d.ts +18 -0
- package/dist/ui/segmented-control.d.ts.map +1 -0
- package/dist/ui/segmented-control.js +17 -0
- package/dist/ui/segmented-control.js.map +1 -0
- package/dist/ui/select.d.ts +18 -0
- package/dist/ui/select.d.ts.map +1 -0
- package/dist/ui/select.js +13 -0
- package/dist/ui/select.js.map +1 -0
- package/dist/ui/selection-bar.d.ts +28 -0
- package/dist/ui/selection-bar.d.ts.map +1 -0
- package/dist/ui/selection-bar.js +35 -0
- package/dist/ui/selection-bar.js.map +1 -0
- package/dist/ui/sheet.d.ts +21 -0
- package/dist/ui/sheet.d.ts.map +1 -0
- package/dist/ui/sheet.js +16 -0
- package/dist/ui/sheet.js.map +1 -0
- package/dist/ui/skeleton.d.ts +31 -0
- package/dist/ui/skeleton.d.ts.map +1 -0
- package/dist/ui/skeleton.js +38 -0
- package/dist/ui/skeleton.js.map +1 -0
- package/dist/ui/slider.d.ts +31 -0
- package/dist/ui/slider.d.ts.map +1 -0
- package/dist/ui/slider.js +33 -0
- package/dist/ui/slider.js.map +1 -0
- package/dist/ui/spinner.d.ts +27 -0
- package/dist/ui/spinner.d.ts.map +1 -0
- package/dist/ui/spinner.js +21 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/ui/split.d.ts +14 -0
- package/dist/ui/split.d.ts.map +1 -0
- package/dist/ui/split.js +11 -0
- package/dist/ui/split.js.map +1 -0
- package/dist/ui/stat-list.d.ts +25 -0
- package/dist/ui/stat-list.d.ts.map +1 -0
- package/dist/ui/stat-list.js +14 -0
- package/dist/ui/stat-list.js.map +1 -0
- package/dist/ui/steps.d.ts +23 -0
- package/dist/ui/steps.d.ts.map +1 -0
- package/dist/ui/steps.js +16 -0
- package/dist/ui/steps.js.map +1 -0
- package/dist/ui/switch.d.ts +13 -0
- package/dist/ui/switch.d.ts.map +1 -0
- package/dist/ui/switch.js +12 -0
- package/dist/ui/switch.js.map +1 -0
- package/dist/ui/table.d.ts +25 -0
- package/dist/ui/table.d.ts.map +1 -0
- package/dist/ui/table.js +29 -0
- package/dist/ui/table.js.map +1 -0
- package/dist/ui/tag.d.ts +14 -0
- package/dist/ui/tag.d.ts.map +1 -0
- package/dist/ui/tag.js +11 -0
- package/dist/ui/tag.js.map +1 -0
- package/dist/ui/text-field.d.ts +27 -0
- package/dist/ui/text-field.d.ts.map +1 -0
- package/dist/ui/text-field.js +17 -0
- package/dist/ui/text-field.js.map +1 -0
- package/dist/ui/text-link.d.ts +17 -0
- package/dist/ui/text-link.d.ts.map +1 -0
- package/dist/ui/text-link.js +15 -0
- package/dist/ui/text-link.js.map +1 -0
- package/dist/ui/theme-switcher.d.ts +26 -0
- package/dist/ui/theme-switcher.d.ts.map +1 -0
- package/dist/ui/theme-switcher.js +32 -0
- package/dist/ui/theme-switcher.js.map +1 -0
- package/dist/ui/theme.d.ts +54 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +135 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/ui/toast.d.ts +34 -0
- package/dist/ui/toast.d.ts.map +1 -0
- package/dist/ui/toast.js +69 -0
- package/dist/ui/toast.js.map +1 -0
- package/dist/ui/tooltip.d.ts +10 -0
- package/dist/ui/tooltip.d.ts.map +1 -0
- package/dist/ui/tooltip.js +10 -0
- package/dist/ui/tooltip.js.map +1 -0
- package/package.json +123 -0
- package/templates/next/error.tsx +32 -0
- package/templates/next/loading.tsx +19 -0
- package/templates/next/not-found.tsx +18 -0
- package/templates/next/page-transition.tsx +33 -0
- package/templates/next/portal-layout.tsx +70 -0
- package/templates/next/prefetch-on-intent.ts +31 -0
- package/templates/next/root-layout.tsx +16 -0
- package/templates/next/site-layout.tsx +58 -0
- package/templates/next/site-nav.ts +16 -0
- package/templates/next/site-not-found.tsx +21 -0
- package/templates/next/site-router.tsx +17 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sidebar.js","sourceRoot":"","sources":["../../src/shell/sidebar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import { type SiteNavItem } from './site-path.js';
|
|
3
|
+
export interface SiteFooterProps {
|
|
4
|
+
/** SiteFooterGroups: one should list the whole navigation, with the id SiteMenu falls back to. */
|
|
5
|
+
children: ReactNode;
|
|
6
|
+
/** The product's logo and name. */
|
|
7
|
+
lockup?: ReactNode;
|
|
8
|
+
/** A sentence about the product. */
|
|
9
|
+
blurb?: ReactNode;
|
|
10
|
+
/** The company line, licence and similar, under a rule. */
|
|
11
|
+
legal?: ReactNode;
|
|
12
|
+
className?: string;
|
|
13
|
+
}
|
|
14
|
+
/** The contentinfo landmark: lockup and blurb, groups of links, and the legal line. Server-safe. */
|
|
15
|
+
export declare function SiteFooter({ children, lockup, blurb, legal, className }: SiteFooterProps): import("react").JSX.Element;
|
|
16
|
+
export interface SiteFooterGroupProps {
|
|
17
|
+
/** The group's heading, which names its navigation landmark. */
|
|
18
|
+
title: string;
|
|
19
|
+
items: SiteNavItem[];
|
|
20
|
+
/** The current path. Default: the SitePathProvider's. */
|
|
21
|
+
current?: string;
|
|
22
|
+
/** `site-nav` on the group that lists the whole navigation: SiteMenu links there before hydration. */
|
|
23
|
+
id?: string;
|
|
24
|
+
className?: string;
|
|
25
|
+
}
|
|
26
|
+
/** A column of links in the footer: a <nav> named by its <h2>. Server-safe. */
|
|
27
|
+
export declare function SiteFooterGroup({ title, items, current, id, className }: SiteFooterGroupProps): import("react").JSX.Element;
|
|
28
|
+
//# sourceMappingURL=site-footer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-footer.d.ts","sourceRoot":"","sources":["../../src/shell/site-footer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG9C,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE5D,MAAM,WAAW,eAAe;IAC9B,kGAAkG;IAClG,QAAQ,EAAE,SAAS,CAAC;IACpB,mCAAmC;IACnC,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,oCAAoC;IACpC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,2DAA2D;IAC3D,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,oGAAoG;AACpG,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,eAAe,+BAuBxF;AAED,MAAM,WAAW,oBAAoB;IACnC,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sGAAsG;IACtG,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,oBAAoB,+BAsB7F"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useId } from 'react';
|
|
3
|
+
import { cn } from '../lib/cn.js';
|
|
4
|
+
import { SiteNavLink } from './site-nav-link.js';
|
|
5
|
+
import { samePath } from './site-path.js';
|
|
6
|
+
/** The contentinfo landmark: lockup and blurb, groups of links, and the legal line. Server-safe. */
|
|
7
|
+
export function SiteFooter({ children, lockup, blurb, legal, className }) {
|
|
8
|
+
return (_jsx("footer", { className: cn('border-t border-border bg-background', className), children: _jsxs("div", { className: "site-container py-12", children: [_jsxs("div", { className: "grid gap-10 site-md:grid-cols-[minmax(0,16rem)_minmax(0,1fr)]", children: [(lockup || blurb) && (_jsxs("div", { className: "flex flex-col gap-3", children: [lockup, blurb && _jsx("p", { className: "text-body text-muted-foreground", children: blurb })] })), _jsx("div", { className: "grid grid-cols-[repeat(auto-fit,minmax(min(10rem,100%),1fr))] gap-8", children: children })] }), legal && (_jsx("div", { className: "mt-10 border-t border-border pt-6 text-caption text-muted-foreground", children: legal }))] }) }));
|
|
9
|
+
}
|
|
10
|
+
/** A column of links in the footer: a <nav> named by its <h2>. Server-safe. */
|
|
11
|
+
export function SiteFooterGroup({ title, items, current, id, className }) {
|
|
12
|
+
const headingId = useId();
|
|
13
|
+
return (_jsxs("nav", { id: id, "aria-labelledby": headingId, className: cn('scroll-mt-4', className), children: [_jsx("h2", { id: headingId, className: "text-ui-strong text-foreground", children: title }), _jsx("ul", { className: "mt-3 flex flex-col", children: items.map((item) => (_jsx("li", { children: _jsx(SiteNavLink, { variant: "footer", href: item.href, isCurrent: current !== undefined ? samePath(item.href, current) : undefined, children: item.label }) }, item.href))) })] }));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=site-footer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-footer.js","sourceRoot":"","sources":["../../src/shell/site-footer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAkB,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAoB,MAAM,gBAAgB,CAAC;AAc5D,oGAAoG;AACpG,MAAM,UAAU,UAAU,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAmB;IACvF,OAAO,CACL,iBAAQ,SAAS,EAAE,EAAE,CAAC,sCAAsC,EAAE,SAAS,CAAC,YACtE,eAAK,SAAS,EAAC,sBAAsB,aACnC,eAAK,SAAS,EAAC,+DAA+D,aAC3E,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CACpB,eAAK,SAAS,EAAC,qBAAqB,aACjC,MAAM,EACN,KAAK,IAAI,YAAG,SAAS,EAAC,iCAAiC,YAAE,KAAK,GAAK,IAChE,CACP,EACD,cAAK,SAAS,EAAC,qEAAqE,YACjF,QAAQ,GACL,IACF,EACL,KAAK,IAAI,CACR,cAAK,SAAS,EAAC,sEAAsE,YAClF,KAAK,GACF,CACP,IACG,GACC,CACV,CAAC;AACJ,CAAC;AAaD,+EAA+E;AAC/E,MAAM,UAAU,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAwB;IAC5F,MAAM,SAAS,GAAG,KAAK,EAAE,CAAC;IAC1B,OAAO,CACL,eAAK,EAAE,EAAE,EAAE,qBAAmB,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC,aAC9E,aAAI,EAAE,EAAE,SAAS,EAAE,SAAS,EAAC,gCAAgC,YAC1D,KAAK,GACH,EACL,aAAI,SAAS,EAAC,oBAAoB,YAC/B,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,uBACE,KAAC,WAAW,IACV,OAAO,EAAC,QAAQ,EAChB,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,SAAS,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,YAE1E,IAAI,CAAC,KAAK,GACC,IAPP,IAAI,CAAC,IAAI,CAQb,CACN,CAAC,GACC,IACD,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inside a sticky SiteHeader: keeps --site-header-height on <html> equal to the header's height as it wraps and
|
|
3
|
+
* unwraps, which the stylesheet adds to scroll-padding-top. So the browser scrolls anything that takes focus
|
|
4
|
+
* clear of the header (2.4.11; 2.4.12 at AAA). Before it runs, the stylesheet assumes 4rem.
|
|
5
|
+
*/
|
|
6
|
+
export declare function SiteHeaderPadding(): import("react").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=site-header-padding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-header-padding.d.ts","sourceRoot":"","sources":["../../src/shell/site-header-padding.tsx"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,wBAAgB,iBAAiB,gCAiBhC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useRef } from 'react';
|
|
4
|
+
/**
|
|
5
|
+
* Inside a sticky SiteHeader: keeps --site-header-height on <html> equal to the header's height as it wraps and
|
|
6
|
+
* unwraps, which the stylesheet adds to scroll-padding-top. So the browser scrolls anything that takes focus
|
|
7
|
+
* clear of the header (2.4.11; 2.4.12 at AAA). Before it runs, the stylesheet assumes 4rem.
|
|
8
|
+
*/
|
|
9
|
+
export function SiteHeaderPadding() {
|
|
10
|
+
const ref = useRef(null);
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
const header = ref.current?.closest('header');
|
|
13
|
+
if (!header)
|
|
14
|
+
return;
|
|
15
|
+
const root = document.documentElement;
|
|
16
|
+
const set = () => root.style.setProperty('--site-header-height', `${header.getBoundingClientRect().height}px`);
|
|
17
|
+
set();
|
|
18
|
+
const observer = new ResizeObserver(set);
|
|
19
|
+
observer.observe(header);
|
|
20
|
+
return () => {
|
|
21
|
+
observer.disconnect();
|
|
22
|
+
root.style.removeProperty('--site-header-height');
|
|
23
|
+
};
|
|
24
|
+
}, []);
|
|
25
|
+
return _jsx("span", { ref: ref, hidden: true });
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=site-header-padding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-header-padding.js","sourceRoot":"","sources":["../../src/shell/site-header-padding.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE1C;;;;GAIG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,GAAG,MAAM,CAAkB,IAAI,CAAC,CAAC;IAC1C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAC;QACtC,MAAM,GAAG,GAAG,GAAG,EAAE,CACf,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,sBAAsB,EAAE,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC;QAC/F,GAAG,EAAE,CAAC;QACN,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC;QACzC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,UAAU,EAAE,CAAC;YACtB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,sBAAsB,CAAC,CAAC;QACpD,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,OAAO,eAAM,GAAG,EAAE,GAAG,EAAE,MAAM,SAAG,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export interface SiteHeaderProps {
|
|
3
|
+
/** The product's logo and name, as a link home. */
|
|
4
|
+
lockup: ReactNode;
|
|
5
|
+
/** A SiteNav: shown from the `lg` breakpoint up. */
|
|
6
|
+
nav?: ReactNode;
|
|
7
|
+
/** One or two LinkButtons, such as "Get started". */
|
|
8
|
+
actions?: ReactNode;
|
|
9
|
+
/** A SiteMenu: shown below `lg`, with the same items as the nav. */
|
|
10
|
+
menu?: ReactNode;
|
|
11
|
+
/**
|
|
12
|
+
* Stay at the top while the page scrolls. The page's scroll-padding-top follows the header's height, so
|
|
13
|
+
* what takes focus is scrolled clear of it. Off by default.
|
|
14
|
+
*/
|
|
15
|
+
sticky?: boolean;
|
|
16
|
+
className?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The banner: lockup, navigation, actions and the phone menu, in one row that wraps rather than overflowing.
|
|
20
|
+
* Below `lg` the nav gives way to the Menu button, whose panel opens under the row. Server-safe.
|
|
21
|
+
*/
|
|
22
|
+
export declare function SiteHeader({ lockup, nav, actions, menu, sticky, className }: SiteHeaderProps): import("react").JSX.Element;
|
|
23
|
+
//# sourceMappingURL=site-header.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-header.d.ts","sourceRoot":"","sources":["../../src/shell/site-header.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,MAAM,WAAW,eAAe;IAC9B,mDAAmD;IACnD,MAAM,EAAE,SAAS,CAAC;IAClB,oDAAoD;IACpD,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,qDAAqD;IACrD,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,oEAAoE;IACpE,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,eAAe,+BAuB5F"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from '../lib/cn.js';
|
|
3
|
+
import { SiteHeaderPadding } from './site-header-padding.js';
|
|
4
|
+
/**
|
|
5
|
+
* The banner: lockup, navigation, actions and the phone menu, in one row that wraps rather than overflowing.
|
|
6
|
+
* Below `lg` the nav gives way to the Menu button, whose panel opens under the row. Server-safe.
|
|
7
|
+
*/
|
|
8
|
+
export function SiteHeader({ lockup, nav, actions, menu, sticky, className }) {
|
|
9
|
+
return (_jsxs("header", { "data-site-header-sticky": sticky ? '' : undefined,
|
|
10
|
+
// Its own view-transition name, so a page transition leaves it still, as the dashboard's header is.
|
|
11
|
+
style: { viewTransitionName: 'site-header' }, className: cn('relative z-(--z-header) border-b border-border bg-background', sticky && 'sticky top-0', className), children: [sticky && _jsx(SiteHeaderPadding, {}), _jsxs("div", { className: "site-container flex min-h-16 flex-wrap items-center gap-x-4 gap-y-2 py-2", children: [_jsx("div", { className: "me-auto flex min-w-0 items-center", children: lockup }), nav, actions && (_jsx("div", { className: "flex flex-wrap items-center gap-(--control-gap)", children: actions })), menu] })] }));
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=site-header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-header.js","sourceRoot":"","sources":["../../src/shell/site-header.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAmB7D;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAmB;IAC3F,OAAO,CACL,6CAC2B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;QAChD,oGAAoG;QACpG,KAAK,EAAE,EAAE,kBAAkB,EAAE,aAAa,EAAE,EAC5C,SAAS,EAAE,EAAE,CACX,8DAA8D,EAC9D,MAAM,IAAI,cAAc,EACxB,SAAS,CACV,aAEA,MAAM,IAAI,KAAC,iBAAiB,KAAG,EAChC,eAAK,SAAS,EAAC,0EAA0E,aACvF,cAAK,SAAS,EAAC,mCAAmC,YAAE,MAAM,GAAO,EAChE,GAAG,EACH,OAAO,IAAI,CACV,cAAK,SAAS,EAAC,iDAAiD,YAAE,OAAO,GAAO,CACjF,EACA,IAAI,IACD,IACC,CACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type SiteNavItem } from './site-path.js';
|
|
2
|
+
export interface SiteMenuProps {
|
|
3
|
+
/** The same list, in the same order, as SiteNav and the footer's full group. */
|
|
4
|
+
items: SiteNavItem[];
|
|
5
|
+
/** The current path. Default: the SitePathProvider's. */
|
|
6
|
+
current?: string;
|
|
7
|
+
/** The button's label. */
|
|
8
|
+
label?: string;
|
|
9
|
+
/** The name of the navigation in the panel: the same as SiteNav's, since only one shows at a time. */
|
|
10
|
+
navLabel?: string;
|
|
11
|
+
/**
|
|
12
|
+
* Where the control goes before the page's JavaScript runs: the footer group that lists every item
|
|
13
|
+
* (`<SiteFooterGroup id="site-nav">`). So every link can be reached with JavaScript off.
|
|
14
|
+
*/
|
|
15
|
+
fallbackHref?: string;
|
|
16
|
+
/** Start open (previews and tests). */
|
|
17
|
+
defaultExpanded?: boolean;
|
|
18
|
+
className?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The navigation on a narrow screen, below the `lg` breakpoint: a Menu button and a panel that pushes the page
|
|
22
|
+
* down rather than covering it, so nothing covers what has focus. Escape closes it and puts focus back on the
|
|
23
|
+
* button (React Aria's Disclosure has no Escape of its own). Before hydration the control is a link to the
|
|
24
|
+
* footer's full navigation; hydration swaps it for the button, and keeps focus if it was there.
|
|
25
|
+
*/
|
|
26
|
+
export declare function SiteMenu({ items, current, label, navLabel, fallbackHref, defaultExpanded, className, }: SiteMenuProps): import("react").JSX.Element;
|
|
27
|
+
//# sourceMappingURL=site-menu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-menu.d.ts","sourceRoot":"","sources":["../../src/shell/site-menu.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,gFAAgF;IAChF,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sGAAsG;IACtG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uCAAuC;IACvC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAcD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,OAAO,EACP,KAAc,EACd,QAAoB,EACpB,YAA0B,EAC1B,eAAuB,EACvB,SAAS,GACV,EAAE,aAAa,+BAsEf"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useLayoutEffect, useRef, useState, useSyncExternalStore } from 'react';
|
|
4
|
+
import { Menu as MenuIcon, X } from 'lucide-react';
|
|
5
|
+
import { Button as RACButton, Disclosure, DisclosurePanel } from 'react-aria-components';
|
|
6
|
+
import { cn } from '../lib/cn.js';
|
|
7
|
+
import { SiteNavLink } from './site-nav-link.js';
|
|
8
|
+
import { samePath } from './site-path.js';
|
|
9
|
+
// Layer 1: the button (a link before hydration), at least --target-min both ways. The paint is the same for
|
|
10
|
+
// both, so the swap doesn't move anything. Both sets of state variants: React Aria's data-* on the button, the
|
|
11
|
+
// browser's :hover and :focus-visible on the link.
|
|
12
|
+
const noSubscription = () => () => { };
|
|
13
|
+
const onClient = () => true;
|
|
14
|
+
const onServer = () => false;
|
|
15
|
+
const target = 'group/site-menu relative inline-flex min-h-target min-w-target shrink-0 cursor-pointer items-center justify-center no-underline outline-none';
|
|
16
|
+
const paint = 'inline-flex min-h-control items-center gap-2 rounded-md border border-input bg-background px-(--control-pad-x) text-sm font-semibold text-foreground group-hover/site-menu:bg-accent group-data-hovered/site-menu:bg-accent group-focus-visible/site-menu:focus-ring group-data-focus-visible/site-menu:focus-ring';
|
|
17
|
+
/**
|
|
18
|
+
* The navigation on a narrow screen, below the `lg` breakpoint: a Menu button and a panel that pushes the page
|
|
19
|
+
* down rather than covering it, so nothing covers what has focus. Escape closes it and puts focus back on the
|
|
20
|
+
* button (React Aria's Disclosure has no Escape of its own). Before hydration the control is a link to the
|
|
21
|
+
* footer's full navigation; hydration swaps it for the button, and keeps focus if it was there.
|
|
22
|
+
*/
|
|
23
|
+
export function SiteMenu({ items, current, label = 'Menu', navLabel = 'Primary', fallbackHref = '#site-nav', defaultExpanded = false, className, }) {
|
|
24
|
+
// false while the server renders and the page hydrates, true from then on: React renders the link first and
|
|
25
|
+
// swaps in the button straight after hydration. A client-only render (no server HTML) starts at true.
|
|
26
|
+
const hydrated = useSyncExternalStore(noSubscription, onClient, onServer);
|
|
27
|
+
const [open, setOpen] = useState(defaultExpanded);
|
|
28
|
+
const wrapper = useRef(null);
|
|
29
|
+
const link = useRef(null);
|
|
30
|
+
const trigger = useRef(null);
|
|
31
|
+
const hadFocus = useRef(false);
|
|
32
|
+
// Once hydrated with the link still showing, note whether it has focus, so the button can take it over.
|
|
33
|
+
useLayoutEffect(() => {
|
|
34
|
+
if (!hydrated)
|
|
35
|
+
hadFocus.current = document.activeElement === link.current;
|
|
36
|
+
}, [hydrated]);
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
if (hydrated && hadFocus.current)
|
|
39
|
+
trigger.current?.focus();
|
|
40
|
+
}, [hydrated]);
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
if (!open)
|
|
43
|
+
return;
|
|
44
|
+
const onKeyDown = (e) => {
|
|
45
|
+
if (e.key !== 'Escape' || !wrapper.current?.contains(document.activeElement))
|
|
46
|
+
return;
|
|
47
|
+
setOpen(false);
|
|
48
|
+
trigger.current?.focus();
|
|
49
|
+
};
|
|
50
|
+
document.addEventListener('keydown', onKeyDown);
|
|
51
|
+
return () => document.removeEventListener('keydown', onKeyDown);
|
|
52
|
+
}, [open]);
|
|
53
|
+
const visual = (_jsxs("span", { className: paint, children: [open ? (_jsx(X, { "aria-hidden": "true", className: "size-5 shrink-0" })) : (_jsx(MenuIcon, { "aria-hidden": "true", className: "size-5 shrink-0" })), label] }));
|
|
54
|
+
return (_jsx("div", { ref: wrapper, className: cn('contents site-lg:hidden', className), children: hydrated ? (_jsxs(Disclosure, { isExpanded: open, onExpandedChange: setOpen, className: "contents", children: [_jsx(RACButton, { slot: "trigger", ref: trigger, className: target, children: visual }), _jsx(DisclosurePanel, { className: "basis-full", children: _jsx("nav", { "aria-label": navLabel, className: "pb-3", children: _jsx("ul", { className: "flex flex-col gap-(--nav-item-gap)", children: items.map((item) => (_jsx("li", { children: _jsx(SiteNavLink, { variant: "menu", href: item.href, isCurrent: current !== undefined ? samePath(item.href, current) : undefined, children: item.label }) }, item.href))) }) }) })] })) : (_jsx("a", { ref: link, href: fallbackHref, className: target, children: visual })) }));
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=site-menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-menu.js","sourceRoot":"","sources":["../../src/shell/site-menu.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import { type LinkProps as RACLinkProps } from 'react-aria-components';
|
|
3
|
+
/**
|
|
4
|
+
* The page being shown, for every SiteNavLink under it that isn't told `isCurrent`. Give it the router's path
|
|
5
|
+
* (`usePathname()` in Next), in a client component around the site shell; templates/next/site-router.tsx does.
|
|
6
|
+
*/
|
|
7
|
+
export declare function SitePathProvider({ path, children }: {
|
|
8
|
+
path: string;
|
|
9
|
+
children: ReactNode;
|
|
10
|
+
}): import("react").JSX.Element;
|
|
11
|
+
export type SiteNavLinkVariant = 'header' | 'menu' | 'footer';
|
|
12
|
+
export interface SiteNavLinkProps extends Omit<RACLinkProps, 'className' | 'children'> {
|
|
13
|
+
href: string;
|
|
14
|
+
children: ReactNode;
|
|
15
|
+
/** Mark it as the current page. Default: its href is the SitePathProvider's path. */
|
|
16
|
+
isCurrent?: boolean;
|
|
17
|
+
/** `header`: in the header's nav. `menu`: a row in the phone menu. `footer`: in a footer group. */
|
|
18
|
+
variant?: SiteNavLinkVariant;
|
|
19
|
+
/** Layer 1, the target. */
|
|
20
|
+
className?: string;
|
|
21
|
+
}
|
|
22
|
+
/** A link in a site's navigation: the header, the phone menu or a footer group. Three layers, like Button. */
|
|
23
|
+
export declare function SiteNavLink({ href, children, isCurrent, variant, className, ...props }: SiteNavLinkProps): import("react").JSX.Element;
|
|
24
|
+
//# sourceMappingURL=site-nav-link.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-nav-link.d.ts","sourceRoot":"","sources":["../../src/shell/site-nav-link.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,EAAmB,KAAK,SAAS,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAMxF;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAEzF;AAED,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE9D,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,YAAY,EAAE,WAAW,GAAG,UAAU,CAAC;IACpF,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,SAAS,CAAC;IACpB,qFAAqF;IACrF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mGAAmG;IACnG,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAsBD,8GAA8G;AAC9G,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,OAAkB,EAClB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,gBAAgB,+BAalB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { createContext, useContext } from 'react';
|
|
4
|
+
import { Link as RACLink } from 'react-aria-components';
|
|
5
|
+
import { cn } from '../lib/cn.js';
|
|
6
|
+
import { samePath } from './site-path.js';
|
|
7
|
+
const SitePathContext = createContext(null);
|
|
8
|
+
/**
|
|
9
|
+
* The page being shown, for every SiteNavLink under it that isn't told `isCurrent`. Give it the router's path
|
|
10
|
+
* (`usePathname()` in Next), in a client component around the site shell; templates/next/site-router.tsx does.
|
|
11
|
+
*/
|
|
12
|
+
export function SitePathProvider({ path, children }) {
|
|
13
|
+
return _jsx(SitePathContext.Provider, { value: path, children: children });
|
|
14
|
+
}
|
|
15
|
+
// Layer 1: the React Aria link, at least --target-min both ways.
|
|
16
|
+
const targets = {
|
|
17
|
+
header: 'group/site-nav relative inline-flex min-h-target min-w-target shrink-0 cursor-pointer items-center justify-center no-underline outline-none',
|
|
18
|
+
menu: 'group/site-nav relative flex min-h-target w-full cursor-pointer items-center no-underline outline-none',
|
|
19
|
+
footer: 'group/site-nav relative inline-flex min-h-target min-w-target cursor-pointer items-center no-underline outline-none',
|
|
20
|
+
};
|
|
21
|
+
// Layer 2: the paint. The current page is marked by weight plus a marker (header, footer) or the sidebar's
|
|
22
|
+
// fill, marker and weight (menu): never by colour alone. text-sm, not text-ui: a type utility sets its own weight,
|
|
23
|
+
// which would win over the current page's font-bold.
|
|
24
|
+
const paints = {
|
|
25
|
+
header: 'relative inline-flex min-h-nav-item items-center rounded-md px-3 text-sm text-foreground group-data-hovered/site-nav:bg-accent group-data-focus-visible/site-nav:focus-ring group-aria-[current=page]/site-nav:font-bold group-aria-[current=page]/site-nav:after:absolute group-aria-[current=page]/site-nav:after:inset-x-3 group-aria-[current=page]/site-nav:after:bottom-0.5 group-aria-[current=page]/site-nav:after:h-0.5 group-aria-[current=page]/site-nav:after:rounded-full group-aria-[current=page]/site-nav:after:bg-foreground',
|
|
26
|
+
menu: 'relative flex min-h-nav-item w-full items-center rounded-md px-3 text-sm text-foreground group-data-hovered/site-nav:bg-accent group-data-focus-visible/site-nav:focus-ring group-aria-[current=page]/site-nav:bg-brand-subtle group-aria-[current=page]/site-nav:font-bold group-aria-[current=page]/site-nav:before:absolute group-aria-[current=page]/site-nav:before:inset-y-2 group-aria-[current=page]/site-nav:before:left-0 group-aria-[current=page]/site-nav:before:w-[3px] group-aria-[current=page]/site-nav:before:rounded-full group-aria-[current=page]/site-nav:before:bg-sidebar-primary',
|
|
27
|
+
footer: 'inline-flex items-center rounded-sm text-sm text-muted-foreground group-data-hovered/site-nav:text-foreground group-data-hovered/site-nav:underline group-data-focus-visible/site-nav:focus-ring group-aria-[current=page]/site-nav:font-bold group-aria-[current=page]/site-nav:text-foreground',
|
|
28
|
+
};
|
|
29
|
+
/** A link in a site's navigation: the header, the phone menu or a footer group. Three layers, like Button. */
|
|
30
|
+
export function SiteNavLink({ href, children, isCurrent, variant = 'header', className, ...props }) {
|
|
31
|
+
const path = useContext(SitePathContext);
|
|
32
|
+
const current = isCurrent ?? (path != null && samePath(path, href));
|
|
33
|
+
return (_jsx(RACLink, { ...props, href: href, "aria-current": current ? 'page' : undefined, className: cn(targets[variant], className), children: _jsx("span", { className: paints[variant], children: children }) }));
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=site-nav-link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-nav-link.js","sourceRoot":"","sources":["../../src/shell/site-nav-link.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,aAAa,EAAE,UAAU,EAAkB,MAAM,OAAO,CAAC;AAClE,OAAO,EAAE,IAAI,IAAI,OAAO,EAAkC,MAAM,uBAAuB,CAAC;AACxF,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,eAAe,GAAG,aAAa,CAAgB,IAAI,CAAC,CAAC;AAE3D;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAyC;IACxF,OAAO,KAAC,eAAe,CAAC,QAAQ,IAAC,KAAK,EAAE,IAAI,YAAG,QAAQ,GAA4B,CAAC;AACtF,CAAC;AAeD,iEAAiE;AACjE,MAAM,OAAO,GAAuC;IAClD,MAAM,EACJ,6IAA6I;IAC/I,IAAI,EAAE,wGAAwG;IAC9G,MAAM,EACJ,qHAAqH;CACxH,CAAC;AAEF,2GAA2G;AAC3G,mHAAmH;AACnH,qDAAqD;AACrD,MAAM,MAAM,GAAuC;IACjD,MAAM,EACJ,+gBAA+gB;IACjhB,IAAI,EAAE,2kBAA2kB;IACjlB,MAAM,EACJ,kSAAkS;CACrS,CAAC;AAEF,8GAA8G;AAC9G,MAAM,UAAU,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,OAAO,GAAG,QAAQ,EAClB,SAAS,EACT,GAAG,KAAK,EACS;IACjB,MAAM,IAAI,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,SAAS,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACpE,OAAO,CACL,KAAC,OAAO,OACF,KAAK,EACT,IAAI,EAAE,IAAI,kBACI,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAC1C,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,YAE1C,eAAM,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,YAAG,QAAQ,GAAQ,GAC3C,CACX,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type SiteNavItem } from './site-path.js';
|
|
2
|
+
export interface SiteNavProps {
|
|
3
|
+
/** The site's navigation, once: the same list feeds SiteMenu and the footer, so the order never differs. */
|
|
4
|
+
items: SiteNavItem[];
|
|
5
|
+
/** The current path. Default: the SitePathProvider's. */
|
|
6
|
+
current?: string;
|
|
7
|
+
label?: string;
|
|
8
|
+
className?: string;
|
|
9
|
+
}
|
|
10
|
+
/** The header's navigation, from the `lg` breakpoint up; below it, SiteMenu takes over. Server-safe. */
|
|
11
|
+
export declare function SiteNav({ items, current, label, className }: SiteNavProps): import("react").JSX.Element;
|
|
12
|
+
//# sourceMappingURL=site-nav.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-nav.d.ts","sourceRoot":"","sources":["../../src/shell/site-nav.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE5D,MAAM,WAAW,YAAY;IAC3B,4GAA4G;IAC5G,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wGAAwG;AACxG,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAiB,EAAE,SAAS,EAAE,EAAE,YAAY,+BAiBrF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from '../lib/cn.js';
|
|
3
|
+
import { SiteNavLink } from './site-nav-link.js';
|
|
4
|
+
import { samePath } from './site-path.js';
|
|
5
|
+
/** The header's navigation, from the `lg` breakpoint up; below it, SiteMenu takes over. Server-safe. */
|
|
6
|
+
export function SiteNav({ items, current, label = 'Primary', className }) {
|
|
7
|
+
return (_jsx("nav", { "aria-label": label, className: cn('hidden site-lg:block', className), children: _jsx("ul", { className: "flex flex-wrap items-center gap-x-1 gap-y-1", children: items.map((item) => (_jsx("li", { children: _jsx(SiteNavLink, { href: item.href, isCurrent: current !== undefined ? samePath(item.href, current) : undefined, children: item.label }) }, item.href))) }) }));
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=site-nav.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-nav.js","sourceRoot":"","sources":["../../src/shell/site-nav.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAoB,MAAM,gBAAgB,CAAC;AAW5D,wGAAwG;AACxG,MAAM,UAAU,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,GAAG,SAAS,EAAE,SAAS,EAAgB;IACpF,OAAO,CACL,4BAAiB,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,sBAAsB,EAAE,SAAS,CAAC,YACtE,aAAI,SAAS,EAAC,6CAA6C,YACxD,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,uBACE,KAAC,WAAW,IACV,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,SAAS,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,YAE1E,IAAI,CAAC,KAAK,GACC,IANP,IAAI,CAAC,IAAI,CAOb,CACN,CAAC,GACC,GACD,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** One entry in a site's navigation. The same list feeds SiteNav, SiteMenu and a SiteFooterGroup, in one order. */
|
|
2
|
+
export interface SiteNavItem {
|
|
3
|
+
href: string;
|
|
4
|
+
label: string;
|
|
5
|
+
}
|
|
6
|
+
/** Whether two paths are the same page: the query, the fragment and a trailing slash don't count. */
|
|
7
|
+
export declare function samePath(a: string, b: string): boolean;
|
|
8
|
+
//# sourceMappingURL=site-path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-path.d.ts","sourceRoot":"","sources":["../../src/shell/site-path.ts"],"names":[],"mappings":"AAGA,mHAAmH;AACnH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAOD,qGAAqG;AACrG,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAEtD"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// No 'use client': the server-safe site parts (SiteNav, SiteFooterGroup) call this, and a function from a client
|
|
2
|
+
// module is only a reference on the server.
|
|
3
|
+
const normal = (path) => {
|
|
4
|
+
const bare = path.split(/[?#]/)[0] || '/';
|
|
5
|
+
return bare.length > 1 ? bare.replace(/\/+$/, '') : bare;
|
|
6
|
+
};
|
|
7
|
+
/** Whether two paths are the same page: the query, the fragment and a trailing slash don't count. */
|
|
8
|
+
export function samePath(a, b) {
|
|
9
|
+
return normal(a) === normal(b);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=site-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-path.js","sourceRoot":"","sources":["../../src/shell/site-path.ts"],"names":[],"mappings":"AAAA,iHAAiH;AACjH,4CAA4C;AAQ5C,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE;IAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;IAC1C,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3D,CAAC,CAAC;AAEF,qGAAqG;AACrG,MAAM,UAAU,QAAQ,CAAC,CAAS,EAAE,CAAS;IAC3C,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { HTMLAttributes, ReactNode } from 'react';
|
|
2
|
+
export interface SiteShellProps {
|
|
3
|
+
children: ReactNode;
|
|
4
|
+
/** The skip link's text. */
|
|
5
|
+
skipLinkLabel?: string;
|
|
6
|
+
/** The id of the SiteMain the skip link goes to. */
|
|
7
|
+
mainId?: string;
|
|
8
|
+
className?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* A public page: a skip link, then a SiteHeader, a SiteMain and a SiteFooter, one column of full-width sections.
|
|
12
|
+
* The document scrolls, not main. Server-safe: it holds no state.
|
|
13
|
+
*/
|
|
14
|
+
export declare function SiteShell({ children, skipLinkLabel, mainId, className, }: SiteShellProps): import("react").JSX.Element;
|
|
15
|
+
export interface SiteMainProps extends HTMLAttributes<HTMLElement> {
|
|
16
|
+
children: ReactNode;
|
|
17
|
+
/** Match SiteShell's mainId. */
|
|
18
|
+
id?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The main landmark and the skip link's target (tabIndex -1: focus lands here, Tab doesn't stop here). Not a
|
|
22
|
+
* scroll container: on a public page the document scrolls.
|
|
23
|
+
*/
|
|
24
|
+
export declare function SiteMain({ children, id, className, ...props }: SiteMainProps): import("react").JSX.Element;
|
|
25
|
+
//# sourceMappingURL=site-shell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-shell.d.ts","sourceRoot":"","sources":["../../src/shell/site-shell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,SAAS,CAAC;IACpB,4BAA4B;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,aAAsC,EACtC,MAAe,EACf,SAAS,GACV,EAAE,cAAc,+BAkBhB;AAED,MAAM,WAAW,aAAc,SAAQ,cAAc,CAAC,WAAW,CAAC;IAChE,QAAQ,EAAE,SAAS,CAAC;IACpB,gCAAgC;IAChC,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAW,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,+BAWrF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from '../lib/cn.js';
|
|
3
|
+
/**
|
|
4
|
+
* A public page: a skip link, then a SiteHeader, a SiteMain and a SiteFooter, one column of full-width sections.
|
|
5
|
+
* The document scrolls, not main. Server-safe: it holds no state.
|
|
6
|
+
*/
|
|
7
|
+
export function SiteShell({ children, skipLinkLabel = 'Skip to main content', mainId = 'main', className, }) {
|
|
8
|
+
return (_jsxs("div", { "data-site-shell": "", className: cn('relative flex min-h-dvh flex-col bg-background text-foreground', className), children: [_jsx("a", { href: `#${mainId}`, className: "group/skip absolute top-2 left-4 z-(--z-popover) inline-flex min-h-target min-w-target -translate-y-[200%] cursor-pointer items-center no-underline outline-none focus:translate-y-0", children: _jsx("span", { className: "inline-flex min-h-control items-center rounded-md bg-primary px-(--control-pad-x) text-sm font-semibold text-primary-foreground group-focus-visible/skip:focus-ring", children: skipLinkLabel }) }), children] }));
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* The main landmark and the skip link's target (tabIndex -1: focus lands here, Tab doesn't stop here). Not a
|
|
12
|
+
* scroll container: on a public page the document scrolls.
|
|
13
|
+
*/
|
|
14
|
+
export function SiteMain({ children, id = 'main', className, ...props }) {
|
|
15
|
+
return (_jsx("main", { ...props, id: id, tabIndex: -1, className: cn('relative flex-1 outline-none', className), children: children }));
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=site-shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-shell.js","sourceRoot":"","sources":["../../src/shell/site-shell.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAWlC;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,EACxB,QAAQ,EACR,aAAa,GAAG,sBAAsB,EACtC,MAAM,GAAG,MAAM,EACf,SAAS,GACM;IACf,OAAO,CACL,kCACkB,EAAE,EAClB,SAAS,EAAE,EAAE,CAAC,gEAAgE,EAAE,SAAS,CAAC,aAG1F,YACE,IAAI,EAAE,IAAI,MAAM,EAAE,EAClB,SAAS,EAAC,sLAAsL,YAEhM,eAAM,SAAS,EAAC,qKAAqK,YAClL,aAAa,GACT,GACL,EACH,QAAQ,IACL,CACP,CAAC;AACJ,CAAC;AAQD;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,EAAiB;IACpF,OAAO,CACL,kBACM,KAAK,EACT,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,CAAC,CAAC,EACZ,SAAS,EAAE,EAAE,CAAC,8BAA8B,EAAE,SAAS,CAAC,YAEvD,QAAQ,GACJ,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/* @setsquare/ui styles — generated from tokens/tokens.json by scripts/build-css.mjs. Do not edit. */
|
|
2
|
+
/* In the app's global stylesheet, after Tailwind:
|
|
3
|
+
@import "tailwindcss";
|
|
4
|
+
@import "@setsquare/ui/styles.css"; */
|
|
5
|
+
@import "./theme.css";
|
|
6
|
+
@import "./tokens.css";
|
|
7
|
+
/* Tailwind does not scan node_modules: this points it at the components' compiled class names. */
|
|
8
|
+
@source "../**/*.js";
|
|
9
|
+
@custom-variant dark (&:is(.dark *));
|
|
10
|
+
@custom-variant aaa (&:where([data-conformance="aaa"] *));
|