@jungherz-de/glasskit 1.34.0 → 1.35.1
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/CHANGELOG.md +79 -0
- package/README.md +21 -8
- package/SKILL.md +17 -5
- package/glasskit-styles.js +3 -3
- package/glasskit.css +196 -34
- package/glasskit.min.css +2 -2
- package/glasskit.min.css.map +1 -1
- package/package.json +1 -1
- package/theme-override.css +29 -0
package/glasskit.css
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* ============================================================
|
|
2
2
|
GLASSKIT COMPONENT LIBRARY
|
|
3
|
-
Jungherz GmbH – v1.
|
|
3
|
+
Jungherz GmbH – v1.35.1
|
|
4
4
|
|
|
5
5
|
Features:
|
|
6
6
|
- Scoped Reset (box-sizing fix)
|
|
@@ -133,6 +133,21 @@
|
|
|
133
133
|
--gl-card-glow-mid: rgba(255, 255, 255, 0.22);
|
|
134
134
|
--gl-card-glow-low: rgba(255, 255, 255, 0.14);
|
|
135
135
|
--gl-card-glow-bottom: rgba(255, 255, 255, 0.08);
|
|
136
|
+
/* Dark glass of a modal or a sheet is brighter than the page (since
|
|
137
|
+
1.35.0): its glow starts at the middle one, a segmented control on it
|
|
138
|
+
lies in a well with its chosen option one step darker, a tertiary
|
|
139
|
+
button too is one step darker, and a chosen badge says its label in
|
|
140
|
+
the text colour. Unset in light mode. */
|
|
141
|
+
--gl-dialog-glow-top: var(--gl-card-glow-mid);
|
|
142
|
+
--gl-dialog-well: rgba(0, 0, 0, 0.10);
|
|
143
|
+
--gl-dialog-raised: var(--gl-surface-3);
|
|
144
|
+
--gl-dialog-control: var(--gl-surface-1);
|
|
145
|
+
--gl-badge-selected-color: var(--gl-color-text);
|
|
146
|
+
/* The accent as text on the glass of a card, a modal or a sheet (since
|
|
147
|
+
1.35.0): the primary text lightened by 40 % white. A card is brighter
|
|
148
|
+
than the page, and the primary as a link, a range value or an accent
|
|
149
|
+
row fell to 4.2:1 on it. Light mode keeps the primary text. */
|
|
150
|
+
--gl-color-primary-on-glass: color-mix(in srgb, var(--gl-color-primary-text) 60%, #ffffff);
|
|
136
151
|
|
|
137
152
|
/* Card Text & Icons */
|
|
138
153
|
--gl-card-icon-color: rgba(255, 255, 255, 0.8);
|
|
@@ -359,6 +374,12 @@
|
|
|
359
374
|
--gl-card-glow-mid: rgba(255, 255, 255, 0.78);
|
|
360
375
|
--gl-card-glow-low: rgba(255, 255, 255, 0.65);
|
|
361
376
|
--gl-card-glow-bottom: rgba(255, 255, 255, 0.50);
|
|
377
|
+
--gl-dialog-glow-top: initial;
|
|
378
|
+
--gl-dialog-well: initial;
|
|
379
|
+
--gl-dialog-raised: initial;
|
|
380
|
+
--gl-dialog-control: initial;
|
|
381
|
+
--gl-badge-selected-color: initial;
|
|
382
|
+
--gl-color-primary-on-glass: var(--gl-color-primary-text);
|
|
362
383
|
|
|
363
384
|
--gl-card-icon-color: rgba(26, 42, 54, 0.65);
|
|
364
385
|
--gl-card-text-color: rgba(26, 42, 54, 0.68);
|
|
@@ -723,6 +744,8 @@
|
|
|
723
744
|
box-shadow: var(--gl-shadow-card), var(--gl-inset-strong);
|
|
724
745
|
/* A .glass-list--flush inside reaches the card's edges (since 1.29.1). */
|
|
725
746
|
--gl-list-flush-inset: var(--gl-space-xl);
|
|
747
|
+
/* Accent text on it takes --gl-color-primary-on-glass (since 1.35.0). */
|
|
748
|
+
--gl-ctx-primary-text: var(--gl-color-primary-on-glass);
|
|
726
749
|
}
|
|
727
750
|
|
|
728
751
|
.glass-card--glow {
|
|
@@ -837,10 +860,13 @@ a.glass-btn { display: inline-flex; text-decoration: none; }
|
|
|
837
860
|
.glass-btn--secondary:active { transform: translateY(1px); }
|
|
838
861
|
|
|
839
862
|
/* Tertiary */
|
|
863
|
+
/* On the glass of a modal or a sheet (since 1.35.0) one step darker in dark
|
|
864
|
+
mode, --gl-dialog-control, and without a blur of its own: its muted
|
|
865
|
+
label read 3 to 4:1 there. */
|
|
840
866
|
.glass-btn--tertiary {
|
|
841
|
-
background: var(--gl-surface-2);
|
|
842
|
-
backdrop-filter: blur(var(--gl-blur-light));
|
|
843
|
-
-webkit-backdrop-filter: blur(var(--gl-blur-light));
|
|
867
|
+
background: var(--gl-ctx-btn-tertiary-bg, var(--gl-surface-2));
|
|
868
|
+
backdrop-filter: var(--gl-ctx-control-backdrop, blur(var(--gl-blur-light)));
|
|
869
|
+
-webkit-backdrop-filter: var(--gl-ctx-control-backdrop, blur(var(--gl-blur-light)));
|
|
844
870
|
border: 1px solid var(--gl-border-subtle);
|
|
845
871
|
color: var(--gl-color-text-muted);
|
|
846
872
|
box-shadow: 0 4px 12px rgba(0,0,0,0.10), var(--gl-inset-subtle);
|
|
@@ -868,7 +894,7 @@ a.glass-btn { display: inline-flex; text-decoration: none; }
|
|
|
868
894
|
.glass-btn[aria-disabled="true"]:is(:hover, :active) { transform: none; }
|
|
869
895
|
.glass-btn--tertiary:disabled:hover,
|
|
870
896
|
.glass-btn--tertiary[aria-disabled="true"]:hover {
|
|
871
|
-
background: var(--gl-surface-2); color: var(--gl-color-text-muted);
|
|
897
|
+
background: var(--gl-ctx-btn-tertiary-bg, var(--gl-surface-2)); color: var(--gl-color-text-muted);
|
|
872
898
|
}
|
|
873
899
|
|
|
874
900
|
/* Sizes */
|
|
@@ -903,7 +929,7 @@ a.glass-btn { display: inline-flex; text-decoration: none; }
|
|
|
903
929
|
}
|
|
904
930
|
|
|
905
931
|
.glass-status p {
|
|
906
|
-
color: var(--gl-color-text-muted);
|
|
932
|
+
color: var(--gl-status-color, var(--gl-color-text-muted));
|
|
907
933
|
font-size: var(--gl-font-size-sm);
|
|
908
934
|
font-weight: var(--gl-font-weight-normal);
|
|
909
935
|
line-height: 1.45;
|
|
@@ -1391,7 +1417,7 @@ a.glass-btn { display: inline-flex; text-decoration: none; }
|
|
|
1391
1417
|
.glass-range-value {
|
|
1392
1418
|
font-size: var(--gl-font-size-sm);
|
|
1393
1419
|
font-weight: var(--gl-font-weight-semibold);
|
|
1394
|
-
color: var(--gl-color-primary-text);
|
|
1420
|
+
color: var(--gl-ctx-primary-text, var(--gl-color-primary-text));
|
|
1395
1421
|
font-variant-numeric: tabular-nums;
|
|
1396
1422
|
}
|
|
1397
1423
|
|
|
@@ -1546,9 +1572,11 @@ dialog.glass-modal-overlay::backdrop { background: transparent; }
|
|
|
1546
1572
|
|
|
1547
1573
|
.glass-modal {
|
|
1548
1574
|
width: 100%; max-width: var(--gl-modal-max-width, 340px);
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1575
|
+
/* --gl-modal-bg replaces the surface (since 1.35.0); in dark mode the
|
|
1576
|
+
glow starts at --gl-dialog-glow-top, the card's middle one. */
|
|
1577
|
+
background: var(--gl-modal-bg, linear-gradient(to bottom,
|
|
1578
|
+
var(--gl-dialog-glow-top, var(--gl-card-glow-top)) 0%, var(--gl-card-glow-bottom) 100%
|
|
1579
|
+
));
|
|
1552
1580
|
backdrop-filter: blur(var(--gl-blur-heavy));
|
|
1553
1581
|
-webkit-backdrop-filter: blur(var(--gl-blur-heavy));
|
|
1554
1582
|
border: 1.5px solid var(--gl-border-medium);
|
|
@@ -1586,7 +1614,7 @@ dialog.glass-modal-overlay::backdrop { background: transparent; }
|
|
|
1586
1614
|
.glass-modal__action:disabled { opacity: 0.45; cursor: not-allowed; }
|
|
1587
1615
|
.glass-modal__action:disabled:hover { background: transparent; }
|
|
1588
1616
|
.glass-modal__action + .glass-modal__action { border-inline-start: 1px solid var(--gl-border-subtle); }
|
|
1589
|
-
.glass-modal__action--primary { color: var(--gl-color-primary-text); font-weight: var(--gl-font-weight-semibold); }
|
|
1617
|
+
.glass-modal__action--primary { color: var(--gl-ctx-primary-text, var(--gl-color-primary-text)); font-weight: var(--gl-font-weight-semibold); }
|
|
1590
1618
|
.glass-modal__action--danger { color: var(--gl-color-error); font-weight: var(--gl-font-weight-semibold); }
|
|
1591
1619
|
|
|
1592
1620
|
|
|
@@ -2078,7 +2106,7 @@ dialog.glass-modal-overlay::backdrop { background: transparent; }
|
|
|
2078
2106
|
.glass-segmented.glass-segmented--droplet[data-droplet]::before {
|
|
2079
2107
|
background:
|
|
2080
2108
|
var(--gl-gloss-droplet, none),
|
|
2081
|
-
var(--gl-segmented-active-bg, linear-gradient(to bottom, var(--gl-surface-5) 0%, var(--gl-surface-3) 100%));
|
|
2109
|
+
var(--gl-segmented-active-bg, var(--gl-ctx-segmented-active-bg, linear-gradient(to bottom, var(--gl-surface-5) 0%, var(--gl-surface-3) 100%)));
|
|
2082
2110
|
box-shadow:
|
|
2083
2111
|
var(--gl-segmented-active-shadow, 0 4px 14px rgba(0,0,0,0.18), 0 1px 3px rgba(0,0,0,0.12)),
|
|
2084
2112
|
inset 0 0 0 1px var(--gl-border-subtle),
|
|
@@ -2488,7 +2516,7 @@ a.glass-tab-bar__item { text-decoration: none; color: inherit; }
|
|
|
2488
2516
|
-webkit-tap-highlight-color: transparent;
|
|
2489
2517
|
}
|
|
2490
2518
|
|
|
2491
|
-
.glass-accordion__trigger:hover { color: var(--gl-color-primary-text); }
|
|
2519
|
+
.glass-accordion__trigger:hover { color: var(--gl-ctx-primary-text, var(--gl-color-primary-text)); }
|
|
2492
2520
|
|
|
2493
2521
|
.glass-accordion__trigger-icon { display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
|
|
2494
2522
|
|
|
@@ -2543,8 +2571,11 @@ a.glass-tab-bar__item { text-decoration: none; color: inherit; }
|
|
|
2543
2571
|
display: inline-flex; align-items: center; gap: var(--gl-space-2xs);
|
|
2544
2572
|
padding: var(--gl-space-2xs) var(--gl-space-sm);
|
|
2545
2573
|
background: var(--gl-surface-3);
|
|
2546
|
-
|
|
2547
|
-
|
|
2574
|
+
/* No blur of its own on the glass of a modal or a sheet (since 1.35.0):
|
|
2575
|
+
the dialog blurs already, and Chromium counted its glow twice beneath
|
|
2576
|
+
a nested backdrop filter — a chip there came out 2.9:1 for white. */
|
|
2577
|
+
backdrop-filter: var(--gl-ctx-control-backdrop, blur(var(--gl-blur-soft)));
|
|
2578
|
+
-webkit-backdrop-filter: var(--gl-ctx-control-backdrop, blur(var(--gl-blur-soft)));
|
|
2548
2579
|
border: 1px solid var(--gl-border-subtle);
|
|
2549
2580
|
border-radius: var(--gl-radius-full);
|
|
2550
2581
|
font-size: var(--gl-font-size-xs);
|
|
@@ -2632,9 +2663,12 @@ a.glass-tab-bar__item { text-decoration: none; color: inherit; }
|
|
|
2632
2663
|
box-shadow: var(--gl-shadow-focus), var(--gl-inset-subtle);
|
|
2633
2664
|
}
|
|
2634
2665
|
|
|
2666
|
+
/* In dark mode the label takes the text colour (since 1.35.0): the accent
|
|
2667
|
+
lightened for dark surfaces read 2.2 to 3:1 on a chip over glass. The
|
|
2668
|
+
selection shows in the border and the tint. */
|
|
2635
2669
|
.glass-badge--selected {
|
|
2636
2670
|
border-color: color-mix(in srgb, var(--gl-badge-accent) 55%, transparent);
|
|
2637
|
-
color: var(--gl-badge-accent-text);
|
|
2671
|
+
color: var(--gl-badge-selected-color, var(--gl-badge-accent-text));
|
|
2638
2672
|
box-shadow: var(--gl-inset-subtle),
|
|
2639
2673
|
inset 0 0 0 100px color-mix(in srgb, var(--gl-badge-accent) 22%, transparent);
|
|
2640
2674
|
}
|
|
@@ -3109,24 +3143,28 @@ a.glass-tab-bar__item { text-decoration: none; color: inherit; }
|
|
|
3109
3143
|
technology. Hover and press leave it as it is; the keyboard ring stays
|
|
3110
3144
|
around the row. While the row is a drop target of a drag, the pill makes
|
|
3111
3145
|
way for the line or the tint. */
|
|
3112
|
-
.
|
|
3146
|
+
/* Tokens since 1.35.0 shape it otherwise: --gl-list-item-selected-inset
|
|
3147
|
+
(3px --gl-space-xs), -radius (--gl-radius-sm), -shadow (edge light and a
|
|
3148
|
+
button's shadow), -color (the heading colour) and -weight (semibold).
|
|
3149
|
+
Inset 0, radius 0 and shadow none make a flat tint over the whole row. */
|
|
3150
|
+
.glass-list__item.is-selected { color: var(--gl-list-item-selected-color, var(--gl-color-text-heading)); isolation: isolate; }
|
|
3113
3151
|
.glass-list__item.is-selected:not(.is-sort-before, .is-sort-after, .is-sort-inside, .is-sort-refused)::before {
|
|
3114
3152
|
content: ''; position: absolute; z-index: -1;
|
|
3115
|
-
inset: 3px var(--gl-space-xs);
|
|
3116
|
-
border-radius: var(--gl-radius-sm);
|
|
3153
|
+
inset: var(--gl-list-item-selected-inset, 3px var(--gl-space-xs));
|
|
3154
|
+
border-radius: var(--gl-list-item-selected-radius, var(--gl-radius-sm));
|
|
3117
3155
|
background: var(--gl-list-item-selected-bg, var(--gl-surface-4));
|
|
3118
|
-
box-shadow: var(--gl-inset-strong), var(--gl-shadow-btn);
|
|
3156
|
+
box-shadow: var(--gl-list-item-selected-shadow, var(--gl-inset-strong), var(--gl-shadow-btn));
|
|
3119
3157
|
pointer-events: none;
|
|
3120
3158
|
}
|
|
3121
3159
|
.glass-list__item--interactive.is-selected:is(:hover, :active, :focus-visible) { background: transparent; }
|
|
3122
|
-
.glass-list__item.is-selected .glass-list__title { font-weight: var(--gl-font-weight-semibold); }
|
|
3160
|
+
.glass-list__item.is-selected .glass-list__title { font-weight: var(--gl-list-item-selected-weight, var(--gl-font-weight-semibold)); }
|
|
3123
3161
|
.glass-list__item.is-selected .glass-list__leading { color: var(--gl-color-primary-text); }
|
|
3124
3162
|
|
|
3125
3163
|
.glass-list__item--danger { color: var(--gl-color-error); }
|
|
3126
3164
|
.glass-list__item--danger .glass-list__title,
|
|
3127
3165
|
.glass-list__item--danger .glass-list__leading { color: inherit; }
|
|
3128
3166
|
|
|
3129
|
-
.glass-list__item--accent { color: var(--gl-color-primary-text); }
|
|
3167
|
+
.glass-list__item--accent { color: var(--gl-ctx-primary-text, var(--gl-color-primary-text)); }
|
|
3130
3168
|
.glass-list__item--accent .glass-list__title,
|
|
3131
3169
|
.glass-list__item--accent .glass-list__leading { color: inherit; }
|
|
3132
3170
|
|
|
@@ -3191,9 +3229,11 @@ a.glass-tab-bar__item { text-decoration: none; color: inherit; }
|
|
|
3191
3229
|
out of it — an e-mail address in a --wrap subtitle used to — while text
|
|
3192
3230
|
still breaks at spaces. hyphens is left to inheritance: set it on the
|
|
3193
3231
|
list or the page for breaks at syllables. */
|
|
3232
|
+
/* --gl-list-title-size, --gl-list-title-weight and --gl-list-subtitle-size
|
|
3233
|
+
(since 1.35.0) set the type of a row, on the list or one row. */
|
|
3194
3234
|
.glass-list__title {
|
|
3195
|
-
font-size: var(--gl-font-size-base);
|
|
3196
|
-
font-weight: var(--gl-font-weight-medium);
|
|
3235
|
+
font-size: var(--gl-list-title-size, var(--gl-font-size-base));
|
|
3236
|
+
font-weight: var(--gl-list-title-weight, var(--gl-font-weight-medium));
|
|
3197
3237
|
color: var(--gl-color-text);
|
|
3198
3238
|
white-space: var(--gl-list-title-white-space, nowrap);
|
|
3199
3239
|
overflow: hidden;
|
|
@@ -3201,7 +3241,7 @@ a.glass-tab-bar__item { text-decoration: none; color: inherit; }
|
|
|
3201
3241
|
overflow-wrap: anywhere;
|
|
3202
3242
|
}
|
|
3203
3243
|
.glass-list__subtitle {
|
|
3204
|
-
font-size: var(--gl-font-size-sm);
|
|
3244
|
+
font-size: var(--gl-list-subtitle-size, var(--gl-font-size-sm));
|
|
3205
3245
|
color: var(--gl-color-text-muted);
|
|
3206
3246
|
white-space: var(--gl-list-subtitle-white-space, nowrap);
|
|
3207
3247
|
overflow: hidden;
|
|
@@ -3218,6 +3258,27 @@ a.glass-tab-bar__item { text-decoration: none; color: inherit; }
|
|
|
3218
3258
|
/* display: -webkit-box above beats the hidden attribute's own rule: an empty
|
|
3219
3259
|
--wrap subtitle kept its place, and the title sat 1px off centre. */
|
|
3220
3260
|
.glass-list__subtitle[hidden] { display: none; }
|
|
3261
|
+
/* Room beside the title and below the subtitle (since 1.35.0). __title-row
|
|
3262
|
+
holds the title and __title-trailing — a badge such as "AI", a mark —,
|
|
3263
|
+
which moves under the title where the row is too narrow; the title keeps
|
|
3264
|
+
its ellipsis. __extra below the subtitle takes a link ("Undo") or a line
|
|
3265
|
+
of chips. */
|
|
3266
|
+
.glass-list__title-row {
|
|
3267
|
+
display: flex; flex-wrap: wrap; align-items: center;
|
|
3268
|
+
gap: var(--gl-space-2xs) var(--gl-space-xs);
|
|
3269
|
+
min-width: 0;
|
|
3270
|
+
}
|
|
3271
|
+
.glass-list__title-row > .glass-list__title { flex: 0 1 auto; min-width: 0; }
|
|
3272
|
+
.glass-list__item--center .glass-list__title-row { justify-content: center; }
|
|
3273
|
+
.glass-list__title-trailing { flex: none; display: inline-flex; align-items: center; gap: var(--gl-space-2xs); }
|
|
3274
|
+
.glass-list__extra {
|
|
3275
|
+
display: flex; flex-wrap: wrap; align-items: center; gap: var(--gl-space-xs);
|
|
3276
|
+
margin-top: var(--gl-space-2xs);
|
|
3277
|
+
font-size: var(--gl-font-size-sm);
|
|
3278
|
+
color: var(--gl-color-text-muted);
|
|
3279
|
+
}
|
|
3280
|
+
.glass-list__title-trailing[hidden],
|
|
3281
|
+
.glass-list__extra[hidden] { display: none; }
|
|
3221
3282
|
|
|
3222
3283
|
.glass-list__trailing {
|
|
3223
3284
|
flex-shrink: 0;
|
|
@@ -3763,7 +3824,7 @@ a.glass-tab-bar__item { text-decoration: none; color: inherit; }
|
|
|
3763
3824
|
.glass-prose ul, .glass-prose ol { padding-inline-start: 1.3em; }
|
|
3764
3825
|
.glass-prose strong { color: var(--gl-color-text-heading); }
|
|
3765
3826
|
/* Links in running text are underlined: colour alone does not mark them. */
|
|
3766
|
-
.glass-prose a { color: var(--gl-color-primary-text); text-decoration: underline; text-underline-offset: 2px; }
|
|
3827
|
+
.glass-prose a { color: var(--gl-ctx-primary-text, var(--gl-color-primary-text)); text-decoration: underline; text-underline-offset: 2px; }
|
|
3767
3828
|
.glass-prose code {
|
|
3768
3829
|
font-family: ui-monospace, 'SF Mono', Menlo, monospace; font-size: 0.9em;
|
|
3769
3830
|
background: var(--gl-surface-2); padding: 1px 5px; border-radius: 4px;
|
|
@@ -3801,7 +3862,9 @@ a.glass-tab-bar__item { text-decoration: none; color: inherit; }
|
|
|
3801
3862
|
.glass-segmented {
|
|
3802
3863
|
display: inline-flex; gap: 4px; padding: 4px;
|
|
3803
3864
|
max-width: 100%;
|
|
3804
|
-
|
|
3865
|
+
/* --gl-segmented-bg (since 1.35.0); on the glass of a modal or a sheet
|
|
3866
|
+
in dark mode the track is a well, --gl-dialog-well. */
|
|
3867
|
+
background: var(--gl-segmented-bg, var(--gl-ctx-segmented-bg, var(--gl-surface-1)));
|
|
3805
3868
|
border: 1px solid var(--gl-border-subtle);
|
|
3806
3869
|
border-radius: var(--gl-radius-btn);
|
|
3807
3870
|
box-shadow: var(--gl-inset-subtle);
|
|
@@ -3845,7 +3908,7 @@ a.glass-tab-bar__item { text-decoration: none; color: inherit; }
|
|
|
3845
3908
|
values; the drop of --droplet takes the same surface (18c). The shadow
|
|
3846
3909
|
sits in shadow lists: switch it off with a zero shadow, not none. */
|
|
3847
3910
|
.glass-segmented__item[aria-pressed="true"] {
|
|
3848
|
-
background: var(--gl-segmented-active-bg, var(--gl-surface-5));
|
|
3911
|
+
background: var(--gl-segmented-active-bg, var(--gl-ctx-segmented-active-bg, var(--gl-surface-5)));
|
|
3849
3912
|
color: var(--gl-segmented-active-color, var(--gl-color-text-heading));
|
|
3850
3913
|
box-shadow: var(--gl-segmented-active-shadow, var(--gl-shadow-btn));
|
|
3851
3914
|
}
|
|
@@ -3876,8 +3939,13 @@ a.glass-tab-bar__item { text-decoration: none; color: inherit; }
|
|
|
3876
3939
|
}
|
|
3877
3940
|
.glass-segmented__icon[hidden] { display: none; }
|
|
3878
3941
|
.glass-segmented__icon svg,
|
|
3879
|
-
.glass-segmented__icon ::slotted(svg) {
|
|
3880
|
-
|
|
3942
|
+
.glass-segmented__icon ::slotted(svg) { width: 18px; height: 18px; }
|
|
3943
|
+
/* A line icon strokes in the option's colour. --color (since 1.35.0) keeps
|
|
3944
|
+
a coloured logo's own fills and strokes; before, its shapes inherited the
|
|
3945
|
+
stroke and came out outlined in the text colour. */
|
|
3946
|
+
.glass-segmented__icon:not(.glass-segmented__icon--color) svg,
|
|
3947
|
+
.glass-segmented__icon:not(.glass-segmented__icon--color) ::slotted(svg) {
|
|
3948
|
+
fill: none;
|
|
3881
3949
|
stroke: currentColor; stroke-width: 1.8;
|
|
3882
3950
|
stroke-linecap: round; stroke-linejoin: round;
|
|
3883
3951
|
}
|
|
@@ -4042,7 +4110,7 @@ a.glass-tab-bar__item { text-decoration: none; color: inherit; }
|
|
|
4042
4110
|
layout instead of idling at opacity 0. <glk-sheet> in GlassKit Elements
|
|
4043
4111
|
does exactly this. --inline embeds the panel in the flow, no overlay. */
|
|
4044
4112
|
.glass-sheet-overlay {
|
|
4045
|
-
position: fixed; inset: 0; z-index: 1000;
|
|
4113
|
+
position: fixed; inset: 0; z-index: var(--gl-sheet-z-index, 1000);
|
|
4046
4114
|
display: flex; align-items: flex-end; justify-content: center;
|
|
4047
4115
|
background: var(--gl-surface-overlay);
|
|
4048
4116
|
/* Like the modal's dimmer: --gl-blur-overlay where set (1.25.0). */
|
|
@@ -4080,9 +4148,9 @@ dialog.glass-sheet-overlay::backdrop { background: transparent; }
|
|
|
4080
4148
|
light in dark mode — with --gl-color-text on it the sheet read white
|
|
4081
4149
|
on white-grey. The card glow gradient over heavy blur is what the
|
|
4082
4150
|
text tokens are made for, in both themes. */
|
|
4083
|
-
background: linear-gradient(to bottom,
|
|
4084
|
-
var(--gl-card-glow-top) 0%, var(--gl-card-glow-bottom) 100%
|
|
4085
|
-
);
|
|
4151
|
+
background: var(--gl-sheet-bg, linear-gradient(to bottom,
|
|
4152
|
+
var(--gl-dialog-glow-top, var(--gl-card-glow-top)) 0%, var(--gl-card-glow-bottom) 100%
|
|
4153
|
+
));
|
|
4086
4154
|
backdrop-filter: blur(var(--gl-blur-heavy));
|
|
4087
4155
|
-webkit-backdrop-filter: blur(var(--gl-blur-heavy));
|
|
4088
4156
|
color: var(--gl-color-text);
|
|
@@ -4097,12 +4165,106 @@ dialog.glass-sheet-overlay::backdrop { background: transparent; }
|
|
|
4097
4165
|
.glass-sheet-overlay.is-active .glass-sheet { transform: translateY(0); }
|
|
4098
4166
|
.glass-sheet--inline { border-radius: var(--gl-radius-card); box-shadow: var(--gl-shadow-card); }
|
|
4099
4167
|
|
|
4168
|
+
/* Controls on the glass of a modal or a sheet (since 1.35.0) take the
|
|
4169
|
+
theme's dialog values where the page set none of its own: a segmented
|
|
4170
|
+
control lies in --gl-dialog-well with its chosen option on
|
|
4171
|
+
--gl-dialog-raised, a tertiary button on --gl-dialog-control (all dark
|
|
4172
|
+
mode only), and badges and tertiary buttons take no blur of their own;
|
|
4173
|
+
accent text — a link, an accent row — takes --gl-color-primary-on-glass,
|
|
4174
|
+
as on a card. Inherited, so they reach the controls of GlassKit Elements in
|
|
4175
|
+
their shadow roots. */
|
|
4176
|
+
.glass-modal, .glass-sheet {
|
|
4177
|
+
--gl-ctx-segmented-bg: var(--gl-dialog-well);
|
|
4178
|
+
--gl-ctx-segmented-active-bg: var(--gl-dialog-raised);
|
|
4179
|
+
--gl-ctx-btn-tertiary-bg: var(--gl-dialog-control);
|
|
4180
|
+
--gl-ctx-control-backdrop: none;
|
|
4181
|
+
--gl-ctx-primary-text: var(--gl-color-primary-on-glass);
|
|
4182
|
+
}
|
|
4183
|
+
|
|
4184
|
+
/* At a side (since 1.35.0): --start or --end on the overlay puts the panel
|
|
4185
|
+
at that edge, as high as the window less --gl-sheet-side-inset (16px) at
|
|
4186
|
+
both ends and that far from its edge, --gl-sheet-side-width (440px) wide,
|
|
4187
|
+
with a card's corners. It slides in from that edge, has no grip, and its
|
|
4188
|
+
actions stand side by side at its foot. --modeless leaves the page
|
|
4189
|
+
usable: no scrim and no blur, and only the panel takes the pointer — for
|
|
4190
|
+
a sheet opened with show() instead of showModal(), beside a list whose
|
|
4191
|
+
chosen row stays in view. --gl-sheet-z-index (1000) stacks it. */
|
|
4192
|
+
/* The inset is the panel's margin: the dialog's own padding is undone. */
|
|
4193
|
+
.glass-sheet-overlay--start,
|
|
4194
|
+
.glass-sheet-overlay--end { align-items: stretch; }
|
|
4195
|
+
.glass-sheet-overlay--start { justify-content: flex-start; }
|
|
4196
|
+
.glass-sheet-overlay--end { justify-content: flex-end; }
|
|
4197
|
+
:is(.glass-sheet-overlay--start, .glass-sheet-overlay--end) .glass-sheet {
|
|
4198
|
+
width: min(var(--gl-sheet-side-width, 440px), 100% - 2 * var(--gl-sheet-side-inset, 16px)); max-height: none;
|
|
4199
|
+
margin: var(--gl-sheet-side-inset, 16px);
|
|
4200
|
+
display: flex; flex-direction: column;
|
|
4201
|
+
padding-top: var(--gl-space-lg);
|
|
4202
|
+
border-radius: var(--gl-radius-card);
|
|
4203
|
+
}
|
|
4204
|
+
.glass-sheet-overlay--end .glass-sheet,
|
|
4205
|
+
.glass-sheet-overlay--start:dir(rtl) .glass-sheet { transform: translateX(calc(100% + var(--gl-sheet-side-inset, 16px))); }
|
|
4206
|
+
.glass-sheet-overlay--start .glass-sheet,
|
|
4207
|
+
.glass-sheet-overlay--end:dir(rtl) .glass-sheet { transform: translateX(calc(-100% - var(--gl-sheet-side-inset, 16px))); }
|
|
4208
|
+
:is(.glass-sheet-overlay--start, .glass-sheet-overlay--end).is-active .glass-sheet { transform: none; }
|
|
4209
|
+
:is(.glass-sheet-overlay--start, .glass-sheet-overlay--end) .glass-sheet__grip { display: none; }
|
|
4210
|
+
:is(.glass-sheet-overlay--start, .glass-sheet-overlay--end) .glass-sheet__body { flex: 1 0 auto; }
|
|
4211
|
+
:is(.glass-sheet-overlay--start, .glass-sheet-overlay--end) .glass-sheet__actions { flex-direction: row; flex-wrap: wrap; justify-content: flex-end; }
|
|
4212
|
+
.glass-sheet-overlay--modeless {
|
|
4213
|
+
background: none;
|
|
4214
|
+
backdrop-filter: none;
|
|
4215
|
+
-webkit-backdrop-filter: none;
|
|
4216
|
+
pointer-events: none;
|
|
4217
|
+
}
|
|
4218
|
+
.glass-sheet-overlay--modeless .glass-sheet { pointer-events: auto; }
|
|
4219
|
+
/* The panel takes the focus only as a whole, to hand it on; no ring. */
|
|
4220
|
+
.glass-sheet:focus { outline: none; }
|
|
4221
|
+
|
|
4100
4222
|
.glass-sheet__grip { width: 40px; height: 4px; margin: 4px auto 12px; border-radius: 2px; background: var(--gl-border-strong); }
|
|
4101
4223
|
.glass-sheet__title {
|
|
4102
4224
|
margin: 0 0 8px;
|
|
4103
4225
|
font-size: var(--gl-font-size-modal); font-weight: var(--gl-font-weight-semibold);
|
|
4104
4226
|
color: var(--gl-color-text-heading);
|
|
4105
4227
|
}
|
|
4228
|
+
/* The head (since 1.35.0): the title with a short line above it
|
|
4229
|
+
(__eyebrow), something before it (__leading, a mark or an icon chip),
|
|
4230
|
+
something after it (__trailing, a badge) and a close button (__close) at
|
|
4231
|
+
its end. __head takes the title's place and its spacing; a title alone
|
|
4232
|
+
in it stands as it did without one. */
|
|
4233
|
+
.glass-sheet__head { display: flex; align-items: center; gap: var(--gl-space-sm); margin: 0 0 8px; }
|
|
4234
|
+
.glass-sheet__heading { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
|
|
4235
|
+
.glass-sheet__head .glass-sheet__title { margin: 0; }
|
|
4236
|
+
.glass-sheet__eyebrow {
|
|
4237
|
+
font-size: var(--gl-font-size-xs); font-weight: var(--gl-font-weight-semibold);
|
|
4238
|
+
letter-spacing: 0.3px; text-transform: uppercase;
|
|
4239
|
+
color: var(--gl-color-text-muted);
|
|
4240
|
+
}
|
|
4241
|
+
.glass-sheet__leading,
|
|
4242
|
+
.glass-sheet__trailing { flex: none; display: flex; align-items: center; gap: var(--gl-space-xs); }
|
|
4243
|
+
.glass-sheet__eyebrow[hidden],
|
|
4244
|
+
.glass-sheet__leading[hidden],
|
|
4245
|
+
.glass-sheet__trailing[hidden],
|
|
4246
|
+
.glass-sheet__close[hidden] { display: none; }
|
|
4247
|
+
/* A round glass button, 32px, with a 44px target. */
|
|
4248
|
+
.glass-sheet__close {
|
|
4249
|
+
-webkit-appearance: none; appearance: none;
|
|
4250
|
+
flex: none; position: relative;
|
|
4251
|
+
width: 32px; height: 32px; margin-inline-end: -4px; padding: 0;
|
|
4252
|
+
display: inline-flex; align-items: center; justify-content: center;
|
|
4253
|
+
border: 1px solid var(--gl-border-subtle); border-radius: 50%;
|
|
4254
|
+
background: var(--gl-surface-2);
|
|
4255
|
+
color: var(--gl-color-text-muted);
|
|
4256
|
+
box-shadow: var(--gl-inset-subtle);
|
|
4257
|
+
font: inherit; cursor: pointer;
|
|
4258
|
+
transition: var(--gl-transition-fast);
|
|
4259
|
+
outline: none; -webkit-tap-highlight-color: transparent;
|
|
4260
|
+
}
|
|
4261
|
+
.glass-sheet__close::after { content: ""; position: absolute; inset: -6px; }
|
|
4262
|
+
.glass-sheet__close:hover { background: var(--gl-surface-3); color: var(--gl-color-text); }
|
|
4263
|
+
.glass-sheet__close:focus-visible { box-shadow: var(--gl-shadow-focus), var(--gl-inset-subtle); }
|
|
4264
|
+
.glass-sheet__close svg {
|
|
4265
|
+
width: 16px; height: 16px; fill: none; stroke: currentColor;
|
|
4266
|
+
stroke-width: 2; stroke-linecap: round;
|
|
4267
|
+
}
|
|
4106
4268
|
.glass-sheet__body { font-size: var(--gl-font-size-base); line-height: 1.55; }
|
|
4107
4269
|
.glass-sheet__actions { display: flex; flex-direction: column; gap: 8px; margin-top: 16px; }
|
|
4108
4270
|
@media (prefers-reduced-motion: reduce) {
|