@ttdk-design-system/library-vue 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/AI_GUIDE.md +6518 -0
  2. package/llms.txt +6518 -0
  3. package/package.json +1096 -4
  4. package/src/core/index.ts +2 -0
  5. package/src/core/tailwind-preset.cjs +62 -0
  6. package/src/core/tailwind-preset.ts +85 -0
  7. package/src/core/theme/tokens.css +663 -0
  8. package/src/core/types.ts +836 -0
  9. package/src/index.ts +17 -0
  10. package/src/tailwind-preset.cjs +62 -0
  11. package/src/tailwind-preset.ts +85 -0
  12. package/src/types.ts +1 -0
  13. package/src/web/accordion/AI_GUIDE.md +149 -0
  14. package/src/web/accordion/accordion.css +1 -0
  15. package/src/web/accordion/accordion.vue +432 -0
  16. package/src/web/accordion/accordion.vue.d.ts +227 -0
  17. package/src/web/accordion/index.ts +3 -0
  18. package/src/web/accordion/manifest.json +351 -0
  19. package/src/web/alert/AI_GUIDE.md +139 -0
  20. package/src/web/alert/alert.css +1 -0
  21. package/src/web/alert/alert.vue +290 -0
  22. package/src/web/alert/alert.vue.d.ts +154 -0
  23. package/src/web/alert/index.ts +3 -0
  24. package/src/web/alert/manifest.json +240 -0
  25. package/src/web/avatar/AI_GUIDE.md +118 -0
  26. package/src/web/avatar/avatar.css +1 -0
  27. package/src/web/avatar/avatar.vue +217 -0
  28. package/src/web/avatar/avatar.vue.d.ts +135 -0
  29. package/src/web/avatar/index.ts +3 -0
  30. package/src/web/avatar/manifest.json +195 -0
  31. package/src/web/badge/AI_GUIDE.md +94 -0
  32. package/src/web/badge/badge.css +1 -0
  33. package/src/web/badge/badge.vue +135 -0
  34. package/src/web/badge/badge.vue.d.ts +108 -0
  35. package/src/web/badge/index.ts +3 -0
  36. package/src/web/badge/manifest.json +141 -0
  37. package/src/web/banner/AI_GUIDE.md +130 -0
  38. package/src/web/banner/banner.css +1 -0
  39. package/src/web/banner/banner.vue +303 -0
  40. package/src/web/banner/banner.vue.d.ts +162 -0
  41. package/src/web/banner/index.ts +3 -0
  42. package/src/web/banner/manifest.json +240 -0
  43. package/src/web/breadcrumb/AI_GUIDE.md +120 -0
  44. package/src/web/breadcrumb/breadcrumb.css +1 -0
  45. package/src/web/breadcrumb/breadcrumb.vue +313 -0
  46. package/src/web/breadcrumb/breadcrumb.vue.d.ts +139 -0
  47. package/src/web/breadcrumb/index.ts +3 -0
  48. package/src/web/breadcrumb/manifest.json +225 -0
  49. package/src/web/button/AI_GUIDE.md +121 -0
  50. package/src/web/button/button.css +1 -0
  51. package/src/web/button/button.vue +283 -0
  52. package/src/web/button/button.vue.d.ts +147 -0
  53. package/src/web/button/index.ts +3 -0
  54. package/src/web/button/manifest.json +177 -0
  55. package/src/web/calendar/AI_GUIDE.md +151 -0
  56. package/src/web/calendar/calendar.css +1 -0
  57. package/src/web/calendar/calendar.vue +1536 -0
  58. package/src/web/calendar/calendar.vue.d.ts +261 -0
  59. package/src/web/calendar/index.ts +3 -0
  60. package/src/web/calendar/manifest.json +470 -0
  61. package/src/web/card/AI_GUIDE.md +133 -0
  62. package/src/web/card/card.css +1 -0
  63. package/src/web/card/card.vue +423 -0
  64. package/src/web/card/card.vue.d.ts +232 -0
  65. package/src/web/card/index.ts +3 -0
  66. package/src/web/card/manifest.json +357 -0
  67. package/src/web/checkbox/AI_GUIDE.md +146 -0
  68. package/src/web/checkbox/checkbox.css +1 -0
  69. package/src/web/checkbox/checkbox.vue +304 -0
  70. package/src/web/checkbox/checkbox.vue.d.ts +189 -0
  71. package/src/web/checkbox/index.ts +3 -0
  72. package/src/web/checkbox/manifest.json +294 -0
  73. package/src/web/chip/AI_GUIDE.md +186 -0
  74. package/src/web/chip/chip.css +1 -0
  75. package/src/web/chip/chip.vue +220 -0
  76. package/src/web/chip/chip.vue.d.ts +140 -0
  77. package/src/web/chip/index.ts +3 -0
  78. package/src/web/chip/manifest.json +186 -0
  79. package/src/web/dropdown/AI_GUIDE.md +167 -0
  80. package/src/web/dropdown/dropdown.css +1 -0
  81. package/src/web/dropdown/dropdown.vue +1257 -0
  82. package/src/web/dropdown/dropdown.vue.d.ts +381 -0
  83. package/src/web/dropdown/index.ts +3 -0
  84. package/src/web/dropdown/manifest.json +576 -0
  85. package/src/web/flex/AI_GUIDE.md +113 -0
  86. package/src/web/flex/flex-item.vue +94 -0
  87. package/src/web/flex/flex-item.vue.d.ts +84 -0
  88. package/src/web/flex/flex.css +1 -0
  89. package/src/web/flex/flex.vue +103 -0
  90. package/src/web/flex/flex.vue.d.ts +92 -0
  91. package/src/web/flex/index.ts +5 -0
  92. package/src/web/flex/manifest.json +162 -0
  93. package/src/web/form/index.ts +7 -0
  94. package/src/web/grid/AI_GUIDE.md +112 -0
  95. package/src/web/grid/grid-item.vue +109 -0
  96. package/src/web/grid/grid-item.vue.d.ts +99 -0
  97. package/src/web/grid/grid.css +1 -0
  98. package/src/web/grid/grid.vue +94 -0
  99. package/src/web/grid/grid.vue.d.ts +84 -0
  100. package/src/web/grid/index.ts +5 -0
  101. package/src/web/grid/manifest.json +153 -0
  102. package/src/web/index.ts +86 -0
  103. package/src/web/input/AI_GUIDE.md +159 -0
  104. package/src/web/input/index.ts +3 -0
  105. package/src/web/input/input.css +1 -0
  106. package/src/web/input/input.vue +521 -0
  107. package/src/web/input/input.vue.d.ts +274 -0
  108. package/src/web/input/manifest.json +465 -0
  109. package/src/web/input-number/AI_GUIDE.md +164 -0
  110. package/src/web/input-number/index.ts +3 -0
  111. package/src/web/input-number/input-number.css +1 -0
  112. package/src/web/input-number/input-number.vue +1153 -0
  113. package/src/web/input-number/input-number.vue.d.ts +343 -0
  114. package/src/web/input-number/manifest.json +575 -0
  115. package/src/web/modal/AI_GUIDE.md +171 -0
  116. package/src/web/modal/index.ts +3 -0
  117. package/src/web/modal/manifest.json +375 -0
  118. package/src/web/modal/modal.css +1 -0
  119. package/src/web/modal/modal.vue +344 -0
  120. package/src/web/modal/modal.vue.d.ts +64 -0
  121. package/src/web/pagination/AI_GUIDE.md +148 -0
  122. package/src/web/pagination/index.ts +21 -0
  123. package/src/web/pagination/manifest.json +432 -0
  124. package/src/web/pagination/pagination-content.vue +42 -0
  125. package/src/web/pagination/pagination-content.vue.d.ts +28 -0
  126. package/src/web/pagination/pagination-ellipsis.vue +55 -0
  127. package/src/web/pagination/pagination-ellipsis.vue.d.ts +28 -0
  128. package/src/web/pagination/pagination-first.vue +161 -0
  129. package/src/web/pagination/pagination-first.vue.d.ts +67 -0
  130. package/src/web/pagination/pagination-item.vue +42 -0
  131. package/src/web/pagination/pagination-item.vue.d.ts +28 -0
  132. package/src/web/pagination/pagination-last.vue +161 -0
  133. package/src/web/pagination/pagination-last.vue.d.ts +67 -0
  134. package/src/web/pagination/pagination-link.vue +118 -0
  135. package/src/web/pagination/pagination-link.vue.d.ts +61 -0
  136. package/src/web/pagination/pagination-next.vue +160 -0
  137. package/src/web/pagination/pagination-next.vue.d.ts +68 -0
  138. package/src/web/pagination/pagination-previous.vue +160 -0
  139. package/src/web/pagination/pagination-previous.vue.d.ts +68 -0
  140. package/src/web/pagination/pagination.css +1 -0
  141. package/src/web/pagination/pagination.vue +730 -0
  142. package/src/web/pagination/pagination.vue.d.ts +247 -0
  143. package/src/web/popover/AI_GUIDE.md +163 -0
  144. package/src/web/popover/index.ts +3 -0
  145. package/src/web/popover/manifest.json +396 -0
  146. package/src/web/popover/popover.css +1 -0
  147. package/src/web/popover/popover.vue +579 -0
  148. package/src/web/popover/popover.vue.d.ts +83 -0
  149. package/src/web/radio/AI_GUIDE.md +155 -0
  150. package/src/web/radio/index.ts +3 -0
  151. package/src/web/radio/manifest.json +294 -0
  152. package/src/web/radio/radio.css +1 -0
  153. package/src/web/radio/radio.vue +288 -0
  154. package/src/web/radio/radio.vue.d.ts +182 -0
  155. package/src/web/selectbox/AI_GUIDE.md +216 -0
  156. package/src/web/selectbox/index.ts +3 -0
  157. package/src/web/selectbox/manifest.json +477 -0
  158. package/src/web/selectbox/selectbox.css +1 -0
  159. package/src/web/selectbox/selectbox.vue +1024 -0
  160. package/src/web/selectbox/selectbox.vue.d.ts +300 -0
  161. package/src/web/sonner/AI_GUIDE.md +98 -0
  162. package/src/web/sonner/index.ts +114 -0
  163. package/src/web/sonner/manifest.json +132 -0
  164. package/src/web/sonner/sonner.css +1 -0
  165. package/src/web/sonner/sonner.vue +180 -0
  166. package/src/web/sonner/sonner.vue.d.ts +113 -0
  167. package/src/web/table/AI_GUIDE.md +145 -0
  168. package/src/web/table/index.ts +34 -0
  169. package/src/web/table/manifest.json +168 -0
  170. package/src/web/table/table-body.vue +42 -0
  171. package/src/web/table/table-body.vue.d.ts +28 -0
  172. package/src/web/table/table-caption.vue +42 -0
  173. package/src/web/table/table-caption.vue.d.ts +28 -0
  174. package/src/web/table/table-cell.vue +71 -0
  175. package/src/web/table/table-cell.vue.d.ts +49 -0
  176. package/src/web/table/table-empty.vue +105 -0
  177. package/src/web/table/table-empty.vue.d.ts +57 -0
  178. package/src/web/table/table-footer.vue +42 -0
  179. package/src/web/table/table-footer.vue.d.ts +28 -0
  180. package/src/web/table/table-head.vue +78 -0
  181. package/src/web/table/table-head.vue.d.ts +50 -0
  182. package/src/web/table/table-header.vue +42 -0
  183. package/src/web/table/table-header.vue.d.ts +28 -0
  184. package/src/web/table/table-row.vue +70 -0
  185. package/src/web/table/table-row.vue.d.ts +44 -0
  186. package/src/web/table/table.css +1 -0
  187. package/src/web/table/table.vue +298 -0
  188. package/src/web/table/table.vue.d.ts +119 -0
  189. package/src/web/tabs/AI_GUIDE.md +150 -0
  190. package/src/web/tabs/index.ts +2 -0
  191. package/src/web/tabs/manifest.json +315 -0
  192. package/src/web/tabs/tabs.css +1 -0
  193. package/src/web/tabs/tabs.vue +164 -0
  194. package/src/web/tabs/tabs.vue.d.ts +60 -0
  195. package/src/web/text/AI_GUIDE.md +129 -0
  196. package/src/web/text/index.ts +2 -0
  197. package/src/web/text/manifest.json +195 -0
  198. package/src/web/text/text.css +1 -0
  199. package/src/web/text/text.vue +195 -0
  200. package/src/web/text/text.vue.d.ts +161 -0
  201. package/src/web/textarea/AI_GUIDE.md +141 -0
  202. package/src/web/textarea/index.ts +3 -0
  203. package/src/web/textarea/manifest.json +438 -0
  204. package/src/web/textarea/textarea.css +1 -0
  205. package/src/web/textarea/textarea.vue +458 -0
  206. package/src/web/textarea/textarea.vue.d.ts +265 -0
  207. package/src/web/tooltip/AI_GUIDE.md +110 -0
  208. package/src/web/tooltip/index.ts +3 -0
  209. package/src/web/tooltip/manifest.json +222 -0
  210. package/src/web/tooltip/tooltip.css +1 -0
  211. package/src/web/tooltip/tooltip.vue +417 -0
  212. package/src/web/tooltip/tooltip.vue.d.ts +150 -0
  213. package/src/webview/bottomsheet/AI_GUIDE.md +141 -0
  214. package/src/webview/bottomsheet/bottomsheet.css +1 -0
  215. package/src/webview/bottomsheet/bottomsheet.vue +441 -0
  216. package/src/webview/bottomsheet/bottomsheet.vue.d.ts +178 -0
  217. package/src/webview/bottomsheet/index.ts +4 -0
  218. package/src/webview/bottomsheet/manifest.json +377 -0
  219. package/src/webview/button/AI_GUIDE.md +79 -0
  220. package/src/webview/button/button-ios.css +1 -0
  221. package/src/webview/button/button-ios.vue +138 -0
  222. package/src/webview/button/button-ios.vue.d.ts +102 -0
  223. package/src/webview/button/button-material.css +1 -0
  224. package/src/webview/button/button-material.vue +138 -0
  225. package/src/webview/button/button-material.vue.d.ts +102 -0
  226. package/src/webview/button/index.ts +7 -0
  227. package/src/webview/button/manifest.json +148 -0
  228. package/src/webview/index.ts +7 -0
  229. package/tailwind-preset.cjs +62 -0
  230. package/tailwind-preset.js +62 -0
  231. package/ttdk-manifest.json +10188 -0
  232. package/README.md +0 -3
