@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
@@ -13,11 +13,92 @@
13
13
  MouseHandler,
14
14
  TouchHandler,
15
15
  PointerHandler
16
- } from '../types/eventHandlers';
16
+ } from '../types/callbackHandlers';
17
+ import type { ButtonVariant, BadgeVariant } from '../types/propOptions';
17
18
 
18
19
  // =========================================================================
19
20
  // Props, States & Constants
20
21
  // =========================================================================
22
+ export type IconButtonProps = {
23
+ // Snippet
24
+ children: Snippet;
25
+
26
+ // HTML属性系
27
+ buttonAttributes?: HTMLButtonAttributes | undefined;
28
+ type?: 'button' | 'submit' | 'reset' | null | undefined;
29
+ tabindex?: number | null;
30
+
31
+ // スタイル/レイアウト
32
+ customStyle?: HTMLButtonAttributes['style'];
33
+ variant?: ButtonVariant;
34
+ size?: number;
35
+ fontSize?: number;
36
+ color?: string;
37
+ rounded?: boolean;
38
+
39
+ // アイコン関連
40
+ icon?: string;
41
+ iconFilled?: boolean;
42
+ iconWeight?: IconWeight;
43
+ iconGrade?: IconGrade;
44
+ iconOpticalSize?: IconOpticalSize;
45
+ iconVariant?: IconVariant;
46
+
47
+ // バッジ関連
48
+ hasBadge?: boolean;
49
+ badgeCount?: number;
50
+ badgeVariant?: BadgeVariant;
51
+ badgeColor?: string;
52
+ badgeMax?: number;
53
+
54
+ // 状態/動作
55
+ disabled?: boolean;
56
+ loading?: boolean;
57
+ pressed?: boolean;
58
+
59
+ // ARIA/アクセシビリティ
60
+ ariaLabel: string;
61
+ ariaDescribedby?: string;
62
+ ariaPressed?: boolean;
63
+ reducedMotion?: boolean;
64
+
65
+ // フォーカスイベント
66
+ onfocus?: FocusHandler;
67
+ onblur?: FocusHandler;
68
+
69
+ // キーボードイベント
70
+ onkeydown?: KeyboardHandler;
71
+ onkeyup?: KeyboardHandler;
72
+
73
+ // マウスイベント
74
+ onclick?: MouseHandler;
75
+ onmousedown?: MouseHandler;
76
+ onmouseup?: MouseHandler;
77
+ onmouseenter?: MouseHandler;
78
+ onmouseleave?: MouseHandler;
79
+ onmouseover?: MouseHandler;
80
+ onmouseout?: MouseHandler;
81
+ oncontextmenu?: MouseHandler;
82
+ onauxclick?: MouseHandler;
83
+
84
+ // タッチイベント
85
+ ontouchstart?: TouchHandler;
86
+ ontouchend?: TouchHandler;
87
+ ontouchmove?: TouchHandler;
88
+ ontouchcancel?: TouchHandler;
89
+
90
+ // ポインターイベント
91
+ onpointerdown?: PointerHandler;
92
+ onpointerup?: PointerHandler;
93
+ onpointerenter?: PointerHandler;
94
+ onpointerleave?: PointerHandler;
95
+ onpointermove?: PointerHandler;
96
+ onpointercancel?: PointerHandler;
97
+
98
+ // その他
99
+ [key: string]: any;
100
+ };
101
+
21
102
  let {
22
103
  // 基本プロパティ
23
104
  children,
@@ -96,85 +177,7 @@
96
177
 
97
178
  // その他
98
179
  ...restProps
99
- }: {
100
- // Snippet
101
- children: Snippet;
102
-
103
- // HTML属性系
104
- buttonAttributes?: HTMLButtonAttributes | undefined;
105
- type?: 'button' | 'submit' | 'reset' | null | undefined;
106
- tabindex?: number | null;
107
-
108
- // スタイル/レイアウト
109
- customStyle?: HTMLButtonAttributes['style'];
110
- variant?: 'ghost' | 'filled' | 'outlined' | 'glass';
111
- size?: number;
112
- fontSize?: number;
113
- color?: string;
114
- rounded?: boolean;
115
-
116
- // アイコン関連
117
- icon?: string;
118
- iconFilled?: boolean;
119
- iconWeight?: IconWeight;
120
- iconGrade?: IconGrade;
121
- iconOpticalSize?: IconOpticalSize;
122
- iconVariant?: IconVariant;
123
-
124
- // バッジ関連
125
- hasBadge?: boolean;
126
- badgeCount?: number;
127
- badgeVariant?: 'dot' | 'count';
128
- badgeColor?: string;
129
- badgeMax?: number;
130
-
131
- // 状態/動作
132
- disabled?: boolean;
133
- loading?: boolean;
134
- pressed?: boolean;
135
-
136
- // ARIA/アクセシビリティ
137
- ariaLabel: string;
138
- ariaDescribedby?: string;
139
- ariaPressed?: boolean;
140
- reducedMotion?: boolean;
141
-
142
- // フォーカスイベント
143
- onfocus?: FocusHandler;
144
- onblur?: FocusHandler;
145
-
146
- // キーボードイベント
147
- onkeydown?: KeyboardHandler;
148
- onkeyup?: KeyboardHandler;
149
-
150
- // マウスイベント
151
- onclick?: MouseHandler;
152
- onmousedown?: MouseHandler;
153
- onmouseup?: MouseHandler;
154
- onmouseenter?: MouseHandler;
155
- onmouseleave?: MouseHandler;
156
- onmouseover?: MouseHandler;
157
- onmouseout?: MouseHandler;
158
- oncontextmenu?: MouseHandler;
159
- onauxclick?: MouseHandler;
160
-
161
- // タッチイベント
162
- ontouchstart?: TouchHandler;
163
- ontouchend?: TouchHandler;
164
- ontouchmove?: TouchHandler;
165
- ontouchcancel?: TouchHandler;
166
-
167
- // ポインターイベント
168
- onpointerdown?: PointerHandler;
169
- onpointerup?: PointerHandler;
170
- onpointerenter?: PointerHandler;
171
- onpointerleave?: PointerHandler;
172
- onpointermove?: PointerHandler;
173
- onpointercancel?: PointerHandler;
174
-
175
- // その他
176
- [key: string]: any;
177
- } = $props();
180
+ }: IconButtonProps = $props();
178
181
 
