@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,186 @@
1
+ # <Chip /> — TTDK Component Reference
2
+
3
+ TTDK Chip component with multi-theme support.
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/chip/chip.css";`
8
+
9
+ ## 2. Subpath Component Import
10
+ ```ts
11
+ // React
12
+ import Chip from "@ttdk-design-system/library-react/web/chip";
13
+
14
+ // Vue 3
15
+ import Chip from "@ttdk-design-system/library-vue/web/chip";
16
+
17
+ // Svelte
18
+ import Chip from "@ttdk-design-system/library-svelte/web/chip";
19
+ ```
20
+
21
+ ## 3. Props & API Reference
22
+
23
+ | Prop | Type | Default | Description |
24
+ | :--- | :--- | :--- | :--- |
25
+ | `label?` | `string` | `-` | Teks label yang ditampilkan pada chip. |
26
+ | `selected?` | `boolean` | `false` | Status apakah chip sedang dalam kondisi terpilih (selected). |
27
+ | `variant?` | `| 'primary'
28
+ | 'success'
29
+ | 'info'
30
+ | 'warning'
31
+ | 'danger'
32
+ | 'neutral'
33
+ | 'disabled'` | `primary` | Varian warna semantik tema chip: - `'primary'`: Brand Teal utama (#00B5AD). - `'success'`: Sukses hijau (#04B761). - `'info'`: Biru informasi (#2196F3). - `'warning'`: Peringatan kuning / amber (#F88000). - `'danger'`: Bahaya / merah (#D0021B). - `'neutral'`: Netral abu-abu. - `'disabled'`: Status nonaktif (disabled). |
34
+ | `appearance?` | `'soft' | 'solid' | 'outline'` | `soft` | Tipe tampilan visual chip: - `'soft'`: Background warna transparan lembut (default). - `'solid'`: Background warna solid pekat. - `'outline'`: Border tipis dengan background transparan. |
35
+ | `size?` | `'sm' | 'md' | 'lg'` | `md` | Skala ukuran chip: - `'sm'`: Tinggi 28px, font 12px. - `'md'`: Tinggi 32px, font 13px (standar). - `'lg'`: Tinggi 38px, font 15px. |
36
+ | `rounded?` | `'none' | 'sm' | 'md' | 'lg' | 'full'` | `full` | Bentuk sudut kelengkungan: - `'full'`: Bentuk kapsul / pill 9999px (default). - `'none'`: Persegi lancip 0px. - `'sm'`: Sudut melengkung halus 4px. - `'md'`: Sudut melengkung sedang 6px. - `'lg'`: Sudut melengkung besar 8px. |
37
+ | `closable?` | `boolean` | `false` | Menampilkan tombol silang (x) untuk menghapus / menutup chip. |
38
+ | `disabled?` | `boolean` | `false` | Menonaktifkan interaksi klik pada chip. |
39
+ | `ui?` | `UiProps` | `-` | Kustomisasi visual granular melalui style-like object (+ support pseudo-class: hover, active). |
40
+ | `style?` | `any` | `-` | Inline CSS style object native. |
41
+ | `labelStyle?` | `UiProps` | `-` | Style kustom untuk teks label chip (UiProps). |
42
+ | `labelClass?` | `string` | `-` | Class CSS kustom untuk teks label chip (Tailwind / class kustom). |
43
+ | `closableStyle?` | `UiProps` | `-` | Style kustom untuk tombol tutup chip (UiProps). |
44
+ | `closableClass?` | `string` | `-` | Class CSS kustom untuk tombol tutup chip (Tailwind / class kustom). |
45
+ | `onClick?` | `(event?: any) => void` | `-` | Event handler saat chip diklik (toggle select atau trigger aksi). |
46
+ | `onClose?` | `(event?: any) => void` | `-` | Event handler saat tombol close (x) diklik. |
47
+ | `className?` | `string` | `-` | Class CSS kustom. |
48
+ | `children?` | `any` | `-` | Konten kustom / icon kustom yang disisipkan di dalam chip. |
49
+
50
+ ## 4. Usage Examples
51
+
52
+ ### React Example
53
+ ```tsx
54
+ import { useState } from "react";
55
+ import Chip from "@ttdk-design-system/library-react/web/chip";
56
+ import "@ttdk-design-system/library-react/web/chip/chip.css";
57
+
58
+ export function Example() {
59
+ const [selected, setSelected] = useState<string[]>(['puskesmas']);
60
+
61
+ const toggle = (val: string) => {
62
+ setSelected((prev) =>
63
+ prev.includes(val) ? prev.filter((i) => i !== val) : [...prev, val]
64
+ );
65
+ };
66
+
67
+ return (
68
+ <div style={{ display: 'flex', gap: '8px', flexWrap: 'wrap' }}>
69
+ <Chip
70
+ label="Puskesmas"
71
+ variant="action"
72
+ selected={selected.includes('puskesmas')}
73
+ onClick={() => toggle('puskesmas')}
74
+ />
75
+ <Chip
76
+ label="Rumah Sakit"
77
+ variant="action"
78
+ selected={selected.includes('rs')}
79
+ onClick={() => toggle('rs')}
80
+ />
81
+ <Chip
82
+ label="Klinik"
83
+ variant="action"
84
+ selected={selected.includes('klinik')}
85
+ onClick={() => toggle('klinik')}
86
+ />
87
+ <Chip
88
+ label="Laboratorium"
89
+ closable
90
+ onClose={() => alert('Chip dihapus')}
91
+ />
92
+ </div>
93
+ );
94
+ }
95
+ ```
96
+
97
+ ### Vue 3 Example
98
+ ```vue
99
+ <script setup lang="ts">
100
+ import { ref } from "vue";
101
+ import Chip from "@ttdk-design-system/library-vue/web/chip";
102
+ import "@ttdk-design-system/library-vue/web/chip/chip.css";
103
+
104
+ const selected = ref(['puskesmas']);
105
+
106
+ const toggle = (val: string) => {
107
+ if (selected.value.includes(val)) {
108
+ selected.value = selected.value.filter((i) => i !== val);
109
+ } else {
110
+ selected.value.push(val);
111
+ }
112
+ };
113
+ </script>
114
+
115
+ <template>
116
+ <div style="display: flex; gap: 8px; flex-wrap: wrap;">
117
+ <Chip
118
+ label="Puskesmas"
119
+ variant="action"
120
+ :selected="selected.includes('puskesmas')"
121
+ @click="() => toggle('puskesmas')"
122
+ />
123
+ <Chip
124
+ label="Rumah Sakit"
125
+ variant="action"
126
+ :selected="selected.includes('rs')"
127
+ @click="() => toggle('rs')"
128
+ />
129
+ <Chip
130
+ label="Klinik"
131
+ variant="action"
132
+ :selected="selected.includes('klinik')"
133
+ @click="() => toggle('klinik')"
134
+ />
135
+ <Chip
136
+ label="Laboratorium"
137
+ :closable="true"
138
+ @close="() => alert('Chip dihapus')"
139
+ />
140
+ </div>
141
+ </template>
142
+ ```
143
+
144
+ ### Svelte Example
145
+ ```svelte
146
+ <script lang="ts">
147
+ import Chip from "@ttdk-design-system/library-svelte/web/chip";
148
+ import "@ttdk-design-system/library-svelte/web/chip/chip.css";
149
+
150
+ let selected = ['puskesmas'];
151
+
152
+ const toggle = (val: string) => {
153
+ if (selected.includes(val)) {
154
+ selected = selected.filter((i) => i !== val);
155
+ } else {
156
+ selected = [...selected, val];
157
+ }
158
+ };
159
+ </script>
160
+
161
+ <div style="display: flex; gap: 8px; flex-wrap: wrap;">
162
+ <Chip
163
+ label="Puskesmas"
164
+ variant="action"
165
+ selected={selected.includes('puskesmas')}
166
+ on:click={() => toggle('puskesmas')}
167
+ />
168
+ <Chip
169
+ label="Rumah Sakit"
170
+ variant="action"
171
+ selected={selected.includes('rs')}
172
+ on:click={() => toggle('rs')}
173
+ />
174
+ <Chip
175
+ label="Klinik"
176
+ variant="action"
177
+ selected={selected.includes('klinik')}
178
+ on:click={() => toggle('klinik')}
179
+ />
180
+ <Chip
181
+ label="Laboratorium"
182
+ closable={true}
183
+ on:close={() => alert('Chip dihapus')}
184
+ />
185
+ </div>
186
+ ```
@@ -0,0 +1 @@
1
+ .ttdk-chip{font-family:var(--ttdk-font-sans);font-weight:var(--ttdk-font-weight-medium);line-height:var(--ttdk-line-height-tight);letter-spacing:.15px;box-sizing:border-box;user-select:none;white-space:nowrap;vertical-align:middle;cursor:pointer;background-color:var(--ttdk-bg-base-primary);border:1px solid var(--ttdk-stroke-subtle);color:var(--ttdk-text-icon-primary);border-radius:var(--ttdk-radius-full);outline:none;justify-content:center;align-items:center;text-decoration:none;transition:all .15s cubic-bezier(.4,0,.2,1);display:inline-flex;position:relative}.ttdk-chip:focus-visible{box-shadow:0 0 0 2px var(--ttdk-stroke-border-focus)}.ttdk-chip:hover:not([data-disabled=true]):not([data-selected=true]){border-color:var(--ttdk-stroke-border-focus);color:var(--ttdk-text-icon-primary)}.ttdk-chip:active:not([data-disabled=true]){transform:scale(.97)}.ttdk-chip[data-disabled=true],.ttdk-chip[data-variant=disabled],.ttdk-chip[data-variant=disable]{opacity:.75;background-color:var(--ttdk-bg-secondary-disabled)!important;border-color:var(--ttdk-stroke-subtle)!important;color:var(--ttdk-text-icon-disabled)!important;cursor:not-allowed!important;pointer-events:none!important}.ttdk-chip[data-size=xs]{height:24px;padding:0 var(--ttdk-spacing-xs);gap:var(--ttdk-spacing-xxs);font-size:11px}.ttdk-chip[data-size=sm]{height:28px;font-size:var(--ttdk-font-size-12);gap:5px;padding:0 10px}.ttdk-chip[data-size=md]{gap:6px;height:32px;padding:0 14px;font-size:13px}.ttdk-chip[data-size=lg]{gap:var(--ttdk-spacing-xs);height:38px;padding:0 18px;font-size:15px}.ttdk-chip[data-rounded=full]{border-radius:var(--ttdk-radius-full)}.ttdk-chip[data-rounded=lg]{border-radius:var(--ttdk-radius-md)}.ttdk-chip[data-rounded=md]{border-radius:var(--ttdk-radius-sm)}.ttdk-chip[data-rounded=sm]{border-radius:var(--ttdk-radius-xs)}.ttdk-chip[data-rounded=none]{border-radius:var(--ttdk-radius-none)}.ttdk-chip[data-selected=false]{background-color:var(--ttdk-bg-base-primary);border:1px solid var(--ttdk-stroke-subtle);color:var(--ttdk-text-icon-primary)}.ttdk-chip[data-selected=false]:hover:not([data-disabled=true]):not([data-variant=disabled]){border-color:var(--ttdk-stroke-border-focus);color:var(--ttdk-text-icon-primary)}.ttdk-chip[data-appearance=soft][data-variant=primary]:not([data-selected=false]),.ttdk-chip[data-appearance=soft][data-selected=true][data-variant=primary]{background-color:var(--ttdk-brand-subtle);border-color:var(--ttdk-brand-default);color:var(--ttdk-brand-default)}.ttdk-chip[data-appearance=soft][data-variant=success]:not([data-selected=false]),.ttdk-chip[data-appearance=soft][data-selected=true][data-variant=success]{background-color:var(--ttdk-bg-status-success-subtle);border-color:var(--ttdk-stroke-status-success);color:var(--ttdk-text-icon-status-success)}.ttdk-chip[data-appearance=soft][data-variant=info]:not([data-selected=false]),.ttdk-chip[data-appearance=soft][data-selected=true][data-variant=info]{background-color:var(--ttdk-bg-status-info-subtle);border-color:var(--ttdk-stroke-status-info);color:var(--ttdk-text-icon-status-info)}.ttdk-chip[data-appearance=soft][data-variant=warning]:not([data-selected=false]),.ttdk-chip[data-appearance=soft][data-selected=true][data-variant=warning]{background-color:var(--ttdk-bg-status-warning-subtle);border-color:var(--ttdk-stroke-status-warning);color:var(--ttdk-text-icon-status-warning)}.ttdk-chip[data-appearance=soft][data-variant=danger]:not([data-selected=false]),.ttdk-chip[data-appearance=soft][data-selected=true][data-variant=danger]{background-color:var(--ttdk-bg-status-error-subtle);border-color:var(--ttdk-stroke-status-error);color:var(--ttdk-text-icon-status-error)}.ttdk-chip[data-variant=neutral]:not([data-selected=false]),.ttdk-chip[data-variant=base]:not([data-selected=false]),.ttdk-chip[data-appearance=soft][data-variant=neutral]:not([data-selected=false]),.ttdk-chip[data-appearance=soft][data-variant=base]:not([data-selected=false]),.ttdk-chip[data-appearance=soft][data-selected=true][data-variant=neutral],.ttdk-chip[data-appearance=soft][data-selected=true][data-variant=base]{background-color:var(--ttdk-bg-secondary-disabled);border-color:var(--ttdk-stroke-divider);color:var(--ttdk-text-icon-primary)}.ttdk-chip[data-variant=disable]:not([data-selected=false]),.ttdk-chip[data-variant=disabled]:not([data-selected=false]),.ttdk-chip[data-appearance=soft][data-variant=disable]:not([data-selected=false]),.ttdk-chip[data-appearance=soft][data-variant=disabled]:not([data-selected=false]),.ttdk-chip[data-appearance=soft][data-selected=true][data-variant=disable],.ttdk-chip[data-appearance=soft][data-selected=true][data-variant=disabled]{background-color:var(--ttdk-bg-secondary-disabled);border-color:var(--ttdk-stroke-subtle);color:var(--ttdk-text-icon-disabled)}.ttdk-chip[data-appearance=solid][data-variant=primary]:not([data-selected=false]),.ttdk-chip[data-appearance=solid][data-selected=true][data-variant=primary]{background-color:var(--ttdk-brand-default);border-color:var(--ttdk-brand-default);color:var(--ttdk-color-white)}.ttdk-chip[data-appearance=solid][data-variant=success]:not([data-selected=false]),.ttdk-chip[data-appearance=solid][data-selected=true][data-variant=success]{background-color:var(--ttdk-bg-status-success);border-color:var(--ttdk-bg-status-success);color:var(--ttdk-color-white)}.ttdk-chip[data-appearance=solid][data-variant=info]:not([data-selected=false]),.ttdk-chip[data-appearance=solid][data-selected=true][data-variant=info]{background-color:var(--ttdk-bg-status-info);border-color:var(--ttdk-bg-status-info);color:var(--ttdk-color-white)}.ttdk-chip[data-appearance=solid][data-variant=warning]:not([data-selected=false]),.ttdk-chip[data-appearance=solid][data-selected=true][data-variant=warning]{background-color:var(--ttdk-bg-status-warning);border-color:var(--ttdk-bg-status-warning);color:var(--ttdk-color-black)}.ttdk-chip[data-appearance=solid][data-variant=danger]:not([data-selected=false]),.ttdk-chip[data-appearance=solid][data-selected=true][data-variant=danger]{background-color:var(--ttdk-bg-status-error);border-color:var(--ttdk-bg-status-error);color:var(--ttdk-color-white)}.ttdk-chip[data-appearance=solid][data-variant=neutral]:not([data-selected=false]),.ttdk-chip[data-appearance=solid][data-variant=base]:not([data-selected=false]),.ttdk-chip[data-appearance=solid][data-selected=true][data-variant=neutral],.ttdk-chip[data-appearance=solid][data-selected=true][data-variant=base]{background-color:var(--ttdk-bg-secondary-disabled);border-color:var(--ttdk-stroke-divider);color:var(--ttdk-text-icon-primary)}.ttdk-chip[data-appearance=solid][data-variant=disable]:not([data-selected=false]),.ttdk-chip[data-appearance=solid][data-variant=disabled]:not([data-selected=false]),.ttdk-chip[data-appearance=solid][data-selected=true][data-variant=disable],.ttdk-chip[data-appearance=solid][data-selected=true][data-variant=disabled]{background-color:var(--ttdk-bg-secondary-disabled);border-color:var(--ttdk-stroke-subtle);color:var(--ttdk-text-icon-disabled)}.ttdk-chip[data-appearance=outline]:not([data-selected=false]),.ttdk-chip[data-appearance=outline][data-selected=true]{background-color:#0000}.ttdk-chip[data-appearance=outline][data-variant=primary]:not([data-selected=false]),.ttdk-chip[data-appearance=outline][data-selected=true][data-variant=primary]{border-color:var(--ttdk-brand-default);color:var(--ttdk-brand-default)}.ttdk-chip[data-appearance=outline][data-variant=success]:not([data-selected=false]),.ttdk-chip[data-appearance=outline][data-selected=true][data-variant=success]{border-color:var(--ttdk-stroke-status-success);color:var(--ttdk-text-icon-status-success)}.ttdk-chip[data-appearance=outline][data-variant=info]:not([data-selected=false]),.ttdk-chip[data-appearance=outline][data-selected=true][data-variant=info]{border-color:var(--ttdk-stroke-status-info);color:var(--ttdk-text-icon-status-info)}.ttdk-chip[data-appearance=outline][data-variant=warning]:not([data-selected=false]),.ttdk-chip[data-appearance=outline][data-selected=true][data-variant=warning]{border-color:var(--ttdk-stroke-status-warning);color:var(--ttdk-text-icon-status-warning)}.ttdk-chip[data-appearance=outline][data-variant=danger]:not([data-selected=false]),.ttdk-chip[data-appearance=outline][data-selected=true][data-variant=danger]{border-color:var(--ttdk-stroke-status-error);color:var(--ttdk-text-icon-status-error)}.ttdk-chip[data-appearance=outline][data-variant=neutral]:not([data-selected=false]),.ttdk-chip[data-appearance=outline][data-variant=base]:not([data-selected=false]),.ttdk-chip[data-appearance=outline][data-selected=true][data-variant=neutral],.ttdk-chip[data-appearance=outline][data-selected=true][data-variant=base]{border-color:var(--ttdk-stroke-divider);color:var(--ttdk-text-icon-primary)}.ttdk-chip[data-appearance=outline][data-variant=disable]:not([data-selected=false]),.ttdk-chip[data-appearance=outline][data-variant=disabled]:not([data-selected=false]),.ttdk-chip[data-appearance=outline][data-selected=true][data-variant=disable],.ttdk-chip[data-appearance=outline][data-selected=true][data-variant=disabled]{border-color:var(--ttdk-stroke-subtle);color:var(--ttdk-text-icon-disabled)}.dark .ttdk-chip[data-appearance=soft][data-variant=primary]:not([data-selected=false]),[data-theme=dark] .ttdk-chip[data-appearance=soft][data-variant=primary]:not([data-selected=false]),.dark .ttdk-chip[data-appearance=soft][data-selected=true][data-variant=primary],[data-theme=dark] .ttdk-chip[data-appearance=soft][data-selected=true][data-variant=primary]{background-color:var(--ttdk-brand-subtle-dark);border-color:var(--ttdk-brand-default)}.dark .ttdk-chip[data-appearance=soft][data-variant=success]:not([data-selected=false]),[data-theme=dark] .ttdk-chip[data-appearance=soft][data-variant=success]:not([data-selected=false]),.dark .ttdk-chip[data-appearance=soft][data-selected=true][data-variant=success],[data-theme=dark] .ttdk-chip[data-appearance=soft][data-selected=true][data-variant=success]{background-color:var(--ttdk-bg-status-success-subtle);border-color:var(--ttdk-stroke-status-success)}.dark .ttdk-chip[data-appearance=soft][data-variant=info]:not([data-selected=false]),[data-theme=dark] .ttdk-chip[data-appearance=soft][data-variant=info]:not([data-selected=false]),.dark .ttdk-chip[data-appearance=soft][data-selected=true][data-variant=info],[data-theme=dark] .ttdk-chip[data-appearance=soft][data-selected=true][data-variant=info]{background-color:var(--ttdk-bg-status-info-subtle);border-color:var(--ttdk-stroke-status-info)}.dark .ttdk-chip[data-appearance=soft][data-variant=warning]:not([data-selected=false]),[data-theme=dark] .ttdk-chip[data-appearance=soft][data-variant=warning]:not([data-selected=false]),.dark .ttdk-chip[data-appearance=soft][data-selected=true][data-variant=warning],[data-theme=dark] .ttdk-chip[data-appearance=soft][data-selected=true][data-variant=warning]{background-color:var(--ttdk-bg-status-warning-subtle);border-color:var(--ttdk-stroke-status-warning)}.dark .ttdk-chip[data-appearance=soft][data-variant=danger]:not([data-selected=false]),[data-theme=dark] .ttdk-chip[data-appearance=soft][data-variant=danger]:not([data-selected=false]),.dark .ttdk-chip[data-appearance=soft][data-selected=true][data-variant=danger],[data-theme=dark] .ttdk-chip[data-appearance=soft][data-selected=true][data-variant=danger]{background-color:var(--ttdk-bg-status-error-subtle);border-color:var(--ttdk-stroke-status-error)}.dark .ttdk-chip[data-appearance=solid][data-variant=neutral],[data-theme=dark] .ttdk-chip[data-appearance=solid][data-variant=neutral],.dark .ttdk-chip[data-appearance=solid][data-variant=base],[data-theme=dark] .ttdk-chip[data-appearance=solid][data-variant=base]{background-color:var(--ttdk-bg-stay-black);border-color:var(--ttdk-bg-stay-black);color:var(--ttdk-text-icon-stay-white)}.dark .ttdk-chip[data-appearance=soft][data-variant=neutral],[data-theme=dark] .ttdk-chip[data-appearance=soft][data-variant=neutral],.dark .ttdk-chip[data-appearance=soft][data-variant=base],[data-theme=dark] .ttdk-chip[data-appearance=soft][data-variant=base],.dark .ttdk-chip[data-variant=neutral],[data-theme=dark] .ttdk-chip[data-variant=neutral],.dark .ttdk-chip[data-variant=base],[data-theme=dark] .ttdk-chip[data-variant=base]{background-color:var(--ttdk-color-neutral-900);border-color:var(--ttdk-stroke-strong);color:var(--ttdk-text-icon-primary)}.dark .ttdk-chip[data-appearance=outline][data-variant=neutral],[data-theme=dark] .ttdk-chip[data-appearance=outline][data-variant=neutral],.dark .ttdk-chip[data-appearance=outline][data-variant=base],[data-theme=dark] .ttdk-chip[data-appearance=outline][data-variant=base]{background-color:var(--ttdk-bg-stay-black);border-color:var(--ttdk-stroke-stay-white);color:var(--ttdk-text-icon-primary)}.dark .ttdk-chip[data-variant=disable],[data-theme=dark] .ttdk-chip[data-variant=disable],.dark .ttdk-chip[data-variant=disabled],[data-theme=dark] .ttdk-chip[data-variant=disabled]{background-color:var(--ttdk-bg-secondary-disabled);border-color:var(--ttdk-stroke-subtle);color:var(--ttdk-text-icon-disabled)}.ttdk-chip-prefix{flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.ttdk-chip-close{cursor:pointer;color:currentColor;opacity:.65;border-radius:var(--ttdk-radius-full);background:0 0;border:none;justify-content:center;align-items:center;margin:0 -2px 0 2px;padding:0;line-height:1;transition:opacity .12s,background-color .12s;display:inline-flex}.ttdk-chip-close:hover{opacity:1;background-color:color-mix(in srgb, currentColor 12%, transparent)}.ttdk-chip-close svg{fill:none;stroke:currentColor;stroke-width:2.2px;stroke-linecap:round;stroke-linejoin:round;width:14px;height:14px}.ttdk-chip[data-size=xs] .ttdk-chip-close svg{width:11px;height:11px}.ttdk-chip[data-size=sm] .ttdk-chip-close svg{width:12px;height:12px}.ttdk-chip[data-size=lg] .ttdk-chip-close svg{width:16px;height:16px}
@@ -0,0 +1,230 @@
1
+ "use client";
2
+ import * as React from "react";
3
+
4
+ export type ChipUiProps = UiProps;
5
+ export interface ChipProps {
6
+ /**
7
+ * Teks label yang ditampilkan pada chip.
8
+ */
9
+ label?: string;
10
+
11
+ /**
12
+ * Status apakah chip sedang dalam kondisi terpilih (selected).
13
+ *
14
+ * @default false
15
+ */
16
+ selected?: boolean;
17
+
18
+ /**
19
+ * Varian warna semantik tema chip:
20
+ * - `'primary'`: Brand Teal utama (#00B5AD).
21
+ * - `'success'`: Sukses hijau (#04B761).
22
+ * - `'info'`: Biru informasi (#2196F3).
23
+ * - `'warning'`: Peringatan kuning / amber (#F88000).
24
+ * - `'danger'`: Bahaya / merah (#D0021B).
25
+ * - `'neutral'`: Netral abu-abu.
26
+ * - `'disabled'`: Status nonaktif (disabled).
27
+ *
28
+ * @default 'primary'
29
+ */
30
+ variant?:
31
+ | "primary"
32
+ | "success"
33
+ | "info"
34
+ | "warning"
35
+ | "danger"
36
+ | "neutral"
37
+ | "disabled";
38
+
39
+ /**
40
+ * Tipe tampilan visual chip:
41
+ * - `'soft'`: Background warna transparan lembut (default).
42
+ * - `'solid'`: Background warna solid pekat.
43
+ * - `'outline'`: Border tipis dengan background transparan.
44
+ *
45
+ * @default 'soft'
46
+ */
47
+ appearance?: "soft" | "solid" | "outline";
48
+
49
+ /**
50
+ * Skala ukuran chip:
51
+ * - `'sm'`: Tinggi 28px, font 12px.
52
+ * - `'md'`: Tinggi 32px, font 13px (standar).
53
+ * - `'lg'`: Tinggi 38px, font 15px.
54
+ *
55
+ * @default 'md'
56
+ */
57
+ size?: "sm" | "md" | "lg";
58
+
59
+ /**
60
+ * Bentuk sudut kelengkungan:
61
+ * - `'full'`: Bentuk kapsul / pill 9999px (default).
62
+ * - `'none'`: Persegi lancip 0px.
63
+ * - `'sm'`: Sudut melengkung halus 4px.
64
+ * - `'md'`: Sudut melengkung sedang 6px.
65
+ * - `'lg'`: Sudut melengkung besar 8px.
66
+ *
67
+ * @default 'full'
68
+ */
69
+ rounded?: "none" | "sm" | "md" | "lg" | "full";
70
+
71
+ /**
72
+ * Menampilkan tombol silang (x) untuk menghapus / menutup chip.
73
+ *
74
+ * @default false
75
+ */
76
+ closable?: boolean;
77
+
78
+ /**
79
+ * Menonaktifkan interaksi klik pada chip.
80
+ *
81
+ * @default false
82
+ */
83
+ disabled?: boolean;
84
+
85
+ /**
86
+ * Kustomisasi visual granular melalui style-like object (+ support pseudo-class: hover, active).
87
+ */
88
+ ui?: UiProps;
89
+
90
+ /**
91
+ * Inline CSS style object native.
92
+ */
93
+ style?: React.CSSProperties;
94
+
95
+ /**
96
+ * Style kustom untuk teks label chip (UiProps).
97
+ */
98
+ labelStyle?: UiProps;
99
+
100
+ /**
101
+ * Class CSS kustom untuk teks label chip (Tailwind / class kustom).
102
+ */
103
+ labelClass?: string;
104
+
105
+ /**
106
+ * Style kustom untuk tombol tutup chip (UiProps).
107
+ */
108
+ closableStyle?: UiProps;
109
+
110
+ /**
111
+ * Class CSS kustom untuk tombol tutup chip (Tailwind / class kustom).
112
+ */
113
+ closableClass?: string;
114
+
115
+ /**
116
+ * Event handler saat chip diklik (toggle select atau trigger aksi).
117
+ */
118
+ onClick?: (event?: any) => void;
119
+
120
+ /**
121
+ * Event handler saat tombol close (x) diklik.
122
+ */
123
+ onClose?: (event?: any) => void;
124
+
125
+ /**
126
+ * Class CSS kustom.
127
+ */
128
+ className?: string;
129
+
130
+ /**
131
+ * Konten kustom / icon kustom yang disisipkan di dalam chip.
132
+ */
133
+ children?: any;
134
+ }
135
+
136
+ import { buildUiVars, UiProps } from "../../core/types";
137
+
138
+ function Chip(props: ChipProps) {
139
+ return (
140
+ <button
141
+ type="button"
142
+ className={`ttdk-chip ${props.className || ""}`.trim()}
143
+ data-variant={props.variant || "primary"}
144
+ data-appearance={props.appearance || "soft"}
145
+ data-size={props.size || "md"}
146
+ data-rounded={props.rounded || "full"}
147
+ data-selected={
148
+ props.selected !== undefined
149
+ ? props.selected
150
+ ? "true"
151
+ : "false"
152
+ : undefined
153
+ }
154
+ data-disabled={
155
+ props.disabled || props.variant === "disabled" ? "true" : "false"
156
+ }
157
+ style={{
158
+ ...buildUiVars(props.ui),
159
+ ...(props.ui?.border
160
+ ? {
161
+ border: props.ui.border,
162
+ }
163
+ : {}),
164
+ ...(props.ui?.borderColor
165
+ ? {
166
+ borderColor: props.ui.borderColor,
167
+ }
168
+ : {}),
169
+ ...(props.ui?.borderWidth
170
+ ? {
171
+ borderWidth: props.ui.borderWidth,
172
+ }
173
+ : {}),
174
+ ...(props.ui?.borderStyle
175
+ ? {
176
+ borderStyle: props.ui.borderStyle,
177
+ }
178
+ : {}),
179
+ ...(props.ui?.borderRadius
180
+ ? {
181
+ borderRadius: props.ui.borderRadius,
182
+ }
183
+ : {}),
184
+ ...((props as any)["style"] || {}),
185
+ ...props.style,
186
+ }}
187
+ onClick={(event) => {
188
+ if (props.disabled || props.variant === "disabled") return;
189
+ props.onClick?.(event);
190
+ }}
191
+ >
192
+ <>{props.children}</>
193
+ {props.label ? (
194
+ <span
195
+ className={`ttdk-chip-label ${props.labelClass || ""}`.trim()}
196
+ style={{
197
+ ...buildUiVars(props.labelStyle),
198
+ }}
199
+ >
200
+ {props.label}
201
+ </span>
202
+ ) : null}
203
+ {props.closable ? (
204
+ <span
205
+ role="button"
206
+ aria-label="Hapus chip"
207
+ tabIndex={0}
208
+ className={`ttdk-chip-close ${props.closableClass || ""}`.trim()}
209
+ style={{
210
+ ...buildUiVars(props.closableStyle),
211
+ }}
212
+ onClick={(event) => {
213
+ event.stopPropagation();
214
+ if (props.disabled) return;
215
+ props.onClose?.(event);
216
+ }}
217
+ >
218
+ <svg viewBox="0 0 24 24">
219
+ <line x1="18" y1="6" x2="6" y2="18" />
220
+ <line x1="6" y1="6" x2="18" y2="18" />
221
+ </svg>
222
+ </span>
223
+ ) : null}
224
+ </button>
225
+ );
226
+ }
227
+
228
+ export default Chip;
229
+
230
+ export { Chip };
@@ -0,0 +1,2 @@
1
+ export { default as Chip } from './chip';
2
+ export { default } from "./chip"
@@ -0,0 +1,186 @@
1
+ {
2
+ "name": "@ttdk-design-system/chip",
3
+ "component": "Chip",
4
+ "folder": "chip",
5
+ "description": "TTDK Chip component with multi-theme support.",
6
+ "stylesheets": [
7
+ {
8
+ "theme": "common",
9
+ "file": "chip.css",
10
+ "importPath": "web/chip/chip.css"
11
+ }
12
+ ],
13
+ "props": {
14
+ "label": {
15
+ "name": "label",
16
+ "type": "string",
17
+ "optional": true,
18
+ "default": null,
19
+ "description": "Teks label yang ditampilkan pada chip.",
20
+ "example": null,
21
+ "param": null
22
+ },
23
+ "selected": {
24
+ "name": "selected",
25
+ "type": "boolean",
26
+ "optional": true,
27
+ "default": "false",
28
+ "description": "Status apakah chip sedang dalam kondisi terpilih (selected).",
29
+ "example": null,
30
+ "param": null
31
+ },
32
+ "variant": {
33
+ "name": "variant",
34
+ "type": "| 'primary'\n | 'success'\n | 'info'\n | 'warning'\n | 'danger'\n | 'neutral'\n | 'disabled'",
35
+ "optional": true,
36
+ "default": "primary",
37
+ "description": "Varian warna semantik tema chip: - `'primary'`: Brand Teal utama (#00B5AD). - `'success'`: Sukses hijau (#04B761). - `'info'`: Biru informasi (#2196F3). - `'warning'`: Peringatan kuning / amber (#F88000). - `'danger'`: Bahaya / merah (#D0021B). - `'neutral'`: Netral abu-abu. - `'disabled'`: Status nonaktif (disabled).",
38
+ "example": null,
39
+ "param": null
40
+ },
41
+ "appearance": {
42
+ "name": "appearance",
43
+ "type": "'soft' | 'solid' | 'outline'",
44
+ "optional": true,
45
+ "default": "soft",
46
+ "description": "Tipe tampilan visual chip: - `'soft'`: Background warna transparan lembut (default). - `'solid'`: Background warna solid pekat. - `'outline'`: Border tipis dengan background transparan.",
47
+ "example": null,
48
+ "param": null
49
+ },
50
+ "size": {
51
+ "name": "size",
52
+ "type": "'sm' | 'md' | 'lg'",
53
+ "optional": true,
54
+ "default": "md",
55
+ "description": "Skala ukuran chip: - `'sm'`: Tinggi 28px, font 12px. - `'md'`: Tinggi 32px, font 13px (standar). - `'lg'`: Tinggi 38px, font 15px.",
56
+ "example": null,
57
+ "param": null
58
+ },
59
+ "rounded": {
60
+ "name": "rounded",
61
+ "type": "'none' | 'sm' | 'md' | 'lg' | 'full'",
62
+ "optional": true,
63
+ "default": "full",
64
+ "description": "Bentuk sudut kelengkungan: - `'full'`: Bentuk kapsul / pill 9999px (default). - `'none'`: Persegi lancip 0px. - `'sm'`: Sudut melengkung halus 4px. - `'md'`: Sudut melengkung sedang 6px. - `'lg'`: Sudut melengkung besar 8px.",
65
+ "example": null,
66
+ "param": null
67
+ },
68
+ "closable": {
69
+ "name": "closable",
70
+ "type": "boolean",
71
+ "optional": true,
72
+ "default": "false",
73
+ "description": "Menampilkan tombol silang (x) untuk menghapus / menutup chip.",
74
+ "example": null,
75
+ "param": null
76
+ },
77
+ "disabled": {
78
+ "name": "disabled",
79
+ "type": "boolean",
80
+ "optional": true,
81
+ "default": "false",
82
+ "description": "Menonaktifkan interaksi klik pada chip.",
83
+ "example": null,
84
+ "param": null
85
+ },
86
+ "ui": {
87
+ "name": "ui",
88
+ "type": "UiProps",
89
+ "optional": true,
90
+ "default": null,
91
+ "description": "Kustomisasi visual granular melalui style-like object (+ support pseudo-class: hover, active).",
92
+ "example": null,
93
+ "param": null
94
+ },
95
+ "style": {
96
+ "name": "style",
97
+ "type": "any",
98
+ "optional": true,
99
+ "default": null,
100
+ "description": "Inline CSS style object native.",
101
+ "example": null,
102
+ "param": null
103
+ },
104
+ "labelStyle": {
105
+ "name": "labelStyle",
106
+ "type": "UiProps",
107
+ "optional": true,
108
+ "default": null,
109
+ "description": "Style kustom untuk teks label chip (UiProps).",
110
+ "example": null,
111
+ "param": null
112
+ },
113
+ "labelClass": {
114
+ "name": "labelClass",
115
+ "type": "string",
116
+ "optional": true,
117
+ "default": null,
118
+ "description": "Class CSS kustom untuk teks label chip (Tailwind / class kustom).",
119
+ "example": null,
120
+ "param": null
121
+ },
122
+ "closableStyle": {
123
+ "name": "closableStyle",
124
+ "type": "UiProps",
125
+ "optional": true,
126
+ "default": null,
127
+ "description": "Style kustom untuk tombol tutup chip (UiProps).",
128
+ "example": null,
129
+ "param": null
130
+ },
131
+ "closableClass": {
132
+ "name": "closableClass",
133
+ "type": "string",
134
+ "optional": true,
135
+ "default": null,
136
+ "description": "Class CSS kustom untuk tombol tutup chip (Tailwind / class kustom).",
137
+ "example": null,
138
+ "param": null
139
+ },
140
+ "onClick": {
141
+ "name": "onClick",
142
+ "type": "(event?: any) => void",
143
+ "optional": true,
144
+ "default": null,
145
+ "description": "Event handler saat chip diklik (toggle select atau trigger aksi).",
146
+ "example": null,
147
+ "param": null
148
+ },
149
+ "onClose": {
150
+ "name": "onClose",
151
+ "type": "(event?: any) => void",
152
+ "optional": true,
153
+ "default": null,
154
+ "description": "Event handler saat tombol close (x) diklik.",
155
+ "example": null,
156
+ "param": null
157
+ },
158
+ "className": {
159
+ "name": "className",
160
+ "type": "string",
161
+ "optional": true,
162
+ "default": null,
163
+ "description": "Class CSS kustom.",
164
+ "example": null,
165
+ "param": null
166
+ },
167
+ "children": {
168
+ "name": "children",
169
+ "type": "any",
170
+ "optional": true,
171
+ "default": null,
172
+ "description": "Konten kustom / icon kustom yang disisipkan di dalam chip.",
173
+ "example": null,
174
+ "param": null
175
+ }
176
+ },
177
+ "subInterfaces": {},
178
+ "supportedFrameworks": [
179
+ "react",
180
+ "vue",
181
+ "svelte"
182
+ ],
183
+ "themes": [
184
+ "tw"
185
+ ]
186
+ }