tyrell-components 1.0.0-RC14 → 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 (113) hide show
  1. package/README.md +9 -1
  2. package/css/tyrell-theme.css +25 -2
  3. package/css/tyrell.css +4 -0
  4. package/dist/tyrell-colors-static.css +1 -316
  5. package/dist/tyrell-theme.css +1 -1443
  6. package/dist/tyrell.css +1 -1390
  7. package/dist/tyrell.js +1 -1
  8. package/lib/base/ty-component.js +196 -196
  9. package/lib/components/button.d.ts +1 -1
  10. package/lib/components/button.js +261 -259
  11. package/lib/components/calendar-month.d.ts +2 -2
  12. package/lib/components/calendar-month.js +439 -416
  13. package/lib/components/calendar-navigation.js +238 -238
  14. package/lib/components/calendar.d.ts +5 -3
  15. package/lib/components/calendar.js +611 -602
  16. package/lib/components/checkbox.d.ts +1 -1
  17. package/lib/components/checkbox.js +273 -272
  18. package/lib/components/copy.d.ts +1 -1
  19. package/lib/components/copy.js +280 -278
  20. package/lib/components/date-picker.d.ts +8 -1
  21. package/lib/components/date-picker.js +1128 -1108
  22. package/lib/components/file-upload.js +404 -404
  23. package/lib/components/icon.js +141 -141
  24. package/lib/components/input.d.ts +1 -1
  25. package/lib/components/input.js +593 -596
  26. package/lib/components/modal.js +319 -319
  27. package/lib/components/option.js +167 -167
  28. package/lib/components/popup.js +233 -233
  29. package/lib/components/radio.d.ts +2 -2
  30. package/lib/components/radio.js +407 -406
  31. package/lib/components/resize-observer.js +67 -67
  32. package/lib/components/scroll-container.js +292 -294
  33. package/lib/components/select.d.ts +71 -12
  34. package/lib/components/select.js +1605 -1529
  35. package/lib/components/selected-tags.d.ts +1 -1
  36. package/lib/components/selected-tags.js +188 -182
  37. package/lib/components/step.js +62 -62
  38. package/lib/components/switch.d.ts +1 -1
  39. package/lib/components/switch.js +214 -213
  40. package/lib/components/tab.js +62 -62
  41. package/lib/components/tabs.d.ts +1 -0
  42. package/lib/components/tabs.js +523 -492
  43. package/lib/components/tag.d.ts +1 -1
  44. package/lib/components/tag.js +236 -235
  45. package/lib/components/textarea.d.ts +1 -1
  46. package/lib/components/textarea.js +457 -456
  47. package/lib/components/tooltip.js +283 -283
  48. package/lib/components/wizard.js +384 -384
  49. package/lib/icons/heroicons/micro.js +392 -392
  50. package/lib/icons/heroicons/mini.js +382 -382
  51. package/lib/icons/heroicons/outline.js +337 -337
  52. package/lib/icons/heroicons/solid.js +407 -407
  53. package/lib/icons/lucide.js +22843 -22843
  54. package/lib/icons/material/filled.js +9653 -9653
  55. package/lib/icons/material/outlined.js +10271 -10271
  56. package/lib/icons/material/round.js +10495 -10495
  57. package/lib/icons/material/sharp.js +9905 -9905
  58. package/lib/icons/material/two-tone.js +12792 -12792
  59. package/lib/index.js +21 -21
  60. package/lib/styles/button.js +200 -302
  61. package/lib/styles/calendar-month.js +123 -183
  62. package/lib/styles/calendar-navigation.d.ts +1 -1
  63. package/lib/styles/calendar-navigation.js +64 -79
  64. package/lib/styles/calendar.d.ts +1 -1
  65. package/lib/styles/calendar.js +9 -9
  66. package/lib/styles/checkbox.js +45 -72
  67. package/lib/styles/copy.js +67 -91
  68. package/lib/styles/custom-scrollbar.js +80 -100
  69. package/lib/styles/date-picker.js +261 -331
  70. package/lib/styles/field-size.d.ts +6 -0
  71. package/lib/styles/field-size.js +91 -0
  72. package/lib/styles/file-upload.js +139 -169
  73. package/lib/styles/icon.js +92 -156
  74. package/lib/styles/input.js +125 -241
  75. package/lib/styles/modal.js +67 -102
  76. package/lib/styles/option.d.ts +1 -1
  77. package/lib/styles/option.js +47 -67
  78. package/lib/styles/popup.js +34 -65
  79. package/lib/styles/radio.js +69 -96
  80. package/lib/styles/resize-observer.js +2 -5
  81. package/lib/styles/scroll-container.js +100 -130
  82. package/lib/styles/select-base.js +596 -773
  83. package/lib/styles/select.js +140 -228
  84. package/lib/styles/step.js +22 -29
  85. package/lib/styles/switch.js +34 -55
  86. package/lib/styles/tab.d.ts +1 -1
  87. package/lib/styles/tab.js +22 -29
  88. package/lib/styles/tabs.d.ts +1 -1
  89. package/lib/styles/tabs.js +186 -180
  90. package/lib/styles/tag.js +135 -188
  91. package/lib/styles/textarea.d.ts +1 -1
  92. package/lib/styles/textarea.js +205 -271
  93. package/lib/styles/tooltip.js +3 -3
  94. package/lib/styles/wizard.js +170 -226
  95. package/lib/types/common.d.ts +2 -0
  96. package/lib/types/common.js +6 -5
  97. package/lib/utils/calendar-utils.js +100 -100
  98. package/lib/utils/custom-scrollbar.js +272 -272
  99. package/lib/utils/flavor-sheet.js +14 -14
  100. package/lib/utils/icon-registry.js +127 -127
  101. package/lib/utils/loader-registry.js +3 -3
  102. package/lib/utils/locale.js +34 -34
  103. package/lib/utils/mobile.js +1 -1
  104. package/lib/utils/number-format.js +54 -54
  105. package/lib/utils/positioning.js +212 -212
  106. package/lib/utils/property-capture.js +36 -36
  107. package/lib/utils/property-manager.js +125 -125
  108. package/lib/utils/resize-observer.js +23 -23
  109. package/lib/utils/scroll-lock.js +57 -57
  110. package/lib/utils/styles.js +17 -17
  111. package/lib/version.d.ts +1 -1
  112. package/lib/version.js +1 -1
  113. package/package.json +4 -4
