@ttdk-design-system/library-svelte 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 (270) hide show
  1. package/AI_GUIDE.md +6518 -0
  2. package/dist/core/index.d.ts +2 -0
  3. package/dist/core/index.js +2 -0
  4. package/dist/core/tailwind-preset.cjs +62 -0
  5. package/dist/core/tailwind-preset.d.cts +63 -0
  6. package/dist/core/tailwind-preset.d.ts +74 -0
  7. package/dist/core/tailwind-preset.js +79 -0
  8. package/dist/core/theme/tokens.css +663 -0
  9. package/dist/core/types.d.ts +152 -0
  10. package/dist/core/types.js +735 -0
  11. package/dist/index.d.ts +14 -0
  12. package/dist/index.js +15 -0
  13. package/dist/tailwind-preset.cjs +62 -0
  14. package/dist/tailwind-preset.d.cts +63 -0
  15. package/dist/tailwind-preset.d.ts +74 -0
  16. package/dist/tailwind-preset.js +79 -0
  17. package/dist/types.d.ts +1 -0
  18. package/dist/types.js +1 -0
  19. package/dist/web/accordion/AI_GUIDE.md +149 -0
  20. package/dist/web/accordion/accordion.css +1 -0
  21. package/dist/web/accordion/accordion.svelte +217 -0
  22. package/dist/web/accordion/accordion.svelte.d.ts +224 -0
  23. package/dist/web/accordion/index.d.ts +2 -0
  24. package/dist/web/accordion/index.js +2 -0
  25. package/dist/web/accordion/manifest.json +351 -0
  26. package/dist/web/alert/AI_GUIDE.md +139 -0
  27. package/dist/web/alert/alert.css +1 -0
  28. package/dist/web/alert/alert.svelte +175 -0
  29. package/dist/web/alert/alert.svelte.d.ts +165 -0
  30. package/dist/web/alert/index.d.ts +2 -0
  31. package/dist/web/alert/index.js +2 -0
  32. package/dist/web/alert/manifest.json +240 -0
  33. package/dist/web/avatar/AI_GUIDE.md +118 -0
  34. package/dist/web/avatar/avatar.css +1 -0
  35. package/dist/web/avatar/avatar.svelte +108 -0
  36. package/dist/web/avatar/avatar.svelte.d.ts +147 -0
  37. package/dist/web/avatar/index.d.ts +2 -0
  38. package/dist/web/avatar/index.js +2 -0
  39. package/dist/web/avatar/manifest.json +195 -0
  40. package/dist/web/badge/AI_GUIDE.md +94 -0
  41. package/dist/web/badge/badge.css +1 -0
  42. package/dist/web/badge/badge.svelte +50 -0
  43. package/dist/web/badge/badge.svelte.d.ts +111 -0
  44. package/dist/web/badge/index.d.ts +2 -0
  45. package/dist/web/badge/index.js +2 -0
  46. package/dist/web/badge/manifest.json +141 -0
  47. package/dist/web/banner/AI_GUIDE.md +130 -0
  48. package/dist/web/banner/banner.css +1 -0
  49. package/dist/web/banner/banner.svelte +180 -0
  50. package/dist/web/banner/banner.svelte.d.ts +172 -0
  51. package/dist/web/banner/index.d.ts +2 -0
  52. package/dist/web/banner/index.js +2 -0
  53. package/dist/web/banner/manifest.json +240 -0
  54. package/dist/web/breadcrumb/AI_GUIDE.md +120 -0
  55. package/dist/web/breadcrumb/breadcrumb.css +1 -0
  56. package/dist/web/breadcrumb/breadcrumb.svelte +168 -0
  57. package/dist/web/breadcrumb/breadcrumb.svelte.d.ts +141 -0
  58. package/dist/web/breadcrumb/index.d.ts +2 -0
  59. package/dist/web/breadcrumb/index.js +2 -0
  60. package/dist/web/breadcrumb/manifest.json +225 -0
  61. package/dist/web/button/AI_GUIDE.md +121 -0
  62. package/dist/web/button/button.css +1 -0
  63. package/dist/web/button/button.svelte +154 -0
  64. package/dist/web/button/button.svelte.d.ts +159 -0
  65. package/dist/web/button/index.d.ts +2 -0
  66. package/dist/web/button/index.js +2 -0
  67. package/dist/web/button/manifest.json +177 -0
  68. package/dist/web/calendar/AI_GUIDE.md +151 -0
  69. package/dist/web/calendar/calendar.css +1 -0
  70. package/dist/web/calendar/calendar.svelte +1091 -0
  71. package/dist/web/calendar/calendar.svelte.d.ts +268 -0
  72. package/dist/web/calendar/index.d.ts +2 -0
  73. package/dist/web/calendar/index.js +2 -0
  74. package/dist/web/calendar/manifest.json +470 -0
  75. package/dist/web/card/AI_GUIDE.md +133 -0
  76. package/dist/web/card/card.css +1 -0
  77. package/dist/web/card/card.svelte +217 -0
  78. package/dist/web/card/card.svelte.d.ts +242 -0
  79. package/dist/web/card/index.d.ts +2 -0
  80. package/dist/web/card/index.js +2 -0
  81. package/dist/web/card/manifest.json +357 -0
  82. package/dist/web/checkbox/AI_GUIDE.md +146 -0
  83. package/dist/web/checkbox/checkbox.css +1 -0
  84. package/dist/web/checkbox/checkbox.svelte +131 -0
  85. package/dist/web/checkbox/checkbox.svelte.d.ts +199 -0
  86. package/dist/web/checkbox/index.d.ts +2 -0
  87. package/dist/web/checkbox/index.js +2 -0
  88. package/dist/web/checkbox/manifest.json +294 -0
  89. package/dist/web/chip/AI_GUIDE.md +186 -0
  90. package/dist/web/chip/chip.css +1 -0
  91. package/dist/web/chip/chip.svelte +113 -0
  92. package/dist/web/chip/chip.svelte.d.ts +145 -0
  93. package/dist/web/chip/index.d.ts +2 -0
  94. package/dist/web/chip/index.js +2 -0
  95. package/dist/web/chip/manifest.json +186 -0
  96. package/dist/web/dropdown/AI_GUIDE.md +167 -0
  97. package/dist/web/dropdown/dropdown.css +1 -0
  98. package/dist/web/dropdown/dropdown.svelte +844 -0
  99. package/dist/web/dropdown/dropdown.svelte.d.ts +361 -0
  100. package/dist/web/dropdown/index.d.ts +2 -0
  101. package/dist/web/dropdown/index.js +2 -0
  102. package/dist/web/dropdown/manifest.json +576 -0
  103. package/dist/web/flex/AI_GUIDE.md +113 -0
  104. package/dist/web/flex/flex-item.svelte +37 -0
  105. package/dist/web/flex/flex-item.svelte.d.ts +96 -0
  106. package/dist/web/flex/flex.css +1 -0
  107. package/dist/web/flex/flex.svelte +39 -0
  108. package/dist/web/flex/flex.svelte.d.ts +104 -0
  109. package/dist/web/flex/index.d.ts +3 -0
  110. package/dist/web/flex/index.js +3 -0
  111. package/dist/web/flex/manifest.json +162 -0
  112. package/dist/web/form/index.d.ts +1 -0
  113. package/dist/web/form/index.js +2 -0
  114. package/dist/web/grid/AI_GUIDE.md +112 -0
  115. package/dist/web/grid/grid-item.svelte +41 -0
  116. package/dist/web/grid/grid-item.svelte.d.ts +112 -0
  117. package/dist/web/grid/grid.css +1 -0
  118. package/dist/web/grid/grid.svelte +37 -0
  119. package/dist/web/grid/grid.svelte.d.ts +96 -0
  120. package/dist/web/grid/index.d.ts +3 -0
  121. package/dist/web/grid/index.js +3 -0
  122. package/dist/web/grid/manifest.json +153 -0
  123. package/dist/web/index.d.ts +58 -0
  124. package/dist/web/index.js +57 -0
  125. package/dist/web/input/AI_GUIDE.md +159 -0
  126. package/dist/web/input/index.d.ts +2 -0
  127. package/dist/web/input/index.js +2 -0
  128. package/dist/web/input/input.css +1 -0
  129. package/dist/web/input/input.svelte +283 -0
  130. package/dist/web/input/input.svelte.d.ts +283 -0
  131. package/dist/web/input/manifest.json +465 -0
  132. package/dist/web/input-number/AI_GUIDE.md +164 -0
  133. package/dist/web/input-number/index.d.ts +2 -0
  134. package/dist/web/input-number/index.js +2 -0
  135. package/dist/web/input-number/input-number.css +1 -0
  136. package/dist/web/input-number/input-number.svelte +783 -0
  137. package/dist/web/input-number/input-number.svelte.d.ts +352 -0
  138. package/dist/web/input-number/manifest.json +575 -0
  139. package/dist/web/modal/AI_GUIDE.md +171 -0
  140. package/dist/web/modal/index.d.ts +2 -0
  141. package/dist/web/modal/index.js +2 -0
  142. package/dist/web/modal/manifest.json +375 -0
  143. package/dist/web/modal/modal.css +1 -0
  144. package/dist/web/modal/modal.svelte +333 -0
  145. package/dist/web/modal/modal.svelte.d.ts +231 -0
  146. package/dist/web/pagination/AI_GUIDE.md +148 -0
  147. package/dist/web/pagination/index.d.ts +19 -0
  148. package/dist/web/pagination/index.js +19 -0
  149. package/dist/web/pagination/manifest.json +432 -0
  150. package/dist/web/pagination/pagination-content.svelte +25 -0
  151. package/dist/web/pagination/pagination-content.svelte.d.ts +36 -0
  152. package/dist/web/pagination/pagination-ellipsis.svelte +38 -0
  153. package/dist/web/pagination/pagination-ellipsis.svelte.d.ts +35 -0
  154. package/dist/web/pagination/pagination-first.svelte +105 -0
  155. package/dist/web/pagination/pagination-first.svelte.d.ts +74 -0
  156. package/dist/web/pagination/pagination-item.svelte +25 -0
  157. package/dist/web/pagination/pagination-item.svelte.d.ts +36 -0
  158. package/dist/web/pagination/pagination-last.svelte +105 -0
  159. package/dist/web/pagination/pagination-last.svelte.d.ts +74 -0
  160. package/dist/web/pagination/pagination-link.svelte +67 -0
  161. package/dist/web/pagination/pagination-link.svelte.d.ts +69 -0
  162. package/dist/web/pagination/pagination-next.svelte +99 -0
  163. package/dist/web/pagination/pagination-next.svelte.d.ts +75 -0
  164. package/dist/web/pagination/pagination-previous.svelte +99 -0
  165. package/dist/web/pagination/pagination-previous.svelte.d.ts +75 -0
  166. package/dist/web/pagination/pagination.css +1 -0
  167. package/dist/web/pagination/pagination.svelte +471 -0
  168. package/dist/web/pagination/pagination.svelte.d.ts +256 -0
  169. package/dist/web/popover/AI_GUIDE.md +163 -0
  170. package/dist/web/popover/index.d.ts +3 -0
  171. package/dist/web/popover/index.js +3 -0
  172. package/dist/web/popover/manifest.json +396 -0
  173. package/dist/web/popover/popover.css +1 -0
  174. package/dist/web/popover/popover.svelte +497 -0
  175. package/dist/web/popover/popover.svelte.d.ts +116 -0
  176. package/dist/web/radio/AI_GUIDE.md +155 -0
  177. package/dist/web/radio/index.d.ts +2 -0
  178. package/dist/web/radio/index.js +2 -0
  179. package/dist/web/radio/manifest.json +294 -0
  180. package/dist/web/radio/radio.css +1 -0
  181. package/dist/web/radio/radio.svelte +123 -0
  182. package/dist/web/radio/radio.svelte.d.ts +192 -0
  183. package/dist/web/selectbox/AI_GUIDE.md +216 -0
  184. package/dist/web/selectbox/index.d.ts +2 -0
  185. package/dist/web/selectbox/index.js +2 -0
  186. package/dist/web/selectbox/manifest.json +477 -0
  187. package/dist/web/selectbox/selectbox.css +1 -0
  188. package/dist/web/selectbox/selectbox.svelte +704 -0
  189. package/dist/web/selectbox/selectbox.svelte.d.ts +296 -0
  190. package/dist/web/sonner/AI_GUIDE.md +98 -0
  191. package/dist/web/sonner/index.d.ts +46 -0
  192. package/dist/web/sonner/index.js +64 -0
  193. package/dist/web/sonner/manifest.json +132 -0
  194. package/dist/web/sonner/sonner.css +1 -0
  195. package/dist/web/sonner/sonner.svelte +85 -0
  196. package/dist/web/sonner/sonner.svelte.d.ts +105 -0
  197. package/dist/web/table/AI_GUIDE.md +145 -0
  198. package/dist/web/table/index.d.ts +21 -0
  199. package/dist/web/table/index.js +22 -0
  200. package/dist/web/table/manifest.json +168 -0
  201. package/dist/web/table/table-body.svelte +23 -0
  202. package/dist/web/table/table-body.svelte.d.ts +36 -0
  203. package/dist/web/table/table-caption.svelte +23 -0
  204. package/dist/web/table/table-caption.svelte.d.ts +36 -0
  205. package/dist/web/table/table-cell.svelte +35 -0
  206. package/dist/web/table/table-cell.svelte.d.ts +57 -0
  207. package/dist/web/table/table-empty.svelte +56 -0
  208. package/dist/web/table/table-empty.svelte.d.ts +65 -0
  209. package/dist/web/table/table-footer.svelte +23 -0
  210. package/dist/web/table/table-footer.svelte.d.ts +36 -0
  211. package/dist/web/table/table-head.svelte +39 -0
  212. package/dist/web/table/table-head.svelte.d.ts +58 -0
  213. package/dist/web/table/table-header.svelte +23 -0
  214. package/dist/web/table/table-header.svelte.d.ts +36 -0
  215. package/dist/web/table/table-row.svelte +33 -0
  216. package/dist/web/table/table-row.svelte.d.ts +52 -0
  217. package/dist/web/table/table.css +1 -0
  218. package/dist/web/table/table.svelte +178 -0
  219. package/dist/web/table/table.svelte.d.ts +120 -0
  220. package/dist/web/tabs/AI_GUIDE.md +150 -0
  221. package/dist/web/tabs/index.d.ts +2 -0
  222. package/dist/web/tabs/index.js +2 -0
  223. package/dist/web/tabs/manifest.json +315 -0
  224. package/dist/web/tabs/tabs.css +1 -0
  225. package/dist/web/tabs/tabs.svelte +138 -0
  226. package/dist/web/tabs/tabs.svelte.d.ts +204 -0
  227. package/dist/web/text/AI_GUIDE.md +129 -0
  228. package/dist/web/text/index.d.ts +2 -0
  229. package/dist/web/text/index.js +2 -0
  230. package/dist/web/text/manifest.json +195 -0
  231. package/dist/web/text/text.css +1 -0
  232. package/dist/web/text/text.svelte +515 -0
  233. package/dist/web/text/text.svelte.d.ts +168 -0
  234. package/dist/web/textarea/AI_GUIDE.md +141 -0
  235. package/dist/web/textarea/index.d.ts +2 -0
  236. package/dist/web/textarea/index.js +2 -0
  237. package/dist/web/textarea/manifest.json +438 -0
  238. package/dist/web/textarea/textarea.css +1 -0
  239. package/dist/web/textarea/textarea.svelte +224 -0
  240. package/dist/web/textarea/textarea.svelte.d.ts +274 -0
  241. package/dist/web/tooltip/AI_GUIDE.md +110 -0
  242. package/dist/web/tooltip/index.d.ts +2 -0
  243. package/dist/web/tooltip/index.js +2 -0
  244. package/dist/web/tooltip/manifest.json +222 -0
  245. package/dist/web/tooltip/tooltip.css +1 -0
  246. package/dist/web/tooltip/tooltip.svelte +292 -0
  247. package/dist/web/tooltip/tooltip.svelte.d.ts +140 -0
  248. package/dist/webview/bottomsheet/AI_GUIDE.md +141 -0
  249. package/dist/webview/bottomsheet/bottomsheet.css +1 -0
  250. package/dist/webview/bottomsheet/bottomsheet.svelte +462 -0
  251. package/dist/webview/bottomsheet/bottomsheet.svelte.d.ts +200 -0
  252. package/dist/webview/bottomsheet/index.d.ts +4 -0
  253. package/dist/webview/bottomsheet/index.js +3 -0
  254. package/dist/webview/bottomsheet/manifest.json +377 -0
  255. package/dist/webview/button/AI_GUIDE.md +79 -0
  256. package/dist/webview/button/button-ios.css +1 -0
  257. package/dist/webview/button/button-ios.svelte +58 -0
  258. package/dist/webview/button/button-ios.svelte.d.ts +114 -0
  259. package/dist/webview/button/button-material.css +1 -0
  260. package/dist/webview/button/button-material.svelte +58 -0
  261. package/dist/webview/button/button-material.svelte.d.ts +114 -0
  262. package/dist/webview/button/index.d.ts +6 -0
  263. package/dist/webview/button/index.js +4 -0
  264. package/dist/webview/button/manifest.json +148 -0
  265. package/dist/webview/index.d.ts +6 -0
  266. package/dist/webview/index.js +6 -0
  267. package/llms.txt +6518 -0
  268. package/package.json +709 -4
  269. package/ttdk-manifest.json +10188 -0
  270. package/README.md +0 -3
@@ -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,113 @@
1
+ <script context="module"></script>
2
+
3
+ <script>import { createEventDispatcher } from "svelte";
4
+ import { buildUiVars, UiProps } from "../../core/types";
5
+ export let className = void 0;
6
+ export let variant = void 0;
7
+ export let appearance = void 0;
8
+ export let size = void 0;
9
+ export let rounded = void 0;
10
+ export let selected = void 0;
11
+ export let disabled = void 0;
12
+ export let ui = void 0;
13
+ const dispatch = createEventDispatcher();
14
+ export let onClick = void 0;
15
+ export let label = void 0;
16
+ export let labelClass = void 0;
17
+ export let labelStyle = void 0;
18
+ export let closable = void 0;
19
+ export let closableClass = void 0;
20
+ export let closableStyle = void 0;
21
+ export let onClose = void 0;
22
+ function stringifyStyles(stylesObj) {
23
+ let styles = "";
24
+ for (let key in stylesObj) {
25
+ const dashedKey = key.replace(/[A-Z]/g, function(match) {
26
+ return "-" + match.toLowerCase();
27
+ });
28
+ styles += dashedKey + ":" + stylesObj[key] + ";";
29
+ }
30
+ return styles;
31
+ }
32
+ </script>
33
+
34
+ <button
35
+ style={stringifyStyles({
36
+ ...buildUiVars(ui),
37
+ ...(ui?.border
38
+ ? {
39
+ border: ui.border,
40
+ }
41
+ : {}),
42
+ ...(ui?.borderColor
43
+ ? {
44
+ borderColor: ui.borderColor,
45
+ }
46
+ : {}),
47
+ ...(ui?.borderWidth
48
+ ? {
49
+ borderWidth: ui.borderWidth,
50
+ }
51
+ : {}),
52
+ ...(ui?.borderStyle
53
+ ? {
54
+ borderStyle: ui.borderStyle,
55
+ }
56
+ : {}),
57
+ ...(ui?.borderRadius
58
+ ? {
59
+ borderRadius: ui.borderRadius,
60
+ }
61
+ : {}),
62
+ })}
63
+ type="button"
64
+ class={`ttdk-chip ${className || ""}`.trim()}
65
+ data-variant={variant || "primary"}
66
+ data-appearance={appearance || "soft"}
67
+ data-size={size || "md"}
68
+ data-rounded={rounded || "full"}
69
+ data-selected={selected !== undefined
70
+ ? selected
71
+ ? "true"
72
+ : "false"
73
+ : undefined}
74
+ data-disabled={disabled || variant === "disabled" ? "true" : "false"}
75
+ on:click={(event) => {
76
+ if (disabled || variant === "disabled") return;
77
+ onClick?.(event);
78
+ dispatch("click", event);
79
+ }}
80
+ ><slot />
81
+ {#if label}
82
+ <span
83
+ style={stringifyStyles({
84
+ ...buildUiVars(labelStyle),
85
+ })}
86
+ class={`ttdk-chip-label ${labelClass || ""}`.trim()}>{label}</span
87
+ >
88
+ {/if}
89
+ {#if closable}
90
+ <span
91
+ style={stringifyStyles({
92
+ ...buildUiVars(closableStyle),
93
+ })}
94
+ role="button"
95
+ aria-label="Hapus chip"
96
+ tabIndex={0}
97
+ class={`ttdk-chip-close ${closableClass || ""}`.trim()}
98
+ on:click={(event) => {
99
+ event.stopPropagation();
100
+ if (disabled) return;
101
+ onClose?.(event);
102
+ }}
103
+ ><svg viewBox="0 0 24 24"
104
+ ><line x1="18" y1="6" x2="6" y2="18" /><line
105
+ x1="6"
106
+ y1="6"
107
+ x2="18"
108
+ y2="18"
109
+ /></svg
110
+ ></span
111
+ >
112
+ {/if}</button
113
+ >
@@ -0,0 +1,145 @@
1
+ import { SvelteComponent } from "svelte";
2
+ export type ChipUiProps = UiProps;
3
+ export interface ChipProps {
4
+ /**
5
+ * Teks label yang ditampilkan pada chip.
6
+ */
7
+ label?: string;
8
+ /**
9
+ * Status apakah chip sedang dalam kondisi terpilih (selected).
10
+ *
11
+ * @default false
12
+ */
13
+ selected?: boolean;
14
+ /**
15
+ * Varian warna semantik tema chip:
16
+ * - `'primary'`: Brand Teal utama (#00B5AD).
17
+ * - `'success'`: Sukses hijau (#04B761).
18
+ * - `'info'`: Biru informasi (#2196F3).
19
+ * - `'warning'`: Peringatan kuning / amber (#F88000).
20
+ * - `'danger'`: Bahaya / merah (#D0021B).
21
+ * - `'neutral'`: Netral abu-abu.
22
+ * - `'disabled'`: Status nonaktif (disabled).
23
+ *
24
+ * @default 'primary'
25
+ */
26
+ variant?: "primary" | "success" | "info" | "warning" | "danger" | "neutral" | "disabled";
27
+ /**
28
+ * Tipe tampilan visual chip:
29
+ * - `'soft'`: Background warna transparan lembut (default).
30
+ * - `'solid'`: Background warna solid pekat.
31
+ * - `'outline'`: Border tipis dengan background transparan.
32
+ *
33
+ * @default 'soft'
34
+ */
35
+ appearance?: "soft" | "solid" | "outline";
36
+ /**
37
+ * Skala ukuran chip:
38
+ * - `'sm'`: Tinggi 28px, font 12px.
39
+ * - `'md'`: Tinggi 32px, font 13px (standar).
40
+ * - `'lg'`: Tinggi 38px, font 15px.
41
+ *
42
+ * @default 'md'
43
+ */
44
+ size?: "sm" | "md" | "lg";
45
+ /**
46
+ * Bentuk sudut kelengkungan:
47
+ * - `'full'`: Bentuk kapsul / pill 9999px (default).
48
+ * - `'none'`: Persegi lancip 0px.
49
+ * - `'sm'`: Sudut melengkung halus 4px.
50
+ * - `'md'`: Sudut melengkung sedang 6px.
51
+ * - `'lg'`: Sudut melengkung besar 8px.
52
+ *
53
+ * @default 'full'
54
+ */
55
+ rounded?: "none" | "sm" | "md" | "lg" | "full";
56
+ /**
57
+ * Menampilkan tombol silang (x) untuk menghapus / menutup chip.
58
+ *
59
+ * @default false
60
+ */
61
+ closable?: boolean;
62
+ /**
63
+ * Menonaktifkan interaksi klik pada chip.
64
+ *
65
+ * @default false
66
+ */
67
+ disabled?: boolean;
68
+ /**
69
+ * Kustomisasi visual granular melalui style-like object (+ support pseudo-class: hover, active).
70
+ */
71
+ ui?: UiProps;
72
+ /**
73
+ * Inline CSS style object native.
74
+ */
75
+ style?: any;
76
+ /**
77
+ * Style kustom untuk teks label chip (UiProps).
78
+ */
79
+ labelStyle?: UiProps;
80
+ /**
81
+ * Class CSS kustom untuk teks label chip (Tailwind / class kustom).
82
+ */
83
+ labelClass?: string;
84
+ /**
85
+ * Style kustom untuk tombol tutup chip (UiProps).
86
+ */
87
+ closableStyle?: UiProps;
88
+ /**
89
+ * Class CSS kustom untuk tombol tutup chip (Tailwind / class kustom).
90
+ */
91
+ closableClass?: string;
92
+ /**
93
+ * Event handler saat chip diklik (toggle select atau trigger aksi).
94
+ */
95
+ onClick?: (event?: any) => void;
96
+ /**
97
+ * Event handler saat tombol close (x) diklik.
98
+ */
99
+ onClose?: (event?: any) => void;
100
+ /**
101
+ * Class CSS kustom.
102
+ */
103
+ className?: string;
104
+ /**
105
+ * Konten kustom / icon kustom yang disisipkan di dalam chip.
106
+ */
107
+ children?: any;
108
+ }
109
+ import { UiProps } from "../../core/types";
110
+ declare const __propDef: {
111
+ props: {
112
+ className?: ChipProps["className"];
113
+ variant?: ChipProps["variant"];
114
+ appearance?: ChipProps["appearance"];
115
+ size?: ChipProps["size"];
116
+ rounded?: ChipProps["rounded"];
117
+ selected?: ChipProps["selected"];
118
+ disabled?: ChipProps["disabled"];
119
+ ui?: ChipProps["ui"];
120
+ onClick?: ChipProps["onClick"];
121
+ label?: ChipProps["label"];
122
+ labelClass?: ChipProps["labelClass"];
123
+ labelStyle?: ChipProps["labelStyle"];
124
+ closable?: ChipProps["closable"];
125
+ closableClass?: ChipProps["closableClass"];
126
+ closableStyle?: ChipProps["closableStyle"];
127
+ onClose?: ChipProps["onClose"];
128
+ };
129
+ events: {
130
+ click: CustomEvent<any>;
131
+ } & {
132
+ [evt: string]: CustomEvent<any>;
133
+ };
134
+ slots: {
135
+ default: {};
136
+ };
137
+ exports?: {} | undefined;
138
+ bindings?: string | undefined;
139
+ };
140
+ type ChipProps_ = typeof __propDef.props;
141
+ export type ChipEvents = typeof __propDef.events;
142
+ export type ChipSlots = typeof __propDef.slots;
143
+ export default class Chip extends SvelteComponent<ChipProps_, ChipEvents, ChipSlots> {
144
+ }
145
+ export {};
@@ -0,0 +1,2 @@
1
+ export { default } from './chip.svelte';
2
+ export { default as Chip } from './chip.svelte';
@@ -0,0 +1,2 @@
1
+ export { default } from './chip.svelte';
2
+ export { default as Chip } from './chip.svelte';
@@ -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
+ }
@@ -0,0 +1,167 @@
1
+ # <Dropdown /> — TTDK Component Reference
2
+
3
+ Komponen Dropdown Menu TTDK sesuai spesifikasi Desain: - Selaras UI & Props dengan Selectbox: Label, Helper/Error text, Search bar, Floating popover - Mode Single Select / Menu Actions dengan Active Teal Checkmark (#00A3A6) - Mode Multi-Select dengan Checkbox list, Chip tags (Label ✕), dan Action footer (Reset & Terapkan) - Varian trigger fleksibel: 'select' (standar form), 'action' / 'primary' (tombol aksi), 'outline', 'ghost' - Dukungan Trigger Kustom melalui Slot / Children (misal: tombol kustom) - Dukungan item kaya: Icon, Deskripsi, Divider pemisah seksi, dan Danger item
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/dropdown/dropdown.css";`
8
+
9
+ ## 2. Subpath Component Import
10
+ ```ts
11
+ // React
12
+ import Dropdown from "@ttdk-design-system/library-react/web/dropdown";
13
+
14
+ // Vue 3
15
+ import Dropdown from "@ttdk-design-system/library-vue/web/dropdown";
16
+
17
+ // Svelte
18
+ import Dropdown from "@ttdk-design-system/library-svelte/web/dropdown";
19
+ ```
20
+
21
+ ## 3. Props & API Reference
22
+
23
+ | Prop | Type | Default | Description |
24
+ | :--- | :--- | :--- | :--- |
25
+ | `label?` | `string` | `-` | Teks label judul field yang ditampilkan di atas dropdown (14px Semibold, #141313). |
26
+ | `optional?` | `boolean` | `false` | Menandai field sebagai opsi opsional dengan menambahkan teks '(Opsional)' (12px Regular, #9698A2). |
27
+ | `optionalText?` | `string` | `(Opsional)` | Kustomisasi teks keterangan opsional. |
28
+ | `placeholder?` | `string` | `Pilih dropdown menu` | Teks petunjuk saat belum ada opsi yang dipilih. |
29
+ | `value?` | `any` | `-` | Nilai terpilih saat ini (single string/number atau array nilai untuk mode multiple). |
30
+ | `defaultValue?` | `any` | `-` | Nilai awal tidak terkontrol (uncontrolled initial value). |
31
+ | `options?` | `Array<DropdownOption | string>` | `-` | Daftar pilihan opsi dropdown menu. Dapat berupa array of object `{ label, value }` atau array of string. |
32
+ | `multiple?` | `boolean` | `false` | Mode pemilihan jamak (multi-select) dengan tampilan chips/tag dan daftar checkbox. |
33
+ | `searchable?` | `boolean` | `false` | Mengaktifkan kotak pencarian (search input) di dalam menu dropdown. |
34
+ | `searchPlaceholder?` | `string` | `Cari` | Placeholder pada kotak pencarian di dalam dropdown. |
35
+ | `applyText?` | `string` | `Terapkan` | Teks tombol terapkan pada footer multi-select. |
36
+ | `resetText?` | `string` | `Reset` | Teks tombol reset pada footer multi-select. |
37
+ | `name?` | `string` | `-` | Nama form field HTML. |
38
+ | `id?` | `string` | `-` | Identifier unik elemen dropdown. |
39
+ | `error?` | `boolean` | `false` | Status apakah dropdown sedang dalam kondisi error / tidak valid. |
40
+ | `errorMessage?` | `string` | `-` | Pesan teks penjelasan kesalahan validasi di bawah field. |
41
+ | `helperText?` | `string` | `-` | Teks petunjuk atau keterangan bantuan di bawah field (12px Regular, #3C4245). |
42
+ | `helperTextPosition?` | `'top' | 'bottom'` | `-` | Posisi teks helper |
43
+ | `size?` | `'sm' | 'md' | 'lg'` | `md` | Skala ukuran dropdown. - `'sm'`: 36px - `'md'`: 48px (standar desain) - `'lg'`: 56px |
44
+ | `rounded?` | `'none' | 'sm' | 'md' | 'lg' | 'full'` | `md` | Bentuk sudut kelengkungan dropdown. - `'none'`: 0px - `'sm'`: 4px - `'md'`: 8px (standar desain) - `'lg'`: 12px - `'full'`: 9999px (kapsul) |
45
+ | `placement?` | `| 'bottom-start'
46
+ | 'bottom-end'
47
+ | 'bottom'
48
+ | 'top-start'
49
+ | 'top-end'
50
+ | 'top'` | `bottom-start` | Posisi penempatan panel menu dropdown popover terhadap elemen trigger. |
51
+ | `arrow?` | `boolean` | `true` | Menampilkan panah chevron indikator buka/tutup pada trigger. |
52
+ | `icon?` | `any` | `-` | Ikon kustom di awal teks trigger (leading icon). |
53
+ | `closeOnSelect?` | `boolean` | `true` | Otomatis menutup menu popover setelah pengguna memilih opsi (pada single select). |
54
+ | `block?` | `boolean` | `false` | Menjadikan lebar field dropdown memenuhi kontainer penuh (full-width 100%). |
55
+ | `disabled?` | `boolean` | `false` | Status apakah dropdown dinonaktifkan (disabled). |
56
+ | `required?` | `boolean` | `false` | Menandai field sebagai input wajib diisi (menampilkan tanda bintang merah *). |
57
+ | `inputRef?` | `any` | `-` | Ref instance elemen control dropdown untuk akses DOM langsung. |
58
+ | `clearable?` | `boolean` | `false` | Menampilkan tombol × untuk menghapus pilihan yang sudah dipilih. |
59
+ | `loading?` | `boolean` | `false` | Menampilkan spinner loading dan menonaktifkan interaksi dropdown. |
60
+ | `readOnly?` | `boolean` | `false` | Menjadikan dropdown hanya-baca (tidak bisa dibuka/diubah). |
61
+ | `ui?` | `DropdownUiProps` | `-` | Kustomisasi visual granular wrapper utama (UiProps). |
62
+ | `style?` | `any` | `-` | Style inline native untuk wrapper luar. |
63
+ | `labelStyle?` | `UiProps` | `-` | Style kustom untuk elemen label (UiProps). |
64
+ | `labelClass?` | `string` | `-` | Class CSS kustom untuk elemen label (Tailwind / class kustom). |
65
+ | `controlStyle?` | `UiProps` | `-` | Style kustom untuk elemen kotak pemicu (control trigger) (UiProps). |
66
+ | `controlClass?` | `string` | `-` | Class CSS kustom untuk elemen kotak pemicu (control trigger) (Tailwind / class kustom). |
67
+ | `listStyle?` | `UiProps` | `-` | Style kustom untuk panel popover / menu list opsi (UiProps). |
68
+ | `listClass?` | `string` | `-` | Class CSS kustom untuk panel popover / menu list opsi (Tailwind / class kustom). |
69
+ | `errorMessageStyle?` | `UiProps` | `-` | Style kustom untuk pesan teks error validasi (UiProps). |
70
+ | `errorMessageClass?` | `string` | `-` | Class CSS kustom untuk pesan teks error validasi (Tailwind / class kustom). |
71
+ | `helperTextStyle?` | `UiProps` | `-` | Style kustom untuk teks petunjuk bantuan (UiProps). |
72
+ | `helperTextClass?` | `string` | `-` | Class CSS kustom untuk teks petunjuk bantuan (Tailwind / class kustom). |
73
+ | `onChange?` | `(value: any) => void` | `-` | Callback event saat nilai pilihan berubah. |
74
+ | `onSelect?` | `(option: DropdownOption) => void` | `-` | Callback event saat sebuah opsi dipilih dari menu. |
75
+ | `onSearch?` | `(query: string) => void` | `-` | Callback event saat pengguna mengetik di kolom pencarian. |
76
+ | `onOpen?` | `() => void` | `-` | Callback event saat menu dropdown terbuka. |
77
+ | `onClose?` | `() => void` | `-` | Callback event saat menu dropdown ditutup. |
78
+ | `disableShift?` | `boolean` | `false` | Menonaktifkan middleware `shift` pada floating-ui sehingga posisi list popover tidak bergeser secara horizontal mengikuti tepi layar. Berguna saat ingin list tetap berada di tengah atau posisi placement yang ditentukan. |
79
+ | `className?` | `string` | `-` | Class CSS kustom wrapper luar. |
80
+ | `children?` | `any` | `-` | Elemen pemicu (trigger) kustom, tombol, ikon, atau komponen anak lainnya. |
81
+ | `panelContent?` | `any` | `-` | Konten kustom yang ditampilkan di dalam panel popover menggantikan list opsi standar. Berguna untuk menampilkan komponen seperti Calendar, Color Picker, dsb. di dalam Dropdown. Ketika prop ini di-set, `options` tidak akan dirender. Menerima ReactNode atau render function `({ close }) => ReactNode`. |
82
+ | `displayValue?` | `string` | `-` | Label atau teks kustom untuk ditampilkan pada trigger dropdown. Sangat berguna saat menggunakan `panelContent` seperti Date Picker di mana nilai trigger diformat secara kustom. |
83
+
84
+ ### Sub-interface: `DropdownOption`
85
+
86
+ | Field | Type | Default | Description |
87
+ | :--- | :--- | :--- | :--- |
88
+ | `label` | `string` | `-` | Teks label tampilan pilihan dropdown menu. |
89
+ | `value` | `string | number` | `-` | Nilai unik (value) dari item dropdown. |
90
+ | `disabled?` | `boolean` | `false` | Status apakah opsi ini dinonaktifkan dari pemilihan. |
91
+ | `icon?` | `any` | `-` | Ikon kustom di samping label item pilihan. |
92
+ | `description?` | `string` | `-` | Deskripsi atau teks bantuan kecil di bawah label item pilihan. |
93
+ | `danger?` | `boolean` | `false` | Menandai item sebagai aksi berbahaya/destruktif (misal: "Hapus"), ditampilkan dengan warna aksen merah. |
94
+ | `divider?` | `boolean` | `false` | Menampilkan garis pemisah horizontal (divider) di atas item ini. |
95
+ | `onClick?` | `(option?: DropdownOption) => void` | `-` | Callback event saat item ini diklik. |
96
+
97
+ ## 4. Usage Examples
98
+
99
+ ### React Example
100
+ ```tsx
101
+ import Dropdown from "@ttdk-design-system/library-react/web/dropdown";
102
+ import "@ttdk-design-system/library-react/web/dropdown/dropdown.css";
103
+
104
+ export function Example() {
105
+ const options = [
106
+ { label: "Unduh Rekap FHIR (JSON)", value: "json" },
107
+ { label: "Ekspor Laporan (CSV)", value: "csv" },
108
+ { label: "Kirim ke SATUSEHAT", value: "sync" },
109
+ { label: "Hapus Data Pasien", value: "delete", danger: true, divider: true }
110
+ ];
111
+
112
+ return (
113
+ <Dropdown
114
+ label="Aksi Tindakan"
115
+ placeholder="Pilih tindakan klinis..."
116
+ options={options}
117
+ onChange={(val) => console.log("Aksi terpilih:", val)}
118
+ />
119
+ );
120
+ }
121
+ ```
122
+
123
+ ### Vue 3 Example
124
+ ```vue
125
+ <script setup lang="ts">
126
+ import Dropdown from "@ttdk-design-system/library-vue/web/dropdown";
127
+ import "@ttdk-design-system/library-vue/web/dropdown/dropdown.css";
128
+
129
+ const options = [
130
+ { label: "Unduh Rekap FHIR (JSON)", value: "json" },
131
+ { label: "Ekspor Laporan (CSV)", value: "csv" },
132
+ { label: "Kirim ke SATUSEHAT", value: "sync" },
133
+ { label: "Hapus Data Pasien", value: "delete", danger: true, divider: true }
134
+ ];
135
+ </script>
136
+
137
+ <template>
138
+ <Dropdown
139
+ label="Aksi Tindakan"
140
+ placeholder="Pilih tindakan klinis..."
141
+ :options="options"
142
+ @change="(val: any) => console.log('Aksi terpilih:', val)"
143
+ />
144
+ </template>
145
+ ```
146
+
147
+ ### Svelte Example
148
+ ```svelte
149
+ <script lang="ts">
150
+ import Dropdown from "@ttdk-design-system/library-svelte/web/dropdown";
151
+ import "@ttdk-design-system/library-svelte/web/dropdown/dropdown.css";
152
+
153
+ const options = [
154
+ { label: "Unduh Rekap FHIR (JSON)", value: "json" },
155
+ { label: "Ekspor Laporan (CSV)", value: "csv" },
156
+ { label: "Kirim ke SATUSEHAT", value: "sync" },
157
+ { label: "Hapus Data Pasien", value: "delete", danger: true, divider: true }
158
+ ];
159
+ </script>
160
+
161
+ <Dropdown
162
+ label="Aksi Tindakan"
163
+ placeholder="Pilih tindakan klinis..."
164
+ {options}
165
+ on:change={(e) => console.log('Aksi terpilih:', e.detail)}
166
+ />
167
+ ```