tyrell-components 1.0.0-RC13 → 1.0.0-RC15

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 (358) hide show
  1. package/README.md +10 -2
  2. package/css/tyrell-theme.css +192 -180
  3. package/css/tyrell.css +23 -0
  4. package/dist/tyrell-colors-static.css +1 -316
  5. package/dist/tyrell-theme.css +1 -1454
  6. package/dist/tyrell.css +1 -1371
  7. package/dist/tyrell.js +1 -1
  8. package/lib/base/ty-component.d.ts +20 -10
  9. package/lib/base/ty-component.js +196 -319
  10. package/lib/components/button.d.ts +3 -17
  11. package/lib/components/button.js +261 -295
  12. package/lib/components/calendar-month.d.ts +4 -50
  13. package/lib/components/calendar-month.js +443 -582
  14. package/lib/components/calendar-navigation.d.ts +3 -48
  15. package/lib/components/calendar-navigation.js +239 -362
  16. package/lib/components/calendar.d.ts +8 -83
  17. package/lib/components/calendar.js +616 -829
  18. package/lib/components/checkbox.d.ts +5 -72
  19. package/lib/components/checkbox.js +273 -416
  20. package/lib/components/copy.d.ts +4 -57
  21. package/lib/components/copy.js +280 -397
  22. package/lib/components/date-picker.d.ts +21 -163
  23. package/lib/components/date-picker.js +1143 -1674
  24. package/lib/components/file-upload.d.ts +9 -15
  25. package/lib/components/file-upload.js +404 -426
  26. package/lib/components/icon.d.ts +3 -24
  27. package/lib/components/icon.js +141 -230
  28. package/lib/components/input.d.ts +8 -108
  29. package/lib/components/input.js +593 -784
  30. package/lib/components/modal.d.ts +17 -26
  31. package/lib/components/modal.js +340 -484
  32. package/lib/components/option.d.ts +2 -9
  33. package/lib/components/option.js +168 -216
  34. package/lib/components/popup.d.ts +2 -17
  35. package/lib/components/popup.js +249 -380
  36. package/lib/components/radio.d.ts +5 -25
  37. package/lib/components/radio.js +407 -461
  38. package/lib/components/resize-observer.d.ts +3 -30
  39. package/lib/components/resize-observer.js +69 -103
  40. package/lib/components/scroll-container.d.ts +2 -12
  41. package/lib/components/scroll-container.js +293 -338
  42. package/lib/components/select.d.ts +87 -159
  43. package/lib/components/select.js +1609 -2090
  44. package/lib/components/selected-tags.d.ts +5 -48
  45. package/lib/components/selected-tags.js +188 -276
  46. package/lib/components/step.d.ts +1 -6
  47. package/lib/components/step.js +62 -68
  48. package/lib/components/switch.d.ts +1 -12
  49. package/lib/components/switch.js +214 -247
  50. package/lib/components/tab.d.ts +1 -6
  51. package/lib/components/tab.js +62 -69
  52. package/lib/components/tabs.d.ts +6 -63
  53. package/lib/components/tabs.js +545 -777
  54. package/lib/components/tag.d.ts +3 -37
  55. package/lib/components/tag.js +236 -335
  56. package/lib/components/textarea.d.ts +7 -87
  57. package/lib/components/textarea.js +457 -627
  58. package/lib/components/tooltip.d.ts +3 -11
  59. package/lib/components/tooltip.js +307 -443
  60. package/lib/components/wizard.d.ts +6 -54
  61. package/lib/components/wizard.js +405 -618
  62. package/lib/icons/fontawesome/brands.d.ts +0 -1
  63. package/lib/icons/fontawesome/brands.js +0 -8
  64. package/lib/icons/fontawesome/regular.d.ts +0 -1
  65. package/lib/icons/fontawesome/regular.js +0 -8
  66. package/lib/icons/fontawesome/solid.d.ts +0 -1
  67. package/lib/icons/fontawesome/solid.js +0 -8
  68. package/lib/icons/heroicons/micro.d.ts +0 -1
  69. package/lib/icons/heroicons/micro.js +392 -400
  70. package/lib/icons/heroicons/mini.d.ts +0 -1
  71. package/lib/icons/heroicons/mini.js +382 -390
  72. package/lib/icons/heroicons/outline.d.ts +0 -1
  73. package/lib/icons/heroicons/outline.js +337 -345
  74. package/lib/icons/heroicons/solid.d.ts +0 -1
  75. package/lib/icons/heroicons/solid.js +407 -415
  76. package/lib/icons/lucide.d.ts +0 -1
  77. package/lib/icons/lucide.js +24479 -26351
  78. package/lib/icons/material/filled.d.ts +0 -1
  79. package/lib/icons/material/filled.js +9653 -9663
  80. package/lib/icons/material/outlined.d.ts +0 -1
  81. package/lib/icons/material/outlined.js +10271 -10281
  82. package/lib/icons/material/round.d.ts +0 -1
  83. package/lib/icons/material/round.js +10495 -10505
  84. package/lib/icons/material/sharp.d.ts +0 -1
  85. package/lib/icons/material/sharp.js +9905 -9915
  86. package/lib/icons/material/two-tone.d.ts +0 -1
  87. package/lib/icons/material/two-tone.js +12792 -12802
  88. package/lib/index.d.ts +0 -1
  89. package/lib/index.js +21 -41
  90. package/lib/styles/button.d.ts +2 -20
  91. package/lib/styles/button.js +202 -404
  92. package/lib/styles/calendar-month.d.ts +1 -5
  93. package/lib/styles/calendar-month.js +127 -244
  94. package/lib/styles/calendar-navigation.d.ts +2 -6
  95. package/lib/styles/calendar-navigation.js +64 -104
  96. package/lib/styles/calendar.d.ts +1 -2
  97. package/lib/styles/calendar.js +9 -22
  98. package/lib/styles/checkbox.d.ts +0 -1
  99. package/lib/styles/checkbox.js +45 -94
  100. package/lib/styles/copy.d.ts +0 -1
  101. package/lib/styles/copy.js +67 -106
  102. package/lib/styles/custom-scrollbar.d.ts +1 -2
  103. package/lib/styles/custom-scrollbar.js +80 -115
  104. package/lib/styles/date-picker.d.ts +1 -5
  105. package/lib/styles/date-picker.js +261 -335
  106. package/lib/styles/field-size.d.ts +6 -0
  107. package/lib/styles/field-size.js +91 -0
  108. package/lib/styles/file-upload.d.ts +1 -2
  109. package/lib/styles/file-upload.js +143 -188
  110. package/lib/styles/icon.d.ts +2 -6
  111. package/lib/styles/icon.js +92 -170
  112. package/lib/styles/input.d.ts +1 -6
  113. package/lib/styles/input.js +125 -290
  114. package/lib/styles/modal.d.ts +1 -2
  115. package/lib/styles/modal.js +71 -108
  116. package/lib/styles/option.d.ts +2 -6
  117. package/lib/styles/option.js +49 -64
  118. package/lib/styles/popup.d.ts +1 -2
  119. package/lib/styles/popup.js +42 -77
  120. package/lib/styles/radio.d.ts +0 -1
  121. package/lib/styles/radio.js +69 -110
  122. package/lib/styles/resize-observer.d.ts +1 -2
  123. package/lib/styles/resize-observer.js +2 -12
  124. package/lib/styles/scroll-container.d.ts +1 -2
  125. package/lib/styles/scroll-container.js +100 -149
  126. package/lib/styles/select-base.d.ts +0 -1
  127. package/lib/styles/select-base.js +597 -785
  128. package/lib/styles/select.d.ts +1 -2
  129. package/lib/styles/select.js +140 -236
  130. package/lib/styles/step.d.ts +1 -2
  131. package/lib/styles/step.js +22 -33
  132. package/lib/styles/switch.d.ts +0 -1
  133. package/lib/styles/switch.js +34 -73
  134. package/lib/styles/tab.d.ts +1 -2
  135. package/lib/styles/tab.js +22 -34
  136. package/lib/styles/tabs.d.ts +3 -11
  137. package/lib/styles/tabs.js +190 -222
  138. package/lib/styles/tag.d.ts +1 -5
  139. package/lib/styles/tag.js +136 -218
  140. package/lib/styles/textarea.d.ts +1 -2
  141. package/lib/styles/textarea.js +210 -319
  142. package/lib/styles/tooltip.d.ts +0 -1
  143. package/lib/styles/tooltip.js +3 -13
  144. package/lib/styles/wizard.d.ts +5 -21
  145. package/lib/styles/wizard.js +170 -306
  146. package/lib/types/common.d.ts +2 -2
  147. package/lib/types/common.js +6 -17
  148. package/lib/utils/calendar-utils.d.ts +4 -21
  149. package/lib/utils/calendar-utils.js +100 -273
  150. package/lib/utils/custom-scrollbar.d.ts +6 -20
  151. package/lib/utils/custom-scrollbar.js +273 -317
  152. package/lib/utils/flavor-sheet.d.ts +0 -1
  153. package/lib/utils/flavor-sheet.js +14 -37
  154. package/lib/utils/icon-registry.d.ts +0 -2
  155. package/lib/utils/icon-registry.js +137 -243
  156. package/lib/utils/icons.d.ts +0 -1
  157. package/lib/utils/icons.js +0 -9
  158. package/lib/utils/loader-registry.d.ts +0 -1
  159. package/lib/utils/loader-registry.js +3 -35
  160. package/lib/utils/locale.d.ts +2 -23
  161. package/lib/utils/locale.js +34 -120
  162. package/lib/utils/mobile.d.ts +0 -1
  163. package/lib/utils/mobile.js +1 -18
  164. package/lib/utils/number-format.d.ts +6 -3
  165. package/lib/utils/number-format.js +54 -110
  166. package/lib/utils/positioning.d.ts +50 -7
  167. package/lib/utils/positioning.js +224 -234
  168. package/lib/utils/property-capture.d.ts +5 -27
  169. package/lib/utils/property-capture.js +36 -144
  170. package/lib/utils/property-manager.d.ts +0 -1
  171. package/lib/utils/property-manager.js +126 -196
  172. package/lib/utils/resize-observer.d.ts +0 -1
  173. package/lib/utils/resize-observer.js +23 -59
  174. package/lib/utils/scroll-lock.d.ts +4 -11
  175. package/lib/utils/scroll-lock.js +65 -172
  176. package/lib/utils/styles.d.ts +0 -1
  177. package/lib/utils/styles.js +17 -41
  178. package/lib/version.d.ts +1 -2
  179. package/lib/version.js +1 -11
  180. package/package.json +4 -4
  181. package/lib/base/ty-component.d.ts.map +0 -1
  182. package/lib/base/ty-component.js.map +0 -1
  183. package/lib/components/button.d.ts.map +0 -1
  184. package/lib/components/button.js.map +0 -1
  185. package/lib/components/calendar-month.d.ts.map +0 -1
  186. package/lib/components/calendar-month.js.map +0 -1
  187. package/lib/components/calendar-navigation.d.ts.map +0 -1
  188. package/lib/components/calendar-navigation.js.map +0 -1
  189. package/lib/components/calendar.d.ts.map +0 -1
  190. package/lib/components/calendar.js.map +0 -1
  191. package/lib/components/checkbox.d.ts.map +0 -1
  192. package/lib/components/checkbox.js.map +0 -1
  193. package/lib/components/copy.d.ts.map +0 -1
  194. package/lib/components/copy.js.map +0 -1
  195. package/lib/components/date-picker.d.ts.map +0 -1
  196. package/lib/components/date-picker.js.map +0 -1
  197. package/lib/components/file-upload.d.ts.map +0 -1
  198. package/lib/components/file-upload.js.map +0 -1
  199. package/lib/components/icon.d.ts.map +0 -1
  200. package/lib/components/icon.js.map +0 -1
  201. package/lib/components/input.d.ts.map +0 -1
  202. package/lib/components/input.js.map +0 -1
  203. package/lib/components/modal.d.ts.map +0 -1
  204. package/lib/components/modal.js.map +0 -1
  205. package/lib/components/option.d.ts.map +0 -1
  206. package/lib/components/option.js.map +0 -1
  207. package/lib/components/popup.d.ts.map +0 -1
  208. package/lib/components/popup.js.map +0 -1
  209. package/lib/components/radio.d.ts.map +0 -1
  210. package/lib/components/radio.js.map +0 -1
  211. package/lib/components/resize-observer.d.ts.map +0 -1
  212. package/lib/components/resize-observer.js.map +0 -1
  213. package/lib/components/scroll-container.d.ts.map +0 -1
  214. package/lib/components/scroll-container.js.map +0 -1
  215. package/lib/components/select.d.ts.map +0 -1
  216. package/lib/components/select.js.map +0 -1
  217. package/lib/components/selected-tags.d.ts.map +0 -1
  218. package/lib/components/selected-tags.js.map +0 -1
  219. package/lib/components/step.d.ts.map +0 -1
  220. package/lib/components/step.js.map +0 -1
  221. package/lib/components/switch.d.ts.map +0 -1
  222. package/lib/components/switch.js.map +0 -1
  223. package/lib/components/tab.d.ts.map +0 -1
  224. package/lib/components/tab.js.map +0 -1
  225. package/lib/components/tabs.d.ts.map +0 -1
  226. package/lib/components/tabs.js.map +0 -1
  227. package/lib/components/tag.d.ts.map +0 -1
  228. package/lib/components/tag.js.map +0 -1
  229. package/lib/components/textarea.d.ts.map +0 -1
  230. package/lib/components/textarea.js.map +0 -1
  231. package/lib/components/tooltip.d.ts.map +0 -1
  232. package/lib/components/tooltip.js.map +0 -1
  233. package/lib/components/wizard.d.ts.map +0 -1
  234. package/lib/components/wizard.js.map +0 -1
  235. package/lib/icons/fontawesome/brands.d.ts.map +0 -1
  236. package/lib/icons/fontawesome/brands.js.map +0 -1
  237. package/lib/icons/fontawesome/regular.d.ts.map +0 -1
  238. package/lib/icons/fontawesome/regular.js.map +0 -1
  239. package/lib/icons/fontawesome/solid.d.ts.map +0 -1
  240. package/lib/icons/fontawesome/solid.js.map +0 -1
  241. package/lib/icons/heroicons/micro.d.ts.map +0 -1
  242. package/lib/icons/heroicons/micro.js.map +0 -1
  243. package/lib/icons/heroicons/mini.d.ts.map +0 -1
  244. package/lib/icons/heroicons/mini.js.map +0 -1
  245. package/lib/icons/heroicons/outline.d.ts.map +0 -1
  246. package/lib/icons/heroicons/outline.js.map +0 -1
  247. package/lib/icons/heroicons/solid.d.ts.map +0 -1
  248. package/lib/icons/heroicons/solid.js.map +0 -1
  249. package/lib/icons/lucide.d.ts.map +0 -1
  250. package/lib/icons/lucide.js.map +0 -1
  251. package/lib/icons/material/filled.d.ts.map +0 -1
  252. package/lib/icons/material/filled.js.map +0 -1
  253. package/lib/icons/material/outlined.d.ts.map +0 -1
  254. package/lib/icons/material/outlined.js.map +0 -1
  255. package/lib/icons/material/round.d.ts.map +0 -1
  256. package/lib/icons/material/round.js.map +0 -1
  257. package/lib/icons/material/sharp.d.ts.map +0 -1
  258. package/lib/icons/material/sharp.js.map +0 -1
  259. package/lib/icons/material/two-tone.d.ts.map +0 -1
  260. package/lib/icons/material/two-tone.js.map +0 -1
  261. package/lib/index.d.ts.map +0 -1
  262. package/lib/index.js.map +0 -1
  263. package/lib/styles/button.d.ts.map +0 -1
  264. package/lib/styles/button.js.map +0 -1
  265. package/lib/styles/calendar-month.d.ts.map +0 -1
  266. package/lib/styles/calendar-month.js.map +0 -1
  267. package/lib/styles/calendar-navigation.d.ts.map +0 -1
  268. package/lib/styles/calendar-navigation.js.map +0 -1
  269. package/lib/styles/calendar.d.ts.map +0 -1
  270. package/lib/styles/calendar.js.map +0 -1
  271. package/lib/styles/checkbox.d.ts.map +0 -1
  272. package/lib/styles/checkbox.js.map +0 -1
  273. package/lib/styles/copy.d.ts.map +0 -1
  274. package/lib/styles/copy.js.map +0 -1
  275. package/lib/styles/custom-scrollbar.d.ts.map +0 -1
  276. package/lib/styles/custom-scrollbar.js.map +0 -1
  277. package/lib/styles/date-picker.d.ts.map +0 -1
  278. package/lib/styles/date-picker.js.map +0 -1
  279. package/lib/styles/file-upload.d.ts.map +0 -1
  280. package/lib/styles/file-upload.js.map +0 -1
  281. package/lib/styles/icon.d.ts.map +0 -1
  282. package/lib/styles/icon.js.map +0 -1
  283. package/lib/styles/input.d.ts.map +0 -1
  284. package/lib/styles/input.js.map +0 -1
  285. package/lib/styles/modal.d.ts.map +0 -1
  286. package/lib/styles/modal.js.map +0 -1
  287. package/lib/styles/multiselect.d.ts +0 -8
  288. package/lib/styles/multiselect.d.ts.map +0 -1
  289. package/lib/styles/multiselect.js +0 -849
  290. package/lib/styles/multiselect.js.map +0 -1
  291. package/lib/styles/option.d.ts.map +0 -1
  292. package/lib/styles/option.js.map +0 -1
  293. package/lib/styles/popup.d.ts.map +0 -1
  294. package/lib/styles/popup.js.map +0 -1
  295. package/lib/styles/radio.d.ts.map +0 -1
  296. package/lib/styles/radio.js.map +0 -1
  297. package/lib/styles/resize-observer.d.ts.map +0 -1
  298. package/lib/styles/resize-observer.js.map +0 -1
  299. package/lib/styles/scroll-container.d.ts.map +0 -1
  300. package/lib/styles/scroll-container.js.map +0 -1
  301. package/lib/styles/select-base.d.ts.map +0 -1
  302. package/lib/styles/select-base.js.map +0 -1
  303. package/lib/styles/select.d.ts.map +0 -1
  304. package/lib/styles/select.js.map +0 -1
  305. package/lib/styles/step.d.ts.map +0 -1
  306. package/lib/styles/step.js.map +0 -1
  307. package/lib/styles/switch.d.ts.map +0 -1
  308. package/lib/styles/switch.js.map +0 -1
  309. package/lib/styles/tab.d.ts.map +0 -1
  310. package/lib/styles/tab.js.map +0 -1
  311. package/lib/styles/tabs.d.ts.map +0 -1
  312. package/lib/styles/tabs.js.map +0 -1
  313. package/lib/styles/tag.d.ts.map +0 -1
  314. package/lib/styles/tag.js.map +0 -1
  315. package/lib/styles/textarea.d.ts.map +0 -1
  316. package/lib/styles/textarea.js.map +0 -1
  317. package/lib/styles/tooltip.d.ts.map +0 -1
  318. package/lib/styles/tooltip.js.map +0 -1
  319. package/lib/styles/wizard.d.ts.map +0 -1
  320. package/lib/styles/wizard.js.map +0 -1
  321. package/lib/types/common.d.ts.map +0 -1
  322. package/lib/types/common.js.map +0 -1
  323. package/lib/utils/calendar-utils.d.ts.map +0 -1
  324. package/lib/utils/calendar-utils.js.map +0 -1
  325. package/lib/utils/custom-scrollbar.d.ts.map +0 -1
  326. package/lib/utils/custom-scrollbar.js.map +0 -1
  327. package/lib/utils/flavor-sheet.d.ts.map +0 -1
  328. package/lib/utils/flavor-sheet.js.map +0 -1
  329. package/lib/utils/icon-registry.d.ts.map +0 -1
  330. package/lib/utils/icon-registry.js.map +0 -1
  331. package/lib/utils/icons.d.ts.map +0 -1
  332. package/lib/utils/icons.js.map +0 -1
  333. package/lib/utils/loader-registry.d.ts.map +0 -1
  334. package/lib/utils/loader-registry.js.map +0 -1
  335. package/lib/utils/locale.d.ts.map +0 -1
  336. package/lib/utils/locale.js.map +0 -1
  337. package/lib/utils/mobile.d.ts.map +0 -1
  338. package/lib/utils/mobile.js.map +0 -1
  339. package/lib/utils/number-format.d.ts.map +0 -1
  340. package/lib/utils/number-format.js.map +0 -1
  341. package/lib/utils/parse-boolean.d.ts +0 -39
  342. package/lib/utils/parse-boolean.d.ts.map +0 -1
  343. package/lib/utils/parse-boolean.js +0 -58
  344. package/lib/utils/parse-boolean.js.map +0 -1
  345. package/lib/utils/positioning.d.ts.map +0 -1
  346. package/lib/utils/positioning.js.map +0 -1
  347. package/lib/utils/property-capture.d.ts.map +0 -1
  348. package/lib/utils/property-capture.js.map +0 -1
  349. package/lib/utils/property-manager.d.ts.map +0 -1
  350. package/lib/utils/property-manager.js.map +0 -1
  351. package/lib/utils/resize-observer.d.ts.map +0 -1
  352. package/lib/utils/resize-observer.js.map +0 -1
  353. package/lib/utils/scroll-lock.d.ts.map +0 -1
  354. package/lib/utils/scroll-lock.js.map +0 -1
  355. package/lib/utils/styles.d.ts.map +0 -1
  356. package/lib/utils/styles.js.map +0 -1
  357. package/lib/version.d.ts.map +0 -1
  358. package/lib/version.js.map +0 -1
