@gjermundgaraba-designs/pixel-paper 0.12.0 → 0.14.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 (141) hide show
  1. package/DESIGN.md +32 -25
  2. package/dist/src/announcer/announcer.d.ts +34 -26
  3. package/dist/src/announcer/announcer.d.ts.map +1 -1
  4. package/dist/src/announcer/announcer.js +42 -32
  5. package/dist/src/announcer/index.d.ts +1 -1
  6. package/dist/src/announcer/index.d.ts.map +1 -1
  7. package/dist/src/announcer/index.js +1 -1
  8. package/dist/src/banner/banner.d.ts +1 -1
  9. package/dist/src/banner/banner.js +1 -1
  10. package/dist/src/barChart/barChart.js +1 -1
  11. package/dist/src/board/board.d.ts +1 -4
  12. package/dist/src/board/board.d.ts.map +1 -1
  13. package/dist/src/board/board.js +8 -71
  14. package/dist/src/button/button.d.ts +1 -1
  15. package/dist/src/button/button.js +1 -1
  16. package/dist/src/card/card.d.ts +35 -9
  17. package/dist/src/card/card.d.ts.map +1 -1
  18. package/dist/src/card/card.js +46 -8
  19. package/dist/src/card/index.d.ts +2 -2
  20. package/dist/src/card/index.d.ts.map +1 -1
  21. package/dist/src/card/index.js +1 -1
  22. package/dist/src/commandPalette/commandPalette.d.ts +4 -0
  23. package/dist/src/commandPalette/commandPalette.d.ts.map +1 -1
  24. package/dist/src/confirmDialog/confirmDialog.d.ts +18 -26
  25. package/dist/src/confirmDialog/confirmDialog.d.ts.map +1 -1
  26. package/dist/src/confirmDialog/confirmDialog.js +21 -19
  27. package/dist/src/confirmDialog/index.d.ts +1 -1
  28. package/dist/src/confirmDialog/index.d.ts.map +1 -1
  29. package/dist/src/confirmDialog/index.js +1 -1
  30. package/dist/src/contextMenu/contextMenu.d.ts +6 -6
  31. package/dist/src/dialog/dialog.d.ts +36 -7
  32. package/dist/src/dialog/dialog.d.ts.map +1 -1
  33. package/dist/src/dialog/dialog.js +32 -12
  34. package/dist/src/dialog/index.d.ts +1 -1
  35. package/dist/src/dialog/index.d.ts.map +1 -1
  36. package/dist/src/dialog/index.js +1 -1
  37. package/dist/src/drag/drag.d.ts +40 -0
  38. package/dist/src/drag/drag.d.ts.map +1 -0
  39. package/dist/src/drag/drag.js +134 -0
  40. package/dist/src/emptyState/emptyState.d.ts +6 -4
  41. package/dist/src/emptyState/emptyState.d.ts.map +1 -1
  42. package/dist/src/emptyState/emptyState.js +1 -1
  43. package/dist/src/errorSummary/errorSummary.d.ts +1 -1
  44. package/dist/src/errorSummary/errorSummary.js +1 -1
  45. package/dist/src/index.d.ts +3 -0
  46. package/dist/src/index.d.ts.map +1 -1
  47. package/dist/src/index.js +3 -0
  48. package/dist/src/keyHelp/keyHelp.d.ts +4 -0
  49. package/dist/src/keyHelp/keyHelp.d.ts.map +1 -1
  50. package/dist/src/lineChart/lineChart.js +1 -1
  51. package/dist/src/liveRegion/index.d.ts +3 -0
  52. package/dist/src/liveRegion/index.d.ts.map +1 -0
  53. package/dist/src/liveRegion/index.js +1 -0
  54. package/dist/src/liveRegion/liveRegion.d.ts +42 -0
  55. package/dist/src/liveRegion/liveRegion.d.ts.map +1 -0
  56. package/dist/src/liveRegion/liveRegion.js +35 -0
  57. package/dist/src/loading/loading.d.ts +8 -3
  58. package/dist/src/loading/loading.d.ts.map +1 -1
  59. package/dist/src/loading/loading.js +4 -3
  60. package/dist/src/menu/menu.d.ts +6 -6
  61. package/dist/src/meter/meter.d.ts +3 -0
  62. package/dist/src/meter/meter.d.ts.map +1 -1
  63. package/dist/src/meter/meter.js +6 -3
  64. package/dist/src/places/places.d.ts +15 -5
  65. package/dist/src/places/places.d.ts.map +1 -1
  66. package/dist/src/places/places.js +19 -17
  67. package/dist/src/remote/index.d.ts +3 -0
  68. package/dist/src/remote/index.d.ts.map +1 -0
  69. package/dist/src/remote/index.js +1 -0
  70. package/dist/src/remote/remote.d.ts +29 -0
  71. package/dist/src/remote/remote.d.ts.map +1 -0
  72. package/dist/src/remote/remote.js +41 -0
  73. package/dist/src/rows/index.d.ts +1 -1
  74. package/dist/src/rows/index.d.ts.map +1 -1
  75. package/dist/src/rows/rows.d.ts +24 -3
  76. package/dist/src/rows/rows.d.ts.map +1 -1
  77. package/dist/src/rows/rows.js +44 -15
  78. package/dist/src/skipLink/index.d.ts +1 -1
  79. package/dist/src/skipLink/index.d.ts.map +1 -1
  80. package/dist/src/skipLink/index.js +1 -1
  81. package/dist/src/skipLink/skipLink.d.ts +24 -8
  82. package/dist/src/skipLink/skipLink.d.ts.map +1 -1
  83. package/dist/src/skipLink/skipLink.js +27 -8
  84. package/dist/src/sortable/index.d.ts +3 -0
  85. package/dist/src/sortable/index.d.ts.map +1 -0
  86. package/dist/src/sortable/index.js +1 -0
  87. package/dist/src/sortable/sortable.d.ts +1144 -0
  88. package/dist/src/sortable/sortable.d.ts.map +1 -0
  89. package/dist/src/sortable/sortable.js +504 -0
  90. package/dist/src/toast/index.d.ts +1 -1
  91. package/dist/src/toast/index.d.ts.map +1 -1
  92. package/dist/src/toast/index.js +1 -1
  93. package/dist/src/toast/toast.d.ts +32 -20
  94. package/dist/src/toast/toast.d.ts.map +1 -1
  95. package/dist/src/toast/toast.js +8 -3
  96. package/dist/src/topBar/barHeight.d.ts +6 -0
  97. package/dist/src/topBar/barHeight.d.ts.map +1 -1
  98. package/dist/src/topBar/barHeight.js +4 -0
  99. package/dist/src/topBar/index.d.ts +1 -1
  100. package/dist/src/topBar/index.d.ts.map +1 -1
  101. package/dist/src/topBar/index.js +1 -1
  102. package/dist/src/topBar/topBar.d.ts +1 -2
  103. package/dist/src/topBar/topBar.d.ts.map +1 -1
  104. package/package.json +1 -1
  105. package/src/announcer/announcer.ts +48 -32
  106. package/src/announcer/index.ts +1 -1
  107. package/src/banner/banner.ts +1 -1
  108. package/src/barChart/barChart.ts +1 -1
  109. package/src/board/board.ts +18 -87
  110. package/src/button/button.ts +1 -1
  111. package/src/card/card.ts +120 -21
  112. package/src/card/index.ts +2 -2
  113. package/src/confirmDialog/confirmDialog.ts +25 -32
  114. package/src/confirmDialog/index.ts +2 -0
  115. package/src/dialog/dialog.ts +39 -13
  116. package/src/dialog/index.ts +3 -1
  117. package/src/drag/drag.ts +207 -0
  118. package/src/emptyState/emptyState.ts +7 -5
  119. package/src/errorSummary/errorSummary.ts +1 -1
  120. package/src/index.ts +3 -0
  121. package/src/lineChart/lineChart.ts +1 -1
  122. package/src/liveRegion/index.ts +2 -0
  123. package/src/liveRegion/liveRegion.ts +75 -0
  124. package/src/loading/loading.ts +11 -5
  125. package/src/meter/meter.ts +17 -3
  126. package/src/pixel-paper.css +197 -28
  127. package/src/places/places.ts +43 -30
  128. package/src/remote/index.ts +2 -0
  129. package/src/remote/remote.ts +76 -0
  130. package/src/rows/index.ts +1 -0
  131. package/src/rows/rows.ts +87 -22
  132. package/src/skipLink/index.ts +1 -1
  133. package/src/skipLink/skipLink.ts +38 -9
  134. package/src/sortable/index.ts +14 -0
  135. package/src/sortable/sortable.ts +857 -0
  136. package/src/toast/index.ts +1 -0
  137. package/src/toast/toast.ts +9 -3
  138. package/src/tokens.css +13 -11
  139. package/src/topBar/barHeight.ts +6 -0
  140. package/src/topBar/index.ts +1 -1
  141. package/src/topBar/topBar.ts +1 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sortable.d.ts","sourceRoot":"","sources":["../../../src/sortable/sortable.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,504 @@