@@ -7,336 +7,336 @@ const timeoutState = new WeakMap();
7
7
  const popoverElements = new WeakMap();
8
8
  const anchorElements = new WeakMap();
9
9
  function validateFlavor(flavor) {
10
- const full = flavor || 'dark';
11
- const base = full.replace(/[+-]$/, '');
12
- return /^[A-Za-z][A-Za-z0-9_-]*$/.test(base) ? full : 'dark';
10
+ const full = flavor || 'dark';
11
+ const base = full.replace(/[+-]$/, '');
12
+ return /^[A-Za-z][A-Za-z0-9_-]*$/.test(base) ? full : 'dark';
13
13
  }
14
14
  function getTimeoutState(el) {
15
- let state = timeoutState.get(el);
16
- if (!state) {
17
- state = { showTimeout: null, hideTimeout: null };
18
- timeoutState.set(el, state);
19
- }
20
- return state;
15
+ let state = timeoutState.get(el);
16
+ if (!state) {
17
+ state = { showTimeout: null, hideTimeout: null };
18
+ timeoutState.set(el, state);
19
+ }
20
+ return state;
21
21
  }
22
22
  function parseBoolAttr(el, name) {
23
- return el.hasAttribute(name);
23
+ return el.hasAttribute(name);
24
24
  }
25
25
  function parseIntAttr(el, name, defaultValue) {
26
- const value = el.getAttribute(name);
27
- if (value === null)
28
- return defaultValue;
29
- const parsed = parseInt(value, 10);
30
- return isNaN(parsed) ? defaultValue : parsed;
26
+ const value = el.getAttribute(name);
27
+ if (value === null)
28
+ return defaultValue;
29
+ const parsed = parseInt(value, 10);
30
+ return isNaN(parsed) ? defaultValue : parsed;
31
31
  }
