noph-ui 0.35.0 → 0.37.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 (91) hide show
  1. package/README.md +14 -13
  2. package/dist/autocomplete/AutoComplete.svelte +1 -1
  3. package/dist/autocomplete/AutoComplete.svelte.d.ts +1 -1
  4. package/dist/autocomplete/types.d.ts +1 -1
  5. package/dist/button/Button.svelte +1 -2
  6. package/dist/button/IconButton.svelte +1 -1
  7. package/dist/button/SegmentedButton.svelte +1 -1
  8. package/dist/card/Card.svelte +1 -1
  9. package/dist/checkbox/Checkbox.svelte +1 -1
  10. package/dist/chip/AssistChip.svelte +1 -1
  11. package/dist/chip/ChipSet.svelte +1 -1
  12. package/dist/chip/FilterChip.svelte +1 -1
  13. package/dist/chip/FilterChip.svelte.d.ts +1 -1
  14. package/dist/chip/InputChip.svelte +1 -3
  15. package/dist/chip/types.d.ts +1 -1
  16. package/dist/date-picker/Calendar.svelte +487 -0
  17. package/dist/date-picker/Calendar.svelte.d.ts +4 -0
  18. package/dist/date-picker/CalendarHeader.svelte +229 -0
  19. package/dist/date-picker/CalendarHeader.svelte.d.ts +27 -0
  20. package/dist/date-picker/DatePickerDialog.svelte +481 -0
  21. package/dist/date-picker/DatePickerDialog.svelte.d.ts +4 -0
  22. package/dist/date-picker/DateRangePicker.svelte +351 -0
  23. package/dist/date-picker/DateRangePicker.svelte.d.ts +4 -0
  24. package/dist/date-picker/DockedDatePicker.svelte +518 -5
  25. package/dist/date-picker/DockedDatePicker.svelte.d.ts +3 -17
  26. package/dist/date-picker/SelectionList.svelte +148 -0
  27. package/dist/date-picker/SelectionList.svelte.d.ts +14 -0
  28. package/dist/date-picker/YearGrid.svelte +195 -0
  29. package/dist/date-picker/YearGrid.svelte.d.ts +11 -0
  30. package/dist/date-picker/dateUtils.d.ts +41 -0
  31. package/dist/date-picker/dateUtils.js +153 -0
  32. package/dist/date-picker/enterAnimation.d.ts +1 -0
  33. package/dist/date-picker/enterAnimation.js +10 -0
  34. package/dist/date-picker/index.d.ts +6 -0
  35. package/dist/date-picker/index.js +6 -0
  36. package/dist/date-picker/types.d.ts +107 -0
  37. package/dist/date-picker/types.js +1 -0
  38. package/dist/dialog/Dialog.svelte +17 -12
  39. package/dist/dialog/types.d.ts +1 -1
  40. package/dist/divider/Divider.svelte +1 -1
  41. package/dist/icons/ArrowDropDownIcon.svelte +3 -0
  42. package/dist/icons/ArrowDropDownIcon.svelte.d.ts +26 -0
  43. package/dist/icons/ChevronLeftIcon.svelte +3 -0
  44. package/dist/icons/ChevronLeftIcon.svelte.d.ts +26 -0
  45. package/dist/icons/ChevronRightIcon.svelte +3 -0
  46. package/dist/icons/ChevronRightIcon.svelte.d.ts +26 -0
  47. package/dist/icons/EditCalendarIcon.svelte +5 -0
  48. package/dist/icons/EditCalendarIcon.svelte.d.ts +26 -0
  49. package/dist/icons/index.d.ts +5 -1
  50. package/dist/icons/index.js +5 -1
  51. package/dist/index.d.ts +2 -0
  52. package/dist/index.js +2 -0
  53. package/dist/list/Item.svelte +1 -1
  54. package/dist/list/List.svelte +1 -1
  55. package/dist/list/ListItem.svelte +1 -1
  56. package/dist/loading-indicator/LoadingIndicator.svelte +135 -0
  57. package/dist/loading-indicator/LoadingIndicator.svelte.d.ts +4 -0
  58. package/dist/loading-indicator/index.d.ts +1 -0
  59. package/dist/loading-indicator/index.js +1 -0
  60. package/dist/loading-indicator/shapes.d.ts +6 -0
  61. package/dist/loading-indicator/shapes.js +49 -0
  62. package/dist/loading-indicator/types.d.ts +7 -0
  63. package/dist/loading-indicator/types.js +1 -0
  64. package/dist/menu/Menu.svelte +3 -3
  65. package/dist/menu/MenuItem.svelte +1 -1
  66. package/dist/menu/types.d.ts +1 -1
  67. package/dist/navigation-drawer/NavigationDrawer.svelte +1 -1
  68. package/dist/navigation-drawer/NavigationDrawerItem.svelte +2 -2
  69. package/dist/navigation-rail/NavigationRail.svelte +1 -1
  70. package/dist/navigation-rail/NavigationRailItem.svelte +1 -1
  71. package/dist/progress/CircularProgress.svelte +1 -1
  72. package/dist/progress/LinearProgress.svelte +24 -7
  73. package/dist/radio/Radio.svelte +1 -1
  74. package/dist/ripple/Ripple.svelte +1 -1
  75. package/dist/select/Option.svelte +0 -1
  76. package/dist/select/Select.svelte +1 -1
  77. package/dist/select/Select.svelte.d.ts +1 -1
  78. package/dist/select/VirtualList.svelte +3 -4
  79. package/dist/slider/Slider.svelte +83 -19
  80. package/dist/slider/Slider.svelte.d.ts +1 -1
  81. package/dist/snackbar/Snackbar.svelte +3 -3
  82. package/dist/switch/Switch.svelte +1 -1
  83. package/dist/tabs/Tab.svelte +1 -1
  84. package/dist/tabs/Tabs.svelte +1 -1
  85. package/dist/tabs/Tabs.svelte.d.ts +1 -1
  86. package/dist/text-field/TextField.svelte +3 -3
  87. package/dist/text-field/TextField.svelte.d.ts +1 -1
  88. package/dist/tooltip/Tooltip.svelte +1 -1
  89. package/dist/types.d.ts +2 -0
  90. package/dist/types.js +23 -21
  91. package/package.json +14 -11
