@wardic/solid 1.0.0-rc.4 → 1.0.0-rc.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.
Files changed (177) hide show
  1. package/dist/browser/bridge.js +1 -1
  2. package/dist/browser/bridge.js.map +1 -1
  3. package/dist/browser/create-ward.js +1 -1
  4. package/dist/browser/create-ward.js.map +1 -1
  5. package/dist/browser/feature.js +10 -0
  6. package/dist/browser/feature.js.map +1 -1
  7. package/dist/browser/features/input.js +2 -5
  8. package/dist/browser/features/input.js.map +1 -1
  9. package/dist/browser/features/scroll.js +21 -0
  10. package/dist/browser/features/scroll.js.map +1 -0
  11. package/dist/browser/index.js +4 -2
  12. package/dist/browser/index.js.map +1 -1
  13. package/dist/browser/layout.js +1 -1
  14. package/dist/browser/layout.js.map +1 -1
  15. package/dist/browser/live-scroll.js +115 -0
  16. package/dist/browser/live-scroll.js.map +1 -0
  17. package/dist/browser/live-style.js +2 -1
  18. package/dist/browser/live-style.js.map +1 -1
  19. package/dist/browser/live-value.js +12 -98
  20. package/dist/browser/live-value.js.map +1 -1
  21. package/dist/browser/reorder.js +14 -10
  22. package/dist/browser/reorder.js.map +1 -1
  23. package/dist/browser/runtime.js +1 -1
  24. package/dist/browser/runtime.js.map +1 -1
  25. package/dist/browser/spine.js +1 -1
  26. package/dist/browser/spine.js.map +1 -1
  27. package/dist/browser/unstable/v2/bridge.js +1 -1
  28. package/dist/browser/unstable/v2/bridge.js.map +1 -1
  29. package/dist/browser/unstable/v2/index.js +3 -1
  30. package/dist/browser/unstable/v2/index.js.map +1 -1
  31. package/dist/browser/unstable/v2/layout.js +1 -1
  32. package/dist/browser/unstable/v2/layout.js.map +1 -1
  33. package/dist/browser/unstable/v2/live-scroll.js +128 -0
  34. package/dist/browser/unstable/v2/live-scroll.js.map +1 -0
  35. package/dist/browser/unstable/v2/live-value.js +7 -105
  36. package/dist/browser/unstable/v2/live-value.js.map +1 -1
  37. package/dist/browser/unstable/v2/provider.js +13 -7
  38. package/dist/browser/unstable/v2/provider.js.map +1 -1
  39. package/dist/browser/unstable/v2/ward.js +1 -1
  40. package/dist/browser/unstable/v2/ward.js.map +1 -1
  41. package/dist/server/bridge.js +1 -1
  42. package/dist/server/bridge.js.map +1 -1
  43. package/dist/server/create-ward.js +1 -1
  44. package/dist/server/create-ward.js.map +1 -1
  45. package/dist/server/feature.js +10 -0
  46. package/dist/server/feature.js.map +1 -1
  47. package/dist/server/features/input.js +2 -5
  48. package/dist/server/features/input.js.map +1 -1
  49. package/dist/server/features/scroll.js +21 -0
  50. package/dist/server/features/scroll.js.map +1 -0
  51. package/dist/server/index.js +4 -2
  52. package/dist/server/index.js.map +1 -1
  53. package/dist/server/layout.js +1 -1
  54. package/dist/server/layout.js.map +1 -1
  55. package/dist/server/live-scroll.js +115 -0
  56. package/dist/server/live-scroll.js.map +1 -0
  57. package/dist/server/live-style.js +2 -1
  58. package/dist/server/live-style.js.map +1 -1
  59. package/dist/server/live-value.js +12 -98
  60. package/dist/server/live-value.js.map +1 -1
  61. package/dist/server/reorder.js +14 -10
  62. package/dist/server/reorder.js.map +1 -1
  63. package/dist/server/runtime.js +1 -1
  64. package/dist/server/runtime.js.map +1 -1
  65. package/dist/server/spine.js +1 -1
  66. package/dist/server/spine.js.map +1 -1
  67. package/dist/server/unstable/v2/bridge.js +1 -1
  68. package/dist/server/unstable/v2/bridge.js.map +1 -1
  69. package/dist/server/unstable/v2/index.js +3 -1
  70. package/dist/server/unstable/v2/index.js.map +1 -1
  71. package/dist/server/unstable/v2/layout.js +1 -1
  72. package/dist/server/unstable/v2/layout.js.map +1 -1
  73. package/dist/server/unstable/v2/live-scroll.js +128 -0
  74. package/dist/server/unstable/v2/live-scroll.js.map +1 -0
  75. package/dist/server/unstable/v2/live-value.js +7 -105
  76. package/dist/server/unstable/v2/live-value.js.map +1 -1
  77. package/dist/server/unstable/v2/provider.js +13 -7
  78. package/dist/server/unstable/v2/provider.js.map +1 -1
  79. package/dist/server/unstable/v2/ward.js +1 -1
  80. package/dist/server/unstable/v2/ward.js.map +1 -1
  81. package/dist/solid/bridge.d.ts +1 -1
  82. package/dist/solid/bridge.d.ts.map +1 -1
  83. package/dist/solid/bridge.js +1 -1
  84. package/dist/solid/bridge.js.map +1 -1
  85. package/dist/solid/create-ward.d.ts +1 -1
  86. package/dist/solid/create-ward.d.ts.map +1 -1
  87. package/dist/solid/create-ward.jsx +1 -1
  88. package/dist/solid/create-ward.jsx.map +1 -1
  89. package/dist/solid/feature.d.ts +5 -0
  90. package/dist/solid/feature.d.ts.map +1 -1
  91. package/dist/solid/feature.js +10 -0
  92. package/dist/solid/feature.js.map +1 -1
  93. package/dist/solid/features/input.d.ts.map +1 -1
  94. package/dist/solid/features/input.js +2 -6
  95. package/dist/solid/features/input.js.map +1 -1
  96. package/dist/solid/features/scroll.d.ts +16 -0
  97. package/dist/solid/features/scroll.d.ts.map +1 -0
  98. package/dist/solid/features/scroll.js +21 -0
  99. package/dist/solid/features/scroll.js.map +1 -0
  100. package/dist/solid/index.d.ts +5 -2
  101. package/dist/solid/index.d.ts.map +1 -1
  102. package/dist/solid/index.js +4 -2
  103. package/dist/solid/index.js.map +1 -1
  104. package/dist/solid/layout.jsx +1 -1
  105. package/dist/solid/layout.jsx.map +1 -1
  106. package/dist/solid/live-scroll.d.ts +47 -0
  107. package/dist/solid/live-scroll.d.ts.map +1 -0
  108. package/dist/solid/live-scroll.js +84 -0
  109. package/dist/solid/live-scroll.js.map +1 -0
  110. package/dist/solid/live-style.d.ts +2 -1
  111. package/dist/solid/live-style.d.ts.map +1 -1
  112. package/dist/solid/live-style.js +2 -1
  113. package/dist/solid/live-style.js.map +1 -1
  114. package/dist/solid/live-value.d.ts +4 -45
  115. package/dist/solid/live-value.d.ts.map +1 -1
  116. package/dist/solid/live-value.js +13 -67
  117. package/dist/solid/live-value.js.map +1 -1
  118. package/dist/solid/reorder.d.ts.map +1 -1
  119. package/dist/solid/reorder.jsx +11 -6
  120. package/dist/solid/reorder.jsx.map +1 -1
  121. package/dist/solid/runtime.d.ts +1 -1
  122. package/dist/solid/runtime.d.ts.map +1 -1
  123. package/dist/solid/runtime.js +1 -1
  124. package/dist/solid/runtime.js.map +1 -1
  125. package/dist/solid/spine.d.ts +1 -1
  126. package/dist/solid/spine.d.ts.map +1 -1
  127. package/dist/solid/spine.js +1 -1
  128. package/dist/solid/spine.js.map +1 -1
  129. package/dist/solid/unstable/v2/bridge.d.ts +2 -1
  130. package/dist/solid/unstable/v2/bridge.d.ts.map +1 -1
  131. package/dist/solid/unstable/v2/bridge.js +1 -1
  132. package/dist/solid/unstable/v2/bridge.js.map +1 -1
  133. package/dist/solid/unstable/v2/index.d.ts +4 -2
  134. package/dist/solid/unstable/v2/index.d.ts.map +1 -1
  135. package/dist/solid/unstable/v2/index.js +3 -1
  136. package/dist/solid/unstable/v2/index.js.map +1 -1
  137. package/dist/solid/unstable/v2/layout.jsx +1 -1
  138. package/dist/solid/unstable/v2/layout.jsx.map +1 -1
  139. package/dist/solid/unstable/v2/live-scroll.d.ts +47 -0
  140. package/dist/solid/unstable/v2/live-scroll.d.ts.map +1 -0
  141. package/dist/solid/unstable/v2/live-scroll.js +94 -0
  142. package/dist/solid/unstable/v2/live-scroll.js.map +1 -0
  143. package/dist/solid/unstable/v2/live-value.d.ts +4 -45
  144. package/dist/solid/unstable/v2/live-value.d.ts.map +1 -1
  145. package/dist/solid/unstable/v2/live-value.js +7 -71
  146. package/dist/solid/unstable/v2/live-value.js.map +1 -1
  147. package/dist/solid/unstable/v2/provider.d.ts.map +1 -1
  148. package/dist/solid/unstable/v2/provider.jsx +14 -7
  149. package/dist/solid/unstable/v2/provider.jsx.map +1 -1
  150. package/dist/solid/unstable/v2/ward.d.ts +1 -1
  151. package/dist/solid/unstable/v2/ward.d.ts.map +1 -1
  152. package/dist/solid/unstable/v2/ward.jsx +1 -1
  153. package/dist/solid/unstable/v2/ward.jsx.map +1 -1
  154. package/dist/solid/ward-keys.d.ts +1 -1
  155. package/dist/solid/ward-keys.d.ts.map +1 -1
  156. package/package.json +4 -4
  157. package/src/bridge.ts +2 -1
  158. package/src/create-ward.tsx +1 -1
  159. package/src/feature.ts +17 -0
  160. package/src/features/input.ts +2 -10
  161. package/src/features/scroll.ts +21 -0
  162. package/src/index.ts +4 -5
  163. package/src/layout.tsx +1 -1
  164. package/src/live-scroll.ts +125 -0
  165. package/src/live-style.ts +2 -1
  166. package/src/live-value.ts +13 -107
  167. package/src/reorder.tsx +11 -6
  168. package/src/runtime.ts +1 -1
  169. package/src/spine.ts +1 -1
  170. package/src/unstable/v2/bridge.ts +2 -1
  171. package/src/unstable/v2/index.ts +3 -5
  172. package/src/unstable/v2/layout.tsx +1 -1
  173. package/src/unstable/v2/live-scroll.ts +137 -0
  174. package/src/unstable/v2/live-value.ts +7 -112
  175. package/src/unstable/v2/provider.tsx +19 -13
  176. package/src/unstable/v2/ward.tsx +1 -1
  177. package/src/ward-keys.ts +1 -1