32
32
  function getTooltipAttributes(el) {
33
- return {
34
- placement: (el.getAttribute('placement') || 'top'),
35
- offset: parseIntAttr(el, 'offset', 8),
36
- delay: parseIntAttr(el, 'delay', 600),
37
- disabled: parseBoolAttr(el, 'disabled'),
38
- flavor: validateFlavor(el.getAttribute('flavor')),
39
- };
33
+ return {
34
+ placement: (el.getAttribute('placement') || 'top'),
35
+ offset: parseIntAttr(el, 'offset', 8),
36
+ delay: parseIntAttr(el, 'delay', 600),
37
+ disabled: parseBoolAttr(el, 'disabled'),
38
+ flavor: validateFlavor(el.getAttribute('flavor')),
39
+ };
40
40
  }
41
41
  function getAnchorElement(el) {
42
- return el.parentElement;
42
+ return el.parentElement;
43
43
  }
44
44
  function addDescribedBy(anchor, id) {
45
- const ids = (anchor.getAttribute('aria-describedby') || '').split(/\s+/).filter(Boolean);
46
- if (!ids.includes(id)) {
47
- ids.push(id);
48
- anchor.setAttribute('aria-describedby', ids.join(' '));
49
- }
45
+ const ids = (anchor.getAttribute('aria-describedby') || '').split(/\s+/).filter(Boolean);
46
+ if (!ids.includes(id)) {
47
+ ids.push(id);
48
+ anchor.setAttribute('aria-describedby', ids.join(' '));
49
+ }
50
50
  }
51
51
  function removeDescribedBy(anchor, id) {
52
- const ids = (anchor.getAttribute('aria-describedby') || '').split(/\s+/).filter((x) => x && x !== id);
53
- if (ids.length > 0) {
54
- anchor.setAttribute('aria-describedby', ids.join(' '));
55
- }
56
- else {
57
- anchor.removeAttribute('aria-describedby');
58
- }
52
+ const ids = (anchor.getAttribute('aria-describedby') || '').split(/\s+/).filter((x) => x && x !== id);
53
+ if (ids.length > 0) {
54
+ anchor.setAttribute('aria-describedby', ids.join(' '));
55
+ }
56
+ else {
57
+ anchor.removeAttribute('aria-describedby');
58
+ }
59
59
  }
