@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,141 @@
1
+ {
2
+ "name": "@ttdk-design-system/badge",
3
+ "component": "Badge",
4
+ "folder": "badge",
5
+ "description": "TTDK Badge component with multi-theme support.",
6
+ "stylesheets": [
7
+ {
8
+ "theme": "common",
9
+ "file": "badge.css",
10
+ "importPath": "web/badge/badge.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 di dalam badge (misal: \"CSV\", \"Publik\", \"Aktif\").",
20
+ "example": null,
21
+ "param": null
22
+ },
23
+ "variant": {
24
+ "name": "variant",
25
+ "type": "| 'primary'\n | 'success'\n | 'info'\n | 'warning'\n | 'danger'\n | 'neutral'\n | 'disabled'",
26
+ "optional": true,
27
+ "default": "primary",
28
+ "description": "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).",
29
+ "example": null,
30
+ "param": null
31
+ },
32
+ "appearance": {
33
+ "name": "appearance",
34
+ "type": "'soft' | 'solid' | 'outline'",
35
+ "optional": true,
36
+ "default": "soft",
37
+ "description": "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.",
38
+ "example": null,
39
+ "param": null
40
+ },
41
+ "size": {
42
+ "name": "size",
43
+ "type": "'sm' | 'md' | 'lg'",
44
+ "optional": true,
45
+ "default": "md",
46
+ "description": "Skala ukuran badge: - `'sm'`: Kecil (tinggi 28px, font 12px). - `'md'`: Sedang (tinggi 32px, font 13px, standar). - `'lg'`: Besar (tinggi 38px, font 15px).",
47
+ "example": null,
48
+ "param": null
49
+ },
50
+ "rounded": {
51
+ "name": "rounded",
52
+ "type": "'none' | 'sm' | 'md' | 'lg' | 'full'",
53
+ "optional": true,
54
+ "default": "full",
55
+ "description": "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).",
56
+ "example": null,
57
+ "param": null
58
+ },
59
+ "dot": {
60
+ "name": "dot",
61
+ "type": "boolean",
62
+ "optional": true,
63
+ "default": "false",
64
+ "description": "Menampilkan titik indikator status (dot) di sisi kiri teks badge.",
65
+ "example": null,
66
+ "param": null
67
+ },
68
+ "dotColor": {
69
+ "name": "dotColor",
70
+ "type": "string",
71
+ "optional": true,
72
+ "default": null,
73
+ "description": "Warna kustom untuk titik indikator status (dot).",
74
+ "example": null,
75
+ "param": null
76
+ },
77
+ "dotStyle": {
78
+ "name": "dotStyle",
79
+ "type": "UiProps",
80
+ "optional": true,
81
+ "default": null,
82
+ "description": "Style kustom untuk titik indikator status (UiProps / style object + pseudo support).",
83
+ "example": null,
84
+ "param": null
85
+ },
86
+ "dotClass": {
87
+ "name": "dotClass",
88
+ "type": "string",
89
+ "optional": true,
90
+ "default": null,
91
+ "description": "Class CSS kustom untuk titik indikator status.",
92
+ "example": null,
93
+ "param": null
94
+ },
95
+ "ui": {
96
+ "name": "ui",
97
+ "type": "UiProps",
98
+ "optional": true,
99
+ "default": null,
100
+ "description": "Kustomisasi visual granular melalui style-like object (+ support pseudo-class: hover, active).",
101
+ "example": null,
102
+ "param": null
103
+ },
104
+ "style": {
105
+ "name": "style",
106
+ "type": "any",
107
+ "optional": true,
108
+ "default": null,
109
+ "description": "Inline CSS style object native.",
110
+ "example": null,
111
+ "param": null
112
+ },
113
+ "className": {
114
+ "name": "className",
115
+ "type": "string",
116
+ "optional": true,
117
+ "default": null,
118
+ "description": "Class CSS kustom.",
119
+ "example": null,
120
+ "param": null
121
+ },
122
+ "children": {
123
+ "name": "children",
124
+ "type": "any",
125
+ "optional": true,
126
+ "default": null,
127
+ "description": "Konten kustom atau ikon yang disisipkan ke dalam badge.",
128
+ "example": null,
129
+ "param": null
130
+ }
131
+ },
132
+ "subInterfaces": {},
133
+ "supportedFrameworks": [
134
+ "react",
135
+ "vue",
136
+ "svelte"
137
+ ],
138
+ "themes": [
139
+ "tw"
140
+ ]
141
+ }
@@ -0,0 +1,130 @@
1
+ # <Banner /> — TTDK Component Reference
2
+
3
+ Komponen Banner untuk header halaman portal, pengumuman penting, atau judul kategori katalog data dengan desain visual bersih dan elegan.
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/banner/banner.css";`
8
+
9
+ ## 2. Subpath Component Import
10
+ ```ts
11
+ // React
12
+ import Banner from "@ttdk-design-system/library-react/web/banner";
13
+
14
+ // Vue 3
15
+ import Banner from "@ttdk-design-system/library-vue/web/banner";
16
+
17
+ // Svelte
18
+ import Banner from "@ttdk-design-system/library-svelte/web/banner";
19
+ ```
20
+
21
+ ## 3. Props & API Reference
22
+
23
+ | Prop | Type | Default | Description |
24
+ | :--- | :--- | :--- | :--- |
25
+ | `title?` | `string` | `-` | Judul utama banner yang ditampilkan dengan tipografi tegas (misal: "Katalog Dataset Publik"). |
26
+ | `description?` | `string` | `-` | Deskripsi atau pesan teks penjelasan tambahan di bawah judul. |
27
+ | `variant?` | `| 'primary'
28
+ | 'success'
29
+ | 'info'
30
+ | 'warning'
31
+ | 'danger'` | `primary` | Varian warna semantik tema banner: - `'primary'`: Brand Teal utama (#16B3AC). - `'success'`: Hijau konfirmasi keberhasilan. - `'info'`: Biru informasi. - `'warning'`: Kuning / amber peringatan. - `'danger'`: Merah kesalahan / bahaya. |
32
+ | `appearance?` | `'gradient' | 'subtle' | 'solid' | 'outline' | 'flat'` | `gradient` | Gaya tampilan visual latar belakang banner. - `'gradient'`: Latar belakang gradasi halus elegan (standar sesuai desain katalog). - `'subtle'`: Latar belakang warna lembut transparan. - `'solid'`: Latar belakang warna pekat penuh dengan teks kontras tinggi. - `'outline'`: Garis tepi minimalis tanpa latar belakang gradasi. - `'flat'`: Latar polos solid netral. |
33
+ | `size?` | `'sm' | 'md' | 'lg' | 'xl'` | `md` | Skala ukuran tinggi dan padding ruang dalam banner. - `'sm'`: Kompak (padding 10px 16px, judul 14px). - `'md'`: Standar (padding 14px 20px, judul 16px). - `'lg'`: Besar / Page Header (padding 18px 24px, judul 18px). - `'xl'`: Ekstra Besar / Hero Banner (padding 24px 32px, judul 22px). |
34
+ | `rounded?` | `'none' | 'sm' | 'md' | 'lg' | 'full'` | `md` | Bentuk sudut kelengkungan container banner. - `'none'`: Sudut siku 0px. - `'sm'`: Sudut 4px. - `'md'`: Sudut 8px (standar). - `'lg'`: Sudut 12px. - `'full'`: Sudut kapsul 9999px. |
35
+ | `icon?` | `boolean | any` | `false` | Menampilkan ikon indikator status semantik (boolean) atau elemen ikon kustom. |
36
+ | `customIcon?` | `any` | `-` | Elemen ikon SVG kustom untuk menggantikan ikon bawaan banner. |
37
+ | `iconColor?` | `string` | `-` | Warna kustom untuk ikon banner secara langsung. |
38
+ | `iconSize?` | `string` | `-` | Ukuran kustom untuk ikon banner secara langsung. |
39
+ | `iconStyle?` | `UiProps` | `-` | Style kustom untuk ikon banner (UiProps). |
40
+ | `iconClass?` | `string` | `-` | Class CSS kustom untuk ikon banner. |
41
+ | `titleStyle?` | `UiProps` | `-` | Style kustom untuk judul banner (UiProps). |
42
+ | `titleClass?` | `string` | `-` | Class CSS kustom untuk judul banner. |
43
+ | `descStyle?` | `UiProps` | `-` | Style kustom untuk deskripsi banner (UiProps). |
44
+ | `descClass?` | `string` | `-` | Class CSS kustom untuk deskripsi banner. |
45
+ | `closable?` | `boolean` | `false` | Menampilkan tombol silang (x) untuk menutup atau menyembunyikan banner. |
46
+ | `closableStyle?` | `UiProps` | `-` | Style kustom untuk tombol tutup banner (UiProps). |
47
+ | `closableClass?` | `string` | `-` | Class CSS kustom untuk tombol tutup banner. |
48
+ | `ui?` | `UiProps` | `-` | Kustomisasi visual granular melalui style-like object (+ support pseudo-class: hover, active). |
49
+ | `style?` | `any` | `-` | Inline CSS style object native. |
50
+ | `children?` | `any` | `-` | Konten kustom tambahan / isi banner (children slot). |
51
+ | `className?` | `string` | `-` | Class CSS kustom. |
52
+ | `onClose?` | `(event?: any) => void` | `-` | Event callback saat tombol tutup diklik. |
53
+
54
+ ## 4. Usage Examples
55
+
56
+ ### React Example
57
+ ```tsx
58
+ import Banner from "@ttdk-design-system/library-react/web/banner";
59
+ import "@ttdk-design-system/library-react/web/banner/banner.css";
60
+
61
+ export function Example() {
62
+ return (
63
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '16px' }}>
64
+ <Banner
65
+ title="Katalog Dataset Kesehatan Nasional"
66
+ description="Jelajahi dan unduh data agregat fasilitas kesehatan terstandardisasi."
67
+ variant="default"
68
+ appearance="gradient"
69
+ icon
70
+ />
71
+ <Banner
72
+ title="Pemeliharaan Sistem Terjadwal"
73
+ description="Layanan integrasi API akan mengalami pemeliharaan pada pukul 23:00 WIB."
74
+ variant="warning"
75
+ closable
76
+ />
77
+ </div>
78
+ );
79
+ }
80
+ ```
81
+
82
+ ### Vue 3 Example
83
+ ```vue
84
+ <script setup lang="ts">
85
+ import Banner from "@ttdk-design-system/library-vue/web/banner";
86
+ import "@ttdk-design-system/library-vue/web/banner/banner.css";
87
+ </script>
88
+
89
+ <template>
90
+ <div style="display: flex; flex-direction: column; gap: 16px;">
91
+ <Banner
92
+ title="Katalog Dataset Kesehatan Nasional"
93
+ description="Jelajahi dan unduh data agregat fasilitas kesehatan terstandardisasi."
94
+ variant="default"
95
+ appearance="gradient"
96
+ :icon="true"
97
+ />
98
+ <Banner
99
+ title="Pemeliharaan Sistem Terjadwal"
100
+ description="Layanan integrasi API akan mengalami pemeliharaan pada pukul 23:00 WIB."
101
+ variant="warning"
102
+ :closable="true"
103
+ />
104
+ </div>
105
+ </template>
106
+ ```
107
+
108
+ ### Svelte Example
109
+ ```svelte
110
+ <script lang="ts">
111
+ import Banner from "@ttdk-design-system/library-svelte/web/banner";
112
+ import "@ttdk-design-system/library-svelte/web/banner/banner.css";
113
+ </script>
114
+
115
+ <div style="display: flex; flex-direction: column; gap: 16px;">
116
+ <Banner
117
+ title="Katalog Dataset Kesehatan Nasional"
118
+ description="Jelajahi dan unduh data agregat fasilitas kesehatan terstandardisasi."
119
+ variant="default"
120
+ appearance="gradient"
121
+ icon={true}
122
+ />
123
+ <Banner
124
+ title="Pemeliharaan Sistem Terjadwal"
125
+ description="Layanan integrasi API akan mengalami pemeliharaan pada pukul 23:00 WIB."
126
+ variant="warning"
127
+ closable={true}
128
+ />
129
+ </div>
130
+ ```
@@ -0,0 +1 @@
1
+ .ttdk-banner{box-sizing:border-box;width:100%;font-family:var(--ttdk-font-sans);border:1px solid #0000;justify-content:space-between;align-items:center;gap:16px;line-height:1.5;transition:background .2s,border-color .2s,box-shadow .2s,color .2s;display:flex;position:relative;overflow:hidden}.ttdk-banner[data-rounded=none]{border-radius:var(--ttdk-radius-none,0px)}.ttdk-banner[data-rounded=sm]{border-radius:var(--ttdk-radius-xs,4px)}.ttdk-banner[data-rounded=md]{border-radius:var(--ttdk-radius-sm,8px)}.ttdk-banner[data-rounded=lg]{border-radius:var(--ttdk-radius-md,12px)}.ttdk-banner[data-rounded=full]{border-radius:var(--ttdk-radius-full,9999px)}.ttdk-banner[data-size=sm]{padding:10px 16px;font-size:13px}.ttdk-banner[data-size=sm] .ttdk-banner-title{font-size:14px}.ttdk-banner[data-size=sm] .ttdk-banner-desc{font-size:12px}.ttdk-banner[data-size=md]{padding:14px 20px;font-size:14px}.ttdk-banner[data-size=md] .ttdk-banner-title{font-size:16px}.ttdk-banner[data-size=md] .ttdk-banner-desc{font-size:13px}.ttdk-banner[data-size=lg]{padding:18px 24px;font-size:15px}.ttdk-banner[data-size=lg] .ttdk-banner-title{font-size:18px}.ttdk-banner[data-size=lg] .ttdk-banner-desc{font-size:14px}.ttdk-banner[data-size=xl]{padding:24px 32px;font-size:16px}.ttdk-banner[data-size=xl] .ttdk-banner-title{font-size:22px}.ttdk-banner[data-size=xl] .ttdk-banner-desc{font-size:15px}.ttdk-banner-main{flex:1;align-items:center;gap:12px;min-width:0;display:flex}.ttdk-banner-icon-wrapper{color:inherit;flex-shrink:0;justify-content:center;align-items:center;display:flex}.ttdk-banner-icon{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0;justify-content:center;align-items:center;width:20px;height:20px;display:inline-flex}.ttdk-banner-icon>svg{width:100%;height:100%;display:block}.ttdk-banner-text-group{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.ttdk-banner-title{letter-spacing:-.015em;color:var(--ttdk-ui-color,var(--ttdk-text-icon-primary,#1f2022));font-weight:700;line-height:1.35}.ttdk-banner-desc{color:var(--ttdk-ui-color,var(--ttdk-text-icon-secondary,#62686f));font-weight:400;line-height:1.45}.ttdk-banner-actions{flex-shrink:0;align-items:center;gap:10px;display:flex}.ttdk-banner-close-btn{width:28px;height:28px;color:inherit;opacity:.7;cursor:pointer;background:0 0;border:none;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;padding:0;transition:opacity .15s,background-color .15s;display:flex}.ttdk-banner-close-btn svg{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round;width:15px;height:15px}.ttdk-banner-close-btn:hover{opacity:1;background-color:#0000000f}.ttdk-banner[data-appearance=gradient]{border-color:#0000}.ttdk-banner[data-appearance=gradient][data-variant=info]{background:linear-gradient(133.41deg, var(--ttdk-bg-status-info-subtle) 15.99%, var(--ttdk-bg-base-primary) 91.99%);color:var(--ttdk-text-icon-status-info);border-color:#0000}.ttdk-banner[data-appearance=gradient][data-variant=warning]{background:linear-gradient(133.41deg, var(--ttdk-bg-status-warning-subtle) 15.99%, var(--ttdk-bg-base-primary) 91.99%);color:var(--ttdk-text-icon-status-warning);border-color:#0000}.ttdk-banner[data-appearance=gradient][data-variant=danger]{background:linear-gradient(133.41deg, var(--ttdk-bg-status-error-subtle) 15.99%, var(--ttdk-bg-base-primary) 91.99%);color:var(--ttdk-text-icon-status-error);border-color:#0000}.ttdk-banner[data-appearance=gradient][data-variant=success]{background:linear-gradient(133.41deg, var(--ttdk-bg-status-success-subtle) 15.99%, var(--ttdk-bg-base-primary) 91.99%);color:var(--ttdk-text-icon-status-success);border-color:#0000}.ttdk-banner[data-appearance=gradient][data-variant=primary]{background:linear-gradient(133.41deg, var(--ttdk-brand-subtle) 15.99%, var(--ttdk-bg-base-primary) 91.99%);color:var(--ttdk-brand-default);border-color:#0000}.ttdk-banner[data-appearance=subtle][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-banner[data-appearance=subtle][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-banner[data-appearance=subtle][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-banner[data-appearance=subtle][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-banner[data-appearance=subtle][data-variant=primary]{background-color:var(--ttdk-brand-subtle);border-color:var(--ttdk-stroke-border-focus);color:var(--ttdk-brand-default)}.ttdk-banner[data-appearance=solid],.ttdk-banner[data-appearance=solid] .ttdk-banner-title{color:var(--ttdk-color-neutral-white,#fff)}.ttdk-banner[data-appearance=solid] .ttdk-banner-desc{color:#ffffffe6}.ttdk-banner[data-appearance=solid] .ttdk-banner-close-btn:hover{background-color:#fff3}.ttdk-banner[data-appearance=solid][data-variant=info]{background-color:var(--ttdk-bg-status-info);border-color:var(--ttdk-bg-status-info)}.ttdk-banner[data-appearance=solid][data-variant=warning]{background-color:var(--ttdk-bg-status-warning);border-color:var(--ttdk-bg-status-warning)}.ttdk-banner[data-appearance=solid][data-variant=danger]{background-color:var(--ttdk-bg-status-error);border-color:var(--ttdk-bg-status-error)}.ttdk-banner[data-appearance=solid][data-variant=success]{background-color:var(--ttdk-bg-status-success);border-color:var(--ttdk-bg-status-success)}.ttdk-banner[data-appearance=solid][data-variant=primary]{background-color:var(--ttdk-brand-default);border-color:var(--ttdk-brand-default)}.ttdk-banner[data-appearance=outline]{background-color:#0000}.ttdk-banner[data-appearance=outline][data-variant=info]{border-color:var(--ttdk-stroke-status-info);color:var(--ttdk-text-icon-status-info)}.ttdk-banner[data-appearance=outline][data-variant=warning]{border-color:var(--ttdk-stroke-status-warning);color:var(--ttdk-text-icon-status-warning)}.ttdk-banner[data-appearance=outline][data-variant=danger]{border-color:var(--ttdk-stroke-status-error);color:var(--ttdk-text-icon-status-error)}.ttdk-banner[data-appearance=outline][data-variant=success]{border-color:var(--ttdk-stroke-status-success);color:var(--ttdk-text-icon-status-success)}.ttdk-banner[data-appearance=outline][data-variant=primary]{border-color:var(--ttdk-stroke-border-focus);color:var(--ttdk-brand-default)}.ttdk-banner[data-appearance=flat]{background-color:var(--ttdk-bg-secondary-disabled);border-color:var(--ttdk-stroke-subtle)}.dark .ttdk-banner,:root.dark .ttdk-banner,html.dark .ttdk-banner,[data-theme=dark] .ttdk-banner{border-color:var(--ttdk-stroke-subtle)}.dark .ttdk-banner .ttdk-banner-title,:root.dark .ttdk-banner .ttdk-banner-title,html.dark .ttdk-banner .ttdk-banner-title,[data-theme=dark] .ttdk-banner .ttdk-banner-title{color:var(--ttdk-text-icon-primary)}.dark .ttdk-banner .ttdk-banner-desc,:root.dark .ttdk-banner .ttdk-banner-desc,html.dark .ttdk-banner .ttdk-banner-desc,[data-theme=dark] .ttdk-banner .ttdk-banner-desc,.dark .ttdk-banner .ttdk-banner-close-btn,:root.dark .ttdk-banner .ttdk-banner-close-btn,html.dark .ttdk-banner .ttdk-banner-close-btn,[data-theme=dark] .ttdk-banner .ttdk-banner-close-btn{color:var(--ttdk-text-icon-secondary)}.dark .ttdk-banner .ttdk-banner-close-btn:hover,:root.dark .ttdk-banner .ttdk-banner-close-btn:hover,html.dark .ttdk-banner .ttdk-banner-close-btn:hover,[data-theme=dark] .ttdk-banner .ttdk-banner-close-btn:hover{color:var(--ttdk-text-icon-primary);background-color:#ffffff1a}.dark .ttdk-banner[data-appearance=gradient][data-variant=primary],:root.dark .ttdk-banner[data-appearance=gradient][data-variant=primary],html.dark .ttdk-banner[data-appearance=gradient][data-variant=primary],[data-theme=dark] .ttdk-banner[data-appearance=gradient][data-variant=primary]{background:linear-gradient(133.41deg, #16b3ac38 15.99%, var(--ttdk-bg-card) 91.99%);color:var(--ttdk-brand-default);border:1px solid #16b3ac59}.dark .ttdk-banner[data-appearance=gradient][data-variant=info],:root.dark .ttdk-banner[data-appearance=gradient][data-variant=info],html.dark .ttdk-banner[data-appearance=gradient][data-variant=info],[data-theme=dark] .ttdk-banner[data-appearance=gradient][data-variant=info]{background:linear-gradient(133.41deg, #2196f338 15.99%, var(--ttdk-bg-card) 91.99%);color:var(--ttdk-text-icon-status-info);border:1px solid #2196f359}.dark .ttdk-banner[data-appearance=gradient][data-variant=success],:root.dark .ttdk-banner[data-appearance=gradient][data-variant=success],html.dark .ttdk-banner[data-appearance=gradient][data-variant=success],[data-theme=dark] .ttdk-banner[data-appearance=gradient][data-variant=success]{background:linear-gradient(133.41deg, #047b5d38 15.99%, var(--ttdk-bg-card) 91.99%);color:var(--ttdk-text-icon-status-success);border:1px solid #8cc2b459}.dark .ttdk-banner[data-appearance=gradient][data-variant=warning],:root.dark .ttdk-banner[data-appearance=gradient][data-variant=warning],html.dark .ttdk-banner[data-appearance=gradient][data-variant=warning],[data-theme=dark] .ttdk-banner[data-appearance=gradient][data-variant=warning]{background:linear-gradient(133.41deg, #fb8c0038 15.99%, var(--ttdk-bg-card) 91.99%);color:var(--ttdk-text-icon-status-warning);border:1px solid #fdca8a59}.dark .ttdk-banner[data-appearance=gradient][data-variant=danger],:root.dark .ttdk-banner[data-appearance=gradient][data-variant=danger],html.dark .ttdk-banner[data-appearance=gradient][data-variant=danger],[data-theme=dark] .ttdk-banner[data-appearance=gradient][data-variant=danger]{background:linear-gradient(133.41deg, #c50a2438 15.99%, var(--ttdk-bg-card) 91.99%);color:var(--ttdk-text-icon-status-error);border:1px solid #c50a2459}.dark .ttdk-banner[data-appearance=subtle][data-variant=primary],:root.dark .ttdk-banner[data-appearance=subtle][data-variant=primary],html.dark .ttdk-banner[data-appearance=subtle][data-variant=primary],[data-theme=dark] .ttdk-banner[data-appearance=subtle][data-variant=primary]{background-color:var(--ttdk-brand-subtle-dark);border-color:var(--ttdk-brand-default);color:var(--ttdk-brand-default)}.dark .ttdk-banner[data-appearance=subtle][data-variant=info],:root.dark .ttdk-banner[data-appearance=subtle][data-variant=info],html.dark .ttdk-banner[data-appearance=subtle][data-variant=info],[data-theme=dark] .ttdk-banner[data-appearance=subtle][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)}.dark .ttdk-banner[data-appearance=subtle][data-variant=success],:root.dark .ttdk-banner[data-appearance=subtle][data-variant=success],html.dark .ttdk-banner[data-appearance=subtle][data-variant=success],[data-theme=dark] .ttdk-banner[data-appearance=subtle][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)}.dark .ttdk-banner[data-appearance=subtle][data-variant=warning],:root.dark .ttdk-banner[data-appearance=subtle][data-variant=warning],html.dark .ttdk-banner[data-appearance=subtle][data-variant=warning],[data-theme=dark] .ttdk-banner[data-appearance=subtle][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)}.dark .ttdk-banner[data-appearance=subtle][data-variant=danger],:root.dark .ttdk-banner[data-appearance=subtle][data-variant=danger],html.dark .ttdk-banner[data-appearance=subtle][data-variant=danger],[data-theme=dark] .ttdk-banner[data-appearance=subtle][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)}.dark .ttdk-banner[data-appearance=solid],:root.dark .ttdk-banner[data-appearance=solid],html.dark .ttdk-banner[data-appearance=solid],[data-theme=dark] .ttdk-banner[data-appearance=solid],.dark .ttdk-banner[data-appearance=solid] .ttdk-banner-title,:root.dark .ttdk-banner[data-appearance=solid] .ttdk-banner-title,html.dark .ttdk-banner[data-appearance=solid] .ttdk-banner-title,[data-theme=dark] .ttdk-banner[data-appearance=solid] .ttdk-banner-title{color:var(--ttdk-color-neutral-white,#fff)}.dark .ttdk-banner[data-appearance=solid] .ttdk-banner-desc,:root.dark .ttdk-banner[data-appearance=solid] .ttdk-banner-desc,html.dark .ttdk-banner[data-appearance=solid] .ttdk-banner-desc,[data-theme=dark] .ttdk-banner[data-appearance=solid] .ttdk-banner-desc{color:#ffffffe6}.dark .ttdk-banner[data-appearance=solid] .ttdk-banner-close-btn,:root.dark .ttdk-banner[data-appearance=solid] .ttdk-banner-close-btn,html.dark .ttdk-banner[data-appearance=solid] .ttdk-banner-close-btn,[data-theme=dark] .ttdk-banner[data-appearance=solid] .ttdk-banner-close-btn{color:var(--ttdk-color-neutral-white,#fff)}.dark .ttdk-banner[data-appearance=solid] .ttdk-banner-close-btn:hover,:root.dark .ttdk-banner[data-appearance=solid] .ttdk-banner-close-btn:hover,html.dark .ttdk-banner[data-appearance=solid] .ttdk-banner-close-btn:hover,[data-theme=dark] .ttdk-banner[data-appearance=solid] .ttdk-banner-close-btn:hover{color:var(--ttdk-color-neutral-white,#fff);background-color:#fff3}.dark .ttdk-banner[data-appearance=outline],:root.dark .ttdk-banner[data-appearance=outline],html.dark .ttdk-banner[data-appearance=outline],[data-theme=dark] .ttdk-banner[data-appearance=outline]{background-color:#0000}.dark .ttdk-banner[data-appearance=outline][data-variant=primary],:root.dark .ttdk-banner[data-appearance=outline][data-variant=primary],html.dark .ttdk-banner[data-appearance=outline][data-variant=primary],[data-theme=dark] .ttdk-banner[data-appearance=outline][data-variant=primary]{border-color:var(--ttdk-stroke-border-focus);color:var(--ttdk-brand-default)}.dark .ttdk-banner[data-appearance=outline][data-variant=info],:root.dark .ttdk-banner[data-appearance=outline][data-variant=info],html.dark .ttdk-banner[data-appearance=outline][data-variant=info],[data-theme=dark] .ttdk-banner[data-appearance=outline][data-variant=info]{border-color:var(--ttdk-stroke-status-info);color:var(--ttdk-text-icon-status-info)}.dark .ttdk-banner[data-appearance=outline][data-variant=success],:root.dark .ttdk-banner[data-appearance=outline][data-variant=success],html.dark .ttdk-banner[data-appearance=outline][data-variant=success],[data-theme=dark] .ttdk-banner[data-appearance=outline][data-variant=success]{border-color:var(--ttdk-stroke-status-success);color:var(--ttdk-text-icon-status-success)}.dark .ttdk-banner[data-appearance=outline][data-variant=warning],:root.dark .ttdk-banner[data-appearance=outline][data-variant=warning],html.dark .ttdk-banner[data-appearance=outline][data-variant=warning],[data-theme=dark] .ttdk-banner[data-appearance=outline][data-variant=warning]{border-color:var(--ttdk-stroke-status-warning);color:var(--ttdk-text-icon-status-warning)}.dark .ttdk-banner[data-appearance=outline][data-variant=danger],:root.dark .ttdk-banner[data-appearance=outline][data-variant=danger],html.dark .ttdk-banner[data-appearance=outline][data-variant=danger],[data-theme=dark] .ttdk-banner[data-appearance=outline][data-variant=danger]{border-color:var(--ttdk-stroke-status-error);color:var(--ttdk-text-icon-status-error)}.dark .ttdk-banner[data-appearance=flat],:root.dark .ttdk-banner[data-appearance=flat],html.dark .ttdk-banner[data-appearance=flat],[data-theme=dark] .ttdk-banner[data-appearance=flat]{background-color:var(--ttdk-bg-card);border-color:var(--ttdk-stroke-subtle)}
@@ -0,0 +1,180 @@
1
+ <script context="module"></script>
2
+
3
+ <script>import { buildUiVars, UiProps } from "../../core/types";
4
+ export let onClose = void 0;
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 title = void 0;
11
+ export let ui = void 0;
12
+ export let iconColor = void 0;
13
+ export let iconSize = void 0;
14
+ export let customIcon = void 0;
15
+ export let icon = void 0;
16
+ export let iconClass = void 0;
17
+ export let iconStyle = void 0;
18
+ export let titleClass = void 0;
19
+ export let titleStyle = void 0;
20
+ export let description = void 0;
21
+ export let descClass = void 0;
22
+ export let descStyle = void 0;
23
+ export let closable = void 0;
24
+ export let closableClass = void 0;
25
+ export let closableStyle = void 0;
26
+ function stringifyStyles(stylesObj) {
27
+ let styles = "";
28
+ for (let key in stylesObj) {
29
+ const dashedKey = key.replace(/[A-Z]/g, function(match) {
30
+ return "-" + match.toLowerCase();
31
+ });
32
+ styles += dashedKey + ":" + stylesObj[key] + ";";
33
+ }
34
+ return styles;
35
+ }
36
+ function handleDismiss(event) {
37
+ isVisible = false;
38
+ if (onClose) {
39
+ onClose(event);
40
+ }
41
+ }
42
+ let isVisible = true;
43
+ </script>
44
+
45
+ {#if isVisible}
46
+ <div
47
+ style={stringifyStyles({
48
+ ...buildUiVars(ui),
49
+ ...(iconColor
50
+ ? {
51
+ "--ttdk-ui-icon-color": iconColor,
52
+ }
53
+ : {}),
54
+ ...(iconSize
55
+ ? {
56
+ "--ttdk-ui-icon-size": iconSize,
57
+ }
58
+ : {}),
59
+ })}
60
+ role="region"
61
+ class={`ttdk-banner ${className || ""}`.trim()}
62
+ data-variant={variant || "primary"}
63
+ data-appearance={appearance || "gradient"}
64
+ data-size={size || "md"}
65
+ data-rounded={rounded || "md"}
66
+ aria-label={title || "Banner"}
67
+ >
68
+ <div class="ttdk-banner-main">
69
+ {#if customIcon || (icon && icon !== false)}
70
+ <div
71
+ style={stringifyStyles({
72
+ ...buildUiVars(iconStyle),
73
+ })}
74
+ class={`ttdk-banner-icon-wrapper ${iconClass || ""}`.trim()}
75
+ >
76
+ {#if customIcon || (icon && typeof icon !== "boolean")}
77
+ <span class="ttdk-banner-icon">{customIcon || icon}</span>
78
+ {/if}
79
+ {#if !customIcon && icon === true}
80
+ {#if !variant || variant === "primary"}
81
+ <svg class="ttdk-banner-icon" viewBox="0 0 24 24" fill="none"
82
+ ><path
83
+ d="M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5"
84
+ /></svg
85
+ >
86
+ {/if}
87
+
88
+ {#if variant === "info"}
89
+ <svg class="ttdk-banner-icon" viewBox="0 0 24 24" fill="none"
90
+ ><circle cx="12" cy="12" r="10" /><line
91
+ x1="12"
92
+ y1="16"
93
+ x2="12"
94
+ y2="12"
95
+ /><line x1="12" y1="8" x2="12.01" y2="8" /></svg
96
+ >
97
+ {/if}
98
+
99
+ {#if variant === "success"}
100
+ <svg class="ttdk-banner-icon" viewBox="0 0 24 24" fill="none"
101
+ ><circle cx="12" cy="12" r="10" /><polyline
102
+ points="9 12 11 14 15 10"
103
+ /></svg
104
+ >
105
+ {/if}
106
+
107
+ {#if variant === "warning"}
108
+ <svg class="ttdk-banner-icon" viewBox="0 0 24 24" fill="none"
109
+ ><path
110
+ d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"
111
+ /><line x1="12" y1="9" x2="12" y2="13" /><line
112
+ x1="12"
113
+ y1="17"
114
+ x2="12.01"
115
+ y2="17"
116
+ /></svg
117
+ >
118
+ {/if}
119
+
120
+ {#if variant === "danger"}
121
+ <svg class="ttdk-banner-icon" viewBox="0 0 24 24" fill="none"
122
+ ><circle cx="12" cy="12" r="10" /><line
123
+ x1="12"
124
+ y1="8"
125
+ x2="12"
126
+ y2="12"
127
+ /><line x1="12" y1="16" x2="12.01" y2="16" /></svg
128
+ >
129
+ {/if}
130
+ {/if}
131
+ </div>
132
+ {/if}
133
+ <div class="ttdk-banner-text-group">
134
+ {#if title}
135
+ <div
136
+ style={stringifyStyles({
137
+ ...buildUiVars(titleStyle),
138
+ })}
139
+ class={`ttdk-banner-title ${titleClass || ""}`.trim()}
140
+ >
141
+ {title}
142
+ </div>
143
+ {/if}
144
+ {#if description}
145
+ <div
146
+ style={stringifyStyles({
147
+ ...buildUiVars(descStyle),
148
+ })}
149
+ class={`ttdk-banner-desc ${descClass || ""}`.trim()}
150
+ >
151
+ {description}
152
+ </div>
153
+ {/if}<slot />
154
+ </div>
155
+ </div>
156
+ {#if closable}
157
+ <div class="ttdk-banner-actions">
158
+ <button
159
+ style={stringifyStyles({
160
+ ...buildUiVars(closableStyle),
161
+ })}
162
+ type="button"
163
+ aria-label="Tutup banner"
164
+ class={`ttdk-banner-close-btn ${closableClass || ""}`.trim()}
165
+ on:click={(e) => {
166
+ handleDismiss(e);
167
+ }}
168
+ ><svg viewBox="0 0 24 24" fill="none"
169
+ ><line x1="18" y1="6" x2="6" y2="18" /><line
170
+ x1="6"
171
+ y1="6"
172
+ x2="18"
173
+ y2="18"
174
+ /></svg
175
+ ></button
176
+ >
177
+ </div>
178
+ {/if}
179
+ </div>
180
+ {/if}
@@ -0,0 +1,172 @@
1
+ import { SvelteComponent } from "svelte";
2
+ export type BannerUiProps = UiProps;
3
+ export interface BannerProps {
4
+ /**
5
+ * Judul utama banner yang ditampilkan dengan tipografi tegas (misal: "Katalog Dataset Publik").
6
+ */
7
+ title?: string;
8
+ /**
9
+ * Deskripsi atau pesan teks penjelasan tambahan di bawah judul.
10
+ */
11
+ description?: string;
12
+ /**
13
+ * Varian warna semantik tema banner:
14
+ * - `'primary'`: Brand Teal utama (#16B3AC).
15
+ * - `'success'`: Hijau konfirmasi keberhasilan.
16
+ * - `'info'`: Biru informasi.
17
+ * - `'warning'`: Kuning / amber peringatan.
18
+ * - `'danger'`: Merah kesalahan / bahaya.
19
+ *
20
+ * @default 'primary'
21
+ */
22
+ variant?: "primary" | "success" | "info" | "warning" | "danger";
23
+ /**
24
+ * Gaya tampilan visual latar belakang banner.
25
+ * - `'gradient'`: Latar belakang gradasi halus elegan (standar sesuai desain katalog).
26
+ * - `'subtle'`: Latar belakang warna lembut transparan.
27
+ * - `'solid'`: Latar belakang warna pekat penuh dengan teks kontras tinggi.
28
+ * - `'outline'`: Garis tepi minimalis tanpa latar belakang gradasi.
29
+ * - `'flat'`: Latar polos solid netral.
30
+ *
31
+ * @default 'gradient'
32
+ */
33
+ appearance?: "gradient" | "subtle" | "solid" | "outline" | "flat";
34
+ /**
35
+ * Skala ukuran tinggi dan padding ruang dalam banner.
36
+ * - `'sm'`: Kompak (padding 10px 16px, judul 14px).
37
+ * - `'md'`: Standar (padding 14px 20px, judul 16px).
38
+ * - `'lg'`: Besar / Page Header (padding 18px 24px, judul 18px).
39
+ * - `'xl'`: Ekstra Besar / Hero Banner (padding 24px 32px, judul 22px).
40
+ *
41
+ * @default 'md'
42
+ */
43
+ size?: "sm" | "md" | "lg" | "xl";
44
+ /**
45
+ * Bentuk sudut kelengkungan container banner.
46
+ * - `'none'`: Sudut siku 0px.
47
+ * - `'sm'`: Sudut 4px.
48
+ * - `'md'`: Sudut 8px (standar).
49
+ * - `'lg'`: Sudut 12px.
50
+ * - `'full'`: Sudut kapsul 9999px.
51
+ *
52
+ * @default 'md'
53
+ */
54
+ rounded?: "none" | "sm" | "md" | "lg" | "full";
55
+ /**
56
+ * Menampilkan ikon indikator status semantik (boolean) atau elemen ikon kustom.
57
+ *
58
+ * @default false
59
+ */
60
+ icon?: boolean | any;
61
+ /**
62
+ * Elemen ikon SVG kustom untuk menggantikan ikon bawaan banner.
63
+ */
64
+ customIcon?: any;
65
+ /**
66
+ * Warna kustom untuk ikon banner secara langsung.
67
+ */
68
+ iconColor?: string;
69
+ /**
70
+ * Ukuran kustom untuk ikon banner secara langsung.
71
+ */
72
+ iconSize?: string;
73
+ /**
74
+ * Style kustom untuk ikon banner (UiProps).
75
+ */
76
+ iconStyle?: UiProps;
77
+ /**
78
+ * Class CSS kustom untuk ikon banner.
79
+ */
80
+ iconClass?: string;
81
+ /**
82
+ * Style kustom untuk judul banner (UiProps).
83
+ */
84
+ titleStyle?: UiProps;
85
+ /**
86
+ * Class CSS kustom untuk judul banner.
87
+ */
88
+ titleClass?: string;
89
+ /**
90
+ * Style kustom untuk deskripsi banner (UiProps).
91
+ */
92
+ descStyle?: UiProps;
93
+ /**
94
+ * Class CSS kustom untuk deskripsi banner.
95
+ */
96
+ descClass?: string;
97
+ /**
98
+ * Menampilkan tombol silang (x) untuk menutup atau menyembunyikan banner.
99
+ *
100
+ * @default false
101
+ */
102
+ closable?: boolean;
103
+ /**
104
+ * Style kustom untuk tombol tutup banner (UiProps).
105
+ */
106
+ closableStyle?: UiProps;
107
+ /**
108
+ * Class CSS kustom untuk tombol tutup banner.
109
+ */
110
+ closableClass?: string;
111
+ /**
112
+ * Kustomisasi visual granular melalui style-like object (+ support pseudo-class: hover, active).
113
+ */
114
+ ui?: UiProps;
115
+ /**
116
+ * Inline CSS style object native.
117
+ */
118
+ style?: any;
119
+ /**
120
+ * Konten kustom tambahan / isi banner (children slot).
121
+ */
122
+ children?: any;
123
+ /**
124
+ * Class CSS kustom.
125
+ */
126
+ className?: string;
127
+ /**
128
+ * Event callback saat tombol tutup diklik.
129
+ */
130
+ onClose?: (event?: any) => void;
131
+ }
132
+ import { UiProps } from "../../core/types";
133
+ declare const __propDef: {
134
+ props: {
135
+ onClose?: BannerProps["onClose"];
136
+ className?: BannerProps["className"];
137
+ variant?: BannerProps["variant"];
138
+ appearance?: BannerProps["appearance"];
139
+ size?: BannerProps["size"];
140
+ rounded?: BannerProps["rounded"];
141
+ title?: BannerProps["title"];
142
+ ui?: BannerProps["ui"];
143
+ iconColor?: BannerProps["iconColor"];
144
+ iconSize?: BannerProps["iconSize"];
145
+ customIcon?: BannerProps["customIcon"];
146
+ icon?: BannerProps["icon"];
147
+ iconClass?: BannerProps["iconClass"];
148
+ iconStyle?: BannerProps["iconStyle"];
149
+ titleClass?: BannerProps["titleClass"];
150
+ titleStyle?: BannerProps["titleStyle"];
151
+ description?: BannerProps["description"];
152
+ descClass?: BannerProps["descClass"];
153
+ descStyle?: BannerProps["descStyle"];
154
+ closable?: BannerProps["closable"];
155
+ closableClass?: BannerProps["closableClass"];
156
+ closableStyle?: BannerProps["closableStyle"];
157
+ };
158
+ events: {
159
+ [evt: string]: CustomEvent<any>;
160
+ };
161
+ slots: {
162
+ default: {};
163
+ };
164
+ exports?: {} | undefined;
165
+ bindings?: string | undefined;
166
+ };
167
+ type BannerProps_ = typeof __propDef.props;
168
+ export type BannerEvents = typeof __propDef.events;
169
+ export type BannerSlots = typeof __propDef.slots;
170
+ export default class Banner extends SvelteComponent<BannerProps_, BannerEvents, BannerSlots> {
171
+ }
172
+ export {};
@@ -0,0 +1,2 @@
1
+ export { default } from './banner.svelte';
2
+ export { default as Banner } from './banner.svelte';
@@ -0,0 +1,2 @@
1
+ export { default } from './banner.svelte';
2
+ export { default as Banner } from './banner.svelte';