@wardic/dom 0.0.0-stage → 1.0.0-rc.2

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 (285) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +8 -2
  3. package/THIRD_PARTY_NOTICES.md +145 -0
  4. package/dist/Appear.d.ts +24 -0
  5. package/dist/Appear.d.ts.map +1 -0
  6. package/dist/Appear.js +25 -0
  7. package/dist/Appear.js.map +1 -0
  8. package/dist/Color.d.ts +14 -0
  9. package/dist/Color.d.ts.map +1 -0
  10. package/dist/Color.js +16 -0
  11. package/dist/Color.js.map +1 -0
  12. package/dist/DomAnnouncer.d.ts +13 -0
  13. package/dist/DomAnnouncer.d.ts.map +1 -0
  14. package/dist/DomAnnouncer.js +14 -0
  15. package/dist/DomAnnouncer.js.map +1 -0
  16. package/dist/DomClock.d.ts +11 -0
  17. package/dist/DomClock.d.ts.map +1 -0
  18. package/dist/DomClock.js +12 -0
  19. package/dist/DomClock.js.map +1 -0
  20. package/dist/DomDefaultTransition.d.ts +12 -0
  21. package/dist/DomDefaultTransition.d.ts.map +1 -0
  22. package/dist/DomDefaultTransition.js +13 -0
  23. package/dist/DomDefaultTransition.js.map +1 -0
  24. package/dist/DomInput.d.ts +13 -0
  25. package/dist/DomInput.d.ts.map +1 -0
  26. package/dist/DomInput.js +15 -0
  27. package/dist/DomInput.js.map +1 -0
  28. package/dist/DomInterpolators.d.ts +13 -0
  29. package/dist/DomInterpolators.d.ts.map +1 -0
  30. package/dist/DomInterpolators.js +14 -0
  31. package/dist/DomInterpolators.js.map +1 -0
  32. package/dist/DomKeyRules.d.ts +13 -0
  33. package/dist/DomKeyRules.d.ts.map +1 -0
  34. package/dist/DomKeyRules.js +14 -0
  35. package/dist/DomKeyRules.js.map +1 -0
  36. package/dist/DomPositionalKeys.d.ts +13 -0
  37. package/dist/DomPositionalKeys.d.ts.map +1 -0
  38. package/dist/DomPositionalKeys.js +14 -0
  39. package/dist/DomPositionalKeys.js.map +1 -0
  40. package/dist/DomProbe.d.ts +13 -0
  41. package/dist/DomProbe.d.ts.map +1 -0
  42. package/dist/DomProbe.js +14 -0
  43. package/dist/DomProbe.js.map +1 -0
  44. package/dist/DomProjectionSystem.d.ts +28 -0
  45. package/dist/DomProjectionSystem.d.ts.map +1 -0
  46. package/dist/DomProjectionSystem.js +41 -0
  47. package/dist/DomProjectionSystem.js.map +1 -0
  48. package/dist/DomRenderer.d.ts +13 -0
  49. package/dist/DomRenderer.d.ts.map +1 -0
  50. package/dist/DomRenderer.js +15 -0
  51. package/dist/DomRenderer.js.map +1 -0
  52. package/dist/FlushGate.d.ts +48 -0
  53. package/dist/FlushGate.d.ts.map +1 -0
  54. package/dist/FlushGate.js +62 -0
  55. package/dist/FlushGate.js.map +1 -0
  56. package/dist/MeasuredPair.d.ts +14 -0
  57. package/dist/MeasuredPair.d.ts.map +1 -0
  58. package/dist/MeasuredPair.js +16 -0
  59. package/dist/MeasuredPair.js.map +1 -0
  60. package/dist/OwnValues.d.ts +14 -0
  61. package/dist/OwnValues.d.ts.map +1 -0
  62. package/dist/OwnValues.js +15 -0
  63. package/dist/OwnValues.js.map +1 -0
  64. package/dist/ProjectionSystem.d.ts +34 -0
  65. package/dist/ProjectionSystem.d.ts.map +1 -0
  66. package/dist/ProjectionSystem.js +29 -0
  67. package/dist/ProjectionSystem.js.map +1 -0
  68. package/dist/ReorderController.d.ts +41 -0
  69. package/dist/ReorderController.d.ts.map +1 -0
  70. package/dist/ReorderController.js +44 -0
  71. package/dist/ReorderController.js.map +1 -0
  72. package/dist/Report.d.ts +12 -0
  73. package/dist/Report.d.ts.map +1 -0
  74. package/dist/Report.js +13 -0
  75. package/dist/Report.js.map +1 -0
  76. package/dist/ScrollOffset.d.ts +34 -0
  77. package/dist/ScrollOffset.d.ts.map +1 -0
  78. package/dist/ScrollOffset.js +42 -0
  79. package/dist/ScrollOffset.js.map +1 -0
  80. package/dist/Style.d.ts +15 -0
  81. package/dist/Style.d.ts.map +1 -0
  82. package/dist/Style.js +17 -0
  83. package/dist/Style.js.map +1 -0
  84. package/dist/Svg.d.ts +13 -0
  85. package/dist/Svg.d.ts.map +1 -0
  86. package/dist/Svg.js +14 -0
  87. package/dist/Svg.js.map +1 -0
  88. package/dist/Variables.d.ts +13 -0
  89. package/dist/Variables.d.ts.map +1 -0
  90. package/dist/Variables.js +14 -0
  91. package/dist/Variables.js.map +1 -0
  92. package/dist/index.d.ts +72 -0
  93. package/dist/index.d.ts.map +1 -0
  94. package/dist/index.js +60 -0
  95. package/dist/index.js.map +1 -0
  96. package/dist/internal/announcer.d.ts +50 -0
  97. package/dist/internal/announcer.d.ts.map +1 -0
  98. package/dist/internal/announcer.js +115 -0
  99. package/dist/internal/announcer.js.map +1 -0
  100. package/dist/internal/appear.d.ts +169 -0
  101. package/dist/internal/appear.d.ts.map +1 -0
  102. package/dist/internal/appear.js +499 -0
  103. package/dist/internal/appear.js.map +1 -0
  104. package/dist/internal/auto-scroll.d.ts +24 -0
  105. package/dist/internal/auto-scroll.d.ts.map +1 -0
  106. package/dist/internal/auto-scroll.js +124 -0
  107. package/dist/internal/auto-scroll.js.map +1 -0
  108. package/dist/internal/clock.d.ts +19 -0
  109. package/dist/internal/clock.d.ts.map +1 -0
  110. package/dist/internal/clock.js +39 -0
  111. package/dist/internal/clock.js.map +1 -0
  112. package/dist/internal/colors.d.ts +45 -0
  113. package/dist/internal/colors.d.ts.map +1 -0
  114. package/dist/internal/colors.js +193 -0
  115. package/dist/internal/colors.js.map +1 -0
  116. package/dist/internal/complex.d.ts +24 -0
  117. package/dist/internal/complex.d.ts.map +1 -0
  118. package/dist/internal/complex.js +28 -0
  119. package/dist/internal/complex.js.map +1 -0
  120. package/dist/internal/content-watch.d.ts +20 -0
  121. package/dist/internal/content-watch.d.ts.map +1 -0
  122. package/dist/internal/content-watch.js +76 -0
  123. package/dist/internal/content-watch.js.map +1 -0
  124. package/dist/internal/default-transition.d.ts +25 -0
  125. package/dist/internal/default-transition.d.ts.map +1 -0
  126. package/dist/internal/default-transition.js +41 -0
  127. package/dist/internal/default-transition.js.map +1 -0
  128. package/dist/internal/drag-defaults.d.ts +18 -0
  129. package/dist/internal/drag-defaults.d.ts.map +1 -0
  130. package/dist/internal/drag-defaults.js +38 -0
  131. package/dist/internal/drag-defaults.js.map +1 -0
  132. package/dist/internal/gate.d.ts +186 -0
  133. package/dist/internal/gate.d.ts.map +1 -0
  134. package/dist/internal/gate.js +453 -0
  135. package/dist/internal/gate.js.map +1 -0
  136. package/dist/internal/input.d.ts +41 -0
  137. package/dist/internal/input.d.ts.map +1 -0
  138. package/dist/internal/input.js +476 -0
  139. package/dist/internal/input.js.map +1 -0
  140. package/dist/internal/interpolators.d.ts +19 -0
  141. package/dist/internal/interpolators.d.ts.map +1 -0
  142. package/dist/internal/interpolators.js +30 -0
  143. package/dist/internal/interpolators.js.map +1 -0
  144. package/dist/internal/key-rules.d.ts +11 -0
  145. package/dist/internal/key-rules.d.ts.map +1 -0
  146. package/dist/internal/key-rules.js +244 -0
  147. package/dist/internal/key-rules.js.map +1 -0
  148. package/dist/internal/measure.d.ts +150 -0
  149. package/dist/internal/measure.d.ts.map +1 -0
  150. package/dist/internal/measure.js +278 -0
  151. package/dist/internal/measure.js.map +1 -0
  152. package/dist/internal/measured-pairs.d.ts +38 -0
  153. package/dist/internal/measured-pairs.d.ts.map +1 -0
  154. package/dist/internal/measured-pairs.js +251 -0
  155. package/dist/internal/measured-pairs.js.map +1 -0
  156. package/dist/internal/own-values.d.ts +35 -0
  157. package/dist/internal/own-values.d.ts.map +1 -0
  158. package/dist/internal/own-values.js +117 -0
  159. package/dist/internal/own-values.js.map +1 -0
  160. package/dist/internal/pass-ends.d.ts +21 -0
  161. package/dist/internal/pass-ends.d.ts.map +1 -0
  162. package/dist/internal/pass-ends.js +14 -0
  163. package/dist/internal/pass-ends.js.map +1 -0
  164. package/dist/internal/positional-keys.d.ts +16 -0
  165. package/dist/internal/positional-keys.d.ts.map +1 -0
  166. package/dist/internal/positional-keys.js +21 -0
  167. package/dist/internal/positional-keys.js.map +1 -0
  168. package/dist/internal/probe.d.ts +10 -0
  169. package/dist/internal/probe.d.ts.map +1 -0
  170. package/dist/internal/probe.js +117 -0
  171. package/dist/internal/probe.js.map +1 -0
  172. package/dist/internal/projection-defaults.d.ts +34 -0
  173. package/dist/internal/projection-defaults.d.ts.map +1 -0
  174. package/dist/internal/projection-defaults.js +21 -0
  175. package/dist/internal/projection-defaults.js.map +1 -0
  176. package/dist/internal/projection.d.ts +529 -0
  177. package/dist/internal/projection.d.ts.map +1 -0
  178. package/dist/internal/projection.js +4990 -0
  179. package/dist/internal/projection.js.map +1 -0
  180. package/dist/internal/renderer.d.ts +86 -0
  181. package/dist/internal/renderer.d.ts.map +1 -0
  182. package/dist/internal/renderer.js +616 -0
  183. package/dist/internal/renderer.js.map +1 -0
  184. package/dist/internal/reorder.d.ts +159 -0
  185. package/dist/internal/reorder.d.ts.map +1 -0
  186. package/dist/internal/reorder.js +437 -0
  187. package/dist/internal/reorder.js.map +1 -0
  188. package/dist/internal/report.d.ts +30 -0
  189. package/dist/internal/report.d.ts.map +1 -0
  190. package/dist/internal/report.js +60 -0
  191. package/dist/internal/report.js.map +1 -0
  192. package/dist/internal/require-global.d.ts +11 -0
  193. package/dist/internal/require-global.d.ts.map +1 -0
  194. package/dist/internal/require-global.js +31 -0
  195. package/dist/internal/require-global.js.map +1 -0
  196. package/dist/internal/reveal.d.ts +16 -0
  197. package/dist/internal/reveal.d.ts.map +1 -0
  198. package/dist/internal/reveal.js +66 -0
  199. package/dist/internal/reveal.js.map +1 -0
  200. package/dist/internal/runner.d.ts +21 -0
  201. package/dist/internal/runner.d.ts.map +1 -0
  202. package/dist/internal/runner.js +48 -0
  203. package/dist/internal/runner.js.map +1 -0
  204. package/dist/internal/scale-correction.d.ts +80 -0
  205. package/dist/internal/scale-correction.d.ts.map +1 -0
  206. package/dist/internal/scale-correction.js +227 -0
  207. package/dist/internal/scale-correction.js.map +1 -0
  208. package/dist/internal/scroll.d.ts +35 -0
  209. package/dist/internal/scroll.d.ts.map +1 -0
  210. package/dist/internal/scroll.js +244 -0
  211. package/dist/internal/scroll.js.map +1 -0
  212. package/dist/internal/scrollers.d.ts +35 -0
  213. package/dist/internal/scrollers.d.ts.map +1 -0
  214. package/dist/internal/scrollers.js +38 -0
  215. package/dist/internal/scrollers.js.map +1 -0
  216. package/dist/internal/starting-style.d.ts +141 -0
  217. package/dist/internal/starting-style.d.ts.map +1 -0
  218. package/dist/internal/starting-style.js +300 -0
  219. package/dist/internal/starting-style.js.map +1 -0
  220. package/dist/internal/svg.d.ts +60 -0
  221. package/dist/internal/svg.d.ts.map +1 -0
  222. package/dist/internal/svg.js +257 -0
  223. package/dist/internal/svg.js.map +1 -0
  224. package/dist/internal/variables.d.ts +45 -0
  225. package/dist/internal/variables.d.ts.map +1 -0
  226. package/dist/internal/variables.js +92 -0
  227. package/dist/internal/variables.js.map +1 -0
  228. package/package.json +65 -4
  229. package/src/Appear.ts +45 -0
  230. package/src/Color.ts +24 -0
  231. package/src/DomAnnouncer.ts +22 -0
  232. package/src/DomClock.ts +13 -0
  233. package/src/DomDefaultTransition.ts +16 -0
  234. package/src/DomInput.ts +22 -0
  235. package/src/DomInterpolators.ts +16 -0
  236. package/src/DomKeyRules.ts +17 -0
  237. package/src/DomPositionalKeys.ts +16 -0
  238. package/src/DomProbe.ts +15 -0
  239. package/src/DomProjectionSystem.ts +44 -0
  240. package/src/DomRenderer.ts +26 -0
  241. package/src/FlushGate.ts +81 -0
  242. package/src/MeasuredPair.ts +15 -0
  243. package/src/OwnValues.ts +19 -0
  244. package/src/ProjectionSystem.ts +51 -0
  245. package/src/ReorderController.ts +72 -0
  246. package/src/Report.ts +17 -0
  247. package/src/ScrollOffset.ts +54 -0
  248. package/src/Style.ts +37 -0
  249. package/src/Svg.ts +21 -0
  250. package/src/Variables.ts +17 -0
  251. package/src/index.ts +106 -0
  252. package/src/internal/announcer.ts +132 -0
  253. package/src/internal/appear.ts +739 -0
  254. package/src/internal/auto-scroll.ts +176 -0
  255. package/src/internal/clock.ts +45 -0
  256. package/src/internal/colors.ts +258 -0
  257. package/src/internal/complex.ts +29 -0
  258. package/src/internal/content-watch.ts +84 -0
  259. package/src/internal/culori.d.ts +58 -0
  260. package/src/internal/default-transition.ts +50 -0
  261. package/src/internal/drag-defaults.ts +54 -0
  262. package/src/internal/gate.ts +593 -0
  263. package/src/internal/input.ts +579 -0
  264. package/src/internal/interpolators.ts +33 -0
  265. package/src/internal/key-rules.ts +357 -0
  266. package/src/internal/measure.ts +357 -0
  267. package/src/internal/measured-pairs.ts +297 -0
  268. package/src/internal/own-values.ts +166 -0
  269. package/src/internal/pass-ends.ts +23 -0
  270. package/src/internal/positional-keys.ts +24 -0
  271. package/src/internal/probe.ts +176 -0
  272. package/src/internal/projection-defaults.ts +45 -0
  273. package/src/internal/projection.ts +5999 -0
  274. package/src/internal/renderer.ts +646 -0
  275. package/src/internal/reorder.ts +604 -0
  276. package/src/internal/report.ts +69 -0
  277. package/src/internal/require-global.ts +46 -0
  278. package/src/internal/reveal.ts +69 -0
  279. package/src/internal/runner.ts +64 -0
  280. package/src/internal/scale-correction.ts +310 -0
  281. package/src/internal/scroll.ts +356 -0
  282. package/src/internal/scrollers.ts +51 -0
  283. package/src/internal/starting-style.ts +396 -0
  284. package/src/internal/svg.ts +300 -0
  285. package/src/internal/variables.ts +145 -0
