tyrell-components 1.0.0-TC7

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 (330) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +221 -0
  3. package/css/tyrell.css +1783 -0
  4. package/dist/tyrell.css +1783 -0
  5. package/dist/tyrell.js +2 -0
  6. package/lib/base/ty-component.d.ts +133 -0
  7. package/lib/base/ty-component.d.ts.map +1 -0
  8. package/lib/base/ty-component.js +297 -0
  9. package/lib/base/ty-component.js.map +1 -0
  10. package/lib/components/button.d.ts +126 -0
  11. package/lib/components/button.d.ts.map +1 -0
  12. package/lib/components/button.js +244 -0
  13. package/lib/components/button.js.map +1 -0
  14. package/lib/components/calendar-month.d.ts +132 -0
  15. package/lib/components/calendar-month.d.ts.map +1 -0
  16. package/lib/components/calendar-month.js +440 -0
  17. package/lib/components/calendar-month.js.map +1 -0
  18. package/lib/components/calendar-navigation.d.ts +137 -0
  19. package/lib/components/calendar-navigation.d.ts.map +1 -0
  20. package/lib/components/calendar-navigation.js +366 -0
  21. package/lib/components/calendar-navigation.js.map +1 -0
  22. package/lib/components/calendar.d.ts +166 -0
  23. package/lib/components/calendar.d.ts.map +1 -0
  24. package/lib/components/calendar.js +774 -0
  25. package/lib/components/calendar.js.map +1 -0
  26. package/lib/components/checkbox.d.ts +189 -0
  27. package/lib/components/checkbox.d.ts.map +1 -0
  28. package/lib/components/checkbox.js +400 -0
  29. package/lib/components/checkbox.js.map +1 -0
  30. package/lib/components/copy.d.ts +180 -0
  31. package/lib/components/copy.d.ts.map +1 -0
  32. package/lib/components/copy.js +393 -0
  33. package/lib/components/copy.js.map +1 -0
  34. package/lib/components/date-picker.d.ts +379 -0
  35. package/lib/components/date-picker.d.ts.map +1 -0
  36. package/lib/components/date-picker.js +1586 -0
  37. package/lib/components/date-picker.js.map +1 -0
  38. package/lib/components/dropdown.d.ts +402 -0
  39. package/lib/components/dropdown.d.ts.map +1 -0
  40. package/lib/components/dropdown.js +1564 -0
  41. package/lib/components/dropdown.js.map +1 -0
  42. package/lib/components/icon.d.ts +107 -0
  43. package/lib/components/icon.d.ts.map +1 -0
  44. package/lib/components/icon.js +230 -0
  45. package/lib/components/icon.js.map +1 -0
  46. package/lib/components/input.d.ts +270 -0
  47. package/lib/components/input.d.ts.map +1 -0
  48. package/lib/components/input.js +721 -0
  49. package/lib/components/input.js.map +1 -0
  50. package/lib/components/modal.d.ts +58 -0
  51. package/lib/components/modal.d.ts.map +1 -0
  52. package/lib/components/modal.js +473 -0
  53. package/lib/components/modal.js.map +1 -0
  54. package/lib/components/multiselect.d.ts +397 -0
  55. package/lib/components/multiselect.d.ts.map +1 -0
  56. package/lib/components/multiselect.js +1580 -0
  57. package/lib/components/multiselect.js.map +1 -0
  58. package/lib/components/option.d.ts +66 -0
  59. package/lib/components/option.d.ts.map +1 -0
  60. package/lib/components/option.js +314 -0
  61. package/lib/components/option.js.map +1 -0
  62. package/lib/components/popup.d.ts +43 -0
  63. package/lib/components/popup.d.ts.map +1 -0
  64. package/lib/components/popup.js +380 -0
  65. package/lib/components/popup.js.map +1 -0
  66. package/lib/components/radio.d.ts +198 -0
  67. package/lib/components/radio.d.ts.map +1 -0
  68. package/lib/components/radio.js +437 -0
  69. package/lib/components/radio.js.map +1 -0
  70. package/lib/components/resize-observer.d.ts +48 -0
  71. package/lib/components/resize-observer.d.ts.map +1 -0
  72. package/lib/components/resize-observer.js +108 -0
  73. package/lib/components/resize-observer.js.map +1 -0
  74. package/lib/components/scroll-container.d.ts +51 -0
  75. package/lib/components/scroll-container.d.ts.map +1 -0
  76. package/lib/components/scroll-container.js +239 -0
  77. package/lib/components/scroll-container.js.map +1 -0
  78. package/lib/components/step.d.ts +26 -0
  79. package/lib/components/step.d.ts.map +1 -0
  80. package/lib/components/step.js +75 -0
  81. package/lib/components/step.js.map +1 -0
  82. package/lib/components/switch.d.ts +111 -0
  83. package/lib/components/switch.d.ts.map +1 -0
  84. package/lib/components/switch.js +240 -0
  85. package/lib/components/switch.js.map +1 -0
  86. package/lib/components/tab.d.ts +23 -0
  87. package/lib/components/tab.d.ts.map +1 -0
  88. package/lib/components/tab.js +76 -0
  89. package/lib/components/tab.js.map +1 -0
  90. package/lib/components/tabs.d.ts +93 -0
  91. package/lib/components/tabs.d.ts.map +1 -0
  92. package/lib/components/tabs.js +653 -0
  93. package/lib/components/tabs.js.map +1 -0
  94. package/lib/components/tag.d.ts +144 -0
  95. package/lib/components/tag.d.ts.map +1 -0
  96. package/lib/components/tag.js +314 -0
  97. package/lib/components/tag.js.map +1 -0
  98. package/lib/components/textarea.d.ts +241 -0
  99. package/lib/components/textarea.d.ts.map +1 -0
  100. package/lib/components/textarea.js +585 -0
  101. package/lib/components/textarea.js.map +1 -0
  102. package/lib/components/tooltip.d.ts +40 -0
  103. package/lib/components/tooltip.d.ts.map +1 -0
  104. package/lib/components/tooltip.js +439 -0
  105. package/lib/components/tooltip.js.map +1 -0
  106. package/lib/components/wizard.d.ts +86 -0
  107. package/lib/components/wizard.d.ts.map +1 -0
  108. package/lib/components/wizard.js +636 -0
  109. package/lib/components/wizard.js.map +1 -0
  110. package/lib/icons/fontawesome/brands.d.ts +557 -0
  111. package/lib/icons/fontawesome/brands.d.ts.map +1 -0
  112. package/lib/icons/fontawesome/brands.js +557 -0
  113. package/lib/icons/fontawesome/brands.js.map +1 -0
  114. package/lib/icons/fontawesome/regular.d.ts +281 -0
  115. package/lib/icons/fontawesome/regular.d.ts.map +1 -0
  116. package/lib/icons/fontawesome/regular.js +281 -0
  117. package/lib/icons/fontawesome/regular.js.map +1 -0
  118. package/lib/icons/fontawesome/solid.d.ts +1992 -0
  119. package/lib/icons/fontawesome/solid.d.ts.map +1 -0
  120. package/lib/icons/fontawesome/solid.js +1992 -0
  121. package/lib/icons/fontawesome/solid.js.map +1 -0
  122. package/lib/icons/heroicons/micro.d.ts +324 -0
  123. package/lib/icons/heroicons/micro.d.ts.map +1 -0
  124. package/lib/icons/heroicons/micro.js +1032 -0
  125. package/lib/icons/heroicons/micro.js.map +1 -0
  126. package/lib/icons/heroicons/mini.d.ts +332 -0
  127. package/lib/icons/heroicons/mini.d.ts.map +1 -0
  128. package/lib/icons/heroicons/mini.js +1038 -0
  129. package/lib/icons/heroicons/mini.js.map +1 -0
  130. package/lib/icons/heroicons/outline.d.ts +332 -0
  131. package/lib/icons/heroicons/outline.d.ts.map +1 -0
  132. package/lib/icons/heroicons/outline.js +993 -0
  133. package/lib/icons/heroicons/outline.js.map +1 -0
  134. package/lib/icons/heroicons/solid.d.ts +332 -0
  135. package/lib/icons/heroicons/solid.d.ts.map +1 -0
  136. package/lib/icons/heroicons/solid.js +1063 -0
  137. package/lib/icons/heroicons/solid.js.map +1 -0
  138. package/lib/icons/lucide.d.ts +1872 -0
  139. package/lib/icons/lucide.d.ts.map +1 -0
  140. package/lib/icons/lucide.js +28212 -0
  141. package/lib/icons/lucide.js.map +1 -0
  142. package/lib/icons/material/filled.d.ts +2180 -0
  143. package/lib/icons/material/filled.d.ts.map +1 -0
  144. package/lib/icons/material/filled.js +14003 -0
  145. package/lib/icons/material/filled.js.map +1 -0
  146. package/lib/icons/material/outlined.d.ts +2142 -0
  147. package/lib/icons/material/outlined.d.ts.map +1 -0
  148. package/lib/icons/material/outlined.js +14545 -0
  149. package/lib/icons/material/outlined.js.map +1 -0
  150. package/lib/icons/material/round.d.ts +2147 -0
  151. package/lib/icons/material/round.d.ts.map +1 -0
  152. package/lib/icons/material/round.js +14779 -0
  153. package/lib/icons/material/round.js.map +1 -0
  154. package/lib/icons/material/sharp.d.ts +2147 -0
  155. package/lib/icons/material/sharp.d.ts.map +1 -0
  156. package/lib/icons/material/sharp.js +14189 -0
  157. package/lib/icons/material/sharp.js.map +1 -0
  158. package/lib/icons/material/two-tone.d.ts +2185 -0
  159. package/lib/icons/material/two-tone.d.ts.map +1 -0
  160. package/lib/icons/material/two-tone.js +17152 -0
  161. package/lib/icons/material/two-tone.js.map +1 -0
  162. package/lib/index.d.ts +78 -0
  163. package/lib/index.d.ts.map +1 -0
  164. package/lib/index.js +71 -0
  165. package/lib/index.js.map +1 -0
  166. package/lib/styles/button.d.ts +14 -0
  167. package/lib/styles/button.d.ts.map +1 -0
  168. package/lib/styles/button.js +457 -0
  169. package/lib/styles/button.js.map +1 -0
  170. package/lib/styles/calendar-month.d.ts +6 -0
  171. package/lib/styles/calendar-month.d.ts.map +1 -0
  172. package/lib/styles/calendar-month.js +229 -0
  173. package/lib/styles/calendar-month.js.map +1 -0
  174. package/lib/styles/calendar-navigation.d.ts +6 -0
  175. package/lib/styles/calendar-navigation.d.ts.map +1 -0
  176. package/lib/styles/calendar-navigation.js +125 -0
  177. package/lib/styles/calendar-navigation.js.map +1 -0
  178. package/lib/styles/calendar.d.ts +6 -0
  179. package/lib/styles/calendar.d.ts.map +1 -0
  180. package/lib/styles/calendar.js +28 -0
  181. package/lib/styles/calendar.js.map +1 -0
  182. package/lib/styles/checkbox.d.ts +9 -0
  183. package/lib/styles/checkbox.d.ts.map +1 -0
  184. package/lib/styles/checkbox.js +19 -0
  185. package/lib/styles/checkbox.js.map +1 -0
  186. package/lib/styles/copy.d.ts +7 -0
  187. package/lib/styles/copy.d.ts.map +1 -0
  188. package/lib/styles/copy.js +94 -0
  189. package/lib/styles/copy.js.map +1 -0
  190. package/lib/styles/custom-scrollbar.d.ts +6 -0
  191. package/lib/styles/custom-scrollbar.d.ts.map +1 -0
  192. package/lib/styles/custom-scrollbar.js +157 -0
  193. package/lib/styles/custom-scrollbar.js.map +1 -0
  194. package/lib/styles/date-picker.d.ts +6 -0
  195. package/lib/styles/date-picker.d.ts.map +1 -0
  196. package/lib/styles/date-picker.js +400 -0
  197. package/lib/styles/date-picker.js.map +1 -0
  198. package/lib/styles/dropdown.d.ts +12 -0
  199. package/lib/styles/dropdown.d.ts.map +1 -0
  200. package/lib/styles/dropdown.js +983 -0
  201. package/lib/styles/dropdown.js.map +1 -0
  202. package/lib/styles/icon.d.ts +6 -0
  203. package/lib/styles/icon.d.ts.map +1 -0
  204. package/lib/styles/icon.js +231 -0
  205. package/lib/styles/icon.js.map +1 -0
  206. package/lib/styles/input.d.ts +7 -0
  207. package/lib/styles/input.d.ts.map +1 -0
  208. package/lib/styles/input.js +685 -0
  209. package/lib/styles/input.js.map +1 -0
  210. package/lib/styles/modal.d.ts +8 -0
  211. package/lib/styles/modal.d.ts.map +1 -0
  212. package/lib/styles/modal.js +134 -0
  213. package/lib/styles/modal.js.map +1 -0
  214. package/lib/styles/multiselect.d.ts +6 -0
  215. package/lib/styles/multiselect.d.ts.map +1 -0
  216. package/lib/styles/multiselect.js +774 -0
  217. package/lib/styles/multiselect.js.map +1 -0
  218. package/lib/styles/option.d.ts +6 -0
  219. package/lib/styles/option.d.ts.map +1 -0
  220. package/lib/styles/option.js +116 -0
  221. package/lib/styles/option.js.map +1 -0
  222. package/lib/styles/popup.d.ts +8 -0
  223. package/lib/styles/popup.d.ts.map +1 -0
  224. package/lib/styles/popup.js +95 -0
  225. package/lib/styles/popup.js.map +1 -0
  226. package/lib/styles/radio.d.ts +8 -0
  227. package/lib/styles/radio.d.ts.map +1 -0
  228. package/lib/styles/radio.js +160 -0
  229. package/lib/styles/radio.js.map +1 -0
  230. package/lib/styles/resize-observer.d.ts +6 -0
  231. package/lib/styles/resize-observer.d.ts.map +1 -0
  232. package/lib/styles/resize-observer.js +18 -0
  233. package/lib/styles/resize-observer.js.map +1 -0
  234. package/lib/styles/scroll-container.d.ts +6 -0
  235. package/lib/styles/scroll-container.d.ts.map +1 -0
  236. package/lib/styles/scroll-container.js +198 -0
  237. package/lib/styles/scroll-container.js.map +1 -0
  238. package/lib/styles/step.d.ts +5 -0
  239. package/lib/styles/step.d.ts.map +1 -0
  240. package/lib/styles/step.js +50 -0
  241. package/lib/styles/step.js.map +1 -0
  242. package/lib/styles/switch.d.ts +9 -0
  243. package/lib/styles/switch.d.ts.map +1 -0
  244. package/lib/styles/switch.js +100 -0
  245. package/lib/styles/switch.js.map +1 -0
  246. package/lib/styles/tab.d.ts +5 -0
  247. package/lib/styles/tab.d.ts.map +1 -0
  248. package/lib/styles/tab.js +51 -0
  249. package/lib/styles/tab.js.map +1 -0
  250. package/lib/styles/tabs.d.ts +13 -0
  251. package/lib/styles/tabs.d.ts.map +1 -0
  252. package/lib/styles/tabs.js +184 -0
  253. package/lib/styles/tabs.js.map +1 -0
  254. package/lib/styles/tag.d.ts +6 -0
  255. package/lib/styles/tag.d.ts.map +1 -0
  256. package/lib/styles/tag.js +415 -0
  257. package/lib/styles/tag.js.map +1 -0
  258. package/lib/styles/textarea.d.ts +6 -0
  259. package/lib/styles/textarea.d.ts.map +1 -0
  260. package/lib/styles/textarea.js +350 -0
  261. package/lib/styles/textarea.js.map +1 -0
  262. package/lib/styles/tooltip.d.ts +9 -0
  263. package/lib/styles/tooltip.d.ts.map +1 -0
  264. package/lib/styles/tooltip.js +136 -0
  265. package/lib/styles/tooltip.js.map +1 -0
  266. package/lib/styles/wizard.d.ts +25 -0
  267. package/lib/styles/wizard.d.ts.map +1 -0
  268. package/lib/styles/wizard.js +325 -0
  269. package/lib/styles/wizard.js.map +1 -0
  270. package/lib/types/common.d.ts +143 -0
  271. package/lib/types/common.d.ts.map +1 -0
  272. package/lib/types/common.js +5 -0
  273. package/lib/types/common.js.map +1 -0
  274. package/lib/utils/calendar-utils.d.ts +176 -0
  275. package/lib/utils/calendar-utils.d.ts.map +1 -0
  276. package/lib/utils/calendar-utils.js +370 -0
  277. package/lib/utils/calendar-utils.js.map +1 -0
  278. package/lib/utils/custom-scrollbar.d.ts +82 -0
  279. package/lib/utils/custom-scrollbar.d.ts.map +1 -0
  280. package/lib/utils/custom-scrollbar.js +320 -0
  281. package/lib/utils/custom-scrollbar.js.map +1 -0
  282. package/lib/utils/icon-registry.d.ts +78 -0
  283. package/lib/utils/icon-registry.d.ts.map +1 -0
  284. package/lib/utils/icon-registry.js +304 -0
  285. package/lib/utils/icon-registry.js.map +1 -0
  286. package/lib/utils/locale.d.ts +136 -0
  287. package/lib/utils/locale.d.ts.map +1 -0
  288. package/lib/utils/locale.js +213 -0
  289. package/lib/utils/locale.js.map +1 -0
  290. package/lib/utils/mobile.d.ts +14 -0
  291. package/lib/utils/mobile.d.ts.map +1 -0
  292. package/lib/utils/mobile.js +21 -0
  293. package/lib/utils/mobile.js.map +1 -0
  294. package/lib/utils/number-format.d.ts +83 -0
  295. package/lib/utils/number-format.d.ts.map +1 -0
  296. package/lib/utils/number-format.js +143 -0
  297. package/lib/utils/number-format.js.map +1 -0
  298. package/lib/utils/parse-boolean.d.ts +39 -0
  299. package/lib/utils/parse-boolean.d.ts.map +1 -0
  300. package/lib/utils/parse-boolean.js +58 -0
  301. package/lib/utils/parse-boolean.js.map +1 -0
  302. package/lib/utils/positioning.d.ts +143 -0
  303. package/lib/utils/positioning.d.ts.map +1 -0
  304. package/lib/utils/positioning.js +308 -0
  305. package/lib/utils/positioning.js.map +1 -0
  306. package/lib/utils/property-capture.d.ts +132 -0
  307. package/lib/utils/property-capture.d.ts.map +1 -0
  308. package/lib/utils/property-capture.js +152 -0
  309. package/lib/utils/property-capture.js.map +1 -0
  310. package/lib/utils/property-manager.d.ts +90 -0
  311. package/lib/utils/property-manager.d.ts.map +1 -0
  312. package/lib/utils/property-manager.js +197 -0
  313. package/lib/utils/property-manager.js.map +1 -0
  314. package/lib/utils/resize-observer.d.ts +42 -0
  315. package/lib/utils/resize-observer.d.ts.map +1 -0
  316. package/lib/utils/resize-observer.js +71 -0
  317. package/lib/utils/resize-observer.js.map +1 -0
  318. package/lib/utils/scroll-lock.d.ts +79 -0
  319. package/lib/utils/scroll-lock.d.ts.map +1 -0
  320. package/lib/utils/scroll-lock.js +197 -0
  321. package/lib/utils/scroll-lock.js.map +1 -0
  322. package/lib/utils/styles.d.ts +27 -0
  323. package/lib/utils/styles.d.ts.map +1 -0
  324. package/lib/utils/styles.js +53 -0
  325. package/lib/utils/styles.js.map +1 -0
  326. package/lib/version.d.ts +8 -0
  327. package/lib/version.d.ts.map +1 -0
  328. package/lib/version.js +11 -0
  329. package/lib/version.js.map +1 -0
  330. package/package.json +159 -0
