@hjmds/design-contracts 1.6.0 → 1.8.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 (228) hide show
  1. package/THIRD_PARTY_NOTICES.md +58 -0
  2. package/dist/agreement.d.ts +3 -3
  3. package/dist/agreement.js +1 -1
  4. package/dist/agreement.js.map +1 -1
  5. package/dist/asset.d.ts +1 -1
  6. package/dist/asset.js +1 -1
  7. package/dist/asset.js.map +1 -1
  8. package/dist/base-recipes.d.ts +12 -12
  9. package/dist/base-recipes.d.ts.map +1 -1
  10. package/dist/base-recipes.js +15 -14
  11. package/dist/base-recipes.js.map +1 -1
  12. package/dist/behaviors.d.ts +1 -1
  13. package/dist/catalog.d.ts +417 -561
  14. package/dist/catalog.d.ts.map +1 -1
  15. package/dist/catalog.js +138 -90
  16. package/dist/catalog.js.map +1 -1
  17. package/dist/command-palette.d.ts +3 -3
  18. package/dist/component-contracts.d.ts +4 -4
  19. package/dist/component-contracts.d.ts.map +1 -1
  20. package/dist/component-contracts.js +5 -4
  21. package/dist/component-contracts.js.map +1 -1
  22. package/dist/component-definitions.d.ts +1 -4
  23. package/dist/component-definitions.d.ts.map +1 -1
  24. package/dist/component-definitions.js +1 -4
  25. package/dist/component-definitions.js.map +1 -1
  26. package/dist/component-recipes.d.ts +76 -83
  27. package/dist/component-recipes.d.ts.map +1 -1
  28. package/dist/component-recipes.js +29 -49
  29. package/dist/component-recipes.js.map +1 -1
  30. package/dist/component-references.d.ts +0 -15
  31. package/dist/component-references.d.ts.map +1 -1
  32. package/dist/component-references.js +0 -3
  33. package/dist/component-references.js.map +1 -1
  34. package/dist/data-table.d.ts +3 -3
  35. package/dist/data-table.js +1 -1
  36. package/dist/data-table.js.map +1 -1
  37. package/dist/date-picker.d.ts +2 -2
  38. package/dist/icon-button-recipe.d.ts +2 -2
  39. package/dist/icon-button-recipe.js +1 -1
  40. package/dist/icon-button-recipe.js.map +1 -1
  41. package/dist/image.d.ts +2 -2
  42. package/dist/image.js +2 -2
  43. package/dist/image.js.map +1 -1
  44. package/dist/index.d.ts +1 -1
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +1 -1
  47. package/dist/index.js.map +1 -1
  48. package/dist/internal/thinking-orb/braid.d.ts +3 -0
  49. package/dist/internal/thinking-orb/braid.d.ts.map +1 -0
  50. package/dist/internal/thinking-orb/braid.js +47 -0
  51. package/dist/internal/thinking-orb/braid.js.map +1 -0
  52. package/dist/internal/thinking-orb/core.d.ts +60 -0
  53. package/dist/internal/thinking-orb/core.d.ts.map +1 -0
  54. package/dist/internal/thinking-orb/core.js +86 -0
  55. package/dist/internal/thinking-orb/core.js.map +1 -0
  56. package/dist/internal/thinking-orb/lattice.d.ts +5 -0
  57. package/dist/internal/thinking-orb/lattice.d.ts.map +1 -0
  58. package/dist/internal/thinking-orb/lattice.js +187 -0
  59. package/dist/internal/thinking-orb/lattice.js.map +1 -0
  60. package/dist/internal/thinking-orb/morph.d.ts +3 -0
  61. package/dist/internal/thinking-orb/morph.d.ts.map +1 -0
  62. package/dist/internal/thinking-orb/morph.js +127 -0
  63. package/dist/internal/thinking-orb/morph.js.map +1 -0
  64. package/dist/internal/thinking-orb/orbits.d.ts +3 -0
  65. package/dist/internal/thinking-orb/orbits.d.ts.map +1 -0
  66. package/dist/internal/thinking-orb/orbits.js +68 -0
  67. package/dist/internal/thinking-orb/orbits.js.map +1 -0
  68. package/dist/internal/thinking-orb/presets.d.ts +21 -0
  69. package/dist/internal/thinking-orb/presets.d.ts.map +1 -0
  70. package/dist/internal/thinking-orb/presets.js +77 -0
  71. package/dist/internal/thinking-orb/presets.js.map +1 -0
  72. package/dist/internal/thinking-orb/profiles.d.ts +8 -0
  73. package/dist/internal/thinking-orb/profiles.d.ts.map +1 -0
  74. package/dist/internal/thinking-orb/profiles.js +158 -0
  75. package/dist/internal/thinking-orb/profiles.js.map +1 -0
  76. package/dist/internal/thinking-orb/registry.d.ts +9 -0
  77. package/dist/internal/thinking-orb/registry.d.ts.map +1 -0
  78. package/dist/internal/thinking-orb/registry.js +27 -0
  79. package/dist/internal/thinking-orb/registry.js.map +1 -0
  80. package/dist/internal/thinking-orb/ribbon.d.ts +3 -0
  81. package/dist/internal/thinking-orb/ribbon.d.ts.map +1 -0
  82. package/dist/internal/thinking-orb/ribbon.js +87 -0
  83. package/dist/internal/thinking-orb/ribbon.js.map +1 -0
  84. package/dist/internal/thinking-orb/types.d.ts +15 -0
  85. package/dist/internal/thinking-orb/types.d.ts.map +1 -0
  86. package/dist/internal/thinking-orb/types.js +4 -0
  87. package/dist/internal/thinking-orb/types.js.map +1 -0
  88. package/dist/internal/thinking-orb/web.d.ts +3 -0
  89. package/dist/internal/thinking-orb/web.d.ts.map +1 -0
  90. package/dist/internal/thinking-orb/web.js +92 -0
  91. package/dist/internal/thinking-orb/web.js.map +1 -0
  92. package/dist/masonry.d.ts +17 -0
  93. package/dist/masonry.d.ts.map +1 -0
  94. package/dist/masonry.js +18 -0
  95. package/dist/masonry.js.map +1 -0
  96. package/dist/menubar.d.ts +3 -3
  97. package/dist/menubar.js +1 -1
  98. package/dist/menubar.js.map +1 -1
  99. package/dist/number-field.d.ts +2 -2
  100. package/dist/otp-field.d.ts +1 -1
  101. package/dist/password-field.d.ts +2 -2
  102. package/dist/popover.d.ts +7 -8
  103. package/dist/popover.d.ts.map +1 -1
  104. package/dist/popover.js +2 -0
  105. package/dist/popover.js.map +1 -1
  106. package/dist/qr-code-recipe.d.ts +7 -0
  107. package/dist/qr-code-recipe.d.ts.map +1 -0
  108. package/dist/qr-code-recipe.js +2 -0
  109. package/dist/qr-code-recipe.js.map +1 -0
  110. package/dist/qr-code.d.ts +16 -0
  111. package/dist/qr-code.d.ts.map +1 -0
  112. package/dist/qr-code.js +37 -0
  113. package/dist/qr-code.js.map +1 -0
  114. package/dist/semantic-colors.d.ts +1 -1
  115. package/dist/semantic-colors.js +1 -1
  116. package/dist/semantic-colors.js.map +1 -1
  117. package/dist/showcase.d.ts +5 -1
  118. package/dist/showcase.d.ts.map +1 -1
  119. package/dist/showcase.js +51 -13
  120. package/dist/showcase.js.map +1 -1
  121. package/dist/sidebar.d.ts +3 -3
  122. package/dist/sidebar.js +1 -1
  123. package/dist/sidebar.js.map +1 -1
  124. package/dist/tag.d.ts +4 -4
  125. package/dist/tag.js +3 -3
  126. package/dist/tag.js.map +1 -1
  127. package/dist/tags-input.d.ts +3 -3
  128. package/dist/tags-input.js +1 -1
  129. package/dist/tags-input.js.map +1 -1
  130. package/dist/text-formats.d.ts +2 -2
  131. package/dist/text-formats.js +2 -2
  132. package/dist/text-formats.js.map +1 -1
  133. package/dist/thinking-orb-recipe.d.ts +15 -0
  134. package/dist/thinking-orb-recipe.d.ts.map +1 -0
  135. package/dist/thinking-orb-recipe.js +9 -0
  136. package/dist/thinking-orb-recipe.js.map +1 -0
  137. package/dist/thinking-orb.d.ts +25 -0
  138. package/dist/thinking-orb.d.ts.map +1 -0
  139. package/dist/thinking-orb.js +40 -0
  140. package/dist/thinking-orb.js.map +1 -0
  141. package/dist/toast-liquid.d.ts +116 -0
  142. package/dist/toast-liquid.d.ts.map +1 -0
  143. package/dist/toast-liquid.js +100 -0
  144. package/dist/toast-liquid.js.map +1 -0
  145. package/dist/toast.d.ts +7 -1
  146. package/dist/toast.d.ts.map +1 -1
  147. package/dist/toast.js +5 -0
  148. package/dist/toast.js.map +1 -1
  149. package/dist/toggle-group.d.ts +2 -2
  150. package/dist/toggle-group.js +3 -3
  151. package/dist/toggle-group.js.map +1 -1
  152. package/dist/transfer-list.d.ts +3 -3
  153. package/dist/transfer-list.js +1 -1
  154. package/dist/transfer-list.js.map +1 -1
  155. package/dist/tree.d.ts +2 -2
  156. package/dist/version.d.ts +1 -1
  157. package/dist/version.js +1 -1
  158. package/dist/version.js.map +1 -1
  159. package/dist/virtual-list.d.ts +13 -0
  160. package/dist/virtual-list.d.ts.map +1 -0
  161. package/dist/virtual-list.js +13 -0
  162. package/dist/virtual-list.js.map +1 -0
  163. package/docs/anchor.md +5 -4
  164. package/docs/ant-design-coverage.md +2 -2
  165. package/docs/architecture.md +6 -2
  166. package/docs/authoring-brief.md +3 -2
  167. package/docs/bottom-navigation.md +7 -6
  168. package/docs/breadcrumb.md +5 -2
  169. package/docs/calendar.md +6 -3
  170. package/docs/carousel.md +2 -2
  171. package/docs/cascader.md +6 -0
  172. package/docs/catalog-cleanup.md +7 -0
  173. package/docs/catalog-decision-status.md +3 -3
  174. package/docs/catalog-freeze.json +9 -7
  175. package/docs/collapsible.md +12 -0
  176. package/docs/command-palette.md +5 -3
  177. package/docs/consumer-policy.md +29 -12
  178. package/docs/context-menu.md +12 -2
  179. package/docs/data-table.md +11 -6
  180. package/docs/date-picker.md +6 -4
  181. package/docs/date-range.md +4 -2
  182. package/docs/description-list.md +8 -9
  183. package/docs/dialog.md +39 -0
  184. package/docs/expansion-roadmap.md +11 -7
  185. package/docs/file-picker.md +5 -3
  186. package/docs/form.md +16 -4
  187. package/docs/generated/component-maturity.md +88 -91
  188. package/docs/generated/renderer-evidence.json +1848 -1023
  189. package/docs/generated/renderer-evidence.md +153 -145
  190. package/docs/generated/showcase-manifest.json +431 -497
  191. package/docs/layout.md +8 -9
  192. package/docs/library-gap-analysis.md +1 -1
  193. package/docs/masonry.md +11 -0
  194. package/docs/mentions.md +14 -7
  195. package/docs/optional-adapters.md +106 -0
  196. package/docs/otp-field.md +2 -1
  197. package/docs/pagination.md +4 -1
  198. package/docs/password-field.md +2 -1
  199. package/docs/popover.md +9 -6
  200. package/docs/promotion-candidates.md +2 -1
  201. package/docs/qr-code.md +11 -65
  202. package/docs/react-native-completion.md +1 -1
  203. package/docs/result.md +8 -5
  204. package/docs/screen-chrome.md +2 -1
  205. package/docs/sheet.md +16 -3
  206. package/docs/showcase.md +10 -2
  207. package/docs/side-panel.md +12 -6
  208. package/docs/sidebar.md +3 -0
  209. package/docs/splitter.md +6 -6
  210. package/docs/stable-core.md +72 -0
  211. package/docs/stable-promotion.md +47 -43
  212. package/docs/tags-input.md +5 -2
  213. package/docs/theme-palette.md +27 -0
  214. package/docs/thinking-orb.md +124 -0
  215. package/docs/timeline.md +2 -3
  216. package/docs/toast.md +6 -0
  217. package/docs/tooltip.md +2 -1
  218. package/docs/tour.md +14 -8
  219. package/docs/transfer-list.md +24 -21
  220. package/docs/tree-select.md +2 -1
  221. package/docs/tree.md +12 -7
  222. package/docs/upload-item.md +7 -3
  223. package/docs/virtual-list.md +10 -67
  224. package/package.json +30 -3
  225. package/docs/app-provider.md +0 -50
  226. package/docs/border-beam.md +0 -66
  227. package/docs/chart.md +0 -33
  228. package/docs/utility.md +0 -53
