@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
package/src/index.ts ADDED
@@ -0,0 +1,17 @@
1
+ /**
2
+ * TTDK Design System — Root Package Entry (REACT)
3
+ * Modular v3 subpaths:
4
+ * - @ttdk-design-system/library-react/web
5
+ * - @ttdk-design-system/library-react/webview
6
+ * - @ttdk-design-system/library-react/core
7
+ */
8
+
9
+ export * from './core';
10
+ export * from './web';
11
+ export * as web from './web';
12
+ export * as webview from './webview';
13
+ export * as core from './core';
14
+
15
+ // Backward-compatibility direct exports
16
+ export * from './types';
17
+ export { default as tailwindPreset, ttdkTailwindPreset } from './core/tailwind-preset';
@@ -0,0 +1,62 @@
1
+ /**
2
+ * TTDK Design System — Official Tailwind CSS Preset (CommonJS)
3
+ */
4
+ module.exports = {
5
+ theme: {
6
+ extend: {
7
+ spacing: {
8
+ "0": "var(--ttdk-spacing-0, 0px)",
9
+ "2": "var(--ttdk-spacing-2, 2px)",
10
+ "4": "var(--ttdk-spacing-4, 4px)",
11
+ "6": "var(--ttdk-spacing-6, 6px)",
12
+ "8": "var(--ttdk-spacing-8, 8px)",
13
+ "12": "var(--ttdk-spacing-12, 12px)",
14
+ "16": "var(--ttdk-spacing-16, 16px)",
15
+ "20": "var(--ttdk-spacing-20, 20px)",
16
+ "24": "var(--ttdk-spacing-24, 24px)",
17
+ "32": "var(--ttdk-spacing-32, 32px)",
18
+ "48": "var(--ttdk-spacing-48, 48px)",
19
+ "64": "var(--ttdk-spacing-64, 64px)",
20
+ "96": "var(--ttdk-spacing-96, 96px)",
21
+ },
22
+ boxShadow: {
23
+ "ttdk-sm": "var(--ttdk-shadow-sm, 0px 1px 10px 0px rgba(0, 0, 0, 0.08))",
24
+ "ttdk-md": "var(--ttdk-shadow-md, 0px 1px 15px 0px rgba(0, 0, 0, 0.1))",
25
+ "ttdk-lg": "var(--ttdk-shadow-lg, 0px 4px 12px 0px rgba(48, 49, 53, 0.2))",
26
+ "ttdk-top": "var(--ttdk-shadow-top, 0px 4px 12px 0px rgba(48, 49, 53, 0.2))",
27
+ "ttdk-bottom": "var(--ttdk-shadow-bottom, 0px 4px 16px 0px rgba(0, 0, 0, 0.08))",
28
+ "ttdk-right": "var(--ttdk-shadow-right, 4px 0px 16px 0px rgba(0, 0, 0, 0.08))",
29
+ "ttdk-left": "var(--ttdk-shadow-left, -4px 0px 16px 0px rgba(0, 0, 0, 0.08))",
30
+ },
31
+ maxWidth: {
32
+ "ttdk-mobile": "var(--ttdk-grid-mobile-container, 328px)",
33
+ "ttdk-desktop": "var(--ttdk-grid-desktop-container, 1128px)",
34
+ },
35
+ colors: {
36
+ ttdk: {
37
+ primary: {
38
+ DEFAULT: "var(--ttdk-brand-default, #16b3ac)",
39
+ hover: "var(--ttdk-brand-strong, #128f8a)",
40
+ subtle: "var(--ttdk-brand-subtle, #b8edea)",
41
+ },
42
+ accent: {
43
+ DEFAULT: "var(--ttdk-color-brand-blue-500, #3899fe)",
44
+ hover: "var(--ttdk-color-brand-blue-600, #1e81e8)",
45
+ },
46
+ surface: {
47
+ DEFAULT: "var(--ttdk-bg-base-primary, #ffffff)",
48
+ subtle: "var(--ttdk-bg-secondary-disabled, #f1f2f3)",
49
+ dark: "var(--ttdk-color-neutral-black, #141313)",
50
+ },
51
+ border: {
52
+ DEFAULT: "var(--ttdk-stroke-subtle, #e4e5e7)",
53
+ dark: "var(--ttdk-stroke-subtle, #313336)",
54
+ },
55
+ },
56
+ },
57
+ fontFamily: {
58
+ sans: ["Manrope", "ui-sans-serif", "system-ui", "-apple-system", "sans-serif"],
59
+ },
60
+ },
61
+ },
62
+ };
@@ -0,0 +1,85 @@
1
+ /**
2
+ * TTDK Design System — Official Tailwind CSS Preset
3
+ *
4
+ * Maps all design tokens (colors, spacing scale, shadows, breakpoints)
5
+ * to standard Tailwind CSS theme configuration.
6
+ *
7
+ * Usage in tailwind.config.js / tailwind.config.ts:
8
+ * ```js
9
+ * module.exports = {
10
+ * presets: [require('@ttdk-design-system/library-vue/tailwind-preset')],
11
+ * content: ['./src/**\/*.{vue,js,ts,jsx,tsx}']
12
+ * }
13
+ * ```
14
+ */
15
+
16
+ export const ttdkTailwindPreset = {
17
+ theme: {
18
+ extend: {
19
+ // 1. Spacing Scale TTDK (0, 2, 4, 6, 8, 12, 16, 20, 24, 32, 48, 64, 96)
20
+ spacing: {
21
+ "0": "var(--ttdk-spacing-0, 0px)",
22
+ "2": "var(--ttdk-spacing-2, 2px)",
23
+ "4": "var(--ttdk-spacing-4, 4px)",
24
+ "6": "var(--ttdk-spacing-6, 6px)",
25
+ "8": "var(--ttdk-spacing-8, 8px)",
26
+ "12": "var(--ttdk-spacing-12, 12px)",
27
+ "16": "var(--ttdk-spacing-16, 16px)",
28
+ "20": "var(--ttdk-spacing-20, 20px)",
29
+ "24": "var(--ttdk-spacing-24, 24px)",
30
+ "32": "var(--ttdk-spacing-32, 32px)",
31
+ "48": "var(--ttdk-spacing-48, 48px)",
32
+ "64": "var(--ttdk-spacing-64, 64px)",
33
+ "96": "var(--ttdk-spacing-96, 96px)",
34
+ },
35
+
36
+ // 2. Shadows & Elevation TTDK
37
+ boxShadow: {
38
+ "ttdk-sm": "var(--ttdk-shadow-sm, 0px 1px 10px 0px rgba(0, 0, 0, 0.08))",
39
+ "ttdk-md": "var(--ttdk-shadow-md, 0px 1px 15px 0px rgba(0, 0, 0, 0.1))",
40
+ "ttdk-lg": "var(--ttdk-shadow-lg, 0px 4px 12px 0px rgba(48, 49, 53, 0.2))",
41
+ "ttdk-top": "var(--ttdk-shadow-top, 0px 4px 12px 0px rgba(48, 49, 53, 0.2))",
42
+ "ttdk-bottom": "var(--ttdk-shadow-bottom, 0px 4px 16px 0px rgba(0, 0, 0, 0.08))",
43
+ "ttdk-right": "var(--ttdk-shadow-right, 4px 0px 16px 0px rgba(0, 0, 0, 0.08))",
44
+ "ttdk-left": "var(--ttdk-shadow-left, -4px 0px 16px 0px rgba(0, 0, 0, 0.08))",
45
+ },
46
+
47
+ // 3. Responsive Container Widths
48
+ maxWidth: {
49
+ "ttdk-mobile": "var(--ttdk-grid-mobile-container, 328px)",
50
+ "ttdk-desktop": "var(--ttdk-grid-desktop-container, 1128px)",
51
+ },
52
+
53
+ // 4. Semantic & Brand Colors
54
+ colors: {
55
+ ttdk: {
56
+ primary: {
57
+ DEFAULT: "var(--ttdk-brand-default, #16b3ac)",
58
+ hover: "var(--ttdk-brand-strong, #128f8a)",
59
+ subtle: "var(--ttdk-brand-subtle, #b8edea)",
60
+ },
61
+ accent: {
62
+ DEFAULT: "var(--ttdk-color-brand-blue-500, #3899fe)",
63
+ hover: "var(--ttdk-color-brand-blue-600, #1e81e8)",
64
+ },
65
+ surface: {
66
+ DEFAULT: "var(--ttdk-bg-base-primary, #ffffff)",
67
+ subtle: "var(--ttdk-bg-secondary-disabled, #f1f2f3)",
68
+ dark: "var(--ttdk-color-neutral-black, #141313)",
69
+ },
70
+ border: {
71
+ DEFAULT: "var(--ttdk-stroke-subtle, #e4e5e7)",
72
+ dark: "var(--ttdk-stroke-subtle, #313336)",
73
+ },
74
+ },
75
+ },
76
+
77
+ // 5. Typography
78
+ fontFamily: {
79
+ sans: ["Manrope", "ui-sans-serif", "system-ui", "-apple-system", "sans-serif"],
80
+ },
81
+ },
82
+ },
83
+ };
84
+
85
+ export default ttdkTailwindPreset;
package/src/types.ts ADDED
@@ -0,0 +1 @@
1
+ export * from "./core/types";
@@ -0,0 +1,149 @@
1
+ # <Accordion /> — TTDK Component Reference
2
+
3
+ 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.
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/accordion/accordion.css";`
8
+
9
+ ## 2. Subpath Component Import
10
+ ```ts
11
+ // React
12
+ import Accordion from "@ttdk-design-system/library-react/web/accordion";
13
+
14
+ // Vue 3
15
+ import Accordion from "@ttdk-design-system/library-vue/web/accordion";
16
+
17
+ // Svelte
18
+ import Accordion from "@ttdk-design-system/library-svelte/web/accordion";
19
+ ```
20
+
21
+ ## 3. Props & API Reference
22
+
23
+ | Prop | Type | Default | Description |
24
+ | :--- | :--- | :--- | :--- |
25
+ | `items` | `AccordionItem[]` | `-` | Daftar item accordion yang akan dirender. |
26
+ | `value?` | `string | string[]` | `-` | Nilai item yang sedang terbuka (controlled value). Bisa berupa string tunggal atau array string jika multiple={true}. |
27
+ | `defaultValue?` | `string | string[]` | `-` | Nilai default item yang terbuka saat pertama kali dirender (uncontrolled initial value). |
28
+ | `multiple?` | `boolean` | `false` | Mengizinkan lebih dari satu item terbuka secara bersamaan. |
29
+ | `collapsible?` | `boolean` | `true` | Mengizinkan item yang terbuka untuk ditutup kembali saat diklik. |
30
+ | `variant?` | `'default' | 'bordered' | 'separated' | 'ghost'` | `default` | 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. |
31
+ | `size?` | `'sm' | 'md' | 'lg'` | `md` | 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). |
32
+ | `iconPosition?` | `'left' | 'right'` | `right` | Posisi indikator ikon panah / chevron: - `'right'`: Di ujung kanan (standar desain). - `'left'`: Di sebelah kiri sebelum judul. |
33
+ | `rounded?` | `'none' | 'sm' | 'md' | 'lg' | 'full'` | `md` | Sudut kelengkungan radius (khusus untuk varian 'bordered' dan 'separated'): - `'none'`: Sudut 0px. - `'sm'`: Sudut 6px. - `'md'`: Sudut 10px. - `'lg'`: Sudut 14px. - `'full'`: Sudut 20px. |
34
+ | `disabled?` | `boolean` | `false` | Menonaktifkan seluruh interaksi accordion. |
35
+ | `ui?` | `UiProps` | `-` | Kustomisasi visual granular root container (UiProps). |
36
+ | `style?` | `any` | `-` | Inline CSS style object native. |
37
+ | `className?` | `string` | `-` | Class CSS kustom untuk root accordion. |
38
+ | `itemStyle?` | `UiProps` | `-` | Style kustom untuk tiap elemen item accordion (UiProps). |
39
+ | `itemClass?` | `string` | `-` | Class CSS kustom untuk tiap elemen item accordion. |
40
+ | `triggerStyle?` | `UiProps` | `-` | Style kustom untuk tombol trigger accordion (UiProps). |
41
+ | `triggerClass?` | `string` | `-` | Class CSS kustom untuk tombol trigger accordion. |
42
+ | `titleStyle?` | `UiProps` | `-` | Style kustom untuk teks judul trigger accordion (UiProps). |
43
+ | `titleClass?` | `string` | `-` | Class CSS kustom untuk teks judul trigger accordion. |
44
+ | `subtitleStyle?` | `UiProps` | `-` | Style kustom untuk teks subtitle trigger accordion (UiProps). |
45
+ | `subtitleClass?` | `string` | `-` | Class CSS kustom untuk teks subtitle trigger accordion. |
46
+ | `iconStyle?` | `UiProps` | `-` | Style kustom untuk indikator ikon panah / chevron (UiProps). |
47
+ | `iconClass?` | `string` | `-` | Class CSS kustom untuk indikator ikon panah / chevron. |
48
+ | `icon?` | `any` | `-` | Ikon kustom untuk menggantikan ikon panah bawaan accordion secara global. |
49
+ | `contentStyle?` | `UiProps` | `-` | Style kustom untuk panel konten accordion (UiProps). Mengatur seluruh tampilan panel isi (background, padding, border, serta warna & tipografi teks isi). |
50
+ | `contentClass?` | `string` | `-` | Class CSS kustom untuk panel konten accordion. |
51
+ | `onChange?` | `(value: any) => void` | `-` | Callback event saat status item yang terbuka berubah. Mengembalikan string atau array string sesuai mode `multiple`. |
52
+ | `children?` | `any` | `-` | Konten anak atau slot kustom. |
53
+
54
+ ### Sub-interface: `AccordionItem`
55
+
56
+ | Field | Type | Default | Description |
57
+ | :--- | :--- | :--- | :--- |
58
+ | `value` | `string` | `-` | Nilai identifikasi unik untuk item accordion. |
59
+ | `title` | `string` | `-` | Judul teks yang ditampilkan pada header trigger accordion. |
60
+ | `subtitle?` | `string` | `-` | Subtitle atau deskripsi singkat sekunder di bawah judul. |
61
+ | `content?` | `any` | `-` | Konten isi panel yang terbuka saat accordion di-expand. |
62
+ | `icon?` | `any` | `-` | Ikon atau elemen visual opsional di samping judul. |
63
+ | `badge?` | `string | number` | `-` | Badge teks atau counter angka opsional (misal: '12', 'Baru', 'Wajib'). |
64
+ | `customIcon?` | `any` | `-` | Ikon kustom untuk menggantikan ikon panah bawaan khusus item ini. |
65
+ | `disabled?` | `boolean` | `false` | Menonaktifkan item ini dari interaksi buka/tutup. |
66
+
67
+ ## 4. Usage Examples
68
+
69
+ ### React Example
70
+ ```tsx
71
+ import Accordion from "@ttdk-design-system/library-react/web/accordion";
72
+ import "@ttdk-design-system/library-react/web/accordion/accordion.css";
73
+
74
+ export function Example() {
75
+ const items = [
76
+ {
77
+ value: "fhir",
78
+ title: "Standarisasi FHIR R4",
79
+ subtitle: "Pedoman interoperabilitas data klinis",
80
+ content: "Format data rekam medis terintegrasi mengikuti spesifikasi HL7 FHIR R4 Kementerian Kesehatan.",
81
+ badge: "Wajib"
82
+ },
83
+ {
84
+ value: "oauth",
85
+ title: "Autentikasi OAuth2 SATUSEHAT",
86
+ subtitle: "Kunci API dan token akses faskes",
87
+ content: "Setiap permintaan API wajib menyertakan Bearer token dari portal pengembang SATUSEHAT."
88
+ }
89
+ ];
90
+
91
+ return (
92
+ <Accordion items={items} defaultValue="fhir" variant="bordered" />
93
+ );
94
+ }
95
+ ```
96
+
97
+ ### Vue 3 Example
98
+ ```vue
99
+ <script setup lang="ts">
100
+ import Accordion from "@ttdk-design-system/library-vue/web/accordion";
101
+ import "@ttdk-design-system/library-vue/web/accordion/accordion.css";
102
+
103
+ const items = [
104
+ {
105
+ value: "fhir",
106
+ title: "Standarisasi FHIR R4",
107
+ subtitle: "Pedoman interoperabilitas data klinis",
108
+ content: "Format data rekam medis terintegrasi mengikuti spesifikasi HL7 FHIR R4 Kementerian Kesehatan.",
109
+ badge: "Wajib"
110
+ },
111
+ {
112
+ value: "oauth",
113
+ title: "Autentikasi OAuth2 SATUSEHAT",
114
+ subtitle: "Kunci API dan token akses faskes",
115
+ content: "Setiap permintaan API wajib menyertakan Bearer token dari portal pengembang SATUSEHAT."
116
+ }
117
+ ];
118
+ </script>
119
+
120
+ <template>
121
+ <Accordion :items="items" default-value="fhir" variant="bordered" />
122
+ </template>
123
+ ```
124
+
125
+ ### Svelte Example
126
+ ```svelte
127
+ <script lang="ts">
128
+ import Accordion from "@ttdk-design-system/library-svelte/web/accordion";
129
+ import "@ttdk-design-system/library-svelte/web/accordion/accordion.css";
130
+
131
+ const items = [
132
+ {
133
+ value: "fhir",
134
+ title: "Standarisasi FHIR R4",
135
+ subtitle: "Pedoman interoperabilitas data klinis",
136
+ content: "Format data rekam medis terintegrasi mengikuti spesifikasi HL7 FHIR R4 Kementerian Kesehatan.",
137
+ badge: "Wajib"
138
+ },
139
+ {
140
+ value: "oauth",
141
+ title: "Autentikasi OAuth2 SATUSEHAT",
142
+ subtitle: "Kunci API dan token akses faskes",
143
+ content: "Setiap permintaan API wajib menyertakan Bearer token dari portal pengembang SATUSEHAT."
144
+ }
145
+ ];
146
+ </script>
147
+
148
+ <Accordion {items} defaultValue="fhir" variant="bordered" />
149
+ ```
@@ -0,0 +1 @@
1
+ .ttdk-accordion{box-sizing:border-box;width:100%;color:var(--ttdk-ui-color,var(--ttdk-text-icon-primary,#232323));flex-direction:column;font-family:inherit;display:flex}.ttdk-accordion *,.ttdk-accordion :before,.ttdk-accordion :after{box-sizing:border-box}.ttdk-accordion[data-disabled=true]{pointer-events:none;opacity:.55}.ttdk-accordion-item{width:100%;transition:border-color .2s,background-color .2s,box-shadow .2s}.ttdk-accordion-item[data-disabled=true]{pointer-events:none;opacity:.5}.ttdk-accordion-header{font-size:inherit;font-weight:inherit;line-height:inherit;width:100%;margin:0;padding:0;display:flex}.ttdk-accordion-trigger{all:unset;cursor:pointer;box-sizing:border-box;user-select:none;width:100%;color:var(--ttdk-ui-color,var(--ttdk-text-icon-primary,#141313));text-align:left;border-radius:inherit;justify-content:space-between;align-items:center;font-family:inherit;font-weight:600;transition:background-color .15s,color .15s;display:flex}.ttdk-accordion-trigger:disabled,.ttdk-accordion-trigger[data-disabled=true]{cursor:not-allowed}.ttdk-accordion-trigger:focus-visible{outline:2px solid var(--ttdk-stroke-border-focus,#128f8a);outline-offset:-2px}.ttdk-accordion-label-group{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.ttdk-accordion-title{color:inherit;font-weight:600;font-size:inherit;line-height:inherit;transition:color .15s}.ttdk-accordion-trigger:hover{color:var(--ttdk-brand-default,#128f8a)}.ttdk-accordion-subtitle{color:var(--ttdk-ui-color,var(--ttdk-text-icon-secondary,#7b828a));font-size:.8125rem;font-weight:400;line-height:1.4}.ttdk-accordion-leading-icon{margin-right:var(--ttdk-spacing-12,12px);color:var(--ttdk-brand-default,#128f8a);flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.ttdk-accordion-badge{border-radius:var(--ttdk-radius-full,9999px);background-color:var(--ttdk-brand-subtle,#e1fbfa);color:var(--ttdk-color-brand-green-700,#0d6b67);white-space:nowrap;margin-left:auto;margin-right:var(--ttdk-spacing-12,12px);flex-shrink:0;justify-content:center;align-items:center;padding:2px 8px;font-size:.75rem;font-weight:500;line-height:1;display:inline-flex}.ttdk-accordion-arrow{color:var(--ttdk-color-neutral-400,#969ba2);flex-shrink:0;justify-content:center;align-items:center;transition:transform .25s cubic-bezier(.4,0,.2,1),color .2s;display:inline-flex}.ttdk-accordion-arrow-icon,.ttdk-accordion-icon{stroke-width:2px;stroke-linecap:round;stroke-linejoin:round;width:100%;height:100%;display:block}.ttdk-accordion-arrow[data-state=open]{color:var(--ttdk-brand-default,#128f8a);transform:rotate(180deg)}.ttdk-accordion[data-icon-position=left] .ttdk-accordion-trigger{justify-content:flex-start}.ttdk-accordion-arrow-left{margin-right:var(--ttdk-spacing-12,12px)}.ttdk-accordion[data-icon-position=left] .ttdk-accordion-badge{margin-right:0}.ttdk-accordion-panel{grid-template-rows:0fr;transition:grid-template-rows .24s cubic-bezier(.4,0,.2,1);display:grid;overflow:hidden}.ttdk-accordion-panel[data-state=open]{visibility:visible;grid-template-rows:1fr}.ttdk-accordion-panel[data-state=closed]{visibility:hidden;grid-template-rows:0fr}.ttdk-accordion-panel[data-state=closed]>.ttdk-accordion-content{visibility:hidden;padding-top:0!important;padding-bottom:0!important}.ttdk-accordion-content{min-height:0;color:var(--ttdk-ui-color,var(--ttdk-text-icon-secondary,#62686f));line-height:1.6;transition:padding .24s cubic-bezier(.4,0,.2,1);overflow:hidden}.ttdk-accordion[data-variant=default] .ttdk-accordion-item{border-bottom:1px solid var(--ttdk-stroke-divider,#cacccf)}.ttdk-accordion[data-variant=default] .ttdk-accordion-item:last-child{border-bottom:none}.ttdk-accordion[data-variant=bordered]{border:1px solid var(--ttdk-stroke-subtle,#e4e5e7);background-color:var(--ttdk-bg-card,#fff);overflow:hidden}.ttdk-accordion[data-variant=bordered] .ttdk-accordion-item{border-bottom:1px solid var(--ttdk-stroke-subtle,#e4e5e7)}.ttdk-accordion[data-variant=bordered] .ttdk-accordion-item:last-child{border-bottom:none}.ttdk-accordion[data-variant=bordered] .ttdk-accordion-trigger:hover{background-color:var(--ttdk-bg-secondary-disabled,#f1f2f3)}.ttdk-accordion[data-variant=bordered] .ttdk-accordion-item[data-state=open]>.ttdk-accordion-header>.ttdk-accordion-trigger{background-color:var(--ttdk-bg-status-info-subtle,#ebf3ff)}.ttdk-accordion[data-variant=separated]{gap:var(--ttdk-spacing-8,8px)}.ttdk-accordion[data-variant=separated] .ttdk-accordion-item{border:1px solid var(--ttdk-stroke-subtle,#e4e5e7);background-color:var(--ttdk-bg-card,#fff);overflow:hidden;box-shadow:0 1px 3px #1413130a}.ttdk-accordion[data-variant=separated] .ttdk-accordion-item:hover{border-color:var(--ttdk-color-neutral-300,#b1b5b9)}.ttdk-accordion[data-variant=separated] .ttdk-accordion-item[data-state=open]{border-color:var(--ttdk-stroke-border-focus,#128f8a);box-shadow:0 4px 12px #128f8a14}.ttdk-accordion[data-variant=separated] .ttdk-accordion-trigger:hover{background-color:var(--ttdk-bg-secondary-disabled,#f1f2f3)}.ttdk-accordion[data-variant=separated] .ttdk-accordion-item[data-state=open]>.ttdk-accordion-header>.ttdk-accordion-trigger{background-color:var(--ttdk-brand-subtle,#e1fbfa)}.ttdk-accordion[data-variant=ghost] .ttdk-accordion-item{border:none}.ttdk-accordion[data-variant=ghost] .ttdk-accordion-trigger{border-radius:var(--ttdk-radius-sm,8px)}.ttdk-accordion[data-variant=ghost] .ttdk-accordion-trigger:hover{background-color:var(--ttdk-bg-secondary-disabled,#f1f2f3)}.ttdk-accordion[data-variant=ghost] .ttdk-accordion-item[data-state=open]>.ttdk-accordion-header>.ttdk-accordion-trigger{background-color:var(--ttdk-brand-subtle,#e1fbfa)}.ttdk-accordion[data-size=sm] .ttdk-accordion-trigger{padding:8px 12px;font-size:.8125rem}.ttdk-accordion[data-size=sm] .ttdk-accordion-arrow{width:14px;height:14px}.ttdk-accordion[data-size=sm] .ttdk-accordion-leading-icon{width:16px;height:16px}.ttdk-accordion[data-size=sm] .ttdk-accordion-content{padding:8px 12px 12px;font-size:.8125rem}.ttdk-accordion[data-size=md] .ttdk-accordion-trigger{padding:14px 16px;font-size:.875rem}.ttdk-accordion[data-size=md] .ttdk-accordion-arrow,.ttdk-accordion[data-size=md] .ttdk-accordion-leading-icon{width:18px;height:18px}.ttdk-accordion[data-size=md] .ttdk-accordion-content{padding:12px 16px 16px;font-size:.875rem}.ttdk-accordion[data-size=lg] .ttdk-accordion-trigger{padding:18px 20px;font-size:1rem}.ttdk-accordion[data-size=lg] .ttdk-accordion-arrow{width:20px;height:20px}.ttdk-accordion[data-size=lg] .ttdk-accordion-leading-icon{width:22px;height:22px}.ttdk-accordion[data-size=lg] .ttdk-accordion-content{padding:16px 20px 20px;font-size:.9375rem}.ttdk-accordion[data-variant=default],.ttdk-accordion[data-variant=default] .ttdk-accordion-item,.ttdk-accordion[data-variant=bordered] .ttdk-accordion-item{border-radius:0}.ttdk-accordion[data-variant=bordered][data-rounded=none],.ttdk-accordion[data-variant=separated][data-rounded=none] .ttdk-accordion-item{border-radius:var(--ttdk-radius-none,0px)}.ttdk-accordion[data-variant=bordered][data-rounded=sm],.ttdk-accordion[data-variant=separated][data-rounded=sm] .ttdk-accordion-item{border-radius:var(--ttdk-radius-xs,6px)}.ttdk-accordion[data-variant=bordered][data-rounded=md],.ttdk-accordion[data-variant=separated][data-rounded=md] .ttdk-accordion-item{border-radius:var(--ttdk-radius-sm,8px)}.ttdk-accordion[data-variant=bordered][data-rounded=lg],.ttdk-accordion[data-variant=separated][data-rounded=lg] .ttdk-accordion-item{border-radius:var(--ttdk-radius-md,12px)}.ttdk-accordion[data-variant=bordered][data-rounded=full],.ttdk-accordion[data-variant=separated][data-rounded=full] .ttdk-accordion-item{border-radius:var(--ttdk-radius-xl,20px)}.dark .ttdk-accordion,:root.dark .ttdk-accordion,[data-theme=dark] .ttdk-accordion{color:var(--ttdk-text-icon-primary,#cacccf)}.dark .ttdk-accordion-trigger,:root.dark .ttdk-accordion-trigger,[data-theme=dark] .ttdk-accordion-trigger{color:var(--ttdk-text-icon-primary,#fff)}.dark .ttdk-accordion-trigger:hover,:root.dark .ttdk-accordion-trigger:hover,[data-theme=dark] .ttdk-accordion-trigger:hover{color:var(--ttdk-color-brand-green-300,#48d5ce)}.dark .ttdk-accordion .ttdk-accordion-subtitle,:root.dark .ttdk-accordion .ttdk-accordion-subtitle,[data-theme=dark] .ttdk-accordion .ttdk-accordion-subtitle{color:var(--ttdk-text-icon-secondary,#969ba2)}.dark .ttdk-accordion .ttdk-accordion-content,:root.dark .ttdk-accordion .ttdk-accordion-content,[data-theme=dark] .ttdk-accordion .ttdk-accordion-content{color:var(--ttdk-text-icon-secondary,#cacccf)}.dark .ttdk-accordion .ttdk-accordion-arrow,:root.dark .ttdk-accordion .ttdk-accordion-arrow,[data-theme=dark] .ttdk-accordion .ttdk-accordion-arrow{color:var(--ttdk-color-neutral-400,#969ba2)}.dark .ttdk-accordion .ttdk-accordion-arrow[data-state=open],:root.dark .ttdk-accordion .ttdk-accordion-arrow[data-state=open],[data-theme=dark] .ttdk-accordion .ttdk-accordion-arrow[data-state=open]{color:var(--ttdk-color-brand-green-300,#48d5ce)}.dark .ttdk-accordion .ttdk-accordion-badge,:root.dark .ttdk-accordion .ttdk-accordion-badge,[data-theme=dark] .ttdk-accordion .ttdk-accordion-badge{color:var(--ttdk-color-brand-green-200,#80dcd8);background-color:#128f8a33}.dark .ttdk-accordion[data-variant=default] .ttdk-accordion-item,:root.dark .ttdk-accordion[data-variant=default] .ttdk-accordion-item,[data-theme=dark] .ttdk-accordion[data-variant=default] .ttdk-accordion-item{border-bottom-color:var(--ttdk-stroke-divider,#4a4f53)}.dark .ttdk-accordion[data-variant=bordered],:root.dark .ttdk-accordion[data-variant=bordered],[data-theme=dark] .ttdk-accordion[data-variant=bordered]{border-color:var(--ttdk-stroke-subtle,#313336);background-color:var(--ttdk-bg-card,#232323)}.dark .ttdk-accordion[data-variant=bordered] .ttdk-accordion-item,:root.dark .ttdk-accordion[data-variant=bordered] .ttdk-accordion-item,[data-theme=dark] .ttdk-accordion[data-variant=bordered] .ttdk-accordion-item{border-bottom-color:var(--ttdk-stroke-divider,#313336)}.dark .ttdk-accordion[data-variant=bordered] .ttdk-accordion-trigger:hover,:root.dark .ttdk-accordion[data-variant=bordered] .ttdk-accordion-trigger:hover,[data-theme=dark] .ttdk-accordion[data-variant=bordered] .ttdk-accordion-trigger:hover{background-color:#ffffff0a}.dark .ttdk-accordion[data-variant=bordered] .ttdk-accordion-item[data-state=open]>.ttdk-accordion-header>.ttdk-accordion-trigger,:root.dark .ttdk-accordion[data-variant=bordered] .ttdk-accordion-item[data-state=open]>.ttdk-accordion-header>.ttdk-accordion-trigger,[data-theme=dark] .ttdk-accordion[data-variant=bordered] .ttdk-accordion-item[data-state=open]>.ttdk-accordion-header>.ttdk-accordion-trigger{background-color:#128f8a1f}.dark .ttdk-accordion[data-variant=separated] .ttdk-accordion-item,:root.dark .ttdk-accordion[data-variant=separated] .ttdk-accordion-item,[data-theme=dark] .ttdk-accordion[data-variant=separated] .ttdk-accordion-item{border-color:var(--ttdk-stroke-subtle,#313336);background-color:var(--ttdk-bg-card,#232323);box-shadow:0 1px 3px #0000004d}.dark .ttdk-accordion[data-variant=separated] .ttdk-accordion-item:hover,:root.dark .ttdk-accordion[data-variant=separated] .ttdk-accordion-item:hover,[data-theme=dark] .ttdk-accordion[data-variant=separated] .ttdk-accordion-item:hover{border-color:var(--ttdk-color-neutral-600,#62686f)}.dark .ttdk-accordion[data-variant=separated] .ttdk-accordion-item[data-state=open],:root.dark .ttdk-accordion[data-variant=separated] .ttdk-accordion-item[data-state=open],[data-theme=dark] .ttdk-accordion[data-variant=separated] .ttdk-accordion-item[data-state=open]{border-color:var(--ttdk-brand-default,#16b3ac);box-shadow:0 4px 16px #128f8a29}.dark .ttdk-accordion[data-variant=separated] .ttdk-accordion-trigger:hover,:root.dark .ttdk-accordion[data-variant=separated] .ttdk-accordion-trigger:hover,[data-theme=dark] .ttdk-accordion[data-variant=separated] .ttdk-accordion-trigger:hover{background-color:#ffffff0a}.dark .ttdk-accordion[data-variant=separated] .ttdk-accordion-item[data-state=open]>.ttdk-accordion-header>.ttdk-accordion-trigger,:root.dark .ttdk-accordion[data-variant=separated] .ttdk-accordion-item[data-state=open]>.ttdk-accordion-header>.ttdk-accordion-trigger,[data-theme=dark] .ttdk-accordion[data-variant=separated] .ttdk-accordion-item[data-state=open]>.ttdk-accordion-header>.ttdk-accordion-trigger{background-color:#128f8a1f}.dark .ttdk-accordion[data-variant=ghost] .ttdk-accordion-trigger:hover,:root.dark .ttdk-accordion[data-variant=ghost] .ttdk-accordion-trigger:hover,[data-theme=dark] .ttdk-accordion[data-variant=ghost] .ttdk-accordion-trigger:hover{background-color:#ffffff0d}