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,343 +1,298 @@
1
- /**
2
- * TyScrollContainer Web Component
3
- *
4
- * A scroll container with shadow indicators and an optional custom-rendered scrollbar.
5
- * Uses the CustomScrollbar utility internally.
6
- *
7
- * @example Custom scrollbar
8
- * ```html
9
- * <ty-scroll-container max-height="300px" custom-scrollbar>
10
- * <div>Long content...</div>
11
- * </ty-scroll-container>
12
- * ```
13
- */
14
1
  import { ensureStyles } from '../utils/styles.js';
15
2
  import { scrollContainerStyles } from '../styles/scroll-container.js';
16
3
  import { CustomScrollbar } from '../utils/custom-scrollbar.js';
17
4
  export class TyScrollContainer extends HTMLElement {
18
- static get observedAttributes() {
19
- return ['shadow', 'max-height', 'hide-scrollbar', 'custom-scrollbar', 'overflow-x', 'scroll-anchoring'];
20
- }
21
- // ============ Property Accessors ============
22
- get shadow() {
23
- return this.getAttribute('shadow') !== 'false';
24
- }
25
- set shadow(value) {
26
- if (value)
27
- this.removeAttribute('shadow');
28
- else
29
- this.setAttribute('shadow', 'false');
30
- }
31
- get maxHeight() {
32
- return this.getAttribute('max-height');
33
- }
34
- set maxHeight(value) {
35
- if (value)
36
- this.setAttribute('max-height', value);
37
- else
38
- this.removeAttribute('max-height');
39
- this._updateMaxHeight();
40
- }
41
- get hideScrollbar() {
42
- return this.hasAttribute('hide-scrollbar');
43
- }
44
- set hideScrollbar(value) {
45
- if (value)
46
- this.setAttribute('hide-scrollbar', '');
47
- else
48
- this.removeAttribute('hide-scrollbar');
49
- }
50
- get customScrollbar() {
51
- return this.hasAttribute('custom-scrollbar');
52
- }
53
- set customScrollbar(value) {
54
- if (value)
55
- this.setAttribute('custom-scrollbar', '');
56
- else
57
- this.removeAttribute('custom-scrollbar');
58
- }
59
- get overflowX() {
60
- return this.hasAttribute('overflow-x');
61
- }
62
- set overflowX(value) {
63
- if (value)
64
- this.setAttribute('overflow-x', '');
65
- else
66
- this.removeAttribute('overflow-x');
67
- }
68
- /** Distance (px) from an edge at which nearstart/nearend fire. Default 100. */
69
- get nearEdgeThreshold() {
70
- const v = parseInt(this.getAttribute('near-edge-threshold') || '', 10);
71
- return Number.isFinite(v) ? v : 100;
72
- }
73
- set nearEdgeThreshold(value) {
74
- if (value == null)
75
- this.removeAttribute('near-edge-threshold');
76
- else
77
- this.setAttribute('near-edge-threshold', String(value));
78
- }
79
- /** Preserve visual position when content is added above the viewport
80
- * (e.g. prepending older messages in a chat). Opt-in. */
81
- get scrollAnchoring() {
82
- return this.hasAttribute('scroll-anchoring');
83
- }
84
- set scrollAnchoring(value) {
85
- if (value)
86
- this.setAttribute('scroll-anchoring', '');
87
- else
88
- this.removeAttribute('scroll-anchoring');
89
- }
90
- constructor() {
91
- super();
92
- this._scrollWrapper = null;
93
- this._shadowTop = null;
94
- this._shadowBottom = null;
95
- this._shadowLeft = null;
96
- this._shadowRight = null;
97
- this._scrollbar = null;
98
- this._resizeObserver = null;
99
- this._contentObserver = null;
100
- this._rafId = null;
101
- // Edge-trigger state for nearstart/nearend (fire once on entering the zone).
102
- this._nearStartFired = false;
103
- this._nearEndFired = false;
104
- // ============ Private: Scroll Handling ============
105
- this._onScroll = () => {
106
- if (this._rafId !== null)
107
- return;
108
- this._rafId = requestAnimationFrame(() => {
109
- this._rafId = null;
110
- this._updateShadowState();
111
- });
112
- };
113
- this._onSlotChange = () => {
114
- this._scrollbar?.update();
115
- this._updateShadowState();
116
- };
117
- const shadow = this.attachShadow({ mode: 'open' });
118
- ensureStyles(shadow, { css: scrollContainerStyles, id: 'ty-scroll-container' });
119
- shadow.innerHTML = `
120
- <div class="scroll-wrapper">
121
- <slot></slot>
122
- </div>
123
- <div class="shadow-overlay">
124
- <div class="shadow-top"></div>
125
- <div class="shadow-bottom"></div>
126
- <div class="shadow-left"></div>
127
- <div class="shadow-right"></div>
128
- </div>
129
- `;
130
- this._scrollWrapper = shadow.querySelector('.scroll-wrapper');
131
- this._shadowTop = shadow.querySelector('.shadow-top');
132
- this._shadowBottom = shadow.querySelector('.shadow-bottom');
133
- this._shadowLeft = shadow.querySelector('.shadow-left');
134
- this._shadowRight = shadow.querySelector('.shadow-right');
135
- }
136
- connectedCallback() {
137
- this._scrollWrapper?.addEventListener('scroll', this._onScroll, { passive: true });
138
- this._resizeObserver = new ResizeObserver(() => {
139
- this._scrollbar?.update();
140
- this._updateShadowState();
141
- });
142
- if (this._scrollWrapper) {
143
- this._resizeObserver.observe(this._scrollWrapper);
144
- const slot = this._scrollWrapper.querySelector('slot');
145
- if (slot) {
146
- slot.addEventListener('slotchange', this._onSlotChange);
147
- }
148
- }
149
- this._updateMaxHeight();
150
- this._updateShadowState();
151
- this._setupScrollbar();
152
- this._setupAnchoring();
153
- }
154
- disconnectedCallback() {
155
- this._scrollWrapper?.removeEventListener('scroll', this._onScroll);
156
- this._destroyScrollbar();
157
- this._teardownAnchoring();
158
- if (this._resizeObserver) {
159
- this._resizeObserver.disconnect();
160
- this._resizeObserver = null;
161
- }
162
- if (this._rafId !== null) {
163
- cancelAnimationFrame(this._rafId);
164
- this._rafId = null;
165
- }
166
- }
167
- attributeChangedCallback(name, oldValue, newValue) {
168
- if (oldValue === newValue)
169
- return;
170
- if (name === 'max-height') {
171
- this._updateMaxHeight();
172
- this._updateShadowState();
173
- this._scrollbar?.update();
174
- }
175
- if (name === 'custom-scrollbar' || name === 'overflow-x') {
176
- this._destroyScrollbar();
177
- this._setupScrollbar();
178
- this._updateShadowState();
179
- }
180
- if (name === 'scroll-anchoring') {
181
- this._teardownAnchoring();
182
- this._setupAnchoring();
183
- }
184
- }
185
- // ============ Private: Scroll Anchoring ============
186
- // Preserve visual position when content is added ABOVE the viewport (chat
187
- // "load older" prepends). A MutationObserver watches the host's children;
188
- // any added node sitting above the visible area shifts everything down, so we
189
- // add its (above-the-fold) height back to scrollTop. Append-at-bottom is
190
- // untouched. CSS sets overflow-anchor:none so native anchoring doesn't fight us.
191
- _setupAnchoring() {
192
- if (this._contentObserver || !this.scrollAnchoring)
193
- return;
194
- this._contentObserver = new MutationObserver((records) => {
195
- const wrap = this._scrollWrapper;
196
- if (!wrap)
197
- return;
198
- const wrapTop = wrap.getBoundingClientRect().top;
199
- let addedAbove = 0;
200
- for (const r of records) {
201
- r.addedNodes.forEach((n) => {
202
- if (n.nodeType !== Node.ELEMENT_NODE)
203
- return;
204
- const rect = n.getBoundingClientRect();
205
- if (rect.bottom <= wrapTop)
206
- addedAbove += rect.height; // fully above
207
- else if (rect.top < wrapTop)
208
- addedAbove += wrapTop - rect.top; // partly above
209
- });
210
- }
211
- if (addedAbove > 0) {
212
- wrap.scrollTop += addedAbove;
213
- this._scrollbar?.update();
214
- }
215
- });
216
- this._contentObserver.observe(this, { childList: true });
217
- }
218
- _teardownAnchoring() {
219
- this._contentObserver?.disconnect();
220
- this._contentObserver = null;
221
- }
222
- // ============ Private: Scrollbar Setup ============
223
- _setupScrollbar() {
224
- // Idempotent: attributeChangedCallback (attrs set before insertion) and
225
- // connectedCallback can both call this. Without the guard a second
226
- // CustomScrollbar + track is created → two thumbs.
227
- if (this._scrollbar)
228
- return;
229
- if (!this._scrollWrapper || !this.customScrollbar)
230
- return;
231
- this._scrollbar = new CustomScrollbar(this._scrollWrapper, {
232
- vertical: true,
233
- horizontal: this.overflowX
234
- });
235
- // Append track elements to shadow DOM
236
- const shadowRoot = this.shadowRoot;
237
- if (this._scrollbar.trackY)
238
- shadowRoot.appendChild(this._scrollbar.trackY);
239
- if (this._scrollbar.trackX)
240
- shadowRoot.appendChild(this._scrollbar.trackX);
241
- }
242
- _destroyScrollbar() {
243
- if (this._scrollbar) {
244
- // Remove track elements from DOM
245
- this._scrollbar.trackY?.remove();
246
- this._scrollbar.trackX?.remove();
247
- this._scrollbar.destroy();
248
- this._scrollbar = null;
249
- }
250
- }
251
- // ============ Private: Max Height ============
252
- _updateMaxHeight() {
253
- if (this._scrollWrapper) {
254
- const maxHeight = this.maxHeight;
255
- if (maxHeight) {
256
- this._scrollWrapper.style.setProperty('--scroll-max-height', maxHeight);
257
- this._scrollWrapper.style.maxHeight = maxHeight;
258
- }
259
- else {
260
- this._scrollWrapper.style.removeProperty('--scroll-max-height');
261
- this._scrollWrapper.style.maxHeight = '';
262
- }
263
- }
264
- }
265
- // ============ Private: Shadow State ============
266
- _updateShadowState() {
267
- if (!this._scrollWrapper)
268
- return;
269
- const { scrollTop, scrollLeft, scrollHeight, scrollWidth, clientHeight, clientWidth } = this._scrollWrapper;
270
- const threshold = 2;
271
- if (this._shadowTop) {
272
- this._shadowTop.classList.toggle('visible', scrollTop > threshold);
273
- }
274
- if (this._shadowBottom) {
275
- this._shadowBottom.classList.toggle('visible', scrollTop + clientHeight < scrollHeight - threshold);
276
- }
277
- if (this.overflowX) {
278
- if (this._shadowLeft) {
279
- this._shadowLeft.classList.toggle('visible', scrollLeft > threshold);
280
- }
281
- if (this._shadowRight) {
282
- this._shadowRight.classList.toggle('visible', scrollLeft + clientWidth < scrollWidth - threshold);
283
- }
284
- }
285
- // Near-edge events for infinite scroll (vertical). Edge-triggered: fire once
286
- // when entering the zone, re-arm only after leaving it. Runs on scroll,
287
- // slotchange and resize (all route through here), so loading more content
288
- // re-arms naturally once it grows the scroll distance.
289
- const scrollable = scrollHeight - clientHeight;
290
- if (scrollable > 0) {
291
- const t = this.nearEdgeThreshold;
292
- const distEnd = scrollable - scrollTop;
293
- this._nearEndFired = this._maybeEmitEdge('nearend', distEnd, t, this._nearEndFired, { distance: distEnd, scrollTop, scrollHeight, clientHeight });
294
- this._nearStartFired = this._maybeEmitEdge('nearstart', scrollTop, t, this._nearStartFired, { distance: scrollTop, scrollTop, scrollHeight, clientHeight });
295
- }
296
- else {
297
- // Not scrollable → re-arm both so they fire fresh once content overflows.
298
- this._nearStartFired = false;
299
- this._nearEndFired = false;
300
- }
301
- }
302
- /** Edge-trigger one near-edge event; returns the new "fired" state. */
303
- _maybeEmitEdge(name, distance, threshold, fired, detail) {
304
- if (distance > threshold)
305
- return false; // out of zone → re-arm
306
- if (!fired) {
307
- this.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true }));
308
- }
309
- return true;
310
- }
311
- // ============ Public API ============
312
- updateShadows() {
313
- this._updateShadowState();
314
- this._scrollbar?.update();
315
- }
316
- scrollToTop(smooth = true) {
317
- this._scrollWrapper?.scrollTo({ top: 0, behavior: smooth ? 'smooth' : 'auto' });
318
- }
319
- scrollToBottom(smooth = true) {
320
- if (this._scrollWrapper) {
321
- this._scrollWrapper.scrollTo({ top: this._scrollWrapper.scrollHeight, behavior: smooth ? 'smooth' : 'auto' });
322
- }
323
- }
324
- scrollToLeft(smooth = true) {
325
- this._scrollWrapper?.scrollTo({ left: 0, behavior: smooth ? 'smooth' : 'auto' });
326
- }
327
- scrollToRight(smooth = true) {
328
- if (this._scrollWrapper) {
329
- this._scrollWrapper.scrollTo({ left: this._scrollWrapper.scrollWidth, behavior: smooth ? 'smooth' : 'auto' });
330
- }
331
- }
332
- /** Scroll a slotted descendant (element or CSS selector) into view. */
333
- scrollToElement(target, smooth = true) {
334
- const el = typeof target === 'string' ? this.querySelector(target) : target;
335
- el?.scrollIntoView({ behavior: smooth ? 'smooth' : 'auto', block: 'nearest' });
336
- }
337
- get scrollElement() {
338
- return this._scrollWrapper;
339
- }
340
- }
341
- // Register custom element
5
+ static get observedAttributes() {
6
+ return ['shadow', 'max-height', 'hide-scrollbar', 'custom-scrollbar', 'overflow-x', 'scroll-anchoring'];
7
+ }
8
+ get shadow() {
9
+ return this.getAttribute('shadow') !== 'false';
10
+ }
11
+ set shadow(value) {
12
+ if (value)
13
+ this.removeAttribute('shadow');
14
+ else
15
+ this.setAttribute('shadow', 'false');
16
+ }
17
+ get maxHeight() {
18
+ return this.getAttribute('max-height');
19
+ }
20
+ set maxHeight(value) {
21
+ if (value)
22
+ this.setAttribute('max-height', value);
23
+ else
24
+ this.removeAttribute('max-height');
25
+ this._updateMaxHeight();
26
+ }
27
+ get hideScrollbar() {
28
+ return this.hasAttribute('hide-scrollbar');
29
+ }
30
+ set hideScrollbar(value) {
31
+ if (value)
32
+ this.setAttribute('hide-scrollbar', '');
33
+ else
34
+ this.removeAttribute('hide-scrollbar');
35
+ }
36
+ get customScrollbar() {
37
+ return this.hasAttribute('custom-scrollbar');
38
+ }
39
+ set customScrollbar(value) {
40
+ if (value)
41
+ this.setAttribute('custom-scrollbar', '');
42
+ else
43
+ this.removeAttribute('custom-scrollbar');
44
+ }
45
+ get overflowX() {
46
+ return this.hasAttribute('overflow-x');
47
+ }
48
+ set overflowX(value) {
49
+ if (value)
50
+ this.setAttribute('overflow-x', '');
51
+ else
52
+ this.removeAttribute('overflow-x');
53
+ }
54
+ get nearEdgeThreshold() {
55
+ const v = parseInt(this.getAttribute('near-edge-threshold') || '', 10);
56
+ return Number.isFinite(v) ? v : 100;
57
+ }
58
+ set nearEdgeThreshold(value) {
59
+ if (value == null)
60
+ this.removeAttribute('near-edge-threshold');
61
+ else
62
+ this.setAttribute('near-edge-threshold', String(value));
63
+ }
64
+ get scrollAnchoring() {
65
+ return this.hasAttribute('scroll-anchoring');
66
+ }
67
+ set scrollAnchoring(value) {
68
+ if (value)
69
+ this.setAttribute('scroll-anchoring', '');
70
+ else
71
+ this.removeAttribute('scroll-anchoring');
72
+ }
73
+ constructor() {
74
+ super();
75
+ this._scrollWrapper = null;
76
+ this._shadowTop = null;
77
+ this._shadowBottom = null;
78
+ this._shadowLeft = null;
79
+ this._shadowRight = null;
80
+ this._scrollbar = null;
81
+ this._resizeObserver = null;
82
+ this._contentObserver = null;
83
+ this._rafId = null;
84
+ this._nearStartFired = false;
85
+ this._nearEndFired = false;
86
+ this._onScroll = () => {
87
+ if (this._rafId !== null)
88
+ return;
89
+ this._rafId = requestAnimationFrame(() => {
90
+ this._rafId = null;
91
+ this._updateShadowState();
92
+ });
93
+ };
94
+ this._onSlotChange = () => {
95
+ this._scrollbar?.update();
96
+ this._updateShadowState();
97
+ };
98
+ const shadow = this.attachShadow({ mode: 'open' });
99
+ ensureStyles(shadow, { css: scrollContainerStyles, id: 'ty-scroll-container' });
100
+ shadow.innerHTML = `
101
+ <div class="scroll-wrapper">
102
+ <slot></slot>
103
+ </div>
104
+ <div class="shadow-overlay">
105
+ <div class="shadow-top"></div>
106
+ <div class="shadow-bottom"></div>
107
+ <div class="shadow-left"></div>
108
+ <div class="shadow-right"></div>
109
+ </div>
110
+ `;
111
+ this._scrollWrapper = shadow.querySelector('.scroll-wrapper');
112
+ this._shadowTop = shadow.querySelector('.shadow-top');
113
+ this._shadowBottom = shadow.querySelector('.shadow-bottom');
114
+ this._shadowLeft = shadow.querySelector('.shadow-left');
115
+ this._shadowRight = shadow.querySelector('.shadow-right');
116
+ }
117
+ connectedCallback() {
118
+ this._scrollWrapper?.addEventListener('scroll', this._onScroll, { passive: true });
119
+ this._resizeObserver = new ResizeObserver(() => {
120
+ this._scrollbar?.update();
121
+ this._updateShadowState();
122
+ });
123
+ if (this._scrollWrapper) {
124
+ this._resizeObserver.observe(this._scrollWrapper);
125
+ const slot = this._scrollWrapper.querySelector('slot');
126
+ if (slot) {
127
+ slot.addEventListener('slotchange', this._onSlotChange);
128
+ }
129
+ }
130
+ this._updateMaxHeight();
131
+ this._updateShadowState();
132
+ this._setupScrollbar();
133
+ this._setupAnchoring();
134
+ }
135
+ disconnectedCallback() {
136
+ this._scrollWrapper?.removeEventListener('scroll', this._onScroll);
137
+ this._destroyScrollbar();
138
+ this._teardownAnchoring();
139
+ if (this._resizeObserver) {
140
+ this._resizeObserver.disconnect();
141
+ this._resizeObserver = null;
142
+ }
143
+ if (this._rafId !== null) {
144
+ cancelAnimationFrame(this._rafId);
145
+ this._rafId = null;
146
+ }
147
+ }
148
+ attributeChangedCallback(name, oldValue, newValue) {
149
+ if (oldValue === newValue)
150
+ return;
151
+ if (name === 'max-height') {
152
+ this._updateMaxHeight();
153
+ this._updateShadowState();
154
+ this._scrollbar?.update();
155
+ }
156
+ if (name === 'custom-scrollbar' || name === 'overflow-x') {
157
+ this._destroyScrollbar();
158
+ this._setupScrollbar();
159
+ this._updateShadowState();
160
+ }
161
+ if (name === 'scroll-anchoring') {
162
+ this._teardownAnchoring();
163
+ this._setupAnchoring();
164
+ }
165
+ }
166
+ _setupAnchoring() {
167
+ if (this._contentObserver || !this.scrollAnchoring)
168
+ return;
169
+ this._contentObserver = new MutationObserver((records) => {
170
+ const wrap = this._scrollWrapper;
171
+ if (!wrap)
172
+ return;
173
+ const added = new Set();
174
+ for (const r of records)
175
+ r.addedNodes.forEach((n) => added.add(n));
176
+ if (added.size === 0)
177
+ return;
178
+ let addedAbove = 0;
179
+ for (const child of Array.from(this.children)) {
180
+ if (!added.has(child))
181
+ break;
182
+ addedAbove += child.offsetHeight;
183
+ }
184
+ if (addedAbove > 0) {
185
+ wrap.scrollTop += addedAbove;
186
+ this._scrollbar?.update();
187
+ }
188
+ });
189
+ this._contentObserver.observe(this, { childList: true });
190
+ }
191
+ _teardownAnchoring() {
192
+ this._contentObserver?.disconnect();
193
+ this._contentObserver = null;
194
+ }
195
+ _setupScrollbar() {
196
+ if (this._scrollbar)
197
+ return;
198
+ if (!this._scrollWrapper || !this.customScrollbar)
199
+ return;
200
+ this._scrollbar = new CustomScrollbar(this._scrollWrapper, {
201
+ vertical: true,
202
+ horizontal: this.overflowX
203
+ });
204
+ const shadowRoot = this.shadowRoot;
205
+ if (this._scrollbar.trackY)
206
+ shadowRoot.appendChild(this._scrollbar.trackY);
207
+ if (this._scrollbar.trackX)
208
+ shadowRoot.appendChild(this._scrollbar.trackX);
209
+ }
210
+ _destroyScrollbar() {
211
+ if (this._scrollbar) {
212
+ this._scrollbar.trackY?.remove();
213
+ this._scrollbar.trackX?.remove();
214
+ this._scrollbar.destroy();
215
+ this._scrollbar = null;
216
+ }
217
+ }
218
+ _updateMaxHeight() {
219
+ if (this._scrollWrapper) {
220
+ const maxHeight = this.maxHeight;
221
+ if (maxHeight) {
222
+ this._scrollWrapper.style.setProperty('--scroll-max-height', maxHeight);
223
+ this._scrollWrapper.style.maxHeight = maxHeight;
224
+ }
225
+ else {
226
+ this._scrollWrapper.style.removeProperty('--scroll-max-height');
227
+ this._scrollWrapper.style.maxHeight = '';
228
+ }
229
+ }
230
+ }
231
+ _updateShadowState() {
232
+ if (!this._scrollWrapper)
233
+ return;
234
+ const { scrollTop, scrollLeft, scrollHeight, scrollWidth, clientHeight, clientWidth } = this._scrollWrapper;
235
+ const threshold = 2;
236
+ if (this._shadowTop) {
237
+ this._shadowTop.classList.toggle('visible', scrollTop > threshold);
238
+ }
239
+ if (this._shadowBottom) {
240
+ this._shadowBottom.classList.toggle('visible', scrollTop + clientHeight < scrollHeight - threshold);
241
+ }
242
+ if (this.overflowX) {
243
+ if (this._shadowLeft) {
244
+ this._shadowLeft.classList.toggle('visible', scrollLeft > threshold);
245
+ }
246
+ if (this._shadowRight) {
247
+ this._shadowRight.classList.toggle('visible', scrollLeft + clientWidth < scrollWidth - threshold);
248
+ }
249
+ }
250
+ const scrollable = scrollHeight - clientHeight;
251
+ if (scrollable > 0) {
252
+ const t = this.nearEdgeThreshold;
253
+ const distEnd = scrollable - scrollTop;
254
+ this._nearEndFired = this._maybeEmitEdge('nearend', distEnd, t, this._nearEndFired, { distance: distEnd, scrollTop, scrollHeight, clientHeight });
255
+ this._nearStartFired = this._maybeEmitEdge('nearstart', scrollTop, t, this._nearStartFired, { distance: scrollTop, scrollTop, scrollHeight, clientHeight });
256
+ }
257
+ else {
258
+ this._nearStartFired = false;
259
+ this._nearEndFired = false;
260
+ }
261
+ }
262
+ _maybeEmitEdge(name, distance, threshold, fired, detail) {
263
+ if (distance > threshold)
264
+ return false;
265
+ if (!fired) {
266
+ this.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true }));
267
+ }
268
+ return true;
269
+ }
270
+ updateShadows() {
271
+ this._updateShadowState();
272
+ this._scrollbar?.update();
273
+ }
274
+ scrollToTop(smooth = true) {
275
+ this._scrollWrapper?.scrollTo({ top: 0, behavior: smooth ? 'smooth' : 'auto' });
276
+ }
277
+ scrollToBottom(smooth = true) {
278
+ if (this._scrollWrapper) {
279
+ this._scrollWrapper.scrollTo({ top: this._scrollWrapper.scrollHeight, behavior: smooth ? 'smooth' : 'auto' });
280
+ }
281
+ }
282
+ scrollToLeft(smooth = true) {
283
+ this._scrollWrapper?.scrollTo({ left: 0, behavior: smooth ? 'smooth' : 'auto' });
284
+ }
285
+ scrollToRight(smooth = true) {
286
+ if (this._scrollWrapper) {
287
+ this._scrollWrapper.scrollTo({ left: this._scrollWrapper.scrollWidth, behavior: smooth ? 'smooth' : 'auto' });
288
+ }
289
+ }
290
+ scrollToElement(target, smooth = true) {
291
+ const el = typeof target === 'string' ? this.querySelector(target) : target;
292
+ el?.scrollIntoView({ behavior: smooth ? 'smooth' : 'auto', block: 'nearest' });
293
+ }
294
+ get scrollElement() {
295
+ return this._scrollWrapper;
296
+ }
297
+ }
342
298
  customElements.define('ty-scroll-container', TyScrollContainer);
343
- //# sourceMappingURL=scroll-container.js.map