@14ch/svelte-ui 0.0.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.
Files changed (109) hide show
  1. package/README.md +359 -0
  2. package/dist/assets/styles/README.md +144 -0
  3. package/dist/assets/styles/core.scss +61 -0
  4. package/dist/assets/styles/import.scss +11 -0
  5. package/dist/assets/styles/optional/fonts.scss +23 -0
  6. package/dist/assets/styles/optional/reset.scss +230 -0
  7. package/dist/assets/styles/variables.scss +805 -0
  8. package/dist/components/Button.svelte +574 -0
  9. package/dist/components/Button.svelte.d.ts +56 -0
  10. package/dist/components/COMPONENT_DESIGN_GUIDELINES.md +127 -0
  11. package/dist/components/Checkbox.svelte +523 -0
  12. package/dist/components/Checkbox.svelte.d.ts +42 -0
  13. package/dist/components/CheckboxGroup.svelte +82 -0
  14. package/dist/components/CheckboxGroup.svelte.d.ts +13 -0
  15. package/dist/components/ColorPicker.svelte +496 -0
  16. package/dist/components/ColorPicker.svelte.d.ts +45 -0
  17. package/dist/components/Combobox.svelte +576 -0
  18. package/dist/components/Combobox.svelte.d.ts +52 -0
  19. package/dist/components/ConfirmDialog.svelte +116 -0
  20. package/dist/components/ConfirmDialog.svelte.d.ts +20 -0
  21. package/dist/components/Datepicker.svelte +578 -0
  22. package/dist/components/Datepicker.svelte.d.ts +72 -0
  23. package/dist/components/DatepickerCalendar.svelte +925 -0
  24. package/dist/components/DatepickerCalendar.svelte.d.ts +31 -0
  25. package/dist/components/Dialog.svelte +245 -0
  26. package/dist/components/Dialog.svelte.d.ts +38 -0
  27. package/dist/components/Drawer.svelte +383 -0
  28. package/dist/components/Drawer.svelte.d.ts +39 -0
  29. package/dist/components/Fab.svelte +486 -0
  30. package/dist/components/Fab.svelte.d.ts +51 -0
  31. package/dist/components/FileUploader.svelte +456 -0
  32. package/dist/components/FileUploader.svelte.d.ts +36 -0
  33. package/dist/components/Icon.svelte +167 -0
  34. package/dist/components/Icon.svelte.d.ts +21 -0
  35. package/dist/components/IconButton.svelte +557 -0
  36. package/dist/components/IconButton.svelte.d.ts +60 -0
  37. package/dist/components/ImageUploader.svelte +516 -0
  38. package/dist/components/ImageUploader.svelte.d.ts +37 -0
  39. package/dist/components/ImageUploaderPreview.svelte +157 -0
  40. package/dist/components/ImageUploaderPreview.svelte.d.ts +13 -0
  41. package/dist/components/Input.svelte +885 -0
  42. package/dist/components/Input.svelte.d.ts +75 -0
  43. package/dist/components/LoadingSpinner.svelte +116 -0
  44. package/dist/components/LoadingSpinner.svelte.d.ts +10 -0
  45. package/dist/components/Modal.svelte +313 -0
  46. package/dist/components/Modal.svelte.d.ts +34 -0
  47. package/dist/components/Pagination.svelte +276 -0
  48. package/dist/components/Pagination.svelte.d.ts +14 -0
  49. package/dist/components/Popup.svelte +676 -0
  50. package/dist/components/Popup.svelte.d.ts +40 -0
  51. package/dist/components/PopupMenu.svelte +421 -0
  52. package/dist/components/PopupMenu.svelte.d.ts +24 -0
  53. package/dist/components/PopupMenuButton.svelte +365 -0
  54. package/dist/components/PopupMenuButton.svelte.d.ts +42 -0
  55. package/dist/components/Radio.svelte +548 -0
  56. package/dist/components/Radio.svelte.d.ts +42 -0
  57. package/dist/components/RadioGroup.svelte +74 -0
  58. package/dist/components/RadioGroup.svelte.d.ts +14 -0
  59. package/dist/components/Select.svelte +479 -0
  60. package/dist/components/Select.svelte.d.ts +47 -0
  61. package/dist/components/Slider.svelte +473 -0
  62. package/dist/components/Slider.svelte.d.ts +46 -0
  63. package/dist/components/Snackbar.svelte +124 -0
  64. package/dist/components/Snackbar.svelte.d.ts +9 -0
  65. package/dist/components/SnackbarItem.svelte +423 -0
  66. package/dist/components/SnackbarItem.svelte.d.ts +21 -0
  67. package/dist/components/Switch.svelte +454 -0
  68. package/dist/components/Switch.svelte.d.ts +40 -0
  69. package/dist/components/Tab.svelte +193 -0
  70. package/dist/components/Tab.svelte.d.ts +14 -0
  71. package/dist/components/TabItem.svelte +140 -0
  72. package/dist/components/TabItem.svelte.d.ts +17 -0
  73. package/dist/components/Textarea.svelte +702 -0
  74. package/dist/components/Textarea.svelte.d.ts +64 -0
  75. package/dist/components/skeleton/Skeleton.svelte +235 -0
  76. package/dist/components/skeleton/Skeleton.svelte.d.ts +13 -0
  77. package/dist/components/skeleton/SkeletonAvatar.svelte +97 -0
  78. package/dist/components/skeleton/SkeletonAvatar.svelte.d.ts +8 -0
  79. package/dist/components/skeleton/SkeletonBox.svelte +105 -0
  80. package/dist/components/skeleton/SkeletonBox.svelte.d.ts +12 -0
  81. package/dist/components/skeleton/SkeletonButton.svelte +71 -0
  82. package/dist/components/skeleton/SkeletonButton.svelte.d.ts +8 -0
  83. package/dist/components/skeleton/SkeletonHeading.svelte +49 -0
  84. package/dist/components/skeleton/SkeletonHeading.svelte.d.ts +8 -0
  85. package/dist/components/skeleton/SkeletonMedia.svelte +115 -0
  86. package/dist/components/skeleton/SkeletonMedia.svelte.d.ts +9 -0
  87. package/dist/components/skeleton/SkeletonText.svelte +75 -0
  88. package/dist/components/skeleton/SkeletonText.svelte.d.ts +8 -0
  89. package/dist/index.d.ts +42 -0
  90. package/dist/index.js +43 -0
  91. package/dist/types/icon.d.ts +4 -0
  92. package/dist/types/icon.js +2 -0
  93. package/dist/types/menuItem.d.ts +8 -0
  94. package/dist/types/menuItem.js +1 -0
  95. package/dist/types/options.d.ts +6 -0
  96. package/dist/types/options.js +4 -0
  97. package/dist/types/skeleton.d.ts +77 -0
  98. package/dist/types/skeleton.js +19 -0
  99. package/dist/utils/accessibility.d.ts +48 -0
  100. package/dist/utils/accessibility.js +87 -0
  101. package/dist/utils/formatText.d.ts +4 -0
  102. package/dist/utils/formatText.js +44 -0
  103. package/dist/utils/mobile.d.ts +9 -0
  104. package/dist/utils/mobile.js +47 -0
  105. package/dist/utils/snackbar.svelte.d.ts +51 -0
  106. package/dist/utils/snackbar.svelte.js +107 -0
  107. package/dist/utils/style.d.ts +17 -0
  108. package/dist/utils/style.js +22 -0
  109. package/package.json +102 -0
