@hjmds/design-contracts 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.
Files changed (190) hide show
  1. package/dist/action-session.d.ts +47 -0
  2. package/dist/action-session.d.ts.map +1 -0
  3. package/dist/action-session.js +60 -0
  4. package/dist/action-session.js.map +1 -0
  5. package/dist/activity-heatmap.d.ts +22 -0
  6. package/dist/activity-heatmap.d.ts.map +1 -0
  7. package/dist/activity-heatmap.js +29 -0
  8. package/dist/activity-heatmap.js.map +1 -0
  9. package/dist/auth-screen.d.ts +4 -0
  10. package/dist/auth-screen.d.ts.map +1 -1
  11. package/dist/auth-screen.js +2 -0
  12. package/dist/auth-screen.js.map +1 -1
  13. package/dist/avatar-fallback.d.ts +25 -0
  14. package/dist/avatar-fallback.d.ts.map +1 -0
  15. package/dist/avatar-fallback.js +17 -0
  16. package/dist/avatar-fallback.js.map +1 -0
  17. package/dist/behaviors.d.ts +2 -2
  18. package/dist/bottom-navigation-defaults.d.ts +1 -1
  19. package/dist/bottom-navigation-defaults.d.ts.map +1 -1
  20. package/dist/bottom-navigation-defaults.js.map +1 -1
  21. package/dist/bottom-navigation.d.ts.map +1 -1
  22. package/dist/bottom-navigation.js +5 -1
  23. package/dist/bottom-navigation.js.map +1 -1
  24. package/dist/catalog.d.ts +67 -5
  25. package/dist/catalog.d.ts.map +1 -1
  26. package/dist/code-block.d.ts +23 -0
  27. package/dist/code-block.d.ts.map +1 -0
  28. package/dist/code-block.js +13 -0
  29. package/dist/code-block.js.map +1 -0
  30. package/dist/component-definitions.d.ts +2 -3
  31. package/dist/component-definitions.d.ts.map +1 -1
  32. package/dist/component-definitions.js +1 -2
  33. package/dist/component-definitions.js.map +1 -1
  34. package/dist/component-recipes.d.ts +63 -5
  35. package/dist/component-recipes.d.ts.map +1 -1
  36. package/dist/component-recipes.js +33 -6
  37. package/dist/component-recipes.js.map +1 -1
  38. package/dist/component-references.d.ts +0 -6
  39. package/dist/component-references.d.ts.map +1 -1
  40. package/dist/component-references.js +0 -5
  41. package/dist/component-references.js.map +1 -1
  42. package/dist/content-transition.d.ts +17 -0
  43. package/dist/content-transition.d.ts.map +1 -0
  44. package/dist/content-transition.js +15 -0
  45. package/dist/content-transition.js.map +1 -0
  46. package/dist/duration-field.d.ts +22 -0
  47. package/dist/duration-field.d.ts.map +1 -0
  48. package/dist/duration-field.js +20 -0
  49. package/dist/duration-field.js.map +1 -0
  50. package/dist/effect-surface.d.ts +29 -0
  51. package/dist/effect-surface.d.ts.map +1 -0
  52. package/dist/effect-surface.js +26 -0
  53. package/dist/effect-surface.js.map +1 -0
  54. package/dist/gooey-navigation.d.ts +13 -0
  55. package/dist/gooey-navigation.d.ts.map +1 -0
  56. package/dist/gooey-navigation.js +11 -0
  57. package/dist/gooey-navigation.js.map +1 -0
  58. package/dist/gravity-letters.d.ts +12 -0
  59. package/dist/gravity-letters.d.ts.map +1 -0
  60. package/dist/gravity-letters.js +11 -0
  61. package/dist/gravity-letters.js.map +1 -0
  62. package/dist/grid-reveal.d.ts +8 -0
  63. package/dist/grid-reveal.d.ts.map +1 -0
  64. package/dist/grid-reveal.js +5 -0
  65. package/dist/grid-reveal.js.map +1 -0
  66. package/dist/internal/object-validation.d.ts +3 -0
  67. package/dist/internal/object-validation.d.ts.map +1 -0
  68. package/dist/internal/object-validation.js +12 -0
  69. package/dist/internal/object-validation.js.map +1 -0
  70. package/dist/internal/thinking-orb/braid.d.ts.map +1 -1
  71. package/dist/internal/thinking-orb/braid.js +2 -9
  72. package/dist/internal/thinking-orb/braid.js.map +1 -1
  73. package/dist/internal/thinking-orb/core.d.ts +1 -0
  74. package/dist/internal/thinking-orb/core.d.ts.map +1 -1
  75. package/dist/internal/thinking-orb/core.js +12 -0
  76. package/dist/internal/thinking-orb/core.js.map +1 -1
  77. package/dist/internal/thinking-orb/presentation.d.ts +4 -0
  78. package/dist/internal/thinking-orb/presentation.d.ts.map +1 -0
  79. package/dist/internal/thinking-orb/presentation.js +28 -0
  80. package/dist/internal/thinking-orb/presentation.js.map +1 -0
  81. package/dist/internal/thinking-orb/ribbon.d.ts.map +1 -1
  82. package/dist/internal/thinking-orb/ribbon.js +2 -9
  83. package/dist/internal/thinking-orb/ribbon.js.map +1 -1
  84. package/dist/layout.d.ts +0 -5
  85. package/dist/layout.d.ts.map +1 -1
  86. package/dist/layout.js +0 -7
  87. package/dist/layout.js.map +1 -1
  88. package/dist/otp-field.d.ts +2 -0
  89. package/dist/otp-field.d.ts.map +1 -1
  90. package/dist/otp-field.js.map +1 -1
  91. package/dist/popover.d.ts.map +1 -1
  92. package/dist/popover.js +3 -12
  93. package/dist/popover.js.map +1 -1
  94. package/dist/reactions.d.ts +10 -0
  95. package/dist/reactions.d.ts.map +1 -0
  96. package/dist/reactions.js +20 -0
  97. package/dist/reactions.js.map +1 -0
  98. package/dist/scroll-progress.d.ts +8 -0
  99. package/dist/scroll-progress.d.ts.map +1 -0
  100. package/dist/scroll-progress.js +10 -0
  101. package/dist/scroll-progress.js.map +1 -0
  102. package/dist/task-list.d.ts +7 -0
  103. package/dist/task-list.d.ts.map +1 -0
  104. package/dist/task-list.js +4 -0
  105. package/dist/task-list.js.map +1 -0
  106. package/dist/theme-studio.d.ts +14 -0
  107. package/dist/theme-studio.d.ts.map +1 -0
  108. package/dist/theme-studio.js +16 -0
  109. package/dist/theme-studio.js.map +1 -0
  110. package/dist/thinking-orb.d.ts +4 -2
  111. package/dist/thinking-orb.d.ts.map +1 -1
  112. package/dist/thinking-orb.js +8 -3
  113. package/dist/thinking-orb.js.map +1 -1
  114. package/dist/toast-liquid.d.ts +4 -4
  115. package/dist/toast-liquid.d.ts.map +1 -1
  116. package/dist/toast-liquid.js +11 -10
  117. package/dist/toast-liquid.js.map +1 -1
  118. package/dist/toast.d.ts +4 -4
  119. package/dist/toast.d.ts.map +1 -1
  120. package/dist/toast.js +4 -3
  121. package/dist/toast.js.map +1 -1
  122. package/dist/tooltip.d.ts.map +1 -1
  123. package/dist/tooltip.js +3 -12
  124. package/dist/tooltip.js.map +1 -1
  125. package/dist/version.d.ts +1 -1
  126. package/dist/version.d.ts.map +1 -1
  127. package/dist/version.js +1 -1
  128. package/dist/version.js.map +1 -1
  129. package/dist/voice-note.d.ts +20 -0
  130. package/dist/voice-note.d.ts.map +1 -0
  131. package/dist/voice-note.js +16 -0
  132. package/dist/voice-note.js.map +1 -0
  133. package/docs/action-session.md +73 -0
  134. package/docs/activity-heatmap.md +32 -0
  135. package/docs/anchor.md +1 -1
  136. package/docs/auth-screen.md +44 -4
  137. package/docs/authoring-brief.md +5 -0
  138. package/docs/avatar-fallback.md +74 -0
  139. package/docs/bottom-navigation.md +16 -1
  140. package/docs/breadcrumb.md +1 -1
  141. package/docs/calendar.md +1 -1
  142. package/docs/cascader.md +1 -1
  143. package/docs/code-block.md +32 -0
  144. package/docs/command-palette.md +1 -1
  145. package/docs/compound-controls.md +83 -0
  146. package/docs/confirm-popover.md +1 -1
  147. package/docs/consumer-policy.md +30 -23
  148. package/docs/cross-platform-core-normalization.md +19 -21
  149. package/docs/data-table.md +8 -5
  150. package/docs/dialog.md +2 -0
  151. package/docs/effect-surface.md +50 -0
  152. package/docs/floating-action-button.md +1 -1
  153. package/docs/folder-preview.md +26 -0
  154. package/docs/generated/component-maturity.md +1 -1
  155. package/docs/generated/renderer-evidence.json +3 -3
  156. package/docs/generated/renderer-evidence.md +1 -1
  157. package/docs/generated/showcase-manifest.json +1 -1
  158. package/docs/gooey-navigation.md +36 -0
  159. package/docs/gravity-letters.md +26 -0
  160. package/docs/grid-reveal.md +11 -0
  161. package/docs/icon.md +26 -0
  162. package/docs/image.md +2 -2
  163. package/docs/layout.md +1 -2
  164. package/docs/migration-0.5.md +4 -1
  165. package/docs/migration-native-legacy-removal.md +59 -0
  166. package/docs/navigation-bar.md +28 -0
  167. package/docs/optional-adapters.md +24 -1
  168. package/docs/otp-field.md +15 -0
  169. package/docs/pagination.md +1 -1
  170. package/docs/popover.md +2 -2
  171. package/docs/product-adoption-1.4.md +7 -0
  172. package/docs/product-audit-2026-09-15.md +1 -1
  173. package/docs/provider-button.md +6 -3
  174. package/docs/rating.md +1 -1
  175. package/docs/react-native-completion.md +4 -4
  176. package/docs/screen-chrome.md +1 -1
  177. package/docs/scroll-progress.md +29 -0
  178. package/docs/sheet.md +2 -0
  179. package/docs/sidebar.md +6 -0
  180. package/docs/splitter.md +1 -1
  181. package/docs/step-player.md +16 -0
  182. package/docs/task-list.md +32 -0
  183. package/docs/theme-studio.md +13 -0
  184. package/docs/thinking-orb.md +9 -2
  185. package/docs/time-picker.md +1 -1
  186. package/docs/toast.md +27 -8
  187. package/docs/tour.md +1 -1
  188. package/docs/tree-select.md +2 -2
  189. package/docs/voice-note.md +19 -0
  190. package/package.json +91 -1
@@ -1,9 +1,12 @@
1
+ import { buildOrbPresentation } from "./internal/thinking-orb/presentation.js";
1
2
  import { MODE_FRAMES } from "./internal/thinking-orb/registry.js";
2
3
  import { resolvePreset } from "./internal/thinking-orb/presets.js";
3
4
  export const thinkingOrbStates = ["working", "searching", "solving", "listening", "connecting", "weaving", "composing", "breathing", "shaping"];
4
5
  export { thinkingOrbRecipe } from "./thinking-orb-recipe.js";
5
6
  import { thinkingOrbRecipe } from "./thinking-orb-recipe.js";
