@k2b/ui 0.11.0 → 0.13.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 (139) hide show
  1. package/README.md +1 -1
  2. package/dist/browser/content/FileView.js +203 -136
  3. package/dist/browser/content/FileView.js.map +1 -1
  4. package/dist/browser/content/PdfPreview.js +5 -2
  5. package/dist/browser/content/PdfPreview.js.map +1 -1
  6. package/dist/browser/content/markdown-title.js +52 -0
  7. package/dist/browser/content/markdown-title.js.map +1 -0
  8. package/dist/browser/feedback/InstallGuide.js +267 -0
  9. package/dist/browser/feedback/InstallGuide.js.map +1 -0
  10. package/dist/browser/feedback/announce.js +50 -0
  11. package/dist/browser/feedback/announce.js.map +1 -0
  12. package/dist/browser/feedback/dialog-core.js +82 -1
  13. package/dist/browser/feedback/dialog-core.js.map +1 -1
  14. package/dist/browser/feedback/index.js +4 -0
  15. package/dist/browser/feedback/index.js.map +1 -1
  16. package/dist/browser/feedback/install.js +99 -0
  17. package/dist/browser/feedback/install.js.map +1 -0
  18. package/dist/browser/feedback/prompts.js +29 -20
  19. package/dist/browser/feedback/prompts.js.map +1 -1
  20. package/dist/browser/feedback/theme-color.js +15 -0
  21. package/dist/browser/feedback/theme-color.js.map +1 -0
  22. package/dist/browser/feedback/toast.js +329 -122
  23. package/dist/browser/feedback/toast.js.map +1 -1
  24. package/dist/browser/inputs/DatePicker.js +263 -222
  25. package/dist/browser/inputs/DatePicker.js.map +1 -1
  26. package/dist/browser/inputs/MultiSelectInput.js +139 -105
  27. package/dist/browser/inputs/MultiSelectInput.js.map +1 -1
  28. package/dist/browser/inputs/NumberInput.js +209 -122
  29. package/dist/browser/inputs/NumberInput.js.map +1 -1
  30. package/dist/browser/inputs/QrScanner.js +164 -0
  31. package/dist/browser/inputs/QrScanner.js.map +1 -0
  32. package/dist/browser/inputs/Select.js +184 -92
  33. package/dist/browser/inputs/Select.js.map +1 -1
  34. package/dist/browser/inputs/index.js +1 -0
  35. package/dist/browser/inputs/index.js.map +1 -1
  36. package/dist/browser/intl/messages.js +90 -2
  37. package/dist/browser/intl/messages.js.map +1 -1
  38. package/dist/browser/layout/DetailPanel.js +2 -1
  39. package/dist/browser/layout/DetailPanel.js.map +1 -1
  40. package/dist/browser/layout/Discussion.js +2 -1
  41. package/dist/browser/layout/Discussion.js.map +1 -1
  42. package/dist/browser/layout/MobileShell.js +242 -0
  43. package/dist/browser/layout/MobileShell.js.map +1 -0
  44. package/dist/browser/layout/Navigation.js +1 -0
  45. package/dist/browser/layout/Navigation.js.map +1 -1
  46. package/dist/browser/layout/PanelDialog.js +1 -0
  47. package/dist/browser/layout/PanelDialog.js.map +1 -1
  48. package/dist/browser/layout/Settings.js +2 -2
  49. package/dist/browser/layout/Settings.js.map +1 -1
  50. package/dist/browser/layout/TabBar.js +65 -0
  51. package/dist/browser/layout/TabBar.js.map +1 -0
  52. package/dist/browser/layout/index.js +2 -0
  53. package/dist/browser/layout/index.js.map +1 -1
  54. package/dist/browser/surfaces/NoticeCard.js +55 -60
  55. package/dist/browser/surfaces/NoticeCard.js.map +1 -1
  56. package/dist/browser/surfaces/index.js +1 -1
  57. package/dist/browser/surfaces/index.js.map +1 -1
  58. package/dist/ssr/content/FileView.js +141 -81
  59. package/dist/ssr/content/FileView.js.map +1 -1
  60. package/dist/ssr/content/PdfPreview.js +4 -2
  61. package/dist/ssr/content/PdfPreview.js.map +1 -1
  62. package/dist/ssr/content/markdown-title.js +52 -0
  63. package/dist/ssr/content/markdown-title.js.map +1 -0
  64. package/dist/ssr/feedback/InstallGuide.js +201 -0
  65. package/dist/ssr/feedback/InstallGuide.js.map +1 -0
  66. package/dist/ssr/feedback/announce.js +50 -0
  67. package/dist/ssr/feedback/announce.js.map +1 -0
  68. package/dist/ssr/feedback/dialog-core.js +82 -1
  69. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  70. package/dist/ssr/feedback/index.js +4 -0
  71. package/dist/ssr/feedback/index.js.map +1 -1
  72. package/dist/ssr/feedback/install.js +99 -0
  73. package/dist/ssr/feedback/install.js.map +1 -0
  74. package/dist/ssr/feedback/prompts.js +12 -2
  75. package/dist/ssr/feedback/prompts.js.map +1 -1
  76. package/dist/ssr/feedback/theme-color.js +15 -0
  77. package/dist/ssr/feedback/theme-color.js.map +1 -0
  78. package/dist/ssr/feedback/toast.js +329 -122
  79. package/dist/ssr/feedback/toast.js.map +1 -1
  80. package/dist/ssr/inputs/DatePicker.js +78 -52
  81. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  82. package/dist/ssr/inputs/MultiSelectInput.js +52 -32
  83. package/dist/ssr/inputs/MultiSelectInput.js.map +1 -1
  84. package/dist/ssr/inputs/NumberInput.js +93 -40
  85. package/dist/ssr/inputs/NumberInput.js.map +1 -1
  86. package/dist/ssr/inputs/QrScanner.js +128 -0
  87. package/dist/ssr/inputs/QrScanner.js.map +1 -0
  88. package/dist/ssr/inputs/Select.js +108 -29
  89. package/dist/ssr/inputs/Select.js.map +1 -1
  90. package/dist/ssr/inputs/index.js +1 -0
  91. package/dist/ssr/inputs/index.js.map +1 -1
  92. package/dist/ssr/intl/messages.js +90 -2
  93. package/dist/ssr/intl/messages.js.map +1 -1
  94. package/dist/ssr/layout/DetailPanel.js +2 -1
  95. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  96. package/dist/ssr/layout/Discussion.js +2 -1
  97. package/dist/ssr/layout/Discussion.js.map +1 -1
  98. package/dist/ssr/layout/MobileShell.js +211 -0
  99. package/dist/ssr/layout/MobileShell.js.map +1 -0
  100. package/dist/ssr/layout/Navigation.js +1 -0
  101. package/dist/ssr/layout/Navigation.js.map +1 -1
  102. package/dist/ssr/layout/PanelDialog.js +1 -0
  103. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  104. package/dist/ssr/layout/Settings.js +2 -2
  105. package/dist/ssr/layout/Settings.js.map +1 -1
  106. package/dist/ssr/layout/TabBar.js +24 -0
  107. package/dist/ssr/layout/TabBar.js.map +1 -0
  108. package/dist/ssr/layout/index.js +2 -0
  109. package/dist/ssr/layout/index.js.map +1 -1
  110. package/dist/ssr/surfaces/NoticeCard.js +21 -30
  111. package/dist/ssr/surfaces/NoticeCard.js.map +1 -1
  112. package/dist/ssr/surfaces/index.js +1 -1
  113. package/dist/ssr/surfaces/index.js.map +1 -1
  114. package/dist/styles.css +1 -1
  115. package/dist/tabler.css +1 -1
  116. package/dist/types/content/FileView.d.ts +11 -1
  117. package/dist/types/content/markdown-title.d.ts +9 -0
  118. package/dist/types/feedback/InstallGuide.d.ts +26 -0
  119. package/dist/types/feedback/announce.d.ts +19 -0
  120. package/dist/types/feedback/dialog-core.d.ts +5 -0
  121. package/dist/types/feedback/index.d.ts +8 -1
  122. package/dist/types/feedback/install.d.ts +32 -0
  123. package/dist/types/feedback/prompts.d.ts +2 -0
  124. package/dist/types/feedback/theme-color.d.ts +6 -0
  125. package/dist/types/feedback/toast.d.ts +7 -0
  126. package/dist/types/inputs/DatePicker.d.ts +11 -2
  127. package/dist/types/inputs/MultiSelectInput.d.ts +5 -1
  128. package/dist/types/inputs/NumberInput.d.ts +14 -0
  129. package/dist/types/inputs/QrScanner.d.ts +20 -0
  130. package/dist/types/inputs/Select.d.ts +10 -0
  131. package/dist/types/inputs/index.d.ts +3 -1
  132. package/dist/types/intl/messages.d.ts +44 -0
  133. package/dist/types/layout/MobileShell.d.ts +40 -0
  134. package/dist/types/layout/Settings.d.ts +2 -2
  135. package/dist/types/layout/TabBar.d.ts +23 -0
  136. package/dist/types/layout/index.d.ts +4 -0
  137. package/dist/types/surfaces/NoticeCard.d.ts +4 -4
  138. package/dist/types/surfaces/index.d.ts +1 -1
  139. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["feedback/toast.ts"],"sourcesContent":["import { getK2bPortalRoot } from \"../internal/portal\";\nimport { resolveUiMessages } from \"../intl/messages\";\n\nexport type ToastVariant = \"default\" | \"success\" | \"error\";\n\nexport type ToastAction = {\n label: string;\n} & ({ href: string } | { onClick: () => void });\n\nexport type ToastOptions = {\n variant?: ToastVariant;\n duration?: number;\n iconClass?: string;\n title?: string;\n action?: ToastAction | null;\n /** Fraction from 0 to 1, or an indeterminate activity indicator. null removes it. */\n progress?: number | \"indeterminate\" | null;\n dismissLabel?: string;\n};\n\nexport type ToastHandle = {\n dismiss: () => void;\n update: (description: string, options?: ToastOptions) => void;\n};\n\nexport interface ToastFn {\n (description: string, options?: ToastOptions): ToastHandle;\n success: (description: string, options?: Omit<ToastOptions, \"variant\">) => ToastHandle;\n error: (description: string, options?: Omit<ToastOptions, \"variant\">) => ToastHandle;\n dismissAll: () => void;\n}\n\nconst DEFAULT_DURATION_MS = 3000;\nconst MAX_VISIBLE_TOASTS = 5;\nconst ANIMATION_MS = 200;\nexport const K2B_TOAST_CONTAINER_ID = \"k2b-ui-toast-container\";\nconst CONTAINER_ATTRIBUTE = \"data-k2b-toast-container\";\n\ntype VariantStyle = {\n tone: \"info\" | \"success\" | \"danger\";\n iconClass: string;\n titleKey: \"info\" | \"success\" | \"error\";\n};\n\nconst VARIANT_STYLES: Record<ToastVariant, VariantStyle> = {\n default: {\n tone: \"info\",\n iconClass: \"ti-info-circle\",\n titleKey: \"info\",\n },\n success: {\n tone: \"success\",\n iconClass: \"ti-check\",\n titleKey: \"success\",\n },\n error: {\n tone: \"danger\",\n iconClass: \"ti-x\",\n titleKey: \"error\",\n },\n};\n\n/** Default titles follow the document locale, like the other imperative `@k2b/ui` surfaces. */\nconst defaultTitle = (variant: ToastVariant): string => resolveUiMessages()[VARIANT_STYLES[variant].titleKey];\n\nconst normalizedIconClass = (iconClass: string): string => {\n const tokens = iconClass\n .split(/\\s+/)\n .filter(Boolean)\n .filter((token) => token !== \"ti\");\n return [\"ti\", ...tokens].join(\" \");\n};\n\nconst applyIconClass = (icon: HTMLElement, iconClass: string): void => {\n icon.className = normalizedIconClass(iconClass);\n};\n\nconst applyLiveRegion = (element: HTMLElement, variant: ToastVariant): void => {\n const isError = variant === \"error\";\n element.setAttribute(\"role\", isError ? \"alert\" : \"status\");\n element.setAttribute(\"aria-live\", isError ? \"assertive\" : \"polite\");\n element.setAttribute(\"aria-atomic\", \"true\");\n};\n\nconst liveToasts = new Set<ToastHandle>();\n\nconst ensureContainer = (): HTMLElement | null => {\n if (typeof document === \"undefined\") return null;\n const root = getK2bPortalRoot();\n let container = root.querySelector<HTMLElement>(`[${CONTAINER_ATTRIBUTE}]`);\n if (container) return container;\n\n container = document.createElement(\"div\");\n container.id = K2B_TOAST_CONTAINER_ID;\n container.setAttribute(CONTAINER_ATTRIBUTE, \"\");\n container.setAttribute(\"popover\", \"manual\");\n // Keep the source rail geometry inline: it must defeat UA popover defaults\n // even when a consumer has not loaded the optional package stylesheet yet.\n // The stylesheet only moves the rail to the top edge on narrow viewports\n // through the two edge variables.\n container.style.cssText =\n \"position:fixed;left:auto;right:env(safe-area-inset-right,0px);\" +\n \"top:var(--k2b-toast-rail-top,auto);bottom:var(--k2b-toast-rail-bottom,env(safe-area-inset-bottom,0px));\" +\n \"z-index:50;box-sizing:border-box;display:flex;flex-direction:column;gap:0.5rem;\" +\n \"width:min(22rem,calc(100vw - env(safe-area-inset-left,0px) - env(safe-area-inset-right,0px)));\" +\n \"height:auto;max-width:100vw;\" +\n \"max-height:calc(100dvh - env(safe-area-inset-top,0px) - env(safe-area-inset-bottom,0px));\" +\n \"margin:0;padding:1rem;border:0;background:transparent;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;\" +\n \"pointer-events:none;\";\n root.appendChild(container);\n return container;\n};\n\nconst promoteToTopLayer = (container: HTMLElement): HTMLElement => {\n if (typeof container.showPopover !== \"function\" || !container.isConnected) return container;\n let active = container;\n try {\n if (container.matches(\":popover-open\") || document.querySelector(\"dialog:modal\")) {\n const next = container.cloneNode(false) as HTMLElement;\n while (container.firstChild) next.appendChild(container.firstChild);\n const root = container.parentElement ?? getK2bPortalRoot();\n container.remove();\n root.appendChild(next);\n active = next;\n }\n if (!active.matches(\":popover-open\")) active.showPopover();\n } catch {\n active.removeAttribute(\"popover\");\n }\n return active;\n};\n\n/** Close every empty rail so an emptied container does not linger in the top\n * layer. Rails are resolved at call time on purpose: `promoteToTopLayer`\n * swaps the element for a fresh clone, so a container captured when the toast\n * was created can already be detached by the time the toast is dismissed. */\nconst hideEmptyContainers = (): void => {\n if (typeof document === \"undefined\") return;\n for (const container of Array.from(document.querySelectorAll<HTMLElement>(`[${CONTAINER_ATTRIBUTE}]`))) {\n if (container.childElementCount > 0 || typeof container.hidePopover !== \"function\") continue;\n try {\n if (container.matches(\":popover-open\")) container.hidePopover();\n } catch {\n // Already hidden or disconnected.\n }\n }\n};\n\nconst renderLead = (lead: HTMLElement, variant: ToastVariant, iconClassOverride?: string): HTMLElement => {\n const style = VARIANT_STYLES[variant];\n lead.replaceChildren();\n lead.className = \"k2b-toast__icon\";\n lead.dataset.tone = style.tone;\n const icon = document.createElement(\"i\");\n applyIconClass(icon, iconClassOverride ?? style.iconClass);\n icon.setAttribute(\"aria-hidden\", \"true\");\n lead.appendChild(icon);\n return icon;\n};\n\nconst showToast = (description: string, options?: ToastOptions): ToastHandle => {\n const initialContainer = ensureContainer();\n if (!initialContainer) {\n const noop = () => {};\n return { dismiss: noop, update: noop };\n }\n\n let dismissed = false;\n let dismissTimer: ReturnType<typeof setTimeout> | null = null;\n let currentVariant: ToastVariant = options?.variant ?? \"default\";\n let currentProgress = options?.progress ?? null;\n let currentDuration = options?.duration ?? DEFAULT_DURATION_MS;\n let remainingDuration = currentDuration;\n let timerStartedAt = 0;\n let pausedByPointer = false;\n let pausedByFocus = false;\n\n const toastElement = document.createElement(\"div\");\n toastElement.className = \"k2b-toast\";\n toastElement.dataset.tone = VARIANT_STYLES[currentVariant].tone;\n toastElement.dataset.k2bToast = \"\";\n\n const leadElement = document.createElement(\"div\");\n let leadIconElement = renderLead(leadElement, currentVariant, options?.iconClass);\n\n const contentElement = document.createElement(\"div\");\n contentElement.className = \"k2b-toast__content\";\n applyLiveRegion(contentElement, currentVariant);\n\n const titleElement = document.createElement(\"div\");\n titleElement.className = \"k2b-toast__title\";\n titleElement.textContent = options?.title ?? defaultTitle(currentVariant);\n const descriptionElement = document.createElement(\"div\");\n descriptionElement.className = \"k2b-toast__description\";\n descriptionElement.textContent = description;\n contentElement.append(titleElement, descriptionElement);\n\n const closeButton = document.createElement(\"button\");\n closeButton.type = \"button\";\n closeButton.className = \"k2b-toast__close\";\n closeButton.setAttribute(\"aria-label\", options?.dismissLabel ?? resolveUiMessages().dismissNotification);\n const closeIcon = document.createElement(\"i\");\n closeIcon.className = \"ti ti-x\";\n closeIcon.setAttribute(\"aria-hidden\", \"true\");\n closeButton.appendChild(closeIcon);\n\n toastElement.append(leadElement, contentElement, closeButton);\n\n const clearDismissTimer = () => {\n if (dismissTimer === null) return;\n clearTimeout(dismissTimer);\n dismissTimer = null;\n };\n\n const pauseDismissTimer = () => {\n if (dismissTimer === null) return;\n remainingDuration = Math.max(0, remainingDuration - (Date.now() - timerStartedAt));\n clearDismissTimer();\n };\n\n const resumeDismissTimer = () => {\n if (dismissed || currentProgress !== null || currentDuration === 0 || remainingDuration <= 0 || pausedByPointer || pausedByFocus)\n return;\n clearDismissTimer();\n timerStartedAt = Date.now();\n dismissTimer = setTimeout(() => dismiss(), remainingDuration);\n };\n\n const resetDismissTimer = (duration: number) => {\n clearDismissTimer();\n currentDuration = duration;\n remainingDuration = duration;\n resumeDismissTimer();\n };\n\n const dismiss = () => {\n if (dismissed) return;\n dismissed = true;\n clearDismissTimer();\n liveToasts.delete(handle);\n toastElement.dataset.closing = \"true\";\n setTimeout(() => {\n toastElement.remove();\n hideEmptyContainers();\n }, ANIMATION_MS);\n };\n\n const progressElement = document.createElement(\"progress\");\n progressElement.className = \"k2b-toast__progress\";\n progressElement.max = 1;\n const renderProgress = () => {\n progressElement.hidden = currentProgress === null;\n progressElement.setAttribute(\"aria-label\", titleElement.textContent || descriptionElement.textContent || \"\");\n if (typeof currentProgress === \"number\")\n progressElement.value = Number.isFinite(currentProgress) ? Math.max(0, Math.min(1, currentProgress)) : 0;\n else progressElement.removeAttribute(\"value\");\n };\n contentElement.append(progressElement);\n renderProgress();\n let actionElement: HTMLAnchorElement | HTMLButtonElement | null = null;\n const renderAction = (action: ToastAction | null | undefined) => {\n actionElement?.remove();\n actionElement = null;\n if (!action) return;\n if (\"href\" in action) {\n const link = document.createElement(\"a\");\n link.href = action.href;\n actionElement = link;\n } else {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n actionElement = button;\n }\n actionElement.className = \"k2b-toast__action\";\n actionElement.textContent = action.label;\n actionElement.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n if (\"onClick\" in action) action.onClick();\n else dismiss();\n });\n contentElement.appendChild(actionElement);\n };\n renderAction(options?.action);\n\n const update = (nextDescription: string, nextOptions?: ToastOptions) => {\n if (dismissed) return;\n descriptionElement.textContent = nextDescription;\n\n const variantChanged = nextOptions?.variant !== undefined && nextOptions.variant !== currentVariant;\n if (variantChanged) {\n currentVariant = nextOptions.variant!;\n toastElement.dataset.tone = VARIANT_STYLES[currentVariant].tone;\n leadIconElement = renderLead(leadElement, currentVariant, nextOptions.iconClass);\n applyLiveRegion(contentElement, currentVariant);\n } else if (nextOptions?.iconClass !== undefined) {\n applyIconClass(leadIconElement, nextOptions.iconClass);\n }\n\n if (nextOptions && Object.prototype.hasOwnProperty.call(nextOptions, \"title\")) {\n titleElement.textContent = nextOptions.title ?? \"\";\n } else if (variantChanged) {\n titleElement.textContent = defaultTitle(currentVariant);\n }\n if (nextOptions && Object.prototype.hasOwnProperty.call(nextOptions, \"action\")) renderAction(nextOptions.action);\n if (nextOptions && Object.prototype.hasOwnProperty.call(nextOptions, \"duration\")) {\n currentDuration = nextOptions.duration ?? DEFAULT_DURATION_MS;\n }\n if (nextOptions && Object.prototype.hasOwnProperty.call(nextOptions, \"progress\")) currentProgress = nextOptions.progress ?? null;\n if (nextOptions?.dismissLabel) closeButton.setAttribute(\"aria-label\", nextOptions.dismissLabel);\n renderProgress();\n resetDismissTimer(currentDuration);\n };\n\n toastElement.addEventListener(\"click\", () => {\n if (currentProgress === null) dismiss();\n });\n closeButton.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n dismiss();\n });\n toastElement.addEventListener(\"pointerenter\", () => {\n pausedByPointer = true;\n pauseDismissTimer();\n });\n toastElement.addEventListener(\"pointerleave\", () => {\n pausedByPointer = false;\n resumeDismissTimer();\n });\n toastElement.addEventListener(\"focusin\", () => {\n pausedByFocus = true;\n pauseDismissTimer();\n });\n toastElement.addEventListener(\"focusout\", (event) => {\n if (toastElement.contains(event.relatedTarget as Node | null)) return;\n pausedByFocus = false;\n resumeDismissTimer();\n });\n\n const handle: ToastHandle = { dismiss, update };\n liveToasts.add(handle);\n if (liveToasts.size > MAX_VISIBLE_TOASTS) liveToasts.values().next().value?.dismiss();\n promoteToTopLayer(initialContainer).appendChild(toastElement);\n requestAnimationFrame(() => {\n if (!dismissed) toastElement.dataset.open = \"true\";\n });\n resetDismissTimer(currentDuration);\n return handle;\n};\n\nexport const isPointInsideToast = (x: number, y: number): boolean => {\n if (typeof document === \"undefined\") return false;\n const containers = Array.from(document.querySelectorAll<HTMLElement>(`[${CONTAINER_ATTRIBUTE}]`));\n for (const container of containers) {\n for (const child of Array.from(container.children)) {\n const rect = child.getBoundingClientRect();\n if (x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom) return true;\n }\n }\n return false;\n};\n\nconst toastFn = ((description: string, options?: ToastOptions) => showToast(description, options)) as ToastFn;\ntoastFn.success = (description, options) => showToast(description, { ...options, variant: \"success\" });\ntoastFn.error = (description, options) => showToast(description, { ...options, variant: \"error\" });\ntoastFn.dismissAll = () => {\n for (const handle of Array.from(liveToasts)) handle.dismiss();\n};\n\nexport const toast: ToastFn = toastFn;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["feedback/toast.ts"],"sourcesContent":["import { getK2bPortalRoot } from \"../internal/portal\";\nimport { resolveUiMessages } from \"../intl/messages\";\nimport { announce, ensureLiveRegions } from \"./announce\";\n\nexport type ToastVariant = \"default\" | \"success\" | \"error\";\n\nexport type ToastAction = {\n label: string;\n} & ({ href: string } | { onClick: () => void });\n\nexport type ToastOptions = {\n variant?: ToastVariant;\n /** Milliseconds until the toast closes; `0` keeps it until it is closed. Omit it for the default by variant, length, and action. */\n duration?: number;\n iconClass?: string;\n /** A short line of context above the message. There is no default title. */\n title?: string;\n action?: ToastAction | null;\n /** Fraction from 0 to 1, or an indeterminate activity indicator. null removes it. */\n progress?: number | \"indeterminate\" | null;\n dismissLabel?: string;\n};\n\nexport type ToastHandle = {\n dismiss: () => void;\n update: (description: string, options?: ToastOptions) => void;\n};\n\nexport type ToastSlot = {\n dismiss: () => void;\n};\n\nexport interface ToastFn {\n (description: string, options?: ToastOptions): ToastHandle;\n success: (description: string, options?: Omit<ToastOptions, \"variant\">) => ToastHandle;\n error: (description: string, options?: Omit<ToastOptions, \"variant\">) => ToastHandle;\n /** Places an application-owned element in the toast rail, in toast chrome; the caller owns its content and lifetime. */\n custom: (content: HTMLElement) => ToastSlot;\n dismissAll: () => void;\n}\n\n/** Visible toasts on a wide viewport; the rail's narrow layout shows fewer. */\nconst MAX_VISIBLE_TOASTS = 3;\nconst MAX_VISIBLE_TOASTS_NARROW = 2;\n/** The same media query that moves the rail to the top edge in the stylesheet. */\nconst NARROW_RAIL_QUERY = \"(max-width: 47.999rem), (max-height: 29.999rem)\";\nconst ANIMATION_MS = 200;\n/** Reading time: a short message stays 4 s, longer text about 1 s more per 30 characters, up to 12 s. */\nconst READ_BASE_MS = 4_000;\nconst READ_FREE_CHARACTERS = 40;\nconst READ_MS_PER_CHARACTER = 35;\nconst READ_MAX_MS = 12_000;\n/** Errors and toasts with an action stay long enough to reach them with a keyboard or a screen magnifier. */\nconst REACHABLE_MS = 8_000;\n/** An error longer than this stays until it is closed, so it can be read and copied. */\nconst STICKY_ERROR_CHARACTERS = 120;\nexport const K2B_TOAST_CONTAINER_ID = \"k2b-ui-toast-container\";\nconst CONTAINER_ATTRIBUTE = \"data-k2b-toast-container\";\n\ntype VariantStyle = {\n tone: \"info\" | \"success\" | \"danger\";\n iconClass: string;\n};\n\nconst VARIANT_STYLES: Record<ToastVariant, VariantStyle> = {\n default: { tone: \"info\", iconClass: \"ti-info-circle\" },\n success: { tone: \"success\", iconClass: \"ti-circle-check\" },\n error: { tone: \"danger\", iconClass: \"ti-alert-circle\" },\n};\n\n/** How long a toast stays when the caller passes no duration. */\nconst defaultDuration = (variant: ToastVariant, text: string, hasAction: boolean): number => {\n if (variant === \"error\" && text.length > STICKY_ERROR_CHARACTERS) return 0;\n const reading = Math.min(READ_MAX_MS, READ_BASE_MS + Math.max(0, text.length - READ_FREE_CHARACTERS) * READ_MS_PER_CHARACTER);\n return variant === \"error\" || hasAction ? Math.max(REACHABLE_MS, reading) : reading;\n};\n\nconst normalizedIconClass = (iconClass: string): string => {\n const tokens = iconClass\n .split(/\\s+/)\n .filter(Boolean)\n .filter((token) => token !== \"ti\");\n return [\"ti\", ...tokens].join(\" \");\n};\n\nconst applyIconClass = (icon: HTMLElement, iconClass: string): void => {\n icon.className = normalizedIconClass(iconClass);\n};\n\ntype LiveToast = {\n dismiss: () => void;\n /** Errors, sticky toasts, and running progress stay when the rail is full; older timed confirmations leave first. */\n keep: () => boolean;\n progress: () => boolean;\n /** Under the pointer or holding keyboard focus: the rail limit never removes it. */\n held: () => boolean;\n pause: () => void;\n resume: () => void;\n};\n\nconst liveToasts = new Set<LiveToast>();\n\n/**\n * Cards under the pointer or holding keyboard focus. While the rail holds any, no toast times out, so nothing moves\n * under the pointer or out from under focus because a neighbour expired.\n */\nconst pointerHolds = new Set<HTMLElement>();\nconst focusHolds = new Set<HTMLElement>();\nconst railHeld = (): boolean => pointerHolds.size + focusHolds.size > 0;\n\n/**\n * Firefox and WebKit fire no focusout when a focused element leaves the document, and WebKit no pointerleave when\n * the hovered element inside a card is removed, as when custom content replaces a button or the rail's scope\n * unmounts. While anything holds the rail, a change to the document or the pointer moving onto something else\n * drops the holds that no longer apply, so one stale hold never freezes the rail.\n */\nconst releaseStaleHolds = (pointerTarget?: Node | null): void => {\n for (const card of Array.from(pointerHolds))\n if (!card.isConnected || (pointerTarget !== undefined && !card.contains(pointerTarget))) setHold(pointerHolds, card, false);\n for (const card of Array.from(focusHolds))\n if (!card.isConnected || !card.contains(card.ownerDocument.activeElement)) setHold(focusHolds, card, false);\n};\n\nconst watchStaleHolds = (doc: Document): (() => void) => {\n const observer = new MutationObserver(() => releaseStaleHolds());\n observer.observe(doc, { childList: true, subtree: true });\n const onPointerOver = (event: Event) => releaseStaleHolds(event.target instanceof Node ? event.target : null);\n doc.addEventListener(\"pointerover\", onPointerOver, true);\n return () => {\n observer.disconnect();\n doc.removeEventListener(\"pointerover\", onPointerOver, true);\n };\n};\nlet unwatchStaleHolds: (() => void) | null = null;\n\nfunction setHold(holds: Set<HTMLElement>, card: HTMLElement, held: boolean): void {\n const wasHeld = railHeld();\n if (held) holds.add(card);\n else holds.delete(card);\n if (railHeld() !== wasHeld) {\n for (const item of Array.from(liveToasts)) (wasHeld ? item.resume : item.pause)();\n unwatchStaleHolds?.();\n unwatchStaleHolds = wasHeld ? null : watchStaleHolds(card.ownerDocument);\n }\n // A released card may be the one the rail limit had to wait for.\n if (!held) enforceCap();\n}\n\nconst ensureContainer = (): HTMLElement | null => {\n if (typeof document === \"undefined\") return null;\n // The shared live regions exist before the first toast's text arrives.\n ensureLiveRegions(document);\n const root = getK2bPortalRoot();\n let container = root.querySelector<HTMLElement>(`[${CONTAINER_ATTRIBUTE}]`);\n if (container) return container;\n\n container = document.createElement(\"div\");\n container.id = K2B_TOAST_CONTAINER_ID;\n container.setAttribute(CONTAINER_ATTRIBUTE, \"\");\n container.setAttribute(\"popover\", \"manual\");\n container.setAttribute(\"role\", \"region\");\n container.setAttribute(\"aria-label\", resolveUiMessages().notifications);\n // Keep the source rail geometry inline: it must defeat UA popover defaults\n // even when a consumer has not loaded the optional package stylesheet yet.\n // The stylesheet only moves the rail to the top edge, and to the full width\n // of a phone, through the rail variables.\n container.style.cssText =\n \"position:fixed;left:var(--k2b-toast-rail-left,auto);right:env(safe-area-inset-right,0px);\" +\n \"top:var(--k2b-toast-rail-top,auto);bottom:var(--k2b-toast-rail-bottom,env(safe-area-inset-bottom,0px));\" +\n \"z-index:50;box-sizing:border-box;display:flex;flex-direction:var(--k2b-toast-rail-direction,column);\" +\n \"width:var(--k2b-toast-rail-width,min(24rem,calc(100vw - env(safe-area-inset-left,0px) - env(safe-area-inset-right,0px))));\" +\n \"height:auto;max-width:100vw;\" +\n \"max-height:calc(100dvh - env(safe-area-inset-top,0px) - var(--k2b-toast-offset-top,0px) - env(safe-area-inset-bottom,0px));\" +\n \"margin:0;padding:var(--k2b-toast-rail-padding,0.75rem 1rem);border:0;background:transparent;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;\" +\n \"pointer-events:none;\";\n root.appendChild(container);\n return container;\n};\n\n/** Moving nodes resets their scroll offsets and drops focus; a custom slot can hold a scrolled list or a focused control. */\nconst captureViewState = (container: HTMLElement) => {\n const focused =\n document.activeElement instanceof HTMLElement && container.contains(document.activeElement) ? document.activeElement : null;\n const scrolled = Array.from(container.querySelectorAll<HTMLElement>(\"*\"))\n .filter((element) => element.scrollTop || element.scrollLeft)\n .map((element) => [element, element.scrollTop, element.scrollLeft] as const);\n const railTop = container.scrollTop;\n return (rail: HTMLElement) => {\n rail.scrollTop = railTop;\n for (const [element, top, left] of scrolled) {\n element.scrollTop = top;\n element.scrollLeft = left;\n }\n if (focused?.isConnected && rail.contains(focused)) focused.focus({ preventScroll: true });\n };\n};\n\nconst promoteToTopLayer = (container: HTMLElement): HTMLElement => {\n if (typeof container.showPopover !== \"function\" || !container.isConnected) return container;\n let active = container;\n let restore: ((rail: HTMLElement) => void) | null = null;\n try {\n if (container.matches(\":popover-open\") || document.querySelector(\"dialog:modal\")) {\n restore = captureViewState(container);\n const next = container.cloneNode(false) as HTMLElement;\n while (container.firstChild) next.appendChild(container.firstChild);\n const root = container.parentElement ?? getK2bPortalRoot();\n container.remove();\n root.appendChild(next);\n active = next;\n }\n if (!active.matches(\":popover-open\")) active.showPopover();\n } catch {\n active.removeAttribute(\"popover\");\n }\n // Offsets apply only once the rail is rendered again, so after it is shown.\n restore?.(active);\n return active;\n};\n\n/** Close every empty rail so an emptied container does not linger in the top\n * layer. Rails are resolved at call time on purpose: `promoteToTopLayer`\n * swaps the element for a fresh clone, so a container captured when the toast\n * was created can already be detached by the time the toast is dismissed. */\nconst hideEmptyContainers = (): void => {\n if (typeof document === \"undefined\") return;\n for (const container of Array.from(document.querySelectorAll<HTMLElement>(`[${CONTAINER_ATTRIBUTE}]`))) {\n if (container.childElementCount > 0 || typeof container.hidePopover !== \"function\") continue;\n try {\n if (container.matches(\":popover-open\")) container.hidePopover();\n } catch {\n // Already hidden or disconnected.\n }\n }\n};\n\n/**\n * Every toast and custom slot sits in a slot that grows from and collapses to zero height, so its neighbours glide\n * instead of jumping when it arrives or leaves. The card carries the chrome and `data-open` / `data-closing`.\n */\ntype RailItem = {\n slot: HTMLElement;\n open: () => void;\n close: (onRemoved?: () => void) => void;\n};\n\nconst railItem = (card: HTMLElement): RailItem => {\n card.addEventListener(\"pointerenter\", () => setHold(pointerHolds, card, true));\n card.addEventListener(\"pointerleave\", () => setHold(pointerHolds, card, false));\n card.addEventListener(\"focusin\", () => setHold(focusHolds, card, true));\n card.addEventListener(\"focusout\", (event) => {\n if (!card.contains(event.relatedTarget as Node | null)) setHold(focusHolds, card, false);\n });\n const slot = document.createElement(\"div\");\n slot.className = \"k2b-toast-slot\";\n slot.dataset.state = \"entering\";\n const clip = document.createElement(\"div\");\n clip.className = \"k2b-toast-slot__clip\";\n clip.appendChild(card);\n slot.appendChild(clip);\n return {\n slot,\n open: () => {\n // The entering state must be laid out once before it changes, or nothing transitions.\n slot.getBoundingClientRect();\n requestAnimationFrame(() => {\n if (card.dataset.closing) return;\n slot.dataset.state = \"open\";\n card.dataset.open = \"true\";\n });\n },\n close: (onRemoved) => {\n slot.dataset.state = \"closing\";\n card.dataset.closing = \"true\";\n // A card that leaves under the pointer or with focus no longer holds the rail.\n if (pointerHolds.has(card)) setHold(pointerHolds, card, false);\n if (focusHolds.has(card)) setHold(focusHolds, card, false);\n setTimeout(() => {\n slot.remove();\n hideEmptyContainers();\n onRemoved?.();\n }, ANIMATION_MS);\n },\n };\n};\n\n/**\n * The rail is full: older timed confirmations leave first, then older errors and sticky toasts. Running progress, the\n * newest toast, and a toast under the pointer or with focus stay; the rail waits until they are released.\n */\nfunction enforceCap(): void {\n const narrow = typeof matchMedia === \"function\" && matchMedia(NARROW_RAIL_QUERY).matches;\n const cap = narrow ? MAX_VISIBLE_TOASTS_NARROW : MAX_VISIBLE_TOASTS;\n while (liveToasts.size > cap) {\n const older = Array.from(liveToasts)\n .slice(0, -1)\n .filter((item) => !item.held());\n const victim = older.find((item) => !item.keep()) ?? older.find((item) => !item.progress());\n if (!victim) return;\n victim.dismiss();\n }\n}\n\nconst showToast = (description: string, options?: ToastOptions): ToastHandle => {\n const initialContainer = ensureContainer();\n if (!initialContainer) {\n const noop = () => {};\n return { dismiss: noop, update: noop };\n }\n const messages = resolveUiMessages();\n const doc = initialContainer.ownerDocument;\n // Focus returns here when a focused toast closes and no other toast can take it.\n const opener =\n doc.activeElement instanceof HTMLElement && !doc.activeElement.closest(`[${CONTAINER_ATTRIBUTE}]`) ? doc.activeElement : null;\n\n let dismissed = false;\n let dismissTimer: ReturnType<typeof setTimeout> | null = null;\n let currentVariant: ToastVariant = options?.variant ?? \"default\";\n let currentProgress = options?.progress ?? null;\n let currentAction = options?.action ?? null;\n let explicitDuration = options?.duration;\n let remainingDuration = 0;\n let timerStartedAt = 0;\n let lastAnnouncement = \"\";\n\n const toastElement = doc.createElement(\"div\");\n toastElement.className = \"k2b-toast\";\n toastElement.dataset.tone = VARIANT_STYLES[currentVariant].tone;\n toastElement.dataset.k2bToast = \"\";\n\n const leadElement = doc.createElement(\"div\");\n leadElement.className = \"k2b-toast__icon\";\n leadElement.setAttribute(\"aria-hidden\", \"true\");\n const leadIconElement = doc.createElement(\"i\");\n leadElement.appendChild(leadIconElement);\n const renderLead = (iconClassOverride?: string) => {\n leadElement.dataset.tone = VARIANT_STYLES[currentVariant].tone;\n applyIconClass(leadIconElement, iconClassOverride ?? VARIANT_STYLES[currentVariant].iconClass);\n };\n renderLead(options?.iconClass);\n\n const contentElement = doc.createElement(\"div\");\n contentElement.className = \"k2b-toast__content\";\n const titleElement = doc.createElement(\"div\");\n titleElement.className = \"k2b-toast__title\";\n const renderTitle = (title: string | undefined) => {\n titleElement.textContent = title ?? \"\";\n titleElement.hidden = !title;\n };\n renderTitle(options?.title);\n const descriptionElement = doc.createElement(\"div\");\n descriptionElement.className = \"k2b-toast__description\";\n descriptionElement.textContent = description;\n contentElement.append(titleElement, descriptionElement);\n\n const closeButton = doc.createElement(\"button\");\n closeButton.type = \"button\";\n closeButton.className = \"k2b-toast__close\";\n closeButton.setAttribute(\"aria-label\", options?.dismissLabel ?? messages.dismissNotification);\n const closeIcon = doc.createElement(\"i\");\n closeIcon.className = \"ti ti-x\";\n closeIcon.setAttribute(\"aria-hidden\", \"true\");\n closeButton.appendChild(closeIcon);\n\n // Inside the content, so a titled progress toast can place the bar between its title and its summary line.\n const progressElement = doc.createElement(\"progress\");\n progressElement.className = \"k2b-toast__progress\";\n progressElement.max = 1;\n contentElement.appendChild(progressElement);\n\n toastElement.append(leadElement, contentElement, closeButton);\n const item = railItem(toastElement);\n\n const text = () => [titleElement.textContent, descriptionElement.textContent].filter(Boolean).join(\". \");\n const effectiveDuration = () => explicitDuration ?? defaultDuration(currentVariant, text(), currentAction !== null);\n /** The error word is read before the message; the action is left out. */\n const spoken = () => (currentVariant === \"error\" ? `${resolveUiMessages().error}: ${text()}` : text());\n const say = () => {\n lastAnnouncement = spoken();\n announce(lastAnnouncement, { politeness: currentVariant === \"error\" ? \"assertive\" : \"polite\" });\n };\n\n const clearDismissTimer = () => {\n if (dismissTimer === null) return;\n clearTimeout(dismissTimer);\n dismissTimer = null;\n };\n\n const pauseDismissTimer = () => {\n if (dismissTimer === null) return;\n remainingDuration = Math.max(0, remainingDuration - (Date.now() - timerStartedAt));\n clearDismissTimer();\n };\n\n const resumeDismissTimer = () => {\n if (dismissed || currentProgress !== null || remainingDuration <= 0 || railHeld() || doc.hidden) return;\n clearDismissTimer();\n timerStartedAt = Date.now();\n dismissTimer = setTimeout(() => dismiss(), remainingDuration);\n };\n\n const resetDismissTimer = () => {\n clearDismissTimer();\n remainingDuration = effectiveDuration();\n // A toast that stays until it is closed or its progress ends; a phone shell keeps the end of its content clear of it.\n if (remainingDuration === 0 || currentProgress !== null) toastElement.dataset.persistent = \"true\";\n else delete toastElement.dataset.persistent;\n resumeDismissTimer();\n };\n\n const onVisibilityChange = () => (doc.hidden ? pauseDismissTimer() : resumeDismissTimer());\n\n /** The close button of the nearest open toast in one direction, past neighbours that are still closing. */\n const nearestOpenClose = (step: (slot: Element) => Element | null): HTMLElement | null => {\n for (let slot = step(item.slot); slot; slot = step(slot)) {\n const button = slot.querySelector<HTMLElement>(\".k2b-toast:not([data-closing]) .k2b-toast__close\");\n if (button) return button;\n }\n return null;\n };\n\n /** A focused toast hands focus to its neighbour, or back to where the user was, instead of dropping it on the page. */\n const moveFocusAway = () => {\n if (!toastElement.contains(doc.activeElement)) return;\n const next = nearestOpenClose((slot) => slot.nextElementSibling) ?? nearestOpenClose((slot) => slot.previousElementSibling);\n const target = next ?? (opener?.isConnected ? opener : null);\n if (target) target.focus({ preventScroll: true });\n else (doc.activeElement as HTMLElement | null)?.blur();\n };\n\n const dismiss = () => {\n if (dismissed) return;\n dismissed = true;\n clearDismissTimer();\n liveToasts.delete(live);\n doc.removeEventListener(\"visibilitychange\", onVisibilityChange);\n moveFocusAway();\n item.close();\n };\n\n const renderProgress = () => {\n progressElement.hidden = currentProgress === null;\n toastElement.dataset.progress = String(currentProgress !== null);\n const title = titleElement.textContent;\n const summary = descriptionElement.textContent ?? \"\";\n progressElement.setAttribute(\"aria-label\", title || summary);\n // With a title, the message is the summary line under the bar (\"6 of 12 files\"), read instead of a bare percentage.\n if (typeof currentProgress === \"number\" && title && summary) progressElement.setAttribute(\"aria-valuetext\", summary);\n else progressElement.removeAttribute(\"aria-valuetext\");\n if (typeof currentProgress === \"number\")\n progressElement.value = Number.isFinite(currentProgress) ? Math.max(0, Math.min(1, currentProgress)) : 0;\n else progressElement.removeAttribute(\"value\");\n };\n renderProgress();\n\n let actionElement: HTMLAnchorElement | HTMLButtonElement | null = null;\n const createAction = (action: ToastAction): HTMLAnchorElement | HTMLButtonElement => {\n let element: HTMLAnchorElement | HTMLButtonElement;\n if (\"href\" in action) {\n element = doc.createElement(\"a\");\n element.href = action.href;\n } else {\n element = doc.createElement(\"button\");\n element.type = \"button\";\n }\n element.className = \"k2b-toast__action\";\n element.textContent = action.label;\n element.addEventListener(\"click\", () => {\n if (\"onClick\" in action) action.onClick();\n else dismiss();\n });\n return element;\n };\n const renderAction = (action: ToastAction | null | undefined) => {\n const previous = actionElement;\n currentAction = action ?? null;\n actionElement = action ? createAction(action) : null;\n if (actionElement) contentElement.appendChild(actionElement);\n // The keyboard stays in the toast, on the new action or the close button, instead of falling to the page.\n if (previous?.contains(doc.activeElement)) (actionElement ?? closeButton).focus({ preventScroll: true });\n previous?.remove();\n };\n renderAction(options?.action);\n\n const update = (nextDescription: string, nextOptions?: ToastOptions) => {\n if (dismissed) return;\n const has = (key: keyof ToastOptions) => nextOptions !== undefined && Object.prototype.hasOwnProperty.call(nextOptions, key);\n const previousProgress = currentProgress;\n descriptionElement.textContent = nextDescription;\n\n const variantChanged = nextOptions?.variant !== undefined && nextOptions.variant !== currentVariant;\n if (variantChanged) {\n currentVariant = nextOptions.variant!;\n toastElement.dataset.tone = VARIANT_STYLES[currentVariant].tone;\n renderLead(nextOptions.iconClass);\n } else if (nextOptions?.iconClass !== undefined) {\n applyIconClass(leadIconElement, nextOptions.iconClass);\n }\n\n if (has(\"title\")) renderTitle(nextOptions!.title);\n if (has(\"action\")) renderAction(nextOptions!.action);\n if (has(\"duration\")) explicitDuration = nextOptions!.duration;\n if (has(\"progress\")) currentProgress = nextOptions!.progress ?? null;\n if (nextOptions?.dismissLabel) closeButton.setAttribute(\"aria-label\", nextOptions.dismissLabel);\n renderProgress();\n resetDismissTimer();\n\n // Progress is announced at its start, half way, and its end, never at every step, and only with something new to say.\n // The comparison includes the error word, so a change to an error with the same text is still announced.\n const ticking = previousProgress !== null && currentProgress !== null;\n const halfway =\n typeof currentProgress === \"number\" && currentProgress >= 0.5 && !(typeof previousProgress === \"number\" && previousProgress >= 0.5);\n if ((!ticking || halfway || variantChanged) && spoken() !== lastAnnouncement) say();\n // Finished progress or a new duration can make this toast one the rail limit removes.\n enforceCap();\n };\n\n closeButton.addEventListener(\"click\", () => dismiss());\n toastElement.addEventListener(\"keydown\", (event) => {\n if (event.key !== \"Escape\" || event.defaultPrevented) return;\n event.preventDefault();\n event.stopPropagation();\n dismiss();\n });\n doc.addEventListener(\"visibilitychange\", onVisibilityChange);\n\n const handle: ToastHandle = { dismiss, update };\n const live: LiveToast = {\n dismiss,\n keep: () => currentVariant === \"error\" || currentProgress !== null || effectiveDuration() === 0,\n progress: () => currentProgress !== null,\n held: () => pointerHolds.has(toastElement) || focusHolds.has(toastElement),\n pause: pauseDismissTimer,\n resume: resumeDismissTimer,\n };\n liveToasts.add(live);\n promoteToTopLayer(initialContainer).appendChild(item.slot);\n item.open();\n say();\n enforceCap();\n resetDismissTimer();\n return handle;\n};\n\n/*\n * A custom slot shares the rail, chrome, and enter/leave motion with toasts, so it stacks beside them in the same\n * corner instead of covering them. It has no timer, close button, or live region of its own, and neither the\n * toast limit nor `dismissAll` removes it: the application that placed it decides when it goes.\n */\nconst showCustom = (content: HTMLElement): ToastSlot => {\n const initialContainer = ensureContainer();\n if (!initialContainer) return { dismiss: () => {} };\n let dismissed = false;\n const slotElement = document.createElement(\"div\");\n slotElement.className = \"k2b-toast\";\n slotElement.dataset.k2bToast = \"\";\n slotElement.dataset.custom = \"true\";\n // It stays until the application removes it, like a toast without a timer.\n slotElement.dataset.persistent = \"true\";\n slotElement.append(content);\n const item = railItem(slotElement);\n const dismiss = () => {\n if (dismissed) return;\n dismissed = true;\n item.close();\n };\n promoteToTopLayer(initialContainer).appendChild(item.slot);\n item.open();\n return { dismiss };\n};\n\nexport const isPointInsideToast = (x: number, y: number): boolean => {\n if (typeof document === \"undefined\") return false;\n for (const card of Array.from(document.querySelectorAll<HTMLElement>(`[${CONTAINER_ATTRIBUTE}] [data-k2b-toast]`))) {\n const rect = card.getBoundingClientRect();\n if (x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom) return true;\n }\n return false;\n};\n\nconst toastFn = ((description: string, options?: ToastOptions) => showToast(description, options)) as ToastFn;\ntoastFn.success = (description, options) => showToast(description, { ...options, variant: \"success\" });\ntoastFn.error = (description, options) => showToast(description, { ...options, variant: \"error\" });\ntoastFn.custom = showCustom;\ntoastFn.dismissAll = () => {\n for (const item of Array.from(liveToasts)) item.dismiss();\n};\n\nexport const toast: ToastFn = toastFn;\n"],"mappings":"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","ignoreList":[]}