@@ -1,244 +1,234 @@
1
- /**
2
- * Core positioning engine for floating elements
3
- * Adapted from ty.positioning ClojureScript implementation
4
- *
5
- * Handles smart positioning of tooltips, dropdowns, popups, and other
6
- * floating elements relative to anchor elements with automatic overflow
7
- * detection and placement fallback.
8
- */
9
- // ============================================================================
10
- // Placement Definitions
11
- // ============================================================================
12
- /**
13
- * Map of all placement configurations
14
- */
15
1
  export const placements = {
16
- 'top-start': {
17
- vertical: 'top',
18
- horizontal: 'start',
19
- },
20
- 'top': {
21
- vertical: 'top',
22
- horizontal: 'center',
23
- },
24
- 'top-end': {
25
- vertical: 'top',
26
- horizontal: 'end',
27
- },
28
- 'right-start': {
29
- vertical: 'center',
30
- horizontal: 'end',
31
- orientation: 'vertical',
32
- },
33
- 'right': {
34
- vertical: 'center',
35
- horizontal: 'end',
36
- orientation: 'vertical',
37
- },
38
- 'right-end': {
39
- vertical: 'end',
40
- horizontal: 'end',
41
- orientation: 'vertical',
42
- },
43
- 'bottom-start': {
44
- vertical: 'bottom',
45
- horizontal: 'start',
46
- },
47
- 'bottom': {
48
- vertical: 'bottom',
49
- horizontal: 'center',
50
- },
51
- 'bottom-end': {
52
- vertical: 'bottom',
53
- horizontal: 'end',
54
- },
55
- 'left-start': {
56
- vertical: 'center',
57
- horizontal: 'start',
58
- orientation: 'vertical',
59
- },
60
- 'left': {
61
- vertical: 'center',
62
- horizontal: 'start',
63
- orientation: 'vertical',
64
- },
65
- 'left-end': {
66
- vertical: 'end',
67
- horizontal: 'start',
68
- orientation: 'vertical',
69
- },
2
+ 'top-start': {
3
+ vertical: 'top',
4
+ horizontal: 'start',
5
+ },
6
+ 'top': {
7
+ vertical: 'top',
8
+ horizontal: 'center',
9
+ },
10
+ 'top-end': {
11
+ vertical: 'top',
12
+ horizontal: 'end',
13
+ },
14
+ 'right-start': {
15
+ vertical: 'start',
16
+ horizontal: 'end',
17
+ orientation: 'vertical',
18
+ },
19
+ 'right': {
20
+ vertical: 'center',
21
+ horizontal: 'end',
22
+ orientation: 'vertical',
23
+ },
24
+ 'right-end': {
25
+ vertical: 'end',
26
+ horizontal: 'end',
27
+ orientation: 'vertical',
28
+ },
29
+ 'bottom-start': {
30
+ vertical: 'bottom',
31
+ horizontal: 'start',
32
+ },
33
+ 'bottom': {
34
+ vertical: 'bottom',
35
+ horizontal: 'center',
36
+ },
37
+ 'bottom-end': {
38
+ vertical: 'bottom',
39
+ horizontal: 'end',
40
+ },
41
+ 'left-start': {
42
+ vertical: 'start',
43
+ horizontal: 'start',
44
+ orientation: 'vertical',
45
+ },
46
+ 'left': {
47
+ vertical: 'center',
48
+ horizontal: 'start',
49
+ orientation: 'vertical',
50
+ },
51
+ 'left-end': {
52
+ vertical: 'end',
53
+ horizontal: 'start',
54
+ orientation: 'vertical',
55
+ },
70
56
  };
