@jasonshimmy/custom-elements-runtime 3.1.3 → 3.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/dist/{css-utils-Cg4o1MqY.js → css-utils-CC43BbEy.js} +20 -21
  2. package/dist/css-utils-CC43BbEy.js.map +1 -0
  3. package/dist/{css-utils-RqkyBWft.cjs → css-utils-mgjmH8qX.cjs} +5 -4
  4. package/dist/css-utils-mgjmH8qX.cjs.map +1 -0
  5. package/dist/custom-elements-runtime.cjs.js +4 -3
  6. package/dist/custom-elements-runtime.cjs.js.map +1 -1
  7. package/dist/custom-elements-runtime.colors.cjs.js +3 -2
  8. package/dist/custom-elements-runtime.colors.cjs.js.map +1 -1
  9. package/dist/custom-elements-runtime.colors.es.js +3 -2
  10. package/dist/custom-elements-runtime.colors.es.js.map +1 -1
  11. package/dist/custom-elements-runtime.directive-enhancements.cjs.js +3 -2
  12. package/dist/custom-elements-runtime.directive-enhancements.cjs.js.map +1 -1
  13. package/dist/custom-elements-runtime.directive-enhancements.es.js +86 -100
  14. package/dist/custom-elements-runtime.directive-enhancements.es.js.map +1 -1
  15. package/dist/custom-elements-runtime.directives.cjs.js +3 -2
  16. package/dist/custom-elements-runtime.directives.cjs.js.map +1 -1
  17. package/dist/custom-elements-runtime.directives.es.js +40 -43
  18. package/dist/custom-elements-runtime.directives.es.js.map +1 -1
  19. package/dist/custom-elements-runtime.dom-jit-css.cjs.js +7 -6
  20. package/dist/custom-elements-runtime.dom-jit-css.cjs.js.map +1 -1
  21. package/dist/custom-elements-runtime.dom-jit-css.es.js +58 -76
  22. package/dist/custom-elements-runtime.dom-jit-css.es.js.map +1 -1
  23. package/dist/custom-elements-runtime.es.js +162 -186
  24. package/dist/custom-elements-runtime.es.js.map +1 -1
  25. package/dist/custom-elements-runtime.event-bus.cjs.js +3 -2
  26. package/dist/custom-elements-runtime.event-bus.cjs.js.map +1 -1
  27. package/dist/custom-elements-runtime.event-bus.es.js +48 -103
  28. package/dist/custom-elements-runtime.event-bus.es.js.map +1 -1
  29. package/dist/custom-elements-runtime.jit-css.cjs.js +3 -2
  30. package/dist/custom-elements-runtime.jit-css.cjs.js.map +1 -1
  31. package/dist/custom-elements-runtime.jit-css.es.js +29 -30
  32. package/dist/custom-elements-runtime.jit-css.es.js.map +1 -1
  33. package/dist/custom-elements-runtime.router.cjs.js +19 -18
  34. package/dist/custom-elements-runtime.router.cjs.js.map +1 -1
  35. package/dist/custom-elements-runtime.router.es.js +554 -571
  36. package/dist/custom-elements-runtime.router.es.js.map +1 -1
  37. package/dist/custom-elements-runtime.ssr-middleware.cjs.js +5 -2
  38. package/dist/custom-elements-runtime.ssr-middleware.cjs.js.map +1 -1
  39. package/dist/custom-elements-runtime.ssr-middleware.es.js +54 -45
  40. package/dist/custom-elements-runtime.ssr-middleware.es.js.map +1 -1
  41. package/dist/custom-elements-runtime.ssr.cjs.js +1 -4
  42. package/dist/custom-elements-runtime.ssr.es.js +11 -175
  43. package/dist/custom-elements-runtime.store.cjs.js +3 -2
  44. package/dist/custom-elements-runtime.store.cjs.js.map +1 -1
  45. package/dist/custom-elements-runtime.store.es.js +17 -11
  46. package/dist/custom-elements-runtime.store.es.js.map +1 -1
  47. package/dist/custom-elements-runtime.transitions.cjs.js +3 -2
  48. package/dist/custom-elements-runtime.transitions.cjs.js.map +1 -1
  49. package/dist/custom-elements-runtime.transitions.es.js +55 -120
  50. package/dist/custom-elements-runtime.transitions.es.js.map +1 -1
  51. package/dist/custom-elements-runtime.vite-plugin.cjs.js +3 -2
  52. package/dist/custom-elements-runtime.vite-plugin.cjs.js.map +1 -1
  53. package/dist/custom-elements-runtime.vite-plugin.es.js +54 -75
  54. package/dist/custom-elements-runtime.vite-plugin.es.js.map +1 -1
  55. package/dist/hooks-_3xP4G2N.js +1189 -0
  56. package/dist/hooks-_3xP4G2N.js.map +1 -0
  57. package/dist/hooks-fYQgZk2g.cjs +7 -0
  58. package/dist/hooks-fYQgZk2g.cjs.map +1 -0
  59. package/dist/logger-BYIN7ysT.cjs +3 -0
  60. package/dist/logger-BYIN7ysT.cjs.map +1 -0
  61. package/dist/logger-L25axmB-.js +41 -0
  62. package/dist/logger-L25axmB-.js.map +1 -0
  63. package/dist/namespace-helpers-Bf7rm9JV.cjs +3 -0
  64. package/dist/namespace-helpers-Bf7rm9JV.cjs.map +1 -0
  65. package/dist/namespace-helpers-BucDdgz_.js +61 -0
  66. package/dist/namespace-helpers-BucDdgz_.js.map +1 -0
  67. package/dist/reset.css +1 -1
  68. package/dist/runtime/ssr-context.d.ts +1 -13
  69. package/dist/runtime/vdom-ssr-dsd.d.ts +14 -0
  70. package/dist/ssr-B3lxl1vr.js +165 -0
  71. package/dist/ssr-B3lxl1vr.js.map +1 -0
  72. package/dist/ssr-DtD9e5iA.cjs +5 -0
  73. package/dist/ssr-DtD9e5iA.cjs.map +1 -0
  74. package/dist/ssr-middleware.d.ts +18 -2
  75. package/dist/ssr.d.ts +3 -4
  76. package/dist/style-Bjn8zDiZ.cjs +56 -0
  77. package/dist/style-Bjn8zDiZ.cjs.map +1 -0
  78. package/dist/{style-BmyOIMcU.js → style-DuDoj_xK.js} +724 -876
  79. package/dist/style-DuDoj_xK.js.map +1 -0
  80. package/dist/style.css +1 -1
  81. package/dist/template-compiler-BB4JJdqk.cjs +23 -0
  82. package/dist/template-compiler-BB4JJdqk.cjs.map +1 -0
  83. package/dist/template-compiler-Cs5axmn4.js +3236 -0
  84. package/dist/template-compiler-Cs5axmn4.js.map +1 -0
  85. package/dist/variables.css +1 -1
  86. package/package.json +7 -7
  87. package/dist/css-utils-Cg4o1MqY.js.map +0 -1
  88. package/dist/css-utils-RqkyBWft.cjs.map +0 -1
  89. package/dist/custom-elements-runtime.ssr.cjs.js.map +0 -1
  90. package/dist/custom-elements-runtime.ssr.es.js.map +0 -1
  91. package/dist/hooks-x8M4knLc.cjs +0 -6
  92. package/dist/hooks-x8M4knLc.cjs.map +0 -1
  93. package/dist/hooks-xWZhQHco.js +0 -1465
  94. package/dist/hooks-xWZhQHco.js.map +0 -1
  95. package/dist/logger-BvkEbVM4.js +0 -48
  96. package/dist/logger-BvkEbVM4.js.map +0 -1
  97. package/dist/logger-CSALKaYm.cjs +0 -2
  98. package/dist/logger-CSALKaYm.cjs.map +0 -1
  99. package/dist/namespace-helpers-D4wC2-qA.js +0 -61
  100. package/dist/namespace-helpers-D4wC2-qA.js.map +0 -1
  101. package/dist/namespace-helpers-ckeEOxpR.cjs +0 -2
  102. package/dist/namespace-helpers-ckeEOxpR.cjs.map +0 -1
  103. package/dist/style-BmyOIMcU.js.map +0 -1
  104. package/dist/style-D40DsIqJ.cjs +0 -55
  105. package/dist/style-D40DsIqJ.cjs.map +0 -1
  106. package/dist/template-compiler-CTUhEHr8.cjs +0 -22
  107. package/dist/template-compiler-CTUhEHr8.cjs.map +0 -1
  108. package/dist/template-compiler-ZhSg1yPh.js +0 -3724
  109. package/dist/template-compiler-ZhSg1yPh.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"custom-elements-runtime.transitions.cjs.js","sources":["../src/lib/transitions.ts"],"sourcesContent":["/**\n * Transitions module (top-level). This file provides the public Transition\n * and TransitionGroup APIs. It is an explicit entry used by the build so\n * consumers can import transitions separately: `.../transitions`.\n */\n/**\n * Transitions Module\n * Vue-like transition system integrated with JIT CSS\n * Provides Transition and TransitionGroup components for enter/leave animations\n */\n\nimport { anchorBlock } from './directives';\nimport type { VNode } from './runtime/types';\nimport { processJITCSS } from './runtime/render-bridge';\n\n/* --- Types --- */\n\n/**\n * Transition class names for different animation phases\n * All values should be JIT CSS utility classes\n */\nexport interface TransitionClasses {\n /** Classes applied at the start of enter transition */\n enterFrom?: string;\n /** Classes applied during entire enter transition */\n enterActive?: string;\n /** Classes applied at the end of enter transition */\n enterTo?: string;\n /** Classes applied at the start of leave transition */\n leaveFrom?: string;\n /** Classes applied during entire leave transition */\n leaveActive?: string;\n /** Classes applied at the end of leave transition */\n leaveTo?: string;\n}\n\n/**\n * Lifecycle hooks for transition events\n */\nexport interface TransitionHooks {\n /** Called before enter transition starts */\n onBeforeEnter?: (el: HTMLElement) => void;\n /** Called during enter transition (with done callback for manual control) */\n onEnter?: (el: HTMLElement, done: () => void) => void;\n /** Called after enter transition completes */\n onAfterEnter?: (el: HTMLElement) => void;\n /** Called if enter transition is cancelled */\n onEnterCancelled?: (el: HTMLElement) => void;\n /** Called before leave transition starts */\n onBeforeLeave?: (el: HTMLElement) => void;\n /** Called during leave transition (with done callback for manual control) */\n onLeave?: (el: HTMLElement, done: () => void) => void;\n /** Called after leave transition completes */\n onAfterLeave?: (el: HTMLElement) => void;\n /** Called if leave transition is cancelled */\n onLeaveCancelled?: (el: HTMLElement) => void;\n}\n\n/**\n * Options for Transition component\n */\nexport interface TransitionOptions extends TransitionClasses, TransitionHooks {\n /** Preset name (fade, slide-right, scale, etc.) */\n preset?: keyof typeof transitionPresets;\n /** Whether to show the content */\n show: boolean;\n /** Transition mode: default, out-in (leave before enter), in-out (enter before leave) */\n mode?: 'default' | 'out-in' | 'in-out';\n /** Custom duration override (ms) */\n duration?: number | { enter: number; leave: number };\n /** Whether to apply transition on initial render */\n appear?: boolean;\n /** Whether to use CSS transitions (true) or JS-only hooks (false) */\n css?: boolean;\n /** Optional name for debugging */\n name?: string;\n}\n\n/**\n * Options for TransitionGroup component\n */\nexport interface TransitionGroupOptions extends Omit<\n TransitionOptions,\n 'show'\n> {\n /** HTML tag for the wrapper element */\n tag?: string;\n /** Class applied during move transitions (when items reorder) */\n moveClass?: string;\n /** Whether to show the group (defaults to true for TransitionGroup) */\n show?: boolean;\n /** CSS classes to apply to the wrapper element (e.g., 'flex gap-4' or 'grid grid-cols-3') */\n class?: string;\n /** Inline styles to apply to the wrapper element */\n style?: string | Record<string, string>;\n}\n\n/* --- Transition Presets --- */\n\n/**\n * Pre-defined transition presets using JIT CSS classes\n * Users can reference these by name or define custom classes\n */\nexport const transitionPresets = {\n /** Simple fade in/out */\n fade: {\n enterFrom: 'opacity-0',\n enterActive: 'transition-opacity duration-300 ease-out',\n enterTo: 'opacity-100',\n leaveFrom: 'opacity-100',\n leaveActive: 'transition-opacity duration-200 ease-in',\n leaveTo: 'opacity-0',\n },\n\n /** Slide in from right */\n 'slide-right': {\n enterFrom: 'translate-x-[100%] opacity-0',\n enterActive: 'transition-all duration-300 ease-out',\n enterTo: 'translate-x-[0%] opacity-100',\n leaveFrom: 'translate-x-[0%] opacity-100',\n leaveActive: 'transition-all duration-200 ease-in',\n leaveTo: 'translate-x-[100%] opacity-0',\n },\n\n /** Slide in from left */\n 'slide-left': {\n enterFrom: 'translate-x-[-100%] opacity-0',\n enterActive: 'transition-all duration-300 ease-out',\n enterTo: 'translate-x-[0%] opacity-100',\n leaveFrom: 'translate-x-[0%] opacity-100',\n leaveActive: 'transition-all duration-200 ease-in',\n leaveTo: 'translate-x-[-100%] opacity-0',\n },\n\n /** Slide up from bottom */\n 'slide-up': {\n enterFrom: 'translate-y-[100%] opacity-0',\n enterActive: 'transition-all duration-300 ease-out',\n enterTo: 'translate-y-[0%] opacity-100',\n leaveFrom: 'translate-y-[0%] opacity-100',\n leaveActive: 'transition-all duration-200 ease-in',\n leaveTo: 'translate-y-[100%] opacity-0',\n },\n\n /** Slide down from top */\n 'slide-down': {\n enterFrom: 'translate-y-[-100%] opacity-0',\n enterActive: 'transition-all duration-300 ease-out',\n enterTo: 'translate-y-[0%] opacity-100',\n leaveFrom: 'translate-y-[0%] opacity-100',\n leaveActive: 'transition-all duration-200 ease-in',\n leaveTo: 'translate-y-[-100%] opacity-0',\n },\n\n /** Scale up from center */\n scale: {\n enterFrom: 'scale-95 opacity-0',\n enterActive: 'transition-all duration-200 ease-out',\n enterTo: 'scale-100 opacity-100',\n leaveFrom: 'scale-100 opacity-100',\n leaveActive: 'transition-all duration-150 ease-in',\n leaveTo: 'scale-95 opacity-0',\n },\n\n /** Scale down to center */\n 'scale-down': {\n enterFrom: 'scale-105 opacity-0',\n enterActive: 'transition-all duration-200 ease-out',\n enterTo: 'scale-100 opacity-100',\n leaveFrom: 'scale-100 opacity-100',\n leaveActive: 'transition-all duration-150 ease-in',\n leaveTo: 'scale-105 opacity-0',\n },\n\n /** Bounce effect */\n bounce: {\n enterFrom: 'scale-0 opacity-0',\n enterActive: 'transition-all duration-500 ease-out',\n enterTo: 'scale-100 opacity-100',\n leaveFrom: 'scale-100 opacity-100',\n leaveActive: 'transition-all duration-200 ease-in',\n leaveTo: 'scale-0 opacity-0',\n },\n\n /** Zoom and fade */\n zoom: {\n enterFrom: 'scale-0 opacity-0',\n enterActive: 'transition-all duration-300 ease-out',\n enterTo: 'scale-100 opacity-100',\n leaveFrom: 'scale-100 opacity-100',\n leaveActive: 'transition-all duration-200 ease-in',\n leaveTo: 'scale-0 opacity-0',\n },\n\n /** Flip in */\n flip: {\n enterFrom: 'rotate-[90deg] opacity-0',\n enterActive: 'transition-all duration-400 ease-out',\n enterTo: 'rotate-[0deg] opacity-100',\n leaveFrom: 'rotate-[0deg] opacity-100',\n leaveActive: 'transition-all duration-300 ease-in',\n leaveTo: 'rotate-[90deg] opacity-0',\n },\n} as const;\n\n/* --- Core Functions --- */\n\n/**\n * Transition component - wraps content with enter/leave animations\n *\n * @example\n * ```ts\n * // Using a preset\n * ${Transition({ preset: 'fade', show: isVisible.value }, html`<div>Content</div>`)}\n *\n * // Using custom JIT classes\n * ${Transition({\n * show: isVisible.value,\n * enterFrom: 'opacity-0 scale-95',\n * enterActive: 'transition-all duration-300',\n * enterTo: 'opacity-100 scale-100',\n * leaveFrom: 'opacity-100 scale-100',\n * leaveActive: 'transition-all duration-200',\n * leaveTo: 'opacity-0 scale-95'\n * }, html`<div>Content</div>`)}\n *\n * // With lifecycle hooks\n * ${Transition({\n * preset: 'slide-right',\n * show: isVisible.value,\n * onAfterEnter: (el) => console.log('Entered!'),\n * onAfterLeave: (el) => console.log('Left!')\n * }, html`<div>Content</div>`)}\n *\n * // Lazy factory — only evaluated when show is true (avoids constructing\n * // expensive VNode trees when the content is hidden)\n * ${Transition({ show: isVisible.value }, () => html`<div>Expensive content</div>`)}\n * ```\n */\nexport function Transition(\n options: TransitionOptions,\n content: VNode | VNode[] | (() => VNode | VNode[]),\n): VNode {\n const {\n preset,\n show,\n mode = 'default',\n duration,\n appear = false,\n css = true,\n name,\n enterFrom,\n enterActive,\n enterTo,\n leaveFrom,\n leaveActive,\n leaveTo,\n onBeforeEnter,\n onEnter,\n onAfterEnter,\n onEnterCancelled,\n onBeforeLeave,\n onLeave,\n onAfterLeave,\n onLeaveCancelled,\n } = options;\n\n // Resolve classes from preset or explicit values\n let transitionClasses: TransitionClasses;\n if (preset && transitionPresets[preset]) {\n transitionClasses = { ...transitionPresets[preset] };\n // Allow overriding preset classes\n if (enterFrom) transitionClasses.enterFrom = enterFrom;\n if (enterActive) transitionClasses.enterActive = enterActive;\n if (enterTo) transitionClasses.enterTo = enterTo;\n if (leaveFrom) transitionClasses.leaveFrom = leaveFrom;\n if (leaveActive) transitionClasses.leaveActive = leaveActive;\n if (leaveTo) transitionClasses.leaveTo = leaveTo;\n } else {\n transitionClasses = {\n enterFrom,\n enterActive,\n enterTo,\n leaveFrom,\n leaveActive,\n leaveTo,\n };\n }\n\n // Resolve content: only call the factory when show is true so that expensive\n // VNode trees (e.g. those that trigger calender builds or heavy computeds)\n // are never constructed while the transition is hidden. Leave animations\n // operate on existing DOM nodes and do not require the content VNode.\n const resolvedContent: VNode | VNode[] =\n show && typeof content === 'function'\n ? content()\n : (content as VNode | VNode[]);\n\n // Create anchor block with transition metadata\n const transitionKey =\n name || (preset ? `transition-${preset}` : 'transition');\n const transitionVNode = anchorBlock(\n show ? resolvedContent : [],\n transitionKey,\n );\n\n // Attach metadata for VDOM to consume during patching\n (transitionVNode as VNode & { _transition?: unknown })._transition = {\n name: transitionKey,\n classes: transitionClasses,\n mode,\n duration,\n appear,\n css,\n state: show ? 'visible' : 'hidden',\n hooks: {\n onBeforeEnter,\n onEnter,\n onAfterEnter,\n onEnterCancelled,\n onBeforeLeave,\n onLeave,\n onAfterLeave,\n onLeaveCancelled,\n },\n };\n\n return transitionVNode;\n}\n\n/**\n * TransitionGroup component - animates lists with enter/leave/move transitions\n *\n * @example\n * ```ts\n * // Basic usage\n * ${TransitionGroup({\n * preset: 'slide-right',\n * tag: 'ul',\n * moveClass: 'transition-transform duration-300'\n * }, each(items.value, (item) => html`\n * <li key=\"${item.id}\">${item.text}</li>\n * `))}\n *\n * // With flex layout\n * ${TransitionGroup({\n * preset: 'fade',\n * class: 'flex gap-4 flex-wrap'\n * }, each(items.value, (item) => html`\n * <div key=\"${item.id}\" class=\"shrink-0\">${item.text}</div>\n * `))}\n *\n * // With grid layout\n * ${TransitionGroup({\n * preset: 'scale',\n * class: 'grid grid-cols-3 gap-4'\n * }, each(items.value, (item) => html`\n * <div key=\"${item.id}\">${item.text}</div>\n * `))}\n * ```\n */\nexport function TransitionGroup(\n options: TransitionGroupOptions,\n children: VNode[],\n): VNode {\n const {\n tag = 'div',\n moveClass = 'transition-transform duration-300',\n preset,\n show = true,\n mode = 'default',\n duration,\n appear = false,\n css = true,\n name,\n class: className,\n style,\n enterFrom,\n enterActive,\n enterTo,\n leaveFrom,\n leaveActive,\n leaveTo,\n onBeforeEnter,\n onEnter,\n onAfterEnter,\n onEnterCancelled,\n onBeforeLeave,\n onLeave,\n onAfterLeave,\n onLeaveCancelled,\n } = options;\n\n // Resolve classes from preset or explicit values\n let transitionClasses: TransitionClasses;\n if (preset && transitionPresets[preset]) {\n transitionClasses = { ...transitionPresets[preset] };\n // Allow overriding preset classes\n if (enterFrom) transitionClasses.enterFrom = enterFrom;\n if (enterActive) transitionClasses.enterActive = enterActive;\n if (enterTo) transitionClasses.enterTo = enterTo;\n if (leaveFrom) transitionClasses.leaveFrom = leaveFrom;\n if (leaveActive) transitionClasses.leaveActive = leaveActive;\n if (leaveTo) transitionClasses.leaveTo = leaveTo;\n } else {\n transitionClasses = {\n enterFrom,\n enterActive,\n enterTo,\n leaveFrom,\n leaveActive,\n leaveTo,\n };\n }\n\n // Create wrapper element with transition group metadata\n const groupKey =\n name || (preset ? `transition-group-${preset}` : 'transition-group');\n\n // Flatten anchor block children to enable proper keyed diffing\n // When each() is used, it creates anchor blocks. We need to extract the actual elements\n // and give them keys from their anchor blocks for proper reordering\n const flattenedChildren: VNode[] = [];\n for (const child of show ? children : []) {\n if (child && typeof child === 'object' && child.tag === '#anchor') {\n // Extract children from anchor block\n const anchorChildren = Array.isArray(child.children)\n ? child.children\n : [];\n for (const anchorChild of anchorChildren) {\n if (anchorChild && typeof anchorChild === 'object') {\n // Use anchor block's key for the child element\n const keyedChild = {\n ...anchorChild,\n key: child.key || anchorChild.key,\n props: {\n ...anchorChild.props,\n _anchorKey: child.key, // Preserve original anchor key\n },\n };\n flattenedChildren.push(keyedChild);\n } else {\n flattenedChildren.push(anchorChild);\n }\n }\n } else {\n flattenedChildren.push(child);\n }\n }\n\n // Serialize style object to a CSS string for the attrs record so it matches\n // the expected primitive attribute value types.\n const styleAttr = (() => {\n if (!style) return undefined;\n if (typeof style === 'string') return style;\n return Object.entries(style)\n .map(([k, v]) => `${k}: ${v}`)\n .join('; ');\n })();\n\n return {\n tag,\n children: flattenedChildren,\n key: groupKey,\n props: {\n attrs: {\n ...(className ? { class: className } : {}),\n ...(styleAttr ? { style: styleAttr } : {}),\n },\n _transitionGroup: {\n name: groupKey,\n classes: transitionClasses,\n moveClass,\n mode,\n duration,\n appear,\n css,\n hooks: {\n onBeforeEnter,\n onEnter,\n onAfterEnter,\n onEnterCancelled,\n onBeforeLeave,\n onLeave,\n onAfterLeave,\n onLeaveCancelled,\n },\n },\n },\n };\n}\n\n/**\n * Helper to create custom transition presets\n *\n * @example\n * ```ts\n * const customFade = createTransitionPreset({\n * enterFrom: 'opacity-0',\n * enterActive: 'transition-opacity duration-500 ease-out',\n * enterTo: 'opacity-100',\n * leaveFrom: 'opacity-100',\n * leaveActive: 'transition-opacity duration-300 ease-in',\n * leaveTo: 'opacity-0'\n * });\n *\n * ${Transition({ ...customFade, show: visible.value }, content)}\n * ```\n */\nexport function createTransitionPreset(\n classes: TransitionClasses,\n): TransitionClasses {\n return { ...classes };\n}\n\n/**\n * Pre-generate CSS for all transition preset classes\n * This ensures the JIT CSS system has the styles ready when transitions are used\n */\nlet transitionStyleSheet: CSSStyleSheet | null = null;\n\n/**\n * Get the global transition stylesheet (creates it if needed)\n */\nexport function getTransitionStyleSheet(): CSSStyleSheet {\n if (!transitionStyleSheet) {\n // If constructable stylesheets aren't available (SSR / old browsers),\n // return a no-op stub to avoid throwing during import or server render.\n if (typeof CSSStyleSheet === 'undefined') {\n transitionStyleSheet = {\n cssRules: [],\n replaceSync: () => {},\n toString: () => '',\n } as unknown as CSSStyleSheet;\n return transitionStyleSheet;\n }\n\n const allClasses: string[] = [];\n\n // Collect all classes from presets\n Object.values(transitionPresets).forEach((preset) => {\n if (preset.enterFrom) allClasses.push(preset.enterFrom);\n if (preset.enterActive) allClasses.push(preset.enterActive);\n if (preset.enterTo) allClasses.push(preset.enterTo);\n if (preset.leaveFrom) allClasses.push(preset.leaveFrom);\n if (preset.leaveActive) allClasses.push(preset.leaveActive);\n if (preset.leaveTo) allClasses.push(preset.leaveTo);\n });\n\n // Create a fake HTML string with all transition classes\n const fakeHtml = `<div class=\"${allClasses.join(' ')}\"></div>`;\n\n // Trigger JIT CSS generation (no-op if JIT CSS engine is not loaded)\n const generatedCSS = processJITCSS(fakeHtml);\n\n // Create stylesheet\n try {\n transitionStyleSheet = new CSSStyleSheet();\n transitionStyleSheet.replaceSync(generatedCSS);\n } catch {\n // If creating a constructable stylesheet fails for any reason,\n // fallback to a stub to avoid breaking SSR or older environments.\n transitionStyleSheet = {\n cssRules: [],\n replaceSync: () => {},\n toString: () => generatedCSS || '',\n } as unknown as CSSStyleSheet;\n }\n }\n\n return transitionStyleSheet;\n}\n\n"],"names":["transitionPresets","Transition","options","content","preset","show","mode","duration","appear","css","name","enterFrom","enterActive","enterTo","leaveFrom","leaveActive","leaveTo","onBeforeEnter","onEnter","onAfterEnter","onEnterCancelled","onBeforeLeave","onLeave","onAfterLeave","onLeaveCancelled","transitionClasses","resolvedContent","transitionKey","transitionVNode","anchorBlock","TransitionGroup","children","tag","moveClass","className","style","groupKey","flattenedChildren","child","anchorChildren","anchorChild","keyedChild","styleAttr","k","v","createTransitionPreset","classes","transitionStyleSheet","getTransitionStyleSheet","allClasses","fakeHtml","generatedCSS","processJITCSS"],"mappings":"qLAuGaA,EAAoB,CAE/B,KAAM,CACJ,UAAW,YACX,YAAa,2CACb,QAAS,cACT,UAAW,cACX,YAAa,0CACb,QAAS,WAAA,EAIX,cAAe,CACb,UAAW,+BACX,YAAa,uCACb,QAAS,+BACT,UAAW,+BACX,YAAa,sCACb,QAAS,8BAAA,EAIX,aAAc,CACZ,UAAW,gCACX,YAAa,uCACb,QAAS,+BACT,UAAW,+BACX,YAAa,sCACb,QAAS,+BAAA,EAIX,WAAY,CACV,UAAW,+BACX,YAAa,uCACb,QAAS,+BACT,UAAW,+BACX,YAAa,sCACb,QAAS,8BAAA,EAIX,aAAc,CACZ,UAAW,gCACX,YAAa,uCACb,QAAS,+BACT,UAAW,+BACX,YAAa,sCACb,QAAS,+BAAA,EAIX,MAAO,CACL,UAAW,qBACX,YAAa,uCACb,QAAS,wBACT,UAAW,wBACX,YAAa,sCACb,QAAS,oBAAA,EAIX,aAAc,CACZ,UAAW,sBACX,YAAa,uCACb,QAAS,wBACT,UAAW,wBACX,YAAa,sCACb,QAAS,qBAAA,EAIX,OAAQ,CACN,UAAW,oBACX,YAAa,uCACb,QAAS,wBACT,UAAW,wBACX,YAAa,sCACb,QAAS,mBAAA,EAIX,KAAM,CACJ,UAAW,oBACX,YAAa,uCACb,QAAS,wBACT,UAAW,wBACX,YAAa,sCACb,QAAS,mBAAA,EAIX,KAAM,CACJ,UAAW,2BACX,YAAa,uCACb,QAAS,4BACT,UAAW,4BACX,YAAa,sCACb,QAAS,0BAAA,CAEb,EAoCO,SAASC,EACdC,EACAC,EACO,CACP,KAAM,CACJ,OAAAC,EACA,KAAAC,EACA,KAAAC,EAAO,UACP,SAAAC,EACA,OAAAC,EAAS,GACT,IAAAC,EAAM,GACN,KAAAC,EACA,UAAAC,EACA,YAAAC,EACA,QAAAC,EACA,UAAAC,EACA,YAAAC,EACA,QAAAC,EACA,cAAAC,EACA,QAAAC,EACA,aAAAC,EACA,iBAAAC,EACA,cAAAC,EACA,QAAAC,EACA,aAAAC,EACA,iBAAAC,CAAA,EACEtB,EAGJ,IAAIuB,EACArB,GAAUJ,EAAkBI,CAAM,GACpCqB,EAAoB,CAAE,GAAGzB,EAAkBI,CAAM,CAAA,EAE7CO,MAA6B,UAAYA,GACzCC,MAA+B,YAAcA,GAC7CC,MAA2B,QAAUA,GACrCC,MAA6B,UAAYA,GACzCC,MAA+B,YAAcA,GAC7CC,MAA2B,QAAUA,IAEzCS,EAAoB,CAClB,UAAAd,EACA,YAAAC,EACA,QAAAC,EACA,UAAAC,EACA,YAAAC,EACA,QAAAC,CAAA,EAQJ,MAAMU,EACJrB,GAAQ,OAAOF,GAAY,WACvBA,IACCA,EAGDwB,EACJjB,IAASN,EAAS,cAAcA,CAAM,GAAK,cACvCwB,EAAkBC,EAAAA,YACtBxB,EAAOqB,EAAkB,CAAA,EACzBC,CAAA,EAID,OAAAC,EAAsD,YAAc,CACnE,KAAMD,EACN,QAASF,EACT,KAAAnB,EACA,SAAAC,EACA,OAAAC,EACA,IAAAC,EACA,MAAOJ,EAAO,UAAY,SAC1B,MAAO,CACL,cAAAY,EACA,QAAAC,EACA,aAAAC,EACA,iBAAAC,EACA,cAAAC,EACA,QAAAC,EACA,aAAAC,EACA,iBAAAC,CAAA,CACF,EAGKI,CACT,CAiCO,SAASE,EACd5B,EACA6B,EACO,CACP,KAAM,CACJ,IAAAC,EAAM,MACN,UAAAC,EAAY,oCACZ,OAAA7B,EACA,KAAAC,EAAO,GACP,KAAAC,EAAO,UACP,SAAAC,EACA,OAAAC,EAAS,GACT,IAAAC,EAAM,GACN,KAAAC,EACA,MAAOwB,EACP,MAAAC,EACA,UAAAxB,EACA,YAAAC,EACA,QAAAC,EACA,UAAAC,EACA,YAAAC,EACA,QAAAC,EACA,cAAAC,EACA,QAAAC,EACA,aAAAC,EACA,iBAAAC,EACA,cAAAC,EACA,QAAAC,EACA,aAAAC,EACA,iBAAAC,CAAA,EACEtB,EAGJ,IAAIuB,EACArB,GAAUJ,EAAkBI,CAAM,GACpCqB,EAAoB,CAAE,GAAGzB,EAAkBI,CAAM,CAAA,EAE7CO,MAA6B,UAAYA,GACzCC,MAA+B,YAAcA,GAC7CC,MAA2B,QAAUA,GACrCC,MAA6B,UAAYA,GACzCC,MAA+B,YAAcA,GAC7CC,MAA2B,QAAUA,IAEzCS,EAAoB,CAClB,UAAAd,EACA,YAAAC,EACA,QAAAC,EACA,UAAAC,EACA,YAAAC,EACA,QAAAC,CAAA,EAKJ,MAAMoB,EACJ1B,IAASN,EAAS,oBAAoBA,CAAM,GAAK,oBAK7CiC,EAA6B,CAAA,EACnC,UAAWC,KAASjC,EAAO0B,EAAW,CAAA,EACpC,GAAIO,GAAS,OAAOA,GAAU,UAAYA,EAAM,MAAQ,UAAW,CAEjE,MAAMC,EAAiB,MAAM,QAAQD,EAAM,QAAQ,EAC/CA,EAAM,SACN,CAAA,EACJ,UAAWE,KAAeD,EACxB,GAAIC,GAAe,OAAOA,GAAgB,SAAU,CAElD,MAAMC,EAAa,CACjB,GAAGD,EACH,IAAKF,EAAM,KAAOE,EAAY,IAC9B,MAAO,CACL,GAAGA,EAAY,MACf,WAAYF,EAAM,GAAA,CACpB,EAEFD,EAAkB,KAAKI,CAAU,CACnC,MACEJ,EAAkB,KAAKG,CAAW,CAGxC,MACEH,EAAkB,KAAKC,CAAK,EAMhC,MAAMI,GAAa,IAAM,CACvB,GAAKP,EACL,OAAI,OAAOA,GAAU,SAAiBA,EAC/B,OAAO,QAAQA,CAAK,EACxB,IAAI,CAAC,CAACQ,EAAGC,CAAC,IAAM,GAAGD,CAAC,KAAKC,CAAC,EAAE,EAC5B,KAAK,IAAI,CACd,GAAA,EAEA,MAAO,CACL,IAAAZ,EACA,SAAUK,EACV,IAAKD,EACL,MAAO,CACL,MAAO,CACL,GAAIF,EAAY,CAAE,MAAOA,CAAA,EAAc,CAAA,EACvC,GAAIQ,EAAY,CAAE,MAAOA,GAAc,CAAA,CAAC,EAE1C,iBAAkB,CAChB,KAAMN,EACN,QAASX,EACT,UAAAQ,EACA,KAAA3B,EACA,SAAAC,EACA,OAAAC,EACA,IAAAC,EACA,MAAO,CACL,cAAAQ,EACA,QAAAC,EACA,aAAAC,EACA,iBAAAC,EACA,cAAAC,EACA,QAAAC,EACA,aAAAC,EACA,iBAAAC,CAAA,CACF,CACF,CACF,CAEJ,CAmBO,SAASqB,EACdC,EACmB,CACnB,MAAO,CAAE,GAAGA,CAAA,CACd,CAMA,IAAIC,EAA6C,KAK1C,SAASC,GAAyC,CACvD,GAAI,CAACD,EAAsB,CAGzB,GAAI,OAAO,cAAkB,IAC3B,OAAAA,EAAuB,CACrB,SAAU,CAAA,EACV,YAAa,IAAM,CAAC,EACpB,SAAU,IAAM,EAAA,EAEXA,EAGT,MAAME,EAAuB,CAAA,EAG7B,OAAO,OAAOjD,CAAiB,EAAE,QAASI,GAAW,CAC/CA,EAAO,WAAW6C,EAAW,KAAK7C,EAAO,SAAS,EAClDA,EAAO,aAAa6C,EAAW,KAAK7C,EAAO,WAAW,EACtDA,EAAO,SAAS6C,EAAW,KAAK7C,EAAO,OAAO,EAC9CA,EAAO,WAAW6C,EAAW,KAAK7C,EAAO,SAAS,EAClDA,EAAO,aAAa6C,EAAW,KAAK7C,EAAO,WAAW,EACtDA,EAAO,SAAS6C,EAAW,KAAK7C,EAAO,OAAO,CACpD,CAAC,EAGD,MAAM8C,EAAW,eAAeD,EAAW,KAAK,GAAG,CAAC,WAG9CE,EAAeC,EAAAA,cAAcF,CAAQ,EAG3C,GAAI,CACFH,EAAuB,IAAI,cAC3BA,EAAqB,YAAYI,CAAY,CAC/C,MAAQ,CAGNJ,EAAuB,CACrB,SAAU,CAAA,EACV,YAAa,IAAM,CAAC,EACpB,SAAU,IAAMI,GAAgB,EAAA,CAEpC,CACF,CAEA,OAAOJ,CACT"}
