@14ch/svelte-ui 0.0.12 → 0.0.14

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 (104) hide show
  1. package/dist/assets/styles/variables.scss +2 -8
  2. package/dist/components/Button.svelte +104 -76
  3. package/dist/components/Button.svelte.d.ts +7 -5
  4. package/dist/components/Checkbox.svelte +80 -80
  5. package/dist/components/Checkbox.svelte.d.ts +4 -4
  6. package/dist/components/CheckboxGroup.svelte +48 -29
  7. package/dist/components/CheckboxGroup.svelte.d.ts +3 -3
  8. package/dist/components/ColorPicker.svelte +65 -64
  9. package/dist/components/ColorPicker.svelte.d.ts +5 -5
  10. package/dist/components/Combobox.svelte +97 -83
  11. package/dist/components/Combobox.svelte.d.ts +3 -3
  12. package/dist/components/ConfirmDialog.svelte +26 -28
  13. package/dist/components/ConfirmDialog.svelte.d.ts +3 -3
  14. package/dist/components/Datepicker.svelte +201 -97
  15. package/dist/components/Datepicker.svelte.d.ts +10 -7
  16. package/dist/components/DatepickerCalendar.svelte +24 -19
  17. package/dist/components/DatepickerCalendar.svelte.d.ts +3 -3
  18. package/dist/components/Dialog.svelte +30 -28
  19. package/dist/components/Dialog.svelte.d.ts +2 -2
  20. package/dist/components/Drawer.svelte +32 -30
  21. package/dist/components/Drawer.svelte.d.ts +2 -2
  22. package/dist/components/Fab.svelte +81 -62
  23. package/dist/components/Fab.svelte.d.ts +10 -6
  24. package/dist/components/FileUploader.svelte +52 -50
  25. package/dist/components/FileUploader.svelte.d.ts +3 -3
  26. package/dist/components/Icon.svelte +29 -27
  27. package/dist/components/Icon.svelte.d.ts +2 -2
  28. package/dist/components/IconButton.svelte +83 -80
  29. package/dist/components/IconButton.svelte.d.ts +6 -5
  30. package/dist/components/ImageUploader.svelte +54 -52
  31. package/dist/components/ImageUploader.svelte.d.ts +3 -3
  32. package/dist/components/ImageUploaderPreview.svelte +33 -20
  33. package/dist/components/ImageUploaderPreview.svelte.d.ts +2 -2
  34. package/dist/components/Input.svelte +100 -94
  35. package/dist/components/Input.svelte.d.ts +6 -5
  36. package/dist/components/LoadingSpinner.svelte +14 -13
  37. package/dist/components/LoadingSpinner.svelte.d.ts +2 -2
  38. package/dist/components/Modal.svelte +26 -24
  39. package/dist/components/Modal.svelte.d.ts +2 -2
  40. package/dist/components/Pagination.svelte +20 -28
  41. package/dist/components/Pagination.svelte.d.ts +2 -2
  42. package/dist/components/Popup.svelte +111 -124
  43. package/dist/components/Popup.svelte.d.ts +6 -6
  44. package/dist/components/PopupMenu.svelte +109 -125
  45. package/dist/components/PopupMenu.svelte.d.ts +5 -5
  46. package/dist/components/PopupMenuButton.svelte +67 -80
  47. package/dist/components/PopupMenuButton.svelte.d.ts +7 -6
  48. package/dist/components/Radio.svelte +65 -64
  49. package/dist/components/Radio.svelte.d.ts +3 -3
  50. package/dist/components/RadioGroup.svelte +39 -27
  51. package/dist/components/RadioGroup.svelte.d.ts +3 -3
  52. package/dist/components/SegmentedControl.svelte +72 -71
  53. package/dist/components/SegmentedControl.svelte.d.ts +4 -4
  54. package/dist/components/Select.svelte +66 -66
  55. package/dist/components/Select.svelte.d.ts +3 -3
  56. package/dist/components/Slider.svelte +67 -67
  57. package/dist/components/Slider.svelte.d.ts +5 -5
  58. package/dist/components/Snackbar.svelte +11 -9
  59. package/dist/components/Snackbar.svelte.d.ts +5 -4
  60. package/dist/components/SnackbarItem.svelte +29 -28
  61. package/dist/components/SnackbarItem.svelte.d.ts +6 -5
  62. package/dist/components/Switch.svelte +64 -66
  63. package/dist/components/Switch.svelte.d.ts +4 -4
  64. package/dist/components/Tab.svelte +31 -20
  65. package/dist/components/Tab.svelte.d.ts +3 -2
  66. package/dist/components/TabItem.svelte +22 -21
  67. package/dist/components/TabItem.svelte.d.ts +2 -2
  68. package/dist/components/Textarea.svelte +94 -92
  69. package/dist/components/Textarea.svelte.d.ts +8 -7
  70. package/dist/components/skeleton/Skeleton.svelte +16 -14
  71. package/dist/components/skeleton/Skeleton.svelte.d.ts +2 -2
  72. package/dist/components/skeleton/SkeletonAvatar.svelte +30 -36
  73. package/dist/components/skeleton/SkeletonAvatar.svelte.d.ts +8 -4
  74. package/dist/components/skeleton/SkeletonBox.svelte +11 -11
  75. package/dist/components/skeleton/SkeletonBox.svelte.d.ts +2 -2
  76. package/dist/components/skeleton/SkeletonButton.svelte +26 -19
  77. package/dist/components/skeleton/SkeletonButton.svelte.d.ts +7 -4
  78. package/dist/components/skeleton/SkeletonHeading.svelte +17 -23
  79. package/dist/components/skeleton/SkeletonHeading.svelte.d.ts +5 -4
  80. package/dist/components/skeleton/SkeletonMedia.svelte +37 -45
  81. package/dist/components/skeleton/SkeletonMedia.svelte.d.ts +10 -4
  82. package/dist/components/skeleton/SkeletonText.svelte +18 -24
  83. package/dist/components/skeleton/SkeletonText.svelte.d.ts +6 -4
  84. package/dist/i18n/index.d.ts +143 -5
  85. package/dist/i18n/index.js +20 -32
  86. package/dist/i18n/locales/de.d.ts +35 -0
  87. package/dist/i18n/locales/de.js +35 -0
  88. package/dist/i18n/locales/es.d.ts +35 -0
  89. package/dist/i18n/locales/es.js +35 -0
  90. package/dist/i18n/locales/fr.d.ts +35 -0
  91. package/dist/i18n/locales/fr.js +35 -0
  92. package/dist/i18n/locales/zh-cn.d.ts +35 -0
  93. package/dist/i18n/locales/zh-cn.js +35 -0
  94. package/dist/index.d.ts +46 -2
  95. package/dist/index.js +1 -0
  96. package/dist/types/menuItem.d.ts +1 -1
  97. package/dist/types/propOptions.d.ts +54 -0
  98. package/dist/types/propOptions.js +5 -0
  99. package/dist/utils/formatText.js +4 -1
  100. package/dist/utils/popupManager.d.ts +26 -0
  101. package/dist/utils/popupManager.js +34 -0
  102. package/package.json +1 -1
  103. /package/dist/types/{eventHandlers.d.ts → callbackHandlers.d.ts} +0 -0
  104. /package/dist/types/{eventHandlers.js → callbackHandlers.js} +0 -0
