@gravionlabs/helix-ui 22.2.6 → 22.2.7

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/core.css ADDED
@@ -0,0 +1,4082 @@
1
+ /* @gravionlabs/helix-ui: generated by scripts/build-ui-css.mjs from projects/ui/styles (do not edit). */
2
+ /* The layer order Tailwind uses, stated here so it holds whichever stylesheet loads first. */
3
+ @layer theme, base, components, utilities;
4
+
5
+ @layer components {
6
+ /* cdk-overlay */
7
+ .cdk-overlay-container, .cdk-global-overlay-wrapper {
8
+ pointer-events: none;
9
+ top: 0;
10
+ left: 0;
11
+ height: 100%;
12
+ width: 100%;
13
+ }
14
+
15
+ .cdk-overlay-container {
16
+ position: fixed;
17
+ z-index: 1000;
18
+ }
19
+ .cdk-overlay-container:empty {
20
+ display: none;
21
+ }
22
+
23
+ .cdk-global-overlay-wrapper {
24
+ display: flex;
25
+ position: absolute;
26
+ z-index: 1000;
27
+ }
28
+
29
+ .cdk-overlay-pane {
30
+ position: absolute;
31
+ pointer-events: auto;
32
+ box-sizing: border-box;
33
+ display: flex;
34
+ max-width: 100%;
35
+ max-height: 100%;
36
+ z-index: 1000;
37
+ }
38
+
39
+ .cdk-overlay-backdrop {
40
+ position: absolute;
41
+ top: 0;
42
+ bottom: 0;
43
+ left: 0;
44
+ right: 0;
45
+ pointer-events: auto;
46
+ -webkit-tap-highlight-color: transparent;
47
+ opacity: 0;
48
+ touch-action: manipulation;
49
+ z-index: 1000;
50
+ transition: opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1);
51
+ }
52
+ @media (prefers-reduced-motion) {
53
+ .cdk-overlay-backdrop {
54
+ transition-duration: 1ms;
55
+ }
56
+ }
57
+
58
+ .cdk-overlay-backdrop-showing {
59
+ opacity: 1;
60
+ }
61
+ @media (forced-colors: active) {
62
+ .cdk-overlay-backdrop-showing {
63
+ opacity: 0.6;
64
+ }
65
+ }
66
+
67
+ .cdk-overlay-dark-backdrop {
68
+ background: rgba(0, 0, 0, 0.32);
69
+ }
70
+
71
+ .cdk-overlay-transparent-backdrop {
72
+ transition: visibility 1ms linear, opacity 1ms linear;
73
+ visibility: hidden;
74
+ opacity: 1;
75
+ }
76
+ .cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing, .cdk-high-contrast-active .cdk-overlay-transparent-backdrop {
77
+ opacity: 0;
78
+ visibility: visible;
79
+ }
80
+
81
+ .cdk-overlay-backdrop-noop-animation {
82
+ transition: none;
83
+ }
84
+
85
+ .cdk-overlay-connected-position-bounding-box {
86
+ position: absolute;
87
+ display: flex;
88
+ flex-direction: column;
89
+ min-width: 1px;
90
+ min-height: 1px;
91
+ z-index: 1000;
92
+ }
93
+
94
+ .cdk-global-scrollblock {
95
+ position: fixed;
96
+ width: 100%;
97
+ overflow-y: scroll;
98
+ }
99
+
100
+ .cdk-overlay-popover {
101
+ background: none;
102
+ border: none;
103
+ padding: 0;
104
+ outline: 0;
105
+ overflow: visible;
106
+ position: fixed;
107
+ pointer-events: none;
108
+ white-space: normal;
109
+ color: inherit;
110
+ text-decoration: none;
111
+ width: 100%;
112
+ height: 100%;
113
+ inset: auto;
114
+ top: 0;
115
+ left: 0;
116
+ }
117
+ .cdk-overlay-popover::backdrop {
118
+ display: none;
119
+ }
120
+ .cdk-overlay-popover .cdk-overlay-backdrop {
121
+ position: fixed;
122
+ z-index: auto;
123
+ }
124
+
125
+ /* accordion */
126
+ /*
127
+ * Accordion: `<hx-accordion>`. Stacked panels from the `--h-accordion-*` tokens: a header button inside a heading
128
+ * and a content region that collapses by animating its grid row to zero height.
129
+ */
130
+ .hx-accordion {
131
+ display: block;
132
+ }
133
+
134
+ .hx-accordion-panel {
135
+ display: block;
136
+ border-style: solid;
137
+ border-width: var(--h-accordion-panel-border-width);
138
+ border-color: var(--h-accordion-panel-border-color);
139
+ }
140
+
141
+ .hx-accordion-heading {
142
+ margin: 0;
143
+ font: inherit;
144
+ }
145
+
146
+ .hx-accordion-trigger {
147
+ display: flex;
148
+ align-items: center;
149
+ justify-content: space-between;
150
+ gap: 0.5rem;
151
+ box-sizing: border-box;
152
+ width: 100%;
153
+ padding: var(--h-accordion-header-padding);
154
+ border: var(--h-accordion-header-border-width) solid var(--h-accordion-header-border-color);
155
+ border-radius: var(--h-accordion-header-border-radius);
156
+ background: var(--h-accordion-header-background);
157
+ color: var(--h-accordion-header-color);
158
+ font: inherit;
159
+ font-weight: var(--h-accordion-header-font-weight);
160
+ text-align: start;
161
+ cursor: pointer;
162
+ outline: 0 none;
163
+ transition: background var(--h-accordion-transition-duration), color var(--h-accordion-transition-duration);
164
+ }
165
+
166
+ .hx-accordion-trigger:not(:disabled):hover {
167
+ background: var(--h-accordion-header-hover-background);
168
+ color: var(--h-accordion-header-hover-color);
169
+ }
170
+
171
+ .hx-accordion-trigger[aria-expanded=true] {
172
+ background: var(--h-accordion-header-active-background);
173
+ color: var(--h-accordion-header-active-color);
174
+ }
175
+
176
+ .hx-accordion-trigger[aria-expanded=true]:not(:disabled):hover {
177
+ background: var(--h-accordion-header-active-hover-background);
178
+ color: var(--h-accordion-header-active-hover-color);
179
+ }
180
+
181
+ .hx-accordion-trigger:focus-visible {
182
+ outline: var(--h-accordion-header-focus-ring-width) var(--h-accordion-header-focus-ring-style) var(--h-accordion-header-focus-ring-color);
183
+ outline-offset: var(--h-accordion-header-focus-ring-offset);
184
+ box-shadow: var(--h-accordion-header-focus-ring-shadow);
185
+ }
186
+
187
+ .hx-accordion-trigger:disabled {
188
+ opacity: 0.6;
189
+ cursor: default;
190
+ }
191
+
192
+ .hx-accordion-icon {
193
+ display: inline-block;
194
+ flex: none;
195
+ width: 1rem;
196
+ height: 1rem;
197
+ background: var(--h-accordion-header-toggle-icon-color);
198
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") center/contain no-repeat;
199
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") center/contain no-repeat;
200
+ transition: transform 0.2s;
201
+ }
202
+
203
+ .hx-accordion-trigger:not(:disabled):hover .hx-accordion-icon {
204
+ background: var(--h-accordion-header-toggle-icon-hover-color);
205
+ }
206
+
207
+ .hx-accordion-trigger[aria-expanded=true] .hx-accordion-icon {
208
+ background: var(--h-accordion-header-toggle-icon-active-color);
209
+ transform: rotate(180deg);
210
+ }
211
+
212
+ .hx-accordion-content {
213
+ display: block;
214
+ background: var(--h-accordion-content-background);
215
+ color: var(--h-accordion-content-color);
216
+ }
217
+
218
+ .hx-accordion-collapse {
219
+ display: grid;
220
+ grid-template-rows: 1fr;
221
+ transition: grid-template-rows 0.2s, visibility 0.2s;
222
+ }
223
+
224
+ .hx-accordion-content[inert] .hx-accordion-collapse {
225
+ grid-template-rows: 0fr;
226
+ visibility: hidden;
227
+ }
228
+
229
+ .hx-accordion-collapse-inner {
230
+ min-height: 0;
231
+ overflow: hidden;
232
+ }
233
+
234
+ .hx-accordion-body {
235
+ padding: var(--h-accordion-content-padding);
236
+ border: solid var(--h-accordion-content-border-color);
237
+ border-width: var(--h-accordion-content-border-width);
238
+ }
239
+
240
+ .hx-accordion-panel-open {
241
+ border-color: var(--h-accordion-panel-border-color);
242
+ }
243
+
244
+ .hx-accordion-panel-disabled .hx-accordion-header {
245
+ opacity: 0.6;
246
+ }
247
+
248
+ @media (prefers-reduced-motion: reduce) {
249
+ .hx-accordion-collapse,
250
+ .hx-accordion-icon,
251
+ .hx-accordion-trigger {
252
+ transition: none;
253
+ }
254
+ }
255
+
256
+ /* avatar */
257
+ /*
258
+ * Avatar: `<hx-avatar>` and `<hx-avatar-group>`. A fixed-size box from the `--h-avatar-*` tokens holding a picture,
259
+ * initials or an icon; the group overlaps its avatars by the group offset of their size.
260
+ */
261
+ .hx-avatar {
262
+ --hx-avatar-width: var(--h-avatar-width);
263
+ --hx-avatar-height: var(--h-avatar-height);
264
+ --hx-avatar-font-size: var(--h-avatar-font-size);
265
+ --hx-avatar-icon-size: var(--h-avatar-icon-size);
266
+ --hx-avatar-offset: var(--h-avatar-group-offset);
267
+ display: inline-flex;
268
+ flex: none;
269
+ align-items: center;
270
+ justify-content: center;
271
+ box-sizing: border-box;
272
+ width: var(--hx-avatar-width);
273
+ height: var(--hx-avatar-height);
274
+ overflow: hidden;
275
+ border-radius: var(--h-avatar-border-radius);
276
+ background: var(--h-avatar-background);
277
+ color: var(--h-avatar-color);
278
+ font-size: var(--hx-avatar-font-size);
279
+ }
280
+
281
+ .hx-avatar-lg {
282
+ --hx-avatar-width: var(--h-avatar-lg-width);
283
+ --hx-avatar-height: var(--h-avatar-lg-height);
284
+ --hx-avatar-font-size: var(--h-avatar-lg-font-size);
285
+ --hx-avatar-icon-size: var(--h-avatar-lg-icon-size);
286
+ --hx-avatar-offset: var(--h-avatar-lg-group-offset);
287
+ }
288
+
289
+ .hx-avatar-xl {
290
+ --hx-avatar-width: var(--h-avatar-xl-width);
291
+ --hx-avatar-height: var(--h-avatar-xl-height);
292
+ --hx-avatar-font-size: var(--h-avatar-xl-font-size);
293
+ --hx-avatar-icon-size: var(--h-avatar-xl-icon-size);
294
+ --hx-avatar-offset: var(--h-avatar-xl-group-offset);
295
+ }
296
+
297
+ .hx-avatar-circle {
298
+ border-radius: 50%;
299
+ }
300
+
301
+ .hx-avatar-image {
302
+ width: 100%;
303
+ height: 100%;
304
+ object-fit: cover;
305
+ }
306
+
307
+ .hx-avatar-icon {
308
+ font-size: var(--hx-avatar-icon-size);
309
+ }
310
+
311
+ .hx-avatar-group {
312
+ display: inline-flex;
313
+ align-items: center;
314
+ }
315
+
316
+ .hx-avatar-group > .hx-avatar {
317
+ border: 2px solid var(--h-avatar-group-border-color);
318
+ }
319
+
320
+ .hx-avatar-group > .hx-avatar:not(:first-child) {
321
+ margin-inline-start: var(--hx-avatar-offset);
322
+ }
323
+
324
+ /* badge */
325
+ /*
326
+ * Badge: `<hx-badge>` and `<hx-overlay-badge>`. A pill from the `--h-badge-*` tokens whose colours follow the
327
+ * severity; without text it is a dot. The overlay badge sits on the top right corner of the element it wraps, with a
328
+ * ring in the page colour (`--h-overlaybadge-*`).
329
+ */
330
+ .hx-badge {
331
+ --hx-badge-background: var(--h-badge-primary-background);
332
+ --hx-badge-color: var(--h-badge-primary-color);
333
+ --hx-badge-font-size: var(--h-badge-font-size);
334
+ --hx-badge-size: var(--h-badge-height);
335
+ --hx-badge-min-width: var(--h-badge-min-width);
336
+ display: inline-flex;
337
+ align-items: center;
338
+ justify-content: center;
339
+ box-sizing: border-box;
340
+ min-width: var(--hx-badge-min-width);
341
+ height: var(--hx-badge-size);
342
+ padding: var(--h-badge-padding);
343
+ border-radius: var(--h-badge-border-radius);
344
+ background: var(--hx-badge-background);
345
+ color: var(--hx-badge-color);
346
+ font-size: var(--hx-badge-font-size);
347
+ font-weight: var(--h-badge-font-weight);
348
+ line-height: 1;
349
+ white-space: nowrap;
350
+ }
351
+
352
+ .hx-badge-secondary {
353
+ --hx-badge-background: var(--h-badge-secondary-background);
354
+ --hx-badge-color: var(--h-badge-secondary-color);
355
+ }
356
+
357
+ .hx-badge-success {
358
+ --hx-badge-background: var(--h-badge-success-background);
359
+ --hx-badge-color: var(--h-badge-success-color);
360
+ }
361
+
362
+ .hx-badge-info {
363
+ --hx-badge-background: var(--h-badge-info-background);
364
+ --hx-badge-color: var(--h-badge-info-color);
365
+ }
366
+
367
+ .hx-badge-warn {
368
+ --hx-badge-background: var(--h-badge-warn-background);
369
+ --hx-badge-color: var(--h-badge-warn-color);
370
+ }
371
+
372
+ .hx-badge-danger {
373
+ --hx-badge-background: var(--h-badge-danger-background);
374
+ --hx-badge-color: var(--h-badge-danger-color);
375
+ }
376
+
377
+ .hx-badge-contrast {
378
+ --hx-badge-background: var(--h-badge-contrast-background);
379
+ --hx-badge-color: var(--h-badge-contrast-color);
380
+ }
381
+
382
+ .hx-badge-sm {
383
+ --hx-badge-font-size: var(--h-badge-sm-font-size);
384
+ --hx-badge-size: var(--h-badge-sm-height);
385
+ --hx-badge-min-width: var(--h-badge-sm-min-width);
386
+ }
387
+
388
+ .hx-badge-lg {
389
+ --hx-badge-font-size: var(--h-badge-lg-font-size);
390
+ --hx-badge-size: var(--h-badge-lg-height);
391
+ --hx-badge-min-width: var(--h-badge-lg-min-width);
392
+ }
393
+
394
+ .hx-badge-xl {
395
+ --hx-badge-font-size: var(--h-badge-xl-font-size);
396
+ --hx-badge-size: var(--h-badge-xl-height);
397
+ --hx-badge-min-width: var(--h-badge-xl-min-width);
398
+ }
399
+
400
+ .hx-badge-dot {
401
+ --hx-badge-size: var(--h-badge-dot-size);
402
+ --hx-badge-min-width: var(--h-badge-dot-size);
403
+ padding: 0;
404
+ }
405
+
406
+ .hx-overlay-badge {
407
+ position: relative;
408
+ display: inline-flex;
409
+ }
410
+
411
+ .hx-overlay-badge-badge {
412
+ position: absolute;
413
+ inset-block-start: 0;
414
+ inset-inline-end: 0;
415
+ transform: translate(50%, -50%);
416
+ outline: var(--h-overlaybadge-outline-width) solid var(--h-overlaybadge-outline-color);
417
+ }
418
+
419
+ [dir=rtl] .hx-overlay-badge-badge {
420
+ transform: translate(-50%, -50%);
421
+ }
422
+
423
+ /* button-group */
424
+ /*
425
+ * Button group: `<hx-button-group>`. Joins the `hx-button`s inside it: the inner corners are square (the outer ones
426
+ * keep the radius of the button tokens) and neighbouring borders overlap by one pixel instead of doubling. The
427
+ * focused or hovered button is raised so its border is not covered by the next one.
428
+ */
429
+ .hx-button-group {
430
+ display: inline-flex;
431
+ }
432
+
433
+ .hx-button-group > .hx-button:not(:first-child) {
434
+ margin-inline-start: -1px;
435
+ border-start-start-radius: 0;
436
+ border-end-start-radius: 0;
437
+ }
438
+
439
+ .hx-button-group > .hx-button:not(:last-child) {
440
+ border-start-end-radius: 0;
441
+ border-end-end-radius: 0;
442
+ }
443
+
444
+ .hx-button-group > .hx-button:hover,
445
+ .hx-button-group > .hx-button:focus-visible {
446
+ z-index: 1;
447
+ }
448
+
449
+ /* button */
450
+ /*
451
+ * Button: `button[hx-button]` / `a[hx-button]`. Styled by the tokens (`--h-button-*`). A severity class only maps its tokens onto local `--hx-*`
452
+ * variables; the variant rules (filled, outlined, text, link) read those, so every severity works with every variant.
453
+ */
454
+ .hx-button,
455
+ .hx-button-primary {
456
+ --hx-bg: var(--h-button-primary-background);
457
+ --hx-bd: var(--h-button-primary-border-color);
458
+ --hx-fg: var(--h-button-primary-color);
459
+ --hx-bg-h: var(--h-button-primary-hover-background);
460
+ --hx-bd-h: var(--h-button-primary-hover-border-color);
461
+ --hx-fg-h: var(--h-button-primary-hover-color);
462
+ --hx-bg-a: var(--h-button-primary-active-background);
463
+ --hx-bd-a: var(--h-button-primary-active-border-color);
464
+ --hx-fg-a: var(--h-button-primary-active-color);
465
+ --hx-ring: var(--h-button-primary-focus-ring-color);
466
+ --hx-ring-shadow: var(--h-button-primary-focus-ring-shadow);
467
+ --hx-o-fg: var(--h-button-outlined-primary-color);
468
+ --hx-o-bd: var(--h-button-outlined-primary-border-color);
469
+ --hx-o-bg-h: var(--h-button-outlined-primary-hover-background);
470
+ --hx-o-bg-a: var(--h-button-outlined-primary-active-background);
471
+ --hx-t-fg: var(--h-button-text-primary-color);
472
+ --hx-t-bg-h: var(--h-button-text-primary-hover-background);
473
+ --hx-t-bg-a: var(--h-button-text-primary-active-background);
474
+ }
475
+
476
+ .hx-button-secondary {
477
+ --hx-bg: var(--h-button-secondary-background);
478
+ --hx-bd: var(--h-button-secondary-border-color);
479
+ --hx-fg: var(--h-button-secondary-color);
480
+ --hx-bg-h: var(--h-button-secondary-hover-background);
481
+ --hx-bd-h: var(--h-button-secondary-hover-border-color);
482
+ --hx-fg-h: var(--h-button-secondary-hover-color);
483
+ --hx-bg-a: var(--h-button-secondary-active-background);
484
+ --hx-bd-a: var(--h-button-secondary-active-border-color);
485
+ --hx-fg-a: var(--h-button-secondary-active-color);
486
+ --hx-ring: var(--h-button-secondary-focus-ring-color);
487
+ --hx-ring-shadow: var(--h-button-secondary-focus-ring-shadow);
488
+ --hx-o-fg: var(--h-button-outlined-secondary-color);
489
+ --hx-o-bd: var(--h-button-outlined-secondary-border-color);
490
+ --hx-o-bg-h: var(--h-button-outlined-secondary-hover-background);
491
+ --hx-o-bg-a: var(--h-button-outlined-secondary-active-background);
492
+ --hx-t-fg: var(--h-button-text-secondary-color);
493
+ --hx-t-bg-h: var(--h-button-text-secondary-hover-background);
494
+ --hx-t-bg-a: var(--h-button-text-secondary-active-background);
495
+ }
496
+
497
+ .hx-button-success {
498
+ --hx-bg: var(--h-button-success-background);
499
+ --hx-bd: var(--h-button-success-border-color);
500
+ --hx-fg: var(--h-button-success-color);
501
+ --hx-bg-h: var(--h-button-success-hover-background);
502
+ --hx-bd-h: var(--h-button-success-hover-border-color);
503
+ --hx-fg-h: var(--h-button-success-hover-color);
504
+ --hx-bg-a: var(--h-button-success-active-background);
505
+ --hx-bd-a: var(--h-button-success-active-border-color);
506
+ --hx-fg-a: var(--h-button-success-active-color);
507
+ --hx-ring: var(--h-button-success-focus-ring-color);
508
+ --hx-ring-shadow: var(--h-button-success-focus-ring-shadow);
509
+ --hx-o-fg: var(--h-button-outlined-success-color);
510
+ --hx-o-bd: var(--h-button-outlined-success-border-color);
511
+ --hx-o-bg-h: var(--h-button-outlined-success-hover-background);
512
+ --hx-o-bg-a: var(--h-button-outlined-success-active-background);
513
+ --hx-t-fg: var(--h-button-text-success-color);
514
+ --hx-t-bg-h: var(--h-button-text-success-hover-background);
515
+ --hx-t-bg-a: var(--h-button-text-success-active-background);
516
+ }
517
+
518
+ .hx-button-info {
519
+ --hx-bg: var(--h-button-info-background);
520
+ --hx-bd: var(--h-button-info-border-color);
521
+ --hx-fg: var(--h-button-info-color);
522
+ --hx-bg-h: var(--h-button-info-hover-background);
523
+ --hx-bd-h: var(--h-button-info-hover-border-color);
524
+ --hx-fg-h: var(--h-button-info-hover-color);
525
+ --hx-bg-a: var(--h-button-info-active-background);
526
+ --hx-bd-a: var(--h-button-info-active-border-color);
527
+ --hx-fg-a: var(--h-button-info-active-color);
528
+ --hx-ring: var(--h-button-info-focus-ring-color);
529
+ --hx-ring-shadow: var(--h-button-info-focus-ring-shadow);
530
+ --hx-o-fg: var(--h-button-outlined-info-color);
531
+ --hx-o-bd: var(--h-button-outlined-info-border-color);
532
+ --hx-o-bg-h: var(--h-button-outlined-info-hover-background);
533
+ --hx-o-bg-a: var(--h-button-outlined-info-active-background);
534
+ --hx-t-fg: var(--h-button-text-info-color);
535
+ --hx-t-bg-h: var(--h-button-text-info-hover-background);
536
+ --hx-t-bg-a: var(--h-button-text-info-active-background);
537
+ }
538
+
539
+ .hx-button-warn {
540
+ --hx-bg: var(--h-button-warn-background);
541
+ --hx-bd: var(--h-button-warn-border-color);
542
+ --hx-fg: var(--h-button-warn-color);
543
+ --hx-bg-h: var(--h-button-warn-hover-background);
544
+ --hx-bd-h: var(--h-button-warn-hover-border-color);
545
+ --hx-fg-h: var(--h-button-warn-hover-color);
546
+ --hx-bg-a: var(--h-button-warn-active-background);
547
+ --hx-bd-a: var(--h-button-warn-active-border-color);
548
+ --hx-fg-a: var(--h-button-warn-active-color);
549
+ --hx-ring: var(--h-button-warn-focus-ring-color);
550
+ --hx-ring-shadow: var(--h-button-warn-focus-ring-shadow);
551
+ --hx-o-fg: var(--h-button-outlined-warn-color);
552
+ --hx-o-bd: var(--h-button-outlined-warn-border-color);
553
+ --hx-o-bg-h: var(--h-button-outlined-warn-hover-background);
554
+ --hx-o-bg-a: var(--h-button-outlined-warn-active-background);
555
+ --hx-t-fg: var(--h-button-text-warn-color);
556
+ --hx-t-bg-h: var(--h-button-text-warn-hover-background);
557
+ --hx-t-bg-a: var(--h-button-text-warn-active-background);
558
+ }
559
+
560
+ .hx-button-help {
561
+ --hx-bg: var(--h-button-help-background);
562
+ --hx-bd: var(--h-button-help-border-color);
563
+ --hx-fg: var(--h-button-help-color);
564
+ --hx-bg-h: var(--h-button-help-hover-background);
565
+ --hx-bd-h: var(--h-button-help-hover-border-color);
566
+ --hx-fg-h: var(--h-button-help-hover-color);
567
+ --hx-bg-a: var(--h-button-help-active-background);
568
+ --hx-bd-a: var(--h-button-help-active-border-color);
569
+ --hx-fg-a: var(--h-button-help-active-color);
570
+ --hx-ring: var(--h-button-help-focus-ring-color);
571
+ --hx-ring-shadow: var(--h-button-help-focus-ring-shadow);
572
+ --hx-o-fg: var(--h-button-outlined-help-color);
573
+ --hx-o-bd: var(--h-button-outlined-help-border-color);
574
+ --hx-o-bg-h: var(--h-button-outlined-help-hover-background);
575
+ --hx-o-bg-a: var(--h-button-outlined-help-active-background);
576
+ --hx-t-fg: var(--h-button-text-help-color);
577
+ --hx-t-bg-h: var(--h-button-text-help-hover-background);
578
+ --hx-t-bg-a: var(--h-button-text-help-active-background);
579
+ }
580
+
581
+ .hx-button-danger {
582
+ --hx-bg: var(--h-button-danger-background);
583
+ --hx-bd: var(--h-button-danger-border-color);
584
+ --hx-fg: var(--h-button-danger-color);
585
+ --hx-bg-h: var(--h-button-danger-hover-background);
586
+ --hx-bd-h: var(--h-button-danger-hover-border-color);
587
+ --hx-fg-h: var(--h-button-danger-hover-color);
588
+ --hx-bg-a: var(--h-button-danger-active-background);
589
+ --hx-bd-a: var(--h-button-danger-active-border-color);
590
+ --hx-fg-a: var(--h-button-danger-active-color);
591
+ --hx-ring: var(--h-button-danger-focus-ring-color);
592
+ --hx-ring-shadow: var(--h-button-danger-focus-ring-shadow);
593
+ --hx-o-fg: var(--h-button-outlined-danger-color);
594
+ --hx-o-bd: var(--h-button-outlined-danger-border-color);
595
+ --hx-o-bg-h: var(--h-button-outlined-danger-hover-background);
596
+ --hx-o-bg-a: var(--h-button-outlined-danger-active-background);
597
+ --hx-t-fg: var(--h-button-text-danger-color);
598
+ --hx-t-bg-h: var(--h-button-text-danger-hover-background);
599
+ --hx-t-bg-a: var(--h-button-text-danger-active-background);
600
+ }
601
+
602
+ .hx-button-contrast {
603
+ --hx-bg: var(--h-button-contrast-background);
604
+ --hx-bd: var(--h-button-contrast-border-color);
605
+ --hx-fg: var(--h-button-contrast-color);
606
+ --hx-bg-h: var(--h-button-contrast-hover-background);
607
+ --hx-bd-h: var(--h-button-contrast-hover-border-color);
608
+ --hx-fg-h: var(--h-button-contrast-hover-color);
609
+ --hx-bg-a: var(--h-button-contrast-active-background);
610
+ --hx-bd-a: var(--h-button-contrast-active-border-color);
611
+ --hx-fg-a: var(--h-button-contrast-active-color);
612
+ --hx-ring: var(--h-button-contrast-focus-ring-color);
613
+ --hx-ring-shadow: var(--h-button-contrast-focus-ring-shadow);
614
+ --hx-o-fg: var(--h-button-outlined-contrast-color);
615
+ --hx-o-bd: var(--h-button-outlined-contrast-border-color);
616
+ --hx-o-bg-h: var(--h-button-outlined-contrast-hover-background);
617
+ --hx-o-bg-a: var(--h-button-outlined-contrast-active-background);
618
+ --hx-t-fg: var(--h-button-text-contrast-color);
619
+ --hx-t-bg-h: var(--h-button-text-contrast-hover-background);
620
+ --hx-t-bg-a: var(--h-button-text-contrast-active-background);
621
+ }
622
+
623
+ /* base: filled */
624
+ .hx-button {
625
+ position: relative;
626
+ display: inline-flex;
627
+ align-items: center;
628
+ justify-content: center;
629
+ gap: var(--h-button-gap);
630
+ overflow: hidden;
631
+ box-sizing: border-box;
632
+ padding: var(--h-button-padding-y) var(--h-button-padding-x);
633
+ border: 1px solid var(--hx-bd);
634
+ border-radius: var(--h-button-border-radius);
635
+ background: var(--hx-bg);
636
+ color: var(--hx-fg);
637
+ font: inherit;
638
+ font-size: 1rem;
639
+ font-weight: var(--h-button-label-font-weight);
640
+ text-decoration: none;
641
+ cursor: pointer;
642
+ user-select: none;
643
+ outline-color: transparent;
644
+ transition: background var(--h-button-transition-duration), color var(--h-button-transition-duration), border-color var(--h-button-transition-duration), outline-color var(--h-button-transition-duration), box-shadow var(--h-button-transition-duration);
645
+ }
646
+
647
+ .hx-button:not(:disabled, [aria-disabled=true]):hover {
648
+ border-color: var(--hx-bd-h);
649
+ background: var(--hx-bg-h);
650
+ color: var(--hx-fg-h);
651
+ }
652
+
653
+ .hx-button:not(:disabled, [aria-disabled=true]):active {
654
+ border-color: var(--hx-bd-a);
655
+ background: var(--hx-bg-a);
656
+ color: var(--hx-fg-a);
657
+ }
658
+
659
+ .hx-button:focus-visible {
660
+ outline: var(--h-button-focus-ring-width) var(--h-button-focus-ring-style) var(--hx-ring);
661
+ outline-offset: var(--h-button-focus-ring-offset);
662
+ box-shadow: var(--hx-ring-shadow);
663
+ }
664
+
665
+ .hx-button:disabled,
666
+ .hx-button[aria-disabled=true] {
667
+ cursor: default;
668
+ opacity: var(--h-disabled-opacity, 0.6);
669
+ }
670
+
671
+ /* icons */
672
+ .hx-button > svg,
673
+ .hx-button-icon {
674
+ flex: none;
675
+ width: 1em;
676
+ height: 1em;
677
+ }
678
+
679
+ .hx-button-icon-only {
680
+ width: var(--h-button-icon-only-width);
681
+ padding-inline: 0;
682
+ gap: 0;
683
+ }
684
+
685
+ /* sizes */
686
+ .hx-button-sm {
687
+ padding: var(--h-button-sm-padding-y) var(--h-button-sm-padding-x);
688
+ font-size: var(--h-button-sm-font-size);
689
+ }
690
+
691
+ .hx-button-sm.hx-button-icon-only {
692
+ width: var(--h-button-sm-icon-only-width);
693
+ }
694
+
695
+ .hx-button-lg {
696
+ padding: var(--h-button-lg-padding-y) var(--h-button-lg-padding-x);
697
+ font-size: var(--h-button-lg-font-size);
698
+ }
699
+
700
+ .hx-button-lg.hx-button-icon-only {
701
+ width: var(--h-button-lg-icon-only-width);
702
+ }
703
+
704
+ /* shape and elevation */
705
+ .hx-button-rounded {
706
+ border-radius: var(--h-button-rounded-border-radius);
707
+ }
708
+
709
+ .hx-button-icon-only.hx-button-rounded {
710
+ height: var(--h-button-icon-only-width);
711
+ border-radius: 50%;
712
+ }
713
+
714
+ .hx-button-sm.hx-button-icon-only.hx-button-rounded {
715
+ height: var(--h-button-sm-icon-only-width);
716
+ }
717
+
718
+ .hx-button-lg.hx-button-icon-only.hx-button-rounded {
719
+ height: var(--h-button-lg-icon-only-width);
720
+ }
721
+
722
+ .hx-button-raised {
723
+ box-shadow: var(--h-button-raised-shadow);
724
+ }
725
+
726
+ .hx-button-fluid {
727
+ display: flex;
728
+ width: 100%;
729
+ }
730
+
731
+ .hx-button-fluid.hx-button-icon-only {
732
+ display: inline-flex;
733
+ width: var(--h-button-icon-only-width);
734
+ }
735
+
736
+ /* outlined */
737
+ .hx-button-outlined {
738
+ border-color: var(--hx-o-bd);
739
+ background: transparent;
740
+ color: var(--hx-o-fg);
741
+ }
742
+
743
+ .hx-button-outlined:not(:disabled, [aria-disabled=true]):hover,
744
+ .hx-button-outlined:not(:disabled, [aria-disabled=true]):active {
745
+ border-color: var(--hx-o-bd);
746
+ color: var(--hx-o-fg);
747
+ }
748
+
749
+ .hx-button-outlined:not(:disabled, [aria-disabled=true]):hover {
750
+ background: var(--hx-o-bg-h);
751
+ }
752
+
753
+ .hx-button-outlined:not(:disabled, [aria-disabled=true]):active {
754
+ background: var(--hx-o-bg-a);
755
+ }
756
+
757
+ /* text */
758
+ .hx-button-text {
759
+ border-color: transparent;
760
+ background: transparent;
761
+ color: var(--hx-t-fg);
762
+ }
763
+
764
+ .hx-button-text:not(:disabled, [aria-disabled=true]):hover,
765
+ .hx-button-text:not(:disabled, [aria-disabled=true]):active {
766
+ border-color: transparent;
767
+ color: var(--hx-t-fg);
768
+ }
769
+
770
+ .hx-button-text:not(:disabled, [aria-disabled=true]):hover {
771
+ background: var(--hx-t-bg-h);
772
+ }
773
+
774
+ .hx-button-text:not(:disabled, [aria-disabled=true]):active {
775
+ background: var(--hx-t-bg-a);
776
+ }
777
+
778
+ /* link */
779
+ .hx-button-link {
780
+ border-color: transparent;
781
+ background: transparent;
782
+ color: var(--h-button-link-color);
783
+ }
784
+
785
+ .hx-button-link:not(:disabled, [aria-disabled=true]):hover {
786
+ border-color: transparent;
787
+ background: transparent;
788
+ color: var(--h-button-link-hover-color);
789
+ text-decoration: underline;
790
+ }
791
+
792
+ .hx-button-link:not(:disabled, [aria-disabled=true]):active {
793
+ border-color: transparent;
794
+ background: transparent;
795
+ color: var(--h-button-link-active-color);
796
+ }
797
+
798
+ /* loading: a CSS spinner in front of the label; clicks are ignored by the directive */
799
+ .hx-button-loading {
800
+ cursor: progress;
801
+ }
802
+
803
+ .hx-button-loading::before {
804
+ content: "";
805
+ flex: none;
806
+ width: 1em;
807
+ height: 1em;
808
+ box-sizing: border-box;
809
+ border: 2px solid currentcolor;
810
+ border-inline-end-color: transparent;
811
+ border-radius: 50%;
812
+ animation: hx-button-spin 0.8s linear infinite;
813
+ }
814
+
815
+ @keyframes hx-button-spin {
816
+ to {
817
+ transform: rotate(360deg);
818
+ }
819
+ }
820
+ @media (prefers-reduced-motion: reduce) {
821
+ .hx-button {
822
+ transition: none;
823
+ }
824
+ .hx-button-loading::before {
825
+ animation-duration: 2.4s;
826
+ }
827
+ }
828
+
829
+ /* card */
830
+ /*
831
+ * Card: `<hx-card>`. A surface from the `--h-card-*` tokens with slots for a header, a title, a subtitle, the
832
+ * content and a footer. Empty slots take no space.
833
+ */
834
+ .hx-card {
835
+ display: flex;
836
+ flex-direction: column;
837
+ box-sizing: border-box;
838
+ overflow: hidden;
839
+ border-radius: var(--h-card-border-radius);
840
+ background: var(--h-card-background);
841
+ color: var(--h-card-color);
842
+ box-shadow: var(--h-card-shadow);
843
+ }
844
+
845
+ .hx-card-header:empty,
846
+ .hx-card-content:empty,
847
+ .hx-card-footer:empty {
848
+ display: none;
849
+ }
850
+
851
+ .hx-card-header > img {
852
+ display: block;
853
+ width: 100%;
854
+ }
855
+
856
+ .hx-card-body {
857
+ display: flex;
858
+ flex: 1 1 auto;
859
+ flex-direction: column;
860
+ gap: var(--h-card-body-gap);
861
+ padding: var(--h-card-body-padding);
862
+ }
863
+
864
+ .hx-card-caption {
865
+ display: flex;
866
+ flex-direction: column;
867
+ gap: var(--h-card-caption-gap);
868
+ }
869
+
870
+ /* a caption with neither a title nor a subtitle disappears */
871
+ .hx-card-caption:not(:has(> .hx-card-title:not(:empty), > .hx-card-subtitle:not(:empty))) {
872
+ display: none;
873
+ }
874
+
875
+ .hx-card-title {
876
+ margin: 0;
877
+ font-size: var(--h-card-title-font-size);
878
+ font-weight: var(--h-card-title-font-weight);
879
+ }
880
+
881
+ .hx-card-title:empty,
882
+ .hx-card-subtitle:empty {
883
+ display: none;
884
+ }
885
+
886
+ .hx-card-subtitle {
887
+ color: var(--h-card-subtitle-color);
888
+ }
889
+
890
+ .hx-card-footer {
891
+ display: flex;
892
+ align-items: center;
893
+ gap: var(--h-card-body-gap);
894
+ }
895
+
896
+ /* checkbox */
897
+ /*
898
+ * Checkbox: `input[hx-checkbox]` on a native `<input type="checkbox">`, drawn with CSS, styled
899
+ * from the `--h-checkbox-*` tokens. Checked, indeterminate and invalid (`aria-invalid`
900
+ * or `ng-invalid ng-touched`) are styled; the tick is a mask in the icon colour.
901
+ */
902
+ .hx-checkbox {
903
+ display: inline-grid;
904
+ flex: none;
905
+ width: var(--h-checkbox-width);
906
+ height: var(--h-checkbox-height);
907
+ box-sizing: border-box;
908
+ margin: 0;
909
+ place-content: center;
910
+ border: 1px solid var(--h-checkbox-border-color);
911
+ border-radius: var(--h-checkbox-border-radius);
912
+ appearance: none;
913
+ background: var(--h-checkbox-background);
914
+ box-shadow: var(--h-checkbox-shadow);
915
+ cursor: pointer;
916
+ outline: 0 none;
917
+ transition: background var(--h-checkbox-transition-duration), color var(--h-checkbox-transition-duration), border-color var(--h-checkbox-transition-duration), box-shadow var(--h-checkbox-transition-duration);
918
+ }
919
+
920
+ /* the tick (checked) and the bar (indeterminate) */
921
+ .hx-checkbox::before {
922
+ content: "";
923
+ width: var(--h-checkbox-icon-size);
924
+ height: var(--h-checkbox-icon-size);
925
+ background: var(--h-checkbox-icon-checked-color);
926
+ mask: var(--hx-check) center/contain no-repeat;
927
+ -webkit-mask: var(--hx-check) center/contain no-repeat;
928
+ transform: scale(0);
929
+ transition: transform var(--h-checkbox-transition-duration);
930
+ --hx-check: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m3 7.5 2.8 2.8L11 4.5'/%3E%3C/svg%3E");
931
+ }
932
+
933
+ .hx-checkbox:indeterminate::before {
934
+ --hx-check: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M3 7h8'/%3E%3C/svg%3E");
935
+ }
936
+
937
+ .hx-checkbox:checked,
938
+ .hx-checkbox:indeterminate {
939
+ border-color: var(--h-checkbox-checked-border-color);
940
+ background: var(--h-checkbox-checked-background);
941
+ }
942
+
943
+ .hx-checkbox:checked::before,
944
+ .hx-checkbox:indeterminate::before {
945
+ transform: scale(1);
946
+ }
947
+
948
+ .hx-checkbox:enabled:hover {
949
+ border-color: var(--h-checkbox-hover-border-color);
950
+ }
951
+
952
+ .hx-checkbox:enabled:checked:hover,
953
+ .hx-checkbox:enabled:indeterminate:hover {
954
+ border-color: var(--h-checkbox-checked-hover-border-color);
955
+ background: var(--h-checkbox-checked-hover-background);
956
+ }
957
+
958
+ .hx-checkbox:enabled:checked:hover::before,
959
+ .hx-checkbox:enabled:indeterminate:hover::before {
960
+ background: var(--h-checkbox-icon-checked-hover-color);
961
+ }
962
+
963
+ .hx-checkbox:focus-visible {
964
+ border-color: var(--h-checkbox-focus-border-color);
965
+ outline: var(--h-checkbox-focus-ring-width) var(--h-checkbox-focus-ring-style) var(--h-checkbox-focus-ring-color);
966
+ outline-offset: var(--h-checkbox-focus-ring-offset);
967
+ box-shadow: var(--h-checkbox-focus-ring-shadow);
968
+ }
969
+
970
+ .hx-checkbox:focus-visible:checked,
971
+ .hx-checkbox:focus-visible:indeterminate {
972
+ border-color: var(--h-checkbox-checked-focus-border-color);
973
+ }
974
+
975
+ .hx-checkbox:disabled {
976
+ border-color: var(--h-checkbox-border-color);
977
+ background: var(--h-checkbox-disabled-background);
978
+ cursor: default;
979
+ }
980
+
981
+ .hx-checkbox:disabled::before {
982
+ background: var(--h-checkbox-icon-disabled-color);
983
+ }
984
+
985
+ .hx-checkbox:disabled:checked,
986
+ .hx-checkbox:disabled:indeterminate {
987
+ border-color: var(--h-checkbox-checked-disabled-border-color);
988
+ }
989
+
990
+ .hx-checkbox[aria-invalid=true],
991
+ .hx-checkbox.ng-invalid.ng-touched {
992
+ border-color: var(--h-checkbox-invalid-border-color);
993
+ }
994
+
995
+ /* sizes */
996
+ .hx-checkbox-sm {
997
+ width: var(--h-checkbox-sm-width);
998
+ height: var(--h-checkbox-sm-height);
999
+ }
1000
+
1001
+ .hx-checkbox-sm::before {
1002
+ width: var(--h-checkbox-icon-sm-size);
1003
+ height: var(--h-checkbox-icon-sm-size);
1004
+ }
1005
+
1006
+ .hx-checkbox-lg {
1007
+ width: var(--h-checkbox-lg-width);
1008
+ height: var(--h-checkbox-lg-height);
1009
+ }
1010
+
1011
+ .hx-checkbox-lg::before {
1012
+ width: var(--h-checkbox-icon-lg-size);
1013
+ height: var(--h-checkbox-icon-lg-size);
1014
+ }
1015
+
1016
+ @media (prefers-reduced-motion: reduce) {
1017
+ .hx-checkbox,
1018
+ .hx-checkbox::before {
1019
+ transition: none;
1020
+ }
1021
+ }
1022
+
1023
+ /* chip */
1024
+ /*
1025
+ * Chip: `<hx-chip>`. A compact pill from the `--h-chip-*` tokens with an optional picture or icon and a remove
1026
+ * button; a removable chip is focusable and shows the focus ring of the remove icon.
1027
+ */
1028
+ .hx-chip {
1029
+ display: inline-flex;
1030
+ align-items: center;
1031
+ gap: var(--h-chip-gap);
1032
+ padding: var(--h-chip-padding-y) var(--h-chip-padding-x);
1033
+ border-radius: var(--h-chip-border-radius);
1034
+ background: var(--h-chip-background);
1035
+ color: var(--h-chip-color);
1036
+ outline-color: transparent;
1037
+ transition: background var(--h-chip-transition-duration), outline-color var(--h-chip-transition-duration);
1038
+ }
1039
+
1040
+ .hx-chip-removable:focus-visible,
1041
+ .hx-chip-remove:focus-visible {
1042
+ outline: var(--h-chip-remove-icon-focus-ring-width) var(--h-chip-remove-icon-focus-ring-style) var(--h-chip-remove-icon-focus-ring-color);
1043
+ outline-offset: var(--h-chip-remove-icon-focus-ring-offset);
1044
+ box-shadow: var(--h-chip-remove-icon-focus-ring-shadow);
1045
+ }
1046
+
1047
+ .hx-chip-image {
1048
+ flex: none;
1049
+ width: var(--h-chip-image-width);
1050
+ height: var(--h-chip-image-height);
1051
+ /* the picture sits in the padding of the pill instead of adding to its height */
1052
+ margin-block: calc(var(--h-chip-padding-y) * -1);
1053
+ margin-inline-start: calc(var(--h-chip-padding-x) * -1);
1054
+ border-radius: 50%;
1055
+ object-fit: cover;
1056
+ }
1057
+
1058
+ .hx-chip-icon {
1059
+ flex: none;
1060
+ color: var(--h-chip-icon-color);
1061
+ font-size: var(--h-chip-icon-size);
1062
+ }
1063
+
1064
+ .hx-chip-label {
1065
+ min-width: 0;
1066
+ }
1067
+
1068
+ .hx-chip-remove {
1069
+ display: inline-flex;
1070
+ flex: none;
1071
+ align-items: center;
1072
+ justify-content: center;
1073
+ padding: 0;
1074
+ border: 0;
1075
+ border-radius: 50%;
1076
+ background: transparent;
1077
+ color: var(--h-chip-remove-icon-color);
1078
+ cursor: pointer;
1079
+ outline-color: transparent;
1080
+ }
1081
+
1082
+ .hx-chip-remove-icon {
1083
+ display: inline-block;
1084
+ flex: none;
1085
+ width: var(--h-chip-remove-icon-size);
1086
+ height: var(--h-chip-remove-icon-size);
1087
+ background: currentcolor;
1088
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 6l12 12M18 6 6 18'/%3E%3C/svg%3E") center/contain no-repeat;
1089
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 6l12 12M18 6 6 18'/%3E%3C/svg%3E") center/contain no-repeat;
1090
+ }
1091
+
1092
+ @media (prefers-reduced-motion: reduce) {
1093
+ .hx-chip {
1094
+ transition: none;
1095
+ }
1096
+ }
1097
+
1098
+ /* confirm */
1099
+ /*
1100
+ * Confirm: `<hx-confirm-dialog>` and `<hx-confirm-popup>`. The dialog is the dialog frame (see `dialog.scss`) with an
1101
+ * icon and the message from the `--h-confirmdialog-*` tokens; the popup is the popover panel (see `popover.scss`)
1102
+ * restyled from the `--h-confirmpopup-*` tokens, with its message, icon and the buttons in a footer.
1103
+ */
1104
+ .hx-confirm-anchor {
1105
+ display: none;
1106
+ }
1107
+
1108
+ .hx-confirm-content {
1109
+ display: flex;
1110
+ align-items: center;
1111
+ gap: var(--h-confirmdialog-content-gap);
1112
+ }
1113
+
1114
+ .hx-confirm-icon {
1115
+ flex: none;
1116
+ color: var(--h-confirmdialog-icon-color);
1117
+ font-size: var(--h-confirmdialog-icon-size);
1118
+ }
1119
+
1120
+ .hx-confirm-message {
1121
+ margin: 0;
1122
+ }
1123
+
1124
+ .hx-popover.hx-confirm-popup {
1125
+ margin-block-start: var(--h-confirmpopup-gutter);
1126
+ border-color: var(--h-confirmpopup-border-color);
1127
+ border-radius: var(--h-confirmpopup-border-radius);
1128
+ background: var(--h-confirmpopup-background);
1129
+ color: var(--h-confirmpopup-color);
1130
+ box-shadow: var(--h-confirmpopup-shadow);
1131
+ }
1132
+
1133
+ .hx-popover.hx-confirm-popup.hx-popover-above {
1134
+ margin-block: 0 var(--h-confirmpopup-gutter);
1135
+ }
1136
+
1137
+ .hx-confirm-popup .hx-popover-content {
1138
+ padding: 0;
1139
+ }
1140
+
1141
+ .hx-confirm-popup::before {
1142
+ inset-inline-start: var(--h-confirmpopup-arrow-offset);
1143
+ border-color: var(--h-confirmpopup-border-color);
1144
+ background: var(--h-confirmpopup-background);
1145
+ }
1146
+
1147
+ .hx-confirm-popup.hx-popover-end::before {
1148
+ inset-inline: auto var(--h-confirmpopup-arrow-offset);
1149
+ }
1150
+
1151
+ .hx-confirm-popup-content {
1152
+ display: flex;
1153
+ align-items: center;
1154
+ gap: var(--h-confirmpopup-content-gap);
1155
+ padding: var(--h-confirmpopup-content-padding);
1156
+ }
1157
+
1158
+ .hx-confirm-popup-icon {
1159
+ flex: none;
1160
+ color: var(--h-confirmpopup-icon-color);
1161
+ font-size: var(--h-confirmpopup-icon-size);
1162
+ }
1163
+
1164
+ .hx-confirm-popup-footer {
1165
+ display: flex;
1166
+ justify-content: flex-end;
1167
+ gap: var(--h-confirmpopup-footer-gap);
1168
+ padding: var(--h-confirmpopup-footer-padding);
1169
+ }
1170
+
1171
+ /* dialog */
1172
+ /*
1173
+ * Dialog: `<hx-dialog>` and the dialogs of `HxDialogService`. The box (`.hx-dialog`) is a grid of the title, the
1174
+ * content and the footer, with the close button in the title row (it comes last in the DOM, so the content gets the
1175
+ * focus first). The mask is `.hx-dialog-backdrop`; the pane and the global positioning are the CDK's. The content
1176
+ * scrolls when the dialog is taller than the screen.
1177
+ */
1178
+ .hx-dialog-anchor {
1179
+ display: none;
1180
+ }
1181
+
1182
+ .hx-dialog-backdrop {
1183
+ background: var(--h-mask-background);
1184
+ }
1185
+
1186
+ .hx-dialog {
1187
+ display: grid;
1188
+ grid-template: "title close" auto "content content" minmax(0, 1fr) "footer footer" auto/minmax(0, 1fr) auto;
1189
+ box-sizing: border-box;
1190
+ width: 100%;
1191
+ max-height: inherit;
1192
+ overflow: hidden;
1193
+ border: 1px solid var(--h-dialog-border-color);
1194
+ border-radius: var(--h-dialog-border-radius);
1195
+ background: var(--h-dialog-background);
1196
+ color: var(--h-dialog-color);
1197
+ box-shadow: var(--h-dialog-shadow);
1198
+ }
1199
+
1200
+ .hx-dialog-title {
1201
+ grid-area: title;
1202
+ display: flex;
1203
+ align-items: center;
1204
+ gap: var(--h-dialog-header-gap);
1205
+ margin: 0;
1206
+ padding: var(--h-dialog-header-padding);
1207
+ font-size: var(--h-dialog-title-font-size);
1208
+ font-weight: var(--h-dialog-title-font-weight);
1209
+ }
1210
+
1211
+ .hx-dialog-title:empty {
1212
+ padding: 0;
1213
+ }
1214
+
1215
+ .hx-dialog-content {
1216
+ grid-area: content;
1217
+ min-height: 0;
1218
+ overflow: auto;
1219
+ padding: var(--h-dialog-content-padding);
1220
+ }
1221
+
1222
+ .hx-dialog-footer {
1223
+ grid-area: footer;
1224
+ display: flex;
1225
+ justify-content: flex-end;
1226
+ gap: var(--h-dialog-footer-gap);
1227
+ padding: var(--h-dialog-footer-padding);
1228
+ }
1229
+
1230
+ .hx-dialog-footer:empty {
1231
+ display: none;
1232
+ }
1233
+
1234
+ .hx-dialog-close {
1235
+ grid-area: close;
1236
+ align-self: center;
1237
+ display: inline-flex;
1238
+ align-items: center;
1239
+ justify-content: center;
1240
+ width: 2rem;
1241
+ height: 2rem;
1242
+ margin-inline-end: 0.75rem;
1243
+ padding: 0;
1244
+ border: 0;
1245
+ border-radius: 50%;
1246
+ background: transparent;
1247
+ color: inherit;
1248
+ cursor: pointer;
1249
+ outline-color: transparent;
1250
+ }
1251
+
1252
+ .hx-dialog-close:hover {
1253
+ background: var(--h-content-hover-background);
1254
+ }
1255
+
1256
+ .hx-dialog-close:focus-visible {
1257
+ outline: var(--h-focus-ring-width) var(--h-focus-ring-style) var(--h-focus-ring-color);
1258
+ outline-offset: var(--h-focus-ring-offset);
1259
+ }
1260
+
1261
+ .hx-dialog-close-icon {
1262
+ display: inline-block;
1263
+ flex: none;
1264
+ width: 1rem;
1265
+ height: 1rem;
1266
+ background: currentcolor;
1267
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 6l12 12M18 6 6 18'/%3E%3C/svg%3E") center/contain no-repeat;
1268
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 6l12 12M18 6 6 18'/%3E%3C/svg%3E") center/contain no-repeat;
1269
+ }
1270
+
1271
+ /* divider */
1272
+ /*
1273
+ * Divider: `<hx-divider>`. A line from the `--h-divider-*` tokens; projected content is a label on the line.
1274
+ * Horizontal by default, `vertical` for a line between inline items.
1275
+ */
1276
+ .hx-divider {
1277
+ position: relative;
1278
+ display: flex;
1279
+ align-items: center;
1280
+ color: var(--h-divider-content-color);
1281
+ }
1282
+
1283
+ .hx-divider::before {
1284
+ content: "";
1285
+ position: absolute;
1286
+ display: block;
1287
+ border: 0 solid var(--h-divider-border-color);
1288
+ }
1289
+
1290
+ .hx-divider-dashed::before {
1291
+ border-style: dashed;
1292
+ }
1293
+
1294
+ .hx-divider-dotted::before {
1295
+ border-style: dotted;
1296
+ }
1297
+
1298
+ .hx-divider-horizontal {
1299
+ width: 100%;
1300
+ margin: var(--h-divider-horizontal-margin);
1301
+ padding: var(--h-divider-horizontal-padding);
1302
+ }
1303
+
1304
+ .hx-divider-horizontal::before {
1305
+ inset-inline: 0;
1306
+ top: 50%;
1307
+ border-top-width: 1px;
1308
+ }
1309
+
1310
+ .hx-divider-vertical {
1311
+ flex-direction: column;
1312
+ align-self: stretch;
1313
+ min-height: 100%;
1314
+ margin: var(--h-divider-vertical-margin);
1315
+ padding: var(--h-divider-vertical-padding);
1316
+ }
1317
+
1318
+ .hx-divider-vertical::before {
1319
+ inset-block: 0;
1320
+ left: 50%;
1321
+ border-inline-start-width: 1px;
1322
+ }
1323
+
1324
+ /* the label sits on the line */
1325
+ .hx-divider > * {
1326
+ position: relative;
1327
+ z-index: 1;
1328
+ background: var(--h-divider-content-background);
1329
+ }
1330
+
1331
+ .hx-divider-horizontal > * {
1332
+ padding: var(--h-divider-horizontal-content-padding);
1333
+ }
1334
+
1335
+ .hx-divider-vertical > * {
1336
+ padding: var(--h-divider-vertical-content-padding);
1337
+ }
1338
+
1339
+ .hx-divider-horizontal.hx-divider-start {
1340
+ justify-content: flex-start;
1341
+ }
1342
+
1343
+ .hx-divider-horizontal.hx-divider-center {
1344
+ justify-content: center;
1345
+ }
1346
+
1347
+ .hx-divider-horizontal.hx-divider-end {
1348
+ justify-content: flex-end;
1349
+ }
1350
+
1351
+ .hx-divider-vertical.hx-divider-start {
1352
+ justify-content: flex-start;
1353
+ }
1354
+
1355
+ .hx-divider-vertical.hx-divider-center {
1356
+ justify-content: center;
1357
+ }
1358
+
1359
+ .hx-divider-vertical.hx-divider-end {
1360
+ justify-content: flex-end;
1361
+ }
1362
+
1363
+ /* drawer */
1364
+ /*
1365
+ * Drawer: `<hx-drawer>`. The box is the dialog frame (see `dialog.scss`) restyled from the `--h-drawer-*` tokens:
1366
+ * square corners, no border on the sides that touch the screen edge, full height (left, right) or full width (top,
1367
+ * bottom). The CDK pane slides in from its edge; the slide stops under `prefers-reduced-motion`.
1368
+ */
1369
+ .hx-drawer-anchor {
1370
+ display: none;
1371
+ }
1372
+
1373
+ .hx-dialog.hx-drawer {
1374
+ height: 100%;
1375
+ border-color: var(--h-drawer-border-color);
1376
+ border-radius: 0;
1377
+ background: var(--h-drawer-background);
1378
+ color: var(--h-drawer-color);
1379
+ box-shadow: var(--h-drawer-shadow);
1380
+ }
1381
+
1382
+ .hx-drawer .hx-dialog-title {
1383
+ padding: var(--h-drawer-header-padding);
1384
+ font-size: var(--h-drawer-title-font-size);
1385
+ font-weight: var(--h-drawer-title-font-weight);
1386
+ }
1387
+
1388
+ .hx-drawer .hx-dialog-title:empty {
1389
+ padding: 0;
1390
+ }
1391
+
1392
+ .hx-drawer .hx-dialog-content {
1393
+ padding: var(--h-drawer-content-padding);
1394
+ }
1395
+
1396
+ .hx-drawer .hx-dialog-footer {
1397
+ padding: var(--h-drawer-footer-padding);
1398
+ }
1399
+
1400
+ .hx-drawer-panel-left .hx-drawer {
1401
+ border-inline-start: 0;
1402
+ border-block: 0;
1403
+ }
1404
+
1405
+ .hx-drawer-panel-right .hx-drawer {
1406
+ border-inline-end: 0;
1407
+ border-block: 0;
1408
+ }
1409
+
1410
+ .hx-drawer-panel-top .hx-drawer {
1411
+ border-block-start: 0;
1412
+ border-inline: 0;
1413
+ }
1414
+
1415
+ .hx-drawer-panel-bottom .hx-drawer {
1416
+ border-block-end: 0;
1417
+ border-inline: 0;
1418
+ }
1419
+
1420
+ .hx-drawer-panel-full .hx-drawer {
1421
+ border: 0;
1422
+ }
1423
+
1424
+ .hx-drawer-panel-left {
1425
+ animation: hx-drawer-in-left 0.25s ease-out;
1426
+ }
1427
+
1428
+ .hx-drawer-panel-right {
1429
+ animation: hx-drawer-in-right 0.25s ease-out;
1430
+ }
1431
+
1432
+ .hx-drawer-panel-top {
1433
+ animation: hx-drawer-in-top 0.25s ease-out;
1434
+ }
1435
+
1436
+ .hx-drawer-panel-bottom {
1437
+ animation: hx-drawer-in-bottom 0.25s ease-out;
1438
+ }
1439
+
1440
+ .hx-drawer-panel-full {
1441
+ animation: hx-drawer-in-fade 0.2s ease-out;
1442
+ }
1443
+
1444
+ @keyframes hx-drawer-in-left {
1445
+ from {
1446
+ transform: translateX(-100%);
1447
+ }
1448
+ }
1449
+ @keyframes hx-drawer-in-right {
1450
+ from {
1451
+ transform: translateX(100%);
1452
+ }
1453
+ }
1454
+ @keyframes hx-drawer-in-top {
1455
+ from {
1456
+ transform: translateY(-100%);
1457
+ }
1458
+ }
1459
+ @keyframes hx-drawer-in-bottom {
1460
+ from {
1461
+ transform: translateY(100%);
1462
+ }
1463
+ }
1464
+ @keyframes hx-drawer-in-fade {
1465
+ from {
1466
+ opacity: 0;
1467
+ }
1468
+ }
1469
+ @media (prefers-reduced-motion: reduce) {
1470
+ .hx-drawer-panel-left,
1471
+ .hx-drawer-panel-right,
1472
+ .hx-drawer-panel-top,
1473
+ .hx-drawer-panel-bottom,
1474
+ .hx-drawer-panel-full {
1475
+ animation: none;
1476
+ }
1477
+ }
1478
+
1479
+ /* fieldset */
1480
+ /*
1481
+ * Fieldset: `<hx-fieldset>`. A native fieldset and legend from the `--h-fieldset-*` tokens; a toggleable legend is a
1482
+ * button. The content collapses by animating its grid row to zero height.
1483
+ */
1484
+ .hx-fieldset {
1485
+ display: block;
1486
+ }
1487
+
1488
+ .hx-fieldset-box {
1489
+ min-width: 0;
1490
+ margin: 0;
1491
+ padding: var(--h-fieldset-padding);
1492
+ border: 1px solid var(--h-fieldset-border-color);
1493
+ border-radius: var(--h-fieldset-border-radius);
1494
+ background: var(--h-fieldset-background);
1495
+ color: var(--h-fieldset-color);
1496
+ }
1497
+
1498
+ .hx-fieldset-legend {
1499
+ padding: 0;
1500
+ font-weight: var(--h-fieldset-legend-font-weight);
1501
+ }
1502
+
1503
+ .hx-fieldset-legend-text {
1504
+ display: inline-block;
1505
+ padding: var(--h-fieldset-legend-padding);
1506
+ border: var(--h-fieldset-legend-border-width) solid var(--h-fieldset-legend-border-color);
1507
+ border-radius: var(--h-fieldset-legend-border-radius);
1508
+ background: var(--h-fieldset-legend-background);
1509
+ color: var(--h-fieldset-legend-color);
1510
+ }
1511
+
1512
+ .hx-fieldset-toggle {
1513
+ display: inline-flex;
1514
+ align-items: center;
1515
+ gap: var(--h-fieldset-legend-gap);
1516
+ padding: var(--h-fieldset-legend-padding);
1517
+ border: var(--h-fieldset-legend-border-width) solid var(--h-fieldset-legend-border-color);
1518
+ border-radius: var(--h-fieldset-legend-border-radius);
1519
+ background: var(--h-fieldset-legend-background);
1520
+ color: var(--h-fieldset-legend-color);
1521
+ font: inherit;
1522
+ cursor: pointer;
1523
+ outline: 0 none;
1524
+ transition: background var(--h-fieldset-transition-duration), color var(--h-fieldset-transition-duration);
1525
+ }
1526
+
1527
+ .hx-fieldset-toggle:hover {
1528
+ background: var(--h-fieldset-legend-hover-background);
1529
+ color: var(--h-fieldset-legend-hover-color);
1530
+ }
1531
+
1532
+ .hx-fieldset-toggle:focus-visible {
1533
+ outline: var(--h-fieldset-legend-focus-ring-width) var(--h-fieldset-legend-focus-ring-style) var(--h-fieldset-legend-focus-ring-color);
1534
+ outline-offset: var(--h-fieldset-legend-focus-ring-offset);
1535
+ box-shadow: var(--h-fieldset-legend-focus-ring-shadow);
1536
+ }
1537
+
1538
+ .hx-fieldset-toggle-icon {
1539
+ display: inline-block;
1540
+ flex: none;
1541
+ width: 1rem;
1542
+ height: 1rem;
1543
+ background: var(--h-fieldset-toggle-icon-color);
1544
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 15 6-6 6 6'/%3E%3C/svg%3E") center/contain no-repeat;
1545
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 15 6-6 6 6'/%3E%3C/svg%3E") center/contain no-repeat;
1546
+ transition: transform 0.2s;
1547
+ }
1548
+
1549
+ .hx-fieldset-toggle:hover .hx-fieldset-toggle-icon {
1550
+ background: var(--h-fieldset-toggle-icon-hover-color);
1551
+ }
1552
+
1553
+ .hx-fieldset-collapsed .hx-fieldset-toggle-icon {
1554
+ transform: rotate(180deg);
1555
+ }
1556
+
1557
+ .hx-fieldset-collapse {
1558
+ display: grid;
1559
+ grid-template-rows: 1fr;
1560
+ transition: grid-template-rows 0.2s, visibility 0.2s;
1561
+ }
1562
+
1563
+ .hx-fieldset-collapsed .hx-fieldset-collapse {
1564
+ grid-template-rows: 0fr;
1565
+ visibility: hidden;
1566
+ }
1567
+
1568
+ .hx-fieldset-collapse-inner {
1569
+ min-height: 0;
1570
+ overflow: hidden;
1571
+ }
1572
+
1573
+ .hx-fieldset-content {
1574
+ padding: var(--h-fieldset-content-padding);
1575
+ }
1576
+
1577
+ @media (prefers-reduced-motion: reduce) {
1578
+ .hx-fieldset-collapse,
1579
+ .hx-fieldset-toggle-icon,
1580
+ .hx-fieldset-toggle {
1581
+ transition: none;
1582
+ }
1583
+ }
1584
+ .hx-fieldset-toggleable .hx-fieldset-legend {
1585
+ user-select: none;
1586
+ }
1587
+
1588
+ .hx-fieldset-collapsed .hx-fieldset-box {
1589
+ padding-bottom: 0;
1590
+ }
1591
+
1592
+ /* float-label */
1593
+ /*
1594
+ * Float label: `<hx-float-label>` around one control followed by its `<label for>`. The label sits in the field
1595
+ * and moves up when the control has focus or a value: `over` above the field, `in` inside it (the field gets
1596
+ * room for it), `on` on its top border. Native fields float by `:focus-within` and `:placeholder-shown`, the
1597
+ * helix-ui components by their `hx-filled` class. Colours, offsets and type from the `--h-floatlabel-*` tokens.
1598
+ */
1599
+ .hx-float-label {
1600
+ position: relative;
1601
+ display: block;
1602
+ }
1603
+
1604
+ .hx-float-label > label {
1605
+ position: absolute;
1606
+ top: 50%;
1607
+ inset-inline-start: var(--h-floatlabel-position-x);
1608
+ margin-top: -0.5rem;
1609
+ max-width: calc(100% - var(--h-floatlabel-position-x) * 2);
1610
+ overflow: hidden;
1611
+ color: var(--h-floatlabel-color);
1612
+ font-weight: var(--h-floatlabel-font-weight);
1613
+ line-height: 1;
1614
+ text-overflow: ellipsis;
1615
+ white-space: nowrap;
1616
+ pointer-events: none;
1617
+ transition-property: top, inset-inline-start, font-size, font-weight, color;
1618
+ transition-duration: var(--h-floatlabel-transition-duration);
1619
+ transition-timing-function: ease;
1620
+ }
1621
+
1622
+ /* a textarea's label sits at the first line, not in the middle */
1623
+ .hx-float-label:has(> textarea) > label {
1624
+ top: var(--h-floatlabel-position-y);
1625
+ margin-top: 0;
1626
+ }
1627
+
1628
+ .hx-float-label > .hx-input,
1629
+ .hx-float-label > .hx-select,
1630
+ .hx-float-label > .hx-password,
1631
+ .hx-float-label > .hx-input-number {
1632
+ width: 100%;
1633
+ }
1634
+
1635
+ /* the hint is replaced by the label while the field is empty */
1636
+ .hx-float-label > .hx-input::placeholder {
1637
+ color: transparent;
1638
+ }
1639
+
1640
+ /* floated: over (default) */
1641
+ &:is(:focus-within,
1642
+ :has(> input:not(:placeholder-shown)),
1643
+ :has(> textarea:not(:placeholder-shown)),
1644
+ :has(.hx-filled)) > label {
1645
+ top: var(--h-floatlabel-over-active-top);
1646
+ margin-top: 0;
1647
+ font-size: var(--h-floatlabel-active-font-size);
1648
+ font-weight: var(--h-floatlabel-active-font-weight);
1649
+ color: var(--h-floatlabel-active-color);
1650
+ }
1651
+
1652
+ .hx-float-label:focus-within > label {
1653
+ color: var(--h-floatlabel-focus-color);
1654
+ }
1655
+
1656
+ /* in */
1657
+ .hx-float-label-in > .hx-input {
1658
+ padding-top: var(--h-floatlabel-in-input-padding-top);
1659
+ padding-bottom: var(--h-floatlabel-in-input-padding-bottom);
1660
+ }
1661
+
1662
+ .hx-float-label-in:is(:focus-within,
1663
+ :has(> input:not(:placeholder-shown)),
1664
+ :has(> textarea:not(:placeholder-shown)),
1665
+ :has(.hx-filled)) > label {
1666
+ top: var(--h-floatlabel-in-active-top);
1667
+ margin-top: 0;
1668
+ }
1669
+
1670
+ /* on */
1671
+ .hx-float-label-on:is(:focus-within,
1672
+ :has(> input:not(:placeholder-shown)),
1673
+ :has(> textarea:not(:placeholder-shown)),
1674
+ :has(.hx-filled)) > label {
1675
+ top: 0;
1676
+ margin-top: 0;
1677
+ padding: var(--h-floatlabel-on-active-padding);
1678
+ border-radius: var(--h-floatlabel-on-border-radius);
1679
+ background: var(--h-floatlabel-on-active-background);
1680
+ transform: translateY(-50%);
1681
+ }
1682
+
1683
+ /* invalid */
1684
+ .hx-float-label:has(> [aria-invalid=true],
1685
+ > .ng-invalid.ng-touched,
1686
+ > .hx-select-invalid) > label {
1687
+ color: var(--h-floatlabel-invalid-color);
1688
+ }
1689
+
1690
+ @media (prefers-reduced-motion: reduce) {
1691
+ .hx-float-label > label {
1692
+ transition: none;
1693
+ }
1694
+ }
1695
+
1696
+ /* icon-field */
1697
+ /*
1698
+ * Icon field: `<hx-icon-field>` around an `hx-input` and an `[hx-input-icon]` element. The icon is placed
1699
+ * absolutely on the start or end edge and ignores clicks; the field gets inline padding for it. Colour from
1700
+ * `--h-iconfield-icon-color`, spacing from the input tokens (the size variants of the input are followed).
1701
+ */
1702
+ .hx-icon-field {
1703
+ --hx-icon-field-x: var(--h-inputtext-padding-x);
1704
+ position: relative;
1705
+ display: inline-flex;
1706
+ align-items: center;
1707
+ }
1708
+
1709
+ .hx-icon-field:has(.hx-input-sm) {
1710
+ --hx-icon-field-x: var(--h-inputtext-sm-padding-x);
1711
+ }
1712
+
1713
+ .hx-icon-field:has(.hx-input-lg) {
1714
+ --hx-icon-field-x: var(--h-inputtext-lg-padding-x);
1715
+ }
1716
+
1717
+ .hx-icon-field:has(.hx-input-fluid) {
1718
+ display: flex;
1719
+ width: 100%;
1720
+ }
1721
+
1722
+ .hx-icon-field > .hx-input,
1723
+ .hx-icon-field > .hx-password {
1724
+ flex: 1 1 auto;
1725
+ min-width: 0;
1726
+ }
1727
+
1728
+ .hx-input-icon {
1729
+ position: absolute;
1730
+ top: 50%;
1731
+ display: inline-flex;
1732
+ align-items: center;
1733
+ justify-content: center;
1734
+ width: 1em;
1735
+ height: 1em;
1736
+ margin-top: -0.5em;
1737
+ color: var(--h-iconfield-icon-color);
1738
+ pointer-events: none;
1739
+ }
1740
+
1741
+ .hx-icon-field-left > .hx-input-icon {
1742
+ inset-inline-start: var(--hx-icon-field-x);
1743
+ }
1744
+
1745
+ .hx-icon-field-right > .hx-input-icon {
1746
+ inset-inline-end: var(--hx-icon-field-x);
1747
+ }
1748
+
1749
+ .hx-icon-field-left .hx-input {
1750
+ padding-inline-start: calc(var(--hx-icon-field-x) * 2 + 1em);
1751
+ }
1752
+
1753
+ .hx-icon-field-right .hx-input {
1754
+ padding-inline-end: calc(var(--hx-icon-field-x) * 2 + 1em);
1755
+ }
1756
+
1757
+ /* input-group */
1758
+ /*
1759
+ * Input group: `<hx-input-group>` joins fields, selects, number fields, buttons and `<hx-input-group-addon>`
1760
+ * into one control: neighbours overlap by their border, inner corners are square, the outer corners keep
1761
+ * their radius. The addon reads the `--h-inputgroup-addon-*` tokens.
1762
+ */
1763
+ .hx-input-group {
1764
+ display: flex;
1765
+ align-items: stretch;
1766
+ width: 100%;
1767
+ }
1768
+
1769
+ .hx-input-group > .hx-input,
1770
+ .hx-input-group > .hx-input-number,
1771
+ .hx-input-group > .hx-icon-field,
1772
+ .hx-input-group > .hx-select,
1773
+ .hx-input-group > .hx-password {
1774
+ flex: 1 1 auto;
1775
+ width: 1%;
1776
+ min-width: 0;
1777
+ }
1778
+
1779
+ .hx-input-group > .hx-input-number .hx-input,
1780
+ .hx-input-group > .hx-icon-field .hx-input,
1781
+ .hx-input-group > .hx-password .hx-input {
1782
+ height: 100%;
1783
+ }
1784
+
1785
+ .hx-input-group > :not(:first-child) {
1786
+ margin-inline-start: -1px;
1787
+ }
1788
+
1789
+ /* a focused or hovered member shows its whole border above its neighbours */
1790
+ .hx-input-group > :hover,
1791
+ .hx-input-group > :focus-within {
1792
+ position: relative;
1793
+ z-index: 1;
1794
+ }
1795
+
1796
+ /* square inner corners: the end side of every member but the last, the start side of every one but the first */
1797
+ .hx-input-group > :not(:last-child),
1798
+ .hx-input-group > :not(:last-child) .hx-input,
1799
+ .hx-input-group > :not(:last-child) .hx-input-number-spin .hx-input-number-button,
1800
+ .hx-input-group > :not(:last-child) .hx-input-number-increment {
1801
+ border-start-end-radius: 0;
1802
+ border-end-end-radius: 0;
1803
+ }
1804
+
1805
+ .hx-input-group > :not(:first-child),
1806
+ .hx-input-group > :not(:first-child) .hx-input,
1807
+ .hx-input-group > :not(:first-child) .hx-input-number-decrement {
1808
+ border-start-start-radius: 0;
1809
+ border-end-start-radius: 0;
1810
+ }
1811
+
1812
+ .hx-input-group-addon {
1813
+ display: inline-flex;
1814
+ flex: 0 0 auto;
1815
+ align-items: center;
1816
+ justify-content: center;
1817
+ box-sizing: border-box;
1818
+ min-width: var(--h-inputgroup-addon-min-width);
1819
+ padding: var(--h-inputgroup-addon-padding);
1820
+ border: 1px solid var(--h-inputgroup-addon-border-color);
1821
+ border-radius: var(--h-inputgroup-addon-border-radius);
1822
+ background: var(--h-inputgroup-addon-background);
1823
+ color: var(--h-inputgroup-addon-color);
1824
+ }
1825
+
1826
+ /* input-number */
1827
+ /*
1828
+ * Input number: `<hx-input-number>`. The field is an `hx-input` inside, the step buttons sit on its edges
1829
+ * (`stacked`: one column on the end edge, `horizontal`: minus at the start, plus at the end). Button colours
1830
+ * come from the `--h-inputnumber-button-*` tokens, the field from the input tokens.
1831
+ */
1832
+ .hx-input-number {
1833
+ position: relative;
1834
+ display: inline-flex;
1835
+ }
1836
+
1837
+ .hx-input-number-fluid {
1838
+ display: flex;
1839
+ width: 100%;
1840
+ }
1841
+
1842
+ .hx-input-number .hx-input {
1843
+ flex: 1 1 auto;
1844
+ min-width: 0;
1845
+ }
1846
+
1847
+ .hx-input-number-disabled {
1848
+ cursor: default;
1849
+ }
1850
+
1851
+ .hx-input-number-button {
1852
+ display: inline-flex;
1853
+ align-items: center;
1854
+ justify-content: center;
1855
+ box-sizing: border-box;
1856
+ padding: 0;
1857
+ border: 1px solid var(--h-inputnumber-button-border-color);
1858
+ background: var(--h-inputnumber-button-background);
1859
+ color: var(--h-inputnumber-button-color);
1860
+ font-size: 1rem;
1861
+ cursor: pointer;
1862
+ outline-color: transparent;
1863
+ transition: background var(--h-inputnumber-transition-duration), color var(--h-inputnumber-transition-duration), border-color var(--h-inputnumber-transition-duration);
1864
+ }
1865
+
1866
+ .hx-input-number-button:enabled:hover {
1867
+ border-color: var(--h-inputnumber-button-hover-border-color);
1868
+ background: var(--h-inputnumber-button-hover-background);
1869
+ color: var(--h-inputnumber-button-hover-color);
1870
+ }
1871
+
1872
+ .hx-input-number-button:enabled:active {
1873
+ border-color: var(--h-inputnumber-button-active-border-color);
1874
+ background: var(--h-inputnumber-button-active-background);
1875
+ color: var(--h-inputnumber-button-active-color);
1876
+ }
1877
+
1878
+ .hx-input-number-button:disabled {
1879
+ cursor: default;
1880
+ opacity: 0.6;
1881
+ }
1882
+
1883
+ /* stacked: one column of two buttons on the end edge, inside the field's border */
1884
+ .hx-input-number-stacked .hx-input {
1885
+ padding-inline-end: calc(var(--h-inputnumber-button-width) + 0.5rem);
1886
+ }
1887
+
1888
+ .hx-input-number-spin {
1889
+ position: absolute;
1890
+ inset-block: 0;
1891
+ inset-inline-end: 0;
1892
+ display: flex;
1893
+ flex-direction: column;
1894
+ width: var(--h-inputnumber-button-width);
1895
+ }
1896
+
1897
+ .hx-input-number-spin .hx-input-number-button {
1898
+ flex: 1 1 50%;
1899
+ min-height: 0;
1900
+ border-width: 0;
1901
+ border-inline-start-width: 1px;
1902
+ }
1903
+
1904
+ .hx-input-number-spin .hx-input-number-increment {
1905
+ border-start-end-radius: var(--h-inputnumber-button-border-radius);
1906
+ }
1907
+
1908
+ .hx-input-number-spin .hx-input-number-decrement {
1909
+ border-block-start-width: 1px;
1910
+ border-end-end-radius: var(--h-inputnumber-button-border-radius);
1911
+ }
1912
+
1913
+ /* horizontal: minus | field | plus */
1914
+ .hx-input-number-horizontal .hx-input {
1915
+ border-radius: 0;
1916
+ text-align: center;
1917
+ }
1918
+
1919
+ .hx-input-number-horizontal .hx-input-number-button {
1920
+ flex: 0 0 auto;
1921
+ width: var(--h-inputnumber-button-width);
1922
+ padding-block: var(--h-inputnumber-button-vertical-padding);
1923
+ }
1924
+
1925
+ .hx-input-number-horizontal .hx-input-number-decrement {
1926
+ border-inline-end-width: 0;
1927
+ border-start-start-radius: var(--h-inputnumber-button-border-radius);
1928
+ border-end-start-radius: var(--h-inputnumber-button-border-radius);
1929
+ }
1930
+
1931
+ .hx-input-number-horizontal .hx-input-number-increment {
1932
+ border-inline-start-width: 0;
1933
+ border-start-end-radius: var(--h-inputnumber-button-border-radius);
1934
+ border-end-end-radius: var(--h-inputnumber-button-border-radius);
1935
+ }
1936
+
1937
+ .hx-input-number.ng-invalid.ng-touched .hx-input {
1938
+ border-color: var(--h-inputtext-invalid-border-color);
1939
+ }
1940
+
1941
+ @media (prefers-reduced-motion: reduce) {
1942
+ .hx-input-number-button {
1943
+ transition: none;
1944
+ }
1945
+ }
1946
+
1947
+ /* input */
1948
+ /*
1949
+ * Text field: `input[hx-input]` and `textarea[hx-input]`, styled
1950
+ * from the `--h-inputtext-*` tokens (the Textarea tokens hold the same values).
1951
+ * Invalid: `aria-invalid="true"` or Angular's `ng-invalid ng-touched`.
1952
+ */
1953
+ .hx-input {
1954
+ box-sizing: border-box;
1955
+ padding: var(--h-inputtext-padding-y) var(--h-inputtext-padding-x);
1956
+ border: 1px solid var(--h-inputtext-border-color);
1957
+ border-radius: var(--h-inputtext-border-radius);
1958
+ appearance: none;
1959
+ background: var(--h-inputtext-background);
1960
+ color: var(--h-inputtext-color);
1961
+ box-shadow: var(--h-inputtext-shadow);
1962
+ font: inherit;
1963
+ font-size: 1rem;
1964
+ outline: 0 none;
1965
+ transition: background var(--h-inputtext-transition-duration), color var(--h-inputtext-transition-duration), border-color var(--h-inputtext-transition-duration), outline-color var(--h-inputtext-transition-duration), box-shadow var(--h-inputtext-transition-duration);
1966
+ }
1967
+
1968
+ .hx-input::placeholder {
1969
+ color: var(--h-inputtext-placeholder-color);
1970
+ }
1971
+
1972
+ .hx-input:enabled:hover {
1973
+ border-color: var(--h-inputtext-hover-border-color);
1974
+ }
1975
+
1976
+ .hx-input:enabled:focus {
1977
+ border-color: var(--h-inputtext-focus-border-color);
1978
+ outline: var(--h-inputtext-focus-ring-width) var(--h-inputtext-focus-ring-style) var(--h-inputtext-focus-ring-color);
1979
+ outline-offset: var(--h-inputtext-focus-ring-offset);
1980
+ box-shadow: var(--h-inputtext-focus-ring-shadow);
1981
+ }
1982
+
1983
+ .hx-input:disabled {
1984
+ background: var(--h-inputtext-disabled-background);
1985
+ color: var(--h-inputtext-disabled-color);
1986
+ opacity: 1;
1987
+ cursor: default;
1988
+ }
1989
+
1990
+ /* invalid */
1991
+ .hx-input[aria-invalid=true],
1992
+ .hx-input.ng-invalid.ng-touched {
1993
+ border-color: var(--h-inputtext-invalid-border-color);
1994
+ }
1995
+
1996
+ .hx-input[aria-invalid=true]::placeholder,
1997
+ .hx-input.ng-invalid.ng-touched::placeholder {
1998
+ color: var(--h-inputtext-invalid-placeholder-color);
1999
+ }
2000
+
2001
+ /* filled */
2002
+ .hx-input-filled {
2003
+ background: var(--h-inputtext-filled-background);
2004
+ }
2005
+
2006
+ .hx-input-filled:enabled:hover {
2007
+ background: var(--h-inputtext-filled-hover-background);
2008
+ }
2009
+
2010
+ .hx-input-filled:enabled:focus {
2011
+ background: var(--h-inputtext-filled-focus-background);
2012
+ }
2013
+
2014
+ /* sizes */
2015
+ .hx-input-sm {
2016
+ padding: var(--h-inputtext-sm-padding-y) var(--h-inputtext-sm-padding-x);
2017
+ font-size: var(--h-inputtext-sm-font-size);
2018
+ }
2019
+
2020
+ .hx-input-lg {
2021
+ padding: var(--h-inputtext-lg-padding-y) var(--h-inputtext-lg-padding-x);
2022
+ font-size: var(--h-inputtext-lg-font-size);
2023
+ }
2024
+
2025
+ .hx-input-fluid {
2026
+ width: 100%;
2027
+ }
2028
+
2029
+ textarea.hx-input {
2030
+ min-height: 4rem;
2031
+ resize: vertical;
2032
+ }
2033
+
2034
+ /* the height follows the content: no handle, no scrollbar while it grows */
2035
+ textarea.hx-input-auto-resize {
2036
+ overflow: hidden;
2037
+ resize: none;
2038
+ }
2039
+
2040
+ /* listbox */
2041
+ /*
2042
+ * Listbox: `<hx-listbox>`. An inline list of options in a bordered box from the `--h-listbox-*` tokens, with an
2043
+ * optional filter field above it. The options follow the Select's: focus and selected backgrounds, an optional
2044
+ * checkmark in front.
2045
+ */
2046
+ .hx-listbox {
2047
+ display: block;
2048
+ box-sizing: border-box;
2049
+ min-width: 10rem;
2050
+ border: 1px solid var(--h-listbox-border-color);
2051
+ border-radius: var(--h-listbox-border-radius);
2052
+ background: var(--h-listbox-background);
2053
+ color: var(--h-listbox-color);
2054
+ box-shadow: var(--h-listbox-shadow);
2055
+ transition: border-color var(--h-listbox-transition-duration);
2056
+ }
2057
+
2058
+ .hx-listbox-header {
2059
+ padding: var(--h-listbox-list-header-padding);
2060
+ }
2061
+
2062
+ .hx-listbox-filter {
2063
+ box-sizing: border-box;
2064
+ width: 100%;
2065
+ padding: var(--h-inputtext-padding-y) var(--h-inputtext-padding-x);
2066
+ border: 1px solid var(--h-inputtext-border-color);
2067
+ border-radius: var(--h-inputtext-border-radius);
2068
+ background: var(--h-inputtext-background);
2069
+ color: var(--h-inputtext-color);
2070
+ font: inherit;
2071
+ outline: 0 none;
2072
+ }
2073
+
2074
+ .hx-listbox-filter:focus {
2075
+ border-color: var(--h-inputtext-focus-border-color);
2076
+ }
2077
+
2078
+ .hx-listbox-scroll {
2079
+ overflow: auto;
2080
+ }
2081
+
2082
+ .hx-listbox-list {
2083
+ display: flex;
2084
+ flex-direction: column;
2085
+ gap: var(--h-listbox-list-gap);
2086
+ padding: var(--h-listbox-list-padding);
2087
+ outline: 0 none;
2088
+ }
2089
+
2090
+ .hx-listbox-list:focus-visible {
2091
+ outline: 1px solid var(--h-listbox-option-selected-color);
2092
+ outline-offset: -2px;
2093
+ }
2094
+
2095
+ .hx-listbox-option {
2096
+ display: flex;
2097
+ align-items: center;
2098
+ gap: var(--h-listbox-checkmark-gutter-end);
2099
+ padding: var(--h-listbox-option-padding);
2100
+ border-radius: var(--h-listbox-option-border-radius);
2101
+ color: var(--h-listbox-option-color);
2102
+ cursor: pointer;
2103
+ user-select: none;
2104
+ }
2105
+
2106
+ .hx-listbox-option:hover,
2107
+ .hx-listbox-option.cdk-option-active {
2108
+ background: var(--h-listbox-option-focus-background);
2109
+ color: var(--h-listbox-option-focus-color);
2110
+ }
2111
+
2112
+ .hx-listbox-option[aria-selected=true] {
2113
+ background: var(--h-listbox-option-selected-background);
2114
+ color: var(--h-listbox-option-selected-color);
2115
+ }
2116
+
2117
+ .hx-listbox-option[aria-selected=true]:hover,
2118
+ .hx-listbox-option[aria-selected=true].cdk-option-active {
2119
+ background: var(--h-listbox-option-selected-focus-background);
2120
+ color: var(--h-listbox-option-selected-focus-color);
2121
+ }
2122
+
2123
+ .hx-listbox-option[aria-disabled=true] {
2124
+ opacity: 0.5;
2125
+ cursor: default;
2126
+ pointer-events: none;
2127
+ }
2128
+
2129
+ /* the checkmark column exists only with `checkmark` */
2130
+ .hx-listbox-check {
2131
+ display: none;
2132
+ }
2133
+
2134
+ .hx-listbox-checkmark .hx-listbox-check {
2135
+ display: block;
2136
+ flex: none;
2137
+ width: 0.875rem;
2138
+ height: 0.875rem;
2139
+ }
2140
+
2141
+ .hx-listbox-checkmark .hx-listbox-option[aria-selected=true] .hx-listbox-check {
2142
+ display: inline-block;
2143
+ flex: none;
2144
+ width: 0.875rem;
2145
+ height: 0.875rem;
2146
+ background: var(--h-listbox-checkmark-color);
2147
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m5 12.5 4.5 4.5L19 7.5'/%3E%3C/svg%3E") center/contain no-repeat;
2148
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m5 12.5 4.5 4.5L19 7.5'/%3E%3C/svg%3E") center/contain no-repeat;
2149
+ }
2150
+
2151
+ .hx-listbox-empty {
2152
+ padding: var(--h-listbox-empty-message-padding);
2153
+ color: var(--h-inputtext-placeholder-color);
2154
+ }
2155
+
2156
+ .hx-listbox-invalid,
2157
+ .hx-listbox.ng-invalid.ng-touched {
2158
+ border-color: var(--h-listbox-invalid-border-color);
2159
+ }
2160
+
2161
+ .hx-listbox-disabled {
2162
+ background: var(--h-listbox-disabled-background);
2163
+ color: var(--h-listbox-disabled-color);
2164
+ }
2165
+
2166
+ .hx-listbox-disabled .hx-listbox-option {
2167
+ cursor: default;
2168
+ }
2169
+
2170
+ @media (prefers-reduced-motion: reduce) {
2171
+ .hx-listbox {
2172
+ transition: none;
2173
+ }
2174
+ }
2175
+
2176
+ /* menu */
2177
+ /*
2178
+ * Menu: `<hx-menu>` and the list it shares with `<hx-menubar>` (`hx-menu-panel`). Colours and spacing from the
2179
+ * `--h-menu-*` tokens, the submenu arrow and the open item from `--h-tieredmenu-*`. A popup menu and its submenus are
2180
+ * CDK overlays.
2181
+ */
2182
+ .hx-menu {
2183
+ display: inline-block;
2184
+ }
2185
+
2186
+ .hx-menu:not(.hx-menu-popup) {
2187
+ display: block;
2188
+ }
2189
+
2190
+ .hx-menu-panel {
2191
+ display: contents;
2192
+ }
2193
+
2194
+ .hx-menu-list {
2195
+ display: flex;
2196
+ flex-direction: column;
2197
+ gap: var(--h-menu-list-gap);
2198
+ box-sizing: border-box;
2199
+ min-width: 12.5rem;
2200
+ padding: var(--h-menu-list-padding);
2201
+ border: 1px solid var(--h-menu-border-color);
2202
+ border-radius: var(--h-menu-border-radius);
2203
+ background: var(--h-menu-background);
2204
+ color: var(--h-menu-color);
2205
+ box-shadow: var(--h-menu-shadow);
2206
+ outline: 0 none;
2207
+ }
2208
+
2209
+ .hx-menu-group {
2210
+ display: flex;
2211
+ flex-direction: column;
2212
+ gap: var(--h-menu-list-gap);
2213
+ }
2214
+
2215
+ .hx-menu-heading {
2216
+ padding: var(--h-menu-submenu-label-padding);
2217
+ background: var(--h-menu-submenu-label-background);
2218
+ color: var(--h-menu-submenu-label-color);
2219
+ font-weight: var(--h-menu-submenu-label-font-weight);
2220
+ }
2221
+
2222
+ .hx-menu-item {
2223
+ display: flex;
2224
+ align-items: center;
2225
+ gap: var(--h-menu-item-gap);
2226
+ box-sizing: border-box;
2227
+ width: 100%;
2228
+ padding: var(--h-menu-item-padding);
2229
+ border: 0;
2230
+ border-radius: var(--h-menu-item-border-radius);
2231
+ background: transparent;
2232
+ color: var(--h-menu-item-color);
2233
+ font: inherit;
2234
+ text-align: start;
2235
+ text-decoration: none;
2236
+ cursor: pointer;
2237
+ outline: 0 none;
2238
+ user-select: none;
2239
+ transition: background var(--h-menu-transition-duration), color var(--h-menu-transition-duration);
2240
+ }
2241
+
2242
+ .hx-menu-item:hover:not([aria-disabled=true]),
2243
+ .hx-menu-item:focus-visible {
2244
+ background: var(--h-menu-item-focus-background);
2245
+ color: var(--h-menu-item-focus-color);
2246
+ }
2247
+
2248
+ .hx-menu-item[aria-expanded=true] {
2249
+ background: var(--h-tieredmenu-item-active-background);
2250
+ color: var(--h-tieredmenu-item-active-color);
2251
+ }
2252
+
2253
+ .hx-menu-item[aria-disabled=true] {
2254
+ opacity: 0.5;
2255
+ cursor: default;
2256
+ }
2257
+
2258
+ .hx-menu-icon {
2259
+ flex: none;
2260
+ color: var(--h-menu-item-icon-color);
2261
+ }
2262
+
2263
+ .hx-menu-item:hover:not([aria-disabled=true]) .hx-menu-icon,
2264
+ .hx-menu-item:focus-visible .hx-menu-icon {
2265
+ color: var(--h-menu-item-icon-focus-color);
2266
+ }
2267
+
2268
+ .hx-menu-label {
2269
+ flex: 1 1 auto;
2270
+ min-width: 0;
2271
+ }
2272
+
2273
+ .hx-menu-badge {
2274
+ flex: none;
2275
+ padding: 0 0.375rem;
2276
+ border-radius: 999px;
2277
+ background: var(--h-menu-item-focus-background);
2278
+ font-size: 0.75rem;
2279
+ }
2280
+
2281
+ .hx-menu-submenu-icon {
2282
+ display: inline-block;
2283
+ flex: none;
2284
+ width: var(--h-tieredmenu-submenu-icon-size);
2285
+ height: var(--h-tieredmenu-submenu-icon-size);
2286
+ background: var(--h-tieredmenu-submenu-icon-color);
2287
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m9 6 6 6-6 6'/%3E%3C/svg%3E") center/contain no-repeat;
2288
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m9 6 6 6-6 6'/%3E%3C/svg%3E") center/contain no-repeat;
2289
+ margin-inline-start: auto;
2290
+ }
2291
+
2292
+ .hx-menu-item:hover .hx-menu-submenu-icon,
2293
+ .hx-menu-item:focus-visible .hx-menu-submenu-icon {
2294
+ background: var(--h-tieredmenu-submenu-icon-focus-color);
2295
+ }
2296
+
2297
+ .hx-menu-item[aria-expanded=true] .hx-menu-submenu-icon {
2298
+ background: var(--h-tieredmenu-submenu-icon-active-color);
2299
+ }
2300
+
2301
+ .hx-menu-separator {
2302
+ margin: 0.125rem 0;
2303
+ border-top: 1px solid var(--h-menu-separator-border-color);
2304
+ }
2305
+
2306
+ .hx-menu-popup {
2307
+ display: contents;
2308
+ }
2309
+
2310
+ @media (prefers-reduced-motion: reduce) {
2311
+ .hx-menu-item {
2312
+ transition: none;
2313
+ }
2314
+ }
2315
+
2316
+ /* message */
2317
+ /*
2318
+ * Message: `<hx-message>`. An inline message from the `--h-message-*` tokens; the severity picks the colours
2319
+ * (`filled`, `outlined`, `simple`), the icon is one of the internal icons.
2320
+ */
2321
+ .hx-message {
2322
+ display: block;
2323
+ box-sizing: border-box;
2324
+ border: var(--h-message-border-width) solid var(--hx-message-border-color);
2325
+ border-radius: var(--h-message-border-radius);
2326
+ background: var(--hx-message-background);
2327
+ color: var(--hx-message-color);
2328
+ box-shadow: var(--hx-message-shadow);
2329
+ }
2330
+
2331
+ .hx-message[hidden] {
2332
+ display: none;
2333
+ }
2334
+
2335
+ .hx-message-info {
2336
+ --hx-message-background: var(--h-message-info-background);
2337
+ --hx-message-border-color: var(--h-message-info-border-color);
2338
+ --hx-message-color: var(--h-message-info-color);
2339
+ --hx-message-shadow: var(--h-message-info-shadow);
2340
+ --hx-message-hover: var(--h-message-info-close-button-hover-background);
2341
+ --hx-message-ring: var(--h-message-info-close-button-focus-ring-color);
2342
+ --hx-message-ring-shadow: var(--h-message-info-close-button-focus-ring-shadow);
2343
+ --hx-message-outlined-color: var(--h-message-info-outlined-color);
2344
+ --hx-message-outlined-border-color: var(--h-message-info-outlined-border-color);
2345
+ --hx-message-simple-color: var(--h-message-info-simple-color);
2346
+ }
2347
+
2348
+ .hx-message-success {
2349
+ --hx-message-background: var(--h-message-success-background);
2350
+ --hx-message-border-color: var(--h-message-success-border-color);
2351
+ --hx-message-color: var(--h-message-success-color);
2352
+ --hx-message-shadow: var(--h-message-success-shadow);
2353
+ --hx-message-hover: var(--h-message-success-close-button-hover-background);
2354
+ --hx-message-ring: var(--h-message-success-close-button-focus-ring-color);
2355
+ --hx-message-ring-shadow: var(--h-message-success-close-button-focus-ring-shadow);
2356
+ --hx-message-outlined-color: var(--h-message-success-outlined-color);
2357
+ --hx-message-outlined-border-color: var(--h-message-success-outlined-border-color);
2358
+ --hx-message-simple-color: var(--h-message-success-simple-color);
2359
+ }
2360
+
2361
+ .hx-message-warn {
2362
+ --hx-message-background: var(--h-message-warn-background);
2363
+ --hx-message-border-color: var(--h-message-warn-border-color);
2364
+ --hx-message-color: var(--h-message-warn-color);
2365
+ --hx-message-shadow: var(--h-message-warn-shadow);
2366
+ --hx-message-hover: var(--h-message-warn-close-button-hover-background);
2367
+ --hx-message-ring: var(--h-message-warn-close-button-focus-ring-color);
2368
+ --hx-message-ring-shadow: var(--h-message-warn-close-button-focus-ring-shadow);
2369
+ --hx-message-outlined-color: var(--h-message-warn-outlined-color);
2370
+ --hx-message-outlined-border-color: var(--h-message-warn-outlined-border-color);
2371
+ --hx-message-simple-color: var(--h-message-warn-simple-color);
2372
+ }
2373
+
2374
+ .hx-message-error {
2375
+ --hx-message-background: var(--h-message-error-background);
2376
+ --hx-message-border-color: var(--h-message-error-border-color);
2377
+ --hx-message-color: var(--h-message-error-color);
2378
+ --hx-message-shadow: var(--h-message-error-shadow);
2379
+ --hx-message-hover: var(--h-message-error-close-button-hover-background);
2380
+ --hx-message-ring: var(--h-message-error-close-button-focus-ring-color);
2381
+ --hx-message-ring-shadow: var(--h-message-error-close-button-focus-ring-shadow);
2382
+ --hx-message-outlined-color: var(--h-message-error-outlined-color);
2383
+ --hx-message-outlined-border-color: var(--h-message-error-outlined-border-color);
2384
+ --hx-message-simple-color: var(--h-message-error-simple-color);
2385
+ }
2386
+
2387
+ .hx-message-secondary {
2388
+ --hx-message-background: var(--h-message-secondary-background);
2389
+ --hx-message-border-color: var(--h-message-secondary-border-color);
2390
+ --hx-message-color: var(--h-message-secondary-color);
2391
+ --hx-message-shadow: var(--h-message-secondary-shadow);
2392
+ --hx-message-hover: var(--h-message-secondary-close-button-hover-background);
2393
+ --hx-message-ring: var(--h-message-secondary-close-button-focus-ring-color);
2394
+ --hx-message-ring-shadow: var(--h-message-secondary-close-button-focus-ring-shadow);
2395
+ --hx-message-outlined-color: var(--h-message-secondary-outlined-color);
2396
+ --hx-message-outlined-border-color: var(--h-message-secondary-outlined-border-color);
2397
+ --hx-message-simple-color: var(--h-message-secondary-simple-color);
2398
+ }
2399
+
2400
+ .hx-message-contrast {
2401
+ --hx-message-background: var(--h-message-contrast-background);
2402
+ --hx-message-border-color: var(--h-message-contrast-border-color);
2403
+ --hx-message-color: var(--h-message-contrast-color);
2404
+ --hx-message-shadow: var(--h-message-contrast-shadow);
2405
+ --hx-message-hover: var(--h-message-contrast-close-button-hover-background);
2406
+ --hx-message-ring: var(--h-message-contrast-close-button-focus-ring-color);
2407
+ --hx-message-ring-shadow: var(--h-message-contrast-close-button-focus-ring-shadow);
2408
+ --hx-message-outlined-color: var(--h-message-contrast-outlined-color);
2409
+ --hx-message-outlined-border-color: var(--h-message-contrast-outlined-border-color);
2410
+ --hx-message-simple-color: var(--h-message-contrast-simple-color);
2411
+ }
2412
+
2413
+ .hx-message-outlined {
2414
+ --hx-message-background: transparent;
2415
+ --hx-message-shadow: none;
2416
+ --hx-message-color: var(--hx-message-outlined-color);
2417
+ --hx-message-border-color: var(--hx-message-outlined-border-color);
2418
+ border-width: var(--h-message-outlined-border-width);
2419
+ }
2420
+
2421
+ .hx-message-simple {
2422
+ --hx-message-background: transparent;
2423
+ --hx-message-shadow: none;
2424
+ --hx-message-color: var(--hx-message-simple-color);
2425
+ --hx-message-border-color: transparent;
2426
+ }
2427
+
2428
+ .hx-message-content {
2429
+ display: flex;
2430
+ align-items: center;
2431
+ gap: var(--h-message-content-gap);
2432
+ padding: var(--h-message-content-padding);
2433
+ }
2434
+
2435
+ .hx-message-simple .hx-message-content {
2436
+ padding: var(--h-message-simple-content-padding);
2437
+ }
2438
+
2439
+ .hx-message-text {
2440
+ flex: 1 1 auto;
2441
+ min-width: 0;
2442
+ font-size: var(--h-message-text-font-size);
2443
+ font-weight: var(--h-message-text-font-weight);
2444
+ }
2445
+
2446
+ .hx-message-icon,
2447
+ .hx-message-icon-custom {
2448
+ flex: none;
2449
+ width: var(--h-message-icon-size);
2450
+ height: var(--h-message-icon-size);
2451
+ font-size: var(--h-message-icon-size);
2452
+ }
2453
+
2454
+ .hx-message-info .hx-message-icon {
2455
+ display: inline-block;
2456
+ flex: none;
2457
+ width: var(--h-message-icon-size);
2458
+ height: var(--h-message-icon-size);
2459
+ background: currentcolor;
2460
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.5 12a8.5 8.5 0 1 1-17 0 8.5 8.5 0 0 1 17 0ZM12 11v5M12 8v.01'/%3E%3C/svg%3E") center/contain no-repeat;
2461
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.5 12a8.5 8.5 0 1 1-17 0 8.5 8.5 0 0 1 17 0ZM12 11v5M12 8v.01'/%3E%3C/svg%3E") center/contain no-repeat;
2462
+ }
2463
+
2464
+ .hx-message-success .hx-message-icon {
2465
+ display: inline-block;
2466
+ flex: none;
2467
+ width: var(--h-message-icon-size);
2468
+ height: var(--h-message-icon-size);
2469
+ background: currentcolor;
2470
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.5 12a8.5 8.5 0 1 1-17 0 8.5 8.5 0 0 1 17 0ZM8 12.2l2.8 2.8L16 9.5'/%3E%3C/svg%3E") center/contain no-repeat;
2471
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.5 12a8.5 8.5 0 1 1-17 0 8.5 8.5 0 0 1 17 0ZM8 12.2l2.8 2.8L16 9.5'/%3E%3C/svg%3E") center/contain no-repeat;
2472
+ }
2473
+
2474
+ .hx-message-warn .hx-message-icon {
2475
+ display: inline-block;
2476
+ flex: none;
2477
+ width: var(--h-message-icon-size);
2478
+ height: var(--h-message-icon-size);
2479
+ background: currentcolor;
2480
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 4 21 19.5H3L12 4ZM12 10v4.5M12 17.2v.01'/%3E%3C/svg%3E") center/contain no-repeat;
2481
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 4 21 19.5H3L12 4ZM12 10v4.5M12 17.2v.01'/%3E%3C/svg%3E") center/contain no-repeat;
2482
+ }
2483
+
2484
+ .hx-message-error .hx-message-icon {
2485
+ display: inline-block;
2486
+ flex: none;
2487
+ width: var(--h-message-icon-size);
2488
+ height: var(--h-message-icon-size);
2489
+ background: currentcolor;
2490
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.5 12a8.5 8.5 0 1 1-17 0 8.5 8.5 0 0 1 17 0ZM9 9l6 6M15 9l-6 6'/%3E%3C/svg%3E") center/contain no-repeat;
2491
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.5 12a8.5 8.5 0 1 1-17 0 8.5 8.5 0 0 1 17 0ZM9 9l6 6M15 9l-6 6'/%3E%3C/svg%3E") center/contain no-repeat;
2492
+ }
2493
+
2494
+ .hx-message-secondary .hx-message-icon {
2495
+ display: inline-block;
2496
+ flex: none;
2497
+ width: var(--h-message-icon-size);
2498
+ height: var(--h-message-icon-size);
2499
+ background: currentcolor;
2500
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.5 12a8.5 8.5 0 1 1-17 0 8.5 8.5 0 0 1 17 0ZM12 11v5M12 8v.01'/%3E%3C/svg%3E") center/contain no-repeat;
2501
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.5 12a8.5 8.5 0 1 1-17 0 8.5 8.5 0 0 1 17 0ZM12 11v5M12 8v.01'/%3E%3C/svg%3E") center/contain no-repeat;
2502
+ }
2503
+
2504
+ .hx-message-contrast .hx-message-icon {
2505
+ display: inline-block;
2506
+ flex: none;
2507
+ width: var(--h-message-icon-size);
2508
+ height: var(--h-message-icon-size);
2509
+ background: currentcolor;
2510
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.5 12a8.5 8.5 0 1 1-17 0 8.5 8.5 0 0 1 17 0ZM12 11v5M12 8v.01'/%3E%3C/svg%3E") center/contain no-repeat;
2511
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.5 12a8.5 8.5 0 1 1-17 0 8.5 8.5 0 0 1 17 0ZM12 11v5M12 8v.01'/%3E%3C/svg%3E") center/contain no-repeat;
2512
+ }
2513
+
2514
+ .hx-message-close {
2515
+ display: inline-flex;
2516
+ flex: none;
2517
+ align-items: center;
2518
+ justify-content: center;
2519
+ width: var(--h-message-close-button-width);
2520
+ height: var(--h-message-close-button-height);
2521
+ margin-inline-start: auto;
2522
+ padding: 0;
2523
+ border: 0;
2524
+ border-radius: var(--h-message-close-button-border-radius);
2525
+ background: transparent;
2526
+ color: inherit;
2527
+ cursor: pointer;
2528
+ outline: 0 none;
2529
+ transition: background var(--h-message-transition-duration);
2530
+ }
2531
+
2532
+ .hx-message-close:hover {
2533
+ background: var(--hx-message-hover);
2534
+ }
2535
+
2536
+ .hx-message-close:focus-visible {
2537
+ outline: var(--h-message-close-button-focus-ring-width) var(--h-message-close-button-focus-ring-style) var(--hx-message-ring);
2538
+ outline-offset: var(--h-message-close-button-focus-ring-offset);
2539
+ box-shadow: var(--hx-message-ring-shadow);
2540
+ }
2541
+
2542
+ .hx-message-close-icon {
2543
+ display: inline-block;
2544
+ flex: none;
2545
+ width: var(--h-message-close-icon-size);
2546
+ height: var(--h-message-close-icon-size);
2547
+ background: currentcolor;
2548
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 6l12 12M18 6 6 18'/%3E%3C/svg%3E") center/contain no-repeat;
2549
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 6l12 12M18 6 6 18'/%3E%3C/svg%3E") center/contain no-repeat;
2550
+ }
2551
+
2552
+ /* sizes */
2553
+ .hx-message-sm .hx-message-content {
2554
+ padding: var(--h-message-content-sm-padding);
2555
+ }
2556
+
2557
+ .hx-message-sm .hx-message-text {
2558
+ font-size: var(--h-message-text-sm-font-size);
2559
+ }
2560
+
2561
+ .hx-message-sm .hx-message-icon,
2562
+ .hx-message-sm .hx-message-icon-custom {
2563
+ width: var(--h-message-icon-sm-size);
2564
+ height: var(--h-message-icon-sm-size);
2565
+ font-size: var(--h-message-icon-sm-size);
2566
+ }
2567
+
2568
+ .hx-message-sm .hx-message-close-icon {
2569
+ width: var(--h-message-close-icon-sm-size);
2570
+ height: var(--h-message-close-icon-sm-size);
2571
+ }
2572
+
2573
+ .hx-message-lg .hx-message-content {
2574
+ padding: var(--h-message-content-lg-padding);
2575
+ }
2576
+
2577
+ .hx-message-lg .hx-message-text {
2578
+ font-size: var(--h-message-text-lg-font-size);
2579
+ }
2580
+
2581
+ .hx-message-lg .hx-message-icon,
2582
+ .hx-message-lg .hx-message-icon-custom {
2583
+ width: var(--h-message-icon-lg-size);
2584
+ height: var(--h-message-icon-lg-size);
2585
+ font-size: var(--h-message-icon-lg-size);
2586
+ }
2587
+
2588
+ .hx-message-lg .hx-message-close-icon {
2589
+ width: var(--h-message-close-icon-lg-size);
2590
+ height: var(--h-message-close-icon-lg-size);
2591
+ }
2592
+
2593
+ @media (prefers-reduced-motion: reduce) {
2594
+ .hx-message-close {
2595
+ transition: none;
2596
+ }
2597
+ }
2598
+
2599
+ /* panel */
2600
+ /*
2601
+ * Panel: `<hx-panel>`. A bordered container from the `--h-panel-*` tokens with a header (title, actions, the
2602
+ * toggle button), the content and a footer. The content collapses by animating its grid row to zero height.
2603
+ */
2604
+ .hx-panel {
2605
+ display: block;
2606
+ border: 1px solid var(--h-panel-border-color);
2607
+ border-radius: var(--h-panel-border-radius);
2608
+ background: var(--h-panel-background);
2609
+ color: var(--h-panel-color);
2610
+ }
2611
+
2612
+ .hx-panel-header {
2613
+ display: flex;
2614
+ align-items: center;
2615
+ justify-content: space-between;
2616
+ gap: 0.5rem;
2617
+ padding: var(--h-panel-header-padding);
2618
+ border: var(--h-panel-header-border-width) solid var(--h-panel-header-border-color);
2619
+ border-radius: var(--h-panel-header-border-radius);
2620
+ background: var(--h-panel-header-background);
2621
+ color: var(--h-panel-header-color);
2622
+ }
2623
+
2624
+ .hx-panel-toggleable .hx-panel-header {
2625
+ padding: var(--h-panel-toggleable-header-padding);
2626
+ }
2627
+
2628
+ .hx-panel-title {
2629
+ flex: 1 1 auto;
2630
+ font-weight: var(--h-panel-title-font-weight);
2631
+ }
2632
+
2633
+ .hx-panel-header-actions {
2634
+ display: flex;
2635
+ align-items: center;
2636
+ gap: 0.5rem;
2637
+ }
2638
+
2639
+ .hx-panel-header-actions:empty {
2640
+ display: none;
2641
+ }
2642
+
2643
+ .hx-panel-toggle {
2644
+ display: inline-flex;
2645
+ align-items: center;
2646
+ justify-content: center;
2647
+ width: 2rem;
2648
+ height: 2rem;
2649
+ border: 0;
2650
+ border-radius: 50%;
2651
+ background: transparent;
2652
+ color: inherit;
2653
+ cursor: pointer;
2654
+ outline: 0 none;
2655
+ }
2656
+
2657
+ .hx-panel-toggle:hover {
2658
+ background: var(--h-panel-header-border-color);
2659
+ }
2660
+
2661
+ .hx-panel-toggle:focus-visible {
2662
+ outline: 2px solid currentcolor;
2663
+ outline-offset: 2px;
2664
+ }
2665
+
2666
+ .hx-panel-toggle-icon {
2667
+ display: inline-block;
2668
+ flex: none;
2669
+ width: 1rem;
2670
+ height: 1rem;
2671
+ background: currentcolor;
2672
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 15 6-6 6 6'/%3E%3C/svg%3E") center/contain no-repeat;
2673
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 15 6-6 6 6'/%3E%3C/svg%3E") center/contain no-repeat;
2674
+ transition: transform 0.2s;
2675
+ }
2676
+
2677
+ .hx-panel-collapsed .hx-panel-toggle-icon {
2678
+ transform: rotate(180deg);
2679
+ }
2680
+
2681
+ .hx-panel-collapse {
2682
+ display: grid;
2683
+ grid-template-rows: 1fr;
2684
+ transition: grid-template-rows 0.2s, visibility 0.2s;
2685
+ }
2686
+
2687
+ .hx-panel-collapsed .hx-panel-collapse {
2688
+ grid-template-rows: 0fr;
2689
+ visibility: hidden;
2690
+ }
2691
+
2692
+ .hx-panel-collapse-inner {
2693
+ min-height: 0;
2694
+ overflow: hidden;
2695
+ }
2696
+
2697
+ .hx-panel-content {
2698
+ padding: var(--h-panel-content-padding);
2699
+ }
2700
+
2701
+ .hx-panel-footer {
2702
+ padding: var(--h-panel-footer-padding);
2703
+ }
2704
+
2705
+ .hx-panel-footer:empty {
2706
+ display: none;
2707
+ }
2708
+
2709
+ @media (prefers-reduced-motion: reduce) {
2710
+ .hx-panel-collapse,
2711
+ .hx-panel-toggle-icon {
2712
+ transition: none;
2713
+ }
2714
+ }
2715
+
2716
+ /* password */
2717
+ /*
2718
+ * Password: `<hx-password>`. The field is an `hx-input` inside; the toggle button sits on its end edge.
2719
+ * Colours come from `--h-password-*` (icon) and the input tokens.
2720
+ */
2721
+ .hx-password {
2722
+ position: relative;
2723
+ display: inline-flex;
2724
+ }
2725
+
2726
+ .hx-password-fluid {
2727
+ display: flex;
2728
+ width: 100%;
2729
+ }
2730
+
2731
+ .hx-password .hx-input {
2732
+ flex: 1 1 auto;
2733
+ }
2734
+
2735
+ .hx-password-has-toggle .hx-input {
2736
+ padding-inline-end: 2.5rem;
2737
+ }
2738
+
2739
+ .hx-password-toggle {
2740
+ position: absolute;
2741
+ inset-block: 0;
2742
+ inset-inline-end: 0;
2743
+ display: inline-flex;
2744
+ align-items: center;
2745
+ justify-content: center;
2746
+ width: 2.5rem;
2747
+ padding: 0;
2748
+ border: 0;
2749
+ border-radius: var(--h-inputtext-border-radius);
2750
+ background: transparent;
2751
+ color: var(--h-password-icon-color);
2752
+ font-size: 1rem;
2753
+ cursor: pointer;
2754
+ outline-color: transparent;
2755
+ }
2756
+
2757
+ .hx-password-toggle:focus-visible {
2758
+ outline: var(--h-inputtext-focus-ring-width) var(--h-inputtext-focus-ring-style) var(--h-inputtext-focus-ring-color);
2759
+ outline-offset: -2px;
2760
+ }
2761
+
2762
+ .hx-password-toggle:disabled {
2763
+ cursor: default;
2764
+ opacity: 0.6;
2765
+ }
2766
+
2767
+ .hx-password.ng-invalid.ng-touched .hx-input {
2768
+ border-color: var(--h-inputtext-invalid-border-color);
2769
+ }
2770
+
2771
+ /* popover */
2772
+ /*
2773
+ * Popover: `<hx-popover>`. A panel in a CDK connected overlay (`.hx-popover-overlay` is the pane) from the
2774
+ * `--h-popover-*` tokens, with an arrow (a rotated square) pointing at the element: on the top edge when the popover is
2775
+ * below it, on the bottom edge when it is above, at the arrow offset from the start or the end.
2776
+ */
2777
+ .hx-popover-anchor {
2778
+ display: none;
2779
+ }
2780
+
2781
+ .hx-popover {
2782
+ position: relative;
2783
+ box-sizing: border-box;
2784
+ max-width: calc(100vw - 2rem);
2785
+ margin-block-start: var(--h-popover-gutter);
2786
+ border: 1px solid var(--h-popover-border-color);
2787
+ border-radius: var(--h-popover-border-radius);
2788
+ background: var(--h-popover-background);
2789
+ color: var(--h-popover-color);
2790
+ box-shadow: var(--h-popover-shadow);
2791
+ }
2792
+
2793
+ .hx-popover-above {
2794
+ margin-block: 0 var(--h-popover-gutter);
2795
+ }
2796
+
2797
+ .hx-popover-content {
2798
+ padding: var(--h-popover-content-padding);
2799
+ }
2800
+
2801
+ .hx-popover::before {
2802
+ content: "";
2803
+ position: absolute;
2804
+ inset-inline-start: var(--h-popover-arrow-offset);
2805
+ inset-block-start: -6px;
2806
+ width: 10px;
2807
+ height: 10px;
2808
+ box-sizing: border-box;
2809
+ border: 1px solid var(--h-popover-border-color);
2810
+ border-inline-end: 0;
2811
+ border-block-end: 0;
2812
+ background: var(--h-popover-background);
2813
+ transform: rotate(45deg);
2814
+ }
2815
+
2816
+ .hx-popover-end::before {
2817
+ inset-inline: auto var(--h-popover-arrow-offset);
2818
+ }
2819
+
2820
+ .hx-popover-above::before {
2821
+ inset-block: auto -6px;
2822
+ border-inline-end: 1px solid var(--h-popover-border-color);
2823
+ border-block-end: 1px solid var(--h-popover-border-color);
2824
+ border-inline-start: 0;
2825
+ border-block-start: 0;
2826
+ }
2827
+
2828
+ /* progress */
2829
+ /*
2830
+ * Progress: `<hx-progress-bar>` (`--h-progressbar-*`) and `<hx-progress-spinner>` (`--h-progressspinner-*`). The bar
2831
+ * fills with the value or slides while indeterminate; the spinner cycles through four colours while it turns. Both
2832
+ * stop moving under `prefers-reduced-motion`.
2833
+ */
2834
+ .hx-progress-bar {
2835
+ position: relative;
2836
+ display: block;
2837
+ overflow: hidden;
2838
+ height: var(--h-progressbar-height);
2839
+ border-radius: var(--h-progressbar-border-radius);
2840
+ background: var(--h-progressbar-background);
2841
+ }
2842
+
2843
+ .hx-progress-bar-value {
2844
+ display: flex;
2845
+ align-items: center;
2846
+ justify-content: center;
2847
+ height: 100%;
2848
+ overflow: hidden;
2849
+ background: var(--h-progressbar-value-background);
2850
+ transition: width 1s ease-in-out;
2851
+ }
2852
+
2853
+ .hx-progress-bar-label {
2854
+ color: var(--h-progressbar-label-color);
2855
+ font-size: var(--h-progressbar-label-font-size);
2856
+ font-weight: var(--h-progressbar-label-font-weight);
2857
+ }
2858
+
2859
+ .hx-progress-bar-indeterminate .hx-progress-bar-value {
2860
+ position: absolute;
2861
+ inset-block: 0;
2862
+ width: 40%;
2863
+ animation: hx-progress-bar-slide 1.5s ease-in-out infinite;
2864
+ transition: none;
2865
+ }
2866
+
2867
+ @keyframes hx-progress-bar-slide {
2868
+ 0% {
2869
+ inset-inline-start: -40%;
2870
+ }
2871
+ 100% {
2872
+ inset-inline-start: 100%;
2873
+ }
2874
+ }
2875
+ .hx-progress-spinner {
2876
+ position: relative;
2877
+ display: inline-block;
2878
+ width: 100px;
2879
+ height: 100px;
2880
+ }
2881
+
2882
+ .hx-progress-spinner-svg {
2883
+ width: 100%;
2884
+ height: 100%;
2885
+ animation: hx-progress-spinner-rotate 2s linear infinite;
2886
+ transform-origin: center center;
2887
+ }
2888
+
2889
+ .hx-progress-spinner-circle {
2890
+ stroke: var(--h-progressspinner-color-one);
2891
+ stroke-dasharray: 89, 200;
2892
+ stroke-dashoffset: 0;
2893
+ stroke-linecap: round;
2894
+ animation: hx-progress-spinner-dash 1.5s ease-in-out infinite, hx-progress-spinner-color 6s ease-in-out infinite;
2895
+ }
2896
+
2897
+ @keyframes hx-progress-spinner-rotate {
2898
+ 100% {
2899
+ transform: rotate(360deg);
2900
+ }
2901
+ }
2902
+ @keyframes hx-progress-spinner-dash {
2903
+ 0% {
2904
+ stroke-dasharray: 1, 200;
2905
+ stroke-dashoffset: 0;
2906
+ }
2907
+ 50% {
2908
+ stroke-dasharray: 89, 200;
2909
+ stroke-dashoffset: -35px;
2910
+ }
2911
+ 100% {
2912
+ stroke-dasharray: 89, 200;
2913
+ stroke-dashoffset: -124px;
2914
+ }
2915
+ }
2916
+ @keyframes hx-progress-spinner-color {
2917
+ 100%, 0% {
2918
+ stroke: var(--h-progressspinner-color-one);
2919
+ }
2920
+ 40% {
2921
+ stroke: var(--h-progressspinner-color-two);
2922
+ }
2923
+ 66% {
2924
+ stroke: var(--h-progressspinner-color-three);
2925
+ }
2926
+ 80%, 90% {
2927
+ stroke: var(--h-progressspinner-color-four);
2928
+ }
2929
+ }
2930
+ @media (prefers-reduced-motion: reduce) {
2931
+ .hx-progress-bar-value {
2932
+ transition: none;
2933
+ }
2934
+ .hx-progress-bar-indeterminate .hx-progress-bar-value {
2935
+ inset-inline-start: 0;
2936
+ width: 100%;
2937
+ animation: none;
2938
+ opacity: 0.6;
2939
+ }
2940
+ .hx-progress-spinner-svg,
2941
+ .hx-progress-spinner-circle {
2942
+ animation: none;
2943
+ }
2944
+ }
2945
+
2946
+ /* radio */
2947
+ /*
2948
+ * RadioButton: `input[hx-radio]` on a native `<input type="radio">`, drawn with CSS, styled
2949
+ * from the `--h-radiobutton-*` tokens.
2950
+ */
2951
+ .hx-radio {
2952
+ display: inline-grid;
2953
+ flex: none;
2954
+ width: var(--h-radiobutton-width);
2955
+ height: var(--h-radiobutton-height);
2956
+ box-sizing: border-box;
2957
+ margin: 0;
2958
+ place-content: center;
2959
+ border: 1px solid var(--h-radiobutton-border-color);
2960
+ border-radius: 50%;
2961
+ appearance: none;
2962
+ background: var(--h-radiobutton-background);
2963
+ box-shadow: var(--h-radiobutton-shadow);
2964
+ cursor: pointer;
2965
+ outline: 0 none;
2966
+ transition: background var(--h-radiobutton-transition-duration), color var(--h-radiobutton-transition-duration), border-color var(--h-radiobutton-transition-duration), box-shadow var(--h-radiobutton-transition-duration);
2967
+ }
2968
+
2969
+ .hx-radio::before {
2970
+ content: "";
2971
+ width: var(--h-radiobutton-icon-size);
2972
+ height: var(--h-radiobutton-icon-size);
2973
+ border-radius: 50%;
2974
+ background: var(--h-radiobutton-icon-checked-color);
2975
+ transform: scale(0);
2976
+ transition: transform var(--h-radiobutton-transition-duration);
2977
+ }
2978
+
2979
+ .hx-radio:checked {
2980
+ border-color: var(--h-radiobutton-checked-border-color);
2981
+ background: var(--h-radiobutton-checked-background);
2982
+ }
2983
+
2984
+ .hx-radio:checked::before {
2985
+ transform: scale(1);
2986
+ }
2987
+
2988
+ .hx-radio:enabled:hover {
2989
+ border-color: var(--h-radiobutton-hover-border-color);
2990
+ }
2991
+
2992
+ .hx-radio:enabled:checked:hover {
2993
+ border-color: var(--h-radiobutton-checked-hover-border-color);
2994
+ background: var(--h-radiobutton-checked-hover-background);
2995
+ }
2996
+
2997
+ .hx-radio:enabled:checked:hover::before {
2998
+ background: var(--h-radiobutton-icon-checked-hover-color);
2999
+ }
3000
+
3001
+ .hx-radio:focus-visible {
3002
+ border-color: var(--h-radiobutton-focus-border-color);
3003
+ outline: var(--h-radiobutton-focus-ring-width) var(--h-radiobutton-focus-ring-style) var(--h-radiobutton-focus-ring-color);
3004
+ outline-offset: var(--h-radiobutton-focus-ring-offset);
3005
+ box-shadow: var(--h-radiobutton-focus-ring-shadow);
3006
+ }
3007
+
3008
+ .hx-radio:focus-visible:checked {
3009
+ border-color: var(--h-radiobutton-checked-focus-border-color);
3010
+ }
3011
+
3012
+ .hx-radio:disabled {
3013
+ background: var(--h-radiobutton-disabled-background);
3014
+ cursor: default;
3015
+ }
3016
+
3017
+ .hx-radio:disabled::before {
3018
+ background: var(--h-radiobutton-icon-disabled-color);
3019
+ }
3020
+
3021
+ .hx-radio:disabled:checked {
3022
+ border-color: var(--h-radiobutton-checked-disabled-border-color);
3023
+ }
3024
+
3025
+ .hx-radio[aria-invalid=true],
3026
+ .hx-radio.ng-invalid.ng-touched {
3027
+ border-color: var(--h-radiobutton-invalid-border-color);
3028
+ }
3029
+
3030
+ .hx-radio-sm {
3031
+ width: var(--h-radiobutton-sm-width);
3032
+ height: var(--h-radiobutton-sm-height);
3033
+ }
3034
+
3035
+ .hx-radio-sm::before {
3036
+ width: var(--h-radiobutton-icon-sm-size);
3037
+ height: var(--h-radiobutton-icon-sm-size);
3038
+ }
3039
+
3040
+ .hx-radio-lg {
3041
+ width: var(--h-radiobutton-lg-width);
3042
+ height: var(--h-radiobutton-lg-height);
3043
+ }
3044
+
3045
+ .hx-radio-lg::before {
3046
+ width: var(--h-radiobutton-icon-lg-size);
3047
+ height: var(--h-radiobutton-icon-lg-size);
3048
+ }
3049
+
3050
+ @media (prefers-reduced-motion: reduce) {
3051
+ .hx-radio,
3052
+ .hx-radio::before {
3053
+ transition: none;
3054
+ }
3055
+ }
3056
+
3057
+ /* select */
3058
+ /*
3059
+ * Select: `<hx-select>`. Styled from the `--h-select-*` tokens. The host draws the
3060
+ * field (border, background, focus ring), the trigger is a button inside it, the panel is a CDK connected
3061
+ * overlay (`.hx-select-overlay` is the CDK pane, `.hx-select-panel` its content). The CDK's own overlay
3062
+ * container CSS is part of styles.css.
3063
+ */
3064
+ .hx-select {
3065
+ position: relative;
3066
+ display: inline-flex;
3067
+ box-sizing: border-box;
3068
+ min-width: 0;
3069
+ border: 1px solid var(--h-select-border-color);
3070
+ border-radius: var(--h-select-border-radius);
3071
+ background: var(--h-select-background);
3072
+ box-shadow: var(--h-select-shadow);
3073
+ outline-color: transparent;
3074
+ user-select: none;
3075
+ transition: background var(--h-select-transition-duration), border-color var(--h-select-transition-duration), outline-color var(--h-select-transition-duration), box-shadow var(--h-select-transition-duration);
3076
+ }
3077
+
3078
+ .hx-select:not(.hx-select-disabled):hover {
3079
+ border-color: var(--h-select-hover-border-color);
3080
+ }
3081
+
3082
+ .hx-select:not(.hx-select-disabled):has(.hx-select-trigger:focus-visible),
3083
+ .hx-select-open {
3084
+ border-color: var(--h-select-focus-border-color);
3085
+ outline: var(--h-select-focus-ring-width) var(--h-select-focus-ring-style) var(--h-select-focus-ring-color);
3086
+ outline-offset: var(--h-select-focus-ring-offset);
3087
+ box-shadow: var(--h-select-focus-ring-shadow);
3088
+ }
3089
+
3090
+ .hx-select-trigger {
3091
+ display: flex;
3092
+ flex: 1 1 auto;
3093
+ align-items: center;
3094
+ gap: 0.5rem;
3095
+ min-width: 0;
3096
+ padding: var(--h-select-padding-y) var(--h-select-padding-x);
3097
+ border: 0;
3098
+ background: transparent;
3099
+ color: var(--h-select-color);
3100
+ font: inherit;
3101
+ font-size: 1rem;
3102
+ text-align: start;
3103
+ cursor: pointer;
3104
+ outline: 0 none;
3105
+ }
3106
+
3107
+ .hx-select-label {
3108
+ flex: 1 1 auto;
3109
+ min-width: 0;
3110
+ overflow: hidden;
3111
+ text-overflow: ellipsis;
3112
+ white-space: nowrap;
3113
+ }
3114
+
3115
+ .hx-select-placeholder {
3116
+ color: var(--h-select-placeholder-color);
3117
+ }
3118
+
3119
+ .hx-select-chevron {
3120
+ display: inline-block;
3121
+ flex: none;
3122
+ width: 1rem;
3123
+ height: 1rem;
3124
+ background: var(--h-select-dropdown-color);
3125
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") center/contain no-repeat;
3126
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") center/contain no-repeat;
3127
+ }
3128
+
3129
+ .hx-select-clear {
3130
+ position: absolute;
3131
+ inset-block: 0;
3132
+ inset-inline-end: var(--h-select-dropdown-width);
3133
+ display: flex;
3134
+ align-items: center;
3135
+ padding: 0 0.25rem;
3136
+ border: 0;
3137
+ background: transparent;
3138
+ color: var(--h-select-clear-icon-color);
3139
+ cursor: pointer;
3140
+ }
3141
+
3142
+ .hx-select-clear-icon {
3143
+ display: inline-block;
3144
+ flex: none;
3145
+ width: 1rem;
3146
+ height: 1rem;
3147
+ background: currentcolor;
3148
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 6l12 12M18 6 6 18'/%3E%3C/svg%3E") center/contain no-repeat;
3149
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 6l12 12M18 6 6 18'/%3E%3C/svg%3E") center/contain no-repeat;
3150
+ }
3151
+
3152
+ .hx-select-has-clear .hx-select-trigger {
3153
+ padding-inline-end: calc(var(--h-select-dropdown-width) - 0.25rem);
3154
+ }
3155
+
3156
+ /* variants, states, sizes */
3157
+ .hx-select-filled {
3158
+ background: var(--h-select-filled-background);
3159
+ }
3160
+
3161
+ .hx-select-filled:not(.hx-select-disabled):hover {
3162
+ background: var(--h-select-filled-hover-background);
3163
+ }
3164
+
3165
+ .hx-select-filled:not(.hx-select-disabled):has(.hx-select-trigger:focus-visible),
3166
+ .hx-select-filled.hx-select-open {
3167
+ background: var(--h-select-filled-focus-background);
3168
+ }
3169
+
3170
+ .hx-select-invalid,
3171
+ .hx-select.ng-invalid.ng-touched {
3172
+ border-color: var(--h-select-invalid-border-color);
3173
+ }
3174
+
3175
+ .hx-select-invalid .hx-select-placeholder,
3176
+ .hx-select.ng-invalid.ng-touched .hx-select-placeholder {
3177
+ color: var(--h-select-invalid-placeholder-color);
3178
+ }
3179
+
3180
+ .hx-select-disabled {
3181
+ background: var(--h-select-disabled-background);
3182
+ }
3183
+
3184
+ .hx-select-disabled .hx-select-trigger {
3185
+ color: var(--h-select-disabled-color);
3186
+ cursor: default;
3187
+ }
3188
+
3189
+ .hx-select-sm .hx-select-trigger {
3190
+ padding: var(--h-select-sm-padding-y) var(--h-select-sm-padding-x);
3191
+ font-size: var(--h-select-sm-font-size);
3192
+ }
3193
+
3194
+ .hx-select-lg .hx-select-trigger {
3195
+ padding: var(--h-select-lg-padding-y) var(--h-select-lg-padding-x);
3196
+ font-size: var(--h-select-lg-font-size);
3197
+ }
3198
+
3199
+ .hx-select-fluid {
3200
+ display: flex;
3201
+ width: 100%;
3202
+ }
3203
+
3204
+ /* the panel */
3205
+ .hx-select-panel {
3206
+ box-sizing: border-box;
3207
+ /* the CDK pane is a flex row: without this the panel is only as wide as its content, not the field */
3208
+ flex: 1 1 auto;
3209
+ min-width: 0;
3210
+ max-height: 16rem;
3211
+ overflow: auto;
3212
+ border: 1px solid var(--h-select-overlay-border-color);
3213
+ border-radius: var(--h-select-overlay-border-radius);
3214
+ background: var(--h-select-overlay-background);
3215
+ color: var(--h-select-overlay-color);
3216
+ box-shadow: var(--h-select-overlay-shadow);
3217
+ font-size: 1rem;
3218
+ }
3219
+
3220
+ .hx-select-list {
3221
+ display: flex;
3222
+ flex-direction: column;
3223
+ gap: var(--h-select-list-gap);
3224
+ padding: var(--h-select-list-padding);
3225
+ outline: 0 none;
3226
+ }
3227
+
3228
+ .hx-select-option {
3229
+ display: flex;
3230
+ align-items: center;
3231
+ gap: var(--h-select-checkmark-gutter-end);
3232
+ padding: var(--h-select-option-padding);
3233
+ border-radius: var(--h-select-option-border-radius);
3234
+ color: var(--h-select-option-color);
3235
+ cursor: pointer;
3236
+ user-select: none;
3237
+ }
3238
+
3239
+ .hx-select-option:hover,
3240
+ .hx-select-option.cdk-option-active {
3241
+ background: var(--h-select-option-focus-background);
3242
+ color: var(--h-select-option-focus-color);
3243
+ }
3244
+
3245
+ .hx-select-option[aria-selected=true] {
3246
+ background: var(--h-select-option-selected-background);
3247
+ color: var(--h-select-option-selected-color);
3248
+ }
3249
+
3250
+ .hx-select-option[aria-selected=true]:hover,
3251
+ .hx-select-option[aria-selected=true].cdk-option-active {
3252
+ background: var(--h-select-option-selected-focus-background);
3253
+ color: var(--h-select-option-selected-focus-color);
3254
+ }
3255
+
3256
+ .hx-select-option[aria-disabled=true] {
3257
+ opacity: 0.5;
3258
+ cursor: default;
3259
+ pointer-events: none;
3260
+ }
3261
+
3262
+ /* the checkmark: a mask in the checkmark colour, shown for the selected option, a gap otherwise */
3263
+ .hx-select-check {
3264
+ flex: none;
3265
+ width: 0.875rem;
3266
+ height: 0.875rem;
3267
+ }
3268
+
3269
+ .hx-select-option[aria-selected=true] .hx-select-check {
3270
+ display: inline-block;
3271
+ flex: none;
3272
+ width: 0.875rem;
3273
+ height: 0.875rem;
3274
+ background: var(--h-select-checkmark-color);
3275
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m5 12.5 4.5 4.5L19 7.5'/%3E%3C/svg%3E") center/contain no-repeat;
3276
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m5 12.5 4.5 4.5L19 7.5'/%3E%3C/svg%3E") center/contain no-repeat;
3277
+ }
3278
+
3279
+ .hx-select-empty {
3280
+ padding: var(--h-select-empty-message-padding);
3281
+ color: var(--h-select-placeholder-color);
3282
+ }
3283
+
3284
+ @media (prefers-reduced-motion: reduce) {
3285
+ .hx-select {
3286
+ transition: none;
3287
+ }
3288
+ }
3289
+ /* the filter field above the list (same look as the multi-select one) */
3290
+ .hx-select-header {
3291
+ display: flex;
3292
+ align-items: center;
3293
+ padding: var(--h-multiselect-list-header-padding);
3294
+ }
3295
+
3296
+ .hx-select-filter {
3297
+ box-sizing: border-box;
3298
+ flex: 1 1 auto;
3299
+ min-width: 0;
3300
+ padding: var(--h-inputtext-padding-y) var(--h-inputtext-padding-x);
3301
+ border: 1px solid var(--h-inputtext-border-color);
3302
+ border-radius: var(--h-inputtext-border-radius);
3303
+ background: var(--h-inputtext-background);
3304
+ color: var(--h-inputtext-color);
3305
+ font: inherit;
3306
+ outline: 0 none;
3307
+ }
3308
+
3309
+ .hx-select-filter:focus {
3310
+ border-color: var(--h-inputtext-focus-border-color);
3311
+ }
3312
+
3313
+ /* the results count, for screen readers only */
3314
+ .hx-select-sr-only {
3315
+ position: absolute;
3316
+ width: 1px;
3317
+ height: 1px;
3318
+ overflow: hidden;
3319
+ clip-path: inset(50%);
3320
+ white-space: nowrap;
3321
+ }
3322
+
3323
+ /* skeleton */
3324
+ /*
3325
+ * Skeleton: `<hx-skeleton>`. A placeholder block from the `--h-skeleton-*` tokens; the wave is a gradient that
3326
+ * sweeps across it and stops under `prefers-reduced-motion`.
3327
+ */
3328
+ .hx-skeleton {
3329
+ position: relative;
3330
+ display: block;
3331
+ overflow: hidden;
3332
+ border-radius: var(--h-skeleton-border-radius);
3333
+ background: var(--h-skeleton-background);
3334
+ }
3335
+
3336
+ .hx-skeleton-circle {
3337
+ border-radius: 50%;
3338
+ }
3339
+
3340
+ .hx-skeleton-wave::after {
3341
+ content: "";
3342
+ position: absolute;
3343
+ inset: 0;
3344
+ transform: translateX(-100%);
3345
+ background: linear-gradient(90deg, transparent, var(--h-skeleton-animation-background), transparent);
3346
+ animation: hx-skeleton-wave 1.2s infinite;
3347
+ }
3348
+
3349
+ @keyframes hx-skeleton-wave {
3350
+ 100% {
3351
+ transform: translateX(100%);
3352
+ }
3353
+ }
3354
+ @media (prefers-reduced-motion: reduce) {
3355
+ .hx-skeleton-wave::after {
3356
+ animation: none;
3357
+ }
3358
+ }
3359
+
3360
+ /* split-button */
3361
+ /*
3362
+ * Split button: `<hx-split-button>`. Two `hx-button`s joined into one control (the buttons are styled by
3363
+ * `button.scss`); this sheet squares the facing corners and applies the `--h-splitbutton-*` radius and shadow. The
3364
+ * menu is `hx-menu` (see `menu.scss`).
3365
+ */
3366
+ .hx-split-button {
3367
+ display: inline-flex;
3368
+ border-radius: var(--h-splitbutton-border-radius);
3369
+ }
3370
+
3371
+ .hx-split-button-main {
3372
+ border-start-end-radius: 0;
3373
+ border-end-end-radius: 0;
3374
+ }
3375
+
3376
+ .hx-split-button-menu {
3377
+ border-start-start-radius: 0;
3378
+ border-end-start-radius: 0;
3379
+ }
3380
+
3381
+ .hx-split-button-rounded {
3382
+ border-radius: var(--h-splitbutton-rounded-border-radius);
3383
+ }
3384
+
3385
+ .hx-split-button-rounded .hx-split-button-main {
3386
+ border-start-start-radius: var(--h-splitbutton-rounded-border-radius);
3387
+ border-end-start-radius: var(--h-splitbutton-rounded-border-radius);
3388
+ }
3389
+
3390
+ .hx-split-button-rounded .hx-split-button-menu {
3391
+ border-start-end-radius: var(--h-splitbutton-rounded-border-radius);
3392
+ border-end-end-radius: var(--h-splitbutton-rounded-border-radius);
3393
+ }
3394
+
3395
+ .hx-split-button-raised {
3396
+ box-shadow: var(--h-splitbutton-raised-shadow);
3397
+ }
3398
+
3399
+ /* an outlined pair shares one border line instead of drawing two */
3400
+ .hx-split-button-outlined .hx-split-button-menu {
3401
+ margin-inline-start: -1px;
3402
+ }
3403
+
3404
+ .hx-split-button-chevron {
3405
+ display: inline-block;
3406
+ flex: none;
3407
+ width: 1rem;
3408
+ height: 1rem;
3409
+ background: currentcolor;
3410
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") center/contain no-repeat;
3411
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") center/contain no-repeat;
3412
+ }
3413
+
3414
+ /* switch */
3415
+ /*
3416
+ * ToggleSwitch: `input[hx-switch]` on a native `<input type="checkbox" role="switch">`, drawn with CSS.
3417
+ * Styled from the `--h-toggleswitch-*` tokens: the track is the input, the
3418
+ * handle its `::before`.
3419
+ */
3420
+ .hx-switch {
3421
+ position: relative;
3422
+ display: inline-block;
3423
+ flex: none;
3424
+ width: var(--h-toggleswitch-width);
3425
+ height: var(--h-toggleswitch-height);
3426
+ box-sizing: border-box;
3427
+ margin: 0;
3428
+ border: var(--h-toggleswitch-border-width) solid var(--h-toggleswitch-border-color);
3429
+ border-radius: var(--h-toggleswitch-border-radius);
3430
+ appearance: none;
3431
+ background: var(--h-toggleswitch-background);
3432
+ box-shadow: var(--h-toggleswitch-shadow);
3433
+ cursor: pointer;
3434
+ outline-color: transparent;
3435
+ transition: background var(--h-toggleswitch-transition-duration), border-color var(--h-toggleswitch-transition-duration), outline-color var(--h-toggleswitch-transition-duration), box-shadow var(--h-toggleswitch-transition-duration);
3436
+ }
3437
+
3438
+ .hx-switch::before {
3439
+ content: "";
3440
+ position: absolute;
3441
+ top: 50%;
3442
+ inset-inline-start: var(--h-toggleswitch-gap);
3443
+ width: var(--h-toggleswitch-handle-size);
3444
+ height: var(--h-toggleswitch-handle-size);
3445
+ margin-block-start: calc(-1 * var(--h-toggleswitch-handle-size) / 2);
3446
+ border-radius: var(--h-toggleswitch-handle-border-radius);
3447
+ background: var(--h-toggleswitch-handle-background);
3448
+ transition: background var(--h-toggleswitch-transition-duration), inset-inline-start var(--h-toggleswitch-slide-duration);
3449
+ }
3450
+
3451
+ .hx-switch:checked {
3452
+ border-color: var(--h-toggleswitch-checked-border-color);
3453
+ background: var(--h-toggleswitch-checked-background);
3454
+ }
3455
+
3456
+ .hx-switch:checked::before {
3457
+ inset-inline-start: calc(var(--h-toggleswitch-width) - var(--h-toggleswitch-handle-size) - var(--h-toggleswitch-gap) - 2 * var(--h-toggleswitch-border-width));
3458
+ background: var(--h-toggleswitch-handle-checked-background);
3459
+ }
3460
+
3461
+ .hx-switch:enabled:hover {
3462
+ border-color: var(--h-toggleswitch-hover-border-color);
3463
+ background: var(--h-toggleswitch-hover-background);
3464
+ }
3465
+
3466
+ .hx-switch:enabled:hover::before {
3467
+ background: var(--h-toggleswitch-handle-hover-background);
3468
+ }
3469
+
3470
+ .hx-switch:enabled:checked:hover {
3471
+ border-color: var(--h-toggleswitch-checked-hover-border-color);
3472
+ background: var(--h-toggleswitch-checked-hover-background);
3473
+ }
3474
+
3475
+ .hx-switch:enabled:checked:hover::before {
3476
+ background: var(--h-toggleswitch-handle-checked-hover-background);
3477
+ }
3478
+
3479
+ .hx-switch:focus-visible {
3480
+ outline: var(--h-toggleswitch-focus-ring-width) var(--h-toggleswitch-focus-ring-style) var(--h-toggleswitch-focus-ring-color);
3481
+ outline-offset: var(--h-toggleswitch-focus-ring-offset);
3482
+ box-shadow: var(--h-toggleswitch-focus-ring-shadow);
3483
+ }
3484
+
3485
+ .hx-switch:disabled {
3486
+ background: var(--h-toggleswitch-disabled-background);
3487
+ cursor: default;
3488
+ }
3489
+
3490
+ .hx-switch:disabled::before {
3491
+ background: var(--h-toggleswitch-handle-disabled-background);
3492
+ }
3493
+
3494
+ .hx-switch[aria-invalid=true],
3495
+ .hx-switch.ng-invalid.ng-touched {
3496
+ border-color: var(--h-toggleswitch-invalid-border-color);
3497
+ }
3498
+
3499
+ @media (prefers-reduced-motion: reduce) {
3500
+ .hx-switch,
3501
+ .hx-switch::before {
3502
+ transition: none;
3503
+ }
3504
+ }
3505
+
3506
+ /* tabs */
3507
+ /*
3508
+ * Tabs: `<hx-tabs>`. A tab list with an active bar and panels from the `--h-tabs-*` tokens; with `scrollable`
3509
+ * the list scrolls and shows buttons at its ends.
3510
+ */
3511
+ .hx-tabs {
3512
+ display: block;
3513
+ }
3514
+
3515
+ .hx-tab-list {
3516
+ position: relative;
3517
+ display: flex;
3518
+ background: var(--h-tabs-tablist-background);
3519
+ border: solid var(--h-tabs-tablist-border-color);
3520
+ border-width: var(--h-tabs-tablist-border-width);
3521
+ }
3522
+
3523
+ .hx-tab-scroller {
3524
+ flex: 1 1 auto;
3525
+ overflow-x: auto;
3526
+ scrollbar-width: none;
3527
+ }
3528
+
3529
+ .hx-tab-scroller::-webkit-scrollbar {
3530
+ display: none;
3531
+ }
3532
+
3533
+ .hx-tab-tabs {
3534
+ display: flex;
3535
+ position: relative;
3536
+ }
3537
+
3538
+ .hx-tab {
3539
+ position: relative;
3540
+ display: inline-flex;
3541
+ flex: none;
3542
+ align-items: center;
3543
+ gap: var(--h-tabs-tab-gap);
3544
+ margin: var(--h-tabs-tab-margin);
3545
+ padding: var(--h-tabs-tab-padding);
3546
+ border: solid var(--h-tabs-tab-border-color);
3547
+ border-width: var(--h-tabs-tab-border-width);
3548
+ background: var(--h-tabs-tab-background);
3549
+ color: var(--h-tabs-tab-color);
3550
+ font-weight: var(--h-tabs-tab-font-weight);
3551
+ white-space: nowrap;
3552
+ cursor: pointer;
3553
+ outline: 0 none;
3554
+ user-select: none;
3555
+ transition: background var(--h-tabs-transition-duration), border-color var(--h-tabs-transition-duration), color var(--h-tabs-transition-duration);
3556
+ }
3557
+
3558
+ .hx-tab:not(.hx-tab-active, .hx-tab-disabled):hover {
3559
+ background: var(--h-tabs-tab-hover-background);
3560
+ border-color: var(--h-tabs-tab-hover-border-color);
3561
+ color: var(--h-tabs-tab-hover-color);
3562
+ }
3563
+
3564
+ .hx-tab-active {
3565
+ background: var(--h-tabs-tab-active-background);
3566
+ border-color: var(--h-tabs-tab-active-border-color);
3567
+ color: var(--h-tabs-tab-active-color);
3568
+ }
3569
+
3570
+ .hx-tab-active::after {
3571
+ content: "";
3572
+ position: absolute;
3573
+ inset-inline: 0;
3574
+ bottom: var(--h-tabs-active-bar-bottom);
3575
+ height: var(--h-tabs-active-bar-height);
3576
+ background: var(--h-tabs-active-bar-background);
3577
+ }
3578
+
3579
+ .hx-tab:focus-visible {
3580
+ outline: var(--h-tabs-tab-focus-ring-width) var(--h-tabs-tab-focus-ring-style) var(--h-tabs-tab-focus-ring-color);
3581
+ outline-offset: var(--h-tabs-tab-focus-ring-offset);
3582
+ box-shadow: var(--h-tabs-tab-focus-ring-shadow);
3583
+ }
3584
+
3585
+ .hx-tab-disabled {
3586
+ opacity: 0.5;
3587
+ cursor: default;
3588
+ }
3589
+
3590
+ .hx-tab-nav {
3591
+ position: absolute;
3592
+ top: 0;
3593
+ bottom: 0;
3594
+ z-index: 2;
3595
+ display: inline-flex;
3596
+ align-items: center;
3597
+ justify-content: center;
3598
+ width: var(--h-tabs-nav-button-width);
3599
+ padding: 0;
3600
+ border: 0;
3601
+ background: var(--h-tabs-nav-button-background);
3602
+ color: var(--h-tabs-nav-button-color);
3603
+ box-shadow: var(--h-tabs-nav-button-shadow);
3604
+ cursor: pointer;
3605
+ outline: 0 none;
3606
+ }
3607
+
3608
+ .hx-tab-nav:hover {
3609
+ color: var(--h-tabs-nav-button-hover-color);
3610
+ }
3611
+
3612
+ .hx-tab-nav:focus-visible {
3613
+ outline: var(--h-tabs-nav-button-focus-ring-width) var(--h-tabs-nav-button-focus-ring-style) var(--h-tabs-nav-button-focus-ring-color);
3614
+ outline-offset: var(--h-tabs-nav-button-focus-ring-offset);
3615
+ box-shadow: var(--h-tabs-nav-button-focus-ring-shadow);
3616
+ }
3617
+
3618
+ .hx-tab-nav-prev {
3619
+ inset-inline-start: 0;
3620
+ }
3621
+
3622
+ .hx-tab-nav-next {
3623
+ inset-inline-end: 0;
3624
+ }
3625
+
3626
+ .hx-tab-nav-icon-prev {
3627
+ display: inline-block;
3628
+ flex: none;
3629
+ width: 1rem;
3630
+ height: 1rem;
3631
+ background: currentcolor;
3632
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m15 6-6 6 6 6'/%3E%3C/svg%3E") center/contain no-repeat;
3633
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m15 6-6 6 6 6'/%3E%3C/svg%3E") center/contain no-repeat;
3634
+ }
3635
+
3636
+ .hx-tab-nav-icon-next {
3637
+ display: inline-block;
3638
+ flex: none;
3639
+ width: 1rem;
3640
+ height: 1rem;
3641
+ background: currentcolor;
3642
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m9 6 6 6-6 6'/%3E%3C/svg%3E") center/contain no-repeat;
3643
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m9 6 6 6-6 6'/%3E%3C/svg%3E") center/contain no-repeat;
3644
+ }
3645
+
3646
+ .hx-tab-list-scrollable .hx-tab-scroller {
3647
+ scroll-behavior: smooth;
3648
+ }
3649
+
3650
+ .hx-tab-panel {
3651
+ display: block;
3652
+ padding: var(--h-tabs-tabpanel-padding);
3653
+ background: var(--h-tabs-tabpanel-background);
3654
+ color: var(--h-tabs-tabpanel-color);
3655
+ outline: 0 none;
3656
+ }
3657
+
3658
+ .hx-tab-panel[hidden] {
3659
+ display: none;
3660
+ }
3661
+
3662
+ .hx-tab-panel:focus-visible {
3663
+ outline: var(--h-tabs-tabpanel-focus-ring-width) var(--h-tabs-tabpanel-focus-ring-style) var(--h-tabs-tabpanel-focus-ring-color);
3664
+ outline-offset: var(--h-tabs-tabpanel-focus-ring-offset);
3665
+ box-shadow: var(--h-tabs-tabpanel-focus-ring-shadow);
3666
+ }
3667
+
3668
+ @media (prefers-reduced-motion: reduce) {
3669
+ .hx-tab {
3670
+ transition: none;
3671
+ }
3672
+ .hx-tab-list-scrollable .hx-tab-scroller {
3673
+ scroll-behavior: auto;
3674
+ }
3675
+ }
3676
+ .hx-tab-panels {
3677
+ display: block;
3678
+ }
3679
+
3680
+ /* tag */
3681
+ /*
3682
+ * Tag: `<hx-tag>`. A small label from the `--h-tag-*` tokens whose colours follow the severity.
3683
+ */
3684
+ .hx-tag {
3685
+ --hx-tag-background: var(--h-tag-primary-background);
3686
+ --hx-tag-color: var(--h-tag-primary-color);
3687
+ display: inline-flex;
3688
+ align-items: center;
3689
+ justify-content: center;
3690
+ gap: var(--h-tag-gap);
3691
+ padding: var(--h-tag-padding);
3692
+ border-radius: var(--h-tag-border-radius);
3693
+ background: var(--hx-tag-background);
3694
+ color: var(--hx-tag-color);
3695
+ font-size: var(--h-tag-font-size);
3696
+ font-weight: var(--h-tag-font-weight);
3697
+ line-height: 1.25;
3698
+ }
3699
+
3700
+ .hx-tag-secondary {
3701
+ --hx-tag-background: var(--h-tag-secondary-background);
3702
+ --hx-tag-color: var(--h-tag-secondary-color);
3703
+ }
3704
+
3705
+ .hx-tag-success {
3706
+ --hx-tag-background: var(--h-tag-success-background);
3707
+ --hx-tag-color: var(--h-tag-success-color);
3708
+ }
3709
+
3710
+ .hx-tag-info {
3711
+ --hx-tag-background: var(--h-tag-info-background);
3712
+ --hx-tag-color: var(--h-tag-info-color);
3713
+ }
3714
+
3715
+ .hx-tag-warn {
3716
+ --hx-tag-background: var(--h-tag-warn-background);
3717
+ --hx-tag-color: var(--h-tag-warn-color);
3718
+ }
3719
+
3720
+ .hx-tag-danger {
3721
+ --hx-tag-background: var(--h-tag-danger-background);
3722
+ --hx-tag-color: var(--h-tag-danger-color);
3723
+ }
3724
+
3725
+ .hx-tag-contrast {
3726
+ --hx-tag-background: var(--h-tag-contrast-background);
3727
+ --hx-tag-color: var(--h-tag-contrast-color);
3728
+ }
3729
+
3730
+ .hx-tag-rounded {
3731
+ border-radius: var(--h-tag-rounded-border-radius);
3732
+ }
3733
+
3734
+ .hx-tag-icon {
3735
+ flex: none;
3736
+ font-size: var(--h-tag-icon-size);
3737
+ }
3738
+
3739
+ /* toast */
3740
+ /*
3741
+ * Toast: `<hx-toast>`. A fixed stack of messages from the `--h-toast-*` tokens; the severity picks the colours.
3742
+ * The container takes no pointer events, only the messages do.
3743
+ */
3744
+ .hx-toast {
3745
+ position: fixed;
3746
+ z-index: 1100;
3747
+ display: flex;
3748
+ flex-direction: column;
3749
+ gap: 0.75rem;
3750
+ width: var(--h-toast-width);
3751
+ max-width: calc(100vw - 2rem);
3752
+ pointer-events: none;
3753
+ }
3754
+
3755
+ .hx-toast-top-left {
3756
+ top: 1.25rem;
3757
+ inset-inline-start: 1.25rem;
3758
+ }
3759
+
3760
+ .hx-toast-top-center {
3761
+ top: 1.25rem;
3762
+ left: 50%;
3763
+ transform: translateX(-50%);
3764
+ }
3765
+
3766
+ .hx-toast-top-right {
3767
+ top: 1.25rem;
3768
+ inset-inline-end: 1.25rem;
3769
+ }
3770
+
3771
+ .hx-toast-center {
3772
+ top: 50%;
3773
+ left: 50%;
3774
+ transform: translate(-50%, -50%);
3775
+ }
3776
+
3777
+ .hx-toast-bottom-left {
3778
+ bottom: 1.25rem;
3779
+ inset-inline-start: 1.25rem;
3780
+ flex-direction: column-reverse;
3781
+ }
3782
+
3783
+ .hx-toast-bottom-center {
3784
+ bottom: 1.25rem;
3785
+ left: 50%;
3786
+ transform: translateX(-50%);
3787
+ flex-direction: column-reverse;
3788
+ }
3789
+
3790
+ .hx-toast-bottom-right {
3791
+ bottom: 1.25rem;
3792
+ inset-inline-end: 1.25rem;
3793
+ flex-direction: column-reverse;
3794
+ }
3795
+
3796
+ .hx-toast-item {
3797
+ display: block;
3798
+ box-sizing: border-box;
3799
+ border: var(--h-toast-border-width) solid var(--hx-toast-border-color);
3800
+ border-radius: var(--h-toast-border-radius);
3801
+ background: var(--hx-toast-background);
3802
+ color: var(--hx-toast-color);
3803
+ box-shadow: var(--hx-toast-shadow);
3804
+ backdrop-filter: blur(var(--h-toast-blur));
3805
+ pointer-events: auto;
3806
+ animation: hx-toast-in var(--h-toast-transition-duration) ease-out;
3807
+ }
3808
+
3809
+ @keyframes hx-toast-in {
3810
+ from {
3811
+ opacity: 0;
3812
+ transform: translateY(-0.5rem);
3813
+ }
3814
+ }
3815
+ .hx-toast-info {
3816
+ --hx-toast-background: var(--h-toast-info-background);
3817
+ --hx-toast-border-color: var(--h-toast-info-border-color);
3818
+ --hx-toast-color: var(--h-toast-info-color);
3819
+ --hx-toast-detail-color: var(--h-toast-info-detail-color);
3820
+ --hx-toast-shadow: var(--h-toast-info-shadow);
3821
+ --hx-toast-hover: var(--h-toast-info-close-button-hover-background);
3822
+ --hx-toast-ring: var(--h-toast-info-close-button-focus-ring-color);
3823
+ --hx-toast-ring-shadow: var(--h-toast-info-close-button-focus-ring-shadow);
3824
+ }
3825
+
3826
+ .hx-toast-success {
3827
+ --hx-toast-background: var(--h-toast-success-background);
3828
+ --hx-toast-border-color: var(--h-toast-success-border-color);
3829
+ --hx-toast-color: var(--h-toast-success-color);
3830
+ --hx-toast-detail-color: var(--h-toast-success-detail-color);
3831
+ --hx-toast-shadow: var(--h-toast-success-shadow);
3832
+ --hx-toast-hover: var(--h-toast-success-close-button-hover-background);
3833
+ --hx-toast-ring: var(--h-toast-success-close-button-focus-ring-color);
3834
+ --hx-toast-ring-shadow: var(--h-toast-success-close-button-focus-ring-shadow);
3835
+ }
3836
+
3837
+ .hx-toast-warn {
3838
+ --hx-toast-background: var(--h-toast-warn-background);
3839
+ --hx-toast-border-color: var(--h-toast-warn-border-color);
3840
+ --hx-toast-color: var(--h-toast-warn-color);
3841
+ --hx-toast-detail-color: var(--h-toast-warn-detail-color);
3842
+ --hx-toast-shadow: var(--h-toast-warn-shadow);
3843
+ --hx-toast-hover: var(--h-toast-warn-close-button-hover-background);
3844
+ --hx-toast-ring: var(--h-toast-warn-close-button-focus-ring-color);
3845
+ --hx-toast-ring-shadow: var(--h-toast-warn-close-button-focus-ring-shadow);
3846
+ }
3847
+
3848
+ .hx-toast-error {
3849
+ --hx-toast-background: var(--h-toast-error-background);
3850
+ --hx-toast-border-color: var(--h-toast-error-border-color);
3851
+ --hx-toast-color: var(--h-toast-error-color);
3852
+ --hx-toast-detail-color: var(--h-toast-error-detail-color);
3853
+ --hx-toast-shadow: var(--h-toast-error-shadow);
3854
+ --hx-toast-hover: var(--h-toast-error-close-button-hover-background);
3855
+ --hx-toast-ring: var(--h-toast-error-close-button-focus-ring-color);
3856
+ --hx-toast-ring-shadow: var(--h-toast-error-close-button-focus-ring-shadow);
3857
+ }
3858
+
3859
+ .hx-toast-secondary {
3860
+ --hx-toast-background: var(--h-toast-secondary-background);
3861
+ --hx-toast-border-color: var(--h-toast-secondary-border-color);
3862
+ --hx-toast-color: var(--h-toast-secondary-color);
3863
+ --hx-toast-detail-color: var(--h-toast-secondary-detail-color);
3864
+ --hx-toast-shadow: var(--h-toast-secondary-shadow);
3865
+ --hx-toast-hover: var(--h-toast-secondary-close-button-hover-background);
3866
+ --hx-toast-ring: var(--h-toast-secondary-close-button-focus-ring-color);
3867
+ --hx-toast-ring-shadow: var(--h-toast-secondary-close-button-focus-ring-shadow);
3868
+ }
3869
+
3870
+ .hx-toast-contrast {
3871
+ --hx-toast-background: var(--h-toast-contrast-background);
3872
+ --hx-toast-border-color: var(--h-toast-contrast-border-color);
3873
+ --hx-toast-color: var(--h-toast-contrast-color);
3874
+ --hx-toast-detail-color: var(--h-toast-contrast-detail-color);
3875
+ --hx-toast-shadow: var(--h-toast-contrast-shadow);
3876
+ --hx-toast-hover: var(--h-toast-contrast-close-button-hover-background);
3877
+ --hx-toast-ring: var(--h-toast-contrast-close-button-focus-ring-color);
3878
+ --hx-toast-ring-shadow: var(--h-toast-contrast-close-button-focus-ring-shadow);
3879
+ }
3880
+
3881
+ .hx-toast-info .hx-toast-icon {
3882
+ display: inline-block;
3883
+ flex: none;
3884
+ width: var(--h-toast-icon-size);
3885
+ height: var(--h-toast-icon-size);
3886
+ background: currentcolor;
3887
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.5 12a8.5 8.5 0 1 1-17 0 8.5 8.5 0 0 1 17 0ZM12 11v5M12 8v.01'/%3E%3C/svg%3E") center/contain no-repeat;
3888
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.5 12a8.5 8.5 0 1 1-17 0 8.5 8.5 0 0 1 17 0ZM12 11v5M12 8v.01'/%3E%3C/svg%3E") center/contain no-repeat;
3889
+ }
3890
+
3891
+ .hx-toast-success .hx-toast-icon {
3892
+ display: inline-block;
3893
+ flex: none;
3894
+ width: var(--h-toast-icon-size);
3895
+ height: var(--h-toast-icon-size);
3896
+ background: currentcolor;
3897
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.5 12a8.5 8.5 0 1 1-17 0 8.5 8.5 0 0 1 17 0ZM8 12.2l2.8 2.8L16 9.5'/%3E%3C/svg%3E") center/contain no-repeat;
3898
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.5 12a8.5 8.5 0 1 1-17 0 8.5 8.5 0 0 1 17 0ZM8 12.2l2.8 2.8L16 9.5'/%3E%3C/svg%3E") center/contain no-repeat;
3899
+ }
3900
+
3901
+ .hx-toast-warn .hx-toast-icon {
3902
+ display: inline-block;
3903
+ flex: none;
3904
+ width: var(--h-toast-icon-size);
3905
+ height: var(--h-toast-icon-size);
3906
+ background: currentcolor;
3907
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 4 21 19.5H3L12 4ZM12 10v4.5M12 17.2v.01'/%3E%3C/svg%3E") center/contain no-repeat;
3908
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 4 21 19.5H3L12 4ZM12 10v4.5M12 17.2v.01'/%3E%3C/svg%3E") center/contain no-repeat;
3909
+ }
3910
+
3911
+ .hx-toast-error .hx-toast-icon {
3912
+ display: inline-block;
3913
+ flex: none;
3914
+ width: var(--h-toast-icon-size);
3915
+ height: var(--h-toast-icon-size);
3916
+ background: currentcolor;
3917
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.5 12a8.5 8.5 0 1 1-17 0 8.5 8.5 0 0 1 17 0ZM9 9l6 6M15 9l-6 6'/%3E%3C/svg%3E") center/contain no-repeat;
3918
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.5 12a8.5 8.5 0 1 1-17 0 8.5 8.5 0 0 1 17 0ZM9 9l6 6M15 9l-6 6'/%3E%3C/svg%3E") center/contain no-repeat;
3919
+ }
3920
+
3921
+ .hx-toast-secondary .hx-toast-icon {
3922
+ display: inline-block;
3923
+ flex: none;
3924
+ width: var(--h-toast-icon-size);
3925
+ height: var(--h-toast-icon-size);
3926
+ background: currentcolor;
3927
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.5 12a8.5 8.5 0 1 1-17 0 8.5 8.5 0 0 1 17 0ZM12 11v5M12 8v.01'/%3E%3C/svg%3E") center/contain no-repeat;
3928
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.5 12a8.5 8.5 0 1 1-17 0 8.5 8.5 0 0 1 17 0ZM12 11v5M12 8v.01'/%3E%3C/svg%3E") center/contain no-repeat;
3929
+ }
3930
+
3931
+ .hx-toast-contrast .hx-toast-icon {
3932
+ display: inline-block;
3933
+ flex: none;
3934
+ width: var(--h-toast-icon-size);
3935
+ height: var(--h-toast-icon-size);
3936
+ background: currentcolor;
3937
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.5 12a8.5 8.5 0 1 1-17 0 8.5 8.5 0 0 1 17 0ZM12 11v5M12 8v.01'/%3E%3C/svg%3E") center/contain no-repeat;
3938
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.5 12a8.5 8.5 0 1 1-17 0 8.5 8.5 0 0 1 17 0ZM12 11v5M12 8v.01'/%3E%3C/svg%3E") center/contain no-repeat;
3939
+ }
3940
+
3941
+ .hx-toast-content {
3942
+ display: flex;
3943
+ align-items: flex-start;
3944
+ gap: var(--h-toast-content-gap);
3945
+ padding: var(--h-toast-content-padding);
3946
+ }
3947
+
3948
+ .hx-toast-icon {
3949
+ margin-top: 0.125rem;
3950
+ }
3951
+
3952
+ .hx-toast-text {
3953
+ display: flex;
3954
+ flex: 1 1 auto;
3955
+ flex-direction: column;
3956
+ gap: var(--h-toast-text-gap);
3957
+ min-width: 0;
3958
+ }
3959
+
3960
+ .hx-toast-summary {
3961
+ font-size: var(--h-toast-summary-font-size);
3962
+ font-weight: var(--h-toast-summary-font-weight);
3963
+ }
3964
+
3965
+ .hx-toast-detail {
3966
+ color: var(--hx-toast-detail-color);
3967
+ font-size: var(--h-toast-detail-font-size);
3968
+ font-weight: var(--h-toast-detail-font-weight);
3969
+ }
3970
+
3971
+ .hx-toast-close {
3972
+ display: inline-flex;
3973
+ flex: none;
3974
+ align-items: center;
3975
+ justify-content: center;
3976
+ width: var(--h-toast-close-button-width);
3977
+ height: var(--h-toast-close-button-height);
3978
+ padding: 0;
3979
+ border: 0;
3980
+ border-radius: var(--h-toast-close-button-border-radius);
3981
+ background: transparent;
3982
+ color: inherit;
3983
+ cursor: pointer;
3984
+ outline: 0 none;
3985
+ transition: background var(--h-toast-transition-duration);
3986
+ }
3987
+
3988
+ .hx-toast-close:hover {
3989
+ background: var(--hx-toast-hover);
3990
+ }
3991
+
3992
+ .hx-toast-close:focus-visible {
3993
+ outline: var(--h-toast-close-button-focus-ring-width) var(--h-toast-close-button-focus-ring-style) var(--hx-toast-ring);
3994
+ outline-offset: var(--h-toast-close-button-focus-ring-offset);
3995
+ box-shadow: var(--hx-toast-ring-shadow);
3996
+ }
3997
+
3998
+ .hx-toast-close-icon {
3999
+ display: inline-block;
4000
+ flex: none;
4001
+ width: var(--h-toast-close-icon-size);
4002
+ height: var(--h-toast-close-icon-size);
4003
+ background: currentcolor;
4004
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 6l12 12M18 6 6 18'/%3E%3C/svg%3E") center/contain no-repeat;
4005
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 6l12 12M18 6 6 18'/%3E%3C/svg%3E") center/contain no-repeat;
4006
+ }
4007
+
4008
+ @media (prefers-reduced-motion: reduce) {
4009
+ .hx-toast-item {
4010
+ animation: none;
4011
+ }
4012
+ .hx-toast-close {
4013
+ transition: none;
4014
+ }
4015
+ }
4016
+
4017
+ /* toolbar */
4018
+ /*
4019
+ * Toolbar: `<hx-toolbar>`. A flex bar from the `--h-toolbar-*` tokens with a start, a center and an end area; it
4020
+ * wraps when the controls do not fit.
4021
+ */
4022
+ .hx-toolbar {
4023
+ display: flex;
4024
+ flex-wrap: wrap;
4025
+ align-items: center;
4026
+ justify-content: space-between;
4027
+ gap: var(--h-toolbar-gap);
4028
+ box-sizing: border-box;
4029
+ padding: var(--h-toolbar-padding);
4030
+ border: 1px solid var(--h-toolbar-border-color);
4031
+ border-radius: var(--h-toolbar-border-radius);
4032
+ background: var(--h-toolbar-background);
4033
+ color: var(--h-toolbar-color);
4034
+ }
4035
+
4036
+ .hx-toolbar-start,
4037
+ .hx-toolbar-center,
4038
+ .hx-toolbar-end {
4039
+ display: flex;
4040
+ flex-wrap: wrap;
4041
+ align-items: center;
4042
+ gap: var(--h-toolbar-gap);
4043
+ }
4044
+
4045
+ .hx-toolbar-center {
4046
+ flex: 1 1 auto;
4047
+ justify-content: center;
4048
+ }
4049
+
4050
+ .hx-toolbar-end {
4051
+ margin-inline-start: auto;
4052
+ }
4053
+
4054
+ .hx-toolbar-start:empty,
4055
+ .hx-toolbar-center:empty,
4056
+ .hx-toolbar-end:empty {
4057
+ display: none;
4058
+ }
4059
+
4060
+ /* tooltip */
4061
+ /*
4062
+ * Tooltip: `[hx-tooltip]`. The bubble is a CDK overlay (`.hx-tooltip-overlay` is the pane), coloured by the
4063
+ * `--h-tooltip-*` tokens. It never takes pointer events, so it cannot flicker under the cursor.
4064
+ */
4065
+ .hx-tooltip-overlay {
4066
+ pointer-events: none;
4067
+ }
4068
+
4069
+ .hx-tooltip {
4070
+ display: block;
4071
+ box-sizing: border-box;
4072
+ max-width: var(--h-tooltip-max-width);
4073
+ padding: var(--h-tooltip-padding);
4074
+ border-radius: var(--h-tooltip-border-radius);
4075
+ background: var(--h-tooltip-background);
4076
+ color: var(--h-tooltip-color);
4077
+ box-shadow: var(--h-tooltip-shadow);
4078
+ font-size: 0.875rem;
4079
+ line-height: 1.4;
4080
+ overflow-wrap: anywhere;
4081
+ }
4082
+ }