@ttdk-design-system/library-react 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 (184) hide show
  1. package/AI_GUIDE.md +6518 -0
  2. package/llms.txt +6518 -0
  3. package/package.json +1098 -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.tsx +430 -0
  16. package/src/web/accordion/index.ts +3 -0
  17. package/src/web/accordion/manifest.json +351 -0
  18. package/src/web/alert/AI_GUIDE.md +139 -0
  19. package/src/web/alert/alert.css +1 -0
  20. package/src/web/alert/alert.tsx +318 -0
  21. package/src/web/alert/index.ts +3 -0
  22. package/src/web/alert/manifest.json +240 -0
  23. package/src/web/avatar/AI_GUIDE.md +118 -0
  24. package/src/web/avatar/avatar.css +1 -0
  25. package/src/web/avatar/avatar.tsx +233 -0
  26. package/src/web/avatar/index.ts +3 -0
  27. package/src/web/avatar/manifest.json +195 -0
  28. package/src/web/badge/AI_GUIDE.md +94 -0
  29. package/src/web/badge/badge.css +1 -0
  30. package/src/web/badge/badge.tsx +140 -0
  31. package/src/web/badge/index.ts +2 -0
  32. package/src/web/badge/manifest.json +141 -0
  33. package/src/web/banner/AI_GUIDE.md +130 -0
  34. package/src/web/banner/banner.css +1 -0
  35. package/src/web/banner/banner.tsx +334 -0
  36. package/src/web/banner/index.ts +3 -0
  37. package/src/web/banner/manifest.json +240 -0
  38. package/src/web/breadcrumb/AI_GUIDE.md +120 -0
  39. package/src/web/breadcrumb/breadcrumb.css +1 -0
  40. package/src/web/breadcrumb/breadcrumb.tsx +306 -0
  41. package/src/web/breadcrumb/index.ts +3 -0
  42. package/src/web/breadcrumb/manifest.json +225 -0
  43. package/src/web/button/AI_GUIDE.md +121 -0
  44. package/src/web/button/button.css +1 -0
  45. package/src/web/button/button.tsx +287 -0
  46. package/src/web/button/index.ts +2 -0
  47. package/src/web/button/manifest.json +177 -0
  48. package/src/web/calendar/AI_GUIDE.md +151 -0
  49. package/src/web/calendar/calendar.css +1 -0
  50. package/src/web/calendar/calendar.tsx +1611 -0
  51. package/src/web/calendar/index.ts +3 -0
  52. package/src/web/calendar/manifest.json +470 -0
  53. package/src/web/card/AI_GUIDE.md +133 -0
  54. package/src/web/card/card.css +1 -0
  55. package/src/web/card/card.tsx +408 -0
  56. package/src/web/card/index.ts +4 -0
  57. package/src/web/card/manifest.json +357 -0
  58. package/src/web/checkbox/AI_GUIDE.md +146 -0
  59. package/src/web/checkbox/checkbox.css +1 -0
  60. package/src/web/checkbox/checkbox.tsx +307 -0
  61. package/src/web/checkbox/index.ts +2 -0
  62. package/src/web/checkbox/manifest.json +294 -0
  63. package/src/web/chip/AI_GUIDE.md +186 -0
  64. package/src/web/chip/chip.css +1 -0
  65. package/src/web/chip/chip.tsx +230 -0
  66. package/src/web/chip/index.ts +2 -0
  67. package/src/web/chip/manifest.json +186 -0
  68. package/src/web/dropdown/AI_GUIDE.md +167 -0
  69. package/src/web/dropdown/dropdown.css +1 -0
  70. package/src/web/dropdown/dropdown.tsx +1274 -0
  71. package/src/web/dropdown/index.ts +3 -0
  72. package/src/web/dropdown/manifest.json +576 -0
  73. package/src/web/flex/AI_GUIDE.md +113 -0
  74. package/src/web/flex/flex-item.tsx +97 -0
  75. package/src/web/flex/flex.css +1 -0
  76. package/src/web/flex/flex.tsx +108 -0
  77. package/src/web/flex/index.ts +5 -0
  78. package/src/web/flex/manifest.json +162 -0
  79. package/src/web/form/index.ts +7 -0
  80. package/src/web/grid/AI_GUIDE.md +112 -0
  81. package/src/web/grid/grid-item.tsx +112 -0
  82. package/src/web/grid/grid.css +1 -0
  83. package/src/web/grid/grid.tsx +99 -0
  84. package/src/web/grid/index.ts +5 -0
  85. package/src/web/grid/manifest.json +153 -0
  86. package/src/web/index.ts +86 -0
  87. package/src/web/input/AI_GUIDE.md +159 -0
  88. package/src/web/input/index.ts +3 -0
  89. package/src/web/input/input.css +1 -0
  90. package/src/web/input/input.tsx +537 -0
  91. package/src/web/input/manifest.json +465 -0
  92. package/src/web/input-number/AI_GUIDE.md +164 -0
  93. package/src/web/input-number/index.ts +3 -0
  94. package/src/web/input-number/input-number.css +1 -0
  95. package/src/web/input-number/input-number.tsx +1193 -0
  96. package/src/web/input-number/manifest.json +575 -0
  97. package/src/web/modal/AI_GUIDE.md +171 -0
  98. package/src/web/modal/index.ts +3 -0
  99. package/src/web/modal/manifest.json +375 -0
  100. package/src/web/modal/modal.css +1 -0
  101. package/src/web/modal/modal.tsx +571 -0
  102. package/src/web/pagination/AI_GUIDE.md +148 -0
  103. package/src/web/pagination/index.ts +21 -0
  104. package/src/web/pagination/manifest.json +432 -0
  105. package/src/web/pagination/pagination-content.tsx +45 -0
  106. package/src/web/pagination/pagination-ellipsis.tsx +54 -0
  107. package/src/web/pagination/pagination-first.tsx +155 -0
  108. package/src/web/pagination/pagination-item.tsx +45 -0
  109. package/src/web/pagination/pagination-last.tsx +155 -0
  110. package/src/web/pagination/pagination-link.tsx +121 -0
  111. package/src/web/pagination/pagination-next.tsx +158 -0
  112. package/src/web/pagination/pagination-previous.tsx +158 -0
  113. package/src/web/pagination/pagination.css +1 -0
  114. package/src/web/pagination/pagination.tsx +687 -0
  115. package/src/web/popover/AI_GUIDE.md +163 -0
  116. package/src/web/popover/index.ts +3 -0
  117. package/src/web/popover/manifest.json +396 -0
  118. package/src/web/popover/popover.css +1 -0
  119. package/src/web/popover/popover.tsx +702 -0
  120. package/src/web/radio/AI_GUIDE.md +155 -0
  121. package/src/web/radio/index.ts +2 -0
  122. package/src/web/radio/manifest.json +294 -0
  123. package/src/web/radio/radio.css +1 -0
  124. package/src/web/radio/radio.tsx +290 -0
  125. package/src/web/selectbox/AI_GUIDE.md +216 -0
  126. package/src/web/selectbox/index.ts +3 -0
  127. package/src/web/selectbox/manifest.json +477 -0
  128. package/src/web/selectbox/selectbox.css +1 -0
  129. package/src/web/selectbox/selectbox.tsx +1048 -0
  130. package/src/web/sonner/AI_GUIDE.md +98 -0
  131. package/src/web/sonner/index.ts +114 -0
  132. package/src/web/sonner/manifest.json +132 -0
  133. package/src/web/sonner/sonner.css +1 -0
  134. package/src/web/sonner/sonner.tsx +177 -0
  135. package/src/web/table/AI_GUIDE.md +145 -0
  136. package/src/web/table/index.ts +35 -0
  137. package/src/web/table/manifest.json +168 -0
  138. package/src/web/table/table-body.tsx +45 -0
  139. package/src/web/table/table-caption.tsx +45 -0
  140. package/src/web/table/table-cell.tsx +74 -0
  141. package/src/web/table/table-empty.tsx +108 -0
  142. package/src/web/table/table-footer.tsx +45 -0
  143. package/src/web/table/table-head.tsx +80 -0
  144. package/src/web/table/table-header.tsx +45 -0
  145. package/src/web/table/table-row.tsx +69 -0
  146. package/src/web/table/table.css +1 -0
  147. package/src/web/table/table.tsx +305 -0
  148. package/src/web/tabs/AI_GUIDE.md +150 -0
  149. package/src/web/tabs/index.ts +3 -0
  150. package/src/web/tabs/manifest.json +315 -0
  151. package/src/web/tabs/tabs.css +1 -0
  152. package/src/web/tabs/tabs.tsx +332 -0
  153. package/src/web/text/AI_GUIDE.md +129 -0
  154. package/src/web/text/index.ts +3 -0
  155. package/src/web/text/manifest.json +195 -0
  156. package/src/web/text/text.css +1 -0
  157. package/src/web/text/text.tsx +689 -0
  158. package/src/web/textarea/AI_GUIDE.md +141 -0
  159. package/src/web/textarea/index.ts +3 -0
  160. package/src/web/textarea/manifest.json +438 -0
  161. package/src/web/textarea/textarea.css +1 -0
  162. package/src/web/textarea/textarea.tsx +467 -0
  163. package/src/web/tooltip/AI_GUIDE.md +110 -0
  164. package/src/web/tooltip/index.ts +3 -0
  165. package/src/web/tooltip/manifest.json +222 -0
  166. package/src/web/tooltip/tooltip.css +1 -0
  167. package/src/web/tooltip/tooltip.tsx +423 -0
  168. package/src/webview/bottomsheet/AI_GUIDE.md +141 -0
  169. package/src/webview/bottomsheet/bottomsheet.css +1 -0
  170. package/src/webview/bottomsheet/bottomsheet.tsx +603 -0
  171. package/src/webview/bottomsheet/index.ts +4 -0
  172. package/src/webview/bottomsheet/manifest.json +377 -0
  173. package/src/webview/button/AI_GUIDE.md +79 -0
  174. package/src/webview/button/button-ios.css +1 -0
  175. package/src/webview/button/button-ios.tsx +138 -0
  176. package/src/webview/button/button-material.css +1 -0
  177. package/src/webview/button/button-material.tsx +138 -0
  178. package/src/webview/button/index.ts +7 -0
  179. package/src/webview/button/manifest.json +148 -0
  180. package/src/webview/index.ts +7 -0
  181. package/tailwind-preset.cjs +62 -0
  182. package/tailwind-preset.js +62 -0
  183. package/ttdk-manifest.json +10188 -0
  184. package/README.md +0 -3
