@hjmds/react 1.10.0 → 1.11.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 (144) hide show
  1. package/README.md +14 -0
  2. package/THIRD_PARTY_NOTICES.md +78 -0
  3. package/dist/activity-heatmap.d.ts +10 -0
  4. package/dist/activity-heatmap.d.ts.map +1 -0
  5. package/dist/activity-heatmap.js +6 -0
  6. package/dist/activity-heatmap.js.map +1 -0
  7. package/dist/advanced-display.d.ts +3 -0
  8. package/dist/advanced-display.d.ts.map +1 -1
  9. package/dist/advanced-display.js +9 -7
  10. package/dist/advanced-display.js.map +1 -1
  11. package/dist/auth-screen.d.ts +8 -0
  12. package/dist/auth-screen.d.ts.map +1 -1
  13. package/dist/auth-screen.js +5 -2
  14. package/dist/auth-screen.js.map +1 -1
  15. package/dist/avatar-blobatar-motion.d.ts +6 -0
  16. package/dist/avatar-blobatar-motion.d.ts.map +1 -0
  17. package/dist/avatar-blobatar-motion.js +22 -0
  18. package/dist/avatar-blobatar-motion.js.map +1 -0
  19. package/dist/avatar-blobatar.d.ts +6 -0
  20. package/dist/avatar-blobatar.d.ts.map +1 -0
  21. package/dist/avatar-blobatar.js +10 -0
  22. package/dist/avatar-blobatar.js.map +1 -0
  23. package/dist/bottom-navigation.d.ts.map +1 -1
  24. package/dist/bottom-navigation.js +3 -3
  25. package/dist/bottom-navigation.js.map +1 -1
  26. package/dist/carousel-motion.d.ts +4 -1
  27. package/dist/carousel-motion.d.ts.map +1 -1
  28. package/dist/carousel-motion.js +12 -3
  29. package/dist/carousel-motion.js.map +1 -1
  30. package/dist/code-block.d.ts +8 -0
  31. package/dist/code-block.d.ts.map +1 -0
  32. package/dist/code-block.js +6 -0
  33. package/dist/code-block.js.map +1 -0
  34. package/dist/content-transition.d.ts +5 -2
  35. package/dist/content-transition.d.ts.map +1 -1
  36. package/dist/content-transition.js +6 -4
  37. package/dist/content-transition.js.map +1 -1
  38. package/dist/context-menu.d.ts.map +1 -1
  39. package/dist/context-menu.js +10 -11
  40. package/dist/context-menu.js.map +1 -1
  41. package/dist/data-table.d.ts.map +1 -1
  42. package/dist/data-table.js +2 -1
  43. package/dist/data-table.js.map +1 -1
  44. package/dist/duration-field.d.ts +11 -0
  45. package/dist/duration-field.d.ts.map +1 -0
  46. package/dist/duration-field.js +9 -0
  47. package/dist/duration-field.js.map +1 -0
  48. package/dist/effect-surface.d.ts +10 -0
  49. package/dist/effect-surface.d.ts.map +1 -0
  50. package/dist/effect-surface.js +57 -0
  51. package/dist/effect-surface.js.map +1 -0
  52. package/dist/evidence.d.ts +1 -1
  53. package/dist/evidence.js +1 -1
  54. package/dist/evidence.js.map +1 -1
  55. package/dist/folder-preview.d.ts +12 -0
  56. package/dist/folder-preview.d.ts.map +1 -0
  57. package/dist/folder-preview.js +7 -0
  58. package/dist/folder-preview.js.map +1 -0
  59. package/dist/forms.d.ts +3 -1
  60. package/dist/forms.d.ts.map +1 -1
  61. package/dist/forms.js +2 -2
  62. package/dist/forms.js.map +1 -1
  63. package/dist/gravity-letters.d.ts +8 -0
  64. package/dist/gravity-letters.d.ts.map +1 -0
  65. package/dist/gravity-letters.js +24 -0
  66. package/dist/gravity-letters.js.map +1 -0
  67. package/dist/grid-reveal.d.ts +9 -0
  68. package/dist/grid-reveal.d.ts.map +1 -0
  69. package/dist/grid-reveal.js +21 -0
  70. package/dist/grid-reveal.js.map +1 -0
  71. package/dist/icon-lucide.d.ts +11 -0
  72. package/dist/icon-lucide.d.ts.map +1 -0
  73. package/dist/icon-lucide.js +11 -0
  74. package/dist/icon-lucide.js.map +1 -0
  75. package/dist/inline-confirm.d.ts +14 -0
  76. package/dist/inline-confirm.d.ts.map +1 -0
  77. package/dist/inline-confirm.js +37 -0
  78. package/dist/inline-confirm.js.map +1 -0
  79. package/dist/menu-morph.d.ts.map +1 -1
  80. package/dist/menu-morph.js +9 -6
  81. package/dist/menu-morph.js.map +1 -1
  82. package/dist/menu-typeahead.d.ts +13 -0
  83. package/dist/menu-typeahead.d.ts.map +1 -0
  84. package/dist/menu-typeahead.js +17 -0
  85. package/dist/menu-typeahead.js.map +1 -0
  86. package/dist/navigation-bar.d.ts +10 -0
  87. package/dist/navigation-bar.d.ts.map +1 -0
  88. package/dist/navigation-bar.js +10 -0
  89. package/dist/navigation-bar.js.map +1 -0
  90. package/dist/navigation.d.ts +3 -3
  91. package/dist/navigation.d.ts.map +1 -1
  92. package/dist/navigation.js +63 -22
  93. package/dist/navigation.js.map +1 -1
  94. package/dist/notification-bell.d.ts +11 -0
  95. package/dist/notification-bell.d.ts.map +1 -0
  96. package/dist/notification-bell.js +27 -0
  97. package/dist/notification-bell.js.map +1 -0
  98. package/dist/overlays.d.ts +0 -2
  99. package/dist/overlays.d.ts.map +1 -1
  100. package/dist/overlays.js +5 -18
  101. package/dist/overlays.js.map +1 -1
  102. package/dist/reaction-picker.d.ts +11 -0
  103. package/dist/reaction-picker.d.ts.map +1 -0
  104. package/dist/reaction-picker.js +9 -0
  105. package/dist/reaction-picker.js.map +1 -0
  106. package/dist/scroll-progress.d.ts +10 -0
  107. package/dist/scroll-progress.d.ts.map +1 -0
  108. package/dist/scroll-progress.js +34 -0
  109. package/dist/scroll-progress.js.map +1 -0
  110. package/dist/select.d.ts +0 -1
  111. package/dist/select.d.ts.map +1 -1
  112. package/dist/select.js +0 -2
  113. package/dist/select.js.map +1 -1
  114. package/dist/sidebar.d.ts +3 -0
  115. package/dist/sidebar.d.ts.map +1 -1
  116. package/dist/sidebar.js +23 -4
  117. package/dist/sidebar.js.map +1 -1
  118. package/dist/step-player.d.ts +24 -0
  119. package/dist/step-player.d.ts.map +1 -0
  120. package/dist/step-player.js +16 -0
  121. package/dist/step-player.js.map +1 -0
  122. package/dist/styles.css +84 -1
  123. package/dist/styles.layered.css +84 -1
  124. package/dist/supplemental-display.d.ts +10 -2
  125. package/dist/supplemental-display.d.ts.map +1 -1
  126. package/dist/supplemental-display.js +2 -2
  127. package/dist/supplemental-display.js.map +1 -1
  128. package/dist/table-sort-button.d.ts +15 -0
  129. package/dist/table-sort-button.d.ts.map +1 -0
  130. package/dist/table-sort-button.js +7 -0
  131. package/dist/table-sort-button.js.map +1 -0
  132. package/dist/task-list.d.ts +16 -0
  133. package/dist/task-list.d.ts.map +1 -0
  134. package/dist/task-list.js +17 -0
  135. package/dist/task-list.js.map +1 -0
  136. package/dist/thinking-orb.d.ts +1 -1
  137. package/dist/thinking-orb.d.ts.map +1 -1
  138. package/dist/thinking-orb.js +4 -4
  139. package/dist/thinking-orb.js.map +1 -1
  140. package/dist/voice-note.d.ts +24 -0
  141. package/dist/voice-note.d.ts.map +1 -0
  142. package/dist/voice-note.js +13 -0
  143. package/dist/voice-note.js.map +1 -0
  144. package/package.json +110 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation-bar.js","sourceRoot":"","sources":["../src/navigation-bar.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AASpD,oFAAoF;AACpF,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAsB;IACnF,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAC;IACpC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,SAAS,CAAC,4CAA4C,CAAC,CAAC;IACrF,OAAO,6BAAiB,KAAK,EAAE,SAAS,EAAC,oBAAoB,EAAC,GAAG,EAAE,KAAK,EAAE,WAAW,CAAC,SAAS,aAC7F,cAAK,SAAS,EAAC,2BAA2B,YAAE,KAAK,GAAO,EACxD,cAAK,SAAS,EAAC,kCAAkC,YAAE,QAAQ,GAAO,EACjE,OAAO,IAAI,cAAK,SAAS,EAAC,6BAA6B,YAAE,OAAO,GAAO,IACpE,CAAC;AACT,CAAC","sourcesContent":["import type { ReactNode } from \"react\";\nimport { useOptionalHjmTheme } from \"./provider.js\";\n\nexport type NavigationBarProps = Readonly<{\n label: string;\n brand: ReactNode;\n children: ReactNode;\n actions?: ReactNode;\n}>;\n\n/** Site navigation composition; Menu/SearchField continue to own their behavior. */\nexport function NavigationBar({ label, brand, children, actions }: NavigationBarProps) {\n const theme = useOptionalHjmTheme();\n if (!label.trim()) throw new TypeError(\"NavigationBar requires an accessible label\");\n return <nav aria-label={label} className=\"hjm-navigation-bar\" dir={theme?.environment.direction}>\n <div className=\"hjm-navigation-bar__brand\">{brand}</div>\n <div className=\"hjm-navigation-bar__destinations\">{children}</div>\n {actions && <div className=\"hjm-navigation-bar__actions\">{actions}</div>}\n </nav>;\n}\n"]}