@@ -376,7 +376,6 @@
376
376
  --svelte-ui-input-icon-space-double-inline: calc(var(--svelte-ui-form-icon-space) * 2);
377
377
  --svelte-ui-input-bg: var(--svelte-ui-form-bg);
378
378
  --svelte-ui-input-border-color: var(--svelte-ui-border-weak-color);
379
- --svelte-ui-input-readonly-bg: var(--svelte-ui-form-bg);
380
379
  --svelte-ui-input-text-color: var(--svelte-ui-text-color);
381
380
  --svelte-ui-input-placeholder-color: var(--svelte-ui-text-placeholder-color);
382
381
  --svelte-ui-input-icon-color: var(--svelte-ui-text-subtle-color);
@@ -396,11 +395,6 @@
396
395
  --svelte-ui-textarea-icon-space-inline: var(--svelte-ui-form-icon-space);
397
396
  --svelte-ui-textarea-icon-top: 2px;
398
397
  --svelte-ui-textarea-icon-top-inline: -2px;
399
- --svelte-ui-textarea-bg: var(--svelte-ui-form-bg);
400
- --svelte-ui-textarea-border-color: var(--svelte-ui-border-weak-color);
401
- --svelte-ui-textarea-readonly-bg: var(--svelte-ui-form-bg);
402
- --svelte-ui-textarea-text-color: var(--svelte-ui-text-color);
403
- --svelte-ui-textarea-placeholder-color: var(--svelte-ui-text-placeholder-color);
404
398
  --svelte-ui-textarea-icon-color: var(--svelte-ui-text-subtle-color);
