tyrell-components 1.0.0-TC52 → 1.0.0-TC53

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 (105) hide show
  1. package/css/tyrell-theme.css +25 -2
  2. package/css/tyrell.css +4 -0
  3. package/dist/tyrell-colors-static.css +1 -316
  4. package/dist/tyrell-theme.css +1 -1443
  5. package/dist/tyrell.css +1 -1390
  6. package/dist/tyrell.js +1 -1
  7. package/lib/base/ty-component.js +196 -196
  8. package/lib/components/button.d.ts +1 -1
  9. package/lib/components/button.js +260 -259
  10. package/lib/components/calendar-month.d.ts +2 -2
  11. package/lib/components/calendar-month.js +426 -416
  12. package/lib/components/calendar-navigation.js +238 -238
  13. package/lib/components/calendar.js +605 -602
  14. package/lib/components/checkbox.d.ts +1 -1
  15. package/lib/components/checkbox.js +273 -272
  16. package/lib/components/copy.d.ts +1 -1
  17. package/lib/components/copy.js +279 -278
  18. package/lib/components/date-picker.d.ts +1 -1
  19. package/lib/components/date-picker.js +1103 -1108
  20. package/lib/components/file-upload.js +404 -404
  21. package/lib/components/icon.js +141 -141
  22. package/lib/components/input.d.ts +1 -1
  23. package/lib/components/input.js +593 -596
  24. package/lib/components/modal.js +319 -319
  25. package/lib/components/option.js +167 -167
  26. package/lib/components/popup.js +233 -233
  27. package/lib/components/radio.d.ts +2 -2
  28. package/lib/components/radio.js +407 -406
  29. package/lib/components/resize-observer.js +67 -67
  30. package/lib/components/scroll-container.js +294 -294
  31. package/lib/components/select.d.ts +1 -1
  32. package/lib/components/select.js +1524 -1532
  33. package/lib/components/selected-tags.js +184 -184
  34. package/lib/components/step.js +62 -62
  35. package/lib/components/switch.d.ts +1 -1
  36. package/lib/components/switch.js +214 -213
  37. package/lib/components/tab.js +62 -62
  38. package/lib/components/tabs.js +507 -507
  39. package/lib/components/tag.d.ts +1 -1
  40. package/lib/components/tag.js +236 -235
  41. package/lib/components/textarea.d.ts +1 -1
  42. package/lib/components/textarea.js +457 -456
  43. package/lib/components/tooltip.js +283 -283
  44. package/lib/components/wizard.js +384 -384
  45. package/lib/icons/heroicons/micro.js +392 -392
  46. package/lib/icons/heroicons/mini.js +382 -382
  47. package/lib/icons/heroicons/outline.js +337 -337
  48. package/lib/icons/heroicons/solid.js +407 -407
  49. package/lib/icons/lucide.js +22843 -22843
  50. package/lib/icons/material/filled.js +9653 -9653
  51. package/lib/icons/material/outlined.js +10271 -10271
  52. package/lib/icons/material/round.js +10495 -10495
  53. package/lib/icons/material/sharp.js +9905 -9905
  54. package/lib/icons/material/two-tone.js +12792 -12792
  55. package/lib/index.js +21 -21
  56. package/lib/styles/button.js +176 -288
  57. package/lib/styles/calendar-month.js +123 -183
  58. package/lib/styles/calendar-navigation.js +60 -79
  59. package/lib/styles/calendar.js +8 -9
  60. package/lib/styles/checkbox.js +45 -72
  61. package/lib/styles/copy.js +67 -91
  62. package/lib/styles/custom-scrollbar.js +80 -100
  63. package/lib/styles/date-picker.js +261 -331
  64. package/lib/styles/field-size.d.ts +6 -0
  65. package/lib/styles/field-size.js +91 -0
  66. package/lib/styles/file-upload.js +139 -169
  67. package/lib/styles/icon.js +92 -156
  68. package/lib/styles/input.js +125 -241
  69. package/lib/styles/modal.js +67 -102
  70. package/lib/styles/option.d.ts +1 -1
  71. package/lib/styles/option.js +47 -67
  72. package/lib/styles/popup.js +34 -65
  73. package/lib/styles/radio.js +69 -96
  74. package/lib/styles/resize-observer.js +2 -5
  75. package/lib/styles/scroll-container.js +100 -130
  76. package/lib/styles/select-base.js +525 -778
  77. package/lib/styles/select.js +140 -228
  78. package/lib/styles/step.js +22 -29
  79. package/lib/styles/switch.js +34 -55
  80. package/lib/styles/tab.js +22 -29
  81. package/lib/styles/tabs.js +171 -252
  82. package/lib/styles/tag.js +135 -188
  83. package/lib/styles/textarea.d.ts +1 -1
  84. package/lib/styles/textarea.js +205 -271
  85. package/lib/styles/tooltip.js +3 -3
  86. package/lib/styles/wizard.js +170 -226
  87. package/lib/types/common.d.ts +2 -0
  88. package/lib/types/common.js +6 -5
  89. package/lib/utils/calendar-utils.js +100 -100
  90. package/lib/utils/custom-scrollbar.js +272 -272
  91. package/lib/utils/flavor-sheet.js +14 -14
  92. package/lib/utils/icon-registry.js +127 -127
  93. package/lib/utils/loader-registry.js +3 -3
  94. package/lib/utils/locale.js +34 -34
  95. package/lib/utils/mobile.js +1 -1
  96. package/lib/utils/number-format.js +54 -54
  97. package/lib/utils/positioning.js +212 -212
  98. package/lib/utils/property-capture.js +36 -36
  99. package/lib/utils/property-manager.js +125 -125
  100. package/lib/utils/resize-observer.js +23 -23
  101. package/lib/utils/scroll-lock.js +57 -57
  102. package/lib/utils/styles.js +17 -17
  103. package/lib/version.d.ts +1 -1
  104. package/lib/version.js +1 -1
  105. package/package.json +4 -4
