@k2b/ui 0.29.0 → 0.30.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 (173) hide show
  1. package/README.md +1 -1
  2. package/dist/base.css +2 -2
  3. package/dist/browser/actions/Dropdown.js +6 -3
  4. package/dist/browser/actions/Dropdown.js.map +1 -1
  5. package/dist/browser/actions/FilterChip.js +137 -7
  6. package/dist/browser/actions/FilterChip.js.map +1 -1
  7. package/dist/browser/actions/SegmentedControl.js +5 -9
  8. package/dist/browser/actions/SegmentedControl.js.map +1 -1
  9. package/dist/browser/actions/SpotlightSearch.js +6 -3
  10. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  11. package/dist/browser/actions/Tabs.js +5 -2
  12. package/dist/browser/actions/Tabs.js.map +1 -1
  13. package/dist/browser/actions/ViewTabs.js +294 -0
  14. package/dist/browser/actions/ViewTabs.js.map +1 -0
  15. package/dist/browser/actions/filter-messages.js +6 -2
  16. package/dist/browser/actions/filter-messages.js.map +1 -1
  17. package/dist/browser/actions/index.js +2 -1
  18. package/dist/browser/actions/index.js.map +1 -1
  19. package/dist/browser/chat/ChatComposer.js +1108 -604
  20. package/dist/browser/chat/ChatComposer.js.map +1 -1
  21. package/dist/browser/chat/ChatDecision.js +120 -84
  22. package/dist/browser/chat/ChatDecision.js.map +1 -1
  23. package/dist/browser/chat/ChatPrimitives.js +292 -159
  24. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  25. package/dist/browser/chat/chat-messages.js +8 -0
  26. package/dist/browser/chat/chat-messages.js.map +1 -1
  27. package/dist/browser/chat/command-search.js +26 -15
  28. package/dist/browser/chat/command-search.js.map +1 -1
  29. package/dist/browser/chat/index.js +4 -2
  30. package/dist/browser/chat/index.js.map +1 -1
  31. package/dist/browser/content/Calendar.js +143 -116
  32. package/dist/browser/content/Calendar.js.map +1 -1
  33. package/dist/browser/content/CalendarWeekView.js +291 -266
  34. package/dist/browser/content/CalendarWeekView.js.map +1 -1
  35. package/dist/browser/content/DataTable.js +224 -155
  36. package/dist/browser/content/DataTable.js.map +1 -1
  37. package/dist/browser/content/data-table-messages.js +4 -2
  38. package/dist/browser/content/data-table-messages.js.map +1 -1
  39. package/dist/browser/feedback/MovedHint.js +197 -0
  40. package/dist/browser/feedback/MovedHint.js.map +1 -0
  41. package/dist/browser/feedback/dialog-core.js +66 -9
  42. package/dist/browser/feedback/dialog-core.js.map +1 -1
  43. package/dist/browser/feedback/index.js +1 -0
  44. package/dist/browser/feedback/index.js.map +1 -1
  45. package/dist/browser/feedback/prompts.js +6 -1
  46. package/dist/browser/feedback/prompts.js.map +1 -1
  47. package/dist/browser/inputs/DatePicker.js +337 -212
  48. package/dist/browser/inputs/DatePicker.js.map +1 -1
  49. package/dist/browser/inputs/date-picker.js +59 -5
  50. package/dist/browser/inputs/date-picker.js.map +1 -1
  51. package/dist/browser/intl/messages.js +12 -0
  52. package/dist/browser/intl/messages.js.map +1 -1
  53. package/dist/browser/intl/weekend.js +39 -0
  54. package/dist/browser/intl/weekend.js.map +1 -0
  55. package/dist/browser/layout/AppOverview.js +0 -1
  56. package/dist/browser/layout/AppOverview.js.map +1 -1
  57. package/dist/browser/layout/AppWorkspace.js +688 -471
  58. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  59. package/dist/browser/layout/PageTitle.js +3 -2
  60. package/dist/browser/layout/PageTitle.js.map +1 -1
  61. package/dist/browser/layout/SettingsModal.js +2 -2
  62. package/dist/browser/layout/SettingsModal.js.map +1 -1
  63. package/dist/browser/layout/SidebarSwitcher.js +13 -12
  64. package/dist/browser/layout/SidebarSwitcher.js.map +1 -1
  65. package/dist/browser/layout/TabBar.js +1 -1
  66. package/dist/browser/layout/TabBar.js.map +1 -1
  67. package/dist/browser/layout/app-host-width.js +44 -0
  68. package/dist/browser/layout/app-host-width.js.map +1 -0
  69. package/dist/browser/layout/app-workspace-controller.js +219 -39
  70. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  71. package/dist/browser/layout/index.js +1 -0
  72. package/dist/browser/layout/index.js.map +1 -1
  73. package/dist/browser/surfaces/Placeholder.js +36 -13
  74. package/dist/browser/surfaces/Placeholder.js.map +1 -1
  75. package/dist/ssr/actions/Dropdown.js +5 -2
  76. package/dist/ssr/actions/Dropdown.js.map +1 -1
  77. package/dist/ssr/actions/FilterChip.js +59 -7
  78. package/dist/ssr/actions/FilterChip.js.map +1 -1
  79. package/dist/ssr/actions/SegmentedControl.js +1 -2
  80. package/dist/ssr/actions/SegmentedControl.js.map +1 -1
  81. package/dist/ssr/actions/SpotlightSearch.js +2 -2
  82. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  83. package/dist/ssr/actions/Tabs.js +2 -2
  84. package/dist/ssr/actions/Tabs.js.map +1 -1
  85. package/dist/ssr/actions/ViewTabs.js +211 -0
  86. package/dist/ssr/actions/ViewTabs.js.map +1 -0
  87. package/dist/ssr/actions/filter-messages.js +6 -2
  88. package/dist/ssr/actions/filter-messages.js.map +1 -1
  89. package/dist/ssr/actions/index.js +2 -1
  90. package/dist/ssr/actions/index.js.map +1 -1
  91. package/dist/ssr/chat/ChatComposer.js +546 -131
  92. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  93. package/dist/ssr/chat/ChatDecision.js +33 -19
  94. package/dist/ssr/chat/ChatDecision.js.map +1 -1
  95. package/dist/ssr/chat/ChatPrimitives.js +95 -24
  96. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  97. package/dist/ssr/chat/chat-messages.js +8 -0
  98. package/dist/ssr/chat/chat-messages.js.map +1 -1
  99. package/dist/ssr/chat/command-search.js +26 -15
  100. package/dist/ssr/chat/command-search.js.map +1 -1
  101. package/dist/ssr/chat/index.js +4 -2
  102. package/dist/ssr/chat/index.js.map +1 -1
  103. package/dist/ssr/content/Calendar.js +109 -100
  104. package/dist/ssr/content/Calendar.js.map +1 -1
  105. package/dist/ssr/content/CalendarWeekView.js +42 -28
  106. package/dist/ssr/content/CalendarWeekView.js.map +1 -1
  107. package/dist/ssr/content/DataTable.js +78 -31
  108. package/dist/ssr/content/DataTable.js.map +1 -1
  109. package/dist/ssr/content/data-table-messages.js +4 -2
  110. package/dist/ssr/content/data-table-messages.js.map +1 -1
  111. package/dist/ssr/feedback/MovedHint.js +166 -0
  112. package/dist/ssr/feedback/MovedHint.js.map +1 -0
  113. package/dist/ssr/feedback/dialog-core.js +66 -9
  114. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  115. package/dist/ssr/feedback/index.js +1 -0
  116. package/dist/ssr/feedback/index.js.map +1 -1
  117. package/dist/ssr/feedback/prompts.js +6 -1
  118. package/dist/ssr/feedback/prompts.js.map +1 -1
  119. package/dist/ssr/inputs/DatePicker.js +138 -69
  120. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  121. package/dist/ssr/inputs/date-picker.js +59 -5
  122. package/dist/ssr/inputs/date-picker.js.map +1 -1
  123. package/dist/ssr/intl/messages.js +12 -0
  124. package/dist/ssr/intl/messages.js.map +1 -1
  125. package/dist/ssr/intl/weekend.js +39 -0
  126. package/dist/ssr/intl/weekend.js.map +1 -0
  127. package/dist/ssr/layout/AppOverview.js +0 -1
  128. package/dist/ssr/layout/AppOverview.js.map +1 -1
  129. package/dist/ssr/layout/AppWorkspace.js +203 -39
  130. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  131. package/dist/ssr/layout/PageTitle.js +3 -2
  132. package/dist/ssr/layout/PageTitle.js.map +1 -1
  133. package/dist/ssr/layout/SettingsModal.js +2 -2
  134. package/dist/ssr/layout/SettingsModal.js.map +1 -1
  135. package/dist/ssr/layout/SidebarSwitcher.js +13 -12
  136. package/dist/ssr/layout/SidebarSwitcher.js.map +1 -1
  137. package/dist/ssr/layout/TabBar.js +1 -1
  138. package/dist/ssr/layout/TabBar.js.map +1 -1
  139. package/dist/ssr/layout/app-host-width.js +44 -0
  140. package/dist/ssr/layout/app-host-width.js.map +1 -0
  141. package/dist/ssr/layout/app-workspace-controller.js +219 -39
  142. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  143. package/dist/ssr/layout/index.js +1 -0
  144. package/dist/ssr/layout/index.js.map +1 -1
  145. package/dist/ssr/surfaces/Placeholder.js +24 -7
  146. package/dist/ssr/surfaces/Placeholder.js.map +1 -1
  147. package/dist/styles.css +1 -1
  148. package/dist/types/actions/Dropdown.d.ts +4 -0
  149. package/dist/types/actions/FilterChip.d.ts +22 -0
  150. package/dist/types/actions/ViewTabs.d.ts +30 -0
  151. package/dist/types/actions/filter-messages.d.ts +2 -0
  152. package/dist/types/actions/index.d.ts +4 -2
  153. package/dist/types/chat/ChatComposer.d.ts +52 -0
  154. package/dist/types/chat/ChatDecision.d.ts +18 -2
  155. package/dist/types/chat/ChatPrimitives.d.ts +10 -0
  156. package/dist/types/chat/chat-messages.d.ts +4 -0
  157. package/dist/types/chat/command-search.d.ts +2 -0
  158. package/dist/types/chat/index.d.ts +9 -8
  159. package/dist/types/content/DataTable.d.ts +3 -0
  160. package/dist/types/content/data-table-messages.d.ts +1 -0
  161. package/dist/types/feedback/MovedHint.d.ts +25 -0
  162. package/dist/types/feedback/dialog-core.d.ts +5 -2
  163. package/dist/types/feedback/index.d.ts +2 -0
  164. package/dist/types/feedback/prompts.d.ts +2 -0
  165. package/dist/types/inputs/DatePicker.d.ts +7 -0
  166. package/dist/types/inputs/date-picker.d.ts +25 -1
  167. package/dist/types/intl/messages.d.ts +6 -0
  168. package/dist/types/intl/weekend.d.ts +12 -0
  169. package/dist/types/layout/AppWorkspace.d.ts +43 -7
  170. package/dist/types/layout/app-host-width.d.ts +6 -0
  171. package/dist/types/layout/index.d.ts +2 -1
  172. package/dist/types/surfaces/Placeholder.d.ts +2 -1
  173. package/package.json +4 -4
@@ -0,0 +1,166 @@
1
+ import { ssr as _$ssr } from "solid-js/web";
2
+ import { createComponent as _$createComponent } from "solid-js/web";
3
+ import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
4
+ import { escape as _$escape } from "solid-js/web";
5
+ var _tmpl$ = ["<div class=\"", "\" popover=\"manual\" role=\"group\"", "><p class=\"k2b-moved-hint__text\"", ">", "</p><div class=\"k2b-moved-hint__actions\">", "", "</div></div>"];
6
+ import { createEffect, createSignal, createUniqueId, onCleanup, onMount, Show } from "solid-js";
7
+ import { Button, ButtonLink } from "../actions/Button";
8
+ import { useUiMessages } from "../intl/messages";
9
+ import { announce } from "./announce";
10
+ import { positionTooltipSurface } from "./tooltip-position";
11
+ export function MovedHint(props) {
12
+ const messages = useUiMessages();
13
+ const textId = `k2b-moved-hint-${createUniqueId()}`;
14
+ const [mounted, setMounted] = createSignal(false);
15
+ const [dismissed, setDismissed] = createSignal(false);
16
+ let surface;
17
+ let text;
18
+ let previousFocus;
19
+ let shown = false;
20
+ let announced = false;
21
+ const hide = () => {
22
+ if (!shown) return;
23
+ shown = false;
24
+ try {
25
+ surface?.hidePopover?.();
26
+ } catch {
27
+ // Cleanup can run after the surface disconnects.
28
+ }
29
+ };
30
+ const dismiss = restoreFocus => {
31
+ if (!props.open || dismissed()) return false;
32
+ const focusInside = surface?.contains(document.activeElement);
33
+ const target = props.target();
34
+ const returnTo = previousFocus?.isConnected && !previousFocus.matches(":disabled") ? previousFocus : target && (target.tabIndex >= 0 || target.hasAttribute("tabindex")) && !target.matches(":disabled") ? target : undefined;
35
+ hide();
36
+ if (restoreFocus && focusInside && returnTo) {
37
+ returnTo.focus({
38
+ preventScroll: true
39
+ });
40
+ }
41
+ setDismissed(true);
42
+ props.onDismiss();
43
+ return true;
44
+ };
45
+ createEffect(() => {
46
+ if (!props.open) {
47
+ setDismissed(false);
48
+ previousFocus = undefined;
49
+ }
50
+ });
51
+ onMount(() => setMounted(true));
52
+ createEffect(() => {
53
+ if (!mounted() || !props.open || dismissed()) return;
54
+ const anchor = props.target();
55
+ const placement = props.placement ?? "bottom";
56
+ if (!surface || !anchor) return;
57
+
58
+ // A target scrolled out of view, or clipped by its scroller, takes the hint along instead of leaving it
59
+ // pinned to the viewport edge over unrelated content.
60
+ let inView = typeof IntersectionObserver === "undefined";
61
+ const position = () => {
62
+ if (!props.open || dismissed() || !inView || !anchor.isConnected || anchor.getClientRects().length === 0) {
63
+ hide();
64
+ return;
65
+ }
66
+ if (!surface || typeof surface.showPopover !== "function") return;
67
+ if (!shown) {
68
+ try {
69
+ surface.showPopover();
70
+ shown = true;
71
+ } catch {
72
+ return;
73
+ }
74
+ }
75
+ positionTooltipSurface(surface, anchor, placement);
76
+ if (!announced) {
77
+ announced = true;
78
+ announce(text?.textContent ?? "");
79
+ }
80
+ };
81
+ const focusIn = event => {
82
+ if (!(event.relatedTarget instanceof Node) || !surface?.contains(event.relatedTarget)) {
83
+ previousFocus = event.relatedTarget instanceof HTMLElement ? event.relatedTarget : undefined;
84
+ }
85
+ };
86
+ const keydown = event => {
87
+ if (event.defaultPrevented || event.isComposing) return;
88
+ if (event.key !== "Escape" || !(event.target instanceof Node)) return;
89
+ if (!surface?.contains(event.target) && !anchor.contains(event.target)) return;
90
+ event.preventDefault();
91
+ dismiss(true);
92
+ };
93
+ const observer = typeof ResizeObserver === "undefined" ? undefined : new ResizeObserver(position);
94
+ observer?.observe(anchor);
95
+ const visibility = typeof IntersectionObserver === "undefined" ? undefined : new IntersectionObserver(entries => {
96
+ inView = entries.at(-1)?.isIntersecting ?? inView;
97
+ position();
98
+ });
99
+ visibility?.observe(anchor);
100
+ surface.addEventListener("focusin", focusIn);
101
+ document.addEventListener("keydown", keydown);
102
+ window.addEventListener("resize", position);
103
+ window.addEventListener("scroll", position, {
104
+ capture: true,
105
+ passive: true
106
+ });
107
+ position();
108
+ onCleanup(() => {
109
+ observer?.disconnect();
110
+ visibility?.disconnect();
111
+ surface?.removeEventListener("focusin", focusIn);
112
+ document.removeEventListener("keydown", keydown);
113
+ window.removeEventListener("resize", position);
114
+ window.removeEventListener("scroll", position, true);
115
+ hide();
116
+ });
117
+ });
118
+ return _$createComponent(Show, {
119
+ get when() {
120
+ return props.open;
121
+ },
122
+ get children() {
123
+ return _$ssr(_tmpl$, `k2b-moved-hint${props.class ? ` ${_$escape(props.class, true)}` : ""}`, _$ssrAttribute("aria-labelledby", _$escape(textId, true), false) + _$ssrAttribute("data-placement", _$escape(props.placement ?? "bottom", true), false), _$ssrAttribute("id", _$escape(textId, true), false), _$escape(props.children), _$escape(_$createComponent(Show, {
124
+ get when() {
125
+ return props.action.href !== undefined;
126
+ },
127
+ get fallback() {
128
+ return _$createComponent(Button, {
129
+ size: "sm",
130
+ variant: "secondary",
131
+ type: "button",
132
+ onClick: () => {
133
+ const action = props.action;
134
+ if (dismiss(false)) action.onClick?.();
135
+ },
136
+ get children() {
137
+ return props.action.label;
138
+ }
139
+ });
140
+ },
141
+ get children() {
142
+ return _$createComponent(ButtonLink, {
143
+ size: "sm",
144
+ variant: "secondary",
145
+ get href() {
146
+ return props.action.href;
147
+ },
148
+ onClick: () => dismiss(false),
149
+ get children() {
150
+ return props.action.label;
151
+ }
152
+ });
153
+ }
154
+ })), _$escape(_$createComponent(Button, {
155
+ size: "sm",
156
+ variant: "ghost",
157
+ type: "button",
158
+ onClick: () => dismiss(true),
159
+ get children() {
160
+ return messages().movedHintDismiss;
161
+ }
162
+ })));
163
+ }
164
+ });
165
+ }
166
+ //# sourceMappingURL=MovedHint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["feedback/MovedHint.tsx"],"sourcesContent":["import { createEffect, createSignal, createUniqueId, type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { Button, ButtonLink } from \"../actions/Button\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { announce } from \"./announce\";\nimport { positionTooltipSurface, type TooltipPlacement } from \"./tooltip-position\";\n\nexport type MovedHintAction = { label: string; href: string; onClick?: never } | { label: string; onClick: () => void; href?: never };\n\nexport type MovedHintProps = {\n /** The owner decides this on the server, so a dismissed hint never renders again. */\n open: boolean;\n /** Called once per open period when the person closes the hint or uses its action. */\n onDismiss: () => void;\n /** Render the hint directly after this element to preserve keyboard order. */\n target: () => HTMLElement | undefined;\n /** Short text naming the new place. */\n children: JSX.Element;\n action: MovedHintAction;\n placement?: TooltipPlacement;\n class?: string;\n};\n\nexport function MovedHint(props: MovedHintProps): JSX.Element {\n const messages = useUiMessages();\n const textId = `k2b-moved-hint-${createUniqueId()}`;\n const [mounted, setMounted] = createSignal(false);\n const [dismissed, setDismissed] = createSignal(false);\n let surface: HTMLDivElement | undefined;\n let text: HTMLParagraphElement | undefined;\n let previousFocus: HTMLElement | undefined;\n let shown = false;\n let announced = false;\n\n const hide = () => {\n if (!shown) return;\n shown = false;\n try {\n surface?.hidePopover?.();\n } catch {\n // Cleanup can run after the surface disconnects.\n }\n };\n\n const dismiss = (restoreFocus: boolean): boolean => {\n if (!props.open || dismissed()) return false;\n const focusInside = surface?.contains(document.activeElement);\n const target = props.target();\n const returnTo =\n previousFocus?.isConnected && !previousFocus.matches(\":disabled\")\n ? previousFocus\n : target && (target.tabIndex >= 0 || target.hasAttribute(\"tabindex\")) && !target.matches(\":disabled\")\n ? target\n : undefined;\n hide();\n if (restoreFocus && focusInside && returnTo) {\n returnTo.focus({ preventScroll: true });\n }\n setDismissed(true);\n props.onDismiss();\n return true;\n };\n\n createEffect(() => {\n if (!props.open) {\n setDismissed(false);\n previousFocus = undefined;\n }\n });\n onMount(() => setMounted(true));\n\n createEffect(() => {\n if (!mounted() || !props.open || dismissed()) return;\n const anchor = props.target();\n const placement = props.placement ?? \"bottom\";\n if (!surface || !anchor) return;\n\n // A target scrolled out of view, or clipped by its scroller, takes the hint along instead of leaving it\n // pinned to the viewport edge over unrelated content.\n let inView = typeof IntersectionObserver === \"undefined\";\n const position = () => {\n if (!props.open || dismissed() || !inView || !anchor.isConnected || anchor.getClientRects().length === 0) {\n hide();\n return;\n }\n if (!surface || typeof surface.showPopover !== \"function\") return;\n if (!shown) {\n try {\n surface.showPopover();\n shown = true;\n } catch {\n return;\n }\n }\n positionTooltipSurface(surface, anchor, placement);\n if (!announced) {\n announced = true;\n announce(text?.textContent ?? \"\");\n }\n };\n const focusIn = (event: FocusEvent) => {\n if (!(event.relatedTarget instanceof Node) || !surface?.contains(event.relatedTarget)) {\n previousFocus = event.relatedTarget instanceof HTMLElement ? event.relatedTarget : undefined;\n }\n };\n const keydown = (event: KeyboardEvent) => {\n if (event.defaultPrevented || event.isComposing) return;\n if (event.key !== \"Escape\" || !(event.target instanceof Node)) return;\n if (!surface?.contains(event.target) && !anchor.contains(event.target)) return;\n event.preventDefault();\n dismiss(true);\n };\n const observer = typeof ResizeObserver === \"undefined\" ? undefined : new ResizeObserver(position);\n observer?.observe(anchor);\n const visibility =\n typeof IntersectionObserver === \"undefined\"\n ? undefined\n : new IntersectionObserver((entries) => {\n inView = entries.at(-1)?.isIntersecting ?? inView;\n position();\n });\n visibility?.observe(anchor);\n surface.addEventListener(\"focusin\", focusIn);\n document.addEventListener(\"keydown\", keydown);\n window.addEventListener(\"resize\", position);\n window.addEventListener(\"scroll\", position, { capture: true, passive: true });\n position();\n onCleanup(() => {\n observer?.disconnect();\n visibility?.disconnect();\n surface?.removeEventListener(\"focusin\", focusIn);\n document.removeEventListener(\"keydown\", keydown);\n window.removeEventListener(\"resize\", position);\n window.removeEventListener(\"scroll\", position, true);\n hide();\n });\n });\n\n return (\n <Show when={props.open}>\n <div\n ref={surface}\n class={`k2b-moved-hint${props.class ? ` ${props.class}` : \"\"}`}\n popover=\"manual\"\n role=\"group\"\n aria-labelledby={textId}\n data-placement={props.placement ?? \"bottom\"}\n >\n <p ref={text} class=\"k2b-moved-hint__text\" id={textId}>\n {props.children}\n </p>\n <div class=\"k2b-moved-hint__actions\">\n <Show\n when={props.action.href !== undefined}\n fallback={\n <Button\n size=\"sm\"\n variant=\"secondary\"\n type=\"button\"\n onClick={() => {\n const action = props.action;\n if (dismiss(false)) action.onClick?.();\n }}\n >\n {props.action.label}\n </Button>\n }\n >\n <ButtonLink size=\"sm\" variant=\"secondary\" href={props.action.href} onClick={() => dismiss(false)}>\n {props.action.label}\n </ButtonLink>\n </Show>\n <Button size=\"sm\" variant=\"ghost\" type=\"button\" onClick={() => dismiss(true)}>\n {messages().movedHintDismiss}\n </Button>\n </div>\n </div>\n </Show>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -65,17 +65,26 @@ export const createDialogCore = () => {
65
65
  /** Markers of this core's entries in the browser history, oldest first. */
