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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/AI_GUIDE.md +6518 -0
  2. package/llms.txt +6518 -0
  3. package/package.json +1096 -4
  4. package/src/core/index.ts +2 -0
  5. package/src/core/tailwind-preset.cjs +62 -0
  6. package/src/core/tailwind-preset.ts +85 -0
  7. package/src/core/theme/tokens.css +663 -0
  8. package/src/core/types.ts +836 -0
  9. package/src/index.ts +17 -0
  10. package/src/tailwind-preset.cjs +62 -0
  11. package/src/tailwind-preset.ts +85 -0
  12. package/src/types.ts +1 -0
  13. package/src/web/accordion/AI_GUIDE.md +149 -0
  14. package/src/web/accordion/accordion.css +1 -0
  15. package/src/web/accordion/accordion.vue +432 -0
  16. package/src/web/accordion/accordion.vue.d.ts +227 -0
  17. package/src/web/accordion/index.ts +3 -0
  18. package/src/web/accordion/manifest.json +351 -0
  19. package/src/web/alert/AI_GUIDE.md +139 -0
  20. package/src/web/alert/alert.css +1 -0
  21. package/src/web/alert/alert.vue +290 -0
  22. package/src/web/alert/alert.vue.d.ts +154 -0
  23. package/src/web/alert/index.ts +3 -0
  24. package/src/web/alert/manifest.json +240 -0
  25. package/src/web/avatar/AI_GUIDE.md +118 -0
  26. package/src/web/avatar/avatar.css +1 -0
  27. package/src/web/avatar/avatar.vue +217 -0
  28. package/src/web/avatar/avatar.vue.d.ts +135 -0
  29. package/src/web/avatar/index.ts +3 -0
  30. package/src/web/avatar/manifest.json +195 -0
  31. package/src/web/badge/AI_GUIDE.md +94 -0
  32. package/src/web/badge/badge.css +1 -0
  33. package/src/web/badge/badge.vue +135 -0
  34. package/src/web/badge/badge.vue.d.ts +108 -0
  35. package/src/web/badge/index.ts +3 -0
  36. package/src/web/badge/manifest.json +141 -0
  37. package/src/web/banner/AI_GUIDE.md +130 -0
  38. package/src/web/banner/banner.css +1 -0
  39. package/src/web/banner/banner.vue +303 -0
  40. package/src/web/banner/banner.vue.d.ts +162 -0
  41. package/src/web/banner/index.ts +3 -0
  42. package/src/web/banner/manifest.json +240 -0
  43. package/src/web/breadcrumb/AI_GUIDE.md +120 -0
  44. package/src/web/breadcrumb/breadcrumb.css +1 -0
  45. package/src/web/breadcrumb/breadcrumb.vue +313 -0
  46. package/src/web/breadcrumb/breadcrumb.vue.d.ts +139 -0
  47. package/src/web/breadcrumb/index.ts +3 -0
  48. package/src/web/breadcrumb/manifest.json +225 -0
  49. package/src/web/button/AI_GUIDE.md +121 -0
  50. package/src/web/button/button.css +1 -0
  51. package/src/web/button/button.vue +283 -0
  52. package/src/web/button/button.vue.d.ts +147 -0
  53. package/src/web/button/index.ts +3 -0
  54. package/src/web/button/manifest.json +177 -0
  55. package/src/web/calendar/AI_GUIDE.md +151 -0
  56. package/src/web/calendar/calendar.css +1 -0
  57. package/src/web/calendar/calendar.vue +1536 -0
  58. package/src/web/calendar/calendar.vue.d.ts +261 -0
  59. package/src/web/calendar/index.ts +3 -0
  60. package/src/web/calendar/manifest.json +470 -0
  61. package/src/web/card/AI_GUIDE.md +133 -0
  62. package/src/web/card/card.css +1 -0
  63. package/src/web/card/card.vue +423 -0
  64. package/src/web/card/card.vue.d.ts +232 -0
  65. package/src/web/card/index.ts +3 -0
  66. package/src/web/card/manifest.json +357 -0
  67. package/src/web/checkbox/AI_GUIDE.md +146 -0
  68. package/src/web/checkbox/checkbox.css +1 -0
  69. package/src/web/checkbox/checkbox.vue +304 -0
  70. package/src/web/checkbox/checkbox.vue.d.ts +189 -0
  71. package/src/web/checkbox/index.ts +3 -0
  72. package/src/web/checkbox/manifest.json +294 -0
  73. package/src/web/chip/AI_GUIDE.md +186 -0
  74. package/src/web/chip/chip.css +1 -0
  75. package/src/web/chip/chip.vue +220 -0
  76. package/src/web/chip/chip.vue.d.ts +140 -0
  77. package/src/web/chip/index.ts +3 -0
  78. package/src/web/chip/manifest.json +186 -0
  79. package/src/web/dropdown/AI_GUIDE.md +167 -0
  80. package/src/web/dropdown/dropdown.css +1 -0
  81. package/src/web/dropdown/dropdown.vue +1257 -0
  82. package/src/web/dropdown/dropdown.vue.d.ts +381 -0
  83. package/src/web/dropdown/index.ts +3 -0
  84. package/src/web/dropdown/manifest.json +576 -0
  85. package/src/web/flex/AI_GUIDE.md +113 -0
  86. package/src/web/flex/flex-item.vue +94 -0
  87. package/src/web/flex/flex-item.vue.d.ts +84 -0
  88. package/src/web/flex/flex.css +1 -0
  89. package/src/web/flex/flex.vue +103 -0
  90. package/src/web/flex/flex.vue.d.ts +92 -0
  91. package/src/web/flex/index.ts +5 -0
  92. package/src/web/flex/manifest.json +162 -0
  93. package/src/web/form/index.ts +7 -0
  94. package/src/web/grid/AI_GUIDE.md +112 -0
  95. package/src/web/grid/grid-item.vue +109 -0
  96. package/src/web/grid/grid-item.vue.d.ts +99 -0
  97. package/src/web/grid/grid.css +1 -0
  98. package/src/web/grid/grid.vue +94 -0
  99. package/src/web/grid/grid.vue.d.ts +84 -0
  100. package/src/web/grid/index.ts +5 -0
  101. package/src/web/grid/manifest.json +153 -0
  102. package/src/web/index.ts +86 -0
  103. package/src/web/input/AI_GUIDE.md +159 -0
  104. package/src/web/input/index.ts +3 -0
  105. package/src/web/input/input.css +1 -0
  106. package/src/web/input/input.vue +521 -0
  107. package/src/web/input/input.vue.d.ts +274 -0
  108. package/src/web/input/manifest.json +465 -0
  109. package/src/web/input-number/AI_GUIDE.md +164 -0
  110. package/src/web/input-number/index.ts +3 -0
  111. package/src/web/input-number/input-number.css +1 -0
  112. package/src/web/input-number/input-number.vue +1153 -0
  113. package/src/web/input-number/input-number.vue.d.ts +343 -0
  114. package/src/web/input-number/manifest.json +575 -0
  115. package/src/web/modal/AI_GUIDE.md +171 -0
  116. package/src/web/modal/index.ts +3 -0
  117. package/src/web/modal/manifest.json +375 -0
  118. package/src/web/modal/modal.css +1 -0
  119. package/src/web/modal/modal.vue +344 -0
  120. package/src/web/modal/modal.vue.d.ts +64 -0
  121. package/src/web/pagination/AI_GUIDE.md +148 -0
  122. package/src/web/pagination/index.ts +21 -0
  123. package/src/web/pagination/manifest.json +432 -0
  124. package/src/web/pagination/pagination-content.vue +42 -0
  125. package/src/web/pagination/pagination-content.vue.d.ts +28 -0
  126. package/src/web/pagination/pagination-ellipsis.vue +55 -0
  127. package/src/web/pagination/pagination-ellipsis.vue.d.ts +28 -0
  128. package/src/web/pagination/pagination-first.vue +161 -0
  129. package/src/web/pagination/pagination-first.vue.d.ts +67 -0
  130. package/src/web/pagination/pagination-item.vue +42 -0
  131. package/src/web/pagination/pagination-item.vue.d.ts +28 -0
  132. package/src/web/pagination/pagination-last.vue +161 -0
  133. package/src/web/pagination/pagination-last.vue.d.ts +67 -0
  134. package/src/web/pagination/pagination-link.vue +118 -0
  135. package/src/web/pagination/pagination-link.vue.d.ts +61 -0
  136. package/src/web/pagination/pagination-next.vue +160 -0
  137. package/src/web/pagination/pagination-next.vue.d.ts +68 -0
  138. package/src/web/pagination/pagination-previous.vue +160 -0
  139. package/src/web/pagination/pagination-previous.vue.d.ts +68 -0
  140. package/src/web/pagination/pagination.css +1 -0
  141. package/src/web/pagination/pagination.vue +730 -0
  142. package/src/web/pagination/pagination.vue.d.ts +247 -0
  143. package/src/web/popover/AI_GUIDE.md +163 -0
  144. package/src/web/popover/index.ts +3 -0
  145. package/src/web/popover/manifest.json +396 -0
  146. package/src/web/popover/popover.css +1 -0
  147. package/src/web/popover/popover.vue +579 -0
  148. package/src/web/popover/popover.vue.d.ts +83 -0
  149. package/src/web/radio/AI_GUIDE.md +155 -0
  150. package/src/web/radio/index.ts +3 -0
  151. package/src/web/radio/manifest.json +294 -0
  152. package/src/web/radio/radio.css +1 -0
  153. package/src/web/radio/radio.vue +288 -0
  154. package/src/web/radio/radio.vue.d.ts +182 -0
  155. package/src/web/selectbox/AI_GUIDE.md +216 -0
  156. package/src/web/selectbox/index.ts +3 -0
  157. package/src/web/selectbox/manifest.json +477 -0
  158. package/src/web/selectbox/selectbox.css +1 -0
  159. package/src/web/selectbox/selectbox.vue +1024 -0
  160. package/src/web/selectbox/selectbox.vue.d.ts +300 -0
  161. package/src/web/sonner/AI_GUIDE.md +98 -0
  162. package/src/web/sonner/index.ts +114 -0
  163. package/src/web/sonner/manifest.json +132 -0
  164. package/src/web/sonner/sonner.css +1 -0
  165. package/src/web/sonner/sonner.vue +180 -0
  166. package/src/web/sonner/sonner.vue.d.ts +113 -0
  167. package/src/web/table/AI_GUIDE.md +145 -0
  168. package/src/web/table/index.ts +34 -0
  169. package/src/web/table/manifest.json +168 -0
  170. package/src/web/table/table-body.vue +42 -0
  171. package/src/web/table/table-body.vue.d.ts +28 -0
  172. package/src/web/table/table-caption.vue +42 -0
  173. package/src/web/table/table-caption.vue.d.ts +28 -0
  174. package/src/web/table/table-cell.vue +71 -0
  175. package/src/web/table/table-cell.vue.d.ts +49 -0
  176. package/src/web/table/table-empty.vue +105 -0
  177. package/src/web/table/table-empty.vue.d.ts +57 -0
  178. package/src/web/table/table-footer.vue +42 -0
  179. package/src/web/table/table-footer.vue.d.ts +28 -0
  180. package/src/web/table/table-head.vue +78 -0
  181. package/src/web/table/table-head.vue.d.ts +50 -0
  182. package/src/web/table/table-header.vue +42 -0
  183. package/src/web/table/table-header.vue.d.ts +28 -0
  184. package/src/web/table/table-row.vue +70 -0
  185. package/src/web/table/table-row.vue.d.ts +44 -0
  186. package/src/web/table/table.css +1 -0
  187. package/src/web/table/table.vue +298 -0
  188. package/src/web/table/table.vue.d.ts +119 -0
  189. package/src/web/tabs/AI_GUIDE.md +150 -0
  190. package/src/web/tabs/index.ts +2 -0
  191. package/src/web/tabs/manifest.json +315 -0
  192. package/src/web/tabs/tabs.css +1 -0
  193. package/src/web/tabs/tabs.vue +164 -0
  194. package/src/web/tabs/tabs.vue.d.ts +60 -0
  195. package/src/web/text/AI_GUIDE.md +129 -0
  196. package/src/web/text/index.ts +2 -0
  197. package/src/web/text/manifest.json +195 -0
  198. package/src/web/text/text.css +1 -0
  199. package/src/web/text/text.vue +195 -0
  200. package/src/web/text/text.vue.d.ts +161 -0
  201. package/src/web/textarea/AI_GUIDE.md +141 -0
  202. package/src/web/textarea/index.ts +3 -0
  203. package/src/web/textarea/manifest.json +438 -0
  204. package/src/web/textarea/textarea.css +1 -0
  205. package/src/web/textarea/textarea.vue +458 -0
  206. package/src/web/textarea/textarea.vue.d.ts +265 -0
  207. package/src/web/tooltip/AI_GUIDE.md +110 -0
  208. package/src/web/tooltip/index.ts +3 -0
  209. package/src/web/tooltip/manifest.json +222 -0
  210. package/src/web/tooltip/tooltip.css +1 -0
  211. package/src/web/tooltip/tooltip.vue +417 -0
  212. package/src/web/tooltip/tooltip.vue.d.ts +150 -0
  213. package/src/webview/bottomsheet/AI_GUIDE.md +141 -0
  214. package/src/webview/bottomsheet/bottomsheet.css +1 -0
  215. package/src/webview/bottomsheet/bottomsheet.vue +441 -0
  216. package/src/webview/bottomsheet/bottomsheet.vue.d.ts +178 -0
  217. package/src/webview/bottomsheet/index.ts +4 -0
  218. package/src/webview/bottomsheet/manifest.json +377 -0
  219. package/src/webview/button/AI_GUIDE.md +79 -0
  220. package/src/webview/button/button-ios.css +1 -0
  221. package/src/webview/button/button-ios.vue +138 -0
  222. package/src/webview/button/button-ios.vue.d.ts +102 -0
  223. package/src/webview/button/button-material.css +1 -0
  224. package/src/webview/button/button-material.vue +138 -0
  225. package/src/webview/button/button-material.vue.d.ts +102 -0
  226. package/src/webview/button/index.ts +7 -0
  227. package/src/webview/button/manifest.json +148 -0
  228. package/src/webview/index.ts +7 -0
  229. package/tailwind-preset.cjs +62 -0
  230. package/tailwind-preset.js +62 -0
  231. package/ttdk-manifest.json +10188 -0
  232. package/README.md +0 -3
@@ -0,0 +1,121 @@
1
+ # <Button /> — TTDK Component Reference
2
+
3
+ TTDK Button 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/button/button.css";`
8
+
9
+ ## 2. Subpath Component Import
10
+ ```ts
11
+ // React
12
+ import Button from "@ttdk-design-system/library-react/web/button";
13
+
14
+ // Vue 3
15
+ import Button from "@ttdk-design-system/library-vue/web/button";
16
+
17
+ // Svelte
18
+ import Button from "@ttdk-design-system/library-svelte/web/button";
19
+ ```
20
+
21
+ ## 3. Props & API Reference
22
+
23
+ | Prop | Type | Default | Description |
24
+ | :--- | :--- | :--- | :--- |
25
+ | `style?` | `any` | `-` | Inline CSS style kustom. |
26
+ | `variant?` | `| 'primary'
27
+ | 'info'
28
+ | 'warning'
29
+ | 'danger'
30
+ | 'neutral'
31
+ | 'disabled'` | `primary` | Varian warna semantik tombol: - `'primary'`: Teal utama. - `'info'`: Biru informasi. - `'warning'`: Kuning peringatan. - `'danger'`: Merah bahaya. - `'neutral'`: Abu-abu netral. - `'disabled'`: Tombol non-aktif. |
32
+ | `appearance?` | `'solid' | 'soft' | 'outline' | 'link' | 'ghost'` | `solid` | Gaya tampilan visual tombol: - `'solid'`: Latar belakang warna solid pekat (default). - `'soft'`: Latar belakang warna transparan lembut. - `'outline'`: Garis tepi dengan latar belakang transparan. - `'link'`: Teks tautan tanpa border/latar, dengan garis bawah saat hover. - `'ghost'`: Transparan tanpa outline/border, dengan latar lembut saat hover. |
33
+ | `type?` | `'button' | 'submit' | 'reset'` | `button` | Tipe tombol HTML native. |
34
+ | `size?` | `'sm' | 'md' | 'lg'` | `md` | Skala ukuran tombol: - `'sm'`: 36px - `'md'`: 48px (standar) - `'lg'`: 56px |
35
+ | `negative?` | `boolean` | `false` | Mode negatif — kontras tinggi di atas latar gelap. |
36
+ | `rounded?` | `'none' | 'sm' | 'md' | 'lg' | 'full'` | `md` | Radius sudut tombol. - `'none'`: 0px - `'sm'`: 4px - `'md'`: 8px (standar) - `'lg'`: 12px - `'full'`: 9999px (pill) |
37
+ | `iconOnly?` | `boolean` | `false` | Mode tombol ikon persegi (aspek rasio 1:1). |
38
+ | `block?` | `boolean` | `false` | Full-width — melebar 100% dari container. |
39
+ | `loading?` | `boolean` | `false` | Tampilkan spinner & nonaktifkan tombol saat proses async. |
40
+ | `disabled?` | `boolean` | `false` | Nonaktifkan tombol dari interaksi pengguna. |
41
+ | `iconColor?` | `string` | `-` | Warna kustom untuk ikon di dalam tombol (misal: '#fff', '#0968F6'). |
42
+ | `iconSize?` | `string` | `-` | Ukuran kustom untuk ikon di dalam tombol (misal: '16px', '20px'). |
43
+ | `ui?` | `UiProps` | `-` | Kustomisasi visual — seperti style object tapi dengan support pseudo-class. ```tsx <Button ui={{ background: '#7c3aed', color: 'white', borderRadius: '99px', hover: { background: '#6d28d9', transform: 'scale(1.02)', }, active: { opacity: '0.9', } }} /> ``` |
44
+ | `onClick?` | `(event?: any) => void` | `-` | Event handler saat tombol diklik. |
45
+ | `className?` | `string` | `-` | Class CSS kustom. |
46
+ | `children?` | `any` | `-` | Konten tombol — teks, ikon, atau JSX. |
47
+
48
+ ## 4. Usage Examples
49
+
50
+ ### React Example
51
+ ```tsx
52
+ import Button from "@ttdk-design-system/library-react/web/button";
53
+ import "@ttdk-design-system/library-react/web/button/button.css";
54
+
55
+ export function Example() {
56
+ return (
57
+ <div style={{ display: 'flex', gap: '10px', alignItems: 'center' }}>
58
+ <Button variant="primary" onClick={() => alert("Simpan data")}>
59
+ Simpan
60
+ </Button>
61
+ <Button variant="secondary">
62
+ Batal
63
+ </Button>
64
+ <Button variant="outline">
65
+ Ekspor CSV
66
+ </Button>
67
+ <Button variant="danger">
68
+ Hapus
69
+ </Button>
70
+ </div>
71
+ );
72
+ }
73
+ ```
74
+
75
+ ### Vue 3 Example
76
+ ```vue
77
+ <script setup lang="ts">
78
+ import Button from "@ttdk-design-system/library-vue/web/button";
79
+ import "@ttdk-design-system/library-vue/web/button/button.css";
80
+ </script>
81
+
82
+ <template>
83
+ <div style="display: flex; gap: 10px; align-items: center;">
84
+ <Button variant="primary" @click="() => alert('Simpan data')">
85
+ Simpan
86
+ </Button>
87
+ <Button variant="secondary">
88
+ Batal
89
+ </Button>
90
+ <Button variant="outline">
91
+ Ekspor CSV
92
+ </Button>
93
+ <Button variant="danger">
94
+ Hapus
95
+ </Button>
96
+ </div>
97
+ </template>
98
+ ```
99
+
100
+ ### Svelte Example
101
+ ```svelte
102
+ <script lang="ts">
103
+ import Button from "@ttdk-design-system/library-svelte/web/button";
104
+ import "@ttdk-design-system/library-svelte/web/button/button.css";
105
+ </script>
106
+
107
+ <div style="display: flex; gap: 10px; align-items: center;">
108
+ <Button variant="primary" on:click={() => alert('Simpan data')}>
109
+ Simpan
110
+ </Button>
111
+ <Button variant="secondary">
112
+ Batal
113
+ </Button>
114
+ <Button variant="outline">
115
+ Ekspor CSV
116
+ </Button>
117
+ <Button variant="danger">
118
+ Hapus
119
+ </Button>
120
+ </div>
121
+ ```
@@ -0,0 +1 @@
1
+ .ttdk-button{box-sizing:border-box;font-family:var(--ttdk-font-sans);font-weight:var(--ttdk-ui-font-weight,600);font-size:var(--ttdk-ui-font-size,inherit);cursor:pointer;user-select:none;white-space:nowrap;vertical-align:middle;transition:var(--ttdk-ui-transition,background-color .15s ease, border-color .15s ease, color .15s ease, box-shadow .15s ease, transform .1s ease, opacity .1s ease);border-style:solid;border-width:var(--ttdk-ui-border-width,1px);border-color:var(--ttdk-ui-border-color,transparent);border-radius:var(--ttdk-ui-border-radius,initial);outline:var(--ttdk-ui-outline,none);padding:var(--ttdk-ui-padding,initial);height:var(--ttdk-ui-height,initial);min-height:var(--ttdk-ui-min-height,initial);width:var(--ttdk-ui-width,initial);min-width:var(--ttdk-ui-min-width,initial);box-shadow:var(--ttdk-ui-box-shadow,none);opacity:var(--ttdk-ui-opacity,1);filter:var(--ttdk-ui-filter,none);transform:var(--ttdk-ui-transform,none);justify-content:center;align-items:center;gap:8px;text-decoration:none;display:inline-flex;&:hover:not(:disabled)[style*=--ttdk-ui-hover-background]{background:var(--ttdk-ui-hover-background)!important}&:hover:not(:disabled)[style*=--ttdk-ui-hover-color]{color:var(--ttdk-ui-hover-color)!important}&:hover:not(:disabled)[style*=--ttdk-ui-hover-border-color]{border-color:var(--ttdk-ui-hover-border-color)!important}&:hover:not(:disabled)[style*=--ttdk-ui-hover-transform]{transform:var(--ttdk-ui-hover-transform)!important}&:hover:not(:disabled)[style*=--ttdk-ui-hover-opacity]{opacity:var(--ttdk-ui-hover-opacity)!important}&:hover:not(:disabled)[style*=--ttdk-ui-hover-box-shadow]{box-shadow:var(--ttdk-ui-hover-box-shadow)!important}&:active:not(:disabled)[style*=--ttdk-ui-active-background]{background:var(--ttdk-ui-active-background)!important}&:active:not(:disabled)[style*=--ttdk-ui-active-color]{color:var(--ttdk-ui-active-color)!important}&:active:not(:disabled)[style*=--ttdk-ui-active-transform]{transform:var(--ttdk-ui-active-transform)!important}&:active:not(:disabled)[style*=--ttdk-ui-active-opacity]{opacity:var(--ttdk-ui-active-opacity)!important}&:focus-visible[style*=--ttdk-ui-focus-outline]{outline:var(--ttdk-ui-focus-outline)!important}&:focus-visible[style*=--ttdk-ui-focus-box-shadow]{box-shadow:var(--ttdk-ui-focus-box-shadow)!important}& svg,& .ttdk-icon{color:var(--ttdk-ui-icon-color,currentColor);width:var(--ttdk-ui-icon-size,1em);height:var(--ttdk-ui-icon-size,1em)}&[data-appearance=solid][data-variant=primary],&[data-variant=primary]:not([data-appearance]){background-color:var(--ttdk-brand-default);color:var(--ttdk-color-white);border-color:var(--ttdk-brand-default);&:hover:not(:disabled){background-color:var(--ttdk-brand-strong);border-color:var(--ttdk-brand-strong);color:var(--ttdk-color-white)}}&[data-appearance=solid][data-variant=info],&[data-variant=info]:not([data-appearance]){background-color:var(--ttdk-bg-status-info);color:var(--ttdk-color-white);border-color:var(--ttdk-bg-status-info);&:hover:not(:disabled){background-color:var(--ttdk-bg-status-info-strong);border-color:var(--ttdk-bg-status-info-strong);color:var(--ttdk-color-white)}}&[data-appearance=solid][data-variant=warning],&[data-variant=warning]:not([data-appearance]){background-color:var(--ttdk-bg-status-warning);color:var(--ttdk-color-black);border-color:var(--ttdk-bg-status-warning);&:hover:not(:disabled){background-color:var(--ttdk-bg-status-warning-strong);border-color:var(--ttdk-bg-status-warning-strong);color:var(--ttdk-color-white)}}&[data-appearance=solid][data-variant=danger],&[data-variant=danger]:not([data-appearance]){background-color:var(--ttdk-bg-status-error);color:var(--ttdk-color-white);border-color:var(--ttdk-bg-status-error);&:hover:not(:disabled){background-color:var(--ttdk-bg-status-error-strong);border-color:var(--ttdk-bg-status-error-strong);color:var(--ttdk-color-white)}}&[data-appearance=solid][data-variant=neutral],&[data-variant=neutral]:not([data-appearance]){background-color:var(--ttdk-bg-secondary-disabled);border-color:var(--ttdk-stroke-divider);color:var(--ttdk-text-icon-primary);&:hover:not(:disabled){background-color:var(--ttdk-stroke-divider);border-color:var(--ttdk-stroke-strong);color:var(--ttdk-text-icon-primary)}}&[data-appearance=solid][data-variant=disabled],&[data-variant=disabled]:not([data-appearance]){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}&[data-appearance=soft][data-variant=primary]{background-color:var(--ttdk-brand-subtle);border-color:var(--ttdk-brand-default);color:var(--ttdk-brand-default);&:hover:not(:disabled){background-color:var(--ttdk-color-brand-green-100);border-color:var(--ttdk-brand-strong);color:var(--ttdk-brand-strong)}}&[data-appearance=soft][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);&:hover:not(:disabled){border-color:var(--ttdk-text-icon-status-info-strong);color:var(--ttdk-text-icon-status-info-strong);background-color:#2196f333}}&[data-appearance=soft][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);&:hover:not(:disabled){border-color:var(--ttdk-text-icon-status-warning-strong);color:var(--ttdk-text-icon-status-warning-strong);background-color:#fb8c0033}}&[data-appearance=soft][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);&:hover:not(:disabled){border-color:var(--ttdk-text-icon-status-error-strong);color:var(--ttdk-text-icon-status-error-strong);background-color:#d0021b33}}&[data-appearance=soft][data-variant=neutral]{background-color:var(--ttdk-bg-secondary-disabled);border-color:var(--ttdk-stroke-divider);color:var(--ttdk-text-icon-primary);&:hover:not(:disabled){background-color:var(--ttdk-stroke-divider);border-color:var(--ttdk-stroke-strong);color:var(--ttdk-text-icon-primary)}}&[data-appearance=soft][data-variant=disabled]{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}&[data-appearance=outline][data-variant=primary]{border-color:var(--ttdk-brand-default);color:var(--ttdk-brand-default);background-color:#0000;&:hover:not(:disabled){background-color:var(--ttdk-brand-subtle);border-color:var(--ttdk-brand-strong);color:var(--ttdk-brand-strong)}}&[data-appearance=outline][data-variant=info]{border-color:var(--ttdk-stroke-status-info);color:var(--ttdk-text-icon-status-info);background-color:#0000;&:hover:not(:disabled){background-color:var(--ttdk-bg-status-info-subtle);border-color:var(--ttdk-text-icon-status-info-strong);color:var(--ttdk-text-icon-status-info-strong)}}&[data-appearance=outline][data-variant=warning]{border-color:var(--ttdk-stroke-status-warning);color:var(--ttdk-text-icon-status-warning);background-color:#0000;&:hover:not(:disabled){background-color:var(--ttdk-bg-status-warning-subtle);border-color:var(--ttdk-text-icon-status-warning-strong);color:var(--ttdk-text-icon-status-warning-strong)}}&[data-appearance=outline][data-variant=danger]{border-color:var(--ttdk-stroke-status-error);color:var(--ttdk-text-icon-status-error);background-color:#0000;&:hover:not(:disabled){background-color:var(--ttdk-bg-status-error-subtle);border-color:var(--ttdk-text-icon-status-error-strong);color:var(--ttdk-text-icon-status-error-strong)}}&[data-appearance=outline][data-variant=neutral]{border-color:var(--ttdk-stroke-divider);color:var(--ttdk-text-icon-primary);background-color:#0000;&:hover:not(:disabled){background-color:var(--ttdk-bg-secondary-disabled);border-color:var(--ttdk-stroke-strong);color:var(--ttdk-text-icon-primary)}}&[data-appearance=outline][data-variant=disabled]{border-color:var(--ttdk-stroke-subtle)!important;color:var(--ttdk-text-icon-disabled)!important;cursor:not-allowed!important;background-color:#0000!important}&[data-appearance=link][data-variant=primary]{color:var(--ttdk-brand-default);text-underline-offset:4px;background-color:#0000;border-color:#0000;text-decoration:none;&:hover:not(:disabled){color:var(--ttdk-brand-strong);background-color:#0000;text-decoration:underline}}&[data-appearance=link][data-variant=info]{color:var(--ttdk-text-icon-status-info);text-underline-offset:4px;background-color:#0000;border-color:#0000;text-decoration:none;&:hover:not(:disabled){color:var(--ttdk-text-icon-status-info-strong);background-color:#0000;text-decoration:underline}}&[data-appearance=link][data-variant=warning]{color:var(--ttdk-text-icon-status-warning);text-underline-offset:4px;background-color:#0000;border-color:#0000;text-decoration:none;&:hover:not(:disabled){color:var(--ttdk-text-icon-status-warning-strong);background-color:#0000;text-decoration:underline}}&[data-appearance=link][data-variant=danger]{color:var(--ttdk-text-icon-status-error);text-underline-offset:4px;background-color:#0000;border-color:#0000;text-decoration:none;&:hover:not(:disabled){color:var(--ttdk-text-icon-status-error-strong);background-color:#0000;text-decoration:underline}}&[data-appearance=link][data-variant=neutral]{color:var(--ttdk-text-icon-primary);text-underline-offset:4px;background-color:#0000;border-color:#0000;text-decoration:none;&:hover:not(:disabled){color:var(--ttdk-text-icon-secondary);background-color:#0000;text-decoration:underline}}&[data-appearance=link][data-variant=disabled]{color:var(--ttdk-text-icon-disabled)!important;cursor:not-allowed!important;background-color:#0000!important;border-color:#0000!important;text-decoration:none!important}&[data-appearance=ghost][data-variant=primary]{color:var(--ttdk-brand-default);background-color:#0000;border-color:#0000;&:hover:not(:disabled){background-color:var(--ttdk-brand-subtle);color:var(--ttdk-brand-strong);border-color:#0000}&:active:not(:disabled){background-color:var(--ttdk-color-brand-green-100);color:var(--ttdk-brand-strong);border-color:#0000}}&[data-appearance=ghost][data-variant=info]{color:var(--ttdk-text-icon-status-info);background-color:#0000;border-color:#0000;&:hover:not(:disabled){background-color:var(--ttdk-bg-status-info-subtle);color:var(--ttdk-text-icon-status-info-strong);border-color:#0000}&:active:not(:disabled){color:var(--ttdk-text-icon-status-info-strong);background-color:#2196f333;border-color:#0000}}&[data-appearance=ghost][data-variant=warning]{color:var(--ttdk-text-icon-status-warning);background-color:#0000;border-color:#0000;&:hover:not(:disabled){background-color:var(--ttdk-bg-status-warning-subtle);color:var(--ttdk-text-icon-status-warning-strong);border-color:#0000}&:active:not(:disabled){color:var(--ttdk-text-icon-status-warning-strong);background-color:#fb8c0033;border-color:#0000}}&[data-appearance=ghost][data-variant=danger]{color:var(--ttdk-text-icon-status-error);background-color:#0000;border-color:#0000;&:hover:not(:disabled){background-color:var(--ttdk-bg-status-error-subtle);color:var(--ttdk-text-icon-status-error-strong);border-color:#0000}&:active:not(:disabled){color:var(--ttdk-text-icon-status-error-strong);background-color:#d0021b33;border-color:#0000}}&[data-appearance=ghost][data-variant=neutral]{color:var(--ttdk-text-icon-primary);background-color:#0000;border-color:#0000;&:hover:not(:disabled){background-color:var(--ttdk-bg-secondary-disabled);color:var(--ttdk-text-icon-primary);border-color:#0000}&:active:not(:disabled){background-color:var(--ttdk-stroke-divider);color:var(--ttdk-text-icon-primary);border-color:#0000}}&[data-appearance=ghost][data-variant=disabled]{color:var(--ttdk-text-icon-disabled)!important;cursor:not-allowed!important;background-color:#0000!important;border-color:#0000!important}&[data-size=small],&[data-size=sm]{border-radius:var(--ttdk-radius-xs,6px);gap:6px;height:36px;padding:0 12px;font-size:12px;line-height:16px;&>svg,&>span:not(.ttdk-button-spinner)>svg{width:16px;height:16px}& .ttdk-button-spinner,& .ttdk-button-spinner svg{width:var(--ttdk-ui-icon-size,16px)!important;height:var(--ttdk-ui-icon-size,16px)!important}}&[data-size=medium],&[data-size=md]{border-radius:var(--ttdk-radius-sm,8px);gap:8px;height:48px;padding:0 16px;font-size:16px;line-height:24px;&>svg,&>span:not(.ttdk-button-spinner)>svg{width:20px;height:20px}& .ttdk-button-spinner,& .ttdk-button-spinner svg{width:var(--ttdk-ui-icon-size,20px)!important;height:var(--ttdk-ui-icon-size,20px)!important}}&[data-size=large],&[data-size=lg]{border-radius:var(--ttdk-radius-sm,8px);gap:8px;height:56px;padding:0 20px;font-size:18px;line-height:26px;&>svg,&>span:not(.ttdk-button-spinner)>svg{width:24px;height:24px}& .ttdk-button-spinner,& .ttdk-button-spinner svg{width:var(--ttdk-ui-icon-size,24px)!important;height:var(--ttdk-ui-icon-size,24px)!important}}&[data-size=xs]{border-radius:var(--ttdk-radius-xs,4px);gap:4px;height:28px;padding:0 8px;font-size:11px;line-height:16px;&>svg,&>span:not(.ttdk-button-spinner)>svg{width:14px;height:14px}& .ttdk-button-spinner,& .ttdk-button-spinner svg{width:var(--ttdk-ui-icon-size,14px)!important;height:var(--ttdk-ui-icon-size,14px)!important}}&[data-size=xl]{border-radius:var(--ttdk-radius-sm,8px);gap:8px;height:48px;padding:0 16px;font-size:16px;line-height:24px;&>svg,&>span:not(.ttdk-button-spinner)>svg{width:20px;height:20px}& .ttdk-button-spinner,& .ttdk-button-spinner svg{width:var(--ttdk-ui-icon-size,20px)!important;height:var(--ttdk-ui-icon-size,20px)!important}}&[data-size="2xl"]{border-radius:var(--ttdk-radius-sm,8px);gap:10px;height:56px;padding:0 24px;font-size:18px;line-height:26px;&>svg,&>span:not(.ttdk-button-spinner)>svg{width:24px;height:24px}& .ttdk-button-spinner,& .ttdk-button-spinner svg{width:var(--ttdk-ui-icon-size,24px)!important;height:var(--ttdk-ui-icon-size,24px)!important}}&[data-icon-only=true]{aspect-ratio:1;justify-content:center;padding:0}&[data-block=true]{width:100%}&[data-underline=none],&[data-appearance=link][data-underline=none]{text-decoration:none!important;&:hover:not(:disabled){text-decoration:none!important}}&[data-underline=always]{text-decoration:underline!important}&>svg,&>span:not(.ttdk-button-spinner)>svg{pointer-events:none;flex-shrink:0}& .ttdk-button-spinner{width:var(--ttdk-ui-icon-size,20px);height:var(--ttdk-ui-icon-size,20px);flex-shrink:0;justify-content:center;align-items:center;line-height:1;animation:1.2s steps(12,end) infinite ttdk-button-spin;display:inline-flex}& .ttdk-button-spinner svg{fill:none;stroke:currentColor;stroke-width:2.2px;stroke-linecap:round;display:block;width:100%!important;height:100%!important}&[data-size=xs] .ttdk-button-spinner,&[data-size=xs] .ttdk-button-spinner svg{width:var(--ttdk-ui-icon-size,14px)!important;height:var(--ttdk-ui-icon-size,14px)!important}&[data-size=small] .ttdk-button-spinner,&[data-size=sm] .ttdk-button-spinner,&[data-size=small] .ttdk-button-spinner svg,&[data-size=sm] .ttdk-button-spinner svg{width:var(--ttdk-ui-icon-size,16px)!important;height:var(--ttdk-ui-icon-size,16px)!important}&[data-size=medium] .ttdk-button-spinner,&[data-size=md] .ttdk-button-spinner,&[data-size=medium] .ttdk-button-spinner svg,&[data-size=md] .ttdk-button-spinner svg{width:var(--ttdk-ui-icon-size,20px)!important;height:var(--ttdk-ui-icon-size,20px)!important}&[data-size=large] .ttdk-button-spinner,&[data-size=lg] .ttdk-button-spinner,&[data-size=large] .ttdk-button-spinner svg,&[data-size=lg] .ttdk-button-spinner svg{width:var(--ttdk-ui-icon-size,24px)!important;height:var(--ttdk-ui-icon-size,24px)!important}&[data-size=xl] .ttdk-button-spinner,&[data-size=xl] .ttdk-button-spinner svg{width:var(--ttdk-ui-icon-size,20px)!important;height:var(--ttdk-ui-icon-size,20px)!important}&[data-size="2xl"] .ttdk-button-spinner,&[data-size="2xl"] .ttdk-button-spinner svg{width:var(--ttdk-ui-icon-size,24px)!important;height:var(--ttdk-ui-icon-size,24px)!important}&:active:not(:disabled){scale:.98}&:focus-visible{box-shadow:0 0 0 3px color-mix(in oklab, var(--ttdk-brand-default) 30%, transparent);outline:none}&[data-variant=danger]:focus-visible{box-shadow:0 0 0 3px color-mix(in oklab, var(--ttdk-bg-status-error) 30%, transparent)}&:disabled:not([data-loading=true]),&[disabled]:not([data-loading=true]),&[data-disabled=true]:not([data-loading=true]){pointer-events:none;background-color:var(--ttdk-bg-secondary-disabled)!important;color:var(--ttdk-text-icon-disabled)!important;cursor:not-allowed!important;box-shadow:none!important;border-color:#0000!important}&[data-loading=true]{pointer-events:none;cursor:wait!important}&[data-loading=true][data-icon-only=true]>:not(.ttdk-button-spinner){display:none}}.ttdk-button[data-rounded=none]{border-radius:0}.ttdk-button[data-rounded=sm]{border-radius:4px}.ttdk-button[data-rounded=md]{border-radius:6px}.ttdk-button[data-rounded=lg]{border-radius:8px}.ttdk-button[data-rounded=full]{border-radius:9999px}.dark .ttdk-button,html.dark .ttdk-button,[data-mode=dark] .ttdk-button,[data-theme=dark] .ttdk-button{&[data-appearance=solid][data-variant=neutral],&[data-variant=neutral]:not([data-appearance]){background-color:var(--ttdk-bg-stay-black);border-color:var(--ttdk-bg-stay-black);color:var(--ttdk-text-icon-stay-white);&:hover:not(:disabled){color:var(--ttdk-text-icon-stay-white);background-color:#2f2f2f;border-color:#2f2f2f}}&[data-appearance=soft][data-variant=neutral]{background-color:var(--ttdk-color-neutral-900);border-color:var(--ttdk-stroke-strong);color:var(--ttdk-text-icon-primary);&:hover:not(:disabled){background-color:var(--ttdk-color-neutral-800);border-color:var(--ttdk-stroke-stay-white);color:var(--ttdk-text-icon-primary)}}&[data-appearance=outline][data-variant=neutral]{background-color:var(--ttdk-bg-stay-black);border-color:var(--ttdk-stroke-stay-white);color:var(--ttdk-text-icon-primary);&:hover:not(:disabled){color:var(--ttdk-text-icon-primary);background-color:#ffffff14}}&[data-appearance=link][data-variant=neutral]{color:var(--ttdk-text-icon-primary);&:hover:not(:disabled){color:var(--ttdk-text-icon-stay-white)}}&[data-appearance=soft][data-variant=primary]{background-color:var(--ttdk-brand-subtle-dark);border-color:var(--ttdk-brand-default);color:var(--ttdk-brand-default);&:hover:not(:disabled){border-color:var(--ttdk-brand-default);color:var(--ttdk-brand-default);background-color:#16b3ac40}}&[data-appearance=outline][data-variant=primary]{border-color:var(--ttdk-brand-default);color:var(--ttdk-brand-default);background-color:#0000;&:hover:not(:disabled){background-color:#16b3ac26}}&[data-appearance=soft][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);&:hover:not(:disabled){background-color:#2196f340}}&[data-appearance=soft][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);&:hover:not(:disabled){background-color:#fb8c0040}}&[data-appearance=soft][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);&:hover:not(:disabled){background-color:#d0021b40}}&[data-appearance=ghost][data-variant=primary]{color:var(--ttdk-brand-default);background-color:#0000;border-color:#0000;&:hover:not(:disabled){background-color:var(--ttdk-brand-subtle-dark);color:var(--ttdk-brand-default);border-color:#0000}}&[data-appearance=ghost][data-variant=neutral]{color:var(--ttdk-text-icon-primary);background-color:#0000;border-color:#0000;&:hover:not(:disabled){background-color:var(--ttdk-color-neutral-800);color:var(--ttdk-text-icon-primary);border-color:#0000}}&[data-appearance=ghost][data-variant=info]{color:var(--ttdk-text-icon-status-info);background-color:#0000;border-color:#0000;&:hover:not(:disabled){color:var(--ttdk-text-icon-status-info);background-color:#2196f340;border-color:#0000}}&[data-appearance=ghost][data-variant=warning]{color:var(--ttdk-text-icon-status-warning);background-color:#0000;border-color:#0000;&:hover:not(:disabled){color:var(--ttdk-text-icon-status-warning);background-color:#fb8c0040;border-color:#0000}}&[data-appearance=ghost][data-variant=danger]{color:var(--ttdk-text-icon-status-error);background-color:#0000;border-color:#0000;&:hover:not(:disabled){color:var(--ttdk-text-icon-status-error);background-color:#d0021b40;border-color:#0000}}&[data-appearance=solid][data-variant=primary],&[data-variant=primary]:not([data-appearance]),&[data-appearance=solid][data-variant=info],&[data-variant=info]:not([data-appearance]),&[data-appearance=solid][data-variant=danger],&[data-variant=danger]:not([data-appearance]){color:#fff;&:hover:not(:disabled){color:#fff}}&[data-appearance=solid][data-variant=warning],&[data-variant=warning]:not([data-appearance]){color:var(--ttdk-color-black);&:hover:not(:disabled){color:var(--ttdk-color-black)}}&[data-appearance=solid][data-variant=warning]:hover:not(:disabled),&[data-variant=warning]:not([data-appearance]):hover:not(:disabled){background-color:var(--ttdk-bg-status-warning-strong)}&[data-appearance=solid][data-variant=info]:hover:not(:disabled),&[data-variant=info]:not([data-appearance]):hover:not(:disabled){background-color:var(--ttdk-bg-status-info-strong)}&[data-appearance=solid][data-variant=danger]:hover:not(:disabled),&[data-variant=danger]:not([data-appearance]):hover:not(:disabled){background-color:var(--ttdk-bg-status-error-strong)}&:disabled:not([data-loading=true]),&[disabled]:not([data-loading=true]),&[data-disabled=true]:not([data-loading=true]),&[data-variant=disabled]{background-color:var(--ttdk-bg-secondary-disabled)!important;color:var(--ttdk-text-icon-disabled)!important;border-color:#0000!important}}[data-sonner-toasters]{font-family:var(--ttdk-font-sans);-webkit-font-smoothing:antialiased}@keyframes ttdk-button-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}
@@ -0,0 +1,283 @@
1
+ <template>
2
+ <button
3
+ :class="`ttdk-button ${className || ''}`.trim()"
4
+ :type="type || 'button'"
5
+ :data-variant="variant || 'primary'"
6
+ :data-appearance="appearance || 'solid'"
7
+ :data-size="size || 'md'"
8
+ :data-negative="negative ? 'true' : undefined"
9
+ :data-rounded="rounded"
10
+ :data-icon-only="iconOnly"
11
+ :data-block="block ? 'true' : undefined"
12
+ :data-loading="loading ? 'true' : undefined"
13
+ :disabled="disabled || variant === 'disabled' || loading"
14
+ :style="{
15
+ ...buildUiVars(ui),
16
+ ...(iconColor
17
+ ? {
18
+ '--ttdk-ui-icon-color': iconColor,
19
+ }
20
+ : {}),
21
+ ...(iconSize
22
+ ? {
23
+ '--ttdk-ui-icon-size': iconSize,
24
+ }
25
+ : {}),
26
+ ...(typeof style === 'object' ? style : {}),
27
+ }"
28
+ @click="
29
+ async (event) => {
30
+ onClick?.(event);
31
+ }
32
+ "
33
+ >
34
+ <template v-if="loading">
35
+ <span class="ttdk-button-spinner" aria-hidden="true"
36
+ ><svg viewBox="0 0 24 24">
37
+ <line
38
+ x1="12"
39
+ y1="2.5"
40
+ x2="12"
41
+ y2="6.5"
42
+ opacity="0.175"
43
+ transform="rotate(0 12 12)"
44
+ ></line>
45
+ <line
46
+ x1="12"
47
+ y1="2.5"
48
+ x2="12"
49
+ y2="6.5"
50
+ opacity="0.25"
51
+ transform="rotate(30 12 12)"
52
+ ></line>
53
+ <line
54
+ x1="12"
55
+ y1="2.5"
56
+ x2="12"
57
+ y2="6.5"
58
+ opacity="0.325"
59
+ transform="rotate(60 12 12)"
60
+ ></line>
61
+ <line
62
+ x1="12"
63
+ y1="2.5"
64
+ x2="12"
65
+ y2="6.5"
66
+ opacity="0.4"
67
+ transform="rotate(90 12 12)"
68
+ ></line>
69
+ <line
70
+ x1="12"
71
+ y1="2.5"
72
+ x2="12"
73
+ y2="6.5"
74
+ opacity="0.475"
75
+ transform="rotate(120 12 12)"
76
+ ></line>
77
+ <line
78
+ x1="12"
79
+ y1="2.5"
80
+ x2="12"
81
+ y2="6.5"
82
+ opacity="0.55"
83
+ transform="rotate(150 12 12)"
84
+ ></line>
85
+ <line
86
+ x1="12"
87
+ y1="2.5"
88
+ x2="12"
89
+ y2="6.5"
90
+ opacity="0.625"
91
+ transform="rotate(180 12 12)"
92
+ ></line>
93
+ <line
94
+ x1="12"
95
+ y1="2.5"
96
+ x2="12"
97
+ y2="6.5"
98
+ opacity="0.7"
99
+ transform="rotate(210 12 12)"
100
+ ></line>
101
+ <line
102
+ x1="12"
103
+ y1="2.5"
104
+ x2="12"
105
+ y2="6.5"
106
+ opacity="0.775"
107
+ transform="rotate(240 12 12)"
108
+ ></line>
109
+ <line
110
+ x1="12"
111
+ y1="2.5"
112
+ x2="12"
113
+ y2="6.5"
114
+ opacity="0.85"
115
+ transform="rotate(270 12 12)"
116
+ ></line>
117
+ <line
118
+ x1="12"
119
+ y1="2.5"
120
+ x2="12"
121
+ y2="6.5"
122
+ opacity="0.925"
123
+ transform="rotate(300 12 12)"
124
+ ></line>
125
+ <line
126
+ x1="12"
127
+ y1="2.5"
128
+ x2="12"
129
+ y2="6.5"
130
+ opacity="1"
131
+ transform="rotate(330 12 12)"
132
+ ></line></svg
133
+ ></span>
134
+ </template>
135
+
136
+ <slot />
137
+ </button>
138
+ </template>
139
+
140
+ <script setup lang="ts">
141
+ import { buildUiVars, UiProps } from "../../core/types";
142
+
143
+ export type ButtonUiProps = UiProps;
144
+ export interface ButtonProps {
145
+ /**
146
+ * Inline CSS style kustom.
147
+ */
148
+ style?: any;
149
+
150
+ /**
151
+ * Varian warna semantik tombol:
152
+ * - `'primary'`: Teal utama.
153
+ * - `'info'`: Biru informasi.
154
+ * - `'warning'`: Kuning peringatan.
155
+ * - `'danger'`: Merah bahaya.
156
+ * - `'neutral'`: Abu-abu netral.
157
+ * - `'disabled'`: Tombol non-aktif.
158
+ *
159
+ * @default 'primary'
160
+ */
161
+ variant?: "primary" | "info" | "warning" | "danger" | "neutral" | "disabled";
162
+
163
+ /**
164
+ * Gaya tampilan visual tombol:
165
+ * - `'solid'`: Latar belakang warna solid pekat (default).
166
+ * - `'soft'`: Latar belakang warna transparan lembut.
167
+ * - `'outline'`: Garis tepi dengan latar belakang transparan.
168
+ * - `'link'`: Teks tautan tanpa border/latar, dengan garis bawah saat hover.
169
+ * - `'ghost'`: Transparan tanpa outline/border, dengan latar lembut saat hover.
170
+ *
171
+ * @default 'solid'
172
+ */
173
+ appearance?: "solid" | "soft" | "outline" | "link" | "ghost";
174
+
175
+ /**
176
+ * Tipe tombol HTML native.
177
+ * @default 'button'
178
+ */
179
+ type?: "button" | "submit" | "reset";
180
+
181
+ /**
182
+ * Skala ukuran tombol:
183
+ * - `'sm'`: 36px
184
+ * - `'md'`: 48px (standar)
185
+ * - `'lg'`: 56px
186
+ *
187
+ * @default 'md'
188
+ */
189
+ size?: "sm" | "md" | "lg";
190
+
191
+ /**
192
+ * Mode negatif — kontras tinggi di atas latar gelap.
193
+ * @default false
194
+ */
195
+ negative?: boolean;
196
+
197
+ /**
198
+ * Radius sudut tombol.
199
+ * - `'none'`: 0px
200
+ * - `'sm'`: 4px
201
+ * - `'md'`: 8px (standar)
202
+ * - `'lg'`: 12px
203
+ * - `'full'`: 9999px (pill)
204
+ *
205
+ * @default 'md'
206
+ */
207
+ rounded?: "none" | "sm" | "md" | "lg" | "full";
208
+
209
+ /**
210
+ * Mode tombol ikon persegi (aspek rasio 1:1).
211
+ * @default false
212
+ */
213
+ iconOnly?: boolean;
214
+
215
+ /**
216
+ * Full-width — melebar 100% dari container.
217
+ * @default false
218
+ */
219
+ block?: boolean;
220
+
221
+ /**
222
+ * Tampilkan spinner & nonaktifkan tombol saat proses async.
223
+ * @default false
224
+ */
225
+ loading?: boolean;
226
+
227
+ /**
228
+ * Nonaktifkan tombol dari interaksi pengguna.
229
+ * @default false
230
+ */
231
+ disabled?: boolean;
232
+
233
+ /**
234
+ * Warna kustom untuk ikon di dalam tombol (misal: '#fff', '#0968F6').
235
+ */
236
+ iconColor?: string;
237
+
238
+ /**
239
+ * Ukuran kustom untuk ikon di dalam tombol (misal: '16px', '20px').
240
+ */
241
+ iconSize?: string;
242
+
243
+ /**
244
+ * Kustomisasi visual — seperti style object tapi dengan support pseudo-class.
245
+ *
246
+ * @example
247
+ * ```tsx
248
+ * <Button
249
+ * ui={{
250
+ * background: '#7c3aed',
251
+ * color: 'white',
252
+ * borderRadius: '99px',
253
+ * hover: {
254
+ * background: '#6d28d9',
255
+ * transform: 'scale(1.02)',
256
+ * },
257
+ * active: {
258
+ * opacity: '0.9',
259
+ * }
260
+ * }}
261
+ * />
262
+ * ```
263
+ */
264
+ ui?: UiProps;
265
+
266
+ /**
267
+ * Event handler saat tombol diklik.
268
+ */
269
+ onClick?: (event?: any) => void;
270
+
271
+ /**
272
+ * Class CSS kustom.
273
+ */
274
+ className?: string;
275
+
276
+ /**
277
+ * Konten tombol — teks, ikon, atau JSX.
278
+ */
279
+ children?: any;
280
+ }
281
+
282
+ const props = defineProps<ButtonProps>();
283
+ </script>
@@ -0,0 +1,147 @@
1
+ /* eslint-disable */
2
+ // Auto-generated by TTDK Design System Vue Type Generator
3
+ import type { DefineComponent } from "vue";
4
+ import { buildUiVars, UiProps } from "../../core/types";
5
+
6
+ export type ButtonUiProps = UiProps;
7
+
8
+ export interface ButtonProps {
9
+ /**
10
+ * Inline CSS style kustom.
11
+ */
12
+ style?: any;
13
+
14
+ /**
15
+ * Varian warna semantik tombol:
16
+ * - `'primary'`: Teal utama.
17
+ * - `'info'`: Biru informasi.
18
+ * - `'warning'`: Kuning peringatan.
19
+ * - `'danger'`: Merah bahaya.
20
+ * - `'neutral'`: Abu-abu netral.
21
+ * - `'disabled'`: Tombol non-aktif.
22
+ *
23
+ * @default 'primary'
24
+ */
25
+ variant?: "primary" | "info" | "warning" | "danger" | "neutral" | "disabled";
26
+
27
+ /**
28
+ * Gaya tampilan visual tombol:
29
+ * - `'solid'`: Latar belakang warna solid pekat (default).
30
+ * - `'soft'`: Latar belakang warna transparan lembut.
31
+ * - `'outline'`: Garis tepi dengan latar belakang transparan.
32
+ * - `'link'`: Teks tautan tanpa border/latar, dengan garis bawah saat hover.
33
+ * - `'ghost'`: Transparan tanpa outline/border, dengan latar lembut saat hover.
34
+ *
35
+ * @default 'solid'
36
+ */
37
+ appearance?: "solid" | "soft" | "outline" | "link" | "ghost";
38
+
39
+ /**
40
+ * Tipe tombol HTML native.
41
+ * @default 'button'
42
+ */
43
+ type?: "button" | "submit" | "reset";
44
+
45
+ /**
46
+ * Skala ukuran tombol:
47
+ * - `'sm'`: 36px
48
+ * - `'md'`: 48px (standar)
49
+ * - `'lg'`: 56px
50
+ *
51
+ * @default 'md'
52
+ */
53
+ size?: "sm" | "md" | "lg";
54
+
55
+ /**
56
+ * Mode negatif — kontras tinggi di atas latar gelap.
57
+ * @default false
58
+ */
59
+ negative?: boolean;
60
+
61
+ /**
62
+ * Radius sudut tombol.
63
+ * - `'none'`: 0px
64
+ * - `'sm'`: 4px
65
+ * - `'md'`: 8px (standar)
66
+ * - `'lg'`: 12px
67
+ * - `'full'`: 9999px (pill)
68
+ *
69
+ * @default 'md'
70
+ */
71
+ rounded?: "none" | "sm" | "md" | "lg" | "full";
72
+
73
+ /**
74
+ * Mode tombol ikon persegi (aspek rasio 1:1).
75
+ * @default false
76
+ */
77
+ iconOnly?: boolean;
78
+
79
+ /**
80
+ * Full-width — melebar 100% dari container.
81
+ * @default false
82
+ */
83
+ block?: boolean;
84
+
85
+ /**
86
+ * Tampilkan spinner & nonaktifkan tombol saat proses async.
87
+ * @default false
88
+ */
89
+ loading?: boolean;
90
+
91
+ /**
92
+ * Nonaktifkan tombol dari interaksi pengguna.
93
+ * @default false
94
+ */
95
+ disabled?: boolean;
96
+
97
+ /**
98
+ * Warna kustom untuk ikon di dalam tombol (misal: '#fff', '#0968F6').
99
+ */
100
+ iconColor?: string;
101
+
102
+ /**
103
+ * Ukuran kustom untuk ikon di dalam tombol (misal: '16px', '20px').
104
+ */
105
+ iconSize?: string;
106
+
107
+ /**
108
+ * Kustomisasi visual — seperti style object tapi dengan support pseudo-class.
109
+ *
110
+ * @example
111
+ * ```tsx
112
+ * <Button
113
+ * ui={{
114
+ * background: '#7c3aed',
115
+ * color: 'white',
116
+ * borderRadius: '99px',
117
+ * hover: {
118
+ * background: '#6d28d9',
119
+ * transform: 'scale(1.02)',
120
+ * },
121
+ * active: {
122
+ * opacity: '0.9',
123
+ * }
124
+ * }}
125
+ * />
126
+ * ```
127
+ */
128
+ ui?: UiProps;
129
+
130
+ /**
131
+ * Event handler saat tombol diklik.
132
+ */
133
+ onClick?: (event?: any) => void;
134
+
135
+ /**
136
+ * Class CSS kustom.
137
+ */
138
+ className?: string;
139
+
140
+ /**
141
+ * Konten tombol — teks, ikon, atau JSX.
142
+ */
143
+ children?: any;
144
+ }
145
+
146
+ declare const component: DefineComponent<ButtonProps>;
147
+ export default component;
@@ -0,0 +1,3 @@
1
+ export { default } from './button.vue';
2
+ export { default as Button } from './button.vue';
3
+ export * from './button.vue';