@@ -25,18 +25,15 @@
25
25
  */
26
26
  import type * as InterpolatorRegistry from "@wardic/core/InterpolatorRegistry"
27
27
  import * as LiveValue from "@wardic/core/LiveValue"
28
- import type * as ScrollOffset from "@wardic/dom/ScrollOffset"
29
- import * as Arr from "effect/Array"
30
28
  import * as Bool from "effect/Boolean"
31
29
  import * as Effect from "effect/Effect"
32
- import * as Option from "effect/Option"
33
30
  import * as Predicate from "effect/Predicate"
34
- import { Atom, AtomRegistry } from "effect/reactivity"
35
- import * as Rec from "effect/Record"
31
+ import * as Atom from "effect/reactivity/Atom"
32
+ import * as AtomRegistry from "effect/reactivity/AtomRegistry"
36
33
  import * as Scope from "effect/Scope"
37
34
  import * as UndefinedOr from "effect/UndefinedOr"
38
35
  import { isServer } from "@solidjs/web"
39
- import { type Accessor, createEffect, createMemo, createSignal, onCleanup, untrack } from "solid-js"
36
+ import { type Accessor, createEffect, createMemo, onCleanup, untrack } from "solid-js"
40
37
  import {
41
38
  atomOf,
42
39
  type FollowAccessor,
@@ -59,7 +56,7 @@ import { eachFrameOf } from "../../animation-frame.ts"
59
56
  import * as OwnerScope from "../../owner-scope.ts"
60
57
  import { withServerInterpolators } from "../../server-interpolators.ts"
61
58
  import { followAtom } from "./bridge.ts"
62
- import { CLIENT_ONLY, CLIENT_ONLY_DEFERRED, onSettledClientOnly } from "./solid-reactivity.ts"
59
+ import { CLIENT_ONLY, CLIENT_ONLY_DEFERRED } from "./solid-reactivity.ts"
63
60
  import { useWardicRuntime, useWardicSkipAnimations } from "./provider.tsx"
64
61
 
65
62
  /** A Live value read now on a server: an Atom through a server's own registry, an accessor called. */
@@ -87,7 +84,7 @@ const sourceAtomOf = <A>(source: LiveSource<A>, registry: AtomRegistry.AtomRegis
87
84
  })
