@duskmoon-dev/core 1.17.2 → 1.18.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.
@@ -1,395 +1,199 @@
1
1
  /**
2
2
  * Tooltip Component Styles
3
3
  * DuskMoonUI - Material Design 3 inspired tooltip system
4
+ *
5
+ * Breaking: uses native Popover API (popover="hint") + CSS Anchor Positioning.
6
+ * Markup:
7
+ * <button interestfor="id" style="anchor-name: --id" class="tooltip-delay">…</button>
8
+ * <div id="id" popover="hint" class="tooltip tooltip-top" style="position-anchor: --id">…</div>
4
9
  */
5
10
 
6
11
  @layer components {
7
- /* Base Tooltip */
8
- .tooltip {
9
- position: relative;
10
- display: inline-block;
11
- }
12
+ /* ========================================
13
+ * Base surface (the popover element itself)
14
+ * ======================================== */
15
+
16
+ .tooltip[popover] {
17
+ --tooltip-bg: var(--color-on-surface);
18
+ --tooltip-fg: var(--color-surface);
12
19
 
13
- /* Tooltip Content */
14
- .tooltip-content {
15
20
  position: absolute;
21
+ inset: auto;
16
22
  z-index: 1000;
23
+ margin: 0.5rem;
17
24
  padding: 0.375rem 0.75rem;
18
25
  font-size: 0.75rem;
19
26
  font-weight: 500;
20
27
  line-height: 1rem;
21
28
  white-space: nowrap;
22
- background-color: var(--color-on-surface);
23
- color: var(--color-surface);
29
+ background-color: var(--tooltip-bg);
30
+ color: var(--tooltip-fg);
31
+ border: none;
24
32
  border-radius: var(--radius-xs);
25
33
  box-shadow: var(--shadow-md);
26
- opacity: 0;
27
- visibility: hidden;
28
- transition: opacity 150ms ease-out, visibility 150ms ease-out;
29
34
  pointer-events: none;
35
+ opacity: 0;
36
+ transform: scale(0.95);
37
+ position-area: top;
38
+ position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;
39
+ transition:
40
+ opacity 150ms ease-out,
41
+ transform 150ms ease-out,
42
+ overlay 150ms ease-out allow-discrete,
43
+ display 150ms ease-out allow-discrete;
30
44
  }
31
45
 
32
- /* Tooltip Arrow */
33
- .tooltip-content::before {
34
- content: '';
35
- position: absolute;
36
- width: 0;
37
- height: 0;
38
- border: 0.375rem solid transparent;
46
+ .tooltip[popover]:popover-open {
47
+ opacity: 1;
48
+ transform: scale(1);
39
49
  }
40
50
 
41
- /* Show Tooltip */
42
- .tooltip:hover .tooltip-content,
43
- .tooltip:focus-within .tooltip-content,
44
- .tooltip-open .tooltip-content {
45
- opacity: 1;
46
- visibility: visible;
51
+ @starting-style {
52
+ .tooltip[popover]:popover-open {
53
+ opacity: 0;
54
+ transform: scale(0.95);
55
+ }
47
56
  }
48
57
 
49
- /* Position: Top (default) - applied to all tooltips as base */
50
- .tooltip .tooltip-content {
51
- bottom: 100%;
52
- top: auto;
53
- left: 50%;
54
- right: auto;
55
- transform: translateX(-50%);
56
- margin-bottom: 0.5rem;
57
- margin-top: 0;
58
- margin-left: 0;
59
- margin-right: 0;
58
+ /* ========================================
59
+ * Preferred position-area
60
+ * ======================================== */
61
+
62
+ .tooltip-top[popover] {
63
+ position-area: top;
60
64
  }
61
65
 
62
- .tooltip .tooltip-content::before {
63
- top: 100%;
64
- bottom: auto;
65
- left: 50%;
66
- right: auto;
67
- transform: translateX(-50%);
68
- border-top-color: var(--color-on-surface);
69
- border-bottom-color: transparent;
70
- border-left-color: transparent;
71
- border-right-color: transparent;
66
+ .tooltip-bottom[popover] {
67
+ position-area: bottom;
68
+ }
69
+
70
+ .tooltip-left[popover] {
71
+ position-area: left;
72
72
  }
73
73
 
74
- /* Position: Bottom */
75
- .tooltip.tooltip-bottom .tooltip-content {
74
+ .tooltip-right[popover] {
75
+ position-area: right;
76
+ }
77
+
78
+ /* ========================================
79
+ * Arrow (preferred position only; may be wrong after flip)
80
+ * ======================================== */
81
+
82
+ .tooltip[popover]::before {
83
+ content: '';
84
+ position: absolute;
85
+ width: 0;
86
+ height: 0;
87
+ border: 0.375rem solid transparent;
88
+ }
89
+
90
+ .tooltip-top[popover]::before,
91
+ .tooltip[popover]:not(.tooltip-bottom):not(.tooltip-left):not(.tooltip-right)::before {
76
92
  top: 100%;
77
- bottom: auto;
78
93
  left: 50%;
79
- right: auto;
80
94
  transform: translateX(-50%);
81
- margin-top: 0.5rem;
82
- margin-bottom: 0;
83
- margin-left: 0;
84
- margin-right: 0;
95
+ border-top-color: var(--tooltip-bg);
85
96
  }
86
97
 
87
- .tooltip.tooltip-bottom .tooltip-content::before {
98
+ .tooltip-bottom[popover]::before {
88
99
  bottom: 100%;
89
100
  top: auto;
90
101
  left: 50%;
91
- right: auto;
92
102
  transform: translateX(-50%);
93
- border-bottom-color: var(--color-on-surface);
103
+ border-bottom-color: var(--tooltip-bg);
94
104
  border-top-color: transparent;
95
- border-left-color: transparent;
96
- border-right-color: transparent;
97
105
  }
98
106
 
99
- /* Position: Left */
100
- .tooltip.tooltip-left .tooltip-content {
101
- right: 100%;
102
- left: auto;
103
- top: 50%;
104
- bottom: auto;
105
- transform: translateY(-50%);
106
- margin-right: 0.5rem;
107
- margin-left: 0;
108
- margin-top: 0;
109
- margin-bottom: 0;
110
- }
111
-
112
- .tooltip.tooltip-left .tooltip-content::before {
107
+ .tooltip-left[popover]::before {
113
108
  left: 100%;
114
- right: auto;
115
109
  top: 50%;
116
110
  bottom: auto;
117
111
  transform: translateY(-50%);
118
- border-left-color: var(--color-on-surface);
119
- border-right-color: transparent;
112
+ border-left-color: var(--tooltip-bg);
120
113
  border-top-color: transparent;
121
- border-bottom-color: transparent;
122
114
  }
123
115
 
124
- /* Position: Right */
125
- .tooltip.tooltip-right .tooltip-content {
126
- left: 100%;
127
- right: auto;
128
- top: 50%;
129
- bottom: auto;
130
- transform: translateY(-50%);
131
- margin-left: 0.5rem;
132
- margin-right: 0;
133
- margin-top: 0;
134
- margin-bottom: 0;
135
- }
136
-
137
- .tooltip.tooltip-right .tooltip-content::before {
116
+ .tooltip-right[popover]::before {
138
117
  right: 100%;
139
118
  left: auto;
140
119
  top: 50%;
141
120
  bottom: auto;
142
121
  transform: translateY(-50%);
143
- border-right-color: var(--color-on-surface);
144
- border-left-color: transparent;
122
+ border-right-color: var(--tooltip-bg);
145
123
  border-top-color: transparent;
146
- border-bottom-color: transparent;
147
- }
148
-
149
- /* Light Tooltip */
150
- .tooltip.tooltip-light .tooltip-content {
151
- background-color: var(--color-surface);
152
- color: var(--color-on-surface);
153
- border: 1px solid var(--color-outline);
154
- box-shadow: var(--shadow-md);
155
- }
156
-
157
- .tooltip.tooltip-light .tooltip-content::before {
158
- border-top-color: var(--color-surface);
159
- }
160
-
161
- .tooltip.tooltip-light.tooltip-bottom .tooltip-content::before {
162
- border-bottom-color: var(--color-surface);
163
- }
164
-
165
- .tooltip.tooltip-light.tooltip-left .tooltip-content::before {
166
- border-left-color: var(--color-surface);
167
- }
168
-
169
- .tooltip.tooltip-light.tooltip-right .tooltip-content::before {
170
- border-right-color: var(--color-surface);
171
- }
172
-
173
- /* Color Variants */
174
- .tooltip.tooltip-primary .tooltip-content {
175
- background-color: var(--color-primary);
176
- color: var(--color-primary-content);
177
- }
178
-
179
- .tooltip.tooltip-primary .tooltip-content::before {
180
- border-top-color: var(--color-primary);
181
- }
182
-
183
- .tooltip.tooltip-primary.tooltip-bottom .tooltip-content::before {
184
- border-bottom-color: var(--color-primary);
185
- }
186
-
187
- .tooltip.tooltip-primary.tooltip-left .tooltip-content::before {
188
- border-left-color: var(--color-primary);
189
- }
190
-
191
- .tooltip.tooltip-primary.tooltip-right .tooltip-content::before {
192
- border-right-color: var(--color-primary);
193
124
  }
194
125
 
195
- .tooltip.tooltip-secondary .tooltip-content {
196
- background-color: var(--color-secondary);
197
- color: var(--color-secondary-content);
198
- }
199
-
200
- .tooltip.tooltip-secondary .tooltip-content::before {
201
- border-top-color: var(--color-secondary);
202
- }
203
-
204
- .tooltip.tooltip-secondary.tooltip-bottom .tooltip-content::before {
205
- border-bottom-color: var(--color-secondary);
206
- }
207
-
208
- .tooltip.tooltip-secondary.tooltip-left .tooltip-content::before {
209
- border-left-color: var(--color-secondary);
210
- }
211
-
212
- .tooltip.tooltip-secondary.tooltip-right .tooltip-content::before {
213
- border-right-color: var(--color-secondary);
214
- }
215
-
216
- .tooltip.tooltip-error .tooltip-content {
217
- background-color: var(--color-error);
218
- color: var(--color-error-content);
219
- }
220
-
221
- .tooltip.tooltip-error .tooltip-content::before {
222
- border-top-color: var(--color-error);
223
- }
224
-
225
- .tooltip.tooltip-error.tooltip-bottom .tooltip-content::before {
226
- border-bottom-color: var(--color-error);
227
- }
228
-
229
- .tooltip.tooltip-error.tooltip-left .tooltip-content::before {
230
- border-left-color: var(--color-error);
231
- }
232
-
233
- .tooltip.tooltip-error.tooltip-right .tooltip-content::before {
234
- border-right-color: var(--color-error);
235
- }
236
-
237
- .tooltip.tooltip-tertiary .tooltip-content {
238
- background-color: var(--color-tertiary);
239
- color: var(--color-tertiary-content);
240
- }
241
-
242
- .tooltip.tooltip-tertiary .tooltip-content::before {
243
- border-top-color: var(--color-tertiary);
244
- }
245
-
246
- .tooltip.tooltip-tertiary.tooltip-bottom .tooltip-content::before {
247
- border-bottom-color: var(--color-tertiary);
248
- }
249
-
250
- .tooltip.tooltip-tertiary.tooltip-left .tooltip-content::before {
251
- border-left-color: var(--color-tertiary);
252
- }
253
-
254
- .tooltip.tooltip-tertiary.tooltip-right .tooltip-content::before {
255
- border-right-color: var(--color-tertiary);
256
- }
257
-
258
- .tooltip.tooltip-info .tooltip-content {
259
- background-color: var(--color-info);
260
- color: var(--color-info-content);
261
- }
262
-
263
- .tooltip.tooltip-info .tooltip-content::before {
264
- border-top-color: var(--color-info);
265
- }
266
-
267
- .tooltip.tooltip-info.tooltip-bottom .tooltip-content::before {
268
- border-bottom-color: var(--color-info);
269
- }
126
+ /* ========================================
127
+ * Color variants
128
+ * ======================================== */
270
129
 
271
- .tooltip.tooltip-info.tooltip-left .tooltip-content::before {
272
- border-left-color: var(--color-info);
273
- }
274
-
275
- .tooltip.tooltip-info.tooltip-right .tooltip-content::before {
276
- border-right-color: var(--color-info);
277
- }
278
-
279
- .tooltip.tooltip-success .tooltip-content {
280
- background-color: var(--color-success);
281
- color: var(--color-success-content);
282
- }
283
-
284
- .tooltip.tooltip-success .tooltip-content::before {
285
- border-top-color: var(--color-success);
286
- }
287
-
288
- .tooltip.tooltip-success.tooltip-bottom .tooltip-content::before {
289
- border-bottom-color: var(--color-success);
290
- }
291
-
292
- .tooltip.tooltip-success.tooltip-left .tooltip-content::before {
293
- border-left-color: var(--color-success);
294
- }
295
-
296
- .tooltip.tooltip-success.tooltip-right .tooltip-content::before {
297
- border-right-color: var(--color-success);
298
- }
299
-
300
- .tooltip.tooltip-warning .tooltip-content {
301
- background-color: var(--color-warning);
302
- color: var(--color-warning-content);
303
- }
304
-
305
- .tooltip.tooltip-warning .tooltip-content::before {
306
- border-top-color: var(--color-warning);
307
- }
308
-
309
- .tooltip.tooltip-warning.tooltip-bottom .tooltip-content::before {
310
- border-bottom-color: var(--color-warning);
311
- }
312
-
313
- .tooltip.tooltip-warning.tooltip-left .tooltip-content::before {
314
- border-left-color: var(--color-warning);
315
- }
316
-
317
- .tooltip.tooltip-warning.tooltip-right .tooltip-content::before {
318
- border-right-color: var(--color-warning);
319
- }
320
-
321
- .tooltip.tooltip-accent .tooltip-content {
322
- background-color: var(--color-accent);
323
- color: var(--color-accent-content);
324
- }
325
-
326
- .tooltip.tooltip-accent .tooltip-content::before {
327
- border-top-color: var(--color-accent);
328
- }
329
-
330
- .tooltip.tooltip-accent.tooltip-bottom .tooltip-content::before {
331
- border-bottom-color: var(--color-accent);
332
- }
333
-
334
- .tooltip.tooltip-accent.tooltip-left .tooltip-content::before {
335
- border-left-color: var(--color-accent);
130
+ .tooltip-light[popover] {
131
+ --tooltip-bg: var(--color-surface);
132
+ --tooltip-fg: var(--color-on-surface);
133
+ border: 1px solid var(--color-outline);
336
134
  }
337
135
 
338
- .tooltip.tooltip-accent.tooltip-right .tooltip-content::before {
339
- border-right-color: var(--color-accent);
136
+ .tooltip-primary[popover] {
137
+ --tooltip-bg: var(--color-primary);
138
+ --tooltip-fg: var(--color-primary-content);
340
139
  }
341
140
 
342
- .tooltip.tooltip-neutral .tooltip-content {
343
- background-color: var(--color-neutral);
344
- color: var(--color-neutral-content);
141
+ .tooltip-secondary[popover] {
142
+ --tooltip-bg: var(--color-secondary);
143
+ --tooltip-fg: var(--color-secondary-content);
345
144
  }
346
145
 
347
- .tooltip.tooltip-neutral .tooltip-content::before {
348
- border-top-color: var(--color-neutral);
146
+ .tooltip-tertiary[popover] {
147
+ --tooltip-bg: var(--color-tertiary);
148
+ --tooltip-fg: var(--color-tertiary-content);
349
149
  }
350
150
 
351
- .tooltip.tooltip-neutral.tooltip-bottom .tooltip-content::before {
352
- border-bottom-color: var(--color-neutral);
151
+ .tooltip-info[popover] {
152
+ --tooltip-bg: var(--color-info);
153
+ --tooltip-fg: var(--color-info-content);
353
154
  }
354
155
 
355
- .tooltip.tooltip-neutral.tooltip-left .tooltip-content::before {
356
- border-left-color: var(--color-neutral);
156
+ .tooltip-success[popover] {
157
+ --tooltip-bg: var(--color-success);
158
+ --tooltip-fg: var(--color-success-content);
357
159
  }
358
160
 
359
- .tooltip.tooltip-neutral.tooltip-right .tooltip-content::before {
360
- border-right-color: var(--color-neutral);
161
+ .tooltip-warning[popover] {
162
+ --tooltip-bg: var(--color-warning);
163
+ --tooltip-fg: var(--color-warning-content);
361
164
  }
362
165
 
363
- .tooltip.tooltip-base .tooltip-content {
364
- background-color: var(--color-base-100);
365
- color: var(--color-base-content);
166
+ .tooltip-error[popover] {
167
+ --tooltip-bg: var(--color-error);
168
+ --tooltip-fg: var(--color-error-content);
366
169
  }
367
170
 
368
- .tooltip.tooltip-base .tooltip-content::before {
369
- border-top-color: var(--color-base-100);
171
+ .tooltip-accent[popover] {
172
+ --tooltip-bg: var(--color-accent);
173
+ --tooltip-fg: var(--color-accent-content);
370
174
  }
371
175
 
372
- .tooltip.tooltip-base.tooltip-bottom .tooltip-content::before {
373
- border-bottom-color: var(--color-base-100);
176
+ .tooltip-neutral[popover] {
177
+ --tooltip-bg: var(--color-neutral);
178
+ --tooltip-fg: var(--color-neutral-content);
374
179
  }
375
180
 
376
- .tooltip.tooltip-base.tooltip-left .tooltip-content::before {
377
- border-left-color: var(--color-base-100);
181
+ .tooltip-base[popover] {
182
+ --tooltip-bg: var(--color-base-100);
183
+ --tooltip-fg: var(--color-base-content);
378
184
  }
379
185
 
380
- .tooltip.tooltip-base.tooltip-right .tooltip-content::before {
381
- border-right-color: var(--color-base-100);
382
- }
186
+ /* ========================================
187
+ * Content variants
188
+ * ======================================== */
383
189
 
384
- /* Multi-line Tooltip */
385
- .tooltip-multiline .tooltip-content {
190
+ .tooltip-multiline[popover] {
386
191
  white-space: normal;
387
192
  max-width: 16rem;
388
193
  text-align: center;
389
194
  }
390
195
 
391
- /* Rich Tooltip */
392
- .tooltip-rich .tooltip-content {
196
+ .tooltip-rich[popover] {
393
197
  padding: 0.75rem 1rem;
394
198
  max-width: 20rem;
395
199
  white-space: normal;
@@ -408,23 +212,28 @@
408
212
  opacity: 0.9;
409
213
  }
410
214
 
411
- /* Delay Variants */
412
- .tooltip-delay .tooltip-content {
413
- transition-delay: 300ms;
215
+ /* ========================================
216
+ * Invoker utilities (apply on the trigger)
217
+ * ======================================== */
218
+
219
+ .tooltip-delay {
220
+ interest-delay: 300ms;
414
221
  }
415
222
 
416
- .tooltip-delay-long .tooltip-content {
417
- transition-delay: 500ms;
223
+ .tooltip-delay-long {
224
+ interest-delay: 500ms;
418
225
  }
419
226
 
420
- /* Interactive Tooltip */
421
- .tooltip-interactive .tooltip-content {
227
+ .tooltip-interactive[popover] {
422
228
  pointer-events: auto;
423
229
  }
424
230
 
425
- /* Reduce Motion */
231
+ /* ========================================
232
+ * Reduce Motion
233
+ * ======================================== */
234
+
426
235
  @media (prefers-reduced-motion: reduce) {
427
- .tooltip-content {
236
+ .tooltip[popover] {
428
237
  transition: none;
429
238
  }
430
239
  }
@@ -130,6 +130,56 @@ export const css = `/**
130
130
  filter: none;
131
131
  }
132
132
 
133
+ /* Semantic Colors — must precede outline/ghost/text/tonal so those variants
134
+ can override the filled background at equal specificity. */
135
+ .btn-info {
136
+ --btn-text-color: var(--color-info-content);
137
+ background-color: var(--color-info);
138
+ border-color: var(--color-info);
139
+ }
140
+
141
+ .btn-info:hover {
142
+ background-color: color-mix(in oklch, var(--color-info), black 10%);
143
+ border-color: color-mix(in oklch, var(--color-info), black 10%);
144
+ filter: none;
145
+ }
146
+
147
+ .btn-success {
148
+ --btn-text-color: var(--color-success-content);
149
+ background-color: var(--color-success);
150
+ border-color: var(--color-success);
151
+ }
152
+
153
+ .btn-success:hover {
154
+ background-color: color-mix(in oklch, var(--color-success), black 10%);
155
+ border-color: color-mix(in oklch, var(--color-success), black 10%);
156
+ filter: none;
157
+ }
158
+
159
+ .btn-warning {
160
+ --btn-text-color: var(--color-warning-content);
161
+ background-color: var(--color-warning);
162
+ border-color: var(--color-warning);
163
+ }
164
+
165
+ .btn-warning:hover {
166
+ background-color: color-mix(in oklch, var(--color-warning), black 10%);
167
+ border-color: color-mix(in oklch, var(--color-warning), black 10%);
168
+ filter: none;
169
+ }
170
+
171
+ .btn-error {
172
+ --btn-text-color: var(--color-error-content);
173
+ background-color: var(--color-error);
174
+ border-color: var(--color-error);
175
+ }
176
+
177
+ .btn-error:hover {
178
+ background-color: color-mix(in oklch, var(--color-error), black 10%);
179
+ border-color: color-mix(in oklch, var(--color-error), black 10%);
180
+ filter: none;
181
+ }
182
+
133
183
  /* Outline / Outlined Variant (.btn-outlined is an alias) */
134
184
  .btn-outline,
135
185
  .btn-outlined {
@@ -489,55 +539,6 @@ export const css = `/**
489
539
  background-color: var(--color-error-container);
490
540
  }
491
541
 
492
- /* Semantic Colors */
493
- .btn-info {
494
- --btn-text-color: var(--color-info-content);
495
- background-color: var(--color-info);
496
- border-color: var(--color-info);
497
- }
498
-
499
- .btn-info:hover {
500
- background-color: color-mix(in oklch, var(--color-info), black 10%);
501
- border-color: color-mix(in oklch, var(--color-info), black 10%);
502
- filter: none;
503
- }
504
-
505
- .btn-success {
506
- --btn-text-color: var(--color-success-content);
507
- background-color: var(--color-success);
508
- border-color: var(--color-success);
509
- }
510
-
511
- .btn-success:hover {
512
- background-color: color-mix(in oklch, var(--color-success), black 10%);
513
- border-color: color-mix(in oklch, var(--color-success), black 10%);
514
- filter: none;
515
- }
516
-
517
- .btn-warning {
518
- --btn-text-color: var(--color-warning-content);
519
- background-color: var(--color-warning);
520
- border-color: var(--color-warning);
521
- }
522
-
523
- .btn-warning:hover {
524
- background-color: color-mix(in oklch, var(--color-warning), black 10%);
525
- border-color: color-mix(in oklch, var(--color-warning), black 10%);
526
- filter: none;
527
- }
528
-
529
- .btn-error {
530
- --btn-text-color: var(--color-error-content);
531
- background-color: var(--color-error);
532
- border-color: var(--color-error);
533
- }
534
-
535
- .btn-error:hover {
536
- background-color: color-mix(in oklch, var(--color-error), black 10%);
537
- border-color: color-mix(in oklch, var(--color-error), black 10%);
538
- filter: none;
539
- }
540
-
541
542
  /* Size Variants */
542
543
  .btn-xs {
543
544
  --btn-p: 0.5rem;