@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,159 @@
1
+ import { SvelteComponent } from "svelte";
2
+ export type ButtonUiProps = UiProps;
3
+ export interface ButtonProps {
4
+ /**
5
+ * Inline CSS style kustom.
6
+ */
7
+ style?: any;
8
+ /**
9
+ * Varian warna semantik tombol:
10
+ * - `'primary'`: Teal utama.
11
+ * - `'info'`: Biru informasi.
12
+ * - `'warning'`: Kuning peringatan.
13
+ * - `'danger'`: Merah bahaya.
14
+ * - `'neutral'`: Abu-abu netral.
15
+ * - `'disabled'`: Tombol non-aktif.
16
+ *
17
+ * @default 'primary'
18
+ */
19
+ variant?: "primary" | "info" | "warning" | "danger" | "neutral" | "disabled";
20
+ /**
21
+ * Gaya tampilan visual tombol:
22
+ * - `'solid'`: Latar belakang warna solid pekat (default).
23
+ * - `'soft'`: Latar belakang warna transparan lembut.
24
+ * - `'outline'`: Garis tepi dengan latar belakang transparan.
25
+ * - `'link'`: Teks tautan tanpa border/latar, dengan garis bawah saat hover.
26
+ * - `'ghost'`: Transparan tanpa outline/border, dengan latar lembut saat hover.
27
+ *
28
+ * @default 'solid'
29
+ */
30
+ appearance?: "solid" | "soft" | "outline" | "link" | "ghost";
31
+ /**
32
+ * Tipe tombol HTML native.
33
+ * @default 'button'
34
+ */
35
+ type?: "button" | "submit" | "reset";
36
+ /**
37
+ * Skala ukuran tombol:
38
+ * - `'sm'`: 36px
39
+ * - `'md'`: 48px (standar)
40
+ * - `'lg'`: 56px
41
+ *
42
+ * @default 'md'
43
+ */
44
+ size?: "sm" | "md" | "lg";
45
+ /**
46
+ * Mode negatif — kontras tinggi di atas latar gelap.
47
+ * @default false
48
+ */
49
+ negative?: boolean;
50
+ /**
51
+ * Radius sudut tombol.
52
+ * - `'none'`: 0px
53
+ * - `'sm'`: 4px
54
+ * - `'md'`: 8px (standar)
55
+ * - `'lg'`: 12px
56
+ * - `'full'`: 9999px (pill)
57
+ *
58
+ * @default 'md'
59
+ */
60
+ rounded?: "none" | "sm" | "md" | "lg" | "full";
61
+ /**
62
+ * Mode tombol ikon persegi (aspek rasio 1:1).
63
+ * @default false
64
+ */
65
+ iconOnly?: boolean;
66
+ /**
67
+ * Full-width — melebar 100% dari container.
68
+ * @default false
69
+ */
70
+ block?: boolean;
71
+ /**
72
+ * Tampilkan spinner & nonaktifkan tombol saat proses async.
73
+ * @default false
74
+ */
75
+ loading?: boolean;
76
+ /**
77
+ * Nonaktifkan tombol dari interaksi pengguna.
78
+ * @default false
79
+ */
80
+ disabled?: boolean;
81
+ /**
82
+ * Warna kustom untuk ikon di dalam tombol (misal: '#fff', '#0968F6').
83
+ */
84
+ iconColor?: string;
85
+ /**
86
+ * Ukuran kustom untuk ikon di dalam tombol (misal: '16px', '20px').
87
+ */
88
+ iconSize?: string;
89
+ /**
90
+ * Kustomisasi visual — seperti style object tapi dengan support pseudo-class.
91
+ *
92
+ * @example
93
+ * ```tsx
94
+ * <Button
95
+ * ui={{
96
+ * background: '#7c3aed',
97
+ * color: 'white',
98
+ * borderRadius: '99px',
99
+ * hover: {
100
+ * background: '#6d28d9',
101
+ * transform: 'scale(1.02)',
102
+ * },
103
+ * active: {
104
+ * opacity: '0.9',
105
+ * }
106
+ * }}
107
+ * />
108
+ * ```
109
+ */
110
+ ui?: UiProps;
111
+ /**
112
+ * Event handler saat tombol diklik.
113
+ */
114
+ onClick?: (event?: any) => void;
115
+ /**
116
+ * Class CSS kustom.
117
+ */
118
+ className?: string;
119
+ /**
120
+ * Konten tombol — teks, ikon, atau JSX.
121
+ */
122
+ children?: any;
123
+ }
124
+ import { UiProps } from "../../core/types";
125
+ declare const __propDef: {
126
+ props: {
127
+ className?: ButtonProps["className"];
128
+ type?: ButtonProps["type"];
129
+ variant?: ButtonProps["variant"];
130
+ appearance?: ButtonProps["appearance"];
131
+ size?: ButtonProps["size"];
132
+ negative?: ButtonProps["negative"];
133
+ rounded?: ButtonProps["rounded"];
134
+ iconOnly?: ButtonProps["iconOnly"];
135
+ block?: ButtonProps["block"];
136
+ loading?: ButtonProps["loading"];
137
+ disabled?: ButtonProps["disabled"];
138
+ ui?: ButtonProps["ui"];
139
+ iconColor?: ButtonProps["iconColor"];
140
+ iconSize?: ButtonProps["iconSize"];
141
+ onClick?: ButtonProps["onClick"];
142
+ };
143
+ events: {
144
+ click: CustomEvent<any>;
145
+ } & {
146
+ [evt: string]: CustomEvent<any>;
147
+ };
148
+ slots: {
149
+ default: {};
150
+ };
151
+ exports?: {} | undefined;
152
+ bindings?: string | undefined;
153
+ };
154
+ type ButtonProps_ = typeof __propDef.props;
155
+ export type ButtonEvents = typeof __propDef.events;
156
+ export type ButtonSlots = typeof __propDef.slots;
157
+ export default class Button extends SvelteComponent<ButtonProps_, ButtonEvents, ButtonSlots> {
158
+ }
159
+ export {};
@@ -0,0 +1,2 @@
1
+ export { default } from './button.svelte';
2
+ export { default as Button } from './button.svelte';
@@ -0,0 +1,2 @@
1
+ export { default } from './button.svelte';
2
+ export { default as Button } from './button.svelte';
@@ -0,0 +1,177 @@
1
+ {
2
+ "name": "@ttdk-design-system/button",
3
+ "component": "Button",
4
+ "folder": "button",
5
+ "description": "TTDK Button component with multi-theme support.",
6
+ "stylesheets": [
7
+ {
8
+ "theme": "common",
9
+ "file": "button.css",
10
+ "importPath": "web/button/button.css"
11
+ }
12
+ ],
13
+ "props": {
14
+ "style": {
15
+ "name": "style",
16
+ "type": "any",
17
+ "optional": true,
18
+ "default": null,
19
+ "description": "Inline CSS style kustom.",
20
+ "example": null,
21
+ "param": null
22
+ },
23
+ "variant": {
24
+ "name": "variant",
25
+ "type": "| 'primary'\n | 'info'\n | 'warning'\n | 'danger'\n | 'neutral'\n | 'disabled'",
26
+ "optional": true,
27
+ "default": "primary",
28
+ "description": "Varian warna semantik tombol: - `'primary'`: Teal utama. - `'info'`: Biru informasi. - `'warning'`: Kuning peringatan. - `'danger'`: Merah bahaya. - `'neutral'`: Abu-abu netral. - `'disabled'`: Tombol non-aktif.",
29
+ "example": null,
30
+ "param": null
31
+ },
32
+ "appearance": {
33
+ "name": "appearance",
34
+ "type": "'solid' | 'soft' | 'outline' | 'link' | 'ghost'",
35
+ "optional": true,
36
+ "default": "solid",
37
+ "description": "Gaya tampilan visual tombol: - `'solid'`: Latar belakang warna solid pekat (default). - `'soft'`: Latar belakang warna transparan lembut. - `'outline'`: Garis tepi dengan latar belakang transparan. - `'link'`: Teks tautan tanpa border/latar, dengan garis bawah saat hover. - `'ghost'`: Transparan tanpa outline/border, dengan latar lembut saat hover.",
38
+ "example": null,
39
+ "param": null
40
+ },
41
+ "type": {
42
+ "name": "type",
43
+ "type": "'button' | 'submit' | 'reset'",
44
+ "optional": true,
45
+ "default": "button",
46
+ "description": "Tipe tombol HTML native.",
47
+ "example": null,
48
+ "param": null
49
+ },
50
+ "size": {
51
+ "name": "size",
52
+ "type": "'sm' | 'md' | 'lg'",
53
+ "optional": true,
54
+ "default": "md",
55
+ "description": "Skala ukuran tombol: - `'sm'`: 36px - `'md'`: 48px (standar) - `'lg'`: 56px",
56
+ "example": null,
57
+ "param": null
58
+ },
59
+ "negative": {
60
+ "name": "negative",
61
+ "type": "boolean",
62
+ "optional": true,
63
+ "default": "false",
64
+ "description": "Mode negatif — kontras tinggi di atas latar gelap.",
65
+ "example": null,
66
+ "param": null
67
+ },
68
+ "rounded": {
69
+ "name": "rounded",
70
+ "type": "'none' | 'sm' | 'md' | 'lg' | 'full'",
71
+ "optional": true,
72
+ "default": "md",
73
+ "description": "Radius sudut tombol. - `'none'`: 0px - `'sm'`: 4px - `'md'`: 8px (standar) - `'lg'`: 12px - `'full'`: 9999px (pill)",
74
+ "example": null,
75
+ "param": null
76
+ },
77
+ "iconOnly": {
78
+ "name": "iconOnly",
79
+ "type": "boolean",
80
+ "optional": true,
81
+ "default": "false",
82
+ "description": "Mode tombol ikon persegi (aspek rasio 1:1).",
83
+ "example": null,
84
+ "param": null
85
+ },
86
+ "block": {
87
+ "name": "block",
88
+ "type": "boolean",
89
+ "optional": true,
90
+ "default": "false",
91
+ "description": "Full-width — melebar 100% dari container.",
92
+ "example": null,
93
+ "param": null
94
+ },
95
+ "loading": {
96
+ "name": "loading",
97
+ "type": "boolean",
98
+ "optional": true,
99
+ "default": "false",
100
+ "description": "Tampilkan spinner & nonaktifkan tombol saat proses async.",
101
+ "example": null,
102
+ "param": null
103
+ },
104
+ "disabled": {
105
+ "name": "disabled",
106
+ "type": "boolean",
107
+ "optional": true,
108
+ "default": "false",
109
+ "description": "Nonaktifkan tombol dari interaksi pengguna.",
110
+ "example": null,
111
+ "param": null
112
+ },
113
+ "iconColor": {
114
+ "name": "iconColor",
115
+ "type": "string",
116
+ "optional": true,
117
+ "default": null,
118
+ "description": "Warna kustom untuk ikon di dalam tombol (misal: '#fff', '#0968F6').",
119
+ "example": null,
120
+ "param": null
121
+ },
122
+ "iconSize": {
123
+ "name": "iconSize",
124
+ "type": "string",
125
+ "optional": true,
126
+ "default": null,
127
+ "description": "Ukuran kustom untuk ikon di dalam tombol (misal: '16px', '20px').",
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 — seperti style object tapi dengan support pseudo-class. ```tsx <Button ui={{ background: '#7c3aed', color: 'white', borderRadius: '99px', hover: { background: '#6d28d9', transform: 'scale(1.02)', }, active: { opacity: '0.9', } }} /> ```",
137
+ "example": null,
138
+ "param": null
139
+ },
140
+ "onClick": {
141
+ "name": "onClick",
142
+ "type": "(event?: any) => void",
143
+ "optional": true,
144
+ "default": null,
145
+ "description": "Event handler saat tombol diklik.",
146
+ "example": null,
147
+ "param": null
148
+ },
149
+ "className": {
150
+ "name": "className",
151
+ "type": "string",
152
+ "optional": true,
153
+ "default": null,
154
+ "description": "Class CSS kustom.",
155
+ "example": null,
156
+ "param": null
157
+ },
158
+ "children": {
159
+ "name": "children",
160
+ "type": "any",
161
+ "optional": true,
162
+ "default": null,
163
+ "description": "Konten tombol — teks, ikon, atau JSX.",
164
+ "example": null,
165
+ "param": null
166
+ }
167
+ },
168
+ "subInterfaces": {},
169
+ "supportedFrameworks": [
170
+ "react",
171
+ "vue",
172
+ "svelte"
173
+ ],
174
+ "themes": [
175
+ "tw"
176
+ ]
177
+ }
@@ -0,0 +1,151 @@
1
+ # <Calendar /> — TTDK Component Reference
2
+
3
+ TTDK Calendar 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/calendar/calendar.css";`
8
+
9
+ ## 2. Subpath Component Import
10
+ ```ts
11
+ // React
12
+ import Calendar from "@ttdk-design-system/library-react/web/calendar";
13
+
14
+ // Vue 3
15
+ import Calendar from "@ttdk-design-system/library-vue/web/calendar";
16
+
17
+ // Svelte
18
+ import Calendar from "@ttdk-design-system/library-svelte/web/calendar";
19
+ ```
20
+
21
+ ## 3. Props & API Reference
22
+
23
+ | Prop | Type | Default | Description |
24
+ | :--- | :--- | :--- | :--- |
25
+ | `value?` | `any` | `-` | Nilai tanggal terpilih pada mode controlled. - Single: string ('YYYY-MM-DD') atau Date - Range: { start: string | Date | null, end: string | Date | null } - Multiple: string[] atau Date[] |
26
+ | `defaultValue?` | `any` | `-` | Nilai awal tanggal terpilih pada mode uncontrolled. |
27
+ | `id?` | `string` | `-` | Atribut ID unik untuk elemen root kalender. |
28
+ | `range?` | `boolean` | `false` | Mengaktifkan mode pemilihan rentang tanggal (start date - end date). |
29
+ | `multiple?` | `boolean` | `false` | Mengaktifkan mode pemilihan banyak tanggal sekaligus. |
30
+ | `min?` | `string | Date` | `-` | Batas tanggal paling awal yang dapat dipilih. |
31
+ | `minValue?` | `string | Date` | `-` | Alias untuk min (kompatibel Nuxt UI: min-value). |
32
+ | `max?` | `string | Date` | `-` | Batas tanggal paling akhir yang dapat dipilih. |
33
+ | `maxValue?` | `string | Date` | `-` | Alias untuk max (kompatibel Nuxt UI: max-value). |
34
+ | `isDateDisabled?` | `(date: Date) => boolean` | `-` | Fungsi untuk menonaktifkan tanggal tertentu secara spesifik (misal: hari libur / akhir pekan). |
35
+ | `isDateUnavailable?` | `(date: Date) => boolean` | `-` | Fungsi untuk menandai tanggal tidak tersedia (ditampilkan coret strikethrough). |
36
+ | `numberOfMonths?` | `number` | `1` | Jumlah bulan yang ditampilkan secara berdampingan. |
37
+ | `weekStartsOn?` | `0 | 1 | 2 | 3 | 4 | 5 | 6` | `1` | Hari awal dalam seminggu: - 0 = Minggu (Sunday) - 1 = Senin (Monday) |
38
+ | `locale?` | `string` | `id-ID` | Kode lokal bahasa kalender (misal: 'id-ID', 'en-US'). |
39
+ | `month?` | `number` | `-` | Bulan yang sedang ditampilkan (1 - 12) pada mode navigasi controlled. |
40
+ | `year?` | `number` | `-` | Tahun yang sedang ditampilkan (misal: 2026) pada mode navigasi controlled. |
41
+ | `defaultMonth?` | `number` | `-` | Bulan awal yang sedang ditampilkan (1 - 12). |
42
+ | `defaultYear?` | `number` | `-` | Tahun awal yang sedang ditampilkan. |
43
+ | `yearControls?` | `boolean` | `true` | Menampilkan tombol navigasi lompat tahun (<< dan >>). |
44
+ | `showOutsideDays?` | `boolean` | `true` | Menampilkan hari-hari redup di luar bulan yang aktif (leading & trailing days). |
45
+ | `fixedWeeks?` | `boolean` | `true` | Selalu merender 6 baris minggu agar tinggi kalender konsisten stabil antar bulan. |
46
+ | `dateMarkers?` | `DateMarker[]` | `-` | Daftar penanda agenda / jadwal faskes pada tanggal tertentu. |
47
+ | `size?` | `'sm' | 'md' | 'lg'` | `md` | Skala ukuran kalender (sm: kompak 32px, md: standar 38px, lg: besar 44px). |
48
+ | `rounded?` | `'none' | 'sm' | 'md' | 'lg' | 'xl' | 'full'` | `md` | Radius sudut kelengkungan container kalender. |
49
+ | `variant?` | `'default' | 'bordered' | 'card' | 'flat'` | `bordered` | Varian visual tampilan kalender: - 'default': Bersih dengan background putih/gelap. - 'bordered': Dengan bingkai border solid luar. - 'card': Dengan elevasi bayangan halus kartu. - 'flat': Minimalis tanpa border dan tanpa shadow. |
50
+ | `disabled?` | `boolean` | `false` | Menonaktifkan seluruh kalender dari interaksi. |
51
+ | `readOnly?` | `boolean` | `false` | Mode hanya-baca (read-only). |
52
+ | `onValueChange?` | `(value: any) => void` | `-` | Callback event saat nilai tanggal berubah. |
53
+ | `onChange?` | `(event: any) => void` | `-` | Callback event native saat nilai berubah. |
54
+ | `onMonthChange?` | `(month: number, year: number) => void` | `-` | Callback saat navigasi bulan atau tahun berubah. |
55
+ | `onYearChange?` | `(month: number, year: number) => void` | `-` | Callback saat tahun tampilan kalender berubah. |
56
+ | `defaultViewMode?` | `'day' | 'month' | 'year'` | `day` | Mode tampilan awal kalender ('day', 'month', 'year'). |
57
+ | `viewMode?` | `'day' | 'month' | 'year'` | `-` | Mode tampilan kalender saat ini ('day', 'month', 'year') untuk mode controlled. |
58
+ | `onViewModeChange?` | `(mode: 'day' | 'month' | 'year') => void` | `-` | Callback saat mode tampilan kalender berubah ('day', 'month', 'year'). |
59
+ | `className?` | `string` | `-` | Class CSS kustom untuk container utama. |
60
+ | `style?` | `any` | `-` | Inline style CSS kustom untuk container utama. |
61
+ | `headerClass?` | `string` | `-` | Class CSS kustom untuk header kalender. |
62
+ | `headerStyle?` | `UiProps` | `-` | Inline style kustom untuk header kalender. |
63
+ | `navBtnClass?` | `string` | `-` | Class CSS kustom untuk tombol navigasi. |
64
+ | `navBtnStyle?` | `UiProps` | `-` | Inline style kustom untuk tombol navigasi. |
65
+ | `cellClass?` | `string` | `-` | Class CSS kustom untuk cell tanggal. |
66
+ | `cellStyle?` | `UiProps` | `-` | Inline style kustom untuk cell tanggal. |
67
+ | `ui?` | `UiProps` | `-` | Kustomisasi visual granular UiProps. |
68
+
69
+ ### Sub-interface: `DateRange`
70
+
71
+ | Field | Type | Default | Description |
72
+ | :--- | :--- | :--- | :--- |
73
+ | `start` | `string | Date | null` | `-` | |
74
+ | `end` | `string | Date | null` | `-` | |
75
+
76
+ ### Sub-interface: `DateMarker`
77
+
78
+ | Field | Type | Default | Description |
79
+ | :--- | :--- | :--- | :--- |
80
+ | `date` | `string` | `-` | |
81
+ | `color?` | `string` | `-` | |
82
+ | `tooltip?` | `string` | `-` | |
83
+ | `dot?` | `boolean` | `-` | |
84
+
85
+ ## 4. Usage Examples
86
+
87
+ ### React Example
88
+ ```tsx
89
+ import { useState } from "react";
90
+ import Calendar from "@ttdk-design-system/library-react/web/calendar";
91
+ import "@ttdk-design-system/library-react/web/calendar/calendar.css";
92
+
93
+ export function Example() {
94
+ const [selectedDate, setSelectedDate] = useState("2026-10-13");
95
+
96
+ return (
97
+ <div style={{ maxWidth: '320px' }}>
98
+ <Calendar
99
+ value={selectedDate}
100
+ onChange={(date) => setSelectedDate(date)}
101
+ />
102
+ <div style={{ marginTop: '12px', fontSize: '14px' }}>
103
+ Tanggal terpilih: <strong>{selectedDate}</strong>
104
+ </div>
105
+ </div>
106
+ );
107
+ }
108
+ ```
109
+
110
+ ### Vue 3 Example
111
+ ```vue
112
+ <script setup lang="ts">
113
+ import { ref } from "vue";
114
+ import Calendar from "@ttdk-design-system/library-vue/web/calendar";
115
+ import "@ttdk-design-system/library-vue/web/calendar/calendar.css";
116
+
117
+ const selectedDate = ref("2026-10-13");
118
+ </script>
119
+
120
+ <template>
121
+ <div style="max-width: 320px;">
122
+ <Calendar
123
+ :value="selectedDate"
124
+ @change="(date: any) => (selectedDate = date)"
125
+ />
126
+ <div style="margin-top: 12px; font-size: 14px;">
127
+ Tanggal terpilih: <strong>{{ selectedDate }}</strong>
128
+ </div>
129
+ </div>
130
+ </template>
131
+ ```
132
+
133
+ ### Svelte Example
134
+ ```svelte
135
+ <script lang="ts">
136
+ import Calendar from "@ttdk-design-system/library-svelte/web/calendar";
137
+ import "@ttdk-design-system/library-svelte/web/calendar/calendar.css";
138
+
139
+ let selectedDate = "2026-10-13";
140
+ </script>
141
+
142
+ <div style="max-width: 320px;">
143
+ <Calendar
144
+ value={selectedDate}
145
+ on:change={(e) => (selectedDate = e.detail)}
146
+ />
147
+ <div style="margin-top: 12px; font-size: 14px;">
148
+ Tanggal terpilih: <strong>{selectedDate}</strong>
149
+ </div>
150
+ </div>
151
+ ```
@@ -0,0 +1 @@
1
+ :root{--ttdk-cal-font-family:var(--ttdk-font-sans);--ttdk-cal-bg:var(--ttdk-bg-base-primary);--ttdk-cal-border:var(--ttdk-stroke-subtle);--ttdk-cal-text-primary:var(--ttdk-text-icon-primary);--ttdk-cal-text-secondary:var(--ttdk-text-icon-secondary);--ttdk-cal-text-muted:var(--ttdk-text-icon-disabled);--ttdk-cal-brand:var(--ttdk-brand-default);--ttdk-cal-brand-hover:var(--ttdk-brand-strong);--ttdk-cal-brand-light:var(--ttdk-brand-subtle);--ttdk-cal-brand-range:color-mix(in srgb, var(--ttdk-brand-strong) 15%, transparent);--ttdk-cal-brand-text-inv:var(--ttdk-color-neutral-white);--ttdk-cal-today-border:var(--ttdk-stroke-border-focus);--ttdk-cal-hover-bg:var(--ttdk-bg-secondary-disabled);--ttdk-cal-radius:8px;--ttdk-cal-cell-size:38px;--ttdk-cal-font-size:14px}.dark,[data-theme=dark]{--ttdk-cal-bg:var(--ttdk-bg-base-primary);--ttdk-cal-border:var(--ttdk-stroke-subtle);--ttdk-cal-text-primary:var(--ttdk-text-icon-primary);--ttdk-cal-text-secondary:var(--ttdk-text-icon-secondary);--ttdk-cal-text-muted:var(--ttdk-text-icon-disabled);--ttdk-cal-brand:var(--ttdk-brand-default);--ttdk-cal-brand-hover:var(--ttdk-brand-strong);--ttdk-cal-brand-light:color-mix(in srgb, var(--ttdk-brand-strong) 20%, transparent);--ttdk-cal-brand-range:color-mix(in srgb, var(--ttdk-brand-strong) 25%, transparent);--ttdk-cal-brand-text-inv:var(--ttdk-bg-secondary-disabled);--ttdk-cal-today-border:var(--ttdk-stroke-border-focus);--ttdk-cal-hover-bg:var(--ttdk-bg-secondary-disabled)}.ttdk-calendar{background-color:var(--ttdk-cal-bg);border-radius:var(--ttdk-cal-radius);font-family:var(--ttdk-cal-font-family);font-size:var(--ttdk-cal-font-size);color:var(--ttdk-ui-color,var(--ttdk-cal-text-primary));user-select:none;box-sizing:border-box;flex-direction:column;width:fit-content;max-width:100%;padding:16px;transition:border-color .2s,box-shadow .2s;display:inline-flex}@media screen and (width<=600px){.ttdk-calendar{box-sizing:border-box;width:100%;max-width:100%;padding:12px 6px}}.ttdk-calendar *,.ttdk-calendar :before,.ttdk-calendar :after{box-sizing:border-box}.ttdk-calendar-bordered{border:1px solid var(--ttdk-cal-border)}.ttdk-calendar-card{border:1px solid var(--ttdk-cal-border);box-shadow:0 4px 6px -1px #0000000d,0 2px 4px -2px #0000000d}.ttdk-calendar-flat{box-shadow:none;background:0 0;border:none;padding:0}.ttdk-calendar-sm{--ttdk-cal-cell-size:32px;--ttdk-cal-font-size:12.5px;padding:12px}.ttdk-calendar-md{--ttdk-cal-cell-size:38px;--ttdk-cal-font-size:14px}.ttdk-calendar-lg{--ttdk-cal-cell-size:44px;--ttdk-cal-font-size:15.5px;padding:20px}.ttdk-calendar-rounded-none{--ttdk-cal-radius:0px}.ttdk-calendar-rounded-sm{--ttdk-cal-radius:4px}.ttdk-calendar-rounded-md{--ttdk-cal-radius:8px}.ttdk-calendar-rounded-lg{--ttdk-cal-radius:12px}.ttdk-calendar-rounded-xl{--ttdk-cal-radius:16px}.ttdk-calendar-rounded-full{--ttdk-cal-radius:20px}.ttdk-calendar-months{flex-flow:wrap;align-items:flex-start;gap:24px;width:100%;max-width:100%;display:flex}.ttdk-calendar-month{width:calc(var(--ttdk-cal-cell-size) * 7);box-sizing:border-box;flex-direction:column;flex:none;max-width:100%;display:flex}@media screen and (width<=600px){.ttdk-calendar-months{flex-direction:column;gap:20px;width:100%}.ttdk-calendar-month{width:100%;min-width:0;max-width:100%}.ttdk-calendar-header{gap:2px}.ttdk-calendar-nav-btn{width:24px;height:24px}.ttdk-calendar-nav-btn svg{width:14px;height:14px}.ttdk-calendar-title-btn{padding:3px 4px;font-size:.95em}.ttdk-calendar-cell{aspect-ratio:1;height:auto}.ttdk-calendar-day{aspect-ratio:1;width:calc(100% - 2px);height:calc(100% - 2px)}}.ttdk-calendar-header{justify-content:space-between;align-items:center;gap:0;margin-bottom:12px;display:flex;position:relative}.ttdk-calendar-title-group{flex:1;justify-content:center;align-items:center;gap:0;display:flex}.ttdk-calendar-title{color:var(--ttdk-cal-text-primary);cursor:default;background:0 0;border:none;border-radius:6px;align-items:center;gap:4px;padding:4px 8px;font-size:1em;font-weight:600;line-height:1.2;display:inline-flex}.ttdk-calendar-title-btn{color:var(--ttdk-cal-text-primary);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:6px;align-items:center;gap:4px;padding:4px;font-family:inherit;font-size:1em;font-weight:600;line-height:1.2;transition:background-color .15s,color .15s,border-color .15s;display:inline-flex}.ttdk-calendar-title-btn:hover:not(:disabled){background-color:var(--ttdk-cal-hover-bg);color:var(--ttdk-cal-brand)}.ttdk-calendar-title-btn:focus-visible{outline:2px solid var(--ttdk-cal-brand);outline-offset:1px}.ttdk-calendar-title-btn:disabled{opacity:.5;cursor:not-allowed}.ttdk-calendar-nav-group{align-items:center;gap:4px;display:flex}.ttdk-calendar-nav-btn{width:28px;height:28px;color:var(--ttdk-cal-text-secondary);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:6px;justify-content:center;align-items:center;padding:0;transition:background-color .15s,color .15s,border-color .15s;display:inline-flex}.ttdk-calendar-nav-btn:hover:not(:disabled){background-color:var(--ttdk-cal-hover-bg);color:var(--ttdk-cal-text-primary)}.ttdk-calendar-nav-btn:focus-visible{outline:2px solid var(--ttdk-cal-brand);outline-offset:1px}.ttdk-calendar-nav-btn:disabled{opacity:.35;cursor:not-allowed}.ttdk-calendar-nav-btn svg{stroke-width:2px;flex-shrink:0;width:16px;height:16px}.ttdk-calendar-month-picker-view,.ttdk-calendar-year-picker-view{width:100%;max-width:100%;min-width:calc(var(--ttdk-cal-cell-size) * 7);box-sizing:border-box;flex-direction:column;display:flex}@media screen and (width<=600px){.ttdk-calendar-month-picker-view,.ttdk-calendar-year-picker-view{min-width:0}}.ttdk-calendar-grid-picker{box-sizing:border-box;grid-template-columns:repeat(4,1fr);gap:10px 8px;width:100%;padding:12px 4px;display:grid}.ttdk-calendar-picker-item{min-height:38px;color:var(--ttdk-cal-text-primary);border-radius:var(--ttdk-cal-radius);cursor:pointer;user-select:none;box-sizing:border-box;background:0 0;border:1px solid #0000;justify-content:center;align-items:center;padding:10px 4px;font-family:inherit;font-size:.9em;font-weight:500;transition:all .15s;display:inline-flex}.ttdk-calendar-picker-item:hover:not(:disabled){background-color:var(--ttdk-cal-hover-bg);color:var(--ttdk-cal-text-primary)}.ttdk-calendar-picker-item:disabled{opacity:.35;cursor:not-allowed}.ttdk-calendar-picker-item-selected{font-weight:600;background-color:var(--ttdk-cal-brand)!important;color:var(--ttdk-cal-brand-text-inv)!important}.ttdk-calendar-picker-item-selected:hover:not(:disabled){background-color:var(--ttdk-cal-brand-hover)!important}.ttdk-calendar-picker-item-current:not(.ttdk-calendar-picker-item-selected){color:var(--ttdk-cal-brand);border-color:var(--ttdk-cal-brand);font-weight:700}.ttdk-calendar-picker-item:focus-visible{outline:2px solid var(--ttdk-cal-brand);outline-offset:1px}.ttdk-calendar-sm .ttdk-calendar-picker-item{min-height:32px;padding:6px 2px;font-size:.82em}.ttdk-calendar-lg .ttdk-calendar-picker-item{min-height:44px;padding:12px 6px;font-size:.95em}.ttdk-calendar-table{border-collapse:collapse;table-layout:fixed;border-spacing:0;width:100%}.ttdk-calendar-thead-row{grid-template-columns:repeat(7,1fr);margin-bottom:6px;display:grid}.ttdk-calendar-head-cell{text-transform:uppercase;letter-spacing:.04em;color:var(--ttdk-cal-text-muted);justify-content:center;align-items:center;height:28px;font-size:.8em;font-weight:600;display:flex}.ttdk-calendar-tbody{flex-direction:column;gap:4px;margin:0;padding:0;display:flex}.ttdk-calendar-row{grid-template-columns:repeat(7,1fr);width:100%;margin:0;padding:0;display:grid}.ttdk-calendar-cell{width:100%;height:var(--ttdk-cal-cell-size);justify-content:center;align-items:center;margin:0;padding:0;display:flex;position:relative}.ttdk-calendar-cell-range{background-color:var(--ttdk-cal-brand-range)}.ttdk-calendar-cell-range:first-child{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.ttdk-calendar-cell-range:last-child{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.ttdk-calendar-cell-range-start{background-color:var(--ttdk-cal-brand-range);border-top-left-radius:9999px;border-bottom-left-radius:9999px}.ttdk-calendar-cell-range-start:last-child{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.ttdk-calendar-cell-range-end{background-color:var(--ttdk-cal-brand-range);border-top-right-radius:9999px;border-bottom-right-radius:9999px}.ttdk-calendar-cell-range-end:first-child{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.ttdk-calendar-cell-range-single{background-color:#0000!important;border-radius:0!important}.ttdk-calendar-day{width:calc(var(--ttdk-cal-cell-size) - 4px);height:calc(var(--ttdk-cal-cell-size) - 4px);color:var(--ttdk-cal-text-primary);font-size:inherit;cursor:pointer;z-index:1;background:0 0;border:1px solid #0000;border-radius:9999px;outline:none;flex-direction:column;justify-content:center;align-items:center;font-weight:400;transition:background-color .15s,color .15s,border-color .15s,transform .1s;display:inline-flex;position:relative}.ttdk-calendar-day:hover:not(:disabled):not(.ttdk-calendar-day-selected):not(.ttdk-calendar-day-range-start):not(.ttdk-calendar-day-range-end){background-color:var(--ttdk-cal-hover-bg);color:var(--ttdk-cal-text-primary)}.ttdk-calendar-day:active:not(:disabled){transform:scale(.95)}.ttdk-calendar-day:focus-visible{outline:2px solid var(--ttdk-cal-brand);outline-offset:2px}.ttdk-calendar-day-today{border-color:var(--ttdk-cal-today-border);color:var(--ttdk-cal-brand);font-weight:600}.ttdk-calendar-day-selected,.ttdk-calendar-day-range-start,.ttdk-calendar-day-range-end{width:100%;height:100%;max-width:var(--ttdk-cal-cell-size);max-height:var(--ttdk-cal-cell-size);border-color:var(--ttdk-cal-brand);font-weight:600;box-shadow:0 1px 3px #00000026;background-color:var(--ttdk-cal-brand)!important;color:var(--ttdk-cal-brand-text-inv)!important}.ttdk-calendar-day-in-range{color:var(--ttdk-cal-brand);border-radius:100%;width:100%;height:100%;font-weight:500}.ttdk-calendar-day-outside{color:var(--ttdk-cal-text-muted);opacity:.45}.ttdk-calendar-day-outside:hover:not(:disabled){opacity:.8}.ttdk-calendar-day-disabled{opacity:.25;pointer-events:none;cursor:not-allowed!important}.ttdk-calendar-day-unavailable{color:var(--ttdk-cal-text-muted);opacity:.55;text-decoration:line-through;cursor:not-allowed!important}.ttdk-calendar-marker-dot{background-color:var(--ttdk-cal-brand);border-radius:50%;width:4px;height:4px;transition:transform .15s;position:absolute;bottom:3px}.ttdk-calendar-day-selected .ttdk-calendar-marker-dot,.ttdk-calendar-day-range-start .ttdk-calendar-marker-dot,.ttdk-calendar-day-range-end .ttdk-calendar-marker-dot{background-color:#fff}