@@ -0,0 +1,473 @@
1
+ <!-- Slider.svelte -->
2
+
3
+ <script lang="ts">
4
+ import type { HTMLInputAttributes } from 'svelte/elements';
5
+ import { getStyleFromNumber } from '../utils/style';
6
+
7
+ // =========================================================================
8
+ // Props, States & Constants
9
+ // =========================================================================
10
+ let {
11
+ // 基本プロパティ
12
+ value = $bindable(0),
13
+ name,
14
+ id = `slider-${Math.random().toString(36).substring(2, 15)}`,
15
+
16
+ // HTML属性系
17
+ min = 0,
18
+ max = 100,
19
+ step = 1,
20
+ inputAttributes,
21
+
22
+ // スタイル/レイアウト
23
+ width = null,
24
+ fullWidth = false,
25
+ thumbColor = null,
26
+ thumbWidth = null,
27
+ thumbHeight = null,
28
+ customStyle = '',
29
+
30
+ // 状態/動作
31
+ disabled = false,
32
+
33
+ // フォーカスイベント
34
+ onfocus = () => {}, // No params for type inference
35
+ onblur = () => {}, // No params for type inference
36
+
37
+ // キーボードイベント
38
+ onkeydown = () => {}, // No params for type inference
39
+ onkeyup = () => {}, // No params for type inference
40
+
41
+ // マウスイベント
42
+ onclick = () => {}, // No params for type inference
43
+ onmousedown = () => {}, // No params for type inference
44
+ onmouseup = () => {}, // No params for type inference
45
+ onmouseenter = () => {}, // No params for type inference
46
+ onmouseleave = () => {}, // No params for type inference
47
+ onmouseover = () => {}, // No params for type inference
48
+ onmouseout = () => {}, // No params for type inference
49
+ oncontextmenu = () => {}, // No params for type inference
50
+ onauxclick = () => {}, // No params for type inference
51
+
52
+ // タッチイベント
53
+ ontouchstart = () => {}, // No params for type inference
54
+ ontouchend = () => {}, // No params for type inference
55
+ ontouchmove = () => {}, // No params for type inference
56
+ ontouchcancel = () => {}, // No params for type inference
57
+
58
+ // ポインターイベント
59
+ onpointerdown = () => {}, // No params for type inference
60
+ onpointerup = () => {}, // No params for type inference
61
+ onpointerenter = () => {}, // No params for type inference
62
+ onpointerleave = () => {}, // No params for type inference
63
+ onpointermove = () => {}, // No params for type inference
64
+ onpointercancel = () => {}, // No params for type inference
65
+
66
+ // 入力イベント
67
+ onchange = () => {}, // No params for type inference
68
+ oninput = () => {}, // No params for type inference
69
+
70
+ // その他
71
+ ...restProps
72
+ }: {
73
+ // 基本プロパティ
74
+ value?: number;
75
+ name?: string;
76
+ id?: string;
77
+
78
+ // HTML属性系
79
+ min?: number;
80
+ max?: number;
81
+ step?: number;
82
+ inputAttributes?: HTMLInputAttributes | undefined;
83
+
84
+ // スタイル/レイアウト
85
+ width?: string | number | null;
86
+ fullWidth?: boolean;
87
+ thumbColor?: string | null;
88
+ thumbWidth?: string | number | null;
89
+ thumbHeight?: string | number | null;
90
+ customStyle?: string;
91
+
92
+ // 状態/動作
93
+ disabled?: boolean;
94
+
95
+ // フォーカスイベント
96
+ onfocus?: Function; // No params for type inference
97
+ onblur?: Function; // No params for type inference
98
+
99
+ // キーボードイベント
100
+ onkeydown?: Function; // No params for type inference
101
+ onkeyup?: Function; // No params for type inference
102
+
103
+ // マウスイベント
104
+ onclick?: Function; // No params for type inference
105
+ onmousedown?: Function; // No params for type inference
106
+ onmouseup?: Function; // No params for type inference
107
+ onmouseenter?: Function; // No params for type inference
108
+ onmouseleave?: Function; // No params for type inference
109
+ onmouseover?: Function; // No params for type inference
110
+ onmouseout?: Function; // No params for type inference
111
+ oncontextmenu?: Function; // No params for type inference
112
+ onauxclick?: Function; // No params for type inference
113
+
114
+ // タッチイベント
115
+ ontouchstart?: Function; // No params for type inference
116
+ ontouchend?: Function; // No params for type inference
117
+ ontouchmove?: Function; // No params for type inference
118
+ ontouchcancel?: Function; // No params for type inference
119
+
120
+ // ポインターイベント
121
+ onpointerdown?: Function; // No params for type inference
122
+ onpointerup?: Function; // No params for type inference
123
+ onpointerenter?: Function; // No params for type inference
124
+ onpointerleave?: Function; // No params for type inference
125
+ onpointermove?: Function; // No params for type inference
126
+ onpointercancel?: Function; // No params for type inference
127
+
128
+ // 入力イベント
129
+ onchange?: Function; // No params for type inference
130
+ oninput?: Function; // No params for type inference
131
+
132
+ // その他
133
+ [key: string]: any;
134
+ } = $props();
135
+
136
+ let ref: HTMLInputElement | undefined = $state();
137
+ let isFocused: boolean = $state(false);
138
+
139
+ // =========================================================================
140
+ // Methods
141
+ // =========================================================================
142
+
143
+ // フォーカスイベント
144
+ const handleFocus = (event: FocusEvent): void => {
145
+ if (disabled) return;
146
+ isFocused = true;
147
+ onfocus(event);
148
+ };
149
+
150
+ const handleBlur = (event: FocusEvent): void => {
151
+ if (disabled) return;
152
+ isFocused = false;
153
+ onblur(event);
154
+ };
155
+
156
+ // キーボードイベント
157
+ const handleKeydown = (event: KeyboardEvent): void => {
158
+ if (disabled) return;
159
+ onkeydown(event);
160
+ };
161
+
162
+ const handleKeyup = (event: KeyboardEvent): void => {
163
+ if (disabled) return;
164
+ onkeyup(event);
165
+ };
166
+
167
+ // マウスイベント
168
+ const handleClick = (event: MouseEvent) => {
169
+ if (disabled) return;
170
+ onclick?.(event);
171
+ };
172
+
173
+ const handleMouseDown = (event: MouseEvent) => {
174
+ if (disabled) return;
175
+ onmousedown?.(event);
176
+ };
177
+
178
+ const handleMouseUp = (event: MouseEvent) => {
179
+ if (disabled) return;
180
+ onmouseup?.(event);
181
+ };
182
+
183
+ const handleMouseEnter = (event: MouseEvent) => {
184
+ if (disabled) return;
185
+ onmouseenter?.(event);
186
+ };
187
+
188
+ const handleMouseLeave = (event: MouseEvent) => {
189
+ if (disabled) return;
190
+ onmouseleave?.(event);
191
+ };
192
+
193
+ const handleMouseOver = (event: MouseEvent) => {
194
+ if (disabled) return;
195
+ onmouseover?.(event);
196
+ };
197
+
198
+ const handleMouseOut = (event: MouseEvent) => {
199
+ if (disabled) return;
200
+ onmouseout?.(event);
201
+ };
202
+
203
+ const handleContextMenu = (event: MouseEvent) => {
204
+ if (disabled) return;
205
+ oncontextmenu?.(event);
206
+ };
207
+
208
+ const handleAuxClick = (event: MouseEvent) => {
209
+ if (disabled) return;
210
+ onauxclick?.(event);
211
+ };
212
+
213
+ // タッチイベント
214
+ const handleTouchStart = (event: TouchEvent) => {
215
+ if (disabled) return;
216
+ ontouchstart?.(event);
217
+ };
218
+
219
+ const handleTouchEnd = (event: TouchEvent) => {
220
+ if (disabled) return;
221
+ ontouchend?.(event);
222
+ };
223
+
224
+ const handleTouchMove = (event: TouchEvent) => {
225
+ if (disabled) return;
226
+ ontouchmove?.(event);
227
+ };
228
+
229
+ const handleTouchCancel = (event: TouchEvent) => {
230
+ if (disabled) return;
231
+ ontouchcancel?.(event);
232
+ };
233
+
234
+ // ポインターイベント
235
+ const handlePointerDown = (event: PointerEvent) => {
236
+ if (disabled) return;
237
+ onpointerdown?.(event);
238
+ };
239
+
240
+ const handlePointerUp = (event: PointerEvent) => {
241
+ if (disabled) return;
242
+ onpointerup?.(event);
243
+ };
244
+
245
+ const handlePointerEnter = (event: PointerEvent) => {
246
+ if (disabled) return;
247
+ onpointerenter?.(event);
248
+ };
249
+
250
+ const handlePointerLeave = (event: PointerEvent) => {
251
+ if (disabled) return;
252
+ onpointerleave?.(event);
253
+ };
254
+
255
+ const handlePointerMove = (event: PointerEvent) => {
256
+ if (disabled) return;
257
+ onpointermove?.(event);
258
+ };
259
+
260
+ const handlePointerCancel = (event: PointerEvent) => {
261
+ if (disabled) return;
262
+ onpointercancel?.(event);
263
+ };
264
+
265
+ // 入力イベント
266
+ const handleChange = (event?: Event): void => {
267
+ if (disabled) return;
268
+ onchange?.(value);
269
+ };
270
+
271
+ const handleInput = (event?: Event): void => {
272
+ if (disabled) return;
273
+ oninput?.(value);
274
+ };
275
+
276
+ // パーセンテージ計算
277
+ const percentage = $derived(((value - min) / (max - min)) * 100);
278
+
279
+ // スタイル計算
280
+ const thumbColorStyle = $derived(
281
+ thumbColor ? `--svelte-ui-slider-thumb-background: ${thumbColor};` : ''
282
+ );
283
+
284
+ const thumbWidthStyle = $derived(
285
+ thumbWidth ? `--svelte-ui-slider-thumb-width: ${getStyleFromNumber(thumbWidth)};` : ''
286
+ );
287
+
288
+ const thumbHeightStyle = $derived(
289
+ thumbHeight ? `--svelte-ui-slider-thumb-height: ${getStyleFromNumber(thumbHeight)};` : ''
290
+ );
291
+
292
+ const sliderWidthStyle = $derived(width ? `width: ${getStyleFromNumber(width)};` : '');
293
+
294
+ const sliderHeightStyle = $derived(
295
+ thumbHeight
296
+ ? `height: ${getStyleFromNumber(thumbHeight)};`
297
+ : 'height: var(--svelte-ui-slider-thumb-height);'
298
+ );
299
+ </script>
300
+
301
+ <div
302
+ class="slider"
303
+ class:slider--full-width={fullWidth}
304
+ class:slider--disabled={disabled}
305
+ class:slider--focused={isFocused}
306
+ data-testid="slider"
307
+ style="{sliderWidthStyle} {sliderHeightStyle} {thumbColorStyle} {thumbWidthStyle} {thumbHeightStyle} {customStyle}"
308
+ >
309
+ <input
310
+ {id}
311
+ {name}
312
+ bind:this={ref}
313
+ bind:value
314
+ type="range"
315
+ {min}
316
+ {max}
317
+ {step}
318
+ {disabled}
319
+ class="slider__input"
320
+ onchange={handleChange}
321
+ oninput={handleInput}
322
+ onfocus={handleFocus}
323
+ onblur={handleBlur}
324
+ onclick={handleClick}
325
+ onkeydown={handleKeydown}
326
+ onkeyup={handleKeyup}
327
+ onmousedown={handleMouseDown}
328
+ onmouseup={handleMouseUp}
329
+ onmouseenter={handleMouseEnter}
330
+ onmouseleave={handleMouseLeave}
331
+ onmouseover={handleMouseOver}
332
+ onmouseout={handleMouseOut}
333
+ oncontextmenu={handleContextMenu}
334
+ onauxclick={handleAuxClick}
335
+ ontouchstart={handleTouchStart}
336
+ ontouchend={handleTouchEnd}
337
+ ontouchmove={handleTouchMove}
338
+ ontouchcancel={handleTouchCancel}
339
+ onpointerdown={handlePointerDown}
340
+ onpointerup={handlePointerUp}
341
+ onpointerenter={handlePointerEnter}
342
+ onpointerleave={handlePointerLeave}
343
+ onpointermove={handlePointerMove}
344
+ onpointercancel={handlePointerCancel}
345
+ {...inputAttributes}
346
+ {...restProps}
347
+ />
348
+ </div>
349
+
350
+ <style>
351
+ /* =============================================
352
+ * 基本構造・レイアウト
353
+ * ============================================= */
354
+ .slider {
355
+ display: flex;
356
+ align-items: center;
357
+ position: relative;
358
+ width: auto;
359
+ max-width: 100%;
360
+ box-sizing: border-box;
361
+ line-height: 0;
362
+ }
363
+
364
+ .slider--full-width {
365
+ width: 100%;
366
+ }
367
+
368
+ /* =============================================
369
+ * 基本コンポーネント
370
+ * ============================================= */
371
+ .slider__input {
372
+ width: 100%;
373
+ height: var(--svelte-ui-slider-track-height);
374
+ margin: 0;
375
+ background: var(--svelte-ui-slider-track-background);
376
+ border-radius: var(--svelte-ui-slider-track-border-radius);
377
+ outline: none;
378
+ -webkit-appearance: none;
379
+ appearance: none;
380
+ cursor: pointer;
381
+ }
382
+
383
+ /* Track styles */
384
+ .slider__input::-webkit-slider-track {
385
+ width: 100%;
386
+ height: var(--svelte-ui-slider-track-height);
387
+ background: var(--svelte-ui-slider-track-background);
388
+ border-radius: var(--svelte-ui-slider-track-border-radius);
389
+ border: none;
390
+ }
391
+
392
+ .slider__input::-moz-range-track {
393
+ width: 100%;
394
+ height: var(--svelte-ui-slider-track-height);
395
+ background: var(--svelte-ui-slider-track-background);
396
+ border-radius: var(--svelte-ui-slider-track-border-radius);
397
+ border: none;
398
+ }
399
+
400
+ /* Thumb styles */
401
+ .slider__input::-webkit-slider-thumb {
402
+ -webkit-appearance: none;
403
+ appearance: none;
404
+ width: var(--svelte-ui-slider-thumb-width);
405
+ height: var(--svelte-ui-slider-thumb-height);
406
+ background: var(--svelte-ui-slider-thumb-background);
407
+ border-radius: var(--svelte-ui-slider-thumb-border-radius);
408
+ border: var(--svelte-ui-slider-thumb-border);
409
+ cursor: pointer;
410
+ box-shadow: var(--svelte-ui-slider-thumb-shadow);
411
+ }
412
+
413
+ .slider__input::-moz-range-thumb {
414
+ width: var(--svelte-ui-slider-thumb-width);
415
+ height: var(--svelte-ui-slider-thumb-height);
416
+ background: var(--svelte-ui-slider-thumb-background);
417
+ border-radius: var(--svelte-ui-slider-thumb-border-radius);
418
+ border: var(--svelte-ui-slider-thumb-border);
419
+ cursor: pointer;
420
+ box-shadow: var(--svelte-ui-slider-thumb-shadow);
421
+ }
422
+
423
+ /* Focus styles - focus-visibleでキーボードナビゲーション時のみ */
424
+ .slider__input:focus-visible::-webkit-slider-thumb {
425
+ outline: var(--svelte-ui-focus-outline-outer);
426
+ outline-offset: var(--svelte-ui-focus-outline-offset-outer);
427
+ }
428
+
429
+ .slider__input:focus-visible::-moz-range-thumb {
430
+ outline: var(--svelte-ui-focus-outline-outer);
431
+ outline-offset: var(--svelte-ui-focus-outline-offset-outer);
432
+ }
433
+
434
+ /* =============================================
435
+ * 状態管理(disabled等)
436
+ * ============================================= */
437
+ .slider--disabled {
438
+ opacity: var(--svelte-ui-input-disabled-opacity);
439
+ pointer-events: none;
440
+ }
441
+
442
+ .slider--disabled .slider__input {
443
+ cursor: not-allowed;
444
+ }
445
+
446
+ .slider--disabled .slider__input::-webkit-slider-thumb {
447
+ cursor: not-allowed;
448
+ }
449
+
450
+ .slider--disabled .slider__input::-moz-range-thumb {
451
+ cursor: not-allowed;
452
+ }
453
+
454
+ /* =============================================
455
+ * レスポンシブ対応
456
+ * ============================================= */
457
+ @media (max-width: 768px) {
458
+ .slider__input::-webkit-slider-thumb {
459
+ width: var(--svelte-ui-slider-thumb-width-mobile);
460
+ height: var(--svelte-ui-slider-thumb-height-mobile);
461
+ }
462
+
463
+ .slider__input::-moz-range-thumb {
464
+ width: var(--svelte-ui-slider-thumb-width-mobile);
465
+ height: var(--svelte-ui-slider-thumb-height-mobile);
466
+ }
467
+
468
+ :global(.slider__custom-thumb) {
469
+ width: var(--svelte-ui-slider-custom-thumb-size-mobile);
470
+ height: var(--svelte-ui-slider-custom-thumb-size-mobile);
471
+ }
472
+ }
473
+ </style>
@@ -0,0 +1,46 @@
1
+ import type { HTMLInputAttributes } from 'svelte/elements';
2
+ type $$ComponentProps = {
3
+ value?: number;
4
+ name?: string;
5
+ id?: string;
6
+ min?: number;
7
+ max?: number;
8
+ step?: number;
9
+ inputAttributes?: HTMLInputAttributes | undefined;
10
+ width?: string | number | null;
11
+ fullWidth?: boolean;
12
+ thumbColor?: string | null;
13
+ thumbWidth?: string | number | null;
14
+ thumbHeight?: string | number | null;
15
+ customStyle?: string;
16
+ disabled?: boolean;
17
+ onfocus?: Function;
18
+ onblur?: Function;
19
+ onkeydown?: Function;
20
+ onkeyup?: Function;
21
+ onclick?: Function;
22
+ onmousedown?: Function;
23
+ onmouseup?: Function;
24
+ onmouseenter?: Function;
25
+ onmouseleave?: Function;
26
+ onmouseover?: Function;
27
+ onmouseout?: Function;
28
+ oncontextmenu?: Function;
29
+ onauxclick?: Function;
30
+ ontouchstart?: Function;
31
+ ontouchend?: Function;
32
+ ontouchmove?: Function;
33
+ ontouchcancel?: Function;
34
+ onpointerdown?: Function;
35
+ onpointerup?: Function;
36
+ onpointerenter?: Function;
37
+ onpointerleave?: Function;
38
+ onpointermove?: Function;
39
+ onpointercancel?: Function;
40
+ onchange?: Function;
41
+ oninput?: Function;
42
+ [key: string]: any;
43
+ };
44
+ declare const Slider: import("svelte").Component<$$ComponentProps, {}, "value">;
45
+ type Slider = ReturnType<typeof Slider>;
46
+ export default Slider;
@@ -0,0 +1,124 @@
1
+ <!-- Snackbar.svelte -->
2
+
3
+ <script lang="ts">
4
+ import { onMount } from 'svelte';
5
+ import { snackbarManager, type SnackbarItem as SnackbarData } from '../utils/snackbar.svelte';
6
+ import SnackbarItem from './SnackbarItem.svelte';
7
+
8
+ // =========================================================================
9
+ // Props, States & Constants
10
+ // =========================================================================
11
+
12
+ let {
13
+ // スタイル/レイアウト
14
+ position = 'bottom',
15
+ maxVisible = 5,
16
+ variant = 'filled',
17
+
18
+ // 状態/動作
19
+ duration = 3000
20
+ }: {
21
+ // スタイル/レイアウト
22
+ position?: 'top' | 'bottom';
23
+ maxVisible?: number;
24
+ variant?: 'filled' | 'outlined';
25
+
26
+ // 状態/動作
27
+ duration?: number;
28
+ } = $props();
29
+
30
+ // =========================================================================
31
+ // Lifecycle
32
+ // =========================================================================
33
+
34
+ onMount(() => {
35
+ snackbarManager.setDefaults({
36
+ position,
37
+ maxVisible,
38
+ defaultDuration: duration,
39
+ defaultVariant: variant
40
+ });
41
+ });
42
+
43
+ // =========================================================================
44
+ // $derived
45
+ // =========================================================================
46
+
47
+ let topItems: SnackbarData[] = $derived(
48
+ snackbarManager.items.filter((item) => item.position === 'top')
49
+ );
50
+ let bottomItems: SnackbarData[] = $derived(
51
+ snackbarManager.items.filter((item) => item.position === 'bottom')
52
+ );
53
+ </script>
54
+
55
+ {#snippet snackbarItemSnippet(item: SnackbarData, index: number)}
56
+ <div class="snackbar__item" style="z-index: {1000 + index};">
57
+ <SnackbarItem
58
+ children={item.children}
59
+ message={item.message}
60
+ type={item.type}
61
+ actionLabel={item.actionLabel}
62
+ id={item.id}
63
+ variant={item.variant}
64
+ position={item.position}
65
+ iconVariant="outlined"
66
+ color={item.color}
67
+ textColor={item.textColor}
68
+ duration={item.duration}
69
+ closable={item.closable}
70
+ onAction={item.onAction}
71
+ />
72
+ </div>
73
+ {/snippet}
74
+
75
+ <!-- Snackbar Top Items -->
76
+ {#if topItems.length > 0}
77
+ <div class="snackbar snackbar--top" data-testid="snackbar">
78
+ {#each topItems as item, index (item.id)}
79
+ {@render snackbarItemSnippet(item, index)}
80
+ {/each}
81
+ </div>
82
+ {/if}
83
+
84
+ <!-- Snackbar Bottom Items -->
85
+ {#if bottomItems.length > 0}
86
+ <div class="snackbar snackbar--bottom" data-testid="snackbar">
87
+ {#each bottomItems as item, index (item.id)}
88
+ {@render snackbarItemSnippet(item, index)}
89
+ {/each}
90
+ </div>
91
+ {/if}
92
+
93
+ <style>
94
+ .snackbar {
95
+ position: fixed;
96
+ left: 50%;
97
+ transform: translateX(-50%);
98
+ width: max-content;
99
+ max-width: 90vw;
100
+ pointer-events: none;
101
+ z-index: var(--svelte-ui-snackbar-z-index, 1000);
102
+ display: flex;
103
+ flex-direction: column;
104
+ gap: 0;
105
+ }
106
+
107
+ .snackbar--top {
108
+ top: calc(var(--svelte-ui-snackbar-offset) - var(--svelte-ui-snackbar-item-space));
109
+ }
110
+
111
+ .snackbar--bottom {
112
+ bottom: calc(var(--svelte-ui-snackbar-offset) - var(--svelte-ui-snackbar-item-space));
113
+ flex-direction: column-reverse;
114
+ }
115
+
116
+ .snackbar__item {
117
+ pointer-events: auto;
118
+ position: relative;
119
+ }
120
+
121
+ .snackbar__item :global(.snackbar-item__content) {
122
+ margin-bottom: 0;
123
+ }
124
+ </style>
@@ -0,0 +1,9 @@
1
+ type $$ComponentProps = {
2
+ position?: 'top' | 'bottom';
3
+ maxVisible?: number;
4
+ variant?: 'filled' | 'outlined';
5
+ duration?: number;
6
+ };
7
+ declare const Snackbar: import("svelte").Component<$$ComponentProps, {}, "">;
8
+ type Snackbar = ReturnType<typeof Snackbar>;
9
+ export default Snackbar;