179
182
  // =========================================================================
180
183
  // Methods
@@ -1,14 +1,15 @@
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, BadgeVariant } from '../types/propOptions';
6
+ export type IconButtonProps = {
6
7
  children: Snippet;
7
8
  buttonAttributes?: HTMLButtonAttributes | undefined;
8
9
  type?: 'button' | 'submit' | 'reset' | null | undefined;
9
10
  tabindex?: number | null;
10
11
  customStyle?: HTMLButtonAttributes['style'];
11
- variant?: 'ghost' | 'filled' | 'outlined' | 'glass';
12
+ variant?: ButtonVariant;
12
13
  size?: number;
13
14
  fontSize?: number;
14
15
  color?: string;
@@ -21,7 +22,7 @@ type $$ComponentProps = {
21
22
  iconVariant?: IconVariant;
22
23
  hasBadge?: boolean;
23
24
  badgeCount?: number;
24
- badgeVariant?: 'dot' | 'count';
25
+ badgeVariant?: BadgeVariant;
25
26
  badgeColor?: string;
26
27
  badgeMax?: number;
27
28
  disabled?: boolean;
@@ -56,6 +57,6 @@ type $$ComponentProps = {
56
57
  onpointercancel?: PointerHandler;
57
58
  [key: string]: any;
58
59
  };
59
- declare const IconButton: import("svelte").Component<$$ComponentProps, {}, "">;
60
+ declare const IconButton: import("svelte").Component<IconButtonProps, {}, "">;
60
61
  type IconButton = ReturnType<typeof IconButton>;
61
62
  export default IconButton;
@@ -15,11 +15,63 @@
15
15
  MouseHandler,
16
16
  TouchHandler,
17
17
  PointerHandler
18
- } from '../types/eventHandlers';
18
+ } from '../types/callbackHandlers';
19
19
 
