@gemboss/website-ui 0.11.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +14 -2
- package/CHANGELOG.md +77 -0
- package/README.md +6 -3
- package/bin/gemboss-website.mjs +13 -1
- package/bin/lib/build.mjs +101 -0
- package/bin/lib/check.mjs +50 -5
- package/bin/lib/init.mjs +93 -3
- package/css/article.css +1 -1
- package/css/base.css +23 -18
- package/css/components.css +29 -9
- package/css/forms.css +1 -1
- package/css/header.css +52 -5
- package/css/layout.css +7 -3
- package/css/ratings.css +0 -1
- package/css/sections.css +3 -4
- package/css/tokens.css +11 -0
- package/demo/header.html +1 -1
- package/docs/components.md +39 -14
- package/docs/markup-contract.md +10 -6
- package/docs/theming.md +39 -12
- package/js/website.js +33 -9
- package/js/website.mjs +37 -10
- package/package.json +1 -1
- package/system.json +28 -4
- package/templates/header.html +3 -2
- package/templates/page.html +2 -2
- package/templates/sections/form.html +2 -0
- package/templates/sections/hero.html +2 -1
- package/templates/sections/split.html +1 -1
- package/templates/site/app/[[...path]]/route.js +23 -0
- package/templates/site/assets/kit-gaps.css +3 -0
- package/templates/site/assets/site.css +16 -0
- package/templates/site/gitignore +4 -0
- package/templates/site/lib/pages.mjs +41 -0
- package/templates/site/next.config.mjs +15 -0
- package/templates/site/stage-public.mjs +49 -0
- package/templates/site/vercel.json +5 -0
- package/website.css +128 -43
- package/website.min.css +1 -1
package/website.css
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
/*! @gemboss/website-ui 0.
|
|
1
|
+
/*! @gemboss/website-ui 0.13.0 | generated by scripts/build.mjs from the files in css/. Edit those and not this file */
|
|
2
2
|
/* @gemboss/website-ui tokens. GENERATED from system.json by scripts/build.mjs: do not edit by hand. */
|
|
3
3
|
:root {
|
|
4
4
|
color-scheme: light;
|
|
5
5
|
--gw-font: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
6
6
|
--gw-font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
7
|
+
--gw-font-action: Inter;
|
|
7
8
|
--gw-text-11: 11px;
|
|
8
9
|
--gw-text-12: 12px;
|
|
9
10
|
--gw-text-13: 13px;
|
|
@@ -19,6 +20,8 @@
|
|
|
19
20
|
--gw-display-wordmark: clamp(40px, 9vw, 128px);
|
|
20
21
|
--gw-display-weight: 600;
|
|
21
22
|
--gw-display-tracking: -0.03em;
|
|
23
|
+
--gw-display-h1-leading: 1.1;
|
|
24
|
+
--gw-display-h2-leading: 1.06;
|
|
22
25
|
--gw-heading-weight: 650;
|
|
23
26
|
--gw-heading-tracking: -0.022em;
|
|
24
27
|
--gw-heading-leading: 1.08;
|
|
@@ -71,6 +74,7 @@
|
|
|
71
74
|
--gw-tap-min: 44px;
|
|
72
75
|
--gw-ease: cubic-bezier(.22,1,.36,1);
|
|
73
76
|
--gw-reveal-ms: 700ms;
|
|
77
|
+
--gw-reveal-distance: 20px;
|
|
74
78
|
--gw-spin-ms: 700ms;
|
|
75
79
|
--gw-spot-radius: 260px;
|
|
76
80
|
--gw-spot-radius-action: 120px;
|
|
@@ -89,6 +93,13 @@
|
|
|
89
93
|
--gw-stage-bottom: #0d0f2e;
|
|
90
94
|
--gw-stage-dot: rgba(255, 255, 255, 0.1);
|
|
91
95
|
--gw-stage-ink: #ffffff;
|
|
96
|
+
--gw-announce-bg: #171a38;
|
|
97
|
+
--gw-announce-ink: #b9beda;
|
|
98
|
+
--gw-announce-line: rgba(255, 255, 255, 0.06);
|
|
99
|
+
--gw-announce-tag: rgba(122, 132, 255, 0.2);
|
|
100
|
+
--gw-announce-tag-ink: #a7aeff;
|
|
101
|
+
--gw-announce-link: #ffffff;
|
|
102
|
+
--gw-announce-link-line: rgba(255, 255, 255, 0.28);
|
|
92
103
|
/* accent primitives: the only colours a brand overrides (docs/theming.md) */
|
|
93
104
|
--gw-accent-light: #5661f5;
|
|
94
105
|
--gw-accent-strong-light: #3a44de;
|
|
@@ -305,33 +316,34 @@ h1, h2, h3, h4, h5, h6, .gw-h1, .gw-h2, .gw-h3, .gw-h4 {
|
|
|
305
316
|
text-wrap: balance;
|
|
306
317
|
}
|
|
307
318
|
h1, .gw-h1, h2, .gw-h2 { font-weight: var(--gw-display-weight); letter-spacing: var(--gw-display-tracking); }
|
|
308
|
-
h1, .gw-h1 { font-size: var(--gw-display-h1); }
|
|
309
|
-
h2, .gw-h2 { font-size: var(--gw-display-h2); }
|
|
310
|
-
h3,
|
|
319
|
+
h1, .gw-h1 { font-size: var(--gw-display-h1); line-height: var(--gw-display-h1-leading); }
|
|
320
|
+
h2, .gw-h2 { font-size: var(--gw-display-h2); line-height: var(--gw-display-h2-leading); }
|
|
321
|
+
/* h3 (0.12.0): 20px/600, as every h3 on gemboss.ai */
|
|
322
|
+
h3, .gw-h3 { font-size: 20px; font-weight: 600; letter-spacing: -0.02em; line-height: 1.2; }
|
|
311
323
|
h4, .gw-h4 { font-size: 20px; font-weight: 600; letter-spacing: -0.01em; }
|
|
312
324
|
h5, h6 { font-size: 16px; font-weight: 600; letter-spacing: 0; }
|
|
313
325
|
|
|
314
|
-
.gw-lead { font-size: 18px; line-height: 1.55; color: var(--gw-muted); max-width:
|
|
326
|
+
.gw-lead { font-size: 18px; line-height: 1.55; color: var(--gw-muted); max-width: 58ch; }
|
|
315
327
|
.gw-note { font-size: 14px; color: var(--gw-muted); }
|
|
316
328
|
.gw-dim { color: var(--gw-muted); }
|
|
317
329
|
|
|
318
|
-
/* the label above a heading: sentence case, muted, led by the 8px
|
|
330
|
+
/* the label above a heading: sentence case, muted, led by the 8px square, ink by default (0.12.0, as gemboss.ai). The
|
|
331
|
+
input --gw-label-mark paints the square another colour (a product's own, say): set it on the label or on anything
|
|
332
|
+
around it, e.g. style="--gw-label-mark: var(--gw-accent)". */
|
|
319
333
|
.gw-label {
|
|
320
334
|
display: inline-flex;
|
|
321
335
|
align-items: center;
|
|
322
336
|
gap: 8px;
|
|
323
337
|
font-size: 13px;
|
|
324
338
|
font-weight: 500;
|
|
325
|
-
line-height: 1.4;
|
|
326
339
|
color: var(--gw-muted);
|
|
327
340
|
}
|
|
328
341
|
.gw-label::before {
|
|
329
342
|
content: "";
|
|
330
|
-
flex: none;
|
|
331
343
|
width: 8px;
|
|
332
344
|
height: 8px;
|
|
333
|
-
border-radius: var(--gw-radius-
|
|
334
|
-
background: var(--gw-
|
|
345
|
+
border-radius: var(--gw-radius-2);
|
|
346
|
+
background: var(--gw-label-mark, var(--gw-ink));
|
|
335
347
|
}
|
|
336
348
|
|
|
337
349
|
/* links inside running text (and anywhere in .gw-prose) get a visible link style; everything else opts in with .gw-link */
|
|
@@ -351,19 +363,22 @@ h5, h6 { font-size: 16px; font-weight: 600; letter-spacing: 0; }
|
|
|
351
363
|
:focus-visible { border-radius: var(--gw-radius-4); outline: 2px solid var(--gw-accent); outline-offset: 3px; }
|
|
352
364
|
[id] { scroll-margin-top: calc(var(--gw-header-height) + 16px); }
|
|
353
365
|
|
|
366
|
+
/* the skip link (0.12.0, gemboss.ai's): the accent tab in the top left corner, shown while it has the focus */
|
|
354
367
|
.gw-skip {
|
|
355
368
|
position: absolute;
|
|
356
369
|
left: -9999px;
|
|
357
|
-
top:
|
|
358
|
-
z-index:
|
|
359
|
-
padding: 12px
|
|
360
|
-
border-radius: var(--gw-radius-
|
|
361
|
-
background: var(--gw-
|
|
362
|
-
color: var(--gw-on-
|
|
370
|
+
top: 0;
|
|
371
|
+
z-index: 200;
|
|
372
|
+
padding: 12px 20px;
|
|
373
|
+
border-radius: 0 0 var(--gw-radius-card) 0;
|
|
374
|
+
background: var(--gw-accent);
|
|
375
|
+
color: var(--gw-on-accent);
|
|
376
|
+
box-shadow: var(--gw-shadow);
|
|
363
377
|
font-size: 14px;
|
|
364
378
|
font-weight: 600;
|
|
365
379
|
}
|
|
366
|
-
|
|
380
|
+
/* its corner again with the focus: a page's own :focus-visible corners, loaded after the kit, must not round the tab */
|
|
381
|
+
.gw-skip:focus { left: 0; border-radius: 0 0 var(--gw-radius-card) 0; }
|
|
367
382
|
|
|
368
383
|
/* words for a screen reader only (0.7.0): " (opens in a new tab)" in a link with target="_blank" */
|
|
369
384
|
.gw-visually-hidden {
|
|
@@ -377,10 +392,11 @@ h5, h6 { font-size: 16px; font-weight: 600; letter-spacing: 0; }
|
|
|
377
392
|
border: 0;
|
|
378
393
|
}
|
|
379
394
|
|
|
380
|
-
/* scroll reveal: the script adds .is-in
|
|
395
|
+
/* scroll reveal: the script adds .is-in (system.json motion.reveal: when, the stagger, the failsafe); the animation is
|
|
396
|
+
a second failsafe, for a page whose script never ran, that shows it anyway after 2.5s */
|
|
381
397
|
.gw-reveal {
|
|
382
398
|
opacity: 0;
|
|
383
|
-
transform: translateY(
|
|
399
|
+
transform: translateY(var(--gw-reveal-distance));
|
|
384
400
|
transition: opacity var(--gw-reveal-ms) var(--gw-ease), transform var(--gw-reveal-ms) var(--gw-ease);
|
|
385
401
|
animation: gw-reveal-failsafe 1ms linear 2.5s forwards;
|
|
386
402
|
}
|
|
@@ -406,15 +422,19 @@ h5, h6 { font-size: 16px; font-weight: 600; letter-spacing: 0; }
|
|
|
406
422
|
@media (min-width: 768px) { .gw-section--tight { padding-block: 64px; } }
|
|
407
423
|
|
|
408
424
|
/* label + h2 + one or two lines; the vertical flow of every text block in the kit */
|
|
409
|
-
.gw-section__head { max-width:
|
|
425
|
+
.gw-section__head { max-width: 760px; }
|
|
410
426
|
.gw-section__head--center { margin-inline: auto; text-align: center; }
|
|
411
427
|
.gw-section__head--center .gw-lead { margin-inline: auto; }
|
|
412
|
-
.
|
|
413
|
-
|
|
428
|
+
/* what follows a head starts 40px under it, 48px from 768px (0.12.0): a top margin on the next thing, at no
|
|
429
|
+
specificity, so a block that brings its own (a FAQ's 40px, say) keeps it */
|
|
430
|
+
:where(.gw-section__head) + * { margin-top: 40px; }
|
|
431
|
+
@media (min-width: 768px) { :where(.gw-section__head) + * { margin-top: 48px; } }
|
|
414
432
|
|
|
415
433
|
:where(.gw-section__head, .gw-hero > .gw-wrap, .gw-split > :not(.gw-window), .gw-cta, .gw-card, .gw-feature, .gw-plan) > * + * { margin-top: 16px; }
|
|
416
434
|
:where(.gw-section__head, .gw-hero > .gw-wrap, .gw-split > :not(.gw-window), .gw-cta, .gw-card, .gw-plan) > :is(.gw-actions, .gw-segmented) { margin-top: 32px; }
|
|
417
435
|
:where(.gw-section__head, .gw-hero > .gw-wrap, .gw-split > :not(.gw-window), .gw-cta, .gw-card, .gw-plan) > .gw-list--check { margin-top: 24px; }
|
|
436
|
+
/* a lead under a heading: 20px (0.12.0, as gemboss.ai); in a hero it keeps the 16px of the flow */
|
|
437
|
+
:where(.gw-section__head, .gw-split > :not(.gw-window), .gw-cta) > :where(* + .gw-lead) { margin-top: 20px; }
|
|
418
438
|
|
|
419
439
|
/* a row of actions: one .gw-btn, then a secondary or a link */
|
|
420
440
|
.gw-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; }
|
|
@@ -456,12 +476,12 @@ h5, h6 { font-size: 16px; font-weight: 600; letter-spacing: 0; }
|
|
|
456
476
|
|
|
457
477
|
/* actions are rectangles: 40px, the action radius of the site's profile (8, 12 in soft), 14px/600, sentence case.
|
|
458
478
|
The fill is the action colour: ink, or the brand's accent under data-gw-action="accent" (tokens.css). Never a
|
|
459
|
-
gradient
|
|
479
|
+
gradient or a wash hue. On hover (0.12.0, as gemboss.ai) the filled button rises 1px onto the rest shadow; the framed
|
|
480
|
+
and frameless ones only change their frame or tint. Phones: see "touch" below. */
|
|
460
481
|
.gw-btn {
|
|
461
482
|
position: relative;
|
|
462
483
|
display: inline-flex;
|
|
463
484
|
align-items: center;
|
|
464
|
-
justify-content: center;
|
|
465
485
|
gap: 8px;
|
|
466
486
|
max-width: 100%;
|
|
467
487
|
height: var(--gw-button-height);
|
|
@@ -470,26 +490,34 @@ h5, h6 { font-size: 16px; font-weight: 600; letter-spacing: 0; }
|
|
|
470
490
|
border-radius: var(--gw-radius-action);
|
|
471
491
|
background: var(--gw-action);
|
|
472
492
|
color: var(--gw-on-action);
|
|
493
|
+
font-family: var(--gw-font-action);
|
|
473
494
|
font-size: 14px;
|
|
474
495
|
font-weight: 600;
|
|
475
|
-
line-height: 1.4;
|
|
476
496
|
letter-spacing: 0;
|
|
477
497
|
text-align: center;
|
|
478
498
|
white-space: nowrap;
|
|
479
499
|
cursor: pointer;
|
|
500
|
+
transition: background 0.15s ease, border-color 0.15s ease;
|
|
480
501
|
}
|
|
481
|
-
.gw-btn:hover {
|
|
502
|
+
.gw-btn:hover { transform: translateY(-1px); box-shadow: var(--gw-shadow); }
|
|
482
503
|
.gw-btn svg { flex: none; width: 16px; height: 16px; }
|
|
483
504
|
.gw-btn--secondary { background: transparent; border-color: var(--gw-line-strong); color: var(--gw-ink); }
|
|
484
505
|
.gw-btn--secondary:hover { background: transparent; border-color: var(--gw-ink); }
|
|
485
506
|
.gw-btn--ghost { background: transparent; color: var(--gw-ink); }
|
|
486
507
|
.gw-btn--ghost:hover { background: var(--gw-bg-soft); }
|
|
508
|
+
.gw-btn:is(.gw-btn--secondary, .gw-btn--ghost):hover { transform: none; box-shadow: none; }
|
|
509
|
+
/* an arrow after the label (→), nudged 3px on hover */
|
|
510
|
+
.gw-btn__arrow { letter-spacing: 0; transition: transform 0.18s ease; }
|
|
511
|
+
.gw-btn:hover .gw-btn__arrow { transform: translateX(3px); }
|
|
512
|
+
|
|
487
513
|
.gw-btn--on-night { background: var(--gw-on-night); color: var(--gw-night); }
|
|
488
514
|
.gw-btn--on-night:hover { background: var(--gw-on-night); opacity: 0.88; }
|
|
489
515
|
.gw-btn--sm { height: 36px; padding: 0 16px; }
|
|
490
516
|
.gw-btn--sm::after { content: ""; position: absolute; top: -6px; right: 0; bottom: -6px; left: 0; }
|
|
491
517
|
.gw-btn--lg { height: 48px; padding: 0 24px; font-size: 16px; }
|
|
492
|
-
.
|
|
518
|
+
/* a button wider than its label keeps the label at its start (as gemboss.ai), unless it is made wide on purpose: full
|
|
519
|
+
width (--block), a phone's row of actions, an inline form */
|
|
520
|
+
.gw-btn--block { display: flex; width: 100%; justify-content: center; }
|
|
493
521
|
.gw-btn:disabled, .gw-btn[aria-disabled="true"] { opacity: 0.48; cursor: not-allowed; pointer-events: none; }
|
|
494
522
|
/* pressed: the ink one step darker (the hover ink, as the dashboard's primary), nothing moves; the frameless variants
|
|
495
523
|
take one more step of tint */
|
|
@@ -712,6 +740,13 @@ h5, h6 { font-size: 16px; font-weight: 600; letter-spacing: 0; }
|
|
|
712
740
|
}
|
|
713
741
|
.gw-window__body:has(> img:only-child) + .gw-window__caption { padding-top: 12px; }
|
|
714
742
|
|
|
743
|
+
/* figure (0.13.0, Gemians): a photo and its caption where a section shows one outside the prose (beside words in a
|
|
744
|
+
split, under a hero's actions): the picture at the card radius, the caption 14px, muted, 12px under it, as a figure
|
|
745
|
+
in .gw-prose. A screen of the product goes in .gw-window instead. */
|
|
746
|
+
.gw-figure > :is(img, video, picture) { display: block; width: 100%; height: auto; border-radius: var(--gw-radius-card); }
|
|
747
|
+
.gw-figure > picture > img { display: block; width: 100%; height: auto; border-radius: inherit; }
|
|
748
|
+
.gw-figure > figcaption { margin-top: 12px; color: var(--gw-muted); font-size: 14px; line-height: 1.5; }
|
|
749
|
+
|
|
715
750
|
/* icon: 20px inline stroke SVG (1.7 to 2px stroke, currentColor) */
|
|
716
751
|
.gw-icon { display: inline-flex; align-items: center; justify-content: center; flex: none; width: 20px; height: 20px; }
|
|
717
752
|
.gw-icon svg { width: 20px; height: 20px; }
|
|
@@ -788,16 +823,21 @@ h5, h6 { font-size: 16px; font-weight: 600; letter-spacing: 0; }
|
|
|
788
823
|
.gw-faq__item[open] > summary::after { transform: rotate(45deg); }
|
|
789
824
|
.gw-faq__item > :not(summary) { margin: 0 0 20px; max-width: 68ch; color: var(--gw-muted); font-size: 16px; }
|
|
790
825
|
|
|
791
|
-
/* touch: every control is at least 44px tall,
|
|
792
|
-
|
|
826
|
+
/* touch: every control is at least 44px tall. A button up to 768px (0.12.0, as gemboss.ai: by the width, not the
|
|
827
|
+
pointer), its label wrapping (and tighter) from 480px down in the page's <main>, so a long one never pushes the page
|
|
828
|
+
sideways (a header or an overlay outside <main> keeps its one line) */
|
|
829
|
+
@media (max-width: 768px) {
|
|
793
830
|
.gw-btn, .gw-btn--sm, .gw-btn--lg {
|
|
794
831
|
height: auto;
|
|
795
832
|
min-height: var(--gw-tap-min);
|
|
796
833
|
padding-block: 8px;
|
|
797
|
-
white-space: normal;
|
|
798
|
-
text-wrap: balance;
|
|
799
834
|
}
|
|
800
835
|
.gw-btn--lg { min-height: 48px; }
|
|
836
|
+
}
|
|
837
|
+
@media (max-width: 480px) {
|
|
838
|
+
:where(main) .gw-btn { white-space: normal; line-height: 1.35; }
|
|
839
|
+
}
|
|
840
|
+
@media (max-width: 768px), (pointer: coarse) {
|
|
801
841
|
:is(a, button, label).gw-chip { min-height: var(--gw-tap-min); }
|
|
802
842
|
.gw-segmented > button { height: auto; min-height: var(--gw-tap-min); padding-block: 8px; white-space: normal; text-wrap: balance; }
|
|
803
843
|
}
|
|
@@ -805,16 +845,50 @@ h5, h6 { font-size: 16px; font-weight: 600; letter-spacing: 0; }
|
|
|
805
845
|
/* header: announcement, a flat 64px bar with one hairline, mega menu, mobile menu up to 1080px.
|
|
806
846
|
Not a floating pill: no radius, no blur, no shadow on the bar. Nothing tucks under it. A brand may choose the one
|
|
807
847
|
other shape, .gw-header--float (an inset card from 1081px, at the end of this file). */
|
|
848
|
+
/* the announcement bar (0.12.0, gemboss.ai's): one sentence on its own ground over the header, the same in both themes
|
|
849
|
+
(system.json color.announce). A small pill may lead it (.gw-announce__tag); its link is light, underlined by a hairline
|
|
850
|
+
that brightens on hover. From 520px down, 12px words and a slimmer bar. */
|
|
808
851
|
.gw-announce {
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
852
|
+
position: relative;
|
|
853
|
+
z-index: 60;
|
|
854
|
+
padding: 12px 16px;
|
|
855
|
+
border-bottom: 1px solid var(--gw-announce-line);
|
|
856
|
+
background: var(--gw-announce-bg);
|
|
857
|
+
color: var(--gw-announce-ink);
|
|
813
858
|
font-size: 13px;
|
|
859
|
+
font-weight: 500;
|
|
814
860
|
line-height: 1.5;
|
|
861
|
+
letter-spacing: 0.005em;
|
|
815
862
|
text-align: center;
|
|
816
863
|
}
|
|
817
|
-
.
|
|
864
|
+
/* 2.5px above and below, as gemboss.ai draws the pill (21.5px tall): the one half pixel in the kit */
|
|
865
|
+
.gw-announce__tag {
|
|
866
|
+
display: inline-block;
|
|
867
|
+
margin-right: 12px;
|
|
868
|
+
padding: 2.5px 8px;
|
|
869
|
+
border-radius: var(--gw-radius-chip);
|
|
870
|
+
background: var(--gw-announce-tag);
|
|
871
|
+
color: var(--gw-announce-tag-ink);
|
|
872
|
+
font-size: 11px;
|
|
873
|
+
font-weight: 700;
|
|
874
|
+
letter-spacing: 0.09em;
|
|
875
|
+
vertical-align: 1px;
|
|
876
|
+
}
|
|
877
|
+
.gw-announce a {
|
|
878
|
+
margin-left: 8px;
|
|
879
|
+
padding-bottom: 2px;
|
|
880
|
+
border-bottom: 1px solid var(--gw-announce-link-line);
|
|
881
|
+
color: var(--gw-announce-link);
|
|
882
|
+
font-weight: 600;
|
|
883
|
+
text-decoration: none;
|
|
884
|
+
white-space: nowrap;
|
|
885
|
+
transition: border-color 0.18s;
|
|
886
|
+
}
|
|
887
|
+
.gw-announce a:hover { border-bottom-color: var(--gw-announce-link); }
|
|
888
|
+
@media (max-width: 520px) {
|
|
889
|
+
.gw-announce { padding: 8px 12px; font-size: 12px; }
|
|
890
|
+
.gw-announce__tag { margin-right: 6px; }
|
|
891
|
+
}
|
|
818
892
|
|
|
819
893
|
.gw-header {
|
|
820
894
|
position: sticky;
|
|
@@ -1474,6 +1548,19 @@ html.is-menu-open .gw-header:has(> .gw-mobile-menu.is-drill) { position: sticky;
|
|
|
1474
1548
|
:root:not([data-theme="light"]) .gw-theme-toggle__moon { display: none; }
|
|
1475
1549
|
}
|
|
1476
1550
|
|
|
1551
|
+
/* ---- 0.13.0: the brand's logo as one drawing (Gemians): the mark and the wordmark in one file, in place of the mark and
|
|
1552
|
+
the name, 26px tall, its width the file's. Its alt is the brand's name. A logo drawn for dark grounds only (a white
|
|
1553
|
+
wordmark) comes as a second file, .gw-brand__logo--dark, right after the first: it shows in dark (the system's or the
|
|
1554
|
+
toggle's) and the first one hides, the toggle icons' rule. One file that reads on both: no --dark. */
|
|
1555
|
+
.gw-brand__logo { display: block; flex: none; width: auto; height: 26px; }
|
|
1556
|
+
.gw-brand__logo--dark { display: none; }
|
|
1557
|
+
:root[data-theme="dark"] .gw-brand__logo--dark { display: block; }
|
|
1558
|
+
:root[data-theme="dark"] .gw-brand__logo:has(+ .gw-brand__logo--dark) { display: none; }
|
|
1559
|
+
@media (prefers-color-scheme: dark) {
|
|
1560
|
+
:root:not([data-theme="light"]) .gw-brand__logo--dark { display: block; }
|
|
1561
|
+
:root:not([data-theme="light"]) .gw-brand__logo:has(+ .gw-brand__logo--dark) { display: none; }
|
|
1562
|
+
}
|
|
1563
|
+
|
|
1477
1564
|
/* footer: brand block, link columns, bottom row. One hairline on top, white like the page. */
|
|
1478
1565
|
.gw-footer {
|
|
1479
1566
|
padding-block: 64px 32px;
|
|
@@ -1740,7 +1827,7 @@ html.is-menu-open .gw-header:has(> .gw-mobile-menu.is-drill) { position: sticky;
|
|
|
1740
1827
|
radial-gradient(420px 320px at 52% 118%, color-mix(in srgb, var(--gw-wash-mint) 10%, transparent), transparent 62%);
|
|
1741
1828
|
}
|
|
1742
1829
|
.gw-hero h1 .gw-dim { display: block; }
|
|
1743
|
-
.gw-hero > .gw-wrap > .gw-window { margin-top: 48px; }
|
|
1830
|
+
.gw-hero > .gw-wrap > :is(.gw-window, .gw-figure) { margin-top: 48px; }
|
|
1744
1831
|
.gw-hero--center { text-align: center; }
|
|
1745
1832
|
.gw-hero--center > .gw-wrap > * { margin-inline: auto; }
|
|
1746
1833
|
.gw-hero--center .gw-actions { justify-content: center; }
|
|
@@ -1753,7 +1840,7 @@ html.is-menu-open .gw-header:has(> .gw-mobile-menu.is-drill) { position: sticky;
|
|
|
1753
1840
|
.gw-hero > .gw-wrap > .gw-window { margin-top: 64px; }
|
|
1754
1841
|
}
|
|
1755
1842
|
@media (max-width: 479px) {
|
|
1756
|
-
:is(.gw-hero, .gw-cta) .gw-actions > .gw-btn { flex: 1 1 100%; }
|
|
1843
|
+
:is(.gw-hero, .gw-cta) .gw-actions > .gw-btn { flex: 1 1 100%; justify-content: center; }
|
|
1757
1844
|
}
|
|
1758
1845
|
|
|
1759
1846
|
/* logos: a proof strip of real logos or wordmarks */
|
|
@@ -1773,7 +1860,7 @@ html.is-menu-open .gw-header:has(> .gw-mobile-menu.is-drill) { position: sticky;
|
|
|
1773
1860
|
.gw-logos img { width: auto; height: 28px; }
|
|
1774
1861
|
|
|
1775
1862
|
/* stats: three or four facts, each with its source */
|
|
1776
|
-
.gw-stats { display: grid; grid-template-columns: minmax(0, 1fr); gap: 24px;
|
|
1863
|
+
.gw-stats { display: grid; grid-template-columns: minmax(0, 1fr); gap: 24px; padding: 0; list-style: none; }
|
|
1777
1864
|
.gw-stats__value { font-size: var(--gw-display-h2); font-weight: 600; letter-spacing: -0.03em; line-height: 1.1; font-variant-numeric: tabular-nums; }
|
|
1778
1865
|
.gw-stats__label { margin-top: 8px; max-width: 28ch; color: var(--gw-muted); font-size: 14px; }
|
|
1779
1866
|
.gw-stats__source { margin-top: 8px; color: var(--gw-muted); font-size: 12px; }
|
|
@@ -1806,7 +1893,6 @@ html.is-menu-open .gw-header:has(> .gw-mobile-menu.is-drill) { position: sticky;
|
|
|
1806
1893
|
display: grid;
|
|
1807
1894
|
grid-template-columns: minmax(0, 1fr);
|
|
1808
1895
|
gap: 32px 24px;
|
|
1809
|
-
margin: 0;
|
|
1810
1896
|
padding: 0;
|
|
1811
1897
|
list-style: none;
|
|
1812
1898
|
counter-reset: gw-step;
|
|
@@ -2238,7 +2324,7 @@ html.is-menu-open .gw-header:has(> .gw-mobile-menu.is-drill) { position: sticky;
|
|
|
2238
2324
|
.gw-card__media first, a .gw-label for the category, the title (its link covers the card, so the card is one target
|
|
2239
2325
|
and the link's name is the title alone), one or two lines of excerpt and a .gw-article-meta row at the foot. One
|
|
2240
2326
|
column on phones, two from 768px, three from 1080px. --compact: one column of rows, no card and no picture. */
|
|
2241
|
-
.gw-post-list { display: grid; grid-template-columns: minmax(0, 1fr); gap: 16px;
|
|
2327
|
+
.gw-post-list { display: grid; grid-template-columns: minmax(0, 1fr); gap: 16px; padding: 0; list-style: none; }
|
|
2242
2328
|
.gw-post-list > li { display: flex; min-width: 0; }
|
|
2243
2329
|
.gw-post { position: relative; display: flex; flex: 1 1 auto; flex-direction: column; min-width: 0; }
|
|
2244
2330
|
.gw-post:hover { border-color: var(--gw-line-strong); }
|
|
@@ -2407,7 +2493,7 @@ html.is-menu-open .gw-header:has(> .gw-mobile-menu.is-drill) { position: sticky;
|
|
|
2407
2493
|
room; below 480px, and in a box too narrow for both, the field and the button each take a full line. */
|
|
2408
2494
|
.gw-form-inline { display: flex; flex-wrap: wrap; gap: 8px; }
|
|
2409
2495
|
.gw-form-inline > :not(.gw-btn) { flex: 999 1 160px; min-width: 0; }
|
|
2410
|
-
.gw-form-inline > .gw-btn { flex: 1 0 auto; }
|
|
2496
|
+
.gw-form-inline > .gw-btn { flex: 1 0 auto; justify-content: center; }
|
|
2411
2497
|
@media (max-width: 479px) {
|
|
2412
2498
|
.gw-form-inline > :not(.gw-btn) { flex-basis: 100%; }
|
|
2413
2499
|
}
|
|
@@ -2454,7 +2540,6 @@ html.is-menu-open .gw-header:has(> .gw-mobile-menu.is-drill) { position: sticky;
|
|
|
2454
2540
|
display: grid;
|
|
2455
2541
|
grid-template-columns: minmax(0, 1fr);
|
|
2456
2542
|
gap: 16px;
|
|
2457
|
-
margin: 0;
|
|
2458
2543
|
padding: 0;
|
|
2459
2544
|
list-style: none;
|
|
2460
2545
|
}
|