71
- /**
72
- * Default placement preference lists for different use cases
73
- */
74
57
  export const placementPreferences = {
75
- default: [
76
- 'bottom-start', 'bottom-end', 'top-start', 'top-end',
77
- 'bottom', 'top', 'left', 'right'
78
- ],
79
- tooltip: [
80
- 'top', 'bottom', 'left', 'right',
81
- 'top-start', 'top-end', 'bottom-start', 'bottom-end'
82
- ],
83
- dropdown: [
84
- 'bottom-start', 'bottom-end', 'top-start', 'top-end',
85
- 'bottom', 'top', 'right', 'left'
86
- ],
58
+ default: [
59
+ 'bottom-start', 'bottom-end', 'top-start', 'top-end',
60
+ 'bottom', 'top', 'left', 'right'
61
+ ],
62
+ tooltip: [
63
+ 'top', 'bottom', 'left', 'right',
64
+ 'top-start', 'top-end', 'bottom-start', 'bottom-end'
65
+ ],
66
+ dropdown: [
67
+ 'bottom-start', 'bottom-end', 'top-start', 'top-end',
68
+ 'bottom', 'top', 'right', 'left'
69
+ ],
87
70
  };
88
- // ============================================================================
89
- // DOM Measurement Helpers
90
- // ============================================================================
91
- /**
92
- * Get element dimensions relative to viewport with calculated center points
93
- */
71
+ const OPPOSITE_SIDE = {
72
+ top: 'bottom',
73
+ bottom: 'top',
74
+ left: 'right',
75
+ right: 'left',
76
+ };
77
+ export function parsePlacement(placement) {
78
+ const [side, align] = placement.split('-');
79
+ return { side, align };
80
+ }
81
+ export function preferenceChain(placement) {
82
+ const { side, align } = parsePlacement(placement);
83
+ const opposite = OPPOSITE_SIDE[side];
84
+ const perpendicular = side === 'top' || side === 'bottom' ? ['right', 'left'] : ['bottom', 'top'];
85
+ const exact = (s) => (align ? `${s}-${align}` : s);
86
+ const rest = (s) => (align
87
+ ? [s, `${s}-${align === 'start' ? 'end' : 'start'}`]
88
+ : [`${s}-start`, `${s}-end`]);
89
+ return [
90
+ exact(side),
91
+ exact(opposite),
92
+ ...rest(side),
93
+ ...rest(opposite),
94
+ ...perpendicular.flatMap((s) => [exact(s), ...rest(s)]),
95
+ ];
96
+ }
97
+ export function placementToAnchored(placement) {
98
+ if (!placement)
99
+ return { side: 'auto', align: 'start' };
100
+ const { side, align } = parsePlacement(placement);
101
+ return {
102
+ side: side === 'top' || side === 'bottom' ? side : 'auto',
103
+ align: align ?? 'start',
104
+ };
105
+ }
94
106
  function getElementRect(el) {
95
- const rect = el.getBoundingClientRect();
96
- return {
97
- top: rect.top,
98
- left: rect.left,
99
- right: rect.right,
100
- bottom: rect.bottom,
101
- width: rect.width,
102
- height: rect.height,
103
- centerX: rect.left + rect.width / 2,
104
- centerY: rect.top + rect.height / 2,
105
- };
106
- }
107
- /**
108
- * Get viewport dimensions and scroll position
109
- */
107
+ const rect = el.getBoundingClientRect();
108
+ return {
109
+ top: rect.top,
110
+ left: rect.left,
111
+ right: rect.right,
112
+ bottom: rect.bottom,
113
+ width: rect.width,
114
+ height: rect.height,
115
+ centerX: rect.left + rect.width / 2,
116
+ centerY: rect.top + rect.height / 2,
117
+ };
118
+ }
110
119
  function getViewportRect() {
111
- return {
112
- width: window.innerWidth,
113
- height: window.innerHeight,
114
- scrollX: window.scrollX,
115
- scrollY: window.scrollY,
116
- };
117
- }
118
- // ============================================================================
119
- // Position Calculation
120
- // ============================================================================
121
- /**
122
- * Calculate position for a specific placement
123
- * Returns x, y coordinates and overflow information
124
- */
120
+ return {
121
+ width: window.innerWidth,
122
+ height: window.innerHeight,
123
+ scrollX: window.scrollX,
124
+ scrollY: window.scrollY,
125
+ };
126
+ }
125
127
  function calculatePlacement(options) {
126
- const { targetRect, floatingRect, placement, offset, padding, scrollbarWidth, containerPadding, } = options;
127
- const config = placements[placement];
128
- const { vertical, horizontal, orientation } = config;
129
- const viewport = getViewportRect();
130
- // Calculate X position
131
- let x;
132
- if (orientation === 'vertical') {
133
- // Left/right placements
134
- if (horizontal === 'start') {
135
- x = targetRect.left - floatingRect.width - offset + containerPadding;
136
- }
137
- else {
138
- x = targetRect.right + offset - containerPadding;
139
- }
140
- }
141
- else {
142
- // Top/bottom placements
143
- if (horizontal === 'start') {
144
- x = targetRect.left;
145
- }
146
- else if (horizontal === 'center') {
147
- x = targetRect.centerX - floatingRect.width / 2;
148
- }
149
- else {
150
- x = targetRect.right - floatingRect.width;
151
- }
152
- }
153
- // Calculate Y position
154
- let y;
155
- if (orientation === 'vertical') {
156
- // Left/right placements
157
- if (vertical === 'center') {
158
- y = targetRect.centerY - floatingRect.height / 2;
159
- }
160
- else if (vertical === 'end') {
161
- y = targetRect.bottom - floatingRect.height - containerPadding;
162
- }
163
- else {
164
- y = targetRect.top;
165
- }
166
- }
167
- else {
168
- // Top/bottom placements
169
- if (vertical === 'top') {
170
- y = targetRect.top - floatingRect.height - offset + containerPadding;
171
- }
172
- else {
173
- y = targetRect.bottom + offset - containerPadding;
174
- }
175
- }
176
- // Calculate overflow for each edge
177
- const overflow = {
178
- top: Math.min(0, y - padding),
179
- left: Math.min(0, x - padding),
180
- bottom: Math.min(0, viewport.height - (y + floatingRect.height + padding)),
181
- right: Math.min(0, viewport.width - (x + floatingRect.width + padding + scrollbarWidth)),
182
- };
183
- // Sum of absolute overflow values
184
- const overflowAmount = Object.values(overflow).reduce((sum, val) => sum + Math.abs(val), 0);
185
- return {
186
- x: Math.round(x),
187
- y: Math.round(y),
188
- placement,
189
- overflow,
190
- overflowAmount,
191
- fits: overflowAmount === 0,
192
- };
193
- }
194
- /**
195
- * Find the best position for the floating element
196
- * Tries all preference placements and returns the one that fits best
197
- */
128
+ const { targetRect, floatingRect, placement, offset, padding, scrollbarWidth, containerPadding, } = options;
129
+ const config = placements[placement];
130
+ const { vertical, horizontal, orientation } = config;
131
+ const viewport = getViewportRect();
132
+ let x;
133
+ if (orientation === 'vertical') {
134
+ if (horizontal === 'start') {
135
+ x = targetRect.left - floatingRect.width - offset + containerPadding;
136
+ }
137
+ else {
138
+ x = targetRect.right + offset - containerPadding;
139
+ }
140
+ }
141
+ else {
142
+ if (horizontal === 'start') {
143
+ x = targetRect.left - containerPadding;
144
+ }
145
+ else if (horizontal === 'center') {
146
+ x = targetRect.centerX - floatingRect.width / 2;
147
+ }
148
+ else {
149
+ x = targetRect.right - floatingRect.width + containerPadding;
150
+ }
151
+ }
152
+ let y;
153
+ if (orientation === 'vertical') {
154
+ if (vertical === 'center') {
155
+ y = targetRect.centerY - floatingRect.height / 2;
156
+ }
157
+ else if (vertical === 'end') {
158
+ y = targetRect.bottom - floatingRect.height + containerPadding;
159
+ }
160
+ else {
161
+ y = targetRect.top - containerPadding;
162
+ }
163
+ }
164
+ else {
165
+ if (vertical === 'top') {
166
+ y = targetRect.top - floatingRect.height - offset + containerPadding;
167
+ }
168
+ else {
169
+ y = targetRect.bottom + offset - containerPadding;
170
+ }
171
+ }
172
+ const overflow = {
173
+ top: Math.min(0, y - padding),
174
+ left: Math.min(0, x - padding),
175
+ bottom: Math.min(0, viewport.height - (y + floatingRect.height + padding)),
176
+ right: Math.min(0, viewport.width - (x + floatingRect.width + padding + scrollbarWidth)),
177
+ };
178
+ const overflowAmount = Object.values(overflow).reduce((sum, val) => sum + Math.abs(val), 0);
179
+ return {
180
+ x: Math.round(x),
181
+ y: Math.round(y),
182
+ placement,
183
+ overflow,
184
+ overflowAmount,
185
+ fits: overflowAmount === 0,
186
+ };
187
+ }
198
188
  export function findBestPosition(options) {
199
- const { targetEl, floatingEl, preferences = placementPreferences.default, offset = 8, padding = 8, containerPadding = 0, } = options;
200
- const targetRect = getElementRect(targetEl);
201
- const floatingRect = getElementRect(floatingEl);
202
- const scrollbarWidth = 15;
203
- // Calculate all candidate positions
204
- const candidates = preferences.map(placement => calculatePlacement({
205
- targetRect,
206
- floatingRect,
207
- placement,
208
- offset,
209
- padding,
210
- containerPadding,
211
- scrollbarWidth,
212
- }));
213
- // Find first that fits, or one with least overflow
214
- const bestPosition = candidates.find(c => c.fits) ||
215
- candidates.reduce((best, current) => current.overflowAmount < best.overflowAmount ? current : best);
216
- // Adjust for scrollbar if needed
217
- if (bestPosition.overflow.right < 0) {
218
- bestPosition.x += bestPosition.overflow.right;
219
- }
220
- return bestPosition;
189
+ const { targetEl, floatingEl, preferences = placementPreferences.default, offset = 8, padding = 8, containerPadding = 0, } = options;
190
+ const targetRect = getElementRect(targetEl);
191
+ const floatingRect = getElementRect(floatingEl);
192
+ const scrollbarWidth = 15;
193
+ const candidates = preferences.map(placement => calculatePlacement({
194
+ targetRect,
195
+ floatingRect,
196
+ placement,
197
+ offset,
198
+ padding,
199
+ containerPadding,
200
+ scrollbarWidth,
201
+ }));
202
+ const bestPosition = candidates.find(c => c.fits) ||
203
+ candidates.reduce((best, current) => current.overflowAmount < best.overflowAmount ? current : best);
204
+ if (bestPosition.overflow.right < 0) {
205
+ bestPosition.x += bestPosition.overflow.right;
206
+ }
207
+ return bestPosition;
221
208
  }
222
209
  export function computeAnchoredPosition(o) {
223
- const gap = o.gap ?? 4;
224
- const padding = o.padding ?? 8;
225
- const vw = window.innerWidth;
226
- const vh = window.innerHeight;
227
- const spaceBelow = vh - o.anchorRect.bottom;
228
- const spaceAbove = o.anchorRect.top;
229
- // Below when it fits — and when neither side fits, the side with MORE room
230
- // instead of blindly flipping up (a trigger near the viewport top used to
231
- // clip the popup off-screen).
232
- const below = spaceBelow >= o.popupHeight + gap + padding || spaceBelow >= spaceAbove;
233
- // Anchor to the trigger's left edge ("start") or right edge ("end"),
234
- // clamped into the viewport either way.
235
- const rawX = o.align === "end" ? o.anchorRect.right - o.popupWidth : o.anchorRect.left;
236
- const x = Math.max(padding, Math.min(rawX, vw - o.popupWidth - padding));
237
- return {
238
- x,
239
- topY: o.anchorRect.bottom + gap,
240
- bottomY: vh - o.anchorRect.top + gap,
241
- below,
242
- };
243
- }
244
- //# sourceMappingURL=positioning.js.map
210
+ const gap = o.gap ?? 4;
211
+ const padding = o.padding ?? 8;
212
+ const vw = window.innerWidth;
213
+ const vh = window.innerHeight;
214
+ const spaceBelow = vh - o.anchorRect.bottom;
215
+ const spaceAbove = o.anchorRect.top;
216
+ const needed = o.popupHeight + gap + padding;
217
+ const fitsBelow = spaceBelow >= needed;
218
+ const fitsAbove = spaceAbove >= needed;
219
+ const side = o.side ?? "auto";
220
+ const below = side === "bottom" ? (fitsBelow || !fitsAbove ? true : false)
221
+ : side === "top" ? (fitsAbove || !fitsBelow ? false : true)
222
+ : fitsBelow || spaceBelow >= spaceAbove;
223
+ const rawX = o.align === "end" ? o.anchorRect.right - o.popupWidth
224
+ : o.align === "center"
225
+ ? o.anchorRect.left + (o.anchorRect.width - o.popupWidth) / 2
226
+ : o.anchorRect.left;
227
+ const x = Math.max(padding, Math.min(rawX, vw - o.popupWidth - padding));
228
+ return {
229
+ x,
230
+ topY: o.anchorRect.bottom + gap,
231
+ bottomY: vh - o.anchorRect.top + gap,
232
+ below,
233
+ };
234
+ }
@@ -1,32 +1,11 @@
1
1
  /**
2
2
  * Property Capture Utility
3
3
  *
4
- * Solves the problem of frameworks (React, Reagent, etc.) setting properties
5
- * on custom elements BEFORE connectedCallback runs.
6
- *
7
- * PROBLEM:
8
- * 1. Framework creates element: document.createElement('ty-dropdown')
9
- * 2. Framework sets properties: element.value = "foo"
10
- * 3. Constructor runs and defines getters/setters
11
- * 4. BUT properties were already set, creating instance properties
12
- * 5. Instance properties shadow the class getters/setters
13
- * 6. connectedCallback runs - too late!
14
- *
15
- * SOLUTION:
16
- * In connectedCallback, capture any pre-set properties and apply them properly.
17
- *
18
- * @example
19
- * ```typescript
20
- * connectedCallback(): void {
21
- * const preSetProps = capturePreSetProperties(this, [
22
- * 'value', 'clearable', 'disabled'
23
- * ])
24
- *
25
- * if (preSetProps.value !== undefined) {
26
- * this._value = preSetProps.value
27
- * }
28
- * }
29
- * ```
4
+ * Frameworks (React, Reagent, ...) set properties on a custom element before
5
+ * the constructor defines its getters/setters, so those assignments become
6
+ * *instance* properties that permanently shadow the class accessors — by the
7
+ * time connectedCallback runs, the setters have never been called.
8
+ * Fix: in connectedCallback, capture the pre-set values and re-apply them.
30
9
  */
31
10
  /**
32
11
  * Captured property data
@@ -129,4 +108,3 @@ export declare function applyPreSetProperties(element: any, propertyNames: strin
129
108
  * ```
130
109
  */
131
110
  export declare function captureAndApplyProperties(element: any, propertyNames: string[], transformer?: (name: string, value: any) => any, options?: PropertyCaptureOptions): void;
132
- //# sourceMappingURL=property-capture.d.ts.map