@@ -0,0 +1,159 @@
1
+ import type * as Drag from "@wardic/core/Drag";
2
+ import type * as InputSource from "@wardic/core/InputSource";
3
+ import * as Reorder from "@wardic/core/Reorder";
4
+ import * as Duration from "effect/Duration";
5
+ import * as Option from "effect/Option";
6
+ import type { ProjectionNodeHandle, ProjectionSystem } from "./projection.ts";
7
+ import type { Runner } from "./runner.ts";
8
+ /**
9
+ * The group element's style: no scroll anchoring, so the browser doesn't shift the
10
+ * page as items move (Motion's Group.tsx:187-195 at 16c6122). The user's style goes
11
+ * over it.
12
+ */
13
+ export declare const REORDER_GROUP_STYLE: Readonly<{
14
+ readonly "overflow-anchor": "none";
15
+ }>;
16
+ /**
17
+ * What {@link makeReorderController} runs on: the runner it logs through, the projection system the
18
+ * items are nodes of, and the Environment's `Announcer`. `ReorderController.make` takes them from
19
+ * its context (#132's PR 3, ADR-0041).
20
+ */
21
+ export interface ReorderControllerWiring {
22
+ /** The runner the controller logs through and waits in. */
23
+ readonly runtime: Runner<never>;
24
+ /** The projection system the items are nodes of. */
25
+ readonly projection: Omit<ProjectionSystem, "dispose" | "onPassEnd">;
26
+ /** Speak an **Announcement**: the Environment's `Announcer`. Left out, nothing is announced. */
27
+ readonly announce?: ((message: string) => void) | undefined;
28
+ /** The engine's Measure-pass ends: its `PassEnds` service (internal/pass-ends.ts). */
29
+ readonly onPassEnd: (listener: () => void) => () => void;
30
+ }
31
+ /**
32
+ * A user's reorder that changed the order, at its end: a pointer drag released, or a keyboard lift
33
+ * dropped, with the item at another index than at its start. What an app saves: the whole order, or the
34
+ * one item that moved and where.
35
+ */
36
+ export interface ReorderEnd<V> {
37
+ /** The order at the end. */
38
+ readonly values: Array<V>;
39
+ /** The item the user moved: the one dragged, or lifted. */
40
+ readonly value: V;
41
+ /** Its index at the gesture's start. */
42
+ readonly from: number;
43
+ /** Its index at the end. */
44
+ readonly to: number;
45
+ }
46
+ /** A **Reorder hold**'s start: the item taken in hand, by its drag's start or a keyboard lift, and its index then. */
47
+ export interface ReorderHoldStart<V> {
48
+ /** The item taken in hand. */
49
+ readonly value: V;
50
+ /** Its index at the start. */
51
+ readonly from: number;
52
+ }
53
+ /**
54
+ * How a **Reorder hold** ended: `"drop"`, released or dropped where it is (a pointer's release or
55
+ * cancel, a drop key, focus leaving, a press, the app's `values`, another hold); `"cancel"`, Escape, the
56
+ * order put back; `"unmount"`, its item went away.
57
+ */
58
+ export type ReorderHoldHow = "drop" | "cancel" | "unmount";
59
+ /**
60
+ * A **Reorder hold**'s end, whatever ended it, once: the order then, the item, its index at the start
61
+ * and now (`-1` once it's out of the values), and how. After `onReorderEnd`, in the same task, when the
62
+ * order changed.
63
+ */
64
+ export interface ReorderHoldEnd<V> extends ReorderEnd<V> {
65
+ /** How it ended. */
66
+ readonly how: ReorderHoldHow;
67
+ }
68
+ /** What a binding hands its group's controller. */
69
+ export interface ReorderControllerOptions<V> {
70
+ /** The app's values, in order. */
71
+ readonly values: () => ReadonlyArray<V>;
72
+ /** Receives a new order; the app sets `values` from it. */
73
+ readonly onReorder: (values: Array<V>) => void;
74
+ /**
75
+ * Hears a user's reorder that changed the order, at its end: once a gesture, not at each step, as
76
+ * `onReorder` is. Not a keyboard cancel, which puts the order back, nor `move`.
77
+ */
78
+ readonly onReorderEnd?: ((end: ReorderEnd<V>) => void) | undefined;
79
+ /** Hears each **Reorder hold**'s start: a drag of an item past its threshold, or a keyboard lift. */
80
+ readonly onHoldStart?: ((start: ReorderHoldStart<V>) => void) | undefined;
81
+ /** Hears each **Reorder hold**'s end, once, whatever ended it; after `onReorderEnd` when it moved. */
82
+ readonly onHoldEnd?: ((end: ReorderHoldEnd<V>) => void) | undefined;
83
+ /** The app's axis, overriding detection; `None` to detect. */
84
+ readonly axis?: (() => Option.Option<Reorder.Axis>) | undefined;
85
+ /** Called when the detected axis changes (after a Measure pass, or {@link ReorderController.resolve}). */
86
+ readonly onAxis?: ((axis: Reorder.Axis) => void) | undefined;
87
+ /**
88
+ * How the binding keys its items, for the warning logged once per controller when an
89
+ * item registers with a value an item of this group unregistered in the same task
90
+ * (the signature of a list keyed by index): "key items with `keyedWith`". Solid's is
91
+ * `"<For>"`; by default "their value".
92
+ */
93
+ readonly keyedWith?: string | undefined;
94
+ /** Whether the items reorder by keyboard, read at each key; `false` turns it off. On when left out. */
95
+ readonly keyboard?: (() => boolean) | undefined;
96
+ /** The group's announcements over the defaults, read at each announcement. */
97
+ readonly announcements?: (() => Option.Option<Partial<Reorder.Announcements<V>>>) | undefined;
98
+ }
99
+ /** One item of a {@link ReorderController}: its binding feeds it the item's handle, drag samples, keys, focus and presses. */
100
+ export interface ReorderItemDriver {
101
+ /** Register the item's projection handle with the group; returns the unregister. */
102
+ readonly register: (handle: ProjectionNodeHandle) => () => void;
103
+ /** The axis the item's drag takes, read at each gesture's start. */
104
+ readonly dragAxis: () => Reorder.Axis;
105
+ /** The item's drag samples, as the drag delivers them. */
106
+ readonly onSample: (sample: Drag.Sample) => void;
107
+ /** A key at the item or inside it, inside its dispatch: a keyboard reorder's. */
108
+ readonly onKey: (event: InputSource.KeyboardLikeEvent) => void;
109
+ /** Focus left the item: a lift drops where it is, unless focus is back on the item. */
110
+ readonly onBlur: () => void;
111
+ /** A press on the item: a lift drops where it is, before any drag. */
112
+ readonly onPress: () => void;
113
+ /** The item is going away: end a gesture or a lift still in progress. */
114
+ readonly dispose: () => void;
115
+ }
116
+ /** How long a held arrow's announcements wait for the next repeat: only the last is spoken (ADR-0037, Q4). */
117
+ export declare const REPEAT_ANNOUNCE: Duration.Duration;
118
+ /**
119
+ * A Reorder item's default instructions on the web: core's keys, and focus mode. A
120
+ * screen reader in browse mode (NVDA's, JAWS's) keeps Space and the arrows for itself until its user
121
+ * switches to focus mode, and it doesn't switch by itself on a list item.
122
+ */
123
+ export declare const DEFAULT_REORDER_INSTRUCTIONS = "Press Space or Enter to pick up. Use the arrow keys to move, Space or Enter to drop, Escape to cancel. Some screen readers need focus mode for these keys.";
124
+ /** A **Reorder group** on the DOM. */
125
+ export interface ReorderController<V> {
126
+ /** Core's Reorder group (`Reorder.move(group, value, toIndex)` reorders in code). */
127
+ readonly group: Reorder.Group<V>;
128
+ /** The app's axis, else the last detected one (`"y"` before the first). */
129
+ readonly axis: () => Reorder.Axis;
130
+ /** The group's element: its `direction`, and the scroller Auto-scroll looks for from it. */
131
+ readonly attach: (element: Element) => void;
132
+ /**
133
+ * The driver for the item with `value`; `element` is its element (for Auto-scroll, its label, its
134
+ * focus and its reveal), and `onLift` hears its keyboard lift start and end (the binding's `whileDrag`).
135
+ */
136
+ readonly item: (value: V, element: () => Option.Option<Element>, onLift?: (lifted: boolean) => void) => ReorderItemDriver;
137
+ /** Move `value` to `toIndex` in code (`Reorder.move`), and announce it. */
138
+ readonly move: (value: V, toIndex: number) => void;
139
+ /**
140
+ * The axis now: the app's, else detected from the items' boxes as they are, reporting nothing. A
141
+ * binding derives its axis with it when the app's is cleared.
142
+ */
143
+ readonly detect: () => Reorder.Axis;
144
+ /** The app's values changed: re-measure, so the items animate to their slots. */
145
+ readonly valuesChanged: () => void;
146
+ /** Stops listening to measures and ends the auto-scroll. The Scope calls it. */
147
+ readonly dispose: () => void;
148
+ }
149
+ /** Build a {@link ReorderController}: a **Reorder group** over `wiring.projection`'s nodes. */
150
+ export declare const makeReorderController: <V>(wiring: ReorderControllerWiring, options: ReorderControllerOptions<V>) => ReorderController<V>;
151
+ /**
152
+ * A {@link ReorderController} for a server render (ADR-0021), where there's no projection
153
+ * system to drive and nothing to reorder: its group has no values, so every operation on it
154
+ * does nothing, the axis is `"y"`, and an item's driver is inert too. A binding's server path hands it to its group, so code
155
+ * that reads `group`, `move` or `controller` at setup works there. Tier 2, for binding
156
+ * authors.
157
+ */
158
+ export declare const INERT_REORDER_CONTROLLER: ReorderController<never>;
159
+ //# sourceMappingURL=reorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reorder.d.ts","sourceRoot":"","sources":["../../src/internal/reorder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,437 @@
1
+ /**
2
+ * The DOM's **Reorder group** controller (ADR-0020): the framework-free half of
3
+ * `<Reorder>`, shared by every DOM binding. A binding adds only its reactivity, its
4
+ * lifecycle and its elements.
5
+ *
6
+ * It owns core's `Reorder.Group` (the **Crossover** and the new order), reads the
7
+ * group element's `direction` at each drag start, builds the group's **Auto-scroll**,
8
+ * and routes each item's drag samples: the start opens the group's gesture, each move
9
+ * runs the Crossover and Auto-scroll, the end (or the item's disposal mid-gesture)
10
+ * closes both. The items' `touch-action` needs the axis before a touch starts, so after
11
+ * every Measure pass the controller detects the axis from the items' boxes and reports
12
+ * a change through `onAxis`; while the app sets the axis it detects nothing. Motion
13
+ * detects on every item's every measurement (Group.tsx:121-133 at 16c6122). When the app
14
+ * clears its axis, no Measure pass comes with that: a binding reads `detect()`, the axis
15
+ * from the boxes the items have now, in the computation that derives its axis, so whatever
16
+ * reads the axis follows in the same update (#257's audit: an effect that detected and
17
+ * reported it updated them a step late).
18
+ *
19
+ * It also runs each item's **Keyboard reorder** (ADR-0037), on by default: a key from the item
20
+ * itself that the page didn't take (Space or Enter lifts and drops, Escape cancels, the arrows,
21
+ * Home and End move the lifted item) goes to core's `Reorder` model, its default prevented; each
22
+ * step is an **Announcement** (a held arrow's thinned to the last), scrolls the item's new place
23
+ * into view after the Measure pass that lays it out, and keeps focus on the item; the lifted node is
24
+ * raised as a dragged one is, and the binding turns its `whileDrag` on. Focus leaving the item, a
25
+ * press on it, or the app changing `values` drops it where it is; its unmount ends the lift unsaid.
26
+ *
27
+ * Each **Reorder hold** (#348, ADR-0020 *Amendment (#348)*), an item in a user's hand from its drag's start or
28
+ * its lift, is told at its start and, once, at its end, whatever ends it: after `onReorderEnd`, when
29
+ * it moved. One at a time: a hold's start ends the open one first, and that item's later release
30
+ * tells nothing more.
31
+ * `move` announces too. Nothing is announced without an `announce`.
32
+ *
33
+ * Observability: `wardic.reorder:` debug logs through the runtime, annotated: the
34
+ * group's and Auto-scroll's events, and `axis` when the detected axis changes (cold
35
+ * path: never per sample), plus one warning per controller for a remount (below).
36
+ *
37
+ * Tier 2 (ADR-0008): for DOM binding authors.
38
+ */
39
+ import * as AutoScroll from "@wardic/core/AutoScroll";
40
+ import * as Reorder from "@wardic/core/Reorder";
41
+ import * as Bool from "effect/Boolean";
42
+ import * as Duration from "effect/Duration";
43
+ import * as Effect from "effect/Effect";
44
+ import * as FiberHandle from "effect/FiberHandle";
45
+ import { constTrue, constVoid, identity } from "effect/Function";
46
+ import * as Match from "effect/Match";
47
+ import * as MutableRef from "effect/MutableRef";
48
+ import * as Option from "effect/Option";
49
+ import * as Predicate from "effect/Predicate";
50
+ import * as Scope from "effect/Scope";
51
+ import * as Str from "effect/String";
52
+ import * as UndefinedOr from "effect/UndefinedOr";
53
+ import { documentOf, prepareAnnouncer } from "./announcer.js";
54
+ import { makeAutoScroller } from "./auto-scroll.js";
55
+ import { debugOf } from "./report.js";
56
+ import { revealLayoutOf } from "./reveal.js";
57
+ /**
58
+ * The group element's style: no scroll anchoring, so the browser doesn't shift the
59
+ * page as items move (Motion's Group.tsx:187-195 at 16c6122). The user's style goes
60
+ * over it.
61
+ */
62
+ export const REORDER_GROUP_STYLE = Object.freeze({ "overflow-anchor": "none" });
63
+ /** How long a held arrow's announcements wait for the next repeat: only the last is spoken (ADR-0037, Q4). */
64
+ export const REPEAT_ANNOUNCE = Duration.millis(150);
65
+ /**
66
+ * A Reorder item's default instructions on the web: core's keys, and focus mode. A
67
+ * screen reader in browse mode (NVDA's, JAWS's) keeps Space and the arrows for itself until its user
68
+ * switches to focus mode, and it doesn't switch by itself on a list item.
69
+ */
70
+ // ADR-0037: the NVDA pass.
71
+ export const DEFAULT_REORDER_INSTRUCTIONS = `${Reorder.DEFAULT_INSTRUCTIONS} Some screen readers need focus mode for these keys.`;
72
+ /** How an item is spoken: its `aria-label`, else its text with its whitespace collapsed, else its value. */
73
+ const labelOf = (element, value) => Option.getOrElse(Option.orElse(Option.flatMap(element, (el) => nonEmpty(Option.map(Option.fromNullOr(el.getAttribute("aria-label")), Str.trim))), () => Option.flatMap(element, (el) => nonEmpty(Option.map(Option.fromNullOr(el.textContent), (text) => text.replace(/\s+/g, " ").trim())))), () => String(value));
74
+ /** A text, `None` when it's empty. */
75
+ const nonEmpty = (text) => Option.filter(text, Str.isNonEmpty);
76
+ /** Build a {@link ReorderController}: a **Reorder group** over `wiring.projection`'s nodes. */
77
+ export const makeReorderController = (wiring, options) => {
78
+ const { runtime, projection, announce } = wiring;
79
+ const debug = debugOf(runtime, "wardic.reorder");
80
+ // Speak an Announcement, or nothing without an `announce`.
81
+ const speak = UndefinedOr.match(announce, { onUndefined: () => constVoid, onDefined: identity });
82
+ const keyboardOn = () => UndefinedOr.match(options.keyboard, { onUndefined: constTrue, onDefined: (on) => on() });
83
+ // The group's element and its Auto-scroll, once it's attached.
84
+ const element = MutableRef.make(Option.none());
85
+ const autoScroller = MutableRef.make(Option.none());
86
+ const resetAutoScroll = () => {
87
+ const scroller = MutableRef.get(autoScroller);
88
+ if (Option.isSome(scroller))
89
+ scroller.value.reset();
90
+ };
91
+ // The order the group last asked for: a `values` change to anything else is the app's own (ADR-0037).
92
+ let asked;
93
+ /** The app's axis, if it sets one. */
94
+ const appAxis = () => Option.flatMap(Option.fromUndefinedOr(options.axis), (axis) => axis());
95
+ const group = Reorder.make({
96
+ values: options.values,
97
+ onReorder: (values) => {
98
+ asked = values;
99
+ options.onReorder(values);
100
+ },
101
+ axis: () => appAxis(),
102
+ // Read once per drag start (Motion reads it on every sample, Group.tsx:142-147 at 16c6122).
103
+ direction: () => Bool.match(Option.exists(MutableRef.get(element), (el) => getComputedStyle(el).direction === "rtl"), {
104
+ onTrue: () => "rtl",
105
+ onFalse: () => "ltr",
106
+ }),
107
+ debug,
108
+ });
109
+ let detected = "y";
110
+ let reported;
111
+ const resolve = () => {
112
+ if (Option.isSome(appAxis()))
113
+ return;
114
+ detected = Reorder.resolveAxis(group);
115
+ if (detected === reported)
116
+ return;
117
+ reported = detected;
118
+ debug("axis", { axis: detected });
119
+ if (Predicate.isNotUndefined(options.onAxis))
120
+ options.onAxis(detected);
121
+ };
122
+ const keyed = new Map();
123
+ const elementOf = (value) => Option.flatMap(Option.fromUndefinedOr(keyed.get(value)), (k) => k.element());
124
+ // The item whose new place the next Measure pass lays out, to scroll into view then.
125
+ const reveal = MutableRef.make(Option.none());
126
+ // A held arrow's latest announcement, waiting for the next repeat (ADR-0025, *Amendment (#69)*): a
127
+ // fiber in the Scope the controller was built in, which closes it after `dispose`.
128
+ const pending = runtime.runSync(FiberHandle.make().pipe(Scope.provide(runtime.scope)));
129
+ const announceNow = (message) => {
130
+ runtime.runFork(FiberHandle.clear(pending));
131
+ speak(message);
132
+ };
133
+ /** A held arrow's step: spoken once the repeats stop for {@link REPEAT_ANNOUNCE}, only the last. */
134
+ const announceLater = (message) => {
135
+ FiberHandle.setUnsafe(pending, runtime.runFork(Effect.sleep(REPEAT_ANNOUNCE).pipe(Effect.andThen(Effect.sync(() => speak(message))))));
136
+ };
137
+ const wording = () => ({
138
+ ...Reorder.defaultAnnouncements,
139
+ ...Option.getOrUndefined(Option.flatMap(Option.fromUndefinedOr(options.announcements), (announcements) => announcements())),
140
+ });
141
+ const say = (kind, value, placement) => wording()[kind]({ value, label: labelOf(elementOf(value), value), position: placement.position, count: placement.count });
142
+ /** Raise the lifted item (or lower it) and tell its binding (its `whileDrag`). */
143
+ const setLifted = (value, lifted) => {
144
+ const k = keyed.get(value);
145
+ if (Predicate.isUndefined(k))
146
+ return;
147
+ if (Option.isSome(k.handle))
148
+ k.handle.value.setLifted(lifted);
149
+ k.onLift(lifted);
150
+ };
151
+ /** `value`'s index in the app's values now. */
152
+ const indexOf = (value) => options.values().indexOf(value);
153
+ /** The end of a user's reorder of `value`, begun at `from`: told when it moved (#257 item 3). */
154
+ const ended = (value, from) => {
155
+ const to = indexOf(value);
156
+ if (to === from)
157
+ return;
158
+ UndefinedOr.map(options.onReorderEnd, (tell) => tell({ values: [...options.values()], value, from, to }));
159
+ };
160
+ // --- Holds (#348) ------------------------------------------------------------
161
+ /** The open **Reorder hold**: the item in hand, how it was taken, and its index then. One at a time. */
162
+ let held = Option.none();
163
+ /** Whether `value`'s drag is the open hold: a drag a later hold took over tells nothing more. */
164
+ const holdsDrag = (value) => Option.exists(held, (h) => h.by === "drag" && h.value === value);
165
+ const holdStart = (value, from, by) => {
166
+ held = Option.some({ value, from, by });
167
+ UndefinedOr.map(options.onHoldStart, (tell) => tell({ value, from }));
168
+ };
169
+ /** End `value`'s hold, `how`: told once, and only for the open one. */
170
+ const holdEnd = (value, how) => Option.match(Option.filter(held, (h) => h.value === value), {
171
+ onNone: constVoid,
172
+ onSome: (h) => {
173
+ held = Option.none();
174
+ UndefinedOr.map(options.onHoldEnd, (tell) => tell({ values: [...options.values()], value, from: h.from, to: indexOf(value), how }));
175
+ },
176
+ });
177
+ /** The lifted item's index at its lift. */
178
+ let liftedFrom = -1;
179
+ /** Drop the lifted item where it is and announce it: a drop key, or an interruption. */
180
+ const dropLifted = () => Option.match(Reorder.liftedValue(group), {
181
+ onNone: constVoid,
182
+ onSome: (value) => {
183
+ Option.match(Reorder.drop(group, value), { onNone: constVoid, onSome: (placement) => announceNow(say("drop", value, placement)) });
184
+ setLifted(value, false);
185
+ ended(value, liftedFrom);
186
+ holdEnd(value, "drop");
187
+ },
188
+ });
189
+ /**
190
+ * A drag's start ends the open hold first (#348, one at a time): a lift is dropped where it is,
191
+ * and another item's drag ends, told as if released, its own release telling nothing more.
192
+ */
193
+ const endHeld = () => Option.match(held, {
194
+ onNone: constVoid,
195
+ onSome: (h) => {
196
+ if (h.by === "lift")
197
+ return dropLifted();
198
+ ended(h.value, h.from);
199
+ holdEnd(h.value, "drop");
200
+ },
201
+ });
202
+ /** Focus back on the lifted item, if a reorder took it (moving a focused node can blur it), without scrolling. */
203
+ const keepFocus = (value) => Option.match(Option.filter(elementOf(value), (el) => el.ownerDocument.activeElement !== el), {
204
+ onNone: constVoid,
205
+ onSome: (el) => el.focus({ preventScroll: true }),
206
+ });
207
+ /** Whether focus is on `value`'s element. */
208
+ const focused = (value) => Option.exists(elementOf(value), (el) => el.ownerDocument.activeElement === el);
209
+ const onKeyOf = (value) => (event) => {
210
+ if (event.type !== "down")
211
+ return;
212
+ if (Bool.not(keyboardOn()))
213
+ return;
214
+ // A key the page took, or one from inside the item (a text field), isn't the reorder's.
215
+ if (event.handled)
216
+ return;
217
+ if (Bool.not(event.fromTarget))
218
+ return;
219
+ // Keys during a pointer drag are left alone.
220
+ if (Reorder.isDragging(group))
221
+ return;
222
+ const lifted = Option.contains(Reorder.liftedValue(group), value);
223
+ Option.match(Reorder.keyIntent(event.key), {
224
+ onNone: constVoid,
225
+ onSome: (intent) => Match.value(intent).pipe(Match.tag("Toggle", () => {
226
+ event.handle();
227
+ if (event.repeat)
228
+ return;
229
+ if (lifted)
230
+ return dropLifted();
231
+ // Lifting another item drops the one lifted first.
232
+ dropLifted();
233
+ Option.match(Reorder.lift(group, value), {
234
+ onNone: constVoid,
235
+ onSome: (placement) => {
236
+ liftedFrom = indexOf(value);
237
+ // The values the lift began with are the group's own: a binding re-reading them,
238
+ // the same, mid-lift (a memo whose sources changed) isn't the app changing them (#348).
239
+ asked = options.values();
240
+ setLifted(value, true);
241
+ announceNow(say("lift", value, placement));
242
+ holdStart(value, liftedFrom, "lift");
243
+ },
244
+ });
245
+ }), Match.tag("Cancel", () => {
246
+ if (Bool.not(lifted))
247
+ return;
248
+ event.handle();
249
+ Option.match(Reorder.cancel(group, value), {
250
+ onNone: constVoid,
251
+ onSome: (placement) => {
252
+ setLifted(value, false);
253
+ keepFocus(value);
254
+ if (placement.moved)
255
+ MutableRef.set(reveal, Option.some(value));
256
+ announceNow(say("cancel", value, placement));
257
+ holdEnd(value, "cancel");
258
+ },
259
+ });
260
+ }), Match.tagsExhaustive({
261
+ Step: (step) => stepLifted(event, value, lifted, step),
262
+ End: (end) => stepLifted(event, value, lifted, end),
263
+ })),
264
+ });
265
+ };
266
+ /** An arrow, Home or End: the lifted item's step, its announcement (a held arrow's thinned), its reveal. */
267
+ const stepLifted = (event, value, lifted, intent) => {
268
+ // Not lifted, the arrows, Home and End keep their own work (scrolling the page).
269
+ if (Bool.not(lifted))
270
+ return;
271
+ event.handle();
272
+ Option.match(Reorder.moveLifted(group, value, intent), {
273
+ onNone: constVoid,
274
+ onSome: (placement) => {
275
+ // A repeat before the last step's Measure pass moved nothing: nothing to say.
276
+ if (placement.waiting)
277
+ return;
278
+ if (placement.moved) {
279
+ MutableRef.set(reveal, Option.some(value));
280
+ keepFocus(value);
281
+ }
282
+ const message = say("step", value, placement);
283
+ Bool.match(event.repeat, { onTrue: () => announceLater(message), onFalse: () => announceNow(message) });
284
+ },
285
+ });
286
+ };
287
+ // Every Measure pass measures every node, so its end is when the boxes are fresh, and when a
288
+ // stepped item's new place is laid out.
289
+ const stopPassEnd = wiring.onPassEnd(() => {
290
+ resolve();
291
+ const stepped = MutableRef.get(reveal);
292
+ MutableRef.set(reveal, Option.none());
293
+ const el = Option.filter(Option.flatMap(stepped, elementOf), (e) => e.isConnected);
294
+ if (Option.isSome(el))
295
+ revealLayoutOf(el.value);
296
+ });
297
+ const keyedWith = UndefinedOr.match(options.keyedWith, { onUndefined: () => "their value", onDefined: identity });
298
+ // Values whose item unregistered in this task, and whether a remount was warned of.
299
+ const unregisteredThisTask = new Set();
300
+ let remountReported = false;
301
+ const item = (value, itemElement, onLift = constVoid) => {
302
+ // The gesture's axis (core's, fixed at its start), for Auto-scroll's axis.
303
+ let gestureAxis = "y";
304
+ let inGesture = false;
305
+ // Its index at the drag's start, for its `onReorderEnd` (#257 item 3).
306
+ let draggedFrom = -1;
307
+ const k = { element: itemElement, handle: Option.none(), onLift };
308
+ keyed.set(value, k);
309
+ const end = () => {
310
+ inGesture = false;
311
+ Reorder.dragEnd(group, value);
312
+ resetAutoScroll();
313
+ };
314
+ return {
315
+ register: (handle) => {
316
+ if (!remountReported && unregisteredThisTask.has(value)) {
317
+ remountReported = true;
318
+ runtime.runFork(Effect.logWarning(`wardic.reorder: an item remounted with the same value in one task (key items with ${keyedWith})`).pipe(Effect.annotateLogs({ value: String(value) })));
319
+ }
320
+ const unregister = Reorder.register(group, value, {
321
+ layoutBox: handle.layoutBox,
322
+ dragOffset: handle.dragOffset,
323
+ layoutVersion: handle.layoutVersion,
324
+ });
325
+ k.handle = Option.some(handle);
326
+ keyed.set(value, k);
327
+ return () => {
328
+ if (Option.contains(k.handle, handle))
329
+ k.handle = Option.none();
330
+ unregister();
331
+ if (unregisteredThisTask.size === 0)
332
+ queueMicrotask(() => unregisteredThisTask.clear());
333
+ unregisteredThisTask.add(value);
334
+ };
335
+ },
336
+ dragAxis: () => Reorder.resolveAxis(group),
337
+ onSample: (sample) => {
338
+ if (sample.phase === "start") {
339
+ endHeld();
340
+ inGesture = true;
341
+ draggedFrom = indexOf(value);
342
+ gestureAxis = Reorder.dragStart(group, value);
343
+ holdStart(value, draggedFrom, "drag");
344
+ return;
345
+ }
346
+ if (sample.phase === "move") {
347
+ const velocity = Reorder.dragMove(group, value, sample.velocity);
348
+ const scroller = MutableRef.get(autoScroller);
349
+ if (Option.isSome(scroller)) {
350
+ const on = AutoScroll.axis(gestureAxis, velocity);
351
+ scroller.value.update(sample.point, on, velocity[on], Option.getOrUndefined(k.element()));
352
+ }
353
+ return;
354
+ }
355
+ end();
356
+ // A drag a later hold took over ended then.
357
+ if (Bool.not(holdsDrag(value)))
358
+ return;
359
+ ended(value, draggedFrom);
360
+ holdEnd(value, "drop");
361
+ },
362
+ onKey: onKeyOf(value),
363
+ onBlur: () => {
364
+ if (Bool.not(Option.contains(Reorder.liftedValue(group), value)))
365
+ return;
366
+ // A reorder can blur the node it moves; focus was put back on it, so it's no interruption.
367
+ if (focused(value))
368
+ return;
369
+ dropLifted();
370
+ },
371
+ onPress: () => {
372
+ if (Option.contains(Reorder.liftedValue(group), value))
373
+ dropLifted();
374
+ },
375
+ dispose: () => {
376
+ if (inGesture)
377
+ end();
378
+ // Unmounted while lifted: the lift ends, unsaid.
379
+ if (Option.contains(Reorder.liftedValue(group), value))
380
+ Reorder.drop(group, value);
381
+ holdEnd(value, "unmount");
382
+ if (keyed.get(value) === k)
383
+ keyed.delete(value);
384
+ },
385
+ };
386
+ };
387
+ return {
388
+ group,
389
+ axis: () => Option.getOrElse(appAxis(), () => detected),
390
+ attach: (el) => {
391
+ MutableRef.set(element, Option.some(el));
392
+ MutableRef.set(autoScroller, Option.some(makeAutoScroller(el, debug)));
393
+ // The live region has to be in the page before the first lift (ADR-0037, Q7).
394
+ if (keyboardOn() && Predicate.isNotUndefined(announce))
395
+ prepareAnnouncer(documentOf(el));
396
+ },
397
+ item,
398
+ move: (value, toIndex) => Option.match(Reorder.move(group, value, toIndex), {
399
+ onNone: constVoid,
400
+ onSome: (placement) => {
401
+ if (placement.moved)
402
+ announceNow(say("move", value, placement));
403
+ },
404
+ }),
405
+ detect: () => Reorder.resolveAxis(group),
406
+ valuesChanged: () => {
407
+ // The app changed `values` itself while an item is lifted: it's dropped at its new place.
408
+ if (Option.isSome(Reorder.liftedValue(group)) && options.values() !== asked)
409
+ dropLifted();
410
+ projection.notify();
411
+ },
412
+ dispose: () => {
413
+ stopPassEnd();
414
+ resetAutoScroll();
415
+ },
416
+ };
417
+ };
418
+ const noop = () => { };
419
+ /**
420
+ * A {@link ReorderController} for a server render (ADR-0021), where there's no projection
421
+ * system to drive and nothing to reorder: its group has no values, so every operation on it
422
+ * does nothing, the axis is `"y"`, and an item's driver is inert too. A binding's server path hands it to its group, so code
423
+ * that reads `group`, `move` or `controller` at setup works there. Tier 2, for binding
424
+ * authors.
425
+ */
426
+ export const INERT_REORDER_CONTROLLER = Object.freeze({
427
+ // A group with no values: every operation on it finds nothing to do.
428
+ group: Reorder.make({ values: () => [], onReorder: noop }),
429
+ axis: () => "y",
430
+ attach: noop,
431
+ item: () => ({ register: () => noop, dragAxis: () => "y", onSample: noop, onKey: noop, onBlur: noop, onPress: noop, dispose: noop }),
432
+ move: noop,
433
+ detect: () => "y",
434
+ valuesChanged: noop,
435
+ dispose: noop,
436
+ });
437
+ //# sourceMappingURL=reorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reorder.js","sourceRoot":"","sources":["../../src/internal/reorder.ts"],"names":[],"mappings":"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"}