@@ -25,7 +25,7 @@
25
25
  }: VirtualListProps = $props()
26
26
 
27
27
  let height_map: number[] = []
28
- // eslint-disable-next-line no-undef
28
+
29
29
  let rows: HTMLCollectionOf<HTMLElement> | undefined = $state()
30
30
  let viewport: HTMLElement | undefined = $state()
31
31
  let contents: HTMLDivElement | undefined = $state()
@@ -48,7 +48,7 @@
48
48
  })),
49
49
  )
50
50
 
51
- async function refresh(items: T[], viewport_height: number, itemHeight?: number) {
51
+ const refresh = async (items: T[], viewport_height: number, itemHeight?: number) => {
52
52
  if (!viewport || !rows) {
53
53
  return
54
54
  }
@@ -85,7 +85,7 @@
85
85
  rendered?.({ start, end })
86
86
  }
87
87
 
88
- async function handle_scroll() {
88
+ const handle_scroll = async () => {
89
89
  if (!viewport || !rows) {
90
90
  return
91
91
  }
@@ -160,7 +160,6 @@
160
160
  }
161
161
 
162
162
  onMount(() => {
163
- // eslint-disable-next-line no-undef
164
163
  rows = contents?.children as HTMLCollectionOf<HTMLElement>
165
164
  mounted = true
166
165
  })
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import type { SliderProps } from './types.ts'
2
+ import type { SliderProps } from './types.js'
3
3
 
4
4
  let {
5
5
  value = $bindable(0),
@@ -99,8 +99,32 @@
99
99
  const isActive = (t: number) => t >= activeFrom && t <= activeTo
100
100
 
101
101
  let dragging = $state<'start' | 'end' | null>(null)
102
+ let tracking = $state(false)
102
103
  let trackElement = $state<HTMLDivElement>()
104
+ let activeLaneElement = $state<HTMLDivElement>()
105
+ let iconElement = $state<HTMLSpanElement>()
106
+ let iconFits = $state(true)
103
107
  let pointerFocused = $state(false)
108
+ let pointerOrigin: { x: number; y: number } | null = null
109
+
110
+ const DRAG_THRESHOLD = 3
111
+
112
+ $effect(() => {
113
+ if (!icon || !activeLaneElement) return
114
+ const lane = activeLaneElement
115
+ const inlineOf = (r: DOMRect) => (orientation === 'vertical' ? r.height : r.width)
116
+ const measure = () => {
117
+ if (!iconElement) return
118
+ const padding = parseFloat(getComputedStyle(iconElement).insetInlineStart) || 0
119
+ iconFits =
120
+ inlineOf(lane.getBoundingClientRect()) >=
121
+ inlineOf(iconElement.getBoundingClientRect()) + 2 * padding
122
+ }
123
+ const observer = new ResizeObserver(measure)
124
+ observer.observe(lane)
125
+ measure()
126
+ return () => observer.disconnect()
127
+ })
104
128
 
105
129
  const fractionFromEvent = (e: PointerEvent) => {
106
130
  if (!trackElement) return 0
@@ -131,9 +155,23 @@
131
155
  }
132
156
  }
133
157
 
158
+ const onpointermove = (e: PointerEvent) => {
159
+ if (!dragging) return
160
+ if (!tracking) {
161
+ const d = pointerOrigin
162
+ ? Math.hypot(e.clientX - pointerOrigin.x, e.clientY - pointerOrigin.y)
163
+ : Infinity
164
+ if (d <= DRAG_THRESHOLD) return
165
+ tracking = true
166
+ }
167
+ moveTo(e)
168
+ }
169
+
134
170
  const onpointerdown = (e: PointerEvent) => {
135
171
  if (disabled || e.button !== 0) return
136
172
  const v = min + clamp(fractionFromEvent(e), 0, 1) * span
173
+ pointerOrigin = { x: e.clientX, y: e.clientY }
174
+ tracking = false
137
175
  dragging = !range
138
176
  ? 'start'
139
177
  : lo === hi
@@ -154,6 +192,8 @@
154
192
  if (!dragging) return
155
193
  const input = dragging === 'start' ? inputElement : endInputElement
156
194
  dragging = null
195
+ tracking = false
196
+ pointerOrigin = null
157
197
  element?.releasePointerCapture(e.pointerId)
158
198
  input?.dispatchEvent(new Event('change', { bubbles: true }))
159
199
  }
@@ -173,12 +213,13 @@
173
213
  labeled && 'np-labeled',
174
214
  disabled && 'np-disabled',
175
215
  dragging && 'np-dragging',
216
+ tracking && 'np-tracking',
176
217
  pointerFocused && 'np-pointer-focused',
177
218
  attributes.class,
178
219
  ]}
