@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.
- package/dist/{css-utils-Cg4o1MqY.js → css-utils-CC43BbEy.js} +20 -21
- package/dist/css-utils-CC43BbEy.js.map +1 -0
- package/dist/{css-utils-RqkyBWft.cjs → css-utils-mgjmH8qX.cjs} +5 -4
- package/dist/css-utils-mgjmH8qX.cjs.map +1 -0
- package/dist/custom-elements-runtime.cjs.js +4 -3
- package/dist/custom-elements-runtime.cjs.js.map +1 -1
- package/dist/custom-elements-runtime.colors.cjs.js +3 -2
- package/dist/custom-elements-runtime.colors.cjs.js.map +1 -1
- package/dist/custom-elements-runtime.colors.es.js +3 -2
- package/dist/custom-elements-runtime.colors.es.js.map +1 -1
- package/dist/custom-elements-runtime.directive-enhancements.cjs.js +3 -2
- package/dist/custom-elements-runtime.directive-enhancements.cjs.js.map +1 -1
- package/dist/custom-elements-runtime.directive-enhancements.es.js +86 -100
- package/dist/custom-elements-runtime.directive-enhancements.es.js.map +1 -1
- package/dist/custom-elements-runtime.directives.cjs.js +3 -2
- package/dist/custom-elements-runtime.directives.cjs.js.map +1 -1
- package/dist/custom-elements-runtime.directives.es.js +40 -43
- package/dist/custom-elements-runtime.directives.es.js.map +1 -1
- package/dist/custom-elements-runtime.dom-jit-css.cjs.js +7 -6
- package/dist/custom-elements-runtime.dom-jit-css.cjs.js.map +1 -1
- package/dist/custom-elements-runtime.dom-jit-css.es.js +58 -76
- package/dist/custom-elements-runtime.dom-jit-css.es.js.map +1 -1
- package/dist/custom-elements-runtime.es.js +162 -186
- package/dist/custom-elements-runtime.es.js.map +1 -1
- package/dist/custom-elements-runtime.event-bus.cjs.js +3 -2
- package/dist/custom-elements-runtime.event-bus.cjs.js.map +1 -1
- package/dist/custom-elements-runtime.event-bus.es.js +48 -103
- package/dist/custom-elements-runtime.event-bus.es.js.map +1 -1
- package/dist/custom-elements-runtime.jit-css.cjs.js +3 -2
- package/dist/custom-elements-runtime.jit-css.cjs.js.map +1 -1
- package/dist/custom-elements-runtime.jit-css.es.js +29 -30
- package/dist/custom-elements-runtime.jit-css.es.js.map +1 -1
- package/dist/custom-elements-runtime.router.cjs.js +19 -18
- package/dist/custom-elements-runtime.router.cjs.js.map +1 -1
- package/dist/custom-elements-runtime.router.es.js +554 -571
- package/dist/custom-elements-runtime.router.es.js.map +1 -1
- package/dist/custom-elements-runtime.ssr-middleware.cjs.js +5 -2
- package/dist/custom-elements-runtime.ssr-middleware.cjs.js.map +1 -1
- package/dist/custom-elements-runtime.ssr-middleware.es.js +54 -45
- package/dist/custom-elements-runtime.ssr-middleware.es.js.map +1 -1
- package/dist/custom-elements-runtime.ssr.cjs.js +1 -4
- package/dist/custom-elements-runtime.ssr.es.js +11 -175
- package/dist/custom-elements-runtime.store.cjs.js +3 -2
- package/dist/custom-elements-runtime.store.cjs.js.map +1 -1
- package/dist/custom-elements-runtime.store.es.js +17 -11
- package/dist/custom-elements-runtime.store.es.js.map +1 -1
- package/dist/custom-elements-runtime.transitions.cjs.js +3 -2
- package/dist/custom-elements-runtime.transitions.cjs.js.map +1 -1
- package/dist/custom-elements-runtime.transitions.es.js +55 -120
- package/dist/custom-elements-runtime.transitions.es.js.map +1 -1
- package/dist/custom-elements-runtime.vite-plugin.cjs.js +3 -2
- package/dist/custom-elements-runtime.vite-plugin.cjs.js.map +1 -1
- package/dist/custom-elements-runtime.vite-plugin.es.js +54 -75
- package/dist/custom-elements-runtime.vite-plugin.es.js.map +1 -1
- package/dist/hooks-_3xP4G2N.js +1189 -0
- package/dist/hooks-_3xP4G2N.js.map +1 -0
- package/dist/hooks-fYQgZk2g.cjs +7 -0
- package/dist/hooks-fYQgZk2g.cjs.map +1 -0
- package/dist/logger-BYIN7ysT.cjs +3 -0
- package/dist/logger-BYIN7ysT.cjs.map +1 -0
- package/dist/logger-L25axmB-.js +41 -0
- package/dist/logger-L25axmB-.js.map +1 -0
- package/dist/namespace-helpers-Bf7rm9JV.cjs +3 -0
- package/dist/namespace-helpers-Bf7rm9JV.cjs.map +1 -0
- package/dist/namespace-helpers-BucDdgz_.js +61 -0
- package/dist/namespace-helpers-BucDdgz_.js.map +1 -0
- package/dist/reset.css +1 -1
- package/dist/runtime/ssr-context.d.ts +1 -13
- package/dist/runtime/vdom-ssr-dsd.d.ts +14 -0
- package/dist/ssr-B3lxl1vr.js +165 -0
- package/dist/ssr-B3lxl1vr.js.map +1 -0
- package/dist/ssr-DtD9e5iA.cjs +5 -0
- package/dist/ssr-DtD9e5iA.cjs.map +1 -0
- package/dist/ssr-middleware.d.ts +18 -2
- package/dist/ssr.d.ts +3 -4
- package/dist/style-Bjn8zDiZ.cjs +56 -0
- package/dist/style-Bjn8zDiZ.cjs.map +1 -0
- package/dist/{style-BmyOIMcU.js → style-DuDoj_xK.js} +724 -876
- package/dist/style-DuDoj_xK.js.map +1 -0
- package/dist/style.css +1 -1
- package/dist/template-compiler-BB4JJdqk.cjs +23 -0
- package/dist/template-compiler-BB4JJdqk.cjs.map +1 -0
- package/dist/template-compiler-Cs5axmn4.js +3236 -0
- package/dist/template-compiler-Cs5axmn4.js.map +1 -0
- package/dist/variables.css +1 -1
- package/package.json +7 -7
- package/dist/css-utils-Cg4o1MqY.js.map +0 -1
- package/dist/css-utils-RqkyBWft.cjs.map +0 -1
- package/dist/custom-elements-runtime.ssr.cjs.js.map +0 -1
- package/dist/custom-elements-runtime.ssr.es.js.map +0 -1
- package/dist/hooks-x8M4knLc.cjs +0 -6
- package/dist/hooks-x8M4knLc.cjs.map +0 -1
- package/dist/hooks-xWZhQHco.js +0 -1465
- package/dist/hooks-xWZhQHco.js.map +0 -1
- package/dist/logger-BvkEbVM4.js +0 -48
- package/dist/logger-BvkEbVM4.js.map +0 -1
- package/dist/logger-CSALKaYm.cjs +0 -2
- package/dist/logger-CSALKaYm.cjs.map +0 -1
- package/dist/namespace-helpers-D4wC2-qA.js +0 -61
- package/dist/namespace-helpers-D4wC2-qA.js.map +0 -1
- package/dist/namespace-helpers-ckeEOxpR.cjs +0 -2
- package/dist/namespace-helpers-ckeEOxpR.cjs.map +0 -1
- package/dist/style-BmyOIMcU.js.map +0 -1
- package/dist/style-D40DsIqJ.cjs +0 -55
- package/dist/style-D40DsIqJ.cjs.map +0 -1
- package/dist/template-compiler-CTUhEHr8.cjs +0 -22
- package/dist/template-compiler-CTUhEHr8.cjs.map +0 -1
- package/dist/template-compiler-ZhSg1yPh.js +0 -3724
- 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":"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"}
|
|
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 {
|
|
2
|
-
import {
|
|
3
|
-
|
|
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
|
|
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
|
-
|
|
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:
|
|
91
|
+
enterTo: y,
|
|
124
92
|
leaveFrom: r,
|
|
125
|
-
leaveActive:
|
|
126
|
-
leaveTo:
|
|
93
|
+
leaveActive: s,
|
|
94
|
+
leaveTo: c
|
|
127
95
|
};
|
|
128
|
-
const $ =
|
|
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:
|
|
100
|
+
mode: l,
|
|
136
101
|
duration: k,
|
|
137
102
|
appear: x,
|
|
138
103
|
css: E,
|
|
139
|
-
state:
|
|
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
|
|
153
|
-
const {
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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 || (
|
|
190
|
-
for (const
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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(([
|
|
145
|
+
return typeof r == "string" ? r : Object.entries(r).map(([o, K]) => `${o}: ${K}`).join("; ");
|
|
212
146
|
})();
|
|
213
147
|
return {
|
|
214
|
-
tag:
|
|
148
|
+
tag: e,
|
|
215
149
|
children: g,
|
|
216
150
|
key: _,
|
|
217
151
|
props: {
|
|
218
152
|
attrs: {
|
|
219
|
-
...
|
|
153
|
+
...y ? { class: y } : {},
|
|
220
154
|
...G ? { style: G } : {}
|
|
221
155
|
},
|
|
222
156
|
_transitionGroup: {
|
|
223
157
|
name: _,
|
|
224
|
-
classes:
|
|
225
|
-
moveClass:
|
|
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
|
|
178
|
+
function V(t) {
|
|
245
179
|
return { ...t };
|
|
246
180
|
}
|
|
247
|
-
|
|
248
|
-
function
|
|
249
|
-
if (!
|
|
181
|
+
var v = null;
|
|
182
|
+
function q() {
|
|
183
|
+
if (!v) {
|
|
250
184
|
if (typeof CSSStyleSheet > "u")
|
|
251
|
-
return
|
|
185
|
+
return v = {
|
|
252
186
|
cssRules: [],
|
|
253
187
|
replaceSync: () => {
|
|
254
188
|
},
|
|
255
189
|
toString: () => ""
|
|
256
|
-
},
|
|
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
|
|
195
|
+
const i = O(`<div class="${t.join(" ")}"></div>`);
|
|
262
196
|
try {
|
|
263
|
-
|
|
197
|
+
v = new CSSStyleSheet(), v.replaceSync(i);
|
|
264
198
|
} catch {
|
|
265
|
-
|
|
199
|
+
v = {
|
|
266
200
|
cssRules: [],
|
|
267
201
|
replaceSync: () => {
|
|
268
202
|
},
|
|
269
|
-
toString: () =>
|
|
203
|
+
toString: () => i || ""
|
|
270
204
|
};
|
|
271
205
|
}
|
|
272
206
|
}
|
|
273
|
-
return
|
|
207
|
+
return v;
|
|
274
208
|
}
|
|
275
209
|
export {
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
210
|
+
I as Transition,
|
|
211
|
+
J as TransitionGroup,
|
|
212
|
+
V as createTransitionPreset,
|
|
213
|
+
q as getTransitionStyleSheet,
|
|
280
214
|
F as transitionPresets
|
|
281
215
|
};
|
|
282
|
-
|
|
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
|
-
|
|
2
|
-
|
|
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
|