@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,521 @@
1
+ <template>
2
+ <div
3
+ :class="`ttdk-form-item ${className || ''}`.trim()"
4
+ :data-disabled="disabled"
5
+ :data-error="Boolean(error || errorMessage)"
6
+ :data-size="size || 'md'"
7
+ :data-block="block ? 'true' : undefined"
8
+ :style="{
9
+ ...buildUiVars(ui),
10
+ ...(ui || {}),
11
+ ...(typeof style === 'object' ? style : {}),
12
+ }"
13
+ >
14
+ <template v-if="label">
15
+ <label
16
+ :class="`ttdk-form-label ${labelClass || ''}`.trim()"
17
+ :for="id"
18
+ :style="{
19
+ ...buildUiVars(labelStyle),
20
+ }"
21
+ ><span>{{ label }}</span>
22
+ <template v-if="required">
23
+ <span class="ttdk-form-required" aria-hidden="true"> * </span>
24
+ </template>
25
+
26
+ <template v-if="optional">
27
+ <span class="ttdk-form-optional">{{
28
+ optionalText || "(Opsional)"
29
+ }}</span>
30
+ </template>
31
+ </label>
32
+ </template>
33
+
34
+ <template v-if="helperText && helperTextPosition === 'top'">
35
+ <div
36
+ :class="`ttdk-form-helper-text ${helperTextClass || ''}`.trim()"
37
+ :style="{
38
+ ...buildUiVars(helperTextStyle),
39
+ }"
40
+ >
41
+ {{ helperText }}
42
+ </div>
43
+ </template>
44
+
45
+ <div
46
+ :class="`ttdk-input-wrapper ${wrapperClass || ''}`.trim()"
47
+ :data-filled="Boolean(value || defaultValue)"
48
+ :data-error="Boolean(error || errorMessage)"
49
+ :data-disabled="Boolean(disabled)"
50
+ :data-size="size || 'md'"
51
+ :data-rounded="rounded || 'md'"
52
+ :style="{
53
+ ...buildUiVars(wrapperStyle),
54
+ }"
55
+ >
56
+ <template v-if="addonLeft">
57
+ <div class="ttdk-input-addon ttdk-input-addon-left">
58
+ {{ addonLeft }}
59
+ </div>
60
+ </template>
61
+
62
+ <div class="ttdk-input-inner">
63
+ <template v-if="iconLeft">
64
+ <span
65
+ class="ttdk-input-icon ttdk-input-icon-left"
66
+ aria-hidden="true"
67
+ >{{ iconLeft }}</span
68
+ >
69
+ </template>
70
+
71
+ <input
72
+ ref="inputRef"
73
+ :class="`ttdk-input-control ${inputClass || ''}`.trim()"
74
+ :type="type || 'text'"
75
+ :name="name"
76
+ :id="id"
77
+ :value="value !== undefined ? value : defaultValue"
78
+ :placeholder="placeholder"
79
+ :disabled="disabled"
80
+ :readOnly="readOnly"
81
+ :required="required"
82
+ :autocomplete="autoComplete"
83
+ :maxLength="maxLength"
84
+ :minLength="minLength"
85
+ :min="min"
86
+ :max="max"
87
+ :aria-invalid="Boolean(error || errorMessage)"
88
+ :style="{
89
+ ...buildUiVars(inputStyle),
90
+ }"
91
+ @change="async (e) => onChange && onChange(e)"
92
+ @input="async (e) => onInput && onInput(e)"
93
+ @blur="async (e) => onBlur && onBlur(e)"
94
+ @focus="async (e) => onFocus && onFocus(e)"
95
+ @keydown="async (e) => onKeyDown && onKeyDown(e)"
96
+ @keyup="async (e) => onKeyUp && onKeyUp(e)"
97
+ />
98
+ <template v-if="loading">
99
+ <span
100
+ class="ttdk-input-icon ttdk-input-icon-right ttdk-input-spinner"
101
+ aria-hidden="true"
102
+ ><svg viewBox="0 0 24 24">
103
+ <line
104
+ x1="12"
105
+ y1="2.5"
106
+ x2="12"
107
+ y2="6.5"
108
+ opacity="0.175"
109
+ transform="rotate(0 12 12)"
110
+ ></line>
111
+ <line
112
+ x1="12"
113
+ y1="2.5"
114
+ x2="12"
115
+ y2="6.5"
116
+ opacity="0.25"
117
+ transform="rotate(30 12 12)"
118
+ ></line>
119
+ <line
120
+ x1="12"
121
+ y1="2.5"
122
+ x2="12"
123
+ y2="6.5"
124
+ opacity="0.325"
125
+ transform="rotate(60 12 12)"
126
+ ></line>
127
+ <line
128
+ x1="12"
129
+ y1="2.5"
130
+ x2="12"
131
+ y2="6.5"
132
+ opacity="0.4"
133
+ transform="rotate(90 12 12)"
134
+ ></line>
135
+ <line
136
+ x1="12"
137
+ y1="2.5"
138
+ x2="12"
139
+ y2="6.5"
140
+ opacity="0.475"
141
+ transform="rotate(120 12 12)"
142
+ ></line>
143
+ <line
144
+ x1="12"
145
+ y1="2.5"
146
+ x2="12"
147
+ y2="6.5"
148
+ opacity="0.55"
149
+ transform="rotate(150 12 12)"
150
+ ></line>
151
+ <line
152
+ x1="12"
153
+ y1="2.5"
154
+ x2="12"
155
+ y2="6.5"
156
+ opacity="0.625"
157
+ transform="rotate(180 12 12)"
158
+ ></line>
159
+ <line
160
+ x1="12"
161
+ y1="2.5"
162
+ x2="12"
163
+ y2="6.5"
164
+ opacity="0.7"
165
+ transform="rotate(210 12 12)"
166
+ ></line>
167
+ <line
168
+ x1="12"
169
+ y1="2.5"
170
+ x2="12"
171
+ y2="6.5"
172
+ opacity="0.775"
173
+ transform="rotate(240 12 12)"
174
+ ></line>
175
+ <line
176
+ x1="12"
177
+ y1="2.5"
178
+ x2="12"
179
+ y2="6.5"
180
+ opacity="0.85"
181
+ transform="rotate(270 12 12)"
182
+ ></line>
183
+ <line
184
+ x1="12"
185
+ y1="2.5"
186
+ x2="12"
187
+ y2="6.5"
188
+ opacity="0.925"
189
+ transform="rotate(300 12 12)"
190
+ ></line>
191
+ <line
192
+ x1="12"
193
+ y1="2.5"
194
+ x2="12"
195
+ y2="6.5"
196
+ opacity="1"
197
+ transform="rotate(330 12 12)"
198
+ ></line></svg
199
+ ></span>
200
+ </template>
201
+
202
+ <template v-if="!loading && iconRight">
203
+ <span
204
+ class="ttdk-input-icon ttdk-input-icon-right"
205
+ aria-hidden="true"
206
+ >{{ iconRight }}</span
207
+ >
208
+ </template>
209
+ </div>
210
+ <template v-if="addonRight">
211
+ <div class="ttdk-input-addon ttdk-input-addon-right">
212
+ {{ addonRight }}
213
+ </div>
214
+ </template>
215
+ </div>
216
+ <template v-if="helperText && helperTextPosition !== 'top'">
217
+ <div
218
+ :class="`ttdk-form-helper-text ${helperTextClass || ''}`.trim()"
219
+ :style="{
220
+ ...buildUiVars(helperTextStyle),
221
+ }"
222
+ >
223
+ {{ helperText }}
224
+ </div>
225
+ </template>
226
+
227
+ <template v-if="errorMessage && (error || errorMessage)">
228
+ <div
229
+ role="alert"
230
+ :class="`ttdk-form-error-msg ${errorMessageClass || ''}`.trim()"
231
+ :style="{
232
+ ...buildUiVars(errorMessageStyle),
233
+ }"
234
+ >
235
+ <span>{{ errorMessage }}</span>
236
+ </div>
237
+ </template>
238
+ </div>
239
+ </template>
240
+
241
+ <script setup lang="ts">
242
+ import { buildUiVars, UiProps } from "../../core/types";
243
+
244
+ export type InputUiProps = UiProps;
245
+ export interface InputProps {
246
+ /**
247
+ * Teks label judul field yang ditampilkan di atas input (14px Semibold, #141313).
248
+ */
249
+ label?: string;
250
+
251
+ /**
252
+ * Style kustom untuk elemen label judul field (UiProps).
253
+ */
254
+ labelStyle?: UiProps;
255
+
256
+ /**
257
+ * Class CSS kustom untuk elemen label judul field.
258
+ */
259
+ labelClass?: string;
260
+
261
+ /**
262
+ * Style kustom untuk elemen kontainer input wrapper (UiProps).
263
+ */
264
+ wrapperStyle?: UiProps;
265
+
266
+ /**
267
+ * Class CSS kustom untuk elemen kontainer input wrapper.
268
+ */
269
+ wrapperClass?: string;
270
+
271
+ /**
272
+ * Style kustom untuk elemen input control HTML (UiProps).
273
+ */
274
+ inputStyle?: UiProps;
275
+
276
+ /**
277
+ * Class CSS kustom untuk elemen input control HTML.
278
+ */
279
+ inputClass?: string;
280
+
281
+ /**
282
+ * Style kustom untuk elemen pesan error validasi (UiProps).
283
+ */
284
+ errorMessageStyle?: UiProps;
285
+
286
+ /**
287
+ * Class CSS kustom untuk elemen pesan error validasi.
288
+ */
289
+ errorMessageClass?: string;
290
+
291
+ /**
292
+ * Style kustom untuk elemen helper text (UiProps).
293
+ */
294
+ helperTextStyle?: UiProps;
295
+
296
+ /**
297
+ * Class CSS kustom untuk elemen helper text.
298
+ */
299
+ helperTextClass?: string;
300
+
301
+ /**
302
+ * Menandai field sebagai opsi opsional dengan menambahkan teks '(Opsional)' (12px Regular, #9698A2).
303
+ */
304
+ optional?: boolean;
305
+
306
+ /**
307
+ * Kustomisasi teks keterangan opsional.
308
+ * @default '(Opsional)'
309
+ */
310
+ optionalText?: string;
311
+
312
+ /**
313
+ * Nilai teks placeholder saat input kosong (#9698A2).
314
+ */
315
+ placeholder?: string;
316
+
317
+ /**
318
+ * Nilai terkontrol (controlled value) pada input.
319
+ */
320
+ value?: string | number;
321
+
322
+ /**
323
+ * Nilai awal tidak terkontrol (uncontrolled initial value).
324
+ */
325
+ defaultValue?: string | number;
326
+
327
+ /**
328
+ * Tipe field input HTML standar.
329
+ * @default 'text'
330
+ */
331
+ type?: string;
332
+
333
+ /**
334
+ * Nama form field HTML untuk integrasi formulir.
335
+ */
336
+ name?: string;
337
+
338
+ /**
339
+ * Identifier unik elemen input.
340
+ */
341
+ id?: string;
342
+
343
+ /**
344
+ * Status apakah input sedang dalam kondisi error / tidak valid.
345
+ * @default false
346
+ */
347
+ error?: boolean;
348
+
349
+ /**
350
+ * Pesan teks penjelasan kesalahan validasi di bawah field.
351
+ */
352
+ errorMessage?: string;
353
+
354
+ /**
355
+ * Teks petunjuk atau keterangan bantuan di bawah field (12px Regular, #3C4245).
356
+ */
357
+ helperText?: string;
358
+
359
+ /**
360
+ * Posisi teks helper
361
+ */
362
+ helperTextPosition?: "top" | "bottom";
363
+
364
+ /**
365
+ * Skala ukuran input field.
366
+ * - `'sm'`: 36px
367
+ * - `'md'`: 48px (standar)
368
+ * - `'lg'`: 56px
369
+ * @default 'md'
370
+ */
371
+ size?: "sm" | "md" | "lg";
372
+
373
+ /**
374
+ * Bentuk sudut kelengkungan input.
375
+ * - `'none'`: 0px
376
+ * - `'sm'`: 4px
377
+ * - `'md'`: 8px (standar desain)
378
+ * - `'lg'`: 12px
379
+ * - `'full'`: 9999px (kapsul)
380
+ * @default 'md'
381
+ */
382
+ rounded?: "none" | "sm" | "md" | "lg" | "full";
383
+
384
+ /**
385
+ * Menjadikan lebar field input memenuhi kontainer penuh (full-width 100%).
386
+ * @default false
387
+ */
388
+ block?: boolean;
389
+
390
+ /**
391
+ * Status apakah field dinonaktifkan (disabled).
392
+ * @default false
393
+ */
394
+ disabled?: boolean;
395
+
396
+ /**
397
+ * Status apakah field bersifat hanya-baca (readonly).
398
+ * @default false
399
+ */
400
+ readOnly?: boolean;
401
+
402
+ /**
403
+ * Menandai field sebagai input wajib diisi (menampilkan tanda bintang merah *).
404
+ * @default false
405
+ */
406
+ required?: boolean;
407
+
408
+ /**
409
+ * Ikon di sebelah kiri dalam input (ukuran 20-24px, misal: Calendar, Search, User).
410
+ */
411
+ iconLeft?: any;
412
+
413
+ /**
414
+ * Ikon di sebelah kanan dalam input (ukuran 20-24px, misal: Chevron-down, Eye, Close).
415
+ */
416
+ iconRight?: any;
417
+
418
+ /**
419
+ * Addon / teks prefix di sebelah kiri luar input (misal: 'Text', '+62 (IDN)').
420
+ */
421
+ addonLeft?: string | any;
422
+
423
+ /**
424
+ * Addon / teks suffix di sebelah kanan luar input (misal: 'Text', '.com', 'kg').
425
+ */
426
+ addonRight?: string | any;
427
+
428
+ /**
429
+ * Konfigurasi atribut autocomplete HTML.
430
+ */
431
+ autoComplete?: string;
432
+
433
+ /**
434
+ * Batas maksimum panjang karakter.
435
+ */
436
+ maxLength?: number;
437
+
438
+ /**
439
+ * Batas minimum panjang karakter.
440
+ */
441
+ minLength?: number;
442
+
443
+ /**
444
+ * Nilai minimum untuk input bertipe number atau date.
445
+ */
446
+ min?: number | string;
447
+
448
+ /**
449
+ * Nilai maksimum untuk input bertipe number atau date.
450
+ */
451
+ max?: number | string;
452
+
453
+ /**
454
+ * Inline CSS style object native.
455
+ */
456
+ style?: any;
457
+
458
+ /**
459
+ * Kustomisasi visual granular root / form-item (UiProps).
460
+ */
461
+ ui?: UiProps;
462
+
463
+ /**
464
+ * Callback event saat nilai input berubah.
465
+ */
466
+ onChange?: (event: any) => void;
467
+
468
+ /**
469
+ * Callback event saat pengguna mengetik (input event).
470
+ */
471
+ onInput?: (event: any) => void;
472
+
473
+ /**
474
+ * Callback event saat field input kehilangan fokus.
475
+ */
476
+ onBlur?: (event: any) => void;
477
+
478
+ /**
479
+ * Callback event saat field input mendapatkan fokus.
480
+ */
481
+ onFocus?: (event: any) => void;
482
+
483
+ /**
484
+ * Ref instance elemen input HTML untuk akses kontrol DOM langsung (focus, blur, select).
485
+ */
486
+ inputRef?: any;
487
+
488
+ /**
489
+ * Class CSS kustom.
490
+ */
491
+ className?: string;
492
+
493
+ /**
494
+ * Callback event tombol keyboard ditekan.
495
+ */
496
+ onKeyDown?: (event: any) => void;
497
+
498
+ /**
499
+ * Callback event tombol keyboard dilepaskan.
500
+ */
501
+ onKeyUp?: (event: any) => void;
502
+
503
+ /**
504
+ * Menampilkan spinner dan menonaktifkan interaksi field sementara menunggu proses async.
505
+ * @default false
506
+ */
507
+ loading?: boolean;
508
+ }
509
+
510
+ /**
511
+ * Komponen Input TTDK sesuai spesifikasi Anatomy Desain:
512
+ * 1. Field title (14px Semibold, #141313)
513
+ * 2. (Opsional) label (12px Regular, #9698A2)
514
+ * 3. Border radius 8px
515
+ * 4. Icon left / right (24px)
516
+ * 5. Field content (14px Regular, #141313, placeholder #9698A2)
517
+ * 6. Additional information / Helper text (12px Regular, #3C4245)
518
+ */
519
+
520
+ const props = defineProps<InputProps>();
521
+ </script>