@setsquare/ui 0.6.0 → 0.8.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.
Files changed (63) hide show
  1. package/CHANGELOG.md +102 -0
  2. package/README.md +9 -5
  3. package/dist/index.d.ts +6 -2
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +1 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/lib/cn.d.ts.map +1 -1
  8. package/dist/lib/cn.js +1 -0
  9. package/dist/lib/cn.js.map +1 -1
  10. package/dist/lib/english.d.ts.map +1 -1
  11. package/dist/lib/english.js +2 -0
  12. package/dist/lib/english.js.map +1 -1
  13. package/dist/lib/keyshortcuts.d.ts +13 -0
  14. package/dist/lib/keyshortcuts.d.ts.map +1 -0
  15. package/dist/lib/keyshortcuts.js +21 -0
  16. package/dist/lib/keyshortcuts.js.map +1 -0
  17. package/dist/lib/locale.d.ts +4 -1
  18. package/dist/lib/locale.d.ts.map +1 -1
  19. package/dist/lib/locale.js.map +1 -1
  20. package/dist/lib/search-match.d.ts +31 -0
  21. package/dist/lib/search-match.d.ts.map +1 -0
  22. package/dist/lib/search-match.js +82 -0
  23. package/dist/lib/search-match.js.map +1 -0
  24. package/dist/lib/search-shortcut.d.ts +16 -0
  25. package/dist/lib/search-shortcut.d.ts.map +1 -0
  26. package/dist/lib/search-shortcut.js +49 -0
  27. package/dist/lib/search-shortcut.js.map +1 -0
  28. package/dist/shell/app-header.d.ts +4 -1
  29. package/dist/shell/app-header.d.ts.map +1 -1
  30. package/dist/shell/app-header.js +6 -3
  31. package/dist/shell/app-header.js.map +1 -1
  32. package/dist/shell/dashboard-shell.d.ts +13 -2
  33. package/dist/shell/dashboard-shell.d.ts.map +1 -1
  34. package/dist/shell/dashboard-shell.js +5 -2
  35. package/dist/shell/dashboard-shell.js.map +1 -1
  36. package/dist/shell/nav-status.d.ts +46 -0
  37. package/dist/shell/nav-status.d.ts.map +1 -0
  38. package/dist/shell/nav-status.js +26 -0
  39. package/dist/shell/nav-status.js.map +1 -0
  40. package/dist/shell/rail.d.ts +73 -0
  41. package/dist/shell/rail.d.ts.map +1 -0
  42. package/dist/shell/rail.js +87 -0
  43. package/dist/shell/rail.js.map +1 -0
  44. package/dist/shell/sidebar.d.ts +31 -6
  45. package/dist/shell/sidebar.d.ts.map +1 -1
  46. package/dist/shell/sidebar.js +45 -8
  47. package/dist/shell/sidebar.js.map +1 -1
  48. package/dist/styles/theme.css +78 -0
  49. package/dist/styles/tokens.css +4 -4
  50. package/dist/tokens.json +4 -4
  51. package/dist/ui/button.d.ts +3 -2
  52. package/dist/ui/button.d.ts.map +1 -1
  53. package/dist/ui/button.js +7 -4
  54. package/dist/ui/button.js.map +1 -1
  55. package/dist/ui/search.d.ts +19 -3
  56. package/dist/ui/search.d.ts.map +1 -1
  57. package/dist/ui/search.js +55 -23
  58. package/dist/ui/search.js.map +1 -1
  59. package/dist/ui/tree.d.ts +5 -3
  60. package/dist/ui/tree.d.ts.map +1 -1
  61. package/dist/ui/tree.js +4 -2
  62. package/dist/ui/tree.js.map +1 -1
  63. package/package.json +1 -1
@@ -11,6 +11,7 @@ import { Menu, MenuItem, MenuTrigger, Popover } from '../ui/menu.js';
11
11
  import { Sheet } from '../ui/sheet.js';
12
12
  import { Tooltip, TooltipTrigger } from '../ui/tooltip.js';
13
13
  import { useShell } from './dashboard-shell.js';
14
+ import { NavDetail, NavIcon, warnUnlabelledStatus } from './nav-status.js';
14
15
  const SidebarCollapsedContext = createContext(false);
15
16
  /** True when the sidebar shows icons only (never inside the mobile Sheet). */
16
17
  export const useSidebarCollapsed = () => useContext(SidebarCollapsedContext);
@@ -19,6 +20,12 @@ export const sidebarLabels = {
19
20
  primary: 'Primary',
20
21
  count: ', {count, number}',
21
22
  tipCount: '{name} ({count, number})',
23
+ detail: ', {detail}',
24
+ detailWarning: ', {detail}, warning',
25
+ status: ', {status}',
26
+ tipDetail: '{name} ({detail})',
27
+ tipDetailWarning: '{name} ({detail}, warning)',
28
+ tipStatus: '{tip}: {status}',
22
29
  };
23
30
  /**
24
31
  * The full-height sidebar. Expanded, collapsed to icons (labels stay in the accessibility tree
@@ -52,14 +59,33 @@ export function SidebarGroup({ label, children, className, }) {
52
59
  export function SidebarList({ children, className }) {
53
60
  return _jsx("ul", { className: cn('flex flex-col gap-(--nav-item-gap)', className), children: children });
54
61
  }
55
- export function SidebarItem({ href, icon, children, isCurrent, count, onPress }) {
62
+ /** A collapsed item's tooltip: its name, then its count, detail and status, each through its own template. */
63
+ export function navTooltip(t, name, { count, detail, detailTone, statusLabel, }) {
64
+ let tip = count != null ? t('tipCount', { name, count }) : name;
65
+ if (detail)
66
+ tip = t(detailTone === 'warning' ? 'tipDetailWarning' : 'tipDetail', { name: tip, detail });
67
+ if (statusLabel)
68
+ tip = t('tipStatus', { tip, status: statusLabel });
69
+ return tip;
70
+ }
71
+ export function SidebarItem({ href, icon, children, isCurrent, count, onPress, detail, detailTone, status, statusLabel, }) {
56
72
  const collapsed = useSidebarCollapsed();
57
73
  const t = useLabels('sidebar', sidebarLabels, undefined);
58
74
  const { locale } = useLocale();
75
+ warnUnlabelledStatus('SidebarItem', status, statusLabel);
59
76
  const link = (_jsx(Link, { href: href, onPress: onPress, "aria-current": isCurrent ? 'page' : undefined, className: cn(
60
77
  // Layer 1: the row is the target, full width and at least --target-min tall.
61
- 'group/item relative flex min-h-target w-full cursor-pointer items-center text-sm font-medium text-sidebar-foreground no-underline outline-none', 'group-data-collapsed/sidebar:justify-center'), children: _jsxs("span", { className: cn('relative flex min-h-nav-item w-full min-w-0 items-center gap-3 rounded-md px-3', 'group-data-hovered/item:bg-sidebar-accent group-data-hovered/item:text-sidebar-accent-foreground group-data-focus-visible/item:focus-ring', 'group-aria-[current=page]/item:bg-brand-subtle group-aria-[current=page]/item:font-bold group-aria-[current=page]/item:text-foreground', 'group-aria-[current=page]/item:before:absolute group-aria-[current=page]/item:before:inset-y-2 group-aria-[current=page]/item:before:left-0 group-aria-[current=page]/item:before:w-[3px] group-aria-[current=page]/item:before:rounded-full group-aria-[current=page]/item:before:bg-sidebar-primary', 'group-data-collapsed/sidebar:w-nav-item group-data-collapsed/sidebar:justify-center group-data-collapsed/sidebar:px-0'), children: [renderIcon(icon, 'size-5 shrink-0 group-aria-[current=page]/item:text-brand'), _jsxs("span", { className: "min-w-0 flex-1 truncate group-data-collapsed/sidebar:sr-only", children: [children, count != null && _jsx("span", { className: "sr-only", children: t('count', { count }) })] }), count != null && (_jsx("span", { "aria-hidden": "true", className: "text-[13px] font-medium text-muted-foreground tabular-nums group-data-collapsed/sidebar:hidden", children: new Intl.NumberFormat(locale).format(count) }))] }) }));
62
- return (_jsx("li", { children: collapsed ? (_jsxs(TooltipTrigger, { delay: 300, children: [link, _jsx(Tooltip, { placement: "right", children: count != null ? t('tipCount', { name: children, count }) : children })] })) : (link) }));
78
+ 'group/item relative flex min-h-target w-full cursor-pointer items-center text-sm font-medium text-sidebar-foreground no-underline outline-none', 'group-data-collapsed/sidebar:justify-center'), children: _jsxs("span", { className: cn('relative flex min-h-nav-item w-full min-w-0 items-center gap-3 rounded-md px-3', 'group-data-hovered/item:bg-sidebar-accent group-data-hovered/item:text-sidebar-accent-foreground group-data-focus-visible/item:focus-ring',
79
+ // The current page, as RailItem marks it: the fill, the name in brand at weight 700, and a 3px edge along
80
+ // the start, an inset shadow so it follows the rounded corners. Forced colours drop shadows and fills, so
81
+ // there the edge is a bar in Highlight.
82
+ 'group-aria-[current=page]/item:bg-brand-subtle group-aria-[current=page]/item:font-bold group-aria-[current=page]/item:text-brand', 'group-aria-[current=page]/item:shadow-[inset_3px_0_0_var(--sidebar-primary)]',
83
+ // Hovered, the current page keeps its fill: the hover ground under brand text would be a pair the audit doesn't
84
+ // promise. Stacked variants, so this is more specific than the hover rule whatever order they're written in.
85
+ 'group-data-hovered/item:group-aria-[current=page]/item:bg-brand-subtle group-data-hovered/item:group-aria-[current=page]/item:text-brand', 'forced-colors:group-aria-[current=page]/item:before:absolute forced-colors:group-aria-[current=page]/item:before:inset-y-0 forced-colors:group-aria-[current=page]/item:before:start-0 forced-colors:group-aria-[current=page]/item:before:w-[3px] forced-colors:group-aria-[current=page]/item:before:rounded-s-md forced-colors:group-aria-[current=page]/item:before:bg-[Highlight] forced-colors:group-aria-[current=page]/item:before:forced-color-adjust-none', 'group-data-collapsed/sidebar:w-nav-item group-data-collapsed/sidebar:justify-center group-data-collapsed/sidebar:px-0',
86
+ // The status badge's cut-out follows the ground: the sidebar, the hovered row, the current one.
87
+ '[--nav-cut:var(--sidebar)] group-data-hovered/item:[--nav-cut:var(--sidebar-accent)] group-aria-[current=page]/item:[--nav-cut:var(--brand-subtle)] group-data-hovered/item:group-aria-[current=page]/item:[--nav-cut:var(--brand-subtle)]'), children: [_jsx(NavIcon, { icon: icon, status: status, className: "group-aria-[current=page]/item:text-brand" }), _jsxs("span", { className: "min-w-0 flex-1 truncate group-data-collapsed/sidebar:sr-only", children: [children, count != null && _jsx("span", { className: "sr-only", children: t('count', { count }) }), detail && (_jsx("span", { className: "sr-only", children: t(detailTone === 'warning' ? 'detailWarning' : 'detail', { detail }) })), statusLabel && _jsx("span", { className: "sr-only", children: t('status', { status: statusLabel }) })] }), count != null && (_jsx("span", { "aria-hidden": "true", className: "text-[13px] font-medium text-muted-foreground tabular-nums group-data-collapsed/sidebar:hidden", children: new Intl.NumberFormat(locale).format(count) })), detail && (_jsx(NavDetail, { detail: detail, tone: detailTone, className: "shrink-0 group-data-collapsed/sidebar:hidden" }))] }) }));
88
+ return (_jsx("li", { children: collapsed ? (_jsxs(TooltipTrigger, { delay: 300, children: [link, _jsx(Tooltip, { placement: "right", children: navTooltip(t, children, { count, detail, detailTone, statusLabel }) })] })) : (link) }));
63
89
  }
