@hjmds/react 1.7.0 → 1.9.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 (96) hide show
  1. package/README.md +21 -0
  2. package/THIRD_PARTY_NOTICES.md +57 -0
  3. package/dist/advanced-display.d.ts +3 -1
  4. package/dist/advanced-display.d.ts.map +1 -1
  5. package/dist/advanced-display.js +2 -2
  6. package/dist/advanced-display.js.map +1 -1
  7. package/dist/affix.d.ts +10 -0
  8. package/dist/affix.d.ts.map +1 -0
  9. package/dist/affix.js +51 -0
  10. package/dist/affix.js.map +1 -0
  11. package/dist/carousel-motion.d.ts +13 -0
  12. package/dist/carousel-motion.d.ts.map +1 -0
  13. package/dist/carousel-motion.js +35 -0
  14. package/dist/carousel-motion.js.map +1 -0
  15. package/dist/celebration.d.ts +8 -0
  16. package/dist/celebration.d.ts.map +1 -0
  17. package/dist/celebration.js +51 -0
  18. package/dist/celebration.js.map +1 -0
  19. package/dist/color-picker.d.ts +18 -0
  20. package/dist/color-picker.d.ts.map +1 -0
  21. package/dist/color-picker.js +40 -0
  22. package/dist/color-picker.js.map +1 -0
  23. package/dist/content-transition.d.ts +18 -0
  24. package/dist/content-transition.d.ts.map +1 -0
  25. package/dist/content-transition.js +33 -0
  26. package/dist/content-transition.js.map +1 -0
  27. package/dist/context-menu.d.ts.map +1 -1
  28. package/dist/context-menu.js +36 -9
  29. package/dist/context-menu.js.map +1 -1
  30. package/dist/date-picker.d.ts.map +1 -1
  31. package/dist/date-picker.js +39 -1
  32. package/dist/date-picker.js.map +1 -1
  33. package/dist/evidence.d.ts +106 -2
  34. package/dist/evidence.d.ts.map +1 -1
  35. package/dist/evidence.js +136 -64
  36. package/dist/evidence.js.map +1 -1
  37. package/dist/layout.d.ts.map +1 -1
  38. package/dist/layout.js +3 -2
  39. package/dist/layout.js.map +1 -1
  40. package/dist/masonry.d.ts +14 -0
  41. package/dist/masonry.d.ts.map +1 -0
  42. package/dist/masonry.js +13 -0
  43. package/dist/masonry.js.map +1 -0
  44. package/dist/menu-morph.d.ts +12 -0
  45. package/dist/menu-morph.d.ts.map +1 -0
  46. package/dist/menu-morph.js +80 -0
  47. package/dist/menu-morph.js.map +1 -0
  48. package/dist/menubar.d.ts.map +1 -1
  49. package/dist/menubar.js +24 -15
  50. package/dist/menubar.js.map +1 -1
  51. package/dist/modal.d.ts +1 -0
  52. package/dist/modal.d.ts.map +1 -1
  53. package/dist/modal.js.map +1 -1
  54. package/dist/navigation.d.ts.map +1 -1
  55. package/dist/navigation.js +13 -1
  56. package/dist/navigation.js.map +1 -1
  57. package/dist/overlays.d.ts.map +1 -1
  58. package/dist/overlays.js +33 -2
  59. package/dist/overlays.js.map +1 -1
  60. package/dist/qr-code.d.ts +11 -0
  61. package/dist/qr-code.d.ts.map +1 -0
  62. package/dist/qr-code.js +14 -0
  63. package/dist/qr-code.js.map +1 -0
  64. package/dist/sortable.d.ts +14 -0
  65. package/dist/sortable.d.ts.map +1 -0
  66. package/dist/sortable.js +87 -0
  67. package/dist/sortable.js.map +1 -0
  68. package/dist/statistic-motion.d.ts +12 -0
  69. package/dist/statistic-motion.d.ts.map +1 -0
  70. package/dist/statistic-motion.js +23 -0
  71. package/dist/statistic-motion.js.map +1 -0
  72. package/dist/styles.css +166 -134
  73. package/dist/styles.layered.css +166 -134
  74. package/dist/swipe-actions.d.ts +13 -0
  75. package/dist/swipe-actions.d.ts.map +1 -0
  76. package/dist/swipe-actions.js +25 -0
  77. package/dist/swipe-actions.js.map +1 -0
  78. package/dist/theme.d.ts.map +1 -1
  79. package/dist/theme.js +2 -1
  80. package/dist/theme.js.map +1 -1
  81. package/dist/thinking-orb.d.ts +9 -0
  82. package/dist/thinking-orb.d.ts.map +1 -0
  83. package/dist/thinking-orb.js +86 -0
  84. package/dist/thinking-orb.js.map +1 -0
  85. package/dist/tree.d.ts.map +1 -1
  86. package/dist/tree.js +14 -3
  87. package/dist/tree.js.map +1 -1
  88. package/dist/virtual-list.d.ts +14 -0
  89. package/dist/virtual-list.d.ts.map +1 -0
  90. package/dist/virtual-list.js +48 -0
  91. package/dist/virtual-list.js.map +1 -0
  92. package/dist/watermark.d.ts +12 -0
  93. package/dist/watermark.d.ts.map +1 -0
  94. package/dist/watermark.js +10 -0
  95. package/dist/watermark.js.map +1 -0
  96. package/package.json +122 -5
package/README.md CHANGED
@@ -144,3 +144,24 @@ uses caller-owned strings.
144
144
  `Grid` observes window and element widths in the browser and starts from a
145
145
  deterministic compact layout during SSR. Tests may pass `windowWidth` and
146
146
  `availableWidth` explicitly; product code normally leaves both unset.
147
+
148
+ ## ThinkingOrb
149
+
150
+ Beta web AI operation indicator: `@hjmds/react/thinking-orb`.
151
+ Requires a localized `label`; `state`, `size` (20/64), `paused`, and `active` control its presentation.
152
+ See [the shared contract and compatibility](../design-contracts/docs/thinking-orb.md).
153
+
154
+ ## Optional presentation adapters
155
+
156
+ See [installation and behavior contracts](../design-contracts/docs/optional-adapters.md) for opt-in entries, pinned peers and verification limits. Native adapters remain experimental until device verification.
157
+
158
+ ## Data layouts and QRCode
159
+
160
+ Masonry and VirtualList use the granular `masonry` and `virtual-list` entries.
161
+ Supply measured item heights for Masonry and a fixed row height for VirtualList.
162
+ The optional `qr-code` entry requires `qrcode-generator@2.0.4` and a visible alternative
163
+ action alongside the accessible code.
164
+
165
+ ## Optional interaction adapters
166
+
167
+ Stable `sortable`, `swipe-actions`, `content-transition`, `carousel-motion` and `celebration` entries are available through explicit subpath imports. See [installation, localized labels and behavior contracts](../../docs/interaction-adapters.md), including pinned peers and native verification limits. These adapters are not root exports.
@@ -0,0 +1,57 @@
1
+
2
+ ## Thinking Orbs
3
+
4
+ Source: https://github.com/Jakubantalik/thinking-orbs/tree/de85557ca220332586d070d8788c0e1d6e877a0d
5
+
6
+ Geometry and presets adapted; DOM painters removed from the shared engine, lifecycle and semantic color integration rewritten for HJM.
7
+
8
+ MIT License
9
+
10
+ Copyright (c) 2026 Jakub Antalik
11
+
12
+ Permission is hereby granted, free of charge, to any person obtaining a copy
13
+ of this software and associated documentation files (the "Software"), to deal
14
+ in the Software without restriction, including without limitation the rights
15
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16
+ copies of the Software, and to permit persons to whom the Software is
17
+ furnished to do so, subject to the following conditions:
18
+
19
+ The above copyright notice and this permission notice shall be included in all
20
+ copies or substantial portions of the Software.
21
+
22
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28
+ SOFTWARE.
29
+
30
+ ## Motion Primitives — keyed content transition
31
+
32
+ Source: https://github.com/ibelick/motion-primitives/tree/120f64f6ca60348e251f929e9c81f11ccbe45eda
33
+
34
+ TransitionPanel pattern adapted to a single active HJM subtree, shared timing and host-owned focus. TextTransition uses whole-text fade instead of splitting graphemes.
35
+
36
+ MIT License
37
+
38
+ Copyright (c) 2024 ibelick
39
+
40
+ Permission is hereby granted, free of charge, to any person obtaining a copy
41
+ of this software and associated documentation files (the "Software"), to deal
42
+ in the Software without restriction, including without limitation the rights
43
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
44
+ copies of the Software, and to permit persons to whom the Software is
45
+ furnished to do so, subject to the following conditions:
46
+
47
+ The above copyright notice and this permission notice shall be included in all
48
+ copies or substantial portions of the Software.
49
+
50
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
51
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
52
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
53
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
54
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
55
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
56
+ SOFTWARE.
57
+ app/page.tsx
@@ -111,8 +111,10 @@ export type StatisticProps<Id extends string = string> = Omit<HTMLAttributes<HTM
111
111
  accessibilityLabel?: string;
112
112
  composeAccessibilityLabel?: ComposeStatisticAccessibilityLabel<Id>;
113
113
  renderTrendMark?: (props: StatisticTrendMarkRenderProps) => ReactNode;
114
+ /** Optional visual adapter; the descriptor remains the accessible value source. */
115
+ renderValue?: (value: string) => ReactNode;
114
116
  }>;
