foldkit 0.100.1 → 0.102.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.
Files changed (217) hide show
  1. package/README.md +3 -2
  2. package/dist/canvas/view.d.ts +1 -1
  3. package/dist/canvas/view.d.ts.map +1 -1
  4. package/dist/canvas/view.js +5 -5
  5. package/dist/command/index.d.ts +71 -0
  6. package/dist/command/index.d.ts.map +1 -1
  7. package/dist/command/index.js +34 -1
  8. package/dist/command/public.d.ts +1 -1
  9. package/dist/command/public.d.ts.map +1 -1
  10. package/dist/command/public.js +1 -1
  11. package/dist/devTools/overlay.d.ts.map +1 -1
  12. package/dist/devTools/overlay.js +156 -149
  13. package/dist/dom/dom.d.ts +8 -11
  14. package/dist/dom/dom.d.ts.map +1 -1
  15. package/dist/dom/dom.js +8 -11
  16. package/dist/dom/elementMovement.d.ts +1 -3
  17. package/dist/dom/elementMovement.d.ts.map +1 -1
  18. package/dist/dom/elementMovement.js +1 -3
  19. package/dist/dom/inert.d.ts +2 -4
  20. package/dist/dom/inert.d.ts.map +1 -1
  21. package/dist/dom/inert.js +2 -4
  22. package/dist/dom/scrollLock.d.ts +2 -2
  23. package/dist/dom/scrollLock.js +2 -2
  24. package/dist/dom/waitForAnimation.d.ts +1 -1
  25. package/dist/dom/waitForAnimation.js +1 -1
  26. package/dist/html/boundary.d.ts +98 -0
  27. package/dist/html/boundary.d.ts.map +1 -0
  28. package/dist/html/boundary.js +176 -0
  29. package/dist/html/childAttribute.d.ts +44 -0
  30. package/dist/html/childAttribute.d.ts.map +1 -0
  31. package/dist/html/childAttribute.js +34 -0
  32. package/dist/html/index.d.ts +70 -23
  33. package/dist/html/index.d.ts.map +1 -1
  34. package/dist/html/index.js +639 -575
  35. package/dist/html/lazy.d.ts +12 -7
  36. package/dist/html/lazy.d.ts.map +1 -1
  37. package/dist/html/lazy.js +30 -11
  38. package/dist/html/public.d.ts +2 -2
  39. package/dist/html/public.d.ts.map +1 -1
  40. package/dist/html/public.js +1 -1
  41. package/dist/html/runtimeSingleton.d.ts +72 -0
  42. package/dist/html/runtimeSingleton.d.ts.map +1 -0
  43. package/dist/html/runtimeSingleton.js +112 -0
  44. package/dist/html/submodel.d.ts +98 -0
  45. package/dist/html/submodel.d.ts.map +1 -0
  46. package/dist/html/submodel.js +190 -0
  47. package/dist/index.d.ts +1 -0
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +1 -0
  50. package/dist/render/render.d.ts +1 -1
  51. package/dist/render/render.js +1 -1
  52. package/dist/runtime/messagePriority.d.ts +5 -1
  53. package/dist/runtime/messagePriority.d.ts.map +1 -1
  54. package/dist/runtime/messagePriority.js +25 -4
  55. package/dist/runtime/runtime.d.ts +11 -11
  56. package/dist/runtime/runtime.d.ts.map +1 -1
  57. package/dist/runtime/runtime.js +118 -63
  58. package/dist/runtime/subscription.d.ts +139 -19
  59. package/dist/runtime/subscription.d.ts.map +1 -1
  60. package/dist/runtime/subscription.js +90 -9
  61. package/dist/submodel/public.d.ts +4 -0
  62. package/dist/submodel/public.d.ts.map +1 -0
  63. package/dist/submodel/public.js +1 -0
  64. package/dist/submodel/submodel.d.ts +32 -0
  65. package/dist/submodel/submodel.d.ts.map +1 -0
  66. package/dist/submodel/submodel.js +1 -0
  67. package/dist/subscription/animationFrame.d.ts +23 -26
  68. package/dist/subscription/animationFrame.d.ts.map +1 -1
  69. package/dist/subscription/animationFrame.js +17 -18
  70. package/dist/subscription/public.d.ts +2 -2
  71. package/dist/subscription/public.d.ts.map +1 -1
  72. package/dist/subscription/public.js +1 -1
  73. package/dist/test/apps/disabledButton.d.ts +4 -5
  74. package/dist/test/apps/disabledButton.d.ts.map +1 -1
  75. package/dist/test/apps/disabledButton.js +16 -16
  76. package/dist/test/scene.d.ts +8 -8
  77. package/dist/test/scene.d.ts.map +1 -1
  78. package/dist/test/scene.js +25 -13
  79. package/dist/test/story.d.ts +15 -8
  80. package/dist/test/story.d.ts.map +1 -1
  81. package/dist/test/story.js +21 -9
  82. package/dist/ui/animation/index.d.ts +30 -14
  83. package/dist/ui/animation/index.d.ts.map +1 -1
  84. package/dist/ui/animation/index.js +9 -19
  85. package/dist/ui/animation/public.d.ts +2 -2
  86. package/dist/ui/animation/public.d.ts.map +1 -1
  87. package/dist/ui/animation/public.js +1 -1
  88. package/dist/ui/calendar/index.d.ts +199 -84
  89. package/dist/ui/calendar/index.d.ts.map +1 -1
  90. package/dist/ui/calendar/index.js +129 -140
  91. package/dist/ui/calendar/public.d.ts +2 -2
  92. package/dist/ui/calendar/public.d.ts.map +1 -1
  93. package/dist/ui/calendar/public.js +1 -1
  94. package/dist/ui/checkbox/index.d.ts +93 -21
  95. package/dist/ui/checkbox/index.d.ts.map +1 -1
  96. package/dist/ui/checkbox/index.js +62 -33
  97. package/dist/ui/checkbox/public.d.ts +2 -2
  98. package/dist/ui/checkbox/public.d.ts.map +1 -1
  99. package/dist/ui/checkbox/public.js +1 -1
  100. package/dist/ui/combobox/multi.d.ts +35 -91
  101. package/dist/ui/combobox/multi.d.ts.map +1 -1
  102. package/dist/ui/combobox/multi.js +34 -17
  103. package/dist/ui/combobox/multiPublic.d.ts +2 -2
  104. package/dist/ui/combobox/multiPublic.d.ts.map +1 -1
  105. package/dist/ui/combobox/multiPublic.js +1 -1
  106. package/dist/ui/combobox/public.d.ts +3 -3
  107. package/dist/ui/combobox/public.d.ts.map +1 -1
  108. package/dist/ui/combobox/public.js +2 -2
  109. package/dist/ui/combobox/shared.d.ts +56 -31
  110. package/dist/ui/combobox/shared.d.ts.map +1 -1
  111. package/dist/ui/combobox/shared.js +333 -322
  112. package/dist/ui/combobox/single.d.ts +46 -93
  113. package/dist/ui/combobox/single.d.ts.map +1 -1
  114. package/dist/ui/combobox/single.js +44 -17
  115. package/dist/ui/datePicker/index.d.ts +256 -48
  116. package/dist/ui/datePicker/index.d.ts.map +1 -1
  117. package/dist/ui/datePicker/index.js +149 -104
  118. package/dist/ui/datePicker/public.d.ts +2 -2
  119. package/dist/ui/datePicker/public.d.ts.map +1 -1
  120. package/dist/ui/datePicker/public.js +1 -1
  121. package/dist/ui/dialog/index.d.ts +95 -39
  122. package/dist/ui/dialog/index.d.ts.map +1 -1
  123. package/dist/ui/dialog/index.js +71 -62
  124. package/dist/ui/dialog/public.d.ts +2 -2
  125. package/dist/ui/dialog/public.d.ts.map +1 -1
  126. package/dist/ui/dialog/public.js +1 -1
  127. package/dist/ui/disclosure/index.d.ts +71 -31
  128. package/dist/ui/disclosure/index.d.ts.map +1 -1
  129. package/dist/ui/disclosure/index.js +57 -62
  130. package/dist/ui/disclosure/public.d.ts +2 -2
  131. package/dist/ui/disclosure/public.d.ts.map +1 -1
  132. package/dist/ui/disclosure/public.js +1 -1
  133. package/dist/ui/dragAndDrop/index.d.ts +385 -103
  134. package/dist/ui/dragAndDrop/index.d.ts.map +1 -1
  135. package/dist/ui/dragAndDrop/index.js +26 -31
  136. package/dist/ui/dragAndDrop/public.d.ts +1 -1
  137. package/dist/ui/dragAndDrop/public.d.ts.map +1 -1
  138. package/dist/ui/dragAndDrop/public.js +1 -1
  139. package/dist/ui/fileDrop/index.d.ts +42 -46
  140. package/dist/ui/fileDrop/index.d.ts.map +1 -1
  141. package/dist/ui/fileDrop/index.js +30 -46
  142. package/dist/ui/fileDrop/public.d.ts +2 -2
  143. package/dist/ui/fileDrop/public.d.ts.map +1 -1
  144. package/dist/ui/fileDrop/public.js +1 -1
  145. package/dist/ui/listbox/multi.d.ts +39 -84
  146. package/dist/ui/listbox/multi.d.ts.map +1 -1
  147. package/dist/ui/listbox/multi.js +38 -20
  148. package/dist/ui/listbox/multiPublic.d.ts +2 -2
  149. package/dist/ui/listbox/multiPublic.d.ts.map +1 -1
  150. package/dist/ui/listbox/multiPublic.js +1 -1
  151. package/dist/ui/listbox/public.d.ts +3 -3
  152. package/dist/ui/listbox/public.d.ts.map +1 -1
  153. package/dist/ui/listbox/public.js +2 -2
  154. package/dist/ui/listbox/shared.d.ts +71 -30
  155. package/dist/ui/listbox/shared.d.ts.map +1 -1
  156. package/dist/ui/listbox/shared.js +319 -296
  157. package/dist/ui/listbox/single.d.ts +57 -85
  158. package/dist/ui/listbox/single.d.ts.map +1 -1
  159. package/dist/ui/listbox/single.js +48 -24
  160. package/dist/ui/menu/index.d.ts +80 -36
  161. package/dist/ui/menu/index.d.ts.map +1 -1
  162. package/dist/ui/menu/index.js +117 -86
  163. package/dist/ui/menu/public.d.ts +2 -2
  164. package/dist/ui/menu/public.d.ts.map +1 -1
  165. package/dist/ui/menu/public.js +1 -1
  166. package/dist/ui/popover/index.d.ts +117 -44
  167. package/dist/ui/popover/index.d.ts.map +1 -1
  168. package/dist/ui/popover/index.js +88 -101
  169. package/dist/ui/popover/public.d.ts +2 -2
  170. package/dist/ui/popover/public.d.ts.map +1 -1
  171. package/dist/ui/popover/public.js +1 -1
  172. package/dist/ui/radioGroup/index.d.ts +122 -45
  173. package/dist/ui/radioGroup/index.d.ts.map +1 -1
  174. package/dist/ui/radioGroup/index.js +111 -72
  175. package/dist/ui/radioGroup/public.d.ts +2 -2
  176. package/dist/ui/radioGroup/public.d.ts.map +1 -1
  177. package/dist/ui/radioGroup/public.js +1 -1
  178. package/dist/ui/slider/index.d.ts +247 -103
  179. package/dist/ui/slider/index.d.ts.map +1 -1
  180. package/dist/ui/slider/index.js +52 -68
  181. package/dist/ui/slider/public.d.ts +2 -2
  182. package/dist/ui/slider/public.d.ts.map +1 -1
  183. package/dist/ui/slider/public.js +1 -1
  184. package/dist/ui/switch/index.d.ts +74 -21
  185. package/dist/ui/switch/index.d.ts.map +1 -1
  186. package/dist/ui/switch/index.js +62 -33
  187. package/dist/ui/switch/public.d.ts +2 -2
  188. package/dist/ui/switch/public.d.ts.map +1 -1
  189. package/dist/ui/switch/public.js +1 -1
  190. package/dist/ui/tabs/index.d.ts +107 -45
  191. package/dist/ui/tabs/index.d.ts.map +1 -1
  192. package/dist/ui/tabs/index.js +99 -81
  193. package/dist/ui/tabs/public.d.ts +2 -2
  194. package/dist/ui/tabs/public.d.ts.map +1 -1
  195. package/dist/ui/tabs/public.js +1 -1
  196. package/dist/ui/toast/index.d.ts +93 -109
  197. package/dist/ui/toast/index.d.ts.map +1 -1
  198. package/dist/ui/toast/index.js +16 -29
  199. package/dist/ui/toast/schema.d.ts +15 -4
  200. package/dist/ui/toast/schema.d.ts.map +1 -1
  201. package/dist/ui/toast/schema.js +11 -4
  202. package/dist/ui/toast/update.d.ts +36 -18
  203. package/dist/ui/toast/update.d.ts.map +1 -1
  204. package/dist/ui/toast/update.js +33 -14
  205. package/dist/ui/tooltip/index.d.ts +94 -42
  206. package/dist/ui/tooltip/index.d.ts.map +1 -1
  207. package/dist/ui/tooltip/index.js +64 -73
  208. package/dist/ui/tooltip/public.d.ts +2 -2
  209. package/dist/ui/tooltip/public.d.ts.map +1 -1
  210. package/dist/ui/tooltip/public.js +1 -1
  211. package/dist/ui/virtualList/index.d.ts +63 -80
  212. package/dist/ui/virtualList/index.d.ts.map +1 -1
  213. package/dist/ui/virtualList/index.js +22 -49
  214. package/dist/ui/virtualList/public.d.ts +2 -2
  215. package/dist/ui/virtualList/public.d.ts.map +1 -1
  216. package/dist/ui/virtualList/public.js +1 -1
  217. package/package.json +1 -1