66
66
  let historyIds = [];
67
67
  const issued = new Set();
68
+ /**
69
+ * Markers forgotten during island disposal. Their entries stay in `historyIds` as barriers: a synthetic Back never
70
+ * crosses one, because the router may have replaced that entry with another page.
71
+ */
72
+ const forgotten = new Set();
73
+ const deadMarker = marker => typeof marker === "number" && forgotten.has(marker);
74
+ /** How often islands were disposed, so a dialog that waits to open notices that a content swap happened meanwhile. */
75
+ let disposals = 0;
68
76
  const ownMarker = marker => typeof marker === "number" && issued.has(marker);
69
77
  let seen;
70
78
  let traversalFrom;
71
79
  let syntheticFrom;
72
80
  const historyHolders = new Set();
73
81
  let historySyncScheduled = false;
82
+ let disposingIslands = false;
74
83
  /** Settles when the synthetic Back that removes closed dialogs' entries has arrived. */
75
84
  let returning;
76
85
  let resolveReturning;
77
86
 
78
- /** Closed entries leave with one Back to the newest live dialog or holder, or to the page. */
87
+ /** Outside island disposal, closed entries leave with one Back to the newest live dialog or holder, or to the page. */
79
88
  const syncHistory = () => {
80
89
  if (returning) {
81
90
  void returning.then(() => {
@@ -87,7 +96,7 @@ export const createDialogCore = () => {
87
96
  const openIds = new Set([...state.stack, ...historyHolders].map(entry => entry.historyId));
88
97
  const current = historyIds.at(-1);
89
98
  let steps = 0;
90
- while (historyIds.length > 0 && !openIds.has(historyIds.at(-1))) {
99
+ while (historyIds.length > 0 && !openIds.has(historyIds.at(-1)) && !deadMarker(historyIds.at(-1))) {
91
100
  historyIds.pop();
92
101
  steps++;
93
102
  }
@@ -107,7 +116,16 @@ export const createDialogCore = () => {
107
116
  history.go(-steps);
108
117
  };
109
118
  const releaseHistory = entry => {
110
- if (entry.historyId === undefined || historySyncScheduled) return;
119
+ if (entry.historyId === undefined) return;
120
+ // During a content swap the router owns history. Forget the marker without moving history; its entry stays a
121
+ // barrier for later synthetic Backs and is left for the router to replace.
122
+ if (disposingIslands) {
123
+ issued.delete(entry.historyId);
124
+ forgotten.add(entry.historyId);
125
+ entry.historyId = undefined;
126
+ return;
127
+ }
128
+ if (historySyncScheduled) return;
111
129
  historySyncScheduled = true;
112
130
  queueMicrotask(syncHistory);
113
131
  };
@@ -126,8 +144,8 @@ export const createDialogCore = () => {
126
144
  event.stopImmediatePropagation();
127
145
  }
128
146
  // Own entries are ordered by id. A retired entry reached by Forward stays tracked, so closing the dialogs
129
- // beneath it also removes it.
130
- historyIds = ownMarker(marker) ? [...historyIds.filter(id => id < marker), marker] : [];
147
+ // beneath it also removes it. A forgotten entry keeps the holders opened before it and stays a barrier.
148
+ historyIds = ownMarker(marker) || deadMarker(marker) ? [...historyIds.filter(id => id < marker), marker] : [];
131
149
  const gone = entry => entry.historyId !== undefined && !historyIds.includes(entry.historyId);
132
150
  while (state.stack.some(gone)) popTop(undefined);
133
151
  for (const holder of [...historyHolders].reverse()) {
@@ -141,6 +159,30 @@ export const createDialogCore = () => {
141
159
  resolveBack?.();
142
160
  }
143
161
  };
162
+
163
+ /**
164
+ * Island disposal means the page content changes, as a document load would. Every dialog closes, top first, whichever
165
+ * code opened it: which island calls open() is not knowable after an await, in onMount or from a timer, and a modal
166
+ * left over the new content would block it.
167
+ */
168
+ const onIslandDispose = () => {
169
+ if (!disposingIslands) {
170
+ disposingIslands = true;
171
+ queueMicrotask(() => {
172
+ disposingIslands = false;
173
+ });
174
+ // Entries released just before, whose Back has not started yet, stay as well: the router owns history now.
175
+ // A Back already on its way still settles through `returning`.
176
+ historySyncScheduled = false;
177
+ const live = new Set([...state.stack, ...historyHolders].map(entry => entry.historyId));
178
+ for (const id of historyIds) {
179
+ if (live.has(id) || !issued.delete(id)) continue;
180
+ forgotten.add(id);
181
+ }
182
+ }
183
+ disposals++;
184
+ while (state.stack.length > 0) popTop(undefined);
185
+ };
144
186
  const onNavigate = event => {
145
187
  if (event.navigationType === "traverse") traversalFrom = {
146
188
  href: location.href,
@@ -154,10 +196,17 @@ export const createDialogCore = () => {
154
196
  listening?.window.removeEventListener("popstate", onPopState, {
155
197
  capture: true
156
198
  });
199
+ listening?.window.removeEventListener("ssr:island-dispose", onIslandDispose, {
200
+ capture: true
201
+ });
157
202
  listening?.navigation?.removeEventListener("navigate", onNavigate);
158
203
  window.addEventListener("popstate", onPopState, {
159
204
  capture: true
160
205
  });
206
+ // Capture opens the disposal window before target listeners can release history holders.
207
+ window.addEventListener("ssr:island-dispose", onIslandDispose, {
208
+ capture: true
209
+ });
161
210
  const current = typeof navigation !== "undefined" ? navigation : undefined;
162
211
  current?.addEventListener("navigate", onNavigate);
163
212
  listening = {
@@ -206,7 +255,7 @@ export const createDialogCore = () => {
206
255
  };
207
256
 
208
257
  /**
209
- * Settles once released entries have left the history. A caller that navigates or pushes an entry of its own waits
258
+ * Settles once released entries have left history or were forgotten during island disposal. A caller that navigates waits
210
259
  * for it, as a dialog's result waits: a Back still on its way would otherwise land behind the new entry.
211
260
  */
212
261
  const historySettled = async () => {
@@ -386,13 +435,19 @@ export const createDialogCore = () => {
386
435
  });
387
436
  };
388
437
  const open = (view, options = {}) => {
438
+ return openAfter(view, options, disposals);
439
+ };
440
+ const openAfter = (view, options, requested) => {
389
441
  if (options.signal?.aborted) return Promise.resolve(undefined);
390
442
  if (options.history) {
391
443
  // Dialogs closed just now leave the history first, or this dialog's entry would be the one removed.
392
444
  if (historySyncScheduled) syncHistory();
393
- if (returning) return returning.then(() => open(view, options));
445
+ if (returning) return returning.then(() => openAfter(view, options, requested));
394
446
  }
447
+ // A dialog that waited for history while islands were disposed would open over content it was never meant for.
448
+ if (disposals !== requested) return Promise.resolve(undefined);
395
449
  const dialog = ensureDialogElement();
450
+ listen();
396
451
  const previousTop = state.stack[state.stack.length - 1];
397
452
  if (previousTop) previousTop.container.style.display = "none";
398
453
  const activeElement = document.activeElement;
@@ -427,11 +482,12 @@ export const createDialogCore = () => {
427
482
  };
428
483
  entry.resolve = value => {
429
484
  options.signal?.removeEventListener("abort", abort);
430
- if (entry.historyId === undefined) {
485
+ if (!options.history) {
431
486
  resolve(value);
432
487
  return;
433
488
  }
434
489
  // After every pending history sync, so a caller that navigates or opens the next dialog finds the history settled.
490
+ // This holds for a marker forgotten during island disposal too, while an earlier synthetic Back is on its way.
435
491
  queueMicrotask(() => void historySettled().then(() => resolve(value)));
436
492
  };
437
493
  const closeTyped = result => {
@@ -522,8 +578,9 @@ export const dialogCore = publicDialogCore;
522
578
  /**
523
579
  * Internal: transient UI shares dialogs' Back handling without exposing another public dialog capability.
524
580
  * Same-URL traversals are suppressed with the Navigation API; without it, only the synthetic Back on release is suppressed.
581
+ * Release during island disposal forgets the marker without traversing; the router may replace the remaining entry.
525
582
  */
526
583
  export const holdDialogHistory = holdHistory;
527
- /** Internal: waits until entries released through `holdDialogHistory` have left the history. */
584
+ /** Internal: waits until released holders have left history or were forgotten during island disposal. */
528
585
  export const dialogHistorySettled = historySettled;
529
586
  //# sourceMappingURL=dialog-core.js.map
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["feedback/dialog-core.ts"],"sourcesContent":["import { createComponent, type JSX } from \"solid-js\";\nimport { render } from \"solid-js/web\";\nimport { returnFocus, ringOnReturn } from \"../internal/focus-return\";\nimport { getK2bPortalRoot } from \"../internal/portal\";\nimport { RenderErrorBoundary } from \"../internal/render-error\";\nimport { resolveUiMessages } from \"../intl/messages\";\nimport { isPointInsideToast } from \"./toast\";\n\nexport type DialogClose<T> = (result?: T) => void;\n\nexport type OpenDialogOptions = {\n /** Close only this dialog when its owning operation is cancelled. */\n signal?: AbortSignal;\n panelClassName?: string;\n contentClassName?: string;\n initialFocus?: \"first-input\" | \"none\" | ((dialog: HTMLDialogElement) => HTMLElement | null);\n cancelBehavior?: \"resolve-undefined\" | \"ignore\";\n ariaLabel?: string;\n /**\n * Add a same-URL history entry while the dialog is open, so the browser's or the phone's Back closes the dialog\n * instead of leaving the page. Closing the dialog removes the entry again; the returned promise settles after that.\n * With the Navigation API, same-URL traversals between this core's entries and the page do not reach application popstate listeners.\n * Without it, only the synthetic Back on close is suppressed.\n */\n history?: boolean;\n};\n\nexport type DialogRender<T> = (\n close: DialogClose<T>,\n context: {\n dialog: HTMLDialogElement;\n /** Switch this entry between a modal and a modeless window without remounting. */\n setModal: (modal: boolean) => void;\n /** Set viewport coordinates, or restore the panel stylesheet position with null. */\n setPosition: (position: { x: number; y: number } | null) => void;\n /** Route Escape/backdrop through the same guarded handler as Cancel and X. */\n setDismissHandler: (handler: () => void | Promise<void>) => void;\n /** Request dismissal through this entry's cancellation policy and guard. */\n requestDismiss: () => Promise<void>;\n },\n) => JSX.Element;\n\nexport type DialogCore = {\n open: <T>(view: DialogRender<T>, options?: OpenDialogOptions) => Promise<T | undefined>;\n close: (result?: unknown) => void;\n isOpen: () => boolean;\n};\n\ntype DialogStackEntry = {\n container: HTMLDivElement;\n dispose?: () => void;\n resolve?: (value: unknown) => void;\n panelClassName: string;\n cancelBehavior: NonNullable<OpenDialogOptions[\"cancelBehavior\"]>;\n initialFocus: NonNullable<OpenDialogOptions[\"initialFocus\"]>;\n opener?: HTMLElement;\n openerRing: boolean;\n ariaLabel?: string;\n dismissHandler?: () => void | Promise<void>;\n dismissPending?: boolean;\n modal: boolean;\n position?: { x: number; y: number } | null;\n /** The marker of this dialog's history entry, for dialogs opened with `history`. */\n historyId?: number;\n};\n\ntype DialogState = {\n element?: HTMLDialogElement;\n modal?: boolean;\n stack: DialogStackEntry[];\n scrollLocked?: boolean;\n previousBodyOverflow?: string;\n previousHtmlOverflow?: string;\n mouseDownOnDialog?: boolean;\n connectionObserver?: MutationObserver;\n};\n\nconst DEFAULT_PANEL_CLASS = \"k2b-dialog\";\nconst DEFAULT_CONTENT_CLASS = \"k2b-dialog__viewport\";\n/** The frame of a dialog whose content could not render: a custom or bare surface may draw no frame of its own. */\nconst RENDER_ERROR_PANEL_CLASS = \"k2b-dialog k2b-dialog--small\";\nlet nextDialogTitleId = 0;\nlet nextHistoryId = 0;\n/** The history state key that marks a dialog's same-URL entry. */\nconst HISTORY_MARKER = \"k2bDialog\";\n\nconst historyRecord = (): Record<string, unknown> =>\n typeof history.state === \"object\" && history.state !== null ? { ...history.state } : {};\nconst historyMarker = (): unknown => historyRecord()[HISTORY_MARKER];\nconst historySnapshot = () => ({ href: location.href, length: history.length });\n\nconst resolveInitialFocusTarget = (entry: DialogStackEntry, dialog: HTMLDialogElement): HTMLElement | null => {\n const { initialFocus } = entry;\n if (initialFocus === \"none\") return null;\n if (typeof initialFocus === \"function\") return initialFocus(dialog);\n const input = entry.container.querySelector<HTMLElement>(\n \"input:not([type='hidden']):not([disabled]), textarea:not([disabled]), select:not([disabled]), [role='combobox']:not([disabled]):not([aria-disabled='true'])\",\n );\n return (\n input ??\n entry.container.querySelector<HTMLElement>(\n \"input:not([type='hidden']):not([disabled]), textarea:not([disabled]), select:not([disabled]), button:not([disabled]), a[href], [tabindex]:not([tabindex='-1'])\",\n )\n );\n};\n\nconst applyAccessibleName = (dialog: HTMLDialogElement, entry: DialogStackEntry): void => {\n dialog.removeAttribute(\"aria-label\");\n dialog.removeAttribute(\"aria-labelledby\");\n if (entry.ariaLabel) {\n dialog.setAttribute(\"aria-label\", entry.ariaLabel);\n return;\n }\n const heading = entry.container.querySelector<HTMLElement>(\"h1, h2, h3\");\n if (!heading) {\n dialog.setAttribute(\"aria-label\", resolveUiMessages().dialog);\n return;\n }\n heading.id ||= `k2b-dialog-title-${++nextDialogTitleId}`;\n dialog.setAttribute(\"aria-labelledby\", heading.id);\n};\n\nconst schedule = (callback: () => void): void => {\n if (typeof requestAnimationFrame === \"function\") requestAnimationFrame(callback);\n else queueMicrotask(callback);\n};\n\n/**\n * Whether focus is still where closing a level left it, on the page or the\n * dialog: nothing took it before the next frame, neither a close handler nor a\n * Tab pressed right after Escape.\n */\nconst focusUnclaimed = (dialog: HTMLDialogElement): boolean => {\n const active = document.activeElement;\n return !active || active === document.body || active === dialog;\n};\n\ntype HistoryEntry = { historyId?: number };\ntype HistoryHolder = HistoryEntry & { onBack: () => void };\n\nexport const createDialogCore = () => {\n const state: DialogState = { stack: [] };\n /** Markers of this core's entries in the browser history, oldest first. */\n let historyIds: number[] = [];\n const issued = new Set<number>();\n const ownMarker = (marker: unknown): marker is number => typeof marker === \"number\" && issued.has(marker);\n let seen: ReturnType<typeof historySnapshot> | undefined;\n let traversalFrom: { href: string; marker: unknown } | undefined;\n let syntheticFrom: { href: string; marker: unknown } | undefined;\n const historyHolders = new Set<HistoryHolder>();\n let historySyncScheduled = false;\n /** Settles when the synthetic Back that removes closed dialogs' entries has arrived. */\n let returning: Promise<void> | undefined;\n let resolveReturning: (() => void) | undefined;\n\n /** Closed entries leave with one Back to the newest live dialog or holder, or to the page. */\n const syncHistory = () => {\n if (returning) {\n void returning.then(() => {\n if (historySyncScheduled) syncHistory();\n });\n return;\n }\n historySyncScheduled = false;\n const openIds = new Set([...state.stack, ...historyHolders].map((entry) => entry.historyId));\n const current = historyIds.at(-1);\n let steps = 0;\n while (historyIds.length > 0 && !openIds.has(historyIds.at(-1))) {\n historyIds.pop();\n steps++;\n }\n // Someone else moved the history meanwhile; leave it alone.\n if (steps === 0 || historyMarker() !== current || location.href !== seen?.href || history.length !== seen?.length) return;\n const back = new Promise<void>((resolve) => {\n resolveReturning = resolve;\n });\n returning = back;\n void back.then(() => {\n if (returning === back) returning = undefined;\n });\n syntheticFrom = { href: location.href, marker: current };\n history.go(-steps);\n };\n\n const releaseHistory = (entry: HistoryEntry) => {\n if (entry.historyId === undefined || historySyncScheduled) return;\n historySyncScheduled = true;\n queueMicrotask(syncHistory);\n };\n\n /** Back or Forward moved to another entry: close dialogs and holders opened after the one it shows. */\n const onPopState = (event: PopStateEvent) => {\n const resolveBack = resolveReturning;\n // Without the Navigation API, only our synthetic Back has a known departure.\n const from = typeof navigation !== \"undefined\" ? traversalFrom : resolveBack ? syntheticFrom : undefined;\n traversalFrom = undefined;\n syntheticFrom = undefined;\n resolveReturning = undefined;\n try {\n const marker = historyMarker();\n if (from && from.href === location.href && from.marker !== marker && (ownMarker(from.marker) || ownMarker(marker))) {\n event.stopImmediatePropagation();\n }\n // Own entries are ordered by id. A retired entry reached by Forward stays tracked, so closing the dialogs\n // beneath it also removes it.\n historyIds = ownMarker(marker) ? [...historyIds.filter((id) => id < marker), marker] : [];\n const gone = (entry: DialogStackEntry) => entry.historyId !== undefined && !historyIds.includes(entry.historyId);\n while (state.stack.some(gone)) popTop(undefined);\n for (const holder of [...historyHolders].reverse()) {\n if (holder.historyId === undefined || historyIds.includes(holder.historyId)) continue;\n historyHolders.delete(holder);\n releaseHistory(holder);\n holder.onBack();\n }\n } finally {\n seen = historySnapshot();\n resolveBack?.();\n }\n };\n\n const onNavigate = (event: NavigateEvent) => {\n if (event.navigationType === \"traverse\") traversalFrom = { href: location.href, marker: historyMarker() };\n };\n /** The window whose history this core listens to; a test harness may replace the window between dialogs. */\n let listening: { window: Window; navigation?: Navigation } | undefined;\n const listen = () => {\n if (listening?.window === window) return;\n listening?.window.removeEventListener(\"popstate\", onPopState, { capture: true });\n listening?.navigation?.removeEventListener(\"navigate\", onNavigate);\n window.addEventListener(\"popstate\", onPopState, { capture: true });\n const current = typeof navigation !== \"undefined\" ? navigation : undefined;\n current?.addEventListener(\"navigate\", onNavigate);\n listening = { window, navigation: current };\n };\n // Chromium runs a window's popstate listeners in the order they were added, capture or not. The shared core is\n // created before islands mount and add their navigation listeners, so it listens from the start.\n if (typeof window !== \"undefined\") listen();\n\n const pushHistory = (entry: HistoryEntry) => {\n listen();\n const previous = historyRecord();\n // A reload or Forward never brings back a dialog or its sensitive transient state.\n if (historyIds.length === 0 && previous[HISTORY_MARKER] !== undefined) {\n delete previous[HISTORY_MARKER];\n history.replaceState(previous, \"\");\n }\n entry.historyId = ++nextHistoryId;\n issued.add(entry.historyId);\n historyIds.push(entry.historyId);\n history.pushState({ ...previous, [HISTORY_MARKER]: entry.historyId }, \"\");\n seen = historySnapshot();\n };\n\n /** Internal non-dialog participation in the same history stack. Releasing never calls onBack. */\n const holdHistory = (onBack: () => void): (() => void) => {\n const holder: HistoryHolder = { onBack };\n historyHolders.add(holder);\n const pushWhenReady = () => {\n if (!historyHolders.has(holder)) return;\n // Just like open(): remove closed entries before adding another one.\n if (historySyncScheduled) syncHistory();\n if (returning) void returning.then(pushWhenReady);\n else pushHistory(holder);\n };\n pushWhenReady();\n return () => {\n if (!historyHolders.delete(holder)) return;\n releaseHistory(holder);\n };\n };\n\n /**\n * Settles once released entries have left the history. A caller that navigates or pushes an entry of its own waits\n * for it, as a dialog's result waits: a Back still on its way would otherwise land behind the new entry.\n */\n const historySettled = async (): Promise<void> => {\n while (historySyncScheduled || returning) {\n if (!returning) syncHistory();\n if (returning) await returning;\n }\n };\n\n const ensureDialogElement = () => {\n if (typeof document === \"undefined\") throw new Error(\"@k2b/ui dialogs can only be opened in the browser\");\n // Reuse the shared element whenever it is still in the document. Resolving\n // the portal root first would create a second <dialog> when focus has moved\n // into another `.k2b-ui` scope, orphaning the levels already on the stack.\n if (state.element?.isConnected) return state.element;\n\n const element = document.createElement(\"dialog\");\n element.onclose = () => {\n // Repeated Escape can force a non-cancelable native close. A retained\n // entry (ignore, an async guard, or a parent) still owns the modal.\n const top = state.stack[state.stack.length - 1];\n if (state.element !== element || element.open || !top) return;\n if (top.modal) element.showModal();\n else element.show();\n resolveInitialFocusTarget(top, element)?.focus();\n };\n getK2bPortalRoot().appendChild(element);\n state.element = element;\n return element;\n };\n\n const lockPageScroll = () => {\n if (typeof document === \"undefined\" || state.scrollLocked) return;\n state.previousBodyOverflow = document.body.style.overflow;\n state.previousHtmlOverflow = document.documentElement.style.overflow;\n document.body.style.overflow = \"hidden\";\n document.documentElement.style.overflow = \"hidden\";\n state.scrollLocked = true;\n };\n\n const unlockPageScroll = () => {\n if (typeof document === \"undefined\" || !state.scrollLocked) return;\n document.body.style.overflow = state.previousBodyOverflow ?? \"\";\n document.documentElement.style.overflow = state.previousHtmlOverflow ?? \"\";\n state.scrollLocked = false;\n state.previousBodyOverflow = undefined;\n state.previousHtmlOverflow = undefined;\n };\n\n const applyPresentation = (entry: DialogStackEntry) => {\n const dialog = state.element;\n if (!dialog || state.stack[state.stack.length - 1] !== entry) return;\n const position = entry.position;\n dialog.style.position = position ? \"fixed\" : \"\";\n dialog.style.inset = position ? `${position.y}px auto auto ${position.x}px` : \"\";\n dialog.style.margin = position ? \"0\" : \"\";\n dialog.style.transform = position ? \"none\" : \"\";\n dialog.dataset.modeless = String(!entry.modal);\n dialog.setAttribute(\"aria-modal\", String(entry.modal));\n if (dialog.open && state.modal !== entry.modal) {\n const active = document.activeElement;\n dialog.close();\n if (entry.modal) dialog.showModal();\n else dialog.show();\n if (active instanceof HTMLElement && active.isConnected && (!entry.modal || dialog.contains(active))) {\n active.focus({ preventScroll: true });\n } else resolveInitialFocusTarget(entry, dialog)?.focus({ preventScroll: true });\n }\n state.modal = entry.modal;\n if (entry.modal) lockPageScroll();\n else unlockPageScroll();\n };\n\n const modelessEscape = (event: KeyboardEvent) => {\n const top = state.stack[state.stack.length - 1];\n if (!top || top.modal || event.key !== \"Escape\" || event.defaultPrevented || event.isComposing) return;\n event.preventDefault();\n void requestDismiss(top);\n };\n\n const stopConnectionObserver = () => {\n document.removeEventListener(\"keydown\", modelessEscape);\n state.connectionObserver?.disconnect();\n state.connectionObserver = undefined;\n };\n\n const applyCancelBehavior = (\n dialog: HTMLDialogElement,\n close: () => void,\n behavior: NonNullable<OpenDialogOptions[\"cancelBehavior\"]>,\n ) => {\n dialog.oncancel = (event) => {\n if (behavior === \"ignore\") {\n event.preventDefault();\n return;\n }\n event.preventDefault();\n close();\n };\n dialog.onmousedown = (event) => {\n state.mouseDownOnDialog = event.target === dialog;\n };\n dialog.onclick = (event) => {\n const realBackdropClick = state.mouseDownOnDialog === true;\n state.mouseDownOnDialog = false;\n if (event.target !== dialog || !state.modal) return;\n if (!realBackdropClick) return;\n if (behavior === \"ignore\") return;\n if (isPointInsideToast(event.clientX, event.clientY)) return;\n close();\n };\n };\n\n const requestDismiss = async (entry: DialogStackEntry) => {\n if (state.stack[state.stack.length - 1] !== entry || entry.dismissPending || entry.cancelBehavior === \"ignore\") return;\n if (!entry.dismissHandler) {\n popTop(undefined);\n return;\n }\n entry.dismissPending = true;\n try {\n await entry.dismissHandler();\n } catch (error) {\n // A failed guard must never discard the dialog's state.\n console.error(\"Dialog dismissal failed\", error);\n } finally {\n entry.dismissPending = false;\n }\n };\n\n const popTop = (result?: unknown) => {\n const top = state.stack.pop();\n if (!top) return;\n releaseHistory(top);\n top.dispose?.();\n top.container.remove();\n\n const dialog = state.element;\n const previous = state.stack[state.stack.length - 1];\n if (previous && dialog) {\n previous.container.style.display = \"\";\n dialog.className = previous.panelClassName;\n applyPresentation(previous);\n applyAccessibleName(dialog, previous);\n applyCancelBehavior(dialog, () => void requestDismiss(previous), previous.cancelBehavior);\n schedule(() => {\n if (!focusUnclaimed(dialog)) return;\n if (top.opener?.isConnected) returnFocus(top.opener, top.openerRing);\n else resolveInitialFocusTarget(previous, dialog)?.focus();\n });\n } else if (dialog) {\n dialog.oncancel = null;\n dialog.onmousedown = null;\n dialog.onclick = null;\n dialog.removeAttribute(\"aria-label\");\n dialog.removeAttribute(\"aria-labelledby\");\n if (dialog.open && typeof dialog.close === \"function\") dialog.close();\n else dialog.removeAttribute(\"open\");\n dialog.remove();\n state.element = undefined;\n stopConnectionObserver();\n unlockPageScroll();\n // After the Escape that closed it: WebKit lights the ring of whatever\n // that key press leaves focused.\n schedule(() => {\n if (top.opener?.isConnected && focusUnclaimed(dialog)) returnFocus(top.opener, top.openerRing);\n });\n }\n\n top.resolve?.(result);\n };\n\n const resetDisconnectedDialog = () => {\n if (state.stack.length === 0 || state.element?.isConnected) return;\n const entries = state.stack.splice(0);\n const dialog = state.element;\n state.element = undefined;\n stopConnectionObserver();\n dialog?.remove();\n unlockPageScroll();\n for (const entry of entries.reverse()) {\n releaseHistory(entry);\n entry.dispose?.();\n entry.container.remove();\n entry.resolve?.(undefined);\n }\n };\n\n const observeConnection = () => {\n if (state.connectionObserver || typeof MutationObserver === \"undefined\") return;\n document.addEventListener(\"keydown\", modelessEscape);\n state.connectionObserver = new MutationObserver(resetDisconnectedDialog);\n state.connectionObserver.observe(document.documentElement, { childList: true, subtree: true });\n };\n\n const open = <T>(view: DialogRender<T>, options: OpenDialogOptions = {}): Promise<T | undefined> => {\n if (options.signal?.aborted) return Promise.resolve(undefined);\n if (options.history) {\n // Dialogs closed just now leave the history first, or this dialog's entry would be the one removed.\n if (historySyncScheduled) syncHistory();\n if (returning) return returning.then(() => open(view, options));\n }\n const dialog = ensureDialogElement();\n const previousTop = state.stack[state.stack.length - 1];\n if (previousTop) previousTop.container.style.display = \"none\";\n const activeElement = document.activeElement;\n\n const panelClassName = options.panelClassName ?? DEFAULT_PANEL_CLASS;\n const cancelBehavior = options.cancelBehavior ?? \"resolve-undefined\";\n const initialFocus = options.initialFocus ?? \"first-input\";\n dialog.className = panelClassName;\n\n const container = document.createElement(\"div\");\n container.className = options.contentClassName ?? DEFAULT_CONTENT_CLASS;\n dialog.appendChild(container);\n\n const entry: DialogStackEntry = {\n container,\n panelClassName,\n cancelBehavior,\n initialFocus,\n opener: activeElement instanceof HTMLElement ? activeElement : undefined,\n openerRing: ringOnReturn(activeElement),\n ariaLabel: options.ariaLabel,\n modal: true,\n };\n\n return new Promise((resolve, reject) => {\n const abort = () => {\n const index = state.stack.indexOf(entry);\n if (index < 0) return;\n if (index === state.stack.length - 1) popTop(undefined);\n else {\n state.stack.splice(index, 1);\n releaseHistory(entry);\n entry.dispose?.();\n entry.container.remove();\n entry.resolve?.(undefined);\n }\n };\n entry.resolve = (value) => {\n options.signal?.removeEventListener(\"abort\", abort);\n if (entry.historyId === undefined) {\n resolve(value as T | undefined);\n return;\n }\n // After every pending history sync, so a caller that navigates or opens the next dialog finds the history settled.\n queueMicrotask(() => void historySettled().then(() => resolve(value as T | undefined)));\n };\n const closeTyped: DialogClose<T> = (result) => {\n if (state.stack[state.stack.length - 1] !== entry) return;\n popTop(result);\n };\n\n if (options.history) pushHistory(entry);\n state.stack.push(entry);\n try {\n entry.dispose = render(\n () =>\n createComponent(RenderErrorBoundary, {\n content: () =>\n view(closeTyped, {\n dialog,\n setModal: (modal) => {\n entry.modal = modal;\n applyPresentation(entry);\n },\n setPosition: (position) => {\n if (position && (!Number.isFinite(position.x) || !Number.isFinite(position.y))) return;\n entry.position = position;\n applyPresentation(entry);\n },\n requestDismiss: () => requestDismiss(entry),\n setDismissHandler: (handler) => {\n entry.dismissHandler = handler;\n },\n }),\n onClose: () => closeTyped(undefined),\n onError: () => {\n entry.panelClassName = RENDER_ERROR_PANEL_CLASS;\n container.className = DEFAULT_CONTENT_CLASS;\n if (state.stack[state.stack.length - 1] === entry) dialog.className = RENDER_ERROR_PANEL_CLASS;\n },\n }),\n container,\n );\n applyPresentation(entry);\n applyAccessibleName(dialog, entry);\n applyCancelBehavior(dialog, () => void requestDismiss(entry), cancelBehavior);\n\n if (state.stack.length === 1) {\n // The native dialog returns focus to the element focused when it\n // opened, with a ring of the browser's choosing. Opening from a\n // blurred document leaves the return to popTop and its opener ring.\n if (activeElement instanceof HTMLElement) activeElement.blur();\n if (typeof dialog.showModal === \"function\") {\n if (entry.modal) dialog.showModal();\n else dialog.show();\n } else dialog.setAttribute(\"open\", \"\");\n observeConnection();\n }\n options.signal?.addEventListener(\"abort\", abort, { once: true });\n if (options.signal?.aborted) abort();\n // Where opening left focus, the native dialog's own pick included. Focus that the content or a person moved\n // before the next frame stays: a browser can hold that frame back while keys already arrive.\n const opened = document.activeElement;\n schedule(() => {\n if (state.stack[state.stack.length - 1] !== entry) return;\n if (document.activeElement !== opened && !focusUnclaimed(dialog)) return;\n resolveInitialFocusTarget(entry, dialog)?.focus();\n });\n } catch (error) {\n entry.resolve = undefined;\n if (state.stack[state.stack.length - 1] === entry) popTop(undefined);\n reject(error);\n }\n });\n };\n\n const close: DialogCore[\"close\"] = (result) => {\n let first = true;\n while (state.stack.length > 0) {\n popTop(first ? result : undefined);\n first = false;\n }\n };\n\n return {\n open,\n close,\n isOpen: () => state.stack.length > 0,\n holdHistory,\n historySettled,\n };\n};\n\nconst { holdHistory, historySettled, ...publicDialogCore } = createDialogCore();\nexport const dialogCore: DialogCore = publicDialogCore;\n\n/**\n * Internal: transient UI shares dialogs' Back handling without exposing another public dialog capability.\n * Same-URL traversals are suppressed with the Navigation API; without it, only the synthetic Back on release is suppressed.\n */\nexport const holdDialogHistory = holdHistory;\n/** Internal: waits until entries released through `holdDialogHistory` have left the history. */\nexport const dialogHistorySettled = historySettled;\n"],"mappings":"AAAA,SAAS,eAAe,QAAkB,UAAU;AACpD,SAAS,MAAM,QAAQ,cAAc;AACrC,SAAS,WAAW,EAAE,YAAY,QAAQ,0BAA0B;AACpE,SAAS,gBAAgB,QAAQ,oBAAoB;AACrD,SAAS,mBAAmB,QAAQ,0BAA0B;AAC9D,SAAS,iBAAiB,QAAQ,kBAAkB;AACpD,SAAS,kBAAkB,QAAQ,SAAS;AAuE5C,MAAM,mBAAmB,GAAG,YAAY;AACxC,MAAM,qBAAqB,GAAG,sBAAsB;AACpD;AACA,MAAM,wBAAwB,GAAG,8BAA8B;AAC/D,IAAI,iBAAiB,GAAG,CAAC;AACzB,IAAI,aAAa,GAAG,CAAC;AACrB;AACA,MAAM,cAAc,GAAG,WAAW;AAElC,MAAM,aAAa,GAAG,MACpB,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,GAAG;EAAE,GAAG,OAAO,CAAC;AAAM,CAAC,GAAG,CAAC,CAAC;AACzF,MAAM,aAAa,GAAG,MAAe,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC;AACpE,MAAM,eAAe,GAAG,OAAO;EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI;EAAE,MAAM,EAAE,OAAO,CAAC;AAAO,CAAC,CAAC;AAE/E,MAAM,yBAAyB,GAAG,CAAC,KAAuB,EAAE,MAAyB,KAAyB;EAC5G,MAAM;IAAE;EAAa,CAAC,GAAG,KAAK;EAC9B,IAAI,YAAY,KAAK,MAAM,EAAE,OAAO,IAAI;EACxC,IAAI,OAAO,YAAY,KAAK,UAAU,EAAE,OAAO,YAAY,CAAC,MAAM,CAAC;EACnE,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,aAAa,CACzC,6JACF,CAAC;EACD,OACE,KAAK,IACL,KAAK,CAAC,SAAS,CAAC,aAAa,CAC3B,gKACF,CAAC;AAEL,CAAC;AAED,MAAM,mBAAmB,GAAG,CAAC,MAAyB,EAAE,KAAuB,KAAW;EACxF,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC;EACpC,MAAM,CAAC,eAAe,CAAC,iBAAiB,CAAC;EACzC,IAAI,KAAK,CAAC,SAAS,EAAE;IACnB,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC;IAClD;EACF;EACA,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,aAAa,CAAc,YAAY,CAAC;EACxE,IAAI,CAAC,OAAO,EAAE;IACZ,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC;IAC7D;EACF;EACA,OAAO,CAAC,EAAE,KAAK,oBAAoB,EAAE,iBAAiB,EAAE;EACxD,MAAM,CAAC,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,QAAQ,GAAI,QAAoB,IAAW;EAC/C,IAAI,OAAO,qBAAqB,KAAK,UAAU,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC,KAC5E,cAAc,CAAC,QAAQ,CAAC;AAC/B,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,MAAM,cAAc,GAAI,MAAyB,IAAc;EAC7D,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa;EACrC,OAAO,CAAC,MAAM,IAAI,MAAM,KAAK,QAAQ,CAAC,IAAI,IAAI,MAAM,KAAK,MAAM;AACjE,CAAC;AAKD,OAAO,MAAM,gBAAgB,GAAG,MAAM;EACpC,MAAM,KAAkB,GAAG;IAAE,KAAK,EAAE;EAAG,CAAC;EACxC;EACA,IAAI,UAAoB,GAAG,EAAE;EAC7B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAS,CAAC;EAChC,MAAM,SAAS,GAAI,MAAe,IAAuB,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;EACzG,IAAI,IAAoD;EACxD,IAAI,aAA4D;EAChE,IAAI,aAA4D;EAChE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAgB,CAAC;EAC/C,IAAI,oBAAoB,GAAG,KAAK;EAChC;EACA,IAAI,SAAoC;EACxC,IAAI,gBAA0C;;EAE9C;EACA,MAAM,WAAW,GAAG,MAAM;IACxB,IAAI,SAAS,EAAE;MACb,KAAK,SAAS,CAAC,IAAI,CAAC,MAAM;QACxB,IAAI,oBAAoB,EAAE,WAAW,CAAC,CAAC;MACzC,CAAC,CAAC;MACF;IACF;IACA,oBAAoB,GAAG,KAAK;IAC5B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,cAAc,CAAC,CAAC,GAAG,CAAE,KAAK,IAAK,KAAK,CAAC,SAAS,CAAC,CAAC;IAC5F,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,KAAK,GAAG,CAAC;IACb,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;MAC/D,UAAU,CAAC,GAAG,CAAC,CAAC;MAChB,KAAK,EAAE;IACT;IACA;IACA,IAAI,KAAK,KAAK,CAAC,IAAI,aAAa,CAAC,CAAC,KAAK,OAAO,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE,IAAI,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,EAAE,MAAM,EAAE;IACnH,MAAM,IAAI,GAAG,IAAI,OAAO,CAAQ,OAAO,IAAK;MAC1C,gBAAgB,GAAG,OAAO;IAC5B,CAAC,CAAC;IACF,SAAS,GAAG,IAAI;IAChB,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM;MACnB,IAAI,SAAS,KAAK,IAAI,EAAE,SAAS,GAAG,SAAS;IAC/C,CAAC,CAAC;IACF,aAAa,GAAG;MAAE,IAAI,EAAE,QAAQ,CAAC,IAAI;MAAE,MAAM,EAAE;IAAQ,CAAC;IACxD,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC;EACpB,CAAC;EAED,MAAM,cAAc,GAAI,KAAmB,IAAK;IAC9C,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,oBAAoB,EAAE;IAC3D,oBAAoB,GAAG,IAAI;IAC3B,cAAc,CAAC,WAAW,CAAC;EAC7B,CAAC;;EAED;EACA,MAAM,UAAU,GAAI,KAAoB,IAAK;IAC3C,MAAM,WAAW,GAAG,gBAAgB;IACpC;IACA,MAAM,IAAI,GAAG,OAAO,UAAU,KAAK,WAAW,GAAG,aAAa,GAAG,WAAW,GAAG,aAAa,GAAG,SAAS;IACxG,aAAa,GAAG,SAAS;IACzB,aAAa,GAAG,SAAS;IACzB,gBAAgB,GAAG,SAAS;IAC5B,IAAI;MACF,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC;MAC9B,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,KAAK,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE;QAClH,KAAK,CAAC,wBAAwB,CAAC,CAAC;MAClC;MACA;MACA;MACA,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,CAAE,EAAE,IAAK,EAAE,GAAG,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,EAAE;MACzF,MAAM,IAAI,GAAI,KAAuB,IAAK,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC;MAChH,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC;MAChD,KAAK,MAAM,MAAM,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE;QAClD,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE;QAC7E,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC;QAC7B,cAAc,CAAC,MAAM,CAAC;QACtB,MAAM,CAAC,MAAM,CAAC,CAAC;MACjB;IACF,CAAC,SAAS;MACR,IAAI,GAAG,eAAe,CAAC,CAAC;MACxB,WAAW,GAAG,CAAC;IACjB;EACF,CAAC;EAED,MAAM,UAAU,GAAI,KAAoB,IAAK;IAC3C,IAAI,KAAK,CAAC,cAAc,KAAK,UAAU,EAAE,aAAa,GAAG;MAAE,IAAI,EAAE,QAAQ,CAAC,IAAI;MAAE,MAAM,EAAE,aAAa,CAAC;IAAE,CAAC;EAC3G,CAAC;EACD;EACA,IAAI,SAAkE;EACtE,MAAM,MAAM,GAAG,MAAM;IACnB,IAAI,SAAS,EAAE,MAAM,KAAK,MAAM,EAAE;IAClC,SAAS,EAAE,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,UAAU,EAAE;MAAE,OAAO,EAAE;IAAK,CAAC,CAAC;IAChF,SAAS,EAAE,UAAU,EAAE,mBAAmB,CAAC,UAAU,EAAE,UAAU,CAAC;IAClE,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE;MAAE,OAAO,EAAE;IAAK,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,OAAO,UAAU,KAAK,WAAW,GAAG,UAAU,GAAG,SAAS;IAC1E,OAAO,EAAE,gBAAgB,CAAC,UAAU,EAAE,UAAU,CAAC;IACjD,SAAS,GAAG;MAAE,MAAM;MAAE,UAAU,EAAE;IAAQ,CAAC;EAC7C,CAAC;EACD;EACA;EACA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,MAAM,CAAC,CAAC;EAE3C,MAAM,WAAW,GAAI,KAAmB,IAAK;IAC3C,MAAM,CAAC,CAAC;IACR,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC;IAChC;IACA,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,cAAc,CAAC,KAAK,SAAS,EAAE;MACrE,OAAO,QAAQ,CAAC,cAAc,CAAC;MAC/B,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC;IACpC;IACA,KAAK,CAAC,SAAS,GAAG,EAAE,aAAa;IACjC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC;IAC3B,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;IAChC,OAAO,CAAC,SAAS,CAAC;MAAE,GAAG,QAAQ;MAAE,CAAC,cAAc,GAAG,KAAK,CAAC;IAAU,CAAC,EAAE,EAAE,CAAC;IACzE,IAAI,GAAG,eAAe,CAAC,CAAC;EAC1B,CAAC;;EAED;EACA,MAAM,WAAW,GAAI,MAAkB,IAAmB;IACxD,MAAM,MAAqB,GAAG;MAAE;IAAO,CAAC;IACxC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;IAC1B,MAAM,aAAa,GAAG,MAAM;MAC1B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;MACjC;MACA,IAAI,oBAAoB,EAAE,WAAW,CAAC,CAAC;MACvC,IAAI,SAAS,EAAE,KAAK,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,KAC7C,WAAW,CAAC,MAAM,CAAC;IAC1B,CAAC;IACD,aAAa,CAAC,CAAC;IACf,OAAO,MAAM;MACX,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;MACpC,cAAc,CAAC,MAAM,CAAC;IACxB,CAAC;EACH,CAAC;;EAED;AACF;AACA;AACA;EACE,MAAM,cAAc,GAAG,YAA2B;IAChD,OAAO,oBAAoB,IAAI,SAAS,EAAE;MACxC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;MAC7B,IAAI,SAAS,EAAE,MAAM,SAAS;IAChC;EACF,CAAC;EAED,MAAM,mBAAmB,GAAG,MAAM;IAChC,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC;IACzG;IACA;IACA;IACA,IAAI,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,KAAK,CAAC,OAAO;IAEpD,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;IAChD,OAAO,CAAC,OAAO,GAAG,MAAM;MACtB;MACA;MACA,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;MAC/C,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;MACvD,IAAI,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,KAC9B,OAAO,CAAC,IAAI,CAAC,CAAC;MACnB,yBAAyB,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IACD,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC;IACvC,KAAK,CAAC,OAAO,GAAG,OAAO;IACvB,OAAO,OAAO;EAChB,CAAC;EAED,MAAM,cAAc,GAAG,MAAM;IAC3B,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,KAAK,CAAC,YAAY,EAAE;IAC3D,KAAK,CAAC,oBAAoB,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ;IACzD,KAAK,CAAC,oBAAoB,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ;IACpE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ;IACvC,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ;IAClD,KAAK,CAAC,YAAY,GAAG,IAAI;EAC3B,CAAC;EAED,MAAM,gBAAgB,GAAG,MAAM;IAC7B,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;IAC5D,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,oBAAoB,IAAI,EAAE;IAC/D,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,oBAAoB,IAAI,EAAE;IAC1E,KAAK,CAAC,YAAY,GAAG,KAAK;IAC1B,KAAK,CAAC,oBAAoB,GAAG,SAAS;IACtC,KAAK,CAAC,oBAAoB,GAAG,SAAS;EACxC,CAAC;EAED,MAAM,iBAAiB,GAAI,KAAuB,IAAK;IACrD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO;IAC5B,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE;IAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ;IAC/B,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,EAAE;IAC/C,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,GAAG,GAAG,QAAQ,CAAC,CAAC,gBAAgB,QAAQ,CAAC,CAAC,IAAI,GAAG,EAAE;IAChF,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,GAAG,GAAG,GAAG,EAAE;IACzC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,EAAE;IAC/C,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;IAC9C,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtD,IAAI,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE;MAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa;MACrC,MAAM,CAAC,KAAK,CAAC,CAAC;MACd,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAC/B,MAAM,CAAC,IAAI,CAAC,CAAC;MAClB,IAAI,MAAM,YAAY,WAAW,IAAI,MAAM,CAAC,WAAW,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE;QACpG,MAAM,CAAC,KAAK,CAAC;UAAE,aAAa,EAAE;QAAK,CAAC,CAAC;MACvC,CAAC,MAAM,yBAAyB,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,aAAa,EAAE;MAAK,CAAC,CAAC;IACjF;IACA,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK;IACzB,IAAI,KAAK,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,KAC7B,gBAAgB,CAAC,CAAC;EACzB,CAAC;EAED,MAAM,cAAc,GAAI,KAAoB,IAAK;IAC/C,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/C,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,WAAW,EAAE;IAChG,KAAK,CAAC,cAAc,CAAC,CAAC;IACtB,KAAK,cAAc,CAAC,GAAG,CAAC;EAC1B,CAAC;EAED,MAAM,sBAAsB,GAAG,MAAM;IACnC,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,cAAc,CAAC;IACvD,KAAK,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;IACtC,KAAK,CAAC,kBAAkB,GAAG,SAAS;EACtC,CAAC;EAED,MAAM,mBAAmB,GAAG,CAC1B,MAAyB,EACzB,KAAiB,EACjB,QAA0D,KACvD;IACH,MAAM,CAAC,QAAQ,GAAI,KAAK,IAAK;MAC3B,IAAI,QAAQ,KAAK,QAAQ,EAAE;QACzB,KAAK,CAAC,cAAc,CAAC,CAAC;QACtB;MACF;MACA,KAAK,CAAC,cAAc,CAAC,CAAC;MACtB,KAAK,CAAC,CAAC;IACT,CAAC;IACD,MAAM,CAAC,WAAW,GAAI,KAAK,IAAK;MAC9B,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC,MAAM,KAAK,MAAM;IACnD,CAAC;IACD,MAAM,CAAC,OAAO,GAAI,KAAK,IAAK;MAC1B,MAAM,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,KAAK,IAAI;MAC1D,KAAK,CAAC,iBAAiB,GAAG,KAAK;MAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;MAC7C,IAAI,CAAC,iBAAiB,EAAE;MACxB,IAAI,QAAQ,KAAK,QAAQ,EAAE;MAC3B,IAAI,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE;MACtD,KAAK,CAAC,CAAC;IACT,CAAC;EACH,CAAC;EAED,MAAM,cAAc,GAAG,MAAO,KAAuB,IAAK;IACxD,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,cAAc,KAAK,QAAQ,EAAE;IAChH,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;MACzB,MAAM,CAAC,SAAS,CAAC;MACjB;IACF;IACA,KAAK,CAAC,cAAc,GAAG,IAAI;IAC3B,IAAI;MACF,MAAM,KAAK,CAAC,cAAc,CAAC,CAAC;IAC9B,CAAC,CAAC,OAAO,KAAK,EAAE;MACd;MACA,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC;IACjD,CAAC,SAAS;MACR,KAAK,CAAC,cAAc,GAAG,KAAK;IAC9B;EACF,CAAC;EAED,MAAM,MAAM,GAAI,MAAgB,IAAK;IACnC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,EAAE;IACV,cAAc,CAAC,GAAG,CAAC;IACnB,GAAG,CAAC,OAAO,GAAG,CAAC;IACf,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAEtB,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO;IAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACpD,IAAI,QAAQ,IAAI,MAAM,EAAE;MACtB,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE;MACrC,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC,cAAc;MAC1C,iBAAiB,CAAC,QAAQ,CAAC;MAC3B,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC;MACrC,mBAAmB,CAAC,MAAM,EAAE,MAAM,KAAK,cAAc,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC;MACzF,QAAQ,CAAC,MAAM;QACb,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE;QAC7B,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,KAChE,yBAAyB,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;MAC3D,CAAC,CAAC;IACJ,CAAC,MAAM,IAAI,MAAM,EAAE;MACjB,MAAM,CAAC,QAAQ,GAAG,IAAI;MACtB,MAAM,CAAC,WAAW,GAAG,IAAI;MACzB,MAAM,CAAC,OAAO,GAAG,IAAI;MACrB,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC;MACpC,MAAM,CAAC,eAAe,CAAC,iBAAiB,CAAC;MACzC,IAAI,MAAM,CAAC,IAAI,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KACjE,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC;MACnC,MAAM,CAAC,MAAM,CAAC,CAAC;MACf,KAAK,CAAC,OAAO,GAAG,SAAS;MACzB,sBAAsB,CAAC,CAAC;MACxB,gBAAgB,CAAC,CAAC;MAClB;MACA;MACA,QAAQ,CAAC,MAAM;QACb,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC;MAChG,CAAC,CAAC;IACJ;IAEA,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC;EACvB,CAAC;EAED,MAAM,uBAAuB,GAAG,MAAM;IACpC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE;IAC5D,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO;IAC5B,KAAK,CAAC,OAAO,GAAG,SAAS;IACzB,sBAAsB,CAAC,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC,CAAC;IAChB,gBAAgB,CAAC,CAAC;IAClB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE;MACrC,cAAc,CAAC,KAAK,CAAC;MACrB,KAAK,CAAC,OAAO,GAAG,CAAC;MACjB,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;MACxB,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;IAC5B;EACF,CAAC;EAED,MAAM,iBAAiB,GAAG,MAAM;IAC9B,IAAI,KAAK,CAAC,kBAAkB,IAAI,OAAO,gBAAgB,KAAK,WAAW,EAAE;IACzE,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,cAAc,CAAC;IACpD,KAAK,CAAC,kBAAkB,GAAG,IAAI,gBAAgB,CAAC,uBAAuB,CAAC;IACxE,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE;MAAE,SAAS,EAAE,IAAI;MAAE,OAAO,EAAE;IAAK,CAAC,CAAC;EAChG,CAAC;EAED,MAAM,IAAI,GAAG,CAAI,IAAqB,EAAE,OAA0B,GAAG,CAAC,CAAC,KAA6B;IAClG,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;IAC9D,IAAI,OAAO,CAAC,OAAO,EAAE;MACnB;MACA,IAAI,oBAAoB,EAAE,WAAW,CAAC,CAAC;MACvC,IAAI,SAAS,EAAE,OAAO,SAAS,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjE;IACA,MAAM,MAAM,GAAG,mBAAmB,CAAC,CAAC;IACpC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACvD,IAAI,WAAW,EAAE,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;IAC7D,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa;IAE5C,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,mBAAmB;IACpE,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,mBAAmB;IACpE,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,aAAa;IAC1D,MAAM,CAAC,SAAS,GAAG,cAAc;IAEjC,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC/C,SAAS,CAAC,SAAS,GAAG,OAAO,CAAC,gBAAgB,IAAI,qBAAqB;IACvE,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC;IAE7B,MAAM,KAAuB,GAAG;MAC9B,SAAS;MACT,cAAc;MACd,cAAc;MACd,YAAY;MACZ,MAAM,EAAE,aAAa,YAAY,WAAW,GAAG,aAAa,GAAG,SAAS;MACxE,UAAU,EAAE,YAAY,CAAC,aAAa,CAAC;MACvC,SAAS,EAAE,OAAO,CAAC,SAAS;MAC5B,KAAK,EAAE;IACT,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;MACtC,MAAM,KAAK,GAAG,MAAM;QAClB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACxC,IAAI,KAAK,GAAG,CAAC,EAAE;QACf,IAAI,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,KACnD;UACH,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;UAC5B,cAAc,CAAC,KAAK,CAAC;UACrB,KAAK,CAAC,OAAO,GAAG,CAAC;UACjB,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;UACxB,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;QAC5B;MACF,CAAC;MACD,KAAK,CAAC,OAAO,GAAI,KAAK,IAAK;QACzB,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC;QACnD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE;UACjC,OAAO,CAAC,KAAsB,CAAC;UAC/B;QACF;QACA;QACA,cAAc,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,KAAsB,CAAC,CAAC,CAAC;MACzF,CAAC;MACD,MAAM,UAA0B,GAAI,MAAM,IAAK;QAC7C,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE;QACnD,MAAM,CAAC,MAAM,CAAC;MAChB,CAAC;MAED,IAAI,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC;MACvC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;MACvB,IAAI;QACF,KAAK,CAAC,OAAO,GAAG,MAAM,CACpB,MACE,eAAe,CAAC,mBAAmB,EAAE;UACnC,OAAO,EAAE,MACP,IAAI,CAAC,UAAU,EAAE;YACf,MAAM;YACN,QAAQ,EAAG,KAAK,IAAK;cACnB,KAAK,CAAC,KAAK,GAAG,KAAK;cACnB,iBAAiB,CAAC,KAAK,CAAC;YAC1B,CAAC;YACD,WAAW,EAAG,QAAQ,IAAK;cACzB,IAAI,QAAQ,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;cAChF,KAAK,CAAC,QAAQ,GAAG,QAAQ;cACzB,iBAAiB,CAAC,KAAK,CAAC;YAC1B,CAAC;YACD,cAAc,EAAE,MAAM,cAAc,CAAC,KAAK,CAAC;YAC3C,iBAAiB,EAAG,OAAO,IAAK;cAC9B,KAAK,CAAC,cAAc,GAAG,OAAO;YAChC;UACF,CAAC,CAAC;UACJ,OAAO,EAAE,MAAM,UAAU,CAAC,SAAS,CAAC;UACpC,OAAO,EAAE,MAAM;YACb,KAAK,CAAC,cAAc,GAAG,wBAAwB;YAC/C,SAAS,CAAC,SAAS,GAAG,qBAAqB;YAC3C,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE,MAAM,CAAC,SAAS,GAAG,wBAAwB;UAChG;QACF,CAAC,CAAC,EACJ,SACF,CAAC;QACD,iBAAiB,CAAC,KAAK,CAAC;QACxB,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC;QAClC,mBAAmB,CAAC,MAAM,EAAE,MAAM,KAAK,cAAc,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;QAE7E,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;UAC5B;UACA;UACA;UACA,IAAI,aAAa,YAAY,WAAW,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;UAC9D,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,UAAU,EAAE;YAC1C,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAC/B,MAAM,CAAC,IAAI,CAAC,CAAC;UACpB,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC;UACtC,iBAAiB,CAAC,CAAC;QACrB;QACA,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE;UAAE,IAAI,EAAE;QAAK,CAAC,CAAC;QAChE,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QACpC;QACA;QACA,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa;QACrC,QAAQ,CAAC,MAAM;UACb,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE;UACnD,IAAI,QAAQ,CAAC,aAAa,KAAK,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE;UAClE,yBAAyB,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC,CAAC;MACJ,CAAC,CAAC,OAAO,KAAK,EAAE;QACd,KAAK,CAAC,OAAO,GAAG,SAAS;QACzB,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC;QACpE,MAAM,CAAC,KAAK,CAAC;MACf;IACF,CAAC,CAAC;EACJ,CAAC;EAED,MAAM,KAA0B,GAAI,MAAM,IAAK;IAC7C,IAAI,KAAK,GAAG,IAAI;IAChB,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;MAC7B,MAAM,CAAC,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;MAClC,KAAK,GAAG,KAAK;IACf;EACF,CAAC;EAED,OAAO;IACL,IAAI;IACJ,KAAK;IACL,MAAM,EAAE,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;IACpC,WAAW;IACX;EACF,CAAC;AACH,CAAC;AAED,MAAM;EAAE,WAAW;EAAE,cAAc;EAAE,GAAG;AAAiB,CAAC,GAAG,gBAAgB,CAAC,CAAC;AAC/E,OAAO,MAAM,UAAsB,GAAG,gBAAgB;;AAEtD;AACA;AACA;AACA;AACA,OAAO,MAAM,iBAAiB,GAAG,WAAW;AAC5C;AACA,OAAO,MAAM,oBAAoB,GAAG,cAAc","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["feedback/dialog-core.ts"],"sourcesContent":["import { createComponent, type JSX } from \"solid-js\";\nimport { render } from \"solid-js/web\";\nimport { returnFocus, ringOnReturn } from \"../internal/focus-return\";\nimport { getK2bPortalRoot } from \"../internal/portal\";\nimport { RenderErrorBoundary } from \"../internal/render-error\";\nimport { resolveUiMessages } from \"../intl/messages\";\nimport { isPointInsideToast } from \"./toast\";\n\nexport type DialogClose<T> = (result?: T) => void;\n\nexport type OpenDialogOptions = {\n /** Close only this dialog when its owning operation is cancelled. */\n signal?: AbortSignal;\n panelClassName?: string;\n contentClassName?: string;\n initialFocus?: \"first-input\" | \"none\" | ((dialog: HTMLDialogElement) => HTMLElement | null);\n cancelBehavior?: \"resolve-undefined\" | \"ignore\";\n ariaLabel?: string;\n /**\n * Add a same-URL history entry while the dialog is open, so the browser's or the phone's Back closes the dialog\n * instead of leaving the page. Normally closing the dialog removes the entry again; the returned promise settles after that.\n * With the Navigation API, same-URL traversals between this core's entries and the page do not reach application popstate listeners.\n * Without it, only the synthetic Back on close is suppressed.\n * Island disposal closes every open dialog immediately and forgets its marker without traversing history.\n * The same-URL entry remains for the router to replace and counts as a page entry for later dialogs.\n */\n history?: boolean;\n};\n\nexport type DialogRender<T> = (\n close: DialogClose<T>,\n context: {\n dialog: HTMLDialogElement;\n /** Switch this entry between a modal and a modeless window without remounting. */\n setModal: (modal: boolean) => void;\n /** Set viewport coordinates, or restore the panel stylesheet position with null. */\n setPosition: (position: { x: number; y: number } | null) => void;\n /** Route Escape/backdrop through the same guarded handler as Cancel and X. */\n setDismissHandler: (handler: () => void | Promise<void>) => void;\n /** Request dismissal through this entry's cancellation policy and guard. */\n requestDismiss: () => Promise<void>;\n },\n) => JSX.Element;\n\nexport type DialogCore = {\n open: <T>(view: DialogRender<T>, options?: OpenDialogOptions) => Promise<T | undefined>;\n close: (result?: unknown) => void;\n isOpen: () => boolean;\n};\n\ntype DialogStackEntry = {\n container: HTMLDivElement;\n dispose?: () => void;\n resolve?: (value: unknown) => void;\n panelClassName: string;\n cancelBehavior: NonNullable<OpenDialogOptions[\"cancelBehavior\"]>;\n initialFocus: NonNullable<OpenDialogOptions[\"initialFocus\"]>;\n opener?: HTMLElement;\n openerRing: boolean;\n ariaLabel?: string;\n dismissHandler?: () => void | Promise<void>;\n dismissPending?: boolean;\n modal: boolean;\n position?: { x: number; y: number } | null;\n /** The marker of this dialog's history entry, for dialogs opened with `history`. */\n historyId?: number;\n};\n\ntype DialogState = {\n element?: HTMLDialogElement;\n modal?: boolean;\n stack: DialogStackEntry[];\n scrollLocked?: boolean;\n previousBodyOverflow?: string;\n previousHtmlOverflow?: string;\n mouseDownOnDialog?: boolean;\n connectionObserver?: MutationObserver;\n};\n\nconst DEFAULT_PANEL_CLASS = \"k2b-dialog\";\nconst DEFAULT_CONTENT_CLASS = \"k2b-dialog__viewport\";\n/** The frame of a dialog whose content could not render: a custom or bare surface may draw no frame of its own. */\nconst RENDER_ERROR_PANEL_CLASS = \"k2b-dialog k2b-dialog--small\";\nlet nextDialogTitleId = 0;\nlet nextHistoryId = 0;\n/** The history state key that marks a dialog's same-URL entry. */\nconst HISTORY_MARKER = \"k2bDialog\";\n\nconst historyRecord = (): Record<string, unknown> =>\n typeof history.state === \"object\" && history.state !== null ? { ...history.state } : {};\nconst historyMarker = (): unknown => historyRecord()[HISTORY_MARKER];\nconst historySnapshot = () => ({ href: location.href, length: history.length });\n\nconst resolveInitialFocusTarget = (entry: DialogStackEntry, dialog: HTMLDialogElement): HTMLElement | null => {\n const { initialFocus } = entry;\n if (initialFocus === \"none\") return null;\n if (typeof initialFocus === \"function\") return initialFocus(dialog);\n const input = entry.container.querySelector<HTMLElement>(\n \"input:not([type='hidden']):not([disabled]), textarea:not([disabled]), select:not([disabled]), [role='combobox']:not([disabled]):not([aria-disabled='true'])\",\n );\n return (\n input ??\n entry.container.querySelector<HTMLElement>(\n \"input:not([type='hidden']):not([disabled]), textarea:not([disabled]), select:not([disabled]), button:not([disabled]), a[href], [tabindex]:not([tabindex='-1'])\",\n )\n );\n};\n\nconst applyAccessibleName = (dialog: HTMLDialogElement, entry: DialogStackEntry): void => {\n dialog.removeAttribute(\"aria-label\");\n dialog.removeAttribute(\"aria-labelledby\");\n if (entry.ariaLabel) {\n dialog.setAttribute(\"aria-label\", entry.ariaLabel);\n return;\n }\n const heading = entry.container.querySelector<HTMLElement>(\"h1, h2, h3\");\n if (!heading) {\n dialog.setAttribute(\"aria-label\", resolveUiMessages().dialog);\n return;\n }\n heading.id ||= `k2b-dialog-title-${++nextDialogTitleId}`;\n dialog.setAttribute(\"aria-labelledby\", heading.id);\n};\n\nconst schedule = (callback: () => void): void => {\n if (typeof requestAnimationFrame === \"function\") requestAnimationFrame(callback);\n else queueMicrotask(callback);\n};\n\n/**\n * Whether focus is still where closing a level left it, on the page or the\n * dialog: nothing took it before the next frame, neither a close handler nor a\n * Tab pressed right after Escape.\n */\nconst focusUnclaimed = (dialog: HTMLDialogElement): boolean => {\n const active = document.activeElement;\n return !active || active === document.body || active === dialog;\n};\n\ntype HistoryEntry = { historyId?: number };\ntype HistoryHolder = HistoryEntry & { onBack: () => void };\n\nexport const createDialogCore = () => {\n const state: DialogState = { stack: [] };\n /** Markers of this core's entries in the browser history, oldest first. */\n let historyIds: number[] = [];\n const issued = new Set<number>();\n /**\n * Markers forgotten during island disposal. Their entries stay in `historyIds` as barriers: a synthetic Back never\n * crosses one, because the router may have replaced that entry with another page.\n */\n const forgotten = new Set<number>();\n const deadMarker = (marker: unknown): marker is number => typeof marker === \"number\" && forgotten.has(marker);\n /** How often islands were disposed, so a dialog that waits to open notices that a content swap happened meanwhile. */\n let disposals = 0;\n const ownMarker = (marker: unknown): marker is number => typeof marker === \"number\" && issued.has(marker);\n let seen: ReturnType<typeof historySnapshot> | undefined;\n let traversalFrom: { href: string; marker: unknown } | undefined;\n let syntheticFrom: { href: string; marker: unknown } | undefined;\n const historyHolders = new Set<HistoryHolder>();\n let historySyncScheduled = false;\n let disposingIslands = false;\n /** Settles when the synthetic Back that removes closed dialogs' entries has arrived. */\n let returning: Promise<void> | undefined;\n let resolveReturning: (() => void) | undefined;\n\n /** Outside island disposal, closed entries leave with one Back to the newest live dialog or holder, or to the page. */\n const syncHistory = () => {\n if (returning) {\n void returning.then(() => {\n if (historySyncScheduled) syncHistory();\n });\n return;\n }\n historySyncScheduled = false;\n const openIds = new Set([...state.stack, ...historyHolders].map((entry) => entry.historyId));\n const current = historyIds.at(-1);\n let steps = 0;\n while (historyIds.length > 0 && !openIds.has(historyIds.at(-1)) && !deadMarker(historyIds.at(-1))) {\n historyIds.pop();\n steps++;\n }\n // Someone else moved the history meanwhile; leave it alone.\n if (steps === 0 || historyMarker() !== current || location.href !== seen?.href || history.length !== seen?.length) return;\n const back = new Promise<void>((resolve) => {\n resolveReturning = resolve;\n });\n returning = back;\n void back.then(() => {\n if (returning === back) returning = undefined;\n });\n syntheticFrom = { href: location.href, marker: current };\n history.go(-steps);\n };\n\n const releaseHistory = (entry: HistoryEntry) => {\n if (entry.historyId === undefined) return;\n // During a content swap the router owns history. Forget the marker without moving history; its entry stays a\n // barrier for later synthetic Backs and is left for the router to replace.\n if (disposingIslands) {\n issued.delete(entry.historyId);\n forgotten.add(entry.historyId);\n entry.historyId = undefined;\n return;\n }\n if (historySyncScheduled) return;\n historySyncScheduled = true;\n queueMicrotask(syncHistory);\n };\n\n /** Back or Forward moved to another entry: close dialogs and holders opened after the one it shows. */\n const onPopState = (event: PopStateEvent) => {\n const resolveBack = resolveReturning;\n // Without the Navigation API, only our synthetic Back has a known departure.\n const from = typeof navigation !== \"undefined\" ? traversalFrom : resolveBack ? syntheticFrom : undefined;\n traversalFrom = undefined;\n syntheticFrom = undefined;\n resolveReturning = undefined;\n try {\n const marker = historyMarker();\n if (from && from.href === location.href && from.marker !== marker && (ownMarker(from.marker) || ownMarker(marker))) {\n event.stopImmediatePropagation();\n }\n // Own entries are ordered by id. A retired entry reached by Forward stays tracked, so closing the dialogs\n // beneath it also removes it. A forgotten entry keeps the holders opened before it and stays a barrier.\n historyIds = ownMarker(marker) || deadMarker(marker) ? [...historyIds.filter((id) => id < marker), marker] : [];\n const gone = (entry: DialogStackEntry) => entry.historyId !== undefined && !historyIds.includes(entry.historyId);\n while (state.stack.some(gone)) popTop(undefined);\n for (const holder of [...historyHolders].reverse()) {\n if (holder.historyId === undefined || historyIds.includes(holder.historyId)) continue;\n historyHolders.delete(holder);\n releaseHistory(holder);\n holder.onBack();\n }\n } finally {\n seen = historySnapshot();\n resolveBack?.();\n }\n };\n\n /**\n * Island disposal means the page content changes, as a document load would. Every dialog closes, top first, whichever\n * code opened it: which island calls open() is not knowable after an await, in onMount or from a timer, and a modal\n * left over the new content would block it.\n */\n const onIslandDispose = () => {\n if (!disposingIslands) {\n disposingIslands = true;\n queueMicrotask(() => {\n disposingIslands = false;\n });\n // Entries released just before, whose Back has not started yet, stay as well: the router owns history now.\n // A Back already on its way still settles through `returning`.\n historySyncScheduled = false;\n const live = new Set([...state.stack, ...historyHolders].map((entry) => entry.historyId));\n for (const id of historyIds) {\n if (live.has(id) || !issued.delete(id)) continue;\n forgotten.add(id);\n }\n }\n disposals++;\n while (state.stack.length > 0) popTop(undefined);\n };\n\n const onNavigate = (event: NavigateEvent) => {\n if (event.navigationType === \"traverse\") traversalFrom = { href: location.href, marker: historyMarker() };\n };\n /** The window whose history this core listens to; a test harness may replace the window between dialogs. */\n let listening: { window: Window; navigation?: Navigation } | undefined;\n const listen = () => {\n if (listening?.window === window) return;\n listening?.window.removeEventListener(\"popstate\", onPopState, { capture: true });\n listening?.window.removeEventListener(\"ssr:island-dispose\", onIslandDispose, { capture: true });\n listening?.navigation?.removeEventListener(\"navigate\", onNavigate);\n window.addEventListener(\"popstate\", onPopState, { capture: true });\n // Capture opens the disposal window before target listeners can release history holders.\n window.addEventListener(\"ssr:island-dispose\", onIslandDispose, { capture: true });\n const current = typeof navigation !== \"undefined\" ? navigation : undefined;\n current?.addEventListener(\"navigate\", onNavigate);\n listening = { window, navigation: current };\n };\n // Chromium runs a window's popstate listeners in the order they were added, capture or not. The shared core is\n // created before islands mount and add their navigation listeners, so it listens from the start.\n if (typeof window !== \"undefined\") listen();\n\n const pushHistory = (entry: HistoryEntry) => {\n listen();\n const previous = historyRecord();\n // A reload or Forward never brings back a dialog or its sensitive transient state.\n if (historyIds.length === 0 && previous[HISTORY_MARKER] !== undefined) {\n delete previous[HISTORY_MARKER];\n history.replaceState(previous, \"\");\n }\n entry.historyId = ++nextHistoryId;\n issued.add(entry.historyId);\n historyIds.push(entry.historyId);\n history.pushState({ ...previous, [HISTORY_MARKER]: entry.historyId }, \"\");\n seen = historySnapshot();\n };\n\n /** Internal non-dialog participation in the same history stack. Releasing never calls onBack. */\n const holdHistory = (onBack: () => void): (() => void) => {\n const holder: HistoryHolder = { onBack };\n historyHolders.add(holder);\n const pushWhenReady = () => {\n if (!historyHolders.has(holder)) return;\n // Just like open(): remove closed entries before adding another one.\n if (historySyncScheduled) syncHistory();\n if (returning) void returning.then(pushWhenReady);\n else pushHistory(holder);\n };\n pushWhenReady();\n return () => {\n if (!historyHolders.delete(holder)) return;\n releaseHistory(holder);\n };\n };\n\n /**\n * Settles once released entries have left history or were forgotten during island disposal. A caller that navigates waits\n * for it, as a dialog's result waits: a Back still on its way would otherwise land behind the new entry.\n */\n const historySettled = async (): Promise<void> => {\n while (historySyncScheduled || returning) {\n if (!returning) syncHistory();\n if (returning) await returning;\n }\n };\n\n const ensureDialogElement = () => {\n if (typeof document === \"undefined\") throw new Error(\"@k2b/ui dialogs can only be opened in the browser\");\n // Reuse the shared element whenever it is still in the document. Resolving\n // the portal root first would create a second <dialog> when focus has moved\n // into another `.k2b-ui` scope, orphaning the levels already on the stack.\n if (state.element?.isConnected) return state.element;\n\n const element = document.createElement(\"dialog\");\n element.onclose = () => {\n // Repeated Escape can force a non-cancelable native close. A retained\n // entry (ignore, an async guard, or a parent) still owns the modal.\n const top = state.stack[state.stack.length - 1];\n if (state.element !== element || element.open || !top) return;\n if (top.modal) element.showModal();\n else element.show();\n resolveInitialFocusTarget(top, element)?.focus();\n };\n getK2bPortalRoot().appendChild(element);\n state.element = element;\n return element;\n };\n\n const lockPageScroll = () => {\n if (typeof document === \"undefined\" || state.scrollLocked) return;\n state.previousBodyOverflow = document.body.style.overflow;\n state.previousHtmlOverflow = document.documentElement.style.overflow;\n document.body.style.overflow = \"hidden\";\n document.documentElement.style.overflow = \"hidden\";\n state.scrollLocked = true;\n };\n\n const unlockPageScroll = () => {\n if (typeof document === \"undefined\" || !state.scrollLocked) return;\n document.body.style.overflow = state.previousBodyOverflow ?? \"\";\n document.documentElement.style.overflow = state.previousHtmlOverflow ?? \"\";\n state.scrollLocked = false;\n state.previousBodyOverflow = undefined;\n state.previousHtmlOverflow = undefined;\n };\n\n const applyPresentation = (entry: DialogStackEntry) => {\n const dialog = state.element;\n if (!dialog || state.stack[state.stack.length - 1] !== entry) return;\n const position = entry.position;\n dialog.style.position = position ? \"fixed\" : \"\";\n dialog.style.inset = position ? `${position.y}px auto auto ${position.x}px` : \"\";\n dialog.style.margin = position ? \"0\" : \"\";\n dialog.style.transform = position ? \"none\" : \"\";\n dialog.dataset.modeless = String(!entry.modal);\n dialog.setAttribute(\"aria-modal\", String(entry.modal));\n if (dialog.open && state.modal !== entry.modal) {\n const active = document.activeElement;\n dialog.close();\n if (entry.modal) dialog.showModal();\n else dialog.show();\n if (active instanceof HTMLElement && active.isConnected && (!entry.modal || dialog.contains(active))) {\n active.focus({ preventScroll: true });\n } else resolveInitialFocusTarget(entry, dialog)?.focus({ preventScroll: true });\n }\n state.modal = entry.modal;\n if (entry.modal) lockPageScroll();\n else unlockPageScroll();\n };\n\n const modelessEscape = (event: KeyboardEvent) => {\n const top = state.stack[state.stack.length - 1];\n if (!top || top.modal || event.key !== \"Escape\" || event.defaultPrevented || event.isComposing) return;\n event.preventDefault();\n void requestDismiss(top);\n };\n\n const stopConnectionObserver = () => {\n document.removeEventListener(\"keydown\", modelessEscape);\n state.connectionObserver?.disconnect();\n state.connectionObserver = undefined;\n };\n\n const applyCancelBehavior = (\n dialog: HTMLDialogElement,\n close: () => void,\n behavior: NonNullable<OpenDialogOptions[\"cancelBehavior\"]>,\n ) => {\n dialog.oncancel = (event) => {\n if (behavior === \"ignore\") {\n event.preventDefault();\n return;\n }\n event.preventDefault();\n close();\n };\n dialog.onmousedown = (event) => {\n state.mouseDownOnDialog = event.target === dialog;\n };\n dialog.onclick = (event) => {\n const realBackdropClick = state.mouseDownOnDialog === true;\n state.mouseDownOnDialog = false;\n if (event.target !== dialog || !state.modal) return;\n if (!realBackdropClick) return;\n if (behavior === \"ignore\") return;\n if (isPointInsideToast(event.clientX, event.clientY)) return;\n close();\n };\n };\n\n const requestDismiss = async (entry: DialogStackEntry) => {\n if (state.stack[state.stack.length - 1] !== entry || entry.dismissPending || entry.cancelBehavior === \"ignore\") return;\n if (!entry.dismissHandler) {\n popTop(undefined);\n return;\n }\n entry.dismissPending = true;\n try {\n await entry.dismissHandler();\n } catch (error) {\n // A failed guard must never discard the dialog's state.\n console.error(\"Dialog dismissal failed\", error);\n } finally {\n entry.dismissPending = false;\n }\n };\n\n const popTop = (result?: unknown) => {\n const top = state.stack.pop();\n if (!top) return;\n releaseHistory(top);\n top.dispose?.();\n top.container.remove();\n\n const dialog = state.element;\n const previous = state.stack[state.stack.length - 1];\n if (previous && dialog) {\n previous.container.style.display = \"\";\n dialog.className = previous.panelClassName;\n applyPresentation(previous);\n applyAccessibleName(dialog, previous);\n applyCancelBehavior(dialog, () => void requestDismiss(previous), previous.cancelBehavior);\n schedule(() => {\n if (!focusUnclaimed(dialog)) return;\n if (top.opener?.isConnected) returnFocus(top.opener, top.openerRing);\n else resolveInitialFocusTarget(previous, dialog)?.focus();\n });\n } else if (dialog) {\n dialog.oncancel = null;\n dialog.onmousedown = null;\n dialog.onclick = null;\n dialog.removeAttribute(\"aria-label\");\n dialog.removeAttribute(\"aria-labelledby\");\n if (dialog.open && typeof dialog.close === \"function\") dialog.close();\n else dialog.removeAttribute(\"open\");\n dialog.remove();\n state.element = undefined;\n stopConnectionObserver();\n unlockPageScroll();\n // After the Escape that closed it: WebKit lights the ring of whatever\n // that key press leaves focused.\n schedule(() => {\n if (top.opener?.isConnected && focusUnclaimed(dialog)) returnFocus(top.opener, top.openerRing);\n });\n }\n\n top.resolve?.(result);\n };\n\n const resetDisconnectedDialog = () => {\n if (state.stack.length === 0 || state.element?.isConnected) return;\n const entries = state.stack.splice(0);\n const dialog = state.element;\n state.element = undefined;\n stopConnectionObserver();\n dialog?.remove();\n unlockPageScroll();\n for (const entry of entries.reverse()) {\n releaseHistory(entry);\n entry.dispose?.();\n entry.container.remove();\n entry.resolve?.(undefined);\n }\n };\n\n const observeConnection = () => {\n if (state.connectionObserver || typeof MutationObserver === \"undefined\") return;\n document.addEventListener(\"keydown\", modelessEscape);\n state.connectionObserver = new MutationObserver(resetDisconnectedDialog);\n state.connectionObserver.observe(document.documentElement, { childList: true, subtree: true });\n };\n\n const open = <T>(view: DialogRender<T>, options: OpenDialogOptions = {}): Promise<T | undefined> => {\n return openAfter(view, options, disposals);\n };\n\n const openAfter = <T>(view: DialogRender<T>, options: OpenDialogOptions, requested: number): Promise<T | undefined> => {\n if (options.signal?.aborted) return Promise.resolve(undefined);\n if (options.history) {\n // Dialogs closed just now leave the history first, or this dialog's entry would be the one removed.\n if (historySyncScheduled) syncHistory();\n if (returning) return returning.then(() => openAfter(view, options, requested));\n }\n // A dialog that waited for history while islands were disposed would open over content it was never meant for.\n if (disposals !== requested) return Promise.resolve(undefined);\n const dialog = ensureDialogElement();\n listen();\n const previousTop = state.stack[state.stack.length - 1];\n if (previousTop) previousTop.container.style.display = \"none\";\n const activeElement = document.activeElement;\n\n const panelClassName = options.panelClassName ?? DEFAULT_PANEL_CLASS;\n const cancelBehavior = options.cancelBehavior ?? \"resolve-undefined\";\n const initialFocus = options.initialFocus ?? \"first-input\";\n dialog.className = panelClassName;\n\n const container = document.createElement(\"div\");\n container.className = options.contentClassName ?? DEFAULT_CONTENT_CLASS;\n dialog.appendChild(container);\n\n const entry: DialogStackEntry = {\n container,\n panelClassName,\n cancelBehavior,\n initialFocus,\n opener: activeElement instanceof HTMLElement ? activeElement : undefined,\n openerRing: ringOnReturn(activeElement),\n ariaLabel: options.ariaLabel,\n modal: true,\n };\n\n return new Promise((resolve, reject) => {\n const abort = () => {\n const index = state.stack.indexOf(entry);\n if (index < 0) return;\n if (index === state.stack.length - 1) popTop(undefined);\n else {\n state.stack.splice(index, 1);\n releaseHistory(entry);\n entry.dispose?.();\n entry.container.remove();\n entry.resolve?.(undefined);\n }\n };\n entry.resolve = (value) => {\n options.signal?.removeEventListener(\"abort\", abort);\n if (!options.history) {\n resolve(value as T | undefined);\n return;\n }\n // After every pending history sync, so a caller that navigates or opens the next dialog finds the history settled.\n // This holds for a marker forgotten during island disposal too, while an earlier synthetic Back is on its way.\n queueMicrotask(() => void historySettled().then(() => resolve(value as T | undefined)));\n };\n const closeTyped: DialogClose<T> = (result) => {\n if (state.stack[state.stack.length - 1] !== entry) return;\n popTop(result);\n };\n\n if (options.history) pushHistory(entry);\n state.stack.push(entry);\n try {\n entry.dispose = render(\n () =>\n createComponent(RenderErrorBoundary, {\n content: () =>\n view(closeTyped, {\n dialog,\n setModal: (modal) => {\n entry.modal = modal;\n applyPresentation(entry);\n },\n setPosition: (position) => {\n if (position && (!Number.isFinite(position.x) || !Number.isFinite(position.y))) return;\n entry.position = position;\n applyPresentation(entry);\n },\n requestDismiss: () => requestDismiss(entry),\n setDismissHandler: (handler) => {\n entry.dismissHandler = handler;\n },\n }),\n onClose: () => closeTyped(undefined),\n onError: () => {\n entry.panelClassName = RENDER_ERROR_PANEL_CLASS;\n container.className = DEFAULT_CONTENT_CLASS;\n if (state.stack[state.stack.length - 1] === entry) dialog.className = RENDER_ERROR_PANEL_CLASS;\n },\n }),\n container,\n );\n applyPresentation(entry);\n applyAccessibleName(dialog, entry);\n applyCancelBehavior(dialog, () => void requestDismiss(entry), cancelBehavior);\n\n if (state.stack.length === 1) {\n // The native dialog returns focus to the element focused when it\n // opened, with a ring of the browser's choosing. Opening from a\n // blurred document leaves the return to popTop and its opener ring.\n if (activeElement instanceof HTMLElement) activeElement.blur();\n if (typeof dialog.showModal === \"function\") {\n if (entry.modal) dialog.showModal();\n else dialog.show();\n } else dialog.setAttribute(\"open\", \"\");\n observeConnection();\n }\n options.signal?.addEventListener(\"abort\", abort, { once: true });\n if (options.signal?.aborted) abort();\n // Where opening left focus, the native dialog's own pick included. Focus that the content or a person moved\n // before the next frame stays: a browser can hold that frame back while keys already arrive.\n const opened = document.activeElement;\n schedule(() => {\n if (state.stack[state.stack.length - 1] !== entry) return;\n if (document.activeElement !== opened && !focusUnclaimed(dialog)) return;\n resolveInitialFocusTarget(entry, dialog)?.focus();\n });\n } catch (error) {\n entry.resolve = undefined;\n if (state.stack[state.stack.length - 1] === entry) popTop(undefined);\n reject(error);\n }\n });\n };\n\n const close: DialogCore[\"close\"] = (result) => {\n let first = true;\n while (state.stack.length > 0) {\n popTop(first ? result : undefined);\n first = false;\n }\n };\n\n return {\n open,\n close,\n isOpen: () => state.stack.length > 0,\n holdHistory,\n historySettled,\n };\n};\n\nconst { holdHistory, historySettled, ...publicDialogCore } = createDialogCore();\nexport const dialogCore: DialogCore = publicDialogCore;\n\n/**\n * Internal: transient UI shares dialogs' Back handling without exposing another public dialog capability.\n * Same-URL traversals are suppressed with the Navigation API; without it, only the synthetic Back on release is suppressed.\n * Release during island disposal forgets the marker without traversing; the router may replace the remaining entry.\n */\nexport const holdDialogHistory = holdHistory;\n/** Internal: waits until released holders have left history or were forgotten during island disposal. */\nexport const dialogHistorySettled = historySettled;\n"],"mappings":"AAAA,SAAS,eAAe,QAAkB,UAAU;AACpD,SAAS,MAAM,QAAQ,cAAc;AACrC,SAAS,WAAW,EAAE,YAAY,QAAQ,0BAA0B;AACpE,SAAS,gBAAgB,QAAQ,oBAAoB;AACrD,SAAS,mBAAmB,QAAQ,0BAA0B;AAC9D,SAAS,iBAAiB,QAAQ,kBAAkB;AACpD,SAAS,kBAAkB,QAAQ,SAAS;AAyE5C,MAAM,mBAAmB,GAAG,YAAY;AACxC,MAAM,qBAAqB,GAAG,sBAAsB;AACpD;AACA,MAAM,wBAAwB,GAAG,8BAA8B;AAC/D,IAAI,iBAAiB,GAAG,CAAC;AACzB,IAAI,aAAa,GAAG,CAAC;AACrB;AACA,MAAM,cAAc,GAAG,WAAW;AAElC,MAAM,aAAa,GAAG,MACpB,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,GAAG;EAAE,GAAG,OAAO,CAAC;AAAM,CAAC,GAAG,CAAC,CAAC;AACzF,MAAM,aAAa,GAAG,MAAe,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC;AACpE,MAAM,eAAe,GAAG,OAAO;EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI;EAAE,MAAM,EAAE,OAAO,CAAC;AAAO,CAAC,CAAC;AAE/E,MAAM,yBAAyB,GAAG,CAAC,KAAuB,EAAE,MAAyB,KAAyB;EAC5G,MAAM;IAAE;EAAa,CAAC,GAAG,KAAK;EAC9B,IAAI,YAAY,KAAK,MAAM,EAAE,OAAO,IAAI;EACxC,IAAI,OAAO,YAAY,KAAK,UAAU,EAAE,OAAO,YAAY,CAAC,MAAM,CAAC;EACnE,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,aAAa,CACzC,6JACF,CAAC;EACD,OACE,KAAK,IACL,KAAK,CAAC,SAAS,CAAC,aAAa,CAC3B,gKACF,CAAC;AAEL,CAAC;AAED,MAAM,mBAAmB,GAAG,CAAC,MAAyB,EAAE,KAAuB,KAAW;EACxF,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC;EACpC,MAAM,CAAC,eAAe,CAAC,iBAAiB,CAAC;EACzC,IAAI,KAAK,CAAC,SAAS,EAAE;IACnB,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC;IAClD;EACF;EACA,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,aAAa,CAAc,YAAY,CAAC;EACxE,IAAI,CAAC,OAAO,EAAE;IACZ,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC;IAC7D;EACF;EACA,OAAO,CAAC,EAAE,KAAK,oBAAoB,EAAE,iBAAiB,EAAE;EACxD,MAAM,CAAC,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,QAAQ,GAAI,QAAoB,IAAW;EAC/C,IAAI,OAAO,qBAAqB,KAAK,UAAU,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC,KAC5E,cAAc,CAAC,QAAQ,CAAC;AAC/B,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,MAAM,cAAc,GAAI,MAAyB,IAAc;EAC7D,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa;EACrC,OAAO,CAAC,MAAM,IAAI,MAAM,KAAK,QAAQ,CAAC,IAAI,IAAI,MAAM,KAAK,MAAM;AACjE,CAAC;AAKD,OAAO,MAAM,gBAAgB,GAAG,MAAM;EACpC,MAAM,KAAkB,GAAG;IAAE,KAAK,EAAE;EAAG,CAAC;EACxC;EACA,IAAI,UAAoB,GAAG,EAAE;EAC7B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAS,CAAC;EAChC;AACF;AACA;AACA;EACE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAS,CAAC;EACnC,MAAM,UAAU,GAAI,MAAe,IAAuB,OAAO,MAAM,KAAK,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;EAC7G;EACA,IAAI,SAAS,GAAG,CAAC;EACjB,MAAM,SAAS,GAAI,MAAe,IAAuB,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;EACzG,IAAI,IAAoD;EACxD,IAAI,aAA4D;EAChE,IAAI,aAA4D;EAChE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAgB,CAAC;EAC/C,IAAI,oBAAoB,GAAG,KAAK;EAChC,IAAI,gBAAgB,GAAG,KAAK;EAC5B;EACA,IAAI,SAAoC;EACxC,IAAI,gBAA0C;;EAE9C;EACA,MAAM,WAAW,GAAG,MAAM;IACxB,IAAI,SAAS,EAAE;MACb,KAAK,SAAS,CAAC,IAAI,CAAC,MAAM;QACxB,IAAI,oBAAoB,EAAE,WAAW,CAAC,CAAC;MACzC,CAAC,CAAC;MACF;IACF;IACA,oBAAoB,GAAG,KAAK;IAC5B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,cAAc,CAAC,CAAC,GAAG,CAAE,KAAK,IAAK,KAAK,CAAC,SAAS,CAAC,CAAC;IAC5F,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,KAAK,GAAG,CAAC;IACb,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;MACjG,UAAU,CAAC,GAAG,CAAC,CAAC;MAChB,KAAK,EAAE;IACT;IACA;IACA,IAAI,KAAK,KAAK,CAAC,IAAI,aAAa,CAAC,CAAC,KAAK,OAAO,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE,IAAI,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,EAAE,MAAM,EAAE;IACnH,MAAM,IAAI,GAAG,IAAI,OAAO,CAAQ,OAAO,IAAK;MAC1C,gBAAgB,GAAG,OAAO;IAC5B,CAAC,CAAC;IACF,SAAS,GAAG,IAAI;IAChB,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM;MACnB,IAAI,SAAS,KAAK,IAAI,EAAE,SAAS,GAAG,SAAS;IAC/C,CAAC,CAAC;IACF,aAAa,GAAG;MAAE,IAAI,EAAE,QAAQ,CAAC,IAAI;MAAE,MAAM,EAAE;IAAQ,CAAC;IACxD,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC;EACpB,CAAC;EAED,MAAM,cAAc,GAAI,KAAmB,IAAK;IAC9C,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE;IACnC;IACA;IACA,IAAI,gBAAgB,EAAE;MACpB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;MAC9B,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC;MAC9B,KAAK,CAAC,SAAS,GAAG,SAAS;MAC3B;IACF;IACA,IAAI,oBAAoB,EAAE;IAC1B,oBAAoB,GAAG,IAAI;IAC3B,cAAc,CAAC,WAAW,CAAC;EAC7B,CAAC;;EAED;EACA,MAAM,UAAU,GAAI,KAAoB,IAAK;IAC3C,MAAM,WAAW,GAAG,gBAAgB;IACpC;IACA,MAAM,IAAI,GAAG,OAAO,UAAU,KAAK,WAAW,GAAG,aAAa,GAAG,WAAW,GAAG,aAAa,GAAG,SAAS;IACxG,aAAa,GAAG,SAAS;IACzB,aAAa,GAAG,SAAS;IACzB,gBAAgB,GAAG,SAAS;IAC5B,IAAI;MACF,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC;MAC9B,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,KAAK,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE;QAClH,KAAK,CAAC,wBAAwB,CAAC,CAAC;MAClC;MACA;MACA;MACA,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,CAAE,EAAE,IAAK,EAAE,GAAG,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,EAAE;MAC/G,MAAM,IAAI,GAAI,KAAuB,IAAK,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC;MAChH,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC;MAChD,KAAK,MAAM,MAAM,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE;QAClD,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE;QAC7E,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC;QAC7B,cAAc,CAAC,MAAM,CAAC;QACtB,MAAM,CAAC,MAAM,CAAC,CAAC;MACjB;IACF,CAAC,SAAS;MACR,IAAI,GAAG,eAAe,CAAC,CAAC;MACxB,WAAW,GAAG,CAAC;IACjB;EACF,CAAC;;EAED;AACF;AACA;AACA;AACA;EACE,MAAM,eAAe,GAAG,MAAM;IAC5B,IAAI,CAAC,gBAAgB,EAAE;MACrB,gBAAgB,GAAG,IAAI;MACvB,cAAc,CAAC,MAAM;QACnB,gBAAgB,GAAG,KAAK;MAC1B,CAAC,CAAC;MACF;MACA;MACA,oBAAoB,GAAG,KAAK;MAC5B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,cAAc,CAAC,CAAC,GAAG,CAAE,KAAK,IAAK,KAAK,CAAC,SAAS,CAAC,CAAC;MACzF,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE;QAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;QACxC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;MACnB;IACF;IACA,SAAS,EAAE;IACX,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC;EAClD,CAAC;EAED,MAAM,UAAU,GAAI,KAAoB,IAAK;IAC3C,IAAI,KAAK,CAAC,cAAc,KAAK,UAAU,EAAE,aAAa,GAAG;MAAE,IAAI,EAAE,QAAQ,CAAC,IAAI;MAAE,MAAM,EAAE,aAAa,CAAC;IAAE,CAAC;EAC3G,CAAC;EACD;EACA,IAAI,SAAkE;EACtE,MAAM,MAAM,GAAG,MAAM;IACnB,IAAI,SAAS,EAAE,MAAM,KAAK,MAAM,EAAE;IAClC,SAAS,EAAE,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,UAAU,EAAE;MAAE,OAAO,EAAE;IAAK,CAAC,CAAC;IAChF,SAAS,EAAE,MAAM,CAAC,mBAAmB,CAAC,oBAAoB,EAAE,eAAe,EAAE;MAAE,OAAO,EAAE;IAAK,CAAC,CAAC;IAC/F,SAAS,EAAE,UAAU,EAAE,mBAAmB,CAAC,UAAU,EAAE,UAAU,CAAC;IAClE,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE;MAAE,OAAO,EAAE;IAAK,CAAC,CAAC;IAClE;IACA,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,eAAe,EAAE;MAAE,OAAO,EAAE;IAAK,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,OAAO,UAAU,KAAK,WAAW,GAAG,UAAU,GAAG,SAAS;IAC1E,OAAO,EAAE,gBAAgB,CAAC,UAAU,EAAE,UAAU,CAAC;IACjD,SAAS,GAAG;MAAE,MAAM;MAAE,UAAU,EAAE;IAAQ,CAAC;EAC7C,CAAC;EACD;EACA;EACA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,MAAM,CAAC,CAAC;EAE3C,MAAM,WAAW,GAAI,KAAmB,IAAK;IAC3C,MAAM,CAAC,CAAC;IACR,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC;IAChC;IACA,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,cAAc,CAAC,KAAK,SAAS,EAAE;MACrE,OAAO,QAAQ,CAAC,cAAc,CAAC;MAC/B,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC;IACpC;IACA,KAAK,CAAC,SAAS,GAAG,EAAE,aAAa;IACjC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC;IAC3B,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;IAChC,OAAO,CAAC,SAAS,CAAC;MAAE,GAAG,QAAQ;MAAE,CAAC,cAAc,GAAG,KAAK,CAAC;IAAU,CAAC,EAAE,EAAE,CAAC;IACzE,IAAI,GAAG,eAAe,CAAC,CAAC;EAC1B,CAAC;;EAED;EACA,MAAM,WAAW,GAAI,MAAkB,IAAmB;IACxD,MAAM,MAAqB,GAAG;MAAE;IAAO,CAAC;IACxC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;IAC1B,MAAM,aAAa,GAAG,MAAM;MAC1B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;MACjC;MACA,IAAI,oBAAoB,EAAE,WAAW,CAAC,CAAC;MACvC,IAAI,SAAS,EAAE,KAAK,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,KAC7C,WAAW,CAAC,MAAM,CAAC;IAC1B,CAAC;IACD,aAAa,CAAC,CAAC;IACf,OAAO,MAAM;MACX,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;MACpC,cAAc,CAAC,MAAM,CAAC;IACxB,CAAC;EACH,CAAC;;EAED;AACF;AACA;AACA;EACE,MAAM,cAAc,GAAG,YAA2B;IAChD,OAAO,oBAAoB,IAAI,SAAS,EAAE;MACxC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;MAC7B,IAAI,SAAS,EAAE,MAAM,SAAS;IAChC;EACF,CAAC;EAED,MAAM,mBAAmB,GAAG,MAAM;IAChC,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC;IACzG;IACA;IACA;IACA,IAAI,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,KAAK,CAAC,OAAO;IAEpD,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;IAChD,OAAO,CAAC,OAAO,GAAG,MAAM;MACtB;MACA;MACA,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;MAC/C,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;MACvD,IAAI,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,KAC9B,OAAO,CAAC,IAAI,CAAC,CAAC;MACnB,yBAAyB,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IACD,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC;IACvC,KAAK,CAAC,OAAO,GAAG,OAAO;IACvB,OAAO,OAAO;EAChB,CAAC;EAED,MAAM,cAAc,GAAG,MAAM;IAC3B,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,KAAK,CAAC,YAAY,EAAE;IAC3D,KAAK,CAAC,oBAAoB,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ;IACzD,KAAK,CAAC,oBAAoB,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ;IACpE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ;IACvC,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ;IAClD,KAAK,CAAC,YAAY,GAAG,IAAI;EAC3B,CAAC;EAED,MAAM,gBAAgB,GAAG,MAAM;IAC7B,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;IAC5D,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,oBAAoB,IAAI,EAAE;IAC/D,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,oBAAoB,IAAI,EAAE;IAC1E,KAAK,CAAC,YAAY,GAAG,KAAK;IAC1B,KAAK,CAAC,oBAAoB,GAAG,SAAS;IACtC,KAAK,CAAC,oBAAoB,GAAG,SAAS;EACxC,CAAC;EAED,MAAM,iBAAiB,GAAI,KAAuB,IAAK;IACrD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO;IAC5B,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE;IAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ;IAC/B,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,EAAE;IAC/C,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,GAAG,GAAG,QAAQ,CAAC,CAAC,gBAAgB,QAAQ,CAAC,CAAC,IAAI,GAAG,EAAE;IAChF,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,GAAG,GAAG,GAAG,EAAE;IACzC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,EAAE;IAC/C,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;IAC9C,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtD,IAAI,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE;MAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa;MACrC,MAAM,CAAC,KAAK,CAAC,CAAC;MACd,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAC/B,MAAM,CAAC,IAAI,CAAC,CAAC;MAClB,IAAI,MAAM,YAAY,WAAW,IAAI,MAAM,CAAC,WAAW,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE;QACpG,MAAM,CAAC,KAAK,CAAC;UAAE,aAAa,EAAE;QAAK,CAAC,CAAC;MACvC,CAAC,MAAM,yBAAyB,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,aAAa,EAAE;MAAK,CAAC,CAAC;IACjF;IACA,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK;IACzB,IAAI,KAAK,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,KAC7B,gBAAgB,CAAC,CAAC;EACzB,CAAC;EAED,MAAM,cAAc,GAAI,KAAoB,IAAK;IAC/C,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/C,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,WAAW,EAAE;IAChG,KAAK,CAAC,cAAc,CAAC,CAAC;IACtB,KAAK,cAAc,CAAC,GAAG,CAAC;EAC1B,CAAC;EAED,MAAM,sBAAsB,GAAG,MAAM;IACnC,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,cAAc,CAAC;IACvD,KAAK,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;IACtC,KAAK,CAAC,kBAAkB,GAAG,SAAS;EACtC,CAAC;EAED,MAAM,mBAAmB,GAAG,CAC1B,MAAyB,EACzB,KAAiB,EACjB,QAA0D,KACvD;IACH,MAAM,CAAC,QAAQ,GAAI,KAAK,IAAK;MAC3B,IAAI,QAAQ,KAAK,QAAQ,EAAE;QACzB,KAAK,CAAC,cAAc,CAAC,CAAC;QACtB;MACF;MACA,KAAK,CAAC,cAAc,CAAC,CAAC;MACtB,KAAK,CAAC,CAAC;IACT,CAAC;IACD,MAAM,CAAC,WAAW,GAAI,KAAK,IAAK;MAC9B,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC,MAAM,KAAK,MAAM;IACnD,CAAC;IACD,MAAM,CAAC,OAAO,GAAI,KAAK,IAAK;MAC1B,MAAM,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,KAAK,IAAI;MAC1D,KAAK,CAAC,iBAAiB,GAAG,KAAK;MAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;MAC7C,IAAI,CAAC,iBAAiB,EAAE;MACxB,IAAI,QAAQ,KAAK,QAAQ,EAAE;MAC3B,IAAI,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE;MACtD,KAAK,CAAC,CAAC;IACT,CAAC;EACH,CAAC;EAED,MAAM,cAAc,GAAG,MAAO,KAAuB,IAAK;IACxD,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,cAAc,KAAK,QAAQ,EAAE;IAChH,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;MACzB,MAAM,CAAC,SAAS,CAAC;MACjB;IACF;IACA,KAAK,CAAC,cAAc,GAAG,IAAI;IAC3B,IAAI;MACF,MAAM,KAAK,CAAC,cAAc,CAAC,CAAC;IAC9B,CAAC,CAAC,OAAO,KAAK,EAAE;MACd;MACA,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC;IACjD,CAAC,SAAS;MACR,KAAK,CAAC,cAAc,GAAG,KAAK;IAC9B;EACF,CAAC;EAED,MAAM,MAAM,GAAI,MAAgB,IAAK;IACnC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,EAAE;IACV,cAAc,CAAC,GAAG,CAAC;IACnB,GAAG,CAAC,OAAO,GAAG,CAAC;IACf,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAEtB,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO;IAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACpD,IAAI,QAAQ,IAAI,MAAM,EAAE;MACtB,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE;MACrC,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC,cAAc;MAC1C,iBAAiB,CAAC,QAAQ,CAAC;MAC3B,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC;MACrC,mBAAmB,CAAC,MAAM,EAAE,MAAM,KAAK,cAAc,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC;MACzF,QAAQ,CAAC,MAAM;QACb,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE;QAC7B,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,KAChE,yBAAyB,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;MAC3D,CAAC,CAAC;IACJ,CAAC,MAAM,IAAI,MAAM,EAAE;MACjB,MAAM,CAAC,QAAQ,GAAG,IAAI;MACtB,MAAM,CAAC,WAAW,GAAG,IAAI;MACzB,MAAM,CAAC,OAAO,GAAG,IAAI;MACrB,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC;MACpC,MAAM,CAAC,eAAe,CAAC,iBAAiB,CAAC;MACzC,IAAI,MAAM,CAAC,IAAI,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KACjE,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC;MACnC,MAAM,CAAC,MAAM,CAAC,CAAC;MACf,KAAK,CAAC,OAAO,GAAG,SAAS;MACzB,sBAAsB,CAAC,CAAC;MACxB,gBAAgB,CAAC,CAAC;MAClB;MACA;MACA,QAAQ,CAAC,MAAM;QACb,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC;MAChG,CAAC,CAAC;IACJ;IAEA,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC;EACvB,CAAC;EAED,MAAM,uBAAuB,GAAG,MAAM;IACpC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE;IAC5D,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO;IAC5B,KAAK,CAAC,OAAO,GAAG,SAAS;IACzB,sBAAsB,CAAC,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC,CAAC;IAChB,gBAAgB,CAAC,CAAC;IAClB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE;MACrC,cAAc,CAAC,KAAK,CAAC;MACrB,KAAK,CAAC,OAAO,GAAG,CAAC;MACjB,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;MACxB,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;IAC5B;EACF,CAAC;EAED,MAAM,iBAAiB,GAAG,MAAM;IAC9B,IAAI,KAAK,CAAC,kBAAkB,IAAI,OAAO,gBAAgB,KAAK,WAAW,EAAE;IACzE,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,cAAc,CAAC;IACpD,KAAK,CAAC,kBAAkB,GAAG,IAAI,gBAAgB,CAAC,uBAAuB,CAAC;IACxE,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE;MAAE,SAAS,EAAE,IAAI;MAAE,OAAO,EAAE;IAAK,CAAC,CAAC;EAChG,CAAC;EAED,MAAM,IAAI,GAAG,CAAI,IAAqB,EAAE,OAA0B,GAAG,CAAC,CAAC,KAA6B;IAClG,OAAO,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC;EAC5C,CAAC;EAED,MAAM,SAAS,GAAG,CAAI,IAAqB,EAAE,OAA0B,EAAE,SAAiB,KAA6B;IACrH,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;IAC9D,IAAI,OAAO,CAAC,OAAO,EAAE;MACnB;MACA,IAAI,oBAAoB,EAAE,WAAW,CAAC,CAAC;MACvC,IAAI,SAAS,EAAE,OAAO,SAAS,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACjF;IACA;IACA,IAAI,SAAS,KAAK,SAAS,EAAE,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;IAC9D,MAAM,MAAM,GAAG,mBAAmB,CAAC,CAAC;IACpC,MAAM,CAAC,CAAC;IACR,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACvD,IAAI,WAAW,EAAE,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;IAC7D,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa;IAE5C,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,mBAAmB;IACpE,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,mBAAmB;IACpE,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,aAAa;IAC1D,MAAM,CAAC,SAAS,GAAG,cAAc;IAEjC,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC/C,SAAS,CAAC,SAAS,GAAG,OAAO,CAAC,gBAAgB,IAAI,qBAAqB;IACvE,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC;IAE7B,MAAM,KAAuB,GAAG;MAC9B,SAAS;MACT,cAAc;MACd,cAAc;MACd,YAAY;MACZ,MAAM,EAAE,aAAa,YAAY,WAAW,GAAG,aAAa,GAAG,SAAS;MACxE,UAAU,EAAE,YAAY,CAAC,aAAa,CAAC;MACvC,SAAS,EAAE,OAAO,CAAC,SAAS;MAC5B,KAAK,EAAE;IACT,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;MACtC,MAAM,KAAK,GAAG,MAAM;QAClB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACxC,IAAI,KAAK,GAAG,CAAC,EAAE;QACf,IAAI,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,KACnD;UACH,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;UAC5B,cAAc,CAAC,KAAK,CAAC;UACrB,KAAK,CAAC,OAAO,GAAG,CAAC;UACjB,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;UACxB,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;QAC5B;MACF,CAAC;MACD,KAAK,CAAC,OAAO,GAAI,KAAK,IAAK;QACzB,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC;QACnD,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;UACpB,OAAO,CAAC,KAAsB,CAAC;UAC/B;QACF;QACA;QACA;QACA,cAAc,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,KAAsB,CAAC,CAAC,CAAC;MACzF,CAAC;MACD,MAAM,UAA0B,GAAI,MAAM,IAAK;QAC7C,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE;QACnD,MAAM,CAAC,MAAM,CAAC;MAChB,CAAC;MAED,IAAI,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC;MACvC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;MACvB,IAAI;QACF,KAAK,CAAC,OAAO,GAAG,MAAM,CACpB,MACE,eAAe,CAAC,mBAAmB,EAAE;UACnC,OAAO,EAAE,MACP,IAAI,CAAC,UAAU,EAAE;YACf,MAAM;YACN,QAAQ,EAAG,KAAK,IAAK;cACnB,KAAK,CAAC,KAAK,GAAG,KAAK;cACnB,iBAAiB,CAAC,KAAK,CAAC;YAC1B,CAAC;YACD,WAAW,EAAG,QAAQ,IAAK;cACzB,IAAI,QAAQ,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;cAChF,KAAK,CAAC,QAAQ,GAAG,QAAQ;cACzB,iBAAiB,CAAC,KAAK,CAAC;YAC1B,CAAC;YACD,cAAc,EAAE,MAAM,cAAc,CAAC,KAAK,CAAC;YAC3C,iBAAiB,EAAG,OAAO,IAAK;cAC9B,KAAK,CAAC,cAAc,GAAG,OAAO;YAChC;UACF,CAAC,CAAC;UACJ,OAAO,EAAE,MAAM,UAAU,CAAC,SAAS,CAAC;UACpC,OAAO,EAAE,MAAM;YACb,KAAK,CAAC,cAAc,GAAG,wBAAwB;YAC/C,SAAS,CAAC,SAAS,GAAG,qBAAqB;YAC3C,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE,MAAM,CAAC,SAAS,GAAG,wBAAwB;UAChG;QACF,CAAC,CAAC,EACJ,SACF,CAAC;QACD,iBAAiB,CAAC,KAAK,CAAC;QACxB,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC;QAClC,mBAAmB,CAAC,MAAM,EAAE,MAAM,KAAK,cAAc,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;QAE7E,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;UAC5B;UACA;UACA;UACA,IAAI,aAAa,YAAY,WAAW,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;UAC9D,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,UAAU,EAAE;YAC1C,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAC/B,MAAM,CAAC,IAAI,CAAC,CAAC;UACpB,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC;UACtC,iBAAiB,CAAC,CAAC;QACrB;QACA,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE;UAAE,IAAI,EAAE;QAAK,CAAC,CAAC;QAChE,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QACpC;QACA;QACA,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa;QACrC,QAAQ,CAAC,MAAM;UACb,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE;UACnD,IAAI,QAAQ,CAAC,aAAa,KAAK,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE;UAClE,yBAAyB,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC,CAAC;MACJ,CAAC,CAAC,OAAO,KAAK,EAAE;QACd,KAAK,CAAC,OAAO,GAAG,SAAS;QACzB,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC;QACpE,MAAM,CAAC,KAAK,CAAC;MACf;IACF,CAAC,CAAC;EACJ,CAAC;EAED,MAAM,KAA0B,GAAI,MAAM,IAAK;IAC7C,IAAI,KAAK,GAAG,IAAI;IAChB,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;MAC7B,MAAM,CAAC,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;MAClC,KAAK,GAAG,KAAK;IACf;EACF,CAAC;EAED,OAAO;IACL,IAAI;IACJ,KAAK;IACL,MAAM,EAAE,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;IACpC,WAAW;IACX;EACF,CAAC;AACH,CAAC;AAED,MAAM;EAAE,WAAW;EAAE,cAAc;EAAE,GAAG;AAAiB,CAAC,GAAG,gBAAgB,CAAC,CAAC;AAC/E,OAAO,MAAM,UAAsB,GAAG,gBAAgB;;AAEtD;AACA;AACA;AACA;AACA;AACA,OAAO,MAAM,iBAAiB,GAAG,WAAW;AAC5C;AACA,OAAO,MAAM,oBAAoB,GAAG,cAAc","ignoreList":[]}
@@ -4,6 +4,7 @@ export { createHoverPreview, HoverPreview } from "./HoverPreview";
4
4
  export { default as InlineGuidance } from "./InlineGuidance";
5
5
  export { default as InstallGuide } from "./InstallGuide";
6
6
  export { createInstallPrompt, installationPlatform } from "./install";
7
+ export { MovedHint } from "./MovedHint";
7
8
  export { createFormState, DialogHeader, prompts } from "./prompts";
8
9
  export { Tooltip } from "./Tooltip";
9
10
  export { syncThemeColor } from "./theme-color";
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["feedback/index.ts"],"sourcesContent":["export type { AnnounceOptions, AnnouncePoliteness } from \"./announce\";\nexport { announce } from \"./announce\";\nexport type { DialogClose, DialogCore, DialogRender, OpenDialogOptions } from \"./dialog-core\";\nexport { dialogCore } from \"./dialog-core\";\nexport type { HoverPreviewController, HoverPreviewOptions, HoverPreviewPlacement, HoverPreviewProps } from \"./HoverPreview\";\nexport { createHoverPreview, HoverPreview } from \"./HoverPreview\";\nexport type { InlineGuidanceProps } from \"./InlineGuidance\";\nexport { default as InlineGuidance } from \"./InlineGuidance\";\nexport type { InstallGuideProps } from \"./InstallGuide\";\nexport { default as InstallGuide } from \"./InstallGuide\";\nexport type { InstallationPlatform, InstallPrompt } from \"./install\";\nexport { createInstallPrompt, installationPlatform } from \"./install\";\nexport type {\n ConfirmOptions,\n DialogOptions,\n FieldSchema,\n PromptFieldBase,\n PromptSearchInput,\n PromptSearchItem,\n PromptSearchOptions,\n} from \"./prompts\";\nexport { createFormState, DialogHeader, prompts } from \"./prompts\";\nexport type { TooltipAnchorProps, TooltipPlacement, TooltipProps, TooltipTriggerProps } from \"./Tooltip\";\nexport { Tooltip } from \"./Tooltip\";\nexport { syncThemeColor } from \"./theme-color\";\nexport type { ToastAction, ToastFn, ToastHandle, ToastOptions, ToastSlot, ToastVariant } from \"./toast\";\nexport { isPointInsideToast, toast } from \"./toast\";\n"],"mappings":"AACA,SAAS,QAAQ,QAAQ,YAAY;AAErC,SAAS,UAAU,QAAQ,eAAe;AAE1C,SAAS,kBAAkB,EAAE,YAAY,QAAQ,gBAAgB;AAEjE,SAAS,OAAO,IAAI,cAAc,QAAQ,kBAAkB;AAE5D,SAAS,OAAO,IAAI,YAAY,QAAQ,gBAAgB;AAExD,SAAS,mBAAmB,EAAE,oBAAoB,QAAQ,WAAW;AAUrE,SAAS,eAAe,EAAE,YAAY,EAAE,OAAO,QAAQ,WAAW;AAElE,SAAS,OAAO,QAAQ,WAAW;AACnC,SAAS,cAAc,QAAQ,eAAe;AAE9C,SAAS,kBAAkB,EAAE,KAAK,QAAQ,SAAS","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["feedback/index.ts"],"sourcesContent":["export type { AnnounceOptions, AnnouncePoliteness } from \"./announce\";\nexport { announce } from \"./announce\";\nexport type { DialogClose, DialogCore, DialogRender, OpenDialogOptions } from \"./dialog-core\";\nexport { dialogCore } from \"./dialog-core\";\nexport type { HoverPreviewController, HoverPreviewOptions, HoverPreviewPlacement, HoverPreviewProps } from \"./HoverPreview\";\nexport { createHoverPreview, HoverPreview } from \"./HoverPreview\";\nexport type { InlineGuidanceProps } from \"./InlineGuidance\";\nexport { default as InlineGuidance } from \"./InlineGuidance\";\nexport type { InstallGuideProps } from \"./InstallGuide\";\nexport { default as InstallGuide } from \"./InstallGuide\";\nexport type { InstallationPlatform, InstallPrompt } from \"./install\";\nexport { createInstallPrompt, installationPlatform } from \"./install\";\nexport type { MovedHintAction, MovedHintProps } from \"./MovedHint\";\nexport { MovedHint } from \"./MovedHint\";\nexport type {\n ConfirmOptions,\n DialogOptions,\n FieldSchema,\n PromptFieldBase,\n PromptSearchInput,\n PromptSearchItem,\n PromptSearchOptions,\n} from \"./prompts\";\nexport { createFormState, DialogHeader, prompts } from \"./prompts\";\nexport type { TooltipAnchorProps, TooltipPlacement, TooltipProps, TooltipTriggerProps } from \"./Tooltip\";\nexport { Tooltip } from \"./Tooltip\";\nexport { syncThemeColor } from \"./theme-color\";\nexport type { ToastAction, ToastFn, ToastHandle, ToastOptions, ToastSlot, ToastVariant } from \"./toast\";\nexport { isPointInsideToast, toast } from \"./toast\";\n"],"mappings":"AACA,SAAS,QAAQ,QAAQ,YAAY;AAErC,SAAS,UAAU,QAAQ,eAAe;AAE1C,SAAS,kBAAkB,EAAE,YAAY,QAAQ,gBAAgB;AAEjE,SAAS,OAAO,IAAI,cAAc,QAAQ,kBAAkB;AAE5D,SAAS,OAAO,IAAI,YAAY,QAAQ,gBAAgB;AAExD,SAAS,mBAAmB,EAAE,oBAAoB,QAAQ,WAAW;AAErE,SAAS,SAAS,QAAQ,aAAa;AAUvC,SAAS,eAAe,EAAE,YAAY,EAAE,OAAO,QAAQ,WAAW;AAElE,SAAS,OAAO,QAAQ,WAAW;AACnC,SAAS,cAAc,QAAQ,eAAe;AAE9C,SAAS,kBAAkB,EAAE,KAAK,QAAQ,SAAS","ignoreList":[]}
@@ -1,4 +1,5 @@
1
1
  import { ssrStyleProperty as _$ssrStyleProperty } from "solid-js/web";
2
+ import { mergeProps as _$mergeProps } from "solid-js/web";
2
3
  import { memo as _$memo } from "solid-js/web";
3
4
  import { ssr as _$ssr } from "solid-js/web";
4
5
  import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
@@ -354,7 +355,11 @@ const PromptControl = props => {
354
355
  onValueChange: value => props.update(value ?? ""),
355
356
  clearable: true
356
357
  };
357
- return props.field.dateOnly ? _$createComponent(DatePicker, pickerProps) : _$createComponent(DateTimePicker, pickerProps);
358
+ return props.field.dateOnly ? _$createComponent(DatePicker, pickerProps) : _$createComponent(DateTimePicker, _$mergeProps(pickerProps, {
359
+ get optionalTime() {
360
+ return props.field.optionalTime;
361
+ }
362
+ }));
358
363
  }
359
364
  }
360
365
  };