@attrus-ds/core 0.2.0 → 1.0.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.
Files changed (80) hide show
  1. package/LICENSE +27 -27
  2. package/dist/assets/flags/Brazil-rounded.svg +15 -15
  3. package/dist/assets/flags/Brazil-square.svg +16 -16
  4. package/dist/assets/flags/Chile-rounded.svg +10 -10
  5. package/dist/assets/flags/Chile-square.svg +10 -10
  6. package/dist/assets/flags/Colombia-rounded.svg +9 -9
  7. package/dist/assets/flags/Colombia-square.svg +9 -9
  8. package/dist/assets/flags/EUA-rounded.svg +10 -10
  9. package/dist/assets/flags/EUA-square.svg +10 -10
  10. package/dist/assets/flags/EUR-rounded.svg +8 -8
  11. package/dist/assets/flags/EUR-square.svg +8 -8
  12. package/dist/assets/flags/Mexico-rounded.svg +18 -18
  13. package/dist/assets/flags/Mexico-square.svg +18 -18
  14. package/dist/assets/icon-attrus-dark.svg +2 -2
  15. package/dist/assets/icon-attrus-light.svg +2 -2
  16. package/dist/assets/logo-attrus-dark.svg +7 -7
  17. package/dist/assets/logo-attrus-light.svg +7 -7
  18. package/dist/css/components/buttons.css +301 -301
  19. package/dist/css/components/callout.css +195 -195
  20. package/dist/css/components/cards.css +272 -272
  21. package/dist/css/components/combobox.css +319 -319
  22. package/dist/css/components/empty-states.css +61 -61
  23. package/dist/css/components/inputs.css +975 -975
  24. package/dist/css/components/number-input.css +138 -138
  25. package/dist/css/components/overlays.css +374 -374
  26. package/dist/css/components/primitives.css +314 -314
  27. package/dist/css/components/sidebar.css +179 -179
  28. package/dist/css/components/smart-search.css +91 -91
  29. package/dist/css/components/status-pills.css +207 -207
  30. package/dist/css/components/stepper.css +309 -309
  31. package/dist/css/components/table.css +602 -602
  32. package/dist/css/components/tabs.css +319 -319
  33. package/dist/css/components/toast.css +243 -243
  34. package/dist/css/components/tooltip.css +231 -231
  35. package/dist/css/components/topbar.css +148 -148
  36. package/dist/css/tokens.css +713 -666
  37. package/dist/react/AppSidebar/AppSidebar.d.ts +50 -50
  38. package/dist/react/AppSidebar/AppSidebar.tsx +197 -197
  39. package/dist/react/AppTopbar/AppTopbar.d.ts +58 -58
  40. package/dist/react/AppTopbar/AppTopbar.tsx +203 -203
  41. package/dist/react/Atoms/Atoms.d.ts +149 -149
  42. package/dist/react/Atoms/Atoms.tsx +407 -407
  43. package/dist/react/Button/Button.d.ts +25 -25
  44. package/dist/react/Button/Button.tsx +83 -83
  45. package/dist/react/Callout/Callout.d.ts +29 -29
  46. package/dist/react/Callout/Callout.tsx +98 -98
  47. package/dist/react/Card/Card.d.ts +38 -38
  48. package/dist/react/Card/Card.tsx +93 -93
  49. package/dist/react/Combobox/Combobox.d.ts +52 -52
  50. package/dist/react/Combobox/Combobox.tsx +254 -254
  51. package/dist/react/DataTable/DataTable.d.ts +81 -81
  52. package/dist/react/DataTable/DataTable.tsx +308 -308
  53. package/dist/react/Drawer/Drawer.d.ts +35 -35
  54. package/dist/react/Drawer/Drawer.tsx +226 -226
  55. package/dist/react/Input/Input.d.ts +155 -155
  56. package/dist/react/Input/Input.tsx +478 -478
  57. package/dist/react/Modal/Modal.d.ts +27 -27
  58. package/dist/react/Modal/Modal.tsx +173 -173
  59. package/dist/react/NumberInput/NumberInput.d.ts +25 -25
  60. package/dist/react/NumberInput/NumberInput.tsx +117 -117
  61. package/dist/react/Pill/Pill.d.ts +31 -31
  62. package/dist/react/Pill/Pill.tsx +104 -104
  63. package/dist/react/SearchPill/SearchPill.d.ts +14 -14
  64. package/dist/react/SearchPill/SearchPill.tsx +40 -40
  65. package/dist/react/SmartSearch/SmartSearch.d.ts +65 -65
  66. package/dist/react/SmartSearch/SmartSearch.tsx +271 -271
  67. package/dist/react/Stepper/Stepper.d.ts +25 -25
  68. package/dist/react/Stepper/Stepper.tsx +94 -94
  69. package/dist/react/Tabs/Tabs.d.ts +32 -32
  70. package/dist/react/Tabs/Tabs.tsx +147 -147
  71. package/dist/react/Toast/Toast.d.ts +30 -30
  72. package/dist/react/Toast/Toast.tsx +94 -94
  73. package/dist/react/Tooltip/Tooltip.d.ts +23 -23
  74. package/dist/react/Tooltip/Tooltip.tsx +80 -80
  75. package/dist/react/ZeroState/ZeroState.d.ts +17 -17
  76. package/dist/react/ZeroState/ZeroState.tsx +45 -45
  77. package/dist/react/index.ts +35 -35
  78. package/dist/tokens/attrus-tokens.flat.json +1234 -1234
  79. package/dist/tokens/attrus-tokens.json +1089 -1089
  80. package/package.json +66 -64