405
399
 
406
400
  /* Select */
@@ -616,8 +610,8 @@
616
610
  /* Drawer */
617
611
  --svelte-ui-drawer-gap: 16px;
618
612
  --svelte-ui-drawer-gap-sm: 8px;
619
- --svelte-ui-drawer-padding: 16px 24px;
620
- --svelte-ui-drawer-body-padding: 24px;
613
+ --svelte-ui-drawer-header-padding: 16px 24px;
614
+ --svelte-ui-drawer-body-padding: 0;
621
615
  --svelte-ui-drawer-header-height: 56px;
622
616
  --svelte-ui-drawer-title-font-size: 1.4rem;
623
617
  --svelte-ui-drawer-description-font-size: 0.875rem;
@@ -10,7 +10,8 @@
10
10
  MouseHandler,
11
11
  TouchHandler,
12
12
  PointerHandler
13
- } from '../types/eventHandlers';
13
+ } from '../types/callbackHandlers';
14
+ import type { ButtonVariant, ButtonSize } from '../types/propOptions';
14
15
  import Icon from './Icon.svelte';
15
16
  import LoadingSpinner from './LoadingSpinner.svelte';
16
17
  import { getStyleFromNumber } from '../utils/style';
@@ -18,6 +19,81 @@
18
19
  // =========================================================================
19
20
  // Props, States & Constants
20
21
  // =========================================================================
