solid-tom-ui 1.0.3 → 1.0.5

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 (67) hide show
  1. package/README.md +237 -237
  2. package/dist/components/avatar/avatar.js.map +1 -1
  3. package/dist/components/badge/badge.js.map +1 -1
  4. package/dist/components/breadcrumb/breadcrumb.js.map +1 -1
  5. package/dist/components/button/button.js.map +1 -1
  6. package/dist/components/carousel/carousel.js.map +1 -1
  7. package/dist/components/chat-bubble/chatBubble.js.map +1 -1
  8. package/dist/components/checkbox/checkbox.js.map +1 -1
  9. package/dist/components/collapse/collapse.js.map +1 -1
  10. package/dist/components/context-menu/context-menu.js.map +1 -1
  11. package/dist/components/context-menu/context-menu.store.js.map +1 -1
  12. package/dist/components/divider/divider.js.map +1 -1
  13. package/dist/components/dropdown/dropdown.js.map +1 -1
  14. package/dist/components/dropdown/dropdown.store.js.map +1 -1
  15. package/dist/components/float-button/float-button.js.map +1 -1
  16. package/dist/components/hover-3d-image/hover-3d-image.js.map +1 -1
  17. package/dist/components/image-preview/image-preview.js.map +1 -1
  18. package/dist/components/input/input.js.map +1 -1
  19. package/dist/components/input/input.utils.js.map +1 -1
  20. package/dist/components/input/variants/input-color.js.map +1 -1
  21. package/dist/components/input/variants/input-date.js.map +1 -1
  22. package/dist/components/input/variants/input-number.js.map +1 -1
  23. package/dist/components/input/variants/input-otp.js.map +1 -1
  24. package/dist/components/input/variants/input-password.js.map +1 -1
  25. package/dist/components/input/variants/input-radio.js.map +1 -1
  26. package/dist/components/input/variants/input-range.js.map +1 -1
  27. package/dist/components/input/variants/input-text.js.map +1 -1
  28. package/dist/components/input/variants/input-textarea.js.map +1 -1
  29. package/dist/components/loading/loading.js.map +1 -1
  30. package/dist/components/mansory/mansory.js.map +1 -1
  31. package/dist/components/menu/menu.js.map +1 -1
  32. package/dist/components/modal/modal.js.map +1 -1
  33. package/dist/components/modal/modalContext.js.map +1 -1
  34. package/dist/components/pagination/pagination.js.map +1 -1
  35. package/dist/components/progress-bar/progress-bar.js.map +1 -1
  36. package/dist/components/qr-code/qr-code.js.map +1 -1
  37. package/dist/components/select/select.js.map +1 -1
  38. package/dist/components/select-zone/select-zone.js.map +1 -1
  39. package/dist/components/skeleton/skeleton.js.map +1 -1
  40. package/dist/components/slider/slider.js.map +1 -1
  41. package/dist/components/splitter/splitter.js.map +1 -1
  42. package/dist/components/steps/steps.js.map +1 -1
  43. package/dist/components/swap/swap.js.map +1 -1
  44. package/dist/components/switch/switch.js.map +1 -1
  45. package/dist/components/tab/tab.js.map +1 -1
  46. package/dist/components/table/table.js.map +1 -1
  47. package/dist/components/timeline/timeline.js.map +1 -1
  48. package/dist/components/toast/icons/ErrorIcon.js.map +1 -1
  49. package/dist/components/toast/icons/IconCircle.js.map +1 -1
  50. package/dist/components/toast/icons/InfoIcon.js.map +1 -1
  51. package/dist/components/toast/icons/LoaderIcon.js.map +1 -1
  52. package/dist/components/toast/icons/SuccessIcon.js.map +1 -1
  53. package/dist/components/toast/icons/WarningIcon.js.map +1 -1
  54. package/dist/components/toast/toast.js.map +1 -1
  55. package/dist/components/toast/toast.store.js.map +1 -1
  56. package/dist/components/tooltip/tooltip.js.map +1 -1
  57. package/dist/components/tour/tour.js.map +1 -1
  58. package/dist/components/upload/upload.js.map +1 -1
  59. package/dist/components/z-index/z-index.context.js.map +1 -1
  60. package/dist/components/z-index/z-index.js.map +1 -1
  61. package/dist/components/z-index/z-index.store.js.map +1 -1
  62. package/dist/components/z-index/z-index.types.js.map +1 -1
  63. package/dist/utils/cn.js.map +1 -1
  64. package/dist/utils/element-tracker.js.map +1 -1
  65. package/dist/utils/helper.js.map +1 -1
  66. package/dist/utils/hoc.js.map +1 -1
  67. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"timeline.js","names":["BaseColorProps","cn","getColor","AlertCircle","Check","Clock","Component","createMemo","For","JSX","mergeProps","Show","splitProps","TimelineItem","TimelineItemStatus","TimelineProps","STATUS_COLOR","Record","pending","active","done","error","resolveItemColor","item","globalColor","color","status","DotProps","colorClass","class","TimelineDot","p","_el$","_tmpl$3","_$insert","_$createComponent","when","loading","children","_tmpl$","_$memo","icon","_el$3","_tmpl$2","size","_$effect","_$className","ContentProps","TimelineContent","_el$4","timestamp","_el$5","title","_el$6","content","_el$7","description","resolvePosition","mode","itemPosition","index","Timeline","props","merged","items","orientation","const","reverse","nativeProps","isVertical","displayItems","globalColorClass","_el$8","_$spread","_$mergeProps","root","each","i","pos","position","itemColorClass","isLast","length","_el$9","_el$0","label","_el$1","_tmpl$4","dot","_el$10","connector","_el$11","_el$12","_el$13","_tmpl$5","_el$14","firstChild","_el$15","nextSibling","_p$","_v$","_v$2","e","t","undefined","_el$16"],"sources":["../../../src/components/timeline/timeline.tsx"],"sourcesContent":["import { BaseColorProps } from '@/type';\r\nimport { cn } from '@/utils/cn';\r\nimport { getColor } from '@/utils/helper';\r\nimport AlertCircle from 'lucide-solid/icons/alert-circle';\r\nimport Check from 'lucide-solid/icons/check';\r\nimport Clock from 'lucide-solid/icons/clock';\r\nimport { Component, createMemo, For, JSX, mergeProps, Show, splitProps } from 'solid-js';\r\nimport { TimelineItem, TimelineItemStatus, TimelineProps } from './timeline.types';\r\n\r\n// ─── Helpers ──────────────────────────────────────────────────────────────────\r\n\r\n/** Map status → màu DaisyUI mặc định (dùng khi item không có `color` prop) */\r\nconst STATUS_COLOR: Record<TimelineItemStatus, BaseColorProps> = {\r\n pending: 'neutral',\r\n active: 'primary',\r\n done: 'success',\r\n error: 'error',\r\n};\r\n\r\n/** Resolve màu cuối cùng của item: ưu tiên item.color > status-mapped > global */\r\nconst resolveItemColor = (item: TimelineItem, globalColor: BaseColorProps): BaseColorProps => {\r\n if (item.color) return item.color;\r\n if (item.status) return STATUS_COLOR[item.status];\r\n return globalColor;\r\n};\r\n\r\n// ─── TimelineDot — marker của mỗi item ───────────────────────────────────────\r\n\r\ntype DotProps = {\r\n item: TimelineItem;\r\n colorClass: string;\r\n class?: string;\r\n};\r\n\r\nconst TimelineDot: Component<DotProps> = p => {\r\n const status = () => p.item.status ?? 'done';\r\n\r\n return (\r\n <div class={cn('tl15', p.colorClass, `tl-s-${status()}`, p.class)}>\r\n {/* Loading spinner */}\r\n <Show when={p.item.loading}>\r\n <span class=\"loading loading-spinner tl16\" />\r\n </Show>\r\n\r\n {/* Custom icon */}\r\n <Show when={!p.item.loading && p.item.icon}>\r\n <span class=\"tl17\">{p.item.icon!()}</span>\r\n </Show>\r\n\r\n {/* Default icon theo status */}\r\n <Show when={!p.item.loading && !p.item.icon}>\r\n <Show when={status() === 'done'}>\r\n <Check size={12} stroke-width={3} />\r\n </Show>\r\n <Show when={status() === 'error'}>\r\n <AlertCircle size={12} stroke-width={2.5} />\r\n </Show>\r\n <Show when={status() === 'pending'}>\r\n <Clock size={11} stroke-width={2} />\r\n </Show>\r\n {/* active: chỉ hiện dot rỗng — style CSS xử lý */}\r\n </Show>\r\n </div>\r\n );\r\n};\r\n\r\n// ─── TimelineItemContent — tiêu đề + nội dung + thời gian ────────────────────\r\n\r\ntype ContentProps = {\r\n item: TimelineItem;\r\n class?: TimelineProps['class'];\r\n};\r\n\r\nconst TimelineContent: Component<ContentProps> = p => (\r\n <div class={cn('tl18', p.class?.content)}>\r\n <Show when={p.item.timestamp}>\r\n <div class={cn('tl21', p.class?.timestamp)}>{p.item.timestamp}</div>\r\n </Show>\r\n <Show when={p.item.title}>\r\n <div class={cn('tl19', p.class?.title)}>{p.item.title}</div>\r\n </Show>\r\n <Show when={p.item.content}>\r\n <div class={cn('tl20', p.class?.description)}>{p.item.content}</div>\r\n </Show>\r\n </div>\r\n);\r\n\r\n// ─── Tính vị trí nội dung dựa trên mode & item.position ──────────────────────\r\n\r\nconst resolvePosition = (\r\n mode: TimelineProps['mode'],\r\n itemPosition: TimelineItem['position'],\r\n index: number,\r\n): 'start' | 'end' => {\r\n if (itemPosition) return itemPosition;\r\n if (mode === 'start') return 'start';\r\n if (mode === 'end') return 'end';\r\n // alternate: chẵn = start, lẻ = end\r\n return index % 2 === 0 ? 'start' : 'end';\r\n};\r\n\r\n// ─── Main Component ───────────────────────────────────────────────────────────\r\n\r\nexport const Timeline: Component<TimelineProps> = props => {\r\n const merged = mergeProps(\r\n {\r\n items: [] as TimelineItem[],\r\n color: 'primary' as BaseColorProps,\r\n orientation: 'vertical' as const,\r\n mode: 'alternate' as const,\r\n reverse: false,\r\n },\r\n props,\r\n );\r\n\r\n const [p, nativeProps] = splitProps(merged, [\r\n 'items',\r\n 'color',\r\n 'orientation',\r\n 'mode',\r\n 'reverse',\r\n 'class',\r\n ]);\r\n\r\n const isVertical = () => p.orientation === 'vertical';\r\n\r\n const displayItems = createMemo(() => (p.reverse ? [...p.items].reverse() : p.items));\r\n\r\n const globalColorClass = () => getColor(p.color, 'color-primary');\r\n\r\n return (\r\n <div\r\n {...nativeProps}\r\n class={cn(\r\n 'tl01',\r\n isVertical() ? 'tl02' : 'tl03',\r\n `tl-mode-${p.mode}`,\r\n globalColorClass(),\r\n p.class?.root,\r\n )}\r\n >\r\n <For each={displayItems()}>\r\n {(item, i) => {\r\n const pos = () => resolvePosition(p.mode, item.position, i());\r\n const itemColorClass = () => getColor(resolveItemColor(item, p.color), 'color-primary');\r\n const isLast = () => i() === displayItems().length - 1;\r\n\r\n return (\r\n <div\r\n class={cn(\r\n 'tl04',\r\n isVertical() ? 'tl05' : 'tl06',\r\n `tl-pos-${pos()}`,\r\n `tl-s-${item.status ?? 'done'}`,\r\n p.class?.item,\r\n )}\r\n >\r\n {/* ── Vertical layout ── */}\r\n <Show when={isVertical()}>\r\n {/* Cột bên start (trái) */}\r\n <div class={cn('tl07', p.class?.label)}>\r\n <Show when={pos() === 'start'}>\r\n <TimelineContent item={item} class={p.class} />\r\n </Show>\r\n </div>\r\n\r\n {/* Cột giữa: dot + connector */}\r\n <div class=\"tl08\">\r\n <TimelineDot item={item} colorClass={itemColorClass()} class={p.class?.dot} />\r\n <Show when={!isLast()}>\r\n <div class={cn('tl09', p.class?.connector)} />\r\n </Show>\r\n </div>\r\n\r\n {/* Cột bên end (phải) */}\r\n <div class={cn('tl10', p.class?.label)}>\r\n <Show when={pos() === 'end'}>\r\n <TimelineContent item={item} class={p.class} />\r\n </Show>\r\n </div>\r\n </Show>\r\n\r\n {/* ── Horizontal layout ── */}\r\n <Show when={!isVertical()}>\r\n {/* Hàng trên (start) */}\r\n <div class={cn('tl11', p.class?.label)}>\r\n <Show when={pos() === 'start'}>\r\n <TimelineContent item={item} class={p.class} />\r\n </Show>\r\n </div>\r\n\r\n {/* Hàng giữa: connector + dot + connector */}\r\n <div class=\"tl12\">\r\n <div class={cn('tl13', i() === 0 && 'tl-invisible', p.class?.connector)} />\r\n <TimelineDot item={item} colorClass={itemColorClass()} class={p.class?.dot} />\r\n <div class={cn('tl13', isLast() && 'tl-invisible', p.class?.connector)} />\r\n </div>\r\n\r\n {/* Hàng dưới (end) */}\r\n <div class={cn('tl14', p.class?.label)}>\r\n <Show when={pos() === 'end'}>\r\n <TimelineContent item={item} class={p.class} />\r\n </Show>\r\n </div>\r\n </Show>\r\n </div>\r\n );\r\n }}\r\n </For>\r\n </div>\r\n );\r\n};\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"timeline.js","names":["BaseColorProps","cn","getColor","AlertCircle","Check","Clock","Component","createMemo","For","JSX","mergeProps","Show","splitProps","TimelineItem","TimelineItemStatus","TimelineProps","STATUS_COLOR","Record","pending","active","done","error","resolveItemColor","item","globalColor","color","status","DotProps","colorClass","class","TimelineDot","p","_el$","_tmpl$3","_$insert","_$createComponent","when","loading","children","_tmpl$","_$memo","icon","_el$3","_tmpl$2","size","_$effect","_$className","ContentProps","TimelineContent","_el$4","timestamp","_el$5","title","_el$6","content","_el$7","description","resolvePosition","mode","itemPosition","index","Timeline","props","merged","items","orientation","const","reverse","nativeProps","isVertical","displayItems","globalColorClass","_el$8","_$spread","_$mergeProps","root","each","i","pos","position","itemColorClass","isLast","length","_el$9","_el$0","label","_el$1","_tmpl$4","dot","_el$10","connector","_el$11","_el$12","_el$13","_tmpl$5","_el$14","firstChild","_el$15","nextSibling","_p$","_v$","_v$2","e","t","undefined","_el$16"],"sources":["../../../src/components/timeline/timeline.tsx"],"sourcesContent":["import { BaseColorProps } from '@/type';\nimport { cn } from '@/utils/cn';\nimport { getColor } from '@/utils/helper';\nimport AlertCircle from 'lucide-solid/icons/alert-circle';\nimport Check from 'lucide-solid/icons/check';\nimport Clock from 'lucide-solid/icons/clock';\nimport { Component, createMemo, For, JSX, mergeProps, Show, splitProps } from 'solid-js';\nimport { TimelineItem, TimelineItemStatus, TimelineProps } from './timeline.types';\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\n/** Map status → màu DaisyUI mặc định (dùng khi item không có `color` prop) */\nconst STATUS_COLOR: Record<TimelineItemStatus, BaseColorProps> = {\n pending: 'neutral',\n active: 'primary',\n done: 'success',\n error: 'error',\n};\n\n/** Resolve màu cuối cùng của item: ưu tiên item.color > status-mapped > global */\nconst resolveItemColor = (item: TimelineItem, globalColor: BaseColorProps): BaseColorProps => {\n if (item.color) return item.color;\n if (item.status) return STATUS_COLOR[item.status];\n return globalColor;\n};\n\n// ─── TimelineDot — marker của mỗi item ───────────────────────────────────────\n\ntype DotProps = {\n item: TimelineItem;\n colorClass: string;\n class?: string;\n};\n\nconst TimelineDot: Component<DotProps> = p => {\n const status = () => p.item.status ?? 'done';\n\n return (\n <div class={cn('tl15', p.colorClass, `tl-s-${status()}`, p.class)}>\n {/* Loading spinner */}\n <Show when={p.item.loading}>\n <span class=\"loading loading-spinner tl16\" />\n </Show>\n\n {/* Custom icon */}\n <Show when={!p.item.loading && p.item.icon}>\n <span class=\"tl17\">{p.item.icon!()}</span>\n </Show>\n\n {/* Default icon theo status */}\n <Show when={!p.item.loading && !p.item.icon}>\n <Show when={status() === 'done'}>\n <Check size={12} stroke-width={3} />\n </Show>\n <Show when={status() === 'error'}>\n <AlertCircle size={12} stroke-width={2.5} />\n </Show>\n <Show when={status() === 'pending'}>\n <Clock size={11} stroke-width={2} />\n </Show>\n {/* active: chỉ hiện dot rỗng — style CSS xử lý */}\n </Show>\n </div>\n );\n};\n\n// ─── TimelineItemContent — tiêu đề + nội dung + thời gian ────────────────────\n\ntype ContentProps = {\n item: TimelineItem;\n class?: TimelineProps['class'];\n};\n\nconst TimelineContent: Component<ContentProps> = p => (\n <div class={cn('tl18', p.class?.content)}>\n <Show when={p.item.timestamp}>\n <div class={cn('tl21', p.class?.timestamp)}>{p.item.timestamp}</div>\n </Show>\n <Show when={p.item.title}>\n <div class={cn('tl19', p.class?.title)}>{p.item.title}</div>\n </Show>\n <Show when={p.item.content}>\n <div class={cn('tl20', p.class?.description)}>{p.item.content}</div>\n </Show>\n </div>\n);\n\n// ─── Tính vị trí nội dung dựa trên mode & item.position ──────────────────────\n\nconst resolvePosition = (\n mode: TimelineProps['mode'],\n itemPosition: TimelineItem['position'],\n index: number,\n): 'start' | 'end' => {\n if (itemPosition) return itemPosition;\n if (mode === 'start') return 'start';\n if (mode === 'end') return 'end';\n // alternate: chẵn = start, lẻ = end\n return index % 2 === 0 ? 'start' : 'end';\n};\n\n// ─── Main Component ───────────────────────────────────────────────────────────\n\nexport const Timeline: Component<TimelineProps> = props => {\n const merged = mergeProps(\n {\n items: [] as TimelineItem[],\n color: 'primary' as BaseColorProps,\n orientation: 'vertical' as const,\n mode: 'alternate' as const,\n reverse: false,\n },\n props,\n );\n\n const [p, nativeProps] = splitProps(merged, [\n 'items',\n 'color',\n 'orientation',\n 'mode',\n 'reverse',\n 'class',\n ]);\n\n const isVertical = () => p.orientation === 'vertical';\n\n const displayItems = createMemo(() => (p.reverse ? [...p.items].reverse() : p.items));\n\n const globalColorClass = () => getColor(p.color, 'color-primary');\n\n return (\n <div\n {...nativeProps}\n class={cn(\n 'tl01',\n isVertical() ? 'tl02' : 'tl03',\n `tl-mode-${p.mode}`,\n globalColorClass(),\n p.class?.root,\n )}\n >\n <For each={displayItems()}>\n {(item, i) => {\n const pos = () => resolvePosition(p.mode, item.position, i());\n const itemColorClass = () => getColor(resolveItemColor(item, p.color), 'color-primary');\n const isLast = () => i() === displayItems().length - 1;\n\n return (\n <div\n class={cn(\n 'tl04',\n isVertical() ? 'tl05' : 'tl06',\n `tl-pos-${pos()}`,\n `tl-s-${item.status ?? 'done'}`,\n p.class?.item,\n )}\n >\n {/* ── Vertical layout ── */}\n <Show when={isVertical()}>\n {/* Cột bên start (trái) */}\n <div class={cn('tl07', p.class?.label)}>\n <Show when={pos() === 'start'}>\n <TimelineContent item={item} class={p.class} />\n </Show>\n </div>\n\n {/* Cột giữa: dot + connector */}\n <div class=\"tl08\">\n <TimelineDot item={item} colorClass={itemColorClass()} class={p.class?.dot} />\n <Show when={!isLast()}>\n <div class={cn('tl09', p.class?.connector)} />\n </Show>\n </div>\n\n {/* Cột bên end (phải) */}\n <div class={cn('tl10', p.class?.label)}>\n <Show when={pos() === 'end'}>\n <TimelineContent item={item} class={p.class} />\n </Show>\n </div>\n </Show>\n\n {/* ── Horizontal layout ── */}\n <Show when={!isVertical()}>\n {/* Hàng trên (start) */}\n <div class={cn('tl11', p.class?.label)}>\n <Show when={pos() === 'start'}>\n <TimelineContent item={item} class={p.class} />\n </Show>\n </div>\n\n {/* Hàng giữa: connector + dot + connector */}\n <div class=\"tl12\">\n <div class={cn('tl13', i() === 0 && 'tl-invisible', p.class?.connector)} />\n <TimelineDot item={item} colorClass={itemColorClass()} class={p.class?.dot} />\n <div class={cn('tl13', isLast() && 'tl-invisible', p.class?.connector)} />\n </div>\n\n {/* Hàng dưới (end) */}\n <div class={cn('tl14', p.class?.label)}>\n <Show when={pos() === 'end'}>\n <TimelineContent item={item} class={p.class} />\n </Show>\n </div>\n </Show>\n </div>\n );\n }}\n </For>\n </div>\n );\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorIcon.js","names":["genSVGCubicBezier","Component","IconProps","MainCircle","SecondaryCircle","Error","props","fill","primary","_el$","_tmpl$","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","_$insert","_$createComponent","_$spread","_$mergeProps","_$effect","_p$","_v$","secondary","_v$2","e","_$setAttribute","t","undefined"],"sources":["../../../../src/components/toast/icons/ErrorIcon.tsx"],"sourcesContent":["import { genSVGCubicBezier } from '@/utils/helper';\r\nimport type { Component } from 'solid-js';\r\nimport { IconProps } from '../toast.type';\r\nimport { MainCircle, SecondaryCircle } from './IconCircle';\r\n\r\nexport const Error: Component<IconProps> = props => {\r\n const fill = props.primary || 'var(--color-error)';\r\n return (\r\n <svg style={{ overflow: 'visible' }} viewBox=\"0 0 32 32\" width=\"1.25rem\" height=\"1.25rem\">\r\n <MainCircle fill={fill} />\r\n <SecondaryCircle fill={fill} />\r\n <path\r\n fill=\"none\"\r\n stroke={props.secondary || '#fff'}\r\n stroke-width=\"4\"\r\n stroke-dasharray=\"9\"\r\n stroke-dashoffset=\"9\"\r\n stroke-linecap=\"round\"\r\n d=\"M16,7l0,9\"\r\n >\r\n <animate\r\n attributeName=\"stroke-dashoffset\"\r\n values=\"9;0\"\r\n dur=\"0.2s\"\r\n begin=\"250ms\"\r\n fill=\"freeze\"\r\n {...genSVGCubicBezier('0.0, 0.0, 0.58, 1.0')}\r\n />\r\n </path>\r\n <circle fill={props.secondary || '#fff'} cx=\"16\" cy=\"23\" r=\"2.5\" opacity=\"0\">\r\n <animate\r\n attributeName=\"opacity\"\r\n values=\"0;1\"\r\n dur=\"0.25s\"\r\n begin=\"350ms\"\r\n fill=\"freeze\"\r\n {...genSVGCubicBezier('0.0, 0.0, 0.58, 1.0')}\r\n />\r\n </circle>\r\n </svg>\r\n );\r\n};\r\n"],"mappings":"upBAKaK,EAA8BC,GAAS,CAClD,IAAMC,EAAOD,EAAME,SAAW,qBAC9B,WAAA,CAAA,IAAAC,EAAAC,GAAA,CAAAC,EAAAF,EAAAG,WAAAC,EAAAF,EAAAC,WAAAE,EAAAH,EAAAI,YAAAC,EAAAF,EAAAF,WAsB2C,OAtB3CK,EAAAR,EAAAS,EAEKf,EAAU,CAAOI,OAAI,CAAA,CAAAI,EAAA,CAAAM,EAAAR,EAAAS,EACrBd,EAAe,CAAOG,OAAI,CAAA,CAAAI,EAAA,CAAAQ,EAAAN,EAAAO,MAgBnBpB,EAAkB,sBAAsB,CAAA,CAAA,GAAA,GAAA,CAAAmB,EAAAH,EAAAI,MAUxCpB,EAAkB,sBAAsB,CAAA,CAAA,GAAA,GAAA,CAAAqB,EAAAC,GAAA,CAAA,IAAAC,EAvBtCjB,EAAMkB,WAAa,OAAMC,EAgBrBnB,EAAMkB,WAAa,OAAM,OAAAD,IAAAD,EAAAI,GAAAC,EAAAhB,EAAA,SAAAW,EAAAI,EAAAH,EAAA,CAAAE,IAAAH,EAAAM,GAAAD,EAAAb,EAAA,OAAAQ,EAAAM,EAAAH,EAAA,CAAAH,GAAA,CAAAI,EAAAG,IAAAA,GAAAD,EAAAC,IAAAA,GAAA,CAAA,CAAApB,KAAA"}
1
+ {"version":3,"file":"ErrorIcon.js","names":["genSVGCubicBezier","Component","IconProps","MainCircle","SecondaryCircle","Error","props","fill","primary","_el$","_tmpl$","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","_$insert","_$createComponent","_$spread","_$mergeProps","_$effect","_p$","_v$","secondary","_v$2","e","_$setAttribute","t","undefined"],"sources":["../../../../src/components/toast/icons/ErrorIcon.tsx"],"sourcesContent":["import { genSVGCubicBezier } from '@/utils/helper';\nimport type { Component } from 'solid-js';\nimport { IconProps } from '../toast.type';\nimport { MainCircle, SecondaryCircle } from './IconCircle';\n\nexport const Error: Component<IconProps> = props => {\n const fill = props.primary || 'var(--color-error)';\n return (\n <svg style={{ overflow: 'visible' }} viewBox=\"0 0 32 32\" width=\"1.25rem\" height=\"1.25rem\">\n <MainCircle fill={fill} />\n <SecondaryCircle fill={fill} />\n <path\n fill=\"none\"\n stroke={props.secondary || '#fff'}\n stroke-width=\"4\"\n stroke-dasharray=\"9\"\n stroke-dashoffset=\"9\"\n stroke-linecap=\"round\"\n d=\"M16,7l0,9\"\n >\n <animate\n attributeName=\"stroke-dashoffset\"\n values=\"9;0\"\n dur=\"0.2s\"\n begin=\"250ms\"\n fill=\"freeze\"\n {...genSVGCubicBezier('0.0, 0.0, 0.58, 1.0')}\n />\n </path>\n <circle fill={props.secondary || '#fff'} cx=\"16\" cy=\"23\" r=\"2.5\" opacity=\"0\">\n <animate\n attributeName=\"opacity\"\n values=\"0;1\"\n dur=\"0.25s\"\n begin=\"350ms\"\n fill=\"freeze\"\n {...genSVGCubicBezier('0.0, 0.0, 0.58, 1.0')}\n />\n </circle>\n </svg>\n );\n};\n"],"mappings":"upBAKaK,EAA8BC,GAAS,CAClD,IAAMC,EAAOD,EAAME,SAAW,qBAC9B,WAAA,CAAA,IAAAC,EAAAC,GAAA,CAAAC,EAAAF,EAAAG,WAAAC,EAAAF,EAAAC,WAAAE,EAAAH,EAAAI,YAAAC,EAAAF,EAAAF,WAsB2C,OAtB3CK,EAAAR,EAAAS,EAEKf,EAAU,CAAOI,OAAI,CAAA,CAAAI,EAAA,CAAAM,EAAAR,EAAAS,EACrBd,EAAe,CAAOG,OAAI,CAAA,CAAAI,EAAA,CAAAQ,EAAAN,EAAAO,MAgBnBpB,EAAkB,sBAAsB,CAAA,CAAA,GAAA,GAAA,CAAAmB,EAAAH,EAAAI,MAUxCpB,EAAkB,sBAAsB,CAAA,CAAA,GAAA,GAAA,CAAAqB,EAAAC,GAAA,CAAA,IAAAC,EAvBtCjB,EAAMkB,WAAa,OAAMC,EAgBrBnB,EAAMkB,WAAa,OAAM,OAAAD,IAAAD,EAAAI,GAAAC,EAAAhB,EAAA,SAAAW,EAAAI,EAAAH,EAAA,CAAAE,IAAAH,EAAAM,GAAAD,EAAAb,EAAA,OAAAQ,EAAAM,EAAAH,EAAA,CAAAH,GAAA,CAAAI,EAAAG,IAAAA,GAAAD,EAAAC,IAAAA,GAAA,CAAA,CAAApB,KAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"IconCircle.js","names":["genSVGCubicBezier","Component","JSX","MainCircle","fill","props","publicProps","AnimateSVGAttributes","SVGAnimateElement","dur","begin","calcMode","keyTimes","keySplines","_el$","_tmpl$","_el$2","firstChild","_el$3","nextSibling","_$spread","_$effect","_$setAttribute","SecondaryCircle","_el$4","_tmpl$2","_el$5","_el$6"],"sources":["../../../../src/components/toast/icons/IconCircle.tsx"],"sourcesContent":["import { genSVGCubicBezier } from '@/utils/helper';\r\nimport { Component } from 'solid-js';\r\nimport type { JSX } from 'solid-js';\r\n\r\nexport const MainCircle: Component<{ fill: string }> = props => {\r\n const publicProps: JSX.AnimateSVGAttributes<SVGAnimateElement> = {\r\n dur: '0.35s',\r\n begin: '100ms',\r\n fill: 'freeze',\r\n calcMode: 'spline',\r\n keyTimes: '0; 0.6; 1',\r\n keySplines: '0.25 0.71 0.4 0.88; .59 .22 .87 .63',\r\n };\r\n return (\r\n <circle fill={props.fill} cx=\"16\" cy=\"16\" r=\"0\">\r\n <animate attributeName=\"opacity\" values=\"0; 1; 1\" {...publicProps} />\r\n <animate attributeName=\"r\" values=\"0; 17.5; 16\" {...publicProps} />\r\n </circle>\r\n );\r\n};\r\n\r\nexport const SecondaryCircle: Component<{ fill: string; begin?: string }> = props => {\r\n const publicProps: JSX.AnimateSVGAttributes<SVGAnimateElement> = {\r\n dur: '1s',\r\n begin: props.begin || '320ms',\r\n fill: 'freeze',\r\n ...genSVGCubicBezier('0.0 0.0 0.2 1'),\r\n };\r\n return (\r\n <circle fill={props.fill} cx=\"16\" cy=\"16\" r=\"12\" opacity=\"0\">\r\n <animate attributeName=\"opacity\" values=\"1; 0\" {...publicProps} />\r\n <animate attributeName=\"r\" values=\"12; 26\" {...publicProps} />\r\n </circle>\r\n );\r\n};\r\n"],"mappings":"8cAIaG,EAA0CE,GAAS,CAC9D,IAAMC,EAA2D,CAC/DG,IAAK,QACLC,MAAO,QACPN,KAAM,SACNO,SAAU,SACVC,SAAU,YACVC,WAAY,sCACb,CACD,WAAA,CAAA,IAAAC,EAAAC,GAAA,CAAAC,EAAAF,EAAAG,WAAAC,EAAAF,EAAAG,YAC0B,OAD1BC,EAAAJ,EAE0DV,EAAW,GAAA,GAAA,CAAAc,EAAAF,EACbZ,EAAW,GAAA,GAAA,CAAAe,MAAAC,EAAAR,EAAA,OAFnDT,EAAMD,KAAI,CAAA,CAAAU,KAAA,EAOfS,EAA+DlB,GAAS,CACnF,IAAMC,EAA2D,CAC/DG,IAAK,KACLC,MAAOL,EAAMK,OAAS,QACtBN,KAAM,SACN,GAAGJ,EAAkB,gBAAe,CACrC,CACD,WAAA,CAAA,IAAAwB,EAAAC,GAAA,CAAAC,EAAAF,EAAAP,WAAAU,EAAAD,EAAAP,YAC0B,OAD1BC,EAAAM,EAEuDpB,EAAW,GAAA,GAAA,CAAAc,EAAAO,EACfrB,EAAW,GAAA,GAAA,CAAAe,MAAAC,EAAAE,EAAA,OAF9CnB,EAAMD,KAAI,CAAA,CAAAoB,KAAA"}
1
+ {"version":3,"file":"IconCircle.js","names":["genSVGCubicBezier","Component","JSX","MainCircle","fill","props","publicProps","AnimateSVGAttributes","SVGAnimateElement","dur","begin","calcMode","keyTimes","keySplines","_el$","_tmpl$","_el$2","firstChild","_el$3","nextSibling","_$spread","_$effect","_$setAttribute","SecondaryCircle","_el$4","_tmpl$2","_el$5","_el$6"],"sources":["../../../../src/components/toast/icons/IconCircle.tsx"],"sourcesContent":["import { genSVGCubicBezier } from '@/utils/helper';\nimport { Component } from 'solid-js';\nimport type { JSX } from 'solid-js';\n\nexport const MainCircle: Component<{ fill: string }> = props => {\n const publicProps: JSX.AnimateSVGAttributes<SVGAnimateElement> = {\n dur: '0.35s',\n begin: '100ms',\n fill: 'freeze',\n calcMode: 'spline',\n keyTimes: '0; 0.6; 1',\n keySplines: '0.25 0.71 0.4 0.88; .59 .22 .87 .63',\n };\n return (\n <circle fill={props.fill} cx=\"16\" cy=\"16\" r=\"0\">\n <animate attributeName=\"opacity\" values=\"0; 1; 1\" {...publicProps} />\n <animate attributeName=\"r\" values=\"0; 17.5; 16\" {...publicProps} />\n </circle>\n );\n};\n\nexport const SecondaryCircle: Component<{ fill: string; begin?: string }> = props => {\n const publicProps: JSX.AnimateSVGAttributes<SVGAnimateElement> = {\n dur: '1s',\n begin: props.begin || '320ms',\n fill: 'freeze',\n ...genSVGCubicBezier('0.0 0.0 0.2 1'),\n };\n return (\n <circle fill={props.fill} cx=\"16\" cy=\"16\" r=\"12\" opacity=\"0\">\n <animate attributeName=\"opacity\" values=\"1; 0\" {...publicProps} />\n <animate attributeName=\"r\" values=\"12; 26\" {...publicProps} />\n </circle>\n );\n};\n"],"mappings":"8cAIaG,EAA0CE,GAAS,CAC9D,IAAMC,EAA2D,CAC/DG,IAAK,QACLC,MAAO,QACPN,KAAM,SACNO,SAAU,SACVC,SAAU,YACVC,WAAY,sCACb,CACD,WAAA,CAAA,IAAAC,EAAAC,GAAA,CAAAC,EAAAF,EAAAG,WAAAC,EAAAF,EAAAG,YAC0B,OAD1BC,EAAAJ,EAE0DV,EAAW,GAAA,GAAA,CAAAc,EAAAF,EACbZ,EAAW,GAAA,GAAA,CAAAe,MAAAC,EAAAR,EAAA,OAFnDT,EAAMD,KAAI,CAAA,CAAAU,KAAA,EAOfS,EAA+DlB,GAAS,CACnF,IAAMC,EAA2D,CAC/DG,IAAK,KACLC,MAAOL,EAAMK,OAAS,QACtBN,KAAM,SACN,GAAGJ,EAAkB,gBAAe,CACrC,CACD,WAAA,CAAA,IAAAwB,EAAAC,GAAA,CAAAC,EAAAF,EAAAP,WAAAU,EAAAD,EAAAP,YAC0B,OAD1BC,EAAAM,EAEuDpB,EAAW,GAAA,GAAA,CAAAc,EAAAO,EACfrB,EAAW,GAAA,GAAA,CAAAe,MAAAC,EAAAE,EAAA,OAF9CnB,EAAMD,KAAI,CAAA,CAAAoB,KAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"InfoIcon.js","names":["genSVGCubicBezier","Component","IconProps","MainCircle","SecondaryCircle","Info","props","fill","_el$","_tmpl$","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","_$insert","_$createComponent","_$spread","_$mergeProps","_$effect","_p$","_v$","secondary","_v$2","e","_$setAttribute","t","undefined"],"sources":["../../../../src/components/toast/icons/InfoIcon.tsx"],"sourcesContent":["import { genSVGCubicBezier } from '@/utils/helper';\r\nimport type { Component } from 'solid-js';\r\nimport { IconProps } from '../toast.type';\r\nimport { MainCircle, SecondaryCircle } from './IconCircle';\r\n\r\nexport const Info: Component<IconProps> = props => {\r\n const fill = 'var(--color-info)';\r\n return (\r\n <svg\r\n style={{ overflow: 'visible' }}\r\n viewBox=\"0 0 32 32\"\r\n width=\"1.25rem\"\r\n height=\"1.25rem\"\r\n class=\"rotate-180\"\r\n >\r\n <MainCircle fill={fill} />\r\n <SecondaryCircle fill={fill} />\r\n <path\r\n fill=\"none\"\r\n stroke={props.secondary || '#fff'}\r\n stroke-width=\"4\"\r\n stroke-dasharray=\"9\"\r\n stroke-dashoffset=\"9\"\r\n stroke-linecap=\"round\"\r\n d=\"M16,7l0,9\"\r\n >\r\n <animate\r\n attributeName=\"stroke-dashoffset\"\r\n values=\"9;0\"\r\n dur=\"0.2s\"\r\n begin=\"250ms\"\r\n fill=\"freeze\"\r\n {...genSVGCubicBezier('0.0, 0.0, 0.58, 1.0')}\r\n />\r\n </path>\r\n <circle fill={props.secondary || '#fff'} cx=\"16\" cy=\"23\" r=\"2.5\" opacity=\"0\">\r\n <animate\r\n attributeName=\"opacity\"\r\n values=\"0;1\"\r\n dur=\"0.25s\"\r\n begin=\"350ms\"\r\n fill=\"freeze\"\r\n {...genSVGCubicBezier('0.0, 0.0, 0.58, 1.0')}\r\n />\r\n </circle>\r\n </svg>\r\n );\r\n};\r\n"],"mappings":"wqBAKaK,EAA6BC,GAAS,CACjD,IAAMC,EAAO,oBACb,WAAA,CAAA,IAAAC,EAAAC,GAAA,CAAAC,EAAAF,EAAAG,WAAAC,EAAAF,EAAAC,WAAAE,EAAAH,EAAAI,YAAAC,EAAAF,EAAAF,WA4B2C,OA5B3CK,EAAAR,EAAAS,EAQKd,EAAU,CAAOI,OAAI,CAAA,CAAAG,EAAA,CAAAM,EAAAR,EAAAS,EACrBb,EAAe,CAAOG,OAAI,CAAA,CAAAG,EAAA,CAAAQ,EAAAN,EAAAO,MAgBnBnB,EAAkB,sBAAsB,CAAA,CAAA,GAAA,GAAA,CAAAkB,EAAAH,EAAAI,MAUxCnB,EAAkB,sBAAsB,CAAA,CAAA,GAAA,GAAA,CAAAoB,EAAAC,GAAA,CAAA,IAAAC,EAvBtChB,EAAMiB,WAAa,OAAMC,EAgBrBlB,EAAMiB,WAAa,OAAM,OAAAD,IAAAD,EAAAI,GAAAC,EAAAhB,EAAA,SAAAW,EAAAI,EAAAH,EAAA,CAAAE,IAAAH,EAAAM,GAAAD,EAAAb,EAAA,OAAAQ,EAAAM,EAAAH,EAAA,CAAAH,GAAA,CAAAI,EAAAG,IAAAA,GAAAD,EAAAC,IAAAA,GAAA,CAAA,CAAApB,KAAA"}
1
+ {"version":3,"file":"InfoIcon.js","names":["genSVGCubicBezier","Component","IconProps","MainCircle","SecondaryCircle","Info","props","fill","_el$","_tmpl$","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","_$insert","_$createComponent","_$spread","_$mergeProps","_$effect","_p$","_v$","secondary","_v$2","e","_$setAttribute","t","undefined"],"sources":["../../../../src/components/toast/icons/InfoIcon.tsx"],"sourcesContent":["import { genSVGCubicBezier } from '@/utils/helper';\nimport type { Component } from 'solid-js';\nimport { IconProps } from '../toast.type';\nimport { MainCircle, SecondaryCircle } from './IconCircle';\n\nexport const Info: Component<IconProps> = props => {\n const fill = 'var(--color-info)';\n return (\n <svg\n style={{ overflow: 'visible' }}\n viewBox=\"0 0 32 32\"\n width=\"1.25rem\"\n height=\"1.25rem\"\n class=\"rotate-180\"\n >\n <MainCircle fill={fill} />\n <SecondaryCircle fill={fill} />\n <path\n fill=\"none\"\n stroke={props.secondary || '#fff'}\n stroke-width=\"4\"\n stroke-dasharray=\"9\"\n stroke-dashoffset=\"9\"\n stroke-linecap=\"round\"\n d=\"M16,7l0,9\"\n >\n <animate\n attributeName=\"stroke-dashoffset\"\n values=\"9;0\"\n dur=\"0.2s\"\n begin=\"250ms\"\n fill=\"freeze\"\n {...genSVGCubicBezier('0.0, 0.0, 0.58, 1.0')}\n />\n </path>\n <circle fill={props.secondary || '#fff'} cx=\"16\" cy=\"23\" r=\"2.5\" opacity=\"0\">\n <animate\n attributeName=\"opacity\"\n values=\"0;1\"\n dur=\"0.25s\"\n begin=\"350ms\"\n fill=\"freeze\"\n {...genSVGCubicBezier('0.0, 0.0, 0.58, 1.0')}\n />\n </circle>\n </svg>\n );\n};\n"],"mappings":"wqBAKaK,EAA6BC,GAAS,CACjD,IAAMC,EAAO,oBACb,WAAA,CAAA,IAAAC,EAAAC,GAAA,CAAAC,EAAAF,EAAAG,WAAAC,EAAAF,EAAAC,WAAAE,EAAAH,EAAAI,YAAAC,EAAAF,EAAAF,WA4B2C,OA5B3CK,EAAAR,EAAAS,EAQKd,EAAU,CAAOI,OAAI,CAAA,CAAAG,EAAA,CAAAM,EAAAR,EAAAS,EACrBb,EAAe,CAAOG,OAAI,CAAA,CAAAG,EAAA,CAAAQ,EAAAN,EAAAO,MAgBnBnB,EAAkB,sBAAsB,CAAA,CAAA,GAAA,GAAA,CAAAkB,EAAAH,EAAAI,MAUxCnB,EAAkB,sBAAsB,CAAA,CAAA,GAAA,GAAA,CAAAoB,EAAAC,GAAA,CAAA,IAAAC,EAvBtChB,EAAMiB,WAAa,OAAMC,EAgBrBlB,EAAMiB,WAAa,OAAM,OAAAD,IAAAD,EAAAI,GAAAC,EAAAhB,EAAA,SAAAW,EAAAI,EAAAH,EAAA,CAAAE,IAAAH,EAAAM,GAAAD,EAAAb,EAAA,OAAAQ,EAAAM,EAAAH,EAAA,CAAAH,GAAA,CAAAI,EAAAG,IAAAA,GAAAD,EAAAC,IAAAA,GAAA,CAAA,CAAApB,KAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"LoaderIcon.js","names":["Component","IconProps","Loader","props","_el$","_tmpl$","_el$2","firstChild","_el$3","nextSibling","_$effect","_p$","_v$","primary","_v$2","secondary","e","_$setAttribute","t","undefined"],"sources":["../../../../src/components/toast/icons/LoaderIcon.tsx"],"sourcesContent":["import type { Component } from 'solid-js';\r\nimport { IconProps } from '../toast.type';\r\n\r\nexport const Loader: Component<IconProps> = props => (\r\n <svg style={{ overflow: 'visible' }} viewBox=\"0 0 32 32\" width=\"1.25rem\" height=\"1.25rem\">\r\n <path\r\n fill=\"none\"\r\n stroke={props.primary || 'oklch(0.9276 0.0058 264.53)'}\r\n stroke-width=\"4\"\r\n stroke-miterlimit=\"10\"\r\n d=\"M16,6c3,0,5.7,1.3,7.5,3.4c1.5,1.8,2.5,4,2.5,6.6c0,5.5-4.5,10-10,10S6,21.6,6,16S10.5,6,16,6z\"\r\n />\r\n <path\r\n fill=\"none\"\r\n stroke={props.secondary || 'oklch(0.4461 0.0263 256.8)'}\r\n stroke-width=\"4\"\r\n stroke-linecap=\"round\"\r\n stroke-miterlimit=\"10\"\r\n d=\"M16,6c3,0,5.7,1.3,7.5,3.4c0.6,0.7,1.1,1.4,1.5,2.2\"\r\n >\r\n <animateTransform\r\n attributeName=\"transform\"\r\n type=\"rotate\"\r\n from=\"0 16 16\"\r\n to=\"360 16 16\"\r\n dur=\"0.75s\"\r\n repeatCount=\"indefinite\"\r\n />\r\n </path>\r\n </svg>\r\n);\r\n"],"mappings":"uiBAGaE,EAA+BC,QAAK,CAAA,IAAAC,EAAAC,GAAA,CAAAC,EAAAF,EAAAG,WAAAC,EAAAF,EAAAG,YAWY,OAXZC,EAAAC,GAAA,CAAA,IAAAC,EAInCT,EAAMU,SAAW,8BAA6BC,EAO9CX,EAAMY,WAAa,6BAA4B,OAAAH,IAAAD,EAAAK,GAAAC,EAAAX,EAAA,SAAAK,EAAAK,EAAAJ,EAAA,CAAAE,IAAAH,EAAAO,GAAAD,EAAAT,EAAA,SAAAG,EAAAO,EAAAJ,EAAA,CAAAH,GAAA,CAAAK,EAAAG,IAAAA,GAAAD,EAAAC,IAAAA,GAAA,CAAA,CAAAf,KAgB5D"}
1
+ {"version":3,"file":"LoaderIcon.js","names":["Component","IconProps","Loader","props","_el$","_tmpl$","_el$2","firstChild","_el$3","nextSibling","_$effect","_p$","_v$","primary","_v$2","secondary","e","_$setAttribute","t","undefined"],"sources":["../../../../src/components/toast/icons/LoaderIcon.tsx"],"sourcesContent":["import type { Component } from 'solid-js';\nimport { IconProps } from '../toast.type';\n\nexport const Loader: Component<IconProps> = props => (\n <svg style={{ overflow: 'visible' }} viewBox=\"0 0 32 32\" width=\"1.25rem\" height=\"1.25rem\">\n <path\n fill=\"none\"\n stroke={props.primary || 'oklch(0.9276 0.0058 264.53)'}\n stroke-width=\"4\"\n stroke-miterlimit=\"10\"\n d=\"M16,6c3,0,5.7,1.3,7.5,3.4c1.5,1.8,2.5,4,2.5,6.6c0,5.5-4.5,10-10,10S6,21.6,6,16S10.5,6,16,6z\"\n />\n <path\n fill=\"none\"\n stroke={props.secondary || 'oklch(0.4461 0.0263 256.8)'}\n stroke-width=\"4\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n d=\"M16,6c3,0,5.7,1.3,7.5,3.4c0.6,0.7,1.1,1.4,1.5,2.2\"\n >\n <animateTransform\n attributeName=\"transform\"\n type=\"rotate\"\n from=\"0 16 16\"\n to=\"360 16 16\"\n dur=\"0.75s\"\n repeatCount=\"indefinite\"\n />\n </path>\n </svg>\n);\n"],"mappings":"uiBAGaE,EAA+BC,QAAK,CAAA,IAAAC,EAAAC,GAAA,CAAAC,EAAAF,EAAAG,WAAAC,EAAAF,EAAAG,YAWY,OAXZC,EAAAC,GAAA,CAAA,IAAAC,EAInCT,EAAMU,SAAW,8BAA6BC,EAO9CX,EAAMY,WAAa,6BAA4B,OAAAH,IAAAD,EAAAK,GAAAC,EAAAX,EAAA,SAAAK,EAAAK,EAAAJ,EAAA,CAAAE,IAAAH,EAAAO,GAAAD,EAAAT,EAAA,SAAAG,EAAAO,EAAAJ,EAAA,CAAAH,GAAA,CAAAK,EAAAG,IAAAA,GAAAD,EAAAC,IAAAA,GAAA,CAAA,CAAAf,KAgB5D"}
@@ -1 +1 @@
1
- {"version":3,"file":"SuccessIcon.js","names":["genSVGCubicBezier","Component","IconProps","MainCircle","SecondaryCircle","Success","props","fill","primary","_el$","_tmpl$","_el$2","firstChild","_el$3","_$insert","_$createComponent","begin","_$spread","_$mergeProps","_$effect","_$setAttribute","secondary"],"sources":["../../../../src/components/toast/icons/SuccessIcon.tsx"],"sourcesContent":["import { genSVGCubicBezier } from '@/utils/helper';\r\nimport type { Component } from 'solid-js';\r\nimport { IconProps } from '../toast.type';\r\nimport { MainCircle, SecondaryCircle } from './IconCircle';\r\n\r\nexport const Success: Component<IconProps> = (props: IconProps) => {\r\n const fill = props.primary || 'var(--color-success)';\r\n return (\r\n <svg style={{ overflow: 'visible' }} viewBox=\"0 0 32 32\" width=\"1.25rem\" height=\"1.25rem\">\r\n <MainCircle fill={fill} />\r\n <SecondaryCircle fill={fill} begin=\"350ms\" />\r\n <path\r\n fill=\"none\"\r\n stroke={props.secondary || 'oklch(0.9911 0 0)'}\r\n stroke-width=\"4\"\r\n stroke-dasharray=\"22\"\r\n stroke-dashoffset=\"22\"\r\n stroke-linecap=\"round\"\r\n stroke-miterlimit=\"10\"\r\n d=\"M9.8,17.2l3.8,3.6c0.1,0.1,0.3,0.1,0.4,0l9.6-9.7\"\r\n >\r\n <animate\r\n attributeName=\"stroke-dashoffset\"\r\n values=\"22;0\"\r\n dur=\"0.25s\"\r\n begin=\"250ms\"\r\n fill=\"freeze\"\r\n {...genSVGCubicBezier('0.0, 0.0, 0.58, 1.0')}\r\n />\r\n </path>\r\n </svg>\r\n );\r\n};\r\n"],"mappings":"qlBAKaK,EAAiCC,GAAqB,CACjE,IAAMC,EAAOD,EAAME,SAAW,uBAC9B,WAAA,CAAA,IAAAC,EAAAC,GAAA,CAAAC,EAAAF,EAAAG,WAAAC,EAAAF,EAAAC,WAMoD,OANpDE,EAAAL,EAAAM,EAEKZ,EAAU,CAAOI,OAAI,CAAA,CAAAI,EAAA,CAAAG,EAAAL,EAAAM,EACrBX,EAAe,CAAOG,OAAMS,MAAK,QAAA,CAAA,CAAAL,EAAA,CAAAM,EAAAJ,EAAAK,MAiB1BlB,EAAkB,sBAAsB,CAAA,CAAA,GAAA,GAAA,CAAAmB,MAAAC,EAAAT,EAAA,SAdtCL,EAAMe,WAAa,oBAAmB,CAAA,CAAAZ,KAAA"}
1
+ {"version":3,"file":"SuccessIcon.js","names":["genSVGCubicBezier","Component","IconProps","MainCircle","SecondaryCircle","Success","props","fill","primary","_el$","_tmpl$","_el$2","firstChild","_el$3","_$insert","_$createComponent","begin","_$spread","_$mergeProps","_$effect","_$setAttribute","secondary"],"sources":["../../../../src/components/toast/icons/SuccessIcon.tsx"],"sourcesContent":["import { genSVGCubicBezier } from '@/utils/helper';\nimport type { Component } from 'solid-js';\nimport { IconProps } from '../toast.type';\nimport { MainCircle, SecondaryCircle } from './IconCircle';\n\nexport const Success: Component<IconProps> = (props: IconProps) => {\n const fill = props.primary || 'var(--color-success)';\n return (\n <svg style={{ overflow: 'visible' }} viewBox=\"0 0 32 32\" width=\"1.25rem\" height=\"1.25rem\">\n <MainCircle fill={fill} />\n <SecondaryCircle fill={fill} begin=\"350ms\" />\n <path\n fill=\"none\"\n stroke={props.secondary || 'oklch(0.9911 0 0)'}\n stroke-width=\"4\"\n stroke-dasharray=\"22\"\n stroke-dashoffset=\"22\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n d=\"M9.8,17.2l3.8,3.6c0.1,0.1,0.3,0.1,0.4,0l9.6-9.7\"\n >\n <animate\n attributeName=\"stroke-dashoffset\"\n values=\"22;0\"\n dur=\"0.25s\"\n begin=\"250ms\"\n fill=\"freeze\"\n {...genSVGCubicBezier('0.0, 0.0, 0.58, 1.0')}\n />\n </path>\n </svg>\n );\n};\n"],"mappings":"qlBAKaK,EAAiCC,GAAqB,CACjE,IAAMC,EAAOD,EAAME,SAAW,uBAC9B,WAAA,CAAA,IAAAC,EAAAC,GAAA,CAAAC,EAAAF,EAAAG,WAAAC,EAAAF,EAAAC,WAMoD,OANpDE,EAAAL,EAAAM,EAEKZ,EAAU,CAAOI,OAAI,CAAA,CAAAI,EAAA,CAAAG,EAAAL,EAAAM,EACrBX,EAAe,CAAOG,OAAMS,MAAK,QAAA,CAAA,CAAAL,EAAA,CAAAM,EAAAJ,EAAAK,MAiB1BlB,EAAkB,sBAAsB,CAAA,CAAA,GAAA,GAAA,CAAAmB,MAAAC,EAAAT,EAAA,SAdtCL,EAAMe,WAAa,oBAAmB,CAAA,CAAAZ,KAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"WarningIcon.js","names":["genSVGCubicBezier","Component","IconProps","Warning","props","fill","primary","stroke","secondary","_el$","_tmpl$","_el$2","firstChild","_el$3","_el$4","_el$5","nextSibling","_el$6","_el$7","_$setAttribute","_$spread","_$mergeProps"],"sources":["../../../../src/components/toast/icons/WarningIcon.tsx"],"sourcesContent":["import { genSVGCubicBezier } from '@/utils/helper';\r\nimport type { Component } from 'solid-js';\r\nimport { IconProps } from '../toast.type';\r\n\r\nexport const Warning: Component<IconProps> = (props: IconProps) => {\r\n const fill = props.primary || 'var(--color-warning)';\r\n const stroke = props.secondary || '#000';\r\n return (\r\n <svg style={{ overflow: 'visible' }} viewBox=\"0 0 32 32\" width=\"1.25rem\" height=\"1.25rem\">\r\n <g>\r\n {/* Equilateral triangle with rounded corners */}\r\n <path\r\n fill={fill}\r\n stroke={fill}\r\n stroke-width=\"10\"\r\n stroke-linejoin=\"round\"\r\n stroke-linecap=\"round\"\r\n d=\"M16 1 L31 27 L1 27 Z\"\r\n opacity=\"0\"\r\n >\r\n <animate\r\n attributeName=\"opacity\"\r\n values=\"0;1\"\r\n dur=\"0.3s\"\r\n begin=\"0ms\"\r\n fill=\"freeze\"\r\n {...genSVGCubicBezier('0.0, 0.0, 0.58, 1.0')}\r\n />\r\n <animateTransform\r\n attributeName=\"transform\"\r\n type=\"scale\"\r\n values=\"0.5;1.1;1\"\r\n dur=\"0.4s\"\r\n begin=\"0ms\"\r\n fill=\"freeze\"\r\n keyTimes=\"0;0.7;1\"\r\n keySplines=\"0.25 0.71 0.4 0.88; .59 .22 .87 .63\"\r\n calcMode=\"spline\"\r\n />\r\n </path>\r\n {/* Exclamation line - shorter and centered */}\r\n <path\r\n fill=\"none\"\r\n stroke={stroke}\r\n stroke-width=\"2.5\"\r\n stroke-dasharray=\"6\"\r\n stroke-dashoffset=\"6\"\r\n stroke-linecap=\"round\"\r\n d=\"M16,11 L16,17\"\r\n >\r\n <animate\r\n attributeName=\"stroke-dashoffset\"\r\n values=\"6;0\"\r\n dur=\"0.2s\"\r\n begin=\"300ms\"\r\n fill=\"freeze\"\r\n {...genSVGCubicBezier('0.0, 0.0, 0.58, 1.0')}\r\n />\r\n </path>\r\n {/* Exclamation dot - smaller and higher */}\r\n <circle fill={stroke} cx=\"16\" cy=\"21.5\" r=\"0\">\r\n <animate\r\n attributeName=\"r\"\r\n values=\"0;1.8;1.5\"\r\n dur=\"0.25s\"\r\n begin=\"400ms\"\r\n fill=\"freeze\"\r\n keyTimes=\"0;0.6;1\"\r\n keySplines=\"0.25 0.71 0.4 0.88; .59 .22 .87 .63\"\r\n calcMode=\"spline\"\r\n />\r\n </circle>\r\n {/* Bell shake animation - continuous */}\r\n <animateTransform\r\n attributeName=\"transform\"\r\n type=\"rotate\"\r\n values=\"0 16 27; -8 16 27; 8 16 27; -5 16 27; 5 16 27; -2 16 27; 2 16 27; 0 16 27\"\r\n dur=\"0.6s\"\r\n begin=\"500ms;shake.end+2s\"\r\n fill=\"freeze\"\r\n id=\"shake\"\r\n />\r\n </g>\r\n </svg>\r\n );\r\n};\r\n"],"mappings":"ktCAIaG,EAAiCC,GAAqB,CACjE,IAAMC,EAAOD,EAAME,SAAW,uBACxBC,EAASH,EAAMI,WAAa,OAClC,WAAA,CAAA,IAAAC,EAAAC,GAAA,CAAAG,EAAAJ,EAAAG,WAAAA,WAAAE,EAAAD,EAAAD,WAAAG,EAAAF,EAAAG,YAAAC,EAAAF,EAAAH,WAAAM,EAAAH,EAAAC,YAqD0B,OArD1BG,EAAAN,EAAA,OAKcR,EAAI,CAAAc,EAAAN,EAAA,SACFR,EAAI,CAAAe,EAAAN,EAAAO,MAaNrB,EAAkB,sBAAsB,CAAA,CAAA,GAAA,GAAA,CAAAmB,EAAAJ,EAAA,SAiBtCR,EAAM,CAAAa,EAAAH,EAAAI,MAaRrB,EAAkB,sBAAsB,CAAA,CAAA,GAAA,GAAA,CAAAmB,EAAAD,EAAA,OAIlCX,EAAM,CAAAE,KAAA"}
1
+ {"version":3,"file":"WarningIcon.js","names":["genSVGCubicBezier","Component","IconProps","Warning","props","fill","primary","stroke","secondary","_el$","_tmpl$","_el$2","firstChild","_el$3","_el$4","_el$5","nextSibling","_el$6","_el$7","_$setAttribute","_$spread","_$mergeProps"],"sources":["../../../../src/components/toast/icons/WarningIcon.tsx"],"sourcesContent":["import { genSVGCubicBezier } from '@/utils/helper';\nimport type { Component } from 'solid-js';\nimport { IconProps } from '../toast.type';\n\nexport const Warning: Component<IconProps> = (props: IconProps) => {\n const fill = props.primary || 'var(--color-warning)';\n const stroke = props.secondary || '#000';\n return (\n <svg style={{ overflow: 'visible' }} viewBox=\"0 0 32 32\" width=\"1.25rem\" height=\"1.25rem\">\n <g>\n {/* Equilateral triangle with rounded corners */}\n <path\n fill={fill}\n stroke={fill}\n stroke-width=\"10\"\n stroke-linejoin=\"round\"\n stroke-linecap=\"round\"\n d=\"M16 1 L31 27 L1 27 Z\"\n opacity=\"0\"\n >\n <animate\n attributeName=\"opacity\"\n values=\"0;1\"\n dur=\"0.3s\"\n begin=\"0ms\"\n fill=\"freeze\"\n {...genSVGCubicBezier('0.0, 0.0, 0.58, 1.0')}\n />\n <animateTransform\n attributeName=\"transform\"\n type=\"scale\"\n values=\"0.5;1.1;1\"\n dur=\"0.4s\"\n begin=\"0ms\"\n fill=\"freeze\"\n keyTimes=\"0;0.7;1\"\n keySplines=\"0.25 0.71 0.4 0.88; .59 .22 .87 .63\"\n calcMode=\"spline\"\n />\n </path>\n {/* Exclamation line - shorter and centered */}\n <path\n fill=\"none\"\n stroke={stroke}\n stroke-width=\"2.5\"\n stroke-dasharray=\"6\"\n stroke-dashoffset=\"6\"\n stroke-linecap=\"round\"\n d=\"M16,11 L16,17\"\n >\n <animate\n attributeName=\"stroke-dashoffset\"\n values=\"6;0\"\n dur=\"0.2s\"\n begin=\"300ms\"\n fill=\"freeze\"\n {...genSVGCubicBezier('0.0, 0.0, 0.58, 1.0')}\n />\n </path>\n {/* Exclamation dot - smaller and higher */}\n <circle fill={stroke} cx=\"16\" cy=\"21.5\" r=\"0\">\n <animate\n attributeName=\"r\"\n values=\"0;1.8;1.5\"\n dur=\"0.25s\"\n begin=\"400ms\"\n fill=\"freeze\"\n keyTimes=\"0;0.6;1\"\n keySplines=\"0.25 0.71 0.4 0.88; .59 .22 .87 .63\"\n calcMode=\"spline\"\n />\n </circle>\n {/* Bell shake animation - continuous */}\n <animateTransform\n attributeName=\"transform\"\n type=\"rotate\"\n values=\"0 16 27; -8 16 27; 8 16 27; -5 16 27; 5 16 27; -2 16 27; 2 16 27; 0 16 27\"\n dur=\"0.6s\"\n begin=\"500ms;shake.end+2s\"\n fill=\"freeze\"\n id=\"shake\"\n />\n </g>\n </svg>\n );\n};\n"],"mappings":"ktCAIaG,EAAiCC,GAAqB,CACjE,IAAMC,EAAOD,EAAME,SAAW,uBACxBC,EAASH,EAAMI,WAAa,OAClC,WAAA,CAAA,IAAAC,EAAAC,GAAA,CAAAG,EAAAJ,EAAAG,WAAAA,WAAAE,EAAAD,EAAAD,WAAAG,EAAAF,EAAAG,YAAAC,EAAAF,EAAAH,WAAAM,EAAAH,EAAAC,YAqD0B,OArD1BG,EAAAN,EAAA,OAKcR,EAAI,CAAAc,EAAAN,EAAA,SACFR,EAAI,CAAAe,EAAAN,EAAAO,MAaNrB,EAAkB,sBAAsB,CAAA,CAAA,GAAA,GAAA,CAAAmB,EAAAJ,EAAA,SAiBtCR,EAAM,CAAAa,EAAAH,EAAAI,MAaRrB,EAAkB,sBAAsB,CAAA,CAAA,GAAA,GAAA,CAAAmB,EAAAD,EAAA,OAIlCX,EAAM,CAAAE,KAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"toast.js","names":["X","Component","For","JSX","Show","createEffect","createMemo","onCleanup","onMount","render","Error","Loader","Success","Info","Warning","toastStore","Message","PromiseOptions","ToastAPI","ToastData","ToastOptions","ToastPosition","ToastType","ToasterProps","ValueOrFunction","getToastYDirection","toast","defaultPos","position","top","includes","resolveValue","valOrFn","TValue","TArg","arg","getToastIcon","Element","icon","undefined","type","_$createComponent","_$mergeProps","iconTheme","CloseIcon","onClick","isRight","props","_el$","_tmpl$","$$click","e","stopPropagation","_$insert","size","_$effect","_$className","ToastBar","isCloseOnRight","handleClose","removeToast","id","_el$2","_tmpl$2","_el$3","firstChild","when","showCloseIcon","children","message","_p$","_v$","class","_v$2","style","_v$3","ariaProps","role","_v$4","t","_$style","a","_$setAttribute","o","ToastWrapper","dismissTimer","ReturnType","setTimeout","removeTimer","wrapperRef","HTMLDivElement","remainingTime","duration","timerStartTime","isPaused","startDismissTimer","Infinity","visible","Date","now","dismissToast","pauseDismissTimer","clearTimeout","elapsed","Math","max","handleMouseEnter","canPause","handleMouseLeave","addEventListener","handleVisibilityChange","unmountDelay","direction","animate","transform","opacity","fill","easing","cleanupToastTimersAndListeners","removeEventListener","renderContent","_el$4","_tmpl$3","_ref$","_$use","PositionContainer","toasts","gutter","getPositionStyles","CSSProperties","pos","styles","gap","bottom","left","right","length","_el$5","_tmpl$4","each","_$p","ToasterInternal","toastsByPosition","currentToasts","groups","Record","push","positions","toastsForPos","containerMounted","containerEl","ensureContainer","document","createElement","body","appendChild","Toaster","createHandler","options","toastData","createToast","upsertToast","success","error","info","warning","loading","custom","dismiss","toastId","remove","pop","removePop","dismissPop","shift","removeShift","dismissShift","promise","Promise","T","promiseOptions","toastOptions","result","successMessage","updateToast","errorMessage","_$delegateEvents"],"sources":["../../../src/components/toast/toast.tsx"],"sourcesContent":["import X from 'lucide-solid/icons/x';\r\nimport { Component, For, JSX, Show, createEffect, createMemo, onCleanup, onMount } from 'solid-js';\r\nimport { render } from 'solid-js/web';\r\nimport { Error, Loader, Success } from './icons';\r\nimport { Info } from './icons/InfoIcon';\r\nimport { Warning } from './icons/WarningIcon';\r\nimport { toastStore } from './toast.store';\r\nimport type {\r\n Message,\r\n PromiseOptions,\r\n ToastAPI,\r\n ToastData,\r\n ToastOptions,\r\n ToastPosition,\r\n ToastType,\r\n ToasterProps,\r\n ValueOrFunction,\r\n} from './toast.type';\r\n\r\nexport const getToastYDirection = (toast: ToastData, defaultPos: ToastPosition) => {\r\n const position = toast.position || defaultPos;\r\n const top = position.includes('top');\r\n return top ? 1 : -1;\r\n};\r\n// Helper to resolve value or function\r\nconst resolveValue = <TValue, TArg>(valOrFn: ValueOrFunction<TValue, TArg>, arg: TArg): TValue => {\r\n return typeof valOrFn === 'function' ? (valOrFn as (arg: TArg) => TValue)(arg) : valOrFn;\r\n};\r\n\r\nconst getToastIcon = (toast: ToastData): JSX.Element | null => {\r\n if (toast.icon !== undefined) {\r\n return toast.icon as Element;\r\n }\r\n switch (toast.type) {\r\n case 'success':\r\n return <Success {...toast.iconTheme} />;\r\n case 'error':\r\n return <Error {...toast.iconTheme} />;\r\n case 'info':\r\n return <Info {...toast.iconTheme} />;\r\n case 'warning':\r\n return <Warning {...toast.iconTheme} />;\r\n case 'loading':\r\n return <Loader {...toast.iconTheme} />;\r\n default:\r\n return null;\r\n }\r\n};\r\n\r\nconst CloseIcon: Component<{ onClick: () => void; isRight: boolean }> = props => {\r\n return (\r\n <div\r\n class={`toa03 ${props.isRight ? 'toa04' : 'toa05'}`}\r\n onClick={e => {\r\n e.stopPropagation();\r\n props.onClick();\r\n }}\r\n aria-label=\"Close\"\r\n >\r\n <X size={10} stroke-width={4} />\r\n </div>\r\n );\r\n};\r\n\r\nconst ToastBar: Component<{ toast: ToastData; position: ToastPosition }> = props => {\r\n const icon = createMemo(() => getToastIcon(props.toast));\r\n\r\n const isCloseOnRight = createMemo(() => !props.position.includes('right'));\r\n\r\n const handleClose = () => {\r\n toastStore.removeToast(props.toast.id);\r\n };\r\n\r\n return (\r\n <div\r\n class={`toa01 ${props.toast.class || ''}`}\r\n style={props.toast.style}\r\n role={props.toast.ariaProps.role}\r\n aria-live={props.toast.ariaProps['aria-live']}\r\n >\r\n <Show when={props.toast.showCloseIcon}>\r\n <CloseIcon onClick={handleClose} isRight={isCloseOnRight()} />\r\n </Show>\r\n <Show when={icon()}>{icon()}</Show>\r\n <div class=\"flex-1 text-sm\">{props.toast.message as Element}</div>\r\n </div>\r\n );\r\n};\r\n\r\n// Individual toast wrapper with animations\r\nconst ToastWrapper: Component<{ toast: ToastData; position: ToastPosition }> = props => {\r\n let dismissTimer: ReturnType<typeof setTimeout> | undefined;\r\n let removeTimer: ReturnType<typeof setTimeout> | undefined;\r\n let wrapperRef: HTMLDivElement | undefined;\r\n\r\n // Theo dõi thời gian còn lại và thời điểm bắt đầu timer\r\n let remainingTime = props.toast.duration;\r\n let timerStartTime = 0;\r\n let isPaused = false;\r\n\r\n // Bắt đầu timer với thời gian còn lại\r\n const startDismissTimer = (duration: number) => {\r\n if (duration === Infinity || !props.toast.visible) return;\r\n\r\n timerStartTime = Date.now();\r\n dismissTimer = setTimeout(() => {\r\n toastStore.dismissToast(props.toast.id);\r\n }, duration);\r\n };\r\n\r\n // Dừng timer và lưu thời gian còn lại\r\n const pauseDismissTimer = () => {\r\n if (dismissTimer) {\r\n clearTimeout(dismissTimer);\r\n dismissTimer = undefined;\r\n // Tính thời gian còn lại\r\n const elapsed = Date.now() - timerStartTime;\r\n remainingTime = Math.max(0, remainingTime - elapsed);\r\n }\r\n };\r\n\r\n // Event handlers cho pause on hover\r\n const handleMouseEnter = () => {\r\n if (!props.toast.canPause || isPaused) return;\r\n isPaused = true;\r\n pauseDismissTimer();\r\n };\r\n\r\n const handleMouseLeave = () => {\r\n if (!props.toast.canPause || !isPaused) return;\r\n isPaused = false;\r\n startDismissTimer(remainingTime);\r\n };\r\n\r\n // Setup auto dismiss timer on mount\r\n onMount(() => {\r\n startDismissTimer(props.toast.duration);\r\n\r\n // Thêm event listeners nếu canPause = true\r\n if (props.toast.canPause && wrapperRef) {\r\n wrapperRef.addEventListener('mouseenter', handleMouseEnter);\r\n wrapperRef.addEventListener('mouseleave', handleMouseLeave);\r\n }\r\n });\r\n\r\n // Watch for visible change to schedule removal\r\n createEffect(function handleVisibilityChange() {\r\n const visible = props.toast.visible;\r\n if (!visible) {\r\n // Clear dismiss timer if exists\r\n if (dismissTimer) {\r\n clearTimeout(dismissTimer);\r\n dismissTimer = undefined;\r\n }\r\n // Schedule removal after animation\r\n removeTimer = setTimeout(() => {\r\n toastStore.removeToast(props.toast.id);\r\n }, props.toast.unmountDelay);\r\n }\r\n\r\n // run animate open/close\r\n if (!wrapperRef) return;\r\n const direction = getToastYDirection(props.toast, props.position);\r\n if (visible) {\r\n wrapperRef.animate(\r\n [\r\n { transform: `translate3d(0,${direction * -200}%,0) scale(.6)`, opacity: 0.5 },\r\n { transform: 'translate3d(0,0,0) scale(1)', opacity: 1 },\r\n ],\r\n {\r\n duration: 350,\r\n fill: 'forwards',\r\n easing: 'cubic-bezier(.21,1.02,.73,1)',\r\n },\r\n );\r\n } else {\r\n wrapperRef.animate(\r\n [\r\n { transform: 'translate3d(0,0,-1px) scale(1)', opacity: 1 },\r\n { transform: `translate3d(0,${direction * -150}%,-1px) scale(.4)`, opacity: 0 },\r\n ],\r\n {\r\n duration: 400,\r\n fill: 'forwards',\r\n easing: 'cubic-bezier(.06,.71,.55,1)',\r\n },\r\n );\r\n }\r\n });\r\n\r\n onCleanup(function cleanupToastTimersAndListeners() {\r\n if (dismissTimer) clearTimeout(dismissTimer);\r\n if (removeTimer) clearTimeout(removeTimer);\r\n // Gỡ event listeners\r\n if (props.toast.canPause && wrapperRef) {\r\n wrapperRef.removeEventListener('mouseenter', handleMouseEnter);\r\n wrapperRef.removeEventListener('mouseleave', handleMouseLeave);\r\n }\r\n });\r\n\r\n // Custom toast render\r\n const renderContent = () => {\r\n if (props.toast.type === 'custom' && typeof props.toast.message === 'function') {\r\n return (props.toast.message as (t: ToastData) => Element)(props.toast);\r\n }\r\n return <ToastBar toast={props.toast} position={props.position} />;\r\n };\r\n\r\n return (\r\n <div ref={wrapperRef} class=\"w-fit max-w-[350px]\">\r\n {renderContent()}\r\n </div>\r\n );\r\n};\r\n\r\n// Position container\r\nconst PositionContainer: Component<{\r\n position: ToastPosition;\r\n toasts: ToastData[];\r\n gutter: number;\r\n}> = props => {\r\n const getPositionStyles = (): JSX.CSSProperties => {\r\n const pos = props.position;\r\n const styles: JSX.CSSProperties = {\r\n gap: `${props.gutter}px`,\r\n };\r\n\r\n if (pos.includes('top')) {\r\n styles.top = '0';\r\n } else {\r\n styles.bottom = '0';\r\n styles['flex-direction'] = 'column-reverse';\r\n }\r\n\r\n if (pos.includes('left')) {\r\n styles.left = '0';\r\n styles['align-items'] = 'flex-start';\r\n } else if (pos.includes('right')) {\r\n styles.right = '0';\r\n styles['align-items'] = 'flex-end';\r\n } else {\r\n styles.left = '50%';\r\n styles.transform = 'translateX(-50%)';\r\n styles['align-items'] = 'center';\r\n }\r\n\r\n return styles;\r\n };\r\n\r\n return (\r\n <Show when={props.toasts.length > 0}>\r\n <div class=\"fixed z-9999 flex flex-col p-4\" style={getPositionStyles()}>\r\n <For each={props.toasts}>\r\n {toast => <ToastWrapper toast={toast} position={props.position} />}\r\n </For>\r\n </div>\r\n </Show>\r\n );\r\n};\r\n\r\n// Internal Toaster component\r\nconst ToasterInternal: Component<ToasterProps> = props => {\r\n const position = () => props.position || 'top-right';\r\n const gutter = () => props.gutter ?? 10;\r\n\r\n // Group toasts by position\r\n const toastsByPosition = createMemo(() => {\r\n const currentToasts = toastStore.toasts();\r\n const groups: Record<ToastPosition, ToastData[]> = {\r\n 'top-left': [],\r\n 'top-center': [],\r\n 'top-right': [],\r\n 'bottom-left': [],\r\n 'bottom-center': [],\r\n 'bottom-right': [],\r\n };\r\n\r\n for (const t of currentToasts) {\r\n const pos = t.position || position();\r\n groups[pos].push(t);\r\n }\r\n\r\n return groups;\r\n });\r\n\r\n const positions: ToastPosition[] = [\r\n 'top-left',\r\n 'top-center',\r\n 'top-right',\r\n 'bottom-left',\r\n 'bottom-center',\r\n 'bottom-right',\r\n ];\r\n\r\n return (\r\n <>\r\n <For each={positions}>\r\n {pos => {\r\n const toastsForPos = createMemo(() => toastsByPosition()[pos]);\r\n return <PositionContainer position={pos} toasts={toastsForPos()} gutter={gutter()} />;\r\n }}\r\n </For>\r\n </>\r\n );\r\n};\r\n\r\n// Auto-mount toast container\r\nlet containerMounted = false;\r\nlet containerEl: HTMLDivElement | null = null;\r\n\r\nconst ensureContainer = () => {\r\n if (containerMounted) return;\r\n\r\n containerEl = document.createElement('div');\r\n containerEl.id = 'sui-toast-container';\r\n document.body.appendChild(containerEl);\r\n\r\n render(() => <ToasterInternal />, containerEl);\r\n containerMounted = true;\r\n};\r\n\r\n// Optional Toaster component for custom configuration\r\nexport const Toaster: Component<ToasterProps> = props => {\r\n onMount(() => {\r\n // If user adds Toaster, use their config\r\n if (!containerMounted) {\r\n containerEl = document.createElement('div');\r\n containerEl.id = 'sui-toast-container';\r\n document.body.appendChild(containerEl);\r\n\r\n render(() => <ToasterInternal {...props} />, containerEl);\r\n containerMounted = true;\r\n }\r\n });\r\n\r\n return null;\r\n};\r\n\r\n// Toast API\r\nconst createHandler =\r\n (type: ToastType) =>\r\n (message: Message, options?: ToastOptions): string => {\r\n ensureContainer();\r\n const toastData = toastStore.createToast(message, type, options);\r\n toastStore.upsertToast(toastData);\r\n return toastData.id;\r\n };\r\n\r\n// Main toast function\r\nconst toast = ((message: Message, options?: ToastOptions): string => {\r\n return createHandler('blank')(message, options);\r\n}) as ToastAPI;\r\n\r\ntoast.success = createHandler('success');\r\ntoast.error = createHandler('error');\r\ntoast.info = createHandler('info');\r\ntoast.warning = createHandler('warning');\r\ntoast.loading = createHandler('loading');\r\n\r\ntoast.custom = (message: (toast: ToastData) => JSX.Element, options?: ToastOptions): string => {\r\n ensureContainer();\r\n const toastData = toastStore.createToast(message as any, 'custom', options);\r\n toastStore.upsertToast(toastData);\r\n return toastData.id;\r\n};\r\n\r\ntoast.dismiss = (toastId?: string) => {\r\n toastStore.dismissToast(toastId);\r\n};\r\n\r\ntoast.remove = (toastId?: string) => {\r\n toastStore.removeToast(toastId);\r\n};\r\n\r\ntoast.pop = (options?: { animate?: boolean }) => {\r\n if (options?.animate === false) {\r\n toastStore.removePop();\r\n } else {\r\n toastStore.dismissPop();\r\n }\r\n};\r\n\r\ntoast.shift = (options?: { animate?: boolean }) => {\r\n if (options?.animate === false) {\r\n toastStore.removeShift();\r\n } else {\r\n toastStore.dismissShift();\r\n }\r\n};\r\n\r\ntoast.promise = async <T,>(\r\n promise: Promise<T>,\r\n promiseOptions: PromiseOptions<T>,\r\n toastOptions?: ToastOptions,\r\n): Promise<T> => {\r\n const id = toast.loading(promiseOptions.loading, toastOptions);\r\n\r\n try {\r\n const result = await promise;\r\n const successMessage = resolveValue(promiseOptions.success, result);\r\n toastStore.updateToast(id, {\r\n type: 'success',\r\n message: successMessage as any,\r\n icon: undefined, // Reset icon to use default success icon\r\n });\r\n // Schedule dismiss after showing success\r\n setTimeout(() => {\r\n toastStore.dismissToast(id);\r\n }, toastOptions?.duration ?? 3000);\r\n return result;\r\n } catch (error) {\r\n const errorMessage = resolveValue(promiseOptions.error, error);\r\n toastStore.updateToast(id, {\r\n type: 'error',\r\n message: errorMessage as any,\r\n icon: undefined, // Reset icon to use default error icon\r\n });\r\n // Schedule dismiss after showing error\r\n setTimeout(() => {\r\n toastStore.dismissToast(id);\r\n }, toastOptions?.duration ?? 3000);\r\n throw error;\r\n }\r\n};\r\n\r\nexport { toast };\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"toast.js","names":["X","Component","For","JSX","Show","createEffect","createMemo","onCleanup","onMount","render","Error","Loader","Success","Info","Warning","toastStore","Message","PromiseOptions","ToastAPI","ToastData","ToastOptions","ToastPosition","ToastType","ToasterProps","ValueOrFunction","getToastYDirection","toast","defaultPos","position","top","includes","resolveValue","valOrFn","TValue","TArg","arg","getToastIcon","Element","icon","undefined","type","_$createComponent","_$mergeProps","iconTheme","CloseIcon","onClick","isRight","props","_el$","_tmpl$","$$click","e","stopPropagation","_$insert","size","_$effect","_$className","ToastBar","isCloseOnRight","handleClose","removeToast","id","_el$2","_tmpl$2","_el$3","firstChild","when","showCloseIcon","children","message","_p$","_v$","class","_v$2","style","_v$3","ariaProps","role","_v$4","t","_$style","a","_$setAttribute","o","ToastWrapper","dismissTimer","ReturnType","setTimeout","removeTimer","wrapperRef","HTMLDivElement","remainingTime","duration","timerStartTime","isPaused","startDismissTimer","Infinity","visible","Date","now","dismissToast","pauseDismissTimer","clearTimeout","elapsed","Math","max","handleMouseEnter","canPause","handleMouseLeave","addEventListener","handleVisibilityChange","unmountDelay","direction","animate","transform","opacity","fill","easing","cleanupToastTimersAndListeners","removeEventListener","renderContent","_el$4","_tmpl$3","_ref$","_$use","PositionContainer","toasts","gutter","getPositionStyles","CSSProperties","pos","styles","gap","bottom","left","right","length","_el$5","_tmpl$4","each","_$p","ToasterInternal","toastsByPosition","currentToasts","groups","Record","push","positions","toastsForPos","containerMounted","containerEl","ensureContainer","document","createElement","body","appendChild","Toaster","createHandler","options","toastData","createToast","upsertToast","success","error","info","warning","loading","custom","dismiss","toastId","remove","pop","removePop","dismissPop","shift","removeShift","dismissShift","promise","Promise","T","promiseOptions","toastOptions","result","successMessage","updateToast","errorMessage","_$delegateEvents"],"sources":["../../../src/components/toast/toast.tsx"],"sourcesContent":["import X from 'lucide-solid/icons/x';\nimport { Component, For, JSX, Show, createEffect, createMemo, onCleanup, onMount } from 'solid-js';\nimport { render } from 'solid-js/web';\nimport { Error, Loader, Success } from './icons';\nimport { Info } from './icons/InfoIcon';\nimport { Warning } from './icons/WarningIcon';\nimport { toastStore } from './toast.store';\nimport type {\n Message,\n PromiseOptions,\n ToastAPI,\n ToastData,\n ToastOptions,\n ToastPosition,\n ToastType,\n ToasterProps,\n ValueOrFunction,\n} from './toast.type';\n\nexport const getToastYDirection = (toast: ToastData, defaultPos: ToastPosition) => {\n const position = toast.position || defaultPos;\n const top = position.includes('top');\n return top ? 1 : -1;\n};\n// Helper to resolve value or function\nconst resolveValue = <TValue, TArg>(valOrFn: ValueOrFunction<TValue, TArg>, arg: TArg): TValue => {\n return typeof valOrFn === 'function' ? (valOrFn as (arg: TArg) => TValue)(arg) : valOrFn;\n};\n\nconst getToastIcon = (toast: ToastData): JSX.Element | null => {\n if (toast.icon !== undefined) {\n return toast.icon as Element;\n }\n switch (toast.type) {\n case 'success':\n return <Success {...toast.iconTheme} />;\n case 'error':\n return <Error {...toast.iconTheme} />;\n case 'info':\n return <Info {...toast.iconTheme} />;\n case 'warning':\n return <Warning {...toast.iconTheme} />;\n case 'loading':\n return <Loader {...toast.iconTheme} />;\n default:\n return null;\n }\n};\n\nconst CloseIcon: Component<{ onClick: () => void; isRight: boolean }> = props => {\n return (\n <div\n class={`toa03 ${props.isRight ? 'toa04' : 'toa05'}`}\n onClick={e => {\n e.stopPropagation();\n props.onClick();\n }}\n aria-label=\"Close\"\n >\n <X size={10} stroke-width={4} />\n </div>\n );\n};\n\nconst ToastBar: Component<{ toast: ToastData; position: ToastPosition }> = props => {\n const icon = createMemo(() => getToastIcon(props.toast));\n\n const isCloseOnRight = createMemo(() => !props.position.includes('right'));\n\n const handleClose = () => {\n toastStore.removeToast(props.toast.id);\n };\n\n return (\n <div\n class={`toa01 ${props.toast.class || ''}`}\n style={props.toast.style}\n role={props.toast.ariaProps.role}\n aria-live={props.toast.ariaProps['aria-live']}\n >\n <Show when={props.toast.showCloseIcon}>\n <CloseIcon onClick={handleClose} isRight={isCloseOnRight()} />\n </Show>\n <Show when={icon()}>{icon()}</Show>\n <div class=\"flex-1 text-sm\">{props.toast.message as Element}</div>\n </div>\n );\n};\n\n// Individual toast wrapper with animations\nconst ToastWrapper: Component<{ toast: ToastData; position: ToastPosition }> = props => {\n let dismissTimer: ReturnType<typeof setTimeout> | undefined;\n let removeTimer: ReturnType<typeof setTimeout> | undefined;\n let wrapperRef: HTMLDivElement | undefined;\n\n // Theo dõi thời gian còn lại và thời điểm bắt đầu timer\n let remainingTime = props.toast.duration;\n let timerStartTime = 0;\n let isPaused = false;\n\n // Bắt đầu timer với thời gian còn lại\n const startDismissTimer = (duration: number) => {\n if (duration === Infinity || !props.toast.visible) return;\n\n timerStartTime = Date.now();\n dismissTimer = setTimeout(() => {\n toastStore.dismissToast(props.toast.id);\n }, duration);\n };\n\n // Dừng timer và lưu thời gian còn lại\n const pauseDismissTimer = () => {\n if (dismissTimer) {\n clearTimeout(dismissTimer);\n dismissTimer = undefined;\n // Tính thời gian còn lại\n const elapsed = Date.now() - timerStartTime;\n remainingTime = Math.max(0, remainingTime - elapsed);\n }\n };\n\n // Event handlers cho pause on hover\n const handleMouseEnter = () => {\n if (!props.toast.canPause || isPaused) return;\n isPaused = true;\n pauseDismissTimer();\n };\n\n const handleMouseLeave = () => {\n if (!props.toast.canPause || !isPaused) return;\n isPaused = false;\n startDismissTimer(remainingTime);\n };\n\n // Setup auto dismiss timer on mount\n onMount(() => {\n startDismissTimer(props.toast.duration);\n\n // Thêm event listeners nếu canPause = true\n if (props.toast.canPause && wrapperRef) {\n wrapperRef.addEventListener('mouseenter', handleMouseEnter);\n wrapperRef.addEventListener('mouseleave', handleMouseLeave);\n }\n });\n\n // Watch for visible change to schedule removal\n createEffect(function handleVisibilityChange() {\n const visible = props.toast.visible;\n if (!visible) {\n // Clear dismiss timer if exists\n if (dismissTimer) {\n clearTimeout(dismissTimer);\n dismissTimer = undefined;\n }\n // Schedule removal after animation\n removeTimer = setTimeout(() => {\n toastStore.removeToast(props.toast.id);\n }, props.toast.unmountDelay);\n }\n\n // run animate open/close\n if (!wrapperRef) return;\n const direction = getToastYDirection(props.toast, props.position);\n if (visible) {\n wrapperRef.animate(\n [\n { transform: `translate3d(0,${direction * -200}%,0) scale(.6)`, opacity: 0.5 },\n { transform: 'translate3d(0,0,0) scale(1)', opacity: 1 },\n ],\n {\n duration: 350,\n fill: 'forwards',\n easing: 'cubic-bezier(.21,1.02,.73,1)',\n },\n );\n } else {\n wrapperRef.animate(\n [\n { transform: 'translate3d(0,0,-1px) scale(1)', opacity: 1 },\n { transform: `translate3d(0,${direction * -150}%,-1px) scale(.4)`, opacity: 0 },\n ],\n {\n duration: 400,\n fill: 'forwards',\n easing: 'cubic-bezier(.06,.71,.55,1)',\n },\n );\n }\n });\n\n onCleanup(function cleanupToastTimersAndListeners() {\n if (dismissTimer) clearTimeout(dismissTimer);\n if (removeTimer) clearTimeout(removeTimer);\n // Gỡ event listeners\n if (props.toast.canPause && wrapperRef) {\n wrapperRef.removeEventListener('mouseenter', handleMouseEnter);\n wrapperRef.removeEventListener('mouseleave', handleMouseLeave);\n }\n });\n\n // Custom toast render\n const renderContent = () => {\n if (props.toast.type === 'custom' && typeof props.toast.message === 'function') {\n return (props.toast.message as (t: ToastData) => Element)(props.toast);\n }\n return <ToastBar toast={props.toast} position={props.position} />;\n };\n\n return (\n <div ref={wrapperRef} class=\"w-fit max-w-[350px]\">\n {renderContent()}\n </div>\n );\n};\n\n// Position container\nconst PositionContainer: Component<{\n position: ToastPosition;\n toasts: ToastData[];\n gutter: number;\n}> = props => {\n const getPositionStyles = (): JSX.CSSProperties => {\n const pos = props.position;\n const styles: JSX.CSSProperties = {\n gap: `${props.gutter}px`,\n };\n\n if (pos.includes('top')) {\n styles.top = '0';\n } else {\n styles.bottom = '0';\n styles['flex-direction'] = 'column-reverse';\n }\n\n if (pos.includes('left')) {\n styles.left = '0';\n styles['align-items'] = 'flex-start';\n } else if (pos.includes('right')) {\n styles.right = '0';\n styles['align-items'] = 'flex-end';\n } else {\n styles.left = '50%';\n styles.transform = 'translateX(-50%)';\n styles['align-items'] = 'center';\n }\n\n return styles;\n };\n\n return (\n <Show when={props.toasts.length > 0}>\n <div class=\"fixed z-9999 flex flex-col p-4\" style={getPositionStyles()}>\n <For each={props.toasts}>\n {toast => <ToastWrapper toast={toast} position={props.position} />}\n </For>\n </div>\n </Show>\n );\n};\n\n// Internal Toaster component\nconst ToasterInternal: Component<ToasterProps> = props => {\n const position = () => props.position || 'top-right';\n const gutter = () => props.gutter ?? 10;\n\n // Group toasts by position\n const toastsByPosition = createMemo(() => {\n const currentToasts = toastStore.toasts();\n const groups: Record<ToastPosition, ToastData[]> = {\n 'top-left': [],\n 'top-center': [],\n 'top-right': [],\n 'bottom-left': [],\n 'bottom-center': [],\n 'bottom-right': [],\n };\n\n for (const t of currentToasts) {\n const pos = t.position || position();\n groups[pos].push(t);\n }\n\n return groups;\n });\n\n const positions: ToastPosition[] = [\n 'top-left',\n 'top-center',\n 'top-right',\n 'bottom-left',\n 'bottom-center',\n 'bottom-right',\n ];\n\n return (\n <>\n <For each={positions}>\n {pos => {\n const toastsForPos = createMemo(() => toastsByPosition()[pos]);\n return <PositionContainer position={pos} toasts={toastsForPos()} gutter={gutter()} />;\n }}\n </For>\n </>\n );\n};\n\n// Auto-mount toast container\nlet containerMounted = false;\nlet containerEl: HTMLDivElement | null = null;\n\nconst ensureContainer = () => {\n if (containerMounted) return;\n\n containerEl = document.createElement('div');\n containerEl.id = 'sui-toast-container';\n document.body.appendChild(containerEl);\n\n render(() => <ToasterInternal />, containerEl);\n containerMounted = true;\n};\n\n// Optional Toaster component for custom configuration\nexport const Toaster: Component<ToasterProps> = props => {\n onMount(() => {\n // If user adds Toaster, use their config\n if (!containerMounted) {\n containerEl = document.createElement('div');\n containerEl.id = 'sui-toast-container';\n document.body.appendChild(containerEl);\n\n render(() => <ToasterInternal {...props} />, containerEl);\n containerMounted = true;\n }\n });\n\n return null;\n};\n\n// Toast API\nconst createHandler =\n (type: ToastType) =>\n (message: Message, options?: ToastOptions): string => {\n ensureContainer();\n const toastData = toastStore.createToast(message, type, options);\n toastStore.upsertToast(toastData);\n return toastData.id;\n };\n\n// Main toast function\nconst toast = ((message: Message, options?: ToastOptions): string => {\n return createHandler('blank')(message, options);\n}) as ToastAPI;\n\ntoast.success = createHandler('success');\ntoast.error = createHandler('error');\ntoast.info = createHandler('info');\ntoast.warning = createHandler('warning');\ntoast.loading = createHandler('loading');\n\ntoast.custom = (message: (toast: ToastData) => JSX.Element, options?: ToastOptions): string => {\n ensureContainer();\n const toastData = toastStore.createToast(message as any, 'custom', options);\n toastStore.upsertToast(toastData);\n return toastData.id;\n};\n\ntoast.dismiss = (toastId?: string) => {\n toastStore.dismissToast(toastId);\n};\n\ntoast.remove = (toastId?: string) => {\n toastStore.removeToast(toastId);\n};\n\ntoast.pop = (options?: { animate?: boolean }) => {\n if (options?.animate === false) {\n toastStore.removePop();\n } else {\n toastStore.dismissPop();\n }\n};\n\ntoast.shift = (options?: { animate?: boolean }) => {\n if (options?.animate === false) {\n toastStore.removeShift();\n } else {\n toastStore.dismissShift();\n }\n};\n\ntoast.promise = async <T,>(\n promise: Promise<T>,\n promiseOptions: PromiseOptions<T>,\n toastOptions?: ToastOptions,\n): Promise<T> => {\n const id = toast.loading(promiseOptions.loading, toastOptions);\n\n try {\n const result = await promise;\n const successMessage = resolveValue(promiseOptions.success, result);\n toastStore.updateToast(id, {\n type: 'success',\n message: successMessage as any,\n icon: undefined, // Reset icon to use default success icon\n });\n // Schedule dismiss after showing success\n setTimeout(() => {\n toastStore.dismissToast(id);\n }, toastOptions?.duration ?? 3000);\n return result;\n } catch (error) {\n const errorMessage = resolveValue(promiseOptions.error, error);\n toastStore.updateToast(id, {\n type: 'error',\n message: errorMessage as any,\n icon: undefined, // Reset icon to use default error icon\n });\n // Schedule dismiss after showing error\n setTimeout(() => {\n toastStore.dismissToast(id);\n }, toastOptions?.duration ?? 3000);\n throw error;\n }\n};\n\nexport { toast };\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"toast.store.js","names":[],"sources":["../../../src/components/toast/toast.store.ts"],"sourcesContent":["import { createSignal, createRoot, JSX, createUniqueId } from 'solid-js';\r\nimport type { ToastData, ToastOptions, ToastType, ToastPosition, Message } from './toast.type';\r\n\r\n// Default values\r\nconst DEFAULT_DURATION: Record<ToastType, number> = {\r\n blank: 3000,\r\n success: 3000,\r\n error: 3000,\r\n info: 3000,\r\n warning: 3000,\r\n loading: Infinity,\r\n custom: 3000,\r\n};\r\n\r\nconst DEFAULT_POSITION: ToastPosition = 'top-right';\r\nconst DEFAULT_UNMOUNT_DELAY = 400;\r\nconst MAX_TOASTS = 10;\r\n\r\n// Toast store using signals\r\nfunction createToastStore() {\r\n const [toasts, setToasts] = createSignal<ToastData[]>([]);\r\n const [pausedAt, setPausedAt] = createSignal<number | null>(null);\r\n\r\n const createToast = (\r\n message: Message | ((toast: ToastData) => JSX.Element),\r\n type: ToastType,\r\n options?: ToastOptions,\r\n ): ToastData => {\r\n const id = createUniqueId();\r\n const existingToast = toasts().find(t => t.id === id);\r\n const toast: ToastData = {\r\n id,\r\n type,\r\n message: message as Message,\r\n icon: options?.icon,\r\n duration: options?.duration ?? DEFAULT_DURATION[type],\r\n pauseDuration: existingToast?.pauseDuration ?? 0,\r\n paused: false,\r\n position: options?.position ?? DEFAULT_POSITION,\r\n ariaProps: options?.ariaProps ?? {\r\n role: 'status',\r\n 'aria-live': 'polite',\r\n },\r\n style: options?.style,\r\n class: options?.class,\r\n iconTheme: options?.iconTheme,\r\n createdAt: existingToast?.createdAt ?? Date.now(),\r\n visible: true,\r\n unmountDelay: options?.unmountDelay ?? DEFAULT_UNMOUNT_DELAY,\r\n canPause: options?.canPause ?? true,\r\n showCloseIcon: options?.showCloseIcon ?? true,\r\n };\r\n\r\n return toast;\r\n };\r\n\r\n const upsertToast = (toast: ToastData) => {\r\n setToasts(prev => {\r\n const index = prev.findIndex(t => t.id === toast.id);\r\n if (index !== -1) {\r\n // Update existing toast\r\n const newToasts = [...prev];\r\n newToasts[index] = { ...prev[index], ...toast, updatedAt: Date.now() };\r\n return newToasts;\r\n } else {\r\n // Add new toast at the beginning and enforce max limit\r\n let newToasts = [toast, ...prev];\r\n if (newToasts.length > MAX_TOASTS) {\r\n newToasts = newToasts.slice(0, MAX_TOASTS);\r\n }\r\n return newToasts;\r\n }\r\n });\r\n };\r\n\r\n const dismissToast = (toastId?: string) => {\r\n setToasts(prev => {\r\n if (toastId) {\r\n return prev.map(t => (t.id === toastId ? { ...t, visible: false } : t));\r\n } else {\r\n // Dismiss all\r\n return prev.map(t => ({ ...t, visible: false }));\r\n }\r\n });\r\n };\r\n\r\n const removeToast = (toastId?: string) => {\r\n setToasts(prev => {\r\n if (toastId) {\r\n return prev.filter(t => t.id !== toastId);\r\n } else {\r\n // Remove all\r\n return [];\r\n }\r\n });\r\n };\r\n\r\n const dismissPop = () => {\r\n setToasts(prev => {\r\n for (let i = prev.length - 1; i >= 0; i--) {\r\n if (prev[i].visible) {\r\n return prev.map((t, idx) => (idx === i ? { ...t, visible: false } : t));\r\n }\r\n }\r\n return prev;\r\n });\r\n };\r\n\r\n const removePop = () => {\r\n setToasts(prev => {\r\n for (let i = prev.length - 1; i >= 0; i--) {\r\n if (prev[i].visible) {\r\n return [...prev.slice(0, i), ...prev.slice(i + 1)];\r\n }\r\n }\r\n return prev;\r\n });\r\n };\r\n\r\n const dismissShift = () => {\r\n setToasts(prev => {\r\n for (let i = 0; i < prev.length; i++) {\r\n if (prev[i].visible) {\r\n return prev.map((t, idx) => (idx === i ? { ...t, visible: false } : t));\r\n }\r\n }\r\n return prev;\r\n });\r\n };\r\n\r\n const removeShift = () => {\r\n setToasts(prev => {\r\n for (let i = 0; i < prev.length; i++) {\r\n if (prev[i].visible) {\r\n return [...prev.slice(0, i), ...prev.slice(i + 1)];\r\n }\r\n }\r\n return prev;\r\n });\r\n };\r\n\r\n const updateToast = (toastId: string, updates: Partial<ToastData>) => {\r\n setToasts(prev =>\r\n prev.map(t => (t.id === toastId ? { ...t, ...updates, updatedAt: Date.now() } : t)),\r\n );\r\n };\r\n\r\n const pauseToast = (toastId: string) => {\r\n setToasts(prev => prev.map(t => (t.id === toastId && !t.paused ? { ...t, paused: true } : t)));\r\n setPausedAt(Date.now());\r\n };\r\n\r\n const resumeToast = (toastId: string) => {\r\n const pauseTime = pausedAt();\r\n if (pauseTime) {\r\n setToasts(prev =>\r\n prev.map(t =>\r\n t.id === toastId && t.paused\r\n ? { ...t, paused: false, pauseDuration: t.pauseDuration + (Date.now() - pauseTime) }\r\n : t,\r\n ),\r\n );\r\n }\r\n setPausedAt(null);\r\n };\r\n\r\n return {\r\n toasts,\r\n createToast,\r\n upsertToast,\r\n dismissToast,\r\n removeToast,\r\n updateToast,\r\n pauseToast,\r\n resumeToast,\r\n dismissPop,\r\n removePop,\r\n dismissShift,\r\n removeShift,\r\n };\r\n}\r\n\r\n// Create singleton store\r\nexport const toastStore = createRoot(createToastStore);\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"toast.store.js","names":[],"sources":["../../../src/components/toast/toast.store.ts"],"sourcesContent":["import { createSignal, createRoot, JSX, createUniqueId } from 'solid-js';\nimport type { ToastData, ToastOptions, ToastType, ToastPosition, Message } from './toast.type';\n\n// Default values\nconst DEFAULT_DURATION: Record<ToastType, number> = {\n blank: 3000,\n success: 3000,\n error: 3000,\n info: 3000,\n warning: 3000,\n loading: Infinity,\n custom: 3000,\n};\n\nconst DEFAULT_POSITION: ToastPosition = 'top-right';\nconst DEFAULT_UNMOUNT_DELAY = 400;\nconst MAX_TOASTS = 10;\n\n// Toast store using signals\nfunction createToastStore() {\n const [toasts, setToasts] = createSignal<ToastData[]>([]);\n const [pausedAt, setPausedAt] = createSignal<number | null>(null);\n\n const createToast = (\n message: Message | ((toast: ToastData) => JSX.Element),\n type: ToastType,\n options?: ToastOptions,\n ): ToastData => {\n const id = createUniqueId();\n const existingToast = toasts().find(t => t.id === id);\n const toast: ToastData = {\n id,\n type,\n message: message as Message,\n icon: options?.icon,\n duration: options?.duration ?? DEFAULT_DURATION[type],\n pauseDuration: existingToast?.pauseDuration ?? 0,\n paused: false,\n position: options?.position ?? DEFAULT_POSITION,\n ariaProps: options?.ariaProps ?? {\n role: 'status',\n 'aria-live': 'polite',\n },\n style: options?.style,\n class: options?.class,\n iconTheme: options?.iconTheme,\n createdAt: existingToast?.createdAt ?? Date.now(),\n visible: true,\n unmountDelay: options?.unmountDelay ?? DEFAULT_UNMOUNT_DELAY,\n canPause: options?.canPause ?? true,\n showCloseIcon: options?.showCloseIcon ?? true,\n };\n\n return toast;\n };\n\n const upsertToast = (toast: ToastData) => {\n setToasts(prev => {\n const index = prev.findIndex(t => t.id === toast.id);\n if (index !== -1) {\n // Update existing toast\n const newToasts = [...prev];\n newToasts[index] = { ...prev[index], ...toast, updatedAt: Date.now() };\n return newToasts;\n } else {\n // Add new toast at the beginning and enforce max limit\n let newToasts = [toast, ...prev];\n if (newToasts.length > MAX_TOASTS) {\n newToasts = newToasts.slice(0, MAX_TOASTS);\n }\n return newToasts;\n }\n });\n };\n\n const dismissToast = (toastId?: string) => {\n setToasts(prev => {\n if (toastId) {\n return prev.map(t => (t.id === toastId ? { ...t, visible: false } : t));\n } else {\n // Dismiss all\n return prev.map(t => ({ ...t, visible: false }));\n }\n });\n };\n\n const removeToast = (toastId?: string) => {\n setToasts(prev => {\n if (toastId) {\n return prev.filter(t => t.id !== toastId);\n } else {\n // Remove all\n return [];\n }\n });\n };\n\n const dismissPop = () => {\n setToasts(prev => {\n for (let i = prev.length - 1; i >= 0; i--) {\n if (prev[i].visible) {\n return prev.map((t, idx) => (idx === i ? { ...t, visible: false } : t));\n }\n }\n return prev;\n });\n };\n\n const removePop = () => {\n setToasts(prev => {\n for (let i = prev.length - 1; i >= 0; i--) {\n if (prev[i].visible) {\n return [...prev.slice(0, i), ...prev.slice(i + 1)];\n }\n }\n return prev;\n });\n };\n\n const dismissShift = () => {\n setToasts(prev => {\n for (let i = 0; i < prev.length; i++) {\n if (prev[i].visible) {\n return prev.map((t, idx) => (idx === i ? { ...t, visible: false } : t));\n }\n }\n return prev;\n });\n };\n\n const removeShift = () => {\n setToasts(prev => {\n for (let i = 0; i < prev.length; i++) {\n if (prev[i].visible) {\n return [...prev.slice(0, i), ...prev.slice(i + 1)];\n }\n }\n return prev;\n });\n };\n\n const updateToast = (toastId: string, updates: Partial<ToastData>) => {\n setToasts(prev =>\n prev.map(t => (t.id === toastId ? { ...t, ...updates, updatedAt: Date.now() } : t)),\n );\n };\n\n const pauseToast = (toastId: string) => {\n setToasts(prev => prev.map(t => (t.id === toastId && !t.paused ? { ...t, paused: true } : t)));\n setPausedAt(Date.now());\n };\n\n const resumeToast = (toastId: string) => {\n const pauseTime = pausedAt();\n if (pauseTime) {\n setToasts(prev =>\n prev.map(t =>\n t.id === toastId && t.paused\n ? { ...t, paused: false, pauseDuration: t.pauseDuration + (Date.now() - pauseTime) }\n : t,\n ),\n );\n }\n setPausedAt(null);\n };\n\n return {\n toasts,\n createToast,\n upsertToast,\n dismissToast,\n removeToast,\n updateToast,\n pauseToast,\n resumeToast,\n dismissPop,\n removePop,\n dismissShift,\n removeShift,\n };\n}\n\n// Create singleton store\nexport const toastStore = createRoot(createToastStore);\n"],"mappings":"4EAIA,IAAM,EAA8C,CAClD,MAAO,IACP,QAAS,IACT,MAAO,IACP,KAAM,IACN,QAAS,IACT,QAAS,IACT,OAAQ,IACT,CAEK,EAAkC,YAClC,EAAwB,IACxB,EAAa,GAGnB,SAAS,GAAmB,CAC1B,GAAM,CAAC,EAAQ,GAAa,EAA0B,EAAE,CAAC,CACnD,CAAC,EAAU,GAAe,EAA4B,KAAK,CAiJjE,MAAO,CACL,SACA,aAhJA,EACA,EACA,IACc,CACd,IAAM,EAAK,GAAgB,CACrB,EAAgB,GAAQ,CAAC,KAAK,GAAK,EAAE,KAAO,EAAG,CAwBrD,MAvByB,CACvB,KACA,OACS,UACT,KAAM,GAAS,KACf,SAAU,GAAS,UAAY,EAAiB,GAChD,cAAe,GAAe,eAAiB,EAC/C,OAAQ,GACR,SAAU,GAAS,UAAY,EAC/B,UAAW,GAAS,WAAa,CAC/B,KAAM,SACN,YAAa,SACd,CACD,MAAO,GAAS,MAChB,MAAO,GAAS,MAChB,UAAW,GAAS,UACpB,UAAW,GAAe,WAAa,KAAK,KAAK,CACjD,QAAS,GACT,aAAc,GAAS,cAAgB,EACvC,SAAU,GAAS,UAAY,GAC/B,cAAe,GAAS,eAAiB,GAC1C,EAsHD,YAjHmB,GAAqB,CACxC,EAAU,GAAQ,CAChB,IAAM,EAAQ,EAAK,UAAU,GAAK,EAAE,KAAO,EAAM,GAAG,CACpD,GAAI,IAAU,GAAI,CAEhB,IAAM,EAAY,CAAC,GAAG,EAAK,CAE3B,MADA,GAAU,GAAS,CAAE,GAAG,EAAK,GAAQ,GAAG,EAAO,UAAW,KAAK,KAAK,CAAE,CAC/D,MACF,CAEL,IAAI,EAAY,CAAC,EAAO,GAAG,EAAK,CAIhC,OAHI,EAAU,OAAS,IACrB,EAAY,EAAU,MAAM,EAAG,EAAW,EAErC,IAET,EAkGF,aA/FoB,GAAqB,CACzC,EAAU,GACJ,EACK,EAAK,IAAI,GAAM,EAAE,KAAO,EAAU,CAAE,GAAG,EAAG,QAAS,GAAO,CAAG,EAAG,CAGhE,EAAK,IAAI,IAAM,CAAE,GAAG,EAAG,QAAS,GAAO,EAAE,CAElD,EAwFF,YArFmB,GAAqB,CACxC,EAAU,GACJ,EACK,EAAK,OAAO,GAAK,EAAE,KAAO,EAAQ,CAGlC,EAAE,CAEX,EA8EF,aA/BmB,EAAiB,IAAgC,CACpE,EAAU,GACR,EAAK,IAAI,GAAM,EAAE,KAAO,EAAU,CAAE,GAAG,EAAG,GAAG,EAAS,UAAW,KAAK,KAAK,CAAE,CAAG,EAAG,CACpF,EA6BD,WA1BkB,GAAoB,CACtC,EAAU,GAAQ,EAAK,IAAI,GAAM,EAAE,KAAO,GAAW,CAAC,EAAE,OAAS,CAAE,GAAG,EAAG,OAAQ,GAAM,CAAG,EAAG,CAAC,CAC9F,EAAY,KAAK,KAAK,CAAC,EAyBvB,YAtBmB,GAAoB,CACvC,IAAM,EAAY,GAAU,CACxB,GACF,EAAU,GACR,EAAK,IAAI,GACP,EAAE,KAAO,GAAW,EAAE,OAClB,CAAE,GAAG,EAAG,OAAQ,GAAO,cAAe,EAAE,eAAiB,KAAK,KAAK,CAAG,GAAY,CAClF,EACL,CACF,CAEH,EAAY,KAAK,EAYjB,eA9EuB,CACvB,EAAU,GAAQ,CAChB,IAAK,IAAI,EAAI,EAAK,OAAS,EAAG,GAAK,EAAG,IACpC,GAAI,EAAK,GAAG,QACV,OAAO,EAAK,KAAK,EAAG,IAAS,IAAQ,EAAI,CAAE,GAAG,EAAG,QAAS,GAAO,CAAG,EAAG,CAG3E,OAAO,GACP,EAuEF,cApEsB,CACtB,EAAU,GAAQ,CAChB,IAAK,IAAI,EAAI,EAAK,OAAS,EAAG,GAAK,EAAG,IACpC,GAAI,EAAK,GAAG,QACV,MAAO,CAAC,GAAG,EAAK,MAAM,EAAG,EAAE,CAAE,GAAG,EAAK,MAAM,EAAI,EAAE,CAAC,CAGtD,OAAO,GACP,EA6DF,iBA1DyB,CACzB,EAAU,GAAQ,CAChB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,OAAQ,IAC/B,GAAI,EAAK,GAAG,QACV,OAAO,EAAK,KAAK,EAAG,IAAS,IAAQ,EAAI,CAAE,GAAG,EAAG,QAAS,GAAO,CAAG,EAAG,CAG3E,OAAO,GACP,EAmDF,gBAhDwB,CACxB,EAAU,GAAQ,CAChB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,OAAQ,IAC/B,GAAI,EAAK,GAAG,QACV,MAAO,CAAC,GAAG,EAAK,MAAM,EAAG,EAAE,CAAE,GAAG,EAAK,MAAM,EAAI,EAAE,CAAC,CAGtD,OAAO,GACP,EAyCH,CAIH,IAAa,EAAa,EAAW,EAAiB"}
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.js","names":["cn","getColor","acquire","OFFSET","release","ZIndex","ZIndexType","cva","VariantProps","Component","createSignal","createUniqueId","JSX","Match","mergeProps","onCleanup","onMount","Show","Switch","TooltipPortalProps","TooltipProps","tooltipVariants","variants","color","neutral","primary","secondary","accent","info","success","warning","error","position","top","bottom","right","left","TooltipVariantsProps","ActiveEntry","node","HTMLDivElement","registryKey","offset","bubbleHovered","activeMap","Map","customContentRegistry","Element","refCount","observer","IntersectionObserver","calcStyle","r","DOMRect","Record","OFFSET_PX","width","transform","height","showTooltip","id","triggerEl","HTMLElement","content","customContent","colorClass","extraClass","customZIndex","has","getBoundingClientRect","style","document","createElement","className","Object","assign","pointerEvents","zIndexOffset","zIndex","undefined","acquired","TOOLTIP","String","textContent","appendChild","cloneNode","entry","set","addEventListener","onBubbleEnter","onBubbleLeave","removeTooltipIfIdle","body","sentinelActiveSet","Set","get","remove","delete","removeTooltip","getOrCreateObserver","entries","el","target","dataset","tip","pos","Number","isIntersecting","add","closest","threshold","Tooltip","p","_$createComponent","when","hidden","fallback","_$memo","children","TooltipDefaultMain","type","TooltipPortalMain","const","sentinelRef","customContentRef","class","firstElementChild","observe","cleanupTooltipRegistration","unobserve","disconnect","_el$","_tmpl$","_el$2","firstChild","_$use","tt","_ref$","_$insert","_c$","_el$3","_tmpl$2","_ref$2","_$effect","_p$","_v$","root","_v$2","e","_$className","t","_$setAttribute","portalBubbleStyle","setPortalBubbleStyle","CSSProperties","TooltipEntry","setHovered","v","updateCoords","ContainerState","count","containerMap","WeakMap","ListenerPair","over","Event","out","listenerMap","makeMouseOver","state","getAttribute","makeMouseOut","related","MouseEvent","relatedTarget","contains","attachToContainer","passive","detachFromContainer","pair","removeEventListener","calcPortalStyle","isHovered","setIsHovered","onTriggerMount","setAttribute","handle","cancelled","doCleanup","register","getElementById","containerId","s","removeAttribute","queueMicrotask","cancelAndDetachTrigger","_el$4","_tmpl$3","_$spread","_$mergeProps","open","blockScroll","customValue"],"sources":["../../../src/components/tooltip/tooltip.tsx"],"sourcesContent":["import { cn } from '@/utils/cn';\r\nimport { getColor } from '@/utils/helper';\r\nimport { acquire, OFFSET, release, ZIndex, ZIndexType } from '@components/z-index';\r\nimport { cva, VariantProps } from 'class-variance-authority';\r\nimport {\r\n Component,\r\n createSignal,\r\n createUniqueId,\r\n JSX,\r\n Match,\r\n mergeProps,\r\n onCleanup,\r\n onMount,\r\n Show,\r\n Switch,\r\n} from 'solid-js';\r\nimport type { TooltipPortalProps, TooltipProps } from './tooltip.types';\r\n\r\n// ─── CVA variants (dùng cho TooltipPortal) ────────────────────────────────\r\n\r\nconst tooltipVariants = cva('', {\r\n variants: {\r\n color: {\r\n neutral: 'tooltip-neutral',\r\n primary: 'tooltip-primary',\r\n secondary: 'tooltip-secondary',\r\n accent: 'tooltip-accent',\r\n info: 'tooltip-info',\r\n success: 'tooltip-success',\r\n warning: 'tooltip-warning',\r\n error: 'tooltip-error',\r\n },\r\n position: {\r\n top: 'tooltip-top',\r\n bottom: 'tooltip-bottom',\r\n right: 'tooltip-right',\r\n left: 'tooltip-left',\r\n },\r\n },\r\n});\r\nexport type TooltipVariantsProps = VariantProps<typeof tooltipVariants>;\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// TOOLTIP — IO-based (không bị clip bởi overflow)\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\n// --- Global scope (IO mechanism) ---\r\ntype ActiveEntry = {\r\n node: HTMLDivElement;\r\n registryKey: string;\r\n offset: number;\r\n /** true khi chuột đang ở trên bubble — giữ tooltip không bị remove */\r\n bubbleHovered: boolean;\r\n /** position của trigger để tính bridge */\r\n position: 'top' | 'bottom' | 'left' | 'right';\r\n};\r\n\r\nconst activeMap = new Map<string, ActiveEntry>();\r\n\r\n/** Registry cho customContent: id → rendered DOM node */\r\nconst customContentRegistry = new Map<string, Element>();\r\n\r\nlet refCount = 0;\r\nlet observer: IntersectionObserver | null = null;\r\n\r\nfunction calcStyle(\r\n r: DOMRect,\r\n position: 'top' | 'bottom' | 'left' | 'right',\r\n): Record<string, string> {\r\n const OFFSET_PX = 8;\r\n if (position === 'top') {\r\n return {\r\n left: `${r.left + r.width / 2}px`,\r\n top: `${r.top - OFFSET_PX}px`,\r\n transform: 'translateX(-50%) translateY(-100%)',\r\n };\r\n } else if (position === 'bottom') {\r\n return {\r\n left: `${r.left + r.width / 2}px`,\r\n top: `${r.bottom + OFFSET_PX}px`,\r\n transform: 'translateX(-50%)',\r\n };\r\n } else if (position === 'left') {\r\n return {\r\n left: `${r.left - OFFSET_PX}px`,\r\n top: `${r.top + r.height / 2}px`,\r\n transform: 'translateX(-100%) translateY(-50%)',\r\n };\r\n } else {\r\n return {\r\n left: `${r.right + OFFSET_PX}px`,\r\n top: `${r.top + r.height / 2}px`,\r\n transform: 'translateY(-50%)',\r\n };\r\n }\r\n}\r\n\r\nfunction showTooltip(\r\n id: string,\r\n triggerEl: HTMLElement,\r\n content: string | undefined,\r\n customContent: Element | undefined,\r\n position: 'top' | 'bottom' | 'left' | 'right',\r\n colorClass: string,\r\n extraClass: string | undefined,\r\n customZIndex: number | undefined,\r\n) {\r\n if (activeMap.has(id)) return;\r\n\r\n const r = triggerEl.getBoundingClientRect();\r\n const style = calcStyle(r, position);\r\n\r\n const node = document.createElement('div');\r\n node.className = cn('too06', colorClass, extraClass);\r\n\r\n Object.assign(node.style, { position: 'fixed', pointerEvents: 'auto' }, style);\r\n\r\n let registryKey: string;\r\n let zIndexOffset: number;\r\n let zIndex: number;\r\n\r\n if (customZIndex !== undefined) {\r\n zIndex = customZIndex;\r\n registryKey = '';\r\n zIndexOffset = -1;\r\n } else {\r\n const acquired = acquire(ZIndexType.TOOLTIP, OFFSET[ZIndexType.TOOLTIP]);\r\n zIndex = acquired.zIndex;\r\n registryKey = acquired.registryKey;\r\n zIndexOffset = acquired.offset;\r\n }\r\n\r\n node.style.zIndex = String(zIndex);\r\n\r\n if (content) {\r\n node.textContent = content;\r\n } else if (customContent) {\r\n node.appendChild(customContent.cloneNode(true));\r\n }\r\n\r\n const entry: ActiveEntry = {\r\n node,\r\n registryKey,\r\n offset: zIndexOffset,\r\n bubbleHovered: false,\r\n position,\r\n };\r\n activeMap.set(id, entry);\r\n\r\n node.addEventListener('mouseenter', function onBubbleEnter() {\r\n entry.bubbleHovered = true;\r\n });\r\n node.addEventListener('mouseleave', function onBubbleLeave() {\r\n entry.bubbleHovered = false;\r\n // Nếu sentinel đã không còn visible (chuột đã rời trigger), xóa tooltip\r\n removeTooltipIfIdle(id);\r\n });\r\n\r\n document.body.appendChild(node);\r\n}\r\n\r\n/** sentinelActive = true khi IO đang thấy sentinel (chuột trên trigger/bridge) */\r\nconst sentinelActiveSet = new Set<string>();\r\n\r\nfunction removeTooltipIfIdle(id: string) {\r\n const entry = activeMap.get(id);\r\n if (!entry) return;\r\n // Chỉ remove nếu cả sentinel lẫn bubble đều không có hover\r\n if (sentinelActiveSet.has(id) || entry.bubbleHovered) return;\r\n entry.node.remove();\r\n if (entry.offset >= 0) {\r\n release(entry.registryKey, entry.offset);\r\n }\r\n activeMap.delete(id);\r\n}\r\n\r\nfunction removeTooltip(id: string) {\r\n sentinelActiveSet.delete(id);\r\n removeTooltipIfIdle(id);\r\n}\r\n\r\n/**\r\n * Trick kết hợp CSS: sentinel element 1×1px ẩn bên trong wrapper.\r\n * Khi `:hover` CSS làm sentinel hiển thị (`display: block`), IntersectionObserver\r\n * phát hiện nó intersect viewport và gọi `showTooltip()`.\r\n * Không dùng JS event listener trên trigger — zero overhead.\r\n */\r\nfunction getOrCreateObserver(): IntersectionObserver {\r\n if (!observer) {\r\n observer = new IntersectionObserver(\r\n entries => {\r\n for (const entry of entries) {\r\n const el = entry.target as HTMLElement;\r\n const id = el.dataset.id ?? '';\r\n const content = el.dataset.tip;\r\n const pos = (el.dataset.position ?? 'top') as 'top' | 'bottom' | 'left' | 'right';\r\n const colorClass = el.dataset.colorClass ?? '';\r\n const extraClass = el.dataset.extraClass;\r\n const customZIndex = el.dataset.customZIndex\r\n ? Number(el.dataset.customZIndex)\r\n : undefined;\r\n\r\n if (entry.isIntersecting) {\r\n sentinelActiveSet.add(id);\r\n const triggerEl = el.closest('[data-tt]') as HTMLElement | null;\r\n if (!triggerEl) continue;\r\n const customContent = customContentRegistry.get(id);\r\n showTooltip(\r\n id,\r\n triggerEl,\r\n content,\r\n customContent,\r\n pos,\r\n colorClass,\r\n extraClass,\r\n customZIndex,\r\n );\r\n } else {\r\n removeTooltip(id);\r\n }\r\n }\r\n },\r\n { threshold: 0 },\r\n );\r\n }\r\n return observer;\r\n}\r\n\r\n// ─── Tooltip — unified entry point ──────────────────────────────────────────\r\n\r\nexport const Tooltip: Component<TooltipProps> = p => {\r\n return (\r\n <Show when={!p.hidden} fallback={<>{p.children}</>}>\r\n <Switch fallback={<TooltipDefaultMain {...p} />}>\r\n <Match when={p.type === 'portal' || 'containerId' in p}>\r\n <TooltipPortalMain {...(p as TooltipPortalProps)} />\r\n </Match>\r\n </Switch>\r\n </Show>\r\n );\r\n};\r\n\r\n// ─── Default (IO-based) impl ─────────────────────────────────────────────────\r\n\r\nconst TooltipDefaultMain: Component<TooltipProps> = p => {\r\n p = mergeProps(\r\n {\r\n position: 'top' as const,\r\n color: 'neutral' as const,\r\n },\r\n p,\r\n );\r\n const id = createUniqueId();\r\n let sentinelRef!: HTMLDivElement;\r\n let customContentRef!: HTMLDivElement;\r\n\r\n onMount(() => {\r\n refCount++;\r\n sentinelRef.dataset.id = id;\r\n sentinelRef.dataset.tip = p.content ?? '';\r\n sentinelRef.dataset.position = p.position;\r\n sentinelRef.dataset.colorClass = getColor(p.color);\r\n if (p.class?.content) sentinelRef.dataset.extraClass = p.class.content;\r\n if (p.zIndex !== undefined) sentinelRef.dataset.customZIndex = String(p.zIndex);\r\n if (p.customContent && customContentRef?.firstElementChild) {\r\n customContentRegistry.set(id, customContentRef.firstElementChild);\r\n }\r\n getOrCreateObserver().observe(sentinelRef);\r\n });\r\n\r\n onCleanup(function cleanupTooltipRegistration() {\r\n observer?.unobserve(sentinelRef);\r\n removeTooltip(id);\r\n customContentRegistry.delete(id);\r\n refCount--;\r\n if (refCount === 0 && observer) {\r\n observer.disconnect();\r\n observer = null;\r\n }\r\n });\r\n\r\n return (\r\n <div\r\n ref={el => (el.dataset.tt = '')}\r\n class={cn('too07', p.class?.root)}\r\n data-pos={p.position ?? 'top'}\r\n >\r\n <div ref={sentinelRef} class=\"too08\" />\r\n {p.children as JSX.Element}\r\n {p.customContent && (\r\n <div ref={customContentRef} class=\"hidden\">\r\n {p.customContent}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// TOOLTIP PORTAL — Event-delegation mode\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\n/**\r\n * SINGLETON PORTAL BUBBLE — Thiết kế có chủ đích.\r\n * Signal ở module scope vì toàn bộ hệ thống tooltip portal chỉ có\r\n * DUY NHẤT 1 bubble tồn tại trong DOM tại bất kỳ thời điểm nào.\r\n */\r\nconst [portalBubbleStyle, setPortalBubbleStyle] = createSignal<\r\n import('solid-js').JSX.CSSProperties\r\n>({});\r\n\r\ntype TooltipEntry = {\r\n setHovered: (v: boolean) => void;\r\n updateCoords: () => void;\r\n};\r\n\r\ntype ContainerState = {\r\n count: number;\r\n entries: Map<string, TooltipEntry>;\r\n};\r\n\r\nconst containerMap = new WeakMap<Element, ContainerState>();\r\n\r\ntype ListenerPair = { over: (e: Event) => void; out: (e: Event) => void };\r\nconst listenerMap = new WeakMap<Element, ListenerPair>();\r\n\r\nfunction makeMouseOver(state: ContainerState) {\r\n return (e: Event) => {\r\n const el = (e.target as Element).closest('[tt]');\r\n if (!el) return;\r\n const tt = el.getAttribute('tt')!;\r\n const entry = state.entries.get(tt);\r\n if (entry) {\r\n entry.updateCoords();\r\n entry.setHovered(true);\r\n }\r\n };\r\n}\r\n\r\nfunction makeMouseOut(state: ContainerState) {\r\n return (e: Event) => {\r\n const el = (e.target as Element).closest('[tt]');\r\n if (!el) return;\r\n const tt = el.getAttribute('tt')!;\r\n const related = (e as MouseEvent).relatedTarget as Element | null;\r\n if (related && el.contains(related)) return;\r\n const entry = state.entries.get(tt);\r\n if (entry) entry.setHovered(false);\r\n };\r\n}\r\n\r\nfunction attachToContainer(root: Element, state: ContainerState) {\r\n const over = makeMouseOver(state);\r\n const out = makeMouseOut(state);\r\n listenerMap.set(root, { over, out });\r\n root.addEventListener('mouseover', over, { passive: true });\r\n root.addEventListener('mouseout', out, { passive: true });\r\n}\r\n\r\nfunction detachFromContainer(root: Element) {\r\n const pair = listenerMap.get(root);\r\n if (!pair) return;\r\n root.removeEventListener('mouseover', pair.over);\r\n root.removeEventListener('mouseout', pair.out);\r\n listenerMap.delete(root);\r\n}\r\n\r\nfunction calcPortalStyle(\r\n el: HTMLElement,\r\n position: 'top' | 'bottom' | 'left' | 'right',\r\n): import('solid-js').JSX.CSSProperties {\r\n const r = el.getBoundingClientRect();\r\n const OFFSET_PX = 8;\r\n\r\n if (position === 'top') {\r\n return {\r\n left: `${r.left + r.width / 2}px`,\r\n top: `${r.top - OFFSET_PX}px`,\r\n transform: 'translateX(-50%) translateY(-100%)',\r\n };\r\n } else if (position === 'bottom') {\r\n return {\r\n left: `${r.left + r.width / 2}px`,\r\n top: `${r.bottom + OFFSET_PX}px`,\r\n transform: 'translateX(-50%)',\r\n };\r\n } else if (position === 'left') {\r\n return {\r\n left: `${r.left - OFFSET_PX}px`,\r\n top: `${r.top + r.height / 2}px`,\r\n transform: 'translateX(-100%) translateY(-50%)',\r\n };\r\n } else {\r\n return {\r\n left: `${r.right + OFFSET_PX}px`,\r\n top: `${r.top + r.height / 2}px`,\r\n transform: 'translateY(-50%)',\r\n };\r\n }\r\n}\r\n\r\nconst TooltipPortalMain: Component<TooltipPortalProps> = p => {\r\n const id = createUniqueId();\r\n p = mergeProps(\r\n {\r\n position: 'top' as const,\r\n color: 'neutral' as const,\r\n },\r\n p,\r\n );\r\n\r\n const [isHovered, setIsHovered] = createSignal(false);\r\n\r\n const onTriggerMount = (el: HTMLDivElement) => {\r\n const position = p.position ?? 'top';\r\n const updateCoords = () => setPortalBubbleStyle(calcPortalStyle(el, position));\r\n el.setAttribute('tt', id);\r\n\r\n const handle = { cancelled: false, doCleanup: undefined as (() => void) | undefined };\r\n\r\n const register = () => {\r\n if (handle.cancelled) return;\r\n\r\n const root = document.getElementById(p.containerId);\r\n if (!root) return;\r\n\r\n let state = containerMap.get(root);\r\n if (!state) {\r\n state = { count: 0, entries: new Map() };\r\n containerMap.set(root, state);\r\n }\r\n state.entries.set(id, { setHovered: setIsHovered, updateCoords });\r\n state.count += 1;\r\n if (state.count === 1) attachToContainer(root, state);\r\n\r\n handle.doCleanup = () => {\r\n const s = containerMap.get(root);\r\n if (!s) return;\r\n s.entries.delete(id);\r\n s.count -= 1;\r\n el.removeAttribute('tt');\r\n if (s.count === 0) {\r\n detachFromContainer(root);\r\n containerMap.delete(root);\r\n }\r\n };\r\n };\r\n\r\n queueMicrotask(register);\r\n onCleanup(function cancelAndDetachTrigger() {\r\n handle.cancelled = true;\r\n handle.doCleanup?.();\r\n });\r\n };\r\n\r\n return (\r\n <div\r\n ref={onTriggerMount}\r\n class={cn(\r\n 'too01',\r\n tooltipVariants({ color: p.color, position: p.position }),\r\n getColor(p.color),\r\n 'too04',\r\n p.class?.root,\r\n )}\r\n {...(p.content && !p.customContent && { ['data-tip']: p.content })}\r\n >\r\n <Switch>\r\n <Match when={p.content}>\r\n <ZIndex\r\n type={ZIndexType.TOOLTIP}\r\n open={isHovered()}\r\n position={portalBubbleStyle()}\r\n class={cn('too05', getColor(p.color), p.class?.content)}\r\n blockScroll={false}\r\n customValue={p.zIndex}\r\n >\r\n {p.content}\r\n </ZIndex>\r\n </Match>\r\n <Match when={p.customContent}>\r\n <ZIndex\r\n type={ZIndexType.TOOLTIP}\r\n open={isHovered()}\r\n position={portalBubbleStyle()}\r\n class={cn('too05', p.class?.content)}\r\n customValue={p.zIndex}\r\n >\r\n {p.customContent}\r\n </ZIndex>\r\n </Match>\r\n </Switch>\r\n {p.children as JSX.Element}\r\n </div>\r\n );\r\n};\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"tooltip.js","names":["cn","getColor","acquire","OFFSET","release","ZIndex","ZIndexType","cva","VariantProps","Component","createSignal","createUniqueId","JSX","Match","mergeProps","onCleanup","onMount","Show","Switch","TooltipPortalProps","TooltipProps","tooltipVariants","variants","color","neutral","primary","secondary","accent","info","success","warning","error","position","top","bottom","right","left","TooltipVariantsProps","ActiveEntry","node","HTMLDivElement","registryKey","offset","bubbleHovered","activeMap","Map","customContentRegistry","Element","refCount","observer","IntersectionObserver","calcStyle","r","DOMRect","Record","OFFSET_PX","width","transform","height","showTooltip","id","triggerEl","HTMLElement","content","customContent","colorClass","extraClass","customZIndex","has","getBoundingClientRect","style","document","createElement","className","Object","assign","pointerEvents","zIndexOffset","zIndex","undefined","acquired","TOOLTIP","String","textContent","appendChild","cloneNode","entry","set","addEventListener","onBubbleEnter","onBubbleLeave","removeTooltipIfIdle","body","sentinelActiveSet","Set","get","remove","delete","removeTooltip","getOrCreateObserver","entries","el","target","dataset","tip","pos","Number","isIntersecting","add","closest","threshold","Tooltip","p","_$createComponent","when","hidden","fallback","_$memo","children","TooltipDefaultMain","type","TooltipPortalMain","const","sentinelRef","customContentRef","class","firstElementChild","observe","cleanupTooltipRegistration","unobserve","disconnect","_el$","_tmpl$","_el$2","firstChild","_$use","tt","_ref$","_$insert","_c$","_el$3","_tmpl$2","_ref$2","_$effect","_p$","_v$","root","_v$2","e","_$className","t","_$setAttribute","portalBubbleStyle","setPortalBubbleStyle","CSSProperties","TooltipEntry","setHovered","v","updateCoords","ContainerState","count","containerMap","WeakMap","ListenerPair","over","Event","out","listenerMap","makeMouseOver","state","getAttribute","makeMouseOut","related","MouseEvent","relatedTarget","contains","attachToContainer","passive","detachFromContainer","pair","removeEventListener","calcPortalStyle","isHovered","setIsHovered","onTriggerMount","setAttribute","handle","cancelled","doCleanup","register","getElementById","containerId","s","removeAttribute","queueMicrotask","cancelAndDetachTrigger","_el$4","_tmpl$3","_$spread","_$mergeProps","open","blockScroll","customValue"],"sources":["../../../src/components/tooltip/tooltip.tsx"],"sourcesContent":["import { cn } from '@/utils/cn';\nimport { getColor } from '@/utils/helper';\nimport { acquire, OFFSET, release, ZIndex, ZIndexType } from '@components/z-index';\nimport { cva, VariantProps } from 'class-variance-authority';\nimport {\n Component,\n createSignal,\n createUniqueId,\n JSX,\n Match,\n mergeProps,\n onCleanup,\n onMount,\n Show,\n Switch,\n} from 'solid-js';\nimport type { TooltipPortalProps, TooltipProps } from './tooltip.types';\n\n// ─── CVA variants (dùng cho TooltipPortal) ────────────────────────────────\n\nconst tooltipVariants = cva('', {\n variants: {\n color: {\n neutral: 'tooltip-neutral',\n primary: 'tooltip-primary',\n secondary: 'tooltip-secondary',\n accent: 'tooltip-accent',\n info: 'tooltip-info',\n success: 'tooltip-success',\n warning: 'tooltip-warning',\n error: 'tooltip-error',\n },\n position: {\n top: 'tooltip-top',\n bottom: 'tooltip-bottom',\n right: 'tooltip-right',\n left: 'tooltip-left',\n },\n },\n});\nexport type TooltipVariantsProps = VariantProps<typeof tooltipVariants>;\n\n// ═══════════════════════════════════════════════════════════════════════════\n// TOOLTIP — IO-based (không bị clip bởi overflow)\n// ═══════════════════════════════════════════════════════════════════════════\n\n// --- Global scope (IO mechanism) ---\ntype ActiveEntry = {\n node: HTMLDivElement;\n registryKey: string;\n offset: number;\n /** true khi chuột đang ở trên bubble — giữ tooltip không bị remove */\n bubbleHovered: boolean;\n /** position của trigger để tính bridge */\n position: 'top' | 'bottom' | 'left' | 'right';\n};\n\nconst activeMap = new Map<string, ActiveEntry>();\n\n/** Registry cho customContent: id → rendered DOM node */\nconst customContentRegistry = new Map<string, Element>();\n\nlet refCount = 0;\nlet observer: IntersectionObserver | null = null;\n\nfunction calcStyle(\n r: DOMRect,\n position: 'top' | 'bottom' | 'left' | 'right',\n): Record<string, string> {\n const OFFSET_PX = 8;\n if (position === 'top') {\n return {\n left: `${r.left + r.width / 2}px`,\n top: `${r.top - OFFSET_PX}px`,\n transform: 'translateX(-50%) translateY(-100%)',\n };\n } else if (position === 'bottom') {\n return {\n left: `${r.left + r.width / 2}px`,\n top: `${r.bottom + OFFSET_PX}px`,\n transform: 'translateX(-50%)',\n };\n } else if (position === 'left') {\n return {\n left: `${r.left - OFFSET_PX}px`,\n top: `${r.top + r.height / 2}px`,\n transform: 'translateX(-100%) translateY(-50%)',\n };\n } else {\n return {\n left: `${r.right + OFFSET_PX}px`,\n top: `${r.top + r.height / 2}px`,\n transform: 'translateY(-50%)',\n };\n }\n}\n\nfunction showTooltip(\n id: string,\n triggerEl: HTMLElement,\n content: string | undefined,\n customContent: Element | undefined,\n position: 'top' | 'bottom' | 'left' | 'right',\n colorClass: string,\n extraClass: string | undefined,\n customZIndex: number | undefined,\n) {\n if (activeMap.has(id)) return;\n\n const r = triggerEl.getBoundingClientRect();\n const style = calcStyle(r, position);\n\n const node = document.createElement('div');\n node.className = cn('too06', colorClass, extraClass);\n\n Object.assign(node.style, { position: 'fixed', pointerEvents: 'auto' }, style);\n\n let registryKey: string;\n let zIndexOffset: number;\n let zIndex: number;\n\n if (customZIndex !== undefined) {\n zIndex = customZIndex;\n registryKey = '';\n zIndexOffset = -1;\n } else {\n const acquired = acquire(ZIndexType.TOOLTIP, OFFSET[ZIndexType.TOOLTIP]);\n zIndex = acquired.zIndex;\n registryKey = acquired.registryKey;\n zIndexOffset = acquired.offset;\n }\n\n node.style.zIndex = String(zIndex);\n\n if (content) {\n node.textContent = content;\n } else if (customContent) {\n node.appendChild(customContent.cloneNode(true));\n }\n\n const entry: ActiveEntry = {\n node,\n registryKey,\n offset: zIndexOffset,\n bubbleHovered: false,\n position,\n };\n activeMap.set(id, entry);\n\n node.addEventListener('mouseenter', function onBubbleEnter() {\n entry.bubbleHovered = true;\n });\n node.addEventListener('mouseleave', function onBubbleLeave() {\n entry.bubbleHovered = false;\n // Nếu sentinel đã không còn visible (chuột đã rời trigger), xóa tooltip\n removeTooltipIfIdle(id);\n });\n\n document.body.appendChild(node);\n}\n\n/** sentinelActive = true khi IO đang thấy sentinel (chuột trên trigger/bridge) */\nconst sentinelActiveSet = new Set<string>();\n\nfunction removeTooltipIfIdle(id: string) {\n const entry = activeMap.get(id);\n if (!entry) return;\n // Chỉ remove nếu cả sentinel lẫn bubble đều không có hover\n if (sentinelActiveSet.has(id) || entry.bubbleHovered) return;\n entry.node.remove();\n if (entry.offset >= 0) {\n release(entry.registryKey, entry.offset);\n }\n activeMap.delete(id);\n}\n\nfunction removeTooltip(id: string) {\n sentinelActiveSet.delete(id);\n removeTooltipIfIdle(id);\n}\n\n/**\n * Trick kết hợp CSS: sentinel element 1×1px ẩn bên trong wrapper.\n * Khi `:hover` CSS làm sentinel hiển thị (`display: block`), IntersectionObserver\n * phát hiện nó intersect viewport và gọi `showTooltip()`.\n * Không dùng JS event listener trên trigger — zero overhead.\n */\nfunction getOrCreateObserver(): IntersectionObserver {\n if (!observer) {\n observer = new IntersectionObserver(\n entries => {\n for (const entry of entries) {\n const el = entry.target as HTMLElement;\n const id = el.dataset.id ?? '';\n const content = el.dataset.tip;\n const pos = (el.dataset.position ?? 'top') as 'top' | 'bottom' | 'left' | 'right';\n const colorClass = el.dataset.colorClass ?? '';\n const extraClass = el.dataset.extraClass;\n const customZIndex = el.dataset.customZIndex\n ? Number(el.dataset.customZIndex)\n : undefined;\n\n if (entry.isIntersecting) {\n sentinelActiveSet.add(id);\n const triggerEl = el.closest('[data-tt]') as HTMLElement | null;\n if (!triggerEl) continue;\n const customContent = customContentRegistry.get(id);\n showTooltip(\n id,\n triggerEl,\n content,\n customContent,\n pos,\n colorClass,\n extraClass,\n customZIndex,\n );\n } else {\n removeTooltip(id);\n }\n }\n },\n { threshold: 0 },\n );\n }\n return observer;\n}\n\n// ─── Tooltip — unified entry point ──────────────────────────────────────────\n\nexport const Tooltip: Component<TooltipProps> = p => {\n return (\n <Show when={!p.hidden} fallback={<>{p.children}</>}>\n <Switch fallback={<TooltipDefaultMain {...p} />}>\n <Match when={p.type === 'portal' || 'containerId' in p}>\n <TooltipPortalMain {...(p as TooltipPortalProps)} />\n </Match>\n </Switch>\n </Show>\n );\n};\n\n// ─── Default (IO-based) impl ─────────────────────────────────────────────────\n\nconst TooltipDefaultMain: Component<TooltipProps> = p => {\n p = mergeProps(\n {\n position: 'top' as const,\n color: 'neutral' as const,\n },\n p,\n );\n const id = createUniqueId();\n let sentinelRef!: HTMLDivElement;\n let customContentRef!: HTMLDivElement;\n\n onMount(() => {\n refCount++;\n sentinelRef.dataset.id = id;\n sentinelRef.dataset.tip = p.content ?? '';\n sentinelRef.dataset.position = p.position;\n sentinelRef.dataset.colorClass = getColor(p.color);\n if (p.class?.content) sentinelRef.dataset.extraClass = p.class.content;\n if (p.zIndex !== undefined) sentinelRef.dataset.customZIndex = String(p.zIndex);\n if (p.customContent && customContentRef?.firstElementChild) {\n customContentRegistry.set(id, customContentRef.firstElementChild);\n }\n getOrCreateObserver().observe(sentinelRef);\n });\n\n onCleanup(function cleanupTooltipRegistration() {\n observer?.unobserve(sentinelRef);\n removeTooltip(id);\n customContentRegistry.delete(id);\n refCount--;\n if (refCount === 0 && observer) {\n observer.disconnect();\n observer = null;\n }\n });\n\n return (\n <div\n ref={el => (el.dataset.tt = '')}\n class={cn('too07', p.class?.root)}\n data-pos={p.position ?? 'top'}\n >\n <div ref={sentinelRef} class=\"too08\" />\n {p.children as JSX.Element}\n {p.customContent && (\n <div ref={customContentRef} class=\"hidden\">\n {p.customContent}\n </div>\n )}\n </div>\n );\n};\n\n// ═══════════════════════════════════════════════════════════════════════════\n// TOOLTIP PORTAL — Event-delegation mode\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * SINGLETON PORTAL BUBBLE — Thiết kế có chủ đích.\n * Signal ở module scope vì toàn bộ hệ thống tooltip portal chỉ có\n * DUY NHẤT 1 bubble tồn tại trong DOM tại bất kỳ thời điểm nào.\n */\nconst [portalBubbleStyle, setPortalBubbleStyle] = createSignal<\n import('solid-js').JSX.CSSProperties\n>({});\n\ntype TooltipEntry = {\n setHovered: (v: boolean) => void;\n updateCoords: () => void;\n};\n\ntype ContainerState = {\n count: number;\n entries: Map<string, TooltipEntry>;\n};\n\nconst containerMap = new WeakMap<Element, ContainerState>();\n\ntype ListenerPair = { over: (e: Event) => void; out: (e: Event) => void };\nconst listenerMap = new WeakMap<Element, ListenerPair>();\n\nfunction makeMouseOver(state: ContainerState) {\n return (e: Event) => {\n const el = (e.target as Element).closest('[tt]');\n if (!el) return;\n const tt = el.getAttribute('tt')!;\n const entry = state.entries.get(tt);\n if (entry) {\n entry.updateCoords();\n entry.setHovered(true);\n }\n };\n}\n\nfunction makeMouseOut(state: ContainerState) {\n return (e: Event) => {\n const el = (e.target as Element).closest('[tt]');\n if (!el) return;\n const tt = el.getAttribute('tt')!;\n const related = (e as MouseEvent).relatedTarget as Element | null;\n if (related && el.contains(related)) return;\n const entry = state.entries.get(tt);\n if (entry) entry.setHovered(false);\n };\n}\n\nfunction attachToContainer(root: Element, state: ContainerState) {\n const over = makeMouseOver(state);\n const out = makeMouseOut(state);\n listenerMap.set(root, { over, out });\n root.addEventListener('mouseover', over, { passive: true });\n root.addEventListener('mouseout', out, { passive: true });\n}\n\nfunction detachFromContainer(root: Element) {\n const pair = listenerMap.get(root);\n if (!pair) return;\n root.removeEventListener('mouseover', pair.over);\n root.removeEventListener('mouseout', pair.out);\n listenerMap.delete(root);\n}\n\nfunction calcPortalStyle(\n el: HTMLElement,\n position: 'top' | 'bottom' | 'left' | 'right',\n): import('solid-js').JSX.CSSProperties {\n const r = el.getBoundingClientRect();\n const OFFSET_PX = 8;\n\n if (position === 'top') {\n return {\n left: `${r.left + r.width / 2}px`,\n top: `${r.top - OFFSET_PX}px`,\n transform: 'translateX(-50%) translateY(-100%)',\n };\n } else if (position === 'bottom') {\n return {\n left: `${r.left + r.width / 2}px`,\n top: `${r.bottom + OFFSET_PX}px`,\n transform: 'translateX(-50%)',\n };\n } else if (position === 'left') {\n return {\n left: `${r.left - OFFSET_PX}px`,\n top: `${r.top + r.height / 2}px`,\n transform: 'translateX(-100%) translateY(-50%)',\n };\n } else {\n return {\n left: `${r.right + OFFSET_PX}px`,\n top: `${r.top + r.height / 2}px`,\n transform: 'translateY(-50%)',\n };\n }\n}\n\nconst TooltipPortalMain: Component<TooltipPortalProps> = p => {\n const id = createUniqueId();\n p = mergeProps(\n {\n position: 'top' as const,\n color: 'neutral' as const,\n },\n p,\n );\n\n const [isHovered, setIsHovered] = createSignal(false);\n\n const onTriggerMount = (el: HTMLDivElement) => {\n const position = p.position ?? 'top';\n const updateCoords = () => setPortalBubbleStyle(calcPortalStyle(el, position));\n el.setAttribute('tt', id);\n\n const handle = { cancelled: false, doCleanup: undefined as (() => void) | undefined };\n\n const register = () => {\n if (handle.cancelled) return;\n\n const root = document.getElementById(p.containerId);\n if (!root) return;\n\n let state = containerMap.get(root);\n if (!state) {\n state = { count: 0, entries: new Map() };\n containerMap.set(root, state);\n }\n state.entries.set(id, { setHovered: setIsHovered, updateCoords });\n state.count += 1;\n if (state.count === 1) attachToContainer(root, state);\n\n handle.doCleanup = () => {\n const s = containerMap.get(root);\n if (!s) return;\n s.entries.delete(id);\n s.count -= 1;\n el.removeAttribute('tt');\n if (s.count === 0) {\n detachFromContainer(root);\n containerMap.delete(root);\n }\n };\n };\n\n queueMicrotask(register);\n onCleanup(function cancelAndDetachTrigger() {\n handle.cancelled = true;\n handle.doCleanup?.();\n });\n };\n\n return (\n <div\n ref={onTriggerMount}\n class={cn(\n 'too01',\n tooltipVariants({ color: p.color, position: p.position }),\n getColor(p.color),\n 'too04',\n p.class?.root,\n )}\n {...(p.content && !p.customContent && { ['data-tip']: p.content })}\n >\n <Switch>\n <Match when={p.content}>\n <ZIndex\n type={ZIndexType.TOOLTIP}\n open={isHovered()}\n position={portalBubbleStyle()}\n class={cn('too05', getColor(p.color), p.class?.content)}\n blockScroll={false}\n customValue={p.zIndex}\n >\n {p.content}\n </ZIndex>\n </Match>\n <Match when={p.customContent}>\n <ZIndex\n type={ZIndexType.TOOLTIP}\n open={isHovered()}\n position={portalBubbleStyle()}\n class={cn('too05', p.class?.content)}\n customValue={p.zIndex}\n >\n {p.customContent}\n </ZIndex>\n </Match>\n </Switch>\n {p.children as JSX.Element}\n </div>\n );\n};\n"],"mappings":"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"}