60
60
  function ensureTooltipMotionStyles() {
61
- if (document.getElementById('ty-tooltip-motion'))
62
- return;
63
- const style = document.createElement('style');
64
- style.id = 'ty-tooltip-motion';
65
- style.textContent = `
61
+ if (document.getElementById('ty-tooltip-motion'))
62
+ return;
63
+ const style = document.createElement('style');
64
+ style.id = 'ty-tooltip-motion';
65
+ style.textContent = `
66
66
  .ty-tooltip-popover:popover-open {
67
- transition:
68
- opacity var(--ty-tooltip-duration, 120ms) ease-out,
69
- translate var(--ty-tooltip-duration, 120ms) ease-out;
67
+ transition:
68
+ opacity var(--ty-tooltip-duration, 120ms) ease-out,
69
+ translate var(--ty-tooltip-duration, 120ms) ease-out;
70
70
  }
71
71
  @starting-style {
72
- .ty-tooltip-popover:popover-open { opacity: 0; translate: 0 4px; }
73
- .ty-tooltip-popover:popover-open[data-side="bottom"] { translate: 0 -4px; }
74
- .ty-tooltip-popover:popover-open[data-side="left"] { translate: 4px 0; }
75
- .ty-tooltip-popover:popover-open[data-side="right"] { translate: -4px 0; }
72
+ .ty-tooltip-popover:popover-open { opacity: 0; translate: 0 4px; }
73
+ .ty-tooltip-popover:popover-open[data-side="bottom"] { translate: 0 -4px; }
74
+ .ty-tooltip-popover:popover-open[data-side="left"] { translate: 4px 0; }
75
+ .ty-tooltip-popover:popover-open[data-side="right"] { translate: -4px 0; }
76
76
  }
77
77
  `;
78
- document.head.appendChild(style);
78
+ document.head.appendChild(style);
79
79
  }
80
80
  function getOrCreatePopover(el) {
81
- ensureTooltipMotionStyles();
82
- let popover = popoverElements.get(el);
83
- if (!popover) {
84
- popover = document.createElement('div');
85
- popover.id = `ty-tooltip-${Math.random().toString(36).slice(2, 11)}`;
86
- popover.setAttribute('popover', 'manual');
87
- popover.setAttribute('role', 'tooltip');
88
- popover.className = 'ty-tooltip-popover';
89
- const styles = `
90
- position: fixed;
91
- margin: 0;
92
- padding: 8px 12px;
93
- background: var(--ty-tooltip-bg, #262626);
94
- color: var(--ty-tooltip-color, #f5f5f5);
95
- border: none;
96
- border-radius: 6px;
97
- font-size: var(--ty-font-xs, 12px);
98
- font-weight: var(--ty-font-semibold, 600);
99
- line-height: 1.5;
100
- max-width: 250px;
101
- text-align: center;
102
- box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.2), 0 4px 6px -4px rgba(0, 0, 0, 0.1);
103
- user-select: none;
104
- pointer-events: none;
105
- `;
106
- popover.style.cssText = styles;
107
- document.body.appendChild(popover);
108
- popoverElements.set(el, popover);
109
- const anchor = anchorElements.get(el);
110
- if (anchor)
111
- addDescribedBy(anchor, popover.id);
112
- }
113
- const { flavor } = getTooltipAttributes(el);
114
- popover.setAttribute('data-flavor', flavor);
115
- popover.innerHTML = el.innerHTML;
116
- applyFlavorStyles(popover, flavor);
117
- return popover;
81
+ ensureTooltipMotionStyles();
82
+ let popover = popoverElements.get(el);
83
+ if (!popover) {
84
+ popover = document.createElement('div');
85
+ popover.id = `ty-tooltip-${Math.random().toString(36).slice(2, 11)}`;
86
+ popover.setAttribute('popover', 'manual');
87
+ popover.setAttribute('role', 'tooltip');
88
+ popover.className = 'ty-tooltip-popover';
89
+ const styles = `
90
+ position: fixed;
91
+ margin: 0;
92
+ padding: 8px 12px;
93
+ background: var(--ty-tooltip-bg, #262626);
94
+ color: var(--ty-tooltip-color, #f5f5f5);
95
+ border: none;
96
+ border-radius: 6px;
97
+ font-size: var(--ty-font-xs, 12px);
98
+ font-weight: var(--ty-font-semibold, 600);
99
+ line-height: 1.5;
100
+ max-width: 250px;
101
+ text-align: center;
102
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.2), 0 4px 6px -4px rgba(0, 0, 0, 0.1);
103
+ user-select: none;
104
+ pointer-events: none;
105
+ `;
106
+ popover.style.cssText = styles;
107
+ document.body.appendChild(popover);
108
+ popoverElements.set(el, popover);
109
+ const anchor = anchorElements.get(el);
110
+ if (anchor)
111
+ addDescribedBy(anchor, popover.id);
112
+ }
113
+ const { flavor } = getTooltipAttributes(el);
114
+ popover.setAttribute('data-flavor', flavor);
115
+ popover.innerHTML = el.innerHTML;
116
+ applyFlavorStyles(popover, flavor);
117
+ return popover;
118
118
  }
119
119
  function applyFlavorStyles(popover, flavor) {
120
- popover.style.removeProperty('background');
121
- popover.style.removeProperty('color');
122
- popover.style.removeProperty('border-color');
123
- switch (flavor) {
124
- case 'dark':
125
- popover.style.background = 'var(--ty-tooltip-bg, #262626)';
126
- popover.style.color = 'var(--ty-tooltip-color, #f5f5f5)';
127
- popover.style.borderColor = 'var(--ty-tooltip-border, #404040)';
128
- break;
129
- case 'light':
130
- popover.style.background = 'var(--ty-surface-elevated, #ffffff)';
131
- popover.style.color = 'var(--ty-text-strong, #111827)';
132
- popover.style.borderColor = 'var(--ty-border, #e5e7eb)';
133
- break;
134
- case 'info':
135
- popover.style.background = 'var(--ty-bg-info, #06b6d4)';
136
- popover.style.color = 'var(--ty-text-strong, #f0f9ff)';
137
- popover.style.borderColor = 'var(--ty-border-info, #22d3ee)';
138
- break;
139
- default: {
140
- const base = flavor.replace(/[+-]$/, '');
141
- const shade = flavor.slice(base.length);
142
- const bgSfx = shade === '+' ? '-bold' : shade === '-' ? '-soft' : '';
143
- popover.style.background = `var(--ty-bg-${base}${bgSfx}, var(--ty-bg-neutral))`;
144
- popover.style.color = `var(--ty-color-${base}-strong, var(--ty-color-neutral-strong))`;
145
- popover.style.borderColor = `var(--ty-border-${base}, var(--ty-color-${base}))`;
146
- break;
147
- }
148
- }
120
+ popover.style.removeProperty('background');
121
+ popover.style.removeProperty('color');
122
+ popover.style.removeProperty('border-color');
123
+ switch (flavor) {
124
+ case 'dark':
125
+ popover.style.background = 'var(--ty-tooltip-bg, #262626)';
126
+ popover.style.color = 'var(--ty-tooltip-color, #f5f5f5)';
127
+ popover.style.borderColor = 'var(--ty-tooltip-border, #404040)';
128
+ break;
129
+ case 'light':
130
+ popover.style.background = 'var(--ty-surface-elevated, #ffffff)';
131
+ popover.style.color = 'var(--ty-text-strong, #111827)';
132
+ popover.style.borderColor = 'var(--ty-border, #e5e7eb)';
133
+ break;
134
+ case 'info':
135
+ popover.style.background = 'var(--ty-bg-info, #06b6d4)';
136
+ popover.style.color = 'var(--ty-text-strong, #f0f9ff)';
137
+ popover.style.borderColor = 'var(--ty-border-info, #22d3ee)';
138
+ break;
139
+ default: {
140
+ const base = flavor.replace(/[+-]$/, '');
141
+ const shade = flavor.slice(base.length);
142
+ const bgSfx = shade === '+' ? '-bold' : shade === '-' ? '-soft' : '';
143
+ popover.style.background = `var(--ty-bg-${base}${bgSfx}, var(--ty-bg-neutral))`;
144
+ popover.style.color = `var(--ty-color-${base}-strong, var(--ty-color-neutral-strong))`;
145
+ popover.style.borderColor = `var(--ty-border-${base}, var(--ty-color-${base}))`;
146
+ break;
147
+ }
148
+ }
149
149
  }
150
150
  function updatePosition(el) {
151
- const { placement, offset } = getTooltipAttributes(el);
152
- const anchor = getAnchorElement(el);
153
- const popover = popoverElements.get(el);
154
- if (!anchor || !popover) {
155
- console.warn('[ty-tooltip] updatePosition: missing anchor or popover');
156
- return;
157
- }
158
- const preferences = preferenceChain(placement);
159
- const position = findBestPosition({
160
- targetEl: anchor,
161
- floatingEl: popover,
162
- preferences,
163
- offset,
164
- });
165
- popover.style.left = `${position.x}px`;
166
- popover.style.top = `${position.y}px`;
167
- popover.dataset.side = position.placement.split('-')[0];
151
+ const { placement, offset } = getTooltipAttributes(el);
152
+ const anchor = getAnchorElement(el);
153
+ const popover = popoverElements.get(el);
154
+ if (!anchor || !popover) {
155
+ console.warn('[ty-tooltip] updatePosition: missing anchor or popover');
156
+ return;
157
+ }
158
+ const preferences = preferenceChain(placement);
159
+ const position = findBestPosition({
160
+ targetEl: anchor,
161
+ floatingEl: popover,
162
+ preferences,
163
+ offset,
164
+ });
165
+ popover.style.left = `${position.x}px`;
166
+ popover.style.top = `${position.y}px`;
167
+ popover.dataset.side = position.placement.split('-')[0];
168
168
  }
169
169
  function cleanupAutoUpdate(el) {
170
- const cleanup = autoUpdateCleanup.get(el);
171
- if (cleanup) {
172
- cleanup();
173
- autoUpdateCleanup.delete(el);
174
- }
170
+ const cleanup = autoUpdateCleanup.get(el);
171
+ if (cleanup) {
172
+ cleanup();
173
+ autoUpdateCleanup.delete(el);
174
+ }
175
175
  }
176
176
  function setupAutoUpdate(el) {
177
- const anchor = getAnchorElement(el);
178
- const popover = popoverElements.get(el);
179
- if (!anchor || !popover) {
180
- console.warn('[ty-tooltip] setupAutoUpdate: missing anchor or popover');
181
- return;
182
- }
183
- let timeoutId = null;
184
- const debouncedUpdate = () => {
185
- if (timeoutId !== null) {
186
- clearTimeout(timeoutId);
187
- }
188
- timeoutId = window.setTimeout(() => {
189
- timeoutId = null;
190
- updatePosition(el);
191
- }, 10);
192
- };
193
- const resizeObserver = new ResizeObserver(debouncedUpdate);
194
- resizeObserver.observe(anchor);
195
- resizeObserver.observe(popover);
196
- let scrollRafId = null;
197
- const handleScroll = () => {
198
- if (scrollRafId === null) {
199
- scrollRafId = requestAnimationFrame(() => {
200
- scrollRafId = null;
201
- updatePosition(el);
202
- });
203
- }
204
- };
205
- window.addEventListener('scroll', handleScroll, true);
206
- window.addEventListener('resize', debouncedUpdate);
207
- const cleanup = () => {
208
- resizeObserver.disconnect();
209
- window.removeEventListener('scroll', handleScroll, true);
210
- window.removeEventListener('resize', debouncedUpdate);
211
- if (timeoutId !== null) {
212
- clearTimeout(timeoutId);
213
- }
214
- if (scrollRafId !== null) {
215
- cancelAnimationFrame(scrollRafId);
216
- }
217
- };
218
- autoUpdateCleanup.set(el, cleanup);
177
+ const anchor = getAnchorElement(el);
178
+ const popover = popoverElements.get(el);
179
+ if (!anchor || !popover) {
180
+ console.warn('[ty-tooltip] setupAutoUpdate: missing anchor or popover');
181
+ return;
182
+ }
183
+ let timeoutId = null;
184
+ const debouncedUpdate = () => {
185
+ if (timeoutId !== null) {
186
+ clearTimeout(timeoutId);
187
+ }
188
+ timeoutId = window.setTimeout(() => {
189
+ timeoutId = null;
190
+ updatePosition(el);
191
+ }, 10);
192
+ };
193
+ const resizeObserver = new ResizeObserver(debouncedUpdate);
194
+ resizeObserver.observe(anchor);
195
+ resizeObserver.observe(popover);
196
+ let scrollRafId = null;
197
+ const handleScroll = () => {
198
+ if (scrollRafId === null) {
199
+ scrollRafId = requestAnimationFrame(() => {
200
+ scrollRafId = null;
201
+ updatePosition(el);
202
+ });
203
+ }
204
+ };
205
+ window.addEventListener('scroll', handleScroll, true);
206
+ window.addEventListener('resize', debouncedUpdate);
207
+ const cleanup = () => {
208
+ resizeObserver.disconnect();
209
+ window.removeEventListener('scroll', handleScroll, true);
210
+ window.removeEventListener('resize', debouncedUpdate);
211
+ if (timeoutId !== null) {
212
+ clearTimeout(timeoutId);
213
+ }
214
+ if (scrollRafId !== null) {
215
+ cancelAnimationFrame(scrollRafId);
216
+ }
217
+ };
218
+ autoUpdateCleanup.set(el, cleanup);
219
219
  }
220
220
  function clearTimeouts(el) {
221
- const state = getTimeoutState(el);
222
- if (state.showTimeout !== null) {
223
- clearTimeout(state.showTimeout);
224
- state.showTimeout = null;
225
- }
226
- if (state.hideTimeout !== null) {
227
- clearTimeout(state.hideTimeout);
228
- state.hideTimeout = null;
229
- }
221
+ const state = getTimeoutState(el);
222
+ if (state.showTimeout !== null) {
223
+ clearTimeout(state.showTimeout);
224
+ state.showTimeout = null;
225
+ }
226
+ if (state.hideTimeout !== null) {
227
+ clearTimeout(state.hideTimeout);
228
+ state.hideTimeout = null;
229
+ }
230
230
  }
231
231
  function showTooltip(el) {
232
- const { disabled } = getTooltipAttributes(el);
233
- if (disabled)
234
- return;
235
- const popover = getOrCreatePopover(el);
236
- try {
237
- popover.showPopover();
238
- el._open = true;
239
- updatePosition(el);
240
- setupAutoUpdate(el);
241
- }
242
- catch (e) {
243
- console.warn('[ty-tooltip] Failed to show popover', e);
244
- }
232
+ const { disabled } = getTooltipAttributes(el);
233
+ if (disabled)
234
+ return;
235
+ const popover = getOrCreatePopover(el);
236
+ try {
237
+ popover.showPopover();
238
+ el._open = true;
239
+ updatePosition(el);
240
+ setupAutoUpdate(el);
241
+ }
242
+ catch (e) {
243
+ console.warn('[ty-tooltip] Failed to show popover', e);
244
+ }
245
245
  }
246
246
  function hideTooltip(el) {
247
- const popover = popoverElements.get(el);
248
- if (!popover)
249
- return;
250
- try {
251
- popover.hidePopover();
252
- el._open = false;
253
- cleanupAutoUpdate(el);
254
- }
255
- catch (e) {
256
- }
247
+ const popover = popoverElements.get(el);
248
+ if (!popover)
249
+ return;
250
+ try {
251
+ popover.hidePopover();
252
+ el._open = false;
253
+ cleanupAutoUpdate(el);
254
+ }
255
+ catch (e) {
256
+ }
257
257
  }
258
258
  function scheduleShow(el) {
259
- const state = getTimeoutState(el);
260
- const { delay } = getTooltipAttributes(el);
261
- clearTimeouts(el);
262
- state.showTimeout = window.setTimeout(() => showTooltip(el), delay);
259
+ const state = getTimeoutState(el);
260
+ const { delay } = getTooltipAttributes(el);
261
+ clearTimeouts(el);
262
+ state.showTimeout = window.setTimeout(() => showTooltip(el), delay);
263
263
  }
264
264
  function scheduleHide(el) {
265
- const state = getTimeoutState(el);
266
- clearTimeouts(el);
267
- state.hideTimeout = window.setTimeout(() => hideTooltip(el), 200);
265
+ const state = getTimeoutState(el);
266
+ clearTimeouts(el);
267
+ state.hideTimeout = window.setTimeout(() => hideTooltip(el), 200);
268
268
  }
269
269
  function setupEvents(el) {
270
- const anchor = getAnchorElement(el);
271
- if (!anchor)
272
- return;
273
- anchorElements.set(el, anchor);
274
- const handleEnter = () => scheduleShow(el);
275
- const handleLeave = () => scheduleHide(el);
276
- const handleFocus = () => scheduleShow(el);
277
- const handleBlur = () => scheduleHide(el);
278
- anchor.addEventListener('mouseenter', handleEnter);
279
- anchor.addEventListener('mouseleave', handleLeave);
280
- anchor.addEventListener('focusin', handleFocus);
281
- anchor.addEventListener('focusout', handleBlur);
282
- eventCleanup.set(el, () => {
283
- anchor.removeEventListener('mouseenter', handleEnter);
284
- anchor.removeEventListener('mouseleave', handleLeave);
285
- anchor.removeEventListener('focusin', handleFocus);
286
- anchor.removeEventListener('focusout', handleBlur);
287
- });
270
+ const anchor = getAnchorElement(el);
271
+ if (!anchor)
272
+ return;
273
+ anchorElements.set(el, anchor);
274
+ const handleEnter = () => scheduleShow(el);
275
+ const handleLeave = () => scheduleHide(el);
276
+ const handleFocus = () => scheduleShow(el);
277
+ const handleBlur = () => scheduleHide(el);
278
+ anchor.addEventListener('mouseenter', handleEnter);
279
+ anchor.addEventListener('mouseleave', handleLeave);
280
+ anchor.addEventListener('focusin', handleFocus);
281
+ anchor.addEventListener('focusout', handleBlur);
282
+ eventCleanup.set(el, () => {
283
+ anchor.removeEventListener('mouseenter', handleEnter);
284
+ anchor.removeEventListener('mouseleave', handleLeave);
285
+ anchor.removeEventListener('focusin', handleFocus);
286
+ anchor.removeEventListener('focusout', handleBlur);
287
+ });
288
288
  }
289
289
  function cleanup(el) {
290
- clearTimeouts(el);
291
- cleanupAutoUpdate(el);
292
- const eventsCleanup = eventCleanup.get(el);
293
- if (eventsCleanup) {
294
- eventsCleanup();
295
- eventCleanup.delete(el);
296
- }
297
- const popover = popoverElements.get(el);
298
- const anchor = anchorElements.get(el);
299
- if (popover && anchor) {
300
- removeDescribedBy(anchor, popover.id);
301
- }
302
- if (popover) {
303
- popover.remove();
304
- popoverElements.delete(el);
305
- }
306
- anchorElements.delete(el);
307
- timeoutState.delete(el);
290
+ clearTimeouts(el);
291
+ cleanupAutoUpdate(el);
292
+ const eventsCleanup = eventCleanup.get(el);
293
+ if (eventsCleanup) {
294
+ eventsCleanup();
295
+ eventCleanup.delete(el);
296
+ }
297
+ const popover = popoverElements.get(el);
298
+ const anchor = anchorElements.get(el);
299
+ if (popover && anchor) {
300
+ removeDescribedBy(anchor, popover.id);
301
+ }
302
+ if (popover) {
303
+ popover.remove();
304
+ popoverElements.delete(el);
305
+ }
306
+ anchorElements.delete(el);
307
+ timeoutState.delete(el);
308
308
  }
309
309
  export class TyTooltip extends HTMLElement {
310
- static get observedAttributes() {
311
- return ['placement', 'offset', 'delay', 'disabled', 'flavor'];
312
- }
313
- constructor() {
314
- super();
315
- this._open = false;
316
- this.attachShadow({ mode: 'open' });
317
- }
318
- connectedCallback() {
319
- this._open = false;
320
- ensureStyles(this.shadowRoot, tooltipStyles);
321
- setupEvents(this);
322
- getOrCreatePopover(this);
323
- }
324
- disconnectedCallback() {
325
- cleanup(this);
326
- }
327
- attributeChangedCallback(name, _oldValue, newValue) {
328
- if (name === 'flavor') {
329
- const popover = popoverElements.get(this);
330
- if (popover) {
331
- const flavor = validateFlavor(newValue);
332
- applyFlavorStyles(popover, flavor);
333
- }
334
- }
335
- if (name === 'disabled' && newValue !== null) {
336
- hideTooltip(this);
337
- }
338
- }
310
+ static get observedAttributes() {
311
+ return ['placement', 'offset', 'delay', 'disabled', 'flavor'];
312
+ }
313
+ constructor() {
314
+ super();
315
+ this._open = false;
316
+ this.attachShadow({ mode: 'open' });
317
+ }
318
+ connectedCallback() {
319
+ this._open = false;
320
+ ensureStyles(this.shadowRoot, tooltipStyles);
321
+ setupEvents(this);
322
+ getOrCreatePopover(this);
323
+ }
324
+ disconnectedCallback() {
325
+ cleanup(this);
326
+ }
327
+ attributeChangedCallback(name, _oldValue, newValue) {
328
+ if (name === 'flavor') {
329
+ const popover = popoverElements.get(this);
330
+ if (popover) {
331
+ const flavor = validateFlavor(newValue);
332
+ applyFlavorStyles(popover, flavor);
333
+ }
334
+ }
335
+ if (name === 'disabled' && newValue !== null) {
336
+ hideTooltip(this);
337
+ }
338
+ }
339
339
  }
340
340
  if (!customElements.get('ty-tooltip')) {
341
- customElements.define('ty-tooltip', TyTooltip);
341
+ customElements.define('ty-tooltip', TyTooltip);
342
342
  }