@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.
- package/README.md +359 -0
- package/dist/assets/styles/README.md +144 -0
- package/dist/assets/styles/core.scss +61 -0
- package/dist/assets/styles/import.scss +11 -0
- package/dist/assets/styles/optional/fonts.scss +23 -0
- package/dist/assets/styles/optional/reset.scss +230 -0
- package/dist/assets/styles/variables.scss +805 -0
- package/dist/components/Button.svelte +574 -0
- package/dist/components/Button.svelte.d.ts +56 -0
- package/dist/components/COMPONENT_DESIGN_GUIDELINES.md +127 -0
- package/dist/components/Checkbox.svelte +523 -0
- package/dist/components/Checkbox.svelte.d.ts +42 -0
- package/dist/components/CheckboxGroup.svelte +82 -0
- package/dist/components/CheckboxGroup.svelte.d.ts +13 -0
- package/dist/components/ColorPicker.svelte +496 -0
- package/dist/components/ColorPicker.svelte.d.ts +45 -0
- package/dist/components/Combobox.svelte +576 -0
- package/dist/components/Combobox.svelte.d.ts +52 -0
- package/dist/components/ConfirmDialog.svelte +116 -0
- package/dist/components/ConfirmDialog.svelte.d.ts +20 -0
- package/dist/components/Datepicker.svelte +578 -0
- package/dist/components/Datepicker.svelte.d.ts +72 -0
- package/dist/components/DatepickerCalendar.svelte +925 -0
- package/dist/components/DatepickerCalendar.svelte.d.ts +31 -0
- package/dist/components/Dialog.svelte +245 -0
- package/dist/components/Dialog.svelte.d.ts +38 -0
- package/dist/components/Drawer.svelte +383 -0
- package/dist/components/Drawer.svelte.d.ts +39 -0
- package/dist/components/Fab.svelte +486 -0
- package/dist/components/Fab.svelte.d.ts +51 -0
- package/dist/components/FileUploader.svelte +456 -0
- package/dist/components/FileUploader.svelte.d.ts +36 -0
- package/dist/components/Icon.svelte +167 -0
- package/dist/components/Icon.svelte.d.ts +21 -0
- package/dist/components/IconButton.svelte +557 -0
- package/dist/components/IconButton.svelte.d.ts +60 -0
- package/dist/components/ImageUploader.svelte +516 -0
- package/dist/components/ImageUploader.svelte.d.ts +37 -0
- package/dist/components/ImageUploaderPreview.svelte +157 -0
- package/dist/components/ImageUploaderPreview.svelte.d.ts +13 -0
- package/dist/components/Input.svelte +885 -0
- package/dist/components/Input.svelte.d.ts +75 -0
- package/dist/components/LoadingSpinner.svelte +116 -0
- package/dist/components/LoadingSpinner.svelte.d.ts +10 -0
- package/dist/components/Modal.svelte +313 -0
- package/dist/components/Modal.svelte.d.ts +34 -0
- package/dist/components/Pagination.svelte +276 -0
- package/dist/components/Pagination.svelte.d.ts +14 -0
- package/dist/components/Popup.svelte +676 -0
- package/dist/components/Popup.svelte.d.ts +40 -0
- package/dist/components/PopupMenu.svelte +421 -0
- package/dist/components/PopupMenu.svelte.d.ts +24 -0
- package/dist/components/PopupMenuButton.svelte +365 -0
- package/dist/components/PopupMenuButton.svelte.d.ts +42 -0
- package/dist/components/Radio.svelte +548 -0
- package/dist/components/Radio.svelte.d.ts +42 -0
- package/dist/components/RadioGroup.svelte +74 -0
- package/dist/components/RadioGroup.svelte.d.ts +14 -0
- package/dist/components/Select.svelte +479 -0
- package/dist/components/Select.svelte.d.ts +47 -0
- package/dist/components/Slider.svelte +473 -0
- package/dist/components/Slider.svelte.d.ts +46 -0
- package/dist/components/Snackbar.svelte +124 -0
- package/dist/components/Snackbar.svelte.d.ts +9 -0
- package/dist/components/SnackbarItem.svelte +423 -0
- package/dist/components/SnackbarItem.svelte.d.ts +21 -0
- package/dist/components/Switch.svelte +454 -0
- package/dist/components/Switch.svelte.d.ts +40 -0
- package/dist/components/Tab.svelte +193 -0
- package/dist/components/Tab.svelte.d.ts +14 -0
- package/dist/components/TabItem.svelte +140 -0
- package/dist/components/TabItem.svelte.d.ts +17 -0
- package/dist/components/Textarea.svelte +702 -0
- package/dist/components/Textarea.svelte.d.ts +64 -0
- package/dist/components/skeleton/Skeleton.svelte +235 -0
- package/dist/components/skeleton/Skeleton.svelte.d.ts +13 -0
- package/dist/components/skeleton/SkeletonAvatar.svelte +97 -0
- package/dist/components/skeleton/SkeletonAvatar.svelte.d.ts +8 -0
- package/dist/components/skeleton/SkeletonBox.svelte +105 -0
- package/dist/components/skeleton/SkeletonBox.svelte.d.ts +12 -0
- package/dist/components/skeleton/SkeletonButton.svelte +71 -0
- package/dist/components/skeleton/SkeletonButton.svelte.d.ts +8 -0
- package/dist/components/skeleton/SkeletonHeading.svelte +49 -0
- package/dist/components/skeleton/SkeletonHeading.svelte.d.ts +8 -0
- package/dist/components/skeleton/SkeletonMedia.svelte +115 -0
- package/dist/components/skeleton/SkeletonMedia.svelte.d.ts +9 -0
- package/dist/components/skeleton/SkeletonText.svelte +75 -0
- package/dist/components/skeleton/SkeletonText.svelte.d.ts +8 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.js +43 -0
- package/dist/types/icon.d.ts +4 -0
- package/dist/types/icon.js +2 -0
- package/dist/types/menuItem.d.ts +8 -0
- package/dist/types/menuItem.js +1 -0
- package/dist/types/options.d.ts +6 -0
- package/dist/types/options.js +4 -0
- package/dist/types/skeleton.d.ts +77 -0
- package/dist/types/skeleton.js +19 -0
- package/dist/utils/accessibility.d.ts +48 -0
- package/dist/utils/accessibility.js +87 -0
- package/dist/utils/formatText.d.ts +4 -0
- package/dist/utils/formatText.js +44 -0
- package/dist/utils/mobile.d.ts +9 -0
- package/dist/utils/mobile.js +47 -0
- package/dist/utils/snackbar.svelte.d.ts +51 -0
- package/dist/utils/snackbar.svelte.js +107 -0
- package/dist/utils/style.d.ts +17 -0
- package/dist/utils/style.js +22 -0
- 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;
|