@@ -0,0 +1,380 @@
1
+ /**
2
+ * Popup Component
3
+ *
4
+ * Interactive popup component with dropdown-like behavior and tooltip positioning.
5
+ * Uses parent-child relationship - popup opens on click, stays open for interaction,
6
+ * closes on outside click or ESC key.
7
+ *
8
+ * @example
9
+ * <button>
10
+ * Click me
11
+ * <ty-popup placement="bottom" offset="8">
12
+ * <div class="ty-elevated p-4 rounded-lg">
13
+ * Popup content here
14
+ * </div>
15
+ * </ty-popup>
16
+ * </button>
17
+ */
18
+ import { findBestPosition } from '../utils/positioning.js';
19
+ import { lockScroll, unlockScroll } from '../utils/scroll-lock.js';
20
+ import { ensureStyles } from '../utils/styles.js';
21
+ import { popupStyles } from '../styles/popup.js';
22
+ // ============================================================================
23
+ // WeakMaps for State Management
24
+ // ============================================================================
25
+ const anchorClickHandlers = new WeakMap();
26
+ const outsideClickHandlers = new WeakMap();
27
+ const escapeHandlers = new WeakMap();
28
+ const closeRequestHandlers = new WeakMap();
29
+ const popupIds = new WeakMap(); // Store popup ID for scroll locking
30
+ // ============================================================================
31
+ // Helper Functions
32
+ // ============================================================================
33
+ /**
34
+ * Parse boolean attribute
35
+ */
36
+ function parseBoolAttr(el, name) {
37
+ return el.hasAttribute(name);
38
+ }
39
+ /**
40
+ * Parse integer attribute
41
+ */
42
+ function parseIntAttr(el, name, defaultValue) {
43
+ const value = el.getAttribute(name);
44
+ if (value === null)
45
+ return defaultValue;
46
+ const parsed = parseInt(value, 10);
47
+ return isNaN(parsed) ? defaultValue : parsed;
48
+ }
49
+ /**
50
+ * Read popup attributes with simplified API
51
+ */
52
+ function getPopupAttributes(el) {
53
+ return {
54
+ manual: parseBoolAttr(el, 'manual'),
55
+ disableClose: parseBoolAttr(el, 'disable-close'),
56
+ placement: (el.getAttribute('placement') || 'bottom'),
57
+ offset: parseIntAttr(el, 'offset', 8),
58
+ };
59
+ }
60
+ /**
61
+ * Get the parent element as anchor (like tooltip)
62
+ */
63
+ function getAnchorElement(el) {
64
+ return el.parentElement;
65
+ }
66
+ /**
67
+ * Get the popup dialog element
68
+ */
69
+ function getPopupDialog(shadowRoot) {
70
+ return shadowRoot.querySelector('.popup-dialog');
71
+ }
72
+ /**
73
+ * Get or create a unique popup ID for scroll locking
74
+ */
75
+ function getPopupId(el) {
76
+ let id = popupIds.get(el);
77
+ if (!id) {
78
+ id = `popup-${el.id || Math.random().toString(36).substr(2, 9)}`;
79
+ popupIds.set(el, id);
80
+ }
81
+ return id;
82
+ }
83
+ /**
84
+ * Calculate and update popup position based on anchor (tooltip style)
85
+ */
86
+ function updatePosition(el) {
87
+ const { placement, offset } = getPopupAttributes(el);
88
+ const shadowRoot = el.shadowRoot;
89
+ const anchor = getAnchorElement(el);
90
+ const dialog = shadowRoot ? getPopupDialog(shadowRoot) : null;
91
+ if (!anchor || !dialog)
92
+ return;
93
+ // Calculate preferred placements based on placement attribute (like tooltip)
94
+ const preferences = placement === 'top' ? ['top', 'bottom', 'left', 'right'] :
95
+ placement === 'bottom' ? ['bottom', 'top', 'left', 'right'] :
96
+ placement === 'left' ? ['left', 'right', 'top', 'bottom'] :
97
+ placement === 'right' ? ['right', 'left', 'top', 'bottom'] :
98
+ ['bottom', 'top', 'right', 'left']; // Default popup placement
99
+ // Use positioning engine to find best position
100
+ const positionData = findBestPosition({
101
+ targetEl: anchor,
102
+ floatingEl: dialog,
103
+ preferences,
104
+ offset,
105
+ padding: 8,
106
+ containerPadding: 16,
107
+ });
108
+ // Update CSS variables with compensated coordinates
109
+ el.style.setProperty('--popup-x', `${positionData.x}px`);
110
+ el.style.setProperty('--popup-y', `${positionData.y}px`);
111
+ // Add position class like dropdown does (this applies the variables)
112
+ dialog.classList.add('position-calculated');
113
+ }
114
+ /**
115
+ * Close popup with clean animation -> position reset -> hide sequence
116
+ */
117
+ function closePopup(el, force = false) {
118
+ const { disableClose } = getPopupAttributes(el);
119
+ if (!force && disableClose)
120
+ return;
121
+ const shadowRoot = el.shadowRoot;
122
+ const dialog = shadowRoot ? getPopupDialog(shadowRoot) : null;
123
+ if (!dialog)
124
+ return;
125
+ // Don't unlock scroll here - let the dialog 'close' event handler do it
126
+ // This prevents double-unlock issues
127
+ dialog.classList.remove('open');
128
+ dialog.classList.remove('preparing-animation');
129
+ setTimeout(() => {
130
+ dialog.classList.remove('position-calculated');
131
+ dialog.close(); // This will trigger 'close' event which unlocks scroll
132
+ }, 150);
133
+ // Dispatch close event
134
+ el.dispatchEvent(new CustomEvent('close', { bubbles: true }));
135
+ }
136
+ /**
137
+ * Open popup with dialog open but hidden → position → animate sequence
138
+ */
139
+ function openPopup(el) {
140
+ // Lock scroll using the stored popup ID
141
+ const popupId = getPopupId(el);
142
+ lockScroll(popupId);
143
+ const shadowRoot = el.shadowRoot;
144
+ const dialog = shadowRoot ? getPopupDialog(shadowRoot) : null;
145
+ if (!dialog)
146
+ return;
147
+ // Step 1: showModal() immediately - dialog gets [open] attribute and proper layout
148
+ dialog.showModal();
149
+ // Step 2: Wait for layout to settle, then measure and position
150
+ requestAnimationFrame(() => {
151
+ // Now dialog has [open] and accurate dimensions
152
+ // Calculate and apply position while dialog is hidden by CSS
153
+ updatePosition(el);
154
+ // Step 3: Add scale transform for animation prep
155
+ dialog.classList.add('preparing-animation');
156
+ // Step 4: Third RAF - THEN add open class for smooth scale animation
157
+ requestAnimationFrame(() => {
158
+ // Now animate: scale(0.95) → scale(1) + opacity + visibility
159
+ dialog.classList.add('open');
160
+ // Dispatch open event
161
+ el.dispatchEvent(new CustomEvent('open', { bubbles: true }));
162
+ });
163
+ });
164
+ }
165
+ /**
166
+ * Toggle popup visibility
167
+ */
168
+ function togglePopup(el) {
169
+ const shadowRoot = el.shadowRoot;
170
+ const dialog = shadowRoot ? getPopupDialog(shadowRoot) : null;
171
+ if (!dialog)
172
+ return;
173
+ if (dialog.classList.contains('open')) {
174
+ closePopup(el);
175
+ }
176
+ else {
177
+ openPopup(el);
178
+ }
179
+ }
180
+ /**
181
+ * Handle click on anchor element
182
+ */
183
+ function handleAnchorClick(el, event) {
184
+ event.preventDefault();
185
+ event.stopPropagation();
186
+ togglePopup(el);
187
+ }
188
+ /**
189
+ * Handle clicks on the dialog element (backdrop clicks)
190
+ */
191
+ function handleOutsideClick(el, event) {
192
+ event.stopPropagation();
193
+ const shadowRoot = el.shadowRoot;
194
+ const dialog = shadowRoot ? getPopupDialog(shadowRoot) : null;
195
+ // Close if clicking on dialog backdrop (not popup content)
196
+ if (dialog && event.target === dialog) {
197
+ event.preventDefault();
198
+ closePopup(el);
199
+ }
200
+ }
201
+ /**
202
+ * Handle escape key press
203
+ */
204
+ function handleEscape(el, event) {
205
+ event.stopPropagation();
206
+ if (event.key === 'Escape') {
207
+ const { disableClose } = getPopupAttributes(el);
208
+ if (disableClose) {
209
+ event.preventDefault();
210
+ }
211
+ else {
212
+ closePopup(el);
213
+ }
214
+ }
215
+ }
216
+ /**
217
+ * Handle close requests from inside popup content
218
+ */
219
+ function handleCloseRequest(el, event) {
220
+ event.stopPropagation();
221
+ closePopup(el, true);
222
+ }
223
+ /**
224
+ * Setup click listener on anchor element (unless manual=true)
225
+ */
226
+ function setupAnchorEvents(el) {
227
+ const { manual } = getPopupAttributes(el);
228
+ const anchor = getAnchorElement(el);
229
+ if (!anchor || manual)
230
+ return;
231
+ // Remove any existing listener first
232
+ const existingHandler = anchorClickHandlers.get(el);
233
+ if (existingHandler) {
234
+ anchor.removeEventListener('pointerdown', existingHandler);
235
+ }
236
+ // Create new handler and store reference
237
+ const handler = (e) => handleAnchorClick(el, e);
238
+ anchorClickHandlers.set(el, handler);
239
+ anchor.addEventListener('pointerdown', handler);
240
+ }
241
+ /**
242
+ * Cleanup anchor event listeners
243
+ */
244
+ function cleanupAnchorEvents(el) {
245
+ const anchor = getAnchorElement(el);
246
+ const handler = anchorClickHandlers.get(el);
247
+ if (anchor && handler) {
248
+ anchor.removeEventListener('pointerdown', handler);
249
+ anchorClickHandlers.delete(el);
250
+ }
251
+ }
252
+ /**
253
+ * Render the popup structure
254
+ */
255
+ function render(el) {
256
+ const shadowRoot = el.shadowRoot;
257
+ if (!shadowRoot)
258
+ return;
259
+ const existingDialog = getPopupDialog(shadowRoot);
260
+ // Ensure styles are loaded
261
+ ensureStyles(shadowRoot, { css: popupStyles, id: 'ty-popup' });
262
+ // Create structure if it doesn't exist
263
+ if (!existingDialog) {
264
+ const dialog = document.createElement('dialog');
265
+ const container = document.createElement('div');
266
+ const content = document.createElement('slot');
267
+ dialog.className = 'popup-dialog';
268
+ container.className = 'popup-container';
269
+ content.id = 'popup-content';
270
+ shadowRoot.appendChild(dialog);
271
+ dialog.appendChild(container);
272
+ container.appendChild(content);
273
+ // Initialize position
274
+ el.style.setProperty('--popup-x', '0px');
275
+ el.style.setProperty('--popup-y', '0px');
276
+ // Setup event listeners
277
+ const outsideHandler = (e) => handleOutsideClick(el, e);
278
+ outsideClickHandlers.set(el, outsideHandler);
279
+ dialog.addEventListener('pointerdown', outsideHandler);
280
+ const escapeHandler = (e) => handleEscape(el, e);
281
+ escapeHandlers.set(el, escapeHandler);
282
+ el.addEventListener('keydown', escapeHandler);
283
+ // Handle native dialog close event
284
+ dialog.addEventListener('close', () => {
285
+ const popupId = getPopupId(el);
286
+ unlockScroll(popupId);
287
+ dialog.classList.remove('open');
288
+ dialog.classList.remove('preparing-animation');
289
+ el.dispatchEvent(new CustomEvent('close', { bubbles: true }));
290
+ });
291
+ }
292
+ // Add close method to element for programmatic access
293
+ el.closePopup = () => closePopup(el, true);
294
+ el.openPopup = () => openPopup(el);
295
+ el.togglePopup = () => togglePopup(el);
296
+ // Add event listener for close requests from content
297
+ const closeRequestHandler = (e) => handleCloseRequest(el, e);
298
+ closeRequestHandlers.set(el, closeRequestHandler);
299
+ el.addEventListener('ty:close-popup', closeRequestHandler);
300
+ // Setup anchor events
301
+ setupAnchorEvents(el);
302
+ }
303
+ /**
304
+ * Cleanup all resources when component disconnects
305
+ */
306
+ function cleanup(el) {
307
+ // Force unlock scroll if popup is being removed
308
+ const popupId = popupIds.get(el);
309
+ if (popupId) {
310
+ unlockScroll(popupId);
311
+ popupIds.delete(el);
312
+ }
313
+ // Cleanup anchor events
314
+ cleanupAnchorEvents(el);
315
+ // Cleanup dialog events
316
+ const shadowRoot = el.shadowRoot;
317
+ const dialog = shadowRoot ? getPopupDialog(shadowRoot) : null;
318
+ if (dialog) {
319
+ const outsideHandler = outsideClickHandlers.get(el);
320
+ if (outsideHandler) {
321
+ dialog.removeEventListener('pointerdown', outsideHandler);
322
+ outsideClickHandlers.delete(el);
323
+ }
324
+ }
325
+ const escapeHandler = escapeHandlers.get(el);
326
+ if (escapeHandler) {
327
+ el.removeEventListener('keydown', escapeHandler);
328
+ escapeHandlers.delete(el);
329
+ }
330
+ const closeRequestHandler = closeRequestHandlers.get(el);
331
+ if (closeRequestHandler) {
332
+ el.removeEventListener('ty:close-popup', closeRequestHandler);
333
+ closeRequestHandlers.delete(el);
334
+ }
335
+ }
336
+ // ============================================================================
337
+ // Component Definition
338
+ // ============================================================================
339
+ /**
340
+ * TyPopup Web Component
341
+ */
342
+ export class TyPopup extends HTMLElement {
343
+ /** Observed attributes */
344
+ static get observedAttributes() {
345
+ return ['manual', 'disable-close', 'placement', 'offset'];
346
+ }
347
+ constructor() {
348
+ super();
349
+ this.attachShadow({ mode: 'open' });
350
+ }
351
+ connectedCallback() {
352
+ render(this);
353
+ }
354
+ disconnectedCallback() {
355
+ cleanup(this);
356
+ }
357
+ attributeChangedCallback(name, _oldValue, _newValue) {
358
+ // Re-render on attribute changes
359
+ render(this);
360
+ // Handle specific attribute changes
361
+ switch (name) {
362
+ case 'placement':
363
+ case 'offset':
364
+ // Update position immediately if open and placement-related attributes change
365
+ render(this);
366
+ break;
367
+ case 'manual':
368
+ case 'disable-close':
369
+ // Recreate anchor events if manual changes
370
+ cleanupAnchorEvents(this);
371
+ setupAnchorEvents(this);
372
+ break;
373
+ }
374
+ }
375
+ }
376
+ // Register the custom element
377
+ if (!customElements.get('ty-popup')) {
378
+ customElements.define('ty-popup', TyPopup);
379
+ }
380
+ //# sourceMappingURL=popup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popup.js","sourceRoot":"","sources":["../../src/components/popup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,gBAAgB,EAAkB,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAgBjD,+EAA+E;AAC/E,gCAAgC;AAChC,+EAA+E;AAE/E,MAAM,mBAAmB,GAAG,IAAI,OAAO,EAA+B,CAAC;AACvE,MAAM,oBAAoB,GAAG,IAAI,OAAO,EAA+B,CAAC;AACxE,MAAM,cAAc,GAAG,IAAI,OAAO,EAAuC,CAAC;AAC1E,MAAM,oBAAoB,GAAG,IAAI,OAAO,EAAqC,CAAC;AAC9E,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAmB,CAAC,CAAC,oCAAoC;AAErF,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;GAEG;AACH,SAAS,aAAa,CAAC,EAAW,EAAE,IAAY;IAC9C,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,EAAW,EAAE,IAAY,EAAE,YAAoB;IACnE,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,YAAY,CAAC;IACxC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACnC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,EAAW;IACrC,OAAO;QACL,MAAM,EAAE,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC;QACnC,YAAY,EAAE,aAAa,CAAC,EAAE,EAAE,eAAe,CAAC;QAChD,SAAS,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAc;QAClE,MAAM,EAAE,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;KACtC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,EAAW;IACnC,OAAO,EAAE,CAAC,aAAa,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,UAAsB;IAC5C,OAAO,UAAU,CAAC,aAAa,CAAoB,eAAe,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,EAAW;IAC7B,IAAI,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1B,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,EAAE,GAAG,SAAS,EAAE,CAAC,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACjE,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,EAAW;IACjC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC;IACjC,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE9D,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM;QAAE,OAAO;IAE/B,6EAA6E;IAC7E,MAAM,WAAW,GACf,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QACxD,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;YAC3D,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;gBACzD,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;oBAC1D,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,0BAA0B;IAExE,+CAA+C;IAC/C,MAAM,YAAY,GAAG,gBAAgB,CAAC;QACpC,QAAQ,EAAE,MAAM;QAChB,UAAU,EAAE,MAAM;QAClB,WAAW;QACX,MAAM;QACN,OAAO,EAAE,CAAC;QACV,gBAAgB,EAAE,EAAE;KACrB,CAAC,CAAC;IAEH,oDAAoD;IACpD,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC;IACzD,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC;IAEzD,qEAAqE;IACrE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,EAAW,EAAE,KAAK,GAAG,KAAK;IAC5C,MAAM,EAAE,YAAY,EAAE,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,KAAK,IAAI,YAAY;QAAE,OAAO;IAEnC,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC;IACjC,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,wEAAwE;IACxE,qCAAqC;IAErC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAE/C,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,uDAAuD;IACzE,CAAC,EAAE,GAAG,CAAC,CAAC;IAER,uBAAuB;IACvB,EAAE,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,EAAW;IAC5B,wCAAwC;IACxC,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;IAC/B,UAAU,CAAC,OAAO,CAAC,CAAC;IAEpB,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC;IACjC,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,mFAAmF;IACnF,MAAM,CAAC,SAAS,EAAE,CAAC;IAEnB,+DAA+D;IAC/D,qBAAqB,CAAC,GAAG,EAAE;QACzB,gDAAgD;QAChD,6DAA6D;QAC7D,cAAc,CAAC,EAAE,CAAC,CAAC;QAEnB,iDAAiD;QACjD,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAE5C,qEAAqE;QACrE,qBAAqB,CAAC,GAAG,EAAE;YACzB,6DAA6D;YAC7D,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAE7B,sBAAsB;YACtB,EAAE,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,EAAW;IAC9B,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC;IACjC,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,UAAU,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;SAAM,CAAC;QACN,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,EAAW,EAAE,KAAY;IAClD,KAAK,CAAC,cAAc,EAAE,CAAC;IACvB,KAAK,CAAC,eAAe,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,EAAW,EAAE,KAAY;IACnD,KAAK,CAAC,eAAe,EAAE,CAAC;IACxB,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC;IACjC,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE9D,2DAA2D;IAC3D,IAAI,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QACtC,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,UAAU,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,EAAW,EAAE,KAAoB;IACrD,KAAK,CAAC,eAAe,EAAE,CAAC;IACxB,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,EAAE,YAAY,EAAE,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;QAChD,IAAI,YAAY,EAAE,CAAC;YACjB,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,EAAW,EAAE,KAAkB;IACzD,KAAK,CAAC,eAAe,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,EAAW;IACpC,MAAM,EAAE,MAAM,EAAE,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAEpC,IAAI,CAAC,MAAM,IAAI,MAAM;QAAE,OAAO;IAE9B,qCAAqC;IACrC,MAAM,eAAe,GAAG,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpD,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;IAC7D,CAAC;IAED,yCAAyC;IACzC,MAAM,OAAO,GAAG,CAAC,CAAQ,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACvD,mBAAmB,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACrC,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,EAAW;IACtC,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAE5C,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;QACtB,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACnD,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,MAAM,CAAC,EAAW;IACzB,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC;IACjC,IAAI,CAAC,UAAU;QAAE,OAAO;IAExB,MAAM,cAAc,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAElD,2BAA2B;IAC3B,YAAY,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;IAE/D,uCAAuC;IACvC,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAE/C,MAAM,CAAC,SAAS,GAAG,cAAc,CAAC;QAClC,SAAS,CAAC,SAAS,GAAG,iBAAiB,CAAC;QACxC,OAAO,CAAC,EAAE,GAAG,eAAe,CAAC;QAE7B,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC9B,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAE/B,sBAAsB;QACtB,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACzC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAEzC,wBAAwB;QACxB,MAAM,cAAc,GAAG,CAAC,CAAQ,EAAE,EAAE,CAAC,kBAAkB,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/D,oBAAoB,CAAC,GAAG,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;QAC7C,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QAEvD,MAAM,aAAa,GAAG,CAAC,CAAgB,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAChE,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;QACtC,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAE9C,mCAAmC;QACnC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACpC,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;YAC/B,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAChC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;YAC/C,EAAE,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,sDAAsD;IACtD,EAAE,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC3C,EAAE,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACnC,EAAE,CAAC,WAAW,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAEvC,qDAAqD;IACrD,MAAM,mBAAmB,GAAG,CAAC,CAAc,EAAE,EAAE,CAAC,kBAAkB,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1E,oBAAoB,CAAC,GAAG,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;IAClD,EAAE,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,mBAAoC,CAAC,CAAC;IAE5E,sBAAsB;IACtB,iBAAiB,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,SAAS,OAAO,CAAC,EAAW;IAC1B,gDAAgD;IAChD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjC,IAAI,OAAO,EAAE,CAAC;QACZ,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACtB,CAAC;IAED,wBAAwB;IACxB,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAExB,wBAAwB;IACxB,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC;IACjC,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE9D,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,cAAc,GAAG,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpD,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;YAC1D,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7C,IAAI,aAAa,EAAE,CAAC;QAClB,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACjD,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,mBAAmB,GAAG,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACzD,IAAI,mBAAmB,EAAE,CAAC;QACxB,EAAE,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,mBAAoC,CAAC,CAAC;QAC/E,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,uBAAuB;AACvB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,OAAO,OAAQ,SAAQ,WAAW;IAMtC,0BAA0B;IAC1B,MAAM,KAAK,kBAAkB;QAC3B,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED;QACE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,iBAAiB;QACf,MAAM,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED,oBAAoB;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAED,wBAAwB,CAAC,IAAY,EAAE,SAAwB,EAAE,SAAwB;QACvF,iCAAiC;QACjC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEb,oCAAoC;QACpC,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,WAAW,CAAC;YACjB,KAAK,QAAQ;gBACX,8EAA8E;gBAC9E,MAAM,CAAC,IAAI,CAAC,CAAC;gBACb,MAAM;YAER,KAAK,QAAQ,CAAC;YACd,KAAK,eAAe;gBAClB,2CAA2C;gBAC3C,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBAC1B,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBACxB,MAAM;QACV,CAAC;IACH,CAAC;CACF;AAED,8BAA8B;AAC9B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;IACpC,cAAc,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,198 @@
1
+ /**
2
+ * TyRadio + TyRadioGroup Web Components
3
+ *
4
+ * Exclusive selection within a group. ty-radio-group manages the selection
5
+ * value and form integration; ty-radio is the individual choice element.
6
+ *
7
+ * Composition (ty-multiselect-style):
8
+ * <ty-radio-group name="plan" value="pro" label="Plan">
9
+ * <ty-radio value="free">Free</ty-radio>
10
+ * <ty-radio value="pro">Pro</ty-radio>
11
+ * <ty-radio value="team">Team</ty-radio>
12
+ * </ty-radio-group>
13
+ *
14
+ * Keyboard:
15
+ * - Tab focuses the group's currently-selected (or first) radio
16
+ * - Arrow keys move focus AND selection within the group (per W3C ARIA)
17
+ * - Space/Enter selects the focused radio
18
+ */
19
+ import type { Flavor, Size } from "../types/common.js";
20
+ import { TyComponent } from "../base/ty-component.js";
21
+ import type { PropertyChange } from "../utils/property-manager.js";
22
+ interface RadioState {
23
+ listenersSetup: boolean;
24
+ }
25
+ export interface TyRadioElement extends HTMLElement {
26
+ value: string;
27
+ checked: boolean;
28
+ disabled: boolean;
29
+ size: Size;
30
+ flavor: Flavor;
31
+ }
32
+ export declare class TyRadio extends TyComponent<RadioState> implements TyRadioElement {
33
+ protected static properties: {
34
+ value: {
35
+ type: "string";
36
+ default: string;
37
+ };
38
+ checked: {
39
+ type: "boolean";
40
+ visual: boolean;
41
+ default: boolean;
42
+ };
43
+ disabled: {
44
+ type: "boolean";
45
+ visual: boolean;
46
+ default: boolean;
47
+ };
48
+ size: {
49
+ type: "string";
50
+ visual: boolean;
51
+ default: string;
52
+ };
53
+ flavor: {
54
+ type: "string";
55
+ visual: boolean;
56
+ default: string;
57
+ };
58
+ };
59
+ private _listenersSetup;
60
+ private _clickHandler;
61
+ private _focusHandler;
62
+ private _blurHandler;
63
+ constructor();
64
+ protected onConnect(): void;
65
+ protected onDisconnect(): void;
66
+ protected onPropertiesChanged(_changes: PropertyChange[]): void;
67
+ private buildClassList;
68
+ private handleClick;
69
+ private removeEventListeners;
70
+ private setupEventListeners;
71
+ protected render(): void;
72
+ get value(): string;
73
+ set value(v: string);
74
+ get checked(): boolean;
75
+ set checked(v: boolean);
76
+ get disabled(): boolean;
77
+ set disabled(v: boolean);
78
+ get size(): Size;
79
+ set size(v: Size);
80
+ get flavor(): Flavor;
81
+ set flavor(v: Flavor);
82
+ }
83
+ interface RadioGroupState {
84
+ listenersSetup: boolean;
85
+ }
86
+ export interface TyRadioGroupElement extends HTMLElement {
87
+ value: string;
88
+ name: string;
89
+ label: string;
90
+ disabled: boolean;
91
+ required: boolean;
92
+ error: string;
93
+ orientation: "vertical" | "horizontal";
94
+ size: Size;
95
+ flavor: Flavor;
96
+ form: HTMLFormElement | null;
97
+ }
98
+ export declare class TyRadioGroup extends TyComponent<RadioGroupState> implements TyRadioGroupElement {
99
+ static formAssociated: boolean;
100
+ protected static properties: {
101
+ value: {
102
+ type: "string";
103
+ visual: boolean;
104
+ formValue: boolean;
105
+ emitChange: boolean;
106
+ default: string;
107
+ };
108
+ name: {
109
+ type: "string";
110
+ default: string;
111
+ };
112
+ label: {
113
+ type: "string";
114
+ visual: boolean;
115
+ default: string;
116
+ };
117
+ disabled: {
118
+ type: "boolean";
119
+ visual: boolean;
120
+ default: boolean;
121
+ };
122
+ required: {
123
+ type: "boolean";
124
+ visual: boolean;
125
+ default: boolean;
126
+ };
127
+ error: {
128
+ type: "string";
129
+ visual: boolean;
130
+ default: string;
131
+ };
132
+ orientation: {
133
+ type: "string";
134
+ visual: boolean;
135
+ default: string;
136
+ };
137
+ size: {
138
+ type: "string";
139
+ visual: boolean;
140
+ default: string;
141
+ };
142
+ flavor: {
143
+ type: "string";
144
+ visual: boolean;
145
+ default: string;
146
+ };
147
+ };
148
+ private _listenersSetup;
149
+ private _selectHandler;
150
+ private _keydownHandler;
151
+ constructor();
152
+ protected onConnect(): void;
153
+ protected onDisconnect(): void;
154
+ protected onPropertiesChanged(changes: PropertyChange[]): void;
155
+ protected getFormValue(): FormDataEntryValue | null;
156
+ /**
157
+ * Find ty-radio descendants in this group's light DOM. Searches deeply
158
+ * because consumers may wrap each radio in a `<label>` for click delegation.
159
+ */
160
+ private getRadios;
161
+ /**
162
+ * Push group state down to each radio child.
163
+ */
164
+ private syncChildren;
165
+ /**
166
+ * Handle a child's select request — update value, sync, emit change.
167
+ */
168
+ private handleRadioSelect;
169
+ /**
170
+ * Arrow-key navigation within group (W3C radio practice: arrow keys move
171
+ * focus and selection together).
172
+ */
173
+ private handleKeydown;
174
+ private removeEventListeners;
175
+ private setupEventListeners;
176
+ protected render(): void;
177
+ get value(): string;
178
+ set value(v: string);
179
+ get name(): string;
180
+ set name(v: string);
181
+ get label(): string;
182
+ set label(v: string);
183
+ get disabled(): boolean;
184
+ set disabled(v: boolean);
185
+ get required(): boolean;
186
+ set required(v: boolean);
187
+ get error(): string;
188
+ set error(v: string);
189
+ get orientation(): "vertical" | "horizontal";
190
+ set orientation(v: "vertical" | "horizontal");
191
+ get size(): Size;
192
+ set size(v: Size);
193
+ get flavor(): Flavor;
194
+ set flavor(v: Flavor);
195
+ get form(): HTMLFormElement | null;
196
+ }
197
+ export {};
198
+ //# sourceMappingURL=radio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radio.d.ts","sourceRoot":"","sources":["../../src/components/radio.ts"],"names":[],"mappings":"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"}