115
- export declare function Statistic<Id extends string = string>({ descriptor, density, presentation, contextLabel, accessibilityLabel, composeAccessibilityLabel, renderTrendMark, className, ...props }: StatisticProps<Id>): import("react").JSX.Element;
117
+ export declare function Statistic<Id extends string = string>({ descriptor, density, presentation, contextLabel, accessibilityLabel, composeAccessibilityLabel, renderTrendMark, renderValue, className, ...props }: StatisticProps<Id>): import("react").JSX.Element;
116
118
  export type StatisticGroupProps<Id extends string = string> = Omit<HTMLAttributes<HTMLDivElement>, "children"> & Readonly<{
117
119
  label: string;
118
120
  descriptor: StatisticGroupDescriptor<Id>;
@@ -1 +1 @@
1
- {"version":3,"file":"advanced-display.d.ts","sourceRoot":"","sources":["../src/advanced-display.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"advanced-display.d.ts","sourceRoot":"","sources":["../src/advanced-display.tsx"],"names":[],"mappings":"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"}
@@ -136,7 +136,7 @@ export const List = forwardRef(function List({ label, children, separator = list
136
136
  const items = Children.toArray(children);
137
137
  return (_jsx("div", { ...props, ref: ref, "aria-label": label, className: classNames("hjm-list", className), "data-appearance": appearance, "data-separator": separator, role: "list", children: items.map((item, index) => (_jsx("div", { className: "hjm-list__item", role: "listitem", children: item }, isValidElement(item) && item.key !== null ? item.key : `hjm-list-${index}`))) }));
138
138
  });
139
- export function Statistic({ descriptor, density = "comfortable", presentation = "plain", contextLabel, accessibilityLabel, composeAccessibilityLabel, renderTrendMark, className, ...props }) {
139
+ export function Statistic({ descriptor, density = "comfortable", presentation = "plain", contextLabel, accessibilityLabel, composeAccessibilityLabel, renderTrendMark, renderValue, className, ...props }) {
140
140
  const resolved = resolveStatisticDescriptor(descriptor);
141
141
  const valueText = `${resolved.prefix ?? ""}${resolved.value}${resolved.suffix ?? ""}`;
142
142
  const announcement = accessibilityLabel ?? composeAccessibilityLabel?.({
@@ -151,7 +151,7 @@ export function Statistic({ descriptor, density = "comfortable", presentation =
151
151
  const trendName = resolved.trend
152
152
  ? statisticRecipe.trend.marks[resolved.trend.direction]
153
153
  : undefined;
154
- return (_jsxs("article", { ...props, "aria-label": announcement, className: classNames("hjm-statistic", className), "data-density": density, "data-presentation": presentation, children: [_jsx("span", { "aria-hidden": "true", className: "hjm-statistic__label", children: resolved.label }), _jsxs("span", { "aria-hidden": "true", className: "hjm-statistic__value-row", children: [resolved.prefix ? _jsx("span", { className: "hjm-statistic__affix", children: resolved.prefix }) : null, _jsx("strong", { className: "hjm-statistic__value", children: resolved.value }), resolved.suffix ? _jsx("span", { className: "hjm-statistic__affix", children: resolved.suffix }) : null] }), resolved.trend ? (_jsxs("span", { "aria-hidden": "true", className: "hjm-statistic__trend", "data-tone": resolved.trend.tone, children: [_jsx("span", { className: "hjm-statistic__trend-mark", children: renderTrendMark?.({ name: trendName, color: "currentColor", size: 16 }) ?? (resolved.trend.direction === "up" ? "↑" : resolved.trend.direction === "down" ? "↓" : "—") }), resolved.trend.label] })) : null, resolved.hint ? _jsx("span", { "aria-hidden": "true", className: "hjm-statistic__hint", children: resolved.hint }) : null] }));
154
+ return (_jsxs("article", { ...props, "aria-label": announcement, className: classNames("hjm-statistic", className), "data-density": density, "data-presentation": presentation, children: [_jsx("span", { "aria-hidden": "true", className: "hjm-statistic__label", children: resolved.label }), _jsxs("span", { "aria-hidden": "true", className: "hjm-statistic__value-row", children: [resolved.prefix ? _jsx("span", { className: "hjm-statistic__affix", children: resolved.prefix }) : null, _jsx("strong", { className: "hjm-statistic__value", children: renderValue?.(resolved.value) ?? resolved.value }), resolved.suffix ? _jsx("span", { className: "hjm-statistic__affix", children: resolved.suffix }) : null] }), resolved.trend ? (_jsxs("span", { "aria-hidden": "true", className: "hjm-statistic__trend", "data-tone": resolved.trend.tone, children: [_jsx("span", { className: "hjm-statistic__trend-mark", children: renderTrendMark?.({ name: trendName, color: "currentColor", size: 16 }) ?? (resolved.trend.direction === "up" ? "↑" : resolved.trend.direction === "down" ? "↓" : "—") }), resolved.trend.label] })) : null, resolved.hint ? _jsx("span", { "aria-hidden": "true", className: "hjm-statistic__hint", children: resolved.hint }) : null] }));
155
155
  }
156
156
  export function StatisticGroup({ label, descriptor, density, presentation, composeAccessibilityLabel, renderTrendMark, className, style, ...props }) {
157
157
  validateStatisticGroup(descriptor);
@@ -1 +1 @@
1
- {"version":3,"file":"advanced-display.js","sourceRoot":"","sources":["../src/advanced-display.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n resolveDescriptionListColumnCount,\n resolveDescriptionListDescriptor,\n type DescriptionItemDescriptor,\n type DescriptionListColumns,\n} from \"@hjmds/design-contracts/components/description-list\";\nimport {\n resolveTimelineDescriptor,\n type ComposeTimelineAccessibleName,\n type TimelineItemDescriptor,\n} from \"@hjmds/design-contracts/components/timeline\";\nimport {\n resolveStatisticDescriptor,\n validateStatisticGroup,\n type ResolvedStatisticDescriptor,\n type StatisticDescriptor,\n type StatisticGroupDescriptor,\n} from \"@hjmds/design-contracts/components/statistic\";\nimport {\n accordionRecipe,\n avatarRecipe,\n dividerRecipe,\n listRecipe,\n statisticRecipe,\n type AccordionDensity,\n type AvatarShape,\n type AvatarSize,\n type StatisticDensity,\n type StatisticPresentation,\n} from \"@hjmds/design-contracts/recipes\";\nimport {\n Children,\n createElement,\n forwardRef,\n isValidElement,\n useEffect,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type ForwardedRef,\n type HTMLAttributes,\n type ImgHTMLAttributes,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n type RefAttributes,\n type TableHTMLAttributes,\n} from \"react\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nimport { classNames, useControllableState, useElementWidth } from \"./internal.js\";\nimport { useOptionalHjmTheme } from \"./provider.js\";\n\nexport type AccordionItem = Readonly<{\n id: string;\n title: ReactNode;\n panel: ReactNode;\n disabled?: boolean;\n}>;\n\nexport type AccordionProps = Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> &\n Readonly<{\n items: readonly AccordionItem[];\n value?: readonly string[];\n defaultValue?: readonly string[];\n onValueChange?: (value: readonly string[]) => void;\n allowsMultipleExpanded?: boolean;\n density?: AccordionDensity;\n headingLevel?: 2 | 3 | 4 | 5 | 6;\n }>;\n\nfunction validateAccordionItems(items: readonly AccordionItem[]): void {\n if (items.length === 0) throw new TypeError(\"Accordion 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(\"Accordion item id must not be empty\");\n if (ids.has(item.id)) throw new TypeError(`Duplicate Accordion item id: ${item.id}`);\n ids.add(item.id);\n }\n}\n\nfunction accordionFocusTarget(\n items: readonly AccordionItem[],\n currentIndex: number,\n key: string,\n): number | undefined {\n if (key === \"Home\") return items.findIndex((item) => !item.disabled);\n if (key === \"End\") {\n for (let index = items.length - 1; index >= 0; index -= 1) {\n if (!items[index]?.disabled) return index;\n }\n return -1;\n }\n const direction = key === \"ArrowDown\" ? 1 : key === \"ArrowUp\" ? -1 : 0;\n if (direction === 0) return undefined;\n for (let offset = 1; offset <= items.length; offset += 1) {\n const index = (currentIndex + direction * offset + items.length) % items.length;\n if (!items[index]?.disabled) return index;\n }\n return currentIndex;\n}\n\nexport const Accordion = forwardRef<HTMLDivElement, AccordionProps>(\n function Accordion(\n {\n items,\n value: valueProp,\n defaultValue = [],\n onValueChange,\n allowsMultipleExpanded = accordionRecipe.defaults.allowsMultipleExpanded,\n density = accordionRecipe.defaults.density,\n headingLevel = 3,\n className,\n ...props\n },\n ref,\n ) {\n validateAccordionItems(items);\n const [value, setValue] = useControllableState<readonly string[]>({\n ...(valueProp === undefined ? {} : { value: valueProp }),\n defaultValue,\n ...(onValueChange === undefined ? {} : { onChange: onValueChange }),\n });\n const validIds = new Set(items.map((item) => item.id));\n const valueIds = new Set<string>();\n for (const id of value) {\n if (!validIds.has(id)) throw new RangeError(`Unknown Accordion value: ${id}`);\n if (valueIds.has(id)) throw new TypeError(`Duplicate Accordion value: ${id}`);\n valueIds.add(id);\n }\n if (!allowsMultipleExpanded && value.length > 1) {\n throw new RangeError(\"Accordion only allows one expanded item\");\n }\n const baseId = useId().replaceAll(\":\", \"\");\n const triggerRefs = useRef(new Map<string, HTMLButtonElement>());\n const toggle = (id: string) => {\n const expanded = value.includes(id);\n setValue(\n expanded\n ? value.filter((candidate) => candidate !== id)\n : allowsMultipleExpanded\n ? [...value, id]\n : [id],\n );\n };\n\n return (\n <div\n {...props}\n ref={ref}\n className={classNames(\"hjm-accordion\", className)}\n data-density={density}\n data-multiple={allowsMultipleExpanded || undefined}\n >\n {items.map((item, index) => {\n const expanded = value.includes(item.id);\n const triggerId = `${baseId}-accordion-trigger-${index}`;\n const panelId = `${baseId}-accordion-panel-${index}`;\n const trigger = (\n <button\n ref={(node) => {\n if (node) triggerRefs.current.set(item.id, node);\n else triggerRefs.current.delete(item.id);\n }}\n id={triggerId}\n type=\"button\"\n className=\"hjm-accordion__trigger\"\n aria-expanded={expanded}\n aria-controls={panelId}\n disabled={item.disabled}\n onClick={() => toggle(item.id)}\n onKeyDown={(event: KeyboardEvent<HTMLButtonElement>) => {\n const target = accordionFocusTarget(items, index, event.key);\n if (target === undefined || target < 0) return;\n event.preventDefault();\n triggerRefs.current.get(items[target]!.id)?.focus();\n }}\n >\n <span className=\"hjm-accordion__title\">{item.title}</span>\n <span className=\"hjm-accordion__indicator\" aria-hidden=\"true\">\n {expanded ? \"−\" : \"+\"}\n </span>\n </button>\n );\n return (\n <div\n key={item.id}\n className=\"hjm-accordion__item\"\n data-state={item.disabled ? \"disabled\" : expanded ? \"expanded\" : \"collapsed\"}\n >\n {createElement(`h${headingLevel}`, { className: \"hjm-accordion__header\" }, trigger)}\n <div\n id={panelId}\n role=\"region\"\n className=\"hjm-accordion__panel\"\n aria-labelledby={triggerId}\n hidden={!expanded}\n >\n {item.panel}\n </div>\n </div>\n );\n })}\n </div>\n );\n },\n);\n\nfunction initials(name: string): string {\n return name\n .trim()\n .split(/\\s+/u)\n .slice(0, 2)\n .map((part) => Array.from(part)[0] ?? \"\")\n .join(\"\")\n .toLocaleUpperCase();\n}\n\nexport type AvatarProps = Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> &\n Readonly<{\n name: string;\n src?: string;\n alt?: string;\n fallback?: ReactNode;\n size?: AvatarSize;\n shape?: AvatarShape;\n imageProps?: Omit<ImgHTMLAttributes<HTMLImageElement>, \"alt\" | \"src\">;\n }>;\n\nexport const Avatar = forwardRef<HTMLSpanElement, AvatarProps>(function Avatar(\n {\n name,\n src,\n alt = name,\n fallback,\n size = avatarRecipe.defaults.size,\n shape = avatarRecipe.defaults.shape,\n imageProps,\n className,\n ...props\n },\n ref,\n) {\n if (name.trim().length === 0) throw new TypeError(\"Avatar name must not be empty\");\n const [imageAvailable, setImageAvailable] = useState(Boolean(src));\n useEffect(() => setImageAvailable(Boolean(src)), [src]);\n const { onError, className: imageClassName, ...restImageProps } = imageProps ?? {};\n return (\n <span\n {...props}\n ref={ref}\n className={classNames(\"hjm-avatar\", className)}\n data-size={size}\n data-shape={shape}\n data-state={imageAvailable ? \"image\" : \"fallback\"}\n >\n {src && imageAvailable ? (\n <img\n {...restImageProps}\n src={src}\n alt={alt}\n className={classNames(\"hjm-avatar__image\", imageClassName)}\n onError={(event) => {\n setImageAvailable(false);\n onError?.(event);\n }}\n />\n ) : (\n <span\n className=\"hjm-avatar__fallback\"\n role={alt.length > 0 ? \"img\" : undefined}\n aria-label={alt.length > 0 ? alt : undefined}\n aria-hidden={alt.length === 0 || undefined}\n >\n {fallback ?? initials(name)}\n </span>\n )}\n </span>\n );\n});\n\nexport type AvatarGroupProps = Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> &\n Readonly<{\n /** Required: a pile of faces is meaningless to a screen reader otherwise. */\n label: string;\n children: ReactNode;\n size?: AvatarSize;\n /** Product-composed overflow copy such as \"+3\"; the count is the product's. */\n overflow?: ReactNode;\n }>;\n\n/**\n * Overlapping avatars. The overlap comes from the recipe ratio rather than a\n * pixel value so it holds across all four sizes, and the group carries one\n * accessible name instead of letting a reader walk five unlabelled images.\n */\nexport const AvatarGroup = forwardRef<HTMLSpanElement, AvatarGroupProps>(function AvatarGroup(\n { label, children, size = avatarRecipe.defaults.size, overflow, className, ...props },\n ref,\n) {\n if (label.trim().length === 0) throw new TypeError(\"AvatarGroup label must not be empty\");\n const offset = Math.round(avatarRecipe.sizes[size] * avatarRecipe.overlapRatio);\n return (\n <span\n {...props}\n ref={ref}\n role=\"group\"\n aria-label={label}\n className={classNames(\"hjm-avatar-group\", className)}\n data-size={size}\n style={{ \"--hjm-avatar-overlap\": `${offset}px` } as CSSProperties}\n >\n {children}\n {overflow ? <span className=\"hjm-avatar-group__overflow\" aria-hidden=\"true\">{overflow}</span> : null}\n </span>\n );\n});\n\nexport type DividerOrientation = \"horizontal\" | \"vertical\";\nexport type DividerInset = keyof typeof dividerRecipe.insets;\n\nexport type DividerProps = HTMLAttributes<HTMLElement> &\n Readonly<{\n orientation?: DividerOrientation;\n inset?: DividerInset;\n decorative?: boolean;\n }>;\n\nexport const Divider = forwardRef<HTMLElement, DividerProps>(function Divider(\n {\n orientation = dividerRecipe.defaults.orientation,\n inset = dividerRecipe.defaults.inset,\n decorative = false,\n className,\n ...props\n },\n ref,\n) {\n return createElement(orientation === \"horizontal\" ? \"hr\" : \"div\", {\n ...props,\n ref,\n className: classNames(\"hjm-divider\", className),\n \"data-orientation\": orientation,\n \"data-inset\": inset,\n role: decorative ? \"presentation\" : \"separator\",\n \"aria-hidden\": decorative || undefined,\n \"aria-orientation\": decorative ? undefined : orientation,\n });\n});\n\nexport type ListAppearance = \"grouped\" | \"plain\";\n\nexport type ListProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> &\n Readonly<{\n label: string;\n children: ReactNode;\n separator?: keyof typeof listRecipe.separators;\n appearance?: ListAppearance;\n }>;\n\n/** Semantic list container that owns separators around composed rows. */\nexport const List = forwardRef<HTMLDivElement, ListProps>(function List(\n {\n label,\n children,\n separator = listRecipe.defaults.separator,\n appearance = \"plain\",\n className,\n ...props\n },\n ref,\n) {\n if (!label.trim()) throw new TypeError(\"List label must not be empty\");\n const items = Children.toArray(children);\n return (\n <div\n {...props}\n ref={ref}\n aria-label={label}\n className={classNames(\"hjm-list\", className)}\n data-appearance={appearance}\n data-separator={separator}\n role=\"list\"\n >\n {items.map((item, index) => (\n <div\n className=\"hjm-list__item\"\n key={isValidElement(item) && item.key !== null ? item.key : `hjm-list-${index}`}\n role=\"listitem\"\n >\n {item}\n </div>\n ))}\n </div>\n );\n});\n\nexport type StatisticTrendMarkRenderProps = Readonly<{\n name: \"trendUp\" | \"trendDown\" | \"trendFlat\";\n color: \"currentColor\";\n size: number;\n}>;\n\nexport type ComposeStatisticAccessibilityLabel<Id extends string = string> = (\n input: Readonly<{\n contextLabel?: string;\n descriptor: ResolvedStatisticDescriptor<Id>;\n valueText: string;\n }>,\n) => string;\n\nexport type StatisticProps<Id extends string = string> = Omit<\n HTMLAttributes<HTMLElement>,\n \"children\"\n> & Readonly<{\n descriptor: StatisticDescriptor<Id>;\n density?: StatisticDensity;\n presentation?: StatisticPresentation;\n contextLabel?: string;\n accessibilityLabel?: string;\n composeAccessibilityLabel?: ComposeStatisticAccessibilityLabel<Id>;\n renderTrendMark?: (props: StatisticTrendMarkRenderProps) => ReactNode;\n}>;\n\nexport function Statistic<Id extends string = string>({\n descriptor,\n density = \"comfortable\",\n presentation = \"plain\",\n contextLabel,\n accessibilityLabel,\n composeAccessibilityLabel,\n renderTrendMark,\n className,\n ...props\n}: StatisticProps<Id>) {\n const resolved = resolveStatisticDescriptor(descriptor);\n const valueText = `${resolved.prefix ?? \"\"}${resolved.value}${resolved.suffix ?? \"\"}`;\n const announcement = accessibilityLabel ?? composeAccessibilityLabel?.({\n ...(contextLabel === undefined ? {} : { contextLabel }),\n descriptor: resolved,\n valueText,\n }) ?? [contextLabel, resolved.label, valueText, resolved.trend?.label, resolved.hint]\n .filter(Boolean)\n .join(\", \");\n if (!announcement.trim()) throw new TypeError(\"Statistic accessibility label must not be empty\");\n const trendName = resolved.trend\n ? statisticRecipe.trend.marks[resolved.trend.direction]\n : undefined;\n return (\n <article\n {...props}\n aria-label={announcement}\n className={classNames(\"hjm-statistic\", className)}\n data-density={density}\n data-presentation={presentation}\n >\n <span aria-hidden=\"true\" className=\"hjm-statistic__label\">{resolved.label}</span>\n <span aria-hidden=\"true\" className=\"hjm-statistic__value-row\">\n {resolved.prefix ? <span className=\"hjm-statistic__affix\">{resolved.prefix}</span> : null}\n <strong className=\"hjm-statistic__value\">{resolved.value}</strong>\n {resolved.suffix ? <span className=\"hjm-statistic__affix\">{resolved.suffix}</span> : null}\n </span>\n {resolved.trend ? (\n <span aria-hidden=\"true\" className=\"hjm-statistic__trend\" data-tone={resolved.trend.tone}>\n <span className=\"hjm-statistic__trend-mark\">\n {renderTrendMark?.({ name: trendName!, color: \"currentColor\", size: 16 }) ?? (\n resolved.trend.direction === \"up\" ? \"↑\" : resolved.trend.direction === \"down\" ? \"↓\" : \"—\"\n )}\n </span>\n {resolved.trend.label}\n </span>\n ) : null}\n {resolved.hint ? <span aria-hidden=\"true\" className=\"hjm-statistic__hint\">{resolved.hint}</span> : null}\n </article>\n );\n}\n\nexport type StatisticGroupProps<Id extends string = string> = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\"\n> & Readonly<{\n label: string;\n descriptor: StatisticGroupDescriptor<Id>;\n density?: StatisticDensity;\n presentation?: StatisticPresentation;\n composeAccessibilityLabel?: ComposeStatisticAccessibilityLabel<Id>;\n renderTrendMark?: (props: StatisticTrendMarkRenderProps) => ReactNode;\n}>;\n\nexport function StatisticGroup<Id extends string = string>({\n label,\n descriptor,\n density,\n presentation,\n composeAccessibilityLabel,\n renderTrendMark,\n className,\n style,\n ...props\n}: StatisticGroupProps<Id>) {\n validateStatisticGroup(descriptor);\n if (!label.trim()) throw new TypeError(\"StatisticGroup label must not be empty\");\n return (\n <div\n {...props}\n aria-label={label}\n className={classNames(\"hjm-statistic-group\", className)}\n role=\"list\"\n style={{ ...style, \"--hjm-statistic-columns\": descriptor.columns ?? statisticRecipe.defaults.columns } as CSSProperties}\n >\n {descriptor.items.map((item) => (\n <div key={item.id} role=\"listitem\">\n <Statistic\n contextLabel={label}\n descriptor={item}\n {...(composeAccessibilityLabel === undefined ? {} : { composeAccessibilityLabel })}\n {...(density === undefined ? {} : { density })}\n {...(presentation === undefined ? {} : { presentation })}\n {...(renderTrendMark === undefined ? {} : { renderTrendMark })}\n />\n </div>\n ))}\n </div>\n );\n}\n\nexport type DescriptionListProps<Id extends string = string> = Omit<\n HTMLAttributes<HTMLDListElement>,\n \"children\"\n> &\n Readonly<{\n items: readonly DescriptionItemDescriptor<Id>[];\n columns?: DescriptionListColumns;\n /** Canonical layout-only placement. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n }>;\n\nfunction DescriptionListInner<Id extends string>(\n { items, columns, className, layoutStyle, style, ...props }: DescriptionListProps<Id>,\n forwardedRef: ForwardedRef<HTMLDListElement>,\n) {\n const descriptor = resolveDescriptionListDescriptor({\n items,\n ...(columns === undefined ? {} : { columns }),\n });\n const [width, ref] = useElementWidth(forwardedRef);\n const theme = useOptionalHjmTheme();\n const resolvedColumns = resolveDescriptionListColumnCount(\n width ?? 0,\n descriptor.columns,\n theme?.environment.textScale ?? 1,\n );\n const responsiveStyle = {\n ...style,\n ...layoutStyle,\n \"--hjm-description-columns\": resolvedColumns,\n } as CSSProperties;\n return (\n <dl\n {...props}\n ref={ref}\n className={classNames(\"hjm-description-list\", className)}\n data-columns={resolvedColumns}\n data-state={resolvedColumns < descriptor.columns ? \"collapsed\" : \"ready\"}\n style={responsiveStyle}\n >\n {descriptor.items.map((item) => (\n <div key={item.id} className=\"hjm-description-list__item\">\n <dt className=\"hjm-description-list__label\">{item.label}</dt>\n <dd className=\"hjm-description-list__value\">{item.value}</dd>\n </div>\n ))}\n </dl>\n );\n}\n\nexport const DescriptionList = forwardRef(DescriptionListInner) as <Id extends string = string>(\n props: DescriptionListProps<Id> & RefAttributes<HTMLDListElement>,\n) => ReactElement;\n\nexport type TableSortDirection = \"ascending\" | \"descending\";\n\nexport type TableColumn<Row> = Readonly<{\n id: string;\n header: ReactNode;\n cell: (row: Row, rowIndex: number) => ReactNode;\n align?: \"start\" | \"center\" | \"end\";\n sortable?: boolean;\n sortDirection?: TableSortDirection;\n}>;\n\nexport type TableProps<Row> = Omit<TableHTMLAttributes<HTMLTableElement>, \"children\"> &\n Readonly<{\n columns: readonly TableColumn<Row>[];\n rows: readonly Row[];\n getRowKey: (row: Row, rowIndex: number) => string;\n caption?: ReactNode;\n /** Localized content rendered when rows is empty. */\n emptyState: ReactNode;\n onSortChange?: (columnId: string, direction: TableSortDirection) => void;\n wrapperClassName?: string;\n }>;\n\nfunction TableInner<Row>(\n {\n columns,\n rows,\n getRowKey,\n caption,\n emptyState,\n onSortChange,\n wrapperClassName,\n className,\n ...props\n }: TableProps<Row>,\n ref: ForwardedRef<HTMLTableElement>,\n) {\n if (columns.length === 0) throw new TypeError(\"Table requires at least one column\");\n const ids = new Set<string>();\n for (const column of columns) {\n if (column.id.trim().length === 0) throw new TypeError(\"Table column id must not be empty\");\n if (ids.has(column.id)) throw new TypeError(`Duplicate Table column id: ${column.id}`);\n ids.add(column.id);\n if (column.sortDirection && !column.sortable) {\n throw new TypeError(`Table column ${column.id} has sortDirection but is not sortable`);\n }\n }\n const rowKeys = rows.map((row, rowIndex) => getRowKey(row, rowIndex));\n const seenRowKeys = new Set<string>();\n for (const rowKey of rowKeys) {\n if (rowKey.trim().length === 0) throw new TypeError(\"Table row key must not be empty\");\n if (seenRowKeys.has(rowKey)) throw new TypeError(`Duplicate Table row key: ${rowKey}`);\n seenRowKeys.add(rowKey);\n }\n return (\n <div className={classNames(\"hjm-table-scroll\", wrapperClassName)} tabIndex={0}>\n <table {...props} ref={ref} className={classNames(\"hjm-table\", className)}>\n {caption ? <caption className=\"hjm-table__caption\">{caption}</caption> : null}\n <thead>\n <tr>\n {columns.map((column) => (\n <th\n key={column.id}\n scope=\"col\"\n className=\"hjm-table__header\"\n data-align={column.align ?? \"start\"}\n aria-sort={column.sortDirection ?? (column.sortable ? \"none\" : undefined)}\n >\n {column.sortable ? (\n <button\n type=\"button\"\n className=\"hjm-table__sort\"\n onClick={() =>\n onSortChange?.(\n column.id,\n column.sortDirection === \"ascending\" ? \"descending\" : \"ascending\",\n )\n }\n >\n {column.header}\n <span aria-hidden=\"true\">\n {column.sortDirection === \"ascending\"\n ? \" ↑\"\n : column.sortDirection === \"descending\"\n ? \" ↓\"\n : \" ↕\"}\n </span>\n </button>\n ) : column.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.length === 0 ? (\n <tr>\n <td className=\"hjm-table__empty\" colSpan={columns.length}>{emptyState}</td>\n </tr>\n ) : (\n rows.map((row, rowIndex) => (\n <tr key={rowKeys[rowIndex]} className=\"hjm-table__row\">\n {columns.map((column) => (\n <td\n key={column.id}\n className=\"hjm-table__cell\"\n data-align={column.align ?? \"start\"}\n >\n {column.cell(row, rowIndex)}\n </td>\n ))}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n );\n}\n\nexport const Table = forwardRef(TableInner) as <Row>(\n props: TableProps<Row> & RefAttributes<HTMLTableElement>,\n) => ReactElement;\n\nexport type TimelineProps<Id extends string = string> = Omit<\n HTMLAttributes<HTMLOListElement>,\n \"children\"\n> &\n Readonly<{\n items: readonly TimelineItemDescriptor<Id>[];\n composeAccessibleName: ComposeTimelineAccessibleName;\n }>;\n\nfunction TimelineInner<Id extends string = string>(\n {\n items,\n composeAccessibleName,\n className,\n ...props\n }: TimelineProps<Id>,\n ref: ForwardedRef<HTMLOListElement>,\n) {\n const resolved = resolveTimelineDescriptor(\n { items },\n { composeAccessibleName },\n );\n return (\n <ol\n {...props}\n ref={ref}\n className={classNames(\"hjm-timeline\", className)}\n >\n {resolved.map((item, index) => (\n <li\n aria-label={item.accessibleName}\n className=\"hjm-timeline__item\"\n data-tone={item.tone}\n key={item.id}\n >\n <span className=\"hjm-timeline__rail\" aria-hidden=\"true\">\n <span className=\"hjm-timeline__dot\" />\n {index < resolved.length - 1 ? (\n <span className=\"hjm-timeline__connector\" />\n ) : null}\n </span>\n <span className=\"hjm-timeline__content\">\n <span className=\"hjm-timeline__heading\">\n <strong className=\"hjm-timeline__label\">{item.label}</strong>\n {item.timestamp ? (\n <time className=\"hjm-timeline__timestamp\">{item.timestamp}</time>\n ) : null}\n </span>\n {item.description ? (\n <span className=\"hjm-timeline__description\">{item.description}</span>\n ) : null}\n </span>\n </li>\n ))}\n </ol>\n );\n}\n\nexport const Timeline = forwardRef(TimelineInner) as <Id extends string = string>(\n props: TimelineProps<Id> & RefAttributes<HTMLOListElement>,\n) => ReactElement;\n"]}
1
+ {"version":3,"file":"advanced-display.js","sourceRoot":"","sources":["../src/advanced-display.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n resolveDescriptionListColumnCount,\n resolveDescriptionListDescriptor,\n type DescriptionItemDescriptor,\n type DescriptionListColumns,\n} from \"@hjmds/design-contracts/components/description-list\";\nimport {\n resolveTimelineDescriptor,\n type ComposeTimelineAccessibleName,\n type TimelineItemDescriptor,\n} from \"@hjmds/design-contracts/components/timeline\";\nimport {\n resolveStatisticDescriptor,\n validateStatisticGroup,\n type ResolvedStatisticDescriptor,\n type StatisticDescriptor,\n type StatisticGroupDescriptor,\n} from \"@hjmds/design-contracts/components/statistic\";\nimport {\n accordionRecipe,\n avatarRecipe,\n dividerRecipe,\n listRecipe,\n statisticRecipe,\n type AccordionDensity,\n type AvatarShape,\n type AvatarSize,\n type StatisticDensity,\n type StatisticPresentation,\n} from \"@hjmds/design-contracts/recipes\";\nimport {\n Children,\n createElement,\n forwardRef,\n isValidElement,\n useEffect,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type ForwardedRef,\n type HTMLAttributes,\n type ImgHTMLAttributes,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n type RefAttributes,\n type TableHTMLAttributes,\n} from \"react\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nimport { classNames, useControllableState, useElementWidth } from \"./internal.js\";\nimport { useOptionalHjmTheme } from \"./provider.js\";\n\nexport type AccordionItem = Readonly<{\n id: string;\n title: ReactNode;\n panel: ReactNode;\n disabled?: boolean;\n}>;\n\nexport type AccordionProps = Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> &\n Readonly<{\n items: readonly AccordionItem[];\n value?: readonly string[];\n defaultValue?: readonly string[];\n onValueChange?: (value: readonly string[]) => void;\n allowsMultipleExpanded?: boolean;\n density?: AccordionDensity;\n headingLevel?: 2 | 3 | 4 | 5 | 6;\n }>;\n\nfunction validateAccordionItems(items: readonly AccordionItem[]): void {\n if (items.length === 0) throw new TypeError(\"Accordion 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(\"Accordion item id must not be empty\");\n if (ids.has(item.id)) throw new TypeError(`Duplicate Accordion item id: ${item.id}`);\n ids.add(item.id);\n }\n}\n\nfunction accordionFocusTarget(\n items: readonly AccordionItem[],\n currentIndex: number,\n key: string,\n): number | undefined {\n if (key === \"Home\") return items.findIndex((item) => !item.disabled);\n if (key === \"End\") {\n for (let index = items.length - 1; index >= 0; index -= 1) {\n if (!items[index]?.disabled) return index;\n }\n return -1;\n }\n const direction = key === \"ArrowDown\" ? 1 : key === \"ArrowUp\" ? -1 : 0;\n if (direction === 0) return undefined;\n for (let offset = 1; offset <= items.length; offset += 1) {\n const index = (currentIndex + direction * offset + items.length) % items.length;\n if (!items[index]?.disabled) return index;\n }\n return currentIndex;\n}\n\nexport const Accordion = forwardRef<HTMLDivElement, AccordionProps>(\n function Accordion(\n {\n items,\n value: valueProp,\n defaultValue = [],\n onValueChange,\n allowsMultipleExpanded = accordionRecipe.defaults.allowsMultipleExpanded,\n density = accordionRecipe.defaults.density,\n headingLevel = 3,\n className,\n ...props\n },\n ref,\n ) {\n validateAccordionItems(items);\n const [value, setValue] = useControllableState<readonly string[]>({\n ...(valueProp === undefined ? {} : { value: valueProp }),\n defaultValue,\n ...(onValueChange === undefined ? {} : { onChange: onValueChange }),\n });\n const validIds = new Set(items.map((item) => item.id));\n const valueIds = new Set<string>();\n for (const id of value) {\n if (!validIds.has(id)) throw new RangeError(`Unknown Accordion value: ${id}`);\n if (valueIds.has(id)) throw new TypeError(`Duplicate Accordion value: ${id}`);\n valueIds.add(id);\n }\n if (!allowsMultipleExpanded && value.length > 1) {\n throw new RangeError(\"Accordion only allows one expanded item\");\n }\n const baseId = useId().replaceAll(\":\", \"\");\n const triggerRefs = useRef(new Map<string, HTMLButtonElement>());\n const toggle = (id: string) => {\n const expanded = value.includes(id);\n setValue(\n expanded\n ? value.filter((candidate) => candidate !== id)\n : allowsMultipleExpanded\n ? [...value, id]\n : [id],\n );\n };\n\n return (\n <div\n {...props}\n ref={ref}\n className={classNames(\"hjm-accordion\", className)}\n data-density={density}\n data-multiple={allowsMultipleExpanded || undefined}\n >\n {items.map((item, index) => {\n const expanded = value.includes(item.id);\n const triggerId = `${baseId}-accordion-trigger-${index}`;\n const panelId = `${baseId}-accordion-panel-${index}`;\n const trigger = (\n <button\n ref={(node) => {\n if (node) triggerRefs.current.set(item.id, node);\n else triggerRefs.current.delete(item.id);\n }}\n id={triggerId}\n type=\"button\"\n className=\"hjm-accordion__trigger\"\n aria-expanded={expanded}\n aria-controls={panelId}\n disabled={item.disabled}\n onClick={() => toggle(item.id)}\n onKeyDown={(event: KeyboardEvent<HTMLButtonElement>) => {\n const target = accordionFocusTarget(items, index, event.key);\n if (target === undefined || target < 0) return;\n event.preventDefault();\n triggerRefs.current.get(items[target]!.id)?.focus();\n }}\n >\n <span className=\"hjm-accordion__title\">{item.title}</span>\n <span className=\"hjm-accordion__indicator\" aria-hidden=\"true\">\n {expanded ? \"−\" : \"+\"}\n </span>\n </button>\n );\n return (\n <div\n key={item.id}\n className=\"hjm-accordion__item\"\n data-state={item.disabled ? \"disabled\" : expanded ? \"expanded\" : \"collapsed\"}\n >\n {createElement(`h${headingLevel}`, { className: \"hjm-accordion__header\" }, trigger)}\n <div\n id={panelId}\n role=\"region\"\n className=\"hjm-accordion__panel\"\n aria-labelledby={triggerId}\n hidden={!expanded}\n >\n {item.panel}\n </div>\n </div>\n );\n })}\n </div>\n );\n },\n);\n\nfunction initials(name: string): string {\n return name\n .trim()\n .split(/\\s+/u)\n .slice(0, 2)\n .map((part) => Array.from(part)[0] ?? \"\")\n .join(\"\")\n .toLocaleUpperCase();\n}\n\nexport type AvatarProps = Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> &\n Readonly<{\n name: string;\n src?: string;\n alt?: string;\n fallback?: ReactNode;\n size?: AvatarSize;\n shape?: AvatarShape;\n imageProps?: Omit<ImgHTMLAttributes<HTMLImageElement>, \"alt\" | \"src\">;\n }>;\n\nexport const Avatar = forwardRef<HTMLSpanElement, AvatarProps>(function Avatar(\n {\n name,\n src,\n alt = name,\n fallback,\n size = avatarRecipe.defaults.size,\n shape = avatarRecipe.defaults.shape,\n imageProps,\n className,\n ...props\n },\n ref,\n) {\n if (name.trim().length === 0) throw new TypeError(\"Avatar name must not be empty\");\n const [imageAvailable, setImageAvailable] = useState(Boolean(src));\n useEffect(() => setImageAvailable(Boolean(src)), [src]);\n const { onError, className: imageClassName, ...restImageProps } = imageProps ?? {};\n return (\n <span\n {...props}\n ref={ref}\n className={classNames(\"hjm-avatar\", className)}\n data-size={size}\n data-shape={shape}\n data-state={imageAvailable ? \"image\" : \"fallback\"}\n >\n {src && imageAvailable ? (\n <img\n {...restImageProps}\n src={src}\n alt={alt}\n className={classNames(\"hjm-avatar__image\", imageClassName)}\n onError={(event) => {\n setImageAvailable(false);\n onError?.(event);\n }}\n />\n ) : (\n <span\n className=\"hjm-avatar__fallback\"\n role={alt.length > 0 ? \"img\" : undefined}\n aria-label={alt.length > 0 ? alt : undefined}\n aria-hidden={alt.length === 0 || undefined}\n >\n {fallback ?? initials(name)}\n </span>\n )}\n </span>\n );\n});\n\nexport type AvatarGroupProps = Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> &\n Readonly<{\n /** Required: a pile of faces is meaningless to a screen reader otherwise. */\n label: string;\n children: ReactNode;\n size?: AvatarSize;\n /** Product-composed overflow copy such as \"+3\"; the count is the product's. */\n overflow?: ReactNode;\n }>;\n\n/**\n * Overlapping avatars. The overlap comes from the recipe ratio rather than a\n * pixel value so it holds across all four sizes, and the group carries one\n * accessible name instead of letting a reader walk five unlabelled images.\n */\nexport const AvatarGroup = forwardRef<HTMLSpanElement, AvatarGroupProps>(function AvatarGroup(\n { label, children, size = avatarRecipe.defaults.size, overflow, className, ...props },\n ref,\n) {\n if (label.trim().length === 0) throw new TypeError(\"AvatarGroup label must not be empty\");\n const offset = Math.round(avatarRecipe.sizes[size] * avatarRecipe.overlapRatio);\n return (\n <span\n {...props}\n ref={ref}\n role=\"group\"\n aria-label={label}\n className={classNames(\"hjm-avatar-group\", className)}\n data-size={size}\n style={{ \"--hjm-avatar-overlap\": `${offset}px` } as CSSProperties}\n >\n {children}\n {overflow ? <span className=\"hjm-avatar-group__overflow\" aria-hidden=\"true\">{overflow}</span> : null}\n </span>\n );\n});\n\nexport type DividerOrientation = \"horizontal\" | \"vertical\";\nexport type DividerInset = keyof typeof dividerRecipe.insets;\n\nexport type DividerProps = HTMLAttributes<HTMLElement> &\n Readonly<{\n orientation?: DividerOrientation;\n inset?: DividerInset;\n decorative?: boolean;\n }>;\n\nexport const Divider = forwardRef<HTMLElement, DividerProps>(function Divider(\n {\n orientation = dividerRecipe.defaults.orientation,\n inset = dividerRecipe.defaults.inset,\n decorative = false,\n className,\n ...props\n },\n ref,\n) {\n return createElement(orientation === \"horizontal\" ? \"hr\" : \"div\", {\n ...props,\n ref,\n className: classNames(\"hjm-divider\", className),\n \"data-orientation\": orientation,\n \"data-inset\": inset,\n role: decorative ? \"presentation\" : \"separator\",\n \"aria-hidden\": decorative || undefined,\n \"aria-orientation\": decorative ? undefined : orientation,\n });\n});\n\nexport type ListAppearance = \"grouped\" | \"plain\";\n\nexport type ListProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> &\n Readonly<{\n label: string;\n children: ReactNode;\n separator?: keyof typeof listRecipe.separators;\n appearance?: ListAppearance;\n }>;\n\n/** Semantic list container that owns separators around composed rows. */\nexport const List = forwardRef<HTMLDivElement, ListProps>(function List(\n {\n label,\n children,\n separator = listRecipe.defaults.separator,\n appearance = \"plain\",\n className,\n ...props\n },\n ref,\n) {\n if (!label.trim()) throw new TypeError(\"List label must not be empty\");\n const items = Children.toArray(children);\n return (\n <div\n {...props}\n ref={ref}\n aria-label={label}\n className={classNames(\"hjm-list\", className)}\n data-appearance={appearance}\n data-separator={separator}\n role=\"list\"\n >\n {items.map((item, index) => (\n <div\n className=\"hjm-list__item\"\n key={isValidElement(item) && item.key !== null ? item.key : `hjm-list-${index}`}\n role=\"listitem\"\n >\n {item}\n </div>\n ))}\n </div>\n );\n});\n\nexport type StatisticTrendMarkRenderProps = Readonly<{\n name: \"trendUp\" | \"trendDown\" | \"trendFlat\";\n color: \"currentColor\";\n size: number;\n}>;\n\nexport type ComposeStatisticAccessibilityLabel<Id extends string = string> = (\n input: Readonly<{\n contextLabel?: string;\n descriptor: ResolvedStatisticDescriptor<Id>;\n valueText: string;\n }>,\n) => string;\n\nexport type StatisticProps<Id extends string = string> = Omit<\n HTMLAttributes<HTMLElement>,\n \"children\"\n> & Readonly<{\n descriptor: StatisticDescriptor<Id>;\n density?: StatisticDensity;\n presentation?: StatisticPresentation;\n contextLabel?: string;\n accessibilityLabel?: string;\n composeAccessibilityLabel?: ComposeStatisticAccessibilityLabel<Id>;\n renderTrendMark?: (props: StatisticTrendMarkRenderProps) => ReactNode;\n /** Optional visual adapter; the descriptor remains the accessible value source. */\n renderValue?: (value: string) => ReactNode;\n}>;\n\nexport function Statistic<Id extends string = string>({\n descriptor,\n density = \"comfortable\",\n presentation = \"plain\",\n contextLabel,\n accessibilityLabel,\n composeAccessibilityLabel,\n renderTrendMark,\n renderValue,\n className,\n ...props\n}: StatisticProps<Id>) {\n const resolved = resolveStatisticDescriptor(descriptor);\n const valueText = `${resolved.prefix ?? \"\"}${resolved.value}${resolved.suffix ?? \"\"}`;\n const announcement = accessibilityLabel ?? composeAccessibilityLabel?.({\n ...(contextLabel === undefined ? {} : { contextLabel }),\n descriptor: resolved,\n valueText,\n }) ?? [contextLabel, resolved.label, valueText, resolved.trend?.label, resolved.hint]\n .filter(Boolean)\n .join(\", \");\n if (!announcement.trim()) throw new TypeError(\"Statistic accessibility label must not be empty\");\n const trendName = resolved.trend\n ? statisticRecipe.trend.marks[resolved.trend.direction]\n : undefined;\n return (\n <article\n {...props}\n aria-label={announcement}\n className={classNames(\"hjm-statistic\", className)}\n data-density={density}\n data-presentation={presentation}\n >\n <span aria-hidden=\"true\" className=\"hjm-statistic__label\">{resolved.label}</span>\n <span aria-hidden=\"true\" className=\"hjm-statistic__value-row\">\n {resolved.prefix ? <span className=\"hjm-statistic__affix\">{resolved.prefix}</span> : null}\n <strong className=\"hjm-statistic__value\">{renderValue?.(resolved.value) ?? resolved.value}</strong>\n {resolved.suffix ? <span className=\"hjm-statistic__affix\">{resolved.suffix}</span> : null}\n </span>\n {resolved.trend ? (\n <span aria-hidden=\"true\" className=\"hjm-statistic__trend\" data-tone={resolved.trend.tone}>\n <span className=\"hjm-statistic__trend-mark\">\n {renderTrendMark?.({ name: trendName!, color: \"currentColor\", size: 16 }) ?? (\n resolved.trend.direction === \"up\" ? \"↑\" : resolved.trend.direction === \"down\" ? \"↓\" : \"—\"\n )}\n </span>\n {resolved.trend.label}\n </span>\n ) : null}\n {resolved.hint ? <span aria-hidden=\"true\" className=\"hjm-statistic__hint\">{resolved.hint}</span> : null}\n </article>\n );\n}\n\nexport type StatisticGroupProps<Id extends string = string> = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\"\n> & Readonly<{\n label: string;\n descriptor: StatisticGroupDescriptor<Id>;\n density?: StatisticDensity;\n presentation?: StatisticPresentation;\n composeAccessibilityLabel?: ComposeStatisticAccessibilityLabel<Id>;\n renderTrendMark?: (props: StatisticTrendMarkRenderProps) => ReactNode;\n}>;\n\nexport function StatisticGroup<Id extends string = string>({\n label,\n descriptor,\n density,\n presentation,\n composeAccessibilityLabel,\n renderTrendMark,\n className,\n style,\n ...props\n}: StatisticGroupProps<Id>) {\n validateStatisticGroup(descriptor);\n if (!label.trim()) throw new TypeError(\"StatisticGroup label must not be empty\");\n return (\n <div\n {...props}\n aria-label={label}\n className={classNames(\"hjm-statistic-group\", className)}\n role=\"list\"\n style={{ ...style, \"--hjm-statistic-columns\": descriptor.columns ?? statisticRecipe.defaults.columns } as CSSProperties}\n >\n {descriptor.items.map((item) => (\n <div key={item.id} role=\"listitem\">\n <Statistic\n contextLabel={label}\n descriptor={item}\n {...(composeAccessibilityLabel === undefined ? {} : { composeAccessibilityLabel })}\n {...(density === undefined ? {} : { density })}\n {...(presentation === undefined ? {} : { presentation })}\n {...(renderTrendMark === undefined ? {} : { renderTrendMark })}\n />\n </div>\n ))}\n </div>\n );\n}\n\nexport type DescriptionListProps<Id extends string = string> = Omit<\n HTMLAttributes<HTMLDListElement>,\n \"children\"\n> &\n Readonly<{\n items: readonly DescriptionItemDescriptor<Id>[];\n columns?: DescriptionListColumns;\n /** Canonical layout-only placement. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n }>;\n\nfunction DescriptionListInner<Id extends string>(\n { items, columns, className, layoutStyle, style, ...props }: DescriptionListProps<Id>,\n forwardedRef: ForwardedRef<HTMLDListElement>,\n) {\n const descriptor = resolveDescriptionListDescriptor({\n items,\n ...(columns === undefined ? {} : { columns }),\n });\n const [width, ref] = useElementWidth(forwardedRef);\n const theme = useOptionalHjmTheme();\n const resolvedColumns = resolveDescriptionListColumnCount(\n width ?? 0,\n descriptor.columns,\n theme?.environment.textScale ?? 1,\n );\n const responsiveStyle = {\n ...style,\n ...layoutStyle,\n \"--hjm-description-columns\": resolvedColumns,\n } as CSSProperties;\n return (\n <dl\n {...props}\n ref={ref}\n className={classNames(\"hjm-description-list\", className)}\n data-columns={resolvedColumns}\n data-state={resolvedColumns < descriptor.columns ? \"collapsed\" : \"ready\"}\n style={responsiveStyle}\n >\n {descriptor.items.map((item) => (\n <div key={item.id} className=\"hjm-description-list__item\">\n <dt className=\"hjm-description-list__label\">{item.label}</dt>\n <dd className=\"hjm-description-list__value\">{item.value}</dd>\n </div>\n ))}\n </dl>\n );\n}\n\nexport const DescriptionList = forwardRef(DescriptionListInner) as <Id extends string = string>(\n props: DescriptionListProps<Id> & RefAttributes<HTMLDListElement>,\n) => ReactElement;\n\nexport type TableSortDirection = \"ascending\" | \"descending\";\n\nexport type TableColumn<Row> = Readonly<{\n id: string;\n header: ReactNode;\n cell: (row: Row, rowIndex: number) => ReactNode;\n align?: \"start\" | \"center\" | \"end\";\n sortable?: boolean;\n sortDirection?: TableSortDirection;\n}>;\n\nexport type TableProps<Row> = Omit<TableHTMLAttributes<HTMLTableElement>, \"children\"> &\n Readonly<{\n columns: readonly TableColumn<Row>[];\n rows: readonly Row[];\n getRowKey: (row: Row, rowIndex: number) => string;\n caption?: ReactNode;\n /** Localized content rendered when rows is empty. */\n emptyState: ReactNode;\n onSortChange?: (columnId: string, direction: TableSortDirection) => void;\n wrapperClassName?: string;\n }>;\n\nfunction TableInner<Row>(\n {\n columns,\n rows,\n getRowKey,\n caption,\n emptyState,\n onSortChange,\n wrapperClassName,\n className,\n ...props\n }: TableProps<Row>,\n ref: ForwardedRef<HTMLTableElement>,\n) {\n if (columns.length === 0) throw new TypeError(\"Table requires at least one column\");\n const ids = new Set<string>();\n for (const column of columns) {\n if (column.id.trim().length === 0) throw new TypeError(\"Table column id must not be empty\");\n if (ids.has(column.id)) throw new TypeError(`Duplicate Table column id: ${column.id}`);\n ids.add(column.id);\n if (column.sortDirection && !column.sortable) {\n throw new TypeError(`Table column ${column.id} has sortDirection but is not sortable`);\n }\n }\n const rowKeys = rows.map((row, rowIndex) => getRowKey(row, rowIndex));\n const seenRowKeys = new Set<string>();\n for (const rowKey of rowKeys) {\n if (rowKey.trim().length === 0) throw new TypeError(\"Table row key must not be empty\");\n if (seenRowKeys.has(rowKey)) throw new TypeError(`Duplicate Table row key: ${rowKey}`);\n seenRowKeys.add(rowKey);\n }\n return (\n <div className={classNames(\"hjm-table-scroll\", wrapperClassName)} tabIndex={0}>\n <table {...props} ref={ref} className={classNames(\"hjm-table\", className)}>\n {caption ? <caption className=\"hjm-table__caption\">{caption}</caption> : null}\n <thead>\n <tr>\n {columns.map((column) => (\n <th\n key={column.id}\n scope=\"col\"\n className=\"hjm-table__header\"\n data-align={column.align ?? \"start\"}\n aria-sort={column.sortDirection ?? (column.sortable ? \"none\" : undefined)}\n >\n {column.sortable ? (\n <button\n type=\"button\"\n className=\"hjm-table__sort\"\n onClick={() =>\n onSortChange?.(\n column.id,\n column.sortDirection === \"ascending\" ? \"descending\" : \"ascending\",\n )\n }\n >\n {column.header}\n <span aria-hidden=\"true\">\n {column.sortDirection === \"ascending\"\n ? \" ↑\"\n : column.sortDirection === \"descending\"\n ? \" ↓\"\n : \" ↕\"}\n </span>\n </button>\n ) : column.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.length === 0 ? (\n <tr>\n <td className=\"hjm-table__empty\" colSpan={columns.length}>{emptyState}</td>\n </tr>\n ) : (\n rows.map((row, rowIndex) => (\n <tr key={rowKeys[rowIndex]} className=\"hjm-table__row\">\n {columns.map((column) => (\n <td\n key={column.id}\n className=\"hjm-table__cell\"\n data-align={column.align ?? \"start\"}\n >\n {column.cell(row, rowIndex)}\n </td>\n ))}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n );\n}\n\nexport const Table = forwardRef(TableInner) as <Row>(\n props: TableProps<Row> & RefAttributes<HTMLTableElement>,\n) => ReactElement;\n\nexport type TimelineProps<Id extends string = string> = Omit<\n HTMLAttributes<HTMLOListElement>,\n \"children\"\n> &\n Readonly<{\n items: readonly TimelineItemDescriptor<Id>[];\n composeAccessibleName: ComposeTimelineAccessibleName;\n }>;\n\nfunction TimelineInner<Id extends string = string>(\n {\n items,\n composeAccessibleName,\n className,\n ...props\n }: TimelineProps<Id>,\n ref: ForwardedRef<HTMLOListElement>,\n) {\n const resolved = resolveTimelineDescriptor(\n { items },\n { composeAccessibleName },\n );\n return (\n <ol\n {...props}\n ref={ref}\n className={classNames(\"hjm-timeline\", className)}\n >\n {resolved.map((item, index) => (\n <li\n aria-label={item.accessibleName}\n className=\"hjm-timeline__item\"\n data-tone={item.tone}\n key={item.id}\n >\n <span className=\"hjm-timeline__rail\" aria-hidden=\"true\">\n <span className=\"hjm-timeline__dot\" />\n {index < resolved.length - 1 ? (\n <span className=\"hjm-timeline__connector\" />\n ) : null}\n </span>\n <span className=\"hjm-timeline__content\">\n <span className=\"hjm-timeline__heading\">\n <strong className=\"hjm-timeline__label\">{item.label}</strong>\n {item.timestamp ? (\n <time className=\"hjm-timeline__timestamp\">{item.timestamp}</time>\n ) : null}\n </span>\n {item.description ? (\n <span className=\"hjm-timeline__description\">{item.description}</span>\n ) : null}\n </span>\n </li>\n ))}\n </ol>\n );\n}\n\nexport const Timeline = forwardRef(TimelineInner) as <Id extends string = string>(\n props: TimelineProps<Id> & RefAttributes<HTMLOListElement>,\n) => ReactElement;\n"]}
@@ -0,0 +1,10 @@
1
+ import { type ReactNode } from "react";
2
+ export type AffixProps = Readonly<{
3
+ children: ReactNode;
4
+ offset?: number;
5
+ disabled?: boolean;
6
+ onChange?: (affixed: boolean) => void;
7
+ }>;
8
+ /** CSS keeps natural flow, parent boundaries and focus intact; JS only observes state and oversize content. */
9
+ export declare function Affix({ children, offset, disabled, onChange }: AffixProps): import("react").JSX.Element;
10
+ //# sourceMappingURL=affix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"affix.d.ts","sourceRoot":"","sources":["../src/affix.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEpE,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;CAAE,CAAC,CAAC;AACvI,+GAA+G;AAC/G,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,MAA2B,EAAE,QAAgB,EAAE,QAAQ,EAAE,EAAE,UAAU,+BAkCtG"}
package/dist/affix.js ADDED
@@ -0,0 +1,51 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { affixRecipe, validateAffixOffset } from "@hjmds/design-contracts/components/affix";
4
+ /** CSS keeps natural flow, parent boundaries and focus intact; JS only observes state and oversize content. */
5
+ export function Affix({ children, offset = affixRecipe.offset, disabled = false, onChange }) {
6
+ validateAffixOffset(offset);
7
+ const marker = useRef(null);
8
+ const content = useRef(null);
9
+ const callback = useRef(onChange);
10
+ callback.current = onChange;
11
+ const [affixed, setAffixed] = useState(false);
12
+ const [oversize, setOversize] = useState(false);
13
+ const reported = useRef(undefined);
14
+ useEffect(() => {
15
+ const node = content.current;
16
+ const sentinel = marker.current;
17
+ if (!node || !sentinel)
18
+ return;
19
+ let frame = 0;
20
+ function measure() {
21
+ frame = 0;
22
+ let scrollRoot = node.parentElement;
23
+ while (scrollRoot && !/(auto|scroll|hidden|overlay)/.test(getComputedStyle(scrollRoot).overflowY))
24
+ scrollRoot = scrollRoot.parentElement;
25
+ const viewportHeight = scrollRoot?.clientHeight ?? document.documentElement.clientHeight;
26
+ const edge = (scrollRoot ? scrollRoot.getBoundingClientRect().top + scrollRoot.clientTop : 0) + offset;
27
+ const rect = node.getBoundingClientRect();
28
+ const tooTall = rect.height > viewportHeight - offset;
29
+ setOversize(tooTall);
30
+ // One CSS pixel tolerates subpixel scroll rounding, not a second positioning system.
31
+ const next = !disabled && !tooTall && sentinel.getBoundingClientRect().top < edge && Math.abs(rect.top - edge) <= 1;
32
+ setAffixed(next);
33
+ if (reported.current !== next) {
34
+ reported.current = next;
35
+ callback.current?.(next);
36
+ }
37
+ }
38
+ const schedule = () => { if (!frame)
39
+ frame = requestAnimationFrame(measure); };
40
+ const resize = new ResizeObserver(schedule);
41
+ resize.observe(node);
42
+ for (let parent = node.parentElement; parent; parent = parent.parentElement)
43
+ resize.observe(parent);
44
+ measure();
45
+ document.addEventListener("scroll", schedule, true);
46
+ window.addEventListener("resize", schedule);
47
+ return () => { cancelAnimationFrame(frame); resize.disconnect(); document.removeEventListener("scroll", schedule, true); window.removeEventListener("resize", schedule); };
48
+ }, [offset, disabled, oversize]);
49
+ return _jsxs(_Fragment, { children: [_jsx("span", { ref: marker, className: "hjm-affix__marker", "aria-hidden": "true" }), _jsx("div", { ref: content, "data-hjm-affix": true, "data-affixed": affixed, "data-oversize": oversize, className: "hjm-affix", style: { position: disabled || oversize ? "relative" : affixRecipe.position, top: disabled || oversize ? undefined : offset }, children: children })] });
50
+ }
51
+ //# sourceMappingURL=affix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"affix.js","sourceRoot":"","sources":["../src/affix.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { affixRecipe, validateAffixOffset } from \"@hjmds/design-contracts/components/affix\";\nexport type AffixProps = Readonly<{ children: ReactNode; offset?: number; disabled?: boolean; onChange?: (affixed: boolean) => void }>;\n/** CSS keeps natural flow, parent boundaries and focus intact; JS only observes state and oversize content. */\nexport function Affix({ children, offset = affixRecipe.offset, disabled = false, onChange }: AffixProps) {\n validateAffixOffset(offset);\n const marker = useRef<HTMLSpanElement>(null);\n const content = useRef<HTMLDivElement>(null);\n const callback = useRef(onChange); callback.current = onChange;\n const [affixed, setAffixed] = useState(false);\n const [oversize, setOversize] = useState(false);\n const reported = useRef<boolean | undefined>(undefined);\n useEffect(() => {\n const node = content.current; const sentinel = marker.current;\n if (!node || !sentinel) return;\n let frame = 0;\n function measure() {\n frame = 0;\n let scrollRoot = node!.parentElement;\n while (scrollRoot && !/(auto|scroll|hidden|overlay)/.test(getComputedStyle(scrollRoot).overflowY)) scrollRoot = scrollRoot.parentElement;\n const viewportHeight = scrollRoot?.clientHeight ?? document.documentElement.clientHeight;\n const edge = (scrollRoot ? scrollRoot.getBoundingClientRect().top + scrollRoot.clientTop : 0) + offset;\n const rect = node!.getBoundingClientRect();\n const tooTall = rect.height > viewportHeight - offset;\n setOversize(tooTall);\n // One CSS pixel tolerates subpixel scroll rounding, not a second positioning system.\n const next = !disabled && !tooTall && sentinel!.getBoundingClientRect().top < edge && Math.abs(rect.top - edge) <= 1;\n setAffixed(next);\n if (reported.current !== next) { reported.current = next; callback.current?.(next); }\n }\n const schedule = () => { if (!frame) frame = requestAnimationFrame(measure); };\n const resize = new ResizeObserver(schedule);\n resize.observe(node);\n for (let parent = node.parentElement; parent; parent = parent.parentElement) resize.observe(parent);\n measure(); document.addEventListener(\"scroll\", schedule, true); window.addEventListener(\"resize\", schedule);\n return () => { cancelAnimationFrame(frame); resize.disconnect(); document.removeEventListener(\"scroll\", schedule, true); window.removeEventListener(\"resize\", schedule); };\n }, [offset, disabled, oversize]);\n return <><span ref={marker} className=\"hjm-affix__marker\" aria-hidden=\"true\" /><div ref={content} data-hjm-affix data-affixed={affixed} data-oversize={oversize} className=\"hjm-affix\" style={{ position: disabled || oversize ? \"relative\" : affixRecipe.position, top: disabled || oversize ? undefined : offset }}>{children}</div></>;\n}\n"]}
@@ -0,0 +1,13 @@
1
+ import { type ReactNode } from "react";
2
+ import { type SortableItem } from "@hjmds/design-contracts/components/interaction-adapters";
3
+ export type CarouselMotionProps = {
4
+ slides: readonly SortableItem[];
5
+ currentKey: string;
6
+ onCurrentKeyChange(key: string): void;
7
+ renderSlide(item: SortableItem): ReactNode;
8
+ label: string;
9
+ previousLabel: string;
10
+ nextLabel: string;
11
+ };
12
+ export declare function CarouselMotion(props: CarouselMotionProps): import("react").JSX.Element;
13
+ //# sourceMappingURL=carousel-motion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carousel-motion.d.ts","sourceRoot":"","sources":["../src/carousel-motion.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEpE,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,yDAAyD,CAAC;AAI9G,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3F,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;CACrG,CAAC;AACF,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,+BA+BxD"}
@@ -0,0 +1,35 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import useEmblaCarousel from "embla-carousel-react";
4
+ import { validateCarousel } from "@hjmds/design-contracts/components/interaction-adapters";
5
+ import { Button } from "./actions.js";
6
+ import { useHjmTheme } from "./provider.js";
7
+ export function CarouselMotion(props) {
8
+ const index = validateCarousel(props.slides, props.currentKey);
9
+ const { environment } = useHjmTheme();
10
+ // Embla deep-compares options and reInits on change; a live startIndex restarted the engine at the target on
11
+ // every selection, so navigation snapped instead of animating (2026-09-30 review). Only the first index seeds it.
12
+ const [startIndex] = useState(index);
13
+ const [viewport, api] = useEmblaCarousel({ loop: false, direction: environment.direction, startIndex,
14
+ // HJM owns selection; upstream focus scrolling must not independently change slides.
15
+ // Embla's default 25 is a physics duration factor, not an HJM millisecond token.
16
+ watchFocus: false, duration: environment.reducedMotion ? 0 : 25 });
17
+ const latest = useRef(props);
18
+ latest.current = props;
19
+ const syncing = useRef(false);
20
+ useEffect(() => {
21
+ if (!api)
22
+ return;
23
+ const select = () => {
24
+ const current = latest.current;
25
+ const item = current.slides[api.selectedScrollSnap()];
26
+ if (!syncing.current && item && item.id !== current.currentKey)
27
+ current.onCurrentKeyChange(item.id);
28
+ };
29
+ api.on("select", select);
30
+ return () => { api.off("select", select); };
31
+ }, [api]);
32
+ useEffect(() => { syncing.current = true; api?.scrollTo(index, environment.reducedMotion); syncing.current = false; }, [api, index, environment.reducedMotion]);
33
+ return _jsxs("section", { "aria-label": props.label, "aria-roledescription": "carousel", children: [_jsx("div", { ref: viewport, style: { overflow: "hidden" }, children: _jsx("div", { style: { display: "flex", touchAction: "pan-y pinch-zoom" }, children: props.slides.map((slide, i) => _jsx("div", { role: "group", "aria-roledescription": "slide", "aria-label": slide.label, "aria-hidden": i !== index, inert: i !== index, style: { flex: "0 0 100%", minWidth: 0 }, children: props.renderSlide(slide) }, slide.id)) }) }), _jsx(Button, { tone: "ghost", disabled: index === 0, onClick: () => props.onCurrentKeyChange(props.slides[index - 1].id), children: props.previousLabel }), _jsx(Button, { tone: "ghost", disabled: index === props.slides.length - 1, onClick: () => props.onCurrentKeyChange(props.slides[index + 1].id), children: props.nextLabel })] });
34
+ }
35
+ //# sourceMappingURL=carousel-motion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carousel-motion.js","sourceRoot":"","sources":["../src/carousel-motion.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport useEmblaCarousel from \"embla-carousel-react\";\nimport { validateCarousel, type SortableItem } from \"@hjmds/design-contracts/components/interaction-adapters\";\nimport { Button } from \"./actions.js\";\nimport { useHjmTheme } from \"./provider.js\";\n\nexport type CarouselMotionProps = {\n slides: readonly SortableItem[]; currentKey: string; onCurrentKeyChange(key: string): void;\n renderSlide(item: SortableItem): ReactNode; label: string; previousLabel: string; nextLabel: string;\n};\nexport function CarouselMotion(props: CarouselMotionProps) {\n const index = validateCarousel(props.slides, props.currentKey);\n const { environment } = useHjmTheme();\n // Embla deep-compares options and reInits on change; a live startIndex restarted the engine at the target on\n // every selection, so navigation snapped instead of animating (2026-09-30 review). Only the first index seeds it.\n const [startIndex] = useState(index);\n const [viewport, api] = useEmblaCarousel({ loop: false, direction: environment.direction, startIndex,\n // HJM owns selection; upstream focus scrolling must not independently change slides.\n // Embla's default 25 is a physics duration factor, not an HJM millisecond token.\n watchFocus: false, duration: environment.reducedMotion ? 0 : 25 });\n const latest = useRef(props); latest.current = props;\n const syncing = useRef(false);\n useEffect(() => {\n if (!api) return;\n const select = () => {\n const current = latest.current;\n const item = current.slides[api.selectedScrollSnap()];\n if (!syncing.current && item && item.id !== current.currentKey) current.onCurrentKeyChange(item.id);\n };\n api.on(\"select\", select);\n return () => { api.off(\"select\", select); };\n }, [api]);\n useEffect(() => { syncing.current = true; api?.scrollTo(index, environment.reducedMotion); syncing.current = false; }, [api, index, environment.reducedMotion]);\n return <section aria-label={props.label} aria-roledescription=\"carousel\">\n <div ref={viewport} style={{ overflow: \"hidden\" }}><div style={{ display: \"flex\", touchAction: \"pan-y pinch-zoom\" }}>\n {props.slides.map((slide, i) => <div key={slide.id} role=\"group\" aria-roledescription=\"slide\" aria-label={slide.label} aria-hidden={i !== index} inert={i !== index}\n style={{ flex: \"0 0 100%\", minWidth: 0 }}>{props.renderSlide(slide)}</div>)}\n </div></div>\n <Button tone=\"ghost\" disabled={index === 0} onClick={() => props.onCurrentKeyChange(props.slides[index - 1]!.id)}>{props.previousLabel}</Button>\n <Button tone=\"ghost\" disabled={index === props.slides.length - 1} onClick={() => props.onCurrentKeyChange(props.slides[index + 1]!.id)}>{props.nextLabel}</Button>\n </section>;\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import { type CelebrationPreset } from "@hjmds/design-contracts/components/interaction-adapters";
2
+ export type CelebrationProps = {
3
+ eventId: string;
4
+ preset?: CelebrationPreset;
5
+ onComplete?(): void;
6
+ };
7
+ export declare function Celebration({ eventId, preset, onComplete }: CelebrationProps): import("react").JSX.Element;
8
+ //# sourceMappingURL=celebration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"celebration.d.ts","sourceRoot":"","sources":["../src/celebration.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAyD,KAAK,iBAAiB,EAAE,MAAM,yDAAyD,CAAC;AAGxJ,MAAM,MAAM,gBAAgB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAAC,UAAU,CAAC,IAAI,IAAI,CAAA;CAAE,CAAC;AACpG,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,MAAsB,EAAE,UAAU,EAAE,EAAE,gBAAgB,+BA+B5F"}
@@ -0,0 +1,51 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useRef } from "react";
3
+ import confetti from "canvas-confetti";
4
+ import { celebrationColors, celebrationRecipe, validateEventId } from "@hjmds/design-contracts/components/interaction-adapters";
5
+ import { useHjmTheme } from "./provider.js";
6
+ export function Celebration({ eventId, preset = "small-burst", onComplete }) {
7
+ validateEventId(eventId);
8
+ const canvas = useRef(null);
9
+ const seen = useRef(new Set());
10
+ const { environment, palette } = useHjmTheme();
11
+ const latest = useRef({ preset, onComplete, environment, palette });
12
+ latest.current = { preset, onComplete, environment, palette };
13
+ const stop = useRef(() => { });
14
+ useEffect(() => {
15
+ let disposed = false;
16
+ let done = false;
17
+ let started = false;
18
+ let fire;
19
+ let timer;
20
+ const finish = () => { fire?.reset(); if (!disposed && !done && started) {
21
+ done = true;
22
+ latest.current.onComplete?.();
23
+ } };
24
+ stop.current = finish;
25
+ // Wait until after Strict Mode's probe cleanup before consuming an event.
26
+ queueMicrotask(() => {
27
+ if (disposed || seen.current.has(eventId))
28
+ return;
29
+ seen.current.add(eventId);
30
+ started = true;
31
+ const current = latest.current;
32
+ if (current.environment.reducedMotion || document.hidden) {
33
+ finish();
34
+ return;
35
+ }
36
+ fire = confetti.create(canvas.current, { resize: true, disableForReducedMotion: true });
37
+ // A private canvas avoids cancelling another screen's animation on cleanup.
38
+ void fire({ particleCount: celebrationRecipe[current.preset].count,
39
+ colors: celebrationColors(current.palette.theme.primary, current.palette.statusAccents), origin: { y: 0.7 } });
40
+ timer = setTimeout(finish, celebrationRecipe[current.preset].duration);
41
+ });
42
+ const visibility = () => { if (document.hidden)
43
+ finish(); };
44
+ document.addEventListener("visibilitychange", visibility);
45
+ return () => { disposed = true; clearTimeout(timer); document.removeEventListener("visibilitychange", visibility); fire?.reset(); };
46
+ }, [eventId]);
47
+ useEffect(() => { if (environment.reducedMotion)
48
+ stop.current(); }, [environment.reducedMotion]);
49
+ return _jsx("canvas", { ref: canvas, "aria-hidden": true, style: { position: "fixed", inset: 0, width: "100%", height: "100%", pointerEvents: "none" } });
50
+ }
51
+ //# sourceMappingURL=celebration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"celebration.js","sourceRoot":"","sources":["../src/celebration.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useRef } from \"react\";\nimport confetti from \"canvas-confetti\";\nimport { celebrationColors, celebrationRecipe, validateEventId, type CelebrationPreset } from \"@hjmds/design-contracts/components/interaction-adapters\";\nimport { useHjmTheme } from \"./provider.js\";\n\nexport type CelebrationProps = { eventId: string; preset?: CelebrationPreset; onComplete?(): void };\nexport function Celebration({ eventId, preset = \"small-burst\", onComplete }: CelebrationProps) {\n validateEventId(eventId);\n const canvas = useRef<HTMLCanvasElement>(null);\n const seen = useRef(new Set<string>());\n const { environment, palette } = useHjmTheme();\n const latest = useRef({ preset, onComplete, environment, palette }); latest.current = { preset, onComplete, environment, palette };\n const stop = useRef<() => void>(() => {});\n useEffect(() => {\n let disposed = false; let done = false; let started = false;\n let fire: ReturnType<typeof confetti.create> | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const finish = () => { fire?.reset(); if (!disposed && !done && started) { done = true; latest.current.onComplete?.(); } };\n stop.current = finish;\n // Wait until after Strict Mode's probe cleanup before consuming an event.\n queueMicrotask(() => {\n if (disposed || seen.current.has(eventId)) return;\n seen.current.add(eventId); started = true;\n const current = latest.current;\n if (current.environment.reducedMotion || document.hidden) { finish(); return; }\n fire = confetti.create(canvas.current!, { resize: true, disableForReducedMotion: true });\n // A private canvas avoids cancelling another screen's animation on cleanup.\n void fire({ particleCount: celebrationRecipe[current.preset].count,\n colors: celebrationColors(current.palette.theme.primary, current.palette.statusAccents), origin: { y: 0.7 } });\n timer = setTimeout(finish, celebrationRecipe[current.preset].duration);\n });\n const visibility = () => { if (document.hidden) finish(); };\n document.addEventListener(\"visibilitychange\", visibility);\n return () => { disposed = true; clearTimeout(timer); document.removeEventListener(\"visibilitychange\", visibility); fire?.reset(); };\n }, [eventId]);\n useEffect(() => { if (environment.reducedMotion) stop.current(); }, [environment.reducedMotion]);\n return <canvas ref={canvas} aria-hidden style={{ position: \"fixed\", inset: 0, width: \"100%\", height: \"100%\", pointerEvents: \"none\" }} />;\n}\n"]}