20
20
  // =========================================================================
21
21
  // Props, States & Constants
22
22
  // =========================================================================
23
+ export type ImageUploaderProps = {
24
+ // 基本プロパティ
25
+ value: FileList | null | undefined;
26
+ multiple?: boolean;
27
+ maxFileSize?: number;
28
+ placeholder?: string;
29
+
30
+ // HTML属性系
31
+ id?: string;
32
+ accept?: string;
33
+
34
+ // スタイル/レイアウト
35
+ width?: string | number;
36
+ height?: string | number;
37
+ rounded?: boolean;
38
+ previewStyle?: 'plain' | 'framed';
39
+ previewAdaptive?: boolean;
40
+
41
+ // アイコン系
42
+ icon?: string;
43
+ iconSize?: number;
44
+ iconFilled?: boolean;
45
+ iconWeight?: IconWeight;
46
+ iconGrade?: IconGrade;
47
+ iconOpticalSize?: IconOpticalSize;
48
+ iconVariant?: IconVariant;
49
+ removeFileAriaLabel?: string;
50
+
51
+ // 入力イベント
52
+ onchange?: BivariantValueHandler<FileList | null | undefined>;
53
+
54
+ // フォーカスイベント
55
+ onfocus?: FocusHandler;
56
+ onblur?: FocusHandler;
57
+
58
+ // キーボードイベント
59
+ onkeydown?: KeyboardHandler;
60
+ onkeyup?: KeyboardHandler;
61
+
62
+ // マウスイベント
63
+ onmouseenter?: MouseHandler;
64
+ onmouseleave?: MouseHandler;
65
+
66
+ // タッチイベント
67
+ ontouchstart?: TouchHandler;
68
+ ontouchend?: TouchHandler;
69
+
70
+ // ポインターイベント
71
+ onpointerenter?: PointerHandler;
72
+ onpointerleave?: PointerHandler;
73
+ };
74
+
23
75
  let {
24
76
  // 基本プロパティ
25
77
  value = $bindable(),
@@ -72,57 +124,7 @@
72
124
  // ポインターイベント
73
125
  onpointerenter = () => {}, // No params for type inference
74
126
  onpointerleave = () => {} // No params for type inference
75
- }: {
76
- // 基本プロパティ
77
- value: FileList | null | undefined;
78
- multiple?: boolean;
79
- maxFileSize?: number;
80
- placeholder?: string;
81
-
82
- // HTML属性系
83
- id?: string;
84
- accept?: string;
85
-
86
- // スタイル/レイアウト
87
- width?: string | number;
88
- height?: string | number;
89
- rounded?: boolean;
90
- previewStyle?: 'plain' | 'framed';
91
- previewAdaptive?: boolean;
92
-
93
- // アイコン系
94
- icon?: string;
95
- iconSize?: number;
96
- iconFilled?: boolean;
97
- iconWeight?: IconWeight;
98
- iconGrade?: IconGrade;
99
- iconOpticalSize?: IconOpticalSize;
100
- iconVariant?: IconVariant;
101
- removeFileAriaLabel?: string;
102
-
103
- // 入力イベント
104
- onchange?: BivariantValueHandler<FileList | null | undefined>;
105
-
106
- // フォーカスイベント
107
- onfocus?: FocusHandler;
108
- onblur?: FocusHandler;
109
-
110
- // キーボードイベント
111
- onkeydown?: KeyboardHandler;
112
- onkeyup?: KeyboardHandler;
113
-
114
- // マウスイベント
115
- onmouseenter?: MouseHandler;
116
- onmouseleave?: MouseHandler;
117
-
118
- // タッチイベント
119
- ontouchstart?: TouchHandler;
120
- ontouchend?: TouchHandler;
121
-
122
- // ポインターイベント
123
- onpointerenter?: PointerHandler;
124
- onpointerleave?: PointerHandler;
125
- } = $props();
127
+ }: ImageUploaderProps = $props();
126
128
 