179
220
  role="presentation"
180
221
  {onpointerdown}
181
- onpointermove={moveTo}
222
+ {onpointermove}
182
223
  onpointerup={endDrag}
183
224
  onpointercancel={endDrag}
184
225
  onkeydown={() => (pointerFocused = false)}
@@ -190,12 +231,15 @@
190
231
  <span class="np-slider-stop np-slider-stop-start"></span>
191
232
  </div>
192
233
  {/if}
193
- <div class="np-slider-lane np-slider-active">
194
- {#if icon}
195
- <span class="np-slider-icon">{@render icon()}</span>
234
+ <div class="np-slider-lane np-slider-active" bind:this={activeLaneElement}>
235
+ {#if icon && iconFits}
236
+ <span class="np-slider-icon" bind:this={iconElement}>{@render icon()}</span>
196
237
  {/if}
197
238
  </div>
198
239
  <div class="np-slider-lane np-slider-inactive-end">
240
+ {#if icon && !iconFits}
241
+ <span class="np-slider-icon np-on-inactive" bind:this={iconElement}>{@render icon()}</span>
242
+ {/if}
199
243
  <span class="np-slider-stop np-slider-stop-end"></span>
200
244
  </div>
201
245
 
@@ -266,6 +310,8 @@
266
310
  --_inside: var(--np-slider-track-inside-shape, 0.125rem);
267
311
  --_stop: var(--np-slider-stop-indicator-size, 0.25rem);
268
312
  --_gap: calc(var(--_hw) / 2 + 0.375rem);
313
+ --_ring: 3px;
314
+ --_ring-gap: 0.25rem;
269
315
 
270
316
  position: relative;
271
317
  display: block;
@@ -320,8 +366,7 @@
320
366
  inset-inline-end var(--np-motion-expressive-fast-effects);
321
367
  }
322
368
 
323
- .np-dragging .np-slider-lane,
324
- .np-dragging .np-slider-handle {
369
+ .np-tracking .np-slider-lane {
325
370
  transition: none;
326
371
  }
327
372
 
@@ -372,6 +417,10 @@
372
417
  writing-mode: horizontal-tb;
373
418
  }
374
419
 
420
+ .np-slider-icon.np-on-inactive {
421
+ color: var(--np-slider-icon-inactive-color, var(--np-color-on-secondary-container));
422
+ }
423
+
375
424
  .np-slider-icon :global(svg) {
376
425
  inline-size: var(--_icon-size);
377
426
  block-size: var(--_icon-size);
@@ -387,6 +436,7 @@
387
436
  border-radius: var(--np-shape-corner-full);
388
437
  background: var(--np-slider-inactive-stop-color, var(--np-color-on-secondary-container));
389
438
  pointer-events: none;
439
+ transition: background-color var(--np-motion-expressive-fast-effects);
390
440
  }
391
441
 
392
442
  .np-slider-stop-end {
@@ -408,15 +458,19 @@
408
458
  }
409
459
 
410
460
  .np-slider-handle {
461
+ --_cw: var(--_hw);
462
+ --_ch: var(--_handle-height);
463
+
411
464
  position: absolute;
412
- inset-inline-start: calc(var(--_p) - var(--_hw) / 2);
413
- inset-block-start: calc((var(--_track-height) - var(--_handle-height)) / 2);
414
- inline-size: var(--_hw);
415
- block-size: var(--_handle-height);
465
+ inset-inline-start: calc(var(--_p) - var(--_cw) / 2);
466
+ inset-block-start: calc((var(--_track-height) - var(--_ch)) / 2);
467
+ inline-size: var(--_cw);
468
+ block-size: var(--_ch);
416
469
  border-radius: var(--np-slider-handle-shape, var(--np-shape-corner-full));
417
470
  background: var(--np-slider-handle-color, var(--np-color-primary));
418
471
  transition:
419
472
  inset-inline-start var(--np-motion-expressive-fast-effects),
473
+ inset-block-start var(--np-motion-expressive-fast-effects),
420
474
  inline-size var(--np-motion-expressive-fast-effects),
421
475
  block-size var(--np-motion-expressive-fast-effects);
422
476
  }
@@ -433,14 +487,19 @@
433
487
  .np-slider-handle-start,
434
488
  .np-slider:not(.np-disabled, .np-pointer-focused):has(.np-slider-input-end:focus-visible)
435
489
  .np-slider-handle-end {
436
- inline-size: var(--np-slider-handle-width-focus, 0.125rem);
437
- block-size: calc(var(--_handle-height) - 0.375rem);
438
- outline: 3px solid var(--np-color-secondary);
439
- outline-offset: 0.125rem;
490
+ --_cw: var(--np-slider-handle-width-focus, 0.125rem);
491
+ outline: var(--_ring) solid var(--np-color-secondary);
492
+ outline-offset: var(--_ring-gap);
440
493
  }
441
494
 
442
495
  .np-dragging .np-slider-handle {
443
- inline-size: var(--np-slider-handle-width-focus, 0.125rem);
496
+ --_cw: var(--np-slider-handle-width-focus, 0.125rem);
497
+ }
498
+
499
+ .np-tracking .np-slider-handle {
500
+ transition:
501
+ inline-size var(--np-motion-expressive-fast-effects),
502
+ block-size var(--np-motion-expressive-fast-effects);
444
503
  }
445
504
 
446
505
  .np-slider-label-anchor {
@@ -530,10 +589,15 @@
530
589
  color: var(--np-color-surface);
531
590
  }
532
591
 
592
+ .np-slider.np-disabled .np-slider-icon.np-on-inactive {
593
+ color: color-mix(in srgb, var(--np-color-on-surface) 38%, transparent);
594
+ }
595
+
533
596
  @media (prefers-reduced-motion: reduce) {
534
- .np-slider-lane,
535
- .np-slider-handle,
536
- .np-slider-label {
597
+ .np-slider .np-slider-lane,
598
+ .np-slider .np-slider-handle,
599
+ .np-slider .np-slider-tick,
600
+ .np-slider .np-slider-label {
537
601
  transition: none;
538
602
  }
539
603
  }
@@ -1,4 +1,4 @@
1
1
  import type { SliderProps } from './types.ts';
2
- declare const Slider: import("svelte").Component<SliderProps, {}, "element" | "value" | "inputElement" | "endValue" | "endInputElement">;
2
+ declare const Slider: import("svelte").Component<SliderProps, {}, "value" | "element" | "endValue" | "inputElement" | "endInputElement">;
3
3
  type Slider = ReturnType<typeof Slider>;
4
4
  export default Slider;
@@ -1,7 +1,7 @@
1
1
  <script lang="ts">
2
2
  import Button from '../button/Button.svelte'
3
3
  import IconButton from '../button/IconButton.svelte'
4
- import type { SnackbarProps } from './types.ts'
4
+ import type { SnackbarProps } from './types.js'
5
5
 
6
6
  let {
7
7
  label,
@@ -23,11 +23,11 @@
23
23
  let timeoutId: ReturnType<typeof setTimeout> | undefined
24
24
  const uid = $props.id()
25
25
 
26
- export function showPopover() {
26
+ export const showPopover = () => {
27
27
  element?.showPopover()
28
28
  }
29
29
 
30
- export function hidePopover() {
30
+ export const hidePopover = () => {
31
31
  element?.hidePopover()
32
32
  }
33
33
 
@@ -1,6 +1,6 @@
1
1
  <script lang="ts">
2
2
  import Ripple from '../ripple/Ripple.svelte'
3
- import type { SwitchProps } from './types.ts'
3
+ import type { SwitchProps } from './types.js'
4
4
 
5
5
  let {
6
6
  selected = $bindable(false),
@@ -3,7 +3,7 @@
3
3
  import Ripple from '../ripple/Ripple.svelte'
4
4
  import { tick } from 'svelte'
5
5
  import { getTabsContext } from './context.js'
6
- import type { TabProps } from './types.ts'
6
+ import type { TabProps } from './types.js'
7
7
 
8
8
  let {
9
9
  children,
@@ -2,7 +2,7 @@
2
2
  import Divider from '../divider/Divider.svelte'
3
3
  import { arrowKeyNav, rovingTabindex } from '../keyboard-nav.js'
4
4
  import { setTabsContext } from './context.js'
5
- import type { TabsContext, TabsProps } from './types.ts'
5
+ import type { TabsContext, TabsProps } from './types.js'
6
6
 
7
7
  let {
8
8
  children,
@@ -1,4 +1,4 @@
1
1
  import type { TabsProps } from './types.ts';
2
- declare const Tabs: import("svelte").Component<TabsProps, {}, "element" | "value">;
2
+ declare const Tabs: import("svelte").Component<TabsProps, {}, "value" | "element">;
3
3
  type Tabs = ReturnType<typeof Tabs>;
4
4
  export default Tabs;
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import type { TextFieldProps } from './types.ts'
2
+ import type { TextFieldProps } from './types.js'
3
3
 
4
4
  let {
5
5
  defaultValue,
@@ -149,8 +149,8 @@
149
149
  </div>
150
150
  </div>
151
151
  {#if supportingText || errorText || attributes.maxlength}
152
- <div class="supporting-text" role={errorText ? 'alert' : undefined}>
153
- <span id="supporting-text-{uid}">
152
+ <div class="supporting-text">
153
+ <span id="supporting-text-{uid}" role={errorText ? 'alert' : undefined}>
154
154
  {errorText ?? supportingText}
155
155
  </span>
156
156
  {#if attributes.maxlength}
@@ -1,4 +1,4 @@
1
1
  import type { TextFieldProps } from './types.ts';
2
- declare const TextField: import("svelte").Component<TextFieldProps, {}, "element" | "value" | "inputElement" | "clientWidth" | "clientHeight" | "focused">;
2
+ declare const TextField: import("svelte").Component<TextFieldProps, {}, "value" | "element" | "inputElement" | "clientWidth" | "clientHeight" | "focused">;
3
3
  type TextField = ReturnType<typeof TextField>;
4
4
  export default TextField;
@@ -1,7 +1,7 @@
1
1
  <script lang="ts">
2
2
  import { on } from 'svelte/events'
3
3
  import { MediaQuery } from 'svelte/reactivity'
4
- import type { TooltipProps } from './types.ts'
4
+ import type { TooltipProps } from './types.js'
5
5
 
6
6
  let {
7
7
  children,
package/dist/types.d.ts CHANGED
@@ -3,9 +3,11 @@ export * from './button/types.ts';
3
3
  export * from './card/types.ts';
4
4
  export * from './checkbox/types.ts';
5
5
  export * from './chip/types.ts';
6
+ export * from './date-picker/types.ts';
6
7
  export * from './dialog/types.ts';
7
8
  export * from './divider/types.ts';
8
9
  export * from './list/types.ts';
10
+ export * from './loading-indicator/types.ts';
9
11
  export * from './menu/types.ts';
10
12
  export * from './navigation-drawer/types.ts';
11
13
  export * from './navigation-rail/types.ts';
package/dist/types.js CHANGED
@@ -1,21 +1,23 @@
1
- export * from './autocomplete/types.ts';
2
- export * from './button/types.ts';
3
- export * from './card/types.ts';
4
- export * from './checkbox/types.ts';
5
- export * from './chip/types.ts';
6
- export * from './dialog/types.ts';
7
- export * from './divider/types.ts';
8
- export * from './list/types.ts';
9
- export * from './menu/types.ts';
10
- export * from './navigation-drawer/types.ts';
11
- export * from './navigation-rail/types.ts';
12
- export * from './progress/types.ts';
13
- export * from './radio/types.ts';
14
- export * from './ripple/types.ts';
15
- export * from './select/types.ts';
16
- export * from './slider/types.ts';
17
- export * from './snackbar/types.ts';
18
- export * from './switch/types.ts';
19
- export * from './text-field/types.ts';
20
- export * from './tooltip/types.ts';
21
- export * from './tabs/types.ts';
1
+ export * from "./autocomplete/types.js";
2
+ export * from "./button/types.js";
3
+ export * from "./card/types.js";
4
+ export * from "./checkbox/types.js";
5
+ export * from "./chip/types.js";
6
+ export * from "./date-picker/types.js";
7
+ export * from "./dialog/types.js";
8
+ export * from "./divider/types.js";
9
+ export * from "./list/types.js";
10
+ export * from "./loading-indicator/types.js";
11
+ export * from "./menu/types.js";
12
+ export * from "./navigation-drawer/types.js";
13
+ export * from "./navigation-rail/types.js";
14
+ export * from "./progress/types.js";
15
+ export * from "./radio/types.js";
16
+ export * from "./ripple/types.js";
17
+ export * from "./select/types.js";
18
+ export * from "./slider/types.js";
19
+ export * from "./snackbar/types.js";
20
+ export * from "./switch/types.js";
21
+ export * from "./text-field/types.js";
22
+ export * from "./tooltip/types.js";
23
+ export * from "./tabs/types.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "noph-ui",
3
- "version": "0.35.0",
3
+ "version": "0.37.0",
4
4
  "license": "MIT",
5
5
  "homepage": "https://noph.dev",
6
6
  "repository": {
@@ -31,17 +31,17 @@
31
31
  ],
32
32
  "scripts": {
33
33
  "dev": "vite dev",
34
- "build": "vite build && npm run package",
34
+ "build": "vite build && npm run prepack",
35
35
  "preview": "vite preview",
36
- "package": "svelte-kit sync && svelte-package && publint",
37
- "prepublishOnly": "npm run package",
38
- "test": "npm run test:integration && npm run test:unit",
36
+ "prepare": "svelte-kit sync || echo ''",
37
+ "prepack": "svelte-kit sync && svelte-package && publint",
39
38
  "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
40
39
  "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
41
40
  "lint": "prettier --check . && eslint .",
42
41
  "format": "prettier --write .",
43
- "test:integration": "playwright test",
44
- "test:unit": "vitest"
42
+ "test:unit": "vitest",
43
+ "test": "npm run test:unit -- --run && npm run test:e2e",
44
+ "test:e2e": "playwright install && playwright test"
45
45
  },
46
46
  "exports": {
47
47
  ".": {
@@ -77,14 +77,16 @@
77
77
  "@materialx/material-color-utilities": "^0.4.8",
78
78
  "@playwright/test": "^1.62.1",
79
79
  "@sveltejs/adapter-vercel": "7.0.0-next.6",
80
- "@sveltejs/kit": "3.0.0-next.11",
81
- "@sveltejs/package": "3.0.0-next.3",
80
+ "@sveltejs/kit": "3.0.0-next.23",
81
+ "@sveltejs/package": "3.0.0-next.7",
82
82
  "@sveltejs/vite-plugin-svelte": "7.3.0",
83
- "@types/eslint": "^9.6.1",
83
+ "@types/node": "^24",
84
+ "@vitest/browser-playwright": "^4.1.10",
84
85
  "eslint": "^10.8.1",
85
86
  "eslint-config-prettier": "^10.1.8",
86
87
  "eslint-plugin-svelte": "^3.22.0",
87
88
  "globals": "^17.9.0",
89
+ "playwright": "^1.62.1",
88
90
  "prettier": "^3.9.6",
89
91
  "prettier-plugin-svelte": "^4.1.1",
90
92
  "publint": "^0.3.23",
@@ -93,7 +95,8 @@
93
95
  "typescript": "^6.0.3",
94
96
  "typescript-eslint": "^8.66.0",
95
97
  "vite": "8.2.1",
96
- "vitest": "^4.1.10"
98
+ "vitest": "^4.1.10",
99
+ "vitest-browser-svelte": "^2.1.1"
97
100
  },
98
101
  "svelte": "./dist/index.js",
99
102
  "types": "./dist/index.d.ts",