@ttdk-design-system/library-react 0.0.0-stage → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/AI_GUIDE.md +6518 -0
  2. package/README.md +106 -2
  3. package/llms.txt +6518 -0
  4. package/package.json +1099 -4
  5. package/src/core/index.ts +2 -0
  6. package/src/core/tailwind-preset.cjs +62 -0
  7. package/src/core/tailwind-preset.ts +85 -0
  8. package/src/core/theme/tokens.css +663 -0
  9. package/src/core/types.ts +836 -0
  10. package/src/index.ts +17 -0
  11. package/src/tailwind-preset.cjs +62 -0
  12. package/src/tailwind-preset.ts +85 -0
  13. package/src/types.ts +1 -0
  14. package/src/web/accordion/AI_GUIDE.md +149 -0
  15. package/src/web/accordion/accordion.css +1 -0
  16. package/src/web/accordion/accordion.tsx +430 -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.tsx +318 -0
  22. package/src/web/alert/index.ts +3 -0
  23. package/src/web/alert/manifest.json +240 -0
  24. package/src/web/avatar/AI_GUIDE.md +118 -0
  25. package/src/web/avatar/avatar.css +1 -0
  26. package/src/web/avatar/avatar.tsx +233 -0
  27. package/src/web/avatar/index.ts +3 -0
  28. package/src/web/avatar/manifest.json +195 -0
  29. package/src/web/badge/AI_GUIDE.md +94 -0
  30. package/src/web/badge/badge.css +1 -0
  31. package/src/web/badge/badge.tsx +140 -0
  32. package/src/web/badge/index.ts +2 -0
  33. package/src/web/badge/manifest.json +141 -0
  34. package/src/web/banner/AI_GUIDE.md +130 -0
  35. package/src/web/banner/banner.css +1 -0
  36. package/src/web/banner/banner.tsx +334 -0
  37. package/src/web/banner/index.ts +3 -0
  38. package/src/web/banner/manifest.json +240 -0
  39. package/src/web/breadcrumb/AI_GUIDE.md +120 -0
  40. package/src/web/breadcrumb/breadcrumb.css +1 -0
  41. package/src/web/breadcrumb/breadcrumb.tsx +306 -0
  42. package/src/web/breadcrumb/index.ts +3 -0
  43. package/src/web/breadcrumb/manifest.json +225 -0
  44. package/src/web/button/AI_GUIDE.md +121 -0
  45. package/src/web/button/button.css +1 -0
  46. package/src/web/button/button.tsx +287 -0
  47. package/src/web/button/index.ts +2 -0
  48. package/src/web/button/manifest.json +177 -0
  49. package/src/web/calendar/AI_GUIDE.md +151 -0
  50. package/src/web/calendar/calendar.css +1 -0
  51. package/src/web/calendar/calendar.tsx +1611 -0
  52. package/src/web/calendar/index.ts +3 -0
  53. package/src/web/calendar/manifest.json +470 -0
  54. package/src/web/card/AI_GUIDE.md +133 -0
  55. package/src/web/card/card.css +1 -0
  56. package/src/web/card/card.tsx +408 -0
  57. package/src/web/card/index.ts +4 -0
  58. package/src/web/card/manifest.json +357 -0
  59. package/src/web/checkbox/AI_GUIDE.md +146 -0
  60. package/src/web/checkbox/checkbox.css +1 -0
  61. package/src/web/checkbox/checkbox.tsx +307 -0
  62. package/src/web/checkbox/index.ts +2 -0
  63. package/src/web/checkbox/manifest.json +294 -0
  64. package/src/web/chip/AI_GUIDE.md +186 -0
  65. package/src/web/chip/chip.css +1 -0
  66. package/src/web/chip/chip.tsx +230 -0
  67. package/src/web/chip/index.ts +2 -0
  68. package/src/web/chip/manifest.json +186 -0
  69. package/src/web/dropdown/AI_GUIDE.md +167 -0
  70. package/src/web/dropdown/dropdown.css +1 -0
  71. package/src/web/dropdown/dropdown.tsx +1274 -0
  72. package/src/web/dropdown/index.ts +3 -0
  73. package/src/web/dropdown/manifest.json +576 -0
  74. package/src/web/flex/AI_GUIDE.md +113 -0
  75. package/src/web/flex/flex-item.tsx +97 -0
  76. package/src/web/flex/flex.css +1 -0
  77. package/src/web/flex/flex.tsx +108 -0
  78. package/src/web/flex/index.ts +5 -0
  79. package/src/web/flex/manifest.json +162 -0
  80. package/src/web/form/index.ts +7 -0
  81. package/src/web/grid/AI_GUIDE.md +112 -0
  82. package/src/web/grid/grid-item.tsx +112 -0
  83. package/src/web/grid/grid.css +1 -0
  84. package/src/web/grid/grid.tsx +99 -0
  85. package/src/web/grid/index.ts +5 -0
  86. package/src/web/grid/manifest.json +153 -0
  87. package/src/web/index.ts +86 -0
  88. package/src/web/input/AI_GUIDE.md +159 -0
  89. package/src/web/input/index.ts +3 -0
  90. package/src/web/input/input.css +1 -0
  91. package/src/web/input/input.tsx +537 -0
  92. package/src/web/input/manifest.json +465 -0
  93. package/src/web/input-number/AI_GUIDE.md +164 -0
  94. package/src/web/input-number/index.ts +3 -0
  95. package/src/web/input-number/input-number.css +1 -0
  96. package/src/web/input-number/input-number.tsx +1193 -0
  97. package/src/web/input-number/manifest.json +575 -0
  98. package/src/web/modal/AI_GUIDE.md +171 -0
  99. package/src/web/modal/index.ts +3 -0
  100. package/src/web/modal/manifest.json +375 -0
  101. package/src/web/modal/modal.css +1 -0
  102. package/src/web/modal/modal.tsx +571 -0
  103. package/src/web/pagination/AI_GUIDE.md +148 -0
  104. package/src/web/pagination/index.ts +21 -0
  105. package/src/web/pagination/manifest.json +432 -0
  106. package/src/web/pagination/pagination-content.tsx +45 -0
  107. package/src/web/pagination/pagination-ellipsis.tsx +54 -0
  108. package/src/web/pagination/pagination-first.tsx +155 -0
  109. package/src/web/pagination/pagination-item.tsx +45 -0
  110. package/src/web/pagination/pagination-last.tsx +155 -0
  111. package/src/web/pagination/pagination-link.tsx +121 -0
  112. package/src/web/pagination/pagination-next.tsx +158 -0
  113. package/src/web/pagination/pagination-previous.tsx +158 -0
  114. package/src/web/pagination/pagination.css +1 -0
  115. package/src/web/pagination/pagination.tsx +687 -0
  116. package/src/web/popover/AI_GUIDE.md +163 -0
  117. package/src/web/popover/index.ts +3 -0
  118. package/src/web/popover/manifest.json +396 -0
  119. package/src/web/popover/popover.css +1 -0
  120. package/src/web/popover/popover.tsx +702 -0
  121. package/src/web/radio/AI_GUIDE.md +155 -0
  122. package/src/web/radio/index.ts +2 -0
  123. package/src/web/radio/manifest.json +294 -0
  124. package/src/web/radio/radio.css +1 -0
  125. package/src/web/radio/radio.tsx +290 -0
  126. package/src/web/selectbox/AI_GUIDE.md +216 -0
  127. package/src/web/selectbox/index.ts +3 -0
  128. package/src/web/selectbox/manifest.json +477 -0
  129. package/src/web/selectbox/selectbox.css +1 -0
  130. package/src/web/selectbox/selectbox.tsx +1048 -0
  131. package/src/web/sonner/AI_GUIDE.md +98 -0
  132. package/src/web/sonner/index.ts +114 -0
  133. package/src/web/sonner/manifest.json +132 -0
  134. package/src/web/sonner/sonner.css +1 -0
  135. package/src/web/sonner/sonner.tsx +177 -0
  136. package/src/web/table/AI_GUIDE.md +145 -0
  137. package/src/web/table/index.ts +35 -0
  138. package/src/web/table/manifest.json +168 -0
  139. package/src/web/table/table-body.tsx +45 -0
  140. package/src/web/table/table-caption.tsx +45 -0
  141. package/src/web/table/table-cell.tsx +74 -0
  142. package/src/web/table/table-empty.tsx +108 -0
  143. package/src/web/table/table-footer.tsx +45 -0
  144. package/src/web/table/table-head.tsx +80 -0
  145. package/src/web/table/table-header.tsx +45 -0
  146. package/src/web/table/table-row.tsx +69 -0
  147. package/src/web/table/table.css +1 -0
  148. package/src/web/table/table.tsx +305 -0
  149. package/src/web/tabs/AI_GUIDE.md +150 -0
  150. package/src/web/tabs/index.ts +3 -0
  151. package/src/web/tabs/manifest.json +315 -0
  152. package/src/web/tabs/tabs.css +1 -0
  153. package/src/web/tabs/tabs.tsx +332 -0
  154. package/src/web/text/AI_GUIDE.md +129 -0
  155. package/src/web/text/index.ts +3 -0
  156. package/src/web/text/manifest.json +195 -0
  157. package/src/web/text/text.css +1 -0
  158. package/src/web/text/text.tsx +689 -0
  159. package/src/web/textarea/AI_GUIDE.md +141 -0
  160. package/src/web/textarea/index.ts +3 -0
  161. package/src/web/textarea/manifest.json +438 -0
  162. package/src/web/textarea/textarea.css +1 -0
  163. package/src/web/textarea/textarea.tsx +467 -0
  164. package/src/web/tooltip/AI_GUIDE.md +110 -0
  165. package/src/web/tooltip/index.ts +3 -0
  166. package/src/web/tooltip/manifest.json +222 -0
  167. package/src/web/tooltip/tooltip.css +1 -0
  168. package/src/web/tooltip/tooltip.tsx +423 -0
  169. package/src/webview/bottomsheet/AI_GUIDE.md +141 -0
  170. package/src/webview/bottomsheet/bottomsheet.css +1 -0
  171. package/src/webview/bottomsheet/bottomsheet.tsx +603 -0
  172. package/src/webview/bottomsheet/index.ts +4 -0
  173. package/src/webview/bottomsheet/manifest.json +377 -0
  174. package/src/webview/button/AI_GUIDE.md +79 -0
  175. package/src/webview/button/button-ios.css +1 -0
  176. package/src/webview/button/button-ios.tsx +138 -0
  177. package/src/webview/button/button-material.css +1 -0
  178. package/src/webview/button/button-material.tsx +138 -0
  179. package/src/webview/button/index.ts +7 -0
  180. package/src/webview/button/manifest.json +148 -0
  181. package/src/webview/index.ts +7 -0
  182. package/tailwind-preset.cjs +62 -0
  183. package/tailwind-preset.js +62 -0
  184. package/ttdk-manifest.json +10188 -0