@@ -1,276 +1,276 @@
1
1
  export function isCustomScrollbarEnabled() {
2
- return document.documentElement.getAttribute('data-ty-scrollbar') !== 'native';
2
+ return document.documentElement.getAttribute('data-ty-scrollbar') !== 'native';
3
3
  }
4
4
  export class CustomScrollbar {
5
- constructor(scrollEl, options = {}) {
6
- this.trackY = null;
7
- this.thumbY = null;
8
- this.trackX = null;
9
- this.thumbX = null;
10
- this._isDragging = false;
11
- this._dragAxis = 'y';
12
- this._dragStartPos = 0;
13
- this._dragStartScroll = 0;
14
- this._rafId = null;
15
- this._hideTimeout = null;
16
- this._resizeObserver = null;
17
- this._scrollEl = scrollEl;
18
- this._vertical = options.vertical !== false;
19
- this._horizontal = options.horizontal ?? false;
20
- this._autoHideDelay = options.autoHideDelay ?? 1000;
21
- this._onScroll = this._handleScroll.bind(this);
22
- this._onThumbYDown = this._handleThumbYDown.bind(this);
23
- this._onThumbXDown = this._handleThumbXDown.bind(this);
24
- this._onTrackYDown = this._handleTrackYDown.bind(this);
25
- this._onTrackXDown = this._handleTrackXDown.bind(this);
26
- this._onDragMove = this._handleDragMove.bind(this);
27
- this._onDragEnd = this._handleDragEnd.bind(this);
28
- if (this._vertical) {
29
- this.trackY = this._createTrack('y');
30
- this.thumbY = this._createThumb('y');
31
- this.trackY.appendChild(this.thumbY);
32
- }
33
- if (this._horizontal) {
34
- this.trackX = this._createTrack('x');
35
- this.thumbX = this._createThumb('x');
36
- this.trackX.appendChild(this.thumbX);
37
- }
38
- this._scrollEl.addEventListener('scroll', this._onScroll, { passive: true });
39
- if (this.thumbY) {
40
- this.thumbY.addEventListener('pointerdown', this._onThumbYDown);
41
- }
42
- if (this.trackY) {
43
- this.trackY.addEventListener('pointerdown', this._onTrackYDown);
44
- }
45
- if (this.thumbX) {
46
- this.thumbX.addEventListener('pointerdown', this._onThumbXDown);
47
- }
48
- if (this.trackX) {
49
- this.trackX.addEventListener('pointerdown', this._onTrackXDown);
50
- }
51
- this._resizeObserver = new ResizeObserver(() => this.update());
52
- this._resizeObserver.observe(this._scrollEl);
53
- this.update();
54
- }
55
- _createTrack(axis) {
56
- const el = document.createElement('div');
57
- el.className = `ty-scrollbar-track-${axis}`;
58
- return el;
59
- }
60
- _createThumb(axis) {
61
- const el = document.createElement('div');
62
- el.className = `ty-scrollbar-thumb-${axis}`;
63
- return el;
64
- }
65
- update() {
66
- this._updateVertical();
67
- this._updateHorizontal();
68
- }
69
- scrollToTop(smooth = false) {
70
- this._scrollEl.scrollTo({ top: 0, behavior: smooth ? 'smooth' : 'auto' });
71
- }
72
- scrollToBottom(smooth = false) {
73
- this._scrollEl.scrollTo({ top: this._scrollEl.scrollHeight, behavior: smooth ? 'smooth' : 'auto' });
74
- }
75
- scrollToLeft(smooth = false) {
76
- this._scrollEl.scrollTo({ left: 0, behavior: smooth ? 'smooth' : 'auto' });
77
- }
78
- scrollToRight(smooth = false) {
79
- this._scrollEl.scrollTo({ left: this._scrollEl.scrollWidth, behavior: smooth ? 'smooth' : 'auto' });
80
- }
81
- destroy() {
82
- this._scrollEl.removeEventListener('scroll', this._onScroll);
83
- if (this.thumbY) {
84
- this.thumbY.removeEventListener('pointerdown', this._onThumbYDown);
85
- }
86
- if (this.trackY) {
87
- this.trackY.removeEventListener('pointerdown', this._onTrackYDown);
88
- }
89
- if (this.thumbX) {
90
- this.thumbX.removeEventListener('pointerdown', this._onThumbXDown);
91
- }
92
- if (this.trackX) {
93
- this.trackX.removeEventListener('pointerdown', this._onTrackXDown);
94
- }
95
- if (this._resizeObserver) {
96
- this._resizeObserver.disconnect();
97
- this._resizeObserver = null;
98
- }
99
- if (this._rafId !== null) {
100
- cancelAnimationFrame(this._rafId);
101
- this._rafId = null;
102
- }
103
- if (this._hideTimeout !== null) {
104
- clearTimeout(this._hideTimeout);
105
- this._hideTimeout = null;
106
- }
107
- }
108
- _handleScroll() {
109
- if (this._rafId !== null)
110
- return;
111
- this._rafId = requestAnimationFrame(() => {
112
- this._rafId = null;
113
- this._updateThumbPositions();
114
- this._showScrollbars();
115
- });
116
- }
117
- _updateVertical() {
118
- if (!this.trackY || !this.thumbY)
119
- return;
120
- const { scrollHeight, clientHeight } = this._scrollEl;
121
- const hasOverflow = scrollHeight > clientHeight + 2;
122
- this.trackY.classList.toggle('has-overflow', hasOverflow);
123
- if (hasOverflow) {
124
- const ratio = clientHeight / scrollHeight;
125
- this.thumbY.style.height = `${Math.max(ratio * 100, 0)}%`;
126
- }
127
- this._updateThumbY();
128
- }
129
- _updateHorizontal() {
130
- if (!this.trackX || !this.thumbX)
131
- return;
132
- const { scrollWidth, clientWidth } = this._scrollEl;
133
- const hasOverflow = scrollWidth > clientWidth + 2;
134
- this.trackX.classList.toggle('has-overflow', hasOverflow);
135
- if (hasOverflow) {
136
- const ratio = clientWidth / scrollWidth;
137
- this.thumbX.style.width = `${Math.max(ratio * 100, 0)}%`;
138
- }
139
- this._updateThumbX();
140
- }
141
- _updateThumbPositions() {
142
- this._updateThumbY();
143
- this._updateThumbX();
144
- }
145
- _updateThumbY() {
146
- if (!this.trackY || !this.thumbY)
147
- return;
148
- const { scrollTop, scrollHeight, clientHeight } = this._scrollEl;
149
- const maxScroll = scrollHeight - clientHeight;
150
- if (maxScroll <= 0)
151
- return;
152
- const scrollRatio = scrollTop / maxScroll;
153
- const trackHeight = this.trackY.clientHeight;
154
- const thumbHeight = this.thumbY.offsetHeight;
155
- const maxThumbTop = trackHeight - thumbHeight;
156
- this.thumbY.style.top = `${scrollRatio * maxThumbTop}px`;
157
- }
158
- _updateThumbX() {
159
- if (!this.trackX || !this.thumbX)
160
- return;
161
- const { scrollLeft, scrollWidth, clientWidth } = this._scrollEl;
162
- const maxScroll = scrollWidth - clientWidth;
163
- if (maxScroll <= 0)
164
- return;
165
- const scrollRatio = scrollLeft / maxScroll;
166
- const trackWidth = this.trackX.clientWidth;
167
- const thumbWidth = this.thumbX.offsetWidth;
168
- const maxThumbLeft = trackWidth - thumbWidth;
169
- this.thumbX.style.left = `${scrollRatio * maxThumbLeft}px`;
170
- }
171
- _showScrollbars() {
172
- if (this._isDragging)
173
- return;
174
- this.trackY?.classList.add('scrolling');
175
- this.trackX?.classList.add('scrolling');
176
- if (this._hideTimeout !== null) {
177
- clearTimeout(this._hideTimeout);
178
- }
179
- this._hideTimeout = setTimeout(() => {
180
- this.trackY?.classList.remove('scrolling');
181
- this.trackX?.classList.remove('scrolling');
182
- this._hideTimeout = null;
183
- }, this._autoHideDelay);
184
- }
185
- _handleThumbYDown(e) {
186
- if (e.button !== 0)
187
- return;
188
- e.preventDefault();
189
- e.stopPropagation();
190
- this._isDragging = true;
191
- this._dragAxis = 'y';
192
- this._dragStartPos = e.clientY;
193
- this._dragStartScroll = this._scrollEl.scrollTop;
194
- this.thumbY.setPointerCapture(e.pointerId);
195
- this.trackY?.classList.add('dragging');
196
- this.thumbY.addEventListener('pointermove', this._onDragMove);
197
- this.thumbY.addEventListener('pointerup', this._onDragEnd);
198
- this.thumbY.addEventListener('pointercancel', this._onDragEnd);
199
- }
200
- _handleThumbXDown(e) {
201
- if (e.button !== 0)
202
- return;
203
- e.preventDefault();
204
- e.stopPropagation();
205
- this._isDragging = true;
206
- this._dragAxis = 'x';
207
- this._dragStartPos = e.clientX;
208
- this._dragStartScroll = this._scrollEl.scrollLeft;
209
- this.thumbX.setPointerCapture(e.pointerId);
210
- this.trackX?.classList.add('dragging');
211
- this.thumbX.addEventListener('pointermove', this._onDragMove);
212
- this.thumbX.addEventListener('pointerup', this._onDragEnd);
213
- this.thumbX.addEventListener('pointercancel', this._onDragEnd);
214
- }
215
- _handleDragMove(e) {
216
- if (!this._isDragging)
217
- return;
218
- if (this._dragAxis === 'y') {
219
- const delta = e.clientY - this._dragStartPos;
220
- const { scrollHeight, clientHeight } = this._scrollEl;
221
- const trackHeight = this.trackY.clientHeight;
222
- const thumbHeight = this.thumbY.offsetHeight;
223
- const maxThumbTop = trackHeight - thumbHeight;
224
- if (maxThumbTop <= 0)
225
- return;
226
- const scrollRatio = (scrollHeight - clientHeight) / maxThumbTop;
227
- this._scrollEl.scrollTop = this._dragStartScroll + delta * scrollRatio;
228
- }
229
- else {
230
- const delta = e.clientX - this._dragStartPos;
231
- const { scrollWidth, clientWidth } = this._scrollEl;
232
- const trackWidth = this.trackX.clientWidth;
233
- const thumbWidth = this.thumbX.offsetWidth;
234
- const maxThumbLeft = trackWidth - thumbWidth;
235
- if (maxThumbLeft <= 0)
236
- return;
237
- const scrollRatio = (scrollWidth - clientWidth) / maxThumbLeft;
238
- this._scrollEl.scrollLeft = this._dragStartScroll + delta * scrollRatio;
239
- }
240
- }
241
- _handleDragEnd(e) {
242
- const thumb = this._dragAxis === 'y' ? this.thumbY : this.thumbX;
243
- const track = this._dragAxis === 'y' ? this.trackY : this.trackX;
244
- this._isDragging = false;
245
- thumb.releasePointerCapture(e.pointerId);
246
- track?.classList.remove('dragging');
247
- thumb.removeEventListener('pointermove', this._onDragMove);
248
- thumb.removeEventListener('pointerup', this._onDragEnd);
249
- thumb.removeEventListener('pointercancel', this._onDragEnd);
250
- this._showScrollbars();
251
- }
252
- _handleTrackYDown(e) {
253
- if (e.target === this.thumbY || e.button !== 0)
254
- return;
255
- e.preventDefault();
256
- const trackRect = this.trackY.getBoundingClientRect();
257
- const clickRatio = (e.clientY - trackRect.top) / trackRect.height;
258
- const { scrollHeight, clientHeight } = this._scrollEl;
259
- this._scrollEl.scrollTo({
260
- top: clickRatio * (scrollHeight - clientHeight),
261
- behavior: 'smooth'
262
- });
263
- }
264
- _handleTrackXDown(e) {
265
- if (e.target === this.thumbX || e.button !== 0)
266
- return;
267
- e.preventDefault();
268
- const trackRect = this.trackX.getBoundingClientRect();
269
- const clickRatio = (e.clientX - trackRect.left) / trackRect.width;
270
- const { scrollWidth, clientWidth } = this._scrollEl;
271
- this._scrollEl.scrollTo({
272
- left: clickRatio * (scrollWidth - clientWidth),
273
- behavior: 'smooth'
274
- });
275
- }
5
+ constructor(scrollEl, options = {}) {
6
+ this.trackY = null;
7
+ this.thumbY = null;
8
+ this.trackX = null;
9
+ this.thumbX = null;
10
+ this._isDragging = false;
11
+ this._dragAxis = 'y';
12
+ this._dragStartPos = 0;
13
+ this._dragStartScroll = 0;
14
+ this._rafId = null;
15
+ this._hideTimeout = null;
16
+ this._resizeObserver = null;
17
+ this._scrollEl = scrollEl;
18
+ this._vertical = options.vertical !== false;
19
+ this._horizontal = options.horizontal ?? false;
20
+ this._autoHideDelay = options.autoHideDelay ?? 1000;
21
+ this._onScroll = this._handleScroll.bind(this);
22
+ this._onThumbYDown = this._handleThumbYDown.bind(this);
23
+ this._onThumbXDown = this._handleThumbXDown.bind(this);
24
+ this._onTrackYDown = this._handleTrackYDown.bind(this);
25
+ this._onTrackXDown = this._handleTrackXDown.bind(this);
26
+ this._onDragMove = this._handleDragMove.bind(this);
27
+ this._onDragEnd = this._handleDragEnd.bind(this);
28
+ if (this._vertical) {
29
+ this.trackY = this._createTrack('y');
30
+ this.thumbY = this._createThumb('y');
31
+ this.trackY.appendChild(this.thumbY);
32
+ }
33
+ if (this._horizontal) {
34
+ this.trackX = this._createTrack('x');
35
+ this.thumbX = this._createThumb('x');
36
+ this.trackX.appendChild(this.thumbX);
37
+ }
38
+ this._scrollEl.addEventListener('scroll', this._onScroll, { passive: true });
39
+ if (this.thumbY) {
40
+ this.thumbY.addEventListener('pointerdown', this._onThumbYDown);
41
+ }
42
+ if (this.trackY) {
43
+ this.trackY.addEventListener('pointerdown', this._onTrackYDown);
44
+ }
45
+ if (this.thumbX) {
46
+ this.thumbX.addEventListener('pointerdown', this._onThumbXDown);
47
+ }
48
+ if (this.trackX) {
49
+ this.trackX.addEventListener('pointerdown', this._onTrackXDown);
50
+ }
51
+ this._resizeObserver = new ResizeObserver(() => this.update());
52
+ this._resizeObserver.observe(this._scrollEl);
53
+ this.update();
54
+ }
55
+ _createTrack(axis) {
56
+ const el = document.createElement('div');
57
+ el.className = `ty-scrollbar-track-${axis}`;
58
+ return el;
59
+ }
60
+ _createThumb(axis) {
61
+ const el = document.createElement('div');
62
+ el.className = `ty-scrollbar-thumb-${axis}`;
63
+ return el;
64
+ }
65
+ update() {
66
+ this._updateVertical();
67
+ this._updateHorizontal();
68
+ }
69
+ scrollToTop(smooth = false) {
70
+ this._scrollEl.scrollTo({ top: 0, behavior: smooth ? 'smooth' : 'auto' });
71
+ }
72
+ scrollToBottom(smooth = false) {
73
+ this._scrollEl.scrollTo({ top: this._scrollEl.scrollHeight, behavior: smooth ? 'smooth' : 'auto' });
74
+ }
75
+ scrollToLeft(smooth = false) {
76
+ this._scrollEl.scrollTo({ left: 0, behavior: smooth ? 'smooth' : 'auto' });
77
+ }
78
+ scrollToRight(smooth = false) {
79
+ this._scrollEl.scrollTo({ left: this._scrollEl.scrollWidth, behavior: smooth ? 'smooth' : 'auto' });
80
+ }
81
+ destroy() {
82
+ this._scrollEl.removeEventListener('scroll', this._onScroll);
83
+ if (this.thumbY) {
84
+ this.thumbY.removeEventListener('pointerdown', this._onThumbYDown);
85
+ }
86
+ if (this.trackY) {
87
+ this.trackY.removeEventListener('pointerdown', this._onTrackYDown);
88
+ }
89
+ if (this.thumbX) {
90
+ this.thumbX.removeEventListener('pointerdown', this._onThumbXDown);
91
+ }
92
+ if (this.trackX) {
93
+ this.trackX.removeEventListener('pointerdown', this._onTrackXDown);
94
+ }
95
+ if (this._resizeObserver) {
96
+ this._resizeObserver.disconnect();
97
+ this._resizeObserver = null;
98
+ }
99
+ if (this._rafId !== null) {
100
+ cancelAnimationFrame(this._rafId);
101
+ this._rafId = null;
102
+ }
103
+ if (this._hideTimeout !== null) {
104
+ clearTimeout(this._hideTimeout);
105
+ this._hideTimeout = null;
106
+ }
107
+ }
108
+ _handleScroll() {
109
+ if (this._rafId !== null)
110
+ return;
111
+ this._rafId = requestAnimationFrame(() => {
112
+ this._rafId = null;
113
+ this._updateThumbPositions();
114
+ this._showScrollbars();
115
+ });
116
+ }
117
+ _updateVertical() {
118
+ if (!this.trackY || !this.thumbY)
119
+ return;
120
+ const { scrollHeight, clientHeight } = this._scrollEl;
121
+ const hasOverflow = scrollHeight > clientHeight + 2;
122
+ this.trackY.classList.toggle('has-overflow', hasOverflow);
123
+ if (hasOverflow) {
124
+ const ratio = clientHeight / scrollHeight;
125
+ this.thumbY.style.height = `${Math.max(ratio * 100, 0)}%`;
126
+ }
127
+ this._updateThumbY();
128
+ }
129
+ _updateHorizontal() {
130
+ if (!this.trackX || !this.thumbX)
131
+ return;
132
+ const { scrollWidth, clientWidth } = this._scrollEl;
133
+ const hasOverflow = scrollWidth > clientWidth + 2;
134
+ this.trackX.classList.toggle('has-overflow', hasOverflow);
135
+ if (hasOverflow) {
136
+ const ratio = clientWidth / scrollWidth;
137
+ this.thumbX.style.width = `${Math.max(ratio * 100, 0)}%`;
138
+ }
139
+ this._updateThumbX();
140
+ }
141
+ _updateThumbPositions() {
142
+ this._updateThumbY();
143
+ this._updateThumbX();
144
+ }
145
+ _updateThumbY() {
146
+ if (!this.trackY || !this.thumbY)
147
+ return;
148
+ const { scrollTop, scrollHeight, clientHeight } = this._scrollEl;
149
+ const maxScroll = scrollHeight - clientHeight;
150
+ if (maxScroll <= 0)
151
+ return;
152
+ const scrollRatio = scrollTop / maxScroll;
153
+ const trackHeight = this.trackY.clientHeight;
154
+ const thumbHeight = this.thumbY.offsetHeight;
155
+ const maxThumbTop = trackHeight - thumbHeight;
156
+ this.thumbY.style.top = `${scrollRatio * maxThumbTop}px`;
157
+ }
158
+ _updateThumbX() {
159
+ if (!this.trackX || !this.thumbX)
160
+ return;
161
+ const { scrollLeft, scrollWidth, clientWidth } = this._scrollEl;
162
+ const maxScroll = scrollWidth - clientWidth;
163
+ if (maxScroll <= 0)
164
+ return;
165
+ const scrollRatio = scrollLeft / maxScroll;
166
+ const trackWidth = this.trackX.clientWidth;
167
+ const thumbWidth = this.thumbX.offsetWidth;
168
+ const maxThumbLeft = trackWidth - thumbWidth;
169
+ this.thumbX.style.left = `${scrollRatio * maxThumbLeft}px`;
170
+ }
171
+ _showScrollbars() {
172
+ if (this._isDragging)
173
+ return;
174
+ this.trackY?.classList.add('scrolling');
175
+ this.trackX?.classList.add('scrolling');
176
+ if (this._hideTimeout !== null) {
177
+ clearTimeout(this._hideTimeout);
178
+ }
179
+ this._hideTimeout = setTimeout(() => {
180
+ this.trackY?.classList.remove('scrolling');
181
+ this.trackX?.classList.remove('scrolling');
182
+ this._hideTimeout = null;
183
+ }, this._autoHideDelay);
184
+ }
185
+ _handleThumbYDown(e) {
186
+ if (e.button !== 0)
187
+ return;
188
+ e.preventDefault();
189
+ e.stopPropagation();
190
+ this._isDragging = true;
191
+ this._dragAxis = 'y';
192
+ this._dragStartPos = e.clientY;
193
+ this._dragStartScroll = this._scrollEl.scrollTop;
194
+ this.thumbY.setPointerCapture(e.pointerId);
195
+ this.trackY?.classList.add('dragging');
196
+ this.thumbY.addEventListener('pointermove', this._onDragMove);
197
+ this.thumbY.addEventListener('pointerup', this._onDragEnd);
198
+ this.thumbY.addEventListener('pointercancel', this._onDragEnd);
199
+ }
200
+ _handleThumbXDown(e) {
201
+ if (e.button !== 0)
202
+ return;
203
+ e.preventDefault();
204
+ e.stopPropagation();
205
+ this._isDragging = true;
206
+ this._dragAxis = 'x';
207
+ this._dragStartPos = e.clientX;
208
+ this._dragStartScroll = this._scrollEl.scrollLeft;
209
+ this.thumbX.setPointerCapture(e.pointerId);
210
+ this.trackX?.classList.add('dragging');
211
+ this.thumbX.addEventListener('pointermove', this._onDragMove);
212
+ this.thumbX.addEventListener('pointerup', this._onDragEnd);
213
+ this.thumbX.addEventListener('pointercancel', this._onDragEnd);
214
+ }
215
+ _handleDragMove(e) {
216
+ if (!this._isDragging)
217
+ return;
218
+ if (this._dragAxis === 'y') {
219
+ const delta = e.clientY - this._dragStartPos;
220
+ const { scrollHeight, clientHeight } = this._scrollEl;
221
+ const trackHeight = this.trackY.clientHeight;
222
+ const thumbHeight = this.thumbY.offsetHeight;
223
+ const maxThumbTop = trackHeight - thumbHeight;
224
+ if (maxThumbTop <= 0)
225
+ return;
226
+ const scrollRatio = (scrollHeight - clientHeight) / maxThumbTop;
227
+ this._scrollEl.scrollTop = this._dragStartScroll + delta * scrollRatio;
228
+ }
229
+ else {
230
+ const delta = e.clientX - this._dragStartPos;
231
+ const { scrollWidth, clientWidth } = this._scrollEl;
232
+ const trackWidth = this.trackX.clientWidth;
233
+ const thumbWidth = this.thumbX.offsetWidth;
234
+ const maxThumbLeft = trackWidth - thumbWidth;
235
+ if (maxThumbLeft <= 0)
236
+ return;
237
+ const scrollRatio = (scrollWidth - clientWidth) / maxThumbLeft;
238
+ this._scrollEl.scrollLeft = this._dragStartScroll + delta * scrollRatio;
239
+ }
240
+ }
241
+ _handleDragEnd(e) {
242
+ const thumb = this._dragAxis === 'y' ? this.thumbY : this.thumbX;
243
+ const track = this._dragAxis === 'y' ? this.trackY : this.trackX;
244
+ this._isDragging = false;
245
+ thumb.releasePointerCapture(e.pointerId);
246
+ track?.classList.remove('dragging');
247
+ thumb.removeEventListener('pointermove', this._onDragMove);
248
+ thumb.removeEventListener('pointerup', this._onDragEnd);
249
+ thumb.removeEventListener('pointercancel', this._onDragEnd);
250
+ this._showScrollbars();
251
+ }
252
+ _handleTrackYDown(e) {
253
+ if (e.target === this.thumbY || e.button !== 0)
254
+ return;
255
+ e.preventDefault();
256
+ const trackRect = this.trackY.getBoundingClientRect();
257
+ const clickRatio = (e.clientY - trackRect.top) / trackRect.height;
258
+ const { scrollHeight, clientHeight } = this._scrollEl;
259
+ this._scrollEl.scrollTo({
260
+ top: clickRatio * (scrollHeight - clientHeight),
261
+ behavior: 'smooth'
262
+ });
263
+ }
264
+ _handleTrackXDown(e) {
265
+ if (e.target === this.thumbX || e.button !== 0)
266
+ return;
267
+ e.preventDefault();
268
+ const trackRect = this.trackX.getBoundingClientRect();
269
+ const clickRatio = (e.clientX - trackRect.left) / trackRect.width;
270
+ const { scrollWidth, clientWidth } = this._scrollEl;
271
+ this._scrollEl.scrollTo({
272
+ left: clickRatio * (scrollWidth - clientWidth),
273
+ behavior: 'smooth'
274
+ });
275
+ }
276
276
  }