127
129
  let dropAreaRef: HTMLButtonElement;
128
130
  let fileInputRef: HTMLInputElement;
@@ -1,6 +1,6 @@
1
1
  import type { IconVariant, IconWeight, IconGrade, IconOpticalSize } from '../types/icon';
2
- import type { BivariantValueHandler, FocusHandler, KeyboardHandler, MouseHandler, TouchHandler, PointerHandler } from '../types/eventHandlers';
3
- type $$ComponentProps = {
2
+ import type { BivariantValueHandler, FocusHandler, KeyboardHandler, MouseHandler, TouchHandler, PointerHandler } from '../types/callbackHandlers';
3
+ export type ImageUploaderProps = {
4
4
  value: FileList | null | undefined;
5
5
  multiple?: boolean;
6
6
  maxFileSize?: number;
@@ -32,7 +32,7 @@ type $$ComponentProps = {
32
32
  onpointerenter?: PointerHandler;
33
33
  onpointerleave?: PointerHandler;
34
34
  };
35
- declare const ImageUploader: import("svelte").Component<$$ComponentProps, {
35
+ declare const ImageUploader: import("svelte").Component<ImageUploaderProps, {
36
36
  reset: () => void;
37
37
  }, "value">;
38
38
  type ImageUploader = ReturnType<typeof ImageUploader>;
@@ -1,8 +1,34 @@
1
+ <!-- ImageUploaderPreview.svelte -->
2
+
1
3
  <script lang="ts">
2
4
  import { onDestroy } from 'svelte';
3
5
  import IconButton from './IconButton.svelte';
4
6
  import { getStyleFromNumber } from '../utils/style';
5
7
 
8
+ // =========================================================================
9
+ // Props, States & Constants
10
+ // =========================================================================
11
+ export type ImageUploaderPreviewProps = {
12
+ // 基本プロパティ
13
+ file: File;
14
+
15
+ // HTML属性系
16
+ id?: string;
17
+
18
+ // スタイル/レイアウト
19
+ width?: string | number;
20
+ height?: string | number;
21
+ previewAdaptive?: boolean;
22
+ rounded?: boolean;
23
+ previewStyle?: 'plain' | 'framed';
24
+
25
+ // ARIA/アクセシビリティ
26
+ removeFileAriaLabel?: string;
27
+
28
+ // 入力イベント
29
+ onRemove: () => void;
30
+ };
31
+
6
32
  let {
7
33
  // 基本プロパティ
8
34
  file,
@@ -22,29 +48,13 @@
22
48
 
23
49
  // 入力イベント
24
50
  onRemove
25
- }: {
26
- // 基本プロパティ
27
- file: File;
28
-
29
- // HTML属性系
30
- id?: string;
31
-
32
- // スタイル/レイアウト
33
- width?: string | number;
34
- height?: string | number;
35
- previewAdaptive?: boolean;
36
- rounded?: boolean;
37
- previewStyle?: 'plain' | 'framed';
38
-
39
- // ARIA/アクセシビリティ
40
- removeFileAriaLabel?: string;
41
-
42
- // 入力イベント
43
- onRemove: () => void;
44
- } = $props();
51
+ }: ImageUploaderPreviewProps = $props();
45
52
 
46
53
  let imageSizes = $state<Record<string, { width: number; height: number }>>({});
47
54
 
55
+ // =========================================================================
56
+ // Methods
57
+ // =========================================================================
48
58
  const getImageUrl = (file: File): string => {
49
59
  return URL.createObjectURL(file);
50
60
  };
@@ -67,6 +77,9 @@
67
77
  img.src = getImageUrl(file);
68
78
  };
69
79
 
80
+ // =========================================================================
81
+ // $derived
82
+ // =========================================================================
70
83
  // previewAdaptiveによる分岐を最初に行う
71
84
  const imageSizeStyle = $derived.by(() => {
72
85
  if (previewAdaptive) {
@@ -1,4 +1,4 @@
1
- type $$ComponentProps = {
1
+ export type ImageUploaderPreviewProps = {
2
2
  file: File;
3
3
  id?: string;
4
4
  width?: string | number;
@@ -9,6 +9,6 @@ type $$ComponentProps = {
9
9
  removeFileAriaLabel?: string;
10
10
  onRemove: () => void;
11
11
  };
12
- declare const ImageUploaderPreview: import("svelte").Component<$$ComponentProps, {}, "">;
12
+ declare const ImageUploaderPreview: import("svelte").Component<ImageUploaderPreviewProps, {}, "">;
13
13
  type ImageUploaderPreview = ReturnType<typeof ImageUploaderPreview>;
14
14
  export default ImageUploaderPreview;
@@ -15,11 +15,105 @@
15
15
  TouchHandler,
16
16
  PointerHandler,
17
17
  BivariantValueHandler
18
- } from '../types/eventHandlers';
18
+ } from '../types/callbackHandlers';
19
+ import type { FocusStyle } from '../types/propOptions';
19
20
 
20
21
  // =========================================================================
21
22
  // Props, States & Constants
22
23
  // =========================================================================
24
+ export type InputProps = {
25
+ // 基本プロパティ
26
+ name?: string;
27
+ value: string | number | null | undefined;
28
+
29
+ // HTML属性系
30
+ id?: string | null;
31
+ type?: 'text' | 'password' | 'email' | 'tel' | 'url' | 'number';
32
+ tabindex?: number | null;
33
+ maxlength?: number | null;
34
+ pattern?: string | null;
35
+ min?: number | null;
36
+ max?: number | null;
37
+ step?: number | null;
38
+ size?: number | null;
39
+ autocomplete?: HTMLInputElement['autocomplete'] | null;
40
+ spellcheck?: boolean | null;
41
+ inputAttributes?: HTMLInputAttributes | undefined;
42
+
43
+ // スタイル/レイアウト
44
+ inline?: boolean;
45
+ focusStyle?: FocusStyle;
46
+ placeholder?: string;
47
+ fullWidth?: boolean;
48
+ width?: string | number | null;
49
+ minWidth?: string | number | null;
50
+ maxWidth?: string | number | null;
51
+ rounded?: boolean;
52
+ customStyle?: string;
53
+
54
+ // アイコン関連
55
+ rightIcon?: string;
56
+ leftIcon?: string;
57
+ leftIconAriaLabel?: string;
58
+ rightIconAriaLabel?: string;
59
+ iconFilled?: boolean;
60
+ iconWeight?: IconWeight;
61
+ iconGrade?: IconGrade;
62
+ iconOpticalSize?: IconOpticalSize;
63
+ iconVariant?: IconVariant;
64
+
65
+ // 状態/動作
66
+ disabled?: boolean;
67
+ readonly?: boolean;
68
+ required?: boolean;
69
+ clearable?: boolean;
70
+ linkify?: boolean;
71
+
72
+ // フォーカスイベント
73
+ onfocus?: FocusHandler;
74
+ onblur?: FocusHandler;
75
+
76
+ // キーボードイベント
77
+ onkeydown?: KeyboardHandler;
78
+ onkeyup?: KeyboardHandler;
79
+
80
+ // マウスイベント
81
+ onclick?: MouseHandler;
82
+ onmousedown?: MouseHandler;
83
+ onmouseup?: MouseHandler;
84
+ onmouseenter?: MouseHandler;
85
+ onmouseleave?: MouseHandler;
86
+ onmouseover?: MouseHandler;
87
+ onmouseout?: MouseHandler;
88
+ oncontextmenu?: MouseHandler;
89
+ onauxclick?: MouseHandler;
90
+
91
+ // タッチイベント
92
+ ontouchstart?: TouchHandler;
93
+ ontouchend?: TouchHandler;
94
+ ontouchmove?: TouchHandler;
95
+ ontouchcancel?: TouchHandler;
96
+
97
+ // ポインターイベント
98
+ onpointerdown?: PointerHandler;
99
+ onpointerup?: PointerHandler;
100
+ onpointerenter?: PointerHandler;
101
+ onpointerleave?: PointerHandler;
102
+ onpointermove?: PointerHandler;
103
+ onpointercancel?: PointerHandler;
104
+
105
+ // 入力イベント
106
+ onchange?: BivariantValueHandler<string | number>;
107
+ oninput?: BivariantValueHandler<string | number>;
108
+
109
+ // アイコンイベント
110
+ onRightIconClick?: MouseHandler;
111
+ onLeftIconClick?: MouseHandler;
112
+
113
+ // その他
114
+ [key: string]: any;
115
+ };
116
+
23
117
  let {
24
118
  // 基本プロパティ
25
119
  name,
@@ -112,98 +206,7 @@
112
206
 
113
207
  // その他
114
208
  ...restProps
115
- }: {
116
- // 基本プロパティ
117
- name?: string;
118
- value: string | number;
119
-
120
- // HTML属性系
121
- id?: string | null;
122
- type?: 'text' | 'password' | 'email' | 'tel' | 'url' | 'number';
123
- tabindex?: number | null;
124
- maxlength?: number | null;
125
- pattern?: string | null;
126
- min?: number | null;
127
- max?: number | null;
128
- step?: number | null;
129
- size?: number | null;
130
- autocomplete?: HTMLInputElement['autocomplete'] | null;
131
- spellcheck?: boolean | null;
132
- inputAttributes?: HTMLInputAttributes | undefined;
133
-
134
- // スタイル/レイアウト
135
- inline?: boolean;
136
- focusStyle?: 'background' | 'outline' | 'none';
137
- placeholder?: string;
138
- fullWidth?: boolean;
139
- width?: string | number | null;
140
- minWidth?: string | number | null;
141
- maxWidth?: string | number | null;
142
- rounded?: boolean;
143
- customStyle?: string;
144
-
145
- // アイコン関連
146
- rightIcon?: string;
147
- leftIcon?: string;
148
- leftIconAriaLabel?: string;
149
- rightIconAriaLabel?: string;
150
- iconFilled?: boolean;
151
- iconWeight?: IconWeight;
152
- iconGrade?: IconGrade;
153
- iconOpticalSize?: IconOpticalSize;
154
- iconVariant?: IconVariant;
155
-
156
- // 状態/動作
157
- disabled?: boolean;
158
- readonly?: boolean;
159
- required?: boolean;
160
- clearable?: boolean;
161
- linkify?: boolean;
162
-
163
- // フォーカスイベント
164
- onfocus?: FocusHandler;
165
- onblur?: FocusHandler;
166
-
167
- // キーボードイベント
168
- onkeydown?: KeyboardHandler;
169
- onkeyup?: KeyboardHandler;
170
-
171
- // マウスイベント
172
- onclick?: MouseHandler;
173
- onmousedown?: MouseHandler;
174
- onmouseup?: MouseHandler;
175
- onmouseenter?: MouseHandler;
176
- onmouseleave?: MouseHandler;
177
- onmouseover?: MouseHandler;
178
- onmouseout?: MouseHandler;
179
- oncontextmenu?: MouseHandler;
180
- onauxclick?: MouseHandler;
181
-
182
- // タッチイベント
183
- ontouchstart?: TouchHandler;
184
- ontouchend?: TouchHandler;
185
- ontouchmove?: TouchHandler;
186
- ontouchcancel?: TouchHandler;
187
-
188
- // ポインターイベント
189
- onpointerdown?: PointerHandler;
190
- onpointerup?: PointerHandler;
191
- onpointerenter?: PointerHandler;
192
- onpointerleave?: PointerHandler;
193
- onpointermove?: PointerHandler;
194
- onpointercancel?: PointerHandler;
195
-
196
- // 入力イベント
197
- onchange?: BivariantValueHandler<string | number>;
198
- oninput?: BivariantValueHandler<string | number>;
199
-
200
- // アイコンイベント
201
- onRightIconClick?: MouseHandler;
202
- onLeftIconClick?: MouseHandler;
203
-
204
- // その他
205
- [key: string]: any;
206
- } = $props();
209
+ }: InputProps = $props();
207
210
 
208
211
  let ref: HTMLInputElement | undefined = $state();
209
212
  let isFocused: boolean = $state(false);
@@ -379,6 +382,7 @@
379
382
  // $derived
380
383
  // =========================================================================
381
384
  const getDisplayValue = (): string => {
385
+ if (value === null || value === undefined) return '';
382
386
  if (type === 'number' && typeof value === 'number') {
383
387
  return value.toLocaleString();
384
388
  }
@@ -970,7 +974,9 @@
970
974
  }
971
975
 
972
976
  input[readonly] {
973
- background-color: var(--svelte-ui-input-readonly-bg);
977
+ /* Keep cursor behavior but do not add a special background.
978
+ * In this library, filled backgrounds are used to indicate editable fields,
979
+ * so readonly inputs intentionally have no extra background color. */
974
980
  cursor: default;
975
981
  }
976
982
  </style>
@@ -1,9 +1,10 @@
1
1
  import type { HTMLInputAttributes } from 'svelte/elements';
2
2
  import type { IconVariant, IconWeight, IconGrade, IconOpticalSize } from '../types/icon';
3
- import type { FocusHandler, KeyboardHandler, MouseHandler, TouchHandler, PointerHandler, BivariantValueHandler } from '../types/eventHandlers';
4
- type $$ComponentProps = {
3
+ import type { FocusHandler, KeyboardHandler, MouseHandler, TouchHandler, PointerHandler, BivariantValueHandler } from '../types/callbackHandlers';
4
+ import type { FocusStyle } from '../types/propOptions';
5
+ export type InputProps = {
5
6
  name?: string;
6
- value: string | number;
7
+ value: string | number | null | undefined;
7
8
  id?: string | null;
8
9
  type?: 'text' | 'password' | 'email' | 'tel' | 'url' | 'number';
9
10
  tabindex?: number | null;
@@ -17,7 +18,7 @@ type $$ComponentProps = {
17
18
  spellcheck?: boolean | null;
18
19
  inputAttributes?: HTMLInputAttributes | undefined;
19
20
  inline?: boolean;
20
- focusStyle?: 'background' | 'outline' | 'none';
21
+ focusStyle?: FocusStyle;
21
22
  placeholder?: string;
22
23
  fullWidth?: boolean;
23
24
  width?: string | number | null;
@@ -68,7 +69,7 @@ type $$ComponentProps = {
68
69
  onLeftIconClick?: MouseHandler;
69
70
  [key: string]: any;
70
71
  };
71
- declare const Input: import("svelte").Component<$$ComponentProps, {
72
+ declare const Input: import("svelte").Component<InputProps, {
72
73
  focus: () => void;
73
74
  }, "value">;
74
75
  type Input = ReturnType<typeof Input>;