@pyreon/kinetic 0.25.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index2.d.ts","names":[],"sources":["../../src/types.ts","../../src/kinetic/types.ts","../../src/kinetic.ts","../../src/presets.ts","../../src/useAnimationEnd.ts","../../src/useTransitionState.ts"],"mappings":"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"}
package/lib/index.js CHANGED
@@ -228,11 +228,16 @@ const useTransitionState = ({ show, appear = false }) => {
228
228
 
229
229
  //#endregion
230
230
  //#region src/utils.ts
231
+ const SPLIT_CACHE_MAX = 128;
231
232
  const splitCache = /* @__PURE__ */ new Map();
232
233
  const splitClasses = (classes) => {
233
234
  let cached = splitCache.get(classes);
234
235
  if (!cached) {
235
236
  cached = classes.split(/\s+/).filter(Boolean);
237
+ if (splitCache.size >= SPLIT_CACHE_MAX) {
238
+ const oldest = splitCache.keys().next().value;
239
+ if (oldest !== void 0) splitCache.delete(oldest);
240
+ }
236
241
  splitCache.set(classes, cached);
237
242
  }
238
243
  return cached;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["applyEnter","applyLeave","applyReducedMotion","isVNode"],"sources":["../src/useAnimationEnd.ts","../src/useReducedMotion.ts","../src/kinetic/CollapseRenderer.tsx","../src/useTransitionState.ts","../src/utils.ts","../src/kinetic/TransitionItem.tsx","../src/kinetic/GroupRenderer.tsx","../src/kinetic/StaggerRenderer.tsx","../src/kinetic/TransitionRenderer.tsx","../src/kinetic/createKineticComponent.tsx","../src/kinetic.ts","../src/presets.ts"],"sourcesContent":["import type { Ref } from '@pyreon/core'\nimport { watch } from '@pyreon/reactivity'\n\nconst DEFAULT_TIMEOUT = 5000\n\nexport type UseAnimationEnd = (options: {\n ref: Ref<HTMLElement>\n onEnd: () => void\n active: () => boolean\n timeout?: number | undefined\n}) => void\n\nconst useAnimationEnd: UseAnimationEnd = ({ ref, onEnd, active, timeout = DEFAULT_TIMEOUT }) => {\n let called = false\n\n watch(\n active,\n (isActive) => {\n if (!isActive) {\n called = false\n return\n }\n\n const el = ref.current\n if (!el) return\n\n called = false\n\n const done = () => {\n if (called) return\n called = true\n el.removeEventListener('transitionend', handleEnd)\n el.removeEventListener('animationend', handleEnd)\n clearTimeout(timer)\n onEnd()\n }\n\n const handleEnd = (e: Event) => {\n // Ignore bubbled events from children\n if (e.target !== el) return\n done()\n }\n\n el.addEventListener('transitionend', handleEnd)\n el.addEventListener('animationend', handleEnd)\n\n const timer = setTimeout(done, timeout)\n\n return () => {\n el.removeEventListener('transitionend', handleEnd)\n el.removeEventListener('animationend', handleEnd)\n clearTimeout(timer)\n }\n },\n { immediate: true },\n )\n}\n\nexport default useAnimationEnd\n","import { onMount, onUnmount } from '@pyreon/core'\nimport { signal } from '@pyreon/reactivity'\n\n/**\n * Inline reduced-motion check for kinetic package.\n * Avoids depending on @pyreon/hooks for a single media query.\n */\nexport function useReducedMotion(): () => boolean {\n const matches = signal(false)\n let mql: MediaQueryList | undefined\n\n const onChange = (e: MediaQueryListEvent) => {\n matches.set(e.matches)\n }\n\n onMount(() => {\n mql = window.matchMedia('(prefers-reduced-motion: reduce)')\n matches.set(mql.matches)\n mql.addEventListener('change', onChange)\n return undefined\n })\n\n onUnmount(() => {\n mql?.removeEventListener('change', onChange)\n })\n\n return matches\n}\n","import type { VNode } from '@pyreon/core'\nimport { createRef, h, mergeProps, Show } from '@pyreon/core'\nimport { runUntracked, signal, watch } from '@pyreon/reactivity'\nimport type { CSSProperties, TransitionCallbacks, TransitionStage } from '../types'\nimport useAnimationEnd from '../useAnimationEnd'\nimport { useReducedMotion } from '../useReducedMotion'\nimport type { KineticConfig } from './types'\n\ntype CollapseRendererProps = {\n config: KineticConfig\n htmlProps: Record<string, unknown>\n show: () => boolean\n appear?: boolean | undefined\n timeout?: number | undefined\n transition?: string | undefined\n callbacks: Partial<TransitionCallbacks>\n children: VNode | VNode[]\n}\n\n/**\n * Renders a height-animated collapse. The config.tag becomes the outer\n * wrapper (overflow:hidden + animated height). An inner div measures\n * scrollHeight for the target value.\n */\nconst CollapseRenderer = ({\n config,\n htmlProps,\n show,\n appear,\n timeout,\n transition,\n callbacks,\n children,\n}: CollapseRendererProps): VNode | null => {\n const reducedMotion = useReducedMotion()\n let wrapperRef: { current: HTMLElement | null } = createRef<HTMLElement>()\n const contentRef = createRef<HTMLDivElement>()\n\n const effectiveAppear = appear ?? config.appear ?? false\n const effectiveTimeout = timeout ?? config.timeout ?? 5000\n const effectiveTransition = transition ?? config.transition ?? 'height 300ms ease'\n\n const initialShow = show()\n const needsAppear = effectiveAppear && initialShow\n const stage = signal<TransitionStage>(initialShow ? 'entered' : 'hidden')\n let isInitialMount = true\n let appearTriggered = false\n\n // Intercept ref assignment to trigger appear after all refs are wired\n if (needsAppear) {\n const orig = wrapperRef\n const proxy = { current: null as HTMLElement | null }\n Object.defineProperty(proxy, 'current', {\n get() {\n return orig.current\n },\n set(node: HTMLElement | null) {\n orig.current = node\n if (node && !appearTriggered) {\n appearTriggered = true\n queueMicrotask(() => stage.set('entering'))\n }\n },\n })\n wrapperRef = proxy\n }\n\n // State machine transitions\n watch(\n show,\n (showVal) => {\n if (isInitialMount) {\n isInitialMount = false\n // appear case is handled by ref proxy above\n return\n }\n\n const currentStage = runUntracked(() => stage())\n if (showVal && (currentStage === 'hidden' || currentStage === 'leaving')) {\n stage.set('entering')\n } else if (!showVal && (currentStage === 'entered' || currentStage === 'entering')) {\n stage.set('leaving')\n }\n },\n { immediate: true },\n )\n\n // Animate height\n watch(\n () => stage(),\n (currentStage) => {\n const wrapper = wrapperRef.current\n const content = contentRef.current\n if (!wrapper || !content) return\n\n if (reducedMotion()) {\n if (currentStage === 'entering') {\n callbacks.onEnter?.()\n wrapper.style.height = 'auto'\n wrapper.style.overflow = ''\n callbacks.onAfterEnter?.()\n stage.set('entered')\n } else if (currentStage === 'leaving') {\n callbacks.onLeave?.()\n wrapper.style.height = '0px'\n wrapper.style.overflow = 'hidden'\n callbacks.onAfterLeave?.()\n stage.set('hidden')\n }\n return\n }\n\n if (currentStage === 'entering') {\n callbacks.onEnter?.()\n const height = content.scrollHeight\n wrapper.style.transition = 'none'\n wrapper.style.height = '0px'\n wrapper.style.overflow = 'hidden'\n // Force reflow\n void wrapper.offsetHeight\n wrapper.style.transition = effectiveTransition\n wrapper.style.height = `${height}px`\n }\n\n if (currentStage === 'leaving') {\n callbacks.onLeave?.()\n const height = content.scrollHeight\n wrapper.style.transition = 'none'\n wrapper.style.height = `${height}px`\n wrapper.style.overflow = 'hidden'\n // Force reflow\n void wrapper.offsetHeight\n wrapper.style.transition = effectiveTransition\n wrapper.style.height = '0px'\n }\n },\n { immediate: true },\n )\n\n useAnimationEnd({\n ref: wrapperRef,\n active: () => (stage() === 'entering' || stage() === 'leaving') && !reducedMotion(),\n timeout: effectiveTimeout,\n onEnd: () => {\n const wrapper = wrapperRef.current\n if (stage() === 'entering') {\n if (wrapper) {\n wrapper.style.height = 'auto'\n wrapper.style.overflow = ''\n wrapper.style.transition = ''\n }\n callbacks.onAfterEnter?.()\n stage.set('entered')\n } else if (stage() === 'leaving') {\n callbacks.onAfterLeave?.()\n stage.set('hidden')\n }\n },\n })\n\n const shouldRender = () => stage() !== 'hidden'\n\n const wrapperStyle: CSSProperties = {\n ...((htmlProps.style as CSSProperties) ?? {}),\n ...(stage() !== 'entered' ? { overflow: 'hidden' } : {}),\n ...(stage() === 'hidden' ? { height: '0px' } : stage() === 'entered' ? { height: 'auto' } : {}),\n }\n\n // Initially-visible Collapses keep the original Show-gated inner content,\n // preserving the runtime-unmount semantic that frees the inner subtree\n // when the collapse is closed long-term. The SSR bug fires only when\n // `show: () => false` at setup — the outer wrapper renders (with\n // `height: 0; overflow: hidden`) but its children are stripped by the\n // inner `<Show when={false}>` → empty wrapper in the prerendered HTML.\n // Bad for SEO / social scrapers / accessibility / no-JS.\n //\n // Mirrors the fix shape applied to `<Transition>`,\n // `TransitionRenderer`, and `TransitionItem`. Ecosystem norm:\n // content is structural, animation is visual.\n //\n // For initially-hidden Collapses, the inner content always renders —\n // the outer wrapper's `height: 0px; overflow: hidden` already provides\n // the visual hiding (genuinely layout-safe — no flex slot collapse;\n // the outer wrapper participates in flex as a 0-height box, which is\n // the standard CSS collapse behavior). When `show` flips true, the\n // existing `watch(stage)` measures `content.scrollHeight` and animates\n // height from 0 → that value — no change to the animation path.\n //\n // Trade-off: for initially-hidden Collapses, the inner subtree is\n // ALWAYS mounted (never unmounted after a later close). Initially-\n // visible Collapses keep the unmount behavior. Matches the trade-off\n // documented across the other three kinetic renderers.\n const wasInitiallyShown = show()\n const innerContent = wasInitiallyShown ? (\n <Show when={shouldRender}>\n <div ref={contentRef}>{children}</div>\n </Show>\n ) : (\n <div ref={contentRef}>{children}</div>\n )\n\n // mergeProps (descriptor-preserving) instead of `{ ...htmlProps }` —\n // every non-style HTML attr keeps its reactive getter; ref + the\n // collapse-controlled style come last so they win (mergeProps is\n // last-source-wins). The one-time `htmlProps.style` read above that\n // seeds wrapperStyle is intentional: collapse OWNS the style prop\n // (height/overflow are animation-driven), so a static merge of the\n // user's initial style with the collapse overrides is correct here.\n return h(\n config.tag,\n mergeProps(htmlProps, { ref: wrapperRef, style: wrapperStyle }),\n innerContent,\n )\n}\n\nexport default CollapseRenderer\n","import { createRef } from '@pyreon/core'\nimport { runUntracked, signal, watch } from '@pyreon/reactivity'\nimport type { TransitionStage, TransitionStateResult } from './types'\n\nexport type UseTransitionState = (options: {\n show: () => boolean\n appear?: boolean | undefined\n}) => TransitionStateResult\n\nconst useTransitionState: UseTransitionState = ({ show, appear = false }) => {\n const initialShow = show()\n // When appear=true and show starts true, mount the element (stage='entered')\n // but defer the enter animation until the ref is connected.\n const needsAppear = appear && initialShow\n const stage = signal<TransitionStage>(initialShow ? 'entered' : 'hidden')\n const elementRef = createRef<HTMLElement>()\n let isInitialMount = true\n let appearTriggered = false\n\n // Ref callback that triggers the appear animation once the element is wired\n const refCallback = (node: HTMLElement | null) => {\n elementRef.current = node\n if (node && needsAppear && !appearTriggered) {\n appearTriggered = true\n stage.set('entering')\n }\n }\n\n watch(\n show,\n (showVal) => {\n if (isInitialMount) {\n isInitialMount = false\n // appear case is handled by refCallback above\n return\n }\n\n const currentStage = runUntracked(() => stage())\n if (showVal && (currentStage === 'hidden' || currentStage === 'leaving')) {\n stage.set('entering')\n } else if (!showVal && (currentStage === 'entered' || currentStage === 'entering')) {\n stage.set('leaving')\n }\n },\n { immediate: true },\n )\n\n const complete = () => {\n const current = stage()\n if (current === 'entering') stage.set('entered')\n if (current === 'leaving') stage.set('hidden')\n }\n\n return {\n stage,\n ref: refCallback,\n shouldMount: () => stage() !== 'hidden',\n complete,\n }\n}\n\nexport default useTransitionState\n","import type { Ref, VNode } from '@pyreon/core'\nimport type { CSSProperties } from './types'\n\n// LRU-bounded class-string split cache. Class C leak prevention: the\n// pre-#PR shape was an unbounded Map keyed by className strings — every\n// unique input held a parsed result forever. Real-app inputs are\n// finite (user-config kinetic classes are stable per definition), but\n// HMR cycles, dynamic theme generation, and A/B-tested variants can\n// produce unbounded growth. Cap matches @pyreon/styler's classCache.\nconst SPLIT_CACHE_MAX = 128\nconst splitCache = new Map<string, string[]>()\nconst splitClasses = (classes: string): string[] => {\n let cached = splitCache.get(classes)\n if (!cached) {\n cached = classes.split(/\\s+/).filter(Boolean)\n if (splitCache.size >= SPLIT_CACHE_MAX) {\n // Map iteration order = insertion order; first key = oldest.\n const oldest = splitCache.keys().next().value\n if (oldest !== undefined) splitCache.delete(oldest)\n }\n splitCache.set(classes, cached)\n }\n return cached\n}\n\n/** Adds space-separated CSS classes to an element. */\nexport const addClasses = (el: HTMLElement, classes: string | undefined) => {\n if (!classes) return\n const list = splitClasses(classes)\n if (list.length > 0) el.classList.add(...list)\n}\n\n/** Removes space-separated CSS classes from an element. */\nexport const removeClasses = (el: HTMLElement, classes: string | undefined) => {\n if (!classes) return\n const list = splitClasses(classes)\n if (list.length > 0) el.classList.remove(...list)\n}\n\n/**\n * Executes callback after two animation frames (double-rAF).\n * Ensures the browser paints the current state before applying changes,\n * which is required for CSS transitions to trigger. Returns 0 on SSR —\n * the typeof-window guard makes the SSR-safety contract explicit (callers\n * are always browser-only via `onMount`, but the rule can't AST-trace it).\n */\nexport const nextFrame = (callback: () => void): number => {\n if (typeof requestAnimationFrame === 'undefined') return 0\n return requestAnimationFrame(() => {\n requestAnimationFrame(callback)\n })\n}\n\n/** Merges two className strings, filtering undefined/empty. */\nexport const mergeClassNames = (\n existing: string | undefined,\n additional: string | undefined,\n): string | undefined => {\n const parts = [existing, additional].filter(Boolean)\n return parts.length > 0 ? parts.join(' ') : undefined\n}\n\n/** Merges two CSSProperties objects, with `b` taking precedence. */\nexport const mergeStyles = (\n a: CSSProperties | undefined,\n b: CSSProperties | undefined,\n): CSSProperties | undefined => {\n if (!a && !b) return undefined\n if (!a) return b\n if (!b) return a\n return { ...a, ...b }\n}\n\n// ─── Ref & Motion Utilities ─────────────────────────────────\n\ntype RefCallback<T> = (node: T | null) => void\ntype RefLike<T> = RefCallback<T> | Ref<T>\n\n/** Merges multiple refs (callback or object) into a single callback ref. */\nexport const mergeRefs = <T>(...refs: (RefLike<T> | undefined)[]): ((node: T | null) => void) => {\n return (node: T | null) => {\n for (const ref of refs) {\n if (!ref) continue\n if (typeof ref === 'function') {\n ref(node)\n } else {\n ;(ref as { current: unknown }).current = node\n }\n }\n }\n}\n\n/** Clones a VNode with merged props. */\nexport const cloneVNode = (vnode: VNode, extraProps: Record<string, unknown>): VNode => ({\n ...vnode,\n props: { ...vnode.props, ...extraProps },\n})\n\n/**\n * Resolves a `children` value the Pyreon compiler may have wrapped in a\n * deferred accessor.\n *\n * **Why:** the compiler's prop-inlining pass rewrites `<Comp>{children}</Comp>`\n * to `Comp({ ..., children: () => <inlined-expression> })` whenever\n * `children` is a local `const` derived from a getter-shaped binding\n * (`const children = childHolder.children` after `splitProps`). DOM-side\n * consumers route through `mountChild` which already treats function\n * children as reactive accessors, so the wrap is invisible there. Kinetic's\n * Stagger/Group/Transition/Collapse renderers iterate `children` directly\n * at the VNode level (to build per-child `TransitionItem`s), so a wrapped\n * function landed in `Array.isArray(children) ? children : [children]` as\n * `[function]` → `.filter(isVNode)` → `[]` → the rendered `<div>` had zero\n * children → SSR content vanished post-hydration. Reproducer:\n * `examples/bokisch.com`'s Intro section with `kinetic('div').stagger()`\n * + `appear` + `show={() => true}` + component children → SSG HTML had\n * `<h1>Hello</h1>`, post-hydrate the entire subtree was replaced by\n * `<!--pyreon-->` markers.\n *\n * Kinetic deliberately snapshots children at render time (animation state\n * is per-item, built once) — it does NOT observe children changes after\n * the initial render. Eagerly unwrapping the function matches that\n * contract; no reactivity is lost.\n */\nexport const resolveChildren = <T>(children: T | (() => T)): T =>\n (typeof children === 'function' ? (children as () => T)() : children) as T\n","import type { VNode } from '@pyreon/core'\nimport { createRef, cx, Show } from '@pyreon/core'\nimport { watch } from '@pyreon/reactivity'\nimport type { ClassTransitionProps, StyleTransitionProps, TransitionCallbacks } from '../types'\nimport useAnimationEnd from '../useAnimationEnd'\nimport { useReducedMotion } from '../useReducedMotion'\nimport useTransitionState from '../useTransitionState'\nimport {\n addClasses,\n cloneVNode,\n mergeRefs,\n mergeStyles,\n nextFrame,\n removeClasses,\n resolveChildren,\n} from '../utils'\n\ntype TransitionItemProps = ClassTransitionProps &\n StyleTransitionProps &\n TransitionCallbacks & {\n show: () => boolean\n appear?: boolean | undefined\n unmount?: boolean | undefined\n timeout?: number | undefined\n delay?: number | undefined\n children: VNode\n }\n\nconst applyEnter = (el: HTMLElement, config: ClassTransitionProps & StyleTransitionProps) => {\n // Symmetric to applyLeave: clear residual leave-cycle classes — including\n // the `leaveTo`/`enterFrom` class the SSR/initially-hidden render path\n // inlines (see the `wasInitiallyShown` branch below). Without this, the\n // SSR-baked hidden class would compete with `enterTo`'s CSS rules.\n removeClasses(el, config.leave)\n removeClasses(el, config.leaveFrom)\n removeClasses(el, config.leaveTo)\n\n addClasses(el, config.enter)\n addClasses(el, config.enterFrom)\n if (config.enterStyle) Object.assign(el.style, config.enterStyle)\n if (config.enterTransition) el.style.transition = config.enterTransition\n\n return nextFrame(() => {\n removeClasses(el, config.enterFrom)\n addClasses(el, config.enterTo)\n if (config.enterToStyle) Object.assign(el.style, config.enterToStyle)\n })\n}\n\nconst applyLeave = (el: HTMLElement, config: ClassTransitionProps & StyleTransitionProps) => {\n removeClasses(el, config.enter)\n removeClasses(el, config.enterTo)\n\n addClasses(el, config.leave)\n addClasses(el, config.leaveFrom)\n if (config.leaveStyle) Object.assign(el.style, config.leaveStyle)\n if (config.leaveTransition) el.style.transition = config.leaveTransition\n\n return nextFrame(() => {\n removeClasses(el, config.leaveFrom)\n addClasses(el, config.leaveTo)\n if (config.leaveToStyle) Object.assign(el.style, config.leaveToStyle)\n })\n}\n\nconst applyReducedMotion = (\n stage: string,\n callbacks: Partial<TransitionCallbacks>,\n complete: () => void,\n) => {\n if (stage === 'entering') {\n callbacks.onEnter?.()\n callbacks.onAfterEnter?.()\n complete()\n } else if (stage === 'leaving') {\n callbacks.onLeave?.()\n callbacks.onAfterLeave?.()\n complete()\n }\n}\n\n/**\n * Internal per-child transition component. Used by StaggerRenderer and\n * GroupRenderer to give each child its own animation state.\n *\n * Uses cloneVNode to inject ref onto the child — the child must accept ref.\n */\nconst TransitionItem = (props: TransitionItemProps): VNode | null => {\n // The Pyreon compiler wraps `{cloneVNode(child, {...})}` JSX child\n // expressions in StaggerRenderer/GroupRenderer as `() => cloneVNode(...)`\n // (prop-inlining for reactivity — see `resolveChildren` jsdoc). At this\n // boundary `props.children` therefore arrives as a FUNCTION instead of a\n // VNode. cloneVNode-on-a-function silently produces `{type: undefined,\n // props: {ref: ...}}` (spreading a function yields no own properties\n // because functions have none enumerable), which mountElement renders\n // as a literal `<undefined>` tag in the DOM — the SSG'd `<h1>Hello</h1>`\n // becomes an empty `<undefined></undefined>` post-hydrate (reproducer:\n // bokisch.com Intro section). Resolve eagerly so the entire body below\n // can treat `child` as a static VNode.\n const child = resolveChildren(props.children) as VNode\n const appear = props.appear ?? false\n const unmount = props.unmount ?? true\n const timeout = props.timeout ?? 5000\n const reducedMotion = useReducedMotion()\n const { stage, ref: stateRef, shouldMount, complete } = useTransitionState({\n show: props.show,\n appear,\n })\n\n const elementRef = createRef<HTMLElement>()\n const mergedRef = mergeRefs(\n elementRef,\n stateRef,\n (child?.props as Record<string, unknown>)?.ref as\n | ((el: HTMLElement | null) => void)\n | undefined,\n )\n\n const callbacks = {\n onEnter: props.onEnter,\n onAfterEnter: props.onAfterEnter,\n onLeave: props.onLeave,\n onAfterLeave: props.onAfterLeave,\n }\n\n const transitionConfig = {\n enter: props.enter,\n enterFrom: props.enterFrom,\n enterTo: props.enterTo,\n leave: props.leave,\n leaveFrom: props.leaveFrom,\n leaveTo: props.leaveTo,\n enterStyle: props.enterStyle,\n enterToStyle: props.enterToStyle,\n enterTransition: props.enterTransition,\n leaveStyle: props.leaveStyle,\n leaveToStyle: props.leaveToStyle,\n leaveTransition: props.leaveTransition,\n }\n\n useAnimationEnd({\n ref: elementRef,\n active: () => (stage() === 'entering' || stage() === 'leaving') && !reducedMotion(),\n timeout,\n onEnd: () => {\n if (stage() === 'entering') {\n callbacks.onAfterEnter?.()\n } else if (stage() === 'leaving') {\n callbacks.onAfterLeave?.()\n }\n complete()\n },\n })\n\n watch(\n () => stage(),\n (currentStage) => {\n const el = elementRef.current\n if (!el) return\n\n if (reducedMotion()) {\n applyReducedMotion(currentStage, callbacks, complete)\n return\n }\n\n if (currentStage === 'entering') {\n callbacks.onEnter?.()\n const frameId = applyEnter(el, transitionConfig)\n return () => cancelAnimationFrame(frameId)\n }\n\n if (currentStage === 'leaving') {\n callbacks.onLeave?.()\n const frameId = applyLeave(el, transitionConfig)\n return () => cancelAnimationFrame(frameId)\n }\n\n if (currentStage === 'entered') {\n removeClasses(el, props.enter)\n el.style.transition = ''\n }\n },\n { immediate: true },\n )\n\n // Initially-visible items keep the original Show-gated mount, preserving\n // the documented runtime-unmount semantic for visible→hidden. The SSR\n // bug (children dropped from prerendered HTML) only fires for the\n // initially-HIDDEN case below, where `<Show when={false}>` renders `null`\n // on the server. For Stagger/Group usage at SSR (when the parent's\n // `show: () => false`), each per-item TransitionItem hit this and\n // dropped its child — full list missing from prerendered HTML.\n //\n // Mirrors the fix in `<Transition>` and `TransitionRenderer`.\n // Ecosystem norm: content is structural, animation is visual.\n const wasInitiallyShown = props.show()\n if (wasInitiallyShown) {\n return (\n <Show\n when={shouldMount}\n fallback={\n unmount\n ? null\n : cloneVNode(child, {\n ref: mergedRef,\n style: mergeStyles(\n (child?.props as Record<string, unknown>)?.style as\n | Record<string, string | number | undefined>\n | undefined,\n { display: 'none' },\n ),\n })\n }\n >\n {cloneVNode(child, { ref: mergedRef })}\n </Show>\n )\n }\n\n // Initially-hidden path — always emit the child with hidden-state class +\n // style inlined. `leaveTo`/`leaveToStyle` (explicit hidden-end state)\n // wins; falls back to `enterFrom`/`enterStyle` (pre-enter state — covers\n // both class-based scroll-reveal AND the preset path, where\n // `@pyreon/kinetic-presets` factories populate `enterStyle` as the\n // hidden state but may not set `leaveToStyle`).\n //\n // Trade-off: for an initially-hidden item, `unmount: true` no longer\n // triggers a true DOM removal after a later leave animation completes.\n // Initially-visible items keep the unmount semantic.\n const hiddenClass = props.leaveTo ?? props.enterFrom\n const hiddenStyle = props.leaveToStyle ?? props.enterStyle\n const childProps = (child?.props ?? {}) as Record<string, unknown>\n const childClass = childProps.class\n const mergedClass = hiddenClass\n ? cx([childClass as Parameters<typeof cx>[0], hiddenClass])\n : undefined\n const mergedStyle = mergeStyles(\n childProps.style as Record<string, string | number | undefined> | undefined,\n hiddenStyle,\n )\n\n const extra: Record<string, unknown> = { ref: mergedRef }\n if (mergedClass !== undefined) extra.class = mergedClass\n if (mergedStyle !== undefined) extra.style = mergedStyle\n\n return cloneVNode(child, extra)\n}\n\nexport default TransitionItem\n","import type { VNode } from '@pyreon/core'\nimport { h } from '@pyreon/core'\nimport { signal } from '@pyreon/reactivity'\nimport type { TransitionCallbacks } from '../types'\nimport TransitionItem from './TransitionItem'\nimport type { KineticConfig } from './types'\n\ntype GroupRendererProps = {\n config: KineticConfig\n htmlProps: Record<string, unknown>\n appear?: boolean | undefined\n timeout?: number | undefined\n callbacks: Partial<TransitionCallbacks>\n /**\n * Children can be a static array OR a reactive accessor `() => VNode[]`.\n * When passed as an accessor, GroupRenderer tracks changes and\n * animates entering/leaving children automatically.\n */\n children: VNode[] | (() => VNode[])\n}\n\ntype KeyedChild = { key: string | number; element: VNode }\n\nconst isVNode = (child: unknown): child is VNode =>\n child != null && typeof child === 'object' && 'type' in (child as object)\n\nconst getKeyedChildren = (children: VNode[]): KeyedChild[] => {\n const result: KeyedChild[] = []\n for (const child of children) {\n if (isVNode(child)) {\n const key = (child as VNode & { key?: string | number }).key\n if (key != null) {\n result.push({ key, element: child })\n }\n }\n }\n return result\n}\n\n/**\n * Renders children with key-based enter/exit animation (no `show` prop).\n * Children that appear (new key) animate in. Children that disappear\n * (removed key) stay in DOM during leave animation, then unmount.\n * config.tag wraps all children as a container element.\n *\n * In Pyreon, components run once. Pass children as a reactive accessor\n * `() => VNode[]` for the group to detect changes and animate entries/exits.\n */\nconst GroupRenderer = ({\n config,\n htmlProps,\n appear,\n timeout,\n callbacks,\n children,\n}: GroupRendererProps): VNode | null => {\n const effectiveAppear = appear ?? config.appear ?? false\n const effectiveTimeout = timeout ?? config.timeout ?? 5000\n\n const prevMap = new Map<string | number, VNode>()\n const leavingMap = new Map<string | number, VNode>()\n const forceUpdate = signal(0)\n\n // Normalize children to an accessor\n const getChildren = typeof children === 'function' ? (children as () => VNode[]) : () => children\n\n // Track initial keys for appear animation logic\n const initialKeyed = getKeyedChildren(getChildren())\n const initialKeys = new Set(initialKeyed.map((c) => c.key))\n for (const { key, element } of initialKeyed) {\n prevMap.set(key, element)\n }\n\n const handleAfterLeave = (key: string | number) => {\n leavingMap.delete(key)\n callbacks.onAfterLeave?.()\n forceUpdate.update((c) => c + 1)\n }\n\n // Reactive accessor — re-evaluates when children() or forceUpdate changes\n return (() => {\n forceUpdate()\n\n const currentChildren = getChildren()\n const currentKeyed = getKeyedChildren(currentChildren)\n const currentMap = new Map<string | number, VNode>()\n for (const { key, element } of currentKeyed) {\n currentMap.set(key, element)\n }\n\n // Detect leaving children\n for (const [key, child] of prevMap) {\n if (!currentMap.has(key) && !leavingMap.has(key)) {\n leavingMap.set(key, child)\n }\n }\n\n // Cancel leave if child reappears\n for (const key of currentMap.keys()) {\n leavingMap.delete(key)\n }\n\n // Update prev for next diff\n prevMap.clear()\n for (const [key, element] of currentMap) {\n prevMap.set(key, element)\n }\n\n // Merge current + leaving\n const allEntries: KeyedChild[] = [...currentKeyed]\n for (const [key, element] of leavingMap) {\n allEntries.push({ key, element })\n }\n\n const groupedChildren = allEntries.map(({ key, element }) => {\n const isInitial = initialKeys.has(key)\n const isShowing = currentMap.has(key)\n\n return (\n <TransitionItem\n show={() => isShowing}\n appear={isInitial ? effectiveAppear : true}\n timeout={effectiveTimeout}\n enterStyle={config.enterStyle}\n enterToStyle={config.enterToStyle}\n enterTransition={config.enterTransition}\n leaveStyle={config.leaveStyle}\n leaveToStyle={config.leaveToStyle}\n leaveTransition={config.leaveTransition}\n enter={config.enter}\n enterFrom={config.enterFrom}\n enterTo={config.enterTo}\n leave={config.leave}\n leaveFrom={config.leaveFrom}\n leaveTo={config.leaveTo}\n onAfterLeave={() => handleAfterLeave(key)}\n >\n {element}\n </TransitionItem>\n )\n })\n\n // By reference — `{ ...htmlProps }` would value-copy and freeze any\n // reactive HTML attr the kinetic split preserved as a getter.\n return h(config.tag, htmlProps, ...groupedChildren)\n }) as unknown as VNode\n}\n\nexport default GroupRenderer\n","import type { VNode } from '@pyreon/core'\nimport { h } from '@pyreon/core'\nimport type { CSSProperties, TransitionCallbacks } from '../types'\nimport { cloneVNode, resolveChildren } from '../utils'\nimport TransitionItem from './TransitionItem'\nimport type { KineticConfig } from './types'\n\ntype StaggerRendererProps = {\n config: KineticConfig\n htmlProps: Record<string, unknown>\n show: () => boolean\n appear?: boolean | undefined\n timeout?: number | undefined\n interval?: number | undefined\n reverseLeave?: boolean | undefined\n callbacks: Partial<TransitionCallbacks>\n children: VNode[]\n}\n\nconst isVNode = (child: unknown): child is VNode =>\n child != null && typeof child === 'object' && 'type' in (child as object)\n\n/**\n * Renders children with staggered enter/exit animation.\n * config.tag wraps the staggered children as a container element.\n * Each child is individually animated via TransitionItem.\n */\nconst StaggerRenderer = ({\n config,\n htmlProps,\n show,\n appear,\n timeout,\n interval,\n reverseLeave,\n callbacks,\n children,\n}: StaggerRendererProps): VNode | null => {\n const effectiveAppear = appear ?? config.appear ?? false\n const effectiveTimeout = timeout ?? config.timeout ?? 5000\n const effectiveInterval = interval ?? config.interval ?? 50\n const effectiveReverseLeave = reverseLeave ?? config.reverseLeave ?? false\n\n // Unwrap compiler-emitted accessor wrap — see `resolveChildren` jsdoc.\n const resolved = resolveChildren(children)\n const childArray = (Array.isArray(resolved) ? resolved : [resolved]).filter(isVNode)\n const count = childArray.length\n\n const staggeredChildren = childArray.map((child, index) => {\n const staggerIndex = !show() && effectiveReverseLeave ? count - 1 - index : index\n const delay = staggerIndex * effectiveInterval\n\n return (\n <TransitionItem\n key={(child as VNode & { key?: string | number }).key ?? index}\n show={show}\n appear={effectiveAppear}\n timeout={effectiveTimeout + delay}\n enterStyle={config.enterStyle}\n enterToStyle={config.enterToStyle}\n enterTransition={config.enterTransition}\n leaveStyle={config.leaveStyle}\n leaveToStyle={config.leaveToStyle}\n leaveTransition={config.leaveTransition}\n enter={config.enter}\n enterFrom={config.enterFrom}\n enterTo={config.enterTo}\n leave={config.leave}\n leaveFrom={config.leaveFrom}\n leaveTo={config.leaveTo}\n onAfterLeave={\n index === (effectiveReverseLeave ? 0 : count - 1) ? callbacks.onAfterLeave : undefined\n }\n >\n {cloneVNode(child, {\n style: {\n ...((child.props as Record<string, unknown>)?.style as CSSProperties | undefined),\n '--stagger-index': staggerIndex,\n '--stagger-interval': `${effectiveInterval}ms`,\n transitionDelay: `${delay}ms`,\n } as CSSProperties,\n })}\n </TransitionItem>\n )\n })\n\n // Pass htmlProps by reference — `{ ...htmlProps }` value-copies, firing\n // any reactive getter the kinetic split preserved (frozen attr forever).\n // runtime-dom's applyProps detects the getter descriptor on the live\n // object and wraps it in renderEffect.\n return h(config.tag, htmlProps, ...staggeredChildren)\n}\n\nexport default StaggerRenderer\n","import type { VNode } from '@pyreon/core'\nimport { createRef, cx, h, mergeProps, Show } from '@pyreon/core'\nimport { watch } from '@pyreon/reactivity'\nimport type { CSSProperties, TransitionCallbacks } from '../types'\nimport useAnimationEnd from '../useAnimationEnd'\nimport { useReducedMotion } from '../useReducedMotion'\nimport useTransitionState from '../useTransitionState'\nimport { addClasses, mergeRefs, nextFrame, removeClasses } from '../utils'\nimport type { KineticConfig } from './types'\n\ntype TransitionRendererProps = {\n config: KineticConfig\n htmlProps: Record<string, unknown>\n show: () => boolean\n appear?: boolean | undefined\n unmount?: boolean | undefined\n timeout?: number | undefined\n callbacks: Partial<TransitionCallbacks>\n children: VNode | VNode[]\n}\n\nconst applyEnter = (el: HTMLElement, config: KineticConfig) => {\n // Symmetric to applyLeave's `removeClasses(enter)` / `removeClasses(enterTo)`:\n // clear residual leave-cycle classes — including the `leaveTo` / `enterFrom`\n // class the SSR / initially-hidden render path inlines for structural\n // content (see the `wasInitiallyShown` branch below). Without this, the\n // SSR-baked hidden-state class would compete with `enterTo`'s CSS rules.\n removeClasses(el, config.leave)\n removeClasses(el, config.leaveFrom)\n removeClasses(el, config.leaveTo)\n\n addClasses(el, config.enter)\n addClasses(el, config.enterFrom)\n if (config.enterStyle) Object.assign(el.style, config.enterStyle)\n if (config.enterTransition) el.style.transition = config.enterTransition\n\n return nextFrame(() => {\n removeClasses(el, config.enterFrom)\n addClasses(el, config.enterTo)\n if (config.enterToStyle) Object.assign(el.style, config.enterToStyle)\n })\n}\n\nconst applyLeave = (el: HTMLElement, config: KineticConfig) => {\n removeClasses(el, config.enter)\n removeClasses(el, config.enterTo)\n\n addClasses(el, config.leave)\n addClasses(el, config.leaveFrom)\n if (config.leaveStyle) Object.assign(el.style, config.leaveStyle)\n if (config.leaveTransition) el.style.transition = config.leaveTransition\n\n return nextFrame(() => {\n removeClasses(el, config.leaveFrom)\n addClasses(el, config.leaveTo)\n if (config.leaveToStyle) Object.assign(el.style, config.leaveToStyle)\n })\n}\n\nconst applyReducedMotion = (\n stage: string,\n cbs: Partial<TransitionCallbacks>,\n complete: () => void,\n) => {\n if (stage === 'entering') {\n cbs.onEnter?.()\n cbs.onAfterEnter?.()\n complete()\n } else if (stage === 'leaving') {\n cbs.onLeave?.()\n cbs.onAfterLeave?.()\n complete()\n }\n}\n\n/**\n * Renders a single element with CSS transition enter/exit animation.\n * Uses h(config.tag) — no cloneElement needed.\n */\nconst TransitionRenderer = (props: TransitionRendererProps): VNode | null => {\n const reducedMotion = useReducedMotion()\n const {\n stage,\n ref: stateRef,\n shouldMount,\n complete,\n } = useTransitionState({\n show: props.show,\n appear: props.appear ?? props.config.appear ?? false,\n })\n\n const elementRef = createRef<HTMLElement>()\n const mergedRef = mergeRefs(elementRef, stateRef)\n\n const effectiveUnmount = props.unmount ?? props.config.unmount ?? true\n const effectiveTimeout = props.timeout ?? props.config.timeout ?? 5000\n\n useAnimationEnd({\n ref: elementRef,\n active: () => (stage() === 'entering' || stage() === 'leaving') && !reducedMotion(),\n timeout: effectiveTimeout,\n onEnd: () => {\n if (stage() === 'entering') {\n props.callbacks.onAfterEnter?.()\n } else if (stage() === 'leaving') {\n props.callbacks.onAfterLeave?.()\n }\n complete()\n },\n })\n\n watch(\n () => stage(),\n (currentStage) => {\n const el = elementRef.current\n if (!el) return\n\n if (reducedMotion()) {\n applyReducedMotion(currentStage, props.callbacks, complete)\n return\n }\n\n if (currentStage === 'entering') {\n props.callbacks.onEnter?.()\n const frameId = applyEnter(el, props.config)\n return () => cancelAnimationFrame(frameId)\n }\n\n if (currentStage === 'leaving') {\n props.callbacks.onLeave?.()\n const frameId = applyLeave(el, props.config)\n return () => cancelAnimationFrame(frameId)\n }\n\n if (currentStage === 'entered') {\n removeClasses(el, props.config.enter)\n el.style.transition = ''\n }\n },\n { immediate: true },\n )\n\n // Initially-visible kinetic-mode Transitions keep the original Show-gated\n // mount, preserving the documented runtime-unmount semantic for the\n // visible→hidden transition. The SSR bug (children dropped from prerendered\n // HTML) only fires for the initially-HIDDEN case below, where\n // `<Show when={false}>` renders `null` on the server — leaving SSG sites\n // using kinetic-mode transitions (e.g. `kinetic('div').preset(fadeUp)` with\n // `show: () => false` at SSR, the scroll-reveal pattern via\n // `useIntersection`) without structural content for SEO / social scrapers\n // / accessibility tools / no-JS users.\n //\n // Mirrors the fix shape applied to the top-level `<Transition>`.\n // Ecosystem norm (Framer Motion / react-transition-group / react-\n // spring): content is structural, animation is visual.\n const wasInitiallyShown = props.show()\n if (wasInitiallyShown) {\n return (\n <Show\n when={shouldMount}\n fallback={\n effectiveUnmount\n ? null\n : h(\n props.config.tag,\n // mergeProps keeps every reactive HTML-attr getter; ref + the\n // hidden-state `display:none` style come last and win. The\n // one-time `props.htmlProps.style` read seeds the hidden\n // style — display:none must compose over the user's style.\n mergeProps(props.htmlProps, {\n ref: mergedRef,\n style: {\n ...((props.htmlProps.style as CSSProperties) ?? {}),\n display: 'none',\n },\n }),\n props.children,\n )\n }\n >\n {h(\n props.config.tag,\n // Descriptor-preserving merge — reactive HTML attrs keep their\n // getters; ref wins last. `{ ...props.htmlProps }` would freeze them.\n mergeProps(props.htmlProps, { ref: mergedRef }),\n props.children,\n )}\n </Show>\n )\n }\n\n // Initially-hidden path — ecosystem-correct: always emit children with\n // hidden-state class/style inlined so SSG / SEO / social scrapers / no-JS\n // users see structural content. `leaveTo` (explicit hidden-end state)\n // wins; falls back to `enterFrom` (pre-enter state) for scroll-reveal\n // patterns that only configure the enter side. The existing\n // `watch(stage)` effect drives the enter animation when `show` flips\n // true; the symmetric `applyEnter` above clears these residual classes.\n //\n // Trade-off: for initially-hidden kinetic-mode Transitions, `unmount: true`\n // no longer triggers a true DOM removal after a later leave animation\n // completes — element stays in DOM with the leave-to class applied.\n // Initially-visible Transitions (the branch above) keep the unmount\n // semantic. Matches Framer Motion / react-transition-group conventions\n // and is the price of SSR correctness.\n // Mirrors the class picker: prefer `leaveTo`/`leaveToStyle` (explicit\n // leave-end / hidden state) and fall back to `enterFrom`/`enterStyle`\n // (pre-enter state). The fallback covers the preset path —\n // `@pyreon/kinetic-presets` factories (fadeUp, slideLeft, blurInUp, …)\n // populate `enterStyle` as the hidden state and may not set\n // `leaveToStyle` at all; without this fallback, presets would SSR-render\n // VISIBLE → flash-on-hydration.\n const hiddenClass = props.config.leaveTo ?? props.config.enterFrom\n const hiddenStyle = props.config.leaveToStyle ?? props.config.enterStyle\n const childClass = props.htmlProps.class\n const mergedClass = hiddenClass\n ? cx([childClass as Parameters<typeof cx>[0], hiddenClass])\n : undefined\n const mergedStyle = hiddenStyle\n ? { ...((props.htmlProps.style as CSSProperties) ?? {}), ...hiddenStyle }\n : undefined\n\n const extra: Record<string, unknown> = { ref: mergedRef }\n if (mergedClass !== undefined) extra.class = mergedClass\n if (mergedStyle !== undefined) extra.style = mergedStyle\n\n return h(props.config.tag, mergeProps(props.htmlProps, extra), props.children)\n}\n\nexport default TransitionRenderer\n","import type { VNode } from '@pyreon/core'\nimport { splitProps } from '@pyreon/core'\nimport type { CSSProperties, TransitionCallbacks } from '../types'\nimport CollapseRenderer from './CollapseRenderer'\nimport GroupRenderer from './GroupRenderer'\nimport StaggerRenderer from './StaggerRenderer'\nimport TransitionRenderer from './TransitionRenderer'\nimport type { ClassConfig, KineticComponent, KineticConfig, KineticMode } from './types'\n\n/** Keys that are kinetic-specific and should not be forwarded as HTML attrs. */\nconst KINETIC_KEYS = new Set([\n 'show',\n 'appear',\n 'unmount',\n 'timeout',\n 'transition',\n 'interval',\n 'reverseLeave',\n 'onEnter',\n 'onAfterEnter',\n 'onLeave',\n 'onAfterLeave',\n])\n\n/**\n * Core factory. Creates a component that delegates to the appropriate\n * renderer based on config.mode, then attaches immutable chain methods\n * via Object.assign.\n */\nconst createKineticComponent = <Tag extends string, Mode extends KineticMode = 'transition'>(\n config: KineticConfig,\n): KineticComponent<Tag, Mode> => {\n const Component = (props: Record<string, unknown>): VNode | null => {\n // Separate kinetic-specific props from HTML pass-through props.\n // MUST use splitProps (descriptor-preserving) — a plain\n // `htmlProps[key] = props[key]` value-copy fires every getter at\n // component-setup time. The compiler emits `<KineticDiv class={sig()}>`\n // as `_rp(() => sig())`, which `makeReactiveProps` turns into a getter\n // on `props`; reading it here (outside any tracking scope) would\n // collapse it to a static snapshot and freeze the HTML attr forever.\n // splitProps copies DESCRIPTORS via Object.getOwnPropertyDescriptor +\n // Object.defineProperty, so the getter survives to the renderer's\n // `h(config.tag, htmlProps)` where runtime-dom's applyProps detects\n // the descriptor and wraps the read in renderEffect.\n // `props` is `Record<string, unknown>`, so `Omit<…, string>` collapses\n // to `{}` at the type level — the runtime split is correct (splitProps\n // copies descriptors for every own key not in the pick set), only the\n // inferred result types degrade. Cast back to the real shape.\n const [kineticProps, htmlPropsWithChildren] = splitProps(props, [...KINETIC_KEYS]) as [\n Record<string, unknown>,\n Record<string, unknown>,\n ]\n\n const {\n show,\n appear,\n unmount,\n timeout,\n transition,\n interval,\n reverseLeave,\n onEnter,\n onAfterEnter,\n onLeave,\n onAfterLeave,\n } = kineticProps as {\n show?: () => boolean\n appear?: boolean\n unmount?: boolean\n timeout?: number\n transition?: string\n interval?: number\n reverseLeave?: boolean\n } & Partial<TransitionCallbacks>\n\n const callbacks: Partial<TransitionCallbacks> = {\n onEnter: onEnter ?? config.onEnter,\n onAfterEnter: onAfterEnter ?? config.onAfterEnter,\n onLeave: onLeave ?? config.onLeave,\n onAfterLeave: onAfterLeave ?? config.onAfterLeave,\n }\n\n // Carve `children` out of the HTML pass-through set — also via\n // splitProps so the remaining HTML attrs keep their getter\n // descriptors (`const { children, ...restHtml } = …` is the same\n // value-copy footgun as the split above).\n const [childHolder, restHtml] = splitProps(htmlPropsWithChildren, ['children'])\n const children = childHolder.children\n\n if (config.mode === 'collapse') {\n return (\n <CollapseRenderer\n config={config}\n htmlProps={restHtml}\n show={show as () => boolean}\n appear={appear}\n timeout={timeout}\n transition={transition}\n callbacks={callbacks}\n >\n {children as VNode | VNode[]}\n </CollapseRenderer>\n )\n }\n\n if (config.mode === 'stagger') {\n return (\n <StaggerRenderer\n config={config}\n htmlProps={restHtml}\n show={show as () => boolean}\n appear={appear}\n timeout={timeout}\n interval={interval}\n reverseLeave={reverseLeave}\n callbacks={callbacks}\n >\n {children as VNode[]}\n </StaggerRenderer>\n )\n }\n\n if (config.mode === 'group') {\n return (\n <GroupRenderer\n config={config}\n htmlProps={restHtml}\n appear={appear}\n timeout={timeout}\n callbacks={callbacks}\n >\n {children as VNode[]}\n </GroupRenderer>\n )\n }\n\n // Default: transition mode\n return (\n <TransitionRenderer\n config={config}\n htmlProps={restHtml}\n show={show as () => boolean}\n appear={appear}\n unmount={unmount}\n timeout={timeout}\n callbacks={callbacks}\n >\n {children as VNode | VNode[]}\n </TransitionRenderer>\n )\n }\n\n Component.displayName = `kinetic(${config.tag})`\n\n // Immutable chain methods — each returns a new component with merged config.\n return Object.assign(Component, {\n preset: (preset: Record<string, unknown>) =>\n createKineticComponent<Tag, Mode>({\n ...config,\n ...preset,\n } as KineticConfig),\n\n enter: (styles: CSSProperties) =>\n createKineticComponent<Tag, Mode>({ ...config, enterStyle: styles }),\n\n enterTo: (styles: CSSProperties) =>\n createKineticComponent<Tag, Mode>({ ...config, enterToStyle: styles }),\n\n enterTransition: (value: string) =>\n createKineticComponent<Tag, Mode>({ ...config, enterTransition: value }),\n\n leave: (styles: CSSProperties) =>\n createKineticComponent<Tag, Mode>({ ...config, leaveStyle: styles }),\n\n leaveTo: (styles: CSSProperties) =>\n createKineticComponent<Tag, Mode>({ ...config, leaveToStyle: styles }),\n\n leaveTransition: (value: string) =>\n createKineticComponent<Tag, Mode>({ ...config, leaveTransition: value }),\n\n enterClass: ({ active, from, to }: ClassConfig) =>\n createKineticComponent<Tag, Mode>({\n ...config,\n enter: active,\n enterFrom: from,\n enterTo: to,\n }),\n\n leaveClass: ({ active, from, to }: ClassConfig) =>\n createKineticComponent<Tag, Mode>({\n ...config,\n leave: active,\n leaveFrom: from,\n leaveTo: to,\n }),\n\n config: (opts: Record<string, unknown>) =>\n createKineticComponent<Tag, Mode>({\n ...config,\n ...opts,\n } as KineticConfig),\n\n on: (cbs: Partial<TransitionCallbacks>) =>\n createKineticComponent<Tag, Mode>({ ...config, ...cbs }),\n\n collapse: (opts?: { transition?: string }) =>\n createKineticComponent<Tag, 'collapse'>({\n ...config,\n mode: 'collapse',\n ...opts,\n }),\n\n stagger: (opts?: { interval?: number; reverseLeave?: boolean }) =>\n createKineticComponent<Tag, 'stagger'>({\n ...config,\n mode: 'stagger',\n ...opts,\n }),\n\n group: () => createKineticComponent<Tag, 'group'>({ ...config, mode: 'group' }),\n }) as unknown as KineticComponent<Tag, Mode>\n}\n\nexport default createKineticComponent\n","import createKineticComponent from './kinetic/createKineticComponent'\nimport type { KineticComponent } from './kinetic/types'\n\n/**\n * Creates a reusable animated component via immutable chaining.\n *\n * @example\n * ```tsx\n * // Transition (default)\n * const FadeDiv = kinetic('div').preset(fade)\n *\n * // Collapse\n * const Accordion = kinetic('div').collapse()\n *\n * // Stagger\n * const StaggerList = kinetic('ul').preset(slideUp).stagger({ interval: 50 })\n *\n * // Group (key-based enter/exit)\n * const AnimatedList = kinetic('ul').preset(fade).group()\n * ```\n */\nconst kinetic = <Tag extends string>(tag: Tag): KineticComponent<Tag, 'transition'> =>\n createKineticComponent<Tag, 'transition'>({ tag, mode: 'transition' })\n\nexport default kinetic\n","import type { ClassTransitionProps, StyleTransitionProps } from './types'\n\nexport type Preset = StyleTransitionProps & ClassTransitionProps\n\nexport const fade: Preset = {\n enterStyle: { opacity: 0 },\n enterToStyle: { opacity: 1 },\n enterTransition: 'opacity 300ms ease-out',\n leaveStyle: { opacity: 1 },\n leaveToStyle: { opacity: 0 },\n leaveTransition: 'opacity 200ms ease-in',\n}\n\nexport const scaleIn: Preset = {\n enterStyle: { opacity: 0, transform: 'scale(0.95)' },\n enterToStyle: { opacity: 1, transform: 'scale(1)' },\n enterTransition: 'opacity 300ms ease-out, transform 300ms ease-out',\n leaveStyle: { opacity: 1, transform: 'scale(1)' },\n leaveToStyle: { opacity: 0, transform: 'scale(0.95)' },\n leaveTransition: 'opacity 200ms ease-in, transform 200ms ease-in',\n}\n\nexport const slideUp: Preset = {\n enterStyle: { opacity: 0, transform: 'translateY(16px)' },\n enterToStyle: { opacity: 1, transform: 'translateY(0)' },\n enterTransition: 'opacity 300ms ease-out, transform 300ms ease-out',\n leaveStyle: { opacity: 1, transform: 'translateY(0)' },\n leaveToStyle: { opacity: 0, transform: 'translateY(16px)' },\n leaveTransition: 'opacity 200ms ease-in, transform 200ms ease-in',\n}\n\nexport const slideDown: Preset = {\n enterStyle: { opacity: 0, transform: 'translateY(-16px)' },\n enterToStyle: { opacity: 1, transform: 'translateY(0)' },\n enterTransition: 'opacity 300ms ease-out, transform 300ms ease-out',\n leaveStyle: { opacity: 1, transform: 'translateY(0)' },\n leaveToStyle: { opacity: 0, transform: 'translateY(-16px)' },\n leaveTransition: 'opacity 200ms ease-in, transform 200ms ease-in',\n}\n\nexport const slideLeft: Preset = {\n enterStyle: { opacity: 0, transform: 'translateX(16px)' },\n enterToStyle: { opacity: 1, transform: 'translateX(0)' },\n enterTransition: 'opacity 300ms ease-out, transform 300ms ease-out',\n leaveStyle: { opacity: 1, transform: 'translateX(0)' },\n leaveToStyle: { opacity: 0, transform: 'translateX(16px)' },\n leaveTransition: 'opacity 200ms ease-in, transform 200ms ease-in',\n}\n\nexport const slideRight: Preset = {\n enterStyle: { opacity: 0, transform: 'translateX(-16px)' },\n enterToStyle: { opacity: 1, transform: 'translateX(0)' },\n enterTransition: 'opacity 300ms ease-out, transform 300ms ease-out',\n leaveStyle: { opacity: 1, transform: 'translateX(0)' },\n leaveToStyle: { opacity: 0, transform: 'translateX(-16px)' },\n leaveTransition: 'opacity 200ms ease-in, transform 200ms ease-in',\n}\n\nexport const presets = {\n fade,\n scaleIn,\n slideUp,\n slideDown,\n slideLeft,\n slideRight,\n} as const\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pyreon/kinetic",
3
- "version": "0.25.0",
3
+ "version": "0.26.0",
4
4
  "description": "CSS-transition-based animation components for Pyreon",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -10,7 +10,6 @@
10
10
  },
11
11
  "files": [
12
12
  "lib",
13
- "!lib/**/*.map",
14
13
  "!lib/analysis",
15
14
  "README.md",
16
15
  "LICENSE"
@@ -40,21 +39,19 @@
40
39
  "typecheck": "tsc --noEmit"
41
40
  },
42
41
  "devDependencies": {
43
- "@pyreon/core": "^0.25.0",
44
- "@pyreon/reactivity": "^0.25.0",
45
- "@pyreon/runtime-dom": "^0.25.0",
46
- "@pyreon/runtime-server": "^0.25.0",
47
- "@pyreon/test-utils": "^0.13.12",
48
- "@pyreon/typescript": "^0.25.0",
49
- "@vitest/browser-playwright": "^4.1.4",
50
- "@vitus-labs/tools-rolldown": "^2.4.0"
42
+ "@pyreon/runtime-server": "^0.26.0",
43
+ "@pyreon/test-utils": "^0.13.13",
44
+ "@pyreon/typescript": "^0.26.0",
45
+ "@pyreon/vitest-config": "0.13.1",
46
+ "@vitest/browser-playwright": "^4.1.7",
47
+ "@vitus-labs/tools-rolldown": "^2.5.0"
51
48
  },
52
49
  "engines": {
53
50
  "node": ">= 22"
54
51
  },
55
- "dependencies": {
56
- "@pyreon/core": "^0.25.0",
57
- "@pyreon/reactivity": "^0.25.0",
58
- "@pyreon/runtime-dom": "^0.25.0"
52
+ "peerDependencies": {
53
+ "@pyreon/core": "^0.26.0",
54
+ "@pyreon/reactivity": "^0.26.0",
55
+ "@pyreon/runtime-dom": "^0.26.0"
59
56
  }
60
57
  }