@hypoth-ui/wc 0.1.1
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.
- package/LICENSE +21 -0
- package/README.md +60 -0
- package/dist/button-MKQKTC5Q.js +10 -0
- package/dist/button-MKQKTC5Q.js.map +1 -0
- package/dist/chunk-4HLM6DBG.js +910 -0
- package/dist/chunk-4HLM6DBG.js.map +1 -0
- package/dist/chunk-55ID7LJL.js +3602 -0
- package/dist/chunk-55ID7LJL.js.map +1 -0
- package/dist/chunk-66HFYJD7.js +86 -0
- package/dist/chunk-66HFYJD7.js.map +1 -0
- package/dist/chunk-CZOXIJVS.js +70 -0
- package/dist/chunk-CZOXIJVS.js.map +1 -0
- package/dist/chunk-DHUM4Q5Y.js +495 -0
- package/dist/chunk-DHUM4Q5Y.js.map +1 -0
- package/dist/chunk-DNNI5BDE.js +1842 -0
- package/dist/chunk-DNNI5BDE.js.map +1 -0
- package/dist/chunk-GXKZ6E6K.js +99 -0
- package/dist/chunk-GXKZ6E6K.js.map +1 -0
- package/dist/chunk-H4GJJZ3N.js +51 -0
- package/dist/chunk-H4GJJZ3N.js.map +1 -0
- package/dist/chunk-JMPTFALJ.js +175 -0
- package/dist/chunk-JMPTFALJ.js.map +1 -0
- package/dist/chunk-MYQWCLUJ.js +45 -0
- package/dist/chunk-MYQWCLUJ.js.map +1 -0
- package/dist/chunk-QZSPWT7L.js +183 -0
- package/dist/chunk-QZSPWT7L.js.map +1 -0
- package/dist/chunk-TSKBQCTR.js +5137 -0
- package/dist/chunk-TSKBQCTR.js.map +1 -0
- package/dist/chunk-TXIIUVL3.js +130 -0
- package/dist/chunk-TXIIUVL3.js.map +1 -0
- package/dist/chunk-UM7WRO7W.js +237 -0
- package/dist/chunk-UM7WRO7W.js.map +1 -0
- package/dist/chunk-VPXL4RB3.js +202 -0
- package/dist/chunk-VPXL4RB3.js.map +1 -0
- package/dist/chunk-VX5CKSMN.js +39 -0
- package/dist/chunk-VX5CKSMN.js.map +1 -0
- package/dist/chunk-WQ5BEP3E.js +2845 -0
- package/dist/chunk-WQ5BEP3E.js.map +1 -0
- package/dist/chunk-YDQ434UH.js +60 -0
- package/dist/chunk-YDQ434UH.js.map +1 -0
- package/dist/chunk-ZWV4VI6D.js +153 -0
- package/dist/chunk-ZWV4VI6D.js.map +1 -0
- package/dist/core.d.ts +127 -0
- package/dist/core.js +38 -0
- package/dist/core.js.map +1 -0
- package/dist/data-display.d.ts +872 -0
- package/dist/data-display.js +57 -0
- package/dist/data-display.js.map +1 -0
- package/dist/ds-element-Db0LMfxI.d.ts +43 -0
- package/dist/feedback.d.ts +292 -0
- package/dist/feedback.js +31 -0
- package/dist/feedback.js.map +1 -0
- package/dist/form-controls.d.ts +1713 -0
- package/dist/form-controls.js +63 -0
- package/dist/form-controls.js.map +1 -0
- package/dist/icon-7IZTJ5WT.js +8 -0
- package/dist/icon-7IZTJ5WT.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +423 -0
- package/dist/index.js.map +1 -0
- package/dist/input-LB6UR37A.js +10 -0
- package/dist/input-LB6UR37A.js.map +1 -0
- package/dist/layout.d.ts +504 -0
- package/dist/layout.js +34 -0
- package/dist/layout.js.map +1 -0
- package/dist/link-NHDJ6SFY.js +9 -0
- package/dist/link-NHDJ6SFY.js.map +1 -0
- package/dist/navigation.d.ts +255 -0
- package/dist/navigation.js +111 -0
- package/dist/navigation.js.map +1 -0
- package/dist/overlays.d.ts +1291 -0
- package/dist/overlays.js +106 -0
- package/dist/overlays.js.map +1 -0
- package/dist/primitives.d.ts +230 -0
- package/dist/primitives.js +26 -0
- package/dist/primitives.js.map +1 -0
- package/dist/registry-Bns0t11H.d.ts +233 -0
- package/dist/skeleton-MUdd2029.d.ts +109 -0
- package/dist/spinner-BWaNlc-Y.d.ts +45 -0
- package/dist/spinner-UIYDUVBZ.js +8 -0
- package/dist/spinner-UIYDUVBZ.js.map +1 -0
- package/dist/stepper-CCRwcQOe.d.ts +851 -0
- package/dist/text-MT3S3EMU.js +8 -0
- package/dist/text-MT3S3EMU.js.map +1 -0
- package/dist/visually-hidden-MW2XY4CS.js +8 -0
- package/dist/visually-hidden-MW2XY4CS.js.map +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/alert/alert.ts","../src/components/toast/toast.ts","../src/components/toast/toast-controller.ts","../src/components/toast/toast-provider.ts"],"sourcesContent":["import { type TemplateResult, html, nothing } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { emitEvent } from \"../../events/emit.js\";\nimport { define } from \"../../registry/define.js\";\n\nexport type AlertVariant = \"info\" | \"success\" | \"warning\" | \"error\";\n\n/**\n * SVG icons for different alert variants\n */\nconst VARIANT_ICONS: Record<AlertVariant, TemplateResult> = {\n info: html`<svg class=\"ds-alert__icon\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z\" clip-rule=\"evenodd\" />\n </svg>`,\n success: html`<svg class=\"ds-alert__icon\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\" clip-rule=\"evenodd\" />\n </svg>`,\n warning: html`<svg class=\"ds-alert__icon\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z\" clip-rule=\"evenodd\" />\n </svg>`,\n error: html`<svg class=\"ds-alert__icon\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z\" clip-rule=\"evenodd\" />\n </svg>`,\n};\n\nconst CLOSE_ICON = html`<svg class=\"ds-alert__close-icon\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z\" />\n</svg>`;\n\n/**\n * Alert component for contextual feedback messages.\n *\n * @element ds-alert\n * @slot - Default slot for alert description/content\n * @slot icon - Custom icon content\n * @slot action - Action button slot\n *\n * @fires ds:close - Fired when close button is clicked\n *\n * @csspart alert - The alert container\n * @csspart icon - The icon container\n * @csspart content - The content container\n * @csspart title - The title element\n * @csspart description - The description slot container\n * @csspart close - The close button\n *\n * @cssprop --ds-alert-bg - Background color\n * @cssprop --ds-alert-fg - Text color\n * @cssprop --ds-alert-border - Border color\n * @cssprop --ds-alert-icon - Icon color\n */\nexport class DsAlert extends DSElement {\n static override styles = [];\n\n /**\n * The visual variant of the alert.\n */\n @property({ type: String, reflect: true })\n variant: AlertVariant = \"info\";\n\n /**\n * The alert title.\n */\n @property({ type: String })\n alertTitle = \"\";\n\n /**\n * Whether the alert can be closed.\n */\n @property({ type: Boolean, reflect: true })\n closable = false;\n\n /**\n * Hide the default icon.\n */\n @property({ type: Boolean, attribute: \"hide-icon\" })\n hideIcon = false;\n\n private handleClose(): void {\n emitEvent(this, \"ds:close\", {});\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n if (event.key === \"Escape\" && this.closable) {\n this.handleClose();\n }\n }\n\n /**\n * Get the ARIA role based on variant.\n * Error and warning use 'alert' for immediate announcement.\n * Info and success use 'status' for polite announcement.\n */\n private getRole(): \"alert\" | \"status\" {\n return this.variant === \"error\" || this.variant === \"warning\" ? \"alert\" : \"status\";\n }\n\n override render(): TemplateResult {\n const classes = {\n \"ds-alert\": true,\n };\n\n return html`\n <div\n part=\"alert\"\n class=${classMap(classes)}\n role=${this.getRole()}\n aria-live=${this.getRole() === \"alert\" ? \"assertive\" : \"polite\"}\n data-variant=${this.variant}\n ?data-closable=${this.closable}\n @keydown=${this.handleKeyDown}\n >\n ${\n !this.hideIcon\n ? html`\n <slot name=\"icon\">\n ${VARIANT_ICONS[this.variant]}\n </slot>\n `\n : nothing\n }\n\n <div part=\"content\" class=\"ds-alert__content\">\n ${\n this.alertTitle\n ? html`<p part=\"title\" class=\"ds-alert__title\">${this.alertTitle}</p>`\n : nothing\n }\n\n <div part=\"description\" class=\"ds-alert__description\">\n <slot></slot>\n </div>\n\n <slot name=\"action\" class=\"ds-alert__action\"></slot>\n </div>\n\n ${\n this.closable\n ? html`\n <button\n part=\"close\"\n class=\"ds-alert__close\"\n type=\"button\"\n aria-label=\"Dismiss alert\"\n @click=${this.handleClose}\n >\n ${CLOSE_ICON}\n </button>\n `\n : nothing\n }\n </div>\n `;\n }\n}\n\n// Register the component\ndefine(\"ds-alert\", DsAlert);\n\n// TypeScript declaration for HTML\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-alert\": DsAlert;\n }\n}\n","import { type TemplateResult, html, nothing } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { emitEvent } from \"../../events/emit.js\";\nimport { define } from \"../../registry/define.js\";\nimport type { ToastState, ToastVariant } from \"./toast-controller.js\";\n\n/**\n * SVG icons for different toast variants\n */\nconst VARIANT_ICONS: Record<ToastVariant, TemplateResult> = {\n info: html`<svg class=\"ds-toast__icon\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z\" clip-rule=\"evenodd\" />\n </svg>`,\n success: html`<svg class=\"ds-toast__icon\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\" clip-rule=\"evenodd\" />\n </svg>`,\n warning: html`<svg class=\"ds-toast__icon\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z\" clip-rule=\"evenodd\" />\n </svg>`,\n error: html`<svg class=\"ds-toast__icon\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z\" clip-rule=\"evenodd\" />\n </svg>`,\n};\n\nconst CLOSE_ICON = html`<svg class=\"ds-toast__close-icon\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z\" />\n</svg>`;\n\n/**\n * Individual toast notification element.\n *\n * @element ds-toast\n * @slot action - Action button slot\n *\n * @fires ds:dismiss - Fired when toast is dismissed\n * @fires ds:pause - Fired when mouse enters (for pause)\n * @fires ds:resume - Fired when mouse leaves (for resume)\n */\nexport class DsToast extends DSElement {\n static override styles = [];\n\n /**\n * Unique toast ID\n */\n @property({ type: String, reflect: true })\n toastId = \"\";\n\n /**\n * Toast title\n */\n @property({ type: String })\n toastTitle = \"\";\n\n /**\n * Toast description\n */\n @property({ type: String })\n description = \"\";\n\n /**\n * Visual variant\n */\n @property({ type: String, reflect: true })\n variant: ToastVariant = \"info\";\n\n /**\n * Current state\n */\n @property({ type: String, reflect: true })\n toastState: ToastState = \"entering\";\n\n /**\n * Duration for progress bar (0 = no progress)\n */\n @property({ type: Number })\n duration = 5000;\n\n /**\n * Hide the icon\n */\n @property({ type: Boolean, attribute: \"hide-icon\" })\n hideIcon = false;\n\n @state()\n private isPaused = false;\n\n private handleDismiss(): void {\n emitEvent(this, \"dismiss\", { detail: { id: this.toastId } });\n }\n\n private handleMouseEnter(): void {\n this.isPaused = true;\n emitEvent(this, \"pause\", { detail: { id: this.toastId } });\n }\n\n private handleMouseLeave(): void {\n this.isPaused = false;\n emitEvent(this, \"resume\", { detail: { id: this.toastId } });\n }\n\n override render(): TemplateResult {\n const classes = {\n \"ds-toast\": true,\n };\n\n return html`\n <div\n class=${classMap(classes)}\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n data-variant=${this.variant}\n data-state=${this.toastState}\n @mouseenter=${this.handleMouseEnter}\n @mouseleave=${this.handleMouseLeave}\n >\n ${!this.hideIcon ? VARIANT_ICONS[this.variant] : nothing}\n\n <div class=\"ds-toast__content\">\n <p class=\"ds-toast__title\">${this.toastTitle}</p>\n ${\n this.description\n ? html`<p class=\"ds-toast__description\">${this.description}</p>`\n : nothing\n }\n <slot name=\"action\" class=\"ds-toast__action\"></slot>\n </div>\n\n <button\n class=\"ds-toast__close\"\n type=\"button\"\n aria-label=\"Dismiss notification\"\n @click=${this.handleDismiss}\n >\n ${CLOSE_ICON}\n </button>\n\n ${\n this.duration > 0\n ? html`\n <div class=\"ds-toast__progress\">\n <div\n class=\"ds-toast__progress-bar\"\n style=\"animation: ds-toast-progress ${this.duration}ms linear forwards; animation-play-state: ${this.isPaused ? \"paused\" : \"running\"}\"\n ></div>\n </div>\n `\n : nothing\n }\n </div>\n `;\n }\n}\n\n// Register the component\ndefine(\"ds-toast\", DsToast);\n\n// TypeScript declaration for HTML\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-toast\": DsToast;\n }\n}\n","/**\n * Toast Controller\n *\n * Manages toast queue, lifecycle, and provides imperative API\n * for showing and dismissing toasts.\n */\n\nexport type ToastVariant = \"info\" | \"success\" | \"warning\" | \"error\";\nexport type ToastPosition =\n | \"top-left\"\n | \"top-center\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-center\"\n | \"bottom-right\";\n\nexport type ToastState = \"entering\" | \"visible\" | \"exiting\" | \"dismissed\";\n\nexport interface ToastAction {\n label: string;\n onClick: () => void;\n}\n\nexport interface ToastOptions {\n /** Toast title (required) */\n title: string;\n /** Optional description */\n description?: string;\n /** Visual variant */\n variant?: ToastVariant;\n /** Auto-dismiss duration in ms (0 = no auto-dismiss) */\n duration?: number;\n /** Optional action button */\n action?: ToastAction;\n}\n\nexport interface ToastData extends ToastOptions {\n /** Unique toast ID */\n id: string;\n /** Current lifecycle state */\n state: ToastState;\n /** Timestamp when created */\n createdAt: number;\n /** Timer ID for auto-dismiss */\n timerId?: ReturnType<typeof setTimeout>;\n}\n\nexport interface ToastControllerOptions {\n /** Maximum simultaneous toasts */\n maxToasts?: number;\n /** Default duration in ms */\n defaultDuration?: number;\n /** Toast position */\n position?: ToastPosition;\n /** Callback when toast list changes */\n onUpdate?: (toasts: ToastData[]) => void;\n}\n\nlet toastIdCounter = 0;\n\nfunction generateId(): string {\n return `toast-${++toastIdCounter}-${Date.now()}`;\n}\n\n/**\n * ToastController manages the toast queue and lifecycle.\n *\n * @example\n * ```typescript\n * const controller = new ToastController({\n * maxToasts: 5,\n * defaultDuration: 5000,\n * onUpdate: (toasts) => renderToasts(toasts),\n * });\n *\n * // Show a toast\n * const id = controller.show({ title: \"Saved!\", variant: \"success\" });\n *\n * // Dismiss a specific toast\n * controller.dismiss(id);\n *\n * // Dismiss all toasts\n * controller.dismissAll();\n * ```\n */\nexport class ToastController {\n private toasts: ToastData[] = [];\n private options: Required<ToastControllerOptions>;\n\n constructor(options: ToastControllerOptions = {}) {\n this.options = {\n maxToasts: options.maxToasts ?? 5,\n defaultDuration: options.defaultDuration ?? 5000,\n position: options.position ?? \"top-right\",\n onUpdate: options.onUpdate ?? (() => {}),\n };\n }\n\n /**\n * Show a new toast\n */\n show(options: ToastOptions): string {\n const id = generateId();\n const duration = options.duration ?? this.options.defaultDuration;\n\n const toast: ToastData = {\n id,\n title: options.title,\n description: options.description,\n variant: options.variant ?? \"info\",\n duration,\n action: options.action,\n state: \"entering\",\n createdAt: Date.now(),\n };\n\n // Add to queue\n this.toasts = [toast, ...this.toasts];\n\n // Trim to max\n if (this.toasts.length > this.options.maxToasts) {\n const toRemove = this.toasts.slice(this.options.maxToasts);\n for (const t of toRemove) {\n this.dismiss(t.id);\n }\n this.toasts = this.toasts.slice(0, this.options.maxToasts);\n }\n\n // Transition to visible after animation\n setTimeout(() => {\n this.updateState(id, \"visible\");\n }, 200);\n\n // Set up auto-dismiss\n if (duration > 0) {\n toast.timerId = setTimeout(() => {\n this.dismiss(id);\n }, duration);\n }\n\n this.notify();\n return id;\n }\n\n /**\n * Dismiss a toast by ID\n */\n dismiss(id: string): void {\n const toast = this.toasts.find((t) => t.id === id);\n if (!toast || toast.state === \"exiting\" || toast.state === \"dismissed\") {\n return;\n }\n\n // Clear auto-dismiss timer\n if (toast.timerId) {\n clearTimeout(toast.timerId);\n }\n\n // Start exit animation\n this.updateState(id, \"exiting\");\n\n // Remove after animation\n setTimeout(() => {\n this.toasts = this.toasts.filter((t) => t.id !== id);\n this.notify();\n }, 150);\n }\n\n /**\n * Dismiss all toasts\n */\n dismissAll(): void {\n const ids = this.toasts.map((t) => t.id);\n for (const id of ids) {\n this.dismiss(id);\n }\n }\n\n /**\n * Pause auto-dismiss for a toast (e.g., on hover)\n */\n pause(id: string): void {\n const toast = this.toasts.find((t) => t.id === id);\n if (toast?.timerId) {\n clearTimeout(toast.timerId);\n toast.timerId = undefined;\n }\n }\n\n /**\n * Resume auto-dismiss for a toast\n */\n resume(id: string): void {\n const toast = this.toasts.find((t) => t.id === id);\n if (toast?.duration && toast.duration > 0 && toast.state === \"visible\") {\n // Calculate remaining time based on elapsed time\n const elapsed = Date.now() - toast.createdAt;\n const remaining = Math.max(toast.duration - elapsed, 1000);\n\n toast.timerId = setTimeout(() => {\n this.dismiss(id);\n }, remaining);\n }\n }\n\n /**\n * Get current toasts\n */\n getToasts(): ToastData[] {\n return [...this.toasts];\n }\n\n /**\n * Get controller options\n */\n getOptions(): Required<ToastControllerOptions> {\n return { ...this.options };\n }\n\n /**\n * Update controller options\n */\n setOptions(options: Partial<ToastControllerOptions>): void {\n this.options = { ...this.options, ...options };\n }\n\n private updateState(id: string, state: ToastState): void {\n const toast = this.toasts.find((t) => t.id === id);\n if (toast) {\n toast.state = state;\n this.notify();\n }\n }\n\n private notify(): void {\n this.options.onUpdate(this.getToasts());\n }\n}\n\n// Global singleton controller\nlet globalController: ToastController | null = null;\n\n/**\n * Get or create the global toast controller\n */\nexport function getGlobalToastController(): ToastController {\n if (!globalController) {\n globalController = new ToastController();\n }\n return globalController;\n}\n\n/**\n * Set the global toast controller (used by ToastProvider)\n */\nexport function setGlobalToastController(controller: ToastController): void {\n globalController = controller;\n}\n\n/**\n * Global toast function for showing toasts\n *\n * @example\n * ```typescript\n * dsToast({ title: \"Saved!\", variant: \"success\" });\n *\n * dsToast({\n * title: \"Error\",\n * description: \"Something went wrong\",\n * variant: \"error\",\n * action: { label: \"Retry\", onClick: () => retry() },\n * });\n * ```\n */\nexport function dsToast(options: ToastOptions): string {\n return getGlobalToastController().show(options);\n}\n\n// Make dsToast available globally\nif (typeof window !== \"undefined\") {\n (window as unknown as { dsToast: typeof dsToast }).dsToast = dsToast;\n}\n","import { type TemplateResult, html } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { define } from \"../../registry/define.js\";\nimport {\n ToastController,\n type ToastData,\n type ToastPosition,\n setGlobalToastController,\n} from \"./toast-controller.js\";\nimport \"./toast.js\";\n\n/**\n * Toast provider component that manages toast queue and rendering.\n *\n * @element ds-toast-provider\n * @slot - Default slot for app content\n *\n * @example\n * ```html\n * <ds-toast-provider position=\"top-right\" max=\"5\">\n * <!-- Your app content -->\n * </ds-toast-provider>\n *\n * <script>\n * dsToast({ title: \"Hello!\", variant: \"success\" });\n * </script>\n * ```\n */\nexport class DsToastProvider extends DSElement {\n static override styles = [];\n\n /**\n * Toast position\n */\n @property({ type: String, reflect: true })\n position: ToastPosition = \"top-right\";\n\n /**\n * Maximum simultaneous toasts\n */\n @property({ type: Number })\n max = 5;\n\n /**\n * Default duration in ms\n */\n @property({ type: Number })\n duration = 5000;\n\n @state()\n private toasts: ToastData[] = [];\n\n private controller!: ToastController;\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n this.controller = new ToastController({\n maxToasts: this.max,\n defaultDuration: this.duration,\n position: this.position,\n onUpdate: (toasts) => {\n this.toasts = toasts;\n },\n });\n\n // Set as global controller\n setGlobalToastController(this.controller);\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n\n if (\n changedProperties.has(\"max\") ||\n changedProperties.has(\"duration\") ||\n changedProperties.has(\"position\")\n ) {\n this.controller.setOptions({\n maxToasts: this.max,\n defaultDuration: this.duration,\n position: this.position,\n });\n }\n }\n\n private handleDismiss(event: CustomEvent<{ id: string }>): void {\n this.controller.dismiss(event.detail.id);\n }\n\n private handlePause(event: CustomEvent<{ id: string }>): void {\n this.controller.pause(event.detail.id);\n }\n\n private handleResume(event: CustomEvent<{ id: string }>): void {\n this.controller.resume(event.detail.id);\n }\n\n private handleActionClick(toast: ToastData): void {\n toast.action?.onClick();\n this.controller.dismiss(toast.id);\n }\n\n override render(): TemplateResult {\n return html`\n <slot></slot>\n\n <div\n class=\"ds-toast-viewport\"\n data-position=${this.position}\n role=\"region\"\n aria-label=\"Notifications\"\n aria-live=\"polite\"\n >\n ${repeat(\n this.toasts,\n (toast) => toast.id,\n (toast) => html`\n <ds-toast\n .toastId=${toast.id}\n .toastTitle=${toast.title}\n .description=${toast.description ?? \"\"}\n .variant=${toast.variant ?? \"info\"}\n .toastState=${toast.state}\n .duration=${toast.duration ?? 0}\n @ds:dismiss=${this.handleDismiss}\n @ds:pause=${this.handlePause}\n @ds:resume=${this.handleResume}\n >\n ${\n toast.action\n ? html`\n <button\n slot=\"action\"\n class=\"ds-button ds-button--sm ds-button--ghost\"\n @click=${() => this.handleActionClick(toast)}\n >\n ${toast.action.label}\n </button>\n `\n : null\n }\n </ds-toast>\n `\n )}\n </div>\n `;\n }\n}\n\n// Register the component\ndefine(\"ds-toast-provider\", DsToastProvider);\n\n// TypeScript declaration for HTML\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-toast-provider\": DsToastProvider;\n }\n}\n"],"mappings":"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","names":["html","nothing","property","classMap","VARIANT_ICONS","html","CLOSE_ICON","classMap","nothing","property","state","html","property","state","html","property","state"]}
|