@pyreon/kinetic 0.11.4 → 0.11.6

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.
@@ -1,11 +1,11 @@
1
- import type { VNode } from "@pyreon/core"
2
- import { createRef, Show } from "@pyreon/core"
3
- import { watch } from "@pyreon/reactivity"
4
- import type { ClassTransitionProps, StyleTransitionProps, TransitionCallbacks } from "../types"
5
- import useAnimationEnd from "../useAnimationEnd"
6
- import { useReducedMotion } from "../useReducedMotion"
7
- import useTransitionState from "../useTransitionState"
8
- import { addClasses, cloneVNode, mergeRefs, mergeStyles, nextFrame, removeClasses } from "../utils"
1
+ import type { VNode } from '@pyreon/core'
2
+ import { createRef, Show } from '@pyreon/core'
3
+ import { watch } from '@pyreon/reactivity'
4
+ import type { ClassTransitionProps, StyleTransitionProps, TransitionCallbacks } from '../types'
5
+ import useAnimationEnd from '../useAnimationEnd'
6
+ import { useReducedMotion } from '../useReducedMotion'
7
+ import useTransitionState from '../useTransitionState'
8
+ import { addClasses, cloneVNode, mergeRefs, mergeStyles, nextFrame, removeClasses } from '../utils'
9
9
 
10
10
  type TransitionItemProps = ClassTransitionProps &
11
11
  StyleTransitionProps &