22
+ export type ButtonProps = {
23
+ // Snippet
24
+ children: Snippet;
25
+
26
+ // HTML属性系
27
+ buttonAttributes?: HTMLButtonAttributes | undefined;
28
+ type?: HTMLButtonAttributes['type'];
29
+ tabindex?: number | null;
30
+
31
+ // スタイル/レイアウト
32
+ customStyle?: HTMLButtonAttributes['style'];
33
+ variant?: ButtonVariant;
34
+ size?: ButtonSize;
35
+ color?: string;
36
+ fullWidth?: boolean;
37
+ align?: 'left' | 'center' | 'right';
38
+ minWidth?: string | number;
39
+ rounded?: boolean;
40
+ popup?: boolean;
41
+
42
+ // アイコン関連
43
+ icon?: string;
44
+ iconFilled?: boolean;
45
+ iconWeight?: IconWeight;
46
+ iconGrade?: IconGrade;
47
+ iconOpticalSize?: IconOpticalSize;
48
+ iconVariant?: IconVariant;
49
+
50
+ // 状態/動作
51
+ disabled?: boolean;
52
+ loading?: boolean;
53
+
54
+ // ARIA/アクセシビリティ
55
+ ariaLabel?: string;
56
+ ariaDescribedby?: string;
57
+ ariaExpanded?: boolean;
58
+ reducedMotion?: boolean;
59
+
60
+ // フォーカスイベント
61
+ onfocus?: FocusHandler;
62
+ onblur?: FocusHandler;
63
+
64
+ // キーボードイベント
65
+ onkeydown?: KeyboardHandler;
66
+ onkeyup?: KeyboardHandler;
67
+
68
+ // マウスイベント
69
+ onclick?: MouseHandler;
70
+ onmousedown?: MouseHandler;
71
+ onmouseup?: MouseHandler;
72
+ onmouseenter?: MouseHandler;
73
+ onmouseleave?: MouseHandler;
74
+ onmouseover?: MouseHandler;
75
+ onmouseout?: MouseHandler;
76
+ oncontextmenu?: MouseHandler;
77
+ onauxclick?: MouseHandler;
78
+
79
+ // タッチイベント
80
+ ontouchstart?: TouchHandler;
81
+ ontouchend?: TouchHandler;
82
+ ontouchmove?: TouchHandler;
83
+ ontouchcancel?: TouchHandler;
84
+
85
+ // ポインターイベント
86
+ onpointerdown?: PointerHandler;
87
+ onpointerup?: PointerHandler;
88
+ onpointerenter?: PointerHandler;
89
+ onpointerleave?: PointerHandler;
90
+ onpointermove?: PointerHandler;
91
+ onpointercancel?: PointerHandler;
92
+
93
+ // その他
94
+ [key: string]: any;
95
+ };
96
+
21
97
  let {
22
98
  // Snippet
23
99
  children,
@@ -33,6 +109,7 @@
33
109
  size = 'medium',
34
110
  color,
35
111
  fullWidth = false,
112
+ align = 'center',
36
113
  minWidth = 0,
37
114
  rounded = false,
38
115
  popup = false,
@@ -90,79 +167,7 @@
90
167
 
91
168
  // その他
92
169
  ...restProps
93
- }: {
94
- // Snippet
95
- children: Snippet;
96
-
97
- // HTML属性系
98
- buttonAttributes?: HTMLButtonAttributes | undefined;
99
- type?: HTMLButtonAttributes['type'];
100
- tabindex?: number | null;
101
-
102
- // スタイル/レイアウト
103
- customStyle?: HTMLButtonAttributes['style'];
104
- variant?: 'ghost' | 'filled' | 'outlined' | 'glass';
105
- size?: 'small' | 'medium' | 'large';
106
- color?: string;
107
- fullWidth?: boolean;
108
- minWidth?: string | number;
109
- rounded?: boolean;
110
- popup?: boolean;
111
-
112
- // アイコン関連
113
- icon?: string;
114
- iconFilled?: boolean;
115
- iconWeight?: IconWeight;
116
- iconGrade?: IconGrade;
117
- iconOpticalSize?: IconOpticalSize;
118
- iconVariant?: IconVariant;
119
-
120
- // 状態/動作
121
- disabled?: boolean;
122
- loading?: boolean;
123
-
124
- // ARIA/アクセシビリティ
125
- ariaLabel?: string;
126
- ariaDescribedby?: string;
127
- ariaExpanded?: boolean;
128
- reducedMotion?: boolean;
129
-
130
- // フォーカスイベント
131
- onfocus?: FocusHandler;
132
- onblur?: FocusHandler;
133
-
134
- // キーボードイベント
135
- onkeydown?: KeyboardHandler;
136
- onkeyup?: KeyboardHandler;
137
-
138
- // マウスイベント
139
- onclick?: MouseHandler;
140
- onmousedown?: MouseHandler;
141
- onmouseup?: MouseHandler;
142
- onmouseenter?: MouseHandler;
143
- onmouseleave?: MouseHandler;
144
- onmouseover?: MouseHandler;
145
- onmouseout?: MouseHandler;
146
- oncontextmenu?: MouseHandler;
147
- onauxclick?: MouseHandler;
148
-
149
- // タッチイベント
150
- ontouchstart?: TouchHandler;
151
- ontouchend?: TouchHandler;
152
- ontouchmove?: TouchHandler;
153
- ontouchcancel?: TouchHandler;
154
-
155
- // ポインターイベント
156
- onpointerdown?: PointerHandler;
157
- onpointerup?: PointerHandler;
158
- onpointerenter?: PointerHandler;
159
- onpointerleave?: PointerHandler;
160
- onpointermove?: PointerHandler;
161
- onpointercancel?: PointerHandler;
162
-
163
- // その他
164
- [key: string]: any;
165
- } = $props();
170
+ }: ButtonProps = $props();
166
171
 
167
172
  const backgroundColors = $derived({
168
173
  filled: color ?? 'var(--svelte-ui-button-bg-filled)',
@@ -308,6 +313,7 @@
308
313
  popup && 'button--popup',
309
314
  rounded && 'button--rounded',
310
315
  fullWidth && 'button--full-width',
316
+ `button--align-${align}`,
311
317
  loading && 'button--loading',
312
318
  reducedMotion && 'button--no-motion'
313
319
  ]
@@ -451,6 +457,14 @@
451
457
  width: 100%;
452
458
  }