@@ -1,3 +1,5 @@
1
+ import { type TabsAppearance } from "@hjmds/design-contracts/gooey-navigation";
2
+ export type { TabsAppearance };
1
3
  import { type TabsActivationMode, type TabsDirection, type TabsMountPolicy, type TabsOrientation, type TabsPanelMode } from "@hjmds/design-contracts/behaviors";
2
4
  import { type TabSize, type TabsLayout, type TabsOverflow } from "@hjmds/design-contracts/recipes";
3
5
  import { type HTMLAttributes, type ReactNode } from "react";
@@ -7,8 +9,6 @@ export type TabLeadingRenderProps = Readonly<{
7
9
  color: "currentColor";
8
10
  /** Pixel size resolved from `tabsRecipe.icon.glyph`. */
9
11
  size: number;
10
- /** Compatibility alias for product icon libraries that name this value explicitly. */
11
- glyphSize: number;
12
12
  }>;
13
13
  export type TabItem = Readonly<{
14
14
  id: string;
@@ -32,6 +32,7 @@ export type TabsProps = Omit<HTMLAttributes<HTMLDivElement>, "dir" | "onChange">
32
32
  activationMode?: TabsActivationMode;
33
33
  mountPolicy?: TabsMountPolicy;
34
34
  panelMode?: TabsPanelMode;
35
+ appearance?: TabsAppearance;
35
36
  orientation?: TabsOrientation;
36
37
  direction?: TabsDirection;
37
38
  loop?: boolean;
@@ -61,5 +62,4 @@ export type TabPanelProps = ExternalTabPanelBaseProps & (Readonly<{
61
62
  /** External panel host for products that keep routing, query, or scroll state outside Tabs. */
62
63
  export declare function TabPanel(props: TabPanelProps): import("react").JSX.Element | null;
63
64
  export declare const Tabs: import("react").ForwardRefExoticComponent<TabsProps & import("react").RefAttributes<HTMLDivElement>>;
64
- export {};
65
65
  //# sourceMappingURL=navigation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../src/navigation.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../src/navigation.tsx"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { resolveGooeyIndicator } from "@hjmds/design-contracts/gooey-navigation";
2
3
  import { getTabNavigationIntent, getTabNavigationTarget, resolveInitialTabValue, tabsBehaviorDefaults, } from "@hjmds/design-contracts/behaviors";
3
4
  import { iconRecipe, tabsRecipe, } from "@hjmds/design-contracts/recipes";
4
- import { forwardRef, useEffect, useId, useRef, useState, } from "react";
5
+ import { forwardRef, useEffect, useLayoutEffect, useId, useRef, useState, } from "react";
5
6
  import { classNames, useControllableState } from "./internal.js";
6
7
  import { useOptionalHjmTheme } from "./provider.js";
7
8
  function validateItems(items) {
@@ -79,7 +80,7 @@ export function TabPanel(props) {
79
80
  return (_jsx(TabPanelHost, { ...hostProps, id: getTabPanelId(tabsId, value, dynamic ? "dynamic" : "keyed"), labelledBy: getTabId(tabsId, dynamic ? activeValue : value), selected: selected, dynamic: dynamic, children: children }));
80
81
  }
81
82
  export const Tabs = forwardRef(function Tabs(props, ref) {
82
- const { label, items, activationMode = tabsBehaviorDefaults.activationMode, mountPolicy = tabsBehaviorDefaults.mountPolicy, panelMode = tabsBehaviorDefaults.panelMode, orientation = tabsBehaviorDefaults.orientation, direction: directionProp, loop = tabsBehaviorDefaults.loop, size = tabsRecipe.defaults.size, layout = tabsRecipe.defaults.layout, overflow = tabsRecipe.defaults.overflow, renderPanels = true, className, id, value: valueProp, defaultValue, onValueChange, ...rest } = props;
83
+ const { label, items, activationMode = tabsBehaviorDefaults.activationMode, mountPolicy = tabsBehaviorDefaults.mountPolicy, panelMode = tabsBehaviorDefaults.panelMode, appearance = "standard", orientation = tabsBehaviorDefaults.orientation, direction: directionProp, loop = tabsBehaviorDefaults.loop, size = tabsRecipe.defaults.size, layout = tabsRecipe.defaults.layout, overflow = tabsRecipe.defaults.overflow, renderPanels = true, className, id, value: valueProp, defaultValue, onValueChange, ...rest } = props;
83
84
  validateItems(items);
84
85
  if (label.trim().length === 0)
85
86
  throw new TypeError("Tabs label must not be empty");
@@ -123,6 +124,47 @@ export const Tabs = forwardRef(function Tabs(props, ref) {
123
124
  const baseId = id ?? `hjm-${generatedId}`;
124
125
  const theme = useOptionalHjmTheme();
125
126
  const direction = directionProp ?? theme?.environment.direction ?? tabsBehaviorDefaults.direction;
127
+ const gooey = appearance === "gooey" && orientation === "horizontal";
128
+ const indicatorRef = useRef(null);
129
+ const previousIndicator = useRef(null);
130
+ useLayoutEffect(() => {
131
+ const indicator = indicatorRef.current;
132
+ const tab = tabRefs.current.get(value);
133
+ if (!gooey || !indicator || !tab) {
134
+ previousIndicator.current = null;
135
+ return;
136
+ }
137
+ let animation;
138
+ const place = (animate) => {
139
+ animation?.cancel();
140
+ const rect = { x: tab.offsetLeft, width: tab.offsetWidth };
141
+ if (rect.width <= 0)
142
+ return;
143
+ indicator.style.left = `${rect.x}px`;
144
+ indicator.style.width = `${rect.width}px`;
145
+ const previous = previousIndicator.current;
146
+ if (animate && previous && previous.value !== value && !theme?.environment.reducedMotion && !document.hidden) {
147
+ const recipe = resolveGooeyIndicator(previous.rect, rect);
148
+ animation = indicator.animate(recipe.input.map((offset, index) => ({ offset, left: `${recipe.x[index]}px`, width: `${recipe.width[index]}px` })), { duration: recipe.duration, easing: "ease-out" });
149
+ }
150
+ previousIndicator.current = { value, rect };
151
+ };
152
+ place(true);
153
+ // Font loading, resizing and large text change measurements without changing selection.
154
+ const observer = new ResizeObserver(() => {
155
+ const previous = previousIndicator.current?.rect;
156
+ if (previous?.x !== tab.offsetLeft || previous.width !== tab.offsetWidth)
157
+ place(false);
158
+ });
159
+ const list = tab.parentElement;
160
+ for (const child of list.children)
161
+ if (child !== indicator)
162
+ observer.observe(child);
163
+ const visibility = () => { if (document.hidden)
164
+ animation?.cancel(); };
165
+ document.addEventListener("visibilitychange", visibility);
166
+ return () => { animation?.cancel(); observer.disconnect(); document.removeEventListener("visibilitychange", visibility); };
167
+ }, [gooey, value, items, theme?.environment.reducedMotion]);
126
168
  useEffect(() => {
127
169
  if (!controlled && !storedSelectionIsValid)
128
170
  setValue(collectionFallback);
@@ -178,26 +220,25 @@ export const Tabs = forwardRef(function Tabs(props, ref) {
178
220
  }
179
221
  };
180
222
  const panelId = (value) => getTabPanelId(baseId, value, panelMode);
181
- return (_jsxs("div", { ...rest, ref: ref, id: baseId, className: classNames("hjm-tabs", className), "data-size": size, "data-layout": layout, "data-overflow": overflow, "data-orientation": orientation, "data-mount-policy": mountPolicy, "data-panel-mode": panelMode, "data-state": "ready", dir: direction, children: [_jsx("div", { className: "hjm-tabs__list", role: "tablist", "aria-label": label, "aria-orientation": orientation, children: items.map((item) => {
182
- const selected = item.id === value;
183
- const tabId = getTabId(baseId, item.id);
184
- const leadingSize = iconRecipe.sizes[tabsRecipe.icon.glyph];
185
- return (_jsxs("button", { ref: (node) => {
186
- if (node)
187
- tabRefs.current.set(item.id, node);
188
- else
189
- tabRefs.current.delete(item.id);
190
- }, id: tabId, type: "button", role: "tab", className: "hjm-tabs__tab", "data-state": selected ? "selected" : "idle", "aria-selected": selected, "aria-controls": panelId(item.id), tabIndex: item.id === resolvedFocusValue ? 0 : -1, disabled: item.disabled, onClick: () => {
191
- setFocusValue(item.id);
192
- setValue(item.id);
193
- }, onKeyDown: (event) => handleKeyDown(event, item.id), children: [item.renderLeading ? (_jsx("span", { "aria-hidden": "true", className: "hjm-tabs__leading", children: item.renderLeading({
194
- selected,
195
- disabled: item.disabled ?? false,
196
- color: "currentColor",
197
- size: leadingSize,
198
- glyphSize: leadingSize,
199
- }) })) : null, item.label] }, item.id));
200
- }) }), !renderPanels ? null : panelMode === "dynamic" ? (_jsx(TabPanelHost, { id: panelId(value), labelledBy: getTabId(baseId, value), selected: true, dynamic: true, children: items.find((item) => item.id === value)?.panel })) : items.map((item) => {
223
+ return (_jsxs("div", { ...rest, ref: ref, id: baseId, className: classNames("hjm-tabs", className), "data-size": size, "data-layout": layout, "data-overflow": overflow, "data-appearance": gooey ? "gooey" : "standard", "data-orientation": orientation, "data-mount-policy": mountPolicy, "data-panel-mode": panelMode, "data-state": "ready", dir: direction, children: [_jsxs("div", { className: "hjm-tabs__list", role: "tablist", "aria-label": label, "aria-orientation": orientation, children: [gooey ? _jsx("span", { ref: indicatorRef, "aria-hidden": "true", className: "hjm-tabs__gooey" }) : null, items.map((item) => {
224
+ const selected = item.id === value;
225
+ const tabId = getTabId(baseId, item.id);
226
+ const leadingSize = iconRecipe.sizes[tabsRecipe.icon.glyph];
227
+ return (_jsxs("button", { ref: (node) => {
228
+ if (node)
229
+ tabRefs.current.set(item.id, node);
230
+ else
231
+ tabRefs.current.delete(item.id);
232
+ }, id: tabId, type: "button", role: "tab", className: "hjm-tabs__tab", "data-state": selected ? "selected" : "idle", "aria-selected": selected, "aria-controls": panelId(item.id), tabIndex: item.id === resolvedFocusValue ? 0 : -1, disabled: item.disabled, onClick: () => {
233
+ setFocusValue(item.id);
234
+ setValue(item.id);
235
+ }, onKeyDown: (event) => handleKeyDown(event, item.id), children: [item.renderLeading ? (_jsx("span", { "aria-hidden": "true", className: "hjm-tabs__leading", children: item.renderLeading({
236
+ selected,
237
+ disabled: item.disabled ?? false,
238
+ color: "currentColor",
239
+ size: leadingSize,
240
+ }) })) : null, item.label] }, item.id));
241
+ })] }), !renderPanels ? null : panelMode === "dynamic" ? (_jsx(TabPanelHost, { id: panelId(value), labelledBy: getTabId(baseId, value), selected: true, dynamic: true, children: items.find((item) => item.id === value)?.panel })) : items.map((item) => {
201
242
  const selected = item.id === value;
202
243
  const mounted = mountPolicy === "always" ||
203
244
  (mountPolicy === "visited" && (visited.has(item.id) || selected)) ||
@@ -1 +1 @@
1
- {"version":3,"file":"navigation.js","sourceRoot":"","sources":["../src/navigation.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n getTabNavigationIntent,\n getTabNavigationTarget,\n resolveInitialTabValue,\n tabsBehaviorDefaults,\n type TabsActivationMode,\n type TabsDirection,\n type TabsMountPolicy,\n type TabsOrientation,\n type TabsPanelMode,\n} from \"@hjmds/design-contracts/behaviors\";\nimport {\n iconRecipe,\n tabsRecipe,\n type TabSize,\n type TabsLayout,\n type TabsOverflow,\n} from \"@hjmds/design-contracts/recipes\";\nimport {\n forwardRef,\n useEffect,\n useId,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from \"react\";\nimport { classNames, useControllableState } from \"./internal.js\";\nimport { useOptionalHjmTheme } from \"./provider.js\";\n\nexport type TabLeadingRenderProps = Readonly<{\n selected: boolean;\n disabled: boolean;\n color: \"currentColor\";\n /** Pixel size resolved from `tabsRecipe.icon.glyph`. */\n size: number;\n /** Compatibility alias for product icon libraries that name this value explicitly. */\n glyphSize: number;\n}>;\n\nexport type TabItem = Readonly<{\n id: string;\n label: ReactNode;\n panel?: ReactNode;\n renderLeading?: (state: TabLeadingRenderProps) => ReactNode;\n disabled?: boolean;\n}>;\n\ntype TabsSelection =\n | Readonly<{\n value: string;\n defaultValue?: never;\n onValueChange(value: string): void;\n }>\n | Readonly<{\n value?: never;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n }>;\n\nexport type TabsProps = Omit<HTMLAttributes<HTMLDivElement>, \"dir\" | \"onChange\"> &\n TabsSelection &\n Readonly<{\n label: string;\n items: readonly TabItem[];\n activationMode?: TabsActivationMode;\n mountPolicy?: TabsMountPolicy;\n panelMode?: TabsPanelMode;\n orientation?: TabsOrientation;\n direction?: TabsDirection;\n loop?: boolean;\n size?: TabSize;\n layout?: TabsLayout;\n overflow?: TabsOverflow;\n /** Set false when panels are rendered separately with `TabPanel`. */\n renderPanels?: boolean;\n }>;\n\nfunction validateItems(items: readonly TabItem[]): void {\n if (items.length === 0) throw new TypeError(\"Tabs requires at least one item\");\n const ids = new Set<string>();\n for (const item of items) {\n if (item.id.trim().length === 0) throw new TypeError(\"Tabs item id must not be empty\");\n if (ids.has(item.id)) throw new TypeError(`Duplicate Tabs item id: ${item.id}`);\n ids.add(item.id);\n }\n if (!items.some((item) => !item.disabled)) {\n throw new TypeError(\"Tabs requires at least one enabled item\");\n }\n}\n\nconst panelFocusableSelector = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"[tabindex]:not([tabindex='-1'])\",\n].join(\",\");\n\ntype TabPanelHostProps = HTMLAttributes<HTMLDivElement> & Readonly<{\n id: string;\n labelledBy: string;\n selected: boolean;\n dynamic: boolean;\n children: ReactNode;\n}>;\n\nfunction TabPanelHost({\n id,\n labelledBy,\n selected,\n dynamic,\n children,\n className,\n ...props\n}: TabPanelHostProps) {\n const ref = useRef<HTMLDivElement>(null);\n const [hasFocusableContent, setHasFocusableContent] = useState(false);\n useEffect(() => {\n setHasFocusableContent(\n ref.current?.querySelector(panelFocusableSelector) !== null,\n );\n }, [children]);\n\n return (\n <div\n {...props}\n ref={ref}\n id={id}\n role=\"tabpanel\"\n className={classNames(\"hjm-tabs__panel\", className)}\n aria-labelledby={labelledBy}\n tabIndex={selected && !hasFocusableContent ? 0 : undefined}\n hidden={!selected}\n inert={selected ? undefined : true}\n data-state={selected ? \"active\" : \"inactive\"}\n data-panel-mode={dynamic ? \"dynamic\" : \"keyed\"}\n >\n {children}\n </div>\n );\n}\n\nfunction encodedTabId(value: string): string {\n return encodeURIComponent(value);\n}\n\nexport function getTabId(tabsId: string, value: string): string {\n return `${tabsId}-tab-${encodedTabId(value)}`;\n}\n\nexport function getTabPanelId(\n tabsId: string,\n value: string,\n mode: TabsPanelMode = \"keyed\",\n): string {\n return mode === \"dynamic\"\n ? `${tabsId}-panel`\n : `${tabsId}-panel-${encodedTabId(value)}`;\n}\n\nexport function getDynamicTabPanelId(tabsId: string): string {\n return getTabPanelId(tabsId, \"\", \"dynamic\");\n}\n\ntype ExternalTabPanelBaseProps = Omit<HTMLAttributes<HTMLDivElement>, \"id\"> &\n Readonly<{\n tabsId: string;\n activeValue: string;\n children: ReactNode;\n }>;\n\nexport type TabPanelProps = ExternalTabPanelBaseProps &\n (\n | Readonly<{\n mode: \"dynamic\";\n value?: never;\n mountPolicy?: never;\n }>\n | Readonly<{\n mode?: \"keyed\";\n value: string;\n mountPolicy?: TabsMountPolicy;\n }>\n );\n\n/** External panel host for products that keep routing, query, or scroll state outside Tabs. */\nexport function TabPanel(props: TabPanelProps) {\n const { tabsId, activeValue, children } = props;\n const dynamic = props.mode === \"dynamic\";\n const value = dynamic ? activeValue : props.value;\n const selected = value === activeValue;\n const mountPolicy = dynamic ? \"active\" : props.mountPolicy ?? tabsBehaviorDefaults.mountPolicy;\n let hostProps: Omit<HTMLAttributes<HTMLDivElement>, \"id\">;\n if (props.mode === \"dynamic\") {\n const {\n tabsId: _tabsId,\n activeValue: _activeValue,\n children: _children,\n mode: _mode,\n ...htmlProps\n } = props;\n hostProps = htmlProps;\n } else {\n const {\n tabsId: _tabsId,\n activeValue: _activeValue,\n children: _children,\n mode: _mode,\n value: _value,\n mountPolicy: _mountPolicy,\n ...htmlProps\n } = props;\n hostProps = htmlProps;\n }\n const [visited, setVisited] = useState(selected);\n useEffect(() => {\n if (selected) setVisited(true);\n }, [selected]);\n const mounted =\n dynamic ||\n selected ||\n mountPolicy === \"always\" ||\n (mountPolicy === \"visited\" && visited);\n if (!mounted) return null;\n return (\n <TabPanelHost\n {...hostProps}\n id={getTabPanelId(tabsId, value, dynamic ? \"dynamic\" : \"keyed\")}\n labelledBy={getTabId(tabsId, dynamic ? activeValue : value)}\n selected={selected}\n dynamic={dynamic}\n >\n {children}\n </TabPanelHost>\n );\n}\n\nexport const Tabs = forwardRef<HTMLDivElement, TabsProps>(function Tabs(\n props,\n ref,\n) {\n const {\n label,\n items,\n activationMode = tabsBehaviorDefaults.activationMode,\n mountPolicy = tabsBehaviorDefaults.mountPolicy,\n panelMode = tabsBehaviorDefaults.panelMode,\n orientation = tabsBehaviorDefaults.orientation,\n direction: directionProp,\n loop = tabsBehaviorDefaults.loop,\n size = tabsRecipe.defaults.size,\n layout = tabsRecipe.defaults.layout,\n overflow = tabsRecipe.defaults.overflow,\n renderPanels = true,\n className,\n id,\n value: valueProp,\n defaultValue,\n onValueChange,\n ...rest\n } = props;\n validateItems(items);\n if (label.trim().length === 0) throw new TypeError(\"Tabs label must not be empty\");\n if (panelMode === \"dynamic\" && mountPolicy !== \"active\") {\n throw new TypeError(\"Tabs dynamic panelMode requires active mountPolicy\");\n }\n const descriptors = items.map((item) => ({\n id: item.id,\n label: item.id,\n ...(item.disabled === undefined ? {} : { disabled: item.disabled }),\n }));\n const initialValueRef = useRef<Readonly<{ value: string }> | null>(null);\n if (initialValueRef.current === null) {\n const resolved = resolveInitialTabValue(descriptors, defaultValue);\n if (resolved === undefined) throw new TypeError(\"Tabs requires an enabled item\");\n initialValueRef.current = { value: resolved };\n }\n const initialValue = initialValueRef.current.value;\n const collectionFallback = items.find((item) => !item.disabled)?.id;\n if (collectionFallback === undefined) throw new TypeError(\"Tabs requires an enabled item\");\n const [storedValue, setValue] = useControllableState({\n ...(valueProp === undefined ? {} : { value: valueProp }),\n defaultValue: initialValue,\n ...(onValueChange === undefined ? {} : { onChange: onValueChange }),\n });\n const controlled = valueProp !== undefined;\n const storedSelectionIsValid = items.some(\n (item) => item.id === storedValue && !item.disabled,\n );\n if (controlled && !storedSelectionIsValid) {\n throw new RangeError(`Tabs value must identify an enabled item: ${storedValue}`);\n }\n const value = storedSelectionIsValid ? storedValue : collectionFallback;\n const [focusValue, setFocusValue] = useState(value);\n const resolvedFocusValue = items.some(\n (item) => item.id === focusValue && !item.disabled,\n )\n ? focusValue\n : value;\n const [visited, setVisited] = useState<ReadonlySet<string>>(() => new Set([value]));\n const tabRefs = useRef(new Map<string, HTMLButtonElement>());\n const generatedId = useId().replaceAll(\":\", \"\");\n const baseId = id ?? `hjm-${generatedId}`;\n const theme = useOptionalHjmTheme();\n const direction = directionProp ?? theme?.environment.direction ?? tabsBehaviorDefaults.direction;\n\n useEffect(() => {\n if (!controlled && !storedSelectionIsValid) setValue(collectionFallback);\n }, [collectionFallback, controlled, setValue, storedSelectionIsValid]);\n useEffect(() => {\n if (!items.some((item) => item.id === focusValue && !item.disabled)) {\n setFocusValue(value);\n }\n }, [focusValue, items, value]);\n useEffect(() => {\n setVisited((current) => {\n const known = new Set(items.map((item) => item.id));\n const next = new Set([...current].filter((id) => known.has(id)));\n next.add(value);\n if (\n next.size === current.size &&\n [...next].every((id) => current.has(id))\n ) return current;\n return next;\n });\n }, [items, value]);\n\n const focusItem = (id: string) => {\n setFocusValue(id);\n if (activationMode === \"automatic\") setValue(id);\n queueMicrotask(() => {\n const node = tabRefs.current.get(id);\n if (!node) return;\n node.focus();\n // The tab strip is horizontally scrollable; keyboard focus must bring an offscreen roving tab into view.\n // `auto` preserves the consumer's scroll behavior, while `instant` prevents CSS smooth scrolling under reduced motion.\n node.scrollIntoView({\n block: \"nearest\",\n inline: \"nearest\",\n behavior: theme?.environment.reducedMotion ? \"instant\" : \"auto\",\n });\n });\n };\n const handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>, id: string) => {\n const intent = getTabNavigationIntent(\n event.key === \" \" ? \"Space\" : event.key as Parameters<typeof getTabNavigationIntent>[0],\n orientation,\n direction,\n );\n if (intent !== undefined) {\n const target = getTabNavigationTarget(descriptors, id, intent, loop);\n if (target !== undefined) {\n event.preventDefault();\n focusItem(target);\n }\n return;\n }\n if (\n activationMode === \"manual\" &&\n (event.key === \"Enter\" || event.key === \" \")\n ) {\n event.preventDefault();\n setValue(id);\n }\n };\n const panelId = (value: string) => getTabPanelId(baseId, value, panelMode);\n\n return (\n <div\n {...rest}\n ref={ref}\n id={baseId}\n className={classNames(\"hjm-tabs\", className)}\n data-size={size}\n data-layout={layout}\n data-overflow={overflow}\n data-orientation={orientation}\n data-mount-policy={mountPolicy}\n data-panel-mode={panelMode}\n data-state=\"ready\"\n dir={direction}\n >\n <div\n className=\"hjm-tabs__list\"\n role=\"tablist\"\n aria-label={label}\n aria-orientation={orientation}\n >\n {items.map((item) => {\n const selected = item.id === value;\n const tabId = getTabId(baseId, item.id);\n const leadingSize = iconRecipe.sizes[tabsRecipe.icon.glyph];\n return (\n <button\n key={item.id}\n ref={(node) => {\n if (node) tabRefs.current.set(item.id, node);\n else tabRefs.current.delete(item.id);\n }}\n id={tabId}\n type=\"button\"\n role=\"tab\"\n className=\"hjm-tabs__tab\"\n data-state={selected ? \"selected\" : \"idle\"}\n aria-selected={selected}\n aria-controls={panelId(item.id)}\n tabIndex={item.id === resolvedFocusValue ? 0 : -1}\n disabled={item.disabled}\n onClick={() => {\n setFocusValue(item.id);\n setValue(item.id);\n }}\n onKeyDown={(event) => handleKeyDown(event, item.id)}\n >\n {item.renderLeading ? (\n <span aria-hidden=\"true\" className=\"hjm-tabs__leading\">\n {item.renderLeading({\n selected,\n disabled: item.disabled ?? false,\n color: \"currentColor\",\n size: leadingSize,\n glyphSize: leadingSize,\n })}\n </span>\n ) : null}\n {item.label}\n </button>\n );\n })}\n </div>\n {!renderPanels ? null : panelMode === \"dynamic\" ? (\n <TabPanelHost\n id={panelId(value)}\n labelledBy={getTabId(baseId, value)}\n selected\n dynamic\n >\n {items.find((item) => item.id === value)?.panel}\n </TabPanelHost>\n ) : items.map((item) => {\n const selected = item.id === value;\n const mounted = mountPolicy === \"always\" ||\n (mountPolicy === \"visited\" && (visited.has(item.id) || selected)) ||\n (mountPolicy === \"active\" && selected);\n return mounted ? (\n <TabPanelHost\n key={item.id}\n id={panelId(item.id)}\n labelledBy={getTabId(baseId, item.id)}\n selected={selected}\n dynamic={false}\n >\n {item.panel}\n </TabPanelHost>\n ) : null;\n })}\n </div>\n );\n});\n"]}
1
+ {"version":3,"file":"navigation.js","sourceRoot":"","sources":["../src/navigation.tsx"],"names":[],"mappings":"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","sourcesContent":["import { resolveGooeyIndicator, type TabsAppearance, type GooeyIndicatorRect } from \"@hjmds/design-contracts/gooey-navigation\";\nexport type { TabsAppearance };\nimport {\n getTabNavigationIntent,\n getTabNavigationTarget,\n resolveInitialTabValue,\n tabsBehaviorDefaults,\n type TabsActivationMode,\n type TabsDirection,\n type TabsMountPolicy,\n type TabsOrientation,\n type TabsPanelMode,\n} from \"@hjmds/design-contracts/behaviors\";\nimport {\n iconRecipe,\n tabsRecipe,\n type TabSize,\n type TabsLayout,\n type TabsOverflow,\n} from \"@hjmds/design-contracts/recipes\";\nimport {\n forwardRef,\n useEffect,\n useLayoutEffect,\n useId,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from \"react\";\nimport { classNames, useControllableState } from \"./internal.js\";\nimport { useOptionalHjmTheme } from \"./provider.js\";\n\nexport type TabLeadingRenderProps = Readonly<{\n selected: boolean;\n disabled: boolean;\n color: \"currentColor\";\n /** Pixel size resolved from `tabsRecipe.icon.glyph`. */\n size: number;\n}>;\n\nexport type TabItem = Readonly<{\n id: string;\n label: ReactNode;\n panel?: ReactNode;\n renderLeading?: (state: TabLeadingRenderProps) => ReactNode;\n disabled?: boolean;\n}>;\n\ntype TabsSelection =\n | Readonly<{\n value: string;\n defaultValue?: never;\n onValueChange(value: string): void;\n }>\n | Readonly<{\n value?: never;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n }>;\n\nexport type TabsProps = Omit<HTMLAttributes<HTMLDivElement>, \"dir\" | \"onChange\"> &\n TabsSelection &\n Readonly<{\n label: string;\n items: readonly TabItem[];\n activationMode?: TabsActivationMode;\n mountPolicy?: TabsMountPolicy;\n panelMode?: TabsPanelMode;\n appearance?: TabsAppearance;\n orientation?: TabsOrientation;\n direction?: TabsDirection;\n loop?: boolean;\n size?: TabSize;\n layout?: TabsLayout;\n overflow?: TabsOverflow;\n /** Set false when panels are rendered separately with `TabPanel`. */\n renderPanels?: boolean;\n }>;\n\nfunction validateItems(items: readonly TabItem[]): void {\n if (items.length === 0) throw new TypeError(\"Tabs requires at least one item\");\n const ids = new Set<string>();\n for (const item of items) {\n if (item.id.trim().length === 0) throw new TypeError(\"Tabs item id must not be empty\");\n if (ids.has(item.id)) throw new TypeError(`Duplicate Tabs item id: ${item.id}`);\n ids.add(item.id);\n }\n if (!items.some((item) => !item.disabled)) {\n throw new TypeError(\"Tabs requires at least one enabled item\");\n }\n}\n\nconst panelFocusableSelector = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"[tabindex]:not([tabindex='-1'])\",\n].join(\",\");\n\ntype TabPanelHostProps = HTMLAttributes<HTMLDivElement> & Readonly<{\n id: string;\n labelledBy: string;\n selected: boolean;\n dynamic: boolean;\n children: ReactNode;\n}>;\n\nfunction TabPanelHost({\n id,\n labelledBy,\n selected,\n dynamic,\n children,\n className,\n ...props\n}: TabPanelHostProps) {\n const ref = useRef<HTMLDivElement>(null);\n const [hasFocusableContent, setHasFocusableContent] = useState(false);\n useEffect(() => {\n setHasFocusableContent(\n ref.current?.querySelector(panelFocusableSelector) !== null,\n );\n }, [children]);\n\n return (\n <div\n {...props}\n ref={ref}\n id={id}\n role=\"tabpanel\"\n className={classNames(\"hjm-tabs__panel\", className)}\n aria-labelledby={labelledBy}\n tabIndex={selected && !hasFocusableContent ? 0 : undefined}\n hidden={!selected}\n inert={selected ? undefined : true}\n data-state={selected ? \"active\" : \"inactive\"}\n data-panel-mode={dynamic ? \"dynamic\" : \"keyed\"}\n >\n {children}\n </div>\n );\n}\n\nfunction encodedTabId(value: string): string {\n return encodeURIComponent(value);\n}\n\nexport function getTabId(tabsId: string, value: string): string {\n return `${tabsId}-tab-${encodedTabId(value)}`;\n}\n\nexport function getTabPanelId(\n tabsId: string,\n value: string,\n mode: TabsPanelMode = \"keyed\",\n): string {\n return mode === \"dynamic\"\n ? `${tabsId}-panel`\n : `${tabsId}-panel-${encodedTabId(value)}`;\n}\n\nexport function getDynamicTabPanelId(tabsId: string): string {\n return getTabPanelId(tabsId, \"\", \"dynamic\");\n}\n\ntype ExternalTabPanelBaseProps = Omit<HTMLAttributes<HTMLDivElement>, \"id\"> &\n Readonly<{\n tabsId: string;\n activeValue: string;\n children: ReactNode;\n }>;\n\nexport type TabPanelProps = ExternalTabPanelBaseProps &\n (\n | Readonly<{\n mode: \"dynamic\";\n value?: never;\n mountPolicy?: never;\n }>\n | Readonly<{\n mode?: \"keyed\";\n value: string;\n mountPolicy?: TabsMountPolicy;\n }>\n );\n\n/** External panel host for products that keep routing, query, or scroll state outside Tabs. */\nexport function TabPanel(props: TabPanelProps) {\n const { tabsId, activeValue, children } = props;\n const dynamic = props.mode === \"dynamic\";\n const value = dynamic ? activeValue : props.value;\n const selected = value === activeValue;\n const mountPolicy = dynamic ? \"active\" : props.mountPolicy ?? tabsBehaviorDefaults.mountPolicy;\n let hostProps: Omit<HTMLAttributes<HTMLDivElement>, \"id\">;\n if (props.mode === \"dynamic\") {\n const {\n tabsId: _tabsId,\n activeValue: _activeValue,\n children: _children,\n mode: _mode,\n ...htmlProps\n } = props;\n hostProps = htmlProps;\n } else {\n const {\n tabsId: _tabsId,\n activeValue: _activeValue,\n children: _children,\n mode: _mode,\n value: _value,\n mountPolicy: _mountPolicy,\n ...htmlProps\n } = props;\n hostProps = htmlProps;\n }\n const [visited, setVisited] = useState(selected);\n useEffect(() => {\n if (selected) setVisited(true);\n }, [selected]);\n const mounted =\n dynamic ||\n selected ||\n mountPolicy === \"always\" ||\n (mountPolicy === \"visited\" && visited);\n if (!mounted) return null;\n return (\n <TabPanelHost\n {...hostProps}\n id={getTabPanelId(tabsId, value, dynamic ? \"dynamic\" : \"keyed\")}\n labelledBy={getTabId(tabsId, dynamic ? activeValue : value)}\n selected={selected}\n dynamic={dynamic}\n >\n {children}\n </TabPanelHost>\n );\n}\n\nexport const Tabs = forwardRef<HTMLDivElement, TabsProps>(function Tabs(\n props,\n ref,\n) {\n const {\n label,\n items,\n activationMode = tabsBehaviorDefaults.activationMode,\n mountPolicy = tabsBehaviorDefaults.mountPolicy,\n panelMode = tabsBehaviorDefaults.panelMode,\n appearance = \"standard\",\n orientation = tabsBehaviorDefaults.orientation,\n direction: directionProp,\n loop = tabsBehaviorDefaults.loop,\n size = tabsRecipe.defaults.size,\n layout = tabsRecipe.defaults.layout,\n overflow = tabsRecipe.defaults.overflow,\n renderPanels = true,\n className,\n id,\n value: valueProp,\n defaultValue,\n onValueChange,\n ...rest\n } = props;\n validateItems(items);\n if (label.trim().length === 0) throw new TypeError(\"Tabs label must not be empty\");\n if (panelMode === \"dynamic\" && mountPolicy !== \"active\") {\n throw new TypeError(\"Tabs dynamic panelMode requires active mountPolicy\");\n }\n const descriptors = items.map((item) => ({\n id: item.id,\n label: item.id,\n ...(item.disabled === undefined ? {} : { disabled: item.disabled }),\n }));\n const initialValueRef = useRef<Readonly<{ value: string }> | null>(null);\n if (initialValueRef.current === null) {\n const resolved = resolveInitialTabValue(descriptors, defaultValue);\n if (resolved === undefined) throw new TypeError(\"Tabs requires an enabled item\");\n initialValueRef.current = { value: resolved };\n }\n const initialValue = initialValueRef.current.value;\n const collectionFallback = items.find((item) => !item.disabled)?.id;\n if (collectionFallback === undefined) throw new TypeError(\"Tabs requires an enabled item\");\n const [storedValue, setValue] = useControllableState({\n ...(valueProp === undefined ? {} : { value: valueProp }),\n defaultValue: initialValue,\n ...(onValueChange === undefined ? {} : { onChange: onValueChange }),\n });\n const controlled = valueProp !== undefined;\n const storedSelectionIsValid = items.some(\n (item) => item.id === storedValue && !item.disabled,\n );\n if (controlled && !storedSelectionIsValid) {\n throw new RangeError(`Tabs value must identify an enabled item: ${storedValue}`);\n }\n const value = storedSelectionIsValid ? storedValue : collectionFallback;\n const [focusValue, setFocusValue] = useState(value);\n const resolvedFocusValue = items.some(\n (item) => item.id === focusValue && !item.disabled,\n )\n ? focusValue\n : value;\n const [visited, setVisited] = useState<ReadonlySet<string>>(() => new Set([value]));\n const tabRefs = useRef(new Map<string, HTMLButtonElement>());\n const generatedId = useId().replaceAll(\":\", \"\");\n const baseId = id ?? `hjm-${generatedId}`;\n const theme = useOptionalHjmTheme();\n const direction = directionProp ?? theme?.environment.direction ?? tabsBehaviorDefaults.direction;\n const gooey = appearance === \"gooey\" && orientation === \"horizontal\";\n const indicatorRef = useRef<HTMLSpanElement>(null);\n const previousIndicator = useRef<{ value: string; rect: GooeyIndicatorRect } | null>(null);\n useLayoutEffect(() => {\n const indicator = indicatorRef.current;\n const tab = tabRefs.current.get(value);\n if (!gooey || !indicator || !tab) { previousIndicator.current = null; return; }\n let animation: Animation | undefined;\n const place = (animate: boolean) => {\n animation?.cancel();\n const rect = { x: tab.offsetLeft, width: tab.offsetWidth };\n if (rect.width <= 0) return;\n indicator.style.left = `${rect.x}px`;\n indicator.style.width = `${rect.width}px`;\n const previous = previousIndicator.current;\n if (animate && previous && previous.value !== value && !theme?.environment.reducedMotion && !document.hidden) {\n const recipe = resolveGooeyIndicator(previous.rect, rect);\n animation = indicator.animate(recipe.input.map((offset, index) => ({ offset, left: `${recipe.x[index]}px`, width: `${recipe.width[index]}px` })), { duration: recipe.duration, easing: \"ease-out\" });\n }\n previousIndicator.current = { value, rect };\n };\n place(true);\n // Font loading, resizing and large text change measurements without changing selection.\n const observer = new ResizeObserver(() => {\n const previous = previousIndicator.current?.rect;\n if (previous?.x !== tab.offsetLeft || previous.width !== tab.offsetWidth) place(false);\n });\n const list = tab.parentElement!;\n for (const child of list.children) if (child !== indicator) observer.observe(child);\n const visibility = () => { if (document.hidden) animation?.cancel(); };\n document.addEventListener(\"visibilitychange\", visibility);\n return () => { animation?.cancel(); observer.disconnect(); document.removeEventListener(\"visibilitychange\", visibility); };\n }, [gooey, value, items, theme?.environment.reducedMotion]);\n\n\n useEffect(() => {\n if (!controlled && !storedSelectionIsValid) setValue(collectionFallback);\n }, [collectionFallback, controlled, setValue, storedSelectionIsValid]);\n useEffect(() => {\n if (!items.some((item) => item.id === focusValue && !item.disabled)) {\n setFocusValue(value);\n }\n }, [focusValue, items, value]);\n useEffect(() => {\n setVisited((current) => {\n const known = new Set(items.map((item) => item.id));\n const next = new Set([...current].filter((id) => known.has(id)));\n next.add(value);\n if (\n next.size === current.size &&\n [...next].every((id) => current.has(id))\n ) return current;\n return next;\n });\n }, [items, value]);\n\n const focusItem = (id: string) => {\n setFocusValue(id);\n if (activationMode === \"automatic\") setValue(id);\n queueMicrotask(() => {\n const node = tabRefs.current.get(id);\n if (!node) return;\n node.focus();\n // The tab strip is horizontally scrollable; keyboard focus must bring an offscreen roving tab into view.\n // `auto` preserves the consumer's scroll behavior, while `instant` prevents CSS smooth scrolling under reduced motion.\n node.scrollIntoView({\n block: \"nearest\",\n inline: \"nearest\",\n behavior: theme?.environment.reducedMotion ? \"instant\" : \"auto\",\n });\n });\n };\n const handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>, id: string) => {\n const intent = getTabNavigationIntent(\n event.key === \" \" ? \"Space\" : event.key as Parameters<typeof getTabNavigationIntent>[0],\n orientation,\n direction,\n );\n if (intent !== undefined) {\n const target = getTabNavigationTarget(descriptors, id, intent, loop);\n if (target !== undefined) {\n event.preventDefault();\n focusItem(target);\n }\n return;\n }\n if (\n activationMode === \"manual\" &&\n (event.key === \"Enter\" || event.key === \" \")\n ) {\n event.preventDefault();\n setValue(id);\n }\n };\n const panelId = (value: string) => getTabPanelId(baseId, value, panelMode);\n\n return (\n <div\n {...rest}\n ref={ref}\n id={baseId}\n className={classNames(\"hjm-tabs\", className)}\n data-size={size}\n data-layout={layout}\n data-overflow={overflow}\n data-appearance={gooey ? \"gooey\" : \"standard\"}\n data-orientation={orientation}\n data-mount-policy={mountPolicy}\n data-panel-mode={panelMode}\n data-state=\"ready\"\n dir={direction}\n >\n <div\n className=\"hjm-tabs__list\"\n role=\"tablist\"\n aria-label={label}\n aria-orientation={orientation}\n >\n {gooey ? <span ref={indicatorRef} aria-hidden=\"true\" className=\"hjm-tabs__gooey\" /> : null}\n {items.map((item) => {\n const selected = item.id === value;\n const tabId = getTabId(baseId, item.id);\n const leadingSize = iconRecipe.sizes[tabsRecipe.icon.glyph];\n return (\n <button\n key={item.id}\n ref={(node) => {\n if (node) tabRefs.current.set(item.id, node);\n else tabRefs.current.delete(item.id);\n }}\n id={tabId}\n type=\"button\"\n role=\"tab\"\n className=\"hjm-tabs__tab\"\n data-state={selected ? \"selected\" : \"idle\"}\n aria-selected={selected}\n aria-controls={panelId(item.id)}\n tabIndex={item.id === resolvedFocusValue ? 0 : -1}\n disabled={item.disabled}\n onClick={() => {\n setFocusValue(item.id);\n setValue(item.id);\n }}\n onKeyDown={(event) => handleKeyDown(event, item.id)}\n >\n {item.renderLeading ? (\n <span aria-hidden=\"true\" className=\"hjm-tabs__leading\">\n {item.renderLeading({\n selected,\n disabled: item.disabled ?? false,\n color: \"currentColor\",\n size: leadingSize,\n })}\n </span>\n ) : null}\n {item.label}\n </button>\n );\n })}\n </div>\n {!renderPanels ? null : panelMode === \"dynamic\" ? (\n <TabPanelHost\n id={panelId(value)}\n labelledBy={getTabId(baseId, value)}\n selected\n dynamic\n >\n {items.find((item) => item.id === value)?.panel}\n </TabPanelHost>\n ) : items.map((item) => {\n const selected = item.id === value;\n const mounted = mountPolicy === \"always\" ||\n (mountPolicy === \"visited\" && (visited.has(item.id) || selected)) ||\n (mountPolicy === \"active\" && selected);\n return mounted ? (\n <TabPanelHost\n key={item.id}\n id={panelId(item.id)}\n labelledBy={getTabId(baseId, item.id)}\n selected={selected}\n dynamic={false}\n >\n {item.panel}\n </TabPanelHost>\n ) : null;\n })}\n </div>\n );\n});\n"]}
@@ -0,0 +1,11 @@
1
+ import { type ReactNode } from "react";
2
+ export type NotificationBellProps = Readonly<{
3
+ label: string;
4
+ count: number;
5
+ icon: ReactNode;
6
+ onPress: () => void;
7
+ disabled?: boolean;
8
+ active?: boolean;
9
+ }>;
10
+ export declare function NotificationBell({ label, count, icon, onPress, disabled, active }: NotificationBellProps): import("react").JSX.Element;
11
+ //# sourceMappingURL=notification-bell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-bell.d.ts","sourceRoot":"","sources":["../src/notification-bell.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAI1D,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAC3J,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,QAAgB,EAAE,MAAa,EAAE,EAAE,qBAAqB,+BAevH"}
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef } from "react";
3
+ import { IconButton } from "./actions.js";
4
+ import { CounterBadge } from "./supplemental-display.js";
5
+ import { useHjmTheme } from "./provider.js";
6
+ export function NotificationBell({ label, count, icon, onPress, disabled = false, active = true }) {
7
+ if (!Number.isSafeInteger(count) || count < 0)
8
+ throw new RangeError("Unread count must be a nonnegative integer");
9
+ const { environment } = useHjmTheme();
10
+ const art = useRef(null);
11
+ const previous = useRef(count);
12
+ useEffect(() => {
13
+ const increased = count > previous.current;
14
+ previous.current = count;
15
+ if (!increased || !active || environment.reducedMotion || document.hidden || !art.current?.animate)
16
+ return;
17
+ // One bounded pulse for new unread items; never ring continuously or on mount.
18
+ const animation = art.current.animate([{ transform: 'rotate(0deg)' }, { transform: 'rotate(12deg)' }, { transform: 'rotate(-12deg)' }, { transform: 'rotate(6deg)' }, { transform: 'rotate(0deg)' }], { duration: 400, easing: 'ease-out' });
19
+ const stop = () => { if (document.hidden)
20
+ animation.cancel(); };
21
+ document.addEventListener('visibilitychange', stop);
22
+ return () => { animation.cancel(); document.removeEventListener('visibilitychange', stop); };
23
+ }, [count, active, environment.reducedMotion]);
24
+ // Keep the badge anchored to the icon even in a stretching Stack or grid.
25
+ return _jsxs("span", { style: { position: 'relative', display: 'inline-flex', alignSelf: 'flex-start', width: 'max-content' }, children: [_jsx(IconButton, { label: label, disabled: disabled, onClick: onPress, children: _jsx("span", { ref: art, "aria-hidden": "true", style: { display: 'inline-flex', transformOrigin: 'top center' }, children: icon }) }), _jsx("span", { "aria-hidden": "true", style: { position: 'absolute', insetInlineEnd: 0, top: 0, pointerEvents: 'none' }, children: _jsx(CounterBadge, { count: count, variant: "floating" }) })] });
26
+ }
27
+ //# sourceMappingURL=notification-bell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-bell.js","sourceRoot":"","sources":["../src/notification-bell.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAkB,MAAM,OAAO,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,UAAU,gBAAgB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,GAAG,KAAK,EAAE,MAAM,GAAG,IAAI,EAAyB;IACtH,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,4CAA4C,CAAC,CAAC;IAClH,MAAM,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAAC;IACtC,MAAM,GAAG,GAAG,MAAM,CAAkB,IAAI,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,SAAS,GAAG,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;QAAC,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;QACrE,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,IAAI,WAAW,CAAC,aAAa,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO;YAAE,OAAO;QAC3G,+EAA+E;QAC/E,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAC,SAAS,EAAC,cAAc,EAAC,EAAC,EAAC,SAAS,EAAC,eAAe,EAAC,EAAC,EAAC,SAAS,EAAC,gBAAgB,EAAC,EAAC,EAAC,SAAS,EAAC,cAAc,EAAC,EAAC,EAAC,SAAS,EAAC,cAAc,EAAC,CAAC,EAAC,EAAC,QAAQ,EAAC,GAAG,EAAC,MAAM,EAAC,UAAU,EAAC,CAAC,CAAC;QACpN,MAAM,IAAI,GAAC,GAAE,EAAE,GAAC,IAAG,QAAQ,CAAC,MAAM;YAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAA,CAAC,CAAC;QAAA,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAC,IAAI,CAAC,CAAC;QAC3G,OAAO,GAAE,EAAE,GAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAA,QAAQ,CAAC,mBAAmB,CAAC,kBAAkB,EAAC,IAAI,CAAC,CAAC,CAAA,CAAC,CAAC;IACzF,CAAC,EAAC,CAAC,KAAK,EAAC,MAAM,EAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;IAC5C,0EAA0E;IAC1E,OAAO,gBAAM,KAAK,EAAE,EAAC,QAAQ,EAAC,UAAU,EAAC,OAAO,EAAC,aAAa,EAAC,SAAS,EAAC,YAAY,EAAC,KAAK,EAAC,aAAa,EAAC,aAAE,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,YAAE,eAAM,GAAG,EAAE,GAAG,iBAAc,MAAM,EAAC,KAAK,EAAE,EAAC,OAAO,EAAC,aAAa,EAAC,eAAe,EAAC,YAAY,EAAC,YAAG,IAAI,GAAQ,GAAa,EAAA,8BAAkB,MAAM,EAAC,KAAK,EAAE,EAAC,QAAQ,EAAC,UAAU,EAAC,cAAc,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,aAAa,EAAC,MAAM,EAAC,YAAE,KAAC,YAAY,IAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAC,UAAU,GAAE,GAAO,IAAO,CAAC;AAC1c,CAAC","sourcesContent":["import { useEffect, useRef, type ReactNode } from \"react\";\nimport { IconButton } from \"./actions.js\";\nimport { CounterBadge } from \"./supplemental-display.js\";\nimport { useHjmTheme } from \"./provider.js\";\nexport type NotificationBellProps = Readonly<{ label: string; count: number; icon: ReactNode; onPress: () => void; disabled?: boolean; active?: boolean }>;\nexport function NotificationBell({ label, count, icon, onPress, disabled = false, active = true }: NotificationBellProps) {\n if (!Number.isSafeInteger(count) || count < 0) throw new RangeError(\"Unread count must be a nonnegative integer\");\n const { environment } = useHjmTheme();\n const art = useRef<HTMLSpanElement>(null);\n const previous = useRef(count);\n useEffect(() => {\n const increased = count > previous.current; previous.current = count;\n if (!increased || !active || environment.reducedMotion || document.hidden || !art.current?.animate) return;\n // One bounded pulse for new unread items; never ring continuously or on mount.\n const animation = art.current.animate([{transform:'rotate(0deg)'},{transform:'rotate(12deg)'},{transform:'rotate(-12deg)'},{transform:'rotate(6deg)'},{transform:'rotate(0deg)'}],{duration:400,easing:'ease-out'});\n const stop=()=>{if(document.hidden)animation.cancel();};document.addEventListener('visibilitychange',stop);\n return ()=>{animation.cancel();document.removeEventListener('visibilitychange',stop);};\n },[count,active,environment.reducedMotion]);\n // Keep the badge anchored to the icon even in a stretching Stack or grid.\n return <span style={{position:'relative',display:'inline-flex',alignSelf:'flex-start',width:'max-content'}}><IconButton label={label} disabled={disabled} onClick={onPress}><span ref={art} aria-hidden=\"true\" style={{display:'inline-flex',transformOrigin:'top center'}}>{icon}</span></IconButton><span aria-hidden=\"true\" style={{position:'absolute',insetInlineEnd:0,top:0,pointerEvents:'none'}}><CounterBadge count={count} variant=\"floating\"/></span></span>;\n}\n"]}
@@ -114,8 +114,6 @@ export type MenuItem = Readonly<{
114
114
  trailing?: ReactNode;
115
115
  tone?: MenuItemTone;
116
116
  disabled?: boolean;
117
- /** Backward-compatible item-local action; Menu onAction receives every activation. */
118
- onSelect?: () => void;
119
117
  }>;
120
118
  export type MenuSection = Omit<MenuSectionDescriptor<string, string>, "items"> & Readonly<{
121
119
  items: readonly MenuItem[];
@@ -1 +1 @@
1
- {"version":3,"file":"overlays.d.ts","sourceRoot":"","sources":["../src/overlays.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,2BAA2B,EAChC,KAAK,kBAAkB,EAExB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC5B,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EACtB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAGL,WAAW,EAEX,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAUL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAKf,OAAO,EAOL,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,MAAM,sBAAsB,GAC9B,SAAS,GACT,cAAc,GACd,QAAQ,GACR,SAAS,CAAC;AAEd,MAAM,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC;IAAE,MAAM,EAAE,sBAAsB,CAAA;CAAE,CAAC,CAAC,GACpF,QAAQ,CAAC;IACP,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACtD,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACrD;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;QAAE,MAAM,EAAE,OAAO,CAAC,sBAAsB,EAAE,SAAS,CAAC,GAAG,cAAc,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;IACxH,mFAAmF;IACnF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAEL,eAAO,MAAM,MAAM,wGAiJjB,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAC3C,QAAQ,CAAC;IAAE,MAAM,EAAE,2BAA2B,CAAA;CAAE,CAAC,CAClD,GACC,QAAQ,CAAC;IACP,OAAO,EAAE,kBAAkB,CAAC;IAC5B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACrD,mFAAmF;IACnF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAEL,eAAO,MAAM,WAAW,6GAuKvB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAC;AAExD,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,WAAW,CAAC,KAAK,CAAC;AAEvD,MAAM,MAAM,UAAU,GAAG,cAAc,CAAC,sBAAsB,CAAC,GAC7D,QAAQ,CAAC;IACP,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B;;;;;OAKG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IACjC,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IAC/C,+EAA+E;IAC/E,YAAY,CAAC,EAAE,QAAQ,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC5C,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACtD,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACrD,6EAA6E;IAC7E,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;QAAE,MAAM,EAAE,kBAAkB,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;IAC/E,mFAAmF;IACnF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAEL,eAAO,MAAM,KAAK,uGA0LhB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,SAAS,CAAC,wBAAwB,CAAC,GAC5D,QAAQ,CAAC;IACP,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAEL,eAAO,MAAM,OAAO,0GA8NlB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sFAAsF;IACtF,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB,CAAC,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,GAC5E,QAAQ,CAAC;IAAE,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAA;CAAE,CAAC,CAAC;AAE3C,MAAM,MAAM,oBAAoB,GAC5B,SAAS,GACT,WAAW,GACX,QAAQ,GACR,SAAS,GACT,KAAK,CAAC;AAEV,MAAM,MAAM,cAAc,GACtB,QAAQ,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAC5B,QAAQ,CAAC;IACP,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,OAAO,GAAG,OAAO,CAAC;IACtD,OAAO,EAAE,SAAS,CAAC;CACpB,CAAC,CAAC;AAEP,KAAK,mBAAmB,GAAG,QAAQ,CAAC;IAClC,aAAa,CAAC,EAAE,QAAQ,CAAC;IACzB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,aAAa,CAAC,EAAE,KAAK,CAAC;CACvB,CAAC,CAAC;AAEH,KAAK,mBAAmB,GACpB,QAAQ,CAAC;IACP,aAAa,EAAE,QAAQ,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC,CAAC,GACF,QAAQ,CAAC;IACP,aAAa,EAAE,QAAQ,CAAC;IACxB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC,CAAC,CAAC;AAEP,KAAK,qBAAqB,GACtB,QAAQ,CAAC;IACP,aAAa,EAAE,UAAU,CAAC;IAC1B,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;CACjD,CAAC,GACF,QAAQ,CAAC;IACP,aAAa,EAAE,UAAU,CAAC;IAC1B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,YAAY,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;CACtD,CAAC,CAAC;AAEP,KAAK,eAAe,GAChB,QAAQ,CAAC;IACP,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,KAAK,CAAC;CAClB,CAAC,GACF,QAAQ,CAAC;IACP,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;CAClC,CAAC,CAAC;AAEP,KAAK,aAAa,GAAG,QAAQ,CAAC;IAC5B,OAAO,EAAE,cAAc,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,yDAAyD;IACzD,oBAAoB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,GAAG,eAAe,CAAC;AAErB,MAAM,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC;IAAE,MAAM,EAAE,oBAAoB,CAAA;CAAE,CAAC,CAAC,GAC3E,aAAa,GACb,CAAC,mBAAmB,GAAG,mBAAmB,GAAG,qBAAqB,CAAC,CAAC;AA8CtE,eAAO,MAAM,IAAI,sGAkYf,CAAC"}
1
+ {"version":3,"file":"overlays.d.ts","sourceRoot":"","sources":["../src/overlays.tsx"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,2BAA2B,EAChC,KAAK,kBAAkB,EAExB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC5B,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EACtB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAGL,WAAW,EAEX,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAUL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAKf,OAAO,EAOL,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,MAAM,sBAAsB,GAC9B,SAAS,GACT,cAAc,GACd,QAAQ,GACR,SAAS,CAAC;AAEd,MAAM,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC;IAAE,MAAM,EAAE,sBAAsB,CAAA;CAAE,CAAC,CAAC,GACpF,QAAQ,CAAC;IACP,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACtD,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACrD;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;QAAE,MAAM,EAAE,OAAO,CAAC,sBAAsB,EAAE,SAAS,CAAC,GAAG,cAAc,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;IACxH,mFAAmF;IACnF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAEL,eAAO,MAAM,MAAM,wGAiJjB,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAC3C,QAAQ,CAAC;IAAE,MAAM,EAAE,2BAA2B,CAAA;CAAE,CAAC,CAClD,GACC,QAAQ,CAAC;IACP,OAAO,EAAE,kBAAkB,CAAC;IAC5B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACrD,mFAAmF;IACnF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAEL,eAAO,MAAM,WAAW,6GAuKvB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAC;AAExD,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,WAAW,CAAC,KAAK,CAAC;AAEvD,MAAM,MAAM,UAAU,GAAG,cAAc,CAAC,sBAAsB,CAAC,GAC7D,QAAQ,CAAC;IACP,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B;;;;;OAKG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IACjC,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IAC/C,+EAA+E;IAC/E,YAAY,CAAC,EAAE,QAAQ,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC5C,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACtD,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACrD,6EAA6E;IAC7E,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;QAAE,MAAM,EAAE,kBAAkB,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;IAC/E,mFAAmF;IACnF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAEL,eAAO,MAAM,KAAK,uGA0LhB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,SAAS,CAAC,wBAAwB,CAAC,GAC5D,QAAQ,CAAC;IACP,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAEL,eAAO,MAAM,OAAO,0GA8NlB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,GAC5E,QAAQ,CAAC;IAAE,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAA;CAAE,CAAC,CAAC;AAE3C,MAAM,MAAM,oBAAoB,GAC5B,SAAS,GACT,WAAW,GACX,QAAQ,GACR,SAAS,GACT,KAAK,CAAC;AAEV,MAAM,MAAM,cAAc,GACtB,QAAQ,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAC5B,QAAQ,CAAC;IACP,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,OAAO,GAAG,OAAO,CAAC;IACtD,OAAO,EAAE,SAAS,CAAC;CACpB,CAAC,CAAC;AAEP,KAAK,mBAAmB,GAAG,QAAQ,CAAC;IAClC,aAAa,CAAC,EAAE,QAAQ,CAAC;IACzB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,aAAa,CAAC,EAAE,KAAK,CAAC;CACvB,CAAC,CAAC;AAEH,KAAK,mBAAmB,GACpB,QAAQ,CAAC;IACP,aAAa,EAAE,QAAQ,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC,CAAC,GACF,QAAQ,CAAC;IACP,aAAa,EAAE,QAAQ,CAAC;IACxB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC,CAAC,CAAC;AAEP,KAAK,qBAAqB,GACtB,QAAQ,CAAC;IACP,aAAa,EAAE,UAAU,CAAC;IAC1B,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;CACjD,CAAC,GACF,QAAQ,CAAC;IACP,aAAa,EAAE,UAAU,CAAC;IAC1B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,YAAY,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;CACtD,CAAC,CAAC;AAEP,KAAK,eAAe,GAChB,QAAQ,CAAC;IACP,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,KAAK,CAAC;CAClB,CAAC,GACF,QAAQ,CAAC;IACP,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;CAClC,CAAC,CAAC;AAEP,KAAK,aAAa,GAAG,QAAQ,CAAC;IAC5B,OAAO,EAAE,cAAc,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,yDAAyD;IACzD,oBAAoB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,GAAG,eAAe,CAAC;AAErB,MAAM,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC;IAAE,MAAM,EAAE,oBAAoB,CAAA;CAAE,CAAC,CAAC,GAC3E,aAAa,GACb,CAAC,mBAAmB,GAAG,mBAAmB,GAAG,qBAAqB,CAAC,CAAC;AA8CtE,eAAO,MAAM,IAAI,sGAoXf,CAAC"}
package/dist/overlays.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { resolveMenuTypeahead } from "./menu-typeahead.js";
2
3
  import { createAlertDialogSession, getAlertDialogInitialFocus, validateAlertDialogRequest, } from "@hjmds/design-contracts/components/alert-dialog";
3
4
  import { createSheetLifecycle, resolveNextSheetDetent, sheetBehaviorDefaults, } from "@hjmds/design-contracts/components/sheet";
4
5
  import { resolveTooltipDescriptor, tooltipBehaviorDefaults, } from "@hjmds/design-contracts/components/tooltip";
@@ -605,7 +606,6 @@ export const Menu = forwardRef(function Menu(props, ref) {
605
606
  const activateItem = (item, index) => {
606
607
  if (itemIsDisabled(item))
607
608
  return;
608
- item.onSelect?.();
609
609
  onAction?.(item.id);
610
610
  if (selectionMode === "multiple") {
611
611
  const next = new Set(multipleValue);
@@ -623,23 +623,10 @@ export const Menu = forwardRef(function Menu(props, ref) {
623
623
  close("selection", true);
624
624
  };
625
625
  const runTypeahead = (key) => {
626
- const currentTime = Date.now();
627
- const previous = currentTime - typeaheadRef.current.time < 500
628
- ? typeaheadRef.current.value
629
- : "";
630
- const combined = `${previous}${key}`.toLocaleLowerCase();
631
- const search = new Set(combined).size === 1 ? key.toLocaleLowerCase() : combined;
632
- typeaheadRef.current = { value: combined, time: currentTime };
633
- for (let offset = 1; offset <= items.length; offset += 1) {
634
- const index = (focusIndex + offset + items.length) % items.length;
635
- const item = items[index];
636
- if (item &&
637
- !itemIsDisabled(item) &&
638
- menuTextValue(item).toLocaleLowerCase().startsWith(search)) {
639
- focusAt(index);
640
- return;
641
- }
642
- }
626
+ const result = resolveMenuTypeahead(items.map((item) => ({ textValue: menuTextValue(item), disabled: itemIsDisabled(item) })), focusIndex, key, typeaheadRef.current, Date.now());
627
+ typeaheadRef.current = result.state;
628
+ if (result.index !== undefined)
629
+ focusAt(result.index);
643
630
  };
644
631
  useEffect(() => {
645
632
  if (!open)