@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,497 @@
1
+ <script context="module"></script>
2
+
3
+ <script>import { onDestroy, onMount, createEventDispatcher } from "svelte";
4
+ import {
5
+ computePosition,
6
+ autoUpdate,
7
+ flip,
8
+ shift,
9
+ offset,
10
+ arrow as floatingArrow
11
+ } from "@floating-ui/dom";
12
+ import { buildUiVars } from "../../core/types";
13
+ const dispatch = createEventDispatcher();
14
+ export let open = void 0;
15
+ export let defaultOpen = false;
16
+ export let arrow = false;
17
+ export let dismissible = true;
18
+ export let modal = false;
19
+ export let preventScroll = false;
20
+ export let lockScroll = false;
21
+ export let disabled = false;
22
+ export let content = void 0;
23
+ export let panel = void 0;
24
+ export let panelContent = void 0;
25
+ export let placement = void 0;
26
+ export let offsetDistance = 8;
27
+ export let block = false;
28
+ export let ui = void 0;
29
+ export let style = void 0;
30
+ export let className = "";
31
+ export let triggerClass = "";
32
+ export let triggerStyle = void 0;
33
+ export let contentClass = "";
34
+ export let contentStyle = void 0;
35
+ export let arrowClass = "";
36
+ export let arrowStyle = void 0;
37
+ export let overlayClass = "";
38
+ export let overlayStyle = void 0;
39
+ export let onUpdateOpen = void 0;
40
+ export let onOpenChange = void 0;
41
+ export let onOpen = void 0;
42
+ export let onClose = void 0;
43
+ export let onClosePrevent = void 0;
44
+ let rootRef = null;
45
+ let triggerRef = null;
46
+ let popoverRef = null;
47
+ let arrowRef = null;
48
+ let isOpen = open !== void 0 ? open : Boolean(defaultOpen);
49
+ let cleanupAutoUpdate = null;
50
+ function stringifyStyles(stylesObj) {
51
+ if (!stylesObj || typeof stylesObj !== "object")
52
+ return "";
53
+ let styles = "";
54
+ for (const key in stylesObj) {
55
+ if (stylesObj[key] !== void 0 && stylesObj[key] !== null && stylesObj[key] !== "") {
56
+ const dashedKey = key.replace(/[A-Z]/g, (match) => "-" + match.toLowerCase());
57
+ styles += dashedKey + ":" + stylesObj[key] + ";";
58
+ }
59
+ }
60
+ return styles;
61
+ }
62
+ function isOptionsConfig(val) {
63
+ if (!val || typeof val !== "object")
64
+ return false;
65
+ return "side" in val || "align" in val || "sideOffset" in val || "alignOffset" in val || "avoidCollisions" in val || "collisionPadding" in val || "arrowPadding" in val;
66
+ }
67
+ function getResolvedPlacement() {
68
+ if (placement)
69
+ return placement;
70
+ if (content && typeof content === "object" && isOptionsConfig(content)) {
71
+ const side = content.side || "bottom";
72
+ const align = content.align || "center";
73
+ return align === "center" ? side : `${side}-${align}`;
74
+ }
75
+ return "bottom";
76
+ }
77
+ function getResolvedOffset() {
78
+ if (offsetDistance !== void 0 && offsetDistance !== null) {
79
+ return offsetDistance;
80
+ }
81
+ if (content && typeof content === "object" && isOptionsConfig(content)) {
82
+ if (content.sideOffset !== void 0) {
83
+ return content.sideOffset;
84
+ }
85
+ }
86
+ return 8;
87
+ }
88
+ function isSvelteComponent(val) {
89
+ return typeof val === "function" && Boolean(val.prototype && (val.prototype.$$set || val.prototype.$on || val.prototype.$destroy));
90
+ }
91
+ function getRenderedFunctionContent(fn) {
92
+ if (typeof fn !== "function")
93
+ return fn;
94
+ try {
95
+ const res = fn({ close: () => closePopover(true), closePopover: () => closePopover(true) });
96
+ return res;
97
+ } catch {
98
+ return "";
99
+ }
100
+ }
101
+ function updatePosition() {
102
+ if (!triggerRef || !popoverRef)
103
+ return;
104
+ const resolvedPlacement = getResolvedPlacement();
105
+ const offsetVal = getResolvedOffset();
106
+ const avoidCollisions = content && typeof content === "object" && isOptionsConfig(content) ? content.avoidCollisions !== false : true;
107
+ const collisionPadding = content && typeof content === "object" && isOptionsConfig(content) ? content.collisionPadding ?? 8 : 8;
108
+ const arrowPadding = content && typeof content === "object" && isOptionsConfig(content) ? content.arrowPadding ?? 8 : 8;
109
+ const middlewares = [
110
+ offset(offsetVal),
111
+ ...avoidCollisions ? [
112
+ flip({
113
+ padding: collisionPadding,
114
+ fallbackPlacements: [
115
+ "top",
116
+ "bottom",
117
+ "left",
118
+ "right",
119
+ "top-start",
120
+ "top-end",
121
+ "bottom-start",
122
+ "bottom-end"
123
+ ]
124
+ }),
125
+ shift({ padding: collisionPadding })
126
+ ] : []
127
+ ];
128
+ if (arrow && arrowRef) {
129
+ middlewares.push(
130
+ floatingArrow({
131
+ element: arrowRef,
132
+ padding: arrowPadding
133
+ })
134
+ );
135
+ }
136
+ computePosition(triggerRef, popoverRef, {
137
+ placement: resolvedPlacement,
138
+ strategy: "absolute",
139
+ middleware: middlewares
140
+ }).then(({ x, y, placement: finalPlacement, middlewareData }) => {
141
+ if (!popoverRef)
142
+ return;
143
+ popoverRef.style.position = "absolute";
144
+ popoverRef.style.left = `${x}px`;
145
+ popoverRef.style.top = `${y}px`;
146
+ const [resolvedSide, resolvedAlign] = finalPlacement.split("-");
147
+ popoverRef.setAttribute("data-side", resolvedSide);
148
+ popoverRef.setAttribute("data-align", resolvedAlign || "center");
149
+ popoverRef.setAttribute("data-placement", finalPlacement);
150
+ if (arrow && middlewareData.arrow && arrowRef) {
151
+ const { x: arrowX, y: arrowY } = middlewareData.arrow;
152
+ const staticSideMap = {
153
+ top: "bottom",
154
+ right: "left",
155
+ bottom: "top",
156
+ left: "right"
157
+ };
158
+ const staticSide = staticSideMap[resolvedSide] || "top";
159
+ Object.assign(arrowRef.style, {
160
+ left: arrowX != null ? `${arrowX}px` : "",
161
+ top: arrowY != null ? `${arrowY}px` : "",
162
+ right: "",
163
+ bottom: "",
164
+ [staticSide]: "-4px"
165
+ });
166
+ }
167
+ });
168
+ }
169
+ function startFloating() {
170
+ stopFloating();
171
+ if (triggerRef && popoverRef) {
172
+ cleanupAutoUpdate = autoUpdate(triggerRef, popoverRef, () => {
173
+ updatePosition();
174
+ });
175
+ }
176
+ }
177
+ function stopFloating() {
178
+ if (typeof cleanupAutoUpdate === "function") {
179
+ cleanupAutoUpdate();
180
+ cleanupAutoUpdate = null;
181
+ }
182
+ }
183
+ function openPopover() {
184
+ if (disabled)
185
+ return;
186
+ if (!isOpen) {
187
+ isOpen = true;
188
+ if (open !== void 0) {
189
+ open = true;
190
+ }
191
+ dispatch("open");
192
+ dispatch("update:open", true);
193
+ if (onOpen)
194
+ onOpen();
195
+ if (onUpdateOpen)
196
+ onUpdateOpen(true);
197
+ if (onOpenChange)
198
+ onOpenChange(true);
199
+ }
200
+ }
201
+ function closePopover(force) {
202
+ if (dismissible === false && !force) {
203
+ dispatch("close:prevent");
204
+ if (onClosePrevent)
205
+ onClosePrevent();
206
+ return;
207
+ }
208
+ if (isOpen) {
209
+ isOpen = false;
210
+ if (open !== void 0) {
211
+ open = false;
212
+ }
213
+ dispatch("close");
214
+ dispatch("update:open", false);
215
+ if (onClose)
216
+ onClose();
217
+ if (onUpdateOpen)
218
+ onUpdateOpen(false);
219
+ if (onOpenChange)
220
+ onOpenChange(false);
221
+ }
222
+ }
223
+ function togglePopover() {
224
+ if (disabled)
225
+ return;
226
+ if (isOpen) {
227
+ closePopover(true);
228
+ } else {
229
+ openPopover();
230
+ }
231
+ }
232
+ function handleTriggerClick() {
233
+ if (disabled)
234
+ return;
235
+ togglePopover();
236
+ }
237
+ function handlePointerDown(event) {
238
+ if (!isOpen)
239
+ return;
240
+ const target = event.target;
241
+ if (rootRef && !rootRef.contains(target) && popoverRef && !popoverRef.contains(target)) {
242
+ closePopover();
243
+ }
244
+ }
245
+ function handleKeyDown(event) {
246
+ if (!isOpen)
247
+ return;
248
+ if (event.key === "Escape") {
249
+ closePopover(dismissible !== false);
250
+ }
251
+ }
252
+ function handleOverlayClick(event) {
253
+ if (event) {
254
+ event.stopPropagation();
255
+ }
256
+ closePopover(dismissible !== false);
257
+ }
258
+ let lockCount = 0;
259
+ let originalBodyOverflow = "";
260
+ let originalBodyPaddingRight = "";
261
+ let originalDocOverflow = "";
262
+ let lockedContainers = [];
263
+ function handlePreventScrollEvent(e) {
264
+ const target = e.target;
265
+ if (!target)
266
+ return;
267
+ if (target.closest && target.closest(".ttdk-popover-content, .ttdk-modal-dialog")) {
268
+ return;
269
+ }
270
+ e.preventDefault();
271
+ }
272
+ function lockBodyScroll(triggerEl) {
273
+ if (typeof document === "undefined")
274
+ return;
275
+ if (lockCount === 0) {
276
+ originalBodyOverflow = document.body.style.overflow;
277
+ originalBodyPaddingRight = document.body.style.paddingRight;
278
+ originalDocOverflow = document.documentElement.style.overflow;
279
+ const scrollBarWidth = window.innerWidth - document.documentElement.clientWidth;
280
+ document.body.style.overflow = "hidden";
281
+ document.documentElement.style.overflow = "hidden";
282
+ if (scrollBarWidth > 0) {
283
+ document.body.style.paddingRight = scrollBarWidth + "px";
284
+ }
285
+ window.addEventListener("wheel", handlePreventScrollEvent, { passive: false });
286
+ window.addEventListener("touchmove", handlePreventScrollEvent, { passive: false });
287
+ }
288
+ if (triggerEl) {
289
+ let curr = triggerEl.parentElement;
290
+ while (curr && curr !== document.body && curr !== document.documentElement) {
291
+ const currStyle = window.getComputedStyle(curr);
292
+ const isScrollable = (currStyle.overflowY === "auto" || currStyle.overflowY === "scroll") && curr.scrollHeight > curr.clientHeight;
293
+ if (isScrollable && !lockedContainers.some((c) => c.element === curr)) {
294
+ lockedContainers.push({
295
+ element: curr,
296
+ originalOverflow: curr.style.overflowY || curr.style.overflow
297
+ });
298
+ curr.style.overflowY = "hidden";
299
+ }
300
+ curr = curr.parentElement;
301
+ }
302
+ }
303
+ const docsMain = document.getElementById("main-docs-content");
304
+ if (docsMain && docsMain.scrollHeight > docsMain.clientHeight && !lockedContainers.some((c) => c.element === docsMain)) {
305
+ lockedContainers.push({
306
+ element: docsMain,
307
+ originalOverflow: docsMain.style.overflowY || docsMain.style.overflow
308
+ });
309
+ docsMain.style.overflowY = "hidden";
310
+ }
311
+ lockCount++;
312
+ }
313
+ function unlockBodyScroll() {
314
+ if (typeof document === "undefined")
315
+ return;
316
+ lockCount = Math.max(0, lockCount - 1);
317
+ if (lockCount === 0) {
318
+ document.body.style.overflow = originalBodyOverflow;
319
+ document.body.style.paddingRight = originalBodyPaddingRight;
320
+ document.documentElement.style.overflow = originalDocOverflow;
321
+ for (const container of lockedContainers) {
322
+ container.element.style.overflowY = container.originalOverflow;
323
+ }
324
+ lockedContainers = [];
325
+ window.removeEventListener("wheel", handlePreventScrollEvent);
326
+ window.removeEventListener("touchmove", handlePreventScrollEvent);
327
+ }
328
+ }
329
+ let isScrollLocked = false;
330
+ function applyScrollLock(shouldLock) {
331
+ if (shouldLock && !isScrollLocked) {
332
+ lockBodyScroll(rootRef);
333
+ isScrollLocked = true;
334
+ } else if (!shouldLock && isScrollLocked) {
335
+ unlockBodyScroll();
336
+ isScrollLocked = false;
337
+ }
338
+ }
339
+ $:
340
+ if (open !== void 0 && open !== isOpen) {
341
+ if (open) {
342
+ openPopover();
343
+ } else {
344
+ closePopover(true);
345
+ }
346
+ }
347
+ $:
348
+ shouldLockScroll = Boolean(
349
+ preventScroll || lockScroll || modal && preventScroll !== false && lockScroll !== false
350
+ );
351
+ $:
352
+ if (isOpen) {
353
+ if (shouldLockScroll) {
354
+ applyScrollLock(true);
355
+ }
356
+ setTimeout(() => {
357
+ startFloating();
358
+ updatePosition();
359
+ }, 0);
360
+ } else {
361
+ applyScrollLock(false);
362
+ stopFloating();
363
+ }
364
+ onMount(() => {
365
+ if (typeof document !== "undefined") {
366
+ document.addEventListener("pointerdown", handlePointerDown, true);
367
+ document.addEventListener("keydown", handleKeyDown, true);
368
+ }
369
+ if (isOpen) {
370
+ setTimeout(() => {
371
+ startFloating();
372
+ updatePosition();
373
+ }, 0);
374
+ }
375
+ });
376
+ onDestroy(() => {
377
+ applyScrollLock(false);
378
+ stopFloating();
379
+ if (typeof document !== "undefined") {
380
+ document.removeEventListener("pointerdown", handlePointerDown, true);
381
+ document.removeEventListener("keydown", handleKeyDown, true);
382
+ }
383
+ });
384
+ </script>
385
+
386
+ <div
387
+ bind:this={rootRef}
388
+ class={`ttdk-popover-wrapper ${className || ""}`.trim()}
389
+ data-open={isOpen ? "true" : "false"}
390
+ data-disabled={disabled ? "true" : "false"}
391
+ data-block={block ? "true" : undefined}
392
+ style={stringifyStyles({
393
+ ...buildUiVars(ui),
394
+ ...(typeof style === "object" && style !== null ? style : {}),
395
+ })}
396
+ >
397
+ <!-- 1. Popover Trigger -->
398
+ <!-- svelte-ignore a11y-no-noninteractive-tabindex -->
399
+ <div
400
+ role="button"
401
+ aria-haspopup="dialog"
402
+ bind:this={triggerRef}
403
+ class={`ttdk-popover-trigger ${triggerClass || ""}`.trim()}
404
+ tabindex={disabled ? -1 : 0}
405
+ aria-expanded={isOpen}
406
+ aria-disabled={disabled}
407
+ data-open={isOpen ? "true" : "false"}
408
+ data-disabled={disabled ? "true" : "false"}
409
+ style={stringifyStyles({
410
+ ...buildUiVars(triggerStyle),
411
+ })}
412
+ on:click={handleTriggerClick}
413
+ on:keydown={(e) => {
414
+ if (e.key === "Enter" || e.key === " ") {
415
+ e.preventDefault();
416
+ handleTriggerClick();
417
+ }
418
+ }}
419
+ >
420
+ <slot close={() => closePopover(true)} closePopover={() => closePopover(true)} />
421
+ </div>
422
+
423
+ <!-- 2. Modal Backdrop Overlay -->
424
+ {#if isOpen && modal}
425
+ <!-- svelte-ignore a11y-click-events-have-key-events -->
426
+ <!-- svelte-ignore a11y-no-static-element-interactions -->
427
+ <div
428
+ class={`ttdk-popover-overlay ${overlayClass || ""}`.trim()}
429
+ style={stringifyStyles({
430
+ ...buildUiVars(overlayStyle),
431
+ })}
432
+ on:click={handleOverlayClick}
433
+ />
434
+ {/if}
435
+
436
+ <!-- 3. Popover Content Panel -->
437
+ {#if isOpen}
438
+ <div
439
+ role="dialog"
440
+ bind:this={popoverRef}
441
+ class={`ttdk-popover-content ${contentClass || ""}`.trim()}
442
+ aria-modal={modal ? "true" : "false"}
443
+ tabindex="-1"
444
+ style={stringifyStyles({
445
+ ...buildUiVars(contentStyle),
446
+ })}
447
+ >
448
+ {#if arrow}
449
+ <div
450
+ bind:this={arrowRef}
451
+ class={`ttdk-popover-arrow ${arrowClass || ""}`.trim()}
452
+ style={stringifyStyles({
453
+ ...buildUiVars(arrowStyle),
454
+ })}
455
+ />
456
+ {/if}
457
+
458
+ {#if $$slots.content}
459
+ <slot name="content" close={() => closePopover(true)} closePopover={() => closePopover(true)} />
460
+ {:else if $$slots.panelContent}
461
+ <slot name="panelContent" close={() => closePopover(true)} closePopover={() => closePopover(true)} />
462
+ {:else if $$slots.panel}
463
+ <slot name="panel" close={() => closePopover(true)} closePopover={() => closePopover(true)} />
464
+ {:else if panel}
465
+ {#if typeof panel === "function" && isSvelteComponent(panel)}
466
+ <svelte:component this={panel} close={() => closePopover(true)} closePopover={() => closePopover(true)} />
467
+ {:else if typeof panel === "function"}
468
+ {getRenderedFunctionContent(panel)}
469
+ {:else if typeof panel === "string" || typeof panel === "number"}
470
+ {panel}
471
+ {:else}
472
+ <svelte:component this={panel} close={() => closePopover(true)} closePopover={() => closePopover(true)} />
473
+ {/if}
474
+ {:else if panelContent}
475
+ {#if typeof panelContent === "function" && isSvelteComponent(panelContent)}
476
+ <svelte:component this={panelContent} close={() => closePopover(true)} closePopover={() => closePopover(true)} />
477
+ {:else if typeof panelContent === "function"}
478
+ {getRenderedFunctionContent(panelContent)}
479
+ {:else if typeof panelContent === "string" || typeof panelContent === "number"}
480
+ {panelContent}
481
+ {:else}
482
+ <svelte:component this={panelContent} close={() => closePopover(true)} closePopover={() => closePopover(true)} />
483
+ {/if}
484
+ {:else if content && !isOptionsConfig(content)}
485
+ {#if typeof content === "function" && isSvelteComponent(content)}
486
+ <svelte:component this={content} close={() => closePopover(true)} closePopover={() => closePopover(true)} />
487
+ {:else if typeof content === "function"}
488
+ {getRenderedFunctionContent(content)}
489
+ {:else if typeof content === "string" || typeof content === "number"}
490
+ {content}
491
+ {:else}
492
+ <svelte:component this={content} close={() => closePopover(true)} closePopover={() => closePopover(true)} />
493
+ {/if}
494
+ {/if}
495
+ </div>
496
+ {/if}
497
+ </div>
@@ -0,0 +1,116 @@
1
+ import { SvelteComponent } from "svelte";
2
+ export interface PopoverContentOptions {
3
+ side?: "top" | "right" | "bottom" | "left";
4
+ align?: "start" | "center" | "end";
5
+ sideOffset?: number;
6
+ alignOffset?: number;
7
+ avoidCollisions?: boolean;
8
+ collisionBoundary?: any;
9
+ collisionPadding?: number;
10
+ arrowPadding?: number;
11
+ sticky?: "partial" | "always";
12
+ hideWhenDetached?: boolean;
13
+ }
14
+ export type PopoverUiProps = UiProps;
15
+ export interface PopoverProps {
16
+ open?: boolean;
17
+ defaultOpen?: boolean;
18
+ arrow?: boolean;
19
+ dismissible?: boolean;
20
+ modal?: boolean;
21
+ preventScroll?: boolean;
22
+ lockScroll?: boolean;
23
+ disabled?: boolean;
24
+ content?: PopoverContentOptions | any;
25
+ panel?: any;
26
+ panelContent?: any;
27
+ placement?: "top" | "top-start" | "top-end" | "bottom" | "bottom-start" | "bottom-end" | "left" | "left-start" | "left-end" | "right" | "right-start" | "right-end";
28
+ offsetDistance?: number;
29
+ block?: boolean;
30
+ ui?: PopoverUiProps;
31
+ style?: any;
32
+ className?: string;
33
+ triggerClass?: string;
34
+ triggerStyle?: UiProps;
35
+ contentClass?: string;
36
+ contentStyle?: UiProps;
37
+ arrowClass?: string;
38
+ arrowStyle?: UiProps;
39
+ overlayClass?: string;
40
+ overlayStyle?: UiProps;
41
+ onUpdateOpen?: (open: boolean) => void;
42
+ onOpenChange?: (open: boolean) => void;
43
+ onOpen?: () => void;
44
+ onClose?: () => void;
45
+ onClosePrevent?: () => void;
46
+ children?: any;
47
+ }
48
+ import { type UiProps } from "../../core/types";
49
+ declare const __propDef: {
50
+ props: {
51
+ open?: PopoverProps["open"];
52
+ defaultOpen?: PopoverProps["defaultOpen"];
53
+ arrow?: PopoverProps["arrow"];
54
+ dismissible?: PopoverProps["dismissible"];
55
+ modal?: PopoverProps["modal"];
56
+ preventScroll?: PopoverProps["preventScroll"];
57
+ lockScroll?: PopoverProps["lockScroll"];
58
+ disabled?: PopoverProps["disabled"];
59
+ content?: PopoverProps["content"];
60
+ panel?: PopoverProps["panel"];
61
+ panelContent?: PopoverProps["panelContent"];
62
+ placement?: PopoverProps["placement"];
63
+ offsetDistance?: PopoverProps["offsetDistance"];
64
+ block?: PopoverProps["block"];
65
+ ui?: PopoverProps["ui"];
66
+ style?: any;
67
+ className?: string;
68
+ triggerClass?: string;
69
+ triggerStyle?: UiProps | undefined;
70
+ contentClass?: string;
71
+ contentStyle?: UiProps | undefined;
72
+ arrowClass?: string;
73
+ arrowStyle?: UiProps | undefined;
74
+ overlayClass?: string;
75
+ overlayStyle?: UiProps | undefined;
76
+ onUpdateOpen?: PopoverProps["onUpdateOpen"];
77
+ onOpenChange?: PopoverProps["onOpenChange"];
78
+ onOpen?: PopoverProps["onOpen"];
79
+ onClose?: PopoverProps["onClose"];
80
+ onClosePrevent?: PopoverProps["onClosePrevent"];
81
+ };
82
+ events: {
83
+ open: CustomEvent<any>;
84
+ 'update:open': CustomEvent<any>;
85
+ 'close:prevent': CustomEvent<any>;
86
+ close: CustomEvent<any>;
87
+ } & {
88
+ [evt: string]: CustomEvent<any>;
89
+ };
90
+ slots: {
91
+ default: {
92
+ close: () => void;
93
+ closePopover: () => void;
94
+ };
95
+ content: {
96
+ close: () => void;
97
+ closePopover: () => void;
98
+ };
99
+ panelContent: {
100
+ close: () => void;
101
+ closePopover: () => void;
102
+ };
103
+ panel: {
104
+ close: () => void;
105
+ closePopover: () => void;
106
+ };
107
+ };
108
+ exports?: {} | undefined;
109
+ bindings?: string | undefined;
110
+ };
111
+ type PopoverProps_ = typeof __propDef.props;
112
+ export type PopoverEvents = typeof __propDef.events;
113
+ export type PopoverSlots = typeof __propDef.slots;
114
+ export default class Popover extends SvelteComponent<PopoverProps_, PopoverEvents, PopoverSlots> {
115
+ }
116
+ export {};