@@ -0,0 +1,465 @@
1
+ {
2
+ "name": "@ttdk-design-system/input",
3
+ "component": "Input",
4
+ "folder": "input",
5
+ "description": "Komponen Input TTDK sesuai spesifikasi Anatomy Desain: 1. Field title (14px Semibold, #141313) 2. (Opsional) label (12px Regular, #9698A2) 3. Border radius 8px 4. Icon left / right (24px) 5. Field content (14px Regular, #141313, placeholder #9698A2) 6. Additional information / Helper text (12px Regular, #3C4245)",
6
+ "stylesheets": [
7
+ {
8
+ "theme": "common",
9
+ "file": "input.css",
10
+ "importPath": "web/input/input.css"
11
+ }
12
+ ],
13
+ "props": {
14
+ "label": {
15
+ "name": "label",
16
+ "type": "string",
17
+ "optional": true,
18
+ "default": null,
19
+ "description": "Teks label judul field yang ditampilkan di atas input (14px Semibold, #141313).",
20
+ "example": null,
21
+ "param": null
22
+ },
23
+ "labelStyle": {
24
+ "name": "labelStyle",
25
+ "type": "UiProps",
26
+ "optional": true,
27
+ "default": null,
28
+ "description": "Style kustom untuk elemen label judul field (UiProps).",
29
+ "example": null,
30
+ "param": null
31
+ },
32
+ "labelClass": {
33
+ "name": "labelClass",
34
+ "type": "string",
35
+ "optional": true,
36
+ "default": null,
37
+ "description": "Class CSS kustom untuk elemen label judul field.",
38
+ "example": null,
39
+ "param": null
40
+ },
41
+ "wrapperStyle": {
42
+ "name": "wrapperStyle",
43
+ "type": "UiProps",
44
+ "optional": true,
45
+ "default": null,
46
+ "description": "Style kustom untuk elemen kontainer input wrapper (UiProps).",
47
+ "example": null,
48
+ "param": null
49
+ },
50
+ "wrapperClass": {
51
+ "name": "wrapperClass",
52
+ "type": "string",
53
+ "optional": true,
54
+ "default": null,
55
+ "description": "Class CSS kustom untuk elemen kontainer input wrapper.",
56
+ "example": null,
57
+ "param": null
58
+ },
59
+ "inputStyle": {
60
+ "name": "inputStyle",
61
+ "type": "UiProps",
62
+ "optional": true,
63
+ "default": null,
64
+ "description": "Style kustom untuk elemen input control HTML (UiProps).",
65
+ "example": null,
66
+ "param": null
67
+ },
68
+ "inputClass": {
69
+ "name": "inputClass",
70
+ "type": "string",
71
+ "optional": true,
72
+ "default": null,
73
+ "description": "Class CSS kustom untuk elemen input control HTML.",
74
+ "example": null,
75
+ "param": null
76
+ },
77
+ "errorMessageStyle": {
78
+ "name": "errorMessageStyle",
79
+ "type": "UiProps",
80
+ "optional": true,
81
+ "default": null,
82
+ "description": "Style kustom untuk elemen pesan error validasi (UiProps).",
83
+ "example": null,
84
+ "param": null
85
+ },
86
+ "errorMessageClass": {
87
+ "name": "errorMessageClass",
88
+ "type": "string",
89
+ "optional": true,
90
+ "default": null,
91
+ "description": "Class CSS kustom untuk elemen pesan error validasi.",
92
+ "example": null,
93
+ "param": null
94
+ },
95
+ "helperTextStyle": {
96
+ "name": "helperTextStyle",
97
+ "type": "UiProps",
98
+ "optional": true,
99
+ "default": null,
100
+ "description": "Style kustom untuk elemen helper text (UiProps).",
101
+ "example": null,
102
+ "param": null
103
+ },
104
+ "helperTextClass": {
105
+ "name": "helperTextClass",
106
+ "type": "string",
107
+ "optional": true,
108
+ "default": null,
109
+ "description": "Class CSS kustom untuk elemen helper text.",
110
+ "example": null,
111
+ "param": null
112
+ },
113
+ "optional": {
114
+ "name": "optional",
115
+ "type": "boolean",
116
+ "optional": true,
117
+ "default": null,
118
+ "description": "Menandai field sebagai opsi opsional dengan menambahkan teks '(Opsional)' (12px Regular, #9698A2).",
119
+ "example": null,
120
+ "param": null
121
+ },
122
+ "optionalText": {
123
+ "name": "optionalText",
124
+ "type": "string",
125
+ "optional": true,
126
+ "default": "(Opsional)",
127
+ "description": "Kustomisasi teks keterangan opsional.",
128
+ "example": null,
129
+ "param": null
130
+ },
131
+ "placeholder": {
132
+ "name": "placeholder",
133
+ "type": "string",
134
+ "optional": true,
135
+ "default": null,
136
+ "description": "Nilai teks placeholder saat input kosong (#9698A2).",
137
+ "example": null,
138
+ "param": null
139
+ },
140
+ "value": {
141
+ "name": "value",
142
+ "type": "string | number",
143
+ "optional": true,
144
+ "default": null,
145
+ "description": "Nilai terkontrol (controlled value) pada input.",
146
+ "example": null,
147
+ "param": null
148
+ },
149
+ "defaultValue": {
150
+ "name": "defaultValue",
151
+ "type": "string | number",
152
+ "optional": true,
153
+ "default": null,
154
+ "description": "Nilai awal tidak terkontrol (uncontrolled initial value).",
155
+ "example": null,
156
+ "param": null
157
+ },
158
+ "type": {
159
+ "name": "type",
160
+ "type": "string",
161
+ "optional": true,
162
+ "default": "text",
163
+ "description": "Tipe field input HTML standar.",
164
+ "example": null,
165
+ "param": null
166
+ },
167
+ "name": {
168
+ "name": "name",
169
+ "type": "string",
170
+ "optional": true,
171
+ "default": null,
172
+ "description": "Nama form field HTML untuk integrasi formulir.",
173
+ "example": null,
174
+ "param": null
175
+ },
176
+ "id": {
177
+ "name": "id",
178
+ "type": "string",
179
+ "optional": true,
180
+ "default": null,
181
+ "description": "Identifier unik elemen input.",
182
+ "example": null,
183
+ "param": null
184
+ },
185
+ "error": {
186
+ "name": "error",
187
+ "type": "boolean",
188
+ "optional": true,
189
+ "default": "false",
190
+ "description": "Status apakah input sedang dalam kondisi error / tidak valid.",
191
+ "example": null,
192
+ "param": null
193
+ },
194
+ "errorMessage": {
195
+ "name": "errorMessage",
196
+ "type": "string",
197
+ "optional": true,
198
+ "default": null,
199
+ "description": "Pesan teks penjelasan kesalahan validasi di bawah field.",
200
+ "example": null,
201
+ "param": null
202
+ },
203
+ "helperText": {
204
+ "name": "helperText",
205
+ "type": "string",
206
+ "optional": true,
207
+ "default": null,
208
+ "description": "Teks petunjuk atau keterangan bantuan di bawah field (12px Regular, #3C4245).",
209
+ "example": null,
210
+ "param": null
211
+ },
212
+ "helperTextPosition": {
213
+ "name": "helperTextPosition",
214
+ "type": "'top' | 'bottom'",
215
+ "optional": true,
216
+ "default": null,
217
+ "description": "Posisi teks helper",
218
+ "example": null,
219
+ "param": null
220
+ },
221
+ "size": {
222
+ "name": "size",
223
+ "type": "'sm' | 'md' | 'lg'",
224
+ "optional": true,
225
+ "default": "md",
226
+ "description": "Skala ukuran input field. - `'sm'`: 36px - `'md'`: 48px (standar) - `'lg'`: 56px",
227
+ "example": null,
228
+ "param": null
229
+ },
230
+ "rounded": {
231
+ "name": "rounded",
232
+ "type": "'none' | 'sm' | 'md' | 'lg' | 'full'",
233
+ "optional": true,
234
+ "default": "md",
235
+ "description": "Bentuk sudut kelengkungan input. - `'none'`: 0px - `'sm'`: 4px - `'md'`: 8px (standar desain) - `'lg'`: 12px - `'full'`: 9999px (kapsul)",
236
+ "example": null,
237
+ "param": null
238
+ },
239
+ "block": {
240
+ "name": "block",
241
+ "type": "boolean",
242
+ "optional": true,
243
+ "default": "false",
244
+ "description": "Menjadikan lebar field input memenuhi kontainer penuh (full-width 100%).",
245
+ "example": null,
246
+ "param": null
247
+ },
248
+ "disabled": {
249
+ "name": "disabled",
250
+ "type": "boolean",
251
+ "optional": true,
252
+ "default": "false",
253
+ "description": "Status apakah field dinonaktifkan (disabled).",
254
+ "example": null,
255
+ "param": null
256
+ },
257
+ "readOnly": {
258
+ "name": "readOnly",
259
+ "type": "boolean",
260
+ "optional": true,
261
+ "default": "false",
262
+ "description": "Status apakah field bersifat hanya-baca (readonly).",
263
+ "example": null,
264
+ "param": null
265
+ },
266
+ "required": {
267
+ "name": "required",
268
+ "type": "boolean",
269
+ "optional": true,
270
+ "default": "false",
271
+ "description": "Menandai field sebagai input wajib diisi (menampilkan tanda bintang merah *).",
272
+ "example": null,
273
+ "param": null
274
+ },
275
+ "iconLeft": {
276
+ "name": "iconLeft",
277
+ "type": "any",
278
+ "optional": true,
279
+ "default": null,
280
+ "description": "Ikon di sebelah kiri dalam input (ukuran 20-24px, misal: Calendar, Search, User).",
281
+ "example": null,
282
+ "param": null
283
+ },
284
+ "iconRight": {
285
+ "name": "iconRight",
286
+ "type": "any",
287
+ "optional": true,
288
+ "default": null,
289
+ "description": "Ikon di sebelah kanan dalam input (ukuran 20-24px, misal: Chevron-down, Eye, Close).",
290
+ "example": null,
291
+ "param": null
292
+ },
293
+ "addonLeft": {
294
+ "name": "addonLeft",
295
+ "type": "string | any",
296
+ "optional": true,
297
+ "default": null,
298
+ "description": "Addon / teks prefix di sebelah kiri luar input (misal: 'Text', '+62 (IDN)').",
299
+ "example": null,
300
+ "param": null
301
+ },
302
+ "addonRight": {
303
+ "name": "addonRight",
304
+ "type": "string | any",
305
+ "optional": true,
306
+ "default": null,
307
+ "description": "Addon / teks suffix di sebelah kanan luar input (misal: 'Text', '.com', 'kg').",
308
+ "example": null,
309
+ "param": null
310
+ },
311
+ "autoComplete": {
312
+ "name": "autoComplete",
313
+ "type": "string",
314
+ "optional": true,
315
+ "default": null,
316
+ "description": "Konfigurasi atribut autocomplete HTML.",
317
+ "example": null,
318
+ "param": null
319
+ },
320
+ "maxLength": {
321
+ "name": "maxLength",
322
+ "type": "number",
323
+ "optional": true,
324
+ "default": null,
325
+ "description": "Batas maksimum panjang karakter.",
326
+ "example": null,
327
+ "param": null
328
+ },
329
+ "minLength": {
330
+ "name": "minLength",
331
+ "type": "number",
332
+ "optional": true,
333
+ "default": null,
334
+ "description": "Batas minimum panjang karakter.",
335
+ "example": null,
336
+ "param": null
337
+ },
338
+ "min": {
339
+ "name": "min",
340
+ "type": "number | string",
341
+ "optional": true,
342
+ "default": null,
343
+ "description": "Nilai minimum untuk input bertipe number atau date.",
344
+ "example": null,
345
+ "param": null
346
+ },
347
+ "max": {
348
+ "name": "max",
349
+ "type": "number | string",
350
+ "optional": true,
351
+ "default": null,
352
+ "description": "Nilai maksimum untuk input bertipe number atau date.",
353
+ "example": null,
354
+ "param": null
355
+ },
356
+ "style": {
357
+ "name": "style",
358
+ "type": "any",
359
+ "optional": true,
360
+ "default": null,
361
+ "description": "Inline CSS style object native.",
362
+ "example": null,
363
+ "param": null
364
+ },
365
+ "ui": {
366
+ "name": "ui",
367
+ "type": "UiProps",
368
+ "optional": true,
369
+ "default": null,
370
+ "description": "Kustomisasi visual granular root / form-item (UiProps).",
371
+ "example": null,
372
+ "param": null
373
+ },
374
+ "onChange": {
375
+ "name": "onChange",
376
+ "type": "(event: any) => void",
377
+ "optional": true,
378
+ "default": null,
379
+ "description": "Callback event saat nilai input berubah.",
380
+ "example": null,
381
+ "param": null
382
+ },
383
+ "onInput": {
384
+ "name": "onInput",
385
+ "type": "(event: any) => void",
386
+ "optional": true,
387
+ "default": null,
388
+ "description": "Callback event saat pengguna mengetik (input event).",
389
+ "example": null,
390
+ "param": null
391
+ },
392
+ "onBlur": {
393
+ "name": "onBlur",
394
+ "type": "(event: any) => void",
395
+ "optional": true,
396
+ "default": null,
397
+ "description": "Callback event saat field input kehilangan fokus.",
398
+ "example": null,
399
+ "param": null
400
+ },
401
+ "onFocus": {
402
+ "name": "onFocus",
403
+ "type": "(event: any) => void",
404
+ "optional": true,
405
+ "default": null,
406
+ "description": "Callback event saat field input mendapatkan fokus.",
407
+ "example": null,
408
+ "param": null
409
+ },
410
+ "inputRef": {
411
+ "name": "inputRef",
412
+ "type": "any",
413
+ "optional": true,
414
+ "default": null,
415
+ "description": "Ref instance elemen input HTML untuk akses kontrol DOM langsung (focus, blur, select).",
416
+ "example": null,
417
+ "param": null
418
+ },
419
+ "className": {
420
+ "name": "className",
421
+ "type": "string",
422
+ "optional": true,
423
+ "default": null,
424
+ "description": "Class CSS kustom.",
425
+ "example": null,
426
+ "param": null
427
+ },
428
+ "onKeyDown": {
429
+ "name": "onKeyDown",
430
+ "type": "(event: any) => void",
431
+ "optional": true,
432
+ "default": null,
433
+ "description": "Callback event tombol keyboard ditekan.",
434
+ "example": null,
435
+ "param": null
436
+ },
437
+ "onKeyUp": {
438
+ "name": "onKeyUp",
439
+ "type": "(event: any) => void",
440
+ "optional": true,
441
+ "default": null,
442
+ "description": "Callback event tombol keyboard dilepaskan.",
443
+ "example": null,
444
+ "param": null
445
+ },
446
+ "loading": {
447
+ "name": "loading",
448
+ "type": "boolean",
449
+ "optional": true,
450
+ "default": "false",
451
+ "description": "Menampilkan spinner dan menonaktifkan interaksi field sementara menunggu proses async.",
452
+ "example": null,
453
+ "param": null
454
+ }
455
+ },
456
+ "subInterfaces": {},
457
+ "supportedFrameworks": [
458
+ "react",
459
+ "vue",
460
+ "svelte"
461
+ ],
462
+ "themes": [
463
+ "tw"
464
+ ]
465
+ }
@@ -0,0 +1,164 @@
1
+ # <InputNumber /> — TTDK Component Reference
2
+
3
+ Komponen InputNumber TTDK sesuai spesifikasi Anatomy Desain Form & Input: 1. Field title / label (14px Semibold, #141313) 2. (Opsional) label (12px Regular, #9698A2) 3. Border radius 8px default (rounded) 4. Stepper controls (+/- spin buttons) dengan mode right-stacked atau split-counter 5. Input control numerik terproteksi min, max, step, & precision 6. Additional information / Helper text & error message
4
+
5
+ ## 1. Stylesheets & Theming (Pure CSS)
6
+ Import the corresponding stylesheet for the theme you wish to use:
7
+ - **COMMON Theme**: `import "@ttdk-design-system/library-<react|vue|svelte>/web/input-number/input-number.css";`
8
+
9
+ ## 2. Subpath Component Import
10
+ ```ts
11
+ // React
12
+ import InputNumber from "@ttdk-design-system/library-react/web/input-number";
13
+
14
+ // Vue 3
15
+ import InputNumber from "@ttdk-design-system/library-vue/web/input-number";
16
+
17
+ // Svelte
18
+ import InputNumber from "@ttdk-design-system/library-svelte/web/input-number";
19
+ ```
20
+
21
+ ## 3. Props & API Reference
22
+
23
+ | Prop | Type | Default | Description |
24
+ | :--- | :--- | :--- | :--- |
25
+
26
+ ### Sub-interface: `InputNumberProps`
27
+
28
+ | Field | Type | Default | Description |
29
+ | :--- | :--- | :--- | :--- |
30
+ | `label?` | `string` | `-` | Teks label judul field yang ditampilkan di atas input (14px Semibold, #141313). |
31
+ | `labelStyle?` | `UiProps` | `-` | Style kustom untuk elemen label judul field (UiProps). |
32
+ | `labelClass?` | `string` | `-` | Class CSS kustom untuk elemen label judul field. |
33
+ | `wrapperStyle?` | `UiProps` | `-` | Style kustom untuk elemen kontainer input wrapper (UiProps). |
34
+ | `wrapperClass?` | `string` | `-` | Class CSS kustom untuk elemen kontainer input wrapper. |
35
+ | `inputStyle?` | `UiProps` | `-` | Style kustom untuk elemen input control HTML (UiProps). |
36
+ | `inputClass?` | `string` | `-` | Class CSS kustom untuk elemen input control HTML. |
37
+ | `controlsStyle?` | `UiProps` | `-` | Style kustom untuk elemen stepper kontrol tombol (UiProps). |
38
+ | `controlsClass?` | `string` | `-` | Class CSS kustom untuk elemen stepper kontrol tombol. |
39
+ | `errorMessageStyle?` | `UiProps` | `-` | Style kustom untuk elemen pesan error validasi (UiProps). |
40
+ | `errorMessageClass?` | `string` | `-` | Class CSS kustom untuk elemen pesan error validasi. |
41
+ | `helperTextStyle?` | `UiProps` | `-` | Style kustom untuk elemen helper text (UiProps). |
42
+ | `helperTextClass?` | `string` | `-` | Class CSS kustom untuk elemen helper text. |
43
+ | `optional?` | `boolean` | `-` | Menandai field sebagai opsi opsional dengan menambahkan teks '(Opsional)' (12px Regular, #9698A2). |
44
+ | `optionalText?` | `string` | `(Opsional)` | Kustomisasi teks keterangan opsional. |
45
+ | `placeholder?` | `string` | `-` | Nilai teks placeholder saat input kosong (#9698A2). |
46
+ | `value?` | `number | string` | `-` | Nilai terkontrol (controlled value) pada input number. |
47
+ | `defaultValue?` | `number | string` | `-` | Nilai awal tidak terkontrol (uncontrolled initial value). |
48
+ | `name?` | `string` | `-` | Nama form field HTML untuk integrasi formulir. |
49
+ | `id?` | `string` | `-` | Identifier unik elemen input. |
50
+ | `error?` | `boolean` | `false` | Status apakah input sedang dalam kondisi error / tidak valid. |
51
+ | `errorMessage?` | `string` | `-` | Pesan teks penjelasan kesalahan validasi di bawah field. |
52
+ | `helperText?` | `string` | `-` | Teks petunjuk atau keterangan bantuan di bawah field (12px Regular, #3C4245). |
53
+ | `helperTextPosition?` | `'top' | 'bottom'` | `-` | Posisi teks helper |
54
+ | `size?` | `'sm' | 'md' | 'lg'` | `md` | Skala ukuran input field. - `'sm'`: 38px - `'md'`: 48px (standar) - `'lg'`: 56px |
55
+ | `rounded?` | `'none' | 'sm' | 'md' | 'lg' | 'full'` | `md` | Bentuk sudut kelengkungan input. - `'none'`: 0px - `'sm'`: 4px - `'md'`: 8px (standar desain) - `'lg'`: 12px - `'full'`: 9999px (kapsul) |
56
+ | `block?` | `boolean` | `false` | Menjadikan lebar field input memenuhi kontainer penuh (full-width 100%). |
57
+ | `disabled?` | `boolean` | `false` | Status apakah field dinonaktifkan (disabled). |
58
+ | `readOnly?` | `boolean` | `false` | Status apakah field bersifat hanya-baca (readonly). |
59
+ | `required?` | `boolean` | `false` | Menandai field sebagai input wajib diisi (menampilkan tanda bintang merah *). |
60
+ | `iconLeft?` | `any` | `-` | Ikon di sebelah kiri dalam input (ukuran 20-24px, misal: Hash, Calculator, Currency). |
61
+ | `iconRight?` | `any` | `-` | Ikon di sebelah kanan dalam input (ukuran 20-24px). |
62
+ | `addonLeft?` | `string | any` | `-` | Addon / teks prefix di sebelah kiri luar input (misal: 'Rp', '+62'). |
63
+ | `addonRight?` | `string | any` | `-` | Addon / teks suffix di sebelah kanan luar input (misal: 'kg', 'pcs', '%'). |
64
+ | `autoComplete?` | `string` | `-` | Konfigurasi atribut autocomplete HTML. |
65
+ | `min?` | `number` | `-` | Nilai minimum yang diizinkan untuk input number. |
66
+ | `max?` | `number` | `-` | Nilai maksimum yang diizinkan untuk input number. |
67
+ | `step?` | `number` | `1` | Nilai selisih kenaikan atau penurunan setiap kali stepper ditekan. |
68
+ | `precision?` | `number` | `-` | Jumlah angka di belakang koma (presisi desimal). |
69
+ | `thousandSeparator?` | `boolean` | `false` | Mengaktifkan format pemisah ribuan otomatis dengan titik '.' (contoh: 1.000 atau 10.000). Nilai yang diteruskan ke callback form (onChange / onValueChange) tetap berupa number murni standar (contoh: 1000). |
70
+ | `allowExponential?` | `boolean` | `false` | Mengizinkan tanda eksponensial ilmiah 'e' / 'E'. |
71
+ | `type?` | `string` | `text` | Tipe input HTML. Secara default 'text' dengan inputMode 'numeric'/'decimal' agar mendukung formatting dan pembatasan karakter tanpa bug bawaan browser. |
72
+ | `controls?` | `boolean` | `true` | Menampilkan tombol stepper panah kontrol atas/bawah. |
73
+ | `withoutButton?` | `boolean` | `false` | Menghilangkan tombol kontrol increment dan decrement sehingga tampil seperti input teks biasa. |
74
+ | `controlsPosition?` | `'right' | 'split'` | `right` | Posisi letak tombol kontrol stepper: - `'right'`: tombol stepper ditumpuk di sisi kanan (standar) - `'split'`: tombol minus di sisi kiri dan tombol plus di sisi kanan (mode counter) |
75
+ | `maxLength?` | `number` | `-` | Batas maksimum panjang karakter. |
76
+ | `minLength?` | `number` | `-` | Batas minimum panjang karakter. |
77
+ | `style?` | `any` | `-` | Inline CSS style object native. |
78
+ | `ui?` | `UiProps` | `-` | Kustomisasi visual granular root / form-item (UiProps). |
79
+ | `onChange?` | `(event: any) => void` | `-` | Callback event saat nilai input berubah (SyntheticEvent standar HTML). |
80
+ | `onValueChange?` | `(value: number | undefined) => void` | `-` | Callback event saat nilai numerik angka berubah. |
81
+ | `onInput?` | `(event: any) => void` | `-` | Callback event saat pengguna mengetik (input event). |
82
+ | `onBlur?` | `(event: any) => void` | `-` | Callback event saat field input kehilangan fokus. |
83
+ | `onFocus?` | `(event: any) => void` | `-` | Callback event saat field input mendapatkan fokus. |
84
+ | `inputRef?` | `any` | `-` | Ref instance elemen input HTML untuk akses kontrol DOM langsung (focus, blur, select). |
85
+ | `className?` | `string` | `-` | Class CSS kustom. |
86
+ | `onKeyDown?` | `(event: any) => void` | `-` | Callback event tombol keyboard ditekan. |
87
+ | `onKeyUp?` | `(event: any) => void` | `-` | Callback event tombol keyboard dilepaskan. |
88
+ | `onCopy?` | `(event: any) => void` | `-` | Callback event saat teks di-copy. |
89
+ | `onCut?` | `(event: any) => void` | `-` | Callback event saat teks di-cut. |
90
+ | `loading?` | `boolean` | `false` | Menampilkan spinner dan menonaktifkan interaksi field sementara menunggu proses async. |
91
+
92
+ ## 4. Usage Examples
93
+
94
+ ### React Example
95
+ ```tsx
96
+ import { useState } from "react";
97
+ import InputNumber from "@ttdk-design-system/library-react/web/input-number";
98
+ import "@ttdk-design-system/library-react/web/input-number/input-number.css";
99
+
100
+ export function Example() {
101
+ const [dosage, setDosage] = useState(500);
102
+
103
+ return (
104
+ <div style={{ maxWidth: '300px' }}>
105
+ <InputNumber
106
+ label="Dosis Obat (mg)"
107
+ value={dosage}
108
+ min={50}
109
+ max={2000}
110
+ step={50}
111
+ helperText="Dosis paracetamol standar dewasa: 500 mg per dosis."
112
+ onChange={(val) => setDosage(val)}
113
+ />
114
+ </div>
115
+ );
116
+ }
117
+ ```
118
+
119
+ ### Vue 3 Example
120
+ ```vue
121
+ <script setup lang="ts">
122
+ import { ref } from "vue";
123
+ import InputNumber from "@ttdk-design-system/library-vue/web/input-number";
124
+ import "@ttdk-design-system/library-vue/web/input-number/input-number.css";
125
+
126
+ const dosage = ref(500);
127
+ </script>
128
+
129
+ <template>
130
+ <div style="max-width: 300px;">
131
+ <InputNumber
132
+ label="Dosis Obat (mg)"
133
+ :value="dosage"
134
+ :min="50"
135
+ :max="2000"
136
+ :step="50"
137
+ helper-text="Dosis paracetamol standar dewasa: 500 mg per dosis."
138
+ @change="(val: any) => (dosage = val)"
139
+ />
140
+ </div>
141
+ </template>
142
+ ```
143
+
144
+ ### Svelte Example
145
+ ```svelte
146
+ <script lang="ts">
147
+ import InputNumber from "@ttdk-design-system/library-svelte/web/input-number";
148
+ import "@ttdk-design-system/library-svelte/web/input-number/input-number.css";
149
+
150
+ let dosage = 500;
151
+ </script>
152
+
153
+ <div style="max-width: 300px;">
154
+ <InputNumber
155
+ label="Dosis Obat (mg)"
156
+ value={dosage}
157
+ min={50}
158
+ max={2000}
159
+ step={50}
160
+ helperText="Dosis paracetamol standar dewasa: 500 mg per dosis."
161
+ on:change={(e) => (dosage = e.detail)}
162
+ />
163
+ </div>
164
+ ```
@@ -0,0 +1,3 @@
1
+ export { default } from './input-number.vue';
2
+ export { default as InputNumber } from './input-number.vue';
3
+ export * from './input-number.vue';
@@ -0,0 +1 @@
1
+ .ttdk-form-item{gap:var(--ttdk-spacing-xxs);box-sizing:border-box;width:100%;font-family:var(--ttdk-font-sans);flex-direction:column;display:flex}.ttdk-form-item[data-block=true]{width:100%}.ttdk-form-label{font-size:var(--ttdk-font-size-14);font-weight:var(--ttdk-font-weight-semibold);line-height:var(--ttdk-font-size-20);color:var(--ttdk-ui-color,var(--ttdk-text-icon-primary));align-items:center;gap:var(--ttdk-spacing-xxs);user-select:none;display:flex}.dark .ttdk-form-label{color:var(--ttdk-ui-color,var(--ttdk-text-icon-primary))}.ttdk-form-required{color:var(--ttdk-stroke-status-error);font-weight:var(--ttdk-font-weight-bold)}.dark .ttdk-form-required{color:var(--ttdk-stroke-status-error)}.ttdk-form-optional{font-size:var(--ttdk-font-size-12);font-weight:var(--ttdk-font-weight-regular);line-height:var(--ttdk-font-size-18);color:var(--ttdk-text-icon-disabled);margin-left:var(--ttdk-spacing-none)}.dark .ttdk-form-optional{color:var(--ttdk-text-icon-disabled)}.ttdk-input-wrapper{background:var(--ttdk-bg-base-primary);border:var(--ttdk-stroke-width-thin) solid var(--ttdk-stroke-subtle);border-radius:var(--ttdk-radius-input-lg);box-sizing:border-box;align-items:stretch;width:100%;height:48px;transition:border-color .15s,box-shadow .15s,background-color .15s;display:flex;overflow:hidden}.dark .ttdk-input-wrapper{background:var(--ttdk-bg-base-primary);border-color:var(--ttdk-stroke-subtle)}.ttdk-input-wrapper[data-filled=true],.dark .ttdk-input-wrapper[data-filled=true]{border-color:var(--ttdk-stroke-strong)}.ttdk-input-wrapper:focus-within{box-shadow:0 0 0 3px color-mix(in srgb, var(--ttdk-stroke-border-focus) 15%, transparent);border-color:var(--ttdk-stroke-border-focus)!important}.dark .ttdk-input-wrapper:focus-within{box-shadow:0 0 0 3px color-mix(in srgb, var(--ttdk-stroke-border-focus) 25%, transparent);border-color:var(--ttdk-stroke-border-focus)!important}.ttdk-input-wrapper[data-error=true]{border-color:var(--ttdk-stroke-status-error)!important}.ttdk-input-wrapper[data-error=true]:focus-within{box-shadow:0 0 0 3px color-mix(in srgb, var(--ttdk-stroke-status-error) 15%, transparent);border-color:var(--ttdk-stroke-status-error)!important}.dark .ttdk-input-wrapper[data-error=true]{border-color:var(--ttdk-stroke-status-error)!important}.ttdk-form-item[data-error=true] .ttdk-form-label,.dark .ttdk-form-item[data-error=true] .ttdk-form-label{color:var(--ttdk-text-icon-status-error)}.ttdk-input-wrapper[data-disabled=true],.ttdk-form-item[data-disabled=true] .ttdk-input-wrapper{cursor:not-allowed;opacity:.85;background:var(--ttdk-bg-secondary-disabled)!important;border-color:var(--ttdk-stroke-subtle)!important}.dark .ttdk-input-wrapper[data-disabled=true],.dark .ttdk-form-item[data-disabled=true] .ttdk-input-wrapper{opacity:.75;background:var(--ttdk-bg-secondary-disabled)!important;border-color:var(--ttdk-stroke-subtle)!important}.ttdk-input-inner{align-items:center;gap:var(--ttdk-spacing-sm);min-width:0;height:100%;padding:0 var(--ttdk-spacing-sm);flex:1;display:flex;position:relative}.ttdk-input-icon{width:var(--ttdk-font-size-24);height:var(--ttdk-font-size-24);color:var(--ttdk-text-icon-disabled);user-select:none;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.dark .ttdk-input-icon{color:var(--ttdk-text-icon-disabled)}.ttdk-input-icon svg{width:var(--ttdk-font-size-24);height:var(--ttdk-font-size-24)}.ttdk-input-icon-left{margin-left:var(--ttdk-spacing-none);margin-right:var(--ttdk-spacing-none)}.ttdk-input-icon-right{margin-right:var(--ttdk-spacing-none);margin-left:var(--ttdk-spacing-none)}.ttdk-input-spinner{flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.ttdk-input-spinner svg{fill:none;stroke:currentColor;stroke-width:2.2px;stroke-linecap:round;width:20px;height:20px;animation:1.2s steps(12,end) infinite ttdk-input-spin}@keyframes ttdk-input-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.ttdk-input-control{width:100%;min-width:0;font-size:var(--ttdk-font-size-14);font-weight:var(--ttdk-font-weight-regular);line-height:var(--ttdk-line-height-body);height:100%;color:var(--ttdk-ui-color,var(--ttdk-text-icon-primary));box-sizing:border-box;font-family:var(--ttdk-font-sans);background:0 0;border:none;outline:none;flex:1;padding:0}.dark .ttdk-input-control{color:var(--ttdk-ui-color,var(--ttdk-text-icon-primary))}.ttdk-input-number-control::-webkit-outer-spin-button,.ttdk-input-number-control::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.ttdk-input-number-control[type=number]{-moz-appearance:textfield}.ttdk-input-number-wrapper[data-split=true] .ttdk-input-number-control{text-align:center}.ttdk-input-control::placeholder{color:var(--ttdk-text-icon-disabled);opacity:1}.dark .ttdk-input-control::placeholder{color:var(--ttdk-text-icon-disabled)}.ttdk-input-control:disabled{cursor:not-allowed;color:var(--ttdk-text-icon-disabled)}.dark .ttdk-input-control:disabled{color:var(--ttdk-text-icon-disabled)}.ttdk-input-wrapper[data-size=sm]{height:36px}.ttdk-input-wrapper[data-size=sm] .ttdk-input-control{font-size:var(--ttdk-font-size-12)}.ttdk-input-wrapper[data-size=sm] .ttdk-input-icon,.ttdk-input-wrapper[data-size=sm] .ttdk-input-icon svg{width:var(--ttdk-font-size-20);height:var(--ttdk-font-size-20)}.ttdk-input-wrapper[data-size=sm] .ttdk-input-icon.ttdk-input-spinner,.ttdk-input-wrapper[data-size=sm] .ttdk-input-icon.ttdk-input-spinner svg,.ttdk-input-wrapper[data-size=sm] .ttdk-input-spinner,.ttdk-input-wrapper[data-size=sm] .ttdk-input-spinner svg{width:16px;height:16px}.ttdk-input-wrapper[data-size=md]{height:48px}.ttdk-input-wrapper[data-size=md] .ttdk-input-control{font-size:var(--ttdk-font-size-14)}.ttdk-input-wrapper[data-size=md] .ttdk-input-icon.ttdk-input-spinner,.ttdk-input-wrapper[data-size=md] .ttdk-input-icon.ttdk-input-spinner svg,.ttdk-input-wrapper[data-size=md] .ttdk-input-spinner,.ttdk-input-wrapper[data-size=md] .ttdk-input-spinner svg{width:20px;height:20px}.ttdk-input-wrapper[data-size=lg]{height:56px}.ttdk-input-wrapper[data-size=lg] .ttdk-input-control{font-size:var(--ttdk-font-size-16)}.ttdk-input-wrapper[data-size=lg] .ttdk-input-icon.ttdk-input-spinner,.ttdk-input-wrapper[data-size=lg] .ttdk-input-icon.ttdk-input-spinner svg,.ttdk-input-wrapper[data-size=lg] .ttdk-input-spinner,.ttdk-input-wrapper[data-size=lg] .ttdk-input-spinner svg{width:24px;height:24px}.ttdk-input-wrapper[data-rounded=none]{border-radius:var(--ttdk-radius-input-none)}.ttdk-input-wrapper[data-rounded=xs]{border-radius:var(--ttdk-radius-input-xs)}.ttdk-input-wrapper[data-rounded=sm]{border-radius:var(--ttdk-radius-input-sm)}.ttdk-input-wrapper[data-rounded=md]{border-radius:var(--ttdk-radius-input-md)}.ttdk-input-wrapper[data-rounded=lg]{border-radius:var(--ttdk-radius-input-lg)}.ttdk-input-wrapper[data-rounded=xl]{border-radius:var(--ttdk-radius-input-xl)}.ttdk-input-wrapper[data-rounded=full]{border-radius:var(--ttdk-radius-input-full)}.ttdk-input-addon{padding:0 var(--ttdk-spacing-md);font-size:var(--ttdk-font-size-14);font-weight:var(--ttdk-font-weight-medium);color:var(--ttdk-text-icon-secondary);background:var(--ttdk-bg-secondary-disabled);border-color:var(--ttdk-stroke-subtle);user-select:none;white-space:nowrap;box-sizing:border-box;justify-content:center;align-items:center;display:flex}.dark .ttdk-input-addon{background:var(--ttdk-bg-secondary-disabled);color:var(--ttdk-text-icon-secondary);border-color:var(--ttdk-stroke-subtle)}.ttdk-input-addon-left{border-right:var(--ttdk-stroke-width-thin) solid var(--ttdk-stroke-subtle)}.dark .ttdk-input-addon-left{border-right-color:var(--ttdk-stroke-subtle)}.ttdk-input-addon-right{border-left:var(--ttdk-stroke-width-thin) solid var(--ttdk-stroke-subtle)}.dark .ttdk-input-addon-right{border-left-color:var(--ttdk-stroke-subtle)}.ttdk-input-wrapper[data-disabled=true] .ttdk-input-addon,.dark .ttdk-input-wrapper[data-disabled=true] .ttdk-input-addon{background:var(--ttdk-bg-secondary-disabled);color:var(--ttdk-text-icon-disabled)}.ttdk-input-number-stepper{border-left:var(--ttdk-stroke-width-thin) solid var(--ttdk-stroke-subtle);width:26px;height:100%;margin-right:calc(-1 * var(--ttdk-spacing-sm));box-sizing:border-box;user-select:none;background:var(--ttdk-bg-secondary-disabled);flex-direction:column;flex-shrink:0;transition:border-color .15s,background-color .15s;display:flex}.dark .ttdk-input-number-stepper{border-left-color:var(--ttdk-stroke-subtle);background:var(--ttdk-bg-secondary-disabled)}.ttdk-input-wrapper[data-size=sm] .ttdk-input-number-stepper{width:22px}.ttdk-input-wrapper[data-size=lg] .ttdk-input-number-stepper{width:30px}.ttdk-input-number-btn{width:100%;color:var(--ttdk-text-icon-disabled);cursor:pointer;box-sizing:border-box;background:0 0;border:none;outline:none;flex:1;justify-content:center;align-items:center;margin:0;padding:0;transition:background-color .15s,color .15s;display:flex}.dark .ttdk-input-number-btn{color:var(--ttdk-text-icon-disabled)}.ttdk-input-number-btn:hover:not(:disabled){background:color-mix(in srgb, var(--ttdk-brand-default) 12%, transparent);color:var(--ttdk-brand-default)}.ttdk-input-number-btn:active:not(:disabled){background:color-mix(in srgb, var(--ttdk-brand-default) 22%, transparent);color:var(--ttdk-brand-default)}.dark .ttdk-input-number-btn:hover:not(:disabled){background:color-mix(in srgb, var(--ttdk-brand-default) 20%, transparent);color:var(--ttdk-stroke-border-focus)}.ttdk-input-number-btn-up{border-bottom:var(--ttdk-stroke-width-thin) solid var(--ttdk-stroke-subtle)}.dark .ttdk-input-number-btn-up{border-bottom-color:var(--ttdk-stroke-subtle)}.ttdk-input-number-btn:disabled,.ttdk-input-number-btn[data-disabled=true]{cursor:not-allowed;opacity:.35;color:var(--ttdk-text-icon-disabled)}.ttdk-input-number-split-btn{background:var(--ttdk-bg-secondary-disabled);width:44px;height:100%;color:var(--ttdk-text-icon-primary);cursor:pointer;user-select:none;box-sizing:border-box;border:none;outline:none;flex-shrink:0;justify-content:center;align-items:center;margin:0;padding:0;transition:background-color .15s,color .15s;display:inline-flex}.dark .ttdk-input-number-split-btn{background:var(--ttdk-bg-secondary-disabled);color:var(--ttdk-text-icon-primary)}.ttdk-input-wrapper[data-size=sm] .ttdk-input-number-split-btn{width:36px}.ttdk-input-wrapper[data-size=lg] .ttdk-input-number-split-btn{width:52px}.ttdk-input-number-split-down{border-right:var(--ttdk-stroke-width-thin) solid var(--ttdk-stroke-subtle)}.dark .ttdk-input-number-split-down{border-right-color:var(--ttdk-stroke-subtle)}.ttdk-input-number-split-up{border-left:var(--ttdk-stroke-width-thin) solid var(--ttdk-stroke-subtle)}.dark .ttdk-input-number-split-up{border-left-color:var(--ttdk-stroke-subtle)}.ttdk-input-number-split-btn:hover:not(:disabled){background:color-mix(in srgb, var(--ttdk-brand-default) 12%, transparent);color:var(--ttdk-brand-default)}.ttdk-input-number-split-btn:active:not(:disabled){background:color-mix(in srgb, var(--ttdk-brand-default) 22%, transparent);color:var(--ttdk-brand-default)}.dark .ttdk-input-number-split-btn:hover:not(:disabled){background:color-mix(in srgb, var(--ttdk-brand-default) 20%, transparent);color:var(--ttdk-stroke-border-focus)}.ttdk-input-number-split-btn:disabled,.ttdk-input-number-split-btn[data-disabled=true]{cursor:not-allowed;opacity:.35;color:var(--ttdk-text-icon-disabled);background:var(--ttdk-bg-secondary-disabled)}.ttdk-input-wrapper[data-disabled=true] .ttdk-input-number-stepper,.ttdk-input-wrapper[data-disabled=true] .ttdk-input-number-split-btn{cursor:not-allowed;background:var(--ttdk-bg-secondary-disabled)!important;color:var(--ttdk-text-icon-disabled)!important}.ttdk-form-helper-text{font-size:var(--ttdk-font-size-12);font-weight:var(--ttdk-font-weight-regular);color:var(--ttdk-text-icon-secondary);line-height:var(--ttdk-font-size-18);min-height:var(--ttdk-font-size-18)}.dark .ttdk-form-helper-text{color:var(--ttdk-text-icon-secondary)}.ttdk-form-error-msg{align-items:center;gap:var(--ttdk-spacing-xxs);font-size:var(--ttdk-font-size-12);color:var(--ttdk-text-icon-status-error);font-weight:var(--ttdk-font-weight-medium);line-height:var(--ttdk-font-size-18);min-height:var(--ttdk-font-size-18);display:flex}.dark .ttdk-form-error-msg{color:var(--ttdk-text-icon-status-error)}.ttdk-form-error-icon{width:var(--ttdk-font-size-14);height:var(--ttdk-font-size-14);flex-shrink:0}.ttdk-form-error-icon path{fill-rule:evenodd;clip-rule:evenodd}.ttdk-input-number-btn:before,.ttdk-input-number-split-btn:before{content:"";background-color:currentColor;flex-shrink:0;display:block;-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.ttdk-input-number-btn:before{width:12px;height:12px}.ttdk-input-wrapper[data-size=sm] .ttdk-input-number-btn:before{width:10px;height:10px}.ttdk-input-wrapper[data-size=lg] .ttdk-input-number-btn:before{width:14px;height:14px}.ttdk-input-number-split-btn:before{width:16px;height:16px}.ttdk-input-wrapper[data-size=sm] .ttdk-input-number-split-btn:before{width:14px;height:14px}.ttdk-input-wrapper[data-size=lg] .ttdk-input-number-split-btn:before{width:18px;height:18px}.ttdk-input-number-btn-up:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='18 15 12 9 6 15'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='18 15 12 9 6 15'/%3E%3C/svg%3E")}.ttdk-input-number-btn-down:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E")}.ttdk-input-number-split-down:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'/%3E%3C/svg%3E")}.ttdk-input-number-split-up:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='12' y1='5' x2='12' y2='19'/%3E%3Cline x1='5' y1='12' x2='19' y2='12'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='12' y1='5' x2='12' y2='19'/%3E%3Cline x1='5' y1='12' x2='19' y2='12'/%3E%3C/svg%3E")}