453
459
 
460
+ .button--align-left {
461
+ justify-content: flex-start;
462
+ }
463
+
464
+ .button--align-right {
465
+ justify-content: flex-end;
466
+ }
467
+
454
468
  .button--rounded {
455
469
  border-radius: var(--svelte-ui-button-border-radius-rounded);
456
470
  }
@@ -508,9 +522,8 @@
508
522
  }
509
523
 
510
524
  .button__label {
511
- width: 100%;
512
525
  display: block;
513
- text-align: center;
526
+ width: auto;
514
527
  line-height: var(--svelte-ui-button-line-height);
515
528
  text-box-trim: trim-both;
516
529
  text-box-edge: cap alphabetic;
@@ -529,6 +542,11 @@
529
542
  justify-content: center;
530
543
  }
531
544
 
545
+ .button--align-left .button__popup-icon {
546
+ margin-left: auto;
547
+ margin-right: -4px;
548
+ }
549
+
532
550
  .button__loading {
533
551
  position: absolute;
534
552
  top: 50%;
@@ -548,6 +566,11 @@
548
566
  margin-right: -2px;
549
567
  }
550
568
 
569
+ .button--align-left.button--small .button__popup-icon {
570
+ margin-left: auto;
571
+ margin-right: -2px;
572
+ }
573
+
551
574
  .button--large .button__icon {
552
575
  margin-left: -6px;
553
576
  }
@@ -556,6 +579,11 @@
556
579
  margin-right: -6px;
557
580
  }
558
581
 
582
+ .button--align-left.button--large .button__popup-icon {
583
+ margin-left: auto;
584
+ margin-right: -6px;
585
+ }
586
+
559
587
  /* Reduced motion */
560
588
  .button--no-motion,
561
589
  .button--no-motion:before,
@@ -1,17 +1,19 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  import type { HTMLButtonAttributes } from 'svelte/elements';
3
3
  import type { IconVariant, IconWeight, IconGrade, IconOpticalSize } from '../types/icon';
4
- import type { FocusHandler, KeyboardHandler, MouseHandler, TouchHandler, PointerHandler } from '../types/eventHandlers';
5
- type $$ComponentProps = {
4
+ import type { FocusHandler, KeyboardHandler, MouseHandler, TouchHandler, PointerHandler } from '../types/callbackHandlers';
5
+ import type { ButtonVariant, ButtonSize } from '../types/propOptions';
6
+ export type ButtonProps = {
6
7
  children: Snippet;
7
8
  buttonAttributes?: HTMLButtonAttributes | undefined;
8
9
  type?: HTMLButtonAttributes['type'];
9
10
  tabindex?: number | null;
10
11
  customStyle?: HTMLButtonAttributes['style'];
11
- variant?: 'ghost' | 'filled' | 'outlined' | 'glass';
12
- size?: 'small' | 'medium' | 'large';
12
+ variant?: ButtonVariant;
13
+ size?: ButtonSize;
13
14
  color?: string;
14
15
  fullWidth?: boolean;
16
+ align?: 'left' | 'center' | 'right';
15
17
  minWidth?: string | number;
16
18
  rounded?: boolean;
17
19
  popup?: boolean;
@@ -52,6 +54,6 @@ type $$ComponentProps = {
52
54
  onpointercancel?: PointerHandler;
53
55
  [key: string]: any;
54
56
  };
55
- declare const Button: import("svelte").Component<$$ComponentProps, {}, "">;
57
+ declare const Button: import("svelte").Component<ButtonProps, {}, "">;
56
58
  type Button = ReturnType<typeof Button>;
57
59
  export default Button;
@@ -8,13 +8,75 @@
8
8
  KeyboardHandler,
9
9
  MouseHandler,
10
10
  TouchHandler,
11
- PointerHandler,
12
- BivariantValueHandler
13
- } from '../types/eventHandlers';
11
+ PointerHandler
12
+ } from '../types/callbackHandlers';
14
13
 
15
14
  // =========================================================================
16
15
  // Props, States & Constants
17
16
  // =========================================================================