@@ -3,10 +3,10 @@ import { Array as Array_, Context, Effect, Equal, Function, HashSet, Match as M,
3
3
  import * as Command from '../command/index.js';
4
4
  import { lockScroll, unlockScroll } from '../dom/scrollLock.js';
5
5
  import { OptionExt } from '../effectExtensions/index.js';
6
- import { DEVTOOLS_HOST_ID, createKeyedLazy, createLazy, html, } from '../html/index.js';
6
+ import { DEVTOOLS_HOST_ID, childAttributes, createKeyedLazy, createLazy, html, } from '../html/index.js';
7
7
  import { m } from '../message/index.js';
8
8
  import { makeProgram } from '../runtime/runtime.js';
9
- import { makeSubscriptions } from '../runtime/subscription.js';
9
+ import * as Subscription from '../runtime/subscription.js';
10
10
  import { evo } from '../struct/index.js';
11
11
  import * as Listbox from '../ui/listbox/public.js';
12
12
  import * as Slider from '../ui/slider/public.js';
@@ -15,6 +15,7 @@ import { overlayStyles } from './overlay-styles.js';
15
15
  import { toInspectableValue } from './serialize.js';
16
16
  import { INIT_INDEX, } from './store.js';
17
17
  import { GOT_MESSAGE_PATTERN, extractSubmodelInfo, isTagged, } from './submodelPath.js';
18
+ const SubmodelFilterListbox = Listbox.create();
18
19
  // MODEL
19
20
  const DisplayCommand = S.Struct({
20
21
  name: S.String,
@@ -43,6 +44,13 @@ const InspectorTabsModel = S.Struct({
43
44
  focusedIndex: S.Number,
44
45
  activationMode: S.Literals(['Automatic', 'Manual']),
45
46
  });
47
+ const INSPECTOR_TABS = [
48
+ 'Model',
49
+ 'Message',
50
+ 'Commands',
51
+ 'Mounts',
52
+ ];
53
+ const InspectorTabs = Tabs.create();
46
54
  /**
47
55
  * `S.Unknown` whose equivalence is reference equality. Effect 4's default
48
56
  * equivalence for `S.Unknown` is `Equal.equals`, which walks the value
@@ -133,9 +141,6 @@ const ReceivedStoreUpdate = m('ReceivedStoreUpdate', {
133
141
  const GotSubmodelFilterMessage = m('GotSubmodelFilterMessage', {
134
142
  message: Listbox.Message,
135
143
  });
136
- const SelectedSubmodelFilter = m('SelectedSubmodelFilter', {
137
- tag: S.String,
138
- });
139
144
  // NOTE: suspend for the same init-order reason as scrubberSlider above.
140
145
  const GotScrubberSliderMessage = m('GotScrubberSliderMessage', {
141
146
  message: S.suspend(() => Slider.Message),
@@ -160,7 +165,6 @@ const Message = S.Union([
160
165
  GotInspectorTabsMessage,
161
166
  ReceivedStoreUpdate,
162
167
  GotSubmodelFilterMessage,
163
- SelectedSubmodelFilter,
164
168
  GotScrubberSliderMessage,
165
169
  ]);
166
170
  // HELPERS
@@ -224,7 +228,6 @@ const objectPreview = (value) => pipe(value, Record.keys, Array_.filter(key => k
224
228
  },
225
229
  }));
226
230
  const collapsedPreview = (value) => M.value(value).pipe(M.when(Array.isArray, array => `(${array.length})`), M.when(Predicate.isObject, objectPreview), M.orElse(() => ''));
227
- // UPDATE
228
231
  class StoreService extends Context.Service()('foldkit/DevToolsStore') {
229
232
  }
230
233
  class ShadowRootService extends Context.Service()('foldkit/DevToolsShadowRoot') {
@@ -361,14 +364,14 @@ const makeUpdate = (store, shadow, mode) => {
361
364
  [],
362
365
  ],
363
366
  GotInspectorTabsMessage: ({ message: tabsMessage }) => {
364
- const [nextTabsModel, tabsCommands] = Tabs.update(model.inspectorTabs,
367
+ const [nextTabsModel, tabsCommands] = InspectorTabs.update(model.inspectorTabs,
365
368
  /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
366
369
  tabsMessage);
367
370
  return [
368
371
  evo(model, {
369
372
  inspectorTabs: () => nextTabsModel,
370
373
  }),
371
- tabsCommands.map(Command.mapEffect(Effect.map(innerMessage => GotInspectorTabsMessage({ message: innerMessage })))),
374
+ Command.mapMessages(tabsCommands, innerMessage => GotInspectorTabsMessage({ message: innerMessage })),
372
375
  ];
373
376
  },
374
377
  ToggledTreeNode: ({ path }) => [
@@ -409,7 +412,7 @@ const makeUpdate = (store, shadow, mode) => {
409
412
  const targetSliderValue = isPaused
410
413
  ? hostIndexToSliderValue(pausedAtIndex, startIndex)
411
414
  : sliderMax;
412
- return Slider.setValue(Slider.setRange(current, { min: 0, max: sliderMax }), targetSliderValue);
415
+ return Slider.reflectValue(Slider.reflectRange(current, { min: 0, max: sliderMax }), targetSliderValue);
413
416
  },
414
417
  }),
415
418
  [
@@ -419,27 +422,27 @@ const makeUpdate = (store, shadow, mode) => {
419
422
  ];
420
423
  },
421
424
  GotSubmodelFilterMessage: ({ message: listboxMessage }) => {
422
- const [nextListboxModel, listboxCommands] = Listbox.update(model.submodelFilterListbox, listboxMessage);
423
- return [
424
- evo(model, {
425
- submodelFilterListbox: () => nextListboxModel,
426
- }),
427
- listboxCommands.map(Command.mapEffect(Effect.map(innerMessage => GotSubmodelFilterMessage({ message: innerMessage })))),
428
- ];
429
- },
430
- SelectedSubmodelFilter: ({ tag }) => {
431
- const [nextListbox, listboxCommands] = Listbox.selectItem(model.submodelFilterListbox, tag);
432
- return [
433
- evo(model, {
434
- maybeSubmodelFilter: () => Option.liftPredicate(tag, String_.isNonEmpty),
435
- submodelFilterListbox: () => nextListbox,
436
- }),
437
- listboxCommands.map(Command.mapEffect(Effect.map(innerMessage => GotSubmodelFilterMessage({ message: innerMessage })))),
438
- ];
425
+ const [nextListboxModel, listboxCommands, maybeOutMessage] = SubmodelFilterListbox.update(model.submodelFilterListbox, listboxMessage);
426
+ const mappedCommands = Command.mapMessages(listboxCommands, innerMessage => GotSubmodelFilterMessage({ message: innerMessage }));
427
+ return Option.match(maybeOutMessage, {
428
+ onNone: () => [
429
+ evo(model, { submodelFilterListbox: () => nextListboxModel }),
430
+ mappedCommands,
431
+ ],
432
+ onSome: M.type().pipe(M.withReturnType(), M.tagsExhaustive({
433
+ Selected: ({ value }) => [
434
+ evo(model, {
435
+ maybeSubmodelFilter: () => Option.liftPredicate(value, String_.isNonEmpty),
436
+ submodelFilterListbox: () => nextListboxModel,
437
+ }),
438
+ mappedCommands,
439
+ ],
440
+ })),
441
+ });
439
442
  },
440
443
  GotScrubberSliderMessage: ({ message: sliderMessage }) => {
441
444
  const [nextSlider, sliderCommands, maybeOutMessage] = Slider.update(model.scrubberSlider, sliderMessage);
442
- const mappedSliderCommands = sliderCommands.map(Command.mapEffect(Effect.map(innerMessage => GotScrubberSliderMessage({ message: innerMessage }))));
445
+ const mappedSliderCommands = Command.mapMessages(sliderCommands, innerMessage => GotScrubberSliderMessage({ message: innerMessage }));
443
446
  const additionalCommands = Option.match(maybeOutMessage, {
444
447
  onNone: () => [],
445
448
  onSome: outMessage => M.value(outMessage).pipe(M.tagsExhaustive({
@@ -457,47 +460,27 @@ const makeUpdate = (store, shadow, mode) => {
457
460
  }), M.tag('CompletedJump', 'CompletedResume', 'CompletedClear', 'LockedScroll', 'UnlockedScroll', 'ScrolledToTop', () => [model, []]), M.exhaustive);
458
461
  };
459
462
  // SUBSCRIPTION
460
- const ScrubberDragActivity = S.Literals(['Idle', 'Active']);
461
- const SubscriptionDependencies = S.Struct({
462
- storeUpdates: S.Boolean,
463
- mobileBreakpoint: S.Null,
464
- scrubberPointer: S.Struct({
465
- dragActivity: ScrubberDragActivity,
466
- id: S.String,
467
- min: S.Number,
468
- max: S.Number,
469
- }),
470
- scrubberEscape: S.Struct({
471
- dragActivity: ScrubberDragActivity,
472
- }),
473
- });
474
463
  const makeOverlaySubscriptions = (store, shadow) => {
475
464
  const sliderSubscriptions = Slider.subscriptionsForRoot(() => shadow);
476
- return makeSubscriptions(SubscriptionDependencies)({
477
- storeUpdates: {
478
- modelToDependencies: () => true,
479
- dependenciesToStream: () => Stream.concat(Stream.fromEffect(SubscriptionRef.get(store.stateRef).pipe(Effect.map(state => ReceivedStoreUpdate(toDisplayState(state))))), Stream.map(SubscriptionRef.changes(store.stateRef), state => ReceivedStoreUpdate(toDisplayState(state)))),
480
- },
481
- mobileBreakpoint: {
482
- modelToDependencies: () => null,
483
- dependenciesToStream: () => Stream.callback(queue => Effect.acquireRelease(Effect.sync(() => {
484
- const mediaQuery = window.matchMedia(MOBILE_BREAKPOINT_QUERY);
485
- const handler = (event) => {
486
- Queue.offerUnsafe(queue, CrossedMobileBreakpoint({ isMobile: event.matches }));
487
- };
488
- mediaQuery.addEventListener('change', handler);
489
- return { mediaQuery, handler };
490
- }), ({ mediaQuery, handler }) => Effect.sync(() => mediaQuery.removeEventListener('change', handler))).pipe(Effect.flatMap(() => Effect.never))),
491
- },
492
- scrubberPointer: {
493
- modelToDependencies: model => sliderSubscriptions.dragPointer.modelToDependencies(model.scrubberSlider),
494
- dependenciesToStream: (deps, readDeps) => Stream.map(sliderSubscriptions.dragPointer.dependenciesToStream(deps, readDeps), message => GotScrubberSliderMessage({ message })),
495
- },
496
- scrubberEscape: {
497
- modelToDependencies: model => sliderSubscriptions.dragEscape.modelToDependencies(model.scrubberSlider),
498
- dependenciesToStream: (deps, readDeps) => Stream.map(sliderSubscriptions.dragEscape.dependenciesToStream(deps, readDeps), message => GotScrubberSliderMessage({ message })),
499
- },
465
+ const scrubberSubscriptions = Subscription.lift({
466
+ scrubberPointer: sliderSubscriptions.dragPointer,
467
+ scrubberEscape: sliderSubscriptions.dragEscape,
468
+ })({
469
+ toChildModel: model => model.scrubberSlider,
470
+ toParentMessage: message => GotScrubberSliderMessage({ message }),
500
471
  });
472
+ const ownSubscriptions = Subscription.make()(_entry => ({
473
+ storeUpdates: Subscription.persistent(Stream.concat(Stream.fromEffect(SubscriptionRef.get(store.stateRef).pipe(Effect.map(state => ReceivedStoreUpdate(toDisplayState(state))))), Stream.map(SubscriptionRef.changes(store.stateRef), state => ReceivedStoreUpdate(toDisplayState(state))))),
474
+ mobileBreakpoint: Subscription.persistent(Stream.callback(queue => Effect.acquireRelease(Effect.sync(() => {
475
+ const mediaQuery = window.matchMedia(MOBILE_BREAKPOINT_QUERY);
476
+ const handler = (event) => {
477
+ Queue.offerUnsafe(queue, CrossedMobileBreakpoint({ isMobile: event.matches }));
478
+ };
479
+ mediaQuery.addEventListener('change', handler);
480
+ return { mediaQuery, handler };
481
+ }), ({ mediaQuery, handler }) => Effect.sync(() => mediaQuery.removeEventListener('change', handler))).pipe(Effect.flatMap(() => Effect.never)))),
482
+ }));
483
+ return Subscription.aggregate()(ownSubscriptions, scrubberSubscriptions);
501
484
  };
502
485
  // VIEW
503
486
  const indexClass = 'text-2xs text-dt-muted font-mono min-w-5';
@@ -522,14 +505,23 @@ const makeView = (position, mode, shadow, maybeBanner) => {
522
505
  const lazyTabContent = createKeyedLazy();
523
506
  const lazyMessageList = createLazy();
524
507
  // JSON TREE
525
- const leafValueView = (value) => M.value(value).pipe(M.when(Predicate.isNull, () => h.span([h.Class('json-null italic')], ['null'])), M.when(Predicate.isUndefined, () => h.span([h.Class('json-null italic')], ['undefined'])), M.when(Predicate.isString, stringValue => h.span([h.Class('json-string')], [`"${stringValue}"`])), M.when(Predicate.isNumber, numberValue => h.span([h.Class('json-number')], [String(numberValue)])), M.when(Predicate.isBoolean, booleanValue => h.span([h.Class('json-boolean')], [String(booleanValue)])), M.orElse(unknownValue => h.span([h.Class('json-null')], [String(unknownValue)])));
526
- const keyView = (key) => h.span([h.Class('json-key')], [`${key}:\u00a0`]);
508
+ const leafValueView = (value) => M.value(value).pipe(M.when(Predicate.isNull, () => h.span([h.Key('value'), h.Class('json-null italic')], ['null'])), M.when(Predicate.isUndefined, () => h.span([h.Key('value'), h.Class('json-null italic')], ['undefined'])), M.when(Predicate.isString, stringValue => h.span([h.Key('value'), h.Class('json-string')], [`"${stringValue}"`])), M.when(Predicate.isNumber, numberValue => h.span([h.Key('value'), h.Class('json-number')], [String(numberValue)])), M.when(Predicate.isBoolean, booleanValue => h.span([h.Key('value'), h.Class('json-boolean')], [String(booleanValue)])), M.orElse(unknownValue => h.span([h.Key('value'), h.Class('json-null')], [String(unknownValue)])));
509
+ // NOTE: each row-child view declares an explicit key. snabbdom's
510
+ // `sameVnode` only checks `key + sel`, and foldkit element vnodes carry
511
+ // `sel = tagName` with classes stored in `data.class`. Without per-role
512
+ // keys, two unkeyed spans with different classes (e.g. `.json-key` and
513
+ // `.diff-dot`) are sameVnode to snabbdom, so a single DOM span gets
514
+ // recycled across roles as rows transition shape \u2014 and the text-node
515
+ // children from the old role can leak into the new role's element.
516
+ // Keying by role pins each slot to its own DOM element.
517
+ const keyView = (key) => h.span([h.Key('key'), h.Class('json-key')], [`${key}:\u00a0`]);
527
518
  const CHEVRON_RIGHT = 'M8.25 4.5l7.5 7.5-7.5 7.5';
528
519
  const CHEVRON_DOWN = 'M19.5 8.25l-7.5 7.5-7.5-7.5';
529
520
  const arrowView = (isExpanded) => h.svg([
521
+ h.Key('arrow'),
530
522
  h.AriaHidden(true),
531
523
  h.Class('json-arrow shrink-0'),
532
- h.Xmlns('http://www.w3.org/2000/h.svg'),
524
+ h.Xmlns('http://www.w3.org/2000/svg'),
533
525
  h.Fill('none'),
534
526
  h.ViewBox('0 0 24 24'),
535
527
  h.StrokeWidth('2'),
@@ -541,8 +533,8 @@ const makeView = (position, mode, shadow, maybeBanner) => {
541
533
  h.D(isExpanded ? CHEVRON_DOWN : CHEVRON_RIGHT),
542
534
  ], []),
543
535
  ]);
544
- const tagLabelView = (tag) => h.span([h.Class('json-tag')], [tag]);
545
- const diffDotView = h.span([h.Class('diff-dot')], []);
536
+ const tagLabelView = (tag) => h.span([h.Key('tag'), h.Class('json-tag')], [tag]);
537
+ const diffDotView = h.span([h.Key('diffdot'), h.Class('diff-dot')], []);
546
538
  const inlineDiffDotView = h.span([h.Class('diff-dot-inline')], []);
547
539
  const flattenTree = ({ value, treePath, depth, key, ...shared }) => {
548
540
  const { rootPath, expandedPaths, changedPaths, affectedPaths, accumulator, indentRootChildren, } = shared;
@@ -619,7 +611,7 @@ const makeView = (position, mode, shadow, maybeBanner) => {
619
611
  ...(!isRoot && hasDiffDot ? [diffDotView] : []),
620
612
  ...(String_.isNonEmpty(key) ? [keyView(key)] : []),
621
613
  ...(String_.isNonEmpty(tag) ? [tagLabelView(tag)] : []),
622
- h.span([h.Class('json-preview')], [preview]),
614
+ h.span([h.Key('value'), h.Class('json-preview')], [preview]),
623
615
  ]);
624
616
  };
625
617
  const renderFlatNode = (node) => lazyTreeNode(node.treePath, flatNodeView, [
@@ -673,15 +665,9 @@ const makeView = (position, mode, shadow, maybeBanner) => {
673
665
  const emptyInspectorView = h.div([
674
666
  h.Class('flex-1 flex items-center justify-center text-dt-muted text-2xs font-mono min-w-0'),
675
667
  ], ['Click a message to inspect']);
676
- const INSPECTOR_TABS = [
677
- 'Model',
678
- 'Message',
679
- 'Commands',
680
- 'Mounts',
681
- ];
682
668
  const noMessageView = h.div([
683
669
  h.Class('flex-1 flex items-center justify-center text-dt-muted text-2xs font-mono min-w-0'),
684
- ], ['init no Message']);
670
+ ], ['init: no Message']);
685
671
  const modelTabContent = (inspectedModel, expandedPaths, changedPaths, affectedPaths) => treeView(inspectedModel, 'root', expandedPaths, changedPaths, affectedPaths, Option.none(), true);
686
672
  const unwrapIfFiltered = (message, maybeSubmodelFilter) => {
687
673
  if (Option.isNone(maybeSubmodelFilter)) {
@@ -856,25 +842,36 @@ const makeView = (position, mode, shadow, maybeBanner) => {
856
842
  const inspectorPaneView = (model) => h.div([
857
843
  h.Class('flex flex-col border-l min-w-0 min-h-0 flex-1 dt-inspector-pane'),
858
844
  ], [
859
- Tabs.view({
845
+ h.submodel({
846
+ slotId: model.inspectorTabs.id,
860
847
  model: model.inspectorTabs,
861
- toParentMessage: tabsMessage => GotInspectorTabsMessage({ message: tabsMessage }),
862
- tabs: INSPECTOR_TABS,
863
- tabListAriaLabel: 'Inspector tabs',
864
- persistPanels: true,
865
- attributes: [h.Class('flex flex-col flex-1 min-h-0')],
866
- tabListAttributes: [h.Class('flex border-b shrink-0')],
867
- tabToConfig: (tab, { isActive }) => ({
868
- buttonAttributes: [
869
- h.Class(clsx('dt-tab-button cursor-pointer text-base font-mono px-3 py-1', isActive ? 'text-dt dt-tab-active' : 'text-dt-muted')),
870
- ],
871
- buttonContent: h.span([], [tab]),
872
- panelAttributes: [h.Class('flex flex-col flex-1 min-h-0 min-w-0')],
873
- panelContent: Option.match(model.maybeInspectedModel, {
874
- onNone: () => emptyInspectorView,
875
- onSome: inspectedModel => inspectorTabContent(model, tab, inspectedModel),
876
- }),
877
- }),
848
+ view: InspectorTabs.view,
849
+ viewInputs: {
850
+ tabs: INSPECTOR_TABS,
851
+ ariaLabel: 'Inspector tabs',
852
+ toView: ({ tablist, tabs, activeIndex }) => h.div([h.Class('flex flex-col flex-1 min-h-0')], [
853
+ h.div([...tablist, h.Class('flex border-b shrink-0')], tabs.map(tab => h.button([
854
+ ...tab.tab,
855
+ h.Class(clsx('dt-tab-button cursor-pointer text-base font-mono px-3 py-1', tab.isActive
856
+ ? 'text-dt dt-tab-active'
857
+ : 'text-dt-muted')),
858
+ ], [h.span([], [tab.value])]))),
859
+ ...tabs.map(tab => h.div([
860
+ ...tab.panel,
861
+ h.Class('flex flex-col flex-1 min-h-0 min-w-0'),
862
+ h.Hidden(tab.index !== activeIndex),
863
+ ...(tab.index === activeIndex
864
+ ? []
865
+ : [h.Style({ display: 'none' })]),
866
+ ], [
867
+ Option.match(model.maybeInspectedModel, {
868
+ onNone: () => emptyInspectorView,
869
+ onSome: inspectedModel => inspectorTabContent(model, tab.value, inspectedModel),
870
+ }),
871
+ ])),
872
+ ]),
873
+ },
874
+ toParentMessage: message => GotInspectorTabsMessage({ message }),
878
875
  }),
879
876
  ]);
880
877
  // MESSAGE LIST
@@ -886,7 +883,7 @@ const makeView = (position, mode, shadow, maybeBanner) => {
886
883
  model.isOpen
887
884
  ? h.svg([
888
885
  h.AriaHidden(true),
889
- h.Xmlns('http://www.w3.org/2000/h.svg'),
886
+ h.Xmlns('http://www.w3.org/2000/svg'),
890
887
  h.Fill('none'),
891
888
  h.ViewBox('0 0 24 24'),
892
889
  h.StrokeWidth('1.5'),
@@ -912,7 +909,7 @@ const makeView = (position, mode, shadow, maybeBanner) => {
912
909
  const checkIconView = h.svg([
913
910
  h.AriaHidden(true),
914
911
  h.Class('dt-filter-check shrink-0'),
915
- h.Xmlns('http://www.w3.org/2000/h.svg'),
912
+ h.Xmlns('http://www.w3.org/2000/svg'),
916
913
  h.Fill('none'),
917
914
  h.ViewBox('0 0 24 24'),
918
915
  h.StrokeWidth('2'),
@@ -925,7 +922,7 @@ const makeView = (position, mode, shadow, maybeBanner) => {
925
922
  const arrowUpIconView = h.svg([
926
923
  h.AriaHidden(true),
927
924
  h.Class('dt-scroll-pill-icon shrink-0'),
928
- h.Xmlns('http://www.w3.org/2000/h.svg'),
925
+ h.Xmlns('http://www.w3.org/2000/svg'),
929
926
  h.Fill('none'),
930
927
  h.ViewBox('0 0 24 24'),
931
928
  h.StrokeWidth('2'),
@@ -946,38 +943,41 @@ const makeView = (position, mode, shadow, maybeBanner) => {
946
943
  onNone: () => 'All Messages',
947
944
  onSome: submodelLabel,
948
945
  });
949
- return Listbox.view({
946
+ return h.submodel({
947
+ slotId: 'submodel-filter',
950
948
  model: model.submodelFilterListbox,
951
- toParentMessage: message => GotSubmodelFilterMessage({ message }),
952
- onSelectedItem: tag => SelectedSubmodelFilter({ tag }),
953
- items: [ALL_MESSAGES_VALUE, ...model.submodelTags],
954
- itemToConfig: item => ({
955
- className: 'dt-filter-item',
956
- content: h.div([h.Class('flex items-center gap-2')], [checkIconView, h.span([], [filterItemLabel(item)])]),
957
- }),
958
- buttonContent: h.span([h.Class('flex flex-1 items-center justify-between')], [
959
- h.span([], [buttonLabel]),
960
- h.svg([
961
- h.AriaHidden(true),
962
- h.Class('json-arrow shrink-0'),
963
- h.Xmlns('http://www.w3.org/2000/h.svg'),
964
- h.Fill('none'),
965
- h.ViewBox('0 0 24 24'),
966
- h.StrokeWidth('2'),
967
- h.Stroke('currentColor'),
968
- ], [
969
- h.path([
970
- h.D(CHEVRON_DOWN),
971
- h.StrokeLinecap('round'),
972
- h.StrokeLinejoin('round'),
973
- ], []),
949
+ view: SubmodelFilterListbox.view,
950
+ viewInputs: {
951
+ items: [ALL_MESSAGES_VALUE, ...model.submodelTags],
952
+ itemToConfig: item => ({
953
+ className: 'dt-filter-item',
954
+ content: h.div([h.Class('flex items-center gap-2')], [checkIconView, h.span([], [filterItemLabel(item)])]),
955
+ }),
956
+ buttonContent: h.span([h.Class('flex flex-1 items-center justify-between')], [
957
+ h.span([], [buttonLabel]),
958
+ h.svg([
959
+ h.AriaHidden(true),
960
+ h.Class('json-arrow shrink-0'),
961
+ h.Xmlns('http://www.w3.org/2000/svg'),
962
+ h.Fill('none'),
963
+ h.ViewBox('0 0 24 24'),
964
+ h.StrokeWidth('2'),
965
+ h.Stroke('currentColor'),
966
+ ], [
967
+ h.path([
968
+ h.D(CHEVRON_DOWN),
969
+ h.StrokeLinecap('round'),
970
+ h.StrokeLinejoin('round'),
971
+ ], []),
972
+ ]),
974
973
  ]),
975
- ]),
976
- buttonClassName: 'dt-filter-button',
977
- itemsClassName: 'dt-filter-items',
978
- className: 'dt-filter-wrapper',
979
- attributes: [h.Key('submodel-filter')],
980
- backdropClassName: 'dt-filter-backdrop',
974
+ buttonClassName: 'dt-filter-button',
975
+ itemsClassName: 'dt-filter-items',
976
+ className: 'dt-filter-wrapper',
977
+ attributes: childAttributes([h.Key('submodel-filter')]),
978
+ backdropClassName: 'dt-filter-backdrop',
979
+ },
980
+ toParentMessage: message => GotSubmodelFilterMessage({ message }),
981
981
  });
982
982
  };
983
983
  const headerView = (model) => {
@@ -1020,7 +1020,7 @@ const makeView = (position, mode, shadow, maybeBanner) => {
1020
1020
  const pauseIconView = h.svg([
1021
1021
  h.AriaHidden(true),
1022
1022
  h.Class('dt-pause-icon'),
1023
- h.Xmlns('http://www.w3.org/2000/h.svg'),
1023
+ h.Xmlns('http://www.w3.org/2000/svg'),
1024
1024
  h.Fill('none'),
1025
1025
  h.ViewBox('0 0 24 24'),
1026
1026
  h.StrokeWidth('2.5'),
@@ -1100,28 +1100,35 @@ const makeView = (position, mode, shadow, maybeBanner) => {
1100
1100
  const current = String(model.scrubberSlider.value).padStart(3, '0');
1101
1101
  return `${current} / ${total}`;
1102
1102
  };
1103
- const scrubberView = (model) => Slider.view({
1103
+ const scrubberView = (model) => h.submodel({
1104
+ slotId: model.scrubberSlider.id,
1104
1105
  model: model.scrubberSlider,
1105
- toParentMessage: message => GotScrubberSliderMessage({ message }),
1106
- ariaLabel: 'Session scrubber',
1107
- getTrackRoot: () => shadow,
1108
- formatValue: value => (value === 0 ? 'init' : `Message ${String(value)}`),
1109
- toView: attributes => h.div([
1110
- h.Class('dt-scrubber-row flex items-center gap-3 px-3 py-2 border-t shrink-0'),
1111
- ], [
1112
- h.div([
1113
- ...attributes.root,
1114
- h.Class('dt-scrubber-control flex-1 flex items-center'),
1106
+ view: Slider.view,
1107
+ viewInputs: {
1108
+ ariaLabel: 'Session scrubber',
1109
+ getTrackRoot: () => shadow,
1110
+ formatValue: value => value === 0 ? 'init' : `Message ${String(value)}`,
1111
+ toView: attributes => h.div([
1112
+ h.Class('dt-scrubber-row flex items-center gap-3 px-3 py-2 border-t shrink-0'),
1115
1113
  ], [
1116
- h.div([...attributes.track, h.Class('dt-scrubber-track')], [
1117
- h.div([...attributes.filledTrack, h.Class('dt-scrubber-fill')], []),
1118
- h.div([...attributes.thumb, h.Class('dt-scrubber-thumb')], []),
1114
+ h.div([
1115
+ ...attributes.root,
1116
+ h.Class('dt-scrubber-control flex-1 flex items-center'),
1117
+ ], [
1118
+ h.div([...attributes.track, h.Class('dt-scrubber-track')], [
1119
+ h.div([
1120
+ ...attributes.filledTrack,
1121
+ h.Class('dt-scrubber-fill'),
1122
+ ], []),
1123
+ h.div([...attributes.thumb, h.Class('dt-scrubber-thumb')], []),
1124
+ ]),
1119
1125
  ]),
1126
+ h.span([
1127
+ h.Class('dt-scrubber-position text-2xs text-dt-muted font-mono shrink-0 tabular-nums'),
1128
+ ], [scrubberPositionLabel(model)]),
1120
1129
  ]),
1121
- h.span([
1122
- h.Class('dt-scrubber-position text-2xs text-dt-muted font-mono shrink-0 tabular-nums'),
1123
- ], [scrubberPositionLabel(model)]),
1124
- ]),
1130
+ },
1131
+ toParentMessage: message => GotScrubberSliderMessage({ message }),
1125
1132
  });
1126
1133
  // PANEL
1127
1134
  const isScrubberVisible = mode === 'TimeTravel';
package/dist/dom/dom.d.ts CHANGED
@@ -31,7 +31,7 @@ import { ElementNotFound } from './error.js';
31
31
  *
32
32
  * @example
33
33
  * ```typescript
34
- * Dom.focus('#email-input').pipe(Effect.ignore, Effect.as(CompletedFocusInput()))
34
+ * Dom.focus('#email-input')
35
35
  * Dom.focus('#section', { preventScroll: true, makeFocusable: true })
36
36
  * ```
37
37
  */
@@ -50,8 +50,8 @@ export declare const focus: (selector: string, options?: Readonly<{
50
50
  *
51
51
  * @example
52
52
  * ```typescript
53
- * Dom.showModal('#my-dialog').pipe(Effect.ignore, Effect.as(CompletedShowDialog()))
54
- * Dom.showModal('#my-dialog', { focusSelector: '#search-input' }).pipe(Effect.ignore, Effect.as(CompletedShowDialog()))
53
+ * Dom.showModal('#my-dialog')
54
+ * Dom.showModal('#my-dialog', { focusSelector: '#search-input' })
55
55
  * ```
56
56
  */
57
57
  export declare const showModal: (selector: string, options?: Readonly<{
@@ -64,7 +64,7 @@ export declare const showModal: (selector: string, options?: Readonly<{
64
64
  *
65
65
  * @example
66
66
  * ```typescript
67
- * Dom.closeModal('#my-dialog').pipe(Effect.ignore, Effect.as(CompletedCloseDialog()))
67
+ * Dom.closeModal('#my-dialog')
68
68
  * ```
69
69
  */
70
70
  export declare const closeModal: (selector: string) => Effect.Effect<void, ElementNotFound>;
@@ -74,7 +74,7 @@ export declare const closeModal: (selector: string) => Effect.Effect<void, Eleme
74
74
  *
75
75
  * @example
76
76
  * ```typescript
77
- * Dom.clickElement('#menu-item-2').pipe(Effect.ignore, Effect.as(CompletedClickItem()))
77
+ * Dom.clickElement('#menu-item-2')
78
78
  * ```
79
79
  */
80
80
  export declare const clickElement: (selector: string) => Effect.Effect<void, ElementNotFound>;
@@ -89,7 +89,7 @@ export declare const clickElement: (selector: string) => Effect.Effect<void, Ele
89
89
  *
90
90
  * @example
91
91
  * ```typescript
92
- * Dom.scrollIntoView('#active-item').pipe(Effect.ignore, Effect.as(CompletedScrollIntoView()))
92
+ * Dom.scrollIntoView('#active-item')
93
93
  * Dom.scrollIntoView('#section-2', { block: 'start' })
94
94
  * ```
95
95
  */
@@ -113,10 +113,7 @@ export declare const scrollIntoView: (selector: string, options?: Readonly<{
113
113
  *
114
114
  * @example
115
115
  * ```typescript
116
- * Dom.scrollIntoViewAfterPaint('#overview').pipe(
117
- * Effect.ignore,
118
- * Effect.as(CompletedScrollIntoViewAfterPaint()),
119
- * )
116
+ * Dom.scrollIntoViewAfterPaint('#overview')
120
117
  * Dom.scrollIntoViewAfterPaint(`#${hash}`, { block: 'start' })
121
118
  * ```
122
119
  */
@@ -131,7 +128,7 @@ export type FocusDirection = 'Next' | 'Previous';
131
128
  *
132
129
  * @example
133
130
  * ```typescript
134
- * Dom.advanceFocus('#menu-button', 'Next').pipe(Effect.ignore, Effect.as(CompletedAdvanceFocus()))
131
+ * Dom.advanceFocus('#menu-button', 'Next')
135
132
  * ```
136
133
  */
137
134
  export declare const advanceFocus: (selector: string, direction: FocusDirection) => Effect.Effect<void, ElementNotFound>;
@@ -1 +1 @@
1
- {"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/dom/dom.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,MAAM,EAMP,MAAM,QAAQ,CAAA;AAGf,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AA6B5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,eAAO,MAAM,KAAK,GAChB,UAAU,MAAM,EAChB,UAAU,QAAQ,CAAC;IAAE,aAAa,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,KACvE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAQlC,CAAA;AAEJ;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,SAAS,GACpB,UAAU,MAAM,EAChB,UAAU,QAAQ,CAAC;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,KAC7C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAgDlC,CAAA;AAuBJ;;;;;;;;;GASG;AACH,eAAO,MAAM,UAAU,GACrB,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAclC,CAAA;AAEJ;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,GACvB,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAKlC,CAAA;AAEJ;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,cAAc,GACzB,UAAU,MAAM,EAChB,UAAU,QAAQ,CAAC;IAAE,KAAK,CAAC,EAAE,qBAAqB,CAAA;CAAE,CAAC,KACpD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAKlC,CAAA;AAEJ;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,wBAAwB,GACnC,UAAU,MAAM,EAChB,UAAU,QAAQ,CAAC;IAAE,KAAK,CAAC,EAAE,qBAAqB,CAAA;CAAE,CAAC,KACpD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAKlC,CAAA;AAEJ,yEAAyE;AACzE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,UAAU,CAAA;AAEhD;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,GACvB,UAAU,MAAM,EAChB,WAAW,cAAc,KACxB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAiClC,CAAA"}
1
+ {"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/dom/dom.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,MAAM,EAMP,MAAM,QAAQ,CAAA;AAGf,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AA6B5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,eAAO,MAAM,KAAK,GAChB,UAAU,MAAM,EAChB,UAAU,QAAQ,CAAC;IAAE,aAAa,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,KACvE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAQlC,CAAA;AAEJ;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,SAAS,GACpB,UAAU,MAAM,EAChB,UAAU,QAAQ,CAAC;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,KAC7C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAgDlC,CAAA;AAuBJ;;;;;;;;;GASG;AACH,eAAO,MAAM,UAAU,GACrB,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAclC,CAAA;AAEJ;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,GACvB,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAKlC,CAAA;AAEJ;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,cAAc,GACzB,UAAU,MAAM,EAChB,UAAU,QAAQ,CAAC;IAAE,KAAK,CAAC,EAAE,qBAAqB,CAAA;CAAE,CAAC,KACpD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAKlC,CAAA;AAEJ;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,wBAAwB,GACnC,UAAU,MAAM,EAChB,UAAU,QAAQ,CAAC;IAAE,KAAK,CAAC,EAAE,qBAAqB,CAAA;CAAE,CAAC,KACpD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAKlC,CAAA;AAEJ,yEAAyE;AACzE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,UAAU,CAAA;AAEhD;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,GACvB,UAAU,MAAM,EAChB,WAAW,cAAc,KACxB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAiClC,CAAA"}
package/dist/dom/dom.js CHANGED
@@ -49,7 +49,7 @@ const queryHTMLElement = (selector) => Effect.suspend(() => {
49
49
  *
50
50
  * @example
51
51
  * ```typescript
52
- * Dom.focus('#email-input').pipe(Effect.ignore, Effect.as(CompletedFocusInput()))
52
+ * Dom.focus('#email-input')
53
53
  * Dom.focus('#section', { preventScroll: true, makeFocusable: true })
54
54
  * ```
55
55
  */
@@ -72,8 +72,8 @@ export const focus = (selector, options) => Effect.gen(function* () {
72
72
  *
73
73
  * @example
74
74
  * ```typescript
75
- * Dom.showModal('#my-dialog').pipe(Effect.ignore, Effect.as(CompletedShowDialog()))
76
- * Dom.showModal('#my-dialog', { focusSelector: '#search-input' }).pipe(Effect.ignore, Effect.as(CompletedShowDialog()))
75
+ * Dom.showModal('#my-dialog')
76
+ * Dom.showModal('#my-dialog', { focusSelector: '#search-input' })
77
77
  * ```
78
78
  */
79
79
  export const showModal = (selector, options) => Effect.gen(function* () {
@@ -132,7 +132,7 @@ const trapFocusWithinDialog = (event, dialog) => {
132
132
  *
133
133
  * @example
134
134
  * ```typescript
135
- * Dom.closeModal('#my-dialog').pipe(Effect.ignore, Effect.as(CompletedCloseDialog()))
135
+ * Dom.closeModal('#my-dialog')
136
136
  * ```
137
137
  */
138
138
  export const closeModal = (selector) => Effect.suspend(() => {
@@ -155,7 +155,7 @@ export const closeModal = (selector) => Effect.suspend(() => {
155
155
  *
156
156
  * @example
157
157
  * ```typescript
158
- * Dom.clickElement('#menu-item-2').pipe(Effect.ignore, Effect.as(CompletedClickItem()))
158
+ * Dom.clickElement('#menu-item-2')
159
159
  * ```
160
160
  */
161
161
  export const clickElement = (selector) => Effect.gen(function* () {
@@ -174,7 +174,7 @@ export const clickElement = (selector) => Effect.gen(function* () {
174
174
  *
175
175
  * @example
176
176
  * ```typescript
177
- * Dom.scrollIntoView('#active-item').pipe(Effect.ignore, Effect.as(CompletedScrollIntoView()))
177
+ * Dom.scrollIntoView('#active-item')
178
178
  * Dom.scrollIntoView('#section-2', { block: 'start' })
179
179
  * ```
180
180
  */
@@ -200,10 +200,7 @@ export const scrollIntoView = (selector, options) => Effect.gen(function* () {
200
200
  *
201
201
  * @example
202
202
  * ```typescript
203
- * Dom.scrollIntoViewAfterPaint('#overview').pipe(
204
- * Effect.ignore,
205
- * Effect.as(CompletedScrollIntoViewAfterPaint()),
206
- * )
203
+ * Dom.scrollIntoViewAfterPaint('#overview')
207
204
  * Dom.scrollIntoViewAfterPaint(`#${hash}`, { block: 'start' })
208
205
  * ```
209
206
  */
@@ -218,7 +215,7 @@ export const scrollIntoViewAfterPaint = (selector, options) => Effect.gen(functi
218
215
  *
219
216
  * @example
220
217
  * ```typescript
221
- * Dom.advanceFocus('#menu-button', 'Next').pipe(Effect.ignore, Effect.as(CompletedAdvanceFocus()))
218
+ * Dom.advanceFocus('#menu-button', 'Next')
222
219
  * ```
223
220
  */
224
221
  export const advanceFocus = (selector, direction) => Effect.gen(function* () {
@@ -12,9 +12,7 @@ import { Effect } from 'effect';
12
12
  *
13
13
  * @example
14
14
  * ```typescript
15
- * Dom.detectElementMovement('#menu-button').pipe(
16
- * Effect.as(DetectedButtonMovement()),
17
- * )
15
+ * Dom.detectElementMovement('#menu-button')
18
16
  * ```
19
17
  */
20
18
  export declare const detectElementMovement: (selector: string) => Effect.Effect<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"elementMovement.d.ts","sourceRoot":"","sources":["../../src/dom/elementMovement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAM/B;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,qBAAqB,GAAI,UAAU,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAmCvE,CAAA"}
1
+ {"version":3,"file":"elementMovement.d.ts","sourceRoot":"","sources":["../../src/dom/elementMovement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAM/B;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,qBAAqB,GAAI,UAAU,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAmCvE,CAAA"}
@@ -14,9 +14,7 @@ const rectToPosition = (rect) => `${rect.x},${rect.y}`;
14
14
  *
15
15
  * @example
16
16
  * ```typescript
17
- * Dom.detectElementMovement('#menu-button').pipe(
18
- * Effect.as(DetectedButtonMovement()),
19
- * )
17
+ * Dom.detectElementMovement('#menu-button')
20
18
  * ```
21
19
  */
22
20
  export const detectElementMovement = (selector) => Effect.gen(function* () {