64
90
  /**
65
91
  * A sidebar row with rows under it. Expanded (and in the phone's Sheet), the row is a button that opens and closes
@@ -78,7 +104,11 @@ export function SidebarDisclosure({ icon, children, items, defaultExpanded, }) {
78
104
  if (collapsed) {
79
105
  return (_jsx("li", { children: _jsxs(MenuTrigger, { children: [_jsxs(TooltipTrigger, { delay: 300, children: [_jsx(RACButton, { className: target, children: _jsxs("span", { className: paint, children: [renderIcon(icon, iconClass), _jsx("span", { className: "sr-only", children: children })] }) }), _jsx(Tooltip, { placement: "right", children: children })] }), _jsx(Popover, { placement: "right top", className: "min-w-56", children: _jsx(Menu, { "aria-label": children, selectionMode: "single", selectedKeys: current ? [current.href] : [], children: items.map((item) => (_jsx(MenuItem, { id: item.href, href: item.href, children: item.label }, item.href))) }) })] }) }));
80
106
  }
81
- return (_jsx("li", { children: _jsxs(RACDisclosure, { defaultExpanded: defaultExpanded ?? !!current, className: "group/disclosure", children: [_jsx(RACButton, { slot: "trigger", className: target, children: _jsxs("span", { className: paint, children: [renderIcon(icon, iconClass), _jsx("span", { className: "min-w-0 flex-1 truncate", children: children }), _jsx(ChevronDown, { "aria-hidden": "true", className: "size-4 shrink-0 text-muted-foreground group-data-expanded/disclosure:rotate-180" })] }) }), _jsx(DisclosurePanel, { children: _jsx("ul", { className: "flex flex-col gap-(--nav-item-gap) pt-(--nav-item-gap)", children: items.map((item) => (_jsx("li", { children: _jsx(Link, { href: item.href, "aria-current": item.isCurrent ? 'page' : undefined, className: "group/sub relative flex min-h-target w-full cursor-pointer items-center text-sm font-medium text-sidebar-foreground no-underline outline-none", children: _jsx("span", { className: cn('relative flex min-h-nav-item w-full min-w-0 items-center rounded-md ps-11 pe-3', 'group-data-hovered/sub:bg-sidebar-accent group-data-hovered/sub:text-sidebar-accent-foreground group-data-focus-visible/sub:focus-ring', 'group-aria-[current=page]/sub:bg-brand-subtle group-aria-[current=page]/sub:font-bold group-aria-[current=page]/sub:text-foreground', 'group-aria-[current=page]/sub:before:absolute group-aria-[current=page]/sub:before:inset-y-2 group-aria-[current=page]/sub:before:left-0 group-aria-[current=page]/sub:before:w-[3px] group-aria-[current=page]/sub:before:rounded-full group-aria-[current=page]/sub:before:bg-sidebar-primary'), children: _jsx("span", { className: "min-w-0 flex-1 truncate", children: item.label }) }) }) }, item.href))) }) })] }) }));
107
+ return (_jsx("li", { children: _jsxs(RACDisclosure, { defaultExpanded: defaultExpanded ?? !!current, className: "group/disclosure", children: [_jsx(RACButton, { slot: "trigger", className: target, children: _jsxs("span", { className: paint, children: [renderIcon(icon, iconClass), _jsx("span", { className: "min-w-0 flex-1 truncate", children: children }), _jsx(ChevronDown, { "aria-hidden": "true", className: "size-4 shrink-0 text-muted-foreground group-data-expanded/disclosure:rotate-180" })] }) }), _jsx(DisclosurePanel, { children: _jsx("ul", { className: "flex flex-col gap-(--nav-item-gap) pt-(--nav-item-gap)", children: items.map((item) => (_jsx("li", { children: _jsx(Link, { href: item.href, "aria-current": item.isCurrent ? 'page' : undefined, className: "group/sub relative flex min-h-target w-full cursor-pointer items-center text-sm font-medium text-sidebar-foreground no-underline outline-none", children: _jsx("span", { className: cn('relative flex min-h-nav-item w-full min-w-0 items-center rounded-md ps-11 pe-3', 'group-data-hovered/sub:bg-sidebar-accent group-data-hovered/sub:text-sidebar-accent-foreground group-data-focus-visible/sub:focus-ring',
108
+ // The current page, as RailItem marks it: the fill, the name in brand at weight 700, and a 3px edge along
109
+ // the start, an inset shadow so it follows the rounded corners. Forced colours drop shadows and fills, so
110
+ // there the edge is a bar in Highlight.
111
+ 'group-aria-[current=page]/sub:bg-brand-subtle group-aria-[current=page]/sub:font-bold group-aria-[current=page]/sub:text-brand', 'group-aria-[current=page]/sub:shadow-[inset_3px_0_0_var(--sidebar-primary)]', 'group-data-hovered/sub:group-aria-[current=page]/sub:bg-brand-subtle group-data-hovered/sub:group-aria-[current=page]/sub:text-brand', 'forced-colors:group-aria-[current=page]/sub:before:absolute forced-colors:group-aria-[current=page]/sub:before:inset-y-0 forced-colors:group-aria-[current=page]/sub:before:start-0 forced-colors:group-aria-[current=page]/sub:before:w-[3px] forced-colors:group-aria-[current=page]/sub:before:rounded-s-md forced-colors:group-aria-[current=page]/sub:before:bg-[Highlight] forced-colors:group-aria-[current=page]/sub:before:forced-color-adjust-none'), children: _jsx("span", { className: "min-w-0 flex-1 truncate", children: item.label }) }) }) }, item.href))) }) })] }) }));
82
112
  }
83
113
  /** A sidebar row that opens a menu: the workspace switcher at the top, the account menu at the foot. */
