@hjmds/design-contracts 1.7.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/THIRD_PARTY_NOTICES.md +58 -0
  2. package/dist/affix.d.ts +8 -0
  3. package/dist/affix.d.ts.map +1 -0
  4. package/dist/affix.js +7 -0
  5. package/dist/affix.js.map +1 -0
  6. package/dist/agreement.d.ts +3 -3
  7. package/dist/agreement.js +1 -1
  8. package/dist/agreement.js.map +1 -1
  9. package/dist/asset.d.ts +1 -1
  10. package/dist/asset.js +1 -1
  11. package/dist/asset.js.map +1 -1
  12. package/dist/base-recipes.d.ts +12 -12
  13. package/dist/base-recipes.d.ts.map +1 -1
  14. package/dist/base-recipes.js +15 -14
  15. package/dist/base-recipes.js.map +1 -1
  16. package/dist/behaviors.d.ts +1 -1
  17. package/dist/catalog.d.ts +445 -651
  18. package/dist/catalog.d.ts.map +1 -1
  19. package/dist/catalog.js +149 -101
  20. package/dist/catalog.js.map +1 -1
  21. package/dist/color-picker.d.ts +11 -0
  22. package/dist/color-picker.d.ts.map +1 -0
  23. package/dist/color-picker.js +20 -0
  24. package/dist/color-picker.js.map +1 -0
  25. package/dist/command-palette.d.ts +3 -3
  26. package/dist/component-contracts.d.ts +4 -4
  27. package/dist/component-contracts.d.ts.map +1 -1
  28. package/dist/component-contracts.js +5 -4
  29. package/dist/component-contracts.js.map +1 -1
  30. package/dist/component-definitions.d.ts +1 -9
  31. package/dist/component-definitions.d.ts.map +1 -1
  32. package/dist/component-definitions.js +1 -9
  33. package/dist/component-definitions.js.map +1 -1
  34. package/dist/component-recipes.d.ts +76 -83
  35. package/dist/component-recipes.d.ts.map +1 -1
  36. package/dist/component-recipes.js +29 -49
  37. package/dist/component-recipes.js.map +1 -1
  38. package/dist/component-references.d.ts +10 -25
  39. package/dist/component-references.d.ts.map +1 -1
  40. package/dist/component-references.js +5 -8
  41. package/dist/component-references.js.map +1 -1
  42. package/dist/data-table.d.ts +3 -3
  43. package/dist/data-table.js +1 -1
  44. package/dist/data-table.js.map +1 -1
  45. package/dist/date-picker.d.ts +2 -2
  46. package/dist/icon-button-recipe.d.ts +2 -2
  47. package/dist/icon-button-recipe.js +1 -1
  48. package/dist/icon-button-recipe.js.map +1 -1
  49. package/dist/image.d.ts +2 -2
  50. package/dist/image.js +2 -2
  51. package/dist/image.js.map +1 -1
  52. package/dist/index.d.ts +1 -1
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +1 -1
  55. package/dist/index.js.map +1 -1
  56. package/dist/interaction-adapters.d.ts +53 -0
  57. package/dist/interaction-adapters.d.ts.map +1 -0
  58. package/dist/interaction-adapters.js +45 -0
  59. package/dist/interaction-adapters.js.map +1 -0
  60. package/dist/internal/thinking-orb/braid.d.ts +3 -0
  61. package/dist/internal/thinking-orb/braid.d.ts.map +1 -0
  62. package/dist/internal/thinking-orb/braid.js +47 -0
  63. package/dist/internal/thinking-orb/braid.js.map +1 -0
  64. package/dist/internal/thinking-orb/core.d.ts +60 -0
  65. package/dist/internal/thinking-orb/core.d.ts.map +1 -0
  66. package/dist/internal/thinking-orb/core.js +86 -0
  67. package/dist/internal/thinking-orb/core.js.map +1 -0
  68. package/dist/internal/thinking-orb/lattice.d.ts +5 -0
  69. package/dist/internal/thinking-orb/lattice.d.ts.map +1 -0
  70. package/dist/internal/thinking-orb/lattice.js +187 -0
  71. package/dist/internal/thinking-orb/lattice.js.map +1 -0
  72. package/dist/internal/thinking-orb/morph.d.ts +3 -0
  73. package/dist/internal/thinking-orb/morph.d.ts.map +1 -0
  74. package/dist/internal/thinking-orb/morph.js +127 -0
  75. package/dist/internal/thinking-orb/morph.js.map +1 -0
  76. package/dist/internal/thinking-orb/orbits.d.ts +3 -0
  77. package/dist/internal/thinking-orb/orbits.d.ts.map +1 -0
  78. package/dist/internal/thinking-orb/orbits.js +68 -0
  79. package/dist/internal/thinking-orb/orbits.js.map +1 -0
  80. package/dist/internal/thinking-orb/presets.d.ts +21 -0
  81. package/dist/internal/thinking-orb/presets.d.ts.map +1 -0
  82. package/dist/internal/thinking-orb/presets.js +77 -0
  83. package/dist/internal/thinking-orb/presets.js.map +1 -0
  84. package/dist/internal/thinking-orb/profiles.d.ts +8 -0
  85. package/dist/internal/thinking-orb/profiles.d.ts.map +1 -0
  86. package/dist/internal/thinking-orb/profiles.js +158 -0
  87. package/dist/internal/thinking-orb/profiles.js.map +1 -0
  88. package/dist/internal/thinking-orb/registry.d.ts +9 -0
  89. package/dist/internal/thinking-orb/registry.d.ts.map +1 -0
  90. package/dist/internal/thinking-orb/registry.js +27 -0
  91. package/dist/internal/thinking-orb/registry.js.map +1 -0
  92. package/dist/internal/thinking-orb/ribbon.d.ts +3 -0
  93. package/dist/internal/thinking-orb/ribbon.d.ts.map +1 -0
  94. package/dist/internal/thinking-orb/ribbon.js +87 -0
  95. package/dist/internal/thinking-orb/ribbon.js.map +1 -0
  96. package/dist/internal/thinking-orb/types.d.ts +15 -0
  97. package/dist/internal/thinking-orb/types.d.ts.map +1 -0
  98. package/dist/internal/thinking-orb/types.js +4 -0
  99. package/dist/internal/thinking-orb/types.js.map +1 -0
  100. package/dist/internal/thinking-orb/web.d.ts +3 -0
  101. package/dist/internal/thinking-orb/web.d.ts.map +1 -0
  102. package/dist/internal/thinking-orb/web.js +92 -0
  103. package/dist/internal/thinking-orb/web.js.map +1 -0
  104. package/dist/masonry.d.ts +17 -0
  105. package/dist/masonry.d.ts.map +1 -0
  106. package/dist/masonry.js +18 -0
  107. package/dist/masonry.js.map +1 -0
  108. package/dist/menubar.d.ts +3 -3
  109. package/dist/menubar.js +1 -1
  110. package/dist/menubar.js.map +1 -1
  111. package/dist/number-field.d.ts +2 -2
  112. package/dist/otp-field.d.ts +1 -1
  113. package/dist/password-field.d.ts +2 -2
  114. package/dist/popover.d.ts +7 -8
  115. package/dist/popover.d.ts.map +1 -1
  116. package/dist/popover.js +2 -0
  117. package/dist/popover.js.map +1 -1
  118. package/dist/qr-code-recipe.d.ts +7 -0
  119. package/dist/qr-code-recipe.d.ts.map +1 -0
  120. package/dist/qr-code-recipe.js +2 -0
  121. package/dist/qr-code-recipe.js.map +1 -0
  122. package/dist/qr-code.d.ts +16 -0
  123. package/dist/qr-code.d.ts.map +1 -0
  124. package/dist/qr-code.js +37 -0
  125. package/dist/qr-code.js.map +1 -0
  126. package/dist/semantic-colors.d.ts +1 -1
  127. package/dist/semantic-colors.js +1 -1
  128. package/dist/semantic-colors.js.map +1 -1
  129. package/dist/showcase.d.ts +5 -1
  130. package/dist/showcase.d.ts.map +1 -1
  131. package/dist/showcase.js +53 -12
  132. package/dist/showcase.js.map +1 -1
  133. package/dist/sidebar.d.ts +3 -3
  134. package/dist/sidebar.js +1 -1
  135. package/dist/sidebar.js.map +1 -1
  136. package/dist/tag.d.ts +4 -4
  137. package/dist/tag.js +3 -3
  138. package/dist/tag.js.map +1 -1
  139. package/dist/tags-input.d.ts +3 -3
  140. package/dist/tags-input.js +1 -1
  141. package/dist/tags-input.js.map +1 -1
  142. package/dist/text-formats.d.ts +2 -2
  143. package/dist/text-formats.js +2 -2
  144. package/dist/text-formats.js.map +1 -1
  145. package/dist/thinking-orb-recipe.d.ts +15 -0
  146. package/dist/thinking-orb-recipe.d.ts.map +1 -0
  147. package/dist/thinking-orb-recipe.js +9 -0
  148. package/dist/thinking-orb-recipe.js.map +1 -0
  149. package/dist/thinking-orb.d.ts +25 -0
  150. package/dist/thinking-orb.d.ts.map +1 -0
  151. package/dist/thinking-orb.js +40 -0
  152. package/dist/thinking-orb.js.map +1 -0
  153. package/dist/toast-liquid.d.ts +116 -0
  154. package/dist/toast-liquid.d.ts.map +1 -0
  155. package/dist/toast-liquid.js +103 -0
  156. package/dist/toast-liquid.js.map +1 -0
  157. package/dist/toast.d.ts +7 -1
  158. package/dist/toast.d.ts.map +1 -1
  159. package/dist/toast.js +5 -0
  160. package/dist/toast.js.map +1 -1
  161. package/dist/toggle-group.d.ts +2 -2
  162. package/dist/toggle-group.js +3 -3
  163. package/dist/toggle-group.js.map +1 -1
  164. package/dist/transfer-list.d.ts +3 -3
  165. package/dist/transfer-list.js +1 -1
  166. package/dist/transfer-list.js.map +1 -1
  167. package/dist/tree.d.ts +2 -2
  168. package/dist/version.d.ts +1 -1
  169. package/dist/version.js +1 -1
  170. package/dist/version.js.map +1 -1
  171. package/dist/virtual-list.d.ts +13 -0
  172. package/dist/virtual-list.d.ts.map +1 -0
  173. package/dist/virtual-list.js +13 -0
  174. package/dist/virtual-list.js.map +1 -0
  175. package/dist/watermark.d.ts +15 -0
  176. package/dist/watermark.d.ts.map +1 -0
  177. package/dist/watermark.js +11 -0
  178. package/dist/watermark.js.map +1 -0
  179. package/docs/affix.md +27 -63
  180. package/docs/anchor.md +5 -4
  181. package/docs/ant-design-coverage.md +8 -12
  182. package/docs/architecture.md +6 -2
  183. package/docs/authoring-brief.md +3 -2
  184. package/docs/bottom-navigation.md +7 -6
  185. package/docs/breadcrumb.md +5 -2
  186. package/docs/calendar.md +6 -3
  187. package/docs/carousel.md +2 -2
  188. package/docs/cascader.md +11 -0
  189. package/docs/catalog-cleanup.md +7 -0
  190. package/docs/catalog-decision-status.md +8 -3
  191. package/docs/catalog-freeze.json +9 -7
  192. package/docs/collapsible.md +12 -0
  193. package/docs/color-picker.md +30 -72
  194. package/docs/command-palette.md +5 -3
  195. package/docs/confirm-popover.md +5 -0
  196. package/docs/consumer-policy.md +29 -12
  197. package/docs/context-menu.md +12 -2
  198. package/docs/data-table.md +11 -6
  199. package/docs/date-picker.md +6 -4
  200. package/docs/date-range.md +4 -2
  201. package/docs/description-list.md +8 -9
  202. package/docs/dialog.md +39 -0
  203. package/docs/expansion-roadmap.md +11 -7
  204. package/docs/file-picker.md +5 -3
  205. package/docs/form.md +16 -4
  206. package/docs/generated/component-maturity.md +91 -99
  207. package/docs/generated/renderer-evidence.json +2043 -1059
  208. package/docs/generated/renderer-evidence.md +156 -145
  209. package/docs/generated/showcase-manifest.json +476 -625
  210. package/docs/layout.md +8 -9
  211. package/docs/library-gap-analysis.md +1 -1
  212. package/docs/masonry.md +11 -0
  213. package/docs/mentions.md +14 -7
  214. package/docs/optional-adapters.md +126 -0
  215. package/docs/otp-field.md +2 -1
  216. package/docs/pagination.md +4 -1
  217. package/docs/password-field.md +2 -1
  218. package/docs/popover.md +9 -6
  219. package/docs/promotion-candidates.md +2 -1
  220. package/docs/qr-code.md +11 -65
  221. package/docs/rating.md +5 -0
  222. package/docs/react-native-completion.md +1 -1
  223. package/docs/result.md +8 -5
  224. package/docs/screen-chrome.md +2 -1
  225. package/docs/sheet.md +8 -2
  226. package/docs/showcase.md +10 -2
  227. package/docs/side-panel.md +12 -6
  228. package/docs/sidebar.md +3 -0
  229. package/docs/splitter.md +6 -6
  230. package/docs/stable-core.md +92 -0
  231. package/docs/stable-promotion.md +47 -43
  232. package/docs/tags-input.md +5 -2
  233. package/docs/theme-palette.md +27 -0
  234. package/docs/thinking-orb.md +124 -0
  235. package/docs/time-picker.md +5 -0
  236. package/docs/timeline.md +2 -3
  237. package/docs/toast.md +6 -0
  238. package/docs/tooltip.md +2 -1
  239. package/docs/tour.md +14 -8
  240. package/docs/transfer-list.md +24 -21
  241. package/docs/tree-select.md +7 -1
  242. package/docs/tree.md +12 -7
  243. package/docs/upload-item.md +7 -3
  244. package/docs/virtual-list.md +10 -67
  245. package/docs/watermark.md +26 -58
  246. package/package.json +54 -3
  247. package/docs/app-provider.md +0 -50
  248. package/docs/border-beam.md +0 -66
  249. package/docs/chart.md +0 -33
  250. package/docs/utility.md +0 -53
