@adia-ai/web-components 0.2.3 → 0.2.4

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 (113) hide show
  1. package/components/button/button.js +3 -0
  2. package/components/demo-toggle/demo-toggle.a2ui.json +144 -0
  3. package/components/demo-toggle/demo-toggle.css +120 -0
  4. package/components/demo-toggle/demo-toggle.js +144 -0
  5. package/components/demo-toggle/demo-toggle.test.js +102 -0
  6. package/components/demo-toggle/demo-toggle.yaml +144 -0
  7. package/components/index.js +1 -0
  8. package/components/input/input.js +11 -0
  9. package/components/list/list.css +21 -0
  10. package/components/textarea/textarea.js +10 -0
  11. package/core/icons.js +12 -1
  12. package/package.json +1 -1
  13. package/styles/components.css +1 -0
  14. package/styles/typography.css +1 -1
  15. package/traits/_catalog.json +257 -4
  16. package/traits/active-state.test.js +1 -1
  17. package/traits/anchor-positioning.js +205 -52
  18. package/traits/anchor-positioning.test.js +77 -4
  19. package/traits/announcer-stage.js +157 -0
  20. package/traits/announcer.js +145 -0
  21. package/traits/announcer.test.js +268 -0
  22. package/traits/arrow-grid-nav.js +234 -0
  23. package/traits/arrow-grid-nav.test.js +375 -0
  24. package/traits/attention-pulse.js +1 -1
  25. package/traits/attention-pulse.test.js +1 -1
  26. package/traits/confetti-burst.js +67 -63
  27. package/traits/confetti-burst.test.js +16 -8
  28. package/traits/confetti-stage.js +143 -0
  29. package/traits/confetti.js +44 -47
  30. package/traits/confetti.test.js +24 -5
  31. package/traits/count-up.js +31 -6
  32. package/traits/count-up.test.js +1 -1
  33. package/traits/declarative.test.js +1 -1
  34. package/traits/dirty-state.test.js +1 -1
  35. package/traits/drag-ghost.js +43 -3
  36. package/traits/drag-ghost.test.js +1 -1
  37. package/traits/draggable-list-item.js +279 -0
  38. package/traits/draggable-list-item.test.js +51 -0
  39. package/traits/draggable.js +14 -4
  40. package/traits/draggable.test.js +1 -1
  41. package/traits/drop-target.js +223 -0
  42. package/traits/drop-target.test.js +241 -0
  43. package/traits/droppable-collection.js +89 -0
  44. package/traits/droppable-collection.test.js +99 -0
  45. package/traits/droppable.js +125 -0
  46. package/traits/droppable.test.js +54 -0
  47. package/traits/error-shake.js +157 -0
  48. package/traits/error-shake.test.js +114 -0
  49. package/traits/fade-presence.test.js +1 -1
  50. package/traits/focus-restore.js +135 -0
  51. package/traits/focus-restore.test.js +202 -0
  52. package/traits/focus-trap.test.js +1 -1
  53. package/traits/focusable.test.js +1 -1
  54. package/traits/glow-focus.js +1 -1
  55. package/traits/glow-focus.test.js +1 -1
  56. package/traits/gradient-shift.js +1 -1
  57. package/traits/gradient-shift.test.js +1 -1
  58. package/traits/haptic-feedback.test.js +1 -1
  59. package/traits/hotkey.test.js +1 -1
  60. package/traits/hoverable.test.js +1 -1
  61. package/traits/index.js +15 -0
  62. package/traits/inertia-drag.js +9 -0
  63. package/traits/inertia-drag.test.js +1 -1
  64. package/traits/input-mask.js +328 -0
  65. package/traits/input-mask.test.js +151 -0
  66. package/traits/intersection-observer.test.js +1 -1
  67. package/traits/keyboard-nav.test.js +1 -1
  68. package/traits/keyboard-reorderable.js +254 -0
  69. package/traits/keyboard-reorderable.test.js +45 -0
  70. package/traits/layout-animation.js +229 -0
  71. package/traits/layout-animation.test.js +114 -0
  72. package/traits/long-press.js +212 -0
  73. package/traits/long-press.test.js +244 -0
  74. package/traits/magnetic-hover.js +1 -1
  75. package/traits/magnetic-hover.test.js +1 -1
  76. package/traits/noise-texture.js +7 -3
  77. package/traits/noise-texture.test.js +1 -1
  78. package/traits/parallax.js +1 -1
  79. package/traits/parallax.test.js +1 -1
  80. package/traits/portal.test.js +1 -1
  81. package/traits/pressable.test.js +1 -1
  82. package/traits/resettable.js +29 -3
  83. package/traits/resettable.test.js +34 -1
  84. package/traits/resizable.test.js +1 -1
  85. package/traits/resize-observer.test.js +1 -1
  86. package/traits/ripple.js +1 -1
  87. package/traits/ripple.test.js +1 -1
  88. package/traits/roving-tabindex.test.js +1 -1
  89. package/traits/scale-press.test.js +1 -1
  90. package/traits/scroll-lock.test.js +1 -1
  91. package/traits/scroll-progress.js +201 -0
  92. package/traits/scroll-progress.test.js +182 -0
  93. package/traits/shimmer-loading.js +1 -1
  94. package/traits/shimmer-loading.test.js +1 -1
  95. package/traits/{_smoke.test.js → smoke.test.js} +1 -1
  96. package/traits/snap-to-grid.test.js +1 -1
  97. package/traits/sound-feedback.test.js +1 -1
  98. package/traits/spring-animate.test.js +1 -1
  99. package/traits/success-checkmark.js +222 -0
  100. package/traits/success-checkmark.test.js +120 -0
  101. package/traits/tilt-hover.js +1 -1
  102. package/traits/tilt-hover.test.js +1 -1
  103. package/traits/tossable.js +9 -0
  104. package/traits/tossable.test.js +1 -1
  105. package/traits/traits-host.test.js +1 -1
  106. package/traits/typeahead.test.js +1 -1
  107. package/traits/typewriter.js +1 -1
  108. package/traits/typewriter.test.js +1 -1
  109. package/traits/validation.test.js +1 -1
  110. package/traits/view-transition.js +140 -0
  111. package/traits/view-transition.test.js +268 -0
  112. /package/traits/{_motion.js → motion.js} +0 -0
  113. /package/traits/{_test-helpers.js → test-helpers.js} +0 -0
