@hjmds/react 1.17.1 → 1.18.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.
@@ -263,8 +263,9 @@
263
263
  of alignment with the text around it. */
264
264
  .hjm-button[data-tone="link"] { color: var(--hjm-color-content-brand); background: transparent; padding-inline: 0; }
265
265
  /* Toggle treatment: aria-pressed already carried the state, so without a paired
266
- visual every consumer painted the selected background in product styles. */
267
- .hjm-button[data-selected="true"], .hjm-icon-button[data-selected="true"] { color: var(--hjm-color-content-brand); background: var(--hjm-color-bg); border-color: var(--hjm-color-content-brand); }
266
+ visual every consumer painted the selected background in product styles.
267
+ Selection uses content color without an added border (2026-10-10 user request); focus stays separate. */
268
+ .hjm-button[data-selected="true"], .hjm-icon-button[data-selected="true"] { color: var(--hjm-color-content-brand); background: var(--hjm-color-bg); border-color: transparent; }
268
269
  .hjm-button:active:not(:disabled):not([aria-disabled="true"]), .hjm-icon-button:active:not(:disabled):not([aria-disabled="true"]) { opacity: var(--hjm-button-pressed-opacity); }
269
270
  .hjm-button:disabled, .hjm-icon-button:disabled { cursor: not-allowed; opacity: var(--hjm-button-disabled-opacity); }
270
271
  /* 라벨은 자르지 않고 두 줄까지 접는다(buttonRecipe.label). 잘린 행동 라벨은 무엇을 하는
@@ -311,6 +312,7 @@
311
312
  .hjm-segmented__item:has(input:focus-visible),
312
313
  .hjm-tabs__tab:focus-visible,
313
314
  .hjm-list-row:focus-visible,
315
+ .hjm-card[data-interactive="true"]:focus-visible,
314
316
  .hjm-virtual-list:focus-visible,
315
317
  .hjm-virtual-list__row:focus-visible {
316
318
  outline: var(--hjm-focus-width) solid var(--hjm-color-focus);
@@ -571,6 +573,8 @@
571
573
  }
572
574
  .hjm-bottom-navigation__indicator > :first-child { transition: transform 160ms ease; }
573
575
  .hjm-bottom-navigation__indicator[data-state="selected"] > :first-child { transform: scale(1.06); }
576
+ /* Icon-only items center the indicator in the density's minimum height instead of leaving an empty label row. */
577
+ .hjm-bottom-navigation[data-labels="hidden"] .hjm-bottom-navigation__item { justify-content: center; }
574
578
  .hjm-bottom-navigation__label { font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); font-weight: var(--hjm-font-weight-semibold); }
575
579
  .hjm-bottom-navigation__item[data-state="selected"] .hjm-bottom-navigation__label { font-weight: var(--hjm-font-weight-bold); }