@@ -0,0 +1,103 @@
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
+ // 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.
32
+ delay: { tint: 420, expand: 340, reveal: 560, collapse: 100, return: 280 },
33
+ swipe: { distance: -18, velocity: -420 },
34
+ };
35
+ export function validateLiquidToastAnchor(anchor) {
36
+ if (anchor.kind === "capsule")
37
+ return;
38
+ if (anchor.kind !== "island")
39
+ throw new TypeError("Unsupported liquid toast anchor");
40
+ const frame = anchor.frame;
41
+ 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) {
42
+ throw new RangeError("Liquid Toast island frame must be finite with positive dimensions");
43
+ }
44
+ }
45
+ export function resolveLiquidToastLayout(input) {
46
+ const { width, height, availableHeight, anchor, windowOrigin } = input;
47
+ validateLiquidToastAnchor(anchor);
48
+ if (![width, height, availableHeight].every(Number.isFinite) || width < 0 || height < 0 || availableHeight < 0) {
49
+ throw new RangeError("Liquid Toast measurements must be finite and non-negative");
50
+ }
51
+ let anchorWidth = liquidToastRecipe.capsule.width;
52
+ let anchorHeight = liquidToastRecipe.capsule.height;
53
+ let anchorX = (width - anchorWidth) / 2;
54
+ let anchorY = 0;
55
+ if (anchor.kind === "island" && windowOrigin) {
56
+ const x = anchor.frame.x - windowOrigin.x;
57
+ const y = anchor.frame.y - windowOrigin.y;
58
+ // Rotation/stale host measurements fall back to capsule instead of drawing over a cutout.
59
+ if (x >= 0 && x + anchor.frame.width <= width && y + anchor.frame.height <= availableHeight) {
60
+ anchorX = x;
61
+ anchorY = y;
62
+ anchorWidth = anchor.frame.width;
63
+ anchorHeight = anchor.frame.height;
64
+ }
65
+ }
66
+ const cardWidth = Math.min(width, liquidToastRecipe.maxWidth);
67
+ const cardTop = Math.max(0, anchorY + anchorHeight + liquidToastRecipe.gap);
68
+ const canvasTop = Math.min(0, anchorY) - liquidToastRecipe.blur * 2;
69
+ return {
70
+ width, height, cardWidth, cardTop, cardLeft: (width - cardWidth) / 2,
71
+ anchorX, anchorY, anchorWidth, anchorHeight, canvasTop,
72
+ canvasHeight: cardTop + height - canvasTop + 32,
73
+ fits: width >= 240 && height > 0 && cardTop + height <= availableHeight,
74
+ };
75
+ }
76
+ export function buildLiquidToastGeometry(drop, expand, layout) {
77
+ "worklet";
78
+ const clamp = (n) => Math.max(0, Math.min(1, n));
79
+ const mix = (a, b, t) => a + (b - a) * t;
80
+ const grow = 1 - (1 - clamp(drop / 0.7)) ** 1.25;
81
+ const n = clamp(drop / 0.82);
82
+ // A smooth neck rises and disappears before the card reaches its final location.
83
+ const peak = 1.6 / 3;
84
+ const normal = peak ** 1.6 * (1 - peak) ** 1.4;
85
+ const neck = n <= 0 || n >= 1 ? 0 : (n ** 1.6 * (1 - n) ** 1.4) / normal;
86
+ const stretch = 1 + 0.38 * neck;
87
+ const droplet = 52 * grow;
88
+ const width = Math.max(0, Math.min(layout.width, mix(droplet / stretch, layout.cardWidth, expand)));
89
+ const height = Math.max(0, mix(droplet * stretch, layout.height, expand));
90
+ const originY = layout.anchorY + layout.anchorHeight * 0.66;
91
+ const centerY = mix(originY, layout.cardTop + layout.height / 2, drop);
92
+ 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 neckY = layout.anchorY + layout.anchorHeight / 2;
95
+ return {
96
+ 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
+ neckX: layout.anchorX + layout.anchorWidth / 2 - neckWidth / 2,
99
+ neckY, neckWidth, neckHeight: Math.max(0, centerY - neckY),
100
+ offsetY: centerY - (layout.cardTop + layout.height / 2),
101
+ };
102
+ }
103
+ //# 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 // 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"]}
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":"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,6EAA6E;IAC7E,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;;;;;;;;;;CAoBhC,CAAC;AAgBH,kFAAkF;AAClF,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI,CAmCzE;AAED,wFAAwF;AACxF,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,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":"AA8EA,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,UAAU,EAAE,IAAI;IAChB,iBAAiB,EAAE,IAAI;IACvB,QAAQ,EAAE,QAAQ;IAClB,eAAe,EAAE,IAAI;IACrB,UAAU,EAAE,CAAC;IACb,SAAS,EAAE,EAAE;IACb,eAAe,EAAE,QAAQ;IACzB,iBAAiB,EAAE,UAAU;IAC7B,cAAc,EAAE,gBAAgB;CAWhC,CAAC;AAEH,MAAM,UAAU,GAAyB;IACvC,SAAS;IACT,MAAM;IACN,SAAS;IACT,SAAS;IACT,QAAQ;CACT,CAAC;AAEF,SAAS,UAAU,CAAC,KAAa,EAAE,KAAa;IAC9C,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,SAAS,CAAC,SAAS,KAAK,oBAAoB,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,uBAAuB,CAAC,UAA2B;IACjE,UAAU,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAChC,IAAI,UAAU,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAC;IACxE,CAAC;IACD,UAAU,CAAC,UAAU,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAClD,UAAU,CAAC,UAAU,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAChD,IAAI,UAAU,CAAC,KAAK,KAAK,SAAS;QAAE,UAAU,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1E,IAAI,UAAU,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAC1C,UAAU,CAAC,UAAU,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,SAAS,CAAC,2BAA2B,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,IACE,UAAU,CAAC,QAAQ,KAAK,SAAS;QACjC,UAAU,CAAC,QAAQ,KAAK,QAAQ;QAChC,UAAU,CAAC,QAAQ,KAAK,MAAM,EAC9B,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,+BAA+B,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,UAAU,CAAC,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAC1E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC;YAC1E,MAAM,IAAI,UAAU,CAAC,2DAA2D,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QACtB,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QACpD,IAAI,UAAU,CAAC,MAAM,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;YACvD,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,kBAAkB,EAAE,2BAA2B,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;AACH,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,oBAAoB,CAAC,UAA2B;IAC9D,uBAAuB,CAAC,UAAU,CAAC,CAAC;IACpC,IAAI,UAAU,CAAC,UAAU,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChD,IAAI,UAAU,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACxC,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC,UAAU,CAAC;IACrE,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,EAAE,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,UAA2B;IAE3B,uBAAuB,CAAC,UAAU,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,IAAI,CAAC;IACvC,MAAM,YAAY,GAChB,UAAU,CAAC,YAAY;QACvB,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IACpF,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM;QAC9B,CAAC,CAAC;YACE,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK;YAC9B,kBAAkB,EAChB,UAAU,CAAC,MAAM,CAAC,kBAAkB,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK;YACjE,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,QAAQ;YACpC,eAAe,EACb,UAAU,CAAC,MAAM,CAAC,eAAe,IAAI,qBAAqB,CAAC,eAAe;SAC7E;QACH,CAAC,CAAC,IAAI,CAAC;IAET,OAAO;QACL,EAAE,EAAE,UAAU,CAAC,EAAE;QACjB,KAAK;QACL,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,IAAI,EAAE,UAAU,CAAC,IAAI,IAAI,SAAS;QAClC,QAAQ,EAAE,UAAU,CAAC,QAAQ,IAAI,qBAAqB,CAAC,QAAQ;QAC/D,YAAY;QACZ,UAAU,EAAE,oBAAoB,CAAC,UAAU,CAAC;QAC5C,MAAM;QACN,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,SAAS,EAAE,UAAU,CAAC,SAAS,IAAI,IAAI;KACxC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,UAA2B;IAE3B,MAAM,QAAQ,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IACpD,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,YAAY,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;AACzE,CAAC;AA2CD,SAAS,iBAAiB,CAAC,SAAiB;IAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,UAAU,CAAC,yDAAyD,CAAC,CAAC;IAClF,CAAC;AACH,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,kBAAkB,CAAC,UAA2B;IAC5D,IAAI,QAAQ,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAClD,IAAI,KAAK,GAAe,QAAQ,CAAC;IACjC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,aAAa,GAA8B,IAAI,CAAC;IACpD,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,IAAI,cAAc,GAAgC,IAAI,CAAC;IACvD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IAExC,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,cAAc,GAAG,IAAI,CAAC;QACtB,KAAK,MAAM,QAAQ,IAAI,SAAS;YAAE,QAAQ,EAAE,CAAC;IAC/C,CAAC,CAAC;IACF,MAAM,aAAa,GAAG,GAAuB,EAAE;QAC7C,IAAI,QAAQ,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YACjC,OAAO;gBACL,MAAM,EAAE,YAAY;gBACpB,UAAU,EAAE,IAAI;gBAChB,WAAW,EAAE,IAAI;gBACjB,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC;aACxB,CAAC;QACJ,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;QACjE,MAAM,MAAM,GACV,KAAK,KAAK,QAAQ;YAChB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,KAAK,KAAK,SAAS;gBACnB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;oBACjB,CAAC,CAAC,QAAQ;oBACV,CAAC,CAAC,SAAS,CAAC;QACpB,OAAO;YACL,MAAM;YACN,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,WAAW;YACX,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC;SACxB,CAAC;IACJ,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,GAAyB,EAAE;QAC1C,cAAc,KAAK;YACjB,QAAQ;YACR,KAAK;YACL,UAAU,EAAE,QAAQ;YACpB,KAAK,EAAE,aAAa,EAAE;YACtB,aAAa;YACb,aAAa;SACd,CAAC;QACF,OAAO,cAAc,CAAC;IACxB,CAAC,CAAC;IACF,MAAM,eAAe,GAAG,CAAC,MAA0B,EAAE,EAAE;QACrD,IAAI,eAAe;YAAE,OAAO;QAC5B,eAAe,GAAG,IAAI,CAAC;QACvB,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC,CAAC;IACF,MAAM,iBAAiB,GAAG,CAAC,MAA0B,EAAW,EAAE;QAChE,IAAI,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACrC,KAAK,GAAG,QAAQ,CAAC;QACjB,aAAa,GAAG,MAAM,CAAC;QACvB,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC;QACT,eAAe,CAAC,MAAM,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,OAAO,GAAiB;QAC5B,WAAW,EAAE,QAAQ;QACrB,SAAS,CAAC,QAAQ;YAChB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI;YACF,IAAI,KAAK,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YACrC,KAAK,GAAG,SAAS,CAAC;YAClB,MAAM,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,CAAC,cAAc,EAAE,WAAW,GAAG,qBAAqB,CAAC,iBAAiB;YAC1E,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC5D,IAAI,cAAc,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAC;YACrE,CAAC;YACD,IAAI,WAAW,KAAK,UAAU,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC5D,MAAM,IAAI,SAAS,CAAC,0CAA0C,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACvF,CAAC;YACD,MAAM,IAAI,GAAG,sBAAsB,CAAC,cAAc,CAAC,CAAC;YACpD,QAAQ,GAAG,IAAI,CAAC;YAChB,QAAQ,IAAI,CAAC,CAAC;YACd,aAAa,GAAG,KAAK,CAAC;YACtB,aAAa,GAAG,IAAI,CAAC;YACrB,eAAe,GAAG,KAAK,CAAC;YACxB,IAAI,KAAK,KAAK,QAAQ,IAAI,WAAW,KAAK,SAAS;gBAAE,SAAS,GAAG,CAAC,CAAC;YAEnE,IACE,KAAK,KAAK,SAAS;gBACnB,QAAQ,CAAC,UAAU,KAAK,IAAI;gBAC5B,SAAS,IAAI,QAAQ,CAAC,UAAU,EAChC,CAAC;gBACD,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC;gBAChC,KAAK,GAAG,SAAS,CAAC;gBAClB,aAAa,GAAG,SAAS,CAAC;YAC5B,CAAC;YACD,MAAM,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,CAAC,MAAM;YACV,IAAI,KAAK,KAAK,SAAS,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC9D,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACrB,MAAM,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,CAAC,MAAM;YACX,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;gBAAE,OAAO,KAAK,CAAC;YAClE,MAAM,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QACD,WAAW,CAAC,OAAO;YACjB,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC3B,IACE,OAAO,KAAK,CAAC;gBACb,KAAK,KAAK,SAAS;gBACnB,QAAQ,CAAC,UAAU,KAAK,IAAI;gBAC5B,QAAQ,CAAC,IAAI,GAAG,CAAC,EACjB,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,CAAC;YAC/D,IAAI,SAAS,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;gBACrC,KAAK,GAAG,SAAS,CAAC;gBAClB,aAAa,GAAG,SAAS,CAAC;YAC5B,CAAC;YACD,MAAM,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QACD,YAAY;YACV,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,IAAI,KAAK,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI,aAAa;gBAAE,OAAO,KAAK,CAAC;YAC1E,MAAM,eAAe,GAAG,QAAQ,CAAC;YACjC,aAAa,GAAG,IAAI,CAAC;YACrB,MAAM,EAAE,CAAC;YACT,IAAI,CAAC;gBACH,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,CAAC;oBAAS,CAAC;gBACT,IACE,MAAM,CAAC,eAAe;oBACtB,KAAK,KAAK,SAAS;oBACnB,QAAQ,KAAK,eAAe,EAC5B,CAAC;oBACD,KAAK,GAAG,SAAS,CAAC;oBAClB,aAAa,GAAG,QAAQ,CAAC;oBACzB,QAAQ,CAAC,KAAK,EAAE,CAAC;oBACjB,MAAM,EAAE,CAAC;gBACX,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,CAAC,MAAM;YACZ,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC5D,IAAI,KAAK,KAAK,QAAQ;gBAAE,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;YACzD,KAAK,GAAG,SAAS,CAAC;YAClB,aAAa,GAAG,MAAM,CAAC;YACvB,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QACD,YAAY;YACV,IAAI,KAAK,KAAK,SAAS,IAAI,aAAa,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAC;YAChE,OAAO,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAC1C,CAAC;QACD,SAAS;YACP,IAAI,KAAK,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YACrC,OAAO,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAC1C,CAAC;KACF,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC;AAoDD,SAAS,mBAAmB,CAAC,OAA0B;IACrD,MAAM,QAAQ,GAAG;QACf,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,qBAAqB,CAAC,UAAU;QAClE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,qBAAqB,CAAC,SAAS;QAC/D,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,qBAAqB,CAAC,eAAe;QACjF,iBAAiB,EACf,OAAO,CAAC,iBAAiB,IAAI,qBAAqB,CAAC,iBAAiB;QACtE,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,qBAAqB,CAAC,cAAc;KAC/E,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QACtE,MAAM,IAAI,UAAU,CAAC,qDAAqD,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,UAAU,CAAC,gDAAgD,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,QAAQ,CAAC,eAAe,KAAK,QAAQ,IAAI,QAAQ,CAAC,eAAe,KAAK,QAAQ,EAAE,CAAC;QACnF,MAAM,IAAI,SAAS,CACjB,uCAAuC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAC1E,CAAC;IACJ,CAAC;IACD,IACE,QAAQ,CAAC,iBAAiB,KAAK,UAAU;QACzC,QAAQ,CAAC,iBAAiB,KAAK,SAAS,EACxC,CAAC;QACD,MAAM,IAAI,SAAS,CACjB,0CAA0C,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAC/E,CAAC;IACJ,CAAC;IACD,IACE,QAAQ,CAAC,cAAc,KAAK,gBAAgB;QAC5C,QAAQ,CAAC,cAAc,KAAK,gBAAgB,EAC5C,CAAC;QACD,MAAM,IAAI,SAAS,CACjB,sCAAsC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CACxE,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAA6B,EAAE;IAC9D,MAAM,aAAa,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;IAClD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAuB,CAAC;IACrD,MAAM,UAAU,GAAc,EAAE,CAAC;IACjC,MAAM,SAAS,GAAc,EAAE,CAAC;IAChC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IACxC,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAoB,CAAC;IACvD,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,cAAc,GAA8B,IAAI,CAAC;IAErD,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,cAAc,GAAG,IAAI,CAAC;QACtB,KAAK,MAAM,QAAQ,IAAI,SAAS;YAAE,QAAQ,EAAE,CAAC;IAC/C,CAAC,CAAC;IACF,MAAM,UAAU,GAAG,CAAC,EAAW,EAAwB,EAAE,CACvD,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;IACjD,MAAM,QAAQ,GAAG,GAAuB,EAAE;QACxC,cAAc,KAAK;YACjB,OAAO,EAAE,UAAU;iBAChB,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC;iBAC5C,MAAM,CAAC,CAAC,KAAK,EAAiC,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC;YACxE,MAAM,EAAE,SAAS;iBACd,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC;iBAC5C,MAAM,CAAC,CAAC,KAAK,EAAiC,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC;SACzE,CAAC;QACF,OAAO,cAAc,CAAC;IACxB,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,CAAC,GAAc,EAAE,EAAW,EAAE,EAAE;QAC/C,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,KAAK,IAAI,CAAC;YAAE,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC;IACF,MAAM,sBAAsB,GAAG,CAAC,EAAW,EAA4B,EAAE;QACvE,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACzB,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpB,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1B,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzB,cAAc,GAAG,IAAI,CAAC;QACtB,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,OAAO,CAAC,QAAQ,IAAI,UAAU,CAAC,MAAM,GAAG,aAAa,CAAC,UAAU,EAAE,CAAC;YACjE,MAAM,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;YAC7B,IAAI,EAAE,KAAK,SAAS;gBAAE,OAAO;YAC7B,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjC,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvB,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpB,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,KAAK,MAAM,MAAM,IAAI,kBAAkB;gBAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjE,CAAC;IACH,CAAC,CAAC;IACF,MAAM,YAAY,GAAG,CAAC,EAAW,EAAE,EAAE;QACnC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACzB,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpB,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1B,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzB,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,CAAC,OAAqB,EAAE,EAAE;QACvC,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/C,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC1B,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE;YACzC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,KAAK,QAAQ;gBAAE,YAAY,CAAC,EAAE,CAAC,CAAC;YAC/D,MAAM,EAAE,CAAC;QACX,CAAC,CAAC,CAAC;QACH,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IACrC,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,UAA2B,EAAsB,EAAE;QAClE,kBAAkB,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACzD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC/E,CAAC,CAAC;IACF,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,IAAI,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACrE,CAAC,CAAC;IAEF,MAAM,KAAK,GAAe;QACxB,WAAW,EAAE,QAAQ;QACrB,SAAS,CAAC,QAAQ;YAChB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,CAAC,UAAU,EAAE,cAAc,GAAG,EAAE;YACrC,YAAY,EAAE,CAAC;YACf,uBAAuB,CAAC,UAAU,CAAC,CAAC;YACpC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC7C,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;oBAC/C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;gBACtE,CAAC;gBACD,MAAM,eAAe,GACnB,cAAc,CAAC,eAAe,IAAI,aAAa,CAAC,eAAe,CAAC;gBAClE,IAAI,eAAe,KAAK,QAAQ,IAAI,eAAe,KAAK,QAAQ,EAAE,CAAC;oBACjE,MAAM,IAAI,SAAS,CACjB,uCAAuC,MAAM,CAAC,eAAe,CAAC,EAAE,CACjE,CAAC;gBACJ,CAAC;gBACD,IAAI,eAAe,KAAK,QAAQ,EAAE,CAAC;oBACjC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;gBACxE,CAAC;gBACD,QAAQ,CAAC,MAAM,CACb,UAAU,EACV,cAAc,CAAC,iBAAiB,IAAI,aAAa,CAAC,iBAAiB,CACpE,CAAC;gBACF,OAAO;oBACL,OAAO,EAAE,SAAS;oBAClB,EAAE,EAAE,UAAU,CAAC,EAAE;oBACjB,QAAQ,EAAE,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;iBACpC,CAAC;YACJ,CAAC;YAED,IAAI,UAAU,CAAC,MAAM,IAAI,aAAa,CAAC,UAAU,EAAE,CAAC;gBAClD,IAAI,aAAa,CAAC,SAAS,KAAK,CAAC;oBAAE,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;gBAC9D,IAAI,SAAS,CAAC,MAAM,IAAI,aAAa,CAAC,SAAS,EAAE,CAAC;oBAChD,IAAI,aAAa,CAAC,cAAc,KAAK,gBAAgB,EAAE,CAAC;wBACtD,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;oBAC7B,CAAC;oBACD,MAAM,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;oBACpC,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;wBACjC,MAAM,YAAY,GAAG,sBAAsB,CAAC,cAAc,CAAC,CAAC;wBAC5D,IAAI,qBAAqB,GAAG,KAAK,CAAC;wBAClC,IAAI,CAAC;4BACH,YAAY,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;4BACxC,qBAAqB,GAAG,IAAI,CAAC;wBAC/B,CAAC;gCAAS,CAAC;4BACT,+DAA+D;4BAC/D,oDAAoD;4BACpD,IAAI,CAAC,qBAAqB;gCAAE,MAAM,EAAE,CAAC;wBACvC,CAAC;wBACD,oEAAoE;wBACpE,mEAAmE;wBACnE,qDAAqD;wBACrD,OAAO,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;oBACnD,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,OAAO,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAO,CAAC,CAAC;YAChB,IAAI,UAAU,CAAC,MAAM,GAAG,aAAa,CAAC,UAAU,EAAE,CAAC;gBACjD,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;gBAC/B,OAAO,CAAC,IAAI,EAAE,CAAC;gBACf,KAAK,MAAM,MAAM,IAAI,kBAAkB;oBAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC/D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;YACtE,CAAC;YACD,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC9B,MAAM,EAAE,CAAC;YACT,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;QACrE,CAAC;QACD,YAAY,CAAC,EAAE;YACb,YAAY,EAAE,CAAC;YACf,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI,KAAK,CAAC;QACnD,CAAC;QACD,OAAO,CAAC,EAAE,EAAE,MAAM;YAChB,YAAY,EAAE,CAAC;YACf,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC;QACpD,CAAC;QACD,KAAK,CAAC,EAAE;YACN,YAAY,EAAE,CAAC;YACf,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC;QAC5D,CAAC;QACD,KAAK,CAAC,EAAE,EAAE,MAAM;YACd,YAAY,EAAE,CAAC;YACf,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC;QAClD,CAAC;QACD,MAAM,CAAC,EAAE,EAAE,MAAM;YACf,YAAY,EAAE,CAAC;YACf,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC;QACnD,CAAC;QACD,QAAQ,CAAC,MAAM;YACb,YAAY,EAAE,CAAC;YACf,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC/B,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC,MAAM,CAC3B,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAChE,CAAC,CACF,CAAC;QACJ,CAAC;QACD,SAAS,CAAC,MAAM;YACd,YAAY,EAAE,CAAC;YACf,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC,MAAM,CAC3B,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACjE,CAAC,CACF,CAAC;QACJ,CAAC;QACD,WAAW,CAAC,OAAO;YACjB,YAAY,EAAE,CAAC;YACf,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC3B,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC,MAAM,CAC3B,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACvE,CAAC,CACF,CAAC;QACJ,CAAC;QACD,YAAY,CAAC,EAAE;YACb,YAAY,EAAE,CAAC;YACf,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI,KAAK,CAAC;QACnD,CAAC;QACD,OAAO;YACL,IAAI,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC3B,QAAQ,GAAG,IAAI,CAAC;YAChB,kBAAkB,CAAC,KAAK,EAAE,CAAC;YAC3B,IAAI,UAAmB,CAAC;YACxB,KAAK,MAAM,OAAO,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;gBAC7C,IAAI,CAAC;oBACH,OAAO,CAAC,SAAS,EAAE,CAAC;gBACtB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,UAAU,KAAK,KAAK,CAAC;gBACvB,CAAC;YACH,CAAC;YACD,MAAM,EAAE,CAAC;YACT,SAAS,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,UAAU,KAAK,SAAS;gBAAE,MAAM,UAAU,CAAC;YAC/C,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;IAEF,OAAO,KAAK,CAAC;AACf,CAAC","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<{
@@ -1,4 +1,4 @@
1
- import { collectionItemContract, focusIndicatorContract } from "./component-contracts.js";
1
+ import { focusIndicatorContract } from "./component-contracts.js";
2
2
  import { control, radius, spacing } from "./foundations.js";
3
3
  import { semanticColors } from "./semantic-colors.js";
4
4
  import { reconcileCheckboxSelection, toggleCheckboxSelection, } from "./selection-helpers.js";
@@ -41,12 +41,12 @@ export const toggleGroupRecipe = {
41
41
  radius: radius.md,
42
42
  gap: spacing.xxs,
43
43
  idle: {
44
- background: semanticColors.surface.default,
44
+ background: semanticColors.canvas,
45
45
  color: semanticColors.content.body,
46
46
  border: semanticColors.border.control,
47
47
  },
48
48
  pressed: {
49
- background: collectionItemContract.selectedBackground,
49
+ background: semanticColors.canvas,
50
50
  color: semanticColors.content.brand,
51
51
  border: semanticColors.border.focus,
52
52
  },
@@ -1 +1 @@
1
- {"version":3,"file":"toggle-group.js","sourceRoot":"","sources":["../src/toggle-group.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BehaviorContract } from \"./behaviors.js\";\nimport type { ColorReference } from \"./color-references.js\";\nimport { collectionItemContract, focusIndicatorContract } from \"./component-contracts.js\";\nimport { control, radius, spacing } from \"./foundations.js\";\nimport { semanticColors } from \"./semantic-colors.js\";\nimport {\n reconcileCheckboxSelection,\n toggleCheckboxSelection,\n type CheckboxSelectionItem,\n} from \"./selection-helpers.js\";\n\n/**\n * 여러 개를 동시에 켜고 끄는 버튼 묶음이다 — 굵게/기울임/밑줄, 필터 칩 여러 개처럼.\n *\n * `SegmentedControl`과 경계가 분명하다. Segmented는 **하나를 고른다**(어떤 화면을 볼지),\n * ToggleGroup은 **여러 개를 켠다**(무엇을 적용할지). 그래서 Segmented에는 \"선택 없음\"이\n * 없고 ToggleGroup에는 있다. 둘을 한 컴포넌트의 `mode` 축으로 합치면 그 차이가 사라지고,\n * \"아무것도 선택되지 않은 Segmented\"라는 표현 불가능한 상태가 타입에 생긴다.\n *\n * `CheckboxGroup`과도 다르다. CheckboxGroup은 목록 안의 동의/선택이라 각 항목이 자기\n * 줄과 설명을 갖는다. ToggleGroup은 도구 모음이라 한 줄에 붙어 있고 라벨이 짧다.\n * 판정(무엇을 켤 수 있고 비활성은 어떻게 되는가)은 같은 helper를 공유한다.\n */\nexport type ToggleGroupItemDescriptor<Id extends string = string> =\n CheckboxSelectionItem<Id>;\n\nexport type ToggleGroupDescriptor<Id extends string = string> = Readonly<{\n /** 묶음 전체의 접근성 이름. 개별 버튼 이름으로 대체할 수 없다. */\n accessibilityLabel: string;\n items: readonly ToggleGroupItemDescriptor<Id>[];\n}>;\n\nexport type ToggleGroupSize = \"small\" | \"medium\";\n\nfunction assertNonEmpty(value: string, field: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TypeError(`ToggleGroup ${field} must not be empty`);\n }\n}\n\nexport function validateToggleGroupDescriptor<Id extends string>(\n descriptor: ToggleGroupDescriptor<Id>,\n): void {\n assertNonEmpty(descriptor.accessibilityLabel, \"accessibilityLabel\");\n if (!Array.isArray(descriptor.items) || descriptor.items.length === 0) {\n throw new RangeError(\"ToggleGroup must contain at least one item\");\n }\n const ids = new Set<Id>();\n for (const item of descriptor.items) {\n assertNonEmpty(item.id, \"item id\");\n assertNonEmpty(item.label, \"item label\");\n if (ids.has(item.id)) throw new TypeError(`Duplicate ToggleGroup item id: ${item.id}`);\n ids.add(item.id);\n }\n}\n\n/** 하나를 켜고 끈다. 비활성 보호는 공용 helper가 이미 갖고 있다. */\nexport function toggleGroupSelection<Id extends string>(\n descriptor: ToggleGroupDescriptor<Id>,\n pressedIds: ReadonlySet<Id>,\n id: Id,\n): ReadonlySet<Id> {\n validateToggleGroupDescriptor(descriptor);\n return toggleCheckboxSelection(descriptor.items, pressedIds, id);\n}\n\n/** 목록에서 사라진 항목의 눌림 상태는 남기지 않는다. */\nexport function reconcileToggleGroupSelection<Id extends string>(\n descriptor: ToggleGroupDescriptor<Id>,\n pressedIds: ReadonlySet<Id>,\n): ReadonlySet<Id> {\n validateToggleGroupDescriptor(descriptor);\n return reconcileCheckboxSelection(descriptor.items, pressedIds);\n}\n\nexport const toggleGroupRecipe = {\n slots: [\"root\", \"item\", \"label\"] as const,\n defaults: { size: \"medium\" as ToggleGroupSize },\n sizes: {\n small: { minHeight: control.minTouchTarget, paddingHorizontal: spacing.sm, textVariant: \"label\" as const },\n medium: { minHeight: 44, paddingHorizontal: spacing.md, textVariant: \"body\" as const },\n },\n radius: radius.md,\n gap: spacing.xxs,\n idle: {\n background: semanticColors.surface.default,\n color: semanticColors.content.body,\n border: semanticColors.border.control,\n },\n pressed: {\n background: collectionItemContract.selectedBackground,\n color: semanticColors.content.brand,\n border: semanticColors.border.focus,\n },\n states: { focus: focusIndicatorContract },\n} as const satisfies {\n slots: readonly [\"root\", \"item\", \"label\"];\n defaults: { size: ToggleGroupSize };\n sizes: Record<ToggleGroupSize, { minHeight: number; paddingHorizontal: number; textVariant: \"label\" | \"body\" }>;\n radius: number;\n gap: number;\n idle: { background: ColorReference; color: ColorReference; border: ColorReference };\n pressed: { background: ColorReference; color: ColorReference; border: ColorReference };\n states: { focus: typeof focusIndicatorContract };\n};\n\nexport const toggleGroupBehavior = {\n controlled: [\"pressedIds\", \"defaultPressedIds\", \"onPressedIdsChange\"],\n inputs: [\"items\", \"accessibilityLabel\", \"size\"],\n stateAxes: {\n availability: [\"enabled\", \"disabled\"],\n value: [\"pressed\", \"unpressed\"],\n },\n web: {\n roles: [\"group\", \"button\"],\n keyboard: [\"Tab\", \"Enter\", \"Space\"],\n /** Toolbar-style roving focus is not used: each toggle is its own tab stop, like a row of checkboxes. */\n focus: \"native\",\n },\n native: { roles: [\"button\"], states: [\"selected\", \"disabled\"], actions: [\"toggle\"] },\n scenarios: [\n \"several-items-can-be-pressed-at-once-and-none-is-a-valid-state\",\n \"pressed-state-rides-on-aria-pressed-not-on-color-alone\",\n \"a-disabled-item-never-toggles-and-never-enters-the-pressed-set\",\n \"removing-an-item-drops-its-pressed-state-instead-of-keeping-an-orphan-id\",\n \"single-choice-belongs-to-segmented-control-this-contract-never-adds-a-single-mode\",\n \"the-group-carries-its-own-accessible-name-separate-from-each-buttons-name\",\n ],\n} as const satisfies BehaviorContract;\n"]}
1
+ {"version":3,"file":"toggle-group.js","sourceRoot":"","sources":["../src/toggle-group.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BehaviorContract } from \"./behaviors.js\";\nimport type { ColorReference } from \"./color-references.js\";\nimport { focusIndicatorContract } from \"./component-contracts.js\";\nimport { control, radius, spacing } from \"./foundations.js\";\nimport { semanticColors } from \"./semantic-colors.js\";\nimport {\n reconcileCheckboxSelection,\n toggleCheckboxSelection,\n type CheckboxSelectionItem,\n} from \"./selection-helpers.js\";\n\n/**\n * 여러 개를 동시에 켜고 끄는 버튼 묶음이다 — 굵게/기울임/밑줄, 필터 칩 여러 개처럼.\n *\n * `SegmentedControl`과 경계가 분명하다. Segmented는 **하나를 고른다**(어떤 화면을 볼지),\n * ToggleGroup은 **여러 개를 켠다**(무엇을 적용할지). 그래서 Segmented에는 \"선택 없음\"이\n * 없고 ToggleGroup에는 있다. 둘을 한 컴포넌트의 `mode` 축으로 합치면 그 차이가 사라지고,\n * \"아무것도 선택되지 않은 Segmented\"라는 표현 불가능한 상태가 타입에 생긴다.\n *\n * `CheckboxGroup`과도 다르다. CheckboxGroup은 목록 안의 동의/선택이라 각 항목이 자기\n * 줄과 설명을 갖는다. ToggleGroup은 도구 모음이라 한 줄에 붙어 있고 라벨이 짧다.\n * 판정(무엇을 켤 수 있고 비활성은 어떻게 되는가)은 같은 helper를 공유한다.\n */\nexport type ToggleGroupItemDescriptor<Id extends string = string> =\n CheckboxSelectionItem<Id>;\n\nexport type ToggleGroupDescriptor<Id extends string = string> = Readonly<{\n /** 묶음 전체의 접근성 이름. 개별 버튼 이름으로 대체할 수 없다. */\n accessibilityLabel: string;\n items: readonly ToggleGroupItemDescriptor<Id>[];\n}>;\n\nexport type ToggleGroupSize = \"small\" | \"medium\";\n\nfunction assertNonEmpty(value: string, field: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TypeError(`ToggleGroup ${field} must not be empty`);\n }\n}\n\nexport function validateToggleGroupDescriptor<Id extends string>(\n descriptor: ToggleGroupDescriptor<Id>,\n): void {\n assertNonEmpty(descriptor.accessibilityLabel, \"accessibilityLabel\");\n if (!Array.isArray(descriptor.items) || descriptor.items.length === 0) {\n throw new RangeError(\"ToggleGroup must contain at least one item\");\n }\n const ids = new Set<Id>();\n for (const item of descriptor.items) {\n assertNonEmpty(item.id, \"item id\");\n assertNonEmpty(item.label, \"item label\");\n if (ids.has(item.id)) throw new TypeError(`Duplicate ToggleGroup item id: ${item.id}`);\n ids.add(item.id);\n }\n}\n\n/** 하나를 켜고 끈다. 비활성 보호는 공용 helper가 이미 갖고 있다. */\nexport function toggleGroupSelection<Id extends string>(\n descriptor: ToggleGroupDescriptor<Id>,\n pressedIds: ReadonlySet<Id>,\n id: Id,\n): ReadonlySet<Id> {\n validateToggleGroupDescriptor(descriptor);\n return toggleCheckboxSelection(descriptor.items, pressedIds, id);\n}\n\n/** 목록에서 사라진 항목의 눌림 상태는 남기지 않는다. */\nexport function reconcileToggleGroupSelection<Id extends string>(\n descriptor: ToggleGroupDescriptor<Id>,\n pressedIds: ReadonlySet<Id>,\n): ReadonlySet<Id> {\n validateToggleGroupDescriptor(descriptor);\n return reconcileCheckboxSelection(descriptor.items, pressedIds);\n}\n\nexport const toggleGroupRecipe = {\n slots: [\"root\", \"item\", \"label\"] as const,\n defaults: { size: \"medium\" as ToggleGroupSize },\n sizes: {\n small: { minHeight: control.minTouchTarget, paddingHorizontal: spacing.sm, textVariant: \"label\" as const },\n medium: { minHeight: 44, paddingHorizontal: spacing.md, textVariant: \"body\" as const },\n },\n radius: radius.md,\n gap: spacing.xxs,\n idle: {\n background: semanticColors.canvas,\n color: semanticColors.content.body,\n border: semanticColors.border.control,\n },\n pressed: {\n background: semanticColors.canvas,\n color: semanticColors.content.brand,\n border: semanticColors.border.focus,\n },\n states: { focus: focusIndicatorContract },\n} as const satisfies {\n slots: readonly [\"root\", \"item\", \"label\"];\n defaults: { size: ToggleGroupSize };\n sizes: Record<ToggleGroupSize, { minHeight: number; paddingHorizontal: number; textVariant: \"label\" | \"body\" }>;\n radius: number;\n gap: number;\n idle: { background: ColorReference; color: ColorReference; border: ColorReference };\n pressed: { background: ColorReference; color: ColorReference; border: ColorReference };\n states: { focus: typeof focusIndicatorContract };\n};\n\nexport const toggleGroupBehavior = {\n controlled: [\"pressedIds\", \"defaultPressedIds\", \"onPressedIdsChange\"],\n inputs: [\"items\", \"accessibilityLabel\", \"size\"],\n stateAxes: {\n availability: [\"enabled\", \"disabled\"],\n value: [\"pressed\", \"unpressed\"],\n },\n web: {\n roles: [\"group\", \"button\"],\n keyboard: [\"Tab\", \"Enter\", \"Space\"],\n /** Toolbar-style roving focus is not used: each toggle is its own tab stop, like a row of checkboxes. */\n focus: \"native\",\n },\n native: { roles: [\"button\"], states: [\"selected\", \"disabled\"], actions: [\"toggle\"] },\n scenarios: [\n \"several-items-can-be-pressed-at-once-and-none-is-a-valid-state\",\n \"pressed-state-rides-on-aria-pressed-not-on-color-alone\",\n \"a-disabled-item-never-toggles-and-never-enters-the-pressed-set\",\n \"removing-an-item-drops-its-pressed-state-instead-of-keeping-an-orphan-id\",\n \"single-choice-belongs-to-segmented-control-this-contract-never-adds-a-single-mode\",\n \"the-group-carries-its-own-accessible-name-separate-from-each-buttons-name\",\n ],\n} as const satisfies BehaviorContract;\n"]}
@@ -70,7 +70,7 @@ export declare const transferListRecipe: {
70
70
  readonly panel: {
71
71
  readonly background: Readonly<{
72
72
  source: "theme";
73
- key: "surface";
73
+ key: "bg";
74
74
  alpha?: number;
75
75
  }>;
76
76
  readonly border: Readonly<{
@@ -124,7 +124,7 @@ export declare const transferListRecipe: {
124
124
  };
125
125
  readonly highlightedBackground: Readonly<{
126
126
  source: "theme";
127
- key: "text";
127
+ key: "bg";
128
128
  alpha?: number;
129
129
  }>;
130
130
  readonly focus: {
@@ -138,7 +138,7 @@ export declare const transferListRecipe: {
138
138
  };
139
139
  readonly selectedBackground: Readonly<{
140
140
  source: "theme";
141
- key: "primary";
141
+ key: "bg";
142
142
  alpha?: number;
143
143
  }>;
144
144
  readonly selectedIndicator: Readonly<{
@@ -138,7 +138,7 @@ export const transferListRecipe = {
138
138
  "moveButton",
139
139
  ],
140
140
  panel: {
141
- background: semanticColors.surface.default,
141
+ background: semanticColors.canvas,
142
142
  border: semanticColors.border.default,
143
143
  borderWidth: stroke.default,
144
144
  radius: "md",