6
- export function validateThinkingOrb({ state = "working", size = 64, speed = 1, label }) {
7
+ export function validateThinkingOrb({ state = "working", size = 64, speed = 1, label, appearance = "state" }) {
8
+ if (!["state", "fluid", "matrix"].includes(appearance))
9
+ throw new TypeError("Unknown ThinkingOrb appearance");
7
10
  if (!thinkingOrbStates.includes(state))
8
11
  throw new TypeError("Unknown ThinkingOrb state");
9
12
  if (size !== 20 && size !== 64)
@@ -14,10 +17,12 @@ export function validateThinkingOrb({ state = "working", size = 64, speed = 1, l
14
17
  throw new TypeError("ThinkingOrb requires a localized label");
15
18
  }
16
19
  /** Theme-free, deterministic geometry; no DOM/React/native imports. */
17
- export function buildThinkingOrbFrame(state, size, time) {
18
- validateThinkingOrb({ state, size, label: state });
20
+ export function buildThinkingOrbFrame(state, size, time, appearance = "state") {
21
+ validateThinkingOrb({ state, size, label: state, appearance });
19
22
  if (!Number.isFinite(time) || time < 0)
20
23
  throw new RangeError("ThinkingOrb time must be finite and non-negative");
24
+ if (appearance !== "state")
25
+ return buildOrbPresentation(appearance, size, time);
21
26
  const preset = resolvePreset(state, size);
22
27
  return MODE_FRAMES[preset.mode](size, time * preset.speed, preset.opts);
23
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"thinking-orb.js","sourceRoot":"","sources":["../src/thinking-orb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAInE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,CAAU,CAAC;AAYzJ,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,UAAU,mBAAmB,CAAC,EAAE,KAAK,GAAG,SAAS,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAsB;IACxG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAC;IACzF,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,EAAE;QAAE,MAAM,IAAI,UAAU,CAAC,mCAAmC,CAAC,CAAC;IAC1F,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,wCAAwC,CAAC,CAAC;IACvH,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC,CAAC;AAChH,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,qBAAqB,CAAC,KAAe,EAAE,IAAa,EAAE,IAAY;IAChF,mBAAmB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACnD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,kDAAkD,CAAC,CAAC;IACjH,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC1C,OAAO,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AAC1E,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,sBAAsB;IACpC,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,QAA4B,CAAC;IACjC,OAAO;QACL,UAAU,KAAK,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,GAAW,EAAE,KAAa;YAC/B,oFAAoF;YACpF,IAAI,QAAQ,KAAK,SAAS;gBAAE,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,QAAQ,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC;YACjI,QAAQ,GAAG,GAAG,CAAC;YACf,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,IAAI,IAAI,KAAK,OAAO,OAAO,CAAC,CAAC,CAAC;KAC/B,CAAC;AACJ,CAAC","sourcesContent":["import { MODE_FRAMES } from \"./internal/thinking-orb/registry.js\";\nimport { resolvePreset } from \"./internal/thinking-orb/presets.js\";\nimport type { OrbState, OrbSize, OrbFrame } from \"./internal/thinking-orb/types.js\";\nexport type { OrbState, OrbSize, OrbFrame };\n\nexport const thinkingOrbStates = [\"working\", \"searching\", \"solving\", \"listening\", \"connecting\", \"weaving\", \"composing\", \"breathing\", \"shaping\"] as const;\nexport type ThinkingOrbOptions = Readonly<{\n /** Actual operation phase, supplied by the host; the orb never simulates progress. */\n state?: OrbState;\n size?: OrbSize;\n /** Localized description of the current operation. */\n label: string;\n speed?: number;\n paused?: boolean;\n /** Host navigation/list visibility; required for mounted but hidden native screens. */\n active?: boolean;\n}>;\nexport { thinkingOrbRecipe } from \"./thinking-orb-recipe.js\";\nimport { thinkingOrbRecipe } from \"./thinking-orb-recipe.js\";\n\nexport function validateThinkingOrb({ state = \"working\", size = 64, speed = 1, label }: ThinkingOrbOptions): void {\n if (!thinkingOrbStates.includes(state)) throw new TypeError(\"Unknown ThinkingOrb state\");\n if (size !== 20 && size !== 64) throw new RangeError(\"ThinkingOrb size must be 20 or 64\");\n if (!Number.isFinite(speed) || speed <= 0 || speed > 4) throw new RangeError(\"ThinkingOrb speed must be > 0 and <= 4\");\n if (typeof label !== \"string\" || !label.trim()) throw new TypeError(\"ThinkingOrb requires a localized label\");\n}\n\n/** Theme-free, deterministic geometry; no DOM/React/native imports. */\nexport function buildThinkingOrbFrame(state: OrbState, size: OrbSize, time: number): OrbFrame {\n validateThinkingOrb({ state, size, label: state });\n if (!Number.isFinite(time) || time < 0) throw new RangeError(\"ThinkingOrb time must be finite and non-negative\");\n const preset = resolvePreset(state, size);\n return MODE_FRAMES[preset.mode](size, time * preset.speed, preset.opts);\n}\n\n/** A local elapsed clock freezes exactly, instead of jumping to wall time after resume. */\nexport function createThinkingOrbClock() {\n let elapsed = 0;\n let previous: number | undefined;\n return {\n resetDelta() { previous = undefined; },\n sample(now: number, speed: number) {\n // Long scheduling gaps are capped so a stalled JS thread cannot jump the animation.\n if (previous !== undefined) elapsed += Math.min(thinkingOrbRecipe.motion.maxDeltaMs, Math.max(0, now - previous)) * speed / 1000;\n previous = now;\n return elapsed;\n },\n get time() { return elapsed; },\n };\n}\n"]}
1
+ {"version":3,"file":"thinking-orb.js","sourceRoot":"","sources":["../src/thinking-orb.ts"],"names":[],"mappings":"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","sourcesContent":["import { buildOrbPresentation } from \"./internal/thinking-orb/presentation.js\";\nimport { MODE_FRAMES } from \"./internal/thinking-orb/registry.js\";\nimport { resolvePreset } from \"./internal/thinking-orb/presets.js\";\nimport type { OrbState, OrbSize, OrbFrame } from \"./internal/thinking-orb/types.js\";\nexport type { OrbState, OrbSize, OrbFrame };\n\nexport const thinkingOrbStates = [\"working\", \"searching\", \"solving\", \"listening\", \"connecting\", \"weaving\", \"composing\", \"breathing\", \"shaping\"] as const;\nexport type ThinkingOrbAppearance = \"state\" | \"fluid\" | \"matrix\";\nexport type ThinkingOrbOptions = Readonly<{\n /** Actual operation phase, supplied by the host; the orb never simulates progress. */\n state?: OrbState;\n appearance?: ThinkingOrbAppearance;\n size?: OrbSize;\n /** Localized description of the current operation. */\n label: string;\n speed?: number;\n paused?: boolean;\n /** Host navigation/list visibility; required for mounted but hidden native screens. */\n active?: boolean;\n}>;\nexport { thinkingOrbRecipe } from \"./thinking-orb-recipe.js\";\nimport { thinkingOrbRecipe } from \"./thinking-orb-recipe.js\";\n\nexport function validateThinkingOrb({ state = \"working\", size = 64, speed = 1, label, appearance = \"state\" }: ThinkingOrbOptions): void {\n if (![\"state\", \"fluid\", \"matrix\"].includes(appearance)) throw new TypeError(\"Unknown ThinkingOrb appearance\");\n if (!thinkingOrbStates.includes(state)) throw new TypeError(\"Unknown ThinkingOrb state\");\n if (size !== 20 && size !== 64) throw new RangeError(\"ThinkingOrb size must be 20 or 64\");\n if (!Number.isFinite(speed) || speed <= 0 || speed > 4) throw new RangeError(\"ThinkingOrb speed must be > 0 and <= 4\");\n if (typeof label !== \"string\" || !label.trim()) throw new TypeError(\"ThinkingOrb requires a localized label\");\n}\n\n/** Theme-free, deterministic geometry; no DOM/React/native imports. */\nexport function buildThinkingOrbFrame(state: OrbState, size: OrbSize, time: number, appearance: ThinkingOrbAppearance = \"state\"): OrbFrame {\n validateThinkingOrb({ state, size, label: state, appearance });\n if (!Number.isFinite(time) || time < 0) throw new RangeError(\"ThinkingOrb time must be finite and non-negative\");\n if (appearance !== \"state\") return buildOrbPresentation(appearance, size, time);\n const preset = resolvePreset(state, size);\n return MODE_FRAMES[preset.mode](size, time * preset.speed, preset.opts);\n}\n\n/** A local elapsed clock freezes exactly, instead of jumping to wall time after resume. */\nexport function createThinkingOrbClock() {\n let elapsed = 0;\n let previous: number | undefined;\n return {\n resetDelta() { previous = undefined; },\n sample(now: number, speed: number) {\n // Long scheduling gaps are capped so a stalled JS thread cannot jump the animation.\n if (previous !== undefined) elapsed += Math.min(thinkingOrbRecipe.motion.maxDeltaMs, Math.max(0, now - previous)) * speed / 1000;\n previous = now;\n return elapsed;\n },\n get time() { return elapsed; },\n };\n}\n"]}
@@ -5,13 +5,13 @@
5
5
  */
6
6
  export declare const liquidToastRecipe: {
7
7
  readonly capsule: {
8
- readonly width: 88;
9
- readonly height: 24;
8
+ readonly width: 32;
9
+ readonly height: 32;
10
10
  };
11
- readonly gap: 34;
11
+ readonly gap: 26;
12
12
  readonly minHeight: 74;
13
13
  readonly maxWidth: 396;
14
- readonly radius: 32;
14
+ readonly radius: 12;
15
15
  readonly dropSize: 52;
16
16
  readonly neckWidth: 60;
17
17
  readonly blur: 14.3;
@@ -1 +1 @@
1
- {"version":3,"file":"toast-liquid.d.ts","sourceRoot":"","sources":["../src/toast-liquid.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BpB,CAAC;AAEX,4FAA4F;AAC5F,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,GAAG,QAAQ,CAAC;IACvE,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,QAAQ,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1E,CAAC,CAAC;AAEH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAOzE;AAED,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IACpF,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAC5E,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;CACxD,CAAC,CAAC;AAEH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,QAAQ,CAAC;IACvD,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAC;IAClF,YAAY,CAAC,EAAE,QAAQ,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD,CAAC,GAAG,iBAAiB,CA2BrB;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB;;;;;;;;;;;EA0B/F"}
1
+ {"version":3,"file":"toast-liquid.d.ts","sourceRoot":"","sources":["../src/toast-liquid.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BpB,CAAC;AAEX,4FAA4F;AAC5F,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,GAAG,QAAQ,CAAC;IACvE,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,QAAQ,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1E,CAAC,CAAC;AAEH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAOzE;AAED,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IACpF,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAC5E,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;CACxD,CAAC,CAAC;AAEH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,QAAQ,CAAC;IACvD,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAC;IAClF,YAAY,CAAC,EAAE,QAAQ,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD,CAAC,GAAG,iBAAiB,CA2BrB;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB;;;;;;;;;;;EAyB/F"}
@@ -4,11 +4,15 @@
4
4
  * Kept separate from the lifecycle: animation must never own a second queue.
5
5
  */
6
6
  export const liquidToastRecipe = {
7
- capsule: { width: 88, height: 24 },
8
- gap: 34,
7
+ // 2026-10-02: use a circular in-app origin rather than a second Dynamic Island.
8
+ // Keep the public capsule key; changing geometry does not require callers to migrate.
9
+ capsule: { width: 32, height: 32 },
10
+ // Preserve the settled card top (58) when increasing the anchor height from 24 to 32.
11
+ gap: 26,
9
12
  minHeight: 74,
10
13
  maxWidth: 396,
11
- radius: 32,
14
+ // 2026-10-02 card redesign: the medium 12-unit corner supports a banner silhouette.
15
+ radius: 12,
12
16
  dropSize: 52,
13
17
  neckWidth: 60,
14
18
  blur: 14.3,
@@ -26,9 +30,7 @@ export const liquidToastRecipe = {
26
30
  fade: { duration: 360, dampingRatio: 1 },
27
31
  drag: { duration: 560, dampingRatio: 0.7 },
28
32
  },
29
- // tint waits for the card to start widening. At 110ms the droplet turned white while still inside the Dynamic Island,
30
- // so it read as a gray blob appearing below the island instead of the island itself dripping (2026-09-30 iPhone 17
31
- // iOS 27 video against the expo-dynamic-notifications reference). It now stays anchor-colored for the descent.
33
+ // Keep the drop anchor-colored through descent; early tint looked like a gray blob on iPhone 17 (2026-09-30).
32
34
  delay: { tint: 420, expand: 340, reveal: 560, collapse: 100, return: 280 },
33
35
  swipe: { distance: -18, velocity: -420 },
34
36
  };
@@ -79,22 +81,21 @@ export function buildLiquidToastGeometry(drop, expand, layout) {
79
81
  const mix = (a, b, t) => a + (b - a) * t;
80
82
  const grow = 1 - (1 - clamp(drop / 0.7)) ** 1.25;
81
83
  const n = clamp(drop / 0.82);
82
- // A smooth neck rises and disappears before the card reaches its final location.
83
84
  const peak = 1.6 / 3;
84
85
  const normal = peak ** 1.6 * (1 - peak) ** 1.4;
85
86
  const neck = n <= 0 || n >= 1 ? 0 : (n ** 1.6 * (1 - n) ** 1.4) / normal;
86
87
  const stretch = 1 + 0.38 * neck;
87
- const droplet = 52 * grow;
88
+ const droplet = liquidToastRecipe.dropSize * grow;
88
89
  const width = Math.max(0, Math.min(layout.width, mix(droplet / stretch, layout.cardWidth, expand)));
89
90
  const height = Math.max(0, mix(droplet * stretch, layout.height, expand));
90
91
  const originY = layout.anchorY + layout.anchorHeight * 0.66;
91
92
  const centerY = mix(originY, layout.cardTop + layout.height / 2, drop);
92
93
  const centerX = mix(layout.anchorX + layout.anchorWidth / 2, layout.width / 2, clamp(expand));
93
- const neckWidth = Math.max(0, Math.min(60, width) * neck);
94
+ const neckWidth = Math.max(0, Math.min(liquidToastRecipe.neckWidth, width) * neck);
94
95
  const neckY = layout.anchorY + layout.anchorHeight / 2;
95
96
  return {
96
97
  x: centerX - width / 2, y: centerY - height / 2, width, height,
97
- radius: Math.max(0, Math.min(mix(droplet / 2, 32, expand), width / 2, height / 2)),
98
+ radius: Math.max(0, Math.min(mix(droplet / 2, liquidToastRecipe.radius, expand), width / 2, height / 2)),
98
99
  neckX: layout.anchorX + layout.anchorWidth / 2 - neckWidth / 2,
99
100
  neckY, neckWidth, neckHeight: Math.max(0, centerY - neckY),
100
101
  offsetY: centerY - (layout.cardTop + layout.height / 2),
@@ -1 +1 @@
1
- {"version":3,"file":"toast-liquid.js","sourceRoot":"","sources":["../src/toast-liquid.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Geometry adapted from rit3zh/expo-dynamic-notifications, commit 5de059a5cbef.\n * The MIT notice is shipped in THIRD_PARTY_NOTICES.md. See docs/plans/liquid-toast.md.\n * Kept separate from the lifecycle: animation must never own a second queue.\n */\nexport const liquidToastRecipe = {\n capsule: { width: 88, height: 24 },\n gap: 34,\n minHeight: 74,\n maxWidth: 396,\n radius: 32,\n dropSize: 52,\n neckWidth: 60,\n blur: 14.3,\n gain: 22,\n threshold: 0.43,\n // These intentionally exceed general HJM motion: the neck needs time to separate.\n // Original choreography is the comparison baseline, not a new global motion scale.\n spring: {\n drop: { duration: 1150, dampingRatio: 0.82 },\n expand: { duration: 1000, dampingRatio: 0.8 },\n reveal: { duration: 700, dampingRatio: 1 },\n tint: { duration: 700, dampingRatio: 1 },\n collapse: { duration: 660, dampingRatio: 0.92, velocity: 2 },\n return: { duration: 1150, dampingRatio: 0.9 },\n fade: { duration: 360, dampingRatio: 1 },\n drag: { duration: 560, dampingRatio: 0.7 },\n },\n // tint waits for the card to start widening. At 110ms the droplet turned white while still inside the Dynamic Island,\n // so it read as a gray blob appearing below the island instead of the island itself dripping (2026-09-30 iPhone 17\n // iOS 27 video against the expo-dynamic-notifications reference). It now stays anchor-colored for the descent.\n delay: { tint: 420, expand: 340, reveal: 560, collapse: 100, return: 280 },\n swipe: { distance: -18, velocity: -420 },\n} as const;\n\n/** Island frames are explicitly verified window coordinates, never inferred from insets. */\nexport type LiquidToastAnchor = Readonly<{ kind: \"capsule\" }> | Readonly<{\n kind: \"island\";\n frame: Readonly<{ x: number; y: number; width: number; height: number }>;\n}>;\n\nexport function validateLiquidToastAnchor(anchor: LiquidToastAnchor): void {\n if (anchor.kind === \"capsule\") return;\n if (anchor.kind !== \"island\") throw new TypeError(\"Unsupported liquid toast anchor\");\n const frame = anchor.frame;\n if (!frame || ![frame.x, frame.y, frame.width, frame.height].every(Number.isFinite) || frame.x < 0 || frame.y < 0 || frame.width <= 0 || frame.height <= 0) {\n throw new RangeError(\"Liquid Toast island frame must be finite with positive dimensions\");\n }\n}\n\nexport type LiquidToastLayout = Readonly<{\n width: number; height: number; cardWidth: number; cardTop: number; cardLeft: number;\n anchorX: number; anchorY: number; anchorWidth: number; anchorHeight: number;\n canvasTop: number; canvasHeight: number; fits: boolean;\n}>;\n\nexport function resolveLiquidToastLayout(input: Readonly<{\n width: number; height: number; availableHeight: number; anchor: LiquidToastAnchor;\n windowOrigin?: Readonly<{ x: number; y: number }>;\n}>): LiquidToastLayout {\n const { width, height, availableHeight, anchor, windowOrigin } = input;\n validateLiquidToastAnchor(anchor);\n if (![width, height, availableHeight].every(Number.isFinite) || width < 0 || height < 0 || availableHeight < 0) {\n throw new RangeError(\"Liquid Toast measurements must be finite and non-negative\");\n }\n let anchorWidth: number = liquidToastRecipe.capsule.width;\n let anchorHeight: number = liquidToastRecipe.capsule.height;\n let anchorX = (width - anchorWidth) / 2;\n let anchorY = 0;\n if (anchor.kind === \"island\" && windowOrigin) {\n const x = anchor.frame.x - windowOrigin.x;\n const y = anchor.frame.y - windowOrigin.y;\n // Rotation/stale host measurements fall back to capsule instead of drawing over a cutout.\n if (x >= 0 && x + anchor.frame.width <= width && y + anchor.frame.height <= availableHeight) {\n anchorX = x; anchorY = y; anchorWidth = anchor.frame.width; anchorHeight = anchor.frame.height;\n }\n }\n const cardWidth = Math.min(width, liquidToastRecipe.maxWidth);\n const cardTop = Math.max(0, anchorY + anchorHeight + liquidToastRecipe.gap);\n const canvasTop = Math.min(0, anchorY) - liquidToastRecipe.blur * 2;\n return {\n width, height, cardWidth, cardTop, cardLeft: (width - cardWidth) / 2,\n anchorX, anchorY, anchorWidth, anchorHeight, canvasTop,\n canvasHeight: cardTop + height - canvasTop + 32,\n fits: width >= 240 && height > 0 && cardTop + height <= availableHeight,\n };\n}\n\nexport function buildLiquidToastGeometry(drop: number, expand: number, layout: LiquidToastLayout) {\n \"worklet\";\n const clamp = (n: number) => Math.max(0, Math.min(1, n));\n const mix = (a: number, b: number, t: number) => a + (b - a) * t;\n const grow = 1 - (1 - clamp(drop / 0.7)) ** 1.25;\n const n = clamp(drop / 0.82);\n // A smooth neck rises and disappears before the card reaches its final location.\n const peak = 1.6 / 3;\n const normal = peak ** 1.6 * (1 - peak) ** 1.4;\n const neck = n <= 0 || n >= 1 ? 0 : (n ** 1.6 * (1 - n) ** 1.4) / normal;\n const stretch = 1 + 0.38 * neck;\n const droplet = 52 * grow;\n const width = Math.max(0, Math.min(layout.width, mix(droplet / stretch, layout.cardWidth, expand)));\n const height = Math.max(0, mix(droplet * stretch, layout.height, expand));\n const originY = layout.anchorY + layout.anchorHeight * 0.66;\n const centerY = mix(originY, layout.cardTop + layout.height / 2, drop);\n const centerX = mix(layout.anchorX + layout.anchorWidth / 2, layout.width / 2, clamp(expand));\n const neckWidth = Math.max(0, Math.min(60, width) * neck);\n const neckY = layout.anchorY + layout.anchorHeight / 2;\n return {\n x: centerX - width / 2, y: centerY - height / 2, width, height,\n radius: Math.max(0, Math.min(mix(droplet / 2, 32, expand), width / 2, height / 2)),\n neckX: layout.anchorX + layout.anchorWidth / 2 - neckWidth / 2,\n neckY, neckWidth, neckHeight: Math.max(0, centerY - neckY),\n offsetY: centerY - (layout.cardTop + layout.height / 2),\n };\n}\n"]}
1
+ {"version":3,"file":"toast-liquid.js","sourceRoot":"","sources":["../src/toast-liquid.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Geometry adapted from rit3zh/expo-dynamic-notifications, commit 5de059a5cbef.\n * The MIT notice is shipped in THIRD_PARTY_NOTICES.md. See docs/plans/liquid-toast.md.\n * Kept separate from the lifecycle: animation must never own a second queue.\n */\nexport const liquidToastRecipe = {\n // 2026-10-02: use a circular in-app origin rather than a second Dynamic Island.\n // Keep the public capsule key; changing geometry does not require callers to migrate.\n capsule: { width: 32, height: 32 },\n // Preserve the settled card top (58) when increasing the anchor height from 24 to 32.\n gap: 26,\n minHeight: 74,\n maxWidth: 396,\n // 2026-10-02 card redesign: the medium 12-unit corner supports a banner silhouette.\n radius: 12,\n dropSize: 52,\n neckWidth: 60,\n blur: 14.3,\n gain: 22,\n threshold: 0.43,\n // These intentionally exceed general HJM motion: the neck needs time to separate.\n // Original choreography is the comparison baseline, not a new global motion scale.\n spring: {\n drop: { duration: 1150, dampingRatio: 0.82 },\n expand: { duration: 1000, dampingRatio: 0.8 },\n reveal: { duration: 700, dampingRatio: 1 },\n tint: { duration: 700, dampingRatio: 1 },\n collapse: { duration: 660, dampingRatio: 0.92, velocity: 2 },\n return: { duration: 1150, dampingRatio: 0.9 },\n fade: { duration: 360, dampingRatio: 1 },\n drag: { duration: 560, dampingRatio: 0.7 },\n },\n // Keep the drop anchor-colored through descent; early tint looked like a gray blob on iPhone 17 (2026-09-30).\n delay: { tint: 420, expand: 340, reveal: 560, collapse: 100, return: 280 },\n swipe: { distance: -18, velocity: -420 },\n} as const;\n\n/** Island frames are explicitly verified window coordinates, never inferred from insets. */\nexport type LiquidToastAnchor = Readonly<{ kind: \"capsule\" }> | Readonly<{\n kind: \"island\";\n frame: Readonly<{ x: number; y: number; width: number; height: number }>;\n}>;\n\nexport function validateLiquidToastAnchor(anchor: LiquidToastAnchor): void {\n if (anchor.kind === \"capsule\") return;\n if (anchor.kind !== \"island\") throw new TypeError(\"Unsupported liquid toast anchor\");\n const frame = anchor.frame;\n if (!frame || ![frame.x, frame.y, frame.width, frame.height].every(Number.isFinite) || frame.x < 0 || frame.y < 0 || frame.width <= 0 || frame.height <= 0) {\n throw new RangeError(\"Liquid Toast island frame must be finite with positive dimensions\");\n }\n}\n\nexport type LiquidToastLayout = Readonly<{\n width: number; height: number; cardWidth: number; cardTop: number; cardLeft: number;\n anchorX: number; anchorY: number; anchorWidth: number; anchorHeight: number;\n canvasTop: number; canvasHeight: number; fits: boolean;\n}>;\n\nexport function resolveLiquidToastLayout(input: Readonly<{\n width: number; height: number; availableHeight: number; anchor: LiquidToastAnchor;\n windowOrigin?: Readonly<{ x: number; y: number }>;\n}>): LiquidToastLayout {\n const { width, height, availableHeight, anchor, windowOrigin } = input;\n validateLiquidToastAnchor(anchor);\n if (![width, height, availableHeight].every(Number.isFinite) || width < 0 || height < 0 || availableHeight < 0) {\n throw new RangeError(\"Liquid Toast measurements must be finite and non-negative\");\n }\n let anchorWidth: number = liquidToastRecipe.capsule.width;\n let anchorHeight: number = liquidToastRecipe.capsule.height;\n let anchorX = (width - anchorWidth) / 2;\n let anchorY = 0;\n if (anchor.kind === \"island\" && windowOrigin) {\n const x = anchor.frame.x - windowOrigin.x;\n const y = anchor.frame.y - windowOrigin.y;\n // Rotation/stale host measurements fall back to capsule instead of drawing over a cutout.\n if (x >= 0 && x + anchor.frame.width <= width && y + anchor.frame.height <= availableHeight) {\n anchorX = x; anchorY = y; anchorWidth = anchor.frame.width; anchorHeight = anchor.frame.height;\n }\n }\n const cardWidth = Math.min(width, liquidToastRecipe.maxWidth);\n const cardTop = Math.max(0, anchorY + anchorHeight + liquidToastRecipe.gap);\n const canvasTop = Math.min(0, anchorY) - liquidToastRecipe.blur * 2;\n return {\n width, height, cardWidth, cardTop, cardLeft: (width - cardWidth) / 2,\n anchorX, anchorY, anchorWidth, anchorHeight, canvasTop,\n canvasHeight: cardTop + height - canvasTop + 32,\n fits: width >= 240 && height > 0 && cardTop + height <= availableHeight,\n };\n}\n\nexport function buildLiquidToastGeometry(drop: number, expand: number, layout: LiquidToastLayout) {\n \"worklet\";\n const clamp = (n: number) => Math.max(0, Math.min(1, n));\n const mix = (a: number, b: number, t: number) => a + (b - a) * t;\n const grow = 1 - (1 - clamp(drop / 0.7)) ** 1.25;\n const n = clamp(drop / 0.82);\n const peak = 1.6 / 3;\n const normal = peak ** 1.6 * (1 - peak) ** 1.4;\n const neck = n <= 0 || n >= 1 ? 0 : (n ** 1.6 * (1 - n) ** 1.4) / normal;\n const stretch = 1 + 0.38 * neck;\n const droplet = liquidToastRecipe.dropSize * grow;\n const width = Math.max(0, Math.min(layout.width, mix(droplet / stretch, layout.cardWidth, expand)));\n const height = Math.max(0, mix(droplet * stretch, layout.height, expand));\n const originY = layout.anchorY + layout.anchorHeight * 0.66;\n const centerY = mix(originY, layout.cardTop + layout.height / 2, drop);\n const centerX = mix(layout.anchorX + layout.anchorWidth / 2, layout.width / 2, clamp(expand));\n const neckWidth = Math.max(0, Math.min(liquidToastRecipe.neckWidth, width) * neck);\n const neckY = layout.anchorY + layout.anchorHeight / 2;\n return {\n x: centerX - width / 2, y: centerY - height / 2, width, height,\n radius: Math.max(0, Math.min(mix(droplet / 2, liquidToastRecipe.radius, expand), width / 2, height / 2)),\n neckX: layout.anchorX + layout.anchorWidth / 2 - neckWidth / 2,\n neckY, neckWidth, neckHeight: Math.max(0, centerY - neckY),\n offsetY: centerY - (layout.cardTop + layout.height / 2),\n };\n}\n"]}
package/dist/toast.d.ts CHANGED
@@ -32,7 +32,7 @@ export type ToastDescriptor = Readonly<{
32
32
  priority?: ToastAnnouncementPriority;
33
33
  /** Optional localized announcement when visible copy needs extra context. */
34
34
  announcement?: string;
35
- /** `null` is persistent. Values below the accessible minimum are clamped. */
35
+ /** `null` persists; short durations clamp to the configured floor. */
36
36
  durationMs?: number | null;
37
37
  action?: ToastActionDescriptor;
38
38
  /** Required localized name for the icon-only close affordance. */
@@ -63,8 +63,8 @@ export type ToastAnnouncement = Readonly<{
63
63
  priority: ToastAnnouncementPriority;
64
64
  }>;
65
65
  export declare const toastBehaviorDefaults: {
66
- readonly durationMs: 5000;
67
- readonly minimumDurationMs: 5000;
66
+ readonly durationMs: 3000;
67
+ readonly minimumDurationMs: 3000;
68
68
  readonly priority: "normal";
69
69
  readonly dismissOnAction: true;
70
70
  readonly maxVisible: 1;
@@ -75,7 +75,7 @@ export declare const toastBehaviorDefaults: {
75
75
  };
76
76
  /** Rejects ambiguous identity and inaccessible copy before anything is queued. */
77
77
  export declare function validateToastDescriptor(descriptor: ToastDescriptor): void;
78
- /** Actionable notifications persist by default; every timer has a five-second floor. */
78
+ /** Actions persist by default; timed notices follow the shared 3-second floor. */
79
79
  export declare function resolveToastDuration(descriptor: ToastDescriptor): number | null;
80
80
  export declare function resolveToastDescriptor(descriptor: ToastDescriptor): ResolvedToastDescriptor;
81
81
  export declare function resolveToastAnnouncement(descriptor: ToastDescriptor): ToastAnnouncement;
@@ -1 +1 @@
1
- {"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../src/toast.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../src/toast.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AACrI,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE9E,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAC7B,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,QAAQ,CAAC;AACtD,MAAM,MAAM,yBAAyB,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC1D,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,OAAO,GACP,QAAQ,GACR,SAAS,GACT,cAAc,GACd,cAAc,GACd,WAAW,CAAC;AAChB,MAAM,MAAM,kBAAkB,GAC1B,SAAS,GACT,QAAQ,GACR,cAAc,GACd,QAAQ,GACR,OAAO,GACP,cAAc,GACd,gBAAgB,GAChB,aAAa,CAAC;AAClB,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,QAAQ,CAAC;AACvD,MAAM,MAAM,sBAAsB,GAAG,UAAU,GAAG,SAAS,CAAC;AAC5D,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;AAEtE,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,IAAI,IAAI,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC;IACrC,sEAAsE;IACtE,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,uFAAuF;IACvF,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,mFAAmF;IACnF,QAAQ,CAAC,EAAE,yBAAyB,CAAC;IACrC,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAClD,CAAC,CAAC;AAEH,MAAM,MAAM,6BAA6B,GAAG,QAAQ,CAAC;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,IAAI,IAAI,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,QAAQ,CAAC;IAC7C,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,YAAY,EAAE,iBAAiB,CAAC;IAChC,QAAQ,EAAE,yBAAyB,CAAC;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,6BAA6B,GAAG,IAAI,CAAC;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;CAC1D,CAAC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,yBAAyB,CAAC;CACrC,CAAC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;CAqBhC,CAAC;AAgBH,kFAAkF;AAClF,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI,CAmCzE;AAED,kFAAkF;AAClF,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAO/E;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,eAAe,GAC1B,uBAAuB,CA8BzB;AAED,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,eAAe,GAC1B,iBAAiB,CAGnB;AAED,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AACrE,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,SAAS,GACT,QAAQ,GACR,YAAY,GACZ,SAAS,CAAC;AAEd,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IACxC,MAAM,EAAE,gBAAgB,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAC;CACvC,CAAC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,EAAE,uBAAuB,CAAC;IACpC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,kBAAkB,GAAG,IAAI,CAAC;CAC1C,CAAC,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IAClC,WAAW,IAAI,oBAAoB,CAAC;IACpC,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAC5C,qEAAqE;IACrE,IAAI,IAAI,OAAO,CAAC;IAChB,MAAM,CAAC,UAAU,EAAE,eAAe,EAAE,WAAW,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC;IACnF,KAAK,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC;IACzC,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC;IAC1C,kFAAkF;IAClF,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IACxC,YAAY,IAAI,OAAO,CAAC;IACxB,OAAO,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC;IAC7C,sFAAsF;IACtF,YAAY,IAAI,OAAO,CAAC;IACxB,SAAS,IAAI,OAAO,CAAC;CACtB,CAAC,CAAC;AAQH,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,eAAe,GAAG,YAAY,CAkL5E;AAED,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,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;CACtC,CAAC,CAAC;AAUH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,eAAe,CAAC,EAAE,oBAAoB,CAAC;IACvC,iBAAiB,CAAC,EAAE,sBAAsB,CAAC;CAC5C,CAAC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAC1B,QAAQ,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,SAAS,GAAG,QAAQ,CAAA;CAAE,CAAC,GAC3E,QAAQ,CAAC;IAAE,OAAO,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,SAAS,GAAG,QAAQ,CAAA;CAAE,CAAC,GAC7E,QAAQ,CAAC;IAAE,OAAO,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAA;CAAE,CAAC,GAC9E,QAAQ,CAAC;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,CAAC,CAAC;AAE9E,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IACxC,OAAO,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACzC,MAAM,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACzC,CAAC,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,WAAW,IAAI,kBAAkB,CAAC;IAClC,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAC5C,OAAO,CAAC,UAAU,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,kBAAkB,CAAC;IACxF,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC;IACnC,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC;IAC1D,6CAA6C;IAC7C,KAAK,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC;IAC5B,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC;IACtD,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC;IACvD,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAAC;IAC3C,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAAC;IAC5C,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IACvC,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC;IACnC,mFAAmF;IACnF,OAAO,IAAI,OAAO,CAAC;CACpB,CAAC,CAAC;AAyCH;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,iBAAsB,GAAG,UAAU,CA2N5E"}
package/dist/toast.js CHANGED
@@ -1,7 +1,8 @@
1
1
  export { liquidToastRecipe, resolveLiquidToastLayout, buildLiquidToastGeometry, validateLiquidToastAnchor } from "./toast-liquid.js";
2
2
  export const toastBehaviorDefaults = {
3
- durationMs: 5000,
4
- minimumDurationMs: 5000,
3
+ // 2026-10-02: product chose 3s over 5s for both presentations; actions may persist.
4
+ durationMs: 3000,
5
+ minimumDurationMs: 3000,
5
6
  priority: "normal",
6
7
  dismissOnAction: true,
7
8
  maxVisible: 1,
@@ -58,7 +59,7 @@ export function validateToastDescriptor(descriptor) {
58
59
  }
59
60
  }
60
61
  }
61
- /** Actionable notifications persist by default; every timer has a five-second floor. */
62
+ /** Actions persist by default; timed notices follow the shared 3-second floor. */
62
63
  export function resolveToastDuration(descriptor) {
63
64
  validateToastDescriptor(descriptor);
64
65
  if (descriptor.durationMs === null)
package/dist/toast.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"toast.js","sourceRoot":"","sources":["../src/toast.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ToastTone } from \"./component-recipes.js\";\n\nexport { liquidToastRecipe, resolveLiquidToastLayout, buildLiquidToastGeometry, validateLiquidToastAnchor } from \"./toast-liquid.js\";\nexport type { LiquidToastAnchor, LiquidToastLayout } from \"./toast-liquid.js\";\n\nexport type ToastId = string;\nexport type ToastPresentation = \"standard\" | \"liquid\";\nexport type ToastAnnouncementPriority = \"normal\" | \"high\";\nexport type ToastPauseReason =\n | \"pointer\"\n | \"focus\"\n | \"window\"\n | \"gesture\"\n | \"programmatic\"\n | \"presentation\"\n | \"occlusion\";\nexport type ToastDismissReason =\n | \"timeout\"\n | \"action\"\n | \"close-action\"\n | \"escape\"\n | \"swipe\"\n | \"programmatic\"\n | \"queue-overflow\"\n | \"interrupted\";\nexport type ToastDuplicatePolicy = \"update\" | \"ignore\";\nexport type ToastTimerUpdatePolicy = \"preserve\" | \"restart\";\nexport type ToastOverflowPolicy = \"discard-oldest\" | \"discard-newest\";\n\nexport type ToastActionDescriptor = Readonly<{\n label: string;\n accessibilityLabel?: string;\n onAction(): void;\n dismissOnAction?: boolean;\n}>;\n\n/**\n * Renderer-neutral copy and behavior for one notification. Copy stays plain\n * text so Web and Native can announce the exact same message without accepting\n * renderer nodes in the core package.\n */\nexport type ToastDescriptor = Readonly<{\n /** Stable product-owned identity used for in-place de-duplication. */\n id: ToastId;\n title?: string;\n description: string;\n tone?: ToastTone;\n /** Optional Native presentation; unsupported renderers retain the standard surface. */\n presentation?: ToastPresentation;\n /** High priority interrupts; normal priority waits for a graceful announcement. */\n priority?: ToastAnnouncementPriority;\n /** Optional localized announcement when visible copy needs extra context. */\n announcement?: string;\n /** `null` is persistent. Values below the accessible minimum are clamped. */\n durationMs?: number | null;\n action?: ToastActionDescriptor;\n /** Required localized name for the icon-only close affordance. */\n closeLabel: string;\n onDismiss?: (reason: ToastDismissReason) => void;\n}>;\n\nexport type ResolvedToastActionDescriptor = Readonly<{\n label: string;\n accessibilityLabel: string;\n onAction(): void;\n dismissOnAction: boolean;\n}>;\n\nexport type ResolvedToastDescriptor = Readonly<{\n id: ToastId;\n title: string | null;\n description: string;\n tone: ToastTone;\n presentation: ToastPresentation;\n priority: ToastAnnouncementPriority;\n announcement: string;\n durationMs: number | null;\n action: ResolvedToastActionDescriptor | null;\n closeLabel: string;\n onDismiss: ((reason: ToastDismissReason) => void) | null;\n}>;\n\nexport type ToastAnnouncement = Readonly<{\n message: string;\n priority: ToastAnnouncementPriority;\n}>;\n\nexport const toastBehaviorDefaults = {\n durationMs: 5000,\n minimumDurationMs: 5000,\n priority: \"normal\",\n dismissOnAction: true,\n maxVisible: 1,\n maxQueued: 20,\n duplicatePolicy: \"update\",\n timerUpdatePolicy: \"preserve\",\n overflowPolicy: \"discard-oldest\",\n} as const satisfies Readonly<{\n durationMs: number;\n minimumDurationMs: number;\n priority: ToastAnnouncementPriority;\n dismissOnAction: boolean;\n maxVisible: number;\n maxQueued: number;\n duplicatePolicy: ToastDuplicatePolicy;\n timerUpdatePolicy: ToastTimerUpdatePolicy;\n overflowPolicy: ToastOverflowPolicy;\n}>;\n\nconst toastTones: readonly ToastTone[] = [\n \"neutral\",\n \"info\",\n \"success\",\n \"warning\",\n \"danger\",\n];\n\nfunction assertCopy(value: string, field: string): void {\n if (value.trim().length === 0) {\n throw new TypeError(`Toast ${field} must not be empty`);\n }\n}\n\n/** Rejects ambiguous identity and inaccessible copy before anything is queued. */\nexport function validateToastDescriptor(descriptor: ToastDescriptor): void {\n assertCopy(descriptor.id, \"id\");\n if (descriptor.id !== descriptor.id.trim()) {\n throw new TypeError(\"Toast id must not start or end with whitespace\");\n }\n assertCopy(descriptor.description, \"description\");\n assertCopy(descriptor.closeLabel, \"closeLabel\");\n if (descriptor.title !== undefined) assertCopy(descriptor.title, \"title\");\n if (descriptor.announcement !== undefined) {\n assertCopy(descriptor.announcement, \"announcement\");\n }\n if (descriptor.tone !== undefined && !toastTones.includes(descriptor.tone)) {\n throw new TypeError(`Unsupported Toast tone: ${String(descriptor.tone)}`);\n }\n if (\n descriptor.priority !== undefined &&\n descriptor.priority !== \"normal\" &&\n descriptor.priority !== \"high\"\n ) {\n throw new TypeError(`Unsupported Toast priority: ${String(descriptor.priority)}`);\n }\n if (descriptor.presentation !== undefined && ![\"standard\", \"liquid\"].includes(descriptor.presentation)) {\n throw new TypeError(`Unsupported Toast presentation: ${String(descriptor.presentation)}`);\n }\n if (descriptor.durationMs !== undefined && descriptor.durationMs !== null) {\n if (!Number.isFinite(descriptor.durationMs) || descriptor.durationMs <= 0) {\n throw new RangeError(\"Toast durationMs must be a positive finite number or null\");\n }\n }\n if (descriptor.action) {\n assertCopy(descriptor.action.label, \"action.label\");\n if (descriptor.action.accessibilityLabel !== undefined) {\n assertCopy(descriptor.action.accessibilityLabel, \"action.accessibilityLabel\");\n }\n }\n}\n\n/** Actionable notifications persist by default; every timer has a five-second floor. */\nexport function resolveToastDuration(descriptor: ToastDescriptor): number | null {\n validateToastDescriptor(descriptor);\n if (descriptor.durationMs === null) return null;\n if (descriptor.durationMs === undefined) {\n return descriptor.action ? null : toastBehaviorDefaults.durationMs;\n }\n return Math.max(descriptor.durationMs, toastBehaviorDefaults.minimumDurationMs);\n}\n\nexport function resolveToastDescriptor(\n descriptor: ToastDescriptor,\n): ResolvedToastDescriptor {\n validateToastDescriptor(descriptor);\n const title = descriptor.title ?? null;\n const announcement =\n descriptor.announcement ??\n (title === null ? descriptor.description : `${title}. ${descriptor.description}`);\n const action = descriptor.action\n ? {\n label: descriptor.action.label,\n accessibilityLabel:\n descriptor.action.accessibilityLabel ?? descriptor.action.label,\n onAction: descriptor.action.onAction,\n dismissOnAction:\n descriptor.action.dismissOnAction ?? toastBehaviorDefaults.dismissOnAction,\n }\n : null;\n\n return {\n id: descriptor.id,\n title,\n description: descriptor.description,\n tone: descriptor.tone ?? \"neutral\",\n presentation: descriptor.presentation ?? \"standard\",\n priority: descriptor.priority ?? toastBehaviorDefaults.priority,\n announcement,\n durationMs: resolveToastDuration(descriptor),\n action,\n closeLabel: descriptor.closeLabel,\n onDismiss: descriptor.onDismiss ?? null,\n };\n}\n\nexport function resolveToastAnnouncement(\n descriptor: ToastDescriptor,\n): ToastAnnouncement {\n const resolved = resolveToastDescriptor(descriptor);\n return { message: resolved.announcement, priority: resolved.priority };\n}\n\nexport type ToastPhase = \"queued\" | \"visible\" | \"closing\" | \"closed\";\nexport type ToastTimerStatus =\n | \"waiting\"\n | \"running\"\n | \"paused\"\n | \"persistent\"\n | \"stopped\";\n\nexport type ToastTimerSnapshot = Readonly<{\n status: ToastTimerStatus;\n durationMs: number | null;\n remainingMs: number | null;\n pausedBy: readonly ToastPauseReason[];\n}>;\n\nexport type ToastSessionSnapshot = Readonly<{\n revision: number;\n phase: ToastPhase;\n descriptor: ResolvedToastDescriptor;\n timer: ToastTimerSnapshot;\n actionInvoked: boolean;\n dismissReason: ToastDismissReason | null;\n}>;\n\nexport type ToastSession = Readonly<{\n getSnapshot(): ToastSessionSnapshot;\n subscribe(listener: () => void): () => void;\n /** Starts visibility and the timer. Queued time is never counted. */\n show(): boolean;\n update(descriptor: ToastDescriptor, timerPolicy?: ToastTimerUpdatePolicy): boolean;\n pause(reason: ToastPauseReason): boolean;\n resume(reason: ToastPauseReason): boolean;\n /** Advances a renderer-owned clock; no global timer or Date dependency exists. */\n advanceTime(elapsedMs: number): boolean;\n invokeAction(): boolean;\n dismiss(reason: ToastDismissReason): boolean;\n /** Renderers call this once exit motion or immediate reduced-motion exit finishes. */\n completeExit(): boolean;\n interrupt(): boolean;\n}>;\n\nfunction assertElapsedTime(elapsedMs: number): void {\n if (!Number.isFinite(elapsedMs) || elapsedMs < 0) {\n throw new RangeError(\"Toast elapsed time must be a non-negative finite number\");\n }\n}\n\n/** Owns one notification's action, timer, and dismiss lifecycle exactly once. */\nexport function createToastSession(descriptor: ToastDescriptor): ToastSession {\n let resolved = resolveToastDescriptor(descriptor);\n let phase: ToastPhase = \"queued\";\n let revision = 0;\n let elapsedMs = 0;\n let actionInvoked = false;\n let dismissReason: ToastDismissReason | null = null;\n let dismissNotified = false;\n let cachedSnapshot: ToastSessionSnapshot | null = null;\n const pausedBy = new Set<ToastPauseReason>();\n const listeners = new Set<() => void>();\n\n const notify = () => {\n cachedSnapshot = null;\n for (const listener of listeners) listener();\n };\n const timerSnapshot = (): ToastTimerSnapshot => {\n if (resolved.durationMs === null) {\n return {\n status: \"persistent\",\n durationMs: null,\n remainingMs: null,\n pausedBy: [...pausedBy],\n };\n }\n const remainingMs = Math.max(0, resolved.durationMs - elapsedMs);\n const status: ToastTimerStatus =\n phase === \"queued\"\n ? \"waiting\"\n : phase !== \"visible\"\n ? \"stopped\"\n : pausedBy.size > 0\n ? \"paused\"\n : \"running\";\n return {\n status,\n durationMs: resolved.durationMs,\n remainingMs,\n pausedBy: [...pausedBy],\n };\n };\n const snapshot = (): ToastSessionSnapshot => {\n cachedSnapshot ??= {\n revision,\n phase,\n descriptor: resolved,\n timer: timerSnapshot(),\n actionInvoked,\n dismissReason,\n };\n return cachedSnapshot;\n };\n const announceDismiss = (reason: ToastDismissReason) => {\n if (dismissNotified) return;\n dismissNotified = true;\n resolved.onDismiss?.(reason);\n };\n const finishImmediately = (reason: ToastDismissReason): boolean => {\n if (phase === \"closed\") return false;\n phase = \"closed\";\n dismissReason = reason;\n pausedBy.clear();\n notify();\n announceDismiss(reason);\n return true;\n };\n\n const session: ToastSession = {\n getSnapshot: snapshot,\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n show() {\n if (phase !== \"queued\") return false;\n phase = \"visible\";\n notify();\n return true;\n },\n update(nextDescriptor, timerPolicy = toastBehaviorDefaults.timerUpdatePolicy) {\n if (phase === \"closing\" || phase === \"closed\") return false;\n if (nextDescriptor.id !== resolved.id) {\n throw new TypeError(\"A Toast session cannot change its stable id\");\n }\n if (timerPolicy !== \"preserve\" && timerPolicy !== \"restart\") {\n throw new TypeError(`Unsupported Toast timer update policy: ${String(timerPolicy)}`);\n }\n const next = resolveToastDescriptor(nextDescriptor);\n resolved = next;\n revision += 1;\n actionInvoked = false;\n dismissReason = null;\n dismissNotified = false;\n if (phase === \"queued\" || timerPolicy === \"restart\") elapsedMs = 0;\n\n if (\n phase === \"visible\" &&\n resolved.durationMs !== null &&\n elapsedMs >= resolved.durationMs\n ) {\n elapsedMs = resolved.durationMs;\n phase = \"closing\";\n dismissReason = \"timeout\";\n }\n notify();\n return true;\n },\n pause(reason) {\n if (phase !== \"visible\" || pausedBy.has(reason)) return false;\n pausedBy.add(reason);\n notify();\n return true;\n },\n resume(reason) {\n if (phase !== \"visible\" || !pausedBy.delete(reason)) return false;\n notify();\n return true;\n },\n advanceTime(deltaMs) {\n assertElapsedTime(deltaMs);\n if (\n deltaMs === 0 ||\n phase !== \"visible\" ||\n resolved.durationMs === null ||\n pausedBy.size > 0\n ) {\n return false;\n }\n elapsedMs = Math.min(resolved.durationMs, elapsedMs + deltaMs);\n if (elapsedMs >= resolved.durationMs) {\n phase = \"closing\";\n dismissReason = \"timeout\";\n }\n notify();\n return true;\n },\n invokeAction() {\n const action = resolved.action;\n if (phase !== \"visible\" || action === null || actionInvoked) return false;\n const invokedRevision = revision;\n actionInvoked = true;\n notify();\n try {\n action.onAction();\n } finally {\n if (\n action.dismissOnAction &&\n phase === \"visible\" &&\n revision === invokedRevision\n ) {\n phase = \"closing\";\n dismissReason = \"action\";\n pausedBy.clear();\n notify();\n }\n }\n return true;\n },\n dismiss(reason) {\n if (phase === \"closing\" || phase === \"closed\") return false;\n if (phase === \"queued\") return finishImmediately(reason);\n phase = \"closing\";\n dismissReason = reason;\n pausedBy.clear();\n notify();\n return true;\n },\n completeExit() {\n if (phase !== \"closing\" || dismissReason === null) return false;\n return finishImmediately(dismissReason);\n },\n interrupt() {\n if (phase === \"closed\") return false;\n return finishImmediately(\"interrupted\");\n },\n };\n\n return session;\n}\n\nexport type ToastStoreOptions = Readonly<{\n maxVisible?: number;\n maxQueued?: number;\n duplicatePolicy?: ToastDuplicatePolicy;\n timerUpdatePolicy?: ToastTimerUpdatePolicy;\n overflowPolicy?: ToastOverflowPolicy;\n}>;\n\ntype ResolvedToastStoreOptions = Readonly<{\n maxVisible: number;\n maxQueued: number;\n duplicatePolicy: ToastDuplicatePolicy;\n timerUpdatePolicy: ToastTimerUpdatePolicy;\n overflowPolicy: ToastOverflowPolicy;\n}>;\n\nexport type ToastPublishOptions = Readonly<{\n duplicatePolicy?: ToastDuplicatePolicy;\n timerUpdatePolicy?: ToastTimerUpdatePolicy;\n}>;\n\nexport type ToastPublishResult =\n | Readonly<{ outcome: \"added\"; id: ToastId; position: \"visible\" | \"queued\" }>\n | Readonly<{ outcome: \"updated\"; id: ToastId; position: \"visible\" | \"queued\" }>\n | Readonly<{ outcome: \"ignored\"; id: ToastId; reason: \"duplicate\" | \"closing\" }>\n | Readonly<{ outcome: \"discarded\"; id: ToastId; reason: \"queue-overflow\" }>;\n\nexport type ToastStoreSnapshot = Readonly<{\n visible: readonly ToastSessionSnapshot[];\n queued: readonly ToastSessionSnapshot[];\n}>;\n\nexport type ToastStore = Readonly<{\n getSnapshot(): ToastStoreSnapshot;\n subscribe(listener: () => void): () => void;\n publish(descriptor: ToastDescriptor, options?: ToastPublishOptions): ToastPublishResult;\n invokeAction(id: ToastId): boolean;\n dismiss(id: ToastId, reason: ToastDismissReason): boolean;\n /** Stable-id programmatic close shortcut. */\n close(id: ToastId): boolean;\n pause(id: ToastId, reason: ToastPauseReason): boolean;\n resume(id: ToastId, reason: ToastPauseReason): boolean;\n pauseAll(reason: ToastPauseReason): number;\n resumeAll(reason: ToastPauseReason): number;\n advanceTime(elapsedMs: number): number;\n completeExit(id: ToastId): boolean;\n /** Provider teardown closes every item exactly once without waiting for motion. */\n dispose(): boolean;\n}>;\n\nfunction resolveStoreOptions(options: ToastStoreOptions): ResolvedToastStoreOptions {\n const resolved = {\n maxVisible: options.maxVisible ?? toastBehaviorDefaults.maxVisible,\n maxQueued: options.maxQueued ?? toastBehaviorDefaults.maxQueued,\n duplicatePolicy: options.duplicatePolicy ?? toastBehaviorDefaults.duplicatePolicy,\n timerUpdatePolicy:\n options.timerUpdatePolicy ?? toastBehaviorDefaults.timerUpdatePolicy,\n overflowPolicy: options.overflowPolicy ?? toastBehaviorDefaults.overflowPolicy,\n };\n if (!Number.isInteger(resolved.maxVisible) || resolved.maxVisible < 1) {\n throw new RangeError(\"Toast maxVisible must be an integer of at least one\");\n }\n if (!Number.isInteger(resolved.maxQueued) || resolved.maxQueued < 0) {\n throw new RangeError(\"Toast maxQueued must be a non-negative integer\");\n }\n if (resolved.duplicatePolicy !== \"update\" && resolved.duplicatePolicy !== \"ignore\") {\n throw new TypeError(\n `Unsupported Toast duplicate policy: ${String(resolved.duplicatePolicy)}`,\n );\n }\n if (\n resolved.timerUpdatePolicy !== \"preserve\" &&\n resolved.timerUpdatePolicy !== \"restart\"\n ) {\n throw new TypeError(\n `Unsupported Toast timer update policy: ${String(resolved.timerUpdatePolicy)}`,\n );\n }\n if (\n resolved.overflowPolicy !== \"discard-oldest\" &&\n resolved.overflowPolicy !== \"discard-newest\"\n ) {\n throw new TypeError(\n `Unsupported Toast overflow policy: ${String(resolved.overflowPolicy)}`,\n );\n }\n return resolved;\n}\n\n/**\n * Bounded FIFO coordinator. Visible items keep their slot through exit motion;\n * queued items begin timing only after promotion into a vacated slot.\n */\nexport function createToastStore(options: ToastStoreOptions = {}): ToastStore {\n const configuration = resolveStoreOptions(options);\n const sessions = new Map<ToastId, ToastSession>();\n const unsubscribers = new Map<ToastId, () => void>();\n const visibleIds: ToastId[] = [];\n const queuedIds: ToastId[] = [];\n const listeners = new Set<() => void>();\n const globalPauseReasons = new Set<ToastPauseReason>();\n let disposed = false;\n let cachedSnapshot: ToastStoreSnapshot | null = null;\n\n const notify = () => {\n cachedSnapshot = null;\n for (const listener of listeners) listener();\n };\n const positionOf = (id: ToastId): \"visible\" | \"queued\" =>\n visibleIds.includes(id) ? \"visible\" : \"queued\";\n const snapshot = (): ToastStoreSnapshot => {\n cachedSnapshot ??= {\n visible: visibleIds\n .map((id) => sessions.get(id)?.getSnapshot())\n .filter((entry): entry is ToastSessionSnapshot => entry !== undefined),\n queued: queuedIds\n .map((id) => sessions.get(id)?.getSnapshot())\n .filter((entry): entry is ToastSessionSnapshot => entry !== undefined),\n };\n return cachedSnapshot;\n };\n const removeId = (ids: ToastId[], id: ToastId) => {\n const index = ids.indexOf(id);\n if (index >= 0) ids.splice(index, 1);\n };\n const detachWithoutPromotion = (id: ToastId): ToastSession | undefined => {\n const session = sessions.get(id);\n removeId(visibleIds, id);\n removeId(queuedIds, id);\n sessions.delete(id);\n unsubscribers.get(id)?.();\n unsubscribers.delete(id);\n cachedSnapshot = null;\n return session;\n };\n const promote = () => {\n while (!disposed && visibleIds.length < configuration.maxVisible) {\n const id = queuedIds.shift();\n if (id === undefined) return;\n const session = sessions.get(id);\n if (!session) continue;\n visibleIds.push(id);\n session.show();\n for (const reason of globalPauseReasons) session.pause(reason);\n }\n };\n const removeClosed = (id: ToastId) => {\n removeId(visibleIds, id);\n removeId(queuedIds, id);\n sessions.delete(id);\n unsubscribers.get(id)?.();\n unsubscribers.delete(id);\n promote();\n };\n const attach = (session: ToastSession) => {\n const id = session.getSnapshot().descriptor.id;\n sessions.set(id, session);\n const unsubscribe = session.subscribe(() => {\n if (session.getSnapshot().phase === \"closed\") removeClosed(id);\n notify();\n });\n unsubscribers.set(id, unsubscribe);\n };\n const discard = (descriptor: ToastDescriptor): ToastPublishResult => {\n createToastSession(descriptor).dismiss(\"queue-overflow\");\n return { outcome: \"discarded\", id: descriptor.id, reason: \"queue-overflow\" };\n };\n const assertActive = () => {\n if (disposed) throw new Error(\"Cannot use a disposed Toast store\");\n };\n\n const store: ToastStore = {\n getSnapshot: snapshot,\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n publish(descriptor, publishOptions = {}) {\n assertActive();\n validateToastDescriptor(descriptor);\n const existing = sessions.get(descriptor.id);\n if (existing) {\n if (existing.getSnapshot().phase === \"closing\") {\n return { outcome: \"ignored\", id: descriptor.id, reason: \"closing\" };\n }\n const duplicatePolicy =\n publishOptions.duplicatePolicy ?? configuration.duplicatePolicy;\n if (duplicatePolicy !== \"update\" && duplicatePolicy !== \"ignore\") {\n throw new TypeError(\n `Unsupported Toast duplicate policy: ${String(duplicatePolicy)}`,\n );\n }\n if (duplicatePolicy === \"ignore\") {\n return { outcome: \"ignored\", id: descriptor.id, reason: \"duplicate\" };\n }\n existing.update(\n descriptor,\n publishOptions.timerUpdatePolicy ?? configuration.timerUpdatePolicy,\n );\n return {\n outcome: \"updated\",\n id: descriptor.id,\n position: positionOf(descriptor.id),\n };\n }\n\n if (visibleIds.length >= configuration.maxVisible) {\n if (configuration.maxQueued === 0) return discard(descriptor);\n if (queuedIds.length >= configuration.maxQueued) {\n if (configuration.overflowPolicy === \"discard-newest\") {\n return discard(descriptor);\n }\n const oldestQueuedId = queuedIds[0];\n if (oldestQueuedId !== undefined) {\n const oldestQueued = detachWithoutPromotion(oldestQueuedId);\n let dismissedWithoutError = false;\n try {\n oldestQueued?.dismiss(\"queue-overflow\");\n dismissedWithoutError = true;\n } finally {\n // A throwing onDismiss must not leave external-store consumers\n // with a stale snapshot of the removed queue entry.\n if (!dismissedWithoutError) notify();\n }\n // onDismiss/store subscribers may synchronously publish or dispose.\n // Restart from the public entry point so capacity, duplicates, and\n // disposed state use the actual post-callback store.\n return store.publish(descriptor, publishOptions);\n }\n }\n }\n\n const session = createToastSession(descriptor);\n attach(session);\n if (visibleIds.length < configuration.maxVisible) {\n visibleIds.push(descriptor.id);\n session.show();\n for (const reason of globalPauseReasons) session.pause(reason);\n return { outcome: \"added\", id: descriptor.id, position: \"visible\" };\n }\n queuedIds.push(descriptor.id);\n notify();\n return { outcome: \"added\", id: descriptor.id, position: \"queued\" };\n },\n invokeAction(id) {\n assertActive();\n return sessions.get(id)?.invokeAction() ?? false;\n },\n dismiss(id, reason) {\n assertActive();\n return sessions.get(id)?.dismiss(reason) ?? false;\n },\n close(id) {\n assertActive();\n return sessions.get(id)?.dismiss(\"programmatic\") ?? false;\n },\n pause(id, reason) {\n assertActive();\n return sessions.get(id)?.pause(reason) ?? false;\n },\n resume(id, reason) {\n assertActive();\n return sessions.get(id)?.resume(reason) ?? false;\n },\n pauseAll(reason) {\n assertActive();\n globalPauseReasons.add(reason);\n return [...visibleIds].reduce(\n (count, id) => count + (sessions.get(id)?.pause(reason) ? 1 : 0),\n 0,\n );\n },\n resumeAll(reason) {\n assertActive();\n globalPauseReasons.delete(reason);\n return [...visibleIds].reduce(\n (count, id) => count + (sessions.get(id)?.resume(reason) ? 1 : 0),\n 0,\n );\n },\n advanceTime(deltaMs) {\n assertActive();\n assertElapsedTime(deltaMs);\n return [...visibleIds].reduce(\n (count, id) => count + (sessions.get(id)?.advanceTime(deltaMs) ? 1 : 0),\n 0,\n );\n },\n completeExit(id) {\n assertActive();\n return sessions.get(id)?.completeExit() ?? false;\n },\n dispose() {\n if (disposed) return false;\n disposed = true;\n globalPauseReasons.clear();\n let firstError: unknown;\n for (const session of [...sessions.values()]) {\n try {\n session.interrupt();\n } catch (error) {\n firstError ??= error;\n }\n }\n notify();\n listeners.clear();\n if (firstError !== undefined) throw firstError;\n return true;\n },\n };\n\n return store;\n}\n"]}
1
+ {"version":3,"file":"toast.js","sourceRoot":"","sources":["../src/toast.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ToastTone } from \"./component-recipes.js\";\n\nexport { liquidToastRecipe, resolveLiquidToastLayout, buildLiquidToastGeometry, validateLiquidToastAnchor } from \"./toast-liquid.js\";\nexport type { LiquidToastAnchor, LiquidToastLayout } from \"./toast-liquid.js\";\n\nexport type ToastId = string;\nexport type ToastPresentation = \"standard\" | \"liquid\";\nexport type ToastAnnouncementPriority = \"normal\" | \"high\";\nexport type ToastPauseReason =\n | \"pointer\"\n | \"focus\"\n | \"window\"\n | \"gesture\"\n | \"programmatic\"\n | \"presentation\"\n | \"occlusion\";\nexport type ToastDismissReason =\n | \"timeout\"\n | \"action\"\n | \"close-action\"\n | \"escape\"\n | \"swipe\"\n | \"programmatic\"\n | \"queue-overflow\"\n | \"interrupted\";\nexport type ToastDuplicatePolicy = \"update\" | \"ignore\";\nexport type ToastTimerUpdatePolicy = \"preserve\" | \"restart\";\nexport type ToastOverflowPolicy = \"discard-oldest\" | \"discard-newest\";\n\nexport type ToastActionDescriptor = Readonly<{\n label: string;\n accessibilityLabel?: string;\n onAction(): void;\n dismissOnAction?: boolean;\n}>;\n\n/**\n * Renderer-neutral copy and behavior for one notification. Copy stays plain\n * text so Web and Native can announce the exact same message without accepting\n * renderer nodes in the core package.\n */\nexport type ToastDescriptor = Readonly<{\n /** Stable product-owned identity used for in-place de-duplication. */\n id: ToastId;\n title?: string;\n description: string;\n tone?: ToastTone;\n /** Optional Native presentation; unsupported renderers retain the standard surface. */\n presentation?: ToastPresentation;\n /** High priority interrupts; normal priority waits for a graceful announcement. */\n priority?: ToastAnnouncementPriority;\n /** Optional localized announcement when visible copy needs extra context. */\n announcement?: string;\n /** `null` persists; short durations clamp to the configured floor. */\n durationMs?: number | null;\n action?: ToastActionDescriptor;\n /** Required localized name for the icon-only close affordance. */\n closeLabel: string;\n onDismiss?: (reason: ToastDismissReason) => void;\n}>;\n\nexport type ResolvedToastActionDescriptor = Readonly<{\n label: string;\n accessibilityLabel: string;\n onAction(): void;\n dismissOnAction: boolean;\n}>;\n\nexport type ResolvedToastDescriptor = Readonly<{\n id: ToastId;\n title: string | null;\n description: string;\n tone: ToastTone;\n presentation: ToastPresentation;\n priority: ToastAnnouncementPriority;\n announcement: string;\n durationMs: number | null;\n action: ResolvedToastActionDescriptor | null;\n closeLabel: string;\n onDismiss: ((reason: ToastDismissReason) => void) | null;\n}>;\n\nexport type ToastAnnouncement = Readonly<{\n message: string;\n priority: ToastAnnouncementPriority;\n}>;\n\nexport const toastBehaviorDefaults = {\n // 2026-10-02: product chose 3s over 5s for both presentations; actions may persist.\n durationMs: 3000,\n minimumDurationMs: 3000,\n priority: \"normal\",\n dismissOnAction: true,\n maxVisible: 1,\n maxQueued: 20,\n duplicatePolicy: \"update\",\n timerUpdatePolicy: \"preserve\",\n overflowPolicy: \"discard-oldest\",\n} as const satisfies Readonly<{\n durationMs: number;\n minimumDurationMs: number;\n priority: ToastAnnouncementPriority;\n dismissOnAction: boolean;\n maxVisible: number;\n maxQueued: number;\n duplicatePolicy: ToastDuplicatePolicy;\n timerUpdatePolicy: ToastTimerUpdatePolicy;\n overflowPolicy: ToastOverflowPolicy;\n}>;\n\nconst toastTones: readonly ToastTone[] = [\n \"neutral\",\n \"info\",\n \"success\",\n \"warning\",\n \"danger\",\n];\n\nfunction assertCopy(value: string, field: string): void {\n if (value.trim().length === 0) {\n throw new TypeError(`Toast ${field} must not be empty`);\n }\n}\n\n/** Rejects ambiguous identity and inaccessible copy before anything is queued. */\nexport function validateToastDescriptor(descriptor: ToastDescriptor): void {\n assertCopy(descriptor.id, \"id\");\n if (descriptor.id !== descriptor.id.trim()) {\n throw new TypeError(\"Toast id must not start or end with whitespace\");\n }\n assertCopy(descriptor.description, \"description\");\n assertCopy(descriptor.closeLabel, \"closeLabel\");\n if (descriptor.title !== undefined) assertCopy(descriptor.title, \"title\");\n if (descriptor.announcement !== undefined) {\n assertCopy(descriptor.announcement, \"announcement\");\n }\n if (descriptor.tone !== undefined && !toastTones.includes(descriptor.tone)) {\n throw new TypeError(`Unsupported Toast tone: ${String(descriptor.tone)}`);\n }\n if (\n descriptor.priority !== undefined &&\n descriptor.priority !== \"normal\" &&\n descriptor.priority !== \"high\"\n ) {\n throw new TypeError(`Unsupported Toast priority: ${String(descriptor.priority)}`);\n }\n if (descriptor.presentation !== undefined && ![\"standard\", \"liquid\"].includes(descriptor.presentation)) {\n throw new TypeError(`Unsupported Toast presentation: ${String(descriptor.presentation)}`);\n }\n if (descriptor.durationMs !== undefined && descriptor.durationMs !== null) {\n if (!Number.isFinite(descriptor.durationMs) || descriptor.durationMs <= 0) {\n throw new RangeError(\"Toast durationMs must be a positive finite number or null\");\n }\n }\n if (descriptor.action) {\n assertCopy(descriptor.action.label, \"action.label\");\n if (descriptor.action.accessibilityLabel !== undefined) {\n assertCopy(descriptor.action.accessibilityLabel, \"action.accessibilityLabel\");\n }\n }\n}\n\n/** Actions persist by default; timed notices follow the shared 3-second floor. */\nexport function resolveToastDuration(descriptor: ToastDescriptor): number | null {\n validateToastDescriptor(descriptor);\n if (descriptor.durationMs === null) return null;\n if (descriptor.durationMs === undefined) {\n return descriptor.action ? null : toastBehaviorDefaults.durationMs;\n }\n return Math.max(descriptor.durationMs, toastBehaviorDefaults.minimumDurationMs);\n}\n\nexport function resolveToastDescriptor(\n descriptor: ToastDescriptor,\n): ResolvedToastDescriptor {\n validateToastDescriptor(descriptor);\n const title = descriptor.title ?? null;\n const announcement =\n descriptor.announcement ??\n (title === null ? descriptor.description : `${title}. ${descriptor.description}`);\n const action = descriptor.action\n ? {\n label: descriptor.action.label,\n accessibilityLabel:\n descriptor.action.accessibilityLabel ?? descriptor.action.label,\n onAction: descriptor.action.onAction,\n dismissOnAction:\n descriptor.action.dismissOnAction ?? toastBehaviorDefaults.dismissOnAction,\n }\n : null;\n\n return {\n id: descriptor.id,\n title,\n description: descriptor.description,\n tone: descriptor.tone ?? \"neutral\",\n presentation: descriptor.presentation ?? \"standard\",\n priority: descriptor.priority ?? toastBehaviorDefaults.priority,\n announcement,\n durationMs: resolveToastDuration(descriptor),\n action,\n closeLabel: descriptor.closeLabel,\n onDismiss: descriptor.onDismiss ?? null,\n };\n}\n\nexport function resolveToastAnnouncement(\n descriptor: ToastDescriptor,\n): ToastAnnouncement {\n const resolved = resolveToastDescriptor(descriptor);\n return { message: resolved.announcement, priority: resolved.priority };\n}\n\nexport type ToastPhase = \"queued\" | \"visible\" | \"closing\" | \"closed\";\nexport type ToastTimerStatus =\n | \"waiting\"\n | \"running\"\n | \"paused\"\n | \"persistent\"\n | \"stopped\";\n\nexport type ToastTimerSnapshot = Readonly<{\n status: ToastTimerStatus;\n durationMs: number | null;\n remainingMs: number | null;\n pausedBy: readonly ToastPauseReason[];\n}>;\n\nexport type ToastSessionSnapshot = Readonly<{\n revision: number;\n phase: ToastPhase;\n descriptor: ResolvedToastDescriptor;\n timer: ToastTimerSnapshot;\n actionInvoked: boolean;\n dismissReason: ToastDismissReason | null;\n}>;\n\nexport type ToastSession = Readonly<{\n getSnapshot(): ToastSessionSnapshot;\n subscribe(listener: () => void): () => void;\n /** Starts visibility and the timer. Queued time is never counted. */\n show(): boolean;\n update(descriptor: ToastDescriptor, timerPolicy?: ToastTimerUpdatePolicy): boolean;\n pause(reason: ToastPauseReason): boolean;\n resume(reason: ToastPauseReason): boolean;\n /** Advances a renderer-owned clock; no global timer or Date dependency exists. */\n advanceTime(elapsedMs: number): boolean;\n invokeAction(): boolean;\n dismiss(reason: ToastDismissReason): boolean;\n /** Renderers call this once exit motion or immediate reduced-motion exit finishes. */\n completeExit(): boolean;\n interrupt(): boolean;\n}>;\n\nfunction assertElapsedTime(elapsedMs: number): void {\n if (!Number.isFinite(elapsedMs) || elapsedMs < 0) {\n throw new RangeError(\"Toast elapsed time must be a non-negative finite number\");\n }\n}\n\n/** Owns one notification's action, timer, and dismiss lifecycle exactly once. */\nexport function createToastSession(descriptor: ToastDescriptor): ToastSession {\n let resolved = resolveToastDescriptor(descriptor);\n let phase: ToastPhase = \"queued\";\n let revision = 0;\n let elapsedMs = 0;\n let actionInvoked = false;\n let dismissReason: ToastDismissReason | null = null;\n let dismissNotified = false;\n let cachedSnapshot: ToastSessionSnapshot | null = null;\n const pausedBy = new Set<ToastPauseReason>();\n const listeners = new Set<() => void>();\n\n const notify = () => {\n cachedSnapshot = null;\n for (const listener of listeners) listener();\n };\n const timerSnapshot = (): ToastTimerSnapshot => {\n if (resolved.durationMs === null) {\n return {\n status: \"persistent\",\n durationMs: null,\n remainingMs: null,\n pausedBy: [...pausedBy],\n };\n }\n const remainingMs = Math.max(0, resolved.durationMs - elapsedMs);\n const status: ToastTimerStatus =\n phase === \"queued\"\n ? \"waiting\"\n : phase !== \"visible\"\n ? \"stopped\"\n : pausedBy.size > 0\n ? \"paused\"\n : \"running\";\n return {\n status,\n durationMs: resolved.durationMs,\n remainingMs,\n pausedBy: [...pausedBy],\n };\n };\n const snapshot = (): ToastSessionSnapshot => {\n cachedSnapshot ??= {\n revision,\n phase,\n descriptor: resolved,\n timer: timerSnapshot(),\n actionInvoked,\n dismissReason,\n };\n return cachedSnapshot;\n };\n const announceDismiss = (reason: ToastDismissReason) => {\n if (dismissNotified) return;\n dismissNotified = true;\n resolved.onDismiss?.(reason);\n };\n const finishImmediately = (reason: ToastDismissReason): boolean => {\n if (phase === \"closed\") return false;\n phase = \"closed\";\n dismissReason = reason;\n pausedBy.clear();\n notify();\n announceDismiss(reason);\n return true;\n };\n\n const session: ToastSession = {\n getSnapshot: snapshot,\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n show() {\n if (phase !== \"queued\") return false;\n phase = \"visible\";\n notify();\n return true;\n },\n update(nextDescriptor, timerPolicy = toastBehaviorDefaults.timerUpdatePolicy) {\n if (phase === \"closing\" || phase === \"closed\") return false;\n if (nextDescriptor.id !== resolved.id) {\n throw new TypeError(\"A Toast session cannot change its stable id\");\n }\n if (timerPolicy !== \"preserve\" && timerPolicy !== \"restart\") {\n throw new TypeError(`Unsupported Toast timer update policy: ${String(timerPolicy)}`);\n }\n const next = resolveToastDescriptor(nextDescriptor);\n resolved = next;\n revision += 1;\n actionInvoked = false;\n dismissReason = null;\n dismissNotified = false;\n if (phase === \"queued\" || timerPolicy === \"restart\") elapsedMs = 0;\n\n if (\n phase === \"visible\" &&\n resolved.durationMs !== null &&\n elapsedMs >= resolved.durationMs\n ) {\n elapsedMs = resolved.durationMs;\n phase = \"closing\";\n dismissReason = \"timeout\";\n }\n notify();\n return true;\n },\n pause(reason) {\n if (phase !== \"visible\" || pausedBy.has(reason)) return false;\n pausedBy.add(reason);\n notify();\n return true;\n },\n resume(reason) {\n if (phase !== \"visible\" || !pausedBy.delete(reason)) return false;\n notify();\n return true;\n },\n advanceTime(deltaMs) {\n assertElapsedTime(deltaMs);\n if (\n deltaMs === 0 ||\n phase !== \"visible\" ||\n resolved.durationMs === null ||\n pausedBy.size > 0\n ) {\n return false;\n }\n elapsedMs = Math.min(resolved.durationMs, elapsedMs + deltaMs);\n if (elapsedMs >= resolved.durationMs) {\n phase = \"closing\";\n dismissReason = \"timeout\";\n }\n notify();\n return true;\n },\n invokeAction() {\n const action = resolved.action;\n if (phase !== \"visible\" || action === null || actionInvoked) return false;\n const invokedRevision = revision;\n actionInvoked = true;\n notify();\n try {\n action.onAction();\n } finally {\n if (\n action.dismissOnAction &&\n phase === \"visible\" &&\n revision === invokedRevision\n ) {\n phase = \"closing\";\n dismissReason = \"action\";\n pausedBy.clear();\n notify();\n }\n }\n return true;\n },\n dismiss(reason) {\n if (phase === \"closing\" || phase === \"closed\") return false;\n if (phase === \"queued\") return finishImmediately(reason);\n phase = \"closing\";\n dismissReason = reason;\n pausedBy.clear();\n notify();\n return true;\n },\n completeExit() {\n if (phase !== \"closing\" || dismissReason === null) return false;\n return finishImmediately(dismissReason);\n },\n interrupt() {\n if (phase === \"closed\") return false;\n return finishImmediately(\"interrupted\");\n },\n };\n\n return session;\n}\n\nexport type ToastStoreOptions = Readonly<{\n maxVisible?: number;\n maxQueued?: number;\n duplicatePolicy?: ToastDuplicatePolicy;\n timerUpdatePolicy?: ToastTimerUpdatePolicy;\n overflowPolicy?: ToastOverflowPolicy;\n}>;\n\ntype ResolvedToastStoreOptions = Readonly<{\n maxVisible: number;\n maxQueued: number;\n duplicatePolicy: ToastDuplicatePolicy;\n timerUpdatePolicy: ToastTimerUpdatePolicy;\n overflowPolicy: ToastOverflowPolicy;\n}>;\n\nexport type ToastPublishOptions = Readonly<{\n duplicatePolicy?: ToastDuplicatePolicy;\n timerUpdatePolicy?: ToastTimerUpdatePolicy;\n}>;\n\nexport type ToastPublishResult =\n | Readonly<{ outcome: \"added\"; id: ToastId; position: \"visible\" | \"queued\" }>\n | Readonly<{ outcome: \"updated\"; id: ToastId; position: \"visible\" | \"queued\" }>\n | Readonly<{ outcome: \"ignored\"; id: ToastId; reason: \"duplicate\" | \"closing\" }>\n | Readonly<{ outcome: \"discarded\"; id: ToastId; reason: \"queue-overflow\" }>;\n\nexport type ToastStoreSnapshot = Readonly<{\n visible: readonly ToastSessionSnapshot[];\n queued: readonly ToastSessionSnapshot[];\n}>;\n\nexport type ToastStore = Readonly<{\n getSnapshot(): ToastStoreSnapshot;\n subscribe(listener: () => void): () => void;\n publish(descriptor: ToastDescriptor, options?: ToastPublishOptions): ToastPublishResult;\n invokeAction(id: ToastId): boolean;\n dismiss(id: ToastId, reason: ToastDismissReason): boolean;\n /** Stable-id programmatic close shortcut. */\n close(id: ToastId): boolean;\n pause(id: ToastId, reason: ToastPauseReason): boolean;\n resume(id: ToastId, reason: ToastPauseReason): boolean;\n pauseAll(reason: ToastPauseReason): number;\n resumeAll(reason: ToastPauseReason): number;\n advanceTime(elapsedMs: number): number;\n completeExit(id: ToastId): boolean;\n /** Provider teardown closes every item exactly once without waiting for motion. */\n dispose(): boolean;\n}>;\n\nfunction resolveStoreOptions(options: ToastStoreOptions): ResolvedToastStoreOptions {\n const resolved = {\n maxVisible: options.maxVisible ?? toastBehaviorDefaults.maxVisible,\n maxQueued: options.maxQueued ?? toastBehaviorDefaults.maxQueued,\n duplicatePolicy: options.duplicatePolicy ?? toastBehaviorDefaults.duplicatePolicy,\n timerUpdatePolicy:\n options.timerUpdatePolicy ?? toastBehaviorDefaults.timerUpdatePolicy,\n overflowPolicy: options.overflowPolicy ?? toastBehaviorDefaults.overflowPolicy,\n };\n if (!Number.isInteger(resolved.maxVisible) || resolved.maxVisible < 1) {\n throw new RangeError(\"Toast maxVisible must be an integer of at least one\");\n }\n if (!Number.isInteger(resolved.maxQueued) || resolved.maxQueued < 0) {\n throw new RangeError(\"Toast maxQueued must be a non-negative integer\");\n }\n if (resolved.duplicatePolicy !== \"update\" && resolved.duplicatePolicy !== \"ignore\") {\n throw new TypeError(\n `Unsupported Toast duplicate policy: ${String(resolved.duplicatePolicy)}`,\n );\n }\n if (\n resolved.timerUpdatePolicy !== \"preserve\" &&\n resolved.timerUpdatePolicy !== \"restart\"\n ) {\n throw new TypeError(\n `Unsupported Toast timer update policy: ${String(resolved.timerUpdatePolicy)}`,\n );\n }\n if (\n resolved.overflowPolicy !== \"discard-oldest\" &&\n resolved.overflowPolicy !== \"discard-newest\"\n ) {\n throw new TypeError(\n `Unsupported Toast overflow policy: ${String(resolved.overflowPolicy)}`,\n );\n }\n return resolved;\n}\n\n/**\n * Bounded FIFO coordinator. Visible items keep their slot through exit motion;\n * queued items begin timing only after promotion into a vacated slot.\n */\nexport function createToastStore(options: ToastStoreOptions = {}): ToastStore {\n const configuration = resolveStoreOptions(options);\n const sessions = new Map<ToastId, ToastSession>();\n const unsubscribers = new Map<ToastId, () => void>();\n const visibleIds: ToastId[] = [];\n const queuedIds: ToastId[] = [];\n const listeners = new Set<() => void>();\n const globalPauseReasons = new Set<ToastPauseReason>();\n let disposed = false;\n let cachedSnapshot: ToastStoreSnapshot | null = null;\n\n const notify = () => {\n cachedSnapshot = null;\n for (const listener of listeners) listener();\n };\n const positionOf = (id: ToastId): \"visible\" | \"queued\" =>\n visibleIds.includes(id) ? \"visible\" : \"queued\";\n const snapshot = (): ToastStoreSnapshot => {\n cachedSnapshot ??= {\n visible: visibleIds\n .map((id) => sessions.get(id)?.getSnapshot())\n .filter((entry): entry is ToastSessionSnapshot => entry !== undefined),\n queued: queuedIds\n .map((id) => sessions.get(id)?.getSnapshot())\n .filter((entry): entry is ToastSessionSnapshot => entry !== undefined),\n };\n return cachedSnapshot;\n };\n const removeId = (ids: ToastId[], id: ToastId) => {\n const index = ids.indexOf(id);\n if (index >= 0) ids.splice(index, 1);\n };\n const detachWithoutPromotion = (id: ToastId): ToastSession | undefined => {\n const session = sessions.get(id);\n removeId(visibleIds, id);\n removeId(queuedIds, id);\n sessions.delete(id);\n unsubscribers.get(id)?.();\n unsubscribers.delete(id);\n cachedSnapshot = null;\n return session;\n };\n const promote = () => {\n while (!disposed && visibleIds.length < configuration.maxVisible) {\n const id = queuedIds.shift();\n if (id === undefined) return;\n const session = sessions.get(id);\n if (!session) continue;\n visibleIds.push(id);\n session.show();\n for (const reason of globalPauseReasons) session.pause(reason);\n }\n };\n const removeClosed = (id: ToastId) => {\n removeId(visibleIds, id);\n removeId(queuedIds, id);\n sessions.delete(id);\n unsubscribers.get(id)?.();\n unsubscribers.delete(id);\n promote();\n };\n const attach = (session: ToastSession) => {\n const id = session.getSnapshot().descriptor.id;\n sessions.set(id, session);\n const unsubscribe = session.subscribe(() => {\n if (session.getSnapshot().phase === \"closed\") removeClosed(id);\n notify();\n });\n unsubscribers.set(id, unsubscribe);\n };\n const discard = (descriptor: ToastDescriptor): ToastPublishResult => {\n createToastSession(descriptor).dismiss(\"queue-overflow\");\n return { outcome: \"discarded\", id: descriptor.id, reason: \"queue-overflow\" };\n };\n const assertActive = () => {\n if (disposed) throw new Error(\"Cannot use a disposed Toast store\");\n };\n\n const store: ToastStore = {\n getSnapshot: snapshot,\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n publish(descriptor, publishOptions = {}) {\n assertActive();\n validateToastDescriptor(descriptor);\n const existing = sessions.get(descriptor.id);\n if (existing) {\n if (existing.getSnapshot().phase === \"closing\") {\n return { outcome: \"ignored\", id: descriptor.id, reason: \"closing\" };\n }\n const duplicatePolicy =\n publishOptions.duplicatePolicy ?? configuration.duplicatePolicy;\n if (duplicatePolicy !== \"update\" && duplicatePolicy !== \"ignore\") {\n throw new TypeError(\n `Unsupported Toast duplicate policy: ${String(duplicatePolicy)}`,\n );\n }\n if (duplicatePolicy === \"ignore\") {\n return { outcome: \"ignored\", id: descriptor.id, reason: \"duplicate\" };\n }\n existing.update(\n descriptor,\n publishOptions.timerUpdatePolicy ?? configuration.timerUpdatePolicy,\n );\n return {\n outcome: \"updated\",\n id: descriptor.id,\n position: positionOf(descriptor.id),\n };\n }\n\n if (visibleIds.length >= configuration.maxVisible) {\n if (configuration.maxQueued === 0) return discard(descriptor);\n if (queuedIds.length >= configuration.maxQueued) {\n if (configuration.overflowPolicy === \"discard-newest\") {\n return discard(descriptor);\n }\n const oldestQueuedId = queuedIds[0];\n if (oldestQueuedId !== undefined) {\n const oldestQueued = detachWithoutPromotion(oldestQueuedId);\n let dismissedWithoutError = false;\n try {\n oldestQueued?.dismiss(\"queue-overflow\");\n dismissedWithoutError = true;\n } finally {\n // A throwing onDismiss must not leave external-store consumers\n // with a stale snapshot of the removed queue entry.\n if (!dismissedWithoutError) notify();\n }\n // onDismiss/store subscribers may synchronously publish or dispose.\n // Restart from the public entry point so capacity, duplicates, and\n // disposed state use the actual post-callback store.\n return store.publish(descriptor, publishOptions);\n }\n }\n }\n\n const session = createToastSession(descriptor);\n attach(session);\n if (visibleIds.length < configuration.maxVisible) {\n visibleIds.push(descriptor.id);\n session.show();\n for (const reason of globalPauseReasons) session.pause(reason);\n return { outcome: \"added\", id: descriptor.id, position: \"visible\" };\n }\n queuedIds.push(descriptor.id);\n notify();\n return { outcome: \"added\", id: descriptor.id, position: \"queued\" };\n },\n invokeAction(id) {\n assertActive();\n return sessions.get(id)?.invokeAction() ?? false;\n },\n dismiss(id, reason) {\n assertActive();\n return sessions.get(id)?.dismiss(reason) ?? false;\n },\n close(id) {\n assertActive();\n return sessions.get(id)?.dismiss(\"programmatic\") ?? false;\n },\n pause(id, reason) {\n assertActive();\n return sessions.get(id)?.pause(reason) ?? false;\n },\n resume(id, reason) {\n assertActive();\n return sessions.get(id)?.resume(reason) ?? false;\n },\n pauseAll(reason) {\n assertActive();\n globalPauseReasons.add(reason);\n return [...visibleIds].reduce(\n (count, id) => count + (sessions.get(id)?.pause(reason) ? 1 : 0),\n 0,\n );\n },\n resumeAll(reason) {\n assertActive();\n globalPauseReasons.delete(reason);\n return [...visibleIds].reduce(\n (count, id) => count + (sessions.get(id)?.resume(reason) ? 1 : 0),\n 0,\n );\n },\n advanceTime(deltaMs) {\n assertActive();\n assertElapsedTime(deltaMs);\n return [...visibleIds].reduce(\n (count, id) => count + (sessions.get(id)?.advanceTime(deltaMs) ? 1 : 0),\n 0,\n );\n },\n completeExit(id) {\n assertActive();\n return sessions.get(id)?.completeExit() ?? false;\n },\n dispose() {\n if (disposed) return false;\n disposed = true;\n globalPauseReasons.clear();\n let firstError: unknown;\n for (const session of [...sessions.values()]) {\n try {\n session.interrupt();\n } catch (error) {\n firstError ??= error;\n }\n }\n notify();\n listeners.clear();\n if (firstError !== undefined) throw firstError;\n return true;\n },\n };\n\n return store;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.d.ts","sourceRoot":"","sources":["../src/tooltip.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAC;AAClE,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEtD,MAAM,MAAM,uBAAuB,GAC/B,SAAS,GACT,OAAO,GACP,eAAe,GACf,MAAM,GACN,QAAQ,GACR,oBAAoB,GACpB,iBAAiB,CAAC;AAEtB,MAAM,MAAM,wBAAwB,GAAG,QAAQ,CAAC;IAC9C,MAAM,EAAE,uBAAuB,CAAC;CACjC,CAAC,CAAC;AAEH,yEAAyE;AACzE,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB,CAAC,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG,QAAQ,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,KAAK,EAAE,YAAY,CAAC;CACrB,CAAC,CAAC;AAEH,MAAM,MAAM,0BAA0B,GAAG,QAAQ,CAAC;IAChD,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAAC;CACtE,CAAC,CAAC;AAEH,MAAM,MAAM,4BAA4B,GAAG,QAAQ,CAAC;IAClD,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,CACb,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,wBAAwB,KAC9B,IAAI,CAAC;CACX,CAAC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GACxB,0BAA0B,GAC1B,4BAA4B,CAAC;AAEjC,eAAO,MAAM,yBAAyB;;;CAMpC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;CAO1B,CAAC;AA4BX,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,iBAAiB,GAC5B,IAAI,CA6BN;AAED,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,iBAAiB,GAC5B,yBAAyB,CAO3B;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAoCtE"}
1
+ {"version":3,"file":"tooltip.d.ts","sourceRoot":"","sources":["../src/tooltip.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAC;AAClE,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEtD,MAAM,MAAM,uBAAuB,GAC/B,SAAS,GACT,OAAO,GACP,eAAe,GACf,MAAM,GACN,QAAQ,GACR,oBAAoB,GACpB,iBAAiB,CAAC;AAEtB,MAAM,MAAM,wBAAwB,GAAG,QAAQ,CAAC;IAC9C,MAAM,EAAE,uBAAuB,CAAC;CACjC,CAAC,CAAC;AAEH,yEAAyE;AACzE,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB,CAAC,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG,QAAQ,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,KAAK,EAAE,YAAY,CAAC;CACrB,CAAC,CAAC;AAEH,MAAM,MAAM,0BAA0B,GAAG,QAAQ,CAAC;IAChD,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAAC;CACtE,CAAC,CAAC;AAEH,MAAM,MAAM,4BAA4B,GAAG,QAAQ,CAAC;IAClD,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,CACb,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,wBAAwB,KAC9B,IAAI,CAAC;CACX,CAAC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GACxB,0BAA0B,GAC1B,4BAA4B,CAAC;AAEjC,eAAO,MAAM,yBAAyB;;;CAMpC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;CAO1B,CAAC;AAYX,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,iBAAiB,GAC5B,IAAI,CA6BN;AAED,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,iBAAiB,GAC5B,yBAAyB,CAO3B;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAoCtE"}
package/dist/tooltip.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { isObject, rejectUnknownKeys } from "./internal/object-validation.js";
1
2
  export const tooltipDescriptorDefaults = {
2
3
  placement: "top",
3
4
  align: "center",
@@ -19,21 +20,11 @@ const placements = new Set([
19
20
  const alignments = new Set(["start", "center", "end"]);
20
21
  const descriptorKeys = new Set(["content", "placement", "align"]);
21
22
  const openStateKeys = new Set(["open", "defaultOpen", "onOpenChange"]);
22
- function isObject(value) {
23
- return value !== null && typeof value === "object" && !Array.isArray(value);
24
- }
25
- function rejectUnknownKeys(value, allowed, field) {
26
- for (const key of Object.keys(value)) {
27
- if (!allowed.has(key)) {
28
- throw new TypeError(`Unsupported Tooltip ${field} field: ${key}`);
29
- }
30
- }
31
- }
32
23
  export function validateTooltipDescriptor(descriptor) {
33
24
  if (!isObject(descriptor)) {
34
25
  throw new TypeError("Tooltip descriptor must be an object");
35
26
  }
36
- rejectUnknownKeys(descriptor, descriptorKeys, "descriptor");
27
+ rejectUnknownKeys(descriptor, descriptorKeys, "descriptor", "Tooltip");
37
28
  if (typeof descriptor.content !== "string" ||
38
29
  descriptor.content.trim().length === 0) {
39
30
  throw new TypeError("Tooltip content must not be empty");
@@ -61,7 +52,7 @@ export function validateTooltipOpenState(state) {
61
52
  if (!isObject(state)) {
62
53
  throw new TypeError("Tooltip open state must be an object");
63
54
  }
64
- rejectUnknownKeys(state, openStateKeys, "open state");
55
+ rejectUnknownKeys(state, openStateKeys, "open state", "Tooltip");
65
56
  const runtime = state;
66
57
  const hasOpen = Object.prototype.hasOwnProperty.call(runtime, "open");
67
58
  const hasDefaultOpen = Object.prototype.hasOwnProperty.call(runtime, "defaultOpen");
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.js","sourceRoot":"","sources":["../src/tooltip.ts"],"names":[],"mappings":"AAgDA,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,SAAS,EAAE,KAAK;IAChB,KAAK,EAAE,QAAQ;CAIf,CAAC;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,kBAAkB,EAAE,GAAG;IACvB,gBAAgB,EAAE,CAAC;IACnB,WAAW,EAAE,GAAG;IAChB,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,KAAK;IACjB,qBAAqB,EAAE,IAAI;CACnB,CAAC;AAEX,MAAM,UAAU,GAAG,IAAI,GAAG,CAAmB;IAC3C,KAAK;IACL,QAAQ;IACR,OAAO;IACP,KAAK;CACN,CAAC,CAAC;AACH,MAAM,UAAU,GAAG,IAAI,GAAG,CAAe,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AACrE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;AAClE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC;AAEvE,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,iBAAiB,CACxB,KAAwC,EACxC,OAA4B,EAC5B,KAAa;IAEb,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,SAAS,CAAC,uBAAuB,KAAK,WAAW,GAAG,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,UAA6B;IAE7B,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;IAC9D,CAAC;IACD,iBAAiB,CAAC,UAAU,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;IAC5D,IACE,OAAO,UAAU,CAAC,OAAO,KAAK,QAAQ;QACtC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EACtC,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,UAAU,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACrD,MAAM,IAAI,SAAS,CACjB,uDAAuD,CACxD,CAAC;IACJ,CAAC;IACD,IACE,UAAU,CAAC,SAAS,KAAK,SAAS;QAClC,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EACrC,CAAC;QACD,MAAM,IAAI,SAAS,CACjB,kCAAkC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CACjE,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,SAAS,CACjB,8BAA8B,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CACzD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,UAA6B;IAE7B,yBAAyB,CAAC,UAAU,CAAC,CAAC;IACtC,OAAO;QACL,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,SAAS,EAAE,UAAU,CAAC,SAAS,IAAI,yBAAyB,CAAC,SAAS;QACtE,KAAK,EAAE,UAAU,CAAC,KAAK,IAAI,yBAAyB,CAAC,KAAK;KAC3D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAuB;IAC9D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;IAC9D,CAAC;IACD,iBAAiB,CAAC,KAAK,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,KAA0C,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACtE,MAAM,cAAc,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CACzD,OAAO,EACP,aAAa,CACd,CAAC;IACF,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,IAAI,SAAS,CAAC,gCAAgC,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,IAAI,SAAS,CACjB,iDAAiD,CAClD,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,OAAO,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;YAC/C,MAAM,IAAI,SAAS,CACjB,8CAA8C,CAC/C,CAAC;QACJ,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,cAAc,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QAC/D,MAAM,IAAI,SAAS,CAAC,uCAAuC,CAAC,CAAC;IAC/D,CAAC;IACD,IACE,OAAO,CAAC,YAAY,KAAK,SAAS;QAClC,OAAO,OAAO,CAAC,YAAY,KAAK,UAAU,EAC1C,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,yCAAyC,CAAC,CAAC;IACjE,CAAC;AACH,CAAC","sourcesContent":["export type TooltipPlacement = \"top\" | \"bottom\" | \"start\" | \"end\";\nexport type TooltipAlign = \"start\" | \"center\" | \"end\";\n\nexport type TooltipOpenChangeReason =\n | \"pointer\"\n | \"focus\"\n | \"pointer-leave\"\n | \"blur\"\n | \"escape\"\n | \"trigger-activation\"\n | \"another-tooltip\";\n\nexport type TooltipOpenChangeDetails = Readonly<{\n reason: TooltipOpenChangeReason;\n}>;\n\n/** Tooltip copy is intentionally plain text and never owns an action. */\nexport type TooltipDescriptor = Readonly<{\n content: string;\n placement?: TooltipPlacement;\n align?: TooltipAlign;\n}>;\n\nexport type ResolvedTooltipDescriptor = Readonly<{\n content: string;\n placement: TooltipPlacement;\n align: TooltipAlign;\n}>;\n\nexport type ControlledTooltipOpenState = Readonly<{\n open: boolean;\n defaultOpen?: never;\n onOpenChange(open: boolean, details: TooltipOpenChangeDetails): void;\n}>;\n\nexport type UncontrolledTooltipOpenState = Readonly<{\n open?: never;\n defaultOpen?: boolean;\n onOpenChange?: (\n open: boolean,\n details: TooltipOpenChangeDetails,\n ) => void;\n}>;\n\nexport type TooltipOpenState =\n | ControlledTooltipOpenState\n | UncontrolledTooltipOpenState;\n\nexport const tooltipDescriptorDefaults = {\n placement: \"top\",\n align: \"center\",\n} as const satisfies Readonly<{\n placement: TooltipPlacement;\n align: TooltipAlign;\n}>;\n\nexport const tooltipBehaviorDefaults = {\n pointerOpenDelayMs: 500,\n focusOpenDelayMs: 0,\n skipDelayMs: 300,\n hoverable: true,\n touchHover: false,\n oneVisiblePerProvider: true,\n} as const;\n\nconst placements = new Set<TooltipPlacement>([\n \"top\",\n \"bottom\",\n \"start\",\n \"end\",\n]);\nconst alignments = new Set<TooltipAlign>([\"start\", \"center\", \"end\"]);\nconst descriptorKeys = new Set([\"content\", \"placement\", \"align\"]);\nconst openStateKeys = new Set([\"open\", \"defaultOpen\", \"onOpenChange\"]);\n\nfunction isObject(value: unknown): value is Readonly<Record<string, unknown>> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction rejectUnknownKeys(\n value: Readonly<Record<string, unknown>>,\n allowed: ReadonlySet<string>,\n field: string,\n): void {\n for (const key of Object.keys(value)) {\n if (!allowed.has(key)) {\n throw new TypeError(`Unsupported Tooltip ${field} field: ${key}`);\n }\n }\n}\n\nexport function validateTooltipDescriptor(\n descriptor: TooltipDescriptor,\n): void {\n if (!isObject(descriptor)) {\n throw new TypeError(\"Tooltip descriptor must be an object\");\n }\n rejectUnknownKeys(descriptor, descriptorKeys, \"descriptor\");\n if (\n typeof descriptor.content !== \"string\" ||\n descriptor.content.trim().length === 0\n ) {\n throw new TypeError(\"Tooltip content must not be empty\");\n }\n if (descriptor.content !== descriptor.content.trim()) {\n throw new TypeError(\n \"Tooltip content must not start or end with whitespace\",\n );\n }\n if (\n descriptor.placement !== undefined &&\n !placements.has(descriptor.placement)\n ) {\n throw new TypeError(\n `Unsupported Tooltip placement: ${String(descriptor.placement)}`,\n );\n }\n if (descriptor.align !== undefined && !alignments.has(descriptor.align)) {\n throw new TypeError(\n `Unsupported Tooltip align: ${String(descriptor.align)}`,\n );\n }\n}\n\nexport function resolveTooltipDescriptor(\n descriptor: TooltipDescriptor,\n): ResolvedTooltipDescriptor {\n validateTooltipDescriptor(descriptor);\n return {\n content: descriptor.content,\n placement: descriptor.placement ?? tooltipDescriptorDefaults.placement,\n align: descriptor.align ?? tooltipDescriptorDefaults.align,\n };\n}\n\nexport function validateTooltipOpenState(state: TooltipOpenState): void {\n if (!isObject(state)) {\n throw new TypeError(\"Tooltip open state must be an object\");\n }\n rejectUnknownKeys(state, openStateKeys, \"open state\");\n const runtime = state as Readonly<Record<string, unknown>>;\n const hasOpen = Object.prototype.hasOwnProperty.call(runtime, \"open\");\n const hasDefaultOpen = Object.prototype.hasOwnProperty.call(\n runtime,\n \"defaultOpen\",\n );\n if (hasOpen) {\n if (typeof runtime.open !== \"boolean\") {\n throw new TypeError(\"Tooltip open must be a boolean\");\n }\n if (hasDefaultOpen) {\n throw new TypeError(\n \"Controlled Tooltip must not provide defaultOpen\",\n );\n }\n if (typeof runtime.onOpenChange !== \"function\") {\n throw new TypeError(\n \"Controlled Tooltip must provide onOpenChange\",\n );\n }\n return;\n }\n if (hasDefaultOpen && typeof runtime.defaultOpen !== \"boolean\") {\n throw new TypeError(\"Tooltip defaultOpen must be a boolean\");\n }\n if (\n runtime.onOpenChange !== undefined &&\n typeof runtime.onOpenChange !== \"function\"\n ) {\n throw new TypeError(\"Tooltip onOpenChange must be a function\");\n }\n}\n"]}
1
+ {"version":3,"file":"tooltip.js","sourceRoot":"","sources":["../src/tooltip.ts"],"names":[],"mappings":"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","sourcesContent":["import { isObject, rejectUnknownKeys } from \"./internal/object-validation.js\";\nexport type TooltipPlacement = \"top\" | \"bottom\" | \"start\" | \"end\";\nexport type TooltipAlign = \"start\" | \"center\" | \"end\";\n\nexport type TooltipOpenChangeReason =\n | \"pointer\"\n | \"focus\"\n | \"pointer-leave\"\n | \"blur\"\n | \"escape\"\n | \"trigger-activation\"\n | \"another-tooltip\";\n\nexport type TooltipOpenChangeDetails = Readonly<{\n reason: TooltipOpenChangeReason;\n}>;\n\n/** Tooltip copy is intentionally plain text and never owns an action. */\nexport type TooltipDescriptor = Readonly<{\n content: string;\n placement?: TooltipPlacement;\n align?: TooltipAlign;\n}>;\n\nexport type ResolvedTooltipDescriptor = Readonly<{\n content: string;\n placement: TooltipPlacement;\n align: TooltipAlign;\n}>;\n\nexport type ControlledTooltipOpenState = Readonly<{\n open: boolean;\n defaultOpen?: never;\n onOpenChange(open: boolean, details: TooltipOpenChangeDetails): void;\n}>;\n\nexport type UncontrolledTooltipOpenState = Readonly<{\n open?: never;\n defaultOpen?: boolean;\n onOpenChange?: (\n open: boolean,\n details: TooltipOpenChangeDetails,\n ) => void;\n}>;\n\nexport type TooltipOpenState =\n | ControlledTooltipOpenState\n | UncontrolledTooltipOpenState;\n\nexport const tooltipDescriptorDefaults = {\n placement: \"top\",\n align: \"center\",\n} as const satisfies Readonly<{\n placement: TooltipPlacement;\n align: TooltipAlign;\n}>;\n\nexport const tooltipBehaviorDefaults = {\n pointerOpenDelayMs: 500,\n focusOpenDelayMs: 0,\n skipDelayMs: 300,\n hoverable: true,\n touchHover: false,\n oneVisiblePerProvider: true,\n} as const;\n\nconst placements = new Set<TooltipPlacement>([\n \"top\",\n \"bottom\",\n \"start\",\n \"end\",\n]);\nconst alignments = new Set<TooltipAlign>([\"start\", \"center\", \"end\"]);\nconst descriptorKeys = new Set([\"content\", \"placement\", \"align\"]);\nconst openStateKeys = new Set([\"open\", \"defaultOpen\", \"onOpenChange\"]);\n\nexport function validateTooltipDescriptor(\n descriptor: TooltipDescriptor,\n): void {\n if (!isObject(descriptor)) {\n throw new TypeError(\"Tooltip descriptor must be an object\");\n }\n rejectUnknownKeys(descriptor, descriptorKeys, \"descriptor\", \"Tooltip\");\n if (\n typeof descriptor.content !== \"string\" ||\n descriptor.content.trim().length === 0\n ) {\n throw new TypeError(\"Tooltip content must not be empty\");\n }\n if (descriptor.content !== descriptor.content.trim()) {\n throw new TypeError(\n \"Tooltip content must not start or end with whitespace\",\n );\n }\n if (\n descriptor.placement !== undefined &&\n !placements.has(descriptor.placement)\n ) {\n throw new TypeError(\n `Unsupported Tooltip placement: ${String(descriptor.placement)}`,\n );\n }\n if (descriptor.align !== undefined && !alignments.has(descriptor.align)) {\n throw new TypeError(\n `Unsupported Tooltip align: ${String(descriptor.align)}`,\n );\n }\n}\n\nexport function resolveTooltipDescriptor(\n descriptor: TooltipDescriptor,\n): ResolvedTooltipDescriptor {\n validateTooltipDescriptor(descriptor);\n return {\n content: descriptor.content,\n placement: descriptor.placement ?? tooltipDescriptorDefaults.placement,\n align: descriptor.align ?? tooltipDescriptorDefaults.align,\n };\n}\n\nexport function validateTooltipOpenState(state: TooltipOpenState): void {\n if (!isObject(state)) {\n throw new TypeError(\"Tooltip open state must be an object\");\n }\n rejectUnknownKeys(state, openStateKeys, \"open state\", \"Tooltip\");\n const runtime = state as Readonly<Record<string, unknown>>;\n const hasOpen = Object.prototype.hasOwnProperty.call(runtime, \"open\");\n const hasDefaultOpen = Object.prototype.hasOwnProperty.call(\n runtime,\n \"defaultOpen\",\n );\n if (hasOpen) {\n if (typeof runtime.open !== \"boolean\") {\n throw new TypeError(\"Tooltip open must be a boolean\");\n }\n if (hasDefaultOpen) {\n throw new TypeError(\n \"Controlled Tooltip must not provide defaultOpen\",\n );\n }\n if (typeof runtime.onOpenChange !== \"function\") {\n throw new TypeError(\n \"Controlled Tooltip must provide onOpenChange\",\n );\n }\n return;\n }\n if (hasDefaultOpen && typeof runtime.defaultOpen !== \"boolean\") {\n throw new TypeError(\"Tooltip defaultOpen must be a boolean\");\n }\n if (\n runtime.onOpenChange !== undefined &&\n typeof runtime.onOpenChange !== \"function\"\n ) {\n throw new TypeError(\"Tooltip onOpenChange must be a function\");\n }\n}\n"]}
package/dist/version.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  /** Package release shown by documentation surfaces. Kept in sync by a test. */
2
- export declare const designSystemVersion: "1.9.0";
2
+ export declare const designSystemVersion: "1.11.0";
3
3
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,eAAO,MAAM,mBAAmB,EAAG,OAAgB,CAAC"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,eAAO,MAAM,mBAAmB,EAAG,QAAiB,CAAC"}
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  /** Package release shown by documentation surfaces. Kept in sync by a test. */
2
- export const designSystemVersion = "1.9.0";
2
+ export const designSystemVersion = "1.11.0";
3
3
  //# sourceMappingURL=version.js.map