84
114
  export function SidebarSwitcher({ leading, title, subtitle, menuLabel, children, onAction, selectedKey, placement = 'bottom start', }) {
@@ -103,11 +133,18 @@ export const sidebarTriggerLabels = {
103
133
  openNavigation: 'Open navigation',
104
134
  toggleSidebar: 'Toggle sidebar',
105
135
  };
106
- /** Collapses the sidebar to icons, or opens it as a Sheet on phones. */
136
+ /**
137
+ * Collapses the sidebar to icons, or opens it as a Sheet on phones. In a shell with `navigation="rail"` there is
138
+ * nothing to collapse, so it is only there on phones, where it opens the rail's Sheet: before the shell has measured
139
+ * itself a container query hides it from bp-md up, and once it has (or its size is forced) it isn't rendered there.
140
+ */
107
141
  export function SidebarTrigger({ labels: given, className, }) {
108
- const { size, sidebarCollapsed, toggleSidebar, mobileNavOpen, setMobileNavOpen } = useShell();
109
- const mobile = size === 'mobile';
142
+ const { size, sidebarCollapsed, toggleSidebar, mobileNavOpen, setMobileNavOpen, navigation, isSizeForced, } = useShell();
143
+ const rail = navigation === 'rail';
144
+ const mobile = size === 'mobile' || (rail && !isSizeForced);
110
145
  const t = useLabels('sidebarTrigger', sidebarTriggerLabels, given);
111
- return (_jsx(IconButton, { className: className, label: mobile ? t('openNavigation') : t('toggleSidebar'), icon: mobile ? MenuIcon : PanelLeft, "aria-expanded": mobile ? mobileNavOpen : !sidebarCollapsed, "aria-haspopup": mobile ? 'dialog' : undefined, onPress: () => (mobile ? setMobileNavOpen(true) : toggleSidebar()) }));
146
+ if (rail && isSizeForced && size !== 'mobile')
147
+ return null;
148
+ return (_jsx(IconButton, { className: cn(rail && !isSizeForced && '@min-[48rem]/shell:hidden', className), label: mobile ? t('openNavigation') : t('toggleSidebar'), icon: mobile ? MenuIcon : PanelLeft, "aria-expanded": mobile ? mobileNavOpen : !sidebarCollapsed, "aria-haspopup": mobile ? 'dialog' : undefined, onPress: () => (mobile ? setMobileNavOpen(true) : toggleSidebar()) }));
112
149
  }
113
150
  //# sourceMappingURL=sidebar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sidebar.js","sourceRoot":"","sources":["../../src/shell/sidebar.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,KAAK,EAAkB,MAAM,OAAO,CAAC;AACzE,OAAO,EACL,MAAM,IAAI,SAAS,EACnB,UAAU,IAAI,aAAa,EAC3B,eAAe,EACf,IAAI,EACJ,SAAS,GAEV,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,IAAI,IAAI,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAiB,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,MAAM,uBAAuB,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;AACrD,8EAA8E;AAC9E,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC;AAc7E,MAAM,CAAC,MAAM,aAAa,GAAkB;IAC1C,UAAU,EAAE,sBAAsB;IAClC,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,mBAAmB;IAC1B,QAAQ,EAAE,0BAA0B;CACrC,CAAC;AAUF;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAgB;IAC7F,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,YAAY,EAAE,GAC1F,QAAQ,EAAE,CAAC;IACb,MAAM,CAAC,GAAG,SAAS,CAAC,SAAS,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,UAAU,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC;IACzC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,OAAO,CACL,KAAC,KAAK,IACJ,IAAI,EAAC,MAAM,EACX,MAAM,EAAE,aAAa,EACrB,YAAY,EAAE,gBAAgB,gBAClB,CAAC,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,YAErD,KAAC,uBAAuB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAC5C,4BAAiB,KAAK,EAAE,SAAS,EAAC,sDAAsD,YACrF,QAAQ,GACL,GAC2B,GAC7B,CACT,CAAC;IACJ,CAAC;IACD,OAAO,CACL,KAAC,uBAAuB,CAAC,QAAQ,IAAC,KAAK,EAAE,gBAAgB,YACvD,4BACc,KAAK,oBACD,gBAAgB,IAAI,SAAS,EAC7C,KAAK,EAAE,EAAE,kBAAkB,EAAE,eAAe,EAAE,EAC9C,SAAS,EAAE,EAAE,CACX,uFAAuF,EACvF,yHAAyH,EACzH,oCAAoC,EACpC,CAAC,YAAY,IAAI,2BAA2B,EAC5C,SAAS,CACV,YAEA,QAAQ,GACL,GAC2B,CACpC,CAAC;AACJ,CAAC;AAED,wGAAwG;AACxG,MAAM,YAAY,GAChB,0HAA0H,CAAC;AAE7H,MAAM,UAAU,aAAa,CAAC,EAC5B,QAAQ,EACR,SAAS,GAIV;IACC,OAAO,cAAK,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,YAAG,QAAQ,GAAO,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAC7B,QAAQ,EACR,SAAS,GAIV;IACC,OAAO,CACL,cACE,SAAS,EAAE,EAAE,CAAC,mDAAmD,EAAE,YAAY,EAAE,SAAS,CAAC,YAE1F,QAAQ,GACL,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAC5B,QAAQ,EACR,SAAS,GAIV;IACC,OAAO,CACL,cACE,SAAS,EAAE,EAAE,CACX,uEAAuE,EACvE,YAAY,EACZ,SAAS,CACV,YAEA,QAAQ,GACL,CACP,CAAC;AACJ,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,EACR,SAAS,GAKV;IACC,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,OAAO,CACL,eACE,IAAI,EAAC,OAAO,qBACK,EAAE,EACnB,SAAS,EAAE,EAAE,CACX,qNAAqN,EACrN,SAAS,CACV,aAED,aACE,EAAE,EAAE,EAAE,EACN,SAAS,EAAC,0GAA0G,YAEnH,KAAK,GACH,EACL,KAAC,WAAW,cAAE,QAAQ,GAAe,IACjC,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAE,QAAQ,EAAE,SAAS,EAA+C;IAC9F,OAAO,aAAI,SAAS,EAAE,EAAE,CAAC,oCAAoC,EAAE,SAAS,CAAC,YAAG,QAAQ,GAAM,CAAC;AAC7F,CAAC;AAaD,MAAM,UAAU,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAoB;IAC/F,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;IACxC,MAAM,CAAC,GAAG,SAAS,CAAC,SAAS,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;IACzD,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,CACX,KAAC,IAAI,IACH,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,kBACF,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAC5C,SAAS,EAAE,EAAE;QACX,6EAA6E;QAC7E,gJAAgJ,EAChJ,6CAA6C,CAC9C,YAGD,gBACE,SAAS,EAAE,EAAE,CACX,gFAAgF,EAChF,2IAA2I,EAC3I,wIAAwI,EACxI,uSAAuS,EACvS,uHAAuH,CACxH,aAEA,UAAU,CAAC,IAAI,EAAE,2DAA2D,CAAC,EAC9E,gBAAM,SAAS,EAAC,8DAA8D,aAC3E,QAAQ,EACR,KAAK,IAAI,IAAI,IAAI,eAAM,SAAS,EAAC,SAAS,YAAE,CAAC,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,GAAQ,IACrE,EACN,KAAK,IAAI,IAAI,IAAI,CAChB,8BACc,MAAM,EAClB,SAAS,EAAC,gGAAgG,YAEzG,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GACvC,CACR,IACI,GACF,CACR,CAAC;IACF,OAAO,CACL,uBACG,SAAS,CAAC,CAAC,CAAC,CACX,MAAC,cAAc,IAAC,KAAK,EAAE,GAAG,aACvB,IAAI,EACL,KAAC,OAAO,IAAC,SAAS,EAAC,OAAO,YACvB,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,GAC5D,IACK,CAClB,CAAC,CAAC,CAAC,CACF,IAAI,CACL,GACE,CACN,CAAC;AACJ,CAAC;AAkBD;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAChC,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,eAAe,GACQ;IACvB,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,EAAE,CACf,6IAA6I,EAC7I,6CAA6C,CAC9C,CAAC;IACF,MAAM,KAAK,GAAG,EAAE,CACd,gFAAgF,EAChF,2IAA2I,EAC3I,uHAAuH,CACxH,CAAC;IACF,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,iBAAiB,CAAC;IAC7E,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CACL,uBACE,MAAC,WAAW,eACV,MAAC,cAAc,IAAC,KAAK,EAAE,GAAG,aACxB,KAAC,SAAS,IAAC,SAAS,EAAE,MAAM,YAC1B,gBAAM,SAAS,EAAE,KAAK,aACnB,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,EAC5B,eAAM,SAAS,EAAC,SAAS,YAAE,QAAQ,GAAQ,IACtC,GACG,EACZ,KAAC,OAAO,IAAC,SAAS,EAAC,OAAO,YAAE,QAAQ,GAAW,IAChC,EACjB,KAAC,OAAO,IAAC,SAAS,EAAC,WAAW,EAAC,SAAS,EAAC,UAAU,YACjD,KAAC,IAAI,kBACS,QAAQ,EACpB,aAAa,EAAC,QAAQ,EACtB,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,YAE1C,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,KAAC,QAAQ,IAAiB,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,YACrD,IAAI,CAAC,KAAK,IADE,IAAI,CAAC,IAAI,CAEb,CACZ,CAAC,GACG,GACC,IACE,GACX,CACN,CAAC;IACJ,CAAC;IACD,OAAO,CACL,uBACE,MAAC,aAAa,IAAC,eAAe,EAAE,eAAe,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,EAAC,kBAAkB,aACxF,KAAC,SAAS,IAAC,IAAI,EAAC,SAAS,EAAC,SAAS,EAAE,MAAM,YACzC,gBAAM,SAAS,EAAE,KAAK,aACnB,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,EAC5B,eAAM,SAAS,EAAC,yBAAyB,YAAE,QAAQ,GAAQ,EAC3D,KAAC,WAAW,mBACE,MAAM,EAClB,SAAS,EAAC,iFAAiF,GAC3F,IACG,GACG,EACZ,KAAC,eAAe,cACd,aAAI,SAAS,EAAC,wDAAwD,YACnE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,uBACE,KAAC,IAAI,IACH,IAAI,EAAE,IAAI,CAAC,IAAI,kBACD,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EACjD,SAAS,EAAC,+IAA+I,YAGzJ,eACE,SAAS,EAAE,EAAE,CACX,gFAAgF,EAChF,wIAAwI,EACxI,qIAAqI,EACrI,iSAAiS,CAClS,YAED,eAAM,SAAS,EAAC,yBAAyB,YAAE,IAAI,CAAC,KAAK,GAAQ,GACxD,GACF,IAjBA,IAAI,CAAC,IAAI,CAkBb,CACN,CAAC,GACC,GACW,IACJ,GACb,CACN,CAAC;AACJ,CAAC;AAeD,wGAAwG;AACxG,MAAM,UAAU,eAAe,CAAC,EAC9B,OAAO,EACP,KAAK,EACL,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,SAAS,GAAG,cAAc,GACL;IACrB,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;IACxC,4GAA4G;IAC5G,+GAA+G;IAC/G,gDAAgD;IAChD,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,aAAa,CACvF,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAC7D,CAAC;IACF,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC;IACjB,MAAM,MAAM,GAAG,CACb,KAAC,SAAS,IACR,SAAS,EAAE,EAAE;QACX,kFAAkF;QAClF,yGAAyG,EACzG,6CAA6C,CAC9C,YAGD,gBACE,SAAS,EAAE,EAAE,CACX,kGAAkG,EAClG,0IAA0I,EAC1I,uHAAuH,CACxH,aAEA,OAAO,EACR,eAAM,SAAS,EAAC,mEAAmE,YAChF,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;wBACrB,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;4BACzB,OAAO,CACL,eAAc,SAAS,EAAC,SAAS,YAC9B,IAAI,CAAC,KAAK,IADF,CAAC,CAEL,CACR,CAAC;wBACJ,OAAO,EAAE,CAAC;wBACV,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CACrB,eAAc,SAAS,EAAC,sCAAsC,YAC3D,IAAI,CAAC,KAAK,IADF,CAAC,CAEL,CACR,CAAC,CAAC,CAAC,QAAQ,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAC9B,eAAc,SAAS,EAAC,sDAAsD,YAC3E,IAAI,CAAC,KAAK,IADF,CAAC,CAEL,CACR,CAAC,CAAC,CAAC,CACF,eAAc,SAAS,EAAC,SAAS,YAC9B,IAAI,CAAC,KAAK,IADF,CAAC,CAEL,CACR,CAAC;oBACJ,CAAC,CAAC,GACG,EACP,KAAC,cAAc,mBACD,MAAM,EAClB,SAAS,EAAC,2EAA2E,GACrF,IACG,GACG,CACb,CAAC;IACF,OAAO,CACL,MAAC,WAAW,eACT,SAAS,CAAC,CAAC,CAAC,CACX,MAAC,cAAc,IAAC,KAAK,EAAE,GAAG,aACvB,MAAM,EACP,KAAC,OAAO,IAAC,SAAS,EAAC,OAAO,YAAE,KAAK,GAAW,IAC7B,CAClB,CAAC,CAAC,CAAC,CACF,MAAM,CACP,EACD,KAAC,OAAO,IAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EAAE,SAAS,EAAC,UAAU,YAC3E,KAAC,IAAI,IACH,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EACzD,YAAY,EAAE,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,YAE5D,QAAQ,GACJ,GACC,IACE,CACf,CAAC;AACJ,CAAC;AAUD,MAAM,CAAC,MAAM,oBAAoB,GAAyB;IACxD,cAAc,EAAE,iBAAiB;IACjC,aAAa,EAAE,gBAAgB;CAChC,CAAC;AAEF,wEAAwE;AACxE,MAAM,UAAU,cAAc,CAAC,EAC7B,MAAM,EAAE,KAAK,EACb,SAAS,GAIV;IACC,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC9F,MAAM,MAAM,GAAG,IAAI,KAAK,QAAQ,CAAC;IACjC,MAAM,CAAC,GAAG,SAAS,CAAC,gBAAgB,EAAE,oBAAoB,EAAE,KAAK,CAAC,CAAC;IACnE,OAAO,CACL,KAAC,UAAU,IACT,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,EACxD,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,mBACpB,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,gBAAgB,mBAC1C,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAC5C,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,GAClE,CACH,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"sidebar.js","sourceRoot":"","sources":["../../src/shell/sidebar.tsx"],"names":[],"mappings":"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"}
@@ -74,6 +74,7 @@
74
74
  --spacing-header: var(--header-height);
75
75
  --spacing-sidebar: var(--sidebar-width);
76
76
  --spacing-sidebar-collapsed: var(--sidebar-width-collapsed);
77
+ --spacing-rail: var(--rail-width);
77
78
  --spacing-panel: var(--panel-width);
78
79
  --spacing-choice: var(--choice-size);
79
80
  }
