@lit-material/sortable 0.0.0-stage → 0.1.1

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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 bohdaq
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,60 @@
1
- # Temporary Holding Version
1
+ # @lit-material/sortable
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Lets people reorder a list by dragging a handle (mouse, pen or touch) or from the keyboard, within a list or between lists, with each step announced to screen readers. Built with [Lit](https://lit.dev/). Part of [lit-material](https://github.com/bohdaq/lit-material).
4
+
5
+ ## Install
6
+
7
+ ```sh
8
+ npm install @lit-material/sortable @lit-material/tokens
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```js
14
+ import "@lit-material/sortable";
15
+
16
+ html`<lit-material-sortable label="Requests" @sort=${(e) => {
17
+ const { from, to } = e.detail;
18
+ const [moved] = requests.splice(from, 1);
19
+ requests.splice(to, 0, moved);
20
+ this.requestUpdate();
21
+ }}>
22
+ ${repeat(requests, (r) => r.id, (r) => html`
23
+ <div data-sort-id=${r.id}>
24
+ <button data-sort-handle aria-label=${`Reorder ${r.name}`}>⋮⋮</button>${r.name}
25
+ </div>`)}
26
+ </lit-material-sortable>`;
27
+ ```
28
+
29
+ It never moves elements itself: it shows a drop line and fires `sort`; your code reorders its data
30
+ and re-renders. That keeps it safe with Lit, React or any renderer that owns its DOM. Key repeated
31
+ items (`repeat`, React `key`) so the moved element keeps keyboard focus.
32
+
33
+ ## API
34
+
35
+ | Property | Attribute | Type | Default |
36
+ | ---------- | ---------- | --------- | ------- |
37
+ | `group` | `group` | `string` | `""` (this list only) |
38
+ | `label` | `label` | `string` | `""` (names the list in announcements) |
39
+ | `disabled` | `disabled` (reflected) | `boolean` | `false` |
40
+
41
+ Event `sort`: `detail: { item, id, from, to, fromList, toList }` — `to` is the item's index in
42
+ `toList` after the move. Between lists it fires on the list the item left; check
43
+ `toList !== fromList`. Item attributes: `data-sort-id`, `data-sort-label` (announcement name,
44
+ default the text), `data-sort-handle` on the handle (default: the item). While dragged an item has
45
+ `data-sort-dragging`, while picked up from the keyboard `data-sort-grabbed`.
46
+ `--lit-material-sortable-indicator-color` colours the drop line.
47
+
48
+ ## Behavior
49
+
50
+ - Pointer: press a handle and move 4px to start; the drop line follows; release drops, Escape
51
+ cancels. Handles get `touch-action: none` so touch drags don't scroll.
52
+ - Keyboard: focus a handle, Space or Enter picks the item up, ↑/↓ (or Home/End) move it — each move
53
+ fires `sort` — Space drops, Escape puts it back where it started. Moving focus away drops it.
54
+ - Handles get `aria-description="Press Space to reorder"` unless they have one; pick-up, moves and
55
+ drops are announced from a live region.
56
+ - Lists that share a `group` accept each other's items by pointer.
57
+
58
+ ## License
59
+
60
+ MIT
@@ -0,0 +1,471 @@
1
+ {
2
+ "schemaVersion": "1.0.0",
3
+ "readme": "",
4
+ "modules": [
5
+ {
6
+ "kind": "javascript-module",
7
+ "path": "src/index.ts",
8
+ "declarations": [],
9
+ "exports": [
10
+ {
11
+ "kind": "js",
12
+ "name": "LitMaterialSortable",
13
+ "declaration": {
14
+ "name": "LitMaterialSortable",
15
+ "module": "./sortable.js"
16
+ }
17
+ },
18
+ {
19
+ "kind": "js",
20
+ "name": "SortDetail",
21
+ "declaration": {
22
+ "name": "SortDetail",
23
+ "module": "./sortable.js"
24
+ }
25
+ }
26
+ ]
27
+ },
28
+ {
29
+ "kind": "javascript-module",
30
+ "path": "src/sortable.ts",
31
+ "declarations": [
32
+ {
33
+ "kind": "class",
34
+ "description": "Lets people reorder a list: by dragging a handle with a mouse, pen or\nfinger, or from the keyboard — focus a handle, Space (or Enter) picks the\nitem up, ↑/↓ move it, Space drops it and Escape puts it back. Each step is\nannounced to screen readers.\n\nEvery element child is an item. An item's handle is its\n`[data-sort-handle]` descendant (a button, ideally), or the item itself.\nGive items a `data-sort-id` and, when their text isn't a good name, a\n`data-sort-label` for the announcements.\n\nIt never moves elements itself: it shows where the item would land and\nfires `sort` with `{ from, to }`, and your code reorders its data and\nre-renders — so it works with Lit, React or plain DOM, which each own\ntheir own nodes. Lists that share a `group` accept each other's items by\npointer; `sort` then fires on the list the item left, with `toList` set.",
35
+ "name": "LitMaterialSortable",
36
+ "cssProperties": [
37
+ {
38
+ "description": "The drop line (default `--md-sys-color-primary`).",
39
+ "name": "--lit-material-sortable-indicator-color"
40
+ }
41
+ ],
42
+ "slots": [
43
+ {
44
+ "description": "The items.",
45
+ "name": ""
46
+ }
47
+ ],
48
+ "members": [
49
+ {
50
+ "kind": "field",
51
+ "name": "group",
52
+ "type": {
53
+ "text": "string"
54
+ },
55
+ "default": "\"\"",
56
+ "description": "Lists with the same group accept each other's items. Empty: this list only.",
57
+ "attribute": "group",
58
+ "reflects": true
59
+ },
60
+ {
61
+ "kind": "field",
62
+ "name": "label",
63
+ "type": {
64
+ "text": "string"
65
+ },
66
+ "default": "\"\"",
67
+ "description": "Names the list in announcements, e.g. \"Requests\".",
68
+ "attribute": "label"
69
+ },
70
+ {
71
+ "kind": "field",
72
+ "name": "disabled",
73
+ "type": {
74
+ "text": "boolean"
75
+ },
76
+ "default": "false",
77
+ "attribute": "disabled",
78
+ "reflects": true
79
+ },
80
+ {
81
+ "kind": "field",
82
+ "name": "dropIndex",
83
+ "type": {
84
+ "text": "number | null"
85
+ },
86
+ "privacy": "private",
87
+ "default": "null",
88
+ "description": "Where a dragged item would land (index among the other items), or `null`."
89
+ },
90
+ {
91
+ "kind": "field",
92
+ "name": "announcement",
93
+ "type": {
94
+ "text": "string"
95
+ },
96
+ "privacy": "private",
97
+ "default": "\"\""
98
+ },
99
+ {
100
+ "kind": "field",
101
+ "name": "drag",
102
+ "type": {
103
+ "text": "{\n item: HTMLElement;\n from: number;\n pointerId: number;\n startX: number;\n startY: number;\n active: boolean;\n target: LitMaterialSortable | null;\n } | undefined"
104
+ },
105
+ "privacy": "private"
106
+ },
107
+ {
108
+ "kind": "field",
109
+ "name": "grabbed",
110
+ "type": {
111
+ "text": "{ item: HTMLElement; origin: number; index: number; refocusing?: number } | undefined"
112
+ },
113
+ "privacy": "private",
114
+ "description": "Keyboard pick-up: the item, where it started, where it is now."
115
+ },
116
+ {
117
+ "kind": "field",
118
+ "name": "items",
119
+ "type": {
120
+ "text": "HTMLElement[]"
121
+ },
122
+ "description": "The items, in order.",
123
+ "readonly": true
124
+ },
125
+ {
126
+ "kind": "field",
127
+ "name": "onSlotChange",
128
+ "privacy": "private",
129
+ "readonly": true
130
+ },
131
+ {
132
+ "kind": "method",
133
+ "name": "handleOf",
134
+ "privacy": "private",
135
+ "return": {
136
+ "type": {
137
+ "text": "HTMLElement"
138
+ }
139
+ },
140
+ "parameters": [
141
+ {
142
+ "name": "item",
143
+ "type": {
144
+ "text": "HTMLElement"
145
+ }
146
+ }
147
+ ]
148
+ },
149
+ {
150
+ "kind": "method",
151
+ "name": "itemFromHandle",
152
+ "privacy": "private",
153
+ "return": {
154
+ "type": {
155
+ "text": "HTMLElement | undefined"
156
+ }
157
+ },
158
+ "parameters": [
159
+ {
160
+ "name": "path",
161
+ "type": {
162
+ "text": "EventTarget[]"
163
+ }
164
+ }
165
+ ],
166
+ "description": "The item that `node` is the handle of (or inside), if any."
167
+ },
168
+ {
169
+ "kind": "method",
170
+ "name": "nameOf",
171
+ "privacy": "private",
172
+ "return": {
173
+ "type": {
174
+ "text": "string"
175
+ }
176
+ },
177
+ "parameters": [
178
+ {
179
+ "name": "item",
180
+ "type": {
181
+ "text": "HTMLElement"
182
+ }
183
+ }
184
+ ]
185
+ },
186
+ {
187
+ "kind": "method",
188
+ "name": "announce",
189
+ "privacy": "private",
190
+ "return": {
191
+ "type": {
192
+ "text": "void"
193
+ }
194
+ },
195
+ "parameters": [
196
+ {
197
+ "name": "message",
198
+ "type": {
199
+ "text": "string"
200
+ }
201
+ }
202
+ ]
203
+ },
204
+ {
205
+ "kind": "method",
206
+ "name": "emit",
207
+ "privacy": "private",
208
+ "return": {
209
+ "type": {
210
+ "text": "void"
211
+ }
212
+ },
213
+ "parameters": [
214
+ {
215
+ "name": "item",
216
+ "type": {
217
+ "text": "HTMLElement"
218
+ }
219
+ },
220
+ {
221
+ "name": "from",
222
+ "type": {
223
+ "text": "number"
224
+ }
225
+ },
226
+ {
227
+ "name": "to",
228
+ "type": {
229
+ "text": "number"
230
+ }
231
+ },
232
+ {
233
+ "name": "toList",
234
+ "type": {
235
+ "text": "LitMaterialSortable"
236
+ }
237
+ }
238
+ ]
239
+ },
240
+ {
241
+ "kind": "field",
242
+ "name": "onPointerDown",
243
+ "privacy": "private",
244
+ "readonly": true
245
+ },
246
+ {
247
+ "kind": "field",
248
+ "name": "onPointerMove",
249
+ "privacy": "private",
250
+ "readonly": true
251
+ },
252
+ {
253
+ "kind": "field",
254
+ "name": "onPointerUp",
255
+ "privacy": "private",
256
+ "readonly": true
257
+ },
258
+ {
259
+ "kind": "field",
260
+ "name": "onPointerCancel",
261
+ "privacy": "private",
262
+ "readonly": true
263
+ },
264
+ {
265
+ "kind": "field",
266
+ "name": "onDragKeyDown",
267
+ "privacy": "private",
268
+ "readonly": true
269
+ },
270
+ {
271
+ "kind": "method",
272
+ "name": "endPointerDrag",
273
+ "privacy": "private",
274
+ "return": {
275
+ "type": {
276
+ "text": "void"
277
+ }
278
+ }
279
+ },
280
+ {
281
+ "kind": "method",
282
+ "name": "listAt",
283
+ "privacy": "private",
284
+ "return": {
285
+ "type": {
286
+ "text": "LitMaterialSortable | null"
287
+ }
288
+ },
289
+ "parameters": [
290
+ {
291
+ "name": "x",
292
+ "type": {
293
+ "text": "number"
294
+ }
295
+ },
296
+ {
297
+ "name": "y",
298
+ "type": {
299
+ "text": "number"
300
+ }
301
+ }
302
+ ],
303
+ "description": "The sortable under a point that accepts this list's items."
304
+ },
305
+ {
306
+ "kind": "method",
307
+ "name": "indexAt",
308
+ "return": {
309
+ "type": {
310
+ "text": "number"
311
+ }
312
+ },
313
+ "parameters": [
314
+ {
315
+ "name": "y",
316
+ "type": {
317
+ "text": "number"
318
+ }
319
+ },
320
+ {
321
+ "name": "dragged",
322
+ "type": {
323
+ "text": "HTMLElement"
324
+ }
325
+ }
326
+ ],
327
+ "description": "Index among the items other than `dragged` before which `y` falls."
328
+ },
329
+ {
330
+ "kind": "method",
331
+ "name": "indicatorTop",
332
+ "privacy": "private",
333
+ "return": {
334
+ "type": {
335
+ "text": "number | null"
336
+ }
337
+ }
338
+ },
339
+ {
340
+ "kind": "field",
341
+ "name": "onKeyDown",
342
+ "privacy": "private",
343
+ "readonly": true
344
+ },
345
+ {
346
+ "kind": "method",
347
+ "name": "moveGrabbed",
348
+ "privacy": "private",
349
+ "return": {
350
+ "type": {
351
+ "text": "void"
352
+ }
353
+ },
354
+ "parameters": [
355
+ {
356
+ "name": "to",
357
+ "type": {
358
+ "text": "number"
359
+ }
360
+ }
361
+ ]
362
+ },
363
+ {
364
+ "kind": "method",
365
+ "name": "refocus",
366
+ "privacy": "private",
367
+ "return": {
368
+ "type": {
369
+ "text": "void"
370
+ }
371
+ },
372
+ "parameters": [
373
+ {
374
+ "name": "item",
375
+ "type": {
376
+ "text": "HTMLElement"
377
+ }
378
+ }
379
+ ]
380
+ },
381
+ {
382
+ "kind": "method",
383
+ "name": "drop",
384
+ "privacy": "private",
385
+ "return": {
386
+ "type": {
387
+ "text": "void"
388
+ }
389
+ },
390
+ "parameters": [
391
+ {
392
+ "name": "message",
393
+ "type": {
394
+ "text": "string"
395
+ }
396
+ }
397
+ ]
398
+ },
399
+ {
400
+ "kind": "field",
401
+ "name": "onFocusOut",
402
+ "privacy": "private",
403
+ "readonly": true
404
+ }
405
+ ],
406
+ "events": [
407
+ {
408
+ "name": "sort",
409
+ "type": {
410
+ "text": "CustomEvent"
411
+ },
412
+ "description": "When an item is dropped somewhere new; `detail` is `SortDetail`."
413
+ }
414
+ ],
415
+ "attributes": [
416
+ {
417
+ "name": "group",
418
+ "type": {
419
+ "text": "string"
420
+ },
421
+ "default": "\"\"",
422
+ "description": "Lists with the same group accept each other's items. Empty: this list only.",
423
+ "fieldName": "group"
424
+ },
425
+ {
426
+ "name": "label",
427
+ "type": {
428
+ "text": "string"
429
+ },
430
+ "default": "\"\"",
431
+ "description": "Names the list in announcements, e.g. \"Requests\".",
432
+ "fieldName": "label"
433
+ },
434
+ {
435
+ "name": "disabled",
436
+ "type": {
437
+ "text": "boolean"
438
+ },
439
+ "default": "false",
440
+ "fieldName": "disabled"
441
+ }
442
+ ],
443
+ "superclass": {
444
+ "name": "LitElement",
445
+ "package": "lit"
446
+ },
447
+ "tagName": "lit-material-sortable",
448
+ "customElement": true
449
+ }
450
+ ],
451
+ "exports": [
452
+ {
453
+ "kind": "js",
454
+ "name": "LitMaterialSortable",
455
+ "declaration": {
456
+ "name": "LitMaterialSortable",
457
+ "module": "src/sortable.ts"
458
+ }
459
+ },
460
+ {
461
+ "kind": "custom-element-definition",
462
+ "name": "lit-material-sortable",
463
+ "declaration": {
464
+ "name": "LitMaterialSortable",
465
+ "module": "src/sortable.ts"
466
+ }
467
+ }
468
+ ]
469
+ }
470
+ ]
471
+ }
@@ -0,0 +1,2 @@
1
+ export { LitMaterialSortable, type SortDetail } from "./sortable.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { LitMaterialSortable } from "./sortable.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAmB,MAAM,eAAe,CAAC"}
@@ -0,0 +1,86 @@
1
+ import { LitElement } from "lit";
2
+ export interface SortDetail {
3
+ /** The moved element. */
4
+ item: HTMLElement;
5
+ /** Its `data-sort-id`, or `""`. */
6
+ id: string;
7
+ /** Index in `fromList` before the move. */
8
+ from: number;
9
+ /** Index in `toList` after the move. */
10
+ to: number;
11
+ fromList: LitMaterialSortable;
12
+ toList: LitMaterialSortable;
13
+ }
14
+ /**
15
+ * Lets people reorder a list: by dragging a handle with a mouse, pen or
16
+ * finger, or from the keyboard — focus a handle, Space (or Enter) picks the
17
+ * item up, ↑/↓ move it, Space drops it and Escape puts it back. Each step is
18
+ * announced to screen readers.
19
+ *
20
+ * Every element child is an item. An item's handle is its
21
+ * `[data-sort-handle]` descendant (a button, ideally), or the item itself.
22
+ * Give items a `data-sort-id` and, when their text isn't a good name, a
23
+ * `data-sort-label` for the announcements.
24
+ *
25
+ * It never moves elements itself: it shows where the item would land and
26
+ * fires `sort` with `{ from, to }`, and your code reorders its data and
27
+ * re-renders — so it works with Lit, React or plain DOM, which each own
28
+ * their own nodes. Lists that share a `group` accept each other's items by
29
+ * pointer; `sort` then fires on the list the item left, with `toList` set.
30
+ *
31
+ * @element lit-material-sortable
32
+ *
33
+ * @slot - The items.
34
+ *
35
+ * @fires sort - When an item is dropped somewhere new; `detail` is `SortDetail`.
36
+ *
37
+ * @cssprop --lit-material-sortable-indicator-color - The drop line (default `--md-sys-color-primary`).
38
+ */
39
+ export declare class LitMaterialSortable extends LitElement {
40
+ static styles: import("lit").CSSResult;
41
+ /** Lists with the same group accept each other's items. Empty: this list only. */
42
+ group: string;
43
+ /** Names the list in announcements, e.g. "Requests". */
44
+ label: string;
45
+ disabled: boolean;
46
+ /** Where a dragged item would land (index among the other items), or `null`. */
47
+ private dropIndex;
48
+ private announcement;
49
+ private drag?;
50
+ /** Keyboard pick-up: the item, where it started, where it is now. */
51
+ private grabbed?;
52
+ /** The items, in order. */
53
+ get items(): HTMLElement[];
54
+ connectedCallback(): void;
55
+ disconnectedCallback(): void;
56
+ private readonly onSlotChange;
57
+ private handleOf;
58
+ /** The item that `node` is the handle of (or inside), if any. */
59
+ private itemFromHandle;
60
+ private nameOf;
61
+ private announce;
62
+ private emit;
63
+ private readonly onPointerDown;
64
+ private readonly onPointerMove;
65
+ private readonly onPointerUp;
66
+ private readonly onPointerCancel;
67
+ private readonly onDragKeyDown;
68
+ private endPointerDrag;
69
+ /** The sortable under a point that accepts this list's items. */
70
+ private listAt;
71
+ /** Index among the items other than `dragged` before which `y` falls. */
72
+ indexAt(y: number, dragged: HTMLElement): number;
73
+ private indicatorTop;
74
+ private readonly onKeyDown;
75
+ private moveGrabbed;
76
+ private refocus;
77
+ private drop;
78
+ private readonly onFocusOut;
79
+ render(): import("lit").TemplateResult<1>;
80
+ }
81
+ declare global {
82
+ interface HTMLElementTagNameMap {
83
+ "lit-material-sortable": LitMaterialSortable;
84
+ }
85
+ }
86
+ //# sourceMappingURL=sortable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sortable.d.ts","sourceRoot":"","sources":["../src/sortable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAE,MAAM,KAAK,CAAC;AAG5C,MAAM,WAAW,UAAU;IACzB,yBAAyB;IACzB,IAAI,EAAE,WAAW,CAAC;IAClB,mCAAmC;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,MAAM,EAAE,mBAAmB,CAAC;CAC7B;AAKD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBACa,mBAAoB,SAAQ,UAAU;IACjD,OAAgB,MAAM,0BAgCpB;IAEF,kFAAkF;IACrD,KAAK,SAAM;IAExC,wDAAwD;IAC5C,KAAK,SAAM;IAEqB,QAAQ,UAAS;IAE7D,gFAAgF;IACvE,OAAO,CAAC,SAAS,CAAuB;IAExC,OAAO,CAAC,YAAY,CAAM;IAEnC,OAAO,CAAC,IAAI,CAAC,CAQX;IAEF,qEAAqE;IACrE,OAAO,CAAC,OAAO,CAAC,CAA4E;IAE5F,2BAA2B;IAC3B,IAAI,KAAK,IAAI,WAAW,EAAE,CAEzB;IAEQ,iBAAiB,IAAI,IAAI;IAOzB,oBAAoB,IAAI,IAAI;IAQrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAS3B;IAEF,OAAO,CAAC,QAAQ;IAIhB,iEAAiE;IACjE,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,IAAI;IAYZ,OAAO,CAAC,QAAQ,CAAC,aAAa,CAiB5B;IAEF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAc5B;IAEF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAU1B;IAEF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;IAErE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAM5B;IAEF,OAAO,CAAC,cAAc;IAatB,iEAAiE;IACjE,OAAO,CAAC,MAAM;IAYd,yEAAyE;IACzE,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM;IAShD,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAkCxB;IAEF,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,OAAO;IAcf,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,QAAQ,CAAC,UAAU,CAczB;IAEO,MAAM;CAMhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,uBAAuB,EAAE,mBAAmB,CAAC;KAC9C;CACF"}
@@ -0,0 +1,374 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var LitMaterialSortable_1;
8
+ import { css, html, LitElement } from "lit";
9
+ import { customElement, property, state } from "lit/decorators.js";
10
+ /** Pixels the pointer must travel before a press becomes a drag. */
11
+ const DRAG_THRESHOLD = 4;
12
+ /**
13
+ * Lets people reorder a list: by dragging a handle with a mouse, pen or
14
+ * finger, or from the keyboard — focus a handle, Space (or Enter) picks the
15
+ * item up, ↑/↓ move it, Space drops it and Escape puts it back. Each step is
16
+ * announced to screen readers.
17
+ *
18
+ * Every element child is an item. An item's handle is its
19
+ * `[data-sort-handle]` descendant (a button, ideally), or the item itself.
20
+ * Give items a `data-sort-id` and, when their text isn't a good name, a
21
+ * `data-sort-label` for the announcements.
22
+ *
23
+ * It never moves elements itself: it shows where the item would land and
24
+ * fires `sort` with `{ from, to }`, and your code reorders its data and
25
+ * re-renders — so it works with Lit, React or plain DOM, which each own
26
+ * their own nodes. Lists that share a `group` accept each other's items by
27
+ * pointer; `sort` then fires on the list the item left, with `toList` set.
28
+ *
29
+ * @element lit-material-sortable
30
+ *
31
+ * @slot - The items.
32
+ *
33
+ * @fires sort - When an item is dropped somewhere new; `detail` is `SortDetail`.
34
+ *
35
+ * @cssprop --lit-material-sortable-indicator-color - The drop line (default `--md-sys-color-primary`).
36
+ */
37
+ let LitMaterialSortable = class LitMaterialSortable extends LitElement {
38
+ constructor() {
39
+ super(...arguments);
40
+ /** Lists with the same group accept each other's items. Empty: this list only. */
41
+ this.group = "";
42
+ /** Names the list in announcements, e.g. "Requests". */
43
+ this.label = "";
44
+ this.disabled = false;
45
+ /** Where a dragged item would land (index among the other items), or `null`. */
46
+ this.dropIndex = null;
47
+ this.announcement = "";
48
+ this.onSlotChange = () => {
49
+ for (const item of this.items) {
50
+ const handle = this.handleOf(item);
51
+ handle.style.touchAction = "none";
52
+ if (!handle.hasAttribute("aria-description")) {
53
+ handle.setAttribute("aria-description", "Press Space to reorder");
54
+ }
55
+ if (handle.tabIndex < 0 && !handle.hasAttribute("tabindex"))
56
+ handle.tabIndex = 0;
57
+ }
58
+ };
59
+ // ---- Pointer ----
60
+ this.onPointerDown = (event) => {
61
+ if (this.disabled || event.button !== 0 || this.grabbed)
62
+ return;
63
+ const item = this.itemFromHandle(event.composedPath());
64
+ if (!item)
65
+ return;
66
+ this.drag = {
67
+ item,
68
+ from: this.items.indexOf(item),
69
+ pointerId: event.pointerId,
70
+ startX: event.clientX,
71
+ startY: event.clientY,
72
+ active: false,
73
+ target: null,
74
+ };
75
+ document.addEventListener("pointermove", this.onPointerMove);
76
+ document.addEventListener("pointerup", this.onPointerUp);
77
+ document.addEventListener("pointercancel", this.onPointerCancel);
78
+ document.addEventListener("keydown", this.onDragKeyDown, true);
79
+ };
80
+ this.onPointerMove = (event) => {
81
+ const drag = this.drag;
82
+ if (!drag || event.pointerId !== drag.pointerId)
83
+ return;
84
+ if (!drag.active) {
85
+ if (Math.hypot(event.clientX - drag.startX, event.clientY - drag.startY) < DRAG_THRESHOLD)
86
+ return;
87
+ drag.active = true;
88
+ drag.item.setAttribute("data-sort-dragging", "");
89
+ document.documentElement.style.setProperty("user-select", "none");
90
+ }
91
+ event.preventDefault();
92
+ const target = this.listAt(event.clientX, event.clientY);
93
+ if (drag.target && drag.target !== target)
94
+ drag.target.dropIndex = null;
95
+ drag.target = target;
96
+ if (target)
97
+ target.dropIndex = target.indexAt(event.clientY, drag.item);
98
+ };
99
+ this.onPointerUp = (event) => {
100
+ const drag = this.drag;
101
+ if (!drag || event.pointerId !== drag.pointerId)
102
+ return;
103
+ const target = drag.target;
104
+ const to = target?.dropIndex ?? null;
105
+ this.endPointerDrag();
106
+ if (!drag.active || !target || to === null)
107
+ return;
108
+ if (target === this && to === drag.from)
109
+ return;
110
+ this.emit(drag.item, drag.from, to, target);
111
+ this.announce(`${this.nameOf(drag.item)} moved to position ${to + 1}${target === this ? "" : ` in ${target.label || "the other list"}`}`);
112
+ };
113
+ this.onPointerCancel = () => this.endPointerDrag();
114
+ this.onDragKeyDown = (event) => {
115
+ if (event.key === "Escape" && this.drag?.active) {
116
+ event.preventDefault();
117
+ event.stopPropagation();
118
+ this.endPointerDrag();
119
+ }
120
+ };
121
+ // ---- Keyboard ----
122
+ this.onKeyDown = (event) => {
123
+ if (this.disabled || event.defaultPrevented)
124
+ return;
125
+ const item = this.itemFromHandle(event.composedPath());
126
+ if (!item || event.composedPath()[0] !== this.handleOf(item))
127
+ return;
128
+ const grabbed = this.grabbed;
129
+ const count = this.items.length;
130
+ if (event.key === " " || event.key === "Enter") {
131
+ event.preventDefault();
132
+ if (!grabbed) {
133
+ const index = this.items.indexOf(item);
134
+ this.grabbed = { item, origin: index, index };
135
+ item.setAttribute("data-sort-grabbed", "");
136
+ this.announce(`${this.nameOf(item)} picked up, position ${index + 1} of ${count}. ↑ and ↓ to move, Space to drop, Escape to cancel.`);
137
+ }
138
+ else {
139
+ this.drop(`${this.nameOf(item)} dropped at position ${grabbed.index + 1} of ${count}.`);
140
+ }
141
+ return;
142
+ }
143
+ if (!grabbed)
144
+ return;
145
+ if (event.key === "Escape") {
146
+ event.preventDefault();
147
+ event.stopPropagation();
148
+ if (grabbed.index !== grabbed.origin)
149
+ this.moveGrabbed(grabbed.origin);
150
+ this.drop(`${this.nameOf(item)} back at position ${grabbed.origin + 1} of ${count}.`);
151
+ return;
152
+ }
153
+ const step = { ArrowUp: -1, ArrowDown: 1, ArrowLeft: -1, ArrowRight: 1 }[event.key];
154
+ const jump = event.key === "Home" ? 0 : event.key === "End" ? count - 1 : undefined;
155
+ if (step === undefined && jump === undefined)
156
+ return;
157
+ event.preventDefault();
158
+ const to = jump ?? Math.min(count - 1, Math.max(0, grabbed.index + step));
159
+ if (to === grabbed.index)
160
+ return;
161
+ this.moveGrabbed(to);
162
+ this.announce(`${this.nameOf(item)} moved to position ${to + 1} of ${count}.`);
163
+ };
164
+ this.onFocusOut = (event) => {
165
+ const grabbed = this.grabbed;
166
+ // A re-render moving the item blurs it for a moment (refocused after the move).
167
+ if (!grabbed || grabbed.refocusing)
168
+ return;
169
+ // Only a real move elsewhere drops it.
170
+ requestAnimationFrame(() => requestAnimationFrame(() => {
171
+ if (this.grabbed !== grabbed)
172
+ return;
173
+ const active = document.activeElement;
174
+ if (active && this.contains(active))
175
+ return;
176
+ if (event.relatedTarget && this.contains(event.relatedTarget))
177
+ return;
178
+ this.drop(`${this.nameOf(grabbed.item)} dropped at position ${grabbed.index + 1}.`);
179
+ }));
180
+ };
181
+ }
182
+ static { LitMaterialSortable_1 = this; }
183
+ static { this.styles = css `
184
+ :host {
185
+ display: block;
186
+ position: relative;
187
+ }
188
+ :host([hidden]) {
189
+ display: none;
190
+ }
191
+ ::slotted([data-sort-dragging]) {
192
+ opacity: 0.4;
193
+ }
194
+ ::slotted([data-sort-grabbed]) {
195
+ outline: 2px solid var(--lit-material-sortable-indicator-color, var(--md-sys-color-primary, light-dark(#6750a4, #d0bcff)));
196
+ outline-offset: -2px;
197
+ }
198
+ .indicator {
199
+ position: absolute;
200
+ inset-inline: 0;
201
+ height: 2px;
202
+ margin-top: -1px;
203
+ border-radius: 1px;
204
+ background: var(--lit-material-sortable-indicator-color, var(--md-sys-color-primary, light-dark(#6750a4, #d0bcff)));
205
+ pointer-events: none;
206
+ }
207
+ .sr {
208
+ position: absolute;
209
+ width: 1px;
210
+ height: 1px;
211
+ overflow: hidden;
212
+ clip-path: inset(50%);
213
+ white-space: nowrap;
214
+ }
215
+ `; }
216
+ /** The items, in order. */
217
+ get items() {
218
+ return Array.from(this.children).filter((el) => el instanceof HTMLElement);
219
+ }
220
+ connectedCallback() {
221
+ super.connectedCallback();
222
+ this.addEventListener("pointerdown", this.onPointerDown);
223
+ this.addEventListener("keydown", this.onKeyDown);
224
+ this.addEventListener("focusout", this.onFocusOut);
225
+ }
226
+ disconnectedCallback() {
227
+ super.disconnectedCallback();
228
+ this.removeEventListener("pointerdown", this.onPointerDown);
229
+ this.removeEventListener("keydown", this.onKeyDown);
230
+ this.removeEventListener("focusout", this.onFocusOut);
231
+ this.endPointerDrag();
232
+ }
233
+ handleOf(item) {
234
+ return item.querySelector("[data-sort-handle]") ?? item;
235
+ }
236
+ /** The item that `node` is the handle of (or inside), if any. */
237
+ itemFromHandle(path) {
238
+ for (const item of this.items) {
239
+ const handle = this.handleOf(item);
240
+ if (path.includes(handle))
241
+ return item;
242
+ }
243
+ return undefined;
244
+ }
245
+ nameOf(item) {
246
+ return item.dataset.sortLabel || item.textContent?.trim().replace(/\s+/g, " ") || "Item";
247
+ }
248
+ announce(message) {
249
+ // Re-announce identical text by clearing first.
250
+ this.announcement = "";
251
+ requestAnimationFrame(() => (this.announcement = message));
252
+ }
253
+ emit(item, from, to, toList) {
254
+ this.dispatchEvent(new CustomEvent("sort", {
255
+ bubbles: true,
256
+ composed: true,
257
+ detail: { item, id: item.dataset.sortId ?? "", from, to, fromList: this, toList },
258
+ }));
259
+ }
260
+ endPointerDrag() {
261
+ const drag = this.drag;
262
+ if (!drag)
263
+ return;
264
+ drag.item.removeAttribute("data-sort-dragging");
265
+ if (drag.target)
266
+ drag.target.dropIndex = null;
267
+ this.drag = undefined;
268
+ document.documentElement.style.removeProperty("user-select");
269
+ document.removeEventListener("pointermove", this.onPointerMove);
270
+ document.removeEventListener("pointerup", this.onPointerUp);
271
+ document.removeEventListener("pointercancel", this.onPointerCancel);
272
+ document.removeEventListener("keydown", this.onDragKeyDown, true);
273
+ }
274
+ /** The sortable under a point that accepts this list's items. */
275
+ listAt(x, y) {
276
+ // A list inside a shadow root isn't in the document's hit list, only its host is.
277
+ const root = this.getRootNode();
278
+ const hits = root === document ? document.elementsFromPoint(x, y) : [...root.elementsFromPoint(x, y), ...document.elementsFromPoint(x, y)];
279
+ for (const el of hits) {
280
+ const list = el instanceof LitMaterialSortable_1 ? el : el.closest("lit-material-sortable");
281
+ if (!list || list.disabled)
282
+ continue;
283
+ if (list === this || (this.group && list.group === this.group))
284
+ return list;
285
+ }
286
+ return null;
287
+ }
288
+ /** Index among the items other than `dragged` before which `y` falls. */
289
+ indexAt(y, dragged) {
290
+ const others = this.items.filter((item) => item !== dragged);
291
+ const index = others.findIndex((item) => {
292
+ const box = item.getBoundingClientRect();
293
+ return y < box.top + box.height / 2;
294
+ });
295
+ return index === -1 ? others.length : index;
296
+ }
297
+ indicatorTop() {
298
+ if (this.dropIndex === null)
299
+ return null;
300
+ const dragged = this.drag?.item ?? document.querySelector("[data-sort-dragging]");
301
+ const others = this.items.filter((item) => item !== dragged);
302
+ const host = this.getBoundingClientRect();
303
+ if (others.length === 0)
304
+ return 0;
305
+ const next = others[this.dropIndex];
306
+ if (next)
307
+ return next.getBoundingClientRect().top - host.top;
308
+ return others[others.length - 1].getBoundingClientRect().bottom - host.top;
309
+ }
310
+ moveGrabbed(to) {
311
+ const grabbed = this.grabbed;
312
+ const { item } = grabbed;
313
+ const from = grabbed.index;
314
+ grabbed.index = to;
315
+ grabbed.refocusing = (grabbed.refocusing ?? 0) + 1;
316
+ this.emit(item, from, to, this);
317
+ // The app re-renders the list; moving a focused node drops focus, so put it
318
+ // back: right after the re-render (Lit and synchronous renderers finish in
319
+ // a microtask), so a key pressed at once still lands, and again two frames
320
+ // later for renderers that wait for a frame.
321
+ queueMicrotask(() => this.refocus(item));
322
+ requestAnimationFrame(() => requestAnimationFrame(() => {
323
+ if (this.grabbed)
324
+ this.grabbed.refocusing = (this.grabbed.refocusing ?? 1) - 1;
325
+ this.refocus(item);
326
+ }));
327
+ }
328
+ refocus(item) {
329
+ const grabbed = this.grabbed;
330
+ if (!grabbed)
331
+ return;
332
+ const current = (item.isConnected && this.contains(item) ? item : undefined) ??
333
+ this.items.find((el) => item.dataset.sortId && el.dataset.sortId === item.dataset.sortId);
334
+ if (!current)
335
+ return;
336
+ if (current !== grabbed.item) {
337
+ grabbed.item.removeAttribute("data-sort-grabbed");
338
+ grabbed.item = current;
339
+ current.setAttribute("data-sort-grabbed", "");
340
+ }
341
+ this.handleOf(current).focus();
342
+ }
343
+ drop(message) {
344
+ this.grabbed?.item.removeAttribute("data-sort-grabbed");
345
+ this.grabbed = undefined;
346
+ this.announce(message);
347
+ }
348
+ render() {
349
+ const top = this.indicatorTop();
350
+ return html `<slot @slotchange=${this.onSlotChange}></slot>${top === null
351
+ ? ""
352
+ : html `<div class="indicator" style="top: ${top}px"></div>`}<div class="sr" role="status" aria-live="assertive">${this.announcement}</div>`;
353
+ }
354
+ };
355
+ __decorate([
356
+ property({ reflect: true })
357
+ ], LitMaterialSortable.prototype, "group", void 0);
358
+ __decorate([
359
+ property()
360
+ ], LitMaterialSortable.prototype, "label", void 0);
361
+ __decorate([
362
+ property({ type: Boolean, reflect: true })
363
+ ], LitMaterialSortable.prototype, "disabled", void 0);
364
+ __decorate([
365
+ state()
366
+ ], LitMaterialSortable.prototype, "dropIndex", void 0);
367
+ __decorate([
368
+ state()
369
+ ], LitMaterialSortable.prototype, "announcement", void 0);
370
+ LitMaterialSortable = LitMaterialSortable_1 = __decorate([
371
+ customElement("lit-material-sortable")
372
+ ], LitMaterialSortable);
373
+ export { LitMaterialSortable };
374
+ //# sourceMappingURL=sortable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sortable.js","sourceRoot":"","sources":["../src/sortable.ts"],"names":[],"mappings":";;;;;;;AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAenE,oEAAoE;AACpE,MAAM,cAAc,GAAG,CAAC,CAAC;AAEzB;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEI,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,UAAU;IAA5C;;QAmCL,kFAAkF;QACrD,UAAK,GAAG,EAAE,CAAC;QAExC,wDAAwD;QAC5C,UAAK,GAAG,EAAE,CAAC;QAEqB,aAAQ,GAAG,KAAK,CAAC;QAE7D,gFAAgF;QAC/D,cAAS,GAAkB,IAAI,CAAC;QAEhC,iBAAY,GAAG,EAAE,CAAC;QAmClB,iBAAY,GAAG,GAAS,EAAE;YACzC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACnC,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC;gBAClC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBAC7C,MAAM,CAAC,YAAY,CAAC,kBAAkB,EAAE,wBAAwB,CAAC,CAAC;gBACpE,CAAC;gBACD,IAAI,MAAM,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC;oBAAE,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;YACnF,CAAC;QACH,CAAC,CAAC;QAmCF,oBAAoB;QAEH,kBAAa,GAAG,CAAC,KAAmB,EAAQ,EAAE;YAC7D,IAAI,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO;gBAAE,OAAO;YAChE,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;YACvD,IAAI,CAAC,IAAI;gBAAE,OAAO;YAClB,IAAI,CAAC,IAAI,GAAG;gBACV,IAAI;gBACJ,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;gBAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,MAAM,EAAE,KAAK,CAAC,OAAO;gBACrB,MAAM,EAAE,KAAK,CAAC,OAAO;gBACrB,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,IAAI;aACb,CAAC;YACF,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YAC7D,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACzD,QAAQ,CAAC,gBAAgB,CAAC,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;YACjE,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QACjE,CAAC,CAAC;QAEe,kBAAa,GAAG,CAAC,KAAmB,EAAQ,EAAE;YAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACvB,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS;gBAAE,OAAO;YACxD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,cAAc;oBAAE,OAAO;gBAClG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;gBACjD,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;YACpE,CAAC;YACD,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACzD,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM;gBAAE,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;YACxE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,IAAI,MAAM;gBAAE,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1E,CAAC,CAAC;QAEe,gBAAW,GAAG,CAAC,KAAmB,EAAQ,EAAE;YAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACvB,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS;gBAAE,OAAO;YACxD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,MAAM,EAAE,GAAG,MAAM,EAAE,SAAS,IAAI,IAAI,CAAC;YACrC,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,IAAI,EAAE,KAAK,IAAI;gBAAE,OAAO;YACnD,IAAI,MAAM,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC,IAAI;gBAAE,OAAO;YAChD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;YAC5C,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,CAAC,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,KAAK,IAAI,gBAAgB,EAAE,EAAE,CAAC,CAAC;QAC5I,CAAC,CAAC;QAEe,oBAAe,GAAG,GAAS,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QAEpD,kBAAa,GAAG,CAAC,KAAoB,EAAQ,EAAE;YAC9D,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;gBAChD,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,KAAK,CAAC,eAAe,EAAE,CAAC;gBACxB,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,CAAC;QACH,CAAC,CAAC;QAiDF,qBAAqB;QAEJ,cAAS,GAAG,CAAC,KAAoB,EAAQ,EAAE;YAC1D,IAAI,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,gBAAgB;gBAAE,OAAO;YACpD,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;YACvD,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,OAAO;YACrE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YAChC,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;gBAC/C,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBACvC,IAAI,CAAC,OAAO,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;oBAC9C,IAAI,CAAC,YAAY,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;oBAC3C,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,KAAK,GAAG,CAAC,OAAO,KAAK,qDAAqD,CAAC,CAAC;gBACxI,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,OAAO,CAAC,KAAK,GAAG,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC;gBAC1F,CAAC;gBACD,OAAO;YACT,CAAC;YACD,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC3B,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,KAAK,CAAC,eAAe,EAAE,CAAC;gBACxB,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,MAAM;oBAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACvE,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,OAAO,CAAC,MAAM,GAAG,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC;gBACtF,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACpF,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACpF,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO;YACrD,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,MAAM,EAAE,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,GAAG,IAAK,CAAC,CAAC,CAAC;YAC3E,IAAI,EAAE,KAAK,OAAO,CAAC,KAAK;gBAAE,OAAO;YACjC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACrB,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC;QACjF,CAAC,CAAC;QA0Ce,eAAU,GAAG,CAAC,KAAiB,EAAQ,EAAE;YACxD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YAC7B,gFAAgF;YAChF,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU;gBAAE,OAAO;YAC3C,uCAAuC;YACvC,qBAAqB,CAAC,GAAG,EAAE,CACzB,qBAAqB,CAAC,GAAG,EAAE;gBACzB,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO;oBAAE,OAAO;gBACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC;gBACtC,IAAI,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;oBAAE,OAAO;gBAC5C,IAAI,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAqB,CAAC;oBAAE,OAAO;gBAC9E,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,wBAAwB,OAAO,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;YACtF,CAAC,CAAC,CACH,CAAC;QACJ,CAAC,CAAC;IAQJ,CAAC;;aA1UiB,WAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgC3B,AAhCqB,CAgCpB;IA4BF,2BAA2B;IAC3B,IAAI,KAAK;QACP,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAqB,EAAE,CAAC,EAAE,YAAY,WAAW,CAAC,CAAC;IAChG,CAAC;IAEQ,iBAAiB;QACxB,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACzD,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACrD,CAAC;IAEQ,oBAAoB;QAC3B,KAAK,CAAC,oBAAoB,EAAE,CAAC;QAC7B,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5D,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACpD,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACtD,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAaO,QAAQ,CAAC,IAAiB;QAChC,OAAO,IAAI,CAAC,aAAa,CAAc,oBAAoB,CAAC,IAAI,IAAI,CAAC;IACvE,CAAC;IAED,iEAAiE;IACzD,cAAc,CAAC,IAAmB;QACxC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,OAAO,IAAI,CAAC;QACzC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,MAAM,CAAC,IAAiB;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC;IAC3F,CAAC;IAEO,QAAQ,CAAC,OAAe;QAC9B,gDAAgD;QAChD,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,qBAAqB,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC;IAEO,IAAI,CAAC,IAAiB,EAAE,IAAY,EAAE,EAAU,EAAE,MAA2B;QACnF,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAa,MAAM,EAAE;YAClC,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE;SAClF,CAAC,CACH,CAAC;IACJ,CAAC;IA6DO,cAAc;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QACtB,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;QAC7D,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAChE,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5D,QAAQ,CAAC,mBAAmB,CAAC,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACpE,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IACpE,CAAC;IAED,iEAAiE;IACzD,MAAM,CAAC,CAAS,EAAE,CAAS;QACjC,kFAAkF;QAClF,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAA2B,CAAC;QACzD,MAAM,IAAI,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3I,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,EAAE,YAAY,qBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;YAC1F,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ;gBAAE,SAAS;YACrC,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC9E,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,yEAAyE;IACzE,OAAO,CAAC,CAAS,EAAE,OAAoB;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;QAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;YACtC,MAAM,GAAG,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACzC,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IAC9C,CAAC;IAEO,YAAY;QAClB,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,QAAQ,CAAC,aAAa,CAAc,sBAAsB,CAAC,CAAC;QAC/F,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC1C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC,qBAAqB,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QAC7D,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,qBAAqB,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC;IAC9E,CAAC;IAwCO,WAAW,CAAC,EAAU;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAQ,CAAC;QAC9B,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QACzB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,CAAC,UAAU,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAChC,4EAA4E;QAC5E,2EAA2E;QAC3E,2EAA2E;QAC3E,6CAA6C;QAC7C,cAAc,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,qBAAqB,CAAC,GAAG,EAAE,CACzB,qBAAqB,CAAC,GAAG,EAAE;YACzB,IAAI,IAAI,CAAC,OAAO;gBAAE,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAC/E,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAEO,OAAO,CAAC,IAAiB;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;YAC1E,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5F,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,OAAO,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC;YACvB,OAAO,CAAC,YAAY,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;IACjC,CAAC;IAEO,IAAI,CAAC,OAAe;QAC1B,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QACzB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IAkBQ,MAAM;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAChC,OAAO,IAAI,CAAA,qBAAqB,IAAI,CAAC,YAAY,WAAW,GAAG,KAAK,IAAI;YACpE,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,IAAI,CAAA,sCAAsC,GAAG,YAAY,uDAAuD,IAAI,CAAC,YAAY,QAAQ,CAAC;IAClJ,CAAC;;AAtS4B;IAA5B,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;kDAAY;AAG5B;IAAX,QAAQ,EAAE;kDAAY;AAEqB;IAA3C,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;qDAAkB;AAG5C;IAAhB,KAAK,EAAE;sDAAyC;AAEhC;IAAhB,KAAK,EAAE;yDAA2B;AA9CxB,mBAAmB;IAD/B,aAAa,CAAC,uBAAuB,CAAC;GAC1B,mBAAmB,CA2U/B"}
package/package.json CHANGED
@@ -1,6 +1,65 @@
1
1
  {
2
2
  "name": "@lit-material/sortable",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.1",
4
+ "description": "Sortable list for lit-material: reorder items by pointer, touch or keyboard, within a list or between lists, with screen reader announcements.",
5
+ "license": "MIT",
6
+ "author": {
7
+ "name": "bohdaq",
8
+ "email": "bohdaq@gmail.com",
9
+ "url": "https://github.com/bohdaq"
10
+ },
11
+ "homepage": "https://github.com/bohdaq/lit-material#readme",
12
+ "bugs": "https://github.com/bohdaq/lit-material/issues",
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git+ssh://git@github.com/bohdaq/lit-material.git",
16
+ "directory": "packages/sortable"
17
+ },
18
+ "keywords": [
19
+ "lit",
20
+ "web-components",
21
+ "lit-material",
22
+ "material-design",
23
+ "material-design-3",
24
+ "sortable",
25
+ "reorder",
26
+ "drag-and-drop"
27
+ ],
28
+ "type": "module",
29
+ "main": "./dist/index.js",
30
+ "types": "./dist/index.d.ts",
31
+ "exports": {
32
+ ".": {
33
+ "types": "./dist/index.d.ts",
34
+ "default": "./dist/index.js"
35
+ }
36
+ },
37
+ "files": [
38
+ "dist",
39
+ "custom-elements.json"
40
+ ],
41
+ "publishConfig": {
42
+ "access": "public"
43
+ },
44
+ "dependencies": {
45
+ "lit": "^3.2.0",
46
+ "@lit-material/tokens": "0.0.2"
47
+ },
48
+ "devDependencies": {
49
+ "@lit-labs/ssr": "^3.3.1",
50
+ "@open-wc/testing": "^4.0.0",
51
+ "@web/dev-server-esbuild": "^1.0.0",
52
+ "@web/test-runner": "^0.19.0",
53
+ "@web/test-runner-commands": "^0.9.0",
54
+ "@web/test-runner-playwright": "^0.11.0",
55
+ "tsx": "^4.19.0",
56
+ "typescript": "^5.7.0"
57
+ },
58
+ "customElements": "custom-elements.json",
59
+ "scripts": {
60
+ "build": "tsc -p tsconfig.json",
61
+ "typecheck": "tsc -p tsconfig.json --noEmit",
62
+ "test": "web-test-runner && node --import tsx --test src/*.ssr.test.ts",
63
+ "analyze": "custom-elements-manifest analyze --litelement --globs \"src/**/*.ts\" --exclude \"src/**/*.test.ts\" --exclude \"src/**/*.ssr.test.ts\""
64
+ }
6
65
  }