1
+ {"version":3,"file":"custom-elements-runtime.transitions.cjs.js","names":[],"sources":["../src/lib/transitions.ts"],"sourcesContent":["/**\n * Transitions module (top-level). This file provides the public Transition\n * and TransitionGroup APIs. It is an explicit entry used by the build so\n * consumers can import transitions separately: `.../transitions`.\n */\n/**\n * Transitions Module\n * Vue-like transition system integrated with JIT CSS\n * Provides Transition and TransitionGroup components for enter/leave animations\n */\n\nimport { anchorBlock } from './directives';\nimport type { VNode } from './runtime/types';\nimport { processJITCSS } from './runtime/render-bridge';\n\n/* --- Types --- */\n\n/**\n * Transition class names for different animation phases\n * All values should be JIT CSS utility classes\n */\nexport interface TransitionClasses {\n /** Classes applied at the start of enter transition */\n enterFrom?: string;\n /** Classes applied during entire enter transition */\n enterActive?: string;\n /** Classes applied at the end of enter transition */\n enterTo?: string;\n /** Classes applied at the start of leave transition */\n leaveFrom?: string;\n /** Classes applied during entire leave transition */\n leaveActive?: string;\n /** Classes applied at the end of leave transition */\n leaveTo?: string;\n}\n\n/**\n * Lifecycle hooks for transition events\n */\nexport interface TransitionHooks {\n /** Called before enter transition starts */\n onBeforeEnter?: (el: HTMLElement) => void;\n /** Called during enter transition (with done callback for manual control) */\n onEnter?: (el: HTMLElement, done: () => void) => void;\n /** Called after enter transition completes */\n onAfterEnter?: (el: HTMLElement) => void;\n /** Called if enter transition is cancelled */\n onEnterCancelled?: (el: HTMLElement) => void;\n /** Called before leave transition starts */\n onBeforeLeave?: (el: HTMLElement) => void;\n /** Called during leave transition (with done callback for manual control) */\n onLeave?: (el: HTMLElement, done: () => void) => void;\n /** Called after leave transition completes */\n onAfterLeave?: (el: HTMLElement) => void;\n /** Called if leave transition is cancelled */\n onLeaveCancelled?: (el: HTMLElement) => void;\n}\n\n/**\n * Options for Transition component\n */\nexport interface TransitionOptions extends TransitionClasses, TransitionHooks {\n /** Preset name (fade, slide-right, scale, etc.) */\n preset?: keyof typeof transitionPresets;\n /** Whether to show the content */\n show: boolean;\n /** Transition mode: default, out-in (leave before enter), in-out (enter before leave) */\n mode?: 'default' | 'out-in' | 'in-out';\n /** Custom duration override (ms) */\n duration?: number | { enter: number; leave: number };\n /** Whether to apply transition on initial render */\n appear?: boolean;\n /** Whether to use CSS transitions (true) or JS-only hooks (false) */\n css?: boolean;\n /** Optional name for debugging */\n name?: string;\n}\n\n/**\n * Options for TransitionGroup component\n */\nexport interface TransitionGroupOptions extends Omit<\n TransitionOptions,\n 'show'\n> {\n /** HTML tag for the wrapper element */\n tag?: string;\n /** Class applied during move transitions (when items reorder) */\n moveClass?: string;\n /** Whether to show the group (defaults to true for TransitionGroup) */\n show?: boolean;\n /** CSS classes to apply to the wrapper element (e.g., 'flex gap-4' or 'grid grid-cols-3') */\n class?: string;\n /** Inline styles to apply to the wrapper element */\n style?: string | Record<string, string>;\n}\n\n/* --- Transition Presets --- */\n\n/**\n * Pre-defined transition presets using JIT CSS classes\n * Users can reference these by name or define custom classes\n */\nexport const transitionPresets = {\n /** Simple fade in/out */\n fade: {\n enterFrom: 'opacity-0',\n enterActive: 'transition-opacity duration-300 ease-out',\n enterTo: 'opacity-100',\n leaveFrom: 'opacity-100',\n leaveActive: 'transition-opacity duration-200 ease-in',\n leaveTo: 'opacity-0',\n },\n\n /** Slide in from right */\n 'slide-right': {\n enterFrom: 'translate-x-[100%] opacity-0',\n enterActive: 'transition-all duration-300 ease-out',\n enterTo: 'translate-x-[0%] opacity-100',\n leaveFrom: 'translate-x-[0%] opacity-100',\n leaveActive: 'transition-all duration-200 ease-in',\n leaveTo: 'translate-x-[100%] opacity-0',\n },\n\n /** Slide in from left */\n 'slide-left': {\n enterFrom: 'translate-x-[-100%] opacity-0',\n enterActive: 'transition-all duration-300 ease-out',\n enterTo: 'translate-x-[0%] opacity-100',\n leaveFrom: 'translate-x-[0%] opacity-100',\n leaveActive: 'transition-all duration-200 ease-in',\n leaveTo: 'translate-x-[-100%] opacity-0',\n },\n\n /** Slide up from bottom */\n 'slide-up': {\n enterFrom: 'translate-y-[100%] opacity-0',\n enterActive: 'transition-all duration-300 ease-out',\n enterTo: 'translate-y-[0%] opacity-100',\n leaveFrom: 'translate-y-[0%] opacity-100',\n leaveActive: 'transition-all duration-200 ease-in',\n leaveTo: 'translate-y-[100%] opacity-0',\n },\n\n /** Slide down from top */\n 'slide-down': {\n enterFrom: 'translate-y-[-100%] opacity-0',\n enterActive: 'transition-all duration-300 ease-out',\n enterTo: 'translate-y-[0%] opacity-100',\n leaveFrom: 'translate-y-[0%] opacity-100',\n leaveActive: 'transition-all duration-200 ease-in',\n leaveTo: 'translate-y-[-100%] opacity-0',\n },\n\n /** Scale up from center */\n scale: {\n enterFrom: 'scale-95 opacity-0',\n enterActive: 'transition-all duration-200 ease-out',\n enterTo: 'scale-100 opacity-100',\n leaveFrom: 'scale-100 opacity-100',\n leaveActive: 'transition-all duration-150 ease-in',\n leaveTo: 'scale-95 opacity-0',\n },\n\n /** Scale down to center */\n 'scale-down': {\n enterFrom: 'scale-105 opacity-0',\n enterActive: 'transition-all duration-200 ease-out',\n enterTo: 'scale-100 opacity-100',\n leaveFrom: 'scale-100 opacity-100',\n leaveActive: 'transition-all duration-150 ease-in',\n leaveTo: 'scale-105 opacity-0',\n },\n\n /** Bounce effect */\n bounce: {\n enterFrom: 'scale-0 opacity-0',\n enterActive: 'transition-all duration-500 ease-out',\n enterTo: 'scale-100 opacity-100',\n leaveFrom: 'scale-100 opacity-100',\n leaveActive: 'transition-all duration-200 ease-in',\n leaveTo: 'scale-0 opacity-0',\n },\n\n /** Zoom and fade */\n zoom: {\n enterFrom: 'scale-0 opacity-0',\n enterActive: 'transition-all duration-300 ease-out',\n enterTo: 'scale-100 opacity-100',\n leaveFrom: 'scale-100 opacity-100',\n leaveActive: 'transition-all duration-200 ease-in',\n leaveTo: 'scale-0 opacity-0',\n },\n\n /** Flip in */\n flip: {\n enterFrom: 'rotate-[90deg] opacity-0',\n enterActive: 'transition-all duration-400 ease-out',\n enterTo: 'rotate-[0deg] opacity-100',\n leaveFrom: 'rotate-[0deg] opacity-100',\n leaveActive: 'transition-all duration-300 ease-in',\n leaveTo: 'rotate-[90deg] opacity-0',\n },\n} as const;\n\n/* --- Core Functions --- */\n\n/**\n * Transition component - wraps content with enter/leave animations\n *\n * @example\n * ```ts\n * // Using a preset\n * ${Transition({ preset: 'fade', show: isVisible.value }, html`<div>Content</div>`)}\n *\n * // Using custom JIT classes\n * ${Transition({\n * show: isVisible.value,\n * enterFrom: 'opacity-0 scale-95',\n * enterActive: 'transition-all duration-300',\n * enterTo: 'opacity-100 scale-100',\n * leaveFrom: 'opacity-100 scale-100',\n * leaveActive: 'transition-all duration-200',\n * leaveTo: 'opacity-0 scale-95'\n * }, html`<div>Content</div>`)}\n *\n * // With lifecycle hooks\n * ${Transition({\n * preset: 'slide-right',\n * show: isVisible.value,\n * onAfterEnter: (el) => console.log('Entered!'),\n * onAfterLeave: (el) => console.log('Left!')\n * }, html`<div>Content</div>`)}\n *\n * // Lazy factory — only evaluated when show is true (avoids constructing\n * // expensive VNode trees when the content is hidden)\n * ${Transition({ show: isVisible.value }, () => html`<div>Expensive content</div>`)}\n * ```\n */\nexport function Transition(\n options: TransitionOptions,\n content: VNode | VNode[] | (() => VNode | VNode[]),\n): VNode {\n const {\n preset,\n show,\n mode = 'default',\n duration,\n appear = false,\n css = true,\n name,\n enterFrom,\n enterActive,\n enterTo,\n leaveFrom,\n leaveActive,\n leaveTo,\n onBeforeEnter,\n onEnter,\n onAfterEnter,\n onEnterCancelled,\n onBeforeLeave,\n onLeave,\n onAfterLeave,\n onLeaveCancelled,\n } = options;\n\n // Resolve classes from preset or explicit values\n let transitionClasses: TransitionClasses;\n if (preset && transitionPresets[preset]) {\n transitionClasses = { ...transitionPresets[preset] };\n // Allow overriding preset classes\n if (enterFrom) transitionClasses.enterFrom = enterFrom;\n if (enterActive) transitionClasses.enterActive = enterActive;\n if (enterTo) transitionClasses.enterTo = enterTo;\n if (leaveFrom) transitionClasses.leaveFrom = leaveFrom;\n if (leaveActive) transitionClasses.leaveActive = leaveActive;\n if (leaveTo) transitionClasses.leaveTo = leaveTo;\n } else {\n transitionClasses = {\n enterFrom,\n enterActive,\n enterTo,\n leaveFrom,\n leaveActive,\n leaveTo,\n };\n }\n\n // Resolve content: only call the factory when show is true so that expensive\n // VNode trees (e.g. those that trigger calender builds or heavy computeds)\n // are never constructed while the transition is hidden. Leave animations\n // operate on existing DOM nodes and do not require the content VNode.\n const resolvedContent: VNode | VNode[] =\n show && typeof content === 'function'\n ? content()\n : (content as VNode | VNode[]);\n\n // Create anchor block with transition metadata\n const transitionKey =\n name || (preset ? `transition-${preset}` : 'transition');\n const transitionVNode = anchorBlock(\n show ? resolvedContent : [],\n transitionKey,\n );\n\n // Attach metadata for VDOM to consume during patching\n (transitionVNode as VNode & { _transition?: unknown })._transition = {\n name: transitionKey,\n classes: transitionClasses,\n mode,\n duration,\n appear,\n css,\n state: show ? 'visible' : 'hidden',\n hooks: {\n onBeforeEnter,\n onEnter,\n onAfterEnter,\n onEnterCancelled,\n onBeforeLeave,\n onLeave,\n onAfterLeave,\n onLeaveCancelled,\n },\n };\n\n return transitionVNode;\n}\n\n/**\n * TransitionGroup component - animates lists with enter/leave/move transitions\n *\n * @example\n * ```ts\n * // Basic usage\n * ${TransitionGroup({\n * preset: 'slide-right',\n * tag: 'ul',\n * moveClass: 'transition-transform duration-300'\n * }, each(items.value, (item) => html`\n * <li key=\"${item.id}\">${item.text}</li>\n * `))}\n *\n * // With flex layout\n * ${TransitionGroup({\n * preset: 'fade',\n * class: 'flex gap-4 flex-wrap'\n * }, each(items.value, (item) => html`\n * <div key=\"${item.id}\" class=\"shrink-0\">${item.text}</div>\n * `))}\n *\n * // With grid layout\n * ${TransitionGroup({\n * preset: 'scale',\n * class: 'grid grid-cols-3 gap-4'\n * }, each(items.value, (item) => html`\n * <div key=\"${item.id}\">${item.text}</div>\n * `))}\n * ```\n */\nexport function TransitionGroup(\n options: TransitionGroupOptions,\n children: VNode[],\n): VNode {\n const {\n tag = 'div',\n moveClass = 'transition-transform duration-300',\n preset,\n show = true,\n mode = 'default',\n duration,\n appear = false,\n css = true,\n name,\n class: className,\n style,\n enterFrom,\n enterActive,\n enterTo,\n leaveFrom,\n leaveActive,\n leaveTo,\n onBeforeEnter,\n onEnter,\n onAfterEnter,\n onEnterCancelled,\n onBeforeLeave,\n onLeave,\n onAfterLeave,\n onLeaveCancelled,\n } = options;\n\n // Resolve classes from preset or explicit values\n let transitionClasses: TransitionClasses;\n if (preset && transitionPresets[preset]) {\n transitionClasses = { ...transitionPresets[preset] };\n // Allow overriding preset classes\n if (enterFrom) transitionClasses.enterFrom = enterFrom;\n if (enterActive) transitionClasses.enterActive = enterActive;\n if (enterTo) transitionClasses.enterTo = enterTo;\n if (leaveFrom) transitionClasses.leaveFrom = leaveFrom;\n if (leaveActive) transitionClasses.leaveActive = leaveActive;\n if (leaveTo) transitionClasses.leaveTo = leaveTo;\n } else {\n transitionClasses = {\n enterFrom,\n enterActive,\n enterTo,\n leaveFrom,\n leaveActive,\n leaveTo,\n };\n }\n\n // Create wrapper element with transition group metadata\n const groupKey =\n name || (preset ? `transition-group-${preset}` : 'transition-group');\n\n // Flatten anchor block children to enable proper keyed diffing\n // When each() is used, it creates anchor blocks. We need to extract the actual elements\n // and give them keys from their anchor blocks for proper reordering\n const flattenedChildren: VNode[] = [];\n for (const child of show ? children : []) {\n if (child && typeof child === 'object' && child.tag === '#anchor') {\n // Extract children from anchor block\n const anchorChildren = Array.isArray(child.children)\n ? child.children\n : [];\n for (const anchorChild of anchorChildren) {\n if (anchorChild && typeof anchorChild === 'object') {\n // Use anchor block's key for the child element\n const keyedChild = {\n ...anchorChild,\n key: child.key || anchorChild.key,\n props: {\n ...anchorChild.props,\n _anchorKey: child.key, // Preserve original anchor key\n },\n };\n flattenedChildren.push(keyedChild);\n } else {\n flattenedChildren.push(anchorChild);\n }\n }\n } else {\n flattenedChildren.push(child);\n }\n }\n\n // Serialize style object to a CSS string for the attrs record so it matches\n // the expected primitive attribute value types.\n const styleAttr = (() => {\n if (!style) return undefined;\n if (typeof style === 'string') return style;\n return Object.entries(style)\n .map(([k, v]) => `${k}: ${v}`)\n .join('; ');\n })();\n\n return {\n tag,\n children: flattenedChildren,\n key: groupKey,\n props: {\n attrs: {\n ...(className ? { class: className } : {}),\n ...(styleAttr ? { style: styleAttr } : {}),\n },\n _transitionGroup: {\n name: groupKey,\n classes: transitionClasses,\n moveClass,\n mode,\n duration,\n appear,\n css,\n hooks: {\n onBeforeEnter,\n onEnter,\n onAfterEnter,\n onEnterCancelled,\n onBeforeLeave,\n onLeave,\n onAfterLeave,\n onLeaveCancelled,\n },\n },\n },\n };\n}\n\n/**\n * Helper to create custom transition presets\n *\n * @example\n * ```ts\n * const customFade = createTransitionPreset({\n * enterFrom: 'opacity-0',\n * enterActive: 'transition-opacity duration-500 ease-out',\n * enterTo: 'opacity-100',\n * leaveFrom: 'opacity-100',\n * leaveActive: 'transition-opacity duration-300 ease-in',\n * leaveTo: 'opacity-0'\n * });\n *\n * ${Transition({ ...customFade, show: visible.value }, content)}\n * ```\n */\nexport function createTransitionPreset(\n classes: TransitionClasses,\n): TransitionClasses {\n return { ...classes };\n}\n\n/**\n * Pre-generate CSS for all transition preset classes\n * This ensures the JIT CSS system has the styles ready when transitions are used\n */\nlet transitionStyleSheet: CSSStyleSheet | null = null;\n\n/**\n * Get the global transition stylesheet (creates it if needed)\n */\nexport function getTransitionStyleSheet(): CSSStyleSheet {\n if (!transitionStyleSheet) {\n // If constructable stylesheets aren't available (SSR / old browsers),\n // return a no-op stub to avoid throwing during import or server render.\n if (typeof CSSStyleSheet === 'undefined') {\n transitionStyleSheet = {\n cssRules: [],\n replaceSync: () => {},\n toString: () => '',\n } as unknown as CSSStyleSheet;\n return transitionStyleSheet;\n }\n\n const allClasses: string[] = [];\n\n // Collect all classes from presets\n Object.values(transitionPresets).forEach((preset) => {\n if (preset.enterFrom) allClasses.push(preset.enterFrom);\n if (preset.enterActive) allClasses.push(preset.enterActive);\n if (preset.enterTo) allClasses.push(preset.enterTo);\n if (preset.leaveFrom) allClasses.push(preset.leaveFrom);\n if (preset.leaveActive) allClasses.push(preset.leaveActive);\n if (preset.leaveTo) allClasses.push(preset.leaveTo);\n });\n\n // Create a fake HTML string with all transition classes\n const fakeHtml = `<div class=\"${allClasses.join(' ')}\"></div>`;\n\n // Trigger JIT CSS generation (no-op if JIT CSS engine is not loaded)\n const generatedCSS = processJITCSS(fakeHtml);\n\n // Create stylesheet\n try {\n transitionStyleSheet = new CSSStyleSheet();\n transitionStyleSheet.replaceSync(generatedCSS);\n } catch {\n // If creating a constructable stylesheet fails for any reason,\n // fallback to a stub to avoid breaking SSR or older environments.\n transitionStyleSheet = {\n cssRules: [],\n replaceSync: () => {},\n toString: () => generatedCSS || '',\n } as unknown as CSSStyleSheet;\n }\n }\n\n return transitionStyleSheet;\n}\n\n"],"mappings":"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"}
@@ -1,7 +1,6 @@
1
- import { anchorBlock as O } from "./custom-elements-runtime.directives.es.js";
2
- import { p as P } from "./css-utils-Cg4o1MqY.js";
3
- const F = {
4
- /** Simple fade in/out */
1
+ import { i as O } from "./css-utils-CC43BbEy.js";
2
+ import { anchorBlock as P } from "./custom-elements-runtime.directives.es.js";
3
+ var F = {
5
4
  fade: {
6
5
  enterFrom: "opacity-0",
7
6
  enterActive: "transition-opacity duration-300 ease-out",
@@ -10,7 +9,6 @@ const F = {
10
9
  leaveActive: "transition-opacity duration-200 ease-in",
11
10
  leaveTo: "opacity-0"
12
11
  },
13
- /** Slide in from right */
14
12
  "slide-right": {
15
13
  enterFrom: "translate-x-[100%] opacity-0",
16
14
  enterActive: "transition-all duration-300 ease-out",
@@ -19,7 +17,6 @@ const F = {
19
17
  leaveActive: "transition-all duration-200 ease-in",
20
18
  leaveTo: "translate-x-[100%] opacity-0"
21
19
  },
22
- /** Slide in from left */
23
20
  "slide-left": {
24
21
  enterFrom: "translate-x-[-100%] opacity-0",
25
22
  enterActive: "transition-all duration-300 ease-out",
@@ -28,7 +25,6 @@ const F = {
28
25
  leaveActive: "transition-all duration-200 ease-in",
29
26
  leaveTo: "translate-x-[-100%] opacity-0"
30
27
  },
31
- /** Slide up from bottom */
32
28
  "slide-up": {
33
29
  enterFrom: "translate-y-[100%] opacity-0",
34
30
  enterActive: "transition-all duration-300 ease-out",
@@ -37,7 +33,6 @@ const F = {
37
33
  leaveActive: "transition-all duration-200 ease-in",
38
34
  leaveTo: "translate-y-[100%] opacity-0"
39
35
  },
40
- /** Slide down from top */
41
36
  "slide-down": {
42
37
  enterFrom: "translate-y-[-100%] opacity-0",
43
38
  enterActive: "transition-all duration-300 ease-out",
@@ -46,7 +41,6 @@ const F = {
46
41
  leaveActive: "transition-all duration-200 ease-in",
47
42
  leaveTo: "translate-y-[-100%] opacity-0"
48
43
  },
49
- /** Scale up from center */
50
44
  scale: {
51
45
  enterFrom: "scale-95 opacity-0",
52
46
  enterActive: "transition-all duration-200 ease-out",
@@ -55,7 +49,6 @@ const F = {
55
49
  leaveActive: "transition-all duration-150 ease-in",
56
50
  leaveTo: "scale-95 opacity-0"
57
51
  },
58
- /** Scale down to center */
59
52
  "scale-down": {
60
53
  enterFrom: "scale-105 opacity-0",
61
54
  enterActive: "transition-all duration-200 ease-out",
@@ -64,7 +57,6 @@ const F = {
64
57
  leaveActive: "transition-all duration-150 ease-in",
65
58
  leaveTo: "scale-105 opacity-0"
66
59
  },
67
- /** Bounce effect */
68
60
  bounce: {
69
61
  enterFrom: "scale-0 opacity-0",
70
62
  enterActive: "transition-all duration-500 ease-out",
@@ -73,7 +65,6 @@ const F = {
73
65
  leaveActive: "transition-all duration-200 ease-in",
74
66
  leaveTo: "scale-0 opacity-0"
75
67
  },
76
- /** Zoom and fade */
77
68
  zoom: {
78
69
  enterFrom: "scale-0 opacity-0",
79
70
  enterActive: "transition-all duration-300 ease-out",
@@ -82,7 +73,6 @@ const F = {
82
73
  leaveActive: "transition-all duration-200 ease-in",
83
74
  leaveTo: "scale-0 opacity-0"
84
75
  },
85
- /** Flip in */
86
76
  flip: {
87
77
  enterFrom: "rotate-[90deg] opacity-0",
88
78
  enterActive: "transition-all duration-400 ease-out",
@@ -92,51 +82,26 @@ const F = {
92
82
  leaveTo: "rotate-[90deg] opacity-0"
93
83
  }
94
84
  };
95
- function H(t, l) {
96
- const {
97
- preset: o,
98
- show: e,
99
- mode: s = "default",
100
- duration: k,
101
- appear: x = !1,
102
- css: E = !0,
103
- name: L,
104
- enterFrom: d,
105
- enterActive: f,
106
- enterTo: p,
107
- leaveFrom: r,
108
- leaveActive: c,
109
- leaveTo: v,
110
- onBeforeEnter: m,
111
- onEnter: A,
112
- onAfterEnter: T,
113
- onEnterCancelled: h,
114
- onBeforeLeave: b,
115
- onLeave: j,
116
- onAfterLeave: w,
117
- onLeaveCancelled: B
118
- } = t;
85
+ function I(t, i) {
86
+ const { preset: e, show: u, mode: l = "default", duration: k, appear: x = !1, css: E = !0, name: L, enterFrom: d, enterActive: f, enterTo: y, leaveFrom: r, leaveActive: s, leaveTo: c, onBeforeEnter: m, onEnter: A, onAfterEnter: T, onEnterCancelled: h, onBeforeLeave: b, onLeave: j, onAfterLeave: w, onLeaveCancelled: B } = t;
119
87
  let a;
120
- o && F[o] ? (a = { ...F[o] }, d && (a.enterFrom = d), f && (a.enterActive = f), p && (a.enterTo = p), r && (a.leaveFrom = r), c && (a.leaveActive = c), v && (a.leaveTo = v)) : a = {
88
+ e && F[e] ? (a = { ...F[e] }, d && (a.enterFrom = d), f && (a.enterActive = f), y && (a.enterTo = y), r && (a.leaveFrom = r), s && (a.leaveActive = s), c && (a.leaveTo = c)) : a = {
121
89
  enterFrom: d,
122
90
  enterActive: f,
123
- enterTo: p,
91
+ enterTo: y,
124
92
  leaveFrom: r,
125
- leaveActive: c,
126
- leaveTo: v
93
+ leaveActive: s,
94
+ leaveTo: c
127
95
  };
128
- const $ = e && typeof l == "function" ? l() : l, S = L || (o ? `transition-${o}` : "transition"), C = O(
129
- e ? $ : [],
130
- S
131
- );
96
+ const $ = u && typeof i == "function" ? i() : i, S = L || (e ? `transition-${e}` : "transition"), C = P(u ? $ : [], S);
132
97
  return C._transition = {
133
98
  name: S,
134
99
  classes: a,
135
- mode: s,
100
+ mode: l,
136
101
  duration: k,
137
102
  appear: x,
138
103
  css: E,
139
- state: e ? "visible" : "hidden",
104
+ state: u ? "visible" : "hidden",
140
105
  hooks: {
141
106
  onBeforeEnter: m,
142
107
  onEnter: A,
@@ -149,80 +114,49 @@ function H(t, l) {
149
114
  }
150
115
  }, C;
151
116
  }
152
- function I(t, l) {
153
- const {
154
- tag: o = "div",
155
- moveClass: e = "transition-transform duration-300",
156
- preset: s,
157
- show: k = !0,
158
- mode: x = "default",
159
- duration: E,
160
- appear: L = !1,
161
- css: d = !0,
162
- name: f,
163
- class: p,
164
- style: r,
165
- enterFrom: c,
166
- enterActive: v,
167
- enterTo: m,
168
- leaveFrom: A,
169
- leaveActive: T,
170
- leaveTo: h,
171
- onBeforeEnter: b,
172
- onEnter: j,
173
- onAfterEnter: w,
174
- onEnterCancelled: B,
175
- onBeforeLeave: a,
176
- onLeave: $,
177
- onAfterLeave: S,
178
- onLeaveCancelled: C
179
- } = t;
180
- let i;
181
- s && F[s] ? (i = { ...F[s] }, c && (i.enterFrom = c), v && (i.enterActive = v), m && (i.enterTo = m), A && (i.leaveFrom = A), T && (i.leaveActive = T), h && (i.leaveTo = h)) : i = {
182
- enterFrom: c,
183
- enterActive: v,
117
+ function J(t, i) {
118
+ const { tag: e = "div", moveClass: u = "transition-transform duration-300", preset: l, show: k = !0, mode: x = "default", duration: E, appear: L = !1, css: d = !0, name: f, class: y, style: r, enterFrom: s, enterActive: c, enterTo: m, leaveFrom: A, leaveActive: T, leaveTo: h, onBeforeEnter: b, onEnter: j, onAfterEnter: w, onEnterCancelled: B, onBeforeLeave: a, onLeave: $, onAfterLeave: S, onLeaveCancelled: C } = t;
119
+ let n;
120
+ l && F[l] ? (n = { ...F[l] }, s && (n.enterFrom = s), c && (n.enterActive = c), m && (n.enterTo = m), A && (n.leaveFrom = A), T && (n.leaveActive = T), h && (n.leaveTo = h)) : n = {
121
+ enterFrom: s,
122
+ enterActive: c,
184
123
  enterTo: m,
185
124
  leaveFrom: A,
186
125
  leaveActive: T,
187
126
  leaveTo: h
188
127
  };
189
- const _ = f || (s ? `transition-group-${s}` : "transition-group"), g = [];
190
- for (const n of k ? l : [])
191
- if (n && typeof n == "object" && n.tag === "#anchor") {
192
- const K = Array.isArray(n.children) ? n.children : [];
193
- for (const u of K)
194
- if (u && typeof u == "object") {
195
- const N = {
196
- ...u,
197
- key: n.key || u.key,
198
- props: {
199
- ...u.props,
200
- _anchorKey: n.key
201
- // Preserve original anchor key
202
- }
203
- };
204
- g.push(N);
205
- } else
206
- g.push(u);
207
- } else
208
- g.push(n);
128
+ const _ = f || (l ? `transition-group-${l}` : "transition-group"), g = [];
129
+ for (const o of k ? i : []) if (o && typeof o == "object" && o.tag === "#anchor") {
130
+ const K = Array.isArray(o.children) ? o.children : [];
131
+ for (const p of K) if (p && typeof p == "object") {
132
+ const N = {
133
+ ...p,
134
+ key: o.key || p.key,
135
+ props: {
136
+ ...p.props,
137
+ _anchorKey: o.key
138
+ }
139
+ };
140
+ g.push(N);
141
+ } else g.push(p);
142
+ } else g.push(o);
209
143
  const G = (() => {
210
144
  if (r)
211
- return typeof r == "string" ? r : Object.entries(r).map(([n, K]) => `${n}: ${K}`).join("; ");
145
+ return typeof r == "string" ? r : Object.entries(r).map(([o, K]) => `${o}: ${K}`).join("; ");
212
146
  })();
213
147
  return {
214
- tag: o,
148
+ tag: e,
215
149
  children: g,
216
150
  key: _,
217
151
  props: {
218
152
  attrs: {
219
- ...p ? { class: p } : {},
153
+ ...y ? { class: y } : {},
220
154
  ...G ? { style: G } : {}
221
155
  },
222
156
  _transitionGroup: {
223
157
  name: _,
224
- classes: i,
225
- moveClass: e,
158
+ classes: n,
159
+ moveClass: u,
226
160
  mode: x,
227
161
  duration: E,
228
162
  appear: L,
@@ -241,42 +175,43 @@ function I(t, l) {
241
175
  }
242
176
  };
243
177
  }
244
- function J(t) {
178
+ function V(t) {
245
179
  return { ...t };
246
180
  }
247
- let y = null;
248
- function V() {
249
- if (!y) {
181
+ var v = null;
182
+ function q() {
183
+ if (!v) {
250
184
  if (typeof CSSStyleSheet > "u")
251
- return y = {
185
+ return v = {
252
186
  cssRules: [],
253
187
  replaceSync: () => {
254
188
  },
255
189
  toString: () => ""
256
- }, y;
190
+ }, v;
257
191
  const t = [];
258
192
  Object.values(F).forEach((e) => {
259
193
  e.enterFrom && t.push(e.enterFrom), e.enterActive && t.push(e.enterActive), e.enterTo && t.push(e.enterTo), e.leaveFrom && t.push(e.leaveFrom), e.leaveActive && t.push(e.leaveActive), e.leaveTo && t.push(e.leaveTo);
260
194
  });
261
- const l = `<div class="${t.join(" ")}"></div>`, o = P(l);
195
+ const i = O(`<div class="${t.join(" ")}"></div>`);
262
196
  try {
263
- y = new CSSStyleSheet(), y.replaceSync(o);
197
+ v = new CSSStyleSheet(), v.replaceSync(i);
264
198
  } catch {
265
- y = {
199
+ v = {
266
200
  cssRules: [],
267
201
  replaceSync: () => {
268
202
  },
269
- toString: () => o || ""
203
+ toString: () => i || ""
270
204
  };
271
205
  }
272
206
  }
273
- return y;
207
+ return v;
274
208
  }
275
209
  export {
276
- H as Transition,
277
- I as TransitionGroup,
278
- J as createTransitionPreset,
279
- V as getTransitionStyleSheet,
210
+ I as Transition,
211
+ J as TransitionGroup,
212
+ V as createTransitionPreset,
213
+ q as getTransitionStyleSheet,
280
214
  F as transitionPresets
281
215
  };
282
- //# sourceMappingURL=custom-elements-runtime.transitions.es.js.map
216
+
217
+ //# sourceMappingURL=custom-elements-runtime.transitions.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"custom-elements-runtime.transitions.es.js","sources":["../src/lib/transitions.ts"],"sourcesContent":["/**\n * Transitions module (top-level). This file provides the public Transition\n * and TransitionGroup APIs. It is an explicit entry used by the build so\n * consumers can import transitions separately: `.../transitions`.\n */\n/**\n * Transitions Module\n * Vue-like transition system integrated with JIT CSS\n * Provides Transition and TransitionGroup components for enter/leave animations\n */\n\nimport { anchorBlock } from './directives';\nimport type { VNode } from './runtime/types';\nimport { processJITCSS } from './runtime/render-bridge';\n\n/* --- Types --- */\n\n/**\n * Transition class names for different animation phases\n * All values should be JIT CSS utility classes\n */\nexport interface TransitionClasses {\n /** Classes applied at the start of enter transition */\n enterFrom?: string;\n /** Classes applied during entire enter transition */\n enterActive?: string;\n /** Classes applied at the end of enter transition */\n enterTo?: string;\n /** Classes applied at the start of leave transition */\n leaveFrom?: string;\n /** Classes applied during entire leave transition */\n leaveActive?: string;\n /** Classes applied at the end of leave transition */\n leaveTo?: string;\n}\n\n/**\n * Lifecycle hooks for transition events\n */\nexport interface TransitionHooks {\n /** Called before enter transition starts */\n onBeforeEnter?: (el: HTMLElement) => void;\n /** Called during enter transition (with done callback for manual control) */\n onEnter?: (el: HTMLElement, done: () => void) => void;\n /** Called after enter transition completes */\n onAfterEnter?: (el: HTMLElement) => void;\n /** Called if enter transition is cancelled */\n onEnterCancelled?: (el: HTMLElement) => void;\n /** Called before leave transition starts */\n onBeforeLeave?: (el: HTMLElement) => void;\n /** Called during leave transition (with done callback for manual control) */\n onLeave?: (el: HTMLElement, done: () => void) => void;\n /** Called after leave transition completes */\n onAfterLeave?: (el: HTMLElement) => void;\n /** Called if leave transition is cancelled */\n onLeaveCancelled?: (el: HTMLElement) => void;\n}\n\n/**\n * Options for Transition component\n */\nexport interface TransitionOptions extends TransitionClasses, TransitionHooks {\n /** Preset name (fade, slide-right, scale, etc.) */\n preset?: keyof typeof transitionPresets;\n /** Whether to show the content */\n show: boolean;\n /** Transition mode: default, out-in (leave before enter), in-out (enter before leave) */\n mode?: 'default' | 'out-in' | 'in-out';\n /** Custom duration override (ms) */\n duration?: number | { enter: number; leave: number };\n /** Whether to apply transition on initial render */\n appear?: boolean;\n /** Whether to use CSS transitions (true) or JS-only hooks (false) */\n css?: boolean;\n /** Optional name for debugging */\n name?: string;\n}\n\n/**\n * Options for TransitionGroup component\n */\nexport interface TransitionGroupOptions extends Omit<\n TransitionOptions,\n 'show'\n> {\n /** HTML tag for the wrapper element */\n tag?: string;\n /** Class applied during move transitions (when items reorder) */\n moveClass?: string;\n /** Whether to show the group (defaults to true for TransitionGroup) */\n show?: boolean;\n /** CSS classes to apply to the wrapper element (e.g., 'flex gap-4' or 'grid grid-cols-3') */\n class?: string;\n /** Inline styles to apply to the wrapper element */\n style?: string | Record<string, string>;\n}\n\n/* --- Transition Presets --- */\n\n/**\n * Pre-defined transition presets using JIT CSS classes\n * Users can reference these by name or define custom classes\n */\nexport const transitionPresets = {\n /** Simple fade in/out */\n fade: {\n enterFrom: 'opacity-0',\n enterActive: 'transition-opacity duration-300 ease-out',\n enterTo: 'opacity-100',\n leaveFrom: 'opacity-100',\n leaveActive: 'transition-opacity duration-200 ease-in',\n leaveTo: 'opacity-0',\n },\n\n /** Slide in from right */\n 'slide-right': {\n enterFrom: 'translate-x-[100%] opacity-0',\n enterActive: 'transition-all duration-300 ease-out',\n enterTo: 'translate-x-[0%] opacity-100',\n leaveFrom: 'translate-x-[0%] opacity-100',\n leaveActive: 'transition-all duration-200 ease-in',\n leaveTo: 'translate-x-[100%] opacity-0',\n },\n\n /** Slide in from left */\n 'slide-left': {\n enterFrom: 'translate-x-[-100%] opacity-0',\n enterActive: 'transition-all duration-300 ease-out',\n enterTo: 'translate-x-[0%] opacity-100',\n leaveFrom: 'translate-x-[0%] opacity-100',\n leaveActive: 'transition-all duration-200 ease-in',\n leaveTo: 'translate-x-[-100%] opacity-0',\n },\n\n /** Slide up from bottom */\n 'slide-up': {\n enterFrom: 'translate-y-[100%] opacity-0',\n enterActive: 'transition-all duration-300 ease-out',\n enterTo: 'translate-y-[0%] opacity-100',\n leaveFrom: 'translate-y-[0%] opacity-100',\n leaveActive: 'transition-all duration-200 ease-in',\n leaveTo: 'translate-y-[100%] opacity-0',\n },\n\n /** Slide down from top */\n 'slide-down': {\n enterFrom: 'translate-y-[-100%] opacity-0',\n enterActive: 'transition-all duration-300 ease-out',\n enterTo: 'translate-y-[0%] opacity-100',\n leaveFrom: 'translate-y-[0%] opacity-100',\n leaveActive: 'transition-all duration-200 ease-in',\n leaveTo: 'translate-y-[-100%] opacity-0',\n },\n\n /** Scale up from center */\n scale: {\n enterFrom: 'scale-95 opacity-0',\n enterActive: 'transition-all duration-200 ease-out',\n enterTo: 'scale-100 opacity-100',\n leaveFrom: 'scale-100 opacity-100',\n leaveActive: 'transition-all duration-150 ease-in',\n leaveTo: 'scale-95 opacity-0',\n },\n\n /** Scale down to center */\n 'scale-down': {\n enterFrom: 'scale-105 opacity-0',\n enterActive: 'transition-all duration-200 ease-out',\n enterTo: 'scale-100 opacity-100',\n leaveFrom: 'scale-100 opacity-100',\n leaveActive: 'transition-all duration-150 ease-in',\n leaveTo: 'scale-105 opacity-0',\n },\n\n /** Bounce effect */\n bounce: {\n enterFrom: 'scale-0 opacity-0',\n enterActive: 'transition-all duration-500 ease-out',\n enterTo: 'scale-100 opacity-100',\n leaveFrom: 'scale-100 opacity-100',\n leaveActive: 'transition-all duration-200 ease-in',\n leaveTo: 'scale-0 opacity-0',\n },\n\n /** Zoom and fade */\n zoom: {\n enterFrom: 'scale-0 opacity-0',\n enterActive: 'transition-all duration-300 ease-out',\n enterTo: 'scale-100 opacity-100',\n leaveFrom: 'scale-100 opacity-100',\n leaveActive: 'transition-all duration-200 ease-in',\n leaveTo: 'scale-0 opacity-0',\n },\n\n /** Flip in */\n flip: {\n enterFrom: 'rotate-[90deg] opacity-0',\n enterActive: 'transition-all duration-400 ease-out',\n enterTo: 'rotate-[0deg] opacity-100',\n leaveFrom: 'rotate-[0deg] opacity-100',\n leaveActive: 'transition-all duration-300 ease-in',\n leaveTo: 'rotate-[90deg] opacity-0',\n },\n} as const;\n\n/* --- Core Functions --- */\n\n/**\n * Transition component - wraps content with enter/leave animations\n *\n * @example\n * ```ts\n * // Using a preset\n * ${Transition({ preset: 'fade', show: isVisible.value }, html`<div>Content</div>`)}\n *\n * // Using custom JIT classes\n * ${Transition({\n * show: isVisible.value,\n * enterFrom: 'opacity-0 scale-95',\n * enterActive: 'transition-all duration-300',\n * enterTo: 'opacity-100 scale-100',\n * leaveFrom: 'opacity-100 scale-100',\n * leaveActive: 'transition-all duration-200',\n * leaveTo: 'opacity-0 scale-95'\n * }, html`<div>Content</div>`)}\n *\n * // With lifecycle hooks\n * ${Transition({\n * preset: 'slide-right',\n * show: isVisible.value,\n * onAfterEnter: (el) => console.log('Entered!'),\n * onAfterLeave: (el) => console.log('Left!')\n * }, html`<div>Content</div>`)}\n *\n * // Lazy factory — only evaluated when show is true (avoids constructing\n * // expensive VNode trees when the content is hidden)\n * ${Transition({ show: isVisible.value }, () => html`<div>Expensive content</div>`)}\n * ```\n */\nexport function Transition(\n options: TransitionOptions,\n content: VNode | VNode[] | (() => VNode | VNode[]),\n): VNode {\n const {\n preset,\n show,\n mode = 'default',\n duration,\n appear = false,\n css = true,\n name,\n enterFrom,\n enterActive,\n enterTo,\n leaveFrom,\n leaveActive,\n leaveTo,\n onBeforeEnter,\n onEnter,\n onAfterEnter,\n onEnterCancelled,\n onBeforeLeave,\n onLeave,\n onAfterLeave,\n onLeaveCancelled,\n } = options;\n\n // Resolve classes from preset or explicit values\n let transitionClasses: TransitionClasses;\n if (preset && transitionPresets[preset]) {\n transitionClasses = { ...transitionPresets[preset] };\n // Allow overriding preset classes\n if (enterFrom) transitionClasses.enterFrom = enterFrom;\n if (enterActive) transitionClasses.enterActive = enterActive;\n if (enterTo) transitionClasses.enterTo = enterTo;\n if (leaveFrom) transitionClasses.leaveFrom = leaveFrom;\n if (leaveActive) transitionClasses.leaveActive = leaveActive;\n if (leaveTo) transitionClasses.leaveTo = leaveTo;\n } else {\n transitionClasses = {\n enterFrom,\n enterActive,\n enterTo,\n leaveFrom,\n leaveActive,\n leaveTo,\n };\n }\n\n // Resolve content: only call the factory when show is true so that expensive\n // VNode trees (e.g. those that trigger calender builds or heavy computeds)\n // are never constructed while the transition is hidden. Leave animations\n // operate on existing DOM nodes and do not require the content VNode.\n const resolvedContent: VNode | VNode[] =\n show && typeof content === 'function'\n ? content()\n : (content as VNode | VNode[]);\n\n // Create anchor block with transition metadata\n const transitionKey =\n name || (preset ? `transition-${preset}` : 'transition');\n const transitionVNode = anchorBlock(\n show ? resolvedContent : [],\n transitionKey,\n );\n\n // Attach metadata for VDOM to consume during patching\n (transitionVNode as VNode & { _transition?: unknown })._transition = {\n name: transitionKey,\n classes: transitionClasses,\n mode,\n duration,\n appear,\n css,\n state: show ? 'visible' : 'hidden',\n hooks: {\n onBeforeEnter,\n onEnter,\n onAfterEnter,\n onEnterCancelled,\n onBeforeLeave,\n onLeave,\n onAfterLeave,\n onLeaveCancelled,\n },\n };\n\n return transitionVNode;\n}\n\n/**\n * TransitionGroup component - animates lists with enter/leave/move transitions\n *\n * @example\n * ```ts\n * // Basic usage\n * ${TransitionGroup({\n * preset: 'slide-right',\n * tag: 'ul',\n * moveClass: 'transition-transform duration-300'\n * }, each(items.value, (item) => html`\n * <li key=\"${item.id}\">${item.text}</li>\n * `))}\n *\n * // With flex layout\n * ${TransitionGroup({\n * preset: 'fade',\n * class: 'flex gap-4 flex-wrap'\n * }, each(items.value, (item) => html`\n * <div key=\"${item.id}\" class=\"shrink-0\">${item.text}</div>\n * `))}\n *\n * // With grid layout\n * ${TransitionGroup({\n * preset: 'scale',\n * class: 'grid grid-cols-3 gap-4'\n * }, each(items.value, (item) => html`\n * <div key=\"${item.id}\">${item.text}</div>\n * `))}\n * ```\n */\nexport function TransitionGroup(\n options: TransitionGroupOptions,\n children: VNode[],\n): VNode {\n const {\n tag = 'div',\n moveClass = 'transition-transform duration-300',\n preset,\n show = true,\n mode = 'default',\n duration,\n appear = false,\n css = true,\n name,\n class: className,\n style,\n enterFrom,\n enterActive,\n enterTo,\n leaveFrom,\n leaveActive,\n leaveTo,\n onBeforeEnter,\n onEnter,\n onAfterEnter,\n onEnterCancelled,\n onBeforeLeave,\n onLeave,\n onAfterLeave,\n onLeaveCancelled,\n } = options;\n\n // Resolve classes from preset or explicit values\n let transitionClasses: TransitionClasses;\n if (preset && transitionPresets[preset]) {\n transitionClasses = { ...transitionPresets[preset] };\n // Allow overriding preset classes\n if (enterFrom) transitionClasses.enterFrom = enterFrom;\n if (enterActive) transitionClasses.enterActive = enterActive;\n if (enterTo) transitionClasses.enterTo = enterTo;\n if (leaveFrom) transitionClasses.leaveFrom = leaveFrom;\n if (leaveActive) transitionClasses.leaveActive = leaveActive;\n if (leaveTo) transitionClasses.leaveTo = leaveTo;\n } else {\n transitionClasses = {\n enterFrom,\n enterActive,\n enterTo,\n leaveFrom,\n leaveActive,\n leaveTo,\n };\n }\n\n // Create wrapper element with transition group metadata\n const groupKey =\n name || (preset ? `transition-group-${preset}` : 'transition-group');\n\n // Flatten anchor block children to enable proper keyed diffing\n // When each() is used, it creates anchor blocks. We need to extract the actual elements\n // and give them keys from their anchor blocks for proper reordering\n const flattenedChildren: VNode[] = [];\n for (const child of show ? children : []) {\n if (child && typeof child === 'object' && child.tag === '#anchor') {\n // Extract children from anchor block\n const anchorChildren = Array.isArray(child.children)\n ? child.children\n : [];\n for (const anchorChild of anchorChildren) {\n if (anchorChild && typeof anchorChild === 'object') {\n // Use anchor block's key for the child element\n const keyedChild = {\n ...anchorChild,\n key: child.key || anchorChild.key,\n props: {\n ...anchorChild.props,\n _anchorKey: child.key, // Preserve original anchor key\n },\n };\n flattenedChildren.push(keyedChild);\n } else {\n flattenedChildren.push(anchorChild);\n }\n }\n } else {\n flattenedChildren.push(child);\n }\n }\n\n // Serialize style object to a CSS string for the attrs record so it matches\n // the expected primitive attribute value types.\n const styleAttr = (() => {\n if (!style) return undefined;\n if (typeof style === 'string') return style;\n return Object.entries(style)\n .map(([k, v]) => `${k}: ${v}`)\n .join('; ');\n })();\n\n return {\n tag,\n children: flattenedChildren,\n key: groupKey,\n props: {\n attrs: {\n ...(className ? { class: className } : {}),\n ...(styleAttr ? { style: styleAttr } : {}),\n },\n _transitionGroup: {\n name: groupKey,\n classes: transitionClasses,\n moveClass,\n mode,\n duration,\n appear,\n css,\n hooks: {\n onBeforeEnter,\n onEnter,\n onAfterEnter,\n onEnterCancelled,\n onBeforeLeave,\n onLeave,\n onAfterLeave,\n onLeaveCancelled,\n },\n },\n },\n };\n}\n\n/**\n * Helper to create custom transition presets\n *\n * @example\n * ```ts\n * const customFade = createTransitionPreset({\n * enterFrom: 'opacity-0',\n * enterActive: 'transition-opacity duration-500 ease-out',\n * enterTo: 'opacity-100',\n * leaveFrom: 'opacity-100',\n * leaveActive: 'transition-opacity duration-300 ease-in',\n * leaveTo: 'opacity-0'\n * });\n *\n * ${Transition({ ...customFade, show: visible.value }, content)}\n * ```\n */\nexport function createTransitionPreset(\n classes: TransitionClasses,\n): TransitionClasses {\n return { ...classes };\n}\n\n/**\n * Pre-generate CSS for all transition preset classes\n * This ensures the JIT CSS system has the styles ready when transitions are used\n */\nlet transitionStyleSheet: CSSStyleSheet | null = null;\n\n/**\n * Get the global transition stylesheet (creates it if needed)\n */\nexport function getTransitionStyleSheet(): CSSStyleSheet {\n if (!transitionStyleSheet) {\n // If constructable stylesheets aren't available (SSR / old browsers),\n // return a no-op stub to avoid throwing during import or server render.\n if (typeof CSSStyleSheet === 'undefined') {\n transitionStyleSheet = {\n cssRules: [],\n replaceSync: () => {},\n toString: () => '',\n } as unknown as CSSStyleSheet;\n return transitionStyleSheet;\n }\n\n const allClasses: string[] = [];\n\n // Collect all classes from presets\n Object.values(transitionPresets).forEach((preset) => {\n if (preset.enterFrom) allClasses.push(preset.enterFrom);\n if (preset.enterActive) allClasses.push(preset.enterActive);\n if (preset.enterTo) allClasses.push(preset.enterTo);\n if (preset.leaveFrom) allClasses.push(preset.leaveFrom);\n if (preset.leaveActive) allClasses.push(preset.leaveActive);\n if (preset.leaveTo) allClasses.push(preset.leaveTo);\n });\n\n // Create a fake HTML string with all transition classes\n const fakeHtml = `<div class=\"${allClasses.join(' ')}\"></div>`;\n\n // Trigger JIT CSS generation (no-op if JIT CSS engine is not loaded)\n const generatedCSS = processJITCSS(fakeHtml);\n\n // Create stylesheet\n try {\n transitionStyleSheet = new CSSStyleSheet();\n transitionStyleSheet.replaceSync(generatedCSS);\n } catch {\n // If creating a constructable stylesheet fails for any reason,\n // fallback to a stub to avoid breaking SSR or older environments.\n transitionStyleSheet = {\n cssRules: [],\n replaceSync: () => {},\n toString: () => generatedCSS || '',\n } as unknown as CSSStyleSheet;\n }\n }\n\n return transitionStyleSheet;\n}\n\n"],"names":["transitionPresets","Transition","options","content","preset","show","mode","duration","appear","css","name","enterFrom","enterActive","enterTo","leaveFrom","leaveActive","leaveTo","onBeforeEnter","onEnter","onAfterEnter","onEnterCancelled","onBeforeLeave","onLeave","onAfterLeave","onLeaveCancelled","transitionClasses","resolvedContent","transitionKey","transitionVNode","anchorBlock","TransitionGroup","children","tag","moveClass","className","style","groupKey","flattenedChildren","child","anchorChildren","anchorChild","keyedChild","styleAttr","k","v","createTransitionPreset","classes","transitionStyleSheet","getTransitionStyleSheet","allClasses","fakeHtml","generatedCSS","processJITCSS"],"mappings":"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"}
1
+ {"version":3,"file":"custom-elements-runtime.transitions.es.js","names":[],"sources":["../src/lib/transitions.ts"],"sourcesContent":["/**\n * Transitions module (top-level). This file provides the public Transition\n * and TransitionGroup APIs. It is an explicit entry used by the build so\n * consumers can import transitions separately: `.../transitions`.\n */\n/**\n * Transitions Module\n * Vue-like transition system integrated with JIT CSS\n * Provides Transition and TransitionGroup components for enter/leave animations\n */\n\nimport { anchorBlock } from './directives';\nimport type { VNode } from './runtime/types';\nimport { processJITCSS } from './runtime/render-bridge';\n\n/* --- Types --- */\n\n/**\n * Transition class names for different animation phases\n * All values should be JIT CSS utility classes\n */\nexport interface TransitionClasses {\n /** Classes applied at the start of enter transition */\n enterFrom?: string;\n /** Classes applied during entire enter transition */\n enterActive?: string;\n /** Classes applied at the end of enter transition */\n enterTo?: string;\n /** Classes applied at the start of leave transition */\n leaveFrom?: string;\n /** Classes applied during entire leave transition */\n leaveActive?: string;\n /** Classes applied at the end of leave transition */\n leaveTo?: string;\n}\n\n/**\n * Lifecycle hooks for transition events\n */\nexport interface TransitionHooks {\n /** Called before enter transition starts */\n onBeforeEnter?: (el: HTMLElement) => void;\n /** Called during enter transition (with done callback for manual control) */\n onEnter?: (el: HTMLElement, done: () => void) => void;\n /** Called after enter transition completes */\n onAfterEnter?: (el: HTMLElement) => void;\n /** Called if enter transition is cancelled */\n onEnterCancelled?: (el: HTMLElement) => void;\n /** Called before leave transition starts */\n onBeforeLeave?: (el: HTMLElement) => void;\n /** Called during leave transition (with done callback for manual control) */\n onLeave?: (el: HTMLElement, done: () => void) => void;\n /** Called after leave transition completes */\n onAfterLeave?: (el: HTMLElement) => void;\n /** Called if leave transition is cancelled */\n onLeaveCancelled?: (el: HTMLElement) => void;\n}\n\n/**\n * Options for Transition component\n */\nexport interface TransitionOptions extends TransitionClasses, TransitionHooks {\n /** Preset name (fade, slide-right, scale, etc.) */\n preset?: keyof typeof transitionPresets;\n /** Whether to show the content */\n show: boolean;\n /** Transition mode: default, out-in (leave before enter), in-out (enter before leave) */\n mode?: 'default' | 'out-in' | 'in-out';\n /** Custom duration override (ms) */\n duration?: number | { enter: number; leave: number };\n /** Whether to apply transition on initial render */\n appear?: boolean;\n /** Whether to use CSS transitions (true) or JS-only hooks (false) */\n css?: boolean;\n /** Optional name for debugging */\n name?: string;\n}\n\n/**\n * Options for TransitionGroup component\n */\nexport interface TransitionGroupOptions extends Omit<\n TransitionOptions,\n 'show'\n> {\n /** HTML tag for the wrapper element */\n tag?: string;\n /** Class applied during move transitions (when items reorder) */\n moveClass?: string;\n /** Whether to show the group (defaults to true for TransitionGroup) */\n show?: boolean;\n /** CSS classes to apply to the wrapper element (e.g., 'flex gap-4' or 'grid grid-cols-3') */\n class?: string;\n /** Inline styles to apply to the wrapper element */\n style?: string | Record<string, string>;\n}\n\n/* --- Transition Presets --- */\n\n/**\n * Pre-defined transition presets using JIT CSS classes\n * Users can reference these by name or define custom classes\n */\nexport const transitionPresets = {\n /** Simple fade in/out */\n fade: {\n enterFrom: 'opacity-0',\n enterActive: 'transition-opacity duration-300 ease-out',\n enterTo: 'opacity-100',\n leaveFrom: 'opacity-100',\n leaveActive: 'transition-opacity duration-200 ease-in',\n leaveTo: 'opacity-0',\n },\n\n /** Slide in from right */\n 'slide-right': {\n enterFrom: 'translate-x-[100%] opacity-0',\n enterActive: 'transition-all duration-300 ease-out',\n enterTo: 'translate-x-[0%] opacity-100',\n leaveFrom: 'translate-x-[0%] opacity-100',\n leaveActive: 'transition-all duration-200 ease-in',\n leaveTo: 'translate-x-[100%] opacity-0',\n },\n\n /** Slide in from left */\n 'slide-left': {\n enterFrom: 'translate-x-[-100%] opacity-0',\n enterActive: 'transition-all duration-300 ease-out',\n enterTo: 'translate-x-[0%] opacity-100',\n leaveFrom: 'translate-x-[0%] opacity-100',\n leaveActive: 'transition-all duration-200 ease-in',\n leaveTo: 'translate-x-[-100%] opacity-0',\n },\n\n /** Slide up from bottom */\n 'slide-up': {\n enterFrom: 'translate-y-[100%] opacity-0',\n enterActive: 'transition-all duration-300 ease-out',\n enterTo: 'translate-y-[0%] opacity-100',\n leaveFrom: 'translate-y-[0%] opacity-100',\n leaveActive: 'transition-all duration-200 ease-in',\n leaveTo: 'translate-y-[100%] opacity-0',\n },\n\n /** Slide down from top */\n 'slide-down': {\n enterFrom: 'translate-y-[-100%] opacity-0',\n enterActive: 'transition-all duration-300 ease-out',\n enterTo: 'translate-y-[0%] opacity-100',\n leaveFrom: 'translate-y-[0%] opacity-100',\n leaveActive: 'transition-all duration-200 ease-in',\n leaveTo: 'translate-y-[-100%] opacity-0',\n },\n\n /** Scale up from center */\n scale: {\n enterFrom: 'scale-95 opacity-0',\n enterActive: 'transition-all duration-200 ease-out',\n enterTo: 'scale-100 opacity-100',\n leaveFrom: 'scale-100 opacity-100',\n leaveActive: 'transition-all duration-150 ease-in',\n leaveTo: 'scale-95 opacity-0',\n },\n\n /** Scale down to center */\n 'scale-down': {\n enterFrom: 'scale-105 opacity-0',\n enterActive: 'transition-all duration-200 ease-out',\n enterTo: 'scale-100 opacity-100',\n leaveFrom: 'scale-100 opacity-100',\n leaveActive: 'transition-all duration-150 ease-in',\n leaveTo: 'scale-105 opacity-0',\n },\n\n /** Bounce effect */\n bounce: {\n enterFrom: 'scale-0 opacity-0',\n enterActive: 'transition-all duration-500 ease-out',\n enterTo: 'scale-100 opacity-100',\n leaveFrom: 'scale-100 opacity-100',\n leaveActive: 'transition-all duration-200 ease-in',\n leaveTo: 'scale-0 opacity-0',\n },\n\n /** Zoom and fade */\n zoom: {\n enterFrom: 'scale-0 opacity-0',\n enterActive: 'transition-all duration-300 ease-out',\n enterTo: 'scale-100 opacity-100',\n leaveFrom: 'scale-100 opacity-100',\n leaveActive: 'transition-all duration-200 ease-in',\n leaveTo: 'scale-0 opacity-0',\n },\n\n /** Flip in */\n flip: {\n enterFrom: 'rotate-[90deg] opacity-0',\n enterActive: 'transition-all duration-400 ease-out',\n enterTo: 'rotate-[0deg] opacity-100',\n leaveFrom: 'rotate-[0deg] opacity-100',\n leaveActive: 'transition-all duration-300 ease-in',\n leaveTo: 'rotate-[90deg] opacity-0',\n },\n} as const;\n\n/* --- Core Functions --- */\n\n/**\n * Transition component - wraps content with enter/leave animations\n *\n * @example\n * ```ts\n * // Using a preset\n * ${Transition({ preset: 'fade', show: isVisible.value }, html`<div>Content</div>`)}\n *\n * // Using custom JIT classes\n * ${Transition({\n * show: isVisible.value,\n * enterFrom: 'opacity-0 scale-95',\n * enterActive: 'transition-all duration-300',\n * enterTo: 'opacity-100 scale-100',\n * leaveFrom: 'opacity-100 scale-100',\n * leaveActive: 'transition-all duration-200',\n * leaveTo: 'opacity-0 scale-95'\n * }, html`<div>Content</div>`)}\n *\n * // With lifecycle hooks\n * ${Transition({\n * preset: 'slide-right',\n * show: isVisible.value,\n * onAfterEnter: (el) => console.log('Entered!'),\n * onAfterLeave: (el) => console.log('Left!')\n * }, html`<div>Content</div>`)}\n *\n * // Lazy factory — only evaluated when show is true (avoids constructing\n * // expensive VNode trees when the content is hidden)\n * ${Transition({ show: isVisible.value }, () => html`<div>Expensive content</div>`)}\n * ```\n */\nexport function Transition(\n options: TransitionOptions,\n content: VNode | VNode[] | (() => VNode | VNode[]),\n): VNode {\n const {\n preset,\n show,\n mode = 'default',\n duration,\n appear = false,\n css = true,\n name,\n enterFrom,\n enterActive,\n enterTo,\n leaveFrom,\n leaveActive,\n leaveTo,\n onBeforeEnter,\n onEnter,\n onAfterEnter,\n onEnterCancelled,\n onBeforeLeave,\n onLeave,\n onAfterLeave,\n onLeaveCancelled,\n } = options;\n\n // Resolve classes from preset or explicit values\n let transitionClasses: TransitionClasses;\n if (preset && transitionPresets[preset]) {\n transitionClasses = { ...transitionPresets[preset] };\n // Allow overriding preset classes\n if (enterFrom) transitionClasses.enterFrom = enterFrom;\n if (enterActive) transitionClasses.enterActive = enterActive;\n if (enterTo) transitionClasses.enterTo = enterTo;\n if (leaveFrom) transitionClasses.leaveFrom = leaveFrom;\n if (leaveActive) transitionClasses.leaveActive = leaveActive;\n if (leaveTo) transitionClasses.leaveTo = leaveTo;\n } else {\n transitionClasses = {\n enterFrom,\n enterActive,\n enterTo,\n leaveFrom,\n leaveActive,\n leaveTo,\n };\n }\n\n // Resolve content: only call the factory when show is true so that expensive\n // VNode trees (e.g. those that trigger calender builds or heavy computeds)\n // are never constructed while the transition is hidden. Leave animations\n // operate on existing DOM nodes and do not require the content VNode.\n const resolvedContent: VNode | VNode[] =\n show && typeof content === 'function'\n ? content()\n : (content as VNode | VNode[]);\n\n // Create anchor block with transition metadata\n const transitionKey =\n name || (preset ? `transition-${preset}` : 'transition');\n const transitionVNode = anchorBlock(\n show ? resolvedContent : [],\n transitionKey,\n );\n\n // Attach metadata for VDOM to consume during patching\n (transitionVNode as VNode & { _transition?: unknown })._transition = {\n name: transitionKey,\n classes: transitionClasses,\n mode,\n duration,\n appear,\n css,\n state: show ? 'visible' : 'hidden',\n hooks: {\n onBeforeEnter,\n onEnter,\n onAfterEnter,\n onEnterCancelled,\n onBeforeLeave,\n onLeave,\n onAfterLeave,\n onLeaveCancelled,\n },\n };\n\n return transitionVNode;\n}\n\n/**\n * TransitionGroup component - animates lists with enter/leave/move transitions\n *\n * @example\n * ```ts\n * // Basic usage\n * ${TransitionGroup({\n * preset: 'slide-right',\n * tag: 'ul',\n * moveClass: 'transition-transform duration-300'\n * }, each(items.value, (item) => html`\n * <li key=\"${item.id}\">${item.text}</li>\n * `))}\n *\n * // With flex layout\n * ${TransitionGroup({\n * preset: 'fade',\n * class: 'flex gap-4 flex-wrap'\n * }, each(items.value, (item) => html`\n * <div key=\"${item.id}\" class=\"shrink-0\">${item.text}</div>\n * `))}\n *\n * // With grid layout\n * ${TransitionGroup({\n * preset: 'scale',\n * class: 'grid grid-cols-3 gap-4'\n * }, each(items.value, (item) => html`\n * <div key=\"${item.id}\">${item.text}</div>\n * `))}\n * ```\n */\nexport function TransitionGroup(\n options: TransitionGroupOptions,\n children: VNode[],\n): VNode {\n const {\n tag = 'div',\n moveClass = 'transition-transform duration-300',\n preset,\n show = true,\n mode = 'default',\n duration,\n appear = false,\n css = true,\n name,\n class: className,\n style,\n enterFrom,\n enterActive,\n enterTo,\n leaveFrom,\n leaveActive,\n leaveTo,\n onBeforeEnter,\n onEnter,\n onAfterEnter,\n onEnterCancelled,\n onBeforeLeave,\n onLeave,\n onAfterLeave,\n onLeaveCancelled,\n } = options;\n\n // Resolve classes from preset or explicit values\n let transitionClasses: TransitionClasses;\n if (preset && transitionPresets[preset]) {\n transitionClasses = { ...transitionPresets[preset] };\n // Allow overriding preset classes\n if (enterFrom) transitionClasses.enterFrom = enterFrom;\n if (enterActive) transitionClasses.enterActive = enterActive;\n if (enterTo) transitionClasses.enterTo = enterTo;\n if (leaveFrom) transitionClasses.leaveFrom = leaveFrom;\n if (leaveActive) transitionClasses.leaveActive = leaveActive;\n if (leaveTo) transitionClasses.leaveTo = leaveTo;\n } else {\n transitionClasses = {\n enterFrom,\n enterActive,\n enterTo,\n leaveFrom,\n leaveActive,\n leaveTo,\n };\n }\n\n // Create wrapper element with transition group metadata\n const groupKey =\n name || (preset ? `transition-group-${preset}` : 'transition-group');\n\n // Flatten anchor block children to enable proper keyed diffing\n // When each() is used, it creates anchor blocks. We need to extract the actual elements\n // and give them keys from their anchor blocks for proper reordering\n const flattenedChildren: VNode[] = [];\n for (const child of show ? children : []) {\n if (child && typeof child === 'object' && child.tag === '#anchor') {\n // Extract children from anchor block\n const anchorChildren = Array.isArray(child.children)\n ? child.children\n : [];\n for (const anchorChild of anchorChildren) {\n if (anchorChild && typeof anchorChild === 'object') {\n // Use anchor block's key for the child element\n const keyedChild = {\n ...anchorChild,\n key: child.key || anchorChild.key,\n props: {\n ...anchorChild.props,\n _anchorKey: child.key, // Preserve original anchor key\n },\n };\n flattenedChildren.push(keyedChild);\n } else {\n flattenedChildren.push(anchorChild);\n }\n }\n } else {\n flattenedChildren.push(child);\n }\n }\n\n // Serialize style object to a CSS string for the attrs record so it matches\n // the expected primitive attribute value types.\n const styleAttr = (() => {\n if (!style) return undefined;\n if (typeof style === 'string') return style;\n return Object.entries(style)\n .map(([k, v]) => `${k}: ${v}`)\n .join('; ');\n })();\n\n return {\n tag,\n children: flattenedChildren,\n key: groupKey,\n props: {\n attrs: {\n ...(className ? { class: className } : {}),\n ...(styleAttr ? { style: styleAttr } : {}),\n },\n _transitionGroup: {\n name: groupKey,\n classes: transitionClasses,\n moveClass,\n mode,\n duration,\n appear,\n css,\n hooks: {\n onBeforeEnter,\n onEnter,\n onAfterEnter,\n onEnterCancelled,\n onBeforeLeave,\n onLeave,\n onAfterLeave,\n onLeaveCancelled,\n },\n },\n },\n };\n}\n\n/**\n * Helper to create custom transition presets\n *\n * @example\n * ```ts\n * const customFade = createTransitionPreset({\n * enterFrom: 'opacity-0',\n * enterActive: 'transition-opacity duration-500 ease-out',\n * enterTo: 'opacity-100',\n * leaveFrom: 'opacity-100',\n * leaveActive: 'transition-opacity duration-300 ease-in',\n * leaveTo: 'opacity-0'\n * });\n *\n * ${Transition({ ...customFade, show: visible.value }, content)}\n * ```\n */\nexport function createTransitionPreset(\n classes: TransitionClasses,\n): TransitionClasses {\n return { ...classes };\n}\n\n/**\n * Pre-generate CSS for all transition preset classes\n * This ensures the JIT CSS system has the styles ready when transitions are used\n */\nlet transitionStyleSheet: CSSStyleSheet | null = null;\n\n/**\n * Get the global transition stylesheet (creates it if needed)\n */\nexport function getTransitionStyleSheet(): CSSStyleSheet {\n if (!transitionStyleSheet) {\n // If constructable stylesheets aren't available (SSR / old browsers),\n // return a no-op stub to avoid throwing during import or server render.\n if (typeof CSSStyleSheet === 'undefined') {\n transitionStyleSheet = {\n cssRules: [],\n replaceSync: () => {},\n toString: () => '',\n } as unknown as CSSStyleSheet;\n return transitionStyleSheet;\n }\n\n const allClasses: string[] = [];\n\n // Collect all classes from presets\n Object.values(transitionPresets).forEach((preset) => {\n if (preset.enterFrom) allClasses.push(preset.enterFrom);\n if (preset.enterActive) allClasses.push(preset.enterActive);\n if (preset.enterTo) allClasses.push(preset.enterTo);\n if (preset.leaveFrom) allClasses.push(preset.leaveFrom);\n if (preset.leaveActive) allClasses.push(preset.leaveActive);\n if (preset.leaveTo) allClasses.push(preset.leaveTo);\n });\n\n // Create a fake HTML string with all transition classes\n const fakeHtml = `<div class=\"${allClasses.join(' ')}\"></div>`;\n\n // Trigger JIT CSS generation (no-op if JIT CSS engine is not loaded)\n const generatedCSS = processJITCSS(fakeHtml);\n\n // Create stylesheet\n try {\n transitionStyleSheet = new CSSStyleSheet();\n transitionStyleSheet.replaceSync(generatedCSS);\n } catch {\n // If creating a constructable stylesheet fails for any reason,\n // fallback to a stub to avoid breaking SSR or older environments.\n transitionStyleSheet = {\n cssRules: [],\n replaceSync: () => {},\n toString: () => generatedCSS || '',\n } as unknown as CSSStyleSheet;\n }\n }\n\n return transitionStyleSheet;\n}\n\n"],"mappings":"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"}
@@ -1,2 +1,3 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("node:fs"),S=require("node:path"),h=require("./style-D40DsIqJ.cjs"),w="virtual:cer-jit-css",y="\0virtual:cer-jit-css";function m(e,r){r&&Object.keys(r).length>0&&h.enableJITCSS(r);const t=process.cwd(),n=[];for(const l of e){const o=d.globSync(l,{cwd:t}).map(i=>S.resolve(t,i));n.push(...o)}const c=[...new Set(n)],a=new Set;for(const l of c)try{const o=d.readFileSync(l,"utf-8"),i=h.extractClassesFromHTML(o);for(const s of i)a.add(s)}catch{}if(a.size===0)return"";const g=`<div class="${[...a].join(" ")}"></div>`;return h.jitCSS(g)}const b="virtual:cer-ssr-config",I="\0virtual:cer-ssr-config";function T(e){const r=[];if(e.content&&e.content.length>0&&r.push(p({content:e.content,output:e.output,virtualModule:e.virtualModule,extendedColors:e.extendedColors,customColors:e.customColors,disableVariants:e.disableVariants})),e.ssr){const t=e.ssr,n={dsd:t.dsd??!0,dsdPolyfill:t.dsdPolyfill??!0,...t.jit?{jit:t.jit}:{}};r.push({name:"cer-ssr-config",resolveId(c){if(c===b)return I},load(c){if(c===I)return`export default ${JSON.stringify(n)};`}})}return r}function p(e){const{content:r,output:t,virtualModule:n=!0,extendedColors:c,customColors:a,disableVariants:g}=e,l={extendedColors:c,customColors:a,disableVariants:g};let o="",i=null;return{name:"cer-jit-css",buildStart(){const s=process.cwd(),v=new Set;for(const f of r)d.globSync(f,{cwd:s}).forEach(u=>v.add(S.resolve(s,u)));if(i=v,o=m(r,l),t){const f=S.resolve(process.cwd(),t);d.mkdirSync(S.dirname(f),{recursive:!0}),d.writeFileSync(f,o,"utf-8")}},resolveId(s){if(n&&s===w)return y},load(s){if(s===y)return`export default ${JSON.stringify(o)};`},handleHotUpdate({file:s,server:v}){if(i?.has(s)??!1){if(o=m(r,l),t){const u=S.resolve(process.cwd(),t);d.writeFileSync(u,o,"utf-8")}if(n){const u=v,C=u.moduleGraph.getModuleById(y);C&&u.reloadModule(C)}}}}}exports.cerJITCSS=p;exports.cerPlugin=T;
2
- //# sourceMappingURL=custom-elements-runtime.vite-plugin.cjs.js.map
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const g=require("./style-Bjn8zDiZ.cjs");let u=require("node:fs"),f=require("node:path");var w="virtual:cer-jit-css",y="\0virtual:cer-jit-css";function h(e,r){r&&Object.keys(r).length>0&&g.enableJITCSS(r);const t=process.cwd(),n=[];for(const a of e){const i=(0,u.globSync)(a,{cwd:t}).map(s=>(0,f.resolve)(t,s));n.push(...i)}const l=[...new Set(n)],d=new Set;for(const a of l)try{const i=g.extractClassesFromHTML((0,u.readFileSync)(a,"utf-8"));for(const s of i)d.add(s)}catch{}return d.size===0?"":g.jitCSS(`<div class="${[...d].join(" ")}"></div>`)}var p="virtual:cer-ssr-config",m="\0virtual:cer-ssr-config";function _(e){const r=[];if(e.content&&e.content.length>0&&r.push(I({content:e.content,output:e.output,virtualModule:e.virtualModule,extendedColors:e.extendedColors,customColors:e.customColors,disableVariants:e.disableVariants})),e.ssr){const t=e.ssr,n={dsd:t.dsd??!0,dsdPolyfill:t.dsdPolyfill??!0,...t.jit?{jit:t.jit}:{}};r.push({name:"cer-ssr-config",resolveId(l){if(l===p)return m},load(l){if(l===m)return`export default ${JSON.stringify(n)};`}})}return r}function I(e){const{content:r,output:t,virtualModule:n=!0,extendedColors:l,customColors:d,disableVariants:a}=e,i={extendedColors:l,customColors:d,disableVariants:a};let s="",C=null;return{name:"cer-jit-css",buildStart(){const o=process.cwd(),S=new Set;for(const c of r)(0,u.globSync)(c,{cwd:o}).forEach(v=>S.add((0,f.resolve)(o,v)));if(C=S,s=h(r,i),t){const c=(0,f.resolve)(process.cwd(),t);(0,u.mkdirSync)((0,f.dirname)(c),{recursive:!0}),(0,u.writeFileSync)(c,s,"utf-8")}},resolveId(o){if(n&&o===w)return y},load(o){if(o===y)return`export default ${JSON.stringify(s)};`},handleHotUpdate({file:o,server:S}){if((C?.has(o)??!1)&&(s=h(r,i),t&&(0,u.writeFileSync)((0,f.resolve)(process.cwd(),t),s,"utf-8"),n)){const c=S,v=c.moduleGraph.getModuleById(y);v&&c.reloadModule(v)}}}}exports.cerJITCSS=I;exports.cerPlugin=_;
2
+
3
+ //# sourceMappingURL=custom-elements-runtime.vite-plugin.cjs.js.map