17
+ export type CheckboxProps = {
18
+ // Snippet
19
+ children?: Snippet;
20
+
21
+ // 基本プロパティ
22
+ name?: string;
23
+ value: boolean;
24
+ indeterminate?: boolean;
25
+
26
+ // HTML属性系
27
+ id?: string;
28
+ inputAttributes?: HTMLInputAttributes | undefined;
29
+
30
+ // スタイル/レイアウト
31
+ size?: 'small' | 'medium' | 'large';
32
+
33
+ // 状態/動作
34
+ disabled?: boolean;
35
+ required?: boolean;
36
+
37
+ // ARIA/アクセシビリティ
38
+ reducedMotion?: boolean;
39
+
40
+ // 入力イベント
41
+ onchange?: (value: boolean) => void;
42
+
43
+ // フォーカスイベント
44
+ onfocus?: FocusHandler;
45
+ onblur?: FocusHandler;
46
+
47
+ // キーボードイベント
48
+ onkeydown?: KeyboardHandler;
49
+ onkeyup?: KeyboardHandler;
50
+
51
+ // マウスイベント
52
+ onclick?: MouseHandler;
53
+ onmousedown?: MouseHandler;
54
+ onmouseup?: MouseHandler;
55
+ onmouseenter?: MouseHandler;
56
+ onmouseleave?: MouseHandler;
57
+ onmouseover?: MouseHandler;
58
+ onmouseout?: MouseHandler;
59
+ oncontextmenu?: MouseHandler;
60
+ onauxclick?: MouseHandler;
61
+
62
+ // タッチイベント
63
+ ontouchstart?: TouchHandler;
64
+ ontouchend?: TouchHandler;
65
+ ontouchmove?: TouchHandler;
66
+ ontouchcancel?: TouchHandler;
67
+
68
+ // ポインターイベント
69
+ onpointerdown?: PointerHandler;
70
+ onpointerup?: PointerHandler;
71
+ onpointerenter?: PointerHandler;
72
+ onpointerleave?: PointerHandler;
73
+ onpointermove?: PointerHandler;
74
+ onpointercancel?: PointerHandler;
75
+
76
+ // その他
77
+ [key: string]: any;
78
+ };
79
+
18
80
  let {
19
81
  // Snippet
20
82
  children,
@@ -76,85 +138,9 @@
76
138
 
77
139
  // その他
78
140
  ...restProps
79
- }: {
80
- // Snippet
81
- children?: Snippet;
82
-
83
- // 基本プロパティ
84
- name?: string;
85
- value: boolean;
86
- indeterminate?: boolean;
87
-
88
- // HTML属性系
89
- id?: string;
90
- inputAttributes?: HTMLInputAttributes | undefined;
91
-
92
- // スタイル/レイアウト
93
- size?: 'small' | 'medium' | 'large';
141
+ }: CheckboxProps = $props();
94
142
 
95
- // 状態/動作
96
- disabled?: boolean;
97
- required?: boolean;
98
-
99
- // ARIA/アクセシビリティ
100
- reducedMotion?: boolean;
101
-
102
- // 入力イベント
103
- onchange?: BivariantValueHandler<boolean>;
104
-
105
- // フォーカスイベント
106
- onfocus?: FocusHandler;
107
- onblur?: FocusHandler;
108
-
109
- // キーボードイベント
110
- onkeydown?: KeyboardHandler;
111
- onkeyup?: KeyboardHandler;
112
-
113
- // マウスイベント
114
- onclick?: MouseHandler;
115
- onmousedown?: MouseHandler;
116
- onmouseup?: MouseHandler;
117
- onmouseenter?: MouseHandler;
118
- onmouseleave?: MouseHandler;
119
- onmouseover?: MouseHandler;
120
- onmouseout?: MouseHandler;
121
- oncontextmenu?: MouseHandler;
122
- onauxclick?: MouseHandler;
123
-
124
- // タッチイベント
125
- ontouchstart?: TouchHandler;
126
- ontouchend?: TouchHandler;
127
- ontouchmove?: TouchHandler;
128
- ontouchcancel?: TouchHandler;
129
-
130
- // ポインターイベント
131
- onpointerdown?: PointerHandler;
132
- onpointerup?: PointerHandler;
133
- onpointerenter?: PointerHandler;
134
- onpointerleave?: PointerHandler;
135
- onpointermove?: PointerHandler;
136
- onpointercancel?: PointerHandler;
137
-
138
- // その他
139
- [key: string]: any;
140
- } = $props();
141
-
142
- // =========================================================================
143
- // $derived
144
143
  // =========================================================================
