@cdevhub/ngx-tw 0.2.0
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.
- package/LICENSE +21 -0
- package/README.md +134 -0
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs +108 -0
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-alert.mjs +240 -0
- package/fesm2022/cdevhub-ngx-tw-alert.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs +287 -0
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-badge.mjs +332 -0
- package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +452 -0
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-button.mjs +227 -0
- package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +417 -0
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs +232 -0
- package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs +4482 -0
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-card.mjs +157 -0
- package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs +1454 -0
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +593 -0
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs +228 -0
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +510 -0
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs +1721 -0
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +721 -0
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-core.mjs +861 -0
- package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +1558 -0
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +1833 -0
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs +693 -0
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +331 -0
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +289 -0
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs +572 -0
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs +36 -0
- package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-icon.mjs +278 -0
- package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-input.mjs +355 -0
- package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-item.mjs +241 -0
- package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-menu.mjs +433 -0
- package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs +691 -0
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-popover.mjs +678 -0
- package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +335 -0
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-radio.mjs +708 -0
- package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +319 -0
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-select.mjs +1722 -0
- package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-separator.mjs +115 -0
- package/fesm2022/cdevhub-ngx-tw-separator.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs +768 -0
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-skeleton.mjs +149 -0
- package/fesm2022/cdevhub-ngx-tw-skeleton.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-slider.mjs +1147 -0
- package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-sort.mjs +346 -0
- package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-spinner.mjs +186 -0
- package/fesm2022/cdevhub-ngx-tw-spinner.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-split.mjs +1082 -0
- package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-stat.mjs +579 -0
- package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs +443 -0
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-switch.mjs +391 -0
- package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +315 -0
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-table.mjs +994 -0
- package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs +508 -0
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs +147 -0
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-theme.mjs +178 -0
- package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +1344 -0
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs +1136 -0
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-toast.mjs +1311 -0
- package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +533 -0
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw.mjs +61 -0
- package/fesm2022/cdevhub-ngx-tw.mjs.map +1 -0
- package/package.json +265 -0
- package/theme/_base.css +394 -0
- package/theme/_dark.css +510 -0
- package/theme/_high-contrast.css +290 -0
- package/theme/_semantic.css +317 -0
- package/theme/_typography.css +9 -0
- package/theme/index.css +54 -0
- package/types/cdevhub-ngx-tw-accordion.d.ts +48 -0
- package/types/cdevhub-ngx-tw-alert.d.ts +67 -0
- package/types/cdevhub-ngx-tw-avatar.d.ts +79 -0
- package/types/cdevhub-ngx-tw-badge.d.ts +94 -0
- package/types/cdevhub-ngx-tw-breadcrumbs.d.ts +227 -0
- package/types/cdevhub-ngx-tw-button.d.ts +74 -0
- package/types/cdevhub-ngx-tw-calendar-luxon.d.ts +200 -0
- package/types/cdevhub-ngx-tw-calendar-testing.d.ts +113 -0
- package/types/cdevhub-ngx-tw-calendar.d.ts +1704 -0
- package/types/cdevhub-ngx-tw-card.d.ts +48 -0
- package/types/cdevhub-ngx-tw-carousel.d.ts +406 -0
- package/types/cdevhub-ngx-tw-checkbox.d.ts +136 -0
- package/types/cdevhub-ngx-tw-code-block.d.ts +93 -0
- package/types/cdevhub-ngx-tw-collapsible.d.ts +151 -0
- package/types/cdevhub-ngx-tw-combobox.d.ts +389 -0
- package/types/cdevhub-ngx-tw-command-palette.d.ts +215 -0
- package/types/cdevhub-ngx-tw-core.d.ts +719 -0
- package/types/cdevhub-ngx-tw-date-picker.d.ts +317 -0
- package/types/cdevhub-ngx-tw-date-range-picker.d.ts +313 -0
- package/types/cdevhub-ngx-tw-dialog.d.ts +303 -0
- package/types/cdevhub-ngx-tw-empty-state.d.ts +104 -0
- package/types/cdevhub-ngx-tw-flip-card.d.ts +95 -0
- package/types/cdevhub-ngx-tw-form-field.d.ts +210 -0
- package/types/cdevhub-ngx-tw-icon-lucide.d.ts +29 -0
- package/types/cdevhub-ngx-tw-icon.d.ts +134 -0
- package/types/cdevhub-ngx-tw-input.d.ts +110 -0
- package/types/cdevhub-ngx-tw-item.d.ts +70 -0
- package/types/cdevhub-ngx-tw-menu.d.ts +99 -0
- package/types/cdevhub-ngx-tw-paginator.d.ts +305 -0
- package/types/cdevhub-ngx-tw-popover.d.ts +157 -0
- package/types/cdevhub-ngx-tw-progress-bar.d.ts +100 -0
- package/types/cdevhub-ngx-tw-radio.d.ts +174 -0
- package/types/cdevhub-ngx-tw-segmented-control.d.ts +66 -0
- package/types/cdevhub-ngx-tw-select.d.ts +384 -0
- package/types/cdevhub-ngx-tw-separator.d.ts +28 -0
- package/types/cdevhub-ngx-tw-sheet.d.ts +335 -0
- package/types/cdevhub-ngx-tw-skeleton.d.ts +52 -0
- package/types/cdevhub-ngx-tw-slider.d.ts +258 -0
- package/types/cdevhub-ngx-tw-sort.d.ts +136 -0
- package/types/cdevhub-ngx-tw-spinner.d.ts +50 -0
- package/types/cdevhub-ngx-tw-split.d.ts +265 -0
- package/types/cdevhub-ngx-tw-stat.d.ts +140 -0
- package/types/cdevhub-ngx-tw-stepper.d.ts +127 -0
- package/types/cdevhub-ngx-tw-switch.d.ts +88 -0
- package/types/cdevhub-ngx-tw-tab-nav.d.ts +107 -0
- package/types/cdevhub-ngx-tw-table.d.ts +479 -0
- package/types/cdevhub-ngx-tw-tabs.d.ts +121 -0
- package/types/cdevhub-ngx-tw-textarea.d.ts +62 -0
- package/types/cdevhub-ngx-tw-theme.d.ts +106 -0
- package/types/cdevhub-ngx-tw-time-picker.d.ts +303 -0
- package/types/cdevhub-ngx-tw-timeline.d.ts +278 -0
- package/types/cdevhub-ngx-tw-toast.d.ts +388 -0
- package/types/cdevhub-ngx-tw-tooltip.d.ts +95 -0
- package/types/cdevhub-ngx-tw.d.ts +49 -0
|
@@ -0,0 +1,533 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { signal, computed, TemplateRef, ChangeDetectionStrategy, Component, input, output, inject, ElementRef, DestroyRef, effect, Directive } from '@angular/core';
|
|
3
|
+
import { NgTemplateOutlet } from '@angular/common';
|
|
4
|
+
import { Overlay } from '@angular/cdk/overlay';
|
|
5
|
+
import { ComponentPortal } from '@angular/cdk/portal';
|
|
6
|
+
import { AriaDescriber } from '@angular/cdk/a11y';
|
|
7
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
8
|
+
import { tv } from 'tailwind-variants';
|
|
9
|
+
|
|
10
|
+
// ── Variant config ──
|
|
11
|
+
const tooltipVariants = tv({
|
|
12
|
+
slots: {
|
|
13
|
+
wrapper: 'relative pointer-events-none',
|
|
14
|
+
panel: 'rounded-md shadow-md',
|
|
15
|
+
arrow: 'absolute size-2 rotate-45',
|
|
16
|
+
},
|
|
17
|
+
variants: {
|
|
18
|
+
color: {
|
|
19
|
+
primary: {
|
|
20
|
+
panel: 'bg-primary-700 text-on-primary',
|
|
21
|
+
arrow: 'bg-primary-700',
|
|
22
|
+
},
|
|
23
|
+
secondary: {
|
|
24
|
+
panel: 'bg-secondary-700 text-on-secondary',
|
|
25
|
+
arrow: 'bg-secondary-700',
|
|
26
|
+
},
|
|
27
|
+
accent: {
|
|
28
|
+
panel: 'bg-accent-700 text-on-accent',
|
|
29
|
+
arrow: 'bg-accent-700',
|
|
30
|
+
},
|
|
31
|
+
neutral: {
|
|
32
|
+
wrapper: 'drop-shadow-[0_0_0.5px_var(--color-border)] drop-shadow-sm',
|
|
33
|
+
panel: 'bg-surface-overlay text-fg',
|
|
34
|
+
arrow: 'bg-surface-overlay',
|
|
35
|
+
},
|
|
36
|
+
info: {
|
|
37
|
+
panel: 'bg-info-700 text-on-info',
|
|
38
|
+
arrow: 'bg-info-700',
|
|
39
|
+
},
|
|
40
|
+
success: {
|
|
41
|
+
panel: 'bg-success-700 text-on-success',
|
|
42
|
+
arrow: 'bg-success-700',
|
|
43
|
+
},
|
|
44
|
+
warning: {
|
|
45
|
+
panel: 'bg-warning-700 text-on-warning',
|
|
46
|
+
arrow: 'bg-warning-700',
|
|
47
|
+
},
|
|
48
|
+
error: {
|
|
49
|
+
panel: 'bg-error-700 text-on-error',
|
|
50
|
+
arrow: 'bg-error-700',
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
size: {
|
|
54
|
+
xs: {
|
|
55
|
+
panel: 'px-1.5 py-0.5 text-2xs max-w-40',
|
|
56
|
+
},
|
|
57
|
+
sm: {
|
|
58
|
+
panel: 'px-2 py-1 text-xs max-w-48',
|
|
59
|
+
},
|
|
60
|
+
md: {
|
|
61
|
+
panel: 'px-3 py-1.5 text-sm max-w-xs',
|
|
62
|
+
},
|
|
63
|
+
lg: {
|
|
64
|
+
panel: 'px-4 py-2 text-sm max-w-sm',
|
|
65
|
+
},
|
|
66
|
+
xl: {
|
|
67
|
+
panel: 'px-4 py-2 text-base max-w-md',
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
defaultVariants: {
|
|
72
|
+
color: 'neutral',
|
|
73
|
+
size: 'md',
|
|
74
|
+
},
|
|
75
|
+
}, { twMerge: true });
|
|
76
|
+
// ── Position mappings ──
|
|
77
|
+
const POSITION_MAP = {
|
|
78
|
+
top: {
|
|
79
|
+
originX: 'center',
|
|
80
|
+
originY: 'top',
|
|
81
|
+
overlayX: 'center',
|
|
82
|
+
overlayY: 'bottom',
|
|
83
|
+
offsetY: -8,
|
|
84
|
+
},
|
|
85
|
+
'top-start': {
|
|
86
|
+
originX: 'start',
|
|
87
|
+
originY: 'top',
|
|
88
|
+
overlayX: 'start',
|
|
89
|
+
overlayY: 'bottom',
|
|
90
|
+
offsetY: -8,
|
|
91
|
+
},
|
|
92
|
+
'top-end': {
|
|
93
|
+
originX: 'end',
|
|
94
|
+
originY: 'top',
|
|
95
|
+
overlayX: 'end',
|
|
96
|
+
overlayY: 'bottom',
|
|
97
|
+
offsetY: -8,
|
|
98
|
+
},
|
|
99
|
+
bottom: {
|
|
100
|
+
originX: 'center',
|
|
101
|
+
originY: 'bottom',
|
|
102
|
+
overlayX: 'center',
|
|
103
|
+
overlayY: 'top',
|
|
104
|
+
offsetY: 8,
|
|
105
|
+
},
|
|
106
|
+
'bottom-start': {
|
|
107
|
+
originX: 'start',
|
|
108
|
+
originY: 'bottom',
|
|
109
|
+
overlayX: 'start',
|
|
110
|
+
overlayY: 'top',
|
|
111
|
+
offsetY: 8,
|
|
112
|
+
},
|
|
113
|
+
'bottom-end': {
|
|
114
|
+
originX: 'end',
|
|
115
|
+
originY: 'bottom',
|
|
116
|
+
overlayX: 'end',
|
|
117
|
+
overlayY: 'top',
|
|
118
|
+
offsetY: 8,
|
|
119
|
+
},
|
|
120
|
+
left: {
|
|
121
|
+
originX: 'start',
|
|
122
|
+
originY: 'center',
|
|
123
|
+
overlayX: 'end',
|
|
124
|
+
overlayY: 'center',
|
|
125
|
+
offsetX: -8,
|
|
126
|
+
},
|
|
127
|
+
'left-start': {
|
|
128
|
+
originX: 'start',
|
|
129
|
+
originY: 'top',
|
|
130
|
+
overlayX: 'end',
|
|
131
|
+
overlayY: 'top',
|
|
132
|
+
offsetX: -8,
|
|
133
|
+
},
|
|
134
|
+
'left-end': {
|
|
135
|
+
originX: 'start',
|
|
136
|
+
originY: 'bottom',
|
|
137
|
+
overlayX: 'end',
|
|
138
|
+
overlayY: 'bottom',
|
|
139
|
+
offsetX: -8,
|
|
140
|
+
},
|
|
141
|
+
right: {
|
|
142
|
+
originX: 'end',
|
|
143
|
+
originY: 'center',
|
|
144
|
+
overlayX: 'start',
|
|
145
|
+
overlayY: 'center',
|
|
146
|
+
offsetX: 8,
|
|
147
|
+
},
|
|
148
|
+
'right-start': {
|
|
149
|
+
originX: 'end',
|
|
150
|
+
originY: 'top',
|
|
151
|
+
overlayX: 'start',
|
|
152
|
+
overlayY: 'top',
|
|
153
|
+
offsetX: 8,
|
|
154
|
+
},
|
|
155
|
+
'right-end': {
|
|
156
|
+
originX: 'end',
|
|
157
|
+
originY: 'bottom',
|
|
158
|
+
overlayX: 'start',
|
|
159
|
+
overlayY: 'bottom',
|
|
160
|
+
offsetX: 8,
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
const FALLBACK_ORDER = {
|
|
164
|
+
top: ['bottom', 'left', 'right'],
|
|
165
|
+
bottom: ['top', 'left', 'right'],
|
|
166
|
+
left: ['right', 'top', 'bottom'],
|
|
167
|
+
right: ['left', 'top', 'bottom'],
|
|
168
|
+
};
|
|
169
|
+
function buildPositions(preferred) {
|
|
170
|
+
const primary = preferred.split('-')[0];
|
|
171
|
+
const positions = [POSITION_MAP[preferred]];
|
|
172
|
+
const fallbacks = FALLBACK_ORDER[primary] ?? FALLBACK_ORDER['top'];
|
|
173
|
+
for (const fb of fallbacks) {
|
|
174
|
+
positions.push(POSITION_MAP[fb]);
|
|
175
|
+
}
|
|
176
|
+
return positions;
|
|
177
|
+
}
|
|
178
|
+
function resolveArrowDirection(position) {
|
|
179
|
+
if (position.overlayY === 'bottom')
|
|
180
|
+
return 'bottom';
|
|
181
|
+
if (position.overlayY === 'top')
|
|
182
|
+
return 'top';
|
|
183
|
+
if (position.overlayX === 'end')
|
|
184
|
+
return 'right';
|
|
185
|
+
return 'left';
|
|
186
|
+
}
|
|
187
|
+
/** Arrow position classes keyed by which side the arrow sits on. */
|
|
188
|
+
const ARROW_POSITION_CLASSES = {
|
|
189
|
+
bottom: 'left-1/2 -translate-x-1/2 bottom-0 translate-y-1/2',
|
|
190
|
+
top: 'left-1/2 -translate-x-1/2 top-0 -translate-y-1/2',
|
|
191
|
+
right: 'top-1/2 -translate-y-1/2 right-0 translate-x-1/2',
|
|
192
|
+
left: 'top-1/2 -translate-y-1/2 left-0 -translate-x-1/2',
|
|
193
|
+
};
|
|
194
|
+
// ── Internal overlay component (not exported) ──
|
|
195
|
+
let nextTooltipId = 0;
|
|
196
|
+
class TooltipOverlayComponent {
|
|
197
|
+
id = `tw-tooltip-${nextTooltipId++}`;
|
|
198
|
+
content = signal('', ...(ngDevMode ? [{ debugName: "content" }] : /* istanbul ignore next */ []));
|
|
199
|
+
color = signal('neutral', ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
|
|
200
|
+
size = signal('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
201
|
+
showArrow = signal(true, ...(ngDevMode ? [{ debugName: "showArrow" }] : /* istanbul ignore next */ []));
|
|
202
|
+
arrowDirection = signal('bottom', ...(ngDevMode ? [{ debugName: "arrowDirection" }] : /* istanbul ignore next */ []));
|
|
203
|
+
panelClass = signal('', ...(ngDevMode ? [{ debugName: "panelClass" }] : /* istanbul ignore next */ []));
|
|
204
|
+
isTemplate = computed(() => this.content() instanceof TemplateRef, ...(ngDevMode ? [{ debugName: "isTemplate" }] : /* istanbul ignore next */ []));
|
|
205
|
+
templateContent = computed(() => this.content(), ...(ngDevMode ? [{ debugName: "templateContent" }] : /* istanbul ignore next */ []));
|
|
206
|
+
textContent = computed(() => this.content(), ...(ngDevMode ? [{ debugName: "textContent" }] : /* istanbul ignore next */ []));
|
|
207
|
+
variantResult = computed(() => tooltipVariants({ color: this.color(), size: this.size() }), ...(ngDevMode ? [{ debugName: "variantResult" }] : /* istanbul ignore next */ []));
|
|
208
|
+
wrapperClasses = computed(() => this.variantResult().wrapper(), ...(ngDevMode ? [{ debugName: "wrapperClasses" }] : /* istanbul ignore next */ []));
|
|
209
|
+
panelClasses = computed(() => {
|
|
210
|
+
const consumer = this.panelClass();
|
|
211
|
+
return this.variantResult().panel({ class: consumer });
|
|
212
|
+
}, ...(ngDevMode ? [{ debugName: "panelClasses" }] : /* istanbul ignore next */ []));
|
|
213
|
+
arrowClasses = computed(() => {
|
|
214
|
+
const base = this.variantResult().arrow();
|
|
215
|
+
const position = ARROW_POSITION_CLASSES[this.arrowDirection()];
|
|
216
|
+
return `${base} ${position}`;
|
|
217
|
+
}, ...(ngDevMode ? [{ debugName: "arrowClasses" }] : /* istanbul ignore next */ []));
|
|
218
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: TooltipOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
219
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: TooltipOverlayComponent, isStandalone: true, selector: "tw-tooltip-overlay", host: { attributes: { "role": "tooltip" }, properties: { "id": "id", "animate.enter": "\"fade-in\"", "animate.leave": "\"fade-out\"" } }, ngImport: i0, template: `
|
|
220
|
+
<div [class]="wrapperClasses()">
|
|
221
|
+
<div [class]="panelClasses()">
|
|
222
|
+
@if (isTemplate()) {
|
|
223
|
+
<ng-container *ngTemplateOutlet="templateContent()" />
|
|
224
|
+
} @else {
|
|
225
|
+
{{ textContent() }}
|
|
226
|
+
}
|
|
227
|
+
</div>
|
|
228
|
+
@if (showArrow()) {
|
|
229
|
+
<span [class]="arrowClasses()" aria-hidden="true"></span>
|
|
230
|
+
}
|
|
231
|
+
</div>
|
|
232
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
233
|
+
}
|
|
234
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: TooltipOverlayComponent, decorators: [{
|
|
235
|
+
type: Component,
|
|
236
|
+
args: [{
|
|
237
|
+
selector: 'tw-tooltip-overlay',
|
|
238
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
239
|
+
host: {
|
|
240
|
+
role: 'tooltip',
|
|
241
|
+
'[id]': 'id',
|
|
242
|
+
'[animate.enter]': '"fade-in"',
|
|
243
|
+
'[animate.leave]': '"fade-out"',
|
|
244
|
+
},
|
|
245
|
+
imports: [NgTemplateOutlet],
|
|
246
|
+
template: `
|
|
247
|
+
<div [class]="wrapperClasses()">
|
|
248
|
+
<div [class]="panelClasses()">
|
|
249
|
+
@if (isTemplate()) {
|
|
250
|
+
<ng-container *ngTemplateOutlet="templateContent()" />
|
|
251
|
+
} @else {
|
|
252
|
+
{{ textContent() }}
|
|
253
|
+
}
|
|
254
|
+
</div>
|
|
255
|
+
@if (showArrow()) {
|
|
256
|
+
<span [class]="arrowClasses()" aria-hidden="true"></span>
|
|
257
|
+
}
|
|
258
|
+
</div>
|
|
259
|
+
`,
|
|
260
|
+
}]
|
|
261
|
+
}] });
|
|
262
|
+
// ── Tooltip directive ──
|
|
263
|
+
class TooltipDirective {
|
|
264
|
+
/** The tooltip content. Strings render as text; TemplateRef renders via ngTemplateOutlet. */
|
|
265
|
+
twTooltip = input.required(...(ngDevMode ? [{ debugName: "twTooltip" }] : /* istanbul ignore next */ []));
|
|
266
|
+
/** Preferred placement relative to the trigger. CDK handles fallback. Defaults to `'top'`. */
|
|
267
|
+
twTooltipPosition = input('top', ...(ngDevMode ? [{ debugName: "twTooltipPosition" }] : /* istanbul ignore next */ []));
|
|
268
|
+
/** Semantic color palette for the tooltip. Defaults to `'neutral'`. */
|
|
269
|
+
twTooltipColor = input('neutral', ...(ngDevMode ? [{ debugName: "twTooltipColor" }] : /* istanbul ignore next */ []));
|
|
270
|
+
/** Controls padding, font size, and maximum width. Defaults to `'md'`. */
|
|
271
|
+
twTooltipSize = input('md', ...(ngDevMode ? [{ debugName: "twTooltipSize" }] : /* istanbul ignore next */ []));
|
|
272
|
+
/**
|
|
273
|
+
* Milliseconds to wait before showing after trigger. Defaults to `200` — an
|
|
274
|
+
* intent threshold: the trigger must be held long enough that the user reads
|
|
275
|
+
* as "wants the tooltip" rather than a passing graze with the pointer.
|
|
276
|
+
*/
|
|
277
|
+
twTooltipShowDelay = input(200, ...(ngDevMode ? [{ debugName: "twTooltipShowDelay" }] : /* istanbul ignore next */ []));
|
|
278
|
+
/**
|
|
279
|
+
* Milliseconds to wait before hiding after trigger ends. Defaults to `0`
|
|
280
|
+
* (immediate dismiss). The asymmetry with `twTooltipShowDelay` is
|
|
281
|
+
* intentional — show is gated to filter noise, hide is instant so the
|
|
282
|
+
* tooltip never lingers over content the user has moved on from.
|
|
283
|
+
*/
|
|
284
|
+
twTooltipHideDelay = input(0, ...(ngDevMode ? [{ debugName: "twTooltipHideDelay" }] : /* istanbul ignore next */ []));
|
|
285
|
+
/** When true, tooltip never shows. Defaults to `false`. */
|
|
286
|
+
twTooltipDisabled = input(false, ...(ngDevMode ? [{ debugName: "twTooltipDisabled" }] : /* istanbul ignore next */ []));
|
|
287
|
+
// Arrows reinforce the visual association between the floating panel and its trigger
|
|
288
|
+
// and match every other ngx-tw overlay (popover/menu); opt-out is for compact iconic
|
|
289
|
+
// contexts only.
|
|
290
|
+
/** When true, renders an arrow pointing to the trigger. Defaults to `true`. */
|
|
291
|
+
twTooltipArrow = input(true, ...(ngDevMode ? [{ debugName: "twTooltipArrow" }] : /* istanbul ignore next */ []));
|
|
292
|
+
/** Optional class string (space-separated) merged into the panel slot for consumer customization. */
|
|
293
|
+
twTooltipPanelClass = input('', ...(ngDevMode ? [{ debugName: "twTooltipPanelClass" }] : /* istanbul ignore next */ []));
|
|
294
|
+
/** Fires when the tooltip becomes visible. */
|
|
295
|
+
twTooltipShown = output();
|
|
296
|
+
/** Fires when the tooltip is fully hidden. */
|
|
297
|
+
twTooltipHidden = output();
|
|
298
|
+
overlay = inject(Overlay);
|
|
299
|
+
elementRef = inject((ElementRef));
|
|
300
|
+
destroyRef = inject(DestroyRef);
|
|
301
|
+
// CDK `AriaDescriber` owns a single hidden message-container on the document
|
|
302
|
+
// and dedupes identical description strings — if two tooltips on the same
|
|
303
|
+
// trigger advertise the same message, only one `aria-describedby` id is
|
|
304
|
+
// appended. Mirrors the `sort-header` pattern.
|
|
305
|
+
ariaDescriber = inject(AriaDescriber, { optional: true });
|
|
306
|
+
overlayRef = null;
|
|
307
|
+
tooltipInstance = null;
|
|
308
|
+
showTimer = null;
|
|
309
|
+
hideTimer = null;
|
|
310
|
+
/** Last description string handed to `AriaDescriber.describe` — required so the symmetrical `removeDescription` call passes the same key. */
|
|
311
|
+
_describedBy = null;
|
|
312
|
+
/** True when the trigger's `aria-describedby` was set directly to the overlay id (TemplateRef fallback path); used by `removeAriaDescription` to choose the symmetrical teardown. */
|
|
313
|
+
_templateDescribedBy = false;
|
|
314
|
+
constructor() {
|
|
315
|
+
// Hide immediately when disabled changes to true
|
|
316
|
+
effect(() => {
|
|
317
|
+
if (this.twTooltipDisabled()) {
|
|
318
|
+
this.detach();
|
|
319
|
+
}
|
|
320
|
+
});
|
|
321
|
+
this.destroyRef.onDestroy(() => {
|
|
322
|
+
this.clearTimers();
|
|
323
|
+
this.removeAriaDescription();
|
|
324
|
+
this.disposeOverlay();
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
/** Programmatically show the tooltip. */
|
|
328
|
+
show() {
|
|
329
|
+
if (this.twTooltipDisabled() || !this.twTooltip())
|
|
330
|
+
return;
|
|
331
|
+
this.clearTimers();
|
|
332
|
+
this.showTimer = setTimeout(() => this.createAndShow(), this.twTooltipShowDelay());
|
|
333
|
+
}
|
|
334
|
+
/** Programmatically hide the tooltip. */
|
|
335
|
+
hide() {
|
|
336
|
+
this.clearTimers();
|
|
337
|
+
this.hideTimer = setTimeout(() => this.detach(), this.twTooltipHideDelay());
|
|
338
|
+
}
|
|
339
|
+
/** Toggle tooltip visibility. */
|
|
340
|
+
toggle() {
|
|
341
|
+
if (this.tooltipInstance) {
|
|
342
|
+
this.hide();
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
this.show();
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
// ── Host event handlers ──
|
|
349
|
+
onMouseEnter() {
|
|
350
|
+
this.show();
|
|
351
|
+
}
|
|
352
|
+
onMouseLeave() {
|
|
353
|
+
this.hide();
|
|
354
|
+
}
|
|
355
|
+
onFocusIn() {
|
|
356
|
+
this.show();
|
|
357
|
+
}
|
|
358
|
+
onFocusOut() {
|
|
359
|
+
this.hide();
|
|
360
|
+
}
|
|
361
|
+
onEscape() {
|
|
362
|
+
if (this.tooltipInstance) {
|
|
363
|
+
this.detach();
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
onTouchStart() {
|
|
367
|
+
this.show();
|
|
368
|
+
}
|
|
369
|
+
onTouchEnd() {
|
|
370
|
+
this.hide();
|
|
371
|
+
}
|
|
372
|
+
// ── Private ──
|
|
373
|
+
createAndShow() {
|
|
374
|
+
if (this.tooltipInstance) {
|
|
375
|
+
this.updateTooltip();
|
|
376
|
+
this.applyAriaDescription();
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
this.createOverlay();
|
|
380
|
+
const portal = new ComponentPortal(TooltipOverlayComponent);
|
|
381
|
+
const componentRef = this.overlayRef.attach(portal);
|
|
382
|
+
this.tooltipInstance = componentRef.instance;
|
|
383
|
+
this.updateTooltip();
|
|
384
|
+
this.applyAriaDescription();
|
|
385
|
+
this.twTooltipShown.emit();
|
|
386
|
+
}
|
|
387
|
+
createOverlay() {
|
|
388
|
+
if (this.overlayRef)
|
|
389
|
+
return;
|
|
390
|
+
const positions = buildPositions(this.twTooltipPosition());
|
|
391
|
+
const positionStrategy = this.overlay
|
|
392
|
+
.position()
|
|
393
|
+
.flexibleConnectedTo(this.elementRef)
|
|
394
|
+
.withPositions(positions)
|
|
395
|
+
.withPush(true)
|
|
396
|
+
.withViewportMargin(8);
|
|
397
|
+
this.overlayRef = this.overlay.create({
|
|
398
|
+
positionStrategy,
|
|
399
|
+
// Close on ancestor scroll — tooltips are transient and should not chase a
|
|
400
|
+
// moving trigger across a scrolling viewport.
|
|
401
|
+
scrollStrategy: this.overlay.scrollStrategies.close(),
|
|
402
|
+
panelClass: 'tw-tooltip-panel',
|
|
403
|
+
});
|
|
404
|
+
positionStrategy.positionChanges
|
|
405
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
406
|
+
.subscribe((change) => {
|
|
407
|
+
if (this.tooltipInstance) {
|
|
408
|
+
const dir = resolveArrowDirection(change.connectionPair);
|
|
409
|
+
this.tooltipInstance.arrowDirection.set(dir);
|
|
410
|
+
}
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
updateTooltip() {
|
|
414
|
+
if (!this.tooltipInstance)
|
|
415
|
+
return;
|
|
416
|
+
this.tooltipInstance.content.set(this.twTooltip());
|
|
417
|
+
this.tooltipInstance.color.set(this.twTooltipColor());
|
|
418
|
+
this.tooltipInstance.size.set(this.twTooltipSize());
|
|
419
|
+
this.tooltipInstance.showArrow.set(this.twTooltipArrow());
|
|
420
|
+
this.tooltipInstance.panelClass.set(this.twTooltipPanelClass());
|
|
421
|
+
}
|
|
422
|
+
detach() {
|
|
423
|
+
this.clearTimers();
|
|
424
|
+
if (this.overlayRef?.hasAttached()) {
|
|
425
|
+
this.overlayRef.detach();
|
|
426
|
+
}
|
|
427
|
+
if (this.tooltipInstance) {
|
|
428
|
+
this.removeAriaDescription();
|
|
429
|
+
this.tooltipInstance = null;
|
|
430
|
+
this.twTooltipHidden.emit();
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Push the current tooltip content as an `aria-describedby` link on the
|
|
435
|
+
* trigger element. Dual-mode wiring:
|
|
436
|
+
*
|
|
437
|
+
* - **String content**: routed through CDK `AriaDescriber.describe`, which
|
|
438
|
+
* maintains a single hidden message-container on the document and dedupes
|
|
439
|
+
* identical strings across all describers.
|
|
440
|
+
* - **TemplateRef content**: AriaDescriber's dedup table is keyed by string,
|
|
441
|
+
* so we fall back to a direct `setAttribute('aria-describedby', overlayId)`
|
|
442
|
+
* pointing at the `role="tooltip"` overlay. Without this fallback,
|
|
443
|
+
* assistive tech would have no description link for templated tooltip
|
|
444
|
+
* content.
|
|
445
|
+
*
|
|
446
|
+
* `_describedBy` tracks the string handed to `AriaDescriber`;
|
|
447
|
+
* `_templateDescribedBy` is `true` when the fallback path is active so
|
|
448
|
+
* `removeAriaDescription` can take the symmetrical teardown branch.
|
|
449
|
+
*/
|
|
450
|
+
applyAriaDescription() {
|
|
451
|
+
const el = this.elementRef.nativeElement;
|
|
452
|
+
const content = this.twTooltip();
|
|
453
|
+
if (typeof content === 'string' && content.length > 0 && this.ariaDescriber) {
|
|
454
|
+
// If we previously wired the template fallback (rare — content can swap
|
|
455
|
+
// at runtime), tear it down before swapping to the describer path.
|
|
456
|
+
if (this._templateDescribedBy) {
|
|
457
|
+
el.removeAttribute('aria-describedby');
|
|
458
|
+
this._templateDescribedBy = false;
|
|
459
|
+
}
|
|
460
|
+
if (this._describedBy && this._describedBy !== content) {
|
|
461
|
+
this.ariaDescriber.removeDescription(el, this._describedBy);
|
|
462
|
+
this._describedBy = null;
|
|
463
|
+
}
|
|
464
|
+
if (this._describedBy === content)
|
|
465
|
+
return;
|
|
466
|
+
this.ariaDescriber.describe(el, content);
|
|
467
|
+
this._describedBy = content;
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
// Template / non-string fallback.
|
|
471
|
+
if (this._describedBy && this.ariaDescriber) {
|
|
472
|
+
this.ariaDescriber.removeDescription(el, this._describedBy);
|
|
473
|
+
this._describedBy = null;
|
|
474
|
+
}
|
|
475
|
+
if (this.tooltipInstance) {
|
|
476
|
+
el.setAttribute('aria-describedby', this.tooltipInstance.id);
|
|
477
|
+
this._templateDescribedBy = true;
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
removeAriaDescription() {
|
|
481
|
+
const el = this.elementRef.nativeElement;
|
|
482
|
+
if (this._describedBy && this.ariaDescriber) {
|
|
483
|
+
this.ariaDescriber.removeDescription(el, this._describedBy);
|
|
484
|
+
this._describedBy = null;
|
|
485
|
+
}
|
|
486
|
+
if (this._templateDescribedBy) {
|
|
487
|
+
el.removeAttribute('aria-describedby');
|
|
488
|
+
this._templateDescribedBy = false;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
disposeOverlay() {
|
|
492
|
+
if (this.overlayRef) {
|
|
493
|
+
this.overlayRef.dispose();
|
|
494
|
+
this.overlayRef = null;
|
|
495
|
+
}
|
|
496
|
+
this.tooltipInstance = null;
|
|
497
|
+
}
|
|
498
|
+
clearTimers() {
|
|
499
|
+
if (this.showTimer !== null) {
|
|
500
|
+
clearTimeout(this.showTimer);
|
|
501
|
+
this.showTimer = null;
|
|
502
|
+
}
|
|
503
|
+
if (this.hideTimer !== null) {
|
|
504
|
+
clearTimeout(this.hideTimer);
|
|
505
|
+
this.hideTimer = null;
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: TooltipDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
509
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: TooltipDirective, isStandalone: true, selector: "[twTooltip]", inputs: { twTooltip: { classPropertyName: "twTooltip", publicName: "twTooltip", isSignal: true, isRequired: true, transformFunction: null }, twTooltipPosition: { classPropertyName: "twTooltipPosition", publicName: "twTooltipPosition", isSignal: true, isRequired: false, transformFunction: null }, twTooltipColor: { classPropertyName: "twTooltipColor", publicName: "twTooltipColor", isSignal: true, isRequired: false, transformFunction: null }, twTooltipSize: { classPropertyName: "twTooltipSize", publicName: "twTooltipSize", isSignal: true, isRequired: false, transformFunction: null }, twTooltipShowDelay: { classPropertyName: "twTooltipShowDelay", publicName: "twTooltipShowDelay", isSignal: true, isRequired: false, transformFunction: null }, twTooltipHideDelay: { classPropertyName: "twTooltipHideDelay", publicName: "twTooltipHideDelay", isSignal: true, isRequired: false, transformFunction: null }, twTooltipDisabled: { classPropertyName: "twTooltipDisabled", publicName: "twTooltipDisabled", isSignal: true, isRequired: false, transformFunction: null }, twTooltipArrow: { classPropertyName: "twTooltipArrow", publicName: "twTooltipArrow", isSignal: true, isRequired: false, transformFunction: null }, twTooltipPanelClass: { classPropertyName: "twTooltipPanelClass", publicName: "twTooltipPanelClass", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { twTooltipShown: "twTooltipShown", twTooltipHidden: "twTooltipHidden" }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "focusin": "onFocusIn()", "focusout": "onFocusOut()", "keydown.escape": "onEscape()", "touchstart": "onTouchStart()", "touchend": "onTouchEnd()" } }, exportAs: ["twTooltip"], ngImport: i0 });
|
|
510
|
+
}
|
|
511
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: TooltipDirective, decorators: [{
|
|
512
|
+
type: Directive,
|
|
513
|
+
args: [{
|
|
514
|
+
selector: '[twTooltip]',
|
|
515
|
+
exportAs: 'twTooltip',
|
|
516
|
+
host: {
|
|
517
|
+
'(mouseenter)': 'onMouseEnter()',
|
|
518
|
+
'(mouseleave)': 'onMouseLeave()',
|
|
519
|
+
'(focusin)': 'onFocusIn()',
|
|
520
|
+
'(focusout)': 'onFocusOut()',
|
|
521
|
+
'(keydown.escape)': 'onEscape()',
|
|
522
|
+
'(touchstart)': 'onTouchStart()',
|
|
523
|
+
'(touchend)': 'onTouchEnd()',
|
|
524
|
+
},
|
|
525
|
+
}]
|
|
526
|
+
}], ctorParameters: () => [], propDecorators: { twTooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "twTooltip", required: true }] }], twTooltipPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "twTooltipPosition", required: false }] }], twTooltipColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "twTooltipColor", required: false }] }], twTooltipSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "twTooltipSize", required: false }] }], twTooltipShowDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "twTooltipShowDelay", required: false }] }], twTooltipHideDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "twTooltipHideDelay", required: false }] }], twTooltipDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "twTooltipDisabled", required: false }] }], twTooltipArrow: [{ type: i0.Input, args: [{ isSignal: true, alias: "twTooltipArrow", required: false }] }], twTooltipPanelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "twTooltipPanelClass", required: false }] }], twTooltipShown: [{ type: i0.Output, args: ["twTooltipShown"] }], twTooltipHidden: [{ type: i0.Output, args: ["twTooltipHidden"] }] } });
|
|
527
|
+
|
|
528
|
+
/**
|
|
529
|
+
* Generated bundle index. Do not edit.
|
|
530
|
+
*/
|
|
531
|
+
|
|
532
|
+
export { TooltipDirective };
|
|
533
|
+
//# sourceMappingURL=cdevhub-ngx-tw-tooltip.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdevhub-ngx-tw-tooltip.mjs","sources":["../../../projects/ngx-tw/tooltip/tooltip.ts","../../../projects/ngx-tw/tooltip/cdevhub-ngx-tw-tooltip.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n output,\n signal,\n TemplateRef,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n type ConnectedPosition,\n Overlay,\n type OverlayRef,\n} from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { AriaDescriber } from '@angular/cdk/a11y';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { tv } from 'tailwind-variants';\nimport type { TwColor, TwSize } from '@cdevhub/ngx-tw/core';\n\n/** Placement position of the tooltip relative to its trigger element. */\nexport type TooltipPosition =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'left-start'\n | 'left-end'\n | 'right'\n | 'right-start'\n | 'right-end';\n\n/** Direction the arrow points toward (derived from resolved overlay position). */\ntype ArrowDirection = 'top' | 'bottom' | 'left' | 'right';\n\n// ── Variant config ──\n\nconst tooltipVariants = tv(\n {\n slots: {\n wrapper: 'relative pointer-events-none',\n panel: 'rounded-md shadow-md',\n arrow: 'absolute size-2 rotate-45',\n },\n variants: {\n color: {\n primary: {\n panel: 'bg-primary-700 text-on-primary',\n arrow: 'bg-primary-700',\n },\n secondary: {\n panel: 'bg-secondary-700 text-on-secondary',\n arrow: 'bg-secondary-700',\n },\n accent: {\n panel: 'bg-accent-700 text-on-accent',\n arrow: 'bg-accent-700',\n },\n neutral: {\n wrapper: 'drop-shadow-[0_0_0.5px_var(--color-border)] drop-shadow-sm',\n panel: 'bg-surface-overlay text-fg',\n arrow: 'bg-surface-overlay',\n },\n info: {\n panel: 'bg-info-700 text-on-info',\n arrow: 'bg-info-700',\n },\n success: {\n panel: 'bg-success-700 text-on-success',\n arrow: 'bg-success-700',\n },\n warning: {\n panel: 'bg-warning-700 text-on-warning',\n arrow: 'bg-warning-700',\n },\n error: {\n panel: 'bg-error-700 text-on-error',\n arrow: 'bg-error-700',\n },\n },\n size: {\n xs: {\n panel: 'px-1.5 py-0.5 text-2xs max-w-40',\n },\n sm: {\n panel: 'px-2 py-1 text-xs max-w-48',\n },\n md: {\n panel: 'px-3 py-1.5 text-sm max-w-xs',\n },\n lg: {\n panel: 'px-4 py-2 text-sm max-w-sm',\n },\n xl: {\n panel: 'px-4 py-2 text-base max-w-md',\n },\n },\n },\n defaultVariants: {\n color: 'neutral',\n size: 'md',\n },\n },\n { twMerge: true },\n);\n\n// ── Position mappings ──\n\nconst POSITION_MAP: Record<TooltipPosition, ConnectedPosition> = {\n top: {\n originX: 'center',\n originY: 'top',\n overlayX: 'center',\n overlayY: 'bottom',\n offsetY: -8,\n },\n 'top-start': {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n offsetY: -8,\n },\n 'top-end': {\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom',\n offsetY: -8,\n },\n bottom: {\n originX: 'center',\n originY: 'bottom',\n overlayX: 'center',\n overlayY: 'top',\n offsetY: 8,\n },\n 'bottom-start': {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n offsetY: 8,\n },\n 'bottom-end': {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n offsetY: 8,\n },\n left: {\n originX: 'start',\n originY: 'center',\n overlayX: 'end',\n overlayY: 'center',\n offsetX: -8,\n },\n 'left-start': {\n originX: 'start',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'top',\n offsetX: -8,\n },\n 'left-end': {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'bottom',\n offsetX: -8,\n },\n right: {\n originX: 'end',\n originY: 'center',\n overlayX: 'start',\n overlayY: 'center',\n offsetX: 8,\n },\n 'right-start': {\n originX: 'end',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'top',\n offsetX: 8,\n },\n 'right-end': {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'bottom',\n offsetX: 8,\n },\n};\n\nconst FALLBACK_ORDER: Record<string, TooltipPosition[]> = {\n top: ['bottom', 'left', 'right'],\n bottom: ['top', 'left', 'right'],\n left: ['right', 'top', 'bottom'],\n right: ['left', 'top', 'bottom'],\n};\n\nfunction buildPositions(preferred: TooltipPosition): ConnectedPosition[] {\n const primary = preferred.split('-')[0];\n const positions = [POSITION_MAP[preferred]];\n const fallbacks = FALLBACK_ORDER[primary] ?? FALLBACK_ORDER['top'];\n for (const fb of fallbacks) {\n positions.push(POSITION_MAP[fb]);\n }\n return positions;\n}\n\nfunction resolveArrowDirection(position: ConnectedPosition): ArrowDirection {\n if (position.overlayY === 'bottom') return 'bottom';\n if (position.overlayY === 'top') return 'top';\n if (position.overlayX === 'end') return 'right';\n return 'left';\n}\n\n/** Arrow position classes keyed by which side the arrow sits on. */\nconst ARROW_POSITION_CLASSES: Record<ArrowDirection, string> = {\n bottom: 'left-1/2 -translate-x-1/2 bottom-0 translate-y-1/2',\n top: 'left-1/2 -translate-x-1/2 top-0 -translate-y-1/2',\n right: 'top-1/2 -translate-y-1/2 right-0 translate-x-1/2',\n left: 'top-1/2 -translate-y-1/2 left-0 -translate-x-1/2',\n};\n\n// ── Internal overlay component (not exported) ──\n\nlet nextTooltipId = 0;\n\n@Component({\n selector: 'tw-tooltip-overlay',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n role: 'tooltip',\n '[id]': 'id',\n '[animate.enter]': '\"fade-in\"',\n '[animate.leave]': '\"fade-out\"',\n },\n imports: [NgTemplateOutlet],\n template: `\n <div [class]=\"wrapperClasses()\">\n <div [class]=\"panelClasses()\">\n @if (isTemplate()) {\n <ng-container *ngTemplateOutlet=\"templateContent()\" />\n } @else {\n {{ textContent() }}\n }\n </div>\n @if (showArrow()) {\n <span [class]=\"arrowClasses()\" aria-hidden=\"true\"></span>\n }\n </div>\n `,\n})\nclass TooltipOverlayComponent {\n readonly id = `tw-tooltip-${nextTooltipId++}`;\n\n readonly content = signal<string | TemplateRef<void>>('');\n readonly color = signal<TwColor>('neutral');\n readonly size = signal<TwSize>('md');\n readonly showArrow = signal(true);\n readonly arrowDirection = signal<ArrowDirection>('bottom');\n readonly panelClass = signal<string>('');\n\n readonly isTemplate = computed(\n () => this.content() instanceof TemplateRef,\n );\n readonly templateContent = computed(\n () => this.content() as TemplateRef<void>,\n );\n readonly textContent = computed(() => this.content() as string);\n\n private readonly variantResult = computed(() =>\n tooltipVariants({ color: this.color(), size: this.size() }),\n );\n\n readonly wrapperClasses = computed(() => this.variantResult().wrapper());\n readonly panelClasses = computed(() => {\n const consumer = this.panelClass();\n return this.variantResult().panel({ class: consumer });\n });\n readonly arrowClasses = computed(() => {\n const base = this.variantResult().arrow();\n const position = ARROW_POSITION_CLASSES[this.arrowDirection()];\n return `${base} ${position}`;\n });\n}\n\n// ── Tooltip directive ──\n\n@Directive({\n selector: '[twTooltip]',\n exportAs: 'twTooltip',\n host: {\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave()',\n '(focusin)': 'onFocusIn()',\n '(focusout)': 'onFocusOut()',\n '(keydown.escape)': 'onEscape()',\n '(touchstart)': 'onTouchStart()',\n '(touchend)': 'onTouchEnd()',\n },\n})\nexport class TooltipDirective {\n /** The tooltip content. Strings render as text; TemplateRef renders via ngTemplateOutlet. */\n readonly twTooltip = input.required<string | TemplateRef<void>>();\n\n /** Preferred placement relative to the trigger. CDK handles fallback. Defaults to `'top'`. */\n readonly twTooltipPosition = input<TooltipPosition>('top');\n\n /** Semantic color palette for the tooltip. Defaults to `'neutral'`. */\n readonly twTooltipColor = input<TwColor>('neutral');\n\n /** Controls padding, font size, and maximum width. Defaults to `'md'`. */\n readonly twTooltipSize = input<TwSize>('md');\n\n /**\n * Milliseconds to wait before showing after trigger. Defaults to `200` — an\n * intent threshold: the trigger must be held long enough that the user reads\n * as \"wants the tooltip\" rather than a passing graze with the pointer.\n */\n readonly twTooltipShowDelay = input(200);\n\n /**\n * Milliseconds to wait before hiding after trigger ends. Defaults to `0`\n * (immediate dismiss). The asymmetry with `twTooltipShowDelay` is\n * intentional — show is gated to filter noise, hide is instant so the\n * tooltip never lingers over content the user has moved on from.\n */\n readonly twTooltipHideDelay = input(0);\n\n /** When true, tooltip never shows. Defaults to `false`. */\n readonly twTooltipDisabled = input(false);\n\n // Arrows reinforce the visual association between the floating panel and its trigger\n // and match every other ngx-tw overlay (popover/menu); opt-out is for compact iconic\n // contexts only.\n /** When true, renders an arrow pointing to the trigger. Defaults to `true`. */\n readonly twTooltipArrow = input(true);\n\n /** Optional class string (space-separated) merged into the panel slot for consumer customization. */\n readonly twTooltipPanelClass = input<string>('');\n\n /** Fires when the tooltip becomes visible. */\n readonly twTooltipShown = output<void>();\n\n /** Fires when the tooltip is fully hidden. */\n readonly twTooltipHidden = output<void>();\n\n private readonly overlay = inject(Overlay);\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n private readonly destroyRef = inject(DestroyRef);\n // CDK `AriaDescriber` owns a single hidden message-container on the document\n // and dedupes identical description strings — if two tooltips on the same\n // trigger advertise the same message, only one `aria-describedby` id is\n // appended. Mirrors the `sort-header` pattern.\n private readonly ariaDescriber = inject(AriaDescriber, { optional: true });\n\n private overlayRef: OverlayRef | null = null;\n private tooltipInstance: TooltipOverlayComponent | null = null;\n private showTimer: ReturnType<typeof setTimeout> | null = null;\n private hideTimer: ReturnType<typeof setTimeout> | null = null;\n /** Last description string handed to `AriaDescriber.describe` — required so the symmetrical `removeDescription` call passes the same key. */\n private _describedBy: string | null = null;\n /** True when the trigger's `aria-describedby` was set directly to the overlay id (TemplateRef fallback path); used by `removeAriaDescription` to choose the symmetrical teardown. */\n private _templateDescribedBy = false;\n\n constructor() {\n // Hide immediately when disabled changes to true\n effect(() => {\n if (this.twTooltipDisabled()) {\n this.detach();\n }\n });\n\n this.destroyRef.onDestroy(() => {\n this.clearTimers();\n this.removeAriaDescription();\n this.disposeOverlay();\n });\n }\n\n /** Programmatically show the tooltip. */\n show(): void {\n if (this.twTooltipDisabled() || !this.twTooltip()) return;\n this.clearTimers();\n this.showTimer = setTimeout(\n () => this.createAndShow(),\n this.twTooltipShowDelay(),\n );\n }\n\n /** Programmatically hide the tooltip. */\n hide(): void {\n this.clearTimers();\n this.hideTimer = setTimeout(\n () => this.detach(),\n this.twTooltipHideDelay(),\n );\n }\n\n /** Toggle tooltip visibility. */\n toggle(): void {\n if (this.tooltipInstance) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n // ── Host event handlers ──\n\n protected onMouseEnter(): void {\n this.show();\n }\n\n protected onMouseLeave(): void {\n this.hide();\n }\n\n protected onFocusIn(): void {\n this.show();\n }\n\n protected onFocusOut(): void {\n this.hide();\n }\n\n protected onEscape(): void {\n if (this.tooltipInstance) {\n this.detach();\n }\n }\n\n protected onTouchStart(): void {\n this.show();\n }\n\n protected onTouchEnd(): void {\n this.hide();\n }\n\n // ── Private ──\n\n private createAndShow(): void {\n if (this.tooltipInstance) {\n this.updateTooltip();\n this.applyAriaDescription();\n return;\n }\n\n this.createOverlay();\n const portal = new ComponentPortal(TooltipOverlayComponent);\n const componentRef = this.overlayRef!.attach(portal);\n this.tooltipInstance = componentRef.instance;\n\n this.updateTooltip();\n this.applyAriaDescription();\n\n this.twTooltipShown.emit();\n }\n\n private createOverlay(): void {\n if (this.overlayRef) return;\n\n const positions = buildPositions(this.twTooltipPosition());\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(this.elementRef)\n .withPositions(positions)\n .withPush(true)\n .withViewportMargin(8);\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n // Close on ancestor scroll — tooltips are transient and should not chase a\n // moving trigger across a scrolling viewport.\n scrollStrategy: this.overlay.scrollStrategies.close(),\n panelClass: 'tw-tooltip-panel',\n });\n\n positionStrategy.positionChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((change) => {\n if (this.tooltipInstance) {\n const dir = resolveArrowDirection(change.connectionPair);\n this.tooltipInstance.arrowDirection.set(dir);\n }\n });\n }\n\n private updateTooltip(): void {\n if (!this.tooltipInstance) return;\n this.tooltipInstance.content.set(this.twTooltip());\n this.tooltipInstance.color.set(this.twTooltipColor());\n this.tooltipInstance.size.set(this.twTooltipSize());\n this.tooltipInstance.showArrow.set(this.twTooltipArrow());\n this.tooltipInstance.panelClass.set(this.twTooltipPanelClass());\n }\n\n private detach(): void {\n this.clearTimers();\n if (this.overlayRef?.hasAttached()) {\n this.overlayRef.detach();\n }\n if (this.tooltipInstance) {\n this.removeAriaDescription();\n this.tooltipInstance = null;\n this.twTooltipHidden.emit();\n }\n }\n\n /**\n * Push the current tooltip content as an `aria-describedby` link on the\n * trigger element. Dual-mode wiring:\n *\n * - **String content**: routed through CDK `AriaDescriber.describe`, which\n * maintains a single hidden message-container on the document and dedupes\n * identical strings across all describers.\n * - **TemplateRef content**: AriaDescriber's dedup table is keyed by string,\n * so we fall back to a direct `setAttribute('aria-describedby', overlayId)`\n * pointing at the `role=\"tooltip\"` overlay. Without this fallback,\n * assistive tech would have no description link for templated tooltip\n * content.\n *\n * `_describedBy` tracks the string handed to `AriaDescriber`;\n * `_templateDescribedBy` is `true` when the fallback path is active so\n * `removeAriaDescription` can take the symmetrical teardown branch.\n */\n private applyAriaDescription(): void {\n const el = this.elementRef.nativeElement;\n const content = this.twTooltip();\n\n if (typeof content === 'string' && content.length > 0 && this.ariaDescriber) {\n // If we previously wired the template fallback (rare — content can swap\n // at runtime), tear it down before swapping to the describer path.\n if (this._templateDescribedBy) {\n el.removeAttribute('aria-describedby');\n this._templateDescribedBy = false;\n }\n if (this._describedBy && this._describedBy !== content) {\n this.ariaDescriber.removeDescription(el, this._describedBy);\n this._describedBy = null;\n }\n if (this._describedBy === content) return;\n this.ariaDescriber.describe(el, content);\n this._describedBy = content;\n return;\n }\n\n // Template / non-string fallback.\n if (this._describedBy && this.ariaDescriber) {\n this.ariaDescriber.removeDescription(el, this._describedBy);\n this._describedBy = null;\n }\n if (this.tooltipInstance) {\n el.setAttribute('aria-describedby', this.tooltipInstance.id);\n this._templateDescribedBy = true;\n }\n }\n\n private removeAriaDescription(): void {\n const el = this.elementRef.nativeElement;\n if (this._describedBy && this.ariaDescriber) {\n this.ariaDescriber.removeDescription(el, this._describedBy);\n this._describedBy = null;\n }\n if (this._templateDescribedBy) {\n el.removeAttribute('aria-describedby');\n this._templateDescribedBy = false;\n }\n }\n\n private disposeOverlay(): void {\n if (this.overlayRef) {\n this.overlayRef.dispose();\n this.overlayRef = null;\n }\n this.tooltipInstance = null;\n }\n\n private clearTimers(): void {\n if (this.showTimer !== null) {\n clearTimeout(this.showTimer);\n this.showTimer = null;\n }\n if (this.hideTimer !== null) {\n clearTimeout(this.hideTimer);\n this.hideTimer = null;\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|