88
85
 
89
86
  /** What a helper's Scope reports when one of its finalizers fails as its owner goes. */
90
- const CLOSE_FAILED = "wardic.liveValue: a finalizer failed"
87
+ export const CLOSE_FAILED = "wardic.liveValue: a finalizer failed"
91
88
 
92
89
  /** A helper's Atom, made on the provider's runtime in a Scope its owner's disposal closes, as an accessor carrying it. */
93
90
  const liveOf = <A, R>(runtime: WardicRuntime, live: Effect.Effect<Atom.Atom<A>, never, R>): Accessor<A> => {
@@ -264,7 +261,8 @@ export const createTime = (): Accessor<number> => {
264
261
  return liveOf(useWardicRuntime(), LiveValue.time())
265
262
  }
266
263
 
267
- const SERVER_ZERO: Accessor<number> = () => 0
264
+ /** A server render's value of a Live helper: 0, and no Atom. Internal. */
265
+ export const SERVER_ZERO: Accessor<number> = () => 0
268
266
 
269
267
  /**
270
268
  * A `will-change` for an element's `style`: `"auto"` until the element first animates a transform key,
@@ -309,106 +307,3 @@ export const createAnimationFrame = (callback: (time: number, delta: number) =>
309
307
  runtime.runSync(eachFrameOf(runtime, callback).pipe(Scope.provide(scope)))
310
308
  }
311
309
 
312
- /** An element, or an accessor of one, such as `() => box` for a ref: read once it's there. */
313
- export type ElementSource = Element | Accessor<Element | undefined>
314
-
315
- /** `createScroll`'s options, as Motion's `useScroll`'s. */
316
- export interface ScrollOptions {
317
- /** The scrolling element, as an accessor of its ref: `() => box`. The page's scroll when left out. */
318
- readonly container?: ElementSource
319
- /** An element whose way through the container the progress reads, between the `offset`s. */
320
- readonly target?: ElementSource
321
- /**
322
- * Where the progress runs, as Motion's: each stop pairs an edge of the target with an edge of the
323
- * container, `["start end", "end start"]`, 0 at the first and 1 at the last. An edge is `start`,
324
- * `center` or `end`, a fraction, or a length. With a target, `["start start", "end end"]` by default.
325
- */
326
- // The DOM's syntax (`@wardic/dom/ScrollOffset`); with a target and none given, its `All`.
327
- readonly offset?: ScrollOffset.ScrollOffset
328
- /** The axis `target` and `offset` read: `"y"` (the default) or `"x"`. */
329
- readonly axis?: "x" | "y"
330
- }
331
-
332
- /** `createScroll`'s values, Motion's four, each an accessor. */
333
- export interface ScrollValues {
334
- /** How far it's scrolled across, in pixels. */
335
- readonly scrollX: Accessor<number>
336
- /** How far it's scrolled down, in pixels. */
337
- readonly scrollY: Accessor<number>
338
- /** Its progress across, from 0 to 1: through its range, or, with a `target` or `offset`, through theirs. */
339
- readonly scrollXProgress: Accessor<number>
340
- /** Its progress down, from 0 to 1: through its range, or, with a `target` or `offset`, through theirs. */
341
- readonly scrollYProgress: Accessor<number>
342
- }
343
-
344
- const SCROLL_KEYS = ["scrollX", "scrollY", "scrollXProgress", "scrollYProgress"] as const
345
- /** `createScroll`'s elements before the render has settled: none yet. */
346
- const NOT_YET = { container: Option.none(), target: Option.none() } as const
347
- const SERVER_SCROLL: ScrollValues = { scrollX: SERVER_ZERO, scrollY: SERVER_ZERO, scrollXProgress: SERVER_ZERO, scrollYProgress: SERVER_ZERO }
348
-
349
- /** An element source read now: `None` for an accessor whose ref hasn't arrived. */
350
- const elementOf = (source: ElementSource | undefined): Option.Option<Element | undefined> =>
351
- Bool.match(Predicate.isFunction(source), {
352
- onTrue: () => Option.fromUndefinedOr((source as Accessor<Element | undefined>)()),
353
- onFalse: () => Option.some(source as Element | undefined),
354
- })
355
-
356
- /**
357
- * A scroll as values: `scrollX` and `scrollY`, how far it's scrolled, in pixels, and `scrollXProgress`
358
- * and `scrollYProgress`, from 0 to 1 through its range. The page's, or a `container`'s. With a
359
- * `target`, the progress is the target's way through, between two `offset`s, on `axis`. Each is set in
360
- * the scroll's own event, so a value derived from one paints in the frame that shows the scroll. A
361
- * `container` or `target` given as an accessor of a ref reads 0s until the ref is there. 0s on a
362
- * server. Motion's `useScroll`.
363
- *
364
- * @example
365
- * let box!: HTMLDivElement
366
- * const { scrollYProgress } = createScroll({ container: () => box })
367
- * <div ref={box}>…</div>
368
- * <w.div style={{ scaleX: scrollYProgress }} />
369
- * @see https://wardic.dev/reference/solid/live-values/create-scroll
370
- */
371
- // #234. An accessor `container` or `target` is read in an effect, and a change of either follows the
372
- // new one. Each value carries one Atom for its life.
373
- export const createScroll = (options: ScrollOptions = {}): ScrollValues => {
374
- if (isServer) return SERVER_SCROLL
375
- const runtime = useWardicRuntime()
376
- const registry = runtime.runSync(AtomRegistry.AtomRegistry)
377
- // Its own four Atoms, set from the scroll of the elements there now.
378
- const outs = Rec.fromIterableWith(SCROLL_KEYS, (key) => [key, Atom.make(0)] as const)
379
- Arr.forEach(SCROLL_KEYS, (key) => onCleanup(registry.mount(outs[key])))
380
- // Its elements are read once the render has settled: a ref given as `() => box` is set during the
381
- // render, after this effect's first compute, and isn't a signal, so nothing would read it again.
382
- const [settled, setSettled] = createSignal(false)
383
- onSettledClientOnly(() => {
384
- setSettled(true)
385
- })
386
- createEffect(
387
- () =>
388
- Bool.match(settled(), {
389
- onTrue: () => ({ container: elementOf(options.container), target: elementOf(options.target) }),
390
- onFalse: () => NOT_YET,
391
- }),
392
- ({ container, target }) => {
393
- // A ref not there yet: the values hold until it is.
394
- if (Bool.or(Option.isNone(container), Option.isNone(target))) return undefined
395
- const scope = OwnerScope.open(runtime)
396
- const values = runtime.runSync(
397
- LiveValue.scroll({
398
- ...UndefinedOr.match(Option.getOrUndefined(container), { onUndefined: () => ({}), onDefined: (element) => ({ container: element }) }),
399
- ...UndefinedOr.match(Option.getOrUndefined(target), { onUndefined: () => ({}), onDefined: (element) => ({ target: element }) }),
400
- ...UndefinedOr.match(options.offset, { onUndefined: () => ({}), onDefined: (offset) => ({ offset }) }),
401
- ...UndefinedOr.match(options.axis, { onUndefined: () => ({}), onDefined: (axis) => ({ axis }) }),
402
- }).pipe(Scope.provide(scope)),
403
- )
404
- // Each derived Atom is read at once: it tracks the scroll only once it's been read.
405
- const stops = Arr.map(SCROLL_KEYS, (key) => registry.subscribe(values[key], (v) => registry.set(outs[key], v), { immediate: true }))
406
- return () => {
407
- Arr.forEach(stops, (stop) => stop())
408
- OwnerScope.close(runtime, scope, CLOSE_FAILED)
409
- }
410
- },
411
- CLIENT_ONLY,
412
- )
413
- return Rec.map(outs, (atom) => followAtom(registry, atom)) as unknown as ScrollValues
414
- }
@@ -77,6 +77,23 @@ const WardicContext = createContext<WardicContextValue | null>(null)
77
77
  /** The nearest provider's value, `undefined` outside one. */
78
78
  const contextValue = (): WardicContextValue | undefined => Option.getOrUndefined(Option.fromNullishOr(useContext(WardicContext)))
79
79
 
80
+ /**
81
+ * A provider's context: a server render's, inert, or the client's. Decided by a plain `if`: a client
82
+ * build folds `isServer` and drops the server render's code, where `Bool.match` kept it (#518: 8.4 KB
83
+ * gzipped in every Solid 2 app). `env` and `appear` are read once, as the provider's docs say.
84
+ */
85
+ const contextOf = (given: Parameters<typeof WardicProvider>[0]): WardicContextValue => {
86
+ if (isServer) return serverContext(given.env, serverAppearOf(given.appear, given.reducedMotion, given.nonce), () => untrack(() => given.reducedMotion))
87
+ return clientContext(
88
+ given.env,
89
+ applyAndFlush,
90
+ () => untrack(() => given.reducedMotion),
91
+ // The provider's setting, tracked too: `createReducedMotionConfig` reads it where it tracks (#584).
92
+ () => given.reducedMotion,
93
+ untrack(() => given.scaleCorrectors),
94
+ )
95
+ }
96
+
80
97
  /**
81
98
  * Puts Wardic in your app: every Wardic element sits under one. Give it the Environment, `DomLive` in
82
99
  * a browser, and the Features your elements use.
@@ -124,18 +141,7 @@ export function WardicProvider(props: {
124
141
  readonly strict?: boolean | undefined
125
142
  readonly children?: JSX.Element
126
143
  }): JSX.Element {
127
- const value = Bool.match(isServer, {
128
- onTrue: () => serverContext(props.env, serverAppearOf(props.appear, props.reducedMotion, props.nonce), () => untrack(() => props.reducedMotion)),
129
- onFalse: () =>
130
- clientContext(
131
- props.env,
132
- applyAndFlush,
133
- () => untrack(() => props.reducedMotion),
134
- // eslint-disable-next-line solid/reactivity -- the provider's setting, tracked too: `createReducedMotionConfig` reads it where it tracks (#584)
135
- () => props.reducedMotion,
136
- untrack(() => props.scaleCorrectors),
137
- ),
138
- })
144
+ const value = contextOf(props)
139
145
  // Disposing the runtime closes its Scope: the projection system, then the gate (#132). Its
140
146
  // disposal rejects first, ending every `animateLayout` still waiting: their flights won't end (#257).
141
147
  let abort = constUndefined as (reason: DOMException) => void
@@ -156,7 +162,7 @@ export function WardicProvider(props: {
156
162
  // element mounted after pays none of it. One mounted before then builds it itself, as before. Asked
157
163
  // for here, with no computation of the provider's own (an `onSettled`'s would shift a hydration's
158
164
  // owners from the server's), and on the client alone.
159
- if (Bool.not(isServer)) onCleanup(whenIdle(() => prepareIdle(value, section)))
165
+ if (!isServer) onCleanup(whenIdle(() => prepareIdle(value, section)))
160
166
  return <WardicContext value={value}>{props.children}</WardicContext>
161
167
  }
162
168
 
@@ -66,7 +66,7 @@ import { constFalse, constTrue, constUndefined, constVoid, identity, pipe } from
66
66
  import * as Option from "effect/Option"
67
67
  import * as Predicate from "effect/Predicate"
68
68
  import * as UndefinedOr from "effect/UndefinedOr"
69
- import { Atom } from "effect/reactivity"
69
+ import * as Atom from "effect/reactivity/Atom"
70
70
  import { isServer, type JSX, useHead } from "@solidjs/web"
71
71
  import {
72
72
  type Accessor,
package/src/ward-keys.ts CHANGED
@@ -14,7 +14,7 @@
14
14
  * @module
15
15
  */
16
16
  import type * as Machine from "@wardic/core/Machine"
17
- import type { Atom } from "effect/reactivity"
17
+ import type * as Atom from "effect/reactivity/Atom"
18
18
  import type {
19
19
  WardicInertia,
20
20
  WardicInherit,