1
+ import { brandViewResult as __foldkitBrandViewResult } from 'foldkit/brand'
2
+ import { DragAndDrop as UiDragAndDrop } from "@foldkit/ui";
3
+ import { Array, Effect, Match, Option, Schema, Stream, pipe } from "effect";
4
+ import * as Command from "foldkit/command";
5
+ import { defineMessageUnion } from "foldkit/message";
6
+ import * as Mount from "foldkit/mount";
7
+ import { modifyFields } from "foldkit/struct";
8
+ import { defineView } from "foldkit/submodel";
9
+ import * as Subscription from "foldkit/subscription";
10
+ import * as Update from "foldkit/update";
11
+ import * as Announcer from "../announcer/announcer.js";
12
+ import * as Button from "../button/button.js";
13
+ import { LEFT_BUTTON, activatedKeyboardDrag, cancelledDrag, escapeKeys, innerControls, insertionIndex, isCarrying, markDragging, measureLift, movedPointer, phaseOf, pressedDraggable, releasedPointer, } from "../drag/drag.js";
14
+ import * as Glyph from "../glyph/glyph.js";
15
+ import * as IconButton from "../iconButton/iconButton.js";
16
+ import { LOCALE } from "../locale/locale.js";
17
+ import { prefixKeys } from "../subscription/prefixKeys.js";
18
+ // MODEL
19
+ /** Schema for one item as the list knows it: its id, unique in the list, and its name in
20
+ * words, which the grip and screen readers use. */
21
+ export const Item = Schema.Struct({ id: Schema.String, label: Schema.String });
22
+ /** The words a sortable says. `{item}` stands for the item's label, `{position}` and `{total}`
23
+ * for where it is, counted from one. */
24
+ const COPY = {
25
+ gripLabel: "Move {item}",
26
+ gripHelp: "Press space to pick the item up. Arrow keys move it one place, space drops it, escape cancels.",
27
+ pickedUp: "Picked up {item}.",
28
+ pickedUpByKeyboard: "Picked up {item}, {position} of {total}. Arrow keys move it one place, space drops it, escape cancels.",
29
+ over: "{item}, {position} of {total}.",
30
+ dropped: "{item} dropped at {position} of {total}.",
31
+ putBack: "{item} put back where it was.",
32
+ cancelled: "Move cancelled. {item} put back where it was.",
33
+ };
34
+ const Press = Schema.Struct({
35
+ pointerId: Schema.Number,
36
+ clientX: Schema.Number,
37
+ clientY: Schema.Number,
38
+ });
39
+ /** What the list keeps while an item is pressed or held: the item, the items as the view had
40
+ * them when it was pressed (a drop is placed against them, and each step is said from them),
41
+ * and the pointer that pressed it and where (none for the keyboard). */
42
+ const Held = Schema.Struct({
43
+ item: Item,
44
+ items: Schema.Array(Item),
45
+ maybePress: Schema.Option(Press),
46
+ });
47
+ /** Schema for a sortable: the `@foldkit/ui` DragAndDrop it moves items with, whether items may
48
+ * move, and what it keeps while an item is held. The items are the parent's. */
49
+ export const Model = Schema.Struct({
50
+ dragAndDrop: UiDragAndDrop.Model,
51
+ isMovable: Schema.Boolean,
52
+ maybeHeld: Schema.Option(Held),
53
+ });
54
+ // MESSAGE
55
+ /** Union of all Messages a sortable can produce. */
56
+ export const Message = defineMessageUnion({
57
+ GotDragAndDropMessage: { message: UiDragAndDrop.Message },
58
+ PressedItem: {
59
+ itemId: Schema.String,
60
+ pointerId: Schema.Number,
61
+ screenX: Schema.Number,
62
+ screenY: Schema.Number,
63
+ clientX: Schema.Number,
64
+ clientY: Schema.Number,
65
+ items: Schema.Array(Item),
66
+ },
67
+ PressedGripKey: { itemId: Schema.String, items: Schema.Array(Item) },
68
+ MovedPointer: {
69
+ screenX: Schema.Number,
70
+ screenY: Schema.Number,
71
+ clientX: Schema.Number,
72
+ clientY: Schema.Number,
73
+ maybeIndex: Schema.Option(Schema.Number),
74
+ },
75
+ ReleasedPointer: {
76
+ screenX: Schema.Number,
77
+ screenY: Schema.Number,
78
+ clientX: Schema.Number,
79
+ clientY: Schema.Number,
80
+ maybeIndex: Schema.Option(Schema.Number),
81
+ },
82
+ CancelledPointer: {},
83
+ PressedEscape: {},
84
+ CompletedAnnounceReorder: {},
85
+ CompletedSizeLiftedItem: {},
86
+ });
87
+ // OUT MESSAGE
88
+ /** Union of OutMessages a sortable reports. `Moved`: an item was dropped somewhere new.
89
+ * `toIndex` is its place in the list once moved; `maybeAfterItemId` and `maybeBeforeItemId`
90
+ * name the items it now sits between, the anchors a list ordered by neighbours needs. A drop
91
+ * where the item already was, outside the list, or while items may not move reports nothing.
92
+ * The parent moves the item (or decides not to): the data is its own. */
93
+ export const OutMessage = defineMessageUnion({
94
+ Moved: {
95
+ itemId: Schema.String,
96
+ fromIndex: Schema.Number,
97
+ toIndex: Schema.Number,
98
+ maybeAfterItemId: Schema.Option(Schema.String),
99
+ maybeBeforeItemId: Schema.Option(Schema.String),
100
+ },
101
+ });
102
+ /** Creates a sortable whose items may move, with nothing held. */
103
+ export const init = (config) => (__foldkitBrandViewResult(({
104
+ dragAndDrop: UiDragAndDrop.init({ id: config.id }),
105
+ isMovable: true,
106
+ maybeHeld: Option.none(),
107
+ }), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#init"));
108
+ // ACCESSORS
109
+ /** The list's id, unique in the document. */
110
+ const id = (model) => __foldkitBrandViewResult((model.dragAndDrop.id), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#id");
111
+ /** Whether an item is pressed or held. */
112
+ export const isHolding = (model) => __foldkitBrandViewResult((Option.isSome(UiDragAndDrop.maybeDraggedItemId(model.dragAndDrop))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#isHolding");
113
+ // DOM HOOKS
114
+ const itemHook = (model, itemId) => __foldkitBrandViewResult((`${id(model)}/${itemId}`), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#itemHook");
115
+ const ITEM_ATTRIBUTE = "sortable-item";
116
+ const GRIP_ATTRIBUTE = "sortable-grip";
117
+ // COMMAND
118
+ /** Says a step of a move through the page's live region (as `Announcer.Announce` does). */
119
+ export const AnnounceReorder = Command.define("AnnounceReorder", {
120
+ args: { text: Schema.String },
121
+ messages: [Message.CompletedAnnounceReorder],
122
+ execute: ({ text }) => __foldkitBrandViewResult((Announcer.announce(text).pipe(Effect.as(Message.CompletedAnnounceReorder()))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#execute"),
123
+ });
124
+ const fill = (template, item, position = 0, total = 0) => __foldkitBrandViewResult((template
125
+ .replaceAll("{item}", item)
126
+ .replaceAll("{position}", position.toLocaleString(LOCALE))
127
+ .replaceAll("{total}", total.toLocaleString(LOCALE))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#fill");
128
+ const indexOf = (items, itemId) => __foldkitBrandViewResult((Array.findFirstIndex(items, (item) => __foldkitBrandViewResult((item.id === itemId), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous"))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#indexOf");
129
+ /** Where the held item would land, counted among the others (both the keyboard's target and
130
+ * the pointer's are), clamped to the list. */
131
+ const targetIndex = (model, held) => __foldkitBrandViewResult((Option.map(UiDragAndDrop.maybeDropTarget(model.dragAndDrop), ({ index }) => __foldkitBrandViewResult((Math.min(Math.max(index, 0), held.items.length - 1)), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~2"))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#targetIndex");
132
+ const placementOf = (model, held, rawIndex) => __foldkitBrandViewResult((Option.gen(function* () {
133
+ const fromIndex = yield* indexOf(held.items, held.item.id);
134
+ const others = Array.filter(held.items, (item) => __foldkitBrandViewResult((item.id !== held.item.id), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~4"));
135
+ const toIndex = Math.min(Math.max(rawIndex, 0), others.length);
136
+ if (toIndex === fromIndex || !model.isMovable) {
137
+ return __foldkitBrandViewResult((yield* Option.none()), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~3");
138
+ }
139
+ return __foldkitBrandViewResult((OutMessage.Moved({
140
+ itemId: held.item.id,
141
+ fromIndex,
142
+ toIndex,
143
+ maybeAfterItemId: Option.map(toIndex > 0 ? Array.get(others, toIndex - 1) : Option.none(), (item) => __foldkitBrandViewResult((item.id), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~5")),
144
+ maybeBeforeItemId: Option.map(Array.get(others, toIndex), (item) => __foldkitBrandViewResult((item.id), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~6")),
145
+ })), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~3");
146
+ })), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#placementOf");
147
+ const foldDragAndDropOutMessage = UiDragAndDrop.OutMessage.match({
148
+ Reordered: ({ toIndex }) => __foldkitBrandViewResult(((stepModel) => __foldkitBrandViewResult((Update.withOutMessage({ model: stepModel }, Option.getOrUndefined(Option.flatMap(stepModel.maybeHeld, (held) => __foldkitBrandViewResult((placementOf(stepModel, held, toIndex)), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~8"))))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~7")), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#Reordered"),
149
+ Cancelled: () => __foldkitBrandViewResult(((stepModel) => (__foldkitBrandViewResult(({ model: stepModel }), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~9"))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#Cancelled"),
150
+ });
151
+ const toDragAndDropMessage = (message) => __foldkitBrandViewResult((Message.GotDragAndDropMessage({ message })), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#toDragAndDropMessage");
152
+ const foldDragAndDrop = Update.foldChild({
153
+ update: UiDragAndDrop.update,
154
+ read: (model) => __foldkitBrandViewResult((Option.some(model.dragAndDrop)), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#read"),
155
+ write: (model, nextDragAndDrop) => __foldkitBrandViewResult((modifyFields(model, { dragAndDrop: () => __foldkitBrandViewResult((nextDragAndDrop), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#dragAndDrop") })), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#write"),
156
+ toParentMessage: toDragAndDropMessage,
157
+ foldOutMessage: foldDragAndDropOutMessage,
158
+ });
159
+ /** What screen readers hear for one step of a move, from the phase before and after it.
160
+ * `putBack` is what an item set down without a move says: put back, or cancelled. */
161
+ const moveText = (held, previous, next, maybeOutMessage, putBack) => {
162
+ const { label } = held.item;
163
+ const total = held.items.length;
164
+ const before = phaseOf(previous.dragAndDrop);
165
+ const after = phaseOf(next.dragAndDrop);
166
+ const position = (index) => __foldkitBrandViewResult((index + 1), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#position");
167
+ if (after === "Idle") {
168
+ return __foldkitBrandViewResult((isCarrying(before)
169
+ ? Option.some(Option.match(maybeOutMessage, {
170
+ onNone: () => __foldkitBrandViewResult((fill(putBack, label)), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#onNone"),
171
+ onSome: ({ toIndex }) => __foldkitBrandViewResult((fill(COPY.dropped, label, position(toIndex), total)), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#onSome"),
172
+ }))
173
+ : Option.none()), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#moveText");
174
+ }
175
+ else if (before === "Pressed" && after === "PointerDragging") {
176
+ return __foldkitBrandViewResult((Option.some(fill(COPY.pickedUp, label))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#moveText");
177
+ }
178
+ else if (before === "Idle" && after === "KeyboardDragging") {
179
+ return __foldkitBrandViewResult((Option.map(targetIndex(next, held), (index) => __foldkitBrandViewResult((fill(COPY.pickedUpByKeyboard, label, position(index), total)), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~10"))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#moveText");
180
+ }
181
+ else if (after === "KeyboardDragging") {
182
+ return __foldkitBrandViewResult((pipe(targetIndex(next, held), Option.filter((index) => __foldkitBrandViewResult((!Option.contains(targetIndex(previous, held), index)), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~11")), Option.map((index) => __foldkitBrandViewResult((fill(COPY.over, label, position(index), total)), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~12")))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#moveText");
183
+ }
184
+ else {
185
+ return __foldkitBrandViewResult((Option.none()), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#moveText");
186
+ }
187
+ };
188
+ /** Announces the step a DragAndDrop update took and forgets the held item once it is down. */
189
+ const settle = (previous, putBack = COPY.putBack) => __foldkitBrandViewResult(((dragAndDropUpdate) => {
190
+ const nextModel = phaseOf(dragAndDropUpdate.model.dragAndDrop) === "Idle"
191
+ ? modifyFields(dragAndDropUpdate.model, { maybeHeld: () => __foldkitBrandViewResult((Option.none()), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#maybeHeld") })
192
+ : dragAndDropUpdate.model;
193
+ const maybeText = Option.flatMap(previous.maybeHeld, (held) => __foldkitBrandViewResult((moveText(held, previous, dragAndDropUpdate.model, Option.fromNullishOr(dragAndDropUpdate.outMessage), putBack)), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~14"));
194
+ return __foldkitBrandViewResult((Update.withOutMessage({
195
+ model: nextModel,
196
+ commands: [
197
+ ...(dragAndDropUpdate.commands ?? []),
198
+ ...Array.fromOption(Option.map(maybeText, (text) => __foldkitBrandViewResult((AnnounceReorder({ text })), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~15"))),
199
+ ],
200
+ }, dragAndDropUpdate.outMessage)), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~13");
201
+ }), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#settle");
202
+ // NOTE: @foldkit/ui gap: DragAndDrop's pointer resolves a drop along one axis, which a
203
+ // wrapping grid cannot use, so the list reads the pointer itself and hands DragAndDrop its
204
+ // moves and release.
205
+ const canLift = (model) => __foldkitBrandViewResult((model.isMovable && phaseOf(model.dragAndDrop) === "Idle"), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#canLift");
206
+ /** The item `itemId` and its place, when the list may lift it now. */
207
+ const liftable = (model, items, itemId) => __foldkitBrandViewResult((Option.filter(Option.flatMap(indexOf(items, itemId), (index) => __foldkitBrandViewResult((Option.map(Array.get(items, index), (item) => (__foldkitBrandViewResult(({ index, item }), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~17")))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~16")), () => __foldkitBrandViewResult((canLift(model)), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~18"))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#liftable");
208
+ /** Lifts `held` with the DragAndDrop Message `lift` and says so. */
209
+ const lift = (model, held, liftMessage) => {
210
+ const pressed = modifyFields(model, { maybeHeld: () => __foldkitBrandViewResult((Option.some(held)), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#maybeHeld~2") });
211
+ return __foldkitBrandViewResult((settle(pressed)(foldDragAndDrop(pressed, liftMessage))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#lift");
212
+ };
213
+ const pointerMove = (model, pointer) => __foldkitBrandViewResult((movedPointer({
214
+ screenX: pointer.screenX,
215
+ screenY: pointer.screenY,
216
+ clientX: pointer.clientX,
217
+ clientY: pointer.clientY,
218
+ maybeDropTarget: Option.map(pointer.maybeIndex, (index) => (__foldkitBrandViewResult(({ containerId: id(model), index }), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~19"))),
219
+ })), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#pointerMove");
220
+ /** Drops a carried item where the pointer is let go, read again there: the page may have
221
+ * scrolled under a still pointer since it last moved. A press that never moved is let go
222
+ * as it is, so it stays a press. */
223
+ const release = (model, pointer) => {
224
+ if (phaseOf(model.dragAndDrop) !== "PointerDragging") {
225
+ return __foldkitBrandViewResult((foldDragAndDrop(model, releasedPointer())), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#release");
226
+ }
227
+ const moved = foldDragAndDrop(model, pointerMove(model, pointer));
228
+ const released = foldDragAndDrop(moved.model, releasedPointer());
229
+ return __foldkitBrandViewResult((Update.withOutMessage({
230
+ model: released.model,
231
+ commands: [...(moved.commands ?? []), ...(released.commands ?? [])],
232
+ }, released.outMessage)), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#release");
233
+ };
234
+ const cancelDrag = (model) => __foldkitBrandViewResult((settle(model, COPY.cancelled)(foldDragAndDrop(model, cancelledDrag()))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#cancelDrag");
235
+ const updateDragAndDrop = (model, message) => __foldkitBrandViewResult((Match.value(message).pipe(Match.withReturnType(),
236
+ // Tab while an item is held reaches DragAndDrop as a step to another list: the list has
237
+ // no other, so it stays
238
+ Match.tag("PressedArrowKey", ({ direction }) => __foldkitBrandViewResult((direction === "NextContainer" || direction === "PreviousContainer"
239
+ ? { model }
240
+ : settle(model)(foldDragAndDrop(model, message))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~20")), Match.tag("CancelledDrag", () => __foldkitBrandViewResult((cancelDrag(model)), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~21")), Match.orElse(() => __foldkitBrandViewResult((settle(model)(foldDragAndDrop(model, message))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~22")))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#updateDragAndDrop");
241
+ /** Processes a sortable Message and returns the next Model, Commands and OutMessage. */
242
+ export const update = (model, message) => __foldkitBrandViewResult((Message.match(message, {
243
+ GotDragAndDropMessage: ({ message: dragAndDropMessage }) => __foldkitBrandViewResult((updateDragAndDrop(model, dragAndDropMessage)), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#GotDragAndDropMessage"),
244
+ PressedItem: ({ itemId, pointerId, screenX, screenY, clientX, clientY, items }) => __foldkitBrandViewResult((Option.match(liftable(model, items, itemId), {
245
+ onNone: () => (__foldkitBrandViewResult(({ model }), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#onNone~2")),
246
+ onSome: ({ index, item }) => __foldkitBrandViewResult((lift(model, { item, items, maybePress: Option.some({ pointerId, clientX, clientY }) }, pressedDraggable({
247
+ itemId: itemHook(model, itemId),
248
+ containerId: id(model),
249
+ index,
250
+ screenX,
251
+ screenY,
252
+ }))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#onSome~2"),
253
+ })), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#PressedItem"),
254
+ PressedGripKey: ({ itemId, items }) => __foldkitBrandViewResult((Option.match(liftable(model, items, itemId), {
255
+ onNone: () => (__foldkitBrandViewResult(({ model }), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#onNone~3")),
256
+ onSome: ({ index, item }) => __foldkitBrandViewResult((lift(model, { item, items, maybePress: Option.none() }, activatedKeyboardDrag({
257
+ itemId: itemHook(model, itemId),
258
+ containerId: id(model),
259
+ index,
260
+ }))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#onSome~3"),
261
+ })), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#PressedGripKey"),
262
+ MovedPointer: (pointer) => __foldkitBrandViewResult((settle(model)(foldDragAndDrop(model, pointerMove(model, pointer)))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#MovedPointer"),
263
+ ReleasedPointer: (pointer) => __foldkitBrandViewResult((settle(model)(release(model, pointer))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#ReleasedPointer"),
264
+ CancelledPointer: () => __foldkitBrandViewResult((settle(model)(foldDragAndDrop(model, cancelledDrag()))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#CancelledPointer"),
265
+ PressedEscape: () => __foldkitBrandViewResult((cancelDrag(model)), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#PressedEscape"),
266
+ CompletedAnnounceReorder: () => (__foldkitBrandViewResult(({ model }), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#CompletedAnnounceReorder")),
267
+ CompletedSizeLiftedItem: () => (__foldkitBrandViewResult(({ model }), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#CompletedSizeLiftedItem")),
268
+ })), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#update");
269
+ // CAPABILITIES
270
+ /** Lets items move, or stops them: while work runs, nothing moves. Stopping cancels an item
271
+ * that is pressed or held, so no `Moved` arrives for it. */
272
+ export const setMovable = (model, isMovable) => {
273
+ const next = modifyFields(model, { isMovable: () => __foldkitBrandViewResult((isMovable), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#isMovable") });
274
+ return __foldkitBrandViewResult((isMovable ? { model: next } : cancelDrag(next)), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#setMovable");
275
+ };
276
+ // SUBSCRIPTION
277
+ /** Where a pointer at this point would drop the held item in the list `listId`: none when the
278
+ * pointer is not over it. */
279
+ const pointerIndex = (listId, heldHook, clientX, clientY) => __foldkitBrandViewResult((pipe(Array.findFirst(document.elementsFromPoint(clientX, clientY), (element) => __foldkitBrandViewResult((element.getAttribute("data-droppable-id") === listId), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~23")), Option.map((list) => __foldkitBrandViewResult((insertionIndex(list, heldHook, clientX, clientY)), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~24")))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#pointerIndex");
280
+ const PointerHold = Schema.Struct({
281
+ listId: Schema.String,
282
+ heldHook: Schema.String,
283
+ pointerId: Schema.Number,
284
+ });
285
+ const pointerAt = (hold, event) => (__foldkitBrandViewResult(({
286
+ screenX: event.screenX,
287
+ screenY: event.screenY,
288
+ clientX: event.clientX,
289
+ clientY: event.clientY,
290
+ maybeIndex: pointerIndex(hold.listId, hold.heldHook, event.clientX, event.clientY),
291
+ }), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#pointerAt"));
292
+ /** The pressing pointer's moves, release and cancel; another pointer's are not the list's. */
293
+ export const pointerMessages = (hold) => {
294
+ const fromPressing = (type) => __foldkitBrandViewResult((Stream.fromEventListener(document, type).pipe(Stream.filter((event) => __foldkitBrandViewResult((event.pointerId === hold.pointerId), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~25")))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#fromPressing");
295
+ const streams = [
296
+ Stream.map(fromPressing("pointermove"), (event) => __foldkitBrandViewResult((Message.MovedPointer(pointerAt(hold, event))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~26")),
297
+ Stream.map(fromPressing("pointerup"), (event) => __foldkitBrandViewResult((Message.ReleasedPointer(pointerAt(hold, event))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~27")),
298
+ Stream.map(fromPressing("pointercancel"), () => __foldkitBrandViewResult((Message.CancelledPointer()), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~28")),
299
+ ];
300
+ return __foldkitBrandViewResult((Stream.mergeAll(streams, { concurrency: "unbounded" })), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#pointerMessages");
301
+ };
302
+ const ownSubscriptions = Subscription.make()((entry) => (__foldkitBrandViewResult(({
303
+ pointer: entry({ maybeHold: Schema.Option(PointerHold) }, {
304
+ modelToDependencies: (model) => (__foldkitBrandViewResult(({
305
+ maybeHold: Option.filter(Option.flatMap(model.maybeHeld, ({ item, maybePress }) => __foldkitBrandViewResult((Option.map(maybePress, ({ pointerId }) => (__foldkitBrandViewResult(({
306
+ listId: id(model),
307
+ heldHook: itemHook(model, item.id),
308
+ pointerId,
309
+ }), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~31")))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~30")), () => {
310
+ const phase = phaseOf(model.dragAndDrop);
311
+ return __foldkitBrandViewResult((phase === "Pressed" || phase === "PointerDragging"), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~32");
312
+ }),
313
+ }), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#modelToDependencies")),
314
+ dependenciesToStream: ({ maybeHold }) => __foldkitBrandViewResult((Option.match(maybeHold, {
315
+ onNone: () => __foldkitBrandViewResult((Stream.empty), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#onNone~4"),
316
+ onSome: (hold) => __foldkitBrandViewResult((Stream.merge(pointerMessages(hold), markDragging)), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#onSome~4"),
317
+ })), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#dependenciesToStream"),
318
+ }),
319
+ escape: entry({ isHolding: Schema.Boolean }, {
320
+ modelToDependencies: (model) => (__foldkitBrandViewResult(({ isHolding: isHolding(model) }), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#modelToDependencies~2")),
321
+ dependenciesToStream: ({ isHolding: isHoldingNow }) => __foldkitBrandViewResult((isHoldingNow ? escapeKeys(Message.PressedEscape()) : Stream.empty), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#dependenciesToStream~2"),
322
+ }),
323
+ }), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~29")));
324
+ // NOTE: @foldkit/ui gap: DragAndDrop's Subscription keys are fixed, so two of its users on a
325
+ // page would share them. The list lifts the ones it uses under its own names, behind the
326
+ // parent's prefix.
327
+ const dragSubscriptions = Subscription.lift({
328
+ keyboard: UiDragAndDrop.subscriptions.documentKeyboard,
329
+ autoScroll: UiDragAndDrop.subscriptions.autoScroll,
330
+ })({
331
+ read: (model) => __foldkitBrandViewResult((Option.some(model.dragAndDrop)), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#read~2"),
332
+ toParentMessage: toDragAndDropMessage,
333
+ });
334
+ const sortableSubscriptions = Subscription.aggregate(ownSubscriptions, dragSubscriptions);
335
+ /** A held item follows the pointer, the arrows and Space move and drop it, Escape puts it back
336
+ * and the page scrolls near its edges, from listeners that run only while an item is pressed
337
+ * or held. Lift them into the application's Subscriptions, once per list, behind a key prefix
338
+ * of the parent's: `subscriptions("order")` is keyed `orderPointer`, `orderEscape`,
339
+ * `orderKeyboard` and `orderAutoScroll`. */
340
+ export const subscriptions = (keyPrefix) => __foldkitBrandViewResult((prefixKeys(keyPrefix, sortableSubscriptions)), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#subscriptions");
341
+ // LIFTED ITEM
342
+ /** Sizes the copy that follows the pointer to the item it lifts, and keeps the pointer where
343
+ * it pressed the item. Measures the item once, when the copy appears. */
344
+ export const SizeLiftedItem = Mount.define("SizeLiftedItem", {
345
+ args: { itemHook: Schema.String, pressX: Schema.Number, pressY: Schema.Number },
346
+ messages: [Message.CompletedSizeLiftedItem],
347
+ execute: ({ element, itemHook: hook, pressX, pressY }) => __foldkitBrandViewResult((Effect.sync(() => {
348
+ measureLift(element, `[data-sortable-id="${CSS.escape(hook)}"]`, pressX, pressY);
349
+ return __foldkitBrandViewResult((Message.CompletedSizeLiftedItem()), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~33");
350
+ })), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#execute~2"),
351
+ });
352
+ const INNER_CONTROL = innerControls(`[data-${GRIP_ATTRIBUTE}]`);
353
+ /** Whether a press lifts the item: on its grip under any pointer, on its body under a mouse,
354
+ * and never on a control inside it. */
355
+ const isLiftingPress = (target, pointerType) => {
356
+ if (!(target instanceof Element)) {
357
+ return __foldkitBrandViewResult((pointerType === "mouse"), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#isLiftingPress");
358
+ }
359
+ const isOnGrip = target.closest(`[data-${GRIP_ATTRIBUTE}]`) !== null;
360
+ const maybeItem = Option.fromNullishOr(target.closest(`[data-${ITEM_ATTRIBUTE}]`));
361
+ const isOnControl = Option.exists(maybeItem, (item) => {
362
+ const control = target.closest(INNER_CONTROL);
363
+ return __foldkitBrandViewResult((control !== null && item.contains(control)), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~34");
364
+ });
365
+ return __foldkitBrandViewResult((isOnGrip || (pointerType === "mouse" && !isOnControl)), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#isLiftingPress");
366
+ };
367
+ const helpId = (model) => __foldkitBrandViewResult((`${id(model)}-grip-help`), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#helpId");
368
+ const isHeldItem = (model, itemId) => __foldkitBrandViewResult((UiDragAndDrop.isDragging(model.dragAndDrop) &&
369
+ Option.contains(UiDragAndDrop.maybeDraggedItemId(model.dragAndDrop), itemHook(model, itemId))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#isHeldItem");
370
+ const liftedGrip = (h) => __foldkitBrandViewResult((h.span([h.Class("iconbtn quiet"), h.AriaHidden(true)], [Glyph.view({ name: "grip" }, h)])), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#liftedGrip");
371
+ const liftedView = (info, item, h) => __foldkitBrandViewResult((h.div([h.Class("sortable-item lifted")], [liftedGrip(h), h.div([h.Class("sortable-body")], info.toItemView(item, { isLifted: true }))])), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#liftedView");
372
+ const gripView = (info, item, h) => {
373
+ const { model, items } = info;
374
+ const isIdleNow = phaseOf(model.dragAndDrop) === "Idle";
375
+ const onGripKey = h.OnKeyDownPreventDefault((key) => __foldkitBrandViewResult((Option.liftPredicate(Message.PressedGripKey({ itemId: item.id, items }), () => __foldkitBrandViewResult((isIdleNow && (key === " " || key === "Enter")), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~36"))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~35"));
376
+ // NOTE: @foldkit/ui gap: DragAndDrop's `draggable` bundle forces `role="option"`, which a
377
+ // plain list's items are not. So the grip carries the ui's `data-draggable-id` by hand, and
378
+ // FocusItem finds the grip by it. While moves are held the grip stays, held, so the focus
379
+ // of a keyboard hold that stopping cancels has somewhere to return.
380
+ return __foldkitBrandViewResult((IconButton.view({
381
+ glyph: "grip",
382
+ label: fill(COPY.gripLabel, item.label),
383
+ isQuiet: true,
384
+ isDisabled: !model.isMovable,
385
+ attributes: [
386
+ h.DataAttribute("draggable-id", itemHook(model, item.id)),
387
+ h.DataAttribute(GRIP_ATTRIBUTE, ""),
388
+ h.AriaRoleDescription("draggable"),
389
+ h.AriaDescribedBy(helpId(model)),
390
+ Button.pressedAttribute(isHeldItem(model, item.id), h),
391
+ ...(model.isMovable ? [onGripKey] : []),
392
+ ],
393
+ }, h)), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#gripView");
394
+ };
395
+ const itemAttributes = (info, item, h) => {
396
+ const { model, items } = info;
397
+ const isIdleNow = phaseOf(model.dragAndDrop) === "Idle";
398
+ const onPress = h.OnPointerDown((pointerType, button, screenX, screenY, _time, clientX, clientY, pointerId, target) => __foldkitBrandViewResult((Option.liftPredicate(Message.PressedItem({
399
+ itemId: item.id,
400
+ pointerId,
401
+ screenX,
402
+ screenY,
403
+ clientX,
404
+ clientY,
405
+ items,
406
+ }), () => __foldkitBrandViewResult((isIdleNow &&
407
+ model.isMovable &&
408
+ button === LEFT_BUTTON &&
409
+ isLiftingPress(target, pointerType)), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~38"))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~37"));
410
+ return __foldkitBrandViewResult(([h.DataAttribute(ITEM_ATTRIBUTE, ""), onPress]), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#itemAttributes");
411
+ };
412
+ /** Where a pointer would drop the held item, marked on the item it would land beside: before
413
+ * the other item at its target, or after the last. None where it already was. */
414
+ const dropMarkOf = (model) => __foldkitBrandViewResult((pipe(model.maybeHeld, Option.filter(() => __foldkitBrandViewResult((phaseOf(model.dragAndDrop) === "PointerDragging"), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~39")), Option.flatMap((held) => __foldkitBrandViewResult((pipe(targetIndex(model, held), Option.filter((index) => __foldkitBrandViewResult((!Option.contains(indexOf(held.items, held.item.id), index)), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~41")), Option.flatMap((index) => {
415
+ const others = Array.filter(held.items, (item) => __foldkitBrandViewResult((item.id !== held.item.id), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~43"));
416
+ return __foldkitBrandViewResult((Option.orElse(Option.map(Array.get(others, index), (item) => (__foldkitBrandViewResult(({
417
+ itemId: item.id,
418
+ side: "Before",
419
+ }), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~44"))), () => __foldkitBrandViewResult((Option.map(Array.last(others), (item) => (__foldkitBrandViewResult(({
420
+ itemId: item.id,
421
+ side: "After",
422
+ }), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~46")))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~45"))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~42");
423
+ }))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~40")))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#dropMarkOf");
424
+ const dropClass = (info, item) => __foldkitBrandViewResult((Option.match(Option.filter(info.maybeDropMark, ({ itemId }) => __foldkitBrandViewResult((itemId === item.id), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~47")), {
425
+ onNone: () => __foldkitBrandViewResult((""), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#onNone~5"),
426
+ onSome: ({ side }) => (__foldkitBrandViewResult((side === "Before" ? " drop-before" : " drop-after"), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#onSome~5")),
427
+ })), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#dropClass");
428
+ const itemClass = (info, item) => __foldkitBrandViewResult((`sortable-item${info.model.isMovable ? " movable" : ""}${isHeldItem(info.model, item.id) ? " drag-dim" : ""}${dropClass(info, item)}`), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#itemClass");
429
+ const itemView = (info, item, h) => __foldkitBrandViewResult((h.keyed("li")(item.id, [
430
+ ...UiDragAndDrop.sortable(itemHook(info.model, item.id)),
431
+ ...itemAttributes(info, item, h),
432
+ h.Class(itemClass(info, item)),
433
+ ], [
434
+ gripView(info, item, h),
435
+ h.div([h.Class("sortable-body")], info.toItemView(item, { isLifted: false })),
436
+ ])), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#itemView");
437
+ /** The items in order, with the held item's copy where the keyboard would drop it: before the
438
+ * other item at its target, or last. The copy carries no `data-sortable-id`, so it is not
439
+ * counted as an item. */
440
+ const itemsView = (info, h) => {
441
+ const { model, items } = info;
442
+ const rows = Array.map(items, (item) => (__foldkitBrandViewResult(({ item, html: itemView(info, item, h) }), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~48")));
443
+ const maybeSlot = pipe(model.maybeHeld, Option.filter(() => __foldkitBrandViewResult((phaseOf(model.dragAndDrop) === "KeyboardDragging"), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~49")), Option.flatMap((held) => __foldkitBrandViewResult((Option.map(targetIndex(model, held), (index) => (__foldkitBrandViewResult(({ held, index }), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~51")))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~50")));
444
+ return __foldkitBrandViewResult((Option.match(maybeSlot, {
445
+ onNone: () => __foldkitBrandViewResult((Array.map(rows, ({ html }) => __foldkitBrandViewResult((html), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~52"))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#onNone~6"),
446
+ onSome: ({ held, index }) => {
447
+ const slot = h.keyed("li")("sortable-slot", [h.Class("sortable-slot"), h.AriaHidden(true), h.Inert(true)], [liftedView(info, held.item, h)]);
448
+ const others = Array.filter(rows, ({ item }) => __foldkitBrandViewResult((item.id !== held.item.id), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~53"));
449
+ const maybeBefore = Array.get(others, index);
450
+ return __foldkitBrandViewResult((Option.match(maybeBefore, {
451
+ onNone: () => __foldkitBrandViewResult(([...Array.map(rows, ({ html }) => __foldkitBrandViewResult((html), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~54")), slot]), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#onNone~7"),
452
+ onSome: (before) => __foldkitBrandViewResult((Array.flatMap(rows, ({ item, html }) => __foldkitBrandViewResult((item.id === before.item.id ? [slot, html] : [html]), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~55"))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#onSome~7"),
453
+ })), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#onSome~6");
454
+ },
455
+ })), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#itemsView");
456
+ };
457
+ const liftedCopyView = (info, h) => {
458
+ const { model } = info;
459
+ const maybeLifted = Option.all({
460
+ style: UiDragAndDrop.ghostStyle(model.dragAndDrop),
461
+ held: model.maybeHeld,
462
+ press: Option.flatMap(model.maybeHeld, ({ maybePress }) => __foldkitBrandViewResult((maybePress), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~56")),
463
+ });
464
+ return __foldkitBrandViewResult((Array.fromOption(Option.map(maybeLifted, ({ style, held, press }) => __foldkitBrandViewResult((h.div([
465
+ h.Class("sortable-lift"),
466
+ h.Style(style),
467
+ h.AriaHidden(true),
468
+ h.Inert(true),
469
+ h.OnMount(SizeLiftedItem({
470
+ itemHook: itemHook(model, held.item.id),
471
+ pressX: press.clientX,
472
+ pressY: press.clientY,
473
+ })),
474
+ ], [liftedView(info, held.item, h)])), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~57")))), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#liftedCopyView");
475
+ };
476
+ /**
477
+ * Items the reader puts in order, as rows or as tiles, built on `@foldkit/ui`'s DragAndDrop:
478
+ * `div.sortable` holding `ul.sortable-items` (named by `label`) of `li.sortable-item`, each its
479
+ * grip and the parent's content. The items are the parent's; a drop reports `Moved`.
480
+ *
481
+ * A mouse drags an item by its body or its grip; touch takes the grip alone, so a finger on
482
+ * an item scrolls the page; the keyboard takes the grip too: Space or Enter picks the item
483
+ * up, every arrow moves it one place in reading order, Space drops it and Escape puts it back.
484
+ * The held item dims in place; a copy, lifted onto the card shadow, follows the pointer or
485
+ * prints where the keyboard would drop it; each step is said through the page's live region.
486
+ * Lift `subscriptions(keyPrefix)` into the application's, or nothing follows the pointer or
487
+ * the keys.
488
+ */
489
+ export const view = defineView((model, viewInputs, h) => {
490
+ const { items, label, layout = "List", toItemView } = viewInputs;
491
+ const info = { model, items, maybeDropMark: dropMarkOf(model), toItemView };
492
+ return __foldkitBrandViewResult((h.div([h.Class(layout === "Grid" ? "sortable grid" : "sortable")], [
493
+ // NOTE: Safari takes list semantics from a list printed without markers, so the list
494
+ // says it is one
495
+ h.ul([
496
+ h.DataAttribute("droppable-id", id(model)),
497
+ h.Role("list"),
498
+ h.AriaLabel(label),
499
+ h.Class("sortable-items"),
500
+ ], itemsView(info, h)),
501
+ h.p([h.Id(helpId(model)), h.Class("sr-only")], [COPY.gripHelp]),
502
+ ...liftedCopyView(info, h),
503
+ ])), "@gjermundgaraba-designs/pixel-paper/src/sortable/sortable.js#anonymous~58");
504
+ });
@@ -1,4 +1,4 @@
1
- export { AnnounceSlip, BindStack, FocusSlip, Message, Model, OutMessage, dismiss, id, init, show, update, view, } from "./toast.ts";
1
+ export { AnnounceSlip, BindStack, FocusSlip, Message, Model, OutMessage, dismiss, id, init, sceneMounts, show, update, view, } from "./toast.ts";
2
2
  export type { InitConfig, ShowConfig, ShowReturn } from "./toast.ts";
3
3
  export type { Action, Tone } from "./stack.ts";
4
4
  export { Focus } from "../focus/focus.ts";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/toast/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,SAAS,EACT,SAAS,EACT,OAAO,EACP,KAAK,EACL,UAAU,EACV,OAAO,EACP,EAAE,EACF,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,IAAI,GACL,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACrE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/toast/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,SAAS,EACT,SAAS,EACT,OAAO,EACP,KAAK,EACL,UAAU,EACV,OAAO,EACP,EAAE,EACF,IAAI,EACJ,WAAW,EACX,IAAI,EACJ,MAAM,EACN,IAAI,GACL,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACrE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC"}
@@ -1,2 +1,2 @@
1
- export { AnnounceSlip, BindStack, FocusSlip, Message, Model, OutMessage, dismiss, id, init, show, update, view, } from "./toast.js";
1
+ export { AnnounceSlip, BindStack, FocusSlip, Message, Model, OutMessage, dismiss, id, init, sceneMounts, show, update, view, } from "./toast.js";
2
2
  export { Focus } from "../focus/focus.js";