@@ -1,231 +1,231 @@
1
- /* ============================================================
2
- TOOLTIP COMPONENT — ATTRUS Design System
3
- Hover/focus-triggered label that names a target.
4
- All values from tokens.
5
- ============================================================ */
6
-
7
- .tooltip-target {
8
- position: relative;
9
- display: inline-flex;
10
- align-items: center;
11
- justify-content: center;
12
- }
13
-
14
- .tooltip {
15
- position: absolute;
16
- z-index: 8000;
17
- padding: var(--space-2) var(--space-3);
18
- background: var(--color-background-inverse);
19
- color: var(--color-foreground-inverse-default);
20
- font-family: var(--font-sans);
21
- font-size: var(--fs-xs);
22
- font-weight: var(--w-medium);
23
- line-height: var(--lh-tight);
24
- letter-spacing: var(--ls-body);
25
- white-space: normal;
26
- width: max-content;
27
- max-width: 240px;
28
- border-radius: var(--radius-xs);
29
- box-shadow: var(--shadow-md);
30
- pointer-events: none;
31
- opacity: 0;
32
- transition: opacity var(--duration-base) var(--ease-standard),
33
- transform var(--duration-base) var(--ease-emphasis);
34
- }
35
-
36
- .tooltip-target:hover > .tooltip,
37
- .tooltip-target:focus-visible > .tooltip,
38
- .tooltip-target:focus-within > .tooltip,
39
- .tooltip-target:has(> .tooltip-rich:hover) > .tooltip-rich,
40
- .tooltip.is-open {
41
- opacity: 1;
42
- pointer-events: none;
43
- }
44
-
45
- /* Arrow */
46
- .tooltip::after {
47
- content: "";
48
- position: absolute;
49
- width: 8px; height: 8px;
50
- background: var(--color-background-inverse);
51
- transform: rotate(45deg);
52
- }
53
-
54
- /* Placements */
55
- .tooltip-top {
56
- bottom: calc(100% + var(--space-2));
57
- left: 50%;
58
- transform: translateX(-50%) translateY(4px);
59
- }
60
- .tooltip-target:hover > .tooltip-top,
61
- .tooltip-target:focus-within > .tooltip-top { transform: translateX(-50%) translateY(0); }
62
- .tooltip-top::after { bottom: -3px; left: 50%; margin-left: -4px; }
63
-
64
- .tooltip-bottom {
65
- top: calc(100% + var(--space-2));
66
- left: 50%;
67
- transform: translateX(-50%) translateY(-4px);
68
- }
69
- .tooltip-target:hover > .tooltip-bottom,
70
- .tooltip-target:focus-within > .tooltip-bottom { transform: translateX(-50%) translateY(0); }
71
- .tooltip-bottom::after { top: -3px; left: 50%; margin-left: -4px; }
72
-
73
- .tooltip-left {
74
- right: calc(100% + var(--space-2));
75
- top: 50%;
76
- transform: translateY(-50%) translateX(4px);
77
- }
78
- .tooltip-target:hover > .tooltip-left,
79
- .tooltip-target:focus-within > .tooltip-left { transform: translateY(-50%) translateX(0); }
80
- .tooltip-left::after { right: -3px; top: 50%; margin-top: -4px; }
81
-
82
- .tooltip-right {
83
- left: calc(100% + var(--space-2));
84
- top: 50%;
85
- transform: translateY(-50%) translateX(-4px);
86
- }
87
- .tooltip-target:hover > .tooltip-right,
88
- .tooltip-target:focus-within > .tooltip-right { transform: translateY(-50%) translateX(0); }
89
- .tooltip-right::after { left: -3px; top: 50%; margin-top: -4px; }
90
-
91
- /* Variants */
92
- .tooltip-rich {
93
- white-space: normal;
94
- max-width: 260px;
95
- padding: var(--space-3) var(--space-4);
96
- font-size: var(--fs-xs);
97
- line-height: var(--lh-normal);
98
- }
99
- /* Rich tooltips are interactive (may contain a link): make them hoverable
100
- and bridge the gap to the target so the pointer can travel without the
101
- tooltip closing. Bridge is an invisible pad on the target-facing side. */
102
- .tooltip-target:hover > .tooltip-rich,
103
- .tooltip-target:focus-within > .tooltip-rich,
104
- .tooltip-target:has(> .tooltip-rich:hover) > .tooltip-rich,
105
- .tooltip-rich.is-open { pointer-events: auto; }
106
- .tooltip-rich::before {
107
- content: "";
108
- position: absolute;
109
- /* covers the space-2 gap between tooltip and target */
110
- }
111
- .tooltip-rich.tooltip-top::before { left: 0; right: 0; bottom: calc(-1 * var(--space-2)); height: var(--space-2); }
112
- .tooltip-rich.tooltip-bottom::before { left: 0; right: 0; top: calc(-1 * var(--space-2)); height: var(--space-2); }
113
- .tooltip-rich.tooltip-left::before { top: 0; bottom: 0; right: calc(-1 * var(--space-2)); width: var(--space-2); }
114
- .tooltip-rich.tooltip-right::before { top: 0; bottom: 0; left: calc(-1 * var(--space-2)); width: var(--space-2); }
115
- .tooltip-rich .tooltip-title {
116
- font-weight: var(--w-semibold);
117
- font-size: var(--fs-sm);
118
- margin: 0 0 var(--space-1);
119
- color: var(--color-foreground-inverse-default);
120
- }
121
- .tooltip-rich .tooltip-desc {
122
- margin: 0;
123
- color: var(--color-foreground-inverse-muted);
124
- }
125
-
126
- /* --- Rich tooltip building blocks (title · meta · header icon ·
127
- divider · bullet list · key/value rows · footer) --- */
128
- .tooltip-rich .tooltip-meta {
129
- display: block;
130
- font-family: var(--font-mono);
131
- font-size: var(--fs-xxs);
132
- font-weight: var(--w-semibold);
133
- letter-spacing: var(--ls-caps);
134
- text-transform: uppercase;
135
- color: var(--color-foreground-inverse-muted);
136
- margin: 0 0 var(--space-1);
137
- }
138
- .tooltip-rich .tooltip-header {
139
- display: flex;
140
- align-items: center;
141
- gap: var(--space-2);
142
- margin-bottom: var(--space-1);
143
- }
144
- .tooltip-rich .tooltip-header .tooltip-title { margin: 0; }
145
- .tooltip-rich .tooltip-header i,
146
- .tooltip-rich .tooltip-header svg {
147
- width: 15px; height: 15px;
148
- color: var(--color-foreground-inverse-default);
149
- flex-shrink: 0;
150
- stroke-width: var(--icon-stroke);
151
- }
152
- .tooltip-rich .tooltip-divider {
153
- height: 1px;
154
- margin: var(--space-3) 0;
155
- background: var(--color-border-inverse);
156
- border: 0;
157
- }
158
- .tooltip-rich .tooltip-list {
159
- margin: var(--space-2) 0 0;
160
- padding: 0;
161
- list-style: none;
162
- display: flex;
163
- flex-direction: column;
164
- gap: var(--space-1);
165
- }
166
- .tooltip-rich .tooltip-list li {
167
- position: relative;
168
- padding-left: var(--space-4);
169
- color: var(--color-foreground-inverse-muted);
170
- font-size: var(--fs-xs);
171
- line-height: var(--lh-snug);
172
- }
173
- .tooltip-rich .tooltip-list li::before {
174
- content: "";
175
- position: absolute;
176
- left: 2px; top: 7px;
177
- width: 4px; height: 4px;
178
- border-radius: var(--radius-pill);
179
- background: var(--color-foreground-inverse-accent);
180
- }
181
- .tooltip-rich .tooltip-row {
182
- display: flex;
183
- align-items: center;
184
- justify-content: space-between;
185
- gap: var(--space-4);
186
- font-size: var(--fs-xs);
187
- }
188
- .tooltip-rich .tooltip-row + .tooltip-row { margin-top: var(--space-1); }
189
- .tooltip-rich .tooltip-row .k { color: var(--color-foreground-inverse-muted); }
190
- .tooltip-rich .tooltip-row .v {
191
- color: var(--color-foreground-inverse-default);
192
- font-family: var(--font-mono);
193
- font-variant-numeric: tabular-nums;
194
- font-weight: var(--w-medium);
195
- }
196
- .tooltip-rich .tooltip-footer {
197
- margin-top: var(--space-3);
198
- padding-top: var(--space-2);
199
- border-top: 1px solid var(--color-border-inverse);
200
- font-size: var(--fs-xxs);
201
- color: var(--color-foreground-inverse-muted);
202
- display: flex;
203
- align-items: center;
204
- gap: var(--space-2);
205
- }
206
- .tooltip-rich .tooltip-footer i,
207
- .tooltip-rich .tooltip-footer svg { width: 12px; height: 12px; flex-shrink: 0; }
208
-
209
- .tooltip-kbd kbd {
210
- display: inline-block;
211
- margin-left: var(--space-2);
212
- padding: 1px var(--space-1);
213
- background: var(--color-background-inverse-subtle);
214
- color: var(--color-foreground-inverse-default);
215
- border: 1px solid var(--color-border-inverse);
216
- border-radius: var(--radius-xs);
217
- font-family: var(--font-mono);
218
- font-size: var(--fs-xxs);
219
- font-weight: var(--w-medium);
220
- line-height: 1;
221
- }
222
-
223
- /* Esc suppression — hide while focus stays on the target (doc a11y contract).
224
- The TSX toggles .is-suppressed on Escape; clears on blur / mouse re-enter. */
225
- .tooltip-target.is-suppressed > .tooltip,
226
- .tooltip-target.is-suppressed > .tooltip-rich { opacity: 0; pointer-events: none; }
227
-
228
- /* Reduced motion */
229
- @media (prefers-reduced-motion: reduce) {
230
- .tooltip { transition: opacity var(--duration-instant) linear; transform: none !important; transition-delay: 0s !important; }
231
- }
1
+ /* ============================================================
2
+ TOOLTIP COMPONENT — ATTRUS Design System
3
+ Hover/focus-triggered label that names a target.
4
+ All values from tokens.
5
+ ============================================================ */
6
+
7
+ .tooltip-target {
8
+ position: relative;
9
+ display: inline-flex;
10
+ align-items: center;
11
+ justify-content: center;
12
+ }
13
+
14
+ .tooltip {
15
+ position: absolute;
16
+ z-index: 8000;
17
+ padding: var(--space-2) var(--space-3);
18
+ background: var(--color-background-inverse);
19
+ color: var(--color-foreground-inverse-default);
20
+ font-family: var(--font-sans);
21
+ font-size: var(--fs-xs);
22
+ font-weight: var(--w-medium);
23
+ line-height: var(--lh-tight);
24
+ letter-spacing: var(--ls-body);
25
+ white-space: normal;
26
+ width: max-content;
27
+ max-width: 240px;
28
+ border-radius: var(--radius-xs);
29
+ box-shadow: var(--shadow-md);
30
+ pointer-events: none;
31
+ opacity: 0;
32
+ transition: opacity var(--duration-base) var(--ease-standard),
33
+ transform var(--duration-base) var(--ease-emphasis);
34
+ }
35
+
36
+ .tooltip-target:hover > .tooltip,
37
+ .tooltip-target:focus-visible > .tooltip,
38
+ .tooltip-target:focus-within > .tooltip,
39
+ .tooltip-target:has(> .tooltip-rich:hover) > .tooltip-rich,
40
+ .tooltip.is-open {
41
+ opacity: 1;
42
+ pointer-events: none;
43
+ }
44
+
45
+ /* Arrow */
46
+ .tooltip::after {
47
+ content: "";
48
+ position: absolute;
49
+ width: 8px; height: 8px;
50
+ background: var(--color-background-inverse);
51
+ transform: rotate(45deg);
52
+ }
53
+
54
+ /* Placements */
55
+ .tooltip-top {
56
+ bottom: calc(100% + var(--space-2));
57
+ left: 50%;
58
+ transform: translateX(-50%) translateY(4px);
59
+ }
60
+ .tooltip-target:hover > .tooltip-top,
61
+ .tooltip-target:focus-within > .tooltip-top { transform: translateX(-50%) translateY(0); }
62
+ .tooltip-top::after { bottom: -3px; left: 50%; margin-left: -4px; }
63
+
64
+ .tooltip-bottom {
65
+ top: calc(100% + var(--space-2));
66
+ left: 50%;
67
+ transform: translateX(-50%) translateY(-4px);
68
+ }
69
+ .tooltip-target:hover > .tooltip-bottom,
70
+ .tooltip-target:focus-within > .tooltip-bottom { transform: translateX(-50%) translateY(0); }
71
+ .tooltip-bottom::after { top: -3px; left: 50%; margin-left: -4px; }
72
+
73
+ .tooltip-left {
74
+ right: calc(100% + var(--space-2));
75
+ top: 50%;
76
+ transform: translateY(-50%) translateX(4px);
77
+ }
78
+ .tooltip-target:hover > .tooltip-left,
79
+ .tooltip-target:focus-within > .tooltip-left { transform: translateY(-50%) translateX(0); }
80
+ .tooltip-left::after { right: -3px; top: 50%; margin-top: -4px; }
81
+
82
+ .tooltip-right {
83
+ left: calc(100% + var(--space-2));
84
+ top: 50%;
85
+ transform: translateY(-50%) translateX(-4px);
86
+ }
87
+ .tooltip-target:hover > .tooltip-right,
88
+ .tooltip-target:focus-within > .tooltip-right { transform: translateY(-50%) translateX(0); }
89
+ .tooltip-right::after { left: -3px; top: 50%; margin-top: -4px; }
90
+
91
+ /* Variants */
92
+ .tooltip-rich {
93
+ white-space: normal;
94
+ max-width: 260px;
95
+ padding: var(--space-3) var(--space-4);
96
+ font-size: var(--fs-xs);
97
+ line-height: var(--lh-normal);
98
+ }
99
+ /* Rich tooltips are interactive (may contain a link): make them hoverable
100
+ and bridge the gap to the target so the pointer can travel without the
101
+ tooltip closing. Bridge is an invisible pad on the target-facing side. */
102
+ .tooltip-target:hover > .tooltip-rich,
103
+ .tooltip-target:focus-within > .tooltip-rich,
104
+ .tooltip-target:has(> .tooltip-rich:hover) > .tooltip-rich,
105
+ .tooltip-rich.is-open { pointer-events: auto; }
106
+ .tooltip-rich::before {
107
+ content: "";
108
+ position: absolute;
109
+ /* covers the space-2 gap between tooltip and target */
110
+ }
111
+ .tooltip-rich.tooltip-top::before { left: 0; right: 0; bottom: calc(-1 * var(--space-2)); height: var(--space-2); }
112
+ .tooltip-rich.tooltip-bottom::before { left: 0; right: 0; top: calc(-1 * var(--space-2)); height: var(--space-2); }
113
+ .tooltip-rich.tooltip-left::before { top: 0; bottom: 0; right: calc(-1 * var(--space-2)); width: var(--space-2); }
114
+ .tooltip-rich.tooltip-right::before { top: 0; bottom: 0; left: calc(-1 * var(--space-2)); width: var(--space-2); }
115
+ .tooltip-rich .tooltip-title {
116
+ font-weight: var(--w-semibold);
117
+ font-size: var(--fs-sm);
118
+ margin: 0 0 var(--space-1);
119
+ color: var(--color-foreground-inverse-default);
120
+ }
121
+ .tooltip-rich .tooltip-desc {
122
+ margin: 0;
123
+ color: var(--color-foreground-inverse-muted);
124
+ }
125
+
126
+ /* --- Rich tooltip building blocks (title · meta · header icon ·
127
+ divider · bullet list · key/value rows · footer) --- */
128
+ .tooltip-rich .tooltip-meta {
129
+ display: block;
130
+ font-family: var(--font-mono);
131
+ font-size: var(--fs-xxs);
132
+ font-weight: var(--w-semibold);
133
+ letter-spacing: var(--ls-caps);
134
+ text-transform: uppercase;
135
+ color: var(--color-foreground-inverse-muted);
136
+ margin: 0 0 var(--space-1);
137
+ }
138
+ .tooltip-rich .tooltip-header {
139
+ display: flex;
140
+ align-items: center;
141
+ gap: var(--space-2);
142
+ margin-bottom: var(--space-1);
143
+ }
144
+ .tooltip-rich .tooltip-header .tooltip-title { margin: 0; }
145
+ .tooltip-rich .tooltip-header i,
146
+ .tooltip-rich .tooltip-header svg {
147
+ width: 15px; height: 15px;
148
+ color: var(--color-foreground-inverse-default);
149
+ flex-shrink: 0;
150
+ stroke-width: var(--icon-stroke);
151
+ }
152
+ .tooltip-rich .tooltip-divider {
153
+ height: 1px;
154
+ margin: var(--space-3) 0;
155
+ background: var(--color-border-inverse);
156
+ border: 0;
157
+ }
158
+ .tooltip-rich .tooltip-list {
159
+ margin: var(--space-2) 0 0;
160
+ padding: 0;
161
+ list-style: none;
162
+ display: flex;
163
+ flex-direction: column;
164
+ gap: var(--space-1);
165
+ }
166
+ .tooltip-rich .tooltip-list li {
167
+ position: relative;
168
+ padding-left: var(--space-4);
169
+ color: var(--color-foreground-inverse-muted);
170
+ font-size: var(--fs-xs);
171
+ line-height: var(--lh-snug);
172
+ }
173
+ .tooltip-rich .tooltip-list li::before {
174
+ content: "";
175
+ position: absolute;
176
+ left: 2px; top: 7px;
177
+ width: 4px; height: 4px;
178
+ border-radius: var(--radius-pill);
179
+ background: var(--color-foreground-inverse-accent);
180
+ }
181
+ .tooltip-rich .tooltip-row {
182
+ display: flex;
183
+ align-items: center;
184
+ justify-content: space-between;
185
+ gap: var(--space-4);
186
+ font-size: var(--fs-xs);
187
+ }
188
+ .tooltip-rich .tooltip-row + .tooltip-row { margin-top: var(--space-1); }
189
+ .tooltip-rich .tooltip-row .k { color: var(--color-foreground-inverse-muted); }
190
+ .tooltip-rich .tooltip-row .v {
191
+ color: var(--color-foreground-inverse-default);
192
+ font-family: var(--font-mono);
193
+ font-variant-numeric: tabular-nums;
194
+ font-weight: var(--w-medium);
195
+ }
196
+ .tooltip-rich .tooltip-footer {
197
+ margin-top: var(--space-3);
198
+ padding-top: var(--space-2);
199
+ border-top: 1px solid var(--color-border-inverse);
200
+ font-size: var(--fs-xxs);
201
+ color: var(--color-foreground-inverse-muted);
202
+ display: flex;
203
+ align-items: center;
204
+ gap: var(--space-2);
205
+ }
206
+ .tooltip-rich .tooltip-footer i,
207
+ .tooltip-rich .tooltip-footer svg { width: 12px; height: 12px; flex-shrink: 0; }
208
+
209
+ .tooltip-kbd kbd {
210
+ display: inline-block;
211
+ margin-left: var(--space-2);
212
+ padding: 1px var(--space-1);
213
+ background: var(--color-background-inverse-subtle);
214
+ color: var(--color-foreground-inverse-default);
215
+ border: 1px solid var(--color-border-inverse);
216
+ border-radius: var(--radius-xs);
217
+ font-family: var(--font-mono);
218
+ font-size: var(--fs-xxs);
219
+ font-weight: var(--w-medium);
220
+ line-height: 1;
221
+ }
222
+
223
+ /* Esc suppression — hide while focus stays on the target (doc a11y contract).
224
+ The TSX toggles .is-suppressed on Escape; clears on blur / mouse re-enter. */
225
+ .tooltip-target.is-suppressed > .tooltip,
226
+ .tooltip-target.is-suppressed > .tooltip-rich { opacity: 0; pointer-events: none; }
227
+
228
+ /* Reduced motion */
229
+ @media (prefers-reduced-motion: reduce) {
230
+ .tooltip { transition: opacity var(--duration-instant) linear; transform: none !important; transition-delay: 0s !important; }
231
+ }