@@ -831,6 +832,83 @@
831
832
  }
832
833
  }
833
834
  }
835
+ /* ---------- A nav item's status (SidebarItem, RailItem): a badge on its icon, in the tab badges' language ----------
836
+ nav-icon wraps the icon and holds the badge at its top right, with a 2px cut-out in the item's own ground
837
+ (--nav-cut: the sidebar, the hovered row or the current one). Never colour alone: working is a hollow ring,
838
+ attention a solid dot inside a ring that stays. Working pulses as it appears: a halo swells three times in 4.5s
839
+ and stops, inside the five seconds 2.2.2 allows, then the ring holds still for as long as the work goes on. At AAA
840
+ and under reduced motion it never pulses. */
841
+ @keyframes setsquare-status-halo { 0% { scale: 0.6; opacity: 0.7; } 100% { scale: 1.7; opacity: 0; } }
842
+ @utility nav-icon {
843
+ position: relative;
844
+ display: inline-flex;
845
+ flex: none;
846
+ align-items: center;
847
+ justify-content: center;
848
+ }
849
+ @utility nav-status {
850
+ position: absolute;
851
+ top: -3px;
852
+ right: -4px;
853
+ width: 10px;
854
+ height: 10px;
855
+ border-radius: 999px;
856
+ box-shadow: 0 0 0 2px var(--nav-cut, var(--sidebar));
857
+ pointer-events: none;
858
+ &[data-status='working'] {
859
+ border: 2px solid var(--brand);
860
+ background-color: var(--nav-cut, var(--sidebar));
861
+ }
862
+ &[data-status='working']::before {
863
+ content: '';
864
+ position: absolute;
865
+ inset: -2px;
866
+ border: 2px solid var(--brand);
867
+ border-radius: 999px;
868
+ opacity: 0;
869
+ animation: setsquare-status-halo 1500ms cubic-bezier(0, 0, 0.2, 1) 3;
870
+ }
871
+ /* As specific as the rule above and after it, so it wins; nested in ::before, the variant would follow the
872
+ pseudo-element, and the browser drops a selector like that. */
873
+ @variant aaa {
874
+ &[data-status='working']::before {
875
+ animation: none;
876
+ }
877
+ }
878
+ &[data-status='attention'] {
879
+ background-color: var(--destructive);
880
+ }
881
+ &[data-status='attention']::after {
882
+ content: '';
883
+ position: absolute;
884
+ inset: -4px;
885
+ border: 2px solid var(--destructive);
886
+ border-radius: 999px;
887
+ }
888
+ @media (prefers-reduced-motion: reduce) {
889
+ &::before {
890
+ animation: none !important;
891
+ }
892
+ }
893
+ /* Forced colours drop box shadows and repaint borders and fills: draw both shapes in system colours. */
894
+ @media (forced-colors: active) {
895
+ forced-color-adjust: none;
896
+ box-shadow: none;
897
+ &[data-status='working'] {
898
+ border-color: CanvasText;
899
+ background-color: Canvas;
900
+ }
901
+ &[data-status='working']::before {
902
+ border-color: CanvasText;
903
+ }
904
+ &[data-status='attention'] {
905
+ background-color: Highlight;
906
+ }
907
+ &[data-status='attention']::after {
908
+ border-color: Highlight;
909
+ }
910
+ }
911
+ }
834
912
  /* A tooltip for a tab whose name isn't showing. It sits inside the tab, so the pointer can move onto it across an
835
913
  8px bridge without leaving. Hidden from assistive tech: the name is the tab's own. */