145
- const containerClasses = $derived(
146
- [
147
- 'checkbox',
148
- `checkbox--${size}`,
149
- disabled && 'checkbox--disabled',
150
- reducedMotion && 'checkbox--no-motion'
151
- ]
152
- .filter(Boolean)
153
- .join(' ')
154
- );
155
-
156
- // =========================================================================
157
-
158
144
  // Methods
159
145
  // =========================================================================
160
146
  const handleFocus = (event: FocusEvent) => {
@@ -283,6 +269,20 @@
283
269
  const handleChange = (event: Event) => {
284
270
  onchange(value);
285
271
  };
272
+
273
+ // =========================================================================
274
+ // $derived
275
+ // =========================================================================
276
+ const containerClasses = $derived(
277
+ [
278
+ 'checkbox',
279
+ `checkbox--${size}`,
280
+ disabled && 'checkbox--disabled',
281
+ reducedMotion && 'checkbox--no-motion'
282
+ ]
283
+ .filter(Boolean)
284
+ .join(' ')
285
+ );
286
286
  </script>
287
287
 
288
288
  <div class={containerClasses} data-testid="checkbox">
@@ -1,7 +1,7 @@
1
1
  import { type Snippet } from 'svelte';
2
2
  import type { HTMLInputAttributes } from 'svelte/elements';
3
- import type { FocusHandler, KeyboardHandler, MouseHandler, TouchHandler, PointerHandler, BivariantValueHandler } from '../types/eventHandlers';
4
- type $$ComponentProps = {
3
+ import type { FocusHandler, KeyboardHandler, MouseHandler, TouchHandler, PointerHandler } from '../types/callbackHandlers';
4
+ export type CheckboxProps = {
5
5
  children?: Snippet;
6
6
  name?: string;
7
7
  value: boolean;
@@ -12,7 +12,7 @@ type $$ComponentProps = {
12
12
  disabled?: boolean;
13
13
  required?: boolean;
14
14
  reducedMotion?: boolean;
15
- onchange?: BivariantValueHandler<boolean>;
15
+ onchange?: (value: boolean) => void;
16
16
  onfocus?: FocusHandler;
17
17
  onblur?: FocusHandler;
18
18
  onkeydown?: KeyboardHandler;
@@ -38,6 +38,6 @@ type $$ComponentProps = {
38
38
  onpointercancel?: PointerHandler;
39
39
  [key: string]: any;
40
40
  };
41
- declare const Checkbox: import("svelte").Component<$$ComponentProps, {}, "value" | "indeterminate">;
41
+ declare const Checkbox: import("svelte").Component<CheckboxProps, {}, "value" | "indeterminate">;
42
42
  type Checkbox = ReturnType<typeof Checkbox>;
43
43
  export default Checkbox;
@@ -1,9 +1,38 @@
1
+ <!-- CheckboxGroup.svelte -->
2
+
1
3
  <script lang="ts">
2
4
  import type { Option, OptionValue } from '../types/options';
3
5
  import Checkbox from './Checkbox.svelte';
4
6
  import { onMount } from 'svelte';
5
7
  import { getStyleFromNumber } from '../utils/style';
6
- import type { BivariantValueHandler } from '../types/eventHandlers';
8
+ import type { BivariantValueHandler } from '../types/callbackHandlers';
9
+
10
+ // =========================================================================
11
+ // Props, States & Constants
12
+ // =========================================================================
13
+
14
+ export type CheckboxGroupProps = {
15
+ // 基本プロパティ
16
+ options: Option[];
17
+ value: OptionValue[];
18
+
19
+ // スタイル/レイアウト
20
+ direction?: 'vertical' | 'horizontal';
21
+ gap?: string | number;
22
+ wrap?: boolean;
23
+ minOptionWidth?: string | number;
24
+ size?: 'small' | 'medium' | 'large';
25
+
26
+ // 状態/動作
27
+ disabled?: boolean;
28
+ required?: boolean;
29
+
30
+ // ARIA/アクセシビリティ
31
+ reducedMotion?: boolean;
32
+
33
+ // 入力イベント
34
+ onchange?: BivariantValueHandler<OptionValue[]>;
35
+ };
7
36
 
8
37
  let {
9
38
  // 基本プロパティ
@@ -26,44 +55,34 @@
26
55
 
27
56
  // 入力イベント
28
57
  onchange = () => {} // No params for type inference
29
- }: {
30
- // 基本プロパティ
31
- options: Option[];
32
- value: OptionValue[];
33
-
34
- // スタイル/レイアウト
35
- direction?: 'vertical' | 'horizontal';
36
- gap?: string | number;
37
- wrap?: boolean;
38
- minOptionWidth?: string | number;
39
- size?: 'small' | 'medium' | 'large';
40
-
41
- // 状態/動作
42
- disabled?: boolean;
43
- required?: boolean;
58
+ }: CheckboxGroupProps = $props();
44
59
 
45
- // ARIA/アクセシビリティ
46
- reducedMotion?: boolean;
47
-
48
- // 入力イベント
49
- onchange?: BivariantValueHandler<OptionValue[]>;
50
- } = $props();
51
60
  let localValues: Record<string, boolean> = $state({});
52
61
 
62
+ // =========================================================================
63
+ // Lifecycle
64
+ // =========================================================================
53
65
  onMount(() => {
54
66
  options.forEach((option) => {
55
- localValues[option.value] = false;
67
+ localValues[String(option.value)] = false;
56
68
  });
57
69
  });
58
70
 
71
+ // =========================================================================
72
+ // Methods
73
+ // =========================================================================
59
74
  const handleChange = () => {
60
- value = options.filter((option) => localValues[option.value]).map((option) => option.value);
75
+ value = options
76
+ .filter((option) => localValues[String(option.value)])
77
+ .map((option) => option.value);
61
78
  onchange(value);
62
79
  };
63
80
 
64
- const gapStyle = gap !== undefined ? getStyleFromNumber(gap) : undefined;
65
-
66
- const minOptionWidthStyle = getStyleFromNumber(minOptionWidth);
81
+ // =========================================================================
82
+ // $defived
83
+ // =========================================================================
84
+ const gapStyle = $derived(gap !== undefined ? getStyleFromNumber(gap) : undefined);
85
+ const minOptionWidthStyle = $derived(getStyleFromNumber(minOptionWidth));
67
86
  </script>
68
87
 
69
88
  <ul
@@ -75,10 +94,10 @@
75
94
  "
76
95
  >
77
96
  {#each options as option (option.value)}
78
- {#if localValues[option.value] !== undefined}
97
+ {#if localValues[String(option.value)] !== undefined}
79
98
  <li class="checkbox-group__option">
80
99
  <Checkbox
81
- bind:value={localValues[option.value]}
100
+ bind:value={localValues[String(option.value)]}
82
101
  {size}
83
102
  {disabled}
84
103
  {required}
@@ -1,6 +1,6 @@
1
1
  import type { Option, OptionValue } from '../types/options';
2
- import type { BivariantValueHandler } from '../types/eventHandlers';
3
- type $$ComponentProps = {
2
+ import type { BivariantValueHandler } from '../types/callbackHandlers';
3
+ export type CheckboxGroupProps = {
4
4
  options: Option[];
5
5
  value: OptionValue[];
6
6
  direction?: 'vertical' | 'horizontal';
@@ -13,6 +13,6 @@ type $$ComponentProps = {
13
13
  reducedMotion?: boolean;
14
14
  onchange?: BivariantValueHandler<OptionValue[]>;
15
15
  };
16
- declare const CheckboxGroup: import("svelte").Component<$$ComponentProps, {}, "value">;
16
+ declare const CheckboxGroup: import("svelte").Component<CheckboxGroupProps, {}, "value">;
17
17
  type CheckboxGroup = ReturnType<typeof CheckboxGroup>;
18
18
  export default CheckboxGroup;