@@ -0,0 +1,40 @@
1
+ import { MODE_FRAMES } from "./internal/thinking-orb/registry.js";
2
+ import { resolvePreset } from "./internal/thinking-orb/presets.js";
3
+ export const thinkingOrbStates = ["working", "searching", "solving", "listening", "connecting", "weaving", "composing", "breathing", "shaping"];
4
+ export { thinkingOrbRecipe } from "./thinking-orb-recipe.js";
5
+ import { thinkingOrbRecipe } from "./thinking-orb-recipe.js";
6
+ export function validateThinkingOrb({ state = "working", size = 64, speed = 1, label }) {
7
+ if (!thinkingOrbStates.includes(state))
8
+ throw new TypeError("Unknown ThinkingOrb state");
9
+ if (size !== 20 && size !== 64)
10
+ throw new RangeError("ThinkingOrb size must be 20 or 64");
11
+ if (!Number.isFinite(speed) || speed <= 0 || speed > 4)
12
+ throw new RangeError("ThinkingOrb speed must be > 0 and <= 4");
13
+ if (typeof label !== "string" || !label.trim())
14
+ throw new TypeError("ThinkingOrb requires a localized label");
15
+ }
16
+ /** Theme-free, deterministic geometry; no DOM/React/native imports. */
17
+ export function buildThinkingOrbFrame(state, size, time) {
18
+ validateThinkingOrb({ state, size, label: state });
19
+ if (!Number.isFinite(time) || time < 0)
20
+ throw new RangeError("ThinkingOrb time must be finite and non-negative");
21
+ const preset = resolvePreset(state, size);
22
+ return MODE_FRAMES[preset.mode](size, time * preset.speed, preset.opts);
23
+ }
24
+ /** A local elapsed clock freezes exactly, instead of jumping to wall time after resume. */
25
+ export function createThinkingOrbClock() {
26
+ let elapsed = 0;
27
+ let previous;
28
+ return {
29
+ resetDelta() { previous = undefined; },
30
+ sample(now, speed) {
31
+ // Long scheduling gaps are capped so a stalled JS thread cannot jump the animation.
32
+ if (previous !== undefined)
33
+ elapsed += Math.min(thinkingOrbRecipe.motion.maxDeltaMs, Math.max(0, now - previous)) * speed / 1000;
34
+ previous = now;
35
+ return elapsed;
36
+ },
37
+ get time() { return elapsed; },
38
+ };
39
+ }
40
+ //# sourceMappingURL=thinking-orb.js.map
@@ -0,0 +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"]}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Geometry adapted from rit3zh/expo-dynamic-notifications, commit 5de059a5cbef.
3
+ * The MIT notice is shipped in THIRD_PARTY_NOTICES.md. See docs/plans/liquid-toast.md.
4
+ * Kept separate from the lifecycle: animation must never own a second queue.
5
+ */
6
+ export declare const liquidToastRecipe: {
7
+ readonly capsule: {
8
+ readonly width: 88;
9
+ readonly height: 24;
10
+ };
11
+ readonly gap: 34;
12
+ readonly minHeight: 74;
13
+ readonly maxWidth: 396;
14
+ readonly radius: 32;
15
+ readonly dropSize: 52;
16
+ readonly neckWidth: 60;
17
+ readonly blur: 14.3;
18
+ readonly gain: 22;
19
+ readonly threshold: 0.43;
20
+ readonly spring: {
21
+ readonly drop: {
22
+ readonly duration: 1150;
23
+ readonly dampingRatio: 0.82;
24
+ };
25
+ readonly expand: {
26
+ readonly duration: 1000;
27
+ readonly dampingRatio: 0.8;
28
+ };
29
+ readonly reveal: {
30
+ readonly duration: 700;
31
+ readonly dampingRatio: 1;
32
+ };
33
+ readonly tint: {
34
+ readonly duration: 700;
35
+ readonly dampingRatio: 1;
36
+ };
37
+ readonly collapse: {
38
+ readonly duration: 660;
39
+ readonly dampingRatio: 0.92;
40
+ readonly velocity: 2;
41
+ };
42
+ readonly return: {
43
+ readonly duration: 1150;
44
+ readonly dampingRatio: 0.9;
45
+ };
46
+ readonly fade: {
47
+ readonly duration: 360;
48
+ readonly dampingRatio: 1;
49
+ };
50
+ readonly drag: {
51
+ readonly duration: 560;
52
+ readonly dampingRatio: 0.7;
53
+ };
54
+ };
55
+ readonly delay: {
56
+ readonly tint: 110;
57
+ readonly expand: 340;
58
+ readonly reveal: 560;
59
+ readonly collapse: 100;
60
+ readonly return: 280;
61
+ };
62
+ readonly swipe: {
63
+ readonly distance: -18;
64
+ readonly velocity: -420;
65
+ };
66
+ };
67
+ /** Island frames are explicitly verified window coordinates, never inferred from insets. */
68
+ export type LiquidToastAnchor = Readonly<{
69
+ kind: "capsule";
70
+ }> | Readonly<{
71
+ kind: "island";
72
+ frame: Readonly<{
73
+ x: number;
74
+ y: number;
75
+ width: number;
76
+ height: number;
77
+ }>;
78
+ }>;
79
+ export declare function validateLiquidToastAnchor(anchor: LiquidToastAnchor): void;
80
+ export type LiquidToastLayout = Readonly<{
81
+ width: number;
82
+ height: number;
83
+ cardWidth: number;
84
+ cardTop: number;
85
+ cardLeft: number;
86
+ anchorX: number;
87
+ anchorY: number;
88
+ anchorWidth: number;
89
+ anchorHeight: number;
90
+ canvasTop: number;
91
+ canvasHeight: number;
92
+ fits: boolean;
93
+ }>;
94
+ export declare function resolveLiquidToastLayout(input: Readonly<{
95
+ width: number;
96
+ height: number;
97
+ availableHeight: number;
98
+ anchor: LiquidToastAnchor;
99
+ windowOrigin?: Readonly<{
100
+ x: number;
101
+ y: number;
102
+ }>;
103
+ }>): LiquidToastLayout;
104
+ export declare function buildLiquidToastGeometry(drop: number, expand: number, layout: LiquidToastLayout): {
105
+ x: number;
106
+ y: number;
107
+ width: number;
108
+ height: number;
109
+ radius: number;
110
+ neckX: number;
111
+ neckY: number;
112
+ neckWidth: number;
113
+ neckHeight: number;
114
+ offsetY: number;
115
+ };
116
+ //# sourceMappingURL=toast-liquid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast-liquid.d.ts","sourceRoot":"","sources":["../src/toast-liquid.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyBpB,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"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Geometry adapted from rit3zh/expo-dynamic-notifications, commit 5de059a5cbef.
3
+ * The MIT notice is shipped in THIRD_PARTY_NOTICES.md. See docs/plans/liquid-toast.md.
4
+ * Kept separate from the lifecycle: animation must never own a second queue.
5
+ */
6
+ export const liquidToastRecipe = {
7
+ capsule: { width: 88, height: 24 },
8
+ gap: 34,
9
+ minHeight: 74,
10
+ maxWidth: 396,
11
+ radius: 32,
12
+ dropSize: 52,
13
+ neckWidth: 60,
14
+ blur: 14.3,
15
+ gain: 22,
16
+ threshold: 0.43,
17
+ // These intentionally exceed general HJM motion: the neck needs time to separate.
18
+ // Original choreography is the comparison baseline, not a new global motion scale.
19
+ spring: {
20
+ drop: { duration: 1150, dampingRatio: 0.82 },
21
+ expand: { duration: 1000, dampingRatio: 0.8 },
22
+ reveal: { duration: 700, dampingRatio: 1 },
23
+ tint: { duration: 700, dampingRatio: 1 },
24
+ collapse: { duration: 660, dampingRatio: 0.92, velocity: 2 },
25
+ return: { duration: 1150, dampingRatio: 0.9 },
26
+ fade: { duration: 360, dampingRatio: 1 },
27
+ drag: { duration: 560, dampingRatio: 0.7 },
28
+ },
29
+ delay: { tint: 110, expand: 340, reveal: 560, collapse: 100, return: 280 },
30
+ swipe: { distance: -18, velocity: -420 },
31
+ };
32
+ export function validateLiquidToastAnchor(anchor) {
33
+ if (anchor.kind === "capsule")
34
+ return;
35
+ if (anchor.kind !== "island")
36
+ throw new TypeError("Unsupported liquid toast anchor");
37
+ const frame = anchor.frame;
38
+ 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) {
39
+ throw new RangeError("Liquid Toast island frame must be finite with positive dimensions");
40
+ }
41
+ }
42
+ export function resolveLiquidToastLayout(input) {
43
+ const { width, height, availableHeight, anchor, windowOrigin } = input;
44
+ validateLiquidToastAnchor(anchor);
45
+ if (![width, height, availableHeight].every(Number.isFinite) || width < 0 || height < 0 || availableHeight < 0) {
46
+ throw new RangeError("Liquid Toast measurements must be finite and non-negative");
47
+ }
48
+ let anchorWidth = liquidToastRecipe.capsule.width;
49
+ let anchorHeight = liquidToastRecipe.capsule.height;
50
+ let anchorX = (width - anchorWidth) / 2;
51
+ let anchorY = 0;
52
+ if (anchor.kind === "island" && windowOrigin) {
53
+ const x = anchor.frame.x - windowOrigin.x;
54
+ const y = anchor.frame.y - windowOrigin.y;
55
+ // Rotation/stale host measurements fall back to capsule instead of drawing over a cutout.
56
+ if (x >= 0 && x + anchor.frame.width <= width && y + anchor.frame.height <= availableHeight) {
57
+ anchorX = x;
58
+ anchorY = y;
59
+ anchorWidth = anchor.frame.width;
60
+ anchorHeight = anchor.frame.height;
61
+ }
62
+ }
63
+ const cardWidth = Math.min(width, liquidToastRecipe.maxWidth);
64
+ const cardTop = Math.max(0, anchorY + anchorHeight + liquidToastRecipe.gap);
65
+ const canvasTop = Math.min(0, anchorY) - liquidToastRecipe.blur * 2;
66
+ return {
67
+ width, height, cardWidth, cardTop, cardLeft: (width - cardWidth) / 2,
68
+ anchorX, anchorY, anchorWidth, anchorHeight, canvasTop,
69
+ canvasHeight: cardTop + height - canvasTop + 32,
70
+ fits: width >= 240 && height > 0 && cardTop + height <= availableHeight,
71
+ };
72
+ }
73
+ export function buildLiquidToastGeometry(drop, expand, layout) {
74
+ "worklet";
75
+ const clamp = (n) => Math.max(0, Math.min(1, n));
76
+ const mix = (a, b, t) => a + (b - a) * t;
77
+ const grow = 1 - (1 - clamp(drop / 0.7)) ** 1.25;
78
+ const n = clamp(drop / 0.82);
79
+ // A smooth neck rises and disappears before the card reaches its final location.
80
+ const peak = 1.6 / 3;
81
+ const normal = peak ** 1.6 * (1 - peak) ** 1.4;
82
+ const neck = n <= 0 || n >= 1 ? 0 : (n ** 1.6 * (1 - n) ** 1.4) / normal;
83
+ const stretch = 1 + 0.38 * neck;
84
+ const droplet = 52 * grow;
85
+ const width = Math.max(0, Math.min(layout.width, mix(droplet / stretch, layout.cardWidth, expand)));
86
+ const height = Math.max(0, mix(droplet * stretch, layout.height, expand));
87
+ const originY = layout.anchorY + layout.anchorHeight * 0.66;
88
+ const centerY = mix(originY, layout.cardTop + layout.height / 2, drop);
89
+ const centerX = mix(layout.anchorX + layout.anchorWidth / 2, layout.width / 2, clamp(expand));
90
+ const neckWidth = Math.max(0, Math.min(60, width) * neck);
91
+ const neckY = layout.anchorY + layout.anchorHeight / 2;
92
+ return {
93
+ x: centerX - width / 2, y: centerY - height / 2, width, height,
94
+ radius: Math.max(0, Math.min(mix(droplet / 2, 32, expand), width / 2, height / 2)),
95
+ neckX: layout.anchorX + layout.anchorWidth / 2 - neckWidth / 2,
96
+ neckY, neckWidth, neckHeight: Math.max(0, centerY - neckY),
97
+ offsetY: centerY - (layout.cardTop + layout.height / 2),
98
+ };
99
+ }
100
+ //# sourceMappingURL=toast-liquid.js.map
@@ -0,0 +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 delay: { tint: 110, 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"]}
package/dist/toast.d.ts CHANGED
@@ -1,7 +1,10 @@
1
1
  import type { ToastTone } from "./component-recipes.js";
2
+ export { liquidToastRecipe, resolveLiquidToastLayout, buildLiquidToastGeometry, validateLiquidToastAnchor } from "./toast-liquid.js";
3
+ export type { LiquidToastAnchor, LiquidToastLayout } from "./toast-liquid.js";
2
4
  export type ToastId = string;
5
+ export type ToastPresentation = "standard" | "liquid";
3
6
  export type ToastAnnouncementPriority = "normal" | "high";
4
- export type ToastPauseReason = "pointer" | "focus" | "window" | "gesture" | "programmatic";
7
+ export type ToastPauseReason = "pointer" | "focus" | "window" | "gesture" | "programmatic" | "presentation" | "occlusion";
5
8
  export type ToastDismissReason = "timeout" | "action" | "close-action" | "escape" | "swipe" | "programmatic" | "queue-overflow" | "interrupted";
6
9
  export type ToastDuplicatePolicy = "update" | "ignore";
7
10
  export type ToastTimerUpdatePolicy = "preserve" | "restart";
@@ -23,6 +26,8 @@ export type ToastDescriptor = Readonly<{
23
26
  title?: string;
24
27
  description: string;
25
28
  tone?: ToastTone;
29
+ /** Optional Native presentation; unsupported renderers retain the standard surface. */
30
+ presentation?: ToastPresentation;
26
31
  /** High priority interrupts; normal priority waits for a graceful announcement. */
27
32
  priority?: ToastAnnouncementPriority;
28
33
  /** Optional localized announcement when visible copy needs extra context. */
@@ -45,6 +50,7 @@ export type ResolvedToastDescriptor = Readonly<{
45
50
  title: string | null;
46
51
  description: string;
47
52
  tone: ToastTone;
53
+ presentation: ToastPresentation;
48
54
  priority: ToastAnnouncementPriority;
49
55
  announcement: string;
50
56
  durationMs: number | null;
@@ -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":"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"}
package/dist/toast.js CHANGED
@@ -1,3 +1,4 @@
1
+ export { liquidToastRecipe, resolveLiquidToastLayout, buildLiquidToastGeometry, validateLiquidToastAnchor } from "./toast-liquid.js";
1
2
  export const toastBehaviorDefaults = {
2
3
  durationMs: 5000,
3
4
  minimumDurationMs: 5000,
@@ -42,6 +43,9 @@ export function validateToastDescriptor(descriptor) {
42
43
  descriptor.priority !== "high") {
43
44
  throw new TypeError(`Unsupported Toast priority: ${String(descriptor.priority)}`);
44
45
  }
46
+ if (descriptor.presentation !== undefined && !["standard", "liquid"].includes(descriptor.presentation)) {
47
+ throw new TypeError(`Unsupported Toast presentation: ${String(descriptor.presentation)}`);
48
+ }
45
49
  if (descriptor.durationMs !== undefined && descriptor.durationMs !== null) {
46
50
  if (!Number.isFinite(descriptor.durationMs) || descriptor.durationMs <= 0) {
47
51
  throw new RangeError("Toast durationMs must be a positive finite number or null");
@@ -82,6 +86,7 @@ export function resolveToastDescriptor(descriptor) {
82
86
  title,
83
87
  description: descriptor.description,
84
88
  tone: descriptor.tone ?? "neutral",
89
+ presentation: descriptor.presentation ?? "standard",
85
90
  priority: descriptor.priority ?? toastBehaviorDefaults.priority,
86
91
  announcement,
87
92
  durationMs: resolveToastDuration(descriptor),
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 type ToastId = string;\nexport type ToastAnnouncementPriority = \"normal\" | \"high\";\nexport type ToastPauseReason =\n | \"pointer\"\n | \"focus\"\n | \"window\"\n | \"gesture\"\n | \"programmatic\";\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 /** 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 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.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 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` 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"]}
@@ -45,7 +45,7 @@ export declare const toggleGroupRecipe: {
45
45
  readonly idle: {
46
46
  readonly background: Readonly<{
47
47
  source: "theme";
48
- key: "surface";
48
+ key: "bg";
49
49
  alpha?: number;
50
50
  }>;
51
51
  readonly color: Readonly<{
@@ -62,7 +62,7 @@ export declare const toggleGroupRecipe: {
62
62
  readonly pressed: {
63
63
  readonly background: Readonly<{
64
64
  source: "theme";
65
- key: "primary";
65
+ key: "bg";
66
66
  alpha?: number;
67
67
  }>;
68
68
  readonly color: Readonly<{