836
914
  @utility tabs-tip {
@@ -135,7 +135,7 @@
135
135
  /* Light · AA */
136
136
  :root {
137
137
  --brand: #2f47c9;
138
- --brand-subtle: #eceffc;
138
+ --brand-subtle: #dadef5;
139
139
  --background: #ffffff;
140
140
  --foreground: #161a1f;
141
141
  --card: #ffffff;
@@ -180,7 +180,7 @@
180
180
  /* Dark · AA */
181
181
  :root.dark {
182
182
  --brand: #8fa3ff;
183
- --brand-subtle: #1b2246;
183
+ --brand-subtle: #242c55;
184
184
  --background: #0e1116;
185
185
  --foreground: #e7eaee;
186
186
  --card: #151a21;
@@ -225,7 +225,7 @@
225
225
  /* Light · AAA */
226
226
  :root[data-conformance="aaa"] {
227
227
  --brand: #22369f;
228
- --brand-subtle: #e6eafb;
228
+ --brand-subtle: #dcdff0;
229
229
  --background: #ffffff;
230
230
  --foreground: #0c0e11;
231
231
  --card: #ffffff;
@@ -270,7 +270,7 @@
270
270
  /* Dark · AAA */
271
271
  :root[data-conformance="aaa"].dark {
272
272
  --brand: #b0beff;
273
- --brand-subtle: #1a2148;
273
+ --brand-subtle: #20274f;
274
274
  --background: #07090c;
275
275
  --foreground: #f5f7f9;
276
276
  --card: #0e1217;
package/dist/tokens.json CHANGED
@@ -34,10 +34,10 @@
34
34
  {
35
35
  "name": "brand-subtle",
36
36
  "value": {
37
- "light": "#eceffc",
38
- "dark": "#1b2246",
39
- "light-aaa": "#e6eafb",
40
- "dark-aaa": "#1a2148"
37
+ "light": "#dadef5",
38
+ "dark": "#242c55",
39
+ "light-aaa": "#dcdff0",
40
+ "dark-aaa": "#20274f"
41
41
  },
42
42
  "usage": "Tinted ground behind brand text: the current nav item, selected table rows, info notices."
43
43
  },
@@ -1,5 +1,6 @@
1
1
  import { composeRenderProps, type ButtonProps as RACButtonProps, type LinkProps as RACLinkProps } from 'react-aria-components';
2
2
  import { type ButtonVariant, type ButtonVisualSize } from './button-styles.js';
3
+ import { type KeyshortcutsProps } from '../lib/keyshortcuts.js';
3
4
  export type { ButtonVariant, ButtonVisualSize };
4
5
  interface LayerProps {
5
6
  variant?: ButtonVariant;
@@ -12,14 +13,14 @@ interface LayerProps {
12
13
  /** Layer 2, the painted box. */
13
14
  visualClassName?: string;
14
15
  }
15
- export interface ButtonProps extends Omit<RACButtonProps, 'className'>, LayerProps {
16
+ export interface ButtonProps extends Omit<RACButtonProps, 'className'>, LayerProps, KeyshortcutsProps {
16
17
  }
17
18
  /**
18
19
  * React Aria Button. One `primary` per view; `outline` is the default.
19
20
  * `isPending` keeps it focusable, announces the wait and swaps any leading icon for a spinner.
20
21
  */
21
22
  export declare const Button: import("react").ForwardRefExoticComponent<ButtonProps & import("react").RefAttributes<HTMLButtonElement>>;
22
- export interface LinkButtonProps extends Omit<RACLinkProps, 'className'>, LayerProps {
23
+ export interface LinkButtonProps extends Omit<RACLinkProps, 'className'>, LayerProps, KeyshortcutsProps {
23
24
  }
24
25
  /** A link that looks like a button — for navigation, never for actions. Same three layers as Button. */
25
26
  export declare const LinkButton: import("react").ForwardRefExoticComponent<LinkButtonProps & import("react").RefAttributes<HTMLAnchorElement>>;
@@ -1 +1 @@
1
- {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../src/ui/button.tsx"],"names":[],"mappings":"AAGA,OAAO,EAGL,kBAAkB,EAClB,KAAK,WAAW,IAAI,cAAc,EAClC,KAAK,SAAS,IAAI,YAAY,EAC/B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACtB,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAC;AAEhD,UAAU,UAAU;IAClB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,mGAAmG;IACnG,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,oDAAoD;IACpD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oGAAoG;IACpG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,EAAE,UAAU;CAAG;AAErF;;;GAGG;AACH,eAAO,MAAM,MAAM,2GAoCjB,CAAC;AAEH,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,UAAU;CAAG;AAEvF,wGAAwG;AACxG,eAAO,MAAM,UAAU,+GA4BrB,CAAC;AAEH,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../src/ui/button.tsx"],"names":[],"mappings":"AAGA,OAAO,EAGL,kBAAkB,EAClB,KAAK,WAAW,IAAI,cAAc,EAClC,KAAK,SAAS,IAAI,YAAY,EAC/B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACtB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEjF,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAC;AAEhD,UAAU,UAAU;IAClB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,mGAAmG;IACnG,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,oDAAoD;IACpD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oGAAoG;IACpG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,WACf,SAAQ,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,EAAE,UAAU,EAAE,iBAAiB;CAAG;AAE7E;;;GAGG;AACH,eAAO,MAAM,MAAM,2GAsCjB,CAAC;AAEH,MAAM,WAAW,eACf,SAAQ,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,UAAU,EAAE,iBAAiB;CAAG;AAE3E,wGAAwG;AACxG,eAAO,MAAM,UAAU,+GA8BrB,CAAC;AAEH,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
package/dist/ui/button.js CHANGED
@@ -4,13 +4,15 @@ import { forwardRef } from 'react';
4
4
  import { Button as RACButton, Link as RACLink, composeRenderProps, } from 'react-aria-components';
5
5
  import { buttonTargetStyles, buttonVisualStyles, } from './button-styles.js';
6
6
  import { SpinnerIcon } from './spinner.js';
7
+ import { useKeyshortcuts } from '../lib/keyshortcuts.js';
7
8
  /**
8
9
  * React Aria Button. One `primary` per view; `outline` is the default.
9
10
  * `isPending` keeps it focusable, announces the wait and swaps any leading icon for a spinner.
10
11
  */
11
- export const Button = forwardRef(function Button({ variant = 'outline', visualSize = 'default', fullWidth, className, visualClassName, children, ...props }, ref) {
12
+ export const Button = forwardRef(function Button({ variant = 'outline', visualSize = 'default', fullWidth, className, visualClassName, children, 'aria-keyshortcuts': keys, ...props }, ref) {
12
13
  const iconOnly = visualSize === 'icon' || visualSize === 'icon-sm';
13
- return (_jsx(RACButton, { ref: ref, ...props, className: buttonTargetStyles({ fullWidth, className }), children: composeRenderProps(children, (kids, { isPending }) => (_jsx("span", { className: buttonVisualStyles({
14
+ const target = useKeyshortcuts(keys, ref);
15
+ return (_jsx(RACButton, { ref: target, ...props, className: buttonTargetStyles({ fullWidth, className }), children: composeRenderProps(children, (kids, { isPending }) => (_jsx("span", { className: buttonVisualStyles({
14
16
  variant,
15
17
  visualSize,
16
18
  fullWidth,
@@ -18,8 +20,9 @@ export const Button = forwardRef(function Button({ variant = 'outline', visualSi
18
20
  }), children: isPending && iconOnly ? (_jsx(SpinnerIcon, {})) : (_jsxs(_Fragment, { children: [isPending && _jsx(SpinnerIcon, {}), kids] })) }))) }));
19
21
  });
20
22
  /** A link that looks like a button — for navigation, never for actions. Same three layers as Button. */
21
- export const LinkButton = forwardRef(function LinkButton({ variant = 'outline', visualSize = 'default', fullWidth, className, visualClassName, children, ...props }, ref) {
22
- return (_jsx(RACLink, { ref: ref, ...props, className: buttonTargetStyles({ fullWidth, className }), children: composeRenderProps(children, (kids) => (_jsx("span", { className: buttonVisualStyles({
23
+ export const LinkButton = forwardRef(function LinkButton({ variant = 'outline', visualSize = 'default', fullWidth, className, visualClassName, children, 'aria-keyshortcuts': keys, ...props }, ref) {
24
+ const target = useKeyshortcuts(keys, ref);
25
+ return (_jsx(RACLink, { ref: target, ...props, className: buttonTargetStyles({ fullWidth, className }), children: composeRenderProps(children, (kids) => (_jsx("span", { className: buttonVisualStyles({
23
26
  variant,
24
27
  visualSize,
25
28
  fullWidth,
@@ -1 +1 @@
1
- {"version":3,"file":"button.js","sourceRoot":"","sources":["../../src/ui/button.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,EACL,MAAM,IAAI,SAAS,EACnB,IAAI,IAAI,OAAO,EACf,kBAAkB,GAGnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GAGnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAkB3C;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAiC,SAAS,MAAM,CAC9E,EACE,OAAO,GAAG,SAAS,EACnB,UAAU,GAAG,SAAS,EACtB,SAAS,EACT,SAAS,EACT,eAAe,EACf,QAAQ,EACR,GAAG,KAAK,EACT,EACD,GAAG;IAEH,MAAM,QAAQ,GAAG,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,SAAS,CAAC;IACnE,OAAO,CACL,KAAC,SAAS,IAAC,GAAG,EAAE,GAAG,KAAM,KAAK,EAAE,SAAS,EAAE,kBAAkB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,YACpF,kBAAkB,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CACrD,eACE,SAAS,EAAE,kBAAkB,CAAC;gBAC5B,OAAO;gBACP,UAAU;gBACV,SAAS;gBACT,SAAS,EAAE,eAAe;aAC3B,CAAC,YAED,SAAS,IAAI,QAAQ,CAAC,CAAC,CAAC,CACvB,KAAC,WAAW,KAAG,CAChB,CAAC,CAAC,CAAC,CACF,8BACG,SAAS,IAAI,KAAC,WAAW,KAAG,EAC5B,IAAI,IACJ,CACJ,GACI,CACR,CAAC,GACQ,CACb,CAAC;AACJ,CAAC,CAAC,CAAC;AAIH,wGAAwG;AACxG,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAqC,SAAS,UAAU,CAC1F,EACE,OAAO,GAAG,SAAS,EACnB,UAAU,GAAG,SAAS,EACtB,SAAS,EACT,SAAS,EACT,eAAe,EACf,QAAQ,EACR,GAAG,KAAK,EACT,EACD,GAAG;IAEH,OAAO,CACL,KAAC,OAAO,IAAC,GAAG,EAAE,GAAG,KAAM,KAAK,EAAE,SAAS,EAAE,kBAAkB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,YAClF,kBAAkB,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CACtC,eACE,SAAS,EAAE,kBAAkB,CAAC;gBAC5B,OAAO;gBACP,UAAU;gBACV,SAAS;gBACT,SAAS,EAAE,eAAe;aAC3B,CAAC,YAED,IAAI,GACA,CACR,CAAC,GACM,CACX,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"button.js","sourceRoot":"","sources":["../../src/ui/button.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,EACL,MAAM,IAAI,SAAS,EACnB,IAAI,IAAI,OAAO,EACf,kBAAkB,GAGnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GAGnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,eAAe,EAA0B,MAAM,wBAAwB,CAAC;AAmBjF;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAiC,SAAS,MAAM,CAC9E,EACE,OAAO,GAAG,SAAS,EACnB,UAAU,GAAG,SAAS,EACtB,SAAS,EACT,SAAS,EACT,eAAe,EACf,QAAQ,EACR,mBAAmB,EAAE,IAAI,EACzB,GAAG,KAAK,EACT,EACD,GAAG;IAEH,MAAM,QAAQ,GAAG,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,SAAS,CAAC;IACnE,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC1C,OAAO,CACL,KAAC,SAAS,IAAC,GAAG,EAAE,MAAM,KAAM,KAAK,EAAE,SAAS,EAAE,kBAAkB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,YACvF,kBAAkB,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CACrD,eACE,SAAS,EAAE,kBAAkB,CAAC;gBAC5B,OAAO;gBACP,UAAU;gBACV,SAAS;gBACT,SAAS,EAAE,eAAe;aAC3B,CAAC,YAED,SAAS,IAAI,QAAQ,CAAC,CAAC,CAAC,CACvB,KAAC,WAAW,KAAG,CAChB,CAAC,CAAC,CAAC,CACF,8BACG,SAAS,IAAI,KAAC,WAAW,KAAG,EAC5B,IAAI,IACJ,CACJ,GACI,CACR,CAAC,GACQ,CACb,CAAC;AACJ,CAAC,CAAC,CAAC;AAKH,wGAAwG;AACxG,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAqC,SAAS,UAAU,CAC1F,EACE,OAAO,GAAG,SAAS,EACnB,UAAU,GAAG,SAAS,EACtB,SAAS,EACT,SAAS,EACT,eAAe,EACf,QAAQ,EACR,mBAAmB,EAAE,IAAI,EACzB,GAAG,KAAK,EACT,EACD,GAAG;IAEH,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC1C,OAAO,CACL,KAAC,OAAO,IAAC,GAAG,EAAE,MAAM,KAAM,KAAK,EAAE,SAAS,EAAE,kBAAkB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,YACrF,kBAAkB,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CACtC,eACE,SAAS,EAAE,kBAAkB,CAAC;gBAC5B,OAAO;gBACP,UAAU;gBACV,SAAS;gBACT,SAAS,EAAE,eAAe;aAC3B,CAAC,YAED,IAAI,GACA,CACR,CAAC,GACM,CACX,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -6,6 +6,11 @@ export interface SearchItem {
6
6
  description?: string;
7
7
  icon?: IconProp;
8
8
  href?: string;
9
+ /**
10
+ * Other words that find it: what people call it rather than its name ("mp4", "export"). Matched as well as
11
+ * the label, ranked after label matches, and never shown or read out.
12
+ */
13
+ keywords?: string[];
9
14
  }
10
15
  /** The search's own words, for the `labels` prop. */
11
16
  export interface SearchLabels {
@@ -40,6 +45,8 @@ export interface SearchTriggerProps {
40
45
  /** Icon-only, for narrow headers, named `labels.search`. */
41
46
  compact?: boolean;
42
47
  labels?: Partial<SearchLabels>;
48
+ /** Shows ⌘K and sets `aria-keyshortcuts`. Default true; false when the shortcut doesn't open this search. */
49
+ shortcut?: boolean;
43
50
  className?: string;
44
51
  }
45
52
  /**
@@ -47,7 +54,7 @@ export interface SearchTriggerProps {
47
54
  * shortcut also in `aria-keyshortcuts`. No `aria-label`: one that left out the shortcut would no longer contain
48
55
  * the visible text (2.5.3 Label in Name, as axe and the Setsquare SDK measure it).
49
56
  */
50
- export declare function SearchTrigger({ onPress, placeholder, compact, labels: given, className, }: SearchTriggerProps): import("react").JSX.Element;
57
+ export declare function SearchTrigger({ onPress, placeholder, compact, labels: given, shortcut, className, }: SearchTriggerProps): import("react").JSX.Element;
51
58
  export interface AppSearchProps {
52
59
  sections: SearchSection[];
53
60
  onAction?: (id: Key) => void;
@@ -57,8 +64,17 @@ export interface AppSearchProps {
57
64
  placeholder?: string;
58
65
  /** For the trigger and the dialog. */
59
66
  labels?: Partial<SearchLabels>;
67
+ /**
68
+ * Opens on ⌘K / Ctrl+K. Default true. One search on a page has the shortcut, the first mounted that asks;
69
+ * false gives it up, for a second search on the page.
70
+ */
71
+ shortcut?: boolean;
60
72
  className?: string;
61
73
  }
62
- /** Trigger + dialog + the ⌘K / Ctrl+K shortcut, wired together. */
63
- export declare function AppSearch({ sections, onAction, compact, defaultOpen, placeholder, labels, className, }: AppSearchProps): import("react").JSX.Element;
74
+ /**
75
+ * Trigger + dialog + the ⌘K / Ctrl+K shortcut, wired together. The shortcut is left alone when focus is in a field
76
+ * or editor, when another handler has already taken it, and in every search on the page but the one that has it
77
+ * (see `shortcut`); the trigger shows ⌘K only on that one.
78
+ */
79
+ export declare function AppSearch({ sections, onAction, compact, defaultOpen, placeholder, labels, shortcut, className, }: AppSearchProps): import("react").JSX.Element;
64
80
  //# sourceMappingURL=search.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/ui/search.tsx"],"names":[],"mappings":"AAGA,OAAO,EAcL,KAAK,GAAG,EACT,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AAKtD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AACD,qDAAqD;AACrD,MAAM,WAAW,YAAY;IAC3B,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC;IACf,mFAAmF;IACnF,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,YAAY,EAAE,YAK1B,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,IAAI,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;CAChC;AAED,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,MAAM,EAAE,KAAK,GACd,EAAE,kBAAkB,+BAwFpB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,WAAW,EACX,OAAO,EACP,MAAM,EAAE,KAAK,EACb,SAAS,GACV,EAAE,kBAAkB,+BA6BpB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,IAAI,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,wCAAwC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,mEAAmE;AACnE,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,WAAmB,EACnB,WAAW,EACX,MAAM,EACN,SAAS,GACV,EAAE,cAAc,+BA8BhB"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/ui/search.tsx"],"names":[],"mappings":"AAGA,OAAO,EAcL,KAAK,GAAG,EACT,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AAatD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AACD,qDAAqD;AACrD,MAAM,WAAW,YAAY;IAC3B,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC;IACf,mFAAmF;IACnF,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,YAAY,EAAE,YAK1B,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,IAAI,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;CAChC;AAED,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,MAAM,EAAE,KAAK,GACd,EAAE,kBAAkB,+BAmCpB;AA6FD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,6GAA6G;IAC7G,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,WAAW,EACX,OAAO,EACP,MAAM,EAAE,KAAK,EACb,QAAe,EACf,SAAS,GACV,EAAE,kBAAkB,+BAqCpB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,IAAI,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,wCAAwC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,WAAmB,EACnB,WAAW,EACX,MAAM,EACN,QAAe,EACf,SAAS,GACV,EAAE,cAAc,+BAyChB"}
package/dist/ui/search.js CHANGED
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useEffect, useState } from 'react';
4
- import { Autocomplete, Button as RACButton, Collection, Dialog, Header, Input, Menu, MenuItem, MenuSection, Modal, ModalOverlay, SearchField, useFilter, } from 'react-aria-components';
3
+ import { useEffect, useId, useMemo, useState, useSyncExternalStore } from 'react';
4
+ import { Autocomplete, Button as RACButton, Collection, Dialog, Header, Input, Menu, MenuItem, MenuSection, Modal, ModalOverlay, SearchField, useLocale, } from 'react-aria-components';
5
5
  import { Search, SearchX } from 'lucide-react';
6
6
  import { cn } from '../lib/cn.js';
7
7
  import { fieldBox, fieldInput } from './field.js';
@@ -9,6 +9,9 @@ import { IconButton } from './icon-button.js';
9
9
  import { renderIcon } from './icon.js';
10
10
  import { Kbd } from './kbd.js';
11
11
  import { useLabels } from '../lib/locale.js';
12
+ import { duplicateIds, searchCollator, searchSections } from '../lib/search-match.js';
13
+ import { useKeyshortcuts } from '../lib/keyshortcuts.js';
14
+ import { claimSearchShortcut, hasSearchShortcut, isSearchShortcut, subscribeSearchShortcut, } from '../lib/search-shortcut.js';
12
15
  import { itemVisual, rowTarget } from './menu.js';
13
16
  export const searchLabels = {
14
17
  search: 'Search',
@@ -19,42 +22,71 @@ export const searchLabels = {
19
22
  /** The search dialog: type to filter, arrow keys to move, Enter to go, Escape to close. */
20
23
  export function CommandSearch({ isOpen, onOpenChange, sections, onAction, placeholder, labels: given, }) {
21
24
  const t = useLabels('search', searchLabels, given);
22
- const { contains } = useFilter({ sensitivity: 'base' });
23
- return (_jsx(ModalOverlay, { isOpen: isOpen, onOpenChange: onOpenChange, isDismissable: true, "data-overlay": true, className: "fixed inset-0 z-(--z-popover) flex items-start justify-center bg-overlay px-4 pt-[12vh]", children: _jsx(Modal, { "data-sheet": "top", className: "w-full max-w-[40rem] overflow-hidden rounded-xl border border-border bg-popover text-popover-foreground shadow-(--shadow-lg) outline-none", children: _jsx(Dialog, { "aria-label": t('search'), className: "flex max-h-[70vh] flex-col outline-none", children: _jsxs(Autocomplete, { filter: contains, children: [_jsx(SearchField, { "aria-label": t('search'),
24
- // oxlint-disable-next-line jsx-a11y/no-autofocus
25
- autoFocus: true, className: "border-b border-border p-3", children: _jsxs("div", { className: fieldBox, children: [_jsx(Search, { "aria-hidden": "true", className: "pointer-events-none absolute top-1/2 left-2.5 size-5 -translate-y-1/2 text-muted-foreground" }), _jsx(Input, { placeholder: placeholder ?? t('placeholder'), className: cn(fieldInput, 'pr-14 pl-10 [&::-webkit-search-cancel-button]:hidden') }), _jsx(Kbd, { className: "pointer-events-none absolute top-1/2 right-2 -translate-y-1/2", children: t('escapeKey') })] }) }), _jsx(Menu, { items: sections, onAction: (id) => {
26
- onAction?.(id);
27
- onOpenChange(false);
28
- }, renderEmptyState: () => (_jsxs("div", { className: "flex flex-col items-center gap-2 px-4 py-10 text-center text-sm text-muted-foreground", children: [_jsx(SearchX, { "aria-hidden": "true", className: "size-6" }), t('noResults')] })), className: "relative min-h-0 flex-1 overflow-auto p-2 outline-none", children: (section) => (_jsxs(MenuSection, { id: section.id, className: "not-first:mt-2", children: [_jsx(Header, { className: "px-3 pt-1 pb-1 text-[13px] leading-5 font-semibold text-muted-foreground", children: section.title }), _jsx(Collection, { items: section.items, children: (item) => (_jsx(MenuItem, { id: item.id, href: item.href, textValue: item.label, className: cn('group/item', rowTarget), children: _jsxs("span", { className: itemVisual, children: [item.icon &&
29
- renderIcon(item.icon, 'size-5 shrink-0 text-muted-foreground'), _jsxs("span", { className: "flex min-w-0 flex-col", children: [_jsx("span", { className: "truncate font-medium", children: item.label }), item.description && (_jsx("span", { className: "truncate text-[13px] text-muted-foreground", children: item.description }))] })] }) })) })] })) })] }) }) }) }));
25
+ const repeated = JSON.stringify(duplicateIds(sections));
26
+ useEffect(() => {
27
+ if (repeated !== '[]')
28
+ console.error(`Search: item ids must be unique across all sections, and these are used more than once: ${repeated}. React Aria keys the menu by id, so for each, one item is hidden and the other shown twice.`);
29
+ }, [repeated]);
30
+ return (_jsx(ModalOverlay, { isOpen: isOpen, onOpenChange: onOpenChange, isDismissable: true, "data-overlay": true, className: "fixed inset-0 z-(--z-popover) flex items-start justify-center bg-overlay px-4 pt-[12vh]", children: _jsx(Modal, { "data-sheet": "top", className: "w-full max-w-[40rem] overflow-hidden rounded-xl border border-border bg-popover text-popover-foreground shadow-(--shadow-lg) outline-none", children: _jsx(Dialog, { "aria-label": t('search'), className: "flex max-h-[70vh] flex-col outline-none", children: _jsx(SearchBody, { sections: sections, onAction: (id) => {
31
+ onAction?.(id);
32
+ onOpenChange(false);
33
+ }, placeholder: placeholder ?? t('placeholder'), t: t }) }) }) }));
34
+ }
35
+ /**
36
+ * Inside the dialog, so the text starts empty each time it opens. React Aria's Autocomplete can only filter a
37
+ * collection in its own order, so the search holds the text, ranks the items itself and gives the menu only
38
+ * those; Autocomplete still moves through them from the field.
39
+ */
40
+ function SearchBody({ sections, onAction, placeholder, t, }) {
41
+ const [query, setQuery] = useState('');
42
+ const { locale } = useLocale();
43
+ const collator = useMemo(() => searchCollator(locale), [locale]);
44
+ const results = useMemo(() => searchSections(sections, query, collator), [sections, query, collator]);
45
+ return (_jsxs(Autocomplete, { inputValue: query, onInputChange: setQuery, children: [_jsx(SearchField, { "aria-label": t('search'),
46
+ // oxlint-disable-next-line jsx-a11y/no-autofocus
47
+ autoFocus: true, className: "border-b border-border p-3", children: _jsxs("div", { className: fieldBox, children: [_jsx(Search, { "aria-hidden": "true", className: "pointer-events-none absolute top-1/2 left-2.5 size-5 -translate-y-1/2 text-muted-foreground" }), _jsx(Input, { placeholder: placeholder, className: cn(fieldInput, 'pr-14 pl-10 [&::-webkit-search-cancel-button]:hidden') }), _jsx(Kbd, { className: "pointer-events-none absolute top-1/2 right-2 -translate-y-1/2", children: t('escapeKey') })] }) }), _jsx(Menu, { items: results, onAction: onAction, renderEmptyState: () => (_jsxs("div", { className: "flex flex-col items-center gap-2 px-4 py-10 text-center text-sm text-muted-foreground", children: [_jsx(SearchX, { "aria-hidden": "true", className: "size-6" }), t('noResults')] })), className: "relative min-h-0 flex-1 overflow-auto p-2 outline-none", children: (section) => (_jsxs(MenuSection, { id: section.id, className: "not-first:mt-2", children: [_jsx(Header, { className: "px-3 pt-1 pb-1 text-[13px] leading-5 font-semibold text-muted-foreground", children: section.title }), _jsx(Collection, { items: section.items, children: (item) => (_jsx(MenuItem, { id: item.id, href: item.href, textValue: item.label, className: cn('group/item', rowTarget), children: _jsxs("span", { className: itemVisual, children: [item.icon && renderIcon(item.icon, 'size-5 shrink-0 text-muted-foreground'), _jsxs("span", { className: "flex min-w-0 flex-col", children: [_jsx("span", { className: "truncate font-medium", children: item.label }), item.description && (_jsx("span", { className: "truncate text-[13px] text-muted-foreground", children: item.description }))] })] }) })) })] })) })] }));
30
48
  }
31
49
  /**
32
50
  * Opens the search dialog. Looks like a field; is a button named by what it shows, "Search ⌘K", with the
33
51
  * shortcut also in `aria-keyshortcuts`. No `aria-label`: one that left out the shortcut would no longer contain
34
52
  * the visible text (2.5.3 Label in Name, as axe and the Setsquare SDK measure it).
35
53
  */
36
- export function SearchTrigger({ onPress, placeholder, compact, labels: given, className, }) {
54
+ export function SearchTrigger({ onPress, placeholder, compact, labels: given, shortcut = true, className, }) {
37
55
  const t = useLabels('search', searchLabels, given);
56
+ const keys = shortcut ? 'Meta+K Control+K' : undefined;
57
+ const target = useKeyshortcuts(keys);
38
58
  if (compact) {
39
- return (_jsx(IconButton, { label: t('search'), icon: Search, onPress: onPress, "aria-haspopup": "dialog", "aria-keyshortcuts": "Meta+K Control+K" }));
59
+ return (_jsx(IconButton, { label: t('search'), icon: Search, onPress: onPress, "aria-haspopup": "dialog", "aria-keyshortcuts": keys }));
40
60
  }
41
- return (_jsxs(RACButton, { onPress: onPress, "aria-haspopup": "dialog", "aria-keyshortcuts": "Meta+K Control+K", className: cn(
61
+ return (_jsxs(RACButton, { ref: target, onPress: onPress, "aria-haspopup": "dialog", className: cn(
42
62
  // Looks like a field, so it is built like one: the button is the target, the box is painted behind it.
43
- 'field-paint flex h-control-target w-64 min-w-0 cursor-pointer items-center gap-2 pr-2 pl-2.5 text-left text-sm text-muted-foreground outline-none', 'data-hovered:before:bg-accent data-focus-visible:before:focus-ring', className), children: [_jsx(Search, { "aria-hidden": "true", className: "size-5 shrink-0" }), _jsx("span", { className: "min-w-0 flex-1 truncate", children: placeholder ?? t('search') }), " ", _jsx(Kbd, { children: "\u2318K" })] }));
63
+ 'field-paint flex h-control-target w-64 min-w-0 cursor-pointer items-center gap-2 pr-2 pl-2.5 text-left text-sm text-muted-foreground outline-none', 'data-hovered:before:bg-accent data-focus-visible:before:focus-ring', className), children: [_jsx(Search, { "aria-hidden": "true", className: "size-5 shrink-0" }), _jsx("span", { className: "min-w-0 flex-1 truncate", children: placeholder ?? t('search') }), shortcut && (_jsxs(_Fragment, { children: [' ', _jsx(Kbd, { children: "\u2318K" })] }))] }));
44
64
  }
45
- /** Trigger + dialog + the ⌘K / Ctrl+K shortcut, wired together. */
46
- export function AppSearch({ sections, onAction, compact, defaultOpen = false, placeholder, labels, className, }) {
65
+ /**
66
+ * Trigger + dialog + the ⌘K / Ctrl+K shortcut, wired together. The shortcut is left alone when focus is in a field
67
+ * or editor, when another handler has already taken it, and in every search on the page but the one that has it
68
+ * (see `shortcut`); the trigger shows ⌘K only on that one.
69
+ */
70
+ export function AppSearch({ sections, onAction, compact, defaultOpen = false, placeholder, labels, shortcut = true, className, }) {
47
71
  const [isOpen, setOpen] = useState(defaultOpen);
72
+ const id = useId();
73
+ const has = useSyncExternalStore(subscribeSearchShortcut, () => hasSearchShortcut(id), () => true);
48
74
  useEffect(() => {
75
+ if (!shortcut)
76
+ return;
77
+ const letGo = claimSearchShortcut(id);
49
78
  const onKey = (e) => {
50
- if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'k') {
51
- e.preventDefault();
52
- setOpen(true);
53
- }
79
+ if (!hasSearchShortcut(id) || !isSearchShortcut(e))
80
+ return;
81
+ e.preventDefault();
82
+ setOpen(true);
54
83
  };
55
84
  document.addEventListener('keydown', onKey);
56
- return () => document.removeEventListener('keydown', onKey);
57
- }, []);
58
- return (_jsxs(_Fragment, { children: [_jsx(SearchTrigger, { onPress: () => setOpen(true), compact: compact, labels: labels, className: className }), _jsx(CommandSearch, { isOpen: isOpen, onOpenChange: setOpen, sections: sections, onAction: onAction, placeholder: placeholder, labels: labels })] }));
85
+ return () => {
86
+ document.removeEventListener('keydown', onKey);
87
+ letGo();
88
+ };
89
+ }, [id, shortcut]);
90
+ return (_jsxs(_Fragment, { children: [_jsx(SearchTrigger, { onPress: () => setOpen(true), compact: compact, labels: labels, shortcut: shortcut && has, className: className }), _jsx(CommandSearch, { isOpen: isOpen, onOpenChange: setOpen, sections: sections, onAction: onAction, placeholder: placeholder, labels: labels })] }));
59
91
  }
60
92
  //# sourceMappingURL=search.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/ui/search.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/ui/search.tsx"],"names":[],"mappings":"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"}