@@ -52,11 +52,11 @@ const applyReducedMotion = (
52
52
  callbacks: Partial<TransitionCallbacks>,
53
53
  complete: () => void,
54
54
  ) => {
55
- if (stage === "entering") {
55
+ if (stage === 'entering') {
56
56
  callbacks.onEnter?.()
57
57
  callbacks.onAfterEnter?.()
58
58
  complete()
59
- } else if (stage === "leaving") {
59
+ } else if (stage === 'leaving') {
60
60
  callbacks.onLeave?.()
61
61
  callbacks.onAfterLeave?.()
62
62
  complete()
@@ -128,12 +128,12 @@ const TransitionItem = ({
128
128
 
129
129
  useAnimationEnd({
130
130
  ref: elementRef,
131
- active: () => (stage() === "entering" || stage() === "leaving") && !reducedMotion(),
131
+ active: () => (stage() === 'entering' || stage() === 'leaving') && !reducedMotion(),
132
132
  timeout,
133
133
  onEnd: () => {
134
- if (stage() === "entering") {
134
+ if (stage() === 'entering') {
135
135
  callbacks.onAfterEnter?.()
136
- } else if (stage() === "leaving") {
136
+ } else if (stage() === 'leaving') {
137
137
  callbacks.onAfterLeave?.()
138
138
  }
139
139
  complete()
@@ -151,21 +151,21 @@ const TransitionItem = ({
151
151
  return
152
152
  }
153
153
 
154
- if (currentStage === "entering") {
154
+ if (currentStage === 'entering') {
155
155
  callbacks.onEnter?.()
156
156
  const frameId = applyEnter(el, transitionConfig)
157
157
  return () => cancelAnimationFrame(frameId)
158
158
  }
159
159
 
160
- if (currentStage === "leaving") {
160
+ if (currentStage === 'leaving') {
161
161
  callbacks.onLeave?.()
162
162
  const frameId = applyLeave(el, transitionConfig)
163
163
  return () => cancelAnimationFrame(frameId)
164
164
  }
165
165
 
166
- if (currentStage === "entered") {
166
+ if (currentStage === 'entered') {
167
167
  removeClasses(el, enter)
168
- el.style.transition = ""
168
+ el.style.transition = ''
169
169
  }
170
170
  },
171
171
  { immediate: true },
@@ -183,7 +183,7 @@ const TransitionItem = ({
183
183
  (children.props as Record<string, unknown>)?.style as
184
184
  | Record<string, string | number | undefined>
185
185
  | undefined,
186
- { display: "none" },
186
+ { display: 'none' },
187
187
  ),
188
188
  })
189
189
  }
@@ -1,12 +1,12 @@
1
- import type { VNode } from "@pyreon/core"
2
- import { createRef, h, Show } from "@pyreon/core"
3
- import { watch } from "@pyreon/reactivity"
4
- import type { CSSProperties, TransitionCallbacks } from "../types"
5
- import useAnimationEnd from "../useAnimationEnd"
6
- import { useReducedMotion } from "../useReducedMotion"
7
- import useTransitionState from "../useTransitionState"
8
- import { addClasses, mergeRefs, nextFrame, removeClasses } from "../utils"
9
- import type { KineticConfig } from "./types"
1
+ import type { VNode } from '@pyreon/core'
2
+ import { createRef, h, Show } from '@pyreon/core'
3
+ import { watch } from '@pyreon/reactivity'
4
+ import type { CSSProperties, TransitionCallbacks } from '../types'
5
+ import useAnimationEnd from '../useAnimationEnd'
6
+ import { useReducedMotion } from '../useReducedMotion'
7
+ import useTransitionState from '../useTransitionState'
8
+ import { addClasses, mergeRefs, nextFrame, removeClasses } from '../utils'
9
+ import type { KineticConfig } from './types'
10
10
 
11
11
  type TransitionRendererProps = {
12
12
  config: KineticConfig
@@ -53,11 +53,11 @@ const applyReducedMotion = (
53
53
  cbs: Partial<TransitionCallbacks>,
54
54
  complete: () => void,
55
55
  ) => {
56
- if (stage === "entering") {
56
+ if (stage === 'entering') {
57
57
  cbs.onEnter?.()
58
58
  cbs.onAfterEnter?.()
59
59
  complete()
60
- } else if (stage === "leaving") {
60
+ } else if (stage === 'leaving') {
61
61
  cbs.onLeave?.()
62
62
  cbs.onAfterLeave?.()
63
63
  complete()
@@ -97,12 +97,12 @@ const TransitionRenderer = ({
97
97
 
98
98
  useAnimationEnd({
99
99
  ref: elementRef,
100
- active: () => (stage() === "entering" || stage() === "leaving") && !reducedMotion(),
100
+ active: () => (stage() === 'entering' || stage() === 'leaving') && !reducedMotion(),
101
101
  timeout: effectiveTimeout,
102
102
  onEnd: () => {
103
- if (stage() === "entering") {
103
+ if (stage() === 'entering') {
104
104
  callbacks.onAfterEnter?.()
105
- } else if (stage() === "leaving") {
105
+ } else if (stage() === 'leaving') {
106
106
  callbacks.onAfterLeave?.()
107
107
  }
108
108
  complete()
@@ -120,21 +120,21 @@ const TransitionRenderer = ({
120
120
  return
121
121
  }
122
122
 
123
- if (currentStage === "entering") {
123
+ if (currentStage === 'entering') {
124
124
  callbacks.onEnter?.()
125
125
  const frameId = applyEnter(el, config)
126
126
  return () => cancelAnimationFrame(frameId)
127
127
  }
128
128
 
129
- if (currentStage === "leaving") {
129
+ if (currentStage === 'leaving') {
130
130
  callbacks.onLeave?.()
131
131
  const frameId = applyLeave(el, config)
132
132
  return () => cancelAnimationFrame(frameId)
133
133
  }
134
134
 
135
- if (currentStage === "entered") {
135
+ if (currentStage === 'entered') {
136
136
  removeClasses(el, config.enter)
137
- el.style.transition = ""
137
+ el.style.transition = ''
138
138
  }
139
139
  },
140
140
  { immediate: true },
@@ -153,7 +153,7 @@ const TransitionRenderer = ({
153
153
  ...htmlProps,
154
154
  style: {
155
155
  ...((htmlProps.style as CSSProperties) ?? {}),
156
- display: "none",
156
+ display: 'none',
157
157
  },
158
158
  },
159
159
  children,
@@ -1,24 +1,24 @@
1
- import type { VNode } from "@pyreon/core"
2
- import type { CSSProperties, TransitionCallbacks } from "../types"
3
- import CollapseRenderer from "./CollapseRenderer"
4
- import GroupRenderer from "./GroupRenderer"
5
- import StaggerRenderer from "./StaggerRenderer"
6
- import TransitionRenderer from "./TransitionRenderer"
7
- import type { ClassConfig, KineticComponent, KineticConfig, KineticMode } from "./types"
1
+ import type { VNode } from '@pyreon/core'
2
+ import type { CSSProperties, TransitionCallbacks } from '../types'
3
+ import CollapseRenderer from './CollapseRenderer'
4
+ import GroupRenderer from './GroupRenderer'
5
+ import StaggerRenderer from './StaggerRenderer'
6
+ import TransitionRenderer from './TransitionRenderer'
7
+ import type { ClassConfig, KineticComponent, KineticConfig, KineticMode } from './types'
8
8
 
9
9
  /** Keys that are kinetic-specific and should not be forwarded as HTML attrs. */
10
10
  const KINETIC_KEYS = new Set([
11
- "show",
12
- "appear",
13
- "unmount",
14
- "timeout",
15
- "transition",
16
- "interval",
17
- "reverseLeave",
18
- "onEnter",
19
- "onAfterEnter",
20
- "onLeave",
21
- "onAfterLeave",
11
+ 'show',
12
+ 'appear',
13
+ 'unmount',
14
+ 'timeout',
15
+ 'transition',
16
+ 'interval',
17
+ 'reverseLeave',
18
+ 'onEnter',
19
+ 'onAfterEnter',
20
+ 'onLeave',
21
+ 'onAfterLeave',
22
22
  ])
23
23
 
24
24
  /**
@@ -26,7 +26,7 @@ const KINETIC_KEYS = new Set([
26
26
  * renderer based on config.mode, then attaches immutable chain methods
27
27
  * via Object.assign.
28
28
  */
29
- const createKineticComponent = <Tag extends string, Mode extends KineticMode = "transition">(
29
+ const createKineticComponent = <Tag extends string, Mode extends KineticMode = 'transition'>(
30
30
  config: KineticConfig,
31
31
  ): KineticComponent<Tag, Mode> => {
32
32
  const Component = (props: Record<string, unknown>): VNode | null => {
@@ -74,7 +74,7 @@ const createKineticComponent = <Tag extends string, Mode extends KineticMode = "
74
74
  // Extract children from htmlProps (it's not an HTML attribute)
75
75
  const { children, ...restHtml } = htmlProps
76
76
 
77
- if (config.mode === "collapse") {
77
+ if (config.mode === 'collapse') {
78
78
  return (
79
79
  <CollapseRenderer
80
80
  config={config}
@@ -90,7 +90,7 @@ const createKineticComponent = <Tag extends string, Mode extends KineticMode = "
90
90
  )
91
91
  }
92
92
 
93
- if (config.mode === "stagger") {
93
+ if (config.mode === 'stagger') {
94
94
  return (
95
95
  <StaggerRenderer
96
96
  config={config}
@@ -107,7 +107,7 @@ const createKineticComponent = <Tag extends string, Mode extends KineticMode = "
107
107
  )
108
108
  }
109
109
 
110
- if (config.mode === "group") {
110
+ if (config.mode === 'group') {
111
111
  return (
112
112
  <GroupRenderer
113
113
  config={config}
@@ -191,20 +191,20 @@ const createKineticComponent = <Tag extends string, Mode extends KineticMode = "
191
191
  createKineticComponent<Tag, Mode>({ ...config, ...cbs }),
192
192
 
193
193
  collapse: (opts?: { transition?: string }) =>
194
- createKineticComponent<Tag, "collapse">({
194
+ createKineticComponent<Tag, 'collapse'>({
195
195
  ...config,
196
- mode: "collapse",
196
+ mode: 'collapse',
197
197
  ...opts,
198
198
  }),
199
199
 
200
200
  stagger: (opts?: { interval?: number; reverseLeave?: boolean }) =>
201
- createKineticComponent<Tag, "stagger">({
201
+ createKineticComponent<Tag, 'stagger'>({
202
202
  ...config,
203
- mode: "stagger",
203
+ mode: 'stagger',
204
204
  ...opts,
205
205
  }),
206
206
 
207
- group: () => createKineticComponent<Tag, "group">({ ...config, mode: "group" }),
207
+ group: () => createKineticComponent<Tag, 'group'>({ ...config, mode: 'group' }),
208
208
  }) as unknown as KineticComponent<Tag, Mode>
209
209
  }
210
210
 
@@ -1,14 +1,14 @@
1
- import type { ComponentFn, VNodeChild } from "@pyreon/core"
1
+ import type { ComponentFn, VNodeChild } from '@pyreon/core'
2
2
  import type {
3
3
  ClassTransitionProps,
4
4
  CSSProperties,
5
5
  StyleTransitionProps,
6
6
  TransitionCallbacks,
7
- } from "../types"
7
+ } from '../types'
8
8
 
9
9
  // ─── Kinetic Modes ────────────────────────────────────────
10
10
 
11
- export type KineticMode = "transition" | "collapse" | "stagger" | "group"
11
+ export type KineticMode = 'transition' | 'collapse' | 'stagger' | 'group'
12
12
 
13
13
  // ─── Internal Config (accumulated through chaining) ──────
14
14
 
@@ -100,21 +100,21 @@ export type KineticGroupProps<_Tag extends string> = Record<string, unknown> & {
100
100
  export type KineticComponentProps<
101
101
  Tag extends string,
102
102
  Mode extends KineticMode,
103
- > = Mode extends "collapse"
103
+ > = Mode extends 'collapse'
104
104
  ? KineticCollapseProps<Tag>
105
- : Mode extends "stagger"
105
+ : Mode extends 'stagger'
106
106
  ? KineticStaggerProps<Tag>
107
- : Mode extends "group"
107
+ : Mode extends 'group'
108
108
  ? KineticGroupProps<Tag>
109
109
  : KineticTransitionProps<Tag>
110
110
 
111
111
  // ─── Conditional config opts based on mode ───────────────
112
112
 
113
- type ConfigOpts<Mode extends KineticMode> = Mode extends "collapse"
113
+ type ConfigOpts<Mode extends KineticMode> = Mode extends 'collapse'
114
114
  ? CollapseConfigOpts
115
- : Mode extends "stagger"
115
+ : Mode extends 'stagger'
116
116
  ? StaggerConfigOpts
117
- : Mode extends "group"
117
+ : Mode extends 'group'
118
118
  ? GroupConfigOpts
119
119
  : TransitionConfigOpts
120
120
 
@@ -133,17 +133,17 @@ export type KineticChain<Tag extends string, Mode extends KineticMode> = {
133
133
  leaveClass: (opts: ClassConfig) => KineticComponent<Tag, Mode>
134
134
  config: (opts: ConfigOpts<Mode>) => KineticComponent<Tag, Mode>
135
135
  on: (callbacks: Partial<TransitionCallbacks>) => KineticComponent<Tag, Mode>
136
- collapse: (opts?: CollapseConfigOpts) => KineticComponent<Tag, "collapse">
136
+ collapse: (opts?: CollapseConfigOpts) => KineticComponent<Tag, 'collapse'>
137
137
  stagger: (opts?: {
138
138
  interval?: number | undefined
139
139
  reverseLeave?: boolean | undefined
140
- }) => KineticComponent<Tag, "stagger">
141
- group: () => KineticComponent<Tag, "group">
140
+ }) => KineticComponent<Tag, 'stagger'>
141
+ group: () => KineticComponent<Tag, 'group'>
142
142
  }
143
143
 
144
144
  // ─── The full kinetic component: renderable + chainable ───
145
145
 
146
146
  export type KineticComponent<
147
147
  Tag extends string,
148
- Mode extends KineticMode = "transition",
148
+ Mode extends KineticMode = 'transition',
149
149
  > = ComponentFn<KineticComponentProps<Tag, Mode>> & KineticChain<Tag, Mode>
package/src/kinetic.ts CHANGED
@@ -1,5 +1,5 @@
1
- import createKineticComponent from "./kinetic/createKineticComponent"
2
- import type { KineticComponent } from "./kinetic/types"
1
+ import createKineticComponent from './kinetic/createKineticComponent'
2
+ import type { KineticComponent } from './kinetic/types'
3
3
 
4
4
  /**
5
5
  * Creates a reusable animated component via immutable chaining.
@@ -19,7 +19,7 @@ import type { KineticComponent } from "./kinetic/types"
19
19
  * const AnimatedList = kinetic('ul').preset(fade).group()
20
20
  * ```
21
21
  */
22
- const kinetic = <Tag extends string>(tag: Tag): KineticComponent<Tag, "transition"> =>
23
- createKineticComponent<Tag, "transition">({ tag, mode: "transition" })
22
+ const kinetic = <Tag extends string>(tag: Tag): KineticComponent<Tag, 'transition'> =>
23
+ createKineticComponent<Tag, 'transition'>({ tag, mode: 'transition' })
24
24
 
25
25
  export default kinetic
package/src/presets.ts CHANGED
@@ -1,59 +1,59 @@
1
- import type { ClassTransitionProps, StyleTransitionProps } from "./types"
1
+ import type { ClassTransitionProps, StyleTransitionProps } from './types'
2
2
 
3
3
  export type Preset = StyleTransitionProps & ClassTransitionProps
4
4
 
5
5
  export const fade: Preset = {
6
6
  enterStyle: { opacity: 0 },
7
7
  enterToStyle: { opacity: 1 },
8
- enterTransition: "opacity 300ms ease-out",
8
+ enterTransition: 'opacity 300ms ease-out',
9
9
  leaveStyle: { opacity: 1 },
10
10
  leaveToStyle: { opacity: 0 },
11
- leaveTransition: "opacity 200ms ease-in",
11
+ leaveTransition: 'opacity 200ms ease-in',
12
12
  }
13
13
 
14
14
  export const scaleIn: Preset = {
15
- enterStyle: { opacity: 0, transform: "scale(0.95)" },
16
- enterToStyle: { opacity: 1, transform: "scale(1)" },
17
- enterTransition: "opacity 300ms ease-out, transform 300ms ease-out",
18
- leaveStyle: { opacity: 1, transform: "scale(1)" },
19
- leaveToStyle: { opacity: 0, transform: "scale(0.95)" },
20
- leaveTransition: "opacity 200ms ease-in, transform 200ms ease-in",
15
+ enterStyle: { opacity: 0, transform: 'scale(0.95)' },
16
+ enterToStyle: { opacity: 1, transform: 'scale(1)' },
17
+ enterTransition: 'opacity 300ms ease-out, transform 300ms ease-out',
18
+ leaveStyle: { opacity: 1, transform: 'scale(1)' },
19
+ leaveToStyle: { opacity: 0, transform: 'scale(0.95)' },
20
+ leaveTransition: 'opacity 200ms ease-in, transform 200ms ease-in',
21
21
  }
22
22
 
23
23
  export const slideUp: Preset = {
24
- enterStyle: { opacity: 0, transform: "translateY(16px)" },
25
- enterToStyle: { opacity: 1, transform: "translateY(0)" },
26
- enterTransition: "opacity 300ms ease-out, transform 300ms ease-out",
27
- leaveStyle: { opacity: 1, transform: "translateY(0)" },
28
- leaveToStyle: { opacity: 0, transform: "translateY(16px)" },
29
- leaveTransition: "opacity 200ms ease-in, transform 200ms ease-in",
24
+ enterStyle: { opacity: 0, transform: 'translateY(16px)' },
25
+ enterToStyle: { opacity: 1, transform: 'translateY(0)' },
26
+ enterTransition: 'opacity 300ms ease-out, transform 300ms ease-out',
27
+ leaveStyle: { opacity: 1, transform: 'translateY(0)' },
28
+ leaveToStyle: { opacity: 0, transform: 'translateY(16px)' },
29
+ leaveTransition: 'opacity 200ms ease-in, transform 200ms ease-in',
30
30
  }
31
31
 
32
32
  export const slideDown: Preset = {
33
- enterStyle: { opacity: 0, transform: "translateY(-16px)" },
34
- enterToStyle: { opacity: 1, transform: "translateY(0)" },
35
- enterTransition: "opacity 300ms ease-out, transform 300ms ease-out",
36
- leaveStyle: { opacity: 1, transform: "translateY(0)" },
37
- leaveToStyle: { opacity: 0, transform: "translateY(-16px)" },
38
- leaveTransition: "opacity 200ms ease-in, transform 200ms ease-in",
33
+ enterStyle: { opacity: 0, transform: 'translateY(-16px)' },
34
+ enterToStyle: { opacity: 1, transform: 'translateY(0)' },
35
+ enterTransition: 'opacity 300ms ease-out, transform 300ms ease-out',
36
+ leaveStyle: { opacity: 1, transform: 'translateY(0)' },
37
+ leaveToStyle: { opacity: 0, transform: 'translateY(-16px)' },
38
+ leaveTransition: 'opacity 200ms ease-in, transform 200ms ease-in',
39
39
  }
40
40
 
41
41
  export const slideLeft: Preset = {
42
- enterStyle: { opacity: 0, transform: "translateX(16px)" },
43
- enterToStyle: { opacity: 1, transform: "translateX(0)" },
44
- enterTransition: "opacity 300ms ease-out, transform 300ms ease-out",
45
- leaveStyle: { opacity: 1, transform: "translateX(0)" },
46
- leaveToStyle: { opacity: 0, transform: "translateX(16px)" },
47
- leaveTransition: "opacity 200ms ease-in, transform 200ms ease-in",
42
+ enterStyle: { opacity: 0, transform: 'translateX(16px)' },
43
+ enterToStyle: { opacity: 1, transform: 'translateX(0)' },
44
+ enterTransition: 'opacity 300ms ease-out, transform 300ms ease-out',
45
+ leaveStyle: { opacity: 1, transform: 'translateX(0)' },
46
+ leaveToStyle: { opacity: 0, transform: 'translateX(16px)' },
47
+ leaveTransition: 'opacity 200ms ease-in, transform 200ms ease-in',
48
48
  }
49
49
 
50
50
  export const slideRight: Preset = {
51
- enterStyle: { opacity: 0, transform: "translateX(-16px)" },
52
- enterToStyle: { opacity: 1, transform: "translateX(0)" },
53
- enterTransition: "opacity 300ms ease-out, transform 300ms ease-out",
54
- leaveStyle: { opacity: 1, transform: "translateX(0)" },
55
- leaveToStyle: { opacity: 0, transform: "translateX(-16px)" },
56
- leaveTransition: "opacity 200ms ease-in, transform 200ms ease-in",
51
+ enterStyle: { opacity: 0, transform: 'translateX(-16px)' },
52
+ enterToStyle: { opacity: 1, transform: 'translateX(0)' },
53
+ enterTransition: 'opacity 300ms ease-out, transform 300ms ease-out',
54
+ leaveStyle: { opacity: 1, transform: 'translateX(0)' },
55
+ leaveToStyle: { opacity: 0, transform: 'translateX(-16px)' },
56
+ leaveTransition: 'opacity 200ms ease-in, transform 200ms ease-in',
57
57
  }
58
58
 
59
59
  export const presets = {
package/src/types.ts CHANGED
@@ -1,10 +1,10 @@
1
- import type { Ref, VNode } from "@pyreon/core"
2
- import type { Signal } from "@pyreon/reactivity"
1
+ import type { Ref, VNode } from '@pyreon/core'
2
+ import type { Signal } from '@pyreon/reactivity'
3
3
 
4
4
  export type CSSProperties = Record<string, string | number | undefined>
5
5
 
6
6
  /** Internal lifecycle stages of a transition. */
7
- export type TransitionStage = "hidden" | "entering" | "entered" | "leaving"
7
+ export type TransitionStage = 'hidden' | 'entering' | 'entered' | 'leaving'
8
8
 
9
9
  /** Class-based transition definition. */
10
10
  export type ClassTransitionProps = {
@@ -1,5 +1,5 @@
1
- import type { Ref } from "@pyreon/core"
2
- import { watch } from "@pyreon/reactivity"
1
+ import type { Ref } from '@pyreon/core'
2
+ import { watch } from '@pyreon/reactivity'
3
3
 
4
4
  const DEFAULT_TIMEOUT = 5000
5
5
 
@@ -29,8 +29,8 @@ const useAnimationEnd: UseAnimationEnd = ({ ref, onEnd, active, timeout = DEFAUL
29
29
  const done = () => {
30
30
  if (called) return
31
31
  called = true
32
- el.removeEventListener("transitionend", handleEnd)
33
- el.removeEventListener("animationend", handleEnd)
32
+ el.removeEventListener('transitionend', handleEnd)
33
+ el.removeEventListener('animationend', handleEnd)
34
34
  clearTimeout(timer)
35
35
  onEnd()
36
36
  }
@@ -41,14 +41,14 @@ const useAnimationEnd: UseAnimationEnd = ({ ref, onEnd, active, timeout = DEFAUL
41
41
  done()
42
42
  }
43
43
 
44
- el.addEventListener("transitionend", handleEnd)
45
- el.addEventListener("animationend", handleEnd)
44
+ el.addEventListener('transitionend', handleEnd)
45
+ el.addEventListener('animationend', handleEnd)
46
46
 
47
47
  const timer = setTimeout(done, timeout)
48
48
 
49
49
  return () => {
50
- el.removeEventListener("transitionend", handleEnd)
51
- el.removeEventListener("animationend", handleEnd)
50
+ el.removeEventListener('transitionend', handleEnd)
51
+ el.removeEventListener('animationend', handleEnd)
52
52
  clearTimeout(timer)
53
53
  }
54
54
  },
@@ -1,5 +1,5 @@
1
- import { onMount, onUnmount } from "@pyreon/core"
2
- import { signal } from "@pyreon/reactivity"
1
+ import { onMount, onUnmount } from '@pyreon/core'
2
+ import { signal } from '@pyreon/reactivity'
3
3
 
4
4
  /**
5
5
  * Inline reduced-motion check for kinetic package.
@@ -14,14 +14,14 @@ export function useReducedMotion(): () => boolean {
14
14
  }
15
15
 
16
16
  onMount(() => {
17
- mql = window.matchMedia("(prefers-reduced-motion: reduce)")
17
+ mql = window.matchMedia('(prefers-reduced-motion: reduce)')
18
18
  matches.set(mql.matches)
19
- mql.addEventListener("change", onChange)
19
+ mql.addEventListener('change', onChange)
20
20
  return undefined
21
21
  })
22
22
 
23
23
  onUnmount(() => {
24
- mql?.removeEventListener("change", onChange)
24
+ mql?.removeEventListener('change', onChange)
25
25
  })
26
26
 
27
27
  return matches
@@ -1,6 +1,6 @@
1
- import { createRef } from "@pyreon/core"
2
- import { runUntracked, signal, watch } from "@pyreon/reactivity"
3
- import type { TransitionStage, TransitionStateResult } from "./types"
1
+ import { createRef } from '@pyreon/core'
2
+ import { runUntracked, signal, watch } from '@pyreon/reactivity'
3
+ import type { TransitionStage, TransitionStateResult } from './types'
4
4
 
5
5
  export type UseTransitionState = (options: {
6
6
  show: () => boolean
@@ -12,7 +12,7 @@ const useTransitionState: UseTransitionState = ({ show, appear = false }) => {
12
12
  // When appear=true and show starts true, mount the element (stage='entered')
13
13
  // but defer the enter animation until the ref is connected.
14
14
  const needsAppear = appear && initialShow
15
- const stage = signal<TransitionStage>(initialShow ? "entered" : "hidden")
15
+ const stage = signal<TransitionStage>(initialShow ? 'entered' : 'hidden')
16
16
  const elementRef = createRef<HTMLElement>()
17
17
  let isInitialMount = true
18
18
  let appearTriggered = false
@@ -22,7 +22,7 @@ const useTransitionState: UseTransitionState = ({ show, appear = false }) => {
22
22
  elementRef.current = node
23
23
  if (node && needsAppear && !appearTriggered) {
24
24
  appearTriggered = true
25
- stage.set("entering")
25
+ stage.set('entering')
26
26
  }
27
27
  }
28
28
 
@@ -36,10 +36,10 @@ const useTransitionState: UseTransitionState = ({ show, appear = false }) => {
36
36
  }
37
37
 
38
38
  const currentStage = runUntracked(() => stage())
39
- if (showVal && (currentStage === "hidden" || currentStage === "leaving")) {
40
- stage.set("entering")
41
- } else if (!showVal && (currentStage === "entered" || currentStage === "entering")) {
42
- stage.set("leaving")
39
+ if (showVal && (currentStage === 'hidden' || currentStage === 'leaving')) {
40
+ stage.set('entering')
41
+ } else if (!showVal && (currentStage === 'entered' || currentStage === 'entering')) {
42
+ stage.set('leaving')
43
43
  }
44
44
  },
45
45
  { immediate: true },
@@ -47,14 +47,14 @@ const useTransitionState: UseTransitionState = ({ show, appear = false }) => {
47
47
 
48
48
  const complete = () => {
49
49
  const current = stage()
50
- if (current === "entering") stage.set("entered")
51
- if (current === "leaving") stage.set("hidden")
50
+ if (current === 'entering') stage.set('entered')
51
+ if (current === 'leaving') stage.set('hidden')
52
52
  }
53
53
 
54
54
  return {
55
55
  stage,
56
56
  ref: refCallback,
57
- shouldMount: () => stage() !== "hidden",
57
+ shouldMount: () => stage() !== 'hidden',
58
58
  complete,
59
59
  }
60
60
  }
package/src/utils.ts CHANGED
@@ -1,5 +1,5 @@
1
- import type { Ref, VNode } from "@pyreon/core"
2
- import type { CSSProperties } from "./types"
1
+ import type { Ref, VNode } from '@pyreon/core'
2
+ import type { CSSProperties } from './types'
3
3
 
4
4
  const splitCache = new Map<string, string[]>()
5
5
  const splitClasses = (classes: string): string[] => {
@@ -41,7 +41,7 @@ export const mergeClassNames = (
41
41
  additional: string | undefined,
42
42
  ): string | undefined => {
43
43
  const parts = [existing, additional].filter(Boolean)
44
- return parts.length > 0 ? parts.join(" ") : undefined
44
+ return parts.length > 0 ? parts.join(' ') : undefined
45
45
  }
46
46
 
47
47
  /** Merges two CSSProperties objects, with `b` taking precedence. */
@@ -65,7 +65,7 @@ export const mergeRefs = <T>(...refs: (RefLike<T> | undefined)[]): ((node: T | n
65
65
  return (node: T | null) => {
66
66
  for (const ref of refs) {
67
67
  if (!ref) continue
68
- if (typeof ref === "function") {
68
+ if (typeof ref === 'function') {
69
69
  ref(node)
70
70
  } else {
71
71
  ;(ref as { current: unknown }).current = node