@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,333 @@
1
+ <script context="module"></script>
2
+
3
+ <script>import { onDestroy, onMount } from "svelte";
4
+ import { buildUiVars, UiProps } from "../../core/types";
5
+ export let open = void 0;
6
+ export let defaultOpen = void 0;
7
+ export let preventClose = void 0;
8
+ export let dismissible = void 0;
9
+ export let onOpen = void 0;
10
+ export let onUpdateOpen = void 0;
11
+ export let onOpenChange = void 0;
12
+ export let onClosePrevent = void 0;
13
+ export let onClose = void 0;
14
+ export let header = void 0;
15
+ export let body = void 0;
16
+ export let footer = void 0;
17
+ export let content = void 0;
18
+ export let className = void 0;
19
+ export let modal = void 0;
20
+ export let ui = void 0;
21
+ export let overlay = void 0;
22
+ export let overlayClass = void 0;
23
+ export let overlayStyle = void 0;
24
+ export let contentClass = void 0;
25
+ export let size = void 0;
26
+ export let fullscreen = void 0;
27
+ export let scrollable = void 0;
28
+ export let contentStyle = void 0;
29
+ export let title = void 0;
30
+ export let close = void 0;
31
+ export let headerClass = void 0;
32
+ export let headerStyle = void 0;
33
+ export let description = void 0;
34
+ export let closeIcon = void 0;
35
+ export let bodyClass = void 0;
36
+ export let bodyStyle = void 0;
37
+ export let footerClass = void 0;
38
+ export let footerStyle = void 0;
39
+ export let preventScroll = void 0;
40
+ export let lockScroll = void 0;
41
+ function stringifyStyles(stylesObj) {
42
+ let styles = "";
43
+ for (let key in stylesObj) {
44
+ const dashedKey = key.replace(/[A-Z]/g, function(match) {
45
+ return "-" + match.toLowerCase();
46
+ });
47
+ styles += dashedKey + ":" + stylesObj[key] + ";";
48
+ }
49
+ return styles;
50
+ }
51
+ function isDismissible() {
52
+ if (preventClose === true)
53
+ return false;
54
+ return dismissible !== false;
55
+ }
56
+ function triggerShake() {
57
+ if (shakeTimer) {
58
+ clearTimeout(shakeTimer);
59
+ }
60
+ isAnimDone = true;
61
+ isShaking = true;
62
+ shakeTimer = setTimeout(() => {
63
+ isShaking = false;
64
+ shakeTimer = null;
65
+ }, 400);
66
+ }
67
+ function openModal() {
68
+ if (!isOpen) {
69
+ isOpen = true;
70
+ isAnimDone = false;
71
+ if (animTimer)
72
+ clearTimeout(animTimer);
73
+ animTimer = setTimeout(() => {
74
+ isAnimDone = true;
75
+ }, 250);
76
+ if (onOpen)
77
+ onOpen();
78
+ if (onUpdateOpen)
79
+ onUpdateOpen(true);
80
+ if (onOpenChange)
81
+ onOpenChange(true);
82
+ }
83
+ }
84
+ function closeModal(force) {
85
+ if (!isDismissible() && !force) {
86
+ triggerShake();
87
+ if (onClosePrevent) {
88
+ onClosePrevent();
89
+ }
90
+ return;
91
+ }
92
+ if (isOpen) {
93
+ isOpen = false;
94
+ isAnimDone = false;
95
+ if (onClose)
96
+ onClose();
97
+ if (onUpdateOpen)
98
+ onUpdateOpen(false);
99
+ if (onOpenChange)
100
+ onOpenChange(false);
101
+ }
102
+ }
103
+ function handleOverlayClick() {
104
+ closeModal();
105
+ }
106
+ function handleKeyDown(event) {
107
+ if (!isOpen)
108
+ return;
109
+ if (event.key === "Escape") {
110
+ closeModal();
111
+ }
112
+ }
113
+ function renderHeaderContent() {
114
+ if (header) {
115
+ return typeof header === "function" ? header({
116
+ close: () => closeModal(true)
117
+ }) : header;
118
+ }
119
+ return null;
120
+ }
121
+ function renderBodyContent() {
122
+ if (body) {
123
+ return typeof body === "function" ? body({
124
+ close: () => closeModal(true)
125
+ }) : body;
126
+ }
127
+ return null;
128
+ }
129
+ function renderFooterContent() {
130
+ if (footer) {
131
+ return typeof footer === "function" ? footer({
132
+ close: () => closeModal(true)
133
+ }) : footer;
134
+ }
135
+ return null;
136
+ }
137
+ function renderCustomContent() {
138
+ if (content) {
139
+ return typeof content === "function" ? content({
140
+ close: () => closeModal(true)
141
+ }) : content;
142
+ }
143
+ return null;
144
+ }
145
+ let dialogRef;
146
+ let isOpen = open !== void 0 ? open : Boolean(defaultOpen);
147
+ let originalOverflow = "";
148
+ let isScrollLocked = false;
149
+ function portal(node) {
150
+ if (typeof document !== "undefined") {
151
+ document.body.appendChild(node);
152
+ }
153
+ return {
154
+ destroy() {
155
+ if (node.parentNode) {
156
+ node.parentNode.removeChild(node);
157
+ }
158
+ }
159
+ };
160
+ }
161
+ function applyScrollLock(shouldLock) {
162
+ if (typeof document === "undefined")
163
+ return;
164
+ if (shouldLock && !isScrollLocked) {
165
+ originalOverflow = document.body.style.overflow;
166
+ document.body.style.overflow = "hidden";
167
+ isScrollLocked = true;
168
+ } else if (!shouldLock && isScrollLocked) {
169
+ document.body.style.overflow = originalOverflow;
170
+ isScrollLocked = false;
171
+ }
172
+ }
173
+ $:
174
+ if (open !== void 0 && open !== isOpen) {
175
+ if (open) {
176
+ openModal();
177
+ } else {
178
+ closeModal(true);
179
+ }
180
+ }
181
+ $: {
182
+ const shouldLock = isOpen && preventScroll !== false && lockScroll !== false;
183
+ applyScrollLock(shouldLock);
184
+ }
185
+ let isShaking = false;
186
+ let isAnimDone = false;
187
+ let shakeTimer = null;
188
+ let animTimer = null;
189
+ onMount(() => {
190
+ if (typeof document !== "undefined") {
191
+ document.addEventListener("keydown", (e) => handleKeyDown(e), true);
192
+ }
193
+ });
194
+ onDestroy(() => {
195
+ applyScrollLock(false);
196
+ if (shakeTimer) {
197
+ clearTimeout(shakeTimer);
198
+ }
199
+ if (typeof document !== "undefined") {
200
+ document.removeEventListener(
201
+ "keydown",
202
+ (e) => handleKeyDown(e),
203
+ true
204
+ );
205
+ }
206
+ });
207
+ </script>
208
+
209
+ <div>
210
+ {#if isOpen}
211
+ <div
212
+ style={stringifyStyles({
213
+ ...buildUiVars(ui),
214
+ })}
215
+ role="dialog"
216
+ use:portal
217
+ class={`ttdk-modal-portal ${className || ""}`.trim()}
218
+ aria-modal={modal !== false ? "true" : "false"}
219
+ tabIndex={-1}
220
+ >
221
+ {#if overlay !== false}
222
+ <div
223
+ style={stringifyStyles({
224
+ ...buildUiVars(overlayStyle),
225
+ })}
226
+ class={`ttdk-modal-overlay ${overlayClass || ""}`.trim()}
227
+ on:click={(event) => {
228
+ handleOverlayClick();
229
+ }}
230
+ />
231
+ {/if}
232
+ <div
233
+ style={stringifyStyles({
234
+ ...buildUiVars(contentStyle),
235
+ })}
236
+ bind:this={dialogRef}
237
+ class={`ttdk-modal-dialog ${isAnimDone ? "ttdk-modal-anim-done" : ""} ${
238
+ isShaking ? "ttdk-modal-shake" : ""
239
+ } ${contentClass || ""}`.trim()}
240
+ data-size={size || "md"}
241
+ data-fullscreen={fullscreen ? "true" : undefined}
242
+ data-scrollable={scrollable !== false ? "true" : undefined}
243
+ >
244
+ {#if Boolean(content)}
245
+ {renderCustomContent()}
246
+ {/if}
247
+ {#if !content}
248
+ {#if Boolean(header || title || close !== false)}
249
+ <div
250
+ style={stringifyStyles({
251
+ ...buildUiVars(headerStyle),
252
+ })}
253
+ class={`ttdk-modal-header ${headerClass || ""}`.trim()}
254
+ >
255
+ {#if Boolean(header)}
256
+ {renderHeaderContent()}
257
+ {/if}
258
+ {#if !header}
259
+ <div class="ttdk-modal-header-info">
260
+ {#if Boolean(title)}
261
+ <h3 class="ttdk-modal-title">{title}</h3>
262
+ {/if}
263
+ {#if Boolean(description)}
264
+ <p class="ttdk-modal-description">{description}</p>
265
+ {/if}
266
+ </div>
267
+
268
+ {#if close !== false}
269
+ <button
270
+ type="button"
271
+ class="ttdk-modal-close"
272
+ aria-label="Tutup modal"
273
+ on:click={(event) => {
274
+ closeModal(true);
275
+ }}
276
+ >
277
+ {#if Boolean(closeIcon)}
278
+ {closeIcon}
279
+ {/if}
280
+ {#if !closeIcon}
281
+ <svg
282
+ width="16"
283
+ height="16"
284
+ viewBox="0 0 24 24"
285
+ fill="none"
286
+ stroke="currentColor"
287
+ ><line x1="18" y1="6" x2="6" y2="18" /><line
288
+ x1="6"
289
+ y1="6"
290
+ x2="18"
291
+ y2="18"
292
+ /></svg
293
+ >
294
+ {/if}</button
295
+ >
296
+ {/if}
297
+ {/if}
298
+ </div>
299
+ {/if}
300
+ <div
301
+ style={stringifyStyles({
302
+ ...buildUiVars(bodyStyle),
303
+ })}
304
+ class={`ttdk-modal-body ${bodyClass || ""}`.trim()}
305
+ >
306
+ {#if Boolean(body)}
307
+ {renderBodyContent()}
308
+ {/if}
309
+ {#if !body && $$slots.default}
310
+ <slot />
311
+ {/if}
312
+ </div>
313
+
314
+ {#if Boolean(footer) || $$slots.footer}
315
+ <div
316
+ style={stringifyStyles({
317
+ ...buildUiVars(footerStyle),
318
+ })}
319
+ class={`ttdk-modal-footer ${footerClass || ""}`.trim()}
320
+ >
321
+ {#if Boolean(footer)}
322
+ {renderFooterContent()}
323
+ {/if}
324
+ {#if $$slots.footer}
325
+ <slot name="footer" />
326
+ {/if}
327
+ </div>
328
+ {/if}
329
+ {/if}
330
+ </div>
331
+ </div>
332
+ {/if}
333
+ </div>
@@ -0,0 +1,231 @@
1
+ import { SvelteComponent } from "svelte";
2
+ export type ModalSize = "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl" | "4xl" | "5xl" | "full";
3
+ export type ModalUiProps = UiProps;
4
+ export interface ModalProps {
5
+ /**
6
+ * Status visibilitas modal (mode terkontrol / controlled state).
7
+ * Mendukung `v-model:open` / `v-model` pada Vue 3 dan controlled prop `open` pada React.
8
+ */
9
+ open?: boolean;
10
+ /**
11
+ * Status visibilitas awal saat pertama kali dirender (uncontrolled initial state).
12
+ * @default false
13
+ */
14
+ defaultOpen?: boolean;
15
+ /**
16
+ * Judul teks di bagian header modal.
17
+ */
18
+ title?: string;
19
+ /**
20
+ * Deskripsi penjelasan di bagian header modal di bawah judul.
21
+ */
22
+ description?: string;
23
+ /**
24
+ * Menampilkan tombol tutup 'X' di pojok kanan atas header.
25
+ * Berikan `false` untuk menyembunyikan tombol tutup.
26
+ * @default true
27
+ */
28
+ close?: boolean | any;
29
+ /**
30
+ * Ikon kustom untuk tombol tutup.
31
+ */
32
+ closeIcon?: any;
33
+ /**
34
+ * Menjadikan modal tampil dalam ukuran layar penuh (fullscreen 100vw x 100vh).
35
+ * @default false
36
+ */
37
+ fullscreen?: boolean;
38
+ /**
39
+ * Skala ukuran lebar maksimum modal dialog ('xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl' | 'full').
40
+ * @default 'md'
41
+ */
42
+ size?: ModalSize;
43
+ /**
44
+ * Mengizinkan modal ditutup saat pengguna mengeklik latar belakang (backdrop) atau menekan tombol `Escape`.
45
+ * @default true
46
+ */
47
+ dismissible?: boolean;
48
+ /**
49
+ * Mencegah modal ditutup saat klik di luar atau tombol `Escape` (alias selaras Nuxt UI prevent-close).
50
+ * Jika bernilai `true`, popover/modal tidak dapat ditutup kecuali melalui tombol aksi eksplisit di dalam modal.
51
+ * @default false
52
+ */
53
+ preventClose?: boolean;
54
+ /**
55
+ * Menampilkan lapisan latar belakang redup (backdrop overlay).
56
+ * @default true
57
+ */
58
+ overlay?: boolean;
59
+ /**
60
+ * Menjadikan modal sebagai dialog modal yang memusatkan fokus interaksi pengguna.
61
+ * @default true
62
+ */
63
+ modal?: boolean;
64
+ /**
65
+ * Mengaktifkan area konten body yang dapat digulir jika isi modal melebihi tinggi layar.
66
+ * @default true
67
+ */
68
+ scrollable?: boolean;
69
+ /**
70
+ * Mengunci scrolling halaman web latar belakang saat modal sedang terbuka (body scroll lock).
71
+ * @default true
72
+ */
73
+ preventScroll?: boolean;
74
+ /**
75
+ * Alias untuk `preventScroll`.
76
+ * @default true
77
+ */
78
+ lockScroll?: boolean;
79
+ /**
80
+ * Konten kustom untuk seluruh dialog (menggantikan header, body, dan footer default).
81
+ */
82
+ content?: any;
83
+ /**
84
+ * Konten kustom untuk bagian header modal.
85
+ */
86
+ header?: any;
87
+ /**
88
+ * Konten kustom untuk bagian isi utama (body) modal.
89
+ */
90
+ body?: any;
91
+ /**
92
+ * Konten kustom untuk bagian footer (biasanya tombol aksi Batal / Konfirmasi).
93
+ */
94
+ footer?: any;
95
+ /**
96
+ * Kustomisasi CSS variables atau token visual melalui UiProps.
97
+ */
98
+ ui?: ModalUiProps;
99
+ /**
100
+ * Class CSS kustom pada elemen pembungkus terluar.
101
+ */
102
+ className?: string;
103
+ /**
104
+ * Class CSS kustom (alias framework Vue).
105
+ */
106
+ class?: string;
107
+ /**
108
+ * Style inline kustom pada kontainer dialog.
109
+ */
110
+ style?: any;
111
+ /**
112
+ * Class CSS kustom untuk lapisan backdrop overlay.
113
+ */
114
+ overlayClass?: string;
115
+ /**
116
+ * Style kustom untuk lapisan backdrop overlay (UiProps).
117
+ */
118
+ overlayStyle?: UiProps;
119
+ /**
120
+ * Class CSS kustom untuk kartu panel modal dialog.
121
+ */
122
+ contentClass?: string;
123
+ /**
124
+ * Style kustom untuk kartu panel modal dialog (UiProps).
125
+ */
126
+ contentStyle?: UiProps;
127
+ /**
128
+ * Class CSS kustom untuk header modal.
129
+ */
130
+ headerClass?: string;
131
+ /**
132
+ * Style kustom untuk header modal (UiProps).
133
+ */
134
+ headerStyle?: UiProps;
135
+ /**
136
+ * Class CSS kustom untuk body modal.
137
+ */
138
+ bodyClass?: string;
139
+ /**
140
+ * Style kustom untuk body modal (UiProps).
141
+ */
142
+ bodyStyle?: UiProps;
143
+ /**
144
+ * Class CSS kustom untuk footer modal.
145
+ */
146
+ footerClass?: string;
147
+ /**
148
+ * Style kustom untuk footer modal (UiProps).
149
+ */
150
+ footerStyle?: UiProps;
151
+ /**
152
+ * Callback event saat status terbuka/tertutup berubah (kompatibel dengan v-model:open pada Vue 3).
153
+ */
154
+ onUpdateOpen?: (open: boolean) => void;
155
+ /**
156
+ * Callback event saat status terbuka/tertutup berubah (alias standar React).
157
+ */
158
+ onOpenChange?: (open: boolean) => void;
159
+ /**
160
+ * Callback event saat modal terbuka.
161
+ */
162
+ onOpen?: () => void;
163
+ /**
164
+ * Callback event saat modal ditutup.
165
+ */
166
+ onClose?: () => void;
167
+ /**
168
+ * Callback event saat pengguna mencoba menutup modal tetapi dicegah karena preventClose={true} atau dismissible={false}.
169
+ */
170
+ onClosePrevent?: () => void;
171
+ /**
172
+ * Elemen pemicu (trigger), tombol, atau konten modal default.
173
+ */
174
+ children?: any;
175
+ }
176
+ import { UiProps } from "../../core/types";
177
+ declare const __propDef: {
178
+ props: {
179
+ open?: ModalProps["open"];
180
+ defaultOpen?: ModalProps["defaultOpen"];
181
+ preventClose?: ModalProps["preventClose"];
182
+ dismissible?: ModalProps["dismissible"];
183
+ onOpen?: ModalProps["onOpen"];
184
+ onUpdateOpen?: ModalProps["onUpdateOpen"];
185
+ onOpenChange?: ModalProps["onOpenChange"];
186
+ onClosePrevent?: ModalProps["onClosePrevent"];
187
+ onClose?: ModalProps["onClose"];
188
+ header?: ModalProps["header"];
189
+ body?: ModalProps["body"];
190
+ footer?: ModalProps["footer"];
191
+ content?: ModalProps["content"];
192
+ className?: ModalProps["className"];
193
+ modal?: ModalProps["modal"];
194
+ ui?: ModalProps["ui"];
195
+ overlay?: ModalProps["overlay"];
196
+ overlayClass?: ModalProps["overlayClass"];
197
+ overlayStyle?: ModalProps["overlayStyle"];
198
+ contentClass?: ModalProps["contentClass"];
199
+ size?: ModalProps["size"];
200
+ fullscreen?: ModalProps["fullscreen"];
201
+ scrollable?: ModalProps["scrollable"];
202
+ contentStyle?: ModalProps["contentStyle"];
203
+ title?: ModalProps["title"];
204
+ close?: ModalProps["close"];
205
+ headerClass?: ModalProps["headerClass"];
206
+ headerStyle?: ModalProps["headerStyle"];
207
+ description?: ModalProps["description"];
208
+ closeIcon?: ModalProps["closeIcon"];
209
+ bodyClass?: ModalProps["bodyClass"];
210
+ bodyStyle?: ModalProps["bodyStyle"];
211
+ footerClass?: ModalProps["footerClass"];
212
+ footerStyle?: ModalProps["footerStyle"];
213
+ preventScroll?: ModalProps["preventScroll"];
214
+ lockScroll?: ModalProps["lockScroll"];
215
+ };
216
+ events: {
217
+ [evt: string]: CustomEvent<any>;
218
+ };
219
+ slots: {
220
+ default: {};
221
+ footer: {};
222
+ };
223
+ exports?: {} | undefined;
224
+ bindings?: string | undefined;
225
+ };
226
+ type ModalProps_ = typeof __propDef.props;
227
+ export type ModalEvents = typeof __propDef.events;
228
+ export type ModalSlots = typeof __propDef.slots;
229
+ export default class Modal extends SvelteComponent<ModalProps_, ModalEvents, ModalSlots> {
230
+ }
231
+ export {};
@@ -0,0 +1,148 @@
1
+ # <Pagination /> — TTDK Component Reference
2
+
3
+ Komponen Pagination navigasi halaman dengan dukungan Compound API (ala Shadcn UI) dan Props-driven mode.
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/pagination/pagination.css";`
8
+
9
+ ## 2. Subpath Component Import
10
+ ```ts
11
+ // React
12
+ import Pagination from "@ttdk-design-system/library-react/web/pagination";
13
+
14
+ // Vue 3
15
+ import Pagination from "@ttdk-design-system/library-vue/web/pagination";
16
+
17
+ // Svelte
18
+ import Pagination from "@ttdk-design-system/library-svelte/web/pagination";
19
+ ```
20
+
21
+ ## 3. Props & API Reference
22
+
23
+ | Prop | Type | Default | Description |
24
+ | :--- | :--- | :--- | :--- |
25
+ | `page?` | `number` | `1` | Nomor halaman saat ini (1-indexed). |
26
+ | `maxPages?` | `number` | `1` | Jumlah total halaman maksimum (alias untuk totalPages). |
27
+ | `totalPages?` | `number` | `1` | Jumlah total halaman (alias maxPages). |
28
+ | `limit?` | `number` | `10` | Jumlah baris/item data per halaman (page size). |
29
+ | `onLimitChange?` | `(limit: number) => void` | `-` | Callback saat jumlah baris per halaman diubah via select box. |
30
+ | `limitOptions?` | `number[]` | `[10, 20, 50, 100]` | Pilihan angka baris per halaman pada select box. |
31
+ | `canPrevPage?` | `boolean` | `false` | Menentukan apakah navigasi ke halaman sebelumnya diizinkan (false = tombol Previous dinonaktifkan). |
32
+ | `canNextPage?` | `boolean` | `false` | Menentukan apakah navigasi ke halaman berikutnya diizinkan (false = tombol Next dinonaktifkan). |
33
+ | `onFirstPage?` | `() => void` | `-` | Callback saat tombol First Page (halaman pertama) diklik. |
34
+ | `onPrevPage?` | `() => void` | `-` | Callback saat tombol Previous Page (halaman sebelumnya) diklik. |
35
+ | `onNextPage?` | `() => void` | `-` | Callback saat tombol Next Page (halaman selanjutnya) diklik. |
36
+ | `onLastPage?` | `() => void` | `-` | Callback saat tombol Last Page (halaman terakhir) diklik. |
37
+ | `onPageChange?` | `(page: number) => void` | `-` | Callback saat nomor halaman tertentu diklik. |
38
+ | `siblingCount?` | `number` | `1` | Jumlah tetangga nomor halaman di samping kiri dan kanan halaman aktif. |
39
+ | `showEdges?` | `boolean` | `false` | Menampilkan tombol First (<<) dan Last (>>). |
40
+ | `showPageNumbers?` | `boolean` | `true` | Menampilkan nomor halaman terpaginasi (1, 2, 3...). |
41
+ | `size?` | `'sm' | 'md' | 'lg'` | `md` | Skala ukuran pagination: - `'sm'`: 28px - `'md'`: 36px (standar) - `'lg'`: 44px |
42
+ | `style?` | `any` | `-` | Inline CSS style object native. |
43
+ | `ui?` | `UiProps` | `-` | Kustomisasi visual granular root kontainer pagination (UiProps). |
44
+ | `contentStyle?` | `UiProps` | `-` | Style kustom untuk kontainer daftar pagination content (ul.ttdk-pagination-content). |
45
+ | `contentClass?` | `string` | `-` | Class CSS kustom untuk kontainer daftar pagination content. |
46
+ | `linkStyle?` | `UiProps` | `-` | Style kustom untuk tombol link nomor halaman / navigasi. |
47
+ | `linkClass?` | `string` | `-` | Class CSS kustom untuk tombol link nomor halaman / navigasi. |
48
+ | `activeLinkStyle?` | `UiProps` | `-` | Style kustom untuk tombol nomor halaman saat aktif. |
49
+ | `activeLinkClass?` | `string` | `-` | Class CSS kustom untuk tombol nomor halaman saat aktif. |
50
+ | `limitStyle?` | `UiProps` | `-` | Style kustom untuk kontainer baris per halaman (limit). |
51
+ | `limitClass?` | `string` | `-` | Class CSS kustom untuk kontainer baris per halaman (limit). |
52
+ | `limitSelectStyle?` | `UiProps` | `-` | Style kustom untuk elemen Selectbox baris per halaman (limit). |
53
+ | `limitSlot?` | `any` | `-` | Slot kustom untuk menggantikan elemen limit selector bawaan. |
54
+ | `showLimit?` | `boolean` | `-` | Menentukan apakah kontrol baris per halaman (limit selectbox) ditampilkan. Jika tidak disetel, otomatis mengikuti keberadaan callback onLimitChange. |
55
+ | `showLimitLabel?` | `boolean` | `true` | Menentukan apakah teks label 'Baris per halaman:' ditampilkan di samping selectbox limit. |
56
+ | `limitLabel?` | `string` | `Baris per halaman:` | Teks label untuk opsi baris per halaman. |
57
+ | `firstIcon?` | `any` | `-` | Ikon kustom untuk tombol halaman pertama (first page, menggantikan <<). |
58
+ | `prevIcon?` | `any` | `-` | Ikon kustom untuk tombol halaman sebelumnya (previous page, menggantikan <). |
59
+ | `nextIcon?` | `any` | `-` | Ikon kustom untuk tombol halaman selanjutnya (next page, menggantikan >). |
60
+ | `lastIcon?` | `any` | `-` | Ikon kustom untuk tombol halaman terakhir (last page, menggantikan >>). |
61
+ | `ellipsisIcon?` | `any` | `-` | Ikon kustom untuk separator elipsis (menggantikan ...). |
62
+ | `prevText?` | `string` | `Previous` | Label teks tombol Previous. |
63
+ | `nextText?` | `string` | `Next` | Label teks tombol Next. |
64
+ | `iconOnly?` | `boolean` | `false` | Mode hanya menampilkan ikon pada tombol Previous dan Next tanpa teks label. |
65
+ | `className?` | `string` | `-` | Class CSS kustom. |
66
+ | `children?` | `any` | `-` | Konten kustom atau subkomponen compound (PaginationContent, PaginationItem, dll). |
67
+
68
+ ### Sub-interface: `PaginationPageItem`
69
+
70
+ | Field | Type | Default | Description |
71
+ | :--- | :--- | :--- | :--- |
72
+ | `type` | `'page' | 'ellipsis'` | `-` | |
73
+ | `value` | `number | string` | `-` | |
74
+ | `key` | `string` | `-` | |
75
+
76
+ ## 4. Usage Examples
77
+
78
+ ### React Example
79
+ ```tsx
80
+ import { useState } from "react";
81
+ import Pagination from "@ttdk-design-system/library-react/pagination";
82
+ import "@ttdk-design-system/library-react/pagination/pagination.css";
83
+
84
+ export function Example() {
85
+ const [page, setPage] = useState(1);
86
+ const [limit, setLimit] = useState(10);
87
+
88
+ return (
89
+ <Pagination
90
+ page={page}
91
+ totalPages={15}
92
+ limit={limit}
93
+ limitOptions={[10, 25, 50, 100]}
94
+ canPrevPage={page > 1}
95
+ canNextPage={page < 15}
96
+ onPageChange={(p) => setPage(p)}
97
+ onLimitChange={(l) => setLimit(l)}
98
+ />
99
+ );
100
+ }
101
+ ```
102
+
103
+ ### Vue 3 Example
104
+ ```vue
105
+ <script setup lang="ts">
106
+ import { ref } from "vue";
107
+ import Pagination from "@ttdk-design-system/library-vue/pagination";
108
+ import "@ttdk-design-system/library-vue/pagination/pagination.css";
109
+
110
+ const page = ref(1);
111
+ const limit = ref(10);
112
+ </script>
113
+
114
+ <template>
115
+ <Pagination
116
+ :page="page"
117
+ :total-pages="15"
118
+ :limit="limit"
119
+ :limit-options="[10, 25, 50, 100]"
120
+ :can-prev-page="page > 1"
121
+ :can-next-page="page < 15"
122
+ @page-change="(p: number) => (page = p)"
123
+ @limit-change="(l: number) => (limit = l)"
124
+ />
125
+ </template>
126
+ ```
127
+
128
+ ### Svelte Example
129
+ ```svelte
130
+ <script lang="ts">
131
+ import Pagination from "@ttdk-design-system/library-svelte/pagination";
132
+ import "@ttdk-design-system/library-svelte/pagination/pagination.css";
133
+
134
+ let page = 1;
135
+ let limit = 10;
136
+ </script>
137
+
138
+ <Pagination
139
+ {page}
140
+ totalPages={15}
141
+ {limit}
142
+ limitOptions={[10, 25, 50, 100]}
143
+ canPrevPage={page > 1}
144
+ canNextPage={page < 15}
145
+ on:pageChange={(e) => (page = e.detail)}
146
+ on:limitChange={(e) => (limit = e.detail)}
147
+ />
148
+ ```