576
580
  .hjm-bottom-navigation__badge {
@@ -960,6 +964,18 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
960
964
 
961
965
  /* chipRecipe.sizes (2026-10-06 follow-up): medium 44 · padding md 16 · gap xs 8, small 36 · padding sm 12 · gap xxs 4 with a
962
966
  4px vertical hit slop. Web had drawn padding 12/8 and gap 8 for both sizes. */
967
+ /* ActivityChip (2026-10-10): one 44px status pill in a header slot. Colours are the theme roles that
968
+ activityChipRecipe.emphasis references (surface/text/border, primary/onPrimary); the component sets the
969
+ recipe-only sizes as custom properties so theme.ts does not pull this opt-in contract into every graph. */
970
+ .hjm-activity-chip { display: inline-flex; align-items: center; gap: var(--hjm-space-xxs); min-block-size: var(--hjm-control-min-touch-target); max-inline-size: var(--hjm-activity-chip-max-width); min-inline-size: 0; padding-block: 0; padding-inline: var(--hjm-space-xxs) var(--hjm-space-sm); border: 1px solid var(--hjm-color-border); border-radius: 999px; color: var(--hjm-color-text); background: var(--hjm-color-surface); font: inherit; font-size: var(--hjm-type-label-size, 0.75rem); line-height: var(--hjm-type-label-line-height, 1.5); font-weight: var(--hjm-font-weight-bold); cursor: pointer; }
971
+ /* Without media the pill keeps the symmetric label inset; the media hugs the start edge like an avatar chip. */
972
+ .hjm-activity-chip:not([data-media]) { padding-inline-start: var(--hjm-space-sm); }
973
+ .hjm-activity-chip[data-emphasis="emphasis"] { border-color: var(--hjm-color-primary); color: var(--hjm-color-on-primary); background: var(--hjm-color-primary); }
974
+ .hjm-activity-chip:active { opacity: var(--hjm-activity-chip-pressed-opacity); }
975
+ .hjm-activity-chip:focus-visible { outline: 2px solid var(--hjm-color-content-brand); outline-offset: 2px; }
976
+ .hjm-activity-chip__media { flex: none; display: grid; place-items: center; inline-size: var(--hjm-activity-chip-media-size); block-size: var(--hjm-activity-chip-media-size); overflow: hidden; border-radius: 50%; }
977
+ .hjm-activity-chip__media > :is(img, svg) { inline-size: 100%; block-size: 100%; object-fit: contain; }
978
+ .hjm-activity-chip__label { min-inline-size: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
963
979
  .hjm-chip { position: relative; min-block-size: var(--hjm-control-min-touch-target); display: inline-flex; align-items: center; gap: var(--hjm-space-xs); padding-inline: var(--hjm-space-md); border: 1px solid var(--hjm-color-border); border-radius: 999px; background: var(--hjm-color-bg); color: var(--hjm-color-text-body); font: inherit; font-weight: var(--hjm-font-weight-medium); cursor: pointer; }
964
980
  .hjm-chip[data-size="small"] { min-block-size: 36px; padding-inline: var(--hjm-space-sm); gap: var(--hjm-space-xxs); }
965
981
  .hjm-chip[data-size="small"]::after { content: ""; position: absolute; inset: -4px 0; }
@@ -2532,7 +2548,17 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2532
2548
  .hjm-toast__description { color: var(--hjm-toast-description-color); line-height: var(--hjm-toast-description-line-height, 1.45); }
2533
2549
  .hjm-toast__close { grid-column: 3; grid-row: 1; align-self: start; display: grid; place-items: center; inline-size: var(--hjm-control-min-touch-target); min-block-size: var(--hjm-control-min-touch-target); margin-block-start: calc(-1 * var(--hjm-space-xxs)); border: 0; border-radius: 50%; color: var(--hjm-color-text-muted); background: transparent; cursor: pointer; }
2534
2550
  .hjm-toast__close:hover { color: var(--hjm-color-text); }
2535
- .hjm-toast__action { grid-column: 2 / -1; grid-row: 2; justify-self: end; margin-inline-end: var(--hjm-space-xs); min-block-size: var(--hjm-control-min-touch-target); max-inline-size: 100%; padding-inline: var(--hjm-space-md); border: 0; border-radius: 999px; color: var(--hjm-toast-action-color); background: var(--hjm-toast-action-background); font: inherit; font-weight: var(--hjm-font-weight-bold); overflow-wrap: anywhere; text-align: center; cursor: pointer; }
2551
+ /* 2026-10-10 panel toast: product media replaces the tone badge in the leading column (toastRecipe.media),
2552
+ and a running task shows its steps under the description (toastRecipe.progress). */
2553
+ .hjm-toast__media { grid-column: 1; grid-row: 1; align-self: start; display: grid; place-items: center; inline-size: var(--hjm-toast-media-size); block-size: var(--hjm-toast-media-size); overflow: hidden; border-radius: 50%; }
2554
+ .hjm-toast__media > :is(img, svg) { inline-size: 100%; block-size: 100%; object-fit: contain; }
2555
+ .hjm-toast__progress { display: flex; flex-wrap: wrap; align-items: center; gap: var(--hjm-space-xxs) var(--hjm-toast-progress-gap); margin: var(--hjm-space-xxs) 0 0; padding: 0; list-style: none; font-size: var(--hjm-type-caption-size, 0.75rem); line-height: var(--hjm-type-caption-line-height, 1.4); }
2556
+ .hjm-toast__progress-step { display: inline-flex; align-items: center; gap: var(--hjm-space-xxs); color: var(--hjm-toast-progress-label); }
2557
+ .hjm-toast__progress-dot { flex: none; inline-size: var(--hjm-toast-progress-dot); block-size: var(--hjm-toast-progress-dot); border-radius: 50%; background: var(--hjm-toast-progress-upcoming); }
2558
+ .hjm-toast__progress-step[data-state="done"] .hjm-toast__progress-dot { background: var(--hjm-toast-progress-done); }
2559
+ .hjm-toast__progress-step[data-state="current"] { color: var(--hjm-toast-progress-current-label); font-weight: var(--hjm-font-weight-bold); }
2560
+ .hjm-toast__progress-step[data-state="current"] .hjm-toast__progress-dot { background: var(--hjm-toast-progress-done); transform: scale(var(--hjm-toast-progress-current-scale)); }
2561
+ .hjm-toast__action { grid-column: 2 / -1; grid-row: 2; justify-self: var(--hjm-toast-action-align, start); margin-inline-end: var(--hjm-space-xs); min-block-size: var(--hjm-control-min-touch-target); max-inline-size: 100%; padding-inline: var(--hjm-space-md); border: 0; border-radius: 999px; color: var(--hjm-toast-action-color); background: var(--hjm-toast-action-background); font: inherit; font-weight: var(--hjm-font-weight-bold); overflow-wrap: anywhere; text-align: center; cursor: pointer; }
2536
2562
  .hjm-toast__action:hover { filter: brightness(0.97); }
2537
2563
  .hjm-toast[data-state="closing"] { opacity: 0; transform: translateY(var(--hjm-space-xs)); transition: opacity var(--hjm-toast-exit-duration) var(--hjm-toast-exit-easing), transform var(--hjm-toast-exit-duration) var(--hjm-toast-exit-easing); }
2538
2564
 
@@ -2886,6 +2912,11 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2886
2912
  .hjm-chat-message[data-direction="outgoing"] .hjm-chat-message__content { align-items: flex-end; }
2887
2913
  .hjm-chat-message__bubble { border: var(--hjm-stroke-default) solid var(--hjm-color-border); border-radius: var(--hjm-radius-lg); background: var(--hjm-color-bg); padding: var(--hjm-space-sm); overflow-wrap: anywhere; white-space: pre-wrap; }
2888
2914
  .hjm-chat-message[data-direction="outgoing"] .hjm-chat-message__bubble { background: var(--hjm-color-surface-accent); }
2915
+ /* One surface and a partial border join the tip to the body without an interior seam. */
2916
+ .hjm-chat-message[data-tail] .hjm-chat-message__bubble { position: relative; }
2917
+ .hjm-chat-message[data-tail] .hjm-chat-message__bubble::before { content: ""; position: absolute; bottom: var(--hjm-space-sm); inset-inline-start: -5px; width: 8px; height: 8px; background: var(--hjm-color-bg); border-inline-start: var(--hjm-stroke-default) solid var(--hjm-color-border); border-bottom: var(--hjm-stroke-default) solid var(--hjm-color-border); transform: rotate(45deg); pointer-events: none; }
2918
+ .hjm-chat-message[data-tail][data-direction="outgoing"] .hjm-chat-message__bubble::before { inset-inline-start: auto; inset-inline-end: -5px; background: var(--hjm-color-surface-accent); border-inline-start: 0; border-inline-end: var(--hjm-stroke-default) solid var(--hjm-color-border); transform: rotate(-45deg); }
2919
+
2889
2920
  .hjm-chat-message__meta { display: flex; align-items: center; gap: var(--hjm-space-xs); }
2890
2921
  .hjm-chat-message__reply { border-inline-start: 2px solid var(--hjm-color-content-brand); padding-inline-start: var(--hjm-space-xs); margin-block-end: var(--hjm-space-xs); }
2891
2922
 
@@ -2983,4 +3014,9 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2983
3014
  .hjm-screen[data-presentation="editorial"] .hjm-screen__heading,
2984
3015
  .hjm-screen[data-presentation="landscape"] .hjm-screen__heading { flex: 0 1 auto; inline-size: 100%; }
2985
3016
 
3017
+ /* Whole-card activation shares native button keyboard semantics and control targets. */
3018
+ .hjm-card[data-interactive="true"] { font: inherit; color: inherit; text-align: inherit; cursor: pointer; min-inline-size: var(--hjm-control-min-touch-target); min-block-size: var(--hjm-control-min-touch-target); }
3019
+ .hjm-card[data-interactive="true"]:active:not(:disabled) { opacity: var(--hjm-card-pressed-opacity); }
3020
+ .hjm-card[data-interactive="true"]:disabled { opacity: var(--hjm-card-disabled-opacity); cursor: default; }
3021
+
2986
3022
  }
@@ -1 +1 @@
1
- {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAkBA,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,2DAA2D,CAAC;AAgBnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,MAAM,MAAM,aAAa,GAAG,aAAa,GACvC,MAAM,CAAC,SAAS,MAAM,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;AAmB7C,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,yBAAyB,GAC/B,aAAa,CAmLf"}
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAkBA,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,2DAA2D,CAAC;AAgBnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,MAAM,MAAM,aAAa,GAAG,aAAa,GACvC,MAAM,CAAC,SAAS,MAAM,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;AAmB7C,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,yBAAyB,GAC/B,aAAa,CA6Lf"}
package/dist/theme.js CHANGED
@@ -154,6 +154,16 @@ export function createHjmThemeStyle(value) {
154
154
  style["--hjm-toast-action-background"] = resolveColorReference(toastRecipe.action.background, palette);
155
155
  style["--hjm-toast-action-color"] = resolveColorReference(toastRecipe.action.color, palette);
156
156
  style["--hjm-toast-description-color"] = resolveColorReference(toastRecipe.description.color, palette);
157
+ // Panel toast (2026-10-10): media column, step progress and action alignment come from the same recipe Native reads.
158
+ style["--hjm-toast-media-size"] = `${toastRecipe.media.size}px`;
159
+ style["--hjm-toast-action-align"] = toastRecipe.action.align;
160
+ style["--hjm-toast-progress-gap"] = `${toastRecipe.progress.gap}px`;
161
+ style["--hjm-toast-progress-dot"] = `${toastRecipe.progress.dotSize}px`;
162
+ style["--hjm-toast-progress-current-scale"] = String(toastRecipe.progress.currentScale);
163
+ style["--hjm-toast-progress-done"] = resolveColorReference(toastRecipe.progress.doneColor, palette);
164
+ style["--hjm-toast-progress-upcoming"] = resolveColorReference(toastRecipe.progress.upcomingColor, palette);
165
+ style["--hjm-toast-progress-label"] = resolveColorReference(toastRecipe.progress.labelColor, palette);
166
+ style["--hjm-toast-progress-current-label"] = resolveColorReference(toastRecipe.progress.currentLabelColor, palette);
157
167
  const toastExit = toastRecipe.transition.web.exit;
158
168
  style["--hjm-toast-exit-duration"] = environment.reducedMotion ? "0ms" : `${toastExit.duration}ms`;
159
169
  style["--hjm-toast-exit-easing"] = `cubic-bezier(${easing[toastExit.easing].join(", ")})`;
package/dist/theme.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"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","sourcesContent":["import { resolveSurfaceFillOpacity } from \"@hjmds/design-contracts/palette-contrast\";\nimport {\n backdrop,\n control,\n easing,\n fontFamily,\n resolveFontFamilyStack,\n fontWeight,\n motion,\n layer,\n radius,\n shadow,\n spacing,\n stroke,\n typography,\n} from \"@hjmds/design-contracts/foundations\";\nimport { resolveColorReference } from \"@hjmds/design-contracts/color-references\";\nimport { focusIndicatorContract } from \"@hjmds/design-contracts/contracts\";\nimport {\n visibleControlHeight,\n type DesignSystemProviderValue,\n} from \"@hjmds/design-contracts/components/design-system-provider\";\nimport { buttonRecipe, fieldRecipe } from \"@hjmds/design-contracts/recipes/base\";\nimport {\n bottomNavigationRecipe,\n comboboxRecipe,\n dialogRecipe,\n listRowRecipe,\n menuRecipe,\n searchFieldRecipe,\n selectRecipe,\n sheetRecipe,\n skeletonRecipe,\n tooltipRecipe,\n switchRecipe,\n toastRecipe,\n} from \"@hjmds/design-contracts/recipes\";\nimport type { CSSProperties } from \"react\";\n\nexport type HjmThemeStyle = CSSProperties &\n Record<`--hjm-${string}`, string | number>;\n\nfunction kebab(value: string): string {\n return value.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n}\n\ntype ShadowToken = Readonly<{ color: string; opacity: number; radius: number; offsetY: number }>;\n\n// RN shadow token -> CSS; blur = radius, as react-native-web maps it.\nfunction shadowCss(token: ShadowToken, offsetX = 0): string {\n const hex = token.color.replace(\"#\", \"\");\n const [r, g, b] = [0, 2, 4].map((start) => Number.parseInt(hex.slice(start, start + 2), 16));\n return `${offsetX}px ${token.offsetY}px ${token.radius}px rgb(${r} ${g} ${b} / ${Math.round(token.opacity * 100)}%)`;\n}\n\nfunction rem(value: number): string {\n return `${Number((value / 16).toFixed(5))}rem`;\n}\n\nexport function createHjmThemeStyle(\n value: DesignSystemProviderValue,\n): HjmThemeStyle {\n const { environment, palette } = value;\n const profileTokens = value.designProfile?.tokens;\n const style: HjmThemeStyle = {\n \"--hjm-backdrop-modal\": `color-mix(in srgb, ${backdrop.modal.color} ${backdrop.modal.opacity * 100}%, transparent)`,\n \"--hjm-text-scale\": environment.textScale,\n \"--hjm-motion-scale\": environment.reducedMotion ? 0 : 1,\n colorScheme: environment.theme,\n backgroundColor: palette.theme.bg,\n color: palette.theme.text,\n };\n\n for (const [name, color] of Object.entries(palette.theme)) {\n style[`--hjm-color-${kebab(name)}`] = color;\n }\n for (const [name, color] of Object.entries(palette.statusAccents)) {\n style[`--hjm-accent-${kebab(name)}`] = color;\n }\n for (const [name, color] of Object.entries(palette.statusAccentFills)) {\n style[`--hjm-accent-fill-${kebab(name)}`] = color;\n }\n for (const [name, value] of Object.entries(spacing)) {\n style[`--hjm-space-${kebab(name)}`] = `${value}px`;\n }\n for (const [name, value] of Object.entries(profileTokens?.radius ?? radius)) {\n style[`--hjm-radius-${kebab(name)}`] = `${value}px`;\n }\n for (const [name, value] of Object.entries(profileTokens?.typography ?? typography)) {\n style[`--hjm-type-${kebab(name)}-size`] =\n `calc(${rem(value.fontSize)} * var(--hjm-text-scale))`;\n style[`--hjm-type-${kebab(name)}-line-height`] =\n `calc(${rem(value.lineHeight)} * var(--hjm-text-scale))`;\n style[`--hjm-type-${kebab(name)}-weight`] = value.fontWeight;\n }\n for (const [name, value] of Object.entries(fontWeight)) {\n style[`--hjm-font-weight-${kebab(name)}`] = value;\n }\n for (const [name, value] of Object.entries(motion)) {\n style[`--hjm-motion-${kebab(name)}`] = environment.reducedMotion\n ? \"0ms\"\n : `${value}ms`;\n }\n\n style[\"--hjm-font-family-ui\"] = (profileTokens?.fontFamily.ui ?? fontFamily.ui).join(\", \");\n style[\"--hjm-font-family-code\"] = (profileTokens?.fontFamily.code ?? fontFamily.code).join(\", \");\n // Roles resolve from the nearest Provider, including portal/nested reset contexts.\n for (const role of [\"display\", \"reading\"] as const) {\n style[`--hjm-font-family-${role}`] = resolveFontFamilyStack(profileTokens?.fontFamily ?? fontFamily, role).join(\", \");\n }\n for (const [name, value] of Object.entries(stroke)) {\n style[`--hjm-stroke-${kebab(name)}`] = `${value}px`;\n }\n // Unset before 1.4.1, so focus rules were invalid and drew no ring.\n style[\"--hjm-color-focus\"] = resolveColorReference(focusIndicatorContract.color, palette);\n style[\"--hjm-focus-width\"] = `${focusIndicatorContract.width}px`;\n style[\"--hjm-focus-offset\"] = `${focusIndicatorContract.offset}px`;\n style[\"--hjm-bottom-navigation-pressed-background\"] = resolveColorReference(\n bottomNavigationRecipe.states.pressedBackground,\n palette,\n );\n // Row rhythm and the leading frame come from the recipe so the stylesheet\n // does not carry a second copy of the same numbers.\n style[\"--hjm-list-row-gap\"] = rem(listRowRecipe.gap);\n style[\"--hjm-list-row-leading-size\"] = rem(listRowRecipe.leadingSize);\n for (const [name, value] of Object.entries(switchRecipe.sizes)) {\n style[`--hjm-switch-${kebab(name)}-width`] = rem(value.width);\n style[`--hjm-switch-${kebab(name)}-height`] = rem(value.height);\n style[`--hjm-switch-${kebab(name)}-thumb`] = rem(value.thumb);\n style[`--hjm-switch-${kebab(name)}-inset`] = rem(value.inset);\n style[`--hjm-switch-${kebab(name)}-offset`] = rem(\n value.width - value.thumb - value.inset * 2,\n );\n }\n for (const [name, value] of Object.entries(listRowRecipe.density)) {\n style[`--hjm-list-row-${kebab(name)}-one-line`] = rem(value.oneLineMinHeight);\n style[`--hjm-list-row-${kebab(name)}-two-line`] = rem(value.twoLineMinHeight);\n style[`--hjm-list-row-${kebab(name)}-padding-inline`] = rem(value.paddingHorizontal);\n style[`--hjm-list-row-${kebab(name)}-padding-block`] = rem(value.paddingVertical);\n }\n // The recipe owns these; a second copy in the stylesheet drifts silently\n // because the gates read that file as text only. Block and text heights\n // already resolve through --hjm-space-*, so they are not re-emitted.\n const skeletonCurve = easing[skeletonRecipe.animation.easing];\n style[\"--hjm-skeleton-circle-size\"] =\n `${skeletonRecipe.shapes.circle.defaultHeight}px`;\n style[\"--hjm-skeleton-duration\"] = `${skeletonRecipe.animation.duration}ms`;\n style[\"--hjm-skeleton-easing\"] = `cubic-bezier(${skeletonCurve.join(\", \")})`;\n style[\"--hjm-skeleton-from-opacity\"] = skeletonRecipe.animation.fromOpacity;\n style[\"--hjm-skeleton-to-opacity\"] = skeletonRecipe.animation.toOpacity;\n // Export the shared order instead of keeping a second numeric scale in CSS.\n for (const [name, value] of Object.entries(layer)) {\n style[`--hjm-layer-${kebab(name)}`] = value;\n }\n for (const [name, token] of Object.entries(profileTokens?.shadow ?? shadow)) {\n style[`--hjm-shadow-${kebab(name)}`] = shadowCss(token);\n }\n const surfaceMaterial = value.designProfile?.material.surface;\n // Defaults are emitted on every Provider, so a nested neutral profile clears\n // inherited glass/clay. Unsupported transparency remains an opaque CSS fill.\n style[\"--hjm-surface-blur\"] = surfaceMaterial?.blurStrength ? `blur(${surfaceMaterial.blurStrength * 32}px)` : \"none\";\n style[\"--hjm-surface-fill-opacity\"] = surfaceMaterial?.blurStrength ? resolveSurfaceFillOpacity(surfaceMaterial.fillOpacity, palette.theme) : 1;\n const insetShadow = surfaceMaterial?.insetShadows.length\n ? surfaceMaterial.insetShadows.map(token => `inset ${shadowCss(token, token.offsetX)}`).join(\", \")\n : \"\";\n style[\"--hjm-surface-inset-shadow\"] = insetShadow || \"none\";\n style[\"--hjm-surface-raised-shadow\"] = shadowCss(profileTokens?.shadow.floating ?? shadow.floating) + (insetShadow ? `, ${insetShadow}` : \"\");\n // BottomCTA overlaps content above it (bottomCtaRecipe rationale). Profile\n // strength is shared, but its shadow must cast upward rather than behind the\n // footer; preserve the stylesheet-only legacy path when no profile is supplied.\n style[\"--hjm-bottom-cta-shadow\"] = profileTokens\n ? shadowCss({ ...profileTokens.shadow.floating, offsetY: -Math.abs(profileTokens.shadow.floating.offsetY) })\n : \"none\";\n // Toast body metrics follow a selected profile; emit legacy values when no profile is selected\n // instead of inheriting a parent profile or changing standalone presentation.\n style[\"--hjm-toast-title-line-height\"] = profileTokens ? \"var(--hjm-type-body-line-height)\" : \"1.35\";\n style[\"--hjm-toast-description-line-height\"] = profileTokens ? \"var(--hjm-type-body-line-height)\" : \"1.45\";\n // Overlay chrome and sizes come from the recipes Native reads (1.5.0).\n for (const [name, chrome] of [[\"dialog\", dialogRecipe.content], [\"sheet\", sheetRecipe.content], [\"toast\", toastRecipe.surface]] as const) {\n style[`--hjm-${name}-background`] = resolveColorReference(chrome.background, palette);\n style[`--hjm-${name}-border`] = resolveColorReference(chrome.border, palette);\n style[`--hjm-${name}-border-width`] = `${chrome.borderWidth}px`;\n style[`--hjm-${name}-radius`] = `var(--hjm-radius-${chrome.radius})`;\n // Recipes select the floating role. Resolve its value from the profile so\n // dialogs, sheets and toasts cannot retain neutral shadows after a theme switch.\n style[`--hjm-${name}-shadow`] = shadowCss(profileTokens?.shadow.floating ?? chrome.shadow);\n }\n style[\"--hjm-sheet-max-height\"] = `${sheetRecipe.content.maxHeightRatio * 100}dvh`;\n style[\"--hjm-sheet-max-width\"] = `${sheetRecipe.web.maxWidth}px`;\n style[\"--hjm-sheet-handle-width\"] = `${sheetRecipe.handle.width}px`;\n style[\"--hjm-sheet-handle-height\"] = `${sheetRecipe.handle.height}px`;\n style[\"--hjm-sheet-handle-color\"] = resolveColorReference(sheetRecipe.handle.color, palette);\n for (const [name, ratio] of Object.entries(sheetRecipe.sizes)) {\n if (ratio !== null) style[`--hjm-sheet-size-${name}`] = `${ratio * 100}dvh`;\n }\n // Toast badge/action colours resolve from the recipe so Web and Native share one tone table (1.10.0).\n for (const [tone, contract] of Object.entries(toastRecipe.tones)) {\n style[`--hjm-toast-accent-${tone}`] = resolveColorReference(contract.accent, palette);\n style[`--hjm-toast-badge-${tone}`] = resolveColorReference(contract.badge, palette);\n }\n style[\"--hjm-toast-badge-size\"] = `${toastRecipe.icon.badgeDiameter}px`;\n style[\"--hjm-toast-action-background\"] = resolveColorReference(toastRecipe.action.background, palette);\n style[\"--hjm-toast-action-color\"] = resolveColorReference(toastRecipe.action.color, palette);\n style[\"--hjm-toast-description-color\"] = resolveColorReference(toastRecipe.description.color, palette);\n const toastExit = toastRecipe.transition.web.exit;\n style[\"--hjm-toast-exit-duration\"] = environment.reducedMotion ? \"0ms\" : `${toastExit.duration}ms`;\n style[\"--hjm-toast-exit-easing\"] = `cubic-bezier(${easing[toastExit.easing].join(\", \")})`;\n // SearchField geometry comes from searchFieldRecipe (2026-10-06 follow-up). Web had drawn TextField's\n // 16px padding for both sizes and a 44px clear button even at `medium`, where the recipe and Native\n // use a 36 circle with a 4px hit slop (44 target, 36 footprint).\n for (const [name, size] of Object.entries(searchFieldRecipe.sizes)) {\n style[`--hjm-search-field-padding-${name}`] = `${size.paddingHorizontal}px`;\n style[`--hjm-search-field-gap-${name}`] = `${size.gap}px`;\n style[`--hjm-search-field-clear-${name}`] = `${size.clearDiameter}px`;\n style[`--hjm-search-field-clear-slop-${name}`] = `${size.clearHitSlop}px`;\n }\n style[\"--hjm-tooltip-max-width\"] = `${tooltipRecipe.content.maxWidth}px`;\n style[\"--hjm-tooltip-padding\"] = `${tooltipRecipe.surface.padding}px`;\n // Floating collection surfaces read their padding from the recipe (2026-10-06): the stylesheet's 4 had drifted from 8.\n style[\"--hjm-menu-padding\"] = `${menuRecipe.surface.padding}px`;\n style[\"--hjm-select-popover-padding\"] = `${selectRecipe.popover.padding}px`;\n style[\"--hjm-combobox-popover-padding\"] = `${comboboxRecipe.popover.padding}px`;\n style[\"--hjm-tooltip-collision-padding\"] = `${tooltipRecipe.positioning.collisionPadding}px`;\n style[\"--hjm-button-pressed-opacity\"] = buttonRecipe.opacity.pressed;\n style[\"--hjm-button-disabled-opacity\"] = buttonRecipe.opacity.disabled;\n style[\"--hjm-field-border-width\"] = `${fieldRecipe.borderWidth}px`;\n style[\"--hjm-field-focus-ring-width\"] = `${fieldRecipe.focusRingWidth}px`;\n style[\"--hjm-field-disabled-opacity\"] = fieldRecipe.disabledOpacity;\n style[\"--hjm-control-min-touch-target\"] = `${control.minTouchTarget}px`;\n style[\"--hjm-control-field-height\"] = `${control.fieldHeight}px`;\n style[\"--hjm-field-multiline-min-height\"] = rem(fieldRecipe.multilineMinHeight);\n style[\"--hjm-field-padding-block\"] = rem(fieldRecipe.paddingVertical);\n for (const [name, value] of Object.entries(control.buttonHeight)) {\n // The axis is applied to the emitted variables rather than to each rule so\n // that every stylesheet consumer of a control height honours it at once.\n style[`--hjm-control-button-${kebab(name)}`] =\n `${visibleControlHeight(value, environment.minimumVisualTarget)}px`;\n }\n\n return style;\n}\n"]}
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"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","sourcesContent":["import { resolveSurfaceFillOpacity } from \"@hjmds/design-contracts/palette-contrast\";\nimport {\n backdrop,\n control,\n easing,\n fontFamily,\n resolveFontFamilyStack,\n fontWeight,\n motion,\n layer,\n radius,\n shadow,\n spacing,\n stroke,\n typography,\n} from \"@hjmds/design-contracts/foundations\";\nimport { resolveColorReference } from \"@hjmds/design-contracts/color-references\";\nimport { focusIndicatorContract } from \"@hjmds/design-contracts/contracts\";\nimport {\n visibleControlHeight,\n type DesignSystemProviderValue,\n} from \"@hjmds/design-contracts/components/design-system-provider\";\nimport { buttonRecipe, fieldRecipe } from \"@hjmds/design-contracts/recipes/base\";\nimport {\n bottomNavigationRecipe,\n comboboxRecipe,\n dialogRecipe,\n listRowRecipe,\n menuRecipe,\n searchFieldRecipe,\n selectRecipe,\n sheetRecipe,\n skeletonRecipe,\n tooltipRecipe,\n switchRecipe,\n toastRecipe,\n} from \"@hjmds/design-contracts/recipes\";\nimport type { CSSProperties } from \"react\";\n\nexport type HjmThemeStyle = CSSProperties &\n Record<`--hjm-${string}`, string | number>;\n\nfunction kebab(value: string): string {\n return value.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n}\n\ntype ShadowToken = Readonly<{ color: string; opacity: number; radius: number; offsetY: number }>;\n\n// RN shadow token -> CSS; blur = radius, as react-native-web maps it.\nfunction shadowCss(token: ShadowToken, offsetX = 0): string {\n const hex = token.color.replace(\"#\", \"\");\n const [r, g, b] = [0, 2, 4].map((start) => Number.parseInt(hex.slice(start, start + 2), 16));\n return `${offsetX}px ${token.offsetY}px ${token.radius}px rgb(${r} ${g} ${b} / ${Math.round(token.opacity * 100)}%)`;\n}\n\nfunction rem(value: number): string {\n return `${Number((value / 16).toFixed(5))}rem`;\n}\n\nexport function createHjmThemeStyle(\n value: DesignSystemProviderValue,\n): HjmThemeStyle {\n const { environment, palette } = value;\n const profileTokens = value.designProfile?.tokens;\n const style: HjmThemeStyle = {\n \"--hjm-backdrop-modal\": `color-mix(in srgb, ${backdrop.modal.color} ${backdrop.modal.opacity * 100}%, transparent)`,\n \"--hjm-text-scale\": environment.textScale,\n \"--hjm-motion-scale\": environment.reducedMotion ? 0 : 1,\n colorScheme: environment.theme,\n backgroundColor: palette.theme.bg,\n color: palette.theme.text,\n };\n\n for (const [name, color] of Object.entries(palette.theme)) {\n style[`--hjm-color-${kebab(name)}`] = color;\n }\n for (const [name, color] of Object.entries(palette.statusAccents)) {\n style[`--hjm-accent-${kebab(name)}`] = color;\n }\n for (const [name, color] of Object.entries(palette.statusAccentFills)) {\n style[`--hjm-accent-fill-${kebab(name)}`] = color;\n }\n for (const [name, value] of Object.entries(spacing)) {\n style[`--hjm-space-${kebab(name)}`] = `${value}px`;\n }\n for (const [name, value] of Object.entries(profileTokens?.radius ?? radius)) {\n style[`--hjm-radius-${kebab(name)}`] = `${value}px`;\n }\n for (const [name, value] of Object.entries(profileTokens?.typography ?? typography)) {\n style[`--hjm-type-${kebab(name)}-size`] =\n `calc(${rem(value.fontSize)} * var(--hjm-text-scale))`;\n style[`--hjm-type-${kebab(name)}-line-height`] =\n `calc(${rem(value.lineHeight)} * var(--hjm-text-scale))`;\n style[`--hjm-type-${kebab(name)}-weight`] = value.fontWeight;\n }\n for (const [name, value] of Object.entries(fontWeight)) {\n style[`--hjm-font-weight-${kebab(name)}`] = value;\n }\n for (const [name, value] of Object.entries(motion)) {\n style[`--hjm-motion-${kebab(name)}`] = environment.reducedMotion\n ? \"0ms\"\n : `${value}ms`;\n }\n\n style[\"--hjm-font-family-ui\"] = (profileTokens?.fontFamily.ui ?? fontFamily.ui).join(\", \");\n style[\"--hjm-font-family-code\"] = (profileTokens?.fontFamily.code ?? fontFamily.code).join(\", \");\n // Roles resolve from the nearest Provider, including portal/nested reset contexts.\n for (const role of [\"display\", \"reading\"] as const) {\n style[`--hjm-font-family-${role}`] = resolveFontFamilyStack(profileTokens?.fontFamily ?? fontFamily, role).join(\", \");\n }\n for (const [name, value] of Object.entries(stroke)) {\n style[`--hjm-stroke-${kebab(name)}`] = `${value}px`;\n }\n // Unset before 1.4.1, so focus rules were invalid and drew no ring.\n style[\"--hjm-color-focus\"] = resolveColorReference(focusIndicatorContract.color, palette);\n style[\"--hjm-focus-width\"] = `${focusIndicatorContract.width}px`;\n style[\"--hjm-focus-offset\"] = `${focusIndicatorContract.offset}px`;\n style[\"--hjm-bottom-navigation-pressed-background\"] = resolveColorReference(\n bottomNavigationRecipe.states.pressedBackground,\n palette,\n );\n // Row rhythm and the leading frame come from the recipe so the stylesheet\n // does not carry a second copy of the same numbers.\n style[\"--hjm-list-row-gap\"] = rem(listRowRecipe.gap);\n style[\"--hjm-list-row-leading-size\"] = rem(listRowRecipe.leadingSize);\n for (const [name, value] of Object.entries(switchRecipe.sizes)) {\n style[`--hjm-switch-${kebab(name)}-width`] = rem(value.width);\n style[`--hjm-switch-${kebab(name)}-height`] = rem(value.height);\n style[`--hjm-switch-${kebab(name)}-thumb`] = rem(value.thumb);\n style[`--hjm-switch-${kebab(name)}-inset`] = rem(value.inset);\n style[`--hjm-switch-${kebab(name)}-offset`] = rem(\n value.width - value.thumb - value.inset * 2,\n );\n }\n for (const [name, value] of Object.entries(listRowRecipe.density)) {\n style[`--hjm-list-row-${kebab(name)}-one-line`] = rem(value.oneLineMinHeight);\n style[`--hjm-list-row-${kebab(name)}-two-line`] = rem(value.twoLineMinHeight);\n style[`--hjm-list-row-${kebab(name)}-padding-inline`] = rem(value.paddingHorizontal);\n style[`--hjm-list-row-${kebab(name)}-padding-block`] = rem(value.paddingVertical);\n }\n // The recipe owns these; a second copy in the stylesheet drifts silently\n // because the gates read that file as text only. Block and text heights\n // already resolve through --hjm-space-*, so they are not re-emitted.\n const skeletonCurve = easing[skeletonRecipe.animation.easing];\n style[\"--hjm-skeleton-circle-size\"] =\n `${skeletonRecipe.shapes.circle.defaultHeight}px`;\n style[\"--hjm-skeleton-duration\"] = `${skeletonRecipe.animation.duration}ms`;\n style[\"--hjm-skeleton-easing\"] = `cubic-bezier(${skeletonCurve.join(\", \")})`;\n style[\"--hjm-skeleton-from-opacity\"] = skeletonRecipe.animation.fromOpacity;\n style[\"--hjm-skeleton-to-opacity\"] = skeletonRecipe.animation.toOpacity;\n // Export the shared order instead of keeping a second numeric scale in CSS.\n for (const [name, value] of Object.entries(layer)) {\n style[`--hjm-layer-${kebab(name)}`] = value;\n }\n for (const [name, token] of Object.entries(profileTokens?.shadow ?? shadow)) {\n style[`--hjm-shadow-${kebab(name)}`] = shadowCss(token);\n }\n const surfaceMaterial = value.designProfile?.material.surface;\n // Defaults are emitted on every Provider, so a nested neutral profile clears\n // inherited glass/clay. Unsupported transparency remains an opaque CSS fill.\n style[\"--hjm-surface-blur\"] = surfaceMaterial?.blurStrength ? `blur(${surfaceMaterial.blurStrength * 32}px)` : \"none\";\n style[\"--hjm-surface-fill-opacity\"] = surfaceMaterial?.blurStrength ? resolveSurfaceFillOpacity(surfaceMaterial.fillOpacity, palette.theme) : 1;\n const insetShadow = surfaceMaterial?.insetShadows.length\n ? surfaceMaterial.insetShadows.map(token => `inset ${shadowCss(token, token.offsetX)}`).join(\", \")\n : \"\";\n style[\"--hjm-surface-inset-shadow\"] = insetShadow || \"none\";\n style[\"--hjm-surface-raised-shadow\"] = shadowCss(profileTokens?.shadow.floating ?? shadow.floating) + (insetShadow ? `, ${insetShadow}` : \"\");\n // BottomCTA overlaps content above it (bottomCtaRecipe rationale). Profile\n // strength is shared, but its shadow must cast upward rather than behind the\n // footer; preserve the stylesheet-only legacy path when no profile is supplied.\n style[\"--hjm-bottom-cta-shadow\"] = profileTokens\n ? shadowCss({ ...profileTokens.shadow.floating, offsetY: -Math.abs(profileTokens.shadow.floating.offsetY) })\n : \"none\";\n // Toast body metrics follow a selected profile; emit legacy values when no profile is selected\n // instead of inheriting a parent profile or changing standalone presentation.\n style[\"--hjm-toast-title-line-height\"] = profileTokens ? \"var(--hjm-type-body-line-height)\" : \"1.35\";\n style[\"--hjm-toast-description-line-height\"] = profileTokens ? \"var(--hjm-type-body-line-height)\" : \"1.45\";\n // Overlay chrome and sizes come from the recipes Native reads (1.5.0).\n for (const [name, chrome] of [[\"dialog\", dialogRecipe.content], [\"sheet\", sheetRecipe.content], [\"toast\", toastRecipe.surface]] as const) {\n style[`--hjm-${name}-background`] = resolveColorReference(chrome.background, palette);\n style[`--hjm-${name}-border`] = resolveColorReference(chrome.border, palette);\n style[`--hjm-${name}-border-width`] = `${chrome.borderWidth}px`;\n style[`--hjm-${name}-radius`] = `var(--hjm-radius-${chrome.radius})`;\n // Recipes select the floating role. Resolve its value from the profile so\n // dialogs, sheets and toasts cannot retain neutral shadows after a theme switch.\n style[`--hjm-${name}-shadow`] = shadowCss(profileTokens?.shadow.floating ?? chrome.shadow);\n }\n style[\"--hjm-sheet-max-height\"] = `${sheetRecipe.content.maxHeightRatio * 100}dvh`;\n style[\"--hjm-sheet-max-width\"] = `${sheetRecipe.web.maxWidth}px`;\n style[\"--hjm-sheet-handle-width\"] = `${sheetRecipe.handle.width}px`;\n style[\"--hjm-sheet-handle-height\"] = `${sheetRecipe.handle.height}px`;\n style[\"--hjm-sheet-handle-color\"] = resolveColorReference(sheetRecipe.handle.color, palette);\n for (const [name, ratio] of Object.entries(sheetRecipe.sizes)) {\n if (ratio !== null) style[`--hjm-sheet-size-${name}`] = `${ratio * 100}dvh`;\n }\n // Toast badge/action colours resolve from the recipe so Web and Native share one tone table (1.10.0).\n for (const [tone, contract] of Object.entries(toastRecipe.tones)) {\n style[`--hjm-toast-accent-${tone}`] = resolveColorReference(contract.accent, palette);\n style[`--hjm-toast-badge-${tone}`] = resolveColorReference(contract.badge, palette);\n }\n style[\"--hjm-toast-badge-size\"] = `${toastRecipe.icon.badgeDiameter}px`;\n style[\"--hjm-toast-action-background\"] = resolveColorReference(toastRecipe.action.background, palette);\n style[\"--hjm-toast-action-color\"] = resolveColorReference(toastRecipe.action.color, palette);\n style[\"--hjm-toast-description-color\"] = resolveColorReference(toastRecipe.description.color, palette);\n // Panel toast (2026-10-10): media column, step progress and action alignment come from the same recipe Native reads.\n style[\"--hjm-toast-media-size\"] = `${toastRecipe.media.size}px`;\n style[\"--hjm-toast-action-align\"] = toastRecipe.action.align;\n style[\"--hjm-toast-progress-gap\"] = `${toastRecipe.progress.gap}px`;\n style[\"--hjm-toast-progress-dot\"] = `${toastRecipe.progress.dotSize}px`;\n style[\"--hjm-toast-progress-current-scale\"] = String(toastRecipe.progress.currentScale);\n style[\"--hjm-toast-progress-done\"] = resolveColorReference(toastRecipe.progress.doneColor, palette);\n style[\"--hjm-toast-progress-upcoming\"] = resolveColorReference(toastRecipe.progress.upcomingColor, palette);\n style[\"--hjm-toast-progress-label\"] = resolveColorReference(toastRecipe.progress.labelColor, palette);\n style[\"--hjm-toast-progress-current-label\"] = resolveColorReference(toastRecipe.progress.currentLabelColor, palette);\n const toastExit = toastRecipe.transition.web.exit;\n style[\"--hjm-toast-exit-duration\"] = environment.reducedMotion ? \"0ms\" : `${toastExit.duration}ms`;\n style[\"--hjm-toast-exit-easing\"] = `cubic-bezier(${easing[toastExit.easing].join(\", \")})`;\n // SearchField geometry comes from searchFieldRecipe (2026-10-06 follow-up). Web had drawn TextField's\n // 16px padding for both sizes and a 44px clear button even at `medium`, where the recipe and Native\n // use a 36 circle with a 4px hit slop (44 target, 36 footprint).\n for (const [name, size] of Object.entries(searchFieldRecipe.sizes)) {\n style[`--hjm-search-field-padding-${name}`] = `${size.paddingHorizontal}px`;\n style[`--hjm-search-field-gap-${name}`] = `${size.gap}px`;\n style[`--hjm-search-field-clear-${name}`] = `${size.clearDiameter}px`;\n style[`--hjm-search-field-clear-slop-${name}`] = `${size.clearHitSlop}px`;\n }\n style[\"--hjm-tooltip-max-width\"] = `${tooltipRecipe.content.maxWidth}px`;\n style[\"--hjm-tooltip-padding\"] = `${tooltipRecipe.surface.padding}px`;\n // Floating collection surfaces read their padding from the recipe (2026-10-06): the stylesheet's 4 had drifted from 8.\n style[\"--hjm-menu-padding\"] = `${menuRecipe.surface.padding}px`;\n style[\"--hjm-select-popover-padding\"] = `${selectRecipe.popover.padding}px`;\n style[\"--hjm-combobox-popover-padding\"] = `${comboboxRecipe.popover.padding}px`;\n style[\"--hjm-tooltip-collision-padding\"] = `${tooltipRecipe.positioning.collisionPadding}px`;\n style[\"--hjm-button-pressed-opacity\"] = buttonRecipe.opacity.pressed;\n style[\"--hjm-button-disabled-opacity\"] = buttonRecipe.opacity.disabled;\n style[\"--hjm-field-border-width\"] = `${fieldRecipe.borderWidth}px`;\n style[\"--hjm-field-focus-ring-width\"] = `${fieldRecipe.focusRingWidth}px`;\n style[\"--hjm-field-disabled-opacity\"] = fieldRecipe.disabledOpacity;\n style[\"--hjm-control-min-touch-target\"] = `${control.minTouchTarget}px`;\n style[\"--hjm-control-field-height\"] = `${control.fieldHeight}px`;\n style[\"--hjm-field-multiline-min-height\"] = rem(fieldRecipe.multilineMinHeight);\n style[\"--hjm-field-padding-block\"] = rem(fieldRecipe.paddingVertical);\n for (const [name, value] of Object.entries(control.buttonHeight)) {\n // The axis is applied to the emitted variables rather than to each rule so\n // that every stylesheet consumer of a control height honours it at once.\n style[`--hjm-control-button-${kebab(name)}`] =\n `${visibleControlHeight(value, environment.minimumVisualTarget)}px`;\n }\n\n return style;\n}\n"]}
@@ -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;AA8If,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;mDAiCxD,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;AAGD,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"}
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,EAExB,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;AA2Kf,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;mDAiCxD,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;AAGD,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
@@ -19,6 +19,14 @@ const toneGlyphPaths = {
19
19
  function ToneGlyph({ tone }) {
20
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
21
  }
22
+ // Steps read as an ordered list with `aria-current="step"`; the dots are decoration beside each label,
23
+ // so state never depends on colour alone (WCAG 1.4.1).
24
+ function ToastProgress({ progress }) {
25
+ return (_jsx("ol", { className: "hjm-toast__progress", children: progress.steps.map((step, index) => {
26
+ const state = index < progress.current ? "done" : index === progress.current ? "current" : "upcoming";
27
+ return (_jsxs("li", { className: "hjm-toast__progress-step", "data-state": state, "aria-current": state === "current" ? "step" : undefined, children: [_jsx("span", { className: "hjm-toast__progress-dot", "aria-hidden": "true" }), _jsx("span", { className: "hjm-toast__progress-label", children: step })] }, `${index}-${step}`));
28
+ }) }));
29
+ }
22
30
  const ToastCard = forwardRef(function ToastCard({ descriptor, phase, onAction, onDismiss, onPointerPause, onPointerResume, onFocusPause, onFocusResume, locale, className, htmlProps, }, ref) {
23
31
  const baseId = useId().replaceAll(":", "");
24
32
  const titleId = `${baseId}-toast-title`;
@@ -34,7 +42,9 @@ const ToastCard = forwardRef(function ToastCard({ descriptor, phase, onAction, o
34
42
  htmlProps?.onBlurCapture?.(event);
35
43
  if (!event.currentTarget.contains(event.relatedTarget))
36
44
  onFocusResume?.();
37
- }, 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" }) }) })] }));
45
+ }, 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" }), descriptor.media === null ? (_jsx("span", { className: "hjm-toast__icon", "aria-hidden": "true", children: _jsx(ToneGlyph, { tone: descriptor.tone }) })) : (
46
+ // Product media (mascot, avatar) takes the badge column; it is decorative, the copy carries meaning.
47
+ _jsx("span", { className: "hjm-toast__media", "aria-hidden": "true", children: descriptor.media })), _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.progress ? _jsx(ToastProgress, { progress: descriptor.progress }) : null] }), 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" }) }) })] }));
38
48
  });
39
49
  /** Controlled single-toast renderer; ToastProvider supplies the full FIFO lifecycle. */
40
50
  export const Toast = forwardRef(function Toast(
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\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 * Remaining HTML attributes of the public controlled `Toast` (id, data-*, style, handlers).\n * Spread first so the card's role, labelling, tone and state attributes always win;\n * handlers the card also needs are composed rather than replaced.\n */\n htmlProps?: Omit<HTMLAttributes<HTMLDivElement>, \"children\" | \"title\" | \"className\">;\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 htmlProps,\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 htmlProps?.onKeyDown?.(event);\n if (event.key === \"Escape\") {\n event.preventDefault();\n onDismiss(\"escape\");\n }\n };\n return (\n <div\n {...htmlProps}\n ref={ref}\n className={classNames(\"hjm-toast\", className)}\n data-tone={descriptor.tone}\n data-state={phase}\n lang={locale ?? htmlProps?.lang}\n role=\"group\"\n aria-labelledby={descriptor.title ? titleId : undefined}\n aria-describedby={descriptionId}\n onPointerEnter={(event) => { htmlProps?.onPointerEnter?.(event); onPointerPause?.(); }}\n onPointerLeave={(event) => { htmlProps?.onPointerLeave?.(event); onPointerResume?.(); }}\n onFocusCapture={(event) => { htmlProps?.onFocusCapture?.(event); onFocusPause?.(); }}\n onBlurCapture={(event) => {\n htmlProps?.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\n// No `layoutStyle`: toasts are stacked inside the provider's fixed region, which owns their position.\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 // Until 2026-10-06 only `className` reached the DOM although the type accepts every div attribute,\n // so `id`, `data-*` and handlers were dropped silently. Narrowing the type instead would break\n // consumers that already pass them, so the rest is forwarded (the card keeps its own role/labelling).\n { descriptor, onDismissRequest, className, ...htmlProps },\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 htmlProps={htmlProps}\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\n// No `layoutStyle`: the toast region is a fixed viewport layer owned by the provider recipe.\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 ToastProgressDescriptor,\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\n// Steps read as an ordered list with `aria-current=\"step\"`; the dots are decoration beside each label,\n// so state never depends on colour alone (WCAG 1.4.1).\nfunction ToastProgress({ progress }: { progress: ToastProgressDescriptor }) {\n return (\n <ol className=\"hjm-toast__progress\">\n {progress.steps.map((step, index) => {\n const state = index < progress.current ? \"done\" : index === progress.current ? \"current\" : \"upcoming\";\n return (\n <li\n key={`${index}-${step}`}\n className=\"hjm-toast__progress-step\"\n data-state={state}\n aria-current={state === \"current\" ? \"step\" : undefined}\n >\n <span className=\"hjm-toast__progress-dot\" aria-hidden=\"true\" />\n <span className=\"hjm-toast__progress-label\">{step}</span>\n </li>\n );\n })}\n </ol>\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 * Remaining HTML attributes of the public controlled `Toast` (id, data-*, style, handlers).\n * Spread first so the card's role, labelling, tone and state attributes always win;\n * handlers the card also needs are composed rather than replaced.\n */\n htmlProps?: Omit<HTMLAttributes<HTMLDivElement>, \"children\" | \"title\" | \"className\">;\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 htmlProps,\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 htmlProps?.onKeyDown?.(event);\n if (event.key === \"Escape\") {\n event.preventDefault();\n onDismiss(\"escape\");\n }\n };\n return (\n <div\n {...htmlProps}\n ref={ref}\n className={classNames(\"hjm-toast\", className)}\n data-tone={descriptor.tone}\n data-state={phase}\n lang={locale ?? htmlProps?.lang}\n role=\"group\"\n aria-labelledby={descriptor.title ? titleId : undefined}\n aria-describedby={descriptionId}\n onPointerEnter={(event) => { htmlProps?.onPointerEnter?.(event); onPointerPause?.(); }}\n onPointerLeave={(event) => { htmlProps?.onPointerLeave?.(event); onPointerResume?.(); }}\n onFocusCapture={(event) => { htmlProps?.onFocusCapture?.(event); onFocusPause?.(); }}\n onBlurCapture={(event) => {\n htmlProps?.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 {descriptor.media === null ? (\n <span className=\"hjm-toast__icon\" aria-hidden=\"true\">\n <ToneGlyph tone={descriptor.tone} />\n </span>\n ) : (\n // Product media (mascot, avatar) takes the badge column; it is decorative, the copy carries meaning.\n <span className=\"hjm-toast__media\" aria-hidden=\"true\">{descriptor.media as ReactNode}</span>\n )}\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 {descriptor.progress ? <ToastProgress progress={descriptor.progress} /> : null}\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\n// No `layoutStyle`: toasts are stacked inside the provider's fixed region, which owns their position.\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 // Until 2026-10-06 only `className` reached the DOM although the type accepts every div attribute,\n // so `id`, `data-*` and handlers were dropped silently. Narrowing the type instead would break\n // consumers that already pass them, so the rest is forwarded (the card keeps its own role/labelling).\n { descriptor, onDismissRequest, className, ...htmlProps },\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 htmlProps={htmlProps}\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\n// No `layoutStyle`: the toast region is a fixed viewport layer owned by the provider recipe.\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hjmds/react",
3
- "version": "1.17.1",
3
+ "version": "1.18.0",
4
4
  "description": "Accessible React 19 renderers for HJM design contracts.",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -512,6 +512,11 @@
512
512
  "types": "./dist/collection-rail.d.ts",
513
513
  "import": "./dist/collection-rail.js",
514
514
  "default": "./dist/collection-rail.js"
515
+ },
516
+ "./activity-chip": {
517
+ "types": "./dist/activity-chip.d.ts",
518
+ "import": "./dist/activity-chip.js",
519
+ "default": "./dist/activity-chip.js"
515
520
  }
516
521
  },
517
522
  "files": [
@@ -521,7 +526,7 @@
521
526
  "THIRD_PARTY_NOTICES.md"
522
527
  ],
523
528
  "peerDependencies": {
524
- "@hjmds/design-contracts": ">=1.17.0 <1.18.0",
529
+ "@hjmds/design-contracts": ">=1.18.0 <1.19.0",
525
530
  "react": ">=19.0.0",
526
531
  "react-dom": ">=19.0.0",
527
532
  "@number-flow/react": "0.6.2",
@@ -558,7 +563,7 @@
558
563
  "blobatar": "2.7.0",
559
564
  "@blobatar/react": "2.7.0",
560
565
  "lucide-react": "1.49.0",
561
- "@hjmds/design-contracts": "1.17.1"
566
+ "@hjmds/design-contracts": "1.18.0"
562
567
  },
563
568
  "peerDependenciesMeta": {
564
569
  "@number-flow/react": {