@hjmds/react 1.9.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.
- package/README.md +14 -0
- package/THIRD_PARTY_NOTICES.md +78 -0
- package/dist/activity-heatmap.d.ts +10 -0
- package/dist/activity-heatmap.d.ts.map +1 -0
- package/dist/activity-heatmap.js +6 -0
- package/dist/activity-heatmap.js.map +1 -0
- package/dist/advanced-display.d.ts +3 -0
- package/dist/advanced-display.d.ts.map +1 -1
- package/dist/advanced-display.js +9 -7
- package/dist/advanced-display.js.map +1 -1
- package/dist/auth-screen.d.ts +8 -0
- package/dist/auth-screen.d.ts.map +1 -1
- package/dist/auth-screen.js +5 -2
- package/dist/auth-screen.js.map +1 -1
- package/dist/avatar-blobatar-motion.d.ts +6 -0
- package/dist/avatar-blobatar-motion.d.ts.map +1 -0
- package/dist/avatar-blobatar-motion.js +22 -0
- package/dist/avatar-blobatar-motion.js.map +1 -0
- package/dist/avatar-blobatar.d.ts +6 -0
- package/dist/avatar-blobatar.d.ts.map +1 -0
- package/dist/avatar-blobatar.js +10 -0
- package/dist/avatar-blobatar.js.map +1 -0
- package/dist/bottom-navigation.d.ts.map +1 -1
- package/dist/bottom-navigation.js +3 -3
- package/dist/bottom-navigation.js.map +1 -1
- package/dist/carousel-motion.d.ts +4 -1
- package/dist/carousel-motion.d.ts.map +1 -1
- package/dist/carousel-motion.js +12 -3
- package/dist/carousel-motion.js.map +1 -1
- package/dist/code-block.d.ts +8 -0
- package/dist/code-block.d.ts.map +1 -0
- package/dist/code-block.js +6 -0
- package/dist/code-block.js.map +1 -0
- package/dist/content-transition.d.ts +5 -2
- package/dist/content-transition.d.ts.map +1 -1
- package/dist/content-transition.js +6 -4
- package/dist/content-transition.js.map +1 -1
- package/dist/context-menu.d.ts.map +1 -1
- package/dist/context-menu.js +10 -11
- package/dist/context-menu.js.map +1 -1
- package/dist/data-table.d.ts.map +1 -1
- package/dist/data-table.js +2 -1
- package/dist/data-table.js.map +1 -1
- package/dist/duration-field.d.ts +11 -0
- package/dist/duration-field.d.ts.map +1 -0
- package/dist/duration-field.js +9 -0
- package/dist/duration-field.js.map +1 -0
- package/dist/effect-surface.d.ts +10 -0
- package/dist/effect-surface.d.ts.map +1 -0
- package/dist/effect-surface.js +57 -0
- package/dist/effect-surface.js.map +1 -0
- package/dist/evidence.d.ts +1 -1
- package/dist/evidence.js +1 -1
- package/dist/evidence.js.map +1 -1
- package/dist/folder-preview.d.ts +12 -0
- package/dist/folder-preview.d.ts.map +1 -0
- package/dist/folder-preview.js +7 -0
- package/dist/folder-preview.js.map +1 -0
- package/dist/forms.d.ts +3 -1
- package/dist/forms.d.ts.map +1 -1
- package/dist/forms.js +2 -2
- package/dist/forms.js.map +1 -1
- package/dist/gravity-letters.d.ts +8 -0
- package/dist/gravity-letters.d.ts.map +1 -0
- package/dist/gravity-letters.js +24 -0
- package/dist/gravity-letters.js.map +1 -0
- package/dist/grid-reveal.d.ts +9 -0
- package/dist/grid-reveal.d.ts.map +1 -0
- package/dist/grid-reveal.js +21 -0
- package/dist/grid-reveal.js.map +1 -0
- package/dist/icon-lucide.d.ts +11 -0
- package/dist/icon-lucide.d.ts.map +1 -0
- package/dist/icon-lucide.js +11 -0
- package/dist/icon-lucide.js.map +1 -0
- package/dist/inline-confirm.d.ts +14 -0
- package/dist/inline-confirm.d.ts.map +1 -0
- package/dist/inline-confirm.js +37 -0
- package/dist/inline-confirm.js.map +1 -0
- package/dist/menu-morph.d.ts.map +1 -1
- package/dist/menu-morph.js +9 -6
- package/dist/menu-morph.js.map +1 -1
- package/dist/menu-typeahead.d.ts +13 -0
- package/dist/menu-typeahead.d.ts.map +1 -0
- package/dist/menu-typeahead.js +17 -0
- package/dist/menu-typeahead.js.map +1 -0
- package/dist/navigation-bar.d.ts +10 -0
- package/dist/navigation-bar.d.ts.map +1 -0
- package/dist/navigation-bar.js +10 -0
- package/dist/navigation-bar.js.map +1 -0
- package/dist/navigation.d.ts +3 -3
- package/dist/navigation.d.ts.map +1 -1
- package/dist/navigation.js +63 -22
- package/dist/navigation.js.map +1 -1
- package/dist/notification-bell.d.ts +11 -0
- package/dist/notification-bell.d.ts.map +1 -0
- package/dist/notification-bell.js +27 -0
- package/dist/notification-bell.js.map +1 -0
- package/dist/overlays.d.ts +0 -2
- package/dist/overlays.d.ts.map +1 -1
- package/dist/overlays.js +5 -18
- package/dist/overlays.js.map +1 -1
- package/dist/reaction-picker.d.ts +11 -0
- package/dist/reaction-picker.d.ts.map +1 -0
- package/dist/reaction-picker.js +9 -0
- package/dist/reaction-picker.js.map +1 -0
- package/dist/scroll-progress.d.ts +10 -0
- package/dist/scroll-progress.d.ts.map +1 -0
- package/dist/scroll-progress.js +34 -0
- package/dist/scroll-progress.js.map +1 -0
- package/dist/select.d.ts +0 -1
- package/dist/select.d.ts.map +1 -1
- package/dist/select.js +0 -2
- package/dist/select.js.map +1 -1
- package/dist/sidebar.d.ts +3 -0
- package/dist/sidebar.d.ts.map +1 -1
- package/dist/sidebar.js +23 -4
- package/dist/sidebar.js.map +1 -1
- package/dist/step-player.d.ts +24 -0
- package/dist/step-player.d.ts.map +1 -0
- package/dist/step-player.js +16 -0
- package/dist/step-player.js.map +1 -0
- package/dist/styles.css +101 -13
- package/dist/styles.layered.css +101 -13
- package/dist/supplemental-display.d.ts +10 -2
- package/dist/supplemental-display.d.ts.map +1 -1
- package/dist/supplemental-display.js +2 -2
- package/dist/supplemental-display.js.map +1 -1
- package/dist/table-sort-button.d.ts +15 -0
- package/dist/table-sort-button.d.ts.map +1 -0
- package/dist/table-sort-button.js +7 -0
- package/dist/table-sort-button.js.map +1 -0
- package/dist/task-list.d.ts +16 -0
- package/dist/task-list.d.ts.map +1 -0
- package/dist/task-list.js +17 -0
- package/dist/task-list.js.map +1 -0
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +9 -0
- package/dist/theme.js.map +1 -1
- package/dist/thinking-orb.d.ts +1 -1
- package/dist/thinking-orb.d.ts.map +1 -1
- package/dist/thinking-orb.js +4 -4
- package/dist/thinking-orb.js.map +1 -1
- package/dist/toast.d.ts.map +1 -1
- package/dist/toast.js +12 -7
- package/dist/toast.js.map +1 -1
- package/dist/voice-note.d.ts +24 -0
- package/dist/voice-note.d.ts.map +1 -0
- package/dist/voice-note.js +13 -0
- package/dist/voice-note.js.map +1 -0
- package/package.json +110 -5
package/dist/thinking-orb.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thinking-orb.js","sourceRoot":"","sources":["../src/thinking-orb.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAsB,MAAM,OAAO,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,mBAAmB,EAA2B,MAAM,iDAAiD,CAAC;AACjL,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,yEAAyE;AACzE,MAAM,UAAU,WAAW,CAAC,EAAE,KAAK,GAAG,SAAS,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,EAAE,KAAK,EAAoB;
|
|
1
|
+
{"version":3,"file":"thinking-orb.js","sourceRoot":"","sources":["../src/thinking-orb.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useRef, type CSSProperties } from \"react\";\nimport { buildThinkingOrbFrame, createThinkingOrbClock, thinkingOrbRecipe, validateThinkingOrb, type ThinkingOrbOptions } from \"@hjmds/design-contracts/components/thinking-orb\";\nimport { useHjmTheme } from \"./provider.js\";\n\nexport type ThinkingOrbProps = ThinkingOrbOptions & Readonly<{ className?: string; style?: CSSProperties }>;\n/** Optional AI status presentation; ordinary loading retains Spinner. */\nexport function ThinkingOrb({ state = \"working\", appearance = \"state\", size = 64, label, speed = 1, paused = false, active = true, className, style }: ThinkingOrbProps) {\n validateThinkingOrb({ state, appearance, size, speed, label });\n const theme = useHjmTheme();\n const ink = theme.palette.theme.text;\n const reduced = theme.environment.reducedMotion;\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const clock = useRef(createThinkingOrbClock());\n useEffect(() => {\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (!canvas || !ctx) return;\n let ratio = 1;\n let raf = 0;\n let visible = typeof IntersectionObserver === \"undefined\";\n let disposed = false;\n const draw = () => {\n const frame = buildThinkingOrbFrame(state, size, reduced ? thinkingOrbRecipe.motion.staticTime : clock.current.time, appearance);\n ctx.setTransform(ratio, 0, 0, ratio, 0, 0);\n ctx.clearRect(0, 0, size, size);\n ctx.fillStyle = ctx.strokeStyle = ink;\n // Depth becomes semantic-ink opacity, so brand palettes work on any HJM surface.\n for (const line of frame.lines) {\n ctx.globalAlpha = (1 - Math.min(1, Math.max(0, line.white))) * (line.a ?? 1);\n ctx.lineWidth = line.w;\n ctx.beginPath(); ctx.moveTo(line.x1, line.y1); ctx.lineTo(line.x2, line.y2); ctx.stroke();\n }\n for (const dot of frame.dots) {\n ctx.globalAlpha = (1 - Math.min(1, Math.max(0, dot.white))) * (dot.a ?? 1);\n ctx.beginPath(); ctx.arc(dot.x, dot.y, dot.r, 0, Math.PI * 2); ctx.fill();\n }\n ctx.globalAlpha = 1;\n };\n const resize = () => {\n ratio = Math.min(thinkingOrbRecipe.maxPixelRatio, window.devicePixelRatio || 1);\n canvas.width = Math.round(size * ratio); canvas.height = Math.round(size * ratio);\n draw();\n };\n const eligible = () => !disposed && active && !paused && !reduced && visible && document.visibilityState !== \"hidden\";\n const loop = (now: number) => {\n raf = 0;\n if (!eligible()) return;\n clock.current.sample(now, speed); draw();\n raf = requestAnimationFrame(loop);\n };\n const sync = () => {\n cancelAnimationFrame(raf); raf = 0; clock.current.resetDelta();\n if (eligible()) raf = requestAnimationFrame(loop);\n };\n const observer = typeof IntersectionObserver === \"undefined\" ? null : new IntersectionObserver(entries => {\n visible = entries[0]?.isIntersecting ?? false; sync();\n });\n resize(); observer?.observe(canvas); sync();\n document.addEventListener(\"visibilitychange\", sync);\n window.addEventListener(\"resize\", resize);\n return () => {\n disposed = true; cancelAnimationFrame(raf); observer?.disconnect(); clock.current.resetDelta();\n document.removeEventListener(\"visibilitychange\", sync); window.removeEventListener(\"resize\", resize);\n };\n }, [state, appearance, size, speed, active, paused, reduced, ink]);\n return <span className={className} data-hjm-thinking-orb={state} role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" style={{ display: \"inline-flex\", ...style }}>\n <canvas ref={canvasRef} aria-hidden=\"true\" style={{ width: size, height: size, display: \"block\" }} />\n {/* Inline hiding works for granular consumers who do not import the stylesheet. */}\n <span style={{ position: \"absolute\", width: 1, height: 1, padding: 0, margin: -1, overflow: \"hidden\", clipPath: \"inset(50%)\", whiteSpace: \"nowrap\", border: 0 }}>{label}</span>\n </span>;\n}\n"]}
|
package/dist/toast.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../src/toast.tsx"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,OAAO,EACZ,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EAEvB,KAAK,UAAU,EACf,KAAK,sBAAsB,EAC5B,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAYL,KAAK,cAAc,EAEnB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../src/toast.tsx"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,OAAO,EACZ,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EAEvB,KAAK,UAAU,EACf,KAAK,sBAAsB,EAC5B,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAYL,KAAK,cAAc,EAEnB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAmIf,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GACjF,QAAQ,CAAC;IACP,UAAU,EAAE,eAAe,CAAC;IAC5B,gBAAgB,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;CACxD,CAAC,CAAC;AAEL,wFAAwF;AACxF,eAAO,MAAM,KAAK;gBALF,eAAe;sBACT,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI;mDA6BxD,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC;IAC9B,OAAO,CAAC,UAAU,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,kBAAkB,CAAC;IACxF,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC;IAC1D,KAAK,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC;CAC7B,CAAC,CAAC;AAIH,wBAAgB,QAAQ,IAAI,QAAQ,CAInC;AAED,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IACxC,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,aAAa,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,oBAAoB,CAAC;IACvC,iBAAiB,CAAC,EAAE,sBAAsB,CAAC;IAC3C,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACrC,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B,qFAAqF;IACrF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC,CAAC;AAsDH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,KAAK,EACL,SAA0C,EAC1C,KAAK,EACL,aAAkB,EAClB,UAAU,EACV,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,MAAM,EACN,YAAgB,EAChB,MAAM,EACN,UAAU,GACX,EAAE,kBAAkB,+BA4NpB"}
|
package/dist/toast.js
CHANGED
|
@@ -7,13 +7,18 @@ import { createPortal } from "react-dom";
|
|
|
7
7
|
import { classNames } from "./internal.js";
|
|
8
8
|
import { useOptionalHjmTheme } from "./provider.js";
|
|
9
9
|
import { createHjmThemeStyle } from "./theme.js";
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
// 1.10.0: stroked SVG glyphs inside a tinted badge (toastRecipe.icon). Text glyphs ("●", "i", "!") rendered at
|
|
11
|
+
// font metrics, so neutral read as a stray grey dot and info/danger looked like typos. currentColor = tone accent.
|
|
12
|
+
const toneGlyphPaths = {
|
|
13
|
+
notifications: "M6 8a6 6 0 1 1 12 0c0 7 3 9 3 9H3s3-2 3-9M10.3 21a1.94 1.94 0 0 0 3.4 0",
|
|
14
|
+
info: "M12 16v-4M12 8h.01M22 12a10 10 0 1 1-20 0 10 10 0 0 1 20 0Z",
|
|
15
|
+
success: "M20 6 9 17l-5-5",
|
|
16
|
+
warning: "M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0ZM12 9v4M12 17h.01",
|
|
17
|
+
alert: "M12 8v4M12 16h.01M7.86 2h8.28L22 7.86v8.28L16.14 22H7.86L2 16.14V7.86Z",
|
|
16
18
|
};
|
|
19
|
+
function ToneGlyph({ tone }) {
|
|
20
|
+
return (_jsx("svg", { viewBox: "0 0 24 24", width: "18", height: "18", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", focusable: "false", children: _jsx("path", { d: toneGlyphPaths[toastRecipe.tones[tone].mark] }) }));
|
|
21
|
+
}
|
|
17
22
|
const ToastCard = forwardRef(function ToastCard({ descriptor, phase, onAction, onDismiss, onPointerPause, onPointerResume, onFocusPause, onFocusResume, locale, className, }, ref) {
|
|
18
23
|
const baseId = useId().replaceAll(":", "");
|
|
19
24
|
const titleId = `${baseId}-toast-title`;
|
|
@@ -27,7 +32,7 @@ const ToastCard = forwardRef(function ToastCard({ descriptor, phase, onAction, o
|
|
|
27
32
|
return (_jsxs("div", { ref: ref, className: classNames("hjm-toast", className), "data-tone": descriptor.tone, "data-state": phase, lang: locale, role: "group", "aria-labelledby": descriptor.title ? titleId : undefined, "aria-describedby": descriptionId, onPointerEnter: onPointerPause, onPointerLeave: onPointerResume, onFocusCapture: onFocusPause, onBlurCapture: (event) => {
|
|
28
33
|
if (!event.currentTarget.contains(event.relatedTarget))
|
|
29
34
|
onFocusResume?.();
|
|
30
|
-
}, onKeyDown: handleKeyDown, children: [_jsx("span", { className: "hjm-visually-hidden", role: descriptor.priority === "high" ? "alert" : "status", children: descriptor.announcement }), _jsx("span", { className: "hjm-toast__tone-mark", "aria-hidden": "true" }), _jsx("span", { className: "hjm-toast__icon", "aria-hidden": "true", children:
|
|
35
|
+
}, onKeyDown: handleKeyDown, children: [_jsx("span", { className: "hjm-visually-hidden", role: descriptor.priority === "high" ? "alert" : "status", children: descriptor.announcement }), _jsx("span", { className: "hjm-toast__tone-mark", "aria-hidden": "true" }), _jsx("span", { className: "hjm-toast__icon", "aria-hidden": "true", children: _jsx(ToneGlyph, { tone: descriptor.tone }) }), _jsxs("span", { className: "hjm-toast__content", children: [descriptor.title ? (_jsx("strong", { id: titleId, className: "hjm-toast__title", children: descriptor.title })) : null, _jsx("span", { id: descriptionId, className: "hjm-toast__description", children: descriptor.description })] }), descriptor.action ? (_jsx("button", { type: "button", className: "hjm-toast__action", "aria-label": descriptor.action.accessibilityLabel, onClick: onAction, children: descriptor.action.label })) : null, _jsx("button", { type: "button", className: "hjm-toast__close", "aria-label": descriptor.closeLabel, onClick: () => onDismiss("close-action"), children: _jsx("svg", { "aria-hidden": "true", viewBox: "0 0 24 24", width: "16", height: "16", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", focusable: "false", children: _jsx("path", { d: "M18 6 6 18M6 6l12 12" }) }) })] }));
|
|
31
36
|
});
|
|
32
37
|
/** Controlled single-toast renderer; ToastProvider supplies the full FIFO lifecycle. */
|
|
33
38
|
export const Toast = forwardRef(function Toast({ descriptor, onDismissRequest, className }, ref) {
|
package/dist/toast.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toast.js","sourceRoot":"","sources":["../src/toast.tsx"],"names":[],"mappings":"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","sourcesContent":["import { isLargeTextScale } from \"@hjmds/design-contracts/components/design-system-provider\";\nimport {\n createToastStore,\n resolveToastDescriptor,\n type ResolvedToastDescriptor,\n type ToastDescriptor,\n type ToastDismissReason,\n type ToastDuplicatePolicy,\n type ToastId,\n type ToastOverflowPolicy,\n type ToastPublishOptions,\n type ToastPublishResult,\n type ToastSessionSnapshot,\n type ToastStore,\n type ToastTimerUpdatePolicy,\n} from \"@hjmds/design-contracts/components/toast\";\nimport {\n toastRecipe,\n type ToastPlacement,\n} from \"@hjmds/design-contracts/recipes\";\nimport {\n createContext,\n forwardRef,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n type CSSProperties,\n type FocusEvent,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { classNames } from \"./internal.js\";\nimport { useOptionalHjmTheme } from \"./provider.js\";\nimport { createHjmThemeStyle } from \"./theme.js\";\n\nconst toneMarks = {\n neutral: \"●\",\n info: \"i\",\n success: \"✓\",\n warning: \"!\",\n danger: \"!\",\n} as const;\n\ntype ToastCardProps = Readonly<{\n descriptor: ResolvedToastDescriptor;\n phase: \"visible\" | \"closing\";\n onAction(): void;\n onDismiss(reason: ToastDismissReason): void;\n onPointerPause?(): void;\n onPointerResume?(): void;\n onFocusPause?(): void;\n onFocusResume?(): void;\n locale?: string;\n className?: string;\n}>;\n\nconst ToastCard = forwardRef<HTMLDivElement, ToastCardProps>(function ToastCard(\n {\n descriptor,\n phase,\n onAction,\n onDismiss,\n onPointerPause,\n onPointerResume,\n onFocusPause,\n onFocusResume,\n locale,\n className,\n },\n ref,\n) {\n const baseId = useId().replaceAll(\":\", \"\");\n const titleId = `${baseId}-toast-title`;\n const descriptionId = `${baseId}-toast-description`;\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n onDismiss(\"escape\");\n }\n };\n return (\n <div\n ref={ref}\n className={classNames(\"hjm-toast\", className)}\n data-tone={descriptor.tone}\n data-state={phase}\n lang={locale}\n role=\"group\"\n aria-labelledby={descriptor.title ? titleId : undefined}\n aria-describedby={descriptionId}\n onPointerEnter={onPointerPause}\n onPointerLeave={onPointerResume}\n onFocusCapture={onFocusPause}\n onBlurCapture={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) onFocusResume?.();\n }}\n onKeyDown={handleKeyDown}\n >\n <span\n className=\"hjm-visually-hidden\"\n role={descriptor.priority === \"high\" ? \"alert\" : \"status\"}\n >\n {descriptor.announcement}\n </span>\n <span className=\"hjm-toast__tone-mark\" aria-hidden=\"true\" />\n <span className=\"hjm-toast__icon\" aria-hidden=\"true\">\n {toneMarks[descriptor.tone]}\n </span>\n <span className=\"hjm-toast__content\">\n {descriptor.title ? (\n <strong id={titleId} className=\"hjm-toast__title\">{descriptor.title}</strong>\n ) : null}\n <span id={descriptionId} className=\"hjm-toast__description\">\n {descriptor.description}\n </span>\n </span>\n {descriptor.action ? (\n <button\n type=\"button\"\n className=\"hjm-toast__action\"\n aria-label={descriptor.action.accessibilityLabel}\n onClick={onAction}\n >\n {descriptor.action.label}\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"hjm-toast__close\"\n aria-label={descriptor.closeLabel}\n onClick={() => onDismiss(\"close-action\")}\n >\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n );\n});\n\nexport type ToastProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\" | \"title\"> &\n Readonly<{\n descriptor: ToastDescriptor;\n onDismissRequest: (reason: ToastDismissReason) => void;\n }>;\n\n/** Controlled single-toast renderer; ToastProvider supplies the full FIFO lifecycle. */\nexport const Toast = forwardRef<HTMLDivElement, ToastProps>(function Toast(\n { descriptor, onDismissRequest, className },\n ref,\n) {\n const resolved = resolveToastDescriptor(descriptor);\n const actionInvokedRef = useRef(false);\n useEffect(() => {\n actionInvokedRef.current = false;\n }, [descriptor]);\n return (\n <ToastCard\n ref={ref}\n descriptor={resolved}\n phase=\"visible\"\n {...(className === undefined ? {} : { className })}\n onDismiss={onDismissRequest}\n onAction={() => {\n const action = resolved.action;\n if (!action || actionInvokedRef.current) return;\n actionInvokedRef.current = true;\n action.onAction();\n if (action.dismissOnAction) onDismissRequest(\"action\");\n }}\n />\n );\n});\n\nexport type ToastApi = Readonly<{\n publish(descriptor: ToastDescriptor, options?: ToastPublishOptions): ToastPublishResult;\n dismiss(id: ToastId, reason: ToastDismissReason): boolean;\n close(id: ToastId): boolean;\n}>;\n\nconst ToastContext = createContext<ToastApi | null>(null);\n\nexport function useToast(): ToastApi {\n const value = useContext(ToastContext);\n if (value === null) throw new Error(\"useToast must be used inside ToastProvider\");\n return value;\n}\n\nexport type ToastProviderProps = Readonly<{\n children: ReactNode;\n label: string;\n placement?: ToastPlacement;\n store?: ToastStore;\n initialToasts?: readonly ToastDescriptor[];\n maxVisible?: number;\n maxQueued?: number;\n duplicatePolicy?: ToastDuplicatePolicy;\n timerUpdatePolicy?: ToastTimerUpdatePolicy;\n overflowPolicy?: ToastOverflowPolicy;\n portalContainer?: HTMLElement;\n /** Captured per publication so already-visible localized copy keeps its language. */\n locale?: string;\n /** Extra space above a fixed product dock, in pixels or any CSS length. */\n bottomOffset?: number | string;\n /** Optional discoverable keyboard shortcut, for example `F8`. */\n hotkey?: string;\n /** Screen-reader help associated with the viewport when `hotkey` is supplied. */\n hotkeyHelp?: string;\n}>;\n\ntype ToastPortalProps = Readonly<{\n children: ReactNode;\n container?: HTMLElement;\n}>;\n\nfunction ToastPortal({ children, container }: ToastPortalProps) {\n const [mounted, setMounted] = useState(false);\n const theme = useOptionalHjmTheme();\n useEffect(() => setMounted(true), []);\n if (!mounted) return null;\n return createPortal(\n theme ? (\n <div\n className=\"hjm-root hjm-portal\"\n data-hjm-portal=\"toast\"\n data-motion={theme.environment.reducedMotion ? \"reduced\" : \"full\"}\n data-theme={theme.environment.theme}\n data-text-scale={theme.environment.textScale}\n data-large-text={isLargeTextScale(theme.environment.textScale) ? \"true\" : undefined}\n dir={theme.environment.direction}\n style={createHjmThemeStyle(theme)}\n >\n {children}\n </div>\n ) : children,\n container ?? document.body,\n );\n}\n\nfunction renderStoreToast(\n snapshot: ToastSessionSnapshot,\n store: ToastStore,\n locale?: string,\n): ReactNode {\n if (snapshot.phase !== \"visible\" && snapshot.phase !== \"closing\") return null;\n const id = snapshot.descriptor.id;\n return (\n <ToastCard\n key={id}\n descriptor={snapshot.descriptor}\n phase={snapshot.phase}\n {...(locale === undefined ? {} : { locale })}\n onAction={() => store.invokeAction(id)}\n onDismiss={(reason) => store.dismiss(id, reason)}\n onPointerPause={() => store.pause(id, \"pointer\")}\n onPointerResume={() => store.resume(id, \"pointer\")}\n onFocusPause={() => store.pause(id, \"focus\")}\n onFocusResume={() => store.resume(id, \"focus\")}\n />\n );\n}\n\nexport function ToastProvider({\n children,\n label,\n placement = toastRecipe.defaults.placement,\n store,\n initialToasts = [],\n maxVisible,\n maxQueued,\n duplicatePolicy,\n timerUpdatePolicy,\n overflowPolicy,\n portalContainer,\n locale,\n bottomOffset = 0,\n hotkey,\n hotkeyHelp,\n}: ToastProviderProps) {\n if (label.trim().length === 0) throw new TypeError(\"ToastProvider label must not be empty\");\n if ((hotkey === undefined) !== (hotkeyHelp === undefined)) {\n throw new TypeError(\"ToastProvider hotkey and hotkeyHelp must be supplied together\");\n }\n if (hotkey !== undefined && !hotkey.trim()) {\n throw new TypeError(\"ToastProvider hotkey must not be empty\");\n }\n if (hotkeyHelp !== undefined && !hotkeyHelp.trim()) {\n throw new TypeError(\"ToastProvider hotkeyHelp must not be empty\");\n }\n if (typeof bottomOffset === \"number\" && (!Number.isFinite(bottomOffset) || bottomOffset < 0)) {\n throw new RangeError(\"ToastProvider bottomOffset must be a non-negative finite number\");\n }\n if (typeof bottomOffset === \"string\" && !bottomOffset.trim()) {\n throw new TypeError(\"ToastProvider bottomOffset must not be empty\");\n }\n const internalStoreRef = useRef<ToastStore | null>(null);\n const localeByIdRef = useRef(new Map<ToastId, string>());\n if (store === undefined && internalStoreRef.current === null) {\n internalStoreRef.current = createToastStore({\n ...(maxVisible === undefined ? {} : { maxVisible }),\n ...(maxQueued === undefined ? {} : { maxQueued }),\n ...(duplicatePolicy === undefined ? {} : { duplicatePolicy }),\n ...(timerUpdatePolicy === undefined ? {} : { timerUpdatePolicy }),\n ...(overflowPolicy === undefined ? {} : { overflowPolicy }),\n });\n for (const descriptor of initialToasts) {\n const result = internalStoreRef.current.publish(descriptor);\n if (\n locale !== undefined &&\n (result.outcome === \"added\" || result.outcome === \"updated\")\n ) {\n localeByIdRef.current.set(descriptor.id, locale);\n }\n }\n }\n const activeStore = store ?? internalStoreRef.current;\n if (activeStore === null) throw new Error(\"ToastProvider could not create a store\");\n const snapshot = useSyncExternalStore(\n activeStore.subscribe,\n activeStore.getSnapshot,\n activeStore.getSnapshot,\n );\n const theme = useOptionalHjmTheme();\n const viewportRef = useRef<HTMLDivElement>(null);\n const previousFocusRef = useRef<HTMLElement | null>(null);\n const viewportFocusedRef = useRef(false);\n const hotkeyHelpId = useId().replaceAll(\":\", \"\");\n const api = useMemo<ToastApi>(\n () => ({\n publish: (descriptor, options) => {\n const previousLocale = localeByIdRef.current.get(descriptor.id);\n if (locale === undefined) localeByIdRef.current.delete(descriptor.id);\n else localeByIdRef.current.set(descriptor.id, locale);\n try {\n const result = activeStore.publish(descriptor, options);\n if (result.outcome === \"ignored\" || result.outcome === \"discarded\") {\n if (previousLocale === undefined) localeByIdRef.current.delete(descriptor.id);\n else localeByIdRef.current.set(descriptor.id, previousLocale);\n }\n return result;\n } catch (error) {\n if (previousLocale === undefined) localeByIdRef.current.delete(descriptor.id);\n else localeByIdRef.current.set(descriptor.id, previousLocale);\n throw error;\n }\n },\n dismiss: (id, reason) => activeStore.dismiss(id, reason),\n close: (id) => activeStore.close(id),\n }),\n [activeStore, locale],\n );\n\n const disposalTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => {\n if (disposalTimerRef.current !== null) {\n clearTimeout(disposalTimerRef.current);\n disposalTimerRef.current = null;\n }\n const ownedStore = internalStoreRef.current;\n return () => {\n if (ownedStore) {\n disposalTimerRef.current = setTimeout(() => ownedStore.dispose(), 0);\n }\n };\n }, []);\n\n useEffect(() => {\n const activeIds = new Set(\n [...snapshot.visible, ...snapshot.queued].map((entry) => entry.descriptor.id),\n );\n for (const id of localeByIdRef.current.keys()) {\n if (!activeIds.has(id)) localeByIdRef.current.delete(id);\n }\n }, [snapshot]);\n\n const hasRunningTimer = snapshot.visible.some(\n (entry) => entry.timer.status === \"running\",\n );\n useEffect(() => {\n if (!hasRunningTimer) return;\n let previousTime = performance.now();\n const timer = setInterval(() => {\n const currentTime = performance.now();\n activeStore.advanceTime(currentTime - previousTime);\n previousTime = currentTime;\n }, 100);\n return () => clearInterval(timer);\n }, [activeStore, hasRunningTimer]);\n\n const closingIds = snapshot.visible\n .filter((entry) => entry.phase === \"closing\")\n .map((entry) => entry.descriptor.id)\n .join(\"\\u0000\");\n useEffect(() => {\n if (closingIds.length === 0) return;\n const ids = closingIds.split(\"\\u0000\");\n const timer = setTimeout(\n () => ids.forEach((id) => activeStore.completeExit(id)),\n theme?.environment.reducedMotion ? 0 : 160,\n );\n return () => clearTimeout(timer);\n }, [activeStore, closingIds, theme?.environment.reducedMotion]);\n\n useEffect(() => {\n const pause = () => activeStore.pauseAll(\"window\");\n const resume = () => {\n if (!document.hidden) activeStore.resumeAll(\"window\");\n };\n const handleVisibility = () => (document.hidden ? pause() : resume());\n window.addEventListener(\"blur\", pause);\n window.addEventListener(\"focus\", resume);\n window.addEventListener(\"pagehide\", pause);\n window.addEventListener(\"pageshow\", resume);\n document.addEventListener(\"visibilitychange\", handleVisibility);\n return () => {\n window.removeEventListener(\"blur\", pause);\n window.removeEventListener(\"focus\", resume);\n window.removeEventListener(\"pagehide\", pause);\n window.removeEventListener(\"pageshow\", resume);\n document.removeEventListener(\"visibilitychange\", handleVisibility);\n };\n }, [activeStore]);\n\n useEffect(() => {\n if (hotkey === undefined || snapshot.visible.length === 0) return;\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key !== hotkey) return;\n const viewport = viewportRef.current;\n if (!viewport) return;\n if (!viewport.contains(document.activeElement)) {\n previousFocusRef.current = document.activeElement as HTMLElement | null;\n }\n event.preventDefault();\n viewport.focus();\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [hotkey, snapshot.visible.length]);\n\n useEffect(() => {\n if (snapshot.visible.length > 0 || !viewportFocusedRef.current) return;\n viewportFocusedRef.current = false;\n previousFocusRef.current?.focus();\n previousFocusRef.current = null;\n }, [snapshot.visible.length]);\n\n const handleViewportFocus = (event: FocusEvent<HTMLDivElement>) => {\n const previous = event.relatedTarget;\n if (previous instanceof HTMLElement && !event.currentTarget.contains(previous)) {\n previousFocusRef.current = previous;\n }\n viewportFocusedRef.current = true;\n activeStore.pauseAll(\"focus\");\n };\n const handleViewportBlur = (event: FocusEvent<HTMLDivElement>) => {\n const next = event.relatedTarget;\n if (!(next instanceof Node) || !event.currentTarget.contains(next)) {\n viewportFocusedRef.current = false;\n activeStore.resumeAll(\"focus\");\n }\n };\n const viewportStyle = {\n \"--hjm-toast-bottom-offset\":\n typeof bottomOffset === \"number\" ? `${bottomOffset}px` : bottomOffset,\n } as CSSProperties;\n\n return (\n <ToastContext.Provider value={api}>\n {children}\n {snapshot.visible.length > 0 ? (\n <ToastPortal {...(portalContainer === undefined ? {} : { container: portalContainer })}>\n <div\n ref={viewportRef}\n className=\"hjm-toast-viewport\"\n data-placement={placement}\n role=\"region\"\n aria-label={label}\n aria-describedby={hotkeyHelp === undefined ? undefined : hotkeyHelpId}\n aria-keyshortcuts={hotkey}\n tabIndex={hotkey === undefined ? undefined : -1}\n onFocusCapture={handleViewportFocus}\n onBlurCapture={handleViewportBlur}\n style={viewportStyle}\n >\n {hotkeyHelp === undefined ? null : (\n <span id={hotkeyHelpId} className=\"hjm-visually-hidden\">{hotkeyHelp}</span>\n )}\n {snapshot.visible.map((entry) =>\n renderStoreToast(\n entry,\n activeStore,\n localeByIdRef.current.get(entry.descriptor.id),\n ))}\n </div>\n </ToastPortal>\n ) : null}\n </ToastContext.Provider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"toast.js","sourceRoot":"","sources":["../src/toast.tsx"],"names":[],"mappings":"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","sourcesContent":["import { isLargeTextScale } from \"@hjmds/design-contracts/components/design-system-provider\";\nimport {\n createToastStore,\n resolveToastDescriptor,\n type ResolvedToastDescriptor,\n type ToastDescriptor,\n type ToastDismissReason,\n type ToastDuplicatePolicy,\n type ToastId,\n type ToastOverflowPolicy,\n type ToastPublishOptions,\n type ToastPublishResult,\n type ToastSessionSnapshot,\n type ToastStore,\n type ToastTimerUpdatePolicy,\n} from \"@hjmds/design-contracts/components/toast\";\nimport {\n toastRecipe,\n type ToastPlacement,\n} from \"@hjmds/design-contracts/recipes\";\nimport {\n createContext,\n forwardRef,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n type CSSProperties,\n type FocusEvent,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { classNames } from \"./internal.js\";\nimport { useOptionalHjmTheme } from \"./provider.js\";\nimport { createHjmThemeStyle } from \"./theme.js\";\n\n// 1.10.0: stroked SVG glyphs inside a tinted badge (toastRecipe.icon). Text glyphs (\"●\", \"i\", \"!\") rendered at\n// font metrics, so neutral read as a stray grey dot and info/danger looked like typos. currentColor = tone accent.\nconst toneGlyphPaths = {\n notifications: \"M6 8a6 6 0 1 1 12 0c0 7 3 9 3 9H3s3-2 3-9M10.3 21a1.94 1.94 0 0 0 3.4 0\",\n info: \"M12 16v-4M12 8h.01M22 12a10 10 0 1 1-20 0 10 10 0 0 1 20 0Z\",\n success: \"M20 6 9 17l-5-5\",\n warning: \"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0ZM12 9v4M12 17h.01\",\n alert: \"M12 8v4M12 16h.01M7.86 2h8.28L22 7.86v8.28L16.14 22H7.86L2 16.14V7.86Z\",\n} as const;\n\nfunction ToneGlyph({ tone }: { tone: keyof typeof toastRecipe.tones }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"18\"\n height=\"18\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n focusable=\"false\"\n >\n <path d={toneGlyphPaths[toastRecipe.tones[tone].mark]} />\n </svg>\n );\n}\n\ntype ToastCardProps = Readonly<{\n descriptor: ResolvedToastDescriptor;\n phase: \"visible\" | \"closing\";\n onAction(): void;\n onDismiss(reason: ToastDismissReason): void;\n onPointerPause?(): void;\n onPointerResume?(): void;\n onFocusPause?(): void;\n onFocusResume?(): void;\n locale?: string;\n className?: string;\n}>;\n\nconst ToastCard = forwardRef<HTMLDivElement, ToastCardProps>(function ToastCard(\n {\n descriptor,\n phase,\n onAction,\n onDismiss,\n onPointerPause,\n onPointerResume,\n onFocusPause,\n onFocusResume,\n locale,\n className,\n },\n ref,\n) {\n const baseId = useId().replaceAll(\":\", \"\");\n const titleId = `${baseId}-toast-title`;\n const descriptionId = `${baseId}-toast-description`;\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n onDismiss(\"escape\");\n }\n };\n return (\n <div\n ref={ref}\n className={classNames(\"hjm-toast\", className)}\n data-tone={descriptor.tone}\n data-state={phase}\n lang={locale}\n role=\"group\"\n aria-labelledby={descriptor.title ? titleId : undefined}\n aria-describedby={descriptionId}\n onPointerEnter={onPointerPause}\n onPointerLeave={onPointerResume}\n onFocusCapture={onFocusPause}\n onBlurCapture={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) onFocusResume?.();\n }}\n onKeyDown={handleKeyDown}\n >\n <span\n className=\"hjm-visually-hidden\"\n role={descriptor.priority === \"high\" ? \"alert\" : \"status\"}\n >\n {descriptor.announcement}\n </span>\n <span className=\"hjm-toast__tone-mark\" aria-hidden=\"true\" />\n <span className=\"hjm-toast__icon\" aria-hidden=\"true\">\n <ToneGlyph tone={descriptor.tone} />\n </span>\n <span className=\"hjm-toast__content\">\n {descriptor.title ? (\n <strong id={titleId} className=\"hjm-toast__title\">{descriptor.title}</strong>\n ) : null}\n <span id={descriptionId} className=\"hjm-toast__description\">\n {descriptor.description}\n </span>\n </span>\n {descriptor.action ? (\n <button\n type=\"button\"\n className=\"hjm-toast__action\"\n aria-label={descriptor.action.accessibilityLabel}\n onClick={onAction}\n >\n {descriptor.action.label}\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"hjm-toast__close\"\n aria-label={descriptor.closeLabel}\n onClick={() => onDismiss(\"close-action\")}\n >\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" focusable=\"false\">\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </button>\n </div>\n );\n});\n\nexport type ToastProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\" | \"title\"> &\n Readonly<{\n descriptor: ToastDescriptor;\n onDismissRequest: (reason: ToastDismissReason) => void;\n }>;\n\n/** Controlled single-toast renderer; ToastProvider supplies the full FIFO lifecycle. */\nexport const Toast = forwardRef<HTMLDivElement, ToastProps>(function Toast(\n { descriptor, onDismissRequest, className },\n ref,\n) {\n const resolved = resolveToastDescriptor(descriptor);\n const actionInvokedRef = useRef(false);\n useEffect(() => {\n actionInvokedRef.current = false;\n }, [descriptor]);\n return (\n <ToastCard\n ref={ref}\n descriptor={resolved}\n phase=\"visible\"\n {...(className === undefined ? {} : { className })}\n onDismiss={onDismissRequest}\n onAction={() => {\n const action = resolved.action;\n if (!action || actionInvokedRef.current) return;\n actionInvokedRef.current = true;\n action.onAction();\n if (action.dismissOnAction) onDismissRequest(\"action\");\n }}\n />\n );\n});\n\nexport type ToastApi = Readonly<{\n publish(descriptor: ToastDescriptor, options?: ToastPublishOptions): ToastPublishResult;\n dismiss(id: ToastId, reason: ToastDismissReason): boolean;\n close(id: ToastId): boolean;\n}>;\n\nconst ToastContext = createContext<ToastApi | null>(null);\n\nexport function useToast(): ToastApi {\n const value = useContext(ToastContext);\n if (value === null) throw new Error(\"useToast must be used inside ToastProvider\");\n return value;\n}\n\nexport type ToastProviderProps = Readonly<{\n children: ReactNode;\n label: string;\n placement?: ToastPlacement;\n store?: ToastStore;\n initialToasts?: readonly ToastDescriptor[];\n maxVisible?: number;\n maxQueued?: number;\n duplicatePolicy?: ToastDuplicatePolicy;\n timerUpdatePolicy?: ToastTimerUpdatePolicy;\n overflowPolicy?: ToastOverflowPolicy;\n portalContainer?: HTMLElement;\n /** Captured per publication so already-visible localized copy keeps its language. */\n locale?: string;\n /** Extra space above a fixed product dock, in pixels or any CSS length. */\n bottomOffset?: number | string;\n /** Optional discoverable keyboard shortcut, for example `F8`. */\n hotkey?: string;\n /** Screen-reader help associated with the viewport when `hotkey` is supplied. */\n hotkeyHelp?: string;\n}>;\n\ntype ToastPortalProps = Readonly<{\n children: ReactNode;\n container?: HTMLElement;\n}>;\n\nfunction ToastPortal({ children, container }: ToastPortalProps) {\n const [mounted, setMounted] = useState(false);\n const theme = useOptionalHjmTheme();\n useEffect(() => setMounted(true), []);\n if (!mounted) return null;\n return createPortal(\n theme ? (\n <div\n className=\"hjm-root hjm-portal\"\n data-hjm-portal=\"toast\"\n data-motion={theme.environment.reducedMotion ? \"reduced\" : \"full\"}\n data-theme={theme.environment.theme}\n data-text-scale={theme.environment.textScale}\n data-large-text={isLargeTextScale(theme.environment.textScale) ? \"true\" : undefined}\n dir={theme.environment.direction}\n style={createHjmThemeStyle(theme)}\n >\n {children}\n </div>\n ) : children,\n container ?? document.body,\n );\n}\n\nfunction renderStoreToast(\n snapshot: ToastSessionSnapshot,\n store: ToastStore,\n locale?: string,\n): ReactNode {\n if (snapshot.phase !== \"visible\" && snapshot.phase !== \"closing\") return null;\n const id = snapshot.descriptor.id;\n return (\n <ToastCard\n key={id}\n descriptor={snapshot.descriptor}\n phase={snapshot.phase}\n {...(locale === undefined ? {} : { locale })}\n onAction={() => store.invokeAction(id)}\n onDismiss={(reason) => store.dismiss(id, reason)}\n onPointerPause={() => store.pause(id, \"pointer\")}\n onPointerResume={() => store.resume(id, \"pointer\")}\n onFocusPause={() => store.pause(id, \"focus\")}\n onFocusResume={() => store.resume(id, \"focus\")}\n />\n );\n}\n\nexport function ToastProvider({\n children,\n label,\n placement = toastRecipe.defaults.placement,\n store,\n initialToasts = [],\n maxVisible,\n maxQueued,\n duplicatePolicy,\n timerUpdatePolicy,\n overflowPolicy,\n portalContainer,\n locale,\n bottomOffset = 0,\n hotkey,\n hotkeyHelp,\n}: ToastProviderProps) {\n if (label.trim().length === 0) throw new TypeError(\"ToastProvider label must not be empty\");\n if ((hotkey === undefined) !== (hotkeyHelp === undefined)) {\n throw new TypeError(\"ToastProvider hotkey and hotkeyHelp must be supplied together\");\n }\n if (hotkey !== undefined && !hotkey.trim()) {\n throw new TypeError(\"ToastProvider hotkey must not be empty\");\n }\n if (hotkeyHelp !== undefined && !hotkeyHelp.trim()) {\n throw new TypeError(\"ToastProvider hotkeyHelp must not be empty\");\n }\n if (typeof bottomOffset === \"number\" && (!Number.isFinite(bottomOffset) || bottomOffset < 0)) {\n throw new RangeError(\"ToastProvider bottomOffset must be a non-negative finite number\");\n }\n if (typeof bottomOffset === \"string\" && !bottomOffset.trim()) {\n throw new TypeError(\"ToastProvider bottomOffset must not be empty\");\n }\n const internalStoreRef = useRef<ToastStore | null>(null);\n const localeByIdRef = useRef(new Map<ToastId, string>());\n if (store === undefined && internalStoreRef.current === null) {\n internalStoreRef.current = createToastStore({\n ...(maxVisible === undefined ? {} : { maxVisible }),\n ...(maxQueued === undefined ? {} : { maxQueued }),\n ...(duplicatePolicy === undefined ? {} : { duplicatePolicy }),\n ...(timerUpdatePolicy === undefined ? {} : { timerUpdatePolicy }),\n ...(overflowPolicy === undefined ? {} : { overflowPolicy }),\n });\n for (const descriptor of initialToasts) {\n const result = internalStoreRef.current.publish(descriptor);\n if (\n locale !== undefined &&\n (result.outcome === \"added\" || result.outcome === \"updated\")\n ) {\n localeByIdRef.current.set(descriptor.id, locale);\n }\n }\n }\n const activeStore = store ?? internalStoreRef.current;\n if (activeStore === null) throw new Error(\"ToastProvider could not create a store\");\n const snapshot = useSyncExternalStore(\n activeStore.subscribe,\n activeStore.getSnapshot,\n activeStore.getSnapshot,\n );\n const theme = useOptionalHjmTheme();\n const viewportRef = useRef<HTMLDivElement>(null);\n const previousFocusRef = useRef<HTMLElement | null>(null);\n const viewportFocusedRef = useRef(false);\n const hotkeyHelpId = useId().replaceAll(\":\", \"\");\n const api = useMemo<ToastApi>(\n () => ({\n publish: (descriptor, options) => {\n const previousLocale = localeByIdRef.current.get(descriptor.id);\n if (locale === undefined) localeByIdRef.current.delete(descriptor.id);\n else localeByIdRef.current.set(descriptor.id, locale);\n try {\n const result = activeStore.publish(descriptor, options);\n if (result.outcome === \"ignored\" || result.outcome === \"discarded\") {\n if (previousLocale === undefined) localeByIdRef.current.delete(descriptor.id);\n else localeByIdRef.current.set(descriptor.id, previousLocale);\n }\n return result;\n } catch (error) {\n if (previousLocale === undefined) localeByIdRef.current.delete(descriptor.id);\n else localeByIdRef.current.set(descriptor.id, previousLocale);\n throw error;\n }\n },\n dismiss: (id, reason) => activeStore.dismiss(id, reason),\n close: (id) => activeStore.close(id),\n }),\n [activeStore, locale],\n );\n\n const disposalTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => {\n if (disposalTimerRef.current !== null) {\n clearTimeout(disposalTimerRef.current);\n disposalTimerRef.current = null;\n }\n const ownedStore = internalStoreRef.current;\n return () => {\n if (ownedStore) {\n disposalTimerRef.current = setTimeout(() => ownedStore.dispose(), 0);\n }\n };\n }, []);\n\n useEffect(() => {\n const activeIds = new Set(\n [...snapshot.visible, ...snapshot.queued].map((entry) => entry.descriptor.id),\n );\n for (const id of localeByIdRef.current.keys()) {\n if (!activeIds.has(id)) localeByIdRef.current.delete(id);\n }\n }, [snapshot]);\n\n const hasRunningTimer = snapshot.visible.some(\n (entry) => entry.timer.status === \"running\",\n );\n useEffect(() => {\n if (!hasRunningTimer) return;\n let previousTime = performance.now();\n const timer = setInterval(() => {\n const currentTime = performance.now();\n activeStore.advanceTime(currentTime - previousTime);\n previousTime = currentTime;\n }, 100);\n return () => clearInterval(timer);\n }, [activeStore, hasRunningTimer]);\n\n const closingIds = snapshot.visible\n .filter((entry) => entry.phase === \"closing\")\n .map((entry) => entry.descriptor.id)\n .join(\"\\u0000\");\n useEffect(() => {\n if (closingIds.length === 0) return;\n const ids = closingIds.split(\"\\u0000\");\n const timer = setTimeout(\n () => ids.forEach((id) => activeStore.completeExit(id)),\n theme?.environment.reducedMotion ? 0 : 160,\n );\n return () => clearTimeout(timer);\n }, [activeStore, closingIds, theme?.environment.reducedMotion]);\n\n useEffect(() => {\n const pause = () => activeStore.pauseAll(\"window\");\n const resume = () => {\n if (!document.hidden) activeStore.resumeAll(\"window\");\n };\n const handleVisibility = () => (document.hidden ? pause() : resume());\n window.addEventListener(\"blur\", pause);\n window.addEventListener(\"focus\", resume);\n window.addEventListener(\"pagehide\", pause);\n window.addEventListener(\"pageshow\", resume);\n document.addEventListener(\"visibilitychange\", handleVisibility);\n return () => {\n window.removeEventListener(\"blur\", pause);\n window.removeEventListener(\"focus\", resume);\n window.removeEventListener(\"pagehide\", pause);\n window.removeEventListener(\"pageshow\", resume);\n document.removeEventListener(\"visibilitychange\", handleVisibility);\n };\n }, [activeStore]);\n\n useEffect(() => {\n if (hotkey === undefined || snapshot.visible.length === 0) return;\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key !== hotkey) return;\n const viewport = viewportRef.current;\n if (!viewport) return;\n if (!viewport.contains(document.activeElement)) {\n previousFocusRef.current = document.activeElement as HTMLElement | null;\n }\n event.preventDefault();\n viewport.focus();\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [hotkey, snapshot.visible.length]);\n\n useEffect(() => {\n if (snapshot.visible.length > 0 || !viewportFocusedRef.current) return;\n viewportFocusedRef.current = false;\n previousFocusRef.current?.focus();\n previousFocusRef.current = null;\n }, [snapshot.visible.length]);\n\n const handleViewportFocus = (event: FocusEvent<HTMLDivElement>) => {\n const previous = event.relatedTarget;\n if (previous instanceof HTMLElement && !event.currentTarget.contains(previous)) {\n previousFocusRef.current = previous;\n }\n viewportFocusedRef.current = true;\n activeStore.pauseAll(\"focus\");\n };\n const handleViewportBlur = (event: FocusEvent<HTMLDivElement>) => {\n const next = event.relatedTarget;\n if (!(next instanceof Node) || !event.currentTarget.contains(next)) {\n viewportFocusedRef.current = false;\n activeStore.resumeAll(\"focus\");\n }\n };\n const viewportStyle = {\n \"--hjm-toast-bottom-offset\":\n typeof bottomOffset === \"number\" ? `${bottomOffset}px` : bottomOffset,\n } as CSSProperties;\n\n return (\n <ToastContext.Provider value={api}>\n {children}\n {snapshot.visible.length > 0 ? (\n <ToastPortal {...(portalContainer === undefined ? {} : { container: portalContainer })}>\n <div\n ref={viewportRef}\n className=\"hjm-toast-viewport\"\n data-placement={placement}\n role=\"region\"\n aria-label={label}\n aria-describedby={hotkeyHelp === undefined ? undefined : hotkeyHelpId}\n aria-keyshortcuts={hotkey}\n tabIndex={hotkey === undefined ? undefined : -1}\n onFocusCapture={handleViewportFocus}\n onBlurCapture={handleViewportBlur}\n style={viewportStyle}\n >\n {hotkeyHelp === undefined ? null : (\n <span id={hotkeyHelpId} className=\"hjm-visually-hidden\">{hotkeyHelp}</span>\n )}\n {snapshot.visible.map((entry) =>\n renderStoreToast(\n entry,\n activeStore,\n localeByIdRef.current.get(entry.descriptor.id),\n ))}\n </div>\n </ToastPortal>\n ) : null}\n </ToastContext.Provider>\n );\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import { type VoiceNoteDescriptor } from "@hjmds/design-contracts/voice-note";
|
|
3
|
+
export type VoiceNoteProps = Readonly<{
|
|
4
|
+
descriptor: VoiceNoteDescriptor;
|
|
5
|
+
labels: Readonly<{
|
|
6
|
+
play: string;
|
|
7
|
+
pause: string;
|
|
8
|
+
seek: string;
|
|
9
|
+
loading: string;
|
|
10
|
+
error: string;
|
|
11
|
+
retry: string;
|
|
12
|
+
backward: string;
|
|
13
|
+
forward: string;
|
|
14
|
+
}>;
|
|
15
|
+
/** Localized elapsed/duration text and slider accessible value. */
|
|
16
|
+
formatTime: (seconds: number) => string;
|
|
17
|
+
artwork?: ReactNode;
|
|
18
|
+
onPlayingChange: (playing: boolean) => void;
|
|
19
|
+
onSeek: (seconds: number) => void;
|
|
20
|
+
onRetry?: () => void;
|
|
21
|
+
}>;
|
|
22
|
+
/** Audio engine, network, file permission and playback lifecycle remain host-owned. */
|
|
23
|
+
export declare function VoiceNote({ descriptor, labels, formatTime, artwork, onPlayingChange, onSeek, onRetry }: VoiceNoteProps): import("react").JSX.Element;
|
|
24
|
+
//# sourceMappingURL=voice-note.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice-note.d.ts","sourceRoot":"","sources":["../src/voice-note.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAoB,KAAK,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAMhG,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IACpC,UAAU,EAAE,mBAAmB,CAAC;IAChC,MAAM,EAAE,QAAQ,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClJ,mEAAmE;IACnE,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IACxC,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,eAAe,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,CAAC,CAAC;AAEH,uFAAuF;AACvF,wBAAgB,SAAS,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,cAAc,+BAgBtH"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { resolveVoiceNote } from "@hjmds/design-contracts/voice-note";
|
|
3
|
+
import { Asset } from "./asset.js";
|
|
4
|
+
import { Button } from "./actions.js";
|
|
5
|
+
import { Slider } from "./slider.js";
|
|
6
|
+
import { Stack, Surface, Text } from "./layout.js";
|
|
7
|
+
/** Audio engine, network, file permission and playback lifecycle remain host-owned. */
|
|
8
|
+
export function VoiceNote({ descriptor, labels, formatTime, artwork, onPlayingChange, onSeek, onRetry }) {
|
|
9
|
+
const media = resolveVoiceNote(descriptor);
|
|
10
|
+
const error = media.state === "error";
|
|
11
|
+
return _jsx(Surface, { padding: "lg", children: _jsxs(Stack, { gap: "md", children: [_jsxs(Stack, { axis: "inline", gap: "md", children: [artwork ? _jsx(Asset, { descriptor: { kind: "image", decorative: true, shape: "circle" }, children: artwork }) : null, _jsx(Text, { emphasis: "strong", children: media.title })] }), _jsx(Slider, { label: labels.seek, min: 0, max: media.duration || 1, step: 0.1, value: media.position, disabled: !media.canSeek, onValueChange: onSeek, getValueText: formatTime }), _jsxs(Text, { tone: "muted", children: [formatTime(media.position), media.duration === null ? "" : ` / ${formatTime(media.duration)}`] }), error ? _jsx(Text, { role: "alert", children: labels.error }) : null, _jsxs(Stack, { axis: "inline", gap: "sm", children: [_jsx(Button, { disabled: !media.canPlay, loading: media.state === "loading", onClick: () => onPlayingChange(media.state !== "playing"), children: media.state === "loading" ? labels.loading : media.state === "playing" ? labels.pause : labels.play }), error && onRetry ? _jsx(Button, { disabled: media.disabled ?? false, onClick: onRetry, children: labels.retry }) : null] })] }) });
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=voice-note.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice-note.js","sourceRoot":"","sources":["../src/voice-note.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,gBAAgB,EAA4B,MAAM,oCAAoC,CAAC;AAChG,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAanD,uFAAuF;AACvF,MAAM,UAAU,SAAS,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAkB;IACrH,MAAM,KAAK,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC;IACtC,OAAO,KAAC,OAAO,IAAC,OAAO,EAAC,IAAI,YAAC,MAAC,KAAK,IAAC,GAAG,EAAC,IAAI,aAC1C,MAAC,KAAK,IAAC,IAAI,EAAC,QAAQ,EAAC,GAAG,EAAC,IAAI,aAC1B,OAAO,CAAC,CAAC,CAAC,KAAC,KAAK,IAAC,UAAU,EAAE,EAAC,IAAI,EAAC,OAAO,EAAC,UAAU,EAAC,IAAI,EAAC,KAAK,EAAC,QAAQ,EAAC,YAAG,OAAO,GAAS,CAAC,CAAC,CAAC,IAAI,EACrG,KAAC,IAAI,IAAC,QAAQ,EAAC,QAAQ,YAAE,KAAK,CAAC,KAAK,GAAQ,IACtC,EACR,KAAC,MAAM,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,GAAK,EAC9K,MAAC,IAAI,IAAC,IAAI,EAAC,OAAO,aAAE,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,IAAQ,EACxH,KAAK,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,IAAI,EAAC,OAAO,YAAE,MAAM,CAAC,KAAK,GAAQ,CAAC,CAAC,CAAC,IAAI,EACxD,MAAC,KAAK,IAAC,IAAI,EAAC,QAAQ,EAAC,GAAG,EAAC,IAAI,aAC3B,KAAC,MAAM,IAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,YAAG,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,GAAU,EAC9O,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,KAAC,MAAM,IAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAK,EAAE,OAAO,EAAE,OAAO,YAAG,MAAM,CAAC,KAAK,GAAU,CAAC,CAAC,CAAC,IAAI,IACzG,IACF,GAAU,CAAC;AACrB,CAAC","sourcesContent":["import type { ReactNode } from \"react\";\nimport { resolveVoiceNote, type VoiceNoteDescriptor } from \"@hjmds/design-contracts/voice-note\";\nimport { Asset } from \"./asset.js\";\nimport { Button } from \"./actions.js\";\nimport { Slider } from \"./slider.js\";\nimport { Stack, Surface, Text } from \"./layout.js\";\n\nexport type VoiceNoteProps = Readonly<{\n descriptor: VoiceNoteDescriptor;\n labels: Readonly<{ play: string; pause: string; seek: string; loading: string; error: string; retry: string; backward: string; forward: string }>;\n /** Localized elapsed/duration text and slider accessible value. */\n formatTime: (seconds: number) => string;\n artwork?: ReactNode;\n onPlayingChange: (playing: boolean) => void;\n onSeek: (seconds: number) => void;\n onRetry?: () => void;\n}>;\n\n/** Audio engine, network, file permission and playback lifecycle remain host-owned. */\nexport function VoiceNote({ descriptor, labels, formatTime, artwork, onPlayingChange, onSeek, onRetry }: VoiceNoteProps) {\n const media = resolveVoiceNote(descriptor);\n const error = media.state === \"error\";\n return <Surface padding=\"lg\"><Stack gap=\"md\">\n <Stack axis=\"inline\" gap=\"md\">\n {artwork ? <Asset descriptor={{kind:\"image\",decorative:true,shape:\"circle\"}}>{artwork}</Asset> : null}\n <Text emphasis=\"strong\">{media.title}</Text>\n </Stack>\n <Slider label={labels.seek} min={0} max={media.duration || 1} step={0.1} value={media.position} disabled={!media.canSeek} onValueChange={onSeek} getValueText={formatTime} />\n <Text tone=\"muted\">{formatTime(media.position)}{media.duration === null ? \"\" : ` / ${formatTime(media.duration)}`}</Text>\n {error ? <Text role=\"alert\">{labels.error}</Text> : null}\n <Stack axis=\"inline\" gap=\"sm\">\n <Button disabled={!media.canPlay} loading={media.state === \"loading\"} onClick={() => onPlayingChange(media.state !== \"playing\")}>{media.state === \"loading\" ? labels.loading : media.state === \"playing\" ? labels.pause : labels.play}</Button>\n {error && onRetry ? <Button disabled={media.disabled ?? false} onClick={onRetry}>{labels.retry}</Button> : null}\n </Stack>\n </Stack></Surface>;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hjmds/react",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.11.0",
|
|
4
4
|
"description": "Accessible React 19 renderers for HJM design contracts.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
@@ -367,7 +367,97 @@
|
|
|
367
367
|
"default": "./dist/celebration.js"
|
|
368
368
|
},
|
|
369
369
|
"./styles.css": "./dist/styles.css",
|
|
370
|
-
"./styles.layered.css": "./dist/styles.layered.css"
|
|
370
|
+
"./styles.layered.css": "./dist/styles.layered.css",
|
|
371
|
+
"./avatar-blobatar": {
|
|
372
|
+
"types": "./dist/avatar-blobatar.d.ts",
|
|
373
|
+
"import": "./dist/avatar-blobatar.js",
|
|
374
|
+
"default": "./dist/avatar-blobatar.js"
|
|
375
|
+
},
|
|
376
|
+
"./effect-surface": {
|
|
377
|
+
"types": "./dist/effect-surface.d.ts",
|
|
378
|
+
"import": "./dist/effect-surface.js",
|
|
379
|
+
"default": "./dist/effect-surface.js"
|
|
380
|
+
},
|
|
381
|
+
"./icon-lucide": {
|
|
382
|
+
"types": "./dist/icon-lucide.d.ts",
|
|
383
|
+
"import": "./dist/icon-lucide.js",
|
|
384
|
+
"default": "./dist/icon-lucide.js"
|
|
385
|
+
},
|
|
386
|
+
"./duration-field": {
|
|
387
|
+
"types": "./dist/duration-field.d.ts",
|
|
388
|
+
"import": "./dist/duration-field.js",
|
|
389
|
+
"default": "./dist/duration-field.js"
|
|
390
|
+
},
|
|
391
|
+
"./inline-confirm": {
|
|
392
|
+
"types": "./dist/inline-confirm.d.ts",
|
|
393
|
+
"import": "./dist/inline-confirm.js",
|
|
394
|
+
"default": "./dist/inline-confirm.js"
|
|
395
|
+
},
|
|
396
|
+
"./reaction-picker": {
|
|
397
|
+
"types": "./dist/reaction-picker.d.ts",
|
|
398
|
+
"import": "./dist/reaction-picker.js",
|
|
399
|
+
"default": "./dist/reaction-picker.js"
|
|
400
|
+
},
|
|
401
|
+
"./notification-bell": {
|
|
402
|
+
"types": "./dist/notification-bell.d.ts",
|
|
403
|
+
"import": "./dist/notification-bell.js",
|
|
404
|
+
"default": "./dist/notification-bell.js"
|
|
405
|
+
},
|
|
406
|
+
"./scroll-progress": {
|
|
407
|
+
"types": "./dist/scroll-progress.d.ts",
|
|
408
|
+
"import": "./dist/scroll-progress.js",
|
|
409
|
+
"default": "./dist/scroll-progress.js"
|
|
410
|
+
},
|
|
411
|
+
"./code-block": {
|
|
412
|
+
"types": "./dist/code-block.d.ts",
|
|
413
|
+
"import": "./dist/code-block.js",
|
|
414
|
+
"default": "./dist/code-block.js"
|
|
415
|
+
},
|
|
416
|
+
"./activity-heatmap": {
|
|
417
|
+
"types": "./dist/activity-heatmap.d.ts",
|
|
418
|
+
"import": "./dist/activity-heatmap.js",
|
|
419
|
+
"default": "./dist/activity-heatmap.js"
|
|
420
|
+
},
|
|
421
|
+
"./task-list": {
|
|
422
|
+
"types": "./dist/task-list.d.ts",
|
|
423
|
+
"import": "./dist/task-list.js",
|
|
424
|
+
"default": "./dist/task-list.js"
|
|
425
|
+
},
|
|
426
|
+
"./folder-preview": {
|
|
427
|
+
"types": "./dist/folder-preview.d.ts",
|
|
428
|
+
"import": "./dist/folder-preview.js",
|
|
429
|
+
"default": "./dist/folder-preview.js"
|
|
430
|
+
},
|
|
431
|
+
"./avatar-blobatar-motion": {
|
|
432
|
+
"types": "./dist/avatar-blobatar-motion.d.ts",
|
|
433
|
+
"import": "./dist/avatar-blobatar-motion.js",
|
|
434
|
+
"default": "./dist/avatar-blobatar-motion.js"
|
|
435
|
+
},
|
|
436
|
+
"./step-player": {
|
|
437
|
+
"types": "./dist/step-player.d.ts",
|
|
438
|
+
"import": "./dist/step-player.js",
|
|
439
|
+
"default": "./dist/step-player.js"
|
|
440
|
+
},
|
|
441
|
+
"./voice-note": {
|
|
442
|
+
"types": "./dist/voice-note.d.ts",
|
|
443
|
+
"import": "./dist/voice-note.js",
|
|
444
|
+
"default": "./dist/voice-note.js"
|
|
445
|
+
},
|
|
446
|
+
"./grid-reveal": {
|
|
447
|
+
"types": "./dist/grid-reveal.d.ts",
|
|
448
|
+
"import": "./dist/grid-reveal.js",
|
|
449
|
+
"default": "./dist/grid-reveal.js"
|
|
450
|
+
},
|
|
451
|
+
"./gravity-letters": {
|
|
452
|
+
"types": "./dist/gravity-letters.d.ts",
|
|
453
|
+
"import": "./dist/gravity-letters.js",
|
|
454
|
+
"default": "./dist/gravity-letters.js"
|
|
455
|
+
},
|
|
456
|
+
"./navigation-bar": {
|
|
457
|
+
"types": "./dist/navigation-bar.d.ts",
|
|
458
|
+
"import": "./dist/navigation-bar.js",
|
|
459
|
+
"default": "./dist/navigation-bar.js"
|
|
460
|
+
}
|
|
371
461
|
},
|
|
372
462
|
"files": [
|
|
373
463
|
"dist",
|
|
@@ -376,7 +466,7 @@
|
|
|
376
466
|
"THIRD_PARTY_NOTICES.md"
|
|
377
467
|
],
|
|
378
468
|
"peerDependencies": {
|
|
379
|
-
"@hjmds/design-contracts": ">=1.
|
|
469
|
+
"@hjmds/design-contracts": ">=1.11.0 <1.12.0",
|
|
380
470
|
"react": ">=19.0.0",
|
|
381
471
|
"react-dom": ">=19.0.0",
|
|
382
472
|
"@number-flow/react": "0.6.2",
|
|
@@ -386,7 +476,10 @@
|
|
|
386
476
|
"@dnd-kit/react": "0.5.0",
|
|
387
477
|
"embla-carousel-react": "8.6.0",
|
|
388
478
|
"canvas-confetti": "1.9.4",
|
|
389
|
-
"@dnd-kit/dom": "0.5.0"
|
|
479
|
+
"@dnd-kit/dom": "0.5.0",
|
|
480
|
+
"blobatar": "2.7.0",
|
|
481
|
+
"@blobatar/react": "2.7.0",
|
|
482
|
+
"lucide-react": "1.49.0"
|
|
390
483
|
},
|
|
391
484
|
"devDependencies": {
|
|
392
485
|
"@types/node": "^24.13.3",
|
|
@@ -407,7 +500,10 @@
|
|
|
407
500
|
"canvas-confetti": "1.9.4",
|
|
408
501
|
"@types/canvas-confetti": "1.9.0",
|
|
409
502
|
"@dnd-kit/dom": "0.5.0",
|
|
410
|
-
"
|
|
503
|
+
"blobatar": "2.7.0",
|
|
504
|
+
"@blobatar/react": "2.7.0",
|
|
505
|
+
"lucide-react": "1.49.0",
|
|
506
|
+
"@hjmds/design-contracts": "1.11.0"
|
|
411
507
|
},
|
|
412
508
|
"peerDependenciesMeta": {
|
|
413
509
|
"@number-flow/react": {
|
|
@@ -433,6 +529,15 @@
|
|
|
433
529
|
},
|
|
434
530
|
"@dnd-kit/dom": {
|
|
435
531
|
"optional": true
|
|
532
|
+
},
|
|
533
|
+
"blobatar": {
|
|
534
|
+
"optional": true
|
|
535
|
+
},
|
|
536
|
+
"@blobatar/react": {
|
|
537
|
+
"optional": true
|
|
538
|
+
},
|
|
539
|
+
"lucide-react": {
|
|
540
|
+
"optional": true
|
|
436
541
|
}
|
|
437
542
|
},
|
|
438
543
|
"scripts": {
|