@@ -120,10 +120,14 @@ class UIInput extends UIFormElement {
120
120
  render() {
121
121
  if (!this.#textEl) return;
122
122
 
123
+ const text = this.value || '';
124
+
123
125
  if (this.#isNativeInput) {
124
126
  this.#textEl.placeholder = this.placeholder;
125
127
  this.#textEl.disabled = this.disabled;
126
128
  this.#textEl.readOnly = this.readonly;
129
+ // Sync programmatic value writes (form.reset(), trait assignments).
130
+ if (this.#textEl.value !== text) this.#textEl.value = text;
127
131
  } else {
128
132
  this.#textEl.setAttribute('data-placeholder', this.placeholder);
129
133
  if (this.disabled || this.readonly) {
@@ -131,6 +135,13 @@ class UIInput extends UIFormElement {
131
135
  } else {
132
136
  this.#textEl.contentEditable = 'plaintext-only';
133
137
  }
138
+ // Sync programmatic value writes into the contenteditable surface.
139
+ // Skip when already in sync to avoid clobbering an in-flight edit's
140
+ // caret position.
141
+ if (this.#textEl.textContent !== text) {
142
+ this.#textEl.textContent = text;
143
+ this.#textEl.toggleAttribute('data-empty', !text);
144
+ }
134
145
  }
135
146
 
136
147
  if (this.#labelEl) this.#labelEl.textContent = this.label || '';
@@ -121,6 +121,9 @@
121
121
  font-size: var(--list-item-font-size);
122
122
  color: var(--list-item-text-color);
123
123
  line-height: 1.4;
124
+ /* Defensive floor: empty list-item-ui (no text/icon/children) collapses
125
+ to 0 height and disappears. Keep a visible row instead. */
126
+ min-height: var(--a-space-6);
124
127
  }
125
128
 
126
129
  :scope > [slot="icon"] {
@@ -150,4 +153,22 @@
150
153
  :scope > [slot="content"] {
151
154
  grid-column: 1 / -1;
152
155
  }
156
+
157
+ /* ── Active state ──
158
+ `[data-active]` is the consumer-driven "current item" hook used by
159
+ keyboard-nav-style demos and any host that owns its own active-index
160
+ model (separate from list-ui[selectable] / aria-selected). Reuses
161
+ the accent-muted/accent-strong pair so the two mechanisms paint
162
+ consistently. No border-radius on the row itself — dividers (when
163
+ present) span full-width and rounded corners would clash. */
164
+ :scope[data-active] {
165
+ background: var(--a-accent-muted);
166
+ color: var(--a-accent-strong);
167
+ box-shadow: inset 2px 0 0 var(--a-accent-strong);
168
+ }
169
+
170
+ :scope[data-active] > [slot="icon"],
171
+ :scope[data-active] > [slot="description"] {
172
+ color: var(--a-accent-strong);
173
+ }
153
174
  }
@@ -55,6 +55,16 @@ class UITextarea extends UIFormElement {
55
55
  this.#textEl.contentEditable = 'plaintext-only';
56
56
  }
57
57
 
58
+ // Sync programmatic `value` assignments (form.reset(), trait writes,
59
+ // controlled-input patterns) into the contenteditable surface. Skip
60
+ // when the surface already matches to avoid clobbering an in-flight
61
+ // edit's caret.
62
+ const text = this.value || '';
63
+ if (this.#textEl.textContent !== text) {
64
+ this.#textEl.textContent = text;
65
+ this.#textEl.toggleAttribute('data-empty', !text);
66
+ }
67
+
58
68
  const label = this.querySelector('[slot="label"]');
59
69
  if (label && this.label) label.setAttribute('label', this.label);
60
70
 
package/core/icons.js CHANGED
@@ -212,7 +212,18 @@ const ICON_ALIASES = {
212
212
  'phone': 'phone', 'location': 'map-pin', 'calendar': 'calendar-blank',
213
213
  'time': 'clock', 'user': 'user', 'users': 'users-three',
214
214
  'menu': 'list', 'more': 'dots-three', 'dots-vertical': 'dots-three-vertical', 'filter': 'funnel',
215
- 'inbox': 'tray', 'text-bold': 'text-b',
215
+ 'inbox': 'tray',
216
+ 'text-bold': 'text-b', 'bold': 'text-b', 'italic': 'text-italic', 'underline': 'text-underline',
217
+ 'reset': 'arrow-counter-clockwise', 'undo': 'arrow-counter-clockwise', 'redo': 'arrow-clockwise',
218
+ 'success-checkmark': 'seal-check', 'circuit': 'circuitry',
219
+ 'contrast': 'circle-half', 'theme': 'circle-half', 'dark-mode': 'moon', 'light-mode': 'sun',
220
+ 'alert-triangle': 'warning', 'alert-octagon': 'warning-octagon', 'alert-diamond': 'warning-diamond',
221
+ 'number': 'hash', 'numbered-list': 'list-numbers', 'numeric': 'hash',
222
+ // Phosphor uses suffix-circle for these, but consumers reach for the
223
+ // prefix form ("circle-warning") just as often. Resolve both shapes.
224
+ 'circle-warning': 'warning-circle', 'circle-x': 'x-circle',
225
+ 'circle-check': 'check-circle', 'circle-info': 'info',
226
+ 'circle-question': 'question', 'circle-plus': 'plus-circle', 'circle-minus': 'minus-circle',
216
227
  'sort': 'sort-ascending', 'refresh': 'arrow-clockwise', 'download': 'download-simple',
217
228
  'upload': 'upload-simple', 'share': 'share-network', 'copy': 'copy-simple',
218
229
  'link': 'link-simple', 'external-link': 'arrow-square-out',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adia-ai/web-components",
3
- "version": "0.2.3",
3
+ "version": "0.2.4",
4
4
  "description": "AdiaUI web components — vanilla custom elements. A2UI runtime (renderer, registry, streams, wiring) lives in @adia-ai/a2ui-utils.",
5
5
  "type": "module",
6
6
  "exports": {
@@ -83,6 +83,7 @@
83
83
  @import "../components/block/block.css";
84
84
  @import "../components/text/text.css";
85
85
  @import "../components/toggle-group/toggle-group.css";
86
+ @import "../components/demo-toggle/demo-toggle.css";
86
87
  @import "../components/richtext/richtext.css";
87
88
  @import "../components/stream/stream.css";
88
89
  @import "../components/canvas/canvas.css";
@@ -256,7 +256,7 @@
256
256
 
257
257
  /* section — h2/h3, major division within content */
258
258
  --a-section-family: var(--a-font-family-heading);
259
- --a-section-weight: var(--a-weight-semibold);
259
+ --a-section-weight: var(--a-weight-normal);
260
260
  --a-section-sm: 16px;
261
261
  --a-section-md: 17px;
262
262
  --a-section-lg: 19px;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "generated": "scripts/build/traits-catalog.mjs",
3
3
  "note": "Generated from packages/web-components/traits/*.js. Do not hand-edit. Run `node scripts/build/traits-catalog.mjs`.",
4
- "count": 41,
4
+ "count": 56,
5
5
  "categories": [
6
6
  "animation-feedback",
7
7
  "audio-haptics-sensory",
@@ -14,6 +14,22 @@
14
14
  "visual-dynamics"
15
15
  ],
16
16
  "traits": [
17
+ {
18
+ "name": "error-shake",
19
+ "category": "animation-feedback",
20
+ "description": "Horizontal lateral oscillation on validation failure",
21
+ "attributes": [
22
+ "data-error-shake-active"
23
+ ],
24
+ "events": [
25
+ "error-shake-done"
26
+ ],
27
+ "config": [
28
+ "data-error-shake-amplitude",
29
+ "data-error-shake-duration",
30
+ "data-error-shake-trigger"
31
+ ]
32
+ },
17
33
  {
18
34
  "name": "fade-presence",
19
35
  "category": "animation-feedback",
@@ -61,6 +77,21 @@
61
77
  "data-spring-damping"
62
78
  ]
63
79
  },
80
+ {
81
+ "name": "success-checkmark",
82
+ "category": "animation-feedback",
83
+ "description": "Stroke-draw checkmark on validation success",
84
+ "attributes": [
85
+ "data-success-checkmark-active"
86
+ ],
87
+ "events": [
88
+ "success-checkmark-done"
89
+ ],
90
+ "config": [
91
+ "data-success-checkmark-position",
92
+ "data-success-checkmark-trigger"
93
+ ]
94
+ },
64
95
  {
65
96
  "name": "tilt-hover",
66
97
  "category": "animation-feedback",
@@ -71,6 +102,23 @@
71
102
  "events": [],
72
103
  "config": []
73
104
  },
105
+ {
106
+ "name": "announcer",
107
+ "category": "audio-haptics-sensory",
108
+ "description": "aria-live mirror for AT — announces host state changes via singleton polite/assertive regions",
109
+ "attributes": [
110
+ "data-announcer-active"
111
+ ],
112
+ "events": [
113
+ "announcement-made"
114
+ ],
115
+ "config": [
116
+ "data-announce-on",
117
+ "data-announce-message",
118
+ "data-announce-priority",
119
+ "data-announce-throttle"
120
+ ]
121
+ },
74
122
  {
75
123
  "name": "attention-pulse",
76
124
  "category": "audio-haptics-sensory",
@@ -95,7 +143,11 @@
95
143
  ],
96
144
  "config": [
97
145
  "data-count-up-target",
98
- "data-count-duration"
146
+ "data-count-duration",
147
+ "data-count-prefix",
148
+ "data-count-suffix",
149
+ "data-count-decimals",
150
+ "data-count-locale"
99
151
  ]
100
152
  },
101
153
  {
@@ -147,6 +199,22 @@
147
199
  "events": [],
148
200
  "config": []
149
201
  },
202
+ {
203
+ "name": "input-mask",
204
+ "category": "forms-data",
205
+ "description": "Locale-aware as-you-type formatter (phone, credit-card, date, currency)",
206
+ "attributes": [
207
+ "data-input-mask-active",
208
+ "data-input-mask-complete"
209
+ ],
210
+ "events": [
211
+ "mask-commit"
212
+ ],
213
+ "config": [
214
+ "data-mask-pattern",
215
+ "data-mask-strip-on-commit"
216
+ ]
217
+ },
150
218
  {
151
219
  "name": "resettable",
152
220
  "category": "forms-data",
@@ -185,6 +253,35 @@
185
253
  "events": [],
186
254
  "config": []
187
255
  },
256
+ {
257
+ "name": "droppable",
258
+ "category": "input-interaction",
259
+ "description": "Marks an element as a drop target for draggable-list-item; emits dnd-drop-enter / leave / receive",
260
+ "attributes": [
261
+ "data-droppable-id",
262
+ "data-droppable-over",
263
+ "data-droppable-valid"
264
+ ],
265
+ "events": [
266
+ "dnd-drop-enter",
267
+ "dnd-drop-leave",
268
+ "dnd-drop-receive"
269
+ ],
270
+ "config": []
271
+ },
272
+ {
273
+ "name": "droppable-collection",
274
+ "category": "input-interaction",
275
+ "description": "Coordinates droppable children; re-emits drops as dnd-collection-drop",
276
+ "attributes": [
277
+ "data-droppable-collection-active",
278
+ "data-droppable-collection-dragging"
279
+ ],
280
+ "events": [
281
+ "dnd-collection-drop"
282
+ ],
283
+ "config": []
284
+ },
188
285
  {
189
286
  "name": "focusable",
190
287
  "category": "input-interaction",
@@ -205,6 +302,26 @@
205
302
  "events": [],
206
303
  "config": []
207
304
  },
305
+ {
306
+ "name": "long-press",
307
+ "category": "input-interaction",
308
+ "description": "Press-and-hold trigger: fires after configurable duration with progress events",
309
+ "attributes": [
310
+ "data-long-press-active",
311
+ "data-long-press-progress",
312
+ "data-long-press-fired"
313
+ ],
314
+ "events": [
315
+ "long-press",
316
+ "long-press-cancelled",
317
+ "long-press-progress"
318
+ ],
319
+ "config": [
320
+ "data-long-press-duration",
321
+ "data-long-press-tolerance",
322
+ "data-long-press-progress-interval"
323
+ ]
324
+ },
208
325
  {
209
326
  "name": "pressable",
210
327
  "category": "input-interaction",
@@ -249,6 +366,39 @@
249
366
  "events": [],
250
367
  "config": []
251
368
  },
369
+ {
370
+ "name": "arrow-grid-nav",
371
+ "category": "keyboard-navigation",
372
+ "description": "2D arrow-key navigation for grids, calendars, menubars (APG grid pattern)",
373
+ "attributes": [
374
+ "data-arrow-grid-nav-active",
375
+ "data-grid-active-row",
376
+ "data-grid-active-col"
377
+ ],
378
+ "events": [
379
+ "grid-activate",
380
+ "grid-edge",
381
+ "grid-cell-change"
382
+ ],
383
+ "config": [
384
+ "data-grid-columns",
385
+ "data-grid-mode"
386
+ ]
387
+ },
388
+ {
389
+ "name": "focus-restore",
390
+ "category": "keyboard-navigation",
391
+ "description": "Capture previously-focused element on connect, restore focus on disconnect",
392
+ "attributes": [
393
+ "data-focus-restore-active"
394
+ ],
395
+ "events": [
396
+ "focus-restored"
397
+ ],
398
+ "config": [
399
+ "data-focus-restore-on-mount"
400
+ ]
401
+ },
252
402
  {
253
403
  "name": "focus-trap",
254
404
  "category": "keyboard-navigation",
@@ -291,6 +441,22 @@
291
441
  ],
292
442
  "config": []
293
443
  },
444
+ {
445
+ "name": "keyboard-reorderable",
446
+ "category": "keyboard-navigation",
447
+ "description": "Keyboard alternative to draggable-list-item: arrow keys + Space to lift / drop / Esc to cancel",
448
+ "attributes": [
449
+ "data-keyboard-reorderable-lifting",
450
+ "data-keyboard-reorderable-id"
451
+ ],
452
+ "events": [
453
+ "dnd-lift",
454
+ "dnd-drop-target-change",
455
+ "dnd-drop",
456
+ "dnd-drop-cancel"
457
+ ],
458
+ "config": []
459
+ },
294
460
  {
295
461
  "name": "roving-tabindex",
296
462
  "category": "keyboard-navigation",
@@ -317,7 +483,8 @@
317
483
  "description": "Positions relative to an anchor element",
318
484
  "attributes": [
319
485
  "data-anchor-positioning-placed",
320
- "data-anchor-placement-actual"
486
+ "data-anchor-placement-actual",
487
+ "data-anchor-mode"
321
488
  ],
322
489
  "events": [
323
490
  "anchor-placed"
@@ -380,6 +547,22 @@
380
547
  "events": [],
381
548
  "config": []
382
549
  },
550
+ {
551
+ "name": "scroll-progress",
552
+ "category": "layout-measurement",
553
+ "description": "Page or element scroll progress as 0..1 attribute + CSS variable + event",
554
+ "attributes": [
555
+ "data-scroll-progress-active",
556
+ "data-scroll-progress"
557
+ ],
558
+ "events": [
559
+ "scroll-progress"
560
+ ],
561
+ "config": [
562
+ "data-scroll-progress-mode",
563
+ "data-scroll-container"
564
+ ]
565
+ },
383
566
  {
384
567
  "name": "drag-ghost",
385
568
  "category": "motion-positioning",
@@ -402,6 +585,41 @@
402
585
  ],
403
586
  "config": []
404
587
  },
588
+ {
589
+ "name": "draggable-list-item",
590
+ "category": "motion-positioning",
591
+ "description": "Pointer drag for list reordering; emits dnd-lift/drop-target-change/drop/drop-cancel",
592
+ "attributes": [
593
+ "data-draggable-list-item-lifting",
594
+ "data-draggable-list-item-id"
595
+ ],
596
+ "events": [
597
+ "dnd-lift",
598
+ "dnd-drop-target-change",
599
+ "dnd-drop",
600
+ "dnd-drop-cancel"
601
+ ],
602
+ "config": []
603
+ },
604
+ {
605
+ "name": "drop-target",
606
+ "category": "motion-positioning",
607
+ "description": "Declarative drop zone: hit-testing, accept-reject, drag-over feedback",
608
+ "attributes": [
609
+ "data-drop-target-active",
610
+ "data-drop-target-over",
611
+ "data-drop-target-rejected"
612
+ ],
613
+ "events": [
614
+ "drop-enter",
615
+ "drop-leave",
616
+ "drop-receive",
617
+ "drop-rejected"
618
+ ],
619
+ "config": [
620
+ "data-drop-target-accepts"
621
+ ]
622
+ },
405
623
  {
406
624
  "name": "inertia-drag",
407
625
  "category": "motion-positioning",
@@ -414,6 +632,22 @@
414
632
  ],
415
633
  "config": []
416
634
  },
635
+ {
636
+ "name": "layout-animation",
637
+ "category": "motion-positioning",
638
+ "description": "FLIP-style layout transition: animate from old to new bounds without explicit coordinates",
639
+ "attributes": [
640
+ "data-layout-animation-active"
641
+ ],
642
+ "events": [
643
+ "layout-animation-done"
644
+ ],
645
+ "config": [
646
+ "data-layout-animate-duration",
647
+ "data-layout-animate-easing",
648
+ "data-layout-animate-trigger"
649
+ ]
650
+ },
417
651
  {
418
652
  "name": "resizable",
419
653
  "category": "motion-positioning",
@@ -453,6 +687,23 @@
453
687
  "data-tossable-bounds"
454
688
  ]
455
689
  },
690
+ {
691
+ "name": "view-transition",
692
+ "category": "motion-positioning",
693
+ "description": "Wraps document.startViewTransition() for morph animations between DOM states",
694
+ "attributes": [
695
+ "data-view-transition-active"
696
+ ],
697
+ "events": [
698
+ "view-transition-start",
699
+ "view-transition-end"
700
+ ],
701
+ "config": [
702
+ "data-view-transition-name",
703
+ "data-view-transition-duration",
704
+ "data-view-transition-easing"
705
+ ]
706
+ },
456
707
  {
457
708
  "name": "glow-focus",
458
709
  "category": "visual-dynamics",
@@ -481,7 +732,9 @@
481
732
  "data-noise-texture-active"
482
733
  ],
483
734
  "events": [],
484
- "config": []
735
+ "config": [
736
+ "data-noise-strength"
737
+ ]
485
738
  },
486
739
  {
487
740
  "name": "parallax",
@@ -1,6 +1,6 @@
1
1
  import { describe, it, expect, beforeEach } from 'vitest';
2
2
  import { activeState } from './active-state.js';
3
- import { mountHost, connectTrait, resetDOM } from './_test-helpers.js';
3
+ import { mountHost, connectTrait, resetDOM } from './test-helpers.js';
4
4
 
5
5
  describe('active-state', () => {
6
6
  beforeEach(resetDOM);