@@ -1,17 +1,17 @@
1
1
  import { FLAVORS } from '../types/common.js';
2
2
  export function syncCustomFlavorSheet(shadow, sheet, flavor, css) {
3
- const full = String(flavor || '');
4
- const base = full.replace(/[+-]$/, '');
5
- if (FLAVORS.includes(base) || !/^[A-Za-z][A-Za-z0-9_-]*$/.test(base)) {
6
- if (sheet) {
7
- shadow.adoptedStyleSheets = shadow.adoptedStyleSheets.filter((s) => s !== sheet);
8
- }
9
- return null;
10
- }
11
- if (!sheet) {
12
- sheet = new CSSStyleSheet();
13
- shadow.adoptedStyleSheets = [...shadow.adoptedStyleSheets, sheet];
14
- }
15
- sheet.replaceSync(css({ flavor: full, base, shade: full.slice(base.length) }));
16
- return sheet;
3
+ const full = String(flavor || '');
4
+ const base = full.replace(/[+-]$/, '');
5
+ if (FLAVORS.includes(base) || !/^[A-Za-z][A-Za-z0-9_-]*$/.test(base)) {
6
+ if (sheet) {
7
+ shadow.adoptedStyleSheets = shadow.adoptedStyleSheets.filter((s) => s !== sheet);
8
+ }
9
+ return null;
10
+ }
11
+ if (!sheet) {
12
+ sheet = new CSSStyleSheet();
13
+ shadow.adoptedStyleSheets = [...shadow.adoptedStyleSheets, sheet];
14
+ }
15
+ sheet.replaceSync(css({ flavor: full, base, shade: full.slice(base.length) }));
16
+ return sheet;
17
17
  }