@@ -0,0 +1 @@
1
+ .ttdk-avatar{border-radius:var(--ttdk-radius-full,9999px);background-color:var(--ttdk-color-blue-100,#ecf3fe);width:40px;height:40px;color:var(--ttdk-text-icon-status-info,#0968f6);font-family:var(--ttdk-font-sans,"Manrope", sans-serif);box-sizing:border-box;user-select:none;vertical-align:middle;flex-shrink:0;justify-content:center;align-items:center;line-height:1;transition:opacity .15s cubic-bezier(.4,0,.2,1),transform .15s cubic-bezier(.4,0,.2,1);display:inline-flex;position:relative;overflow:visible}.ttdk-avatar[data-interactive=true]{cursor:pointer}.ttdk-avatar[data-interactive=true]:hover{opacity:.9}.ttdk-avatar[data-interactive=true]:focus-visible{outline:2px solid var(--ttdk-stroke-border-focus,#16b3ac);outline-offset:2px}.ttdk-avatar[data-disabled=true]{opacity:.55;cursor:not-allowed;pointer-events:none}.ttdk-avatar-image{object-fit:cover;border-radius:inherit;width:100%;height:100%;display:block}.ttdk-avatar-initials{font-weight:var(--ttdk-font-weight-medium,500);letter-spacing:.01em;text-transform:uppercase;color:inherit;justify-content:center;align-items:center;line-height:1;display:inline-flex}.ttdk-avatar-icon{color:var(--ttdk-ui-icon-color,var(--ttdk-text-icon-primary,#141313));justify-content:center;align-items:center;line-height:0;display:inline-flex}.ttdk-avatar-icon:before{content:"";background-color:currentColor;width:20px;height:20px;display:inline-block;-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath stroke='none' d='M0 0h24v24H0z' fill='none'/%3E%3Cpath d='M8 7a4 4 0 1 0 8 0a4 4 0 0 0 -8 0'/%3E%3Cpath d='M6 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath stroke='none' d='M0 0h24v24H0z' fill='none'/%3E%3Cpath d='M8 7a4 4 0 1 0 8 0a4 4 0 0 0 -8 0'/%3E%3Cpath d='M6 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.ttdk-avatar-icon:not(:empty):before{display:none}.ttdk-avatar-icon svg{stroke:currentColor;stroke-width:1.8px;stroke-linecap:round;stroke-linejoin:round;fill:none;width:20px;height:20px}.ttdk-avatar[data-size=xs]{width:24px;height:24px;font-size:10px}.ttdk-avatar[data-size=xs] .ttdk-avatar-icon:before,.ttdk-avatar[data-size=xs] .ttdk-avatar-icon svg{width:14px;height:14px}.ttdk-avatar[data-size=sm]{width:32px;height:32px;font-size:14px}.ttdk-avatar[data-size=sm] .ttdk-avatar-icon:before,.ttdk-avatar[data-size=sm] .ttdk-avatar-icon svg{width:16px;height:16px}.ttdk-avatar[data-size=md]{width:40px;height:40px;font-size:16px}.ttdk-avatar[data-size=md] .ttdk-avatar-icon:before,.ttdk-avatar[data-size=md] .ttdk-avatar-icon svg{width:20px;height:20px}.ttdk-avatar[data-size=lg]{width:48px;height:48px;font-size:18px}.ttdk-avatar[data-size=lg] .ttdk-avatar-icon:before,.ttdk-avatar[data-size=lg] .ttdk-avatar-icon svg{width:24px;height:24px}.ttdk-avatar[data-size=xl]{width:56px;height:56px;font-size:20px}.ttdk-avatar[data-size=xl] .ttdk-avatar-icon:before,.ttdk-avatar[data-size=xl] .ttdk-avatar-icon svg{width:28px;height:28px}.ttdk-avatar[data-rounded=full]{border-radius:var(--ttdk-radius-full,9999px)}.ttdk-avatar[data-rounded=lg]{border-radius:var(--ttdk-radius-md,12px)}.ttdk-avatar[data-rounded=md]{border-radius:var(--ttdk-radius-sm,8px)}.ttdk-avatar[data-rounded=sm]{border-radius:var(--ttdk-radius-xs,6px)}.ttdk-avatar[data-rounded=none]{border-radius:var(--ttdk-radius-none,0px)}.ttdk-avatar[data-variant=info]{background-color:var(--ttdk-color-blue-100,#ecf3fe);color:var(--ttdk-text-icon-status-info,#0968f6)}.ttdk-avatar[data-variant=primary]{background-color:var(--ttdk-brand-subtle,#e1fbfa);color:var(--ttdk-brand-default,#16b3ac)}.ttdk-avatar[data-variant=success]{background-color:var(--ttdk-bg-status-success-subtle,#e0fae0);color:var(--ttdk-text-icon-status-success,#3cc14e)}.ttdk-avatar[data-variant=warning]{background-color:var(--ttdk-bg-status-warning-subtle,#fff8d5);color:var(--ttdk-text-icon-status-warning,#ff8806)}.ttdk-avatar[data-variant=danger]{background-color:var(--ttdk-bg-status-error-subtle,#ffe0e0);color:var(--ttdk-text-icon-status-error,#f02d2d)}.ttdk-avatar[data-variant=neutral]{background-color:var(--ttdk-bg-secondary-disabled,#f1f2f3);color:var(--ttdk-text-icon-primary,#141313)}.dark .ttdk-avatar,[data-theme=dark] .ttdk-avatar{color:var(--ttdk-text-icon-primary,#fff)}.dark .ttdk-avatar-icon,[data-theme=dark] .ttdk-avatar-icon{color:var(--ttdk-ui-icon-color,var(--ttdk-text-icon-primary,#fff))}.dark .ttdk-avatar[data-variant=info],[data-theme=dark] .ttdk-avatar[data-variant=info]{background-color:var(--ttdk-bg-status-info-subtle,#002a69);color:var(--ttdk-text-icon-status-info,#84b4fb)}.dark .ttdk-avatar[data-variant=primary],[data-theme=dark] .ttdk-avatar[data-variant=primary]{background-color:var(--ttdk-brand-subtle-dark,#062f2d);color:var(--ttdk-brand-default,#16b3ac)}.dark .ttdk-avatar[data-variant=success],[data-theme=dark] .ttdk-avatar[data-variant=success]{background-color:var(--ttdk-bg-status-success-subtle,#1b561a);color:var(--ttdk-text-icon-status-success,#a6f0a5)}.dark .ttdk-avatar[data-variant=warning],[data-theme=dark] .ttdk-avatar[data-variant=warning]{background-color:var(--ttdk-bg-status-warning-subtle,#553b06);color:var(--ttdk-text-icon-status-warning,#ffe58a)}.dark .ttdk-avatar[data-variant=danger],[data-theme=dark] .ttdk-avatar[data-variant=danger]{background-color:var(--ttdk-bg-status-error-subtle,#570303);color:var(--ttdk-text-icon-status-error,#ffa0a0)}.dark .ttdk-avatar[data-variant=neutral],[data-theme=dark] .ttdk-avatar[data-variant=neutral]{background-color:var(--ttdk-bg-secondary-disabled,#313336);color:var(--ttdk-text-icon-primary,#fff)}.ttdk-avatar-status{border:1.5px solid var(--ttdk-bg-base-primary,#fff);box-sizing:border-box;background-color:var(--ttdk-bg-status-success,#3cc14e);border-radius:9999px;position:absolute;bottom:0;right:0}.dark .ttdk-avatar-status,[data-theme=dark] .ttdk-avatar-status{border-color:var(--ttdk-bg-base-primary,#141313)}.ttdk-avatar[data-size=xs] .ttdk-avatar-status{border-width:1px;width:6px;height:6px}.ttdk-avatar[data-size=sm] .ttdk-avatar-status{border-width:1.5px;width:8px;height:8px}.ttdk-avatar[data-size=md] .ttdk-avatar-status{border-width:1.5px;width:10px;height:10px}.ttdk-avatar[data-size=lg] .ttdk-avatar-status{border-width:2px;width:12px;height:12px}.ttdk-avatar[data-size=xl] .ttdk-avatar-status{border-width:2px;width:14px;height:14px}.ttdk-avatar-status[data-status=online]{background-color:var(--ttdk-bg-status-success,#3cc14e)}.ttdk-avatar-status[data-status=offline]{background-color:var(--ttdk-color-neutral-400,#969ba2)}.ttdk-avatar-status[data-status=verified]{background-color:#0000;background-image:url(data:image/svg+xml,%3Csvg%20width%3D%2225%22%20height%3D%2227%22%20viewBox%3D%220%200%2025%2027%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%3Cuse%20xlink%3Ahref%3D%22%23stroke0_696_8896%22%20fill%3D%22%231E81E8%22%2F%3E%3Cmask%20id%3D%22stroke1_696_8896%22%20maskUnits%3D%22userSpaceOnUse%22%20x%3D%22-0.577322%22%20y%3D%22-1.33077%22%20width%3D%2226.4905%22%20height%3D%2229.1467%22%20fill%3D%22black%22%3E%3Crect%20fill%3D%22white%22%20x%3D%22-0.577322%22%20y%3D%22-1.33077%22%20width%3D%2226.4905%22%20height%3D%2229.1467%22%2F%3E%3Cuse%20xlink%3Ahref%3D%22%23stroke0_696_8896%22%2F%3E%3C%2Fmask%3E%3Cpath%20d%3D%22M23.1264%204.39673L24.094%204.14968L23.8502%203.21882L22.9113%203.41901L23.1264%204.39673ZM12.5952%201.23272L13.1994%200.440062L12.6235%205.7958e-05L12.0282%200.405408L12.5952%201.23272ZM1.87074%203.81179L2.13074%202.84824L1.2209%202.59744L0.922051%203.48837L1.87074%203.81179ZM11.7726%2025.626L11.3952%2026.5493L11.7485%2026.6955L12.108%2026.5701L11.7726%2025.626ZM23.1264%204.39673L22.9113%203.41901C20.7297%203.88421%2018.3403%203.19906%2016.4009%202.30664C15.4476%201.868%2014.6401%201.39645%2014.0714%201.03467C13.7878%200.854194%2013.5653%200.702137%2013.4157%200.596732C13.341%200.54406%2013.2846%200.503128%2013.2481%200.476231C13.2298%200.462785%2013.2165%200.452855%2013.2083%200.446729C13.2042%200.443666%2013.2014%200.441555%2013.1999%200.440431C13.1992%200.439869%2013.1988%200.439555%2013.1987%200.439492C13.1986%200.43946%2013.1987%200.439492%2013.1988%200.439586C13.1989%200.439634%2013.199%200.439753%2013.1991%200.439776C13.1992%200.439911%2013.1994%200.440062%2012.5952%201.23272C11.991%202.02539%2011.9913%202.02557%2011.9915%202.02577C11.9917%202.02586%2011.9919%202.02607%2011.9922%202.02625C11.9926%202.0266%2011.9932%202.02702%2011.9938%202.0275C11.9951%202.02846%2011.9967%202.02967%2011.9986%202.03114C12.0025%202.03407%2012.0077%202.03801%2012.0142%202.04292C12.0273%202.05273%2012.0457%202.06642%2012.0692%202.08369C12.1161%202.11822%2012.1836%202.16711%2012.27%202.228C12.4427%202.34972%2012.6917%202.51975%2013.005%202.71912C13.6304%203.11702%2014.519%203.6362%2015.5741%204.12171C17.6514%205.07759%2020.5276%205.97444%2023.3414%205.37444L23.1264%204.39673ZM12.5952%201.23272C12.0282%200.405408%2012.0284%200.405271%2012.0286%200.405149C12.0286%200.405128%2012.0288%200.40502%2012.0288%200.404979C12.0289%200.404895%2012.029%200.40487%2012.0289%200.404904C12.0288%200.404972%2012.0284%200.405275%2012.0276%200.405807C12.026%200.406871%2012.0231%200.408855%2012.0188%200.411723C12.0102%200.417459%2011.9962%200.42673%2011.9771%200.439256C11.9388%200.464314%2011.8798%200.502364%2011.8018%200.551183C11.6458%200.648876%2011.414%200.789355%2011.1192%200.954928C10.5285%201.28684%209.69205%201.71554%208.71167%202.10263C6.71599%202.8906%204.2845%203.44196%202.13074%202.84824L1.87074%203.81179L1.61074%204.77533C4.39472%205.54277%207.32548%204.80459%209.45761%203.96274C10.5411%203.53492%2011.46%203.06365%2012.1086%202.6993C12.4335%202.51675%2012.6923%202.36003%2012.872%202.24756C12.9619%202.1913%2013.0321%202.14602%2013.081%202.11403C13.1055%202.09803%2013.1246%202.08534%2013.1382%202.07625C13.145%202.0717%2013.1504%202.06806%2013.1545%202.06534C13.1565%202.06399%2013.1581%202.06286%2013.1594%202.06198C13.1601%202.06154%2013.1606%202.06115%2013.1611%202.06083C13.1614%202.06067%2013.1617%202.06047%2013.1618%202.06039C13.162%202.06021%2013.1623%202.06004%2012.5952%201.23272ZM1.87074%203.81179C0.922051%203.48837%200.921877%203.48889%200.921684%203.48947C0.921593%203.48974%200.92138%203.49037%200.921199%203.49092C0.920836%203.49201%200.920395%203.49333%200.919878%203.4949C0.918842%203.49802%200.9175%203.5021%200.915863%203.50711C0.912588%203.51713%200.908135%203.5309%200.9026%203.54832C0.891531%203.58316%200.876135%203.63262%200.857201%203.69594C0.819341%203.82255%200.767288%204.00472%200.707393%204.23635C0.587677%204.6993%200.436175%205.36153%200.30413%206.17379C0.0407089%207.79419%20-0.148984%2010.0341%200.158825%2012.4906C0.780892%2017.455%203.44239%2023.2589%2011.3952%2026.5493L11.7726%2025.626L12.15%2024.7028C4.98209%2021.7372%202.69267%2016.634%202.14399%2012.2553C1.86642%2010.0401%202.0364%207.99952%202.27899%206.50725C2.39995%205.76317%202.53804%205.16104%202.64466%204.74871C2.69794%204.54269%202.74324%204.3845%202.77445%204.28014C2.79005%204.22798%202.80211%204.18931%202.80987%204.1649C2.81374%204.15269%202.81655%204.14405%202.81817%204.13907C2.81899%204.13658%202.81951%204.135%202.81972%204.13435C2.81983%204.13403%202.81986%204.13394%202.81981%204.13408C2.81979%204.13415%202.81969%204.13443%202.81968%204.13447C2.81957%204.13481%202.81943%204.13521%201.87074%203.81179ZM11.7726%2025.626L12.108%2026.5701C20.2456%2023.7309%2023.2865%2018.0972%2024.2432%2013.1809C24.7168%2010.7469%2024.6802%208.50039%2024.5277%206.8672C24.4513%206.04866%2024.3453%205.37876%2024.2574%204.90953C24.2134%204.67477%2024.1738%204.48981%2024.1447%204.36111C24.1301%204.29674%2024.1181%204.24641%2024.1094%204.21091C24.105%204.19316%2024.1015%204.17912%2024.0989%204.16888C24.0976%204.16376%2024.0966%204.1596%2024.0957%204.15639C24.0953%204.15479%2024.095%204.15343%2024.0947%204.15231C24.0945%204.15175%2024.0944%204.15109%2024.0943%204.15081C24.0941%204.15022%2024.094%204.14968%2023.1264%204.39673C22.1587%204.64378%2022.1586%204.64336%2022.1585%204.64301C22.1585%204.64297%2022.1584%204.64267%2022.1584%204.64259C22.1584%204.64244%2022.1584%204.64252%2022.1585%204.64284C22.1586%204.64347%2022.159%204.64505%2022.1597%204.64755C22.1609%204.65257%2022.1631%204.6613%2022.1662%204.67365C22.1722%204.69836%2022.1816%204.73753%2022.1936%204.79037C22.2175%204.89609%2022.2519%205.05633%2022.2909%205.26477C22.3691%205.68194%2022.4658%206.2904%2022.5357%207.03968C22.6759%208.54213%2022.7068%2010.5891%2022.2792%2012.7866C21.4334%2017.1332%2018.7974%2022.1141%2011.4372%2024.682L11.7726%2025.626Z%22%20fill%3D%22white%22%20mask%3D%22url\(%23stroke1_696_8896\)%22%2F%3E%3Cpath%20d%3D%22M12.7982%2018.6179C16.1989%2018.4641%2018.8078%2015.7456%2018.6252%2012.5461C18.4427%209.34656%2015.5378%206.87751%2012.137%207.03132C8.73627%207.18513%206.1274%209.90355%206.30996%2013.1031C6.49252%2016.3026%209.39739%2018.7717%2012.7982%2018.6179Z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M11.7845%2016.0567L11.7782%2016.057C11.5591%2016.0653%2011.3451%2015.988%2011.1848%2015.843L8.33674%2013.2645C8.00913%2012.9681%207.99235%2012.4747%208.29919%2012.1629C8.60578%2011.8509%209.11979%2011.8384%209.44741%2012.135L11.6853%2014.1612L15.3696%2010.194C15.6671%209.87369%2016.1805%209.84733%2016.5165%2010.1349C16.8524%2010.4228%2016.8838%2010.9152%2016.5865%2011.2355L12.3486%2015.799C12.2046%2015.9543%2012.0014%2016.0469%2011.7845%2016.0567%22%20fill%3D%22%231E81E8%22%2F%3E%3Cdefs%3E%3Cpath%20id%3D%22stroke0_696_8896%22%20d%3D%22M23.1264%204.39673C18.1309%205.46192%2012.5952%201.23272%2012.5952%201.23272C12.5952%201.23272%206.80847%205.17294%201.87074%203.81179C1.87074%203.81179%20-3.34811%2019.3701%2011.7726%2025.626C27.2704%2020.219%2023.1264%204.39673%2023.1264%204.39673Z%22%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%2F%3E%3C%2Fdefs%3E%3C%2Fsvg%3E);background-position:50%;background-repeat:no-repeat;background-size:contain;border:none;border-radius:0}.ttdk-avatar[data-size=xs] .ttdk-avatar-status[data-status=verified]{width:8px;height:8.5px}.ttdk-avatar[data-size=sm] .ttdk-avatar-status[data-status=verified]{width:12px;height:12.75px}.ttdk-avatar[data-size=md] .ttdk-avatar-status[data-status=verified]{width:16px;height:17px}.ttdk-avatar[data-size=lg] .ttdk-avatar-status[data-status=verified]{width:20px;height:21.25px}.ttdk-avatar[data-size=xl] .ttdk-avatar-status[data-status=verified]{width:24px;height:25.5px}
@@ -0,0 +1,233 @@
1
+ "use client";
2
+ import * as React from "react";
3
+ import { useState } from "react";
4
+
5
+ export type AvatarUiProps = UiProps;
6
+ export interface AvatarProps {
7
+ /**
8
+ * URL gambar profil avatar.
9
+ * Jika kosong atau gagal dimuat, tampilan otomatis beralih ke `initials` atau ikon pengguna bawaan.
10
+ */
11
+ src?: string;
12
+
13
+ /**
14
+ * Teks alternatif (alt) untuk elemen gambar avatar.
15
+ */
16
+ alt?: string;
17
+
18
+ /**
19
+ * Teks inisial pengguna yang ditampilkan di dalam lingkaran avatar (misal: "NA", "SR").
20
+ * Ditampilkan apabila `src` tidak tersedia atau gagal dimuat.
21
+ */
22
+ initials?: string;
23
+
24
+ /**
25
+ * Skala ukuran avatar:
26
+ * - `'xs'`: Lingkaran 28px.
27
+ * - `'sm'`: Lingkaran 32px.
28
+ * - `'md'`: Lingkaran 40px (standar).
29
+ * - `'lg'`: Lingkaran 48px.
30
+ * - `'xl'`: Lingkaran 56px.
31
+ *
32
+ * @default 'md'
33
+ */
34
+ size?: "xs" | "sm" | "md" | "lg" | "xl";
35
+
36
+ /**
37
+ * Varian warna semantik untuk latar & teks/ikon fallback avatar:
38
+ * - `'info'`: Biru informasi sesuai standar profil (default).
39
+ * - `'primary'`: Brand Teal utama.
40
+ * - `'success'`: Hijau sukses.
41
+ * - `'warning'`: Kuning / amber peringatan.
42
+ * - `'danger'`: Merah bahaya.
43
+ * - `'neutral'`: Abu-abu netral.
44
+ *
45
+ * @default 'info'
46
+ */
47
+ variant?: "info" | "primary" | "success" | "warning" | "danger" | "neutral";
48
+
49
+ /**
50
+ * Sudut kelengkungan lingkaran avatar:
51
+ * - `'full'`: Lingkaran penuh 9999px (default).
52
+ * - `'lg'`: Radius membulat 12px.
53
+ * - `'md'`: Radius sedang 8px.
54
+ * - `'sm'`: Radius halus 4px.
55
+ * - `'none'`: Persegi tajam 0px.
56
+ *
57
+ * @default 'full'
58
+ */
59
+ rounded?: "none" | "sm" | "md" | "lg" | "full";
60
+
61
+ /**
62
+ * Indikator status kehadiran atau verifikasi di pojok kanan bawah lingkaran avatar:
63
+ * - `'online'`: Titik hijau status aktif.
64
+ * - `'offline'`: Titik abu-abu status luring.
65
+ * - `'verified'`: Lencana perisai biru terverifikasi.
66
+ */
67
+ status?: "online" | "offline" | "verified";
68
+
69
+ /**
70
+ * Ikon kustom untuk menggantikan ikon pengguna bawaan saat `src` dan `initials` tidak diisi.
71
+ */
72
+ icon?: any;
73
+
74
+ /**
75
+ * Warna kustom untuk ikon di dalam avatar.
76
+ */
77
+ iconColor?: string;
78
+
79
+ /**
80
+ * Menjadikan komponen avatar interaktif (memiliki efek hover & fokus keyboard).
81
+ * @default false
82
+ */
83
+ interactive?: boolean;
84
+
85
+ /**
86
+ * Menonaktifkan interaksi klik pada avatar.
87
+ * @default false
88
+ */
89
+ disabled?: boolean;
90
+
91
+ /**
92
+ * Event handler saat komponen avatar diklik.
93
+ */
94
+ onClick?: (event?: any) => void;
95
+
96
+ /**
97
+ * Event handler saat gambar `src` gagal dimuat.
98
+ */
99
+ onImageError?: (event?: any) => void;
100
+
101
+ /**
102
+ * Kustomisasi visual granular pada elemen root melalui style-like object (+ support pseudo-class: hover, active).
103
+ */
104
+ ui?: UiProps;
105
+
106
+ /**
107
+ * Inline CSS style object native pada elemen root.
108
+ */
109
+ style?: React.CSSProperties;
110
+
111
+ /**
112
+ * Style kustom untuk elemen gambar `<img>` di dalam avatar (UiProps).
113
+ */
114
+ imageStyle?: UiProps;
115
+
116
+ /**
117
+ * Class CSS kustom untuk elemen gambar `<img>`.
118
+ */
119
+ imageClass?: string;
120
+
121
+ /**
122
+ * Class CSS kustom pada elemen root.
123
+ */
124
+ className?: string;
125
+
126
+ /**
127
+ * Slot konten tambahan atau pengganti ikon di dalam avatar.
128
+ */
129
+ children?: any;
130
+ }
131
+
132
+ /**
133
+ * Komponen Avatar untuk menampilkan foto profil, inisial nama, atau ikon pengguna.
134
+ */
135
+
136
+ import { buildUiVars, UiProps } from "../../core/types";
137
+
138
+ function Avatar(props: AvatarProps) {
139
+ const [hasImageError, setHasImageError] = useState(() => false);
140
+
141
+ function handleImgError(event: any) {
142
+ setHasImageError(true);
143
+ props.onImageError?.(event);
144
+ }
145
+
146
+ function handleClick(event: any) {
147
+ if (props.disabled) return;
148
+ props.onClick?.(event);
149
+ }
150
+
151
+ function handleKeyDown(event: any) {
152
+ if (props.disabled) return;
153
+ if (event.key === "Enter" || event.key === " ") {
154
+ event.preventDefault();
155
+ props.onClick?.(event);
156
+ }
157
+ }
158
+
159
+ return (
160
+ <span
161
+ className={`ttdk-avatar ${props.className || ""}`.trim()}
162
+ data-size={props.size || "md"}
163
+ data-variant={props.variant || "info"}
164
+ data-rounded={props.rounded || "full"}
165
+ data-mode={
166
+ props.src && !hasImageError
167
+ ? "image"
168
+ : props.initials
169
+ ? "initials"
170
+ : "icon"
171
+ }
172
+ data-interactive={
173
+ Boolean(props.interactive || props.onClick) ? "true" : "false"
174
+ }
175
+ data-disabled={props.disabled ? "true" : "false"}
176
+ role={props.interactive || props.onClick ? "button" : undefined}
177
+ tabIndex={
178
+ props.disabled ? -1 : props.interactive || props.onClick ? 0 : undefined
179
+ }
180
+ aria-disabled={props.disabled ? "true" : undefined}
181
+ style={{
182
+ ...buildUiVars(props.ui),
183
+ ...(props.iconColor
184
+ ? {
185
+ "--ttdk-ui-icon-color": props.iconColor,
186
+ }
187
+ : {}),
188
+ ...((props as any)["style"] || {}),
189
+ ...props.style,
190
+ }}
191
+ onClick={(event) => handleClick(event)}
192
+ onKeyDown={(event) => handleKeyDown(event)}
193
+ >
194
+ {props.src && !hasImageError ? (
195
+ <img
196
+ className={`ttdk-avatar-image ${props.imageClass || ""}`.trim()}
197
+ src={props.src}
198
+ alt={props.alt || props.initials || "Avatar"}
199
+ style={{
200
+ ...buildUiVars(props.imageStyle),
201
+ }}
202
+ onError={(event) => handleImgError(event)}
203
+ />
204
+ ) : null}
205
+ {(!props.src || hasImageError) && props.initials ? (
206
+ <span className="ttdk-avatar-initials">{props.initials}</span>
207
+ ) : null}
208
+ {(!props.src || hasImageError) && !props.initials ? (
209
+ <>
210
+ {props.icon ? (
211
+ <span className="ttdk-avatar-icon">{props.icon}</span>
212
+ ) : null}
213
+ {!props.icon ? (
214
+ <span className="ttdk-avatar-icon" aria-hidden="true">
215
+ <>{props.children}</>
216
+ </span>
217
+ ) : null}
218
+ </>
219
+ ) : null}
220
+ {props.status ? (
221
+ <span
222
+ className="ttdk-avatar-status"
223
+ data-status={props.status}
224
+ aria-label={props.status}
225
+ />
226
+ ) : null}
227
+ </span>
228
+ );
229
+ }
230
+
231
+ export default Avatar;
232
+
233
+ export { Avatar };
@@ -0,0 +1,3 @@
1
+ export { default as Avatar } from './avatar';
2
+ export { default } from './avatar';
3
+ export type { AvatarProps, AvatarUiProps } from './avatar'
@@ -0,0 +1,195 @@
1
+ {
2
+ "name": "@ttdk-design-system/avatar",
3
+ "component": "Avatar",
4
+ "folder": "avatar",
5
+ "description": "Komponen Avatar untuk menampilkan foto profil, inisial nama, atau ikon pengguna.",
6
+ "stylesheets": [
7
+ {
8
+ "theme": "common",
9
+ "file": "avatar.css",
10
+ "importPath": "web/avatar/avatar.css"
11
+ }
12
+ ],
13
+ "props": {
14
+ "src": {
15
+ "name": "src",
16
+ "type": "string",
17
+ "optional": true,
18
+ "default": null,
19
+ "description": "URL gambar profil avatar. Jika kosong atau gagal dimuat, tampilan otomatis beralih ke `initials` atau ikon pengguna bawaan.",
20
+ "example": null,
21
+ "param": null
22
+ },
23
+ "alt": {
24
+ "name": "alt",
25
+ "type": "string",
26
+ "optional": true,
27
+ "default": null,
28
+ "description": "Teks alternatif (alt) untuk elemen gambar avatar.",
29
+ "example": null,
30
+ "param": null
31
+ },
32
+ "initials": {
33
+ "name": "initials",
34
+ "type": "string",
35
+ "optional": true,
36
+ "default": null,
37
+ "description": "Teks inisial pengguna yang ditampilkan di dalam lingkaran avatar (misal: \"NA\", \"SR\"). Ditampilkan apabila `src` tidak tersedia atau gagal dimuat.",
38
+ "example": null,
39
+ "param": null
40
+ },
41
+ "size": {
42
+ "name": "size",
43
+ "type": "'xs' | 'sm' | 'md' | 'lg' | 'xl'",
44
+ "optional": true,
45
+ "default": "md",
46
+ "description": "Skala ukuran avatar: - `'xs'`: Lingkaran 28px. - `'sm'`: Lingkaran 32px. - `'md'`: Lingkaran 40px (standar). - `'lg'`: Lingkaran 48px. - `'xl'`: Lingkaran 56px.",
47
+ "example": null,
48
+ "param": null
49
+ },
50
+ "variant": {
51
+ "name": "variant",
52
+ "type": "'info' | 'primary' | 'success' | 'warning' | 'danger' | 'neutral'",
53
+ "optional": true,
54
+ "default": "info",
55
+ "description": "Varian warna semantik untuk latar & teks/ikon fallback avatar: - `'info'`: Biru informasi sesuai standar profil (default). - `'primary'`: Brand Teal utama. - `'success'`: Hijau sukses. - `'warning'`: Kuning / amber peringatan. - `'danger'`: Merah bahaya. - `'neutral'`: Abu-abu netral.",
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": "Sudut kelengkungan lingkaran avatar: - `'full'`: Lingkaran penuh 9999px (default). - `'lg'`: Radius membulat 12px. - `'md'`: Radius sedang 8px. - `'sm'`: Radius halus 4px. - `'none'`: Persegi tajam 0px.",
65
+ "example": null,
66
+ "param": null
67
+ },
68
+ "status": {
69
+ "name": "status",
70
+ "type": "'online' | 'offline' | 'verified'",
71
+ "optional": true,
72
+ "default": null,
73
+ "description": "Indikator status kehadiran atau verifikasi di pojok kanan bawah lingkaran avatar: - `'online'`: Titik hijau status aktif. - `'offline'`: Titik abu-abu status luring. - `'verified'`: Lencana perisai biru terverifikasi.",
74
+ "example": null,
75
+ "param": null
76
+ },
77
+ "icon": {
78
+ "name": "icon",
79
+ "type": "any",
80
+ "optional": true,
81
+ "default": null,
82
+ "description": "Ikon kustom untuk menggantikan ikon pengguna bawaan saat `src` dan `initials` tidak diisi.",
83
+ "example": null,
84
+ "param": null
85
+ },
86
+ "iconColor": {
87
+ "name": "iconColor",
88
+ "type": "string",
89
+ "optional": true,
90
+ "default": null,
91
+ "description": "Warna kustom untuk ikon di dalam avatar.",
92
+ "example": null,
93
+ "param": null
94
+ },
95
+ "interactive": {
96
+ "name": "interactive",
97
+ "type": "boolean",
98
+ "optional": true,
99
+ "default": "false",
100
+ "description": "Menjadikan komponen avatar interaktif (memiliki efek hover & fokus keyboard).",
101
+ "example": null,
102
+ "param": null
103
+ },
104
+ "disabled": {
105
+ "name": "disabled",
106
+ "type": "boolean",
107
+ "optional": true,
108
+ "default": "false",
109
+ "description": "Menonaktifkan interaksi klik pada avatar.",
110
+ "example": null,
111
+ "param": null
112
+ },
113
+ "onClick": {
114
+ "name": "onClick",
115
+ "type": "(event?: any) => void",
116
+ "optional": true,
117
+ "default": null,
118
+ "description": "Event handler saat komponen avatar diklik.",
119
+ "example": null,
120
+ "param": null
121
+ },
122
+ "onImageError": {
123
+ "name": "onImageError",
124
+ "type": "(event?: any) => void",
125
+ "optional": true,
126
+ "default": null,
127
+ "description": "Event handler saat gambar `src` gagal dimuat.",
128
+ "example": null,
129
+ "param": null
130
+ },
131
+ "ui": {
132
+ "name": "ui",
133
+ "type": "UiProps",
134
+ "optional": true,
135
+ "default": null,
136
+ "description": "Kustomisasi visual granular pada elemen root melalui style-like object (+ support pseudo-class: hover, active).",
137
+ "example": null,
138
+ "param": null
139
+ },
140
+ "style": {
141
+ "name": "style",
142
+ "type": "any",
143
+ "optional": true,
144
+ "default": null,
145
+ "description": "Inline CSS style object native pada elemen root.",
146
+ "example": null,
147
+ "param": null
148
+ },
149
+ "imageStyle": {
150
+ "name": "imageStyle",
151
+ "type": "UiProps",
152
+ "optional": true,
153
+ "default": null,
154
+ "description": "Style kustom untuk elemen gambar `<img>` di dalam avatar (UiProps).",
155
+ "example": null,
156
+ "param": null
157
+ },
158
+ "imageClass": {
159
+ "name": "imageClass",
160
+ "type": "string",
161
+ "optional": true,
162
+ "default": null,
163
+ "description": "Class CSS kustom untuk elemen gambar `<img>`.",
164
+ "example": null,
165
+ "param": null
166
+ },
167
+ "className": {
168
+ "name": "className",
169
+ "type": "string",
170
+ "optional": true,
171
+ "default": null,
172
+ "description": "Class CSS kustom pada elemen root.",
173
+ "example": null,
174
+ "param": null
175
+ },
176
+ "children": {
177
+ "name": "children",
178
+ "type": "any",
179
+ "optional": true,
180
+ "default": null,
181
+ "description": "Slot konten tambahan atau pengganti ikon di dalam avatar.",
182
+ "example": null,
183
+ "param": null
184
+ }
185
+ },
186
+ "subInterfaces": {},
187
+ "supportedFrameworks": [
188
+ "react",
189
+ "vue",
190
+ "svelte"
191
+ ],
192
+ "themes": [
193
+ "tw"
194
+ ]
195
+ }
@@ -0,0 +1,94 @@
1
+ # <Badge /> — TTDK Component Reference
2
+
3
+ TTDK Badge 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/badge/badge.css";`
8
+
9
+ ## 2. Subpath Component Import
10
+ ```ts
11
+ // React
12
+ import Badge from "@ttdk-design-system/library-react/web/badge";
13
+
14
+ // Vue 3
15
+ import Badge from "@ttdk-design-system/library-vue/web/badge";
16
+
17
+ // Svelte
18
+ import Badge from "@ttdk-design-system/library-svelte/web/badge";
19
+ ```
20
+
21
+ ## 3. Props & API Reference
22
+
23
+ | Prop | Type | Default | Description |
24
+ | :--- | :--- | :--- | :--- |
25
+ | `label?` | `string` | `-` | Teks label yang ditampilkan di dalam badge (misal: "CSV", "Publik", "Aktif"). |
26
+ | `variant?` | `| 'primary'
27
+ | 'success'
28
+ | 'info'
29
+ | 'warning'
30
+ | 'danger'
31
+ | 'neutral'
32
+ | 'disabled'` | `primary` | Varian warna semantik tema badge: - `'primary'`: Brand Teal utama (#00B5AD). - `'success'`: Sukses hijau (#04B761). - `'info'`: Biru informasi (#2196F3). - `'warning'`: Peringatan kuning / amber (#F88000). - `'danger'`: Bahaya / merah (#D0021B). |
33
+ | `appearance?` | `'soft' | 'solid' | 'outline'` | `soft` | Gaya visual tampilan badge: - `'soft'`: Latar belakang lembut transparan dengan teks berwarna (default). - `'solid'`: Latar belakang pekat solid dengan teks kontras putih/gelap. - `'outline'`: Garis tepi tipis dengan latar belakang transparan. |
34
+ | `size?` | `'sm' | 'md' | 'lg'` | `md` | Skala ukuran badge: - `'sm'`: Kecil (tinggi 28px, font 12px). - `'md'`: Sedang (tinggi 32px, font 13px, standar). - `'lg'`: Besar (tinggi 38px, font 15px). |
35
+ | `rounded?` | `'none' | 'sm' | 'md' | 'lg' | 'full'` | `full` | Sudut kelengkungan badge: - `'none'`: Sudut tajam kotak (0px). - `'sm'`: Radius halus (4px). - `'md'`: Radius sedang (6px). - `'lg'`: Radius membulat (8px). - `'full'`: Pill-shaped membulat penuh (9999px, default). |
36
+ | `dot?` | `boolean` | `false` | Menampilkan titik indikator status (dot) di sisi kiri teks badge. |
37
+ | `dotColor?` | `string` | `-` | Warna kustom untuk titik indikator status (dot). |
38
+ | `dotStyle?` | `UiProps` | `-` | Style kustom untuk titik indikator status (UiProps / style object + pseudo support). |
39
+ | `dotClass?` | `string` | `-` | Class CSS kustom untuk titik indikator status. |
40
+ | `ui?` | `UiProps` | `-` | Kustomisasi visual granular melalui style-like object (+ support pseudo-class: hover, active). |
41
+ | `style?` | `any` | `-` | Inline CSS style object native. |
42
+ | `className?` | `string` | `-` | Class CSS kustom. |
43
+ | `children?` | `any` | `-` | Konten kustom atau ikon yang disisipkan ke dalam badge. |
44
+
45
+ ## 4. Usage Examples
46
+
47
+ ### React Example
48
+ ```tsx
49
+ import Badge from "@ttdk-design-system/library-react/web/badge";
50
+ import "@ttdk-design-system/library-react/web/badge/badge.css";
51
+
52
+ export function Example() {
53
+ return (
54
+ <div style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>
55
+ <Badge variant="default" label="Publik" />
56
+ <Badge variant="success" dot label="Aktif" />
57
+ <Badge variant="warning" appearance="solid" label="Dalam Review" />
58
+ <Badge variant="danger" appearance="outline" label="Gagal" />
59
+ </div>
60
+ );
61
+ }
62
+ ```
63
+
64
+ ### Vue 3 Example
65
+ ```vue
66
+ <script setup lang="ts">
67
+ import Badge from "@ttdk-design-system/library-vue/web/badge";
68
+ import "@ttdk-design-system/library-vue/web/badge/badge.css";
69
+ </script>
70
+
71
+ <template>
72
+ <div style="display: flex; gap: 8px; align-items: center;">
73
+ <Badge variant="default" label="Publik" />
74
+ <Badge variant="success" :dot="true" label="Aktif" />
75
+ <Badge variant="warning" appearance="solid" label="Dalam Review" />
76
+ <Badge variant="danger" appearance="outline" label="Gagal" />
77
+ </div>
78
+ </template>
79
+ ```
80
+
81
+ ### Svelte Example
82
+ ```svelte
83
+ <script lang="ts">
84
+ import Badge from "@ttdk-design-system/library-svelte/web/badge";
85
+ import "@ttdk-design-system/library-svelte/web/badge/badge.css";
86
+ </script>
87
+
88
+ <div style="display: flex; gap: 8px; align-items: center;">
89
+ <Badge variant="default" label="Publik" />
90
+ <Badge variant="success" dot={true} label="Aktif" />
91
+ <Badge variant="warning" appearance="solid" label="Dalam Review" />
92
+ <Badge variant="danger" appearance="outline" label="Gagal" />
93
+ </div>
94
+ ```
@@ -0,0 +1 @@
1
+ .ttdk-badge{font-family:var(--ttdk-font-sans);font-weight:var(--ttdk-font-weight-medium,500);letter-spacing:.15px;box-sizing:border-box;user-select:none;white-space:nowrap;vertical-align:middle;border-radius:var(--ttdk-radius-full,9999px);border-style:solid;border-width:.8px;justify-content:center;align-items:center;gap:6px;line-height:100%;text-decoration:none;transition:all .15s cubic-bezier(.4,0,.2,1);display:inline-flex;position:relative}.ttdk-badge[data-size=xs]{min-width:45px;height:24px;padding:0 var(--ttdk-spacing-xs);border-width:.8px;font-size:11px}.ttdk-badge[data-size=sm]{min-width:55px;height:28px;font-size:var(--ttdk-font-size-12);letter-spacing:.15px;border-width:.8px;padding:0 10px;font-weight:500;line-height:1}.ttdk-badge[data-size=md]{letter-spacing:.15px;border-width:.8px;min-width:60px;height:32px;padding:0 14px;font-size:13px;font-weight:500;line-height:1}.ttdk-badge[data-size=lg]{letter-spacing:.15px;border-width:1px;min-width:60px;height:38px;padding:0 18px;font-size:15px;font-weight:500;line-height:1}.ttdk-badge[data-rounded=full]{border-radius:var(--ttdk-radius-full,9999px)}.ttdk-badge[data-rounded=lg]{border-radius:var(--ttdk-radius-md,12px)}.ttdk-badge[data-rounded=md]{border-radius:var(--ttdk-radius-sm,8px)}.ttdk-badge[data-rounded=sm]{border-radius:var(--ttdk-radius-xs,4px)}.ttdk-badge[data-rounded=none]{border-radius:var(--ttdk-radius-none,0px)}.ttdk-badge[data-appearance=soft][data-variant=primary]{background-color:var(--ttdk-brand-subtle);border-color:var(--ttdk-brand-default);color:var(--ttdk-brand-default)}.ttdk-badge[data-appearance=soft][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-badge[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)}.ttdk-badge[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)}.ttdk-badge[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)}.ttdk-badge[data-variant=neutral],.ttdk-badge[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)}.ttdk-badge[data-variant=disable],.ttdk-badge[data-variant=disabled],.ttdk-badge[data-appearance=soft][data-variant=disable],.ttdk-badge[data-appearance=soft][data-variant=disabled]{background-color:var(--ttdk-bg-secondary-disabled);border-color:var(--ttdk-stroke-subtle);color:var(--ttdk-text-icon-disabled)}.ttdk-badge[data-appearance=solid][data-variant=primary]{background-color:var(--ttdk-brand-default);border-color:var(--ttdk-brand-default);color:var(--ttdk-color-white)}.ttdk-badge[data-appearance=solid][data-variant=success]{background-color:var(--ttdk-bg-status-success);border-color:var(--ttdk-bg-status-success);color:var(--ttdk-color-white)}.ttdk-badge[data-appearance=solid][data-variant=info]{background-color:var(--ttdk-bg-status-info);border-color:var(--ttdk-bg-status-info);color:var(--ttdk-color-white)}.ttdk-badge[data-appearance=solid][data-variant=warning]{background-color:var(--ttdk-bg-status-warning);border-color:var(--ttdk-bg-status-warning);color:var(--ttdk-color-black)}.ttdk-badge[data-appearance=solid][data-variant=danger]{background-color:var(--ttdk-bg-status-error);border-color:var(--ttdk-bg-status-error);color:var(--ttdk-color-white)}.ttdk-badge[data-appearance=solid][data-variant=neutral]{background-color:var(--ttdk-bg-secondary-disabled);border-color:var(--ttdk-stroke-divider);color:var(--ttdk-text-icon-primary)}.ttdk-badge[data-appearance=solid][data-variant=disable],.ttdk-badge[data-appearance=solid][data-variant=disabled]{background-color:var(--ttdk-bg-secondary-disabled);border-color:var(--ttdk-stroke-subtle);color:var(--ttdk-text-icon-disabled)}.ttdk-badge[data-appearance=outline]{background-color:#0000}.ttdk-badge[data-appearance=outline][data-variant=primary]{border-color:var(--ttdk-brand-default);color:var(--ttdk-brand-default)}.ttdk-badge[data-appearance=outline][data-variant=success]{border-color:var(--ttdk-stroke-status-success);color:var(--ttdk-text-icon-status-success)}.ttdk-badge[data-appearance=outline][data-variant=info]{border-color:var(--ttdk-stroke-status-info);color:var(--ttdk-text-icon-status-info)}.ttdk-badge[data-appearance=outline][data-variant=warning]{border-color:var(--ttdk-stroke-status-warning);color:var(--ttdk-text-icon-status-warning)}.ttdk-badge[data-appearance=outline][data-variant=danger]{border-color:var(--ttdk-stroke-status-error);color:var(--ttdk-text-icon-status-error)}.ttdk-badge[data-appearance=outline][data-variant=neutral]{border-color:var(--ttdk-stroke-divider);color:var(--ttdk-text-icon-primary)}.ttdk-badge[data-appearance=outline][data-variant=disable],.ttdk-badge[data-appearance=outline][data-variant=disabled]{border-color:var(--ttdk-stroke-subtle);color:var(--ttdk-text-icon-disabled)}.dark .ttdk-badge[data-appearance=soft][data-variant=primary],[data-theme=dark] .ttdk-badge[data-appearance=soft][data-variant=primary]{background-color:var(--ttdk-brand-subtle-dark);border-color:var(--ttdk-brand-default)}.dark .ttdk-badge[data-appearance=soft][data-variant=success],[data-theme=dark] .ttdk-badge[data-appearance=soft][data-variant=success]{background-color:var(--ttdk-bg-status-success-subtle);border-color:var(--ttdk-stroke-status-success)}.dark .ttdk-badge[data-appearance=soft][data-variant=info],[data-theme=dark] .ttdk-badge[data-appearance=soft][data-variant=info]{background-color:var(--ttdk-bg-status-info-subtle);border-color:var(--ttdk-stroke-status-info)}.dark .ttdk-badge[data-appearance=soft][data-variant=warning],[data-theme=dark] .ttdk-badge[data-appearance=soft][data-variant=warning]{background-color:var(--ttdk-bg-status-warning-subtle);border-color:var(--ttdk-stroke-status-warning)}.dark .ttdk-badge[data-appearance=soft][data-variant=danger],[data-theme=dark] .ttdk-badge[data-appearance=soft][data-variant=danger]{background-color:var(--ttdk-bg-status-error-subtle);border-color:var(--ttdk-stroke-status-error)}.dark .ttdk-badge[data-appearance=solid][data-variant=neutral],[data-theme=dark] .ttdk-badge[data-appearance=solid][data-variant=neutral]{background-color:var(--ttdk-bg-stay-black);border-color:var(--ttdk-bg-stay-black);color:var(--ttdk-text-icon-stay-white)}.dark .ttdk-badge[data-appearance=soft][data-variant=neutral],[data-theme=dark] .ttdk-badge[data-appearance=soft][data-variant=neutral],.dark .ttdk-badge[data-variant=neutral],[data-theme=dark] .ttdk-badge[data-variant=neutral]{background-color:var(--ttdk-color-neutral-900);border-color:var(--ttdk-stroke-strong);color:var(--ttdk-text-icon-primary)}.dark .ttdk-badge[data-appearance=outline][data-variant=neutral],[data-theme=dark] .ttdk-badge[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)}.dark .ttdk-badge[data-appearance=soft][data-variant=disable],[data-theme=dark] .ttdk-badge[data-appearance=soft][data-variant=disable],.dark .ttdk-badge[data-appearance=soft][data-variant=disabled],[data-theme=dark] .ttdk-badge[data-appearance=soft][data-variant=disabled],.dark .ttdk-badge[data-variant=disable],[data-theme=dark] .ttdk-badge[data-variant=disable],.dark .ttdk-badge[data-variant=disabled],[data-theme=dark] .ttdk-badge[data-variant=disabled],.dark .ttdk-badge[data-appearance=solid][data-variant=disable],[data-theme=dark] .ttdk-badge[data-appearance=solid][data-variant=disable],.dark .ttdk-badge[data-appearance=solid][data-variant=disabled],[data-theme=dark] .ttdk-badge[data-appearance=solid][data-variant=disabled]{background-color:var(--ttdk-bg-secondary-disabled);border-color:var(--ttdk-stroke-subtle);color:var(--ttdk-text-icon-disabled)}.dark .ttdk-badge[data-appearance=outline][data-variant=disable],[data-theme=dark] .ttdk-badge[data-appearance=outline][data-variant=disable],.dark .ttdk-badge[data-appearance=outline][data-variant=disabled],[data-theme=dark] .ttdk-badge[data-appearance=outline][data-variant=disabled]{border-color:var(--ttdk-stroke-subtle);color:var(--ttdk-text-icon-disabled);background-color:#0000}.ttdk-badge-dot{background-color:currentColor;border-radius:50%;flex-shrink:0;width:6px;height:6px;display:inline-block}.ttdk-badge[data-size=xs] .ttdk-badge-dot{width:4px;height:4px}.ttdk-badge[data-size=lg] .ttdk-badge-dot{width:8px;height:8px}