@@ -0,0 +1,351 @@
1
+ {
2
+ "name": "@ttdk-design-system/accordion",
3
+ "component": "Accordion",
4
+ "folder": "accordion",
5
+ "description": "Komponen Accordion untuk menyusun informasi berlapis yang dapat dibuka-tutup (collapse/expand) dengan dukungan multiple open, berbagai varian visual (default, bordered, separated, ghost), serta animasi transisi grid CSS yang sangat halus.",
6
+ "stylesheets": [
7
+ {
8
+ "theme": "common",
9
+ "file": "accordion.css",
10
+ "importPath": "web/accordion/accordion.css"
11
+ }
12
+ ],
13
+ "props": {
14
+ "items": {
15
+ "name": "items",
16
+ "type": "AccordionItem[]",
17
+ "optional": false,
18
+ "default": null,
19
+ "description": "Daftar item accordion yang akan dirender.",
20
+ "example": null,
21
+ "param": null
22
+ },
23
+ "value": {
24
+ "name": "value",
25
+ "type": "string | string[]",
26
+ "optional": true,
27
+ "default": null,
28
+ "description": "Nilai item yang sedang terbuka (controlled value). Bisa berupa string tunggal atau array string jika multiple={true}.",
29
+ "example": null,
30
+ "param": null
31
+ },
32
+ "defaultValue": {
33
+ "name": "defaultValue",
34
+ "type": "string | string[]",
35
+ "optional": true,
36
+ "default": null,
37
+ "description": "Nilai default item yang terbuka saat pertama kali dirender (uncontrolled initial value).",
38
+ "example": null,
39
+ "param": null
40
+ },
41
+ "multiple": {
42
+ "name": "multiple",
43
+ "type": "boolean",
44
+ "optional": true,
45
+ "default": "false",
46
+ "description": "Mengizinkan lebih dari satu item terbuka secara bersamaan.",
47
+ "example": null,
48
+ "param": null
49
+ },
50
+ "collapsible": {
51
+ "name": "collapsible",
52
+ "type": "boolean",
53
+ "optional": true,
54
+ "default": "true",
55
+ "description": "Mengizinkan item yang terbuka untuk ditutup kembali saat diklik.",
56
+ "example": null,
57
+ "param": null
58
+ },
59
+ "variant": {
60
+ "name": "variant",
61
+ "type": "'default' | 'bordered' | 'separated' | 'ghost'",
62
+ "optional": true,
63
+ "default": "default",
64
+ "description": "Varian tampilan visual accordion: - `'default'`: Garis pembatas (divider) minimalis antar-item. - `'bordered'`: Pembungkus border luar dengan sudut melengkung. - `'separated'`: Setiap item berupa kartu terpisah mandiri dengan jarak celah (gap). - `'ghost'`: Tampilan bersih tanpa border luar, hanya hover background lembut.",
65
+ "example": null,
66
+ "param": null
67
+ },
68
+ "size": {
69
+ "name": "size",
70
+ "type": "'sm' | 'md' | 'lg'",
71
+ "optional": true,
72
+ "default": "md",
73
+ "description": "Skala ukuran proporsional accordion (padding, font, icon): - `'sm'`: Kompak (13px font, padding rapat). - `'md'`: Standar (14px font, padding normal). - `'lg'`: Besar (16px font, padding lapang).",
74
+ "example": null,
75
+ "param": null
76
+ },
77
+ "iconPosition": {
78
+ "name": "iconPosition",
79
+ "type": "'left' | 'right'",
80
+ "optional": true,
81
+ "default": "right",
82
+ "description": "Posisi indikator ikon panah / chevron: - `'right'`: Di ujung kanan (standar desain). - `'left'`: Di sebelah kiri sebelum judul.",
83
+ "example": null,
84
+ "param": null
85
+ },
86
+ "rounded": {
87
+ "name": "rounded",
88
+ "type": "'none' | 'sm' | 'md' | 'lg' | 'full'",
89
+ "optional": true,
90
+ "default": "md",
91
+ "description": "Sudut kelengkungan radius (khusus untuk varian 'bordered' dan 'separated'): - `'none'`: Sudut 0px. - `'sm'`: Sudut 6px. - `'md'`: Sudut 10px. - `'lg'`: Sudut 14px. - `'full'`: Sudut 20px.",
92
+ "example": null,
93
+ "param": null
94
+ },
95
+ "disabled": {
96
+ "name": "disabled",
97
+ "type": "boolean",
98
+ "optional": true,
99
+ "default": "false",
100
+ "description": "Menonaktifkan seluruh interaksi accordion.",
101
+ "example": null,
102
+ "param": null
103
+ },
104
+ "ui": {
105
+ "name": "ui",
106
+ "type": "UiProps",
107
+ "optional": true,
108
+ "default": null,
109
+ "description": "Kustomisasi visual granular root container (UiProps).",
110
+ "example": null,
111
+ "param": null
112
+ },
113
+ "style": {
114
+ "name": "style",
115
+ "type": "any",
116
+ "optional": true,
117
+ "default": null,
118
+ "description": "Inline CSS style object native.",
119
+ "example": null,
120
+ "param": null
121
+ },
122
+ "className": {
123
+ "name": "className",
124
+ "type": "string",
125
+ "optional": true,
126
+ "default": null,
127
+ "description": "Class CSS kustom untuk root accordion.",
128
+ "example": null,
129
+ "param": null
130
+ },
131
+ "itemStyle": {
132
+ "name": "itemStyle",
133
+ "type": "UiProps",
134
+ "optional": true,
135
+ "default": null,
136
+ "description": "Style kustom untuk tiap elemen item accordion (UiProps).",
137
+ "example": null,
138
+ "param": null
139
+ },
140
+ "itemClass": {
141
+ "name": "itemClass",
142
+ "type": "string",
143
+ "optional": true,
144
+ "default": null,
145
+ "description": "Class CSS kustom untuk tiap elemen item accordion.",
146
+ "example": null,
147
+ "param": null
148
+ },
149
+ "triggerStyle": {
150
+ "name": "triggerStyle",
151
+ "type": "UiProps",
152
+ "optional": true,
153
+ "default": null,
154
+ "description": "Style kustom untuk tombol trigger accordion (UiProps).",
155
+ "example": null,
156
+ "param": null
157
+ },
158
+ "triggerClass": {
159
+ "name": "triggerClass",
160
+ "type": "string",
161
+ "optional": true,
162
+ "default": null,
163
+ "description": "Class CSS kustom untuk tombol trigger accordion.",
164
+ "example": null,
165
+ "param": null
166
+ },
167
+ "titleStyle": {
168
+ "name": "titleStyle",
169
+ "type": "UiProps",
170
+ "optional": true,
171
+ "default": null,
172
+ "description": "Style kustom untuk teks judul trigger accordion (UiProps).",
173
+ "example": null,
174
+ "param": null
175
+ },
176
+ "titleClass": {
177
+ "name": "titleClass",
178
+ "type": "string",
179
+ "optional": true,
180
+ "default": null,
181
+ "description": "Class CSS kustom untuk teks judul trigger accordion.",
182
+ "example": null,
183
+ "param": null
184
+ },
185
+ "subtitleStyle": {
186
+ "name": "subtitleStyle",
187
+ "type": "UiProps",
188
+ "optional": true,
189
+ "default": null,
190
+ "description": "Style kustom untuk teks subtitle trigger accordion (UiProps).",
191
+ "example": null,
192
+ "param": null
193
+ },
194
+ "subtitleClass": {
195
+ "name": "subtitleClass",
196
+ "type": "string",
197
+ "optional": true,
198
+ "default": null,
199
+ "description": "Class CSS kustom untuk teks subtitle trigger accordion.",
200
+ "example": null,
201
+ "param": null
202
+ },
203
+ "iconStyle": {
204
+ "name": "iconStyle",
205
+ "type": "UiProps",
206
+ "optional": true,
207
+ "default": null,
208
+ "description": "Style kustom untuk indikator ikon panah / chevron (UiProps).",
209
+ "example": null,
210
+ "param": null
211
+ },
212
+ "iconClass": {
213
+ "name": "iconClass",
214
+ "type": "string",
215
+ "optional": true,
216
+ "default": null,
217
+ "description": "Class CSS kustom untuk indikator ikon panah / chevron.",
218
+ "example": null,
219
+ "param": null
220
+ },
221
+ "icon": {
222
+ "name": "icon",
223
+ "type": "any",
224
+ "optional": true,
225
+ "default": null,
226
+ "description": "Ikon kustom untuk menggantikan ikon panah bawaan accordion secara global.",
227
+ "example": null,
228
+ "param": null
229
+ },
230
+ "contentStyle": {
231
+ "name": "contentStyle",
232
+ "type": "UiProps",
233
+ "optional": true,
234
+ "default": null,
235
+ "description": "Style kustom untuk panel konten accordion (UiProps). Mengatur seluruh tampilan panel isi (background, padding, border, serta warna & tipografi teks isi).",
236
+ "example": null,
237
+ "param": null
238
+ },
239
+ "contentClass": {
240
+ "name": "contentClass",
241
+ "type": "string",
242
+ "optional": true,
243
+ "default": null,
244
+ "description": "Class CSS kustom untuk panel konten accordion.",
245
+ "example": null,
246
+ "param": null
247
+ },
248
+ "onChange": {
249
+ "name": "onChange",
250
+ "type": "(value: any) => void",
251
+ "optional": true,
252
+ "default": null,
253
+ "description": "Callback event saat status item yang terbuka berubah. Mengembalikan string atau array string sesuai mode `multiple`.",
254
+ "example": null,
255
+ "param": null
256
+ },
257
+ "children": {
258
+ "name": "children",
259
+ "type": "any",
260
+ "optional": true,
261
+ "default": null,
262
+ "description": "Konten anak atau slot kustom.",
263
+ "example": null,
264
+ "param": null
265
+ }
266
+ },
267
+ "subInterfaces": {
268
+ "AccordionItem": {
269
+ "value": {
270
+ "name": "value",
271
+ "type": "string",
272
+ "optional": false,
273
+ "default": null,
274
+ "description": "Nilai identifikasi unik untuk item accordion.",
275
+ "example": null,
276
+ "param": null
277
+ },
278
+ "title": {
279
+ "name": "title",
280
+ "type": "string",
281
+ "optional": false,
282
+ "default": null,
283
+ "description": "Judul teks yang ditampilkan pada header trigger accordion.",
284
+ "example": null,
285
+ "param": null
286
+ },
287
+ "subtitle": {
288
+ "name": "subtitle",
289
+ "type": "string",
290
+ "optional": true,
291
+ "default": null,
292
+ "description": "Subtitle atau deskripsi singkat sekunder di bawah judul.",
293
+ "example": null,
294
+ "param": null
295
+ },
296
+ "content": {
297
+ "name": "content",
298
+ "type": "any",
299
+ "optional": true,
300
+ "default": null,
301
+ "description": "Konten isi panel yang terbuka saat accordion di-expand.",
302
+ "example": null,
303
+ "param": null
304
+ },
305
+ "icon": {
306
+ "name": "icon",
307
+ "type": "any",
308
+ "optional": true,
309
+ "default": null,
310
+ "description": "Ikon atau elemen visual opsional di samping judul.",
311
+ "example": null,
312
+ "param": null
313
+ },
314
+ "badge": {
315
+ "name": "badge",
316
+ "type": "string | number",
317
+ "optional": true,
318
+ "default": null,
319
+ "description": "Badge teks atau counter angka opsional (misal: '12', 'Baru', 'Wajib').",
320
+ "example": null,
321
+ "param": null
322
+ },
323
+ "customIcon": {
324
+ "name": "customIcon",
325
+ "type": "any",
326
+ "optional": true,
327
+ "default": null,
328
+ "description": "Ikon kustom untuk menggantikan ikon panah bawaan khusus item ini.",
329
+ "example": null,
330
+ "param": null
331
+ },
332
+ "disabled": {
333
+ "name": "disabled",
334
+ "type": "boolean",
335
+ "optional": true,
336
+ "default": "false",
337
+ "description": "Menonaktifkan item ini dari interaksi buka/tutup.",
338
+ "example": null,
339
+ "param": null
340
+ }
341
+ }
342
+ },
343
+ "supportedFrameworks": [
344
+ "react",
345
+ "vue",
346
+ "svelte"
347
+ ],
348
+ "themes": [
349
+ "tw"
350
+ ]
351
+ }
@@ -0,0 +1,139 @@
1
+ # <Alert /> — TTDK Component Reference
2
+
3
+ Komponen Alert untuk menampilkan pesan umpan balik kontekstual statis, instruksi peringatan, atau status penting pada halaman.
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/alert/alert.css";`
8
+
9
+ ## 2. Subpath Component Import
10
+ ```ts
11
+ // React
12
+ import Alert from "@ttdk-design-system/library-react/web/alert";
13
+
14
+ // Vue 3
15
+ import Alert from "@ttdk-design-system/library-vue/web/alert";
16
+
17
+ // Svelte
18
+ import Alert from "@ttdk-design-system/library-svelte/web/alert";
19
+ ```
20
+
21
+ ## 3. Props & API Reference
22
+
23
+ | Prop | Type | Default | Description |
24
+ | :--- | :--- | :--- | :--- |
25
+ | `style?` | `any` | `-` | Inline CSS style kustom. |
26
+ | `title?` | `string` | `-` | Judul utama alert. |
27
+ | `description?` | `string` | `-` | Deskripsi atau pesan teks penjelasan alert. |
28
+ | `variant?` | `| 'neutral'
29
+ | 'info'
30
+ | 'success'
31
+ | 'warning'
32
+ | 'danger'` | `neutral` | Varian warna semantik alert: - `'neutral'`: Netral (border hitam/putih, background base). - `'info'`: Biru informasi (#2196F3). - `'success'`: Hijau konfirmasi keberhasilan (#04B761). - `'warning'`: Kuning / amber peringatan (#F88000). - `'danger'`: Merah kesalahan / bahaya (#D0021B). |
33
+ | `appearance?` | `'soft' | 'solid' | 'outline' | 'subtle'` | `soft` | Gaya tampilan visual alert: - `'soft'`: Latar belakang warna transparan lembut (standar). - `'solid'`: Latar belakang warna solid pekat dengan teks putih. - `'outline'`: Garis tepi dengan latar belakang transparan. - `'subtle'`: Latar belakang abu netral dengan aksen border tipis. |
34
+ | `rounded?` | `'none' | 'sm' | 'md' | 'lg' | 'full'` | `md` | Sudut kelengkungan alert: - `'none'`: Sudut tajam 0px. - `'sm'`: Radius halus 4px. - `'md'`: Radius sedang 8px (standar). - `'lg'`: Radius melengkung 12px. - `'full'`: Lingkaran penuh 9999px. |
35
+ | `icon?` | `any` | `true` | Ikon SVG kustom yang menggantikan ikon bawaan, atau boolean untuk menampilkan/menyembunyikan ikon. |
36
+ | `iconColor?` | `string` | `-` | Warna ikon kustom secara langsung. |
37
+ | `iconSize?` | `string` | `-` | Ukuran ikon kustom secara langsung (misal: '20px', '1.5rem'). |
38
+ | `hideIcon?` | `boolean` | `false` | Menyembunyikan ikon pada alert. |
39
+ | `closable?` | `boolean` | `false` | Menampilkan tombol tutup (silang) untuk menutup alert secara interaktif. |
40
+ | `onClose?` | `(event: any) => void` | `-` | Callback saat tombol tutup diklik. |
41
+ | `block?` | `boolean` | `false` | Membuat alert memenuhi lebar kontainer (100%). |
42
+ | `titleStyle?` | `UiProps` | `-` | Style kustom untuk judul alert (UiProps / style object + pseudo support). |
43
+ | `titleClass?` | `string` | `-` | Class CSS kustom untuk judul alert. |
44
+ | `descStyle?` | `UiProps` | `-` | Style kustom untuk deskripsi alert (UiProps / style object + pseudo support). |
45
+ | `descClass?` | `string` | `-` | Class CSS kustom untuk deskripsi alert. |
46
+ | `iconStyle?` | `UiProps` | `-` | Style kustom untuk ikon alert (UiProps / style object + pseudo support). |
47
+ | `iconClass?` | `string` | `-` | Class CSS kustom untuk ikon alert. |
48
+ | `closableStyle?` | `UiProps` | `-` | Style kustom untuk tombol tutup alert (UiProps / style object + pseudo support). |
49
+ | `closableClass?` | `string` | `-` | Class CSS kustom untuk tombol tutup alert. |
50
+ | `ui?` | `UiProps` | `-` | Kustomisasi visual granular melalui style-like object (+ support pseudo-class: hover, active). |
51
+ | `className?` | `string` | `-` | Class CSS kustom. |
52
+ | `children?` | `any` | `-` | Konten kustom tambahan di dalam alert. |
53
+
54
+ ## 4. Usage Examples
55
+
56
+ ### React Example
57
+ ```tsx
58
+ import Alert from "@ttdk-design-system/library-react/web/alert";
59
+ import "@ttdk-design-system/library-react/web/alert/alert.css";
60
+
61
+ export function Example() {
62
+ return (
63
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '12px' }}>
64
+ <Alert
65
+ variant="info"
66
+ title="Informasi Sinkronisasi"
67
+ description="Data fasilitas kesehatan berhasil disinkronkan dengan SATUSEHAT."
68
+ />
69
+ <Alert
70
+ variant="warning"
71
+ title="Peringatan Kuota API"
72
+ description="Batas kuota harian tersisa 15%. Harap periksa penggunaan layanan."
73
+ closable
74
+ />
75
+ <Alert
76
+ variant="danger"
77
+ title="Gagal Memproses Data"
78
+ description="Terjadi kesalahan validasi payload FHIR pada server."
79
+ />
80
+ </div>
81
+ );
82
+ }
83
+ ```
84
+
85
+ ### Vue 3 Example
86
+ ```vue
87
+ <script setup lang="ts">
88
+ import Alert from "@ttdk-design-system/library-vue/web/alert";
89
+ import "@ttdk-design-system/library-vue/web/alert/alert.css";
90
+ </script>
91
+
92
+ <template>
93
+ <div style="display: flex; flex-direction: column; gap: 12px;">
94
+ <Alert
95
+ variant="info"
96
+ title="Informasi Sinkronisasi"
97
+ description="Data fasilitas kesehatan berhasil disinkronkan dengan SATUSEHAT."
98
+ />
99
+ <Alert
100
+ variant="warning"
101
+ title="Peringatan Kuota API"
102
+ description="Batas kuota harian tersisa 15%. Harap periksa penggunaan layanan."
103
+ :closable="true"
104
+ />
105
+ <Alert
106
+ variant="danger"
107
+ title="Gagal Memproses Data"
108
+ description="Terjadi kesalahan validasi payload FHIR pada server."
109
+ />
110
+ </div>
111
+ </template>
112
+ ```
113
+
114
+ ### Svelte Example
115
+ ```svelte
116
+ <script lang="ts">
117
+ import Alert from "@ttdk-design-system/library-svelte/web/alert";
118
+ import "@ttdk-design-system/library-svelte/web/alert/alert.css";
119
+ </script>
120
+
121
+ <div style="display: flex; flex-direction: column; gap: 12px;">
122
+ <Alert
123
+ variant="info"
124
+ title="Informasi Sinkronisasi"
125
+ description="Data fasilitas kesehatan berhasil disinkronkan dengan SATUSEHAT."
126
+ />
127
+ <Alert
128
+ variant="warning"
129
+ title="Peringatan Kuota API"
130
+ description="Batas kuota harian tersisa 15%. Harap periksa penggunaan layanan."
131
+ closable={true}
132
+ />
133
+ <Alert
134
+ variant="danger"
135
+ title="Gagal Memproses Data"
136
+ description="Terjadi kesalahan validasi payload FHIR pada server."
137
+ />
138
+ </div>
139
+ ```
@@ -0,0 +1 @@
1
+ .ttdk-alert{box-sizing:border-box;width:fit-content;max-width:100%;font-family:var(--ttdk-font-sans);border-radius:var(--ttdk-radius-sm,8px);border-style:solid;border-width:1px;align-items:flex-start;gap:12px;padding:14px 16px;font-size:14px;line-height:1.5;transition:background-color .2s,border-color .2s,color .2s;display:flex;position:relative}.ttdk-alert[data-block=true]{width:100%}.ttdk-alert[data-rounded=none]{border-radius:var(--ttdk-radius-none,0)}.ttdk-alert[data-rounded=sm]{border-radius:var(--ttdk-radius-xs,4px)}.ttdk-alert[data-rounded=md]{border-radius:var(--ttdk-radius-sm,8px)}.ttdk-alert[data-rounded=lg]{border-radius:var(--ttdk-radius-md,12px)}.ttdk-alert[data-rounded=full]{border-radius:var(--ttdk-radius-full,9999px)}.ttdk-alert-icon-wrapper{flex-shrink:0;justify-content:center;align-items:center;margin-top:2px;display:flex}.ttdk-alert-icon{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round;width:18px;height:18px;display:block}.ttdk-alert-content{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}.ttdk-alert-title{color:var(--ttdk-ui-color,var(--ttdk-text-icon-primary));letter-spacing:.5px;font-size:14px;font-weight:600;line-height:125%}.ttdk-alert-desc,.ttdk-alert-description{color:var(--ttdk-ui-color,var(--ttdk-text-icon-primary));letter-spacing:.25px;font-size:14px;font-weight:400;line-height:150%}.ttdk-alert-slot{margin-top:8px}.ttdk-alert-close-btn{border-radius:var(--ttdk-radius-xs,6px);width:24px;height:24px;color:var(--ttdk-text-icon-primary,#141313);opacity:.65;cursor:pointer;background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;margin-left:auto;padding:0;transition:opacity .15s,background-color .15s;display:flex}.dark .ttdk-alert-close-btn{color:var(--ttdk-text-icon-primary,#fff)}.ttdk-alert-close-btn svg{fill:none;stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.ttdk-alert-close-btn:hover{opacity:1;background:#14131314}.dark .ttdk-alert-close-btn:hover{background:#ffffff1a}.ttdk-alert-close-btn:focus-visible{outline-offset:1px;outline:2px solid}.ttdk-alert[data-variant=neutral],.ttdk-alert[data-appearance=soft][data-variant=neutral],.ttdk-alert[data-appearance=solid][data-variant=neutral],.ttdk-alert[data-appearance=outline][data-variant=neutral],.ttdk-alert[data-appearance=subtle][data-variant=neutral]{background-color:var(--ttdk-bg-base-primary);border-color:var(--ttdk-stroke-stay-black);color:var(--ttdk-text-icon-primary)}.ttdk-alert[data-variant=neutral] .ttdk-alert-icon-wrapper,.ttdk-alert[data-appearance=soft][data-variant=neutral] .ttdk-alert-icon-wrapper,.ttdk-alert[data-appearance=solid][data-variant=neutral] .ttdk-alert-icon-wrapper,.ttdk-alert[data-appearance=outline][data-variant=neutral] .ttdk-alert-icon-wrapper,.ttdk-alert[data-appearance=subtle][data-variant=neutral] .ttdk-alert-icon-wrapper{color:var(--ttdk-text-icon-primary)}.ttdk-alert[data-appearance=soft][data-variant=success]{background-color:var(--ttdk-bg-status-success-subtle);border-color:var(--ttdk-stroke-status-success)}.ttdk-alert[data-appearance=soft][data-variant=success] .ttdk-alert-icon-wrapper{color:var(--ttdk-text-icon-status-success)}.ttdk-alert[data-appearance=soft][data-variant=info]{background-color:var(--ttdk-bg-status-info-subtle);border-color:var(--ttdk-stroke-status-info)}.ttdk-alert[data-appearance=soft][data-variant=info] .ttdk-alert-icon-wrapper{color:var(--ttdk-text-icon-status-info)}.ttdk-alert[data-appearance=soft][data-variant=warning]{background-color:var(--ttdk-bg-status-warning-subtle);border-color:var(--ttdk-stroke-status-warning)}.ttdk-alert[data-appearance=soft][data-variant=warning] .ttdk-alert-icon-wrapper{color:var(--ttdk-text-icon-status-warning)}.ttdk-alert[data-appearance=soft][data-variant=danger]{background-color:var(--ttdk-bg-status-error-subtle);border-color:var(--ttdk-stroke-status-error)}.ttdk-alert[data-appearance=soft][data-variant=danger] .ttdk-alert-icon-wrapper{color:var(--ttdk-text-icon-status-error)}.ttdk-alert[data-appearance=solid]:not([data-variant=neutral]),.ttdk-alert[data-appearance=solid]:not([data-variant=neutral]) .ttdk-alert-title,.ttdk-alert[data-appearance=solid]:not([data-variant=neutral]) .ttdk-alert-desc,.ttdk-alert[data-appearance=solid]:not([data-variant=neutral]) .ttdk-alert-description,.ttdk-alert[data-appearance=solid]:not([data-variant=neutral]) .ttdk-alert-icon-wrapper,.ttdk-alert[data-appearance=solid]:not([data-variant=neutral]) .ttdk-alert-close-btn{color:var(--ttdk-text-icon-stay-black)}.ttdk-alert[data-appearance=solid][data-variant=success]{background-color:var(--ttdk-bg-status-success);border-color:var(--ttdk-bg-status-success)}.ttdk-alert[data-appearance=solid][data-variant=info]{background-color:var(--ttdk-bg-status-info);border-color:var(--ttdk-bg-status-info);color:var(--ttdk-text-icon-stay-white)}.ttdk-alert[data-appearance=solid][data-variant=info] .ttdk-alert-title,.ttdk-alert[data-appearance=solid][data-variant=info] .ttdk-alert-desc,.ttdk-alert[data-appearance=solid][data-variant=info] .ttdk-alert-description,.ttdk-alert[data-appearance=solid][data-variant=info] .ttdk-alert-icon-wrapper,.ttdk-alert[data-appearance=solid][data-variant=info] .ttdk-alert-close-btn{color:var(--ttdk-text-icon-stay-white)}.ttdk-alert[data-appearance=solid][data-variant=warning]{background-color:var(--ttdk-bg-status-warning);border-color:var(--ttdk-bg-status-warning)}.ttdk-alert[data-appearance=solid][data-variant=danger]{background-color:var(--ttdk-bg-status-error);border-color:var(--ttdk-bg-status-error);color:var(--ttdk-text-icon-stay-white)}.ttdk-alert[data-appearance=solid][data-variant=danger] .ttdk-alert-title,.ttdk-alert[data-appearance=solid][data-variant=danger] .ttdk-alert-desc,.ttdk-alert[data-appearance=solid][data-variant=danger] .ttdk-alert-description,.ttdk-alert[data-appearance=solid][data-variant=danger] .ttdk-alert-icon-wrapper,.ttdk-alert[data-appearance=solid][data-variant=danger] .ttdk-alert-close-btn{color:var(--ttdk-text-icon-stay-white)}.ttdk-alert[data-appearance=outline]{background-color:#0000}.ttdk-alert[data-appearance=outline][data-variant=success]{border-color:var(--ttdk-stroke-status-success)}.ttdk-alert[data-appearance=outline][data-variant=success] .ttdk-alert-icon-wrapper{color:var(--ttdk-text-icon-status-success)}.ttdk-alert[data-appearance=outline][data-variant=info]{border-color:var(--ttdk-stroke-status-info)}.ttdk-alert[data-appearance=outline][data-variant=info] .ttdk-alert-icon-wrapper{color:var(--ttdk-text-icon-status-info)}.ttdk-alert[data-appearance=outline][data-variant=warning]{border-color:var(--ttdk-stroke-status-warning)}.ttdk-alert[data-appearance=outline][data-variant=warning] .ttdk-alert-icon-wrapper{color:var(--ttdk-text-icon-status-warning)}.ttdk-alert[data-appearance=outline][data-variant=danger]{border-color:var(--ttdk-stroke-status-error)}.ttdk-alert[data-appearance=outline][data-variant=danger] .ttdk-alert-icon-wrapper{color:var(--ttdk-text-icon-status-error)}.ttdk-alert[data-appearance=subtle]{background-color:var(--ttdk-bg-secondary-disabled);border-color:var(--ttdk-stroke-subtle)}.ttdk-alert[data-appearance=subtle][data-variant=success] .ttdk-alert-icon-wrapper{color:var(--ttdk-text-icon-status-success)}.ttdk-alert[data-appearance=subtle][data-variant=info] .ttdk-alert-icon-wrapper{color:var(--ttdk-text-icon-status-info)}.ttdk-alert[data-appearance=subtle][data-variant=warning] .ttdk-alert-icon-wrapper{color:var(--ttdk-text-icon-status-warning)}.ttdk-alert[data-appearance=subtle][data-variant=danger] .ttdk-alert-icon-wrapper{color:var(--ttdk-text-icon-status-error)}.dark .ttdk-alert[data-variant=neutral],[data-theme=dark] .ttdk-alert[data-variant=neutral],.dark .ttdk-alert[data-appearance=soft][data-variant=neutral],[data-theme=dark] .ttdk-alert[data-appearance=soft][data-variant=neutral],.dark .ttdk-alert[data-appearance=solid][data-variant=neutral],[data-theme=dark] .ttdk-alert[data-appearance=solid][data-variant=neutral],.dark .ttdk-alert[data-appearance=outline][data-variant=neutral],[data-theme=dark] .ttdk-alert[data-appearance=outline][data-variant=neutral],.dark .ttdk-alert[data-appearance=subtle][data-variant=neutral],[data-theme=dark] .ttdk-alert[data-appearance=subtle][data-variant=neutral]{background-color:var(--ttdk-bg-base-primary);border-color:var(--ttdk-stroke-stay-white);color:var(--ttdk-text-icon-primary)}.dark .ttdk-alert[data-variant=neutral] .ttdk-alert-icon-wrapper,[data-theme=dark] .ttdk-alert[data-variant=neutral] .ttdk-alert-icon-wrapper,.dark .ttdk-alert[data-appearance=soft][data-variant=neutral] .ttdk-alert-icon-wrapper,[data-theme=dark] .ttdk-alert[data-appearance=soft][data-variant=neutral] .ttdk-alert-icon-wrapper,.dark .ttdk-alert[data-appearance=solid][data-variant=neutral] .ttdk-alert-icon-wrapper,[data-theme=dark] .ttdk-alert[data-appearance=solid][data-variant=neutral] .ttdk-alert-icon-wrapper,.dark .ttdk-alert[data-appearance=outline][data-variant=neutral] .ttdk-alert-icon-wrapper,[data-theme=dark] .ttdk-alert[data-appearance=outline][data-variant=neutral] .ttdk-alert-icon-wrapper,.dark .ttdk-alert[data-appearance=subtle][data-variant=neutral] .ttdk-alert-icon-wrapper,[data-theme=dark] .ttdk-alert[data-appearance=subtle][data-variant=neutral] .ttdk-alert-icon-wrapper{color:var(--ttdk-text-icon-primary)}.dark .ttdk-alert[data-appearance=soft][data-variant=success],[data-theme=dark] .ttdk-alert[data-appearance=soft][data-variant=success]{background-color:var(--ttdk-bg-status-success-subtle);border-color:var(--ttdk-stroke-status-success)}.dark .ttdk-alert[data-appearance=soft][data-variant=info],[data-theme=dark] .ttdk-alert[data-appearance=soft][data-variant=info]{background-color:var(--ttdk-bg-status-info-subtle);border-color:var(--ttdk-stroke-status-info)}.dark .ttdk-alert[data-appearance=soft][data-variant=warning],[data-theme=dark] .ttdk-alert[data-appearance=soft][data-variant=warning]{background-color:var(--ttdk-bg-status-warning-subtle);border-color:var(--ttdk-stroke-status-warning)}.dark .ttdk-alert[data-appearance=soft][data-variant=danger],[data-theme=dark] .ttdk-alert[data-appearance=soft][data-variant=danger]{background-color:var(--ttdk-bg-status-error-subtle);border-color:var(--ttdk-stroke-status-error)}.dark .ttdk-alert[data-appearance=subtle],[data-theme=dark] .ttdk-alert[data-appearance=subtle]{background-color:var(--ttdk-bg-card);border-color:var(--ttdk-stroke-subtle)}.ttdk-alert[style*=--ttdk-ui-icon-color] .ttdk-alert-icon-wrapper,.ttdk-alert[style*=--ttdk-ui-icon-color] .ttdk-alert-icon{color:var(--ttdk-ui-icon-color)!important}.ttdk-alert[style*=--ttdk-ui-icon-size] .ttdk-alert-icon{width:var(--ttdk-ui-icon-size)!important;height:var(--ttdk-ui-icon-size)!important}