fertig 1.0.2 → 1.1.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/CHANGELOG.md +168 -0
- package/README.md +163 -44
- package/fertig.core.min.css +1 -1
- package/fertig.css +303 -84
- package/fertig.min.css +1 -1
- package/package.json +4 -3
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,165 @@ is the token names, the class names (the seven, plus the layout utilities),
|
|
|
6
6
|
and the ARIA attributes the component layer reads — changes to any of those
|
|
7
7
|
are breaking.
|
|
8
8
|
|
|
9
|
+
## [1.1.0] — 2026-08-31
|
|
10
|
+
|
|
11
|
+
A visual refresh and a component-first repositioning. No API breaks — the same
|
|
12
|
+
tokens, classes and attributes — but the default look changes visibly.
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
|
|
16
|
+
- **Named accents.** `data-accent="indigo|sky|sage|clay|plum|gold|slate"` on any
|
|
17
|
+
element retints everything inside it: links, focus rings, filled buttons, the
|
|
18
|
+
caret, the selection. Scoped rather than global, so one section can differ
|
|
19
|
+
from the rest of a page. Each pair is measured — the light tone clears AA as
|
|
20
|
+
link text on paper, the dark tone clears it on the dark ground.
|
|
21
|
+
- **Motion tokens.** `--ease-out`, `--ease-in`, `--ease` and the durations
|
|
22
|
+
`--dur-1` / `--dur-2`. The sheet had been animating with a bare `ease`, which
|
|
23
|
+
is the browser default and the flattest curve available.
|
|
24
|
+
- `--rs`, a small radius for inline chips and code, so they do not inherit the
|
|
25
|
+
larger control radius and read as lozenges.
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
|
|
29
|
+
- **The default accent is indigo**, not the desaturated navy it was. Measured
|
|
30
|
+
6.28:1 as link text on paper and 6.39:1 for a white label on the fill in
|
|
31
|
+
light; 8.72:1 and 10.26:1 in dark. Both sit inside sRGB.
|
|
32
|
+
- **Cards no longer paint a tinted strip behind their header and footer.** A
|
|
33
|
+
filled bar across the top of a card is the old panel-heading pattern and is
|
|
34
|
+
what dated the sheet on sight; a hairline separates just as well and lets the
|
|
35
|
+
card read as one surface.
|
|
36
|
+
- Radii up: `--r` 6px → 9px, `--rw` 10px → 14px. Controls have more room —
|
|
37
|
+
buttons and fields gained roughly a tenth of an em of padding.
|
|
38
|
+
- More things transition, on the named curves: tabs, badges, cards, segmented
|
|
39
|
+
controls and popover items, alongside the controls that already did.
|
|
40
|
+
`:focus-visible` is explicitly excluded — a focus ring has to be there the
|
|
41
|
+
instant focus lands, not fade in after it.
|
|
42
|
+
|
|
43
|
+
### Fixed
|
|
44
|
+
|
|
45
|
+
- The tone bar on `.card[data-tone]` follows the corner radius again. It was an
|
|
46
|
+
inset shadow, which does not track the curve cleanly at the larger radius —
|
|
47
|
+
it read as a detached line with gaps at both top corners. It is a background
|
|
48
|
+
layer now, which the radius clips. The duplicate indicator on
|
|
49
|
+
`.card > header` is gone with it: the filled header used to hide it, and
|
|
50
|
+
without the fill both were painting.
|
|
51
|
+
- Navigation lists. `[data-layout=sidebar]` shipped without any styling for the
|
|
52
|
+
nav inside it, so the obvious markup — a `<menu>` in a `<nav>` — came out as
|
|
53
|
+
a boxed list group. It is navigation now: no rules between items, no bullets,
|
|
54
|
+
and the link fills the row.
|
|
55
|
+
- `aside` and `search` are block landmarks that had no vertical rhythm of their
|
|
56
|
+
own, so whatever followed sat flush against them.
|
|
57
|
+
|
|
58
|
+
### Fixed — audit pass
|
|
59
|
+
|
|
60
|
+
An audit pass. Everything here came out of `docs/known-flaws.md`, which lists
|
|
61
|
+
what was found, what was verified in a browser, and what was left alone on
|
|
62
|
+
purpose.
|
|
63
|
+
|
|
64
|
+
- **The shell survives a framework wrapper.** The page shell was `body > *`, so
|
|
65
|
+
a React, Vue, Svelte or Next app rendering into `<div id="root">` lost the
|
|
66
|
+
measure, the paper surface and the gutters with nothing on screen to say why.
|
|
67
|
+
The shell now also matches the children of a single `#root`, `#app`,
|
|
68
|
+
`#__next` or `[data-fertig]` wrapper. Every added selector sits inside
|
|
69
|
+
`:where()`, so specificity is unchanged.
|
|
70
|
+
- **A floor under the floor.** Every colour token was an unguarded
|
|
71
|
+
`light-dark()`. In an engine without it the tokens were invalid at
|
|
72
|
+
computed-value time, so backgrounds went transparent and colour was
|
|
73
|
+
inherited — a page could land unreadable rather than plain. A
|
|
74
|
+
`@supports not (color: light-dark(…))` block at the end of the layer restates
|
|
75
|
+
the palette in flat sRGB, in both schemes.
|
|
76
|
+
- **`data-size`, `data-variant` and `data-block` are scoped to controls.** As
|
|
77
|
+
bare attribute selectors they restyled any element carrying those very common
|
|
78
|
+
attribute names — a `<span data-size="sm">` picked up button padding.
|
|
79
|
+
- **The focus ring no longer reshapes what it rings.** `:focus-visible` set
|
|
80
|
+
`border-radius: var(--r)`, which is the element's own radius, not the ring's:
|
|
81
|
+
a focused `<dialog>` snapped from `--rw` (14px) to `--r` (9px). Outlines
|
|
82
|
+
already follow the element's corners, so the declaration is simply gone.
|
|
83
|
+
- **`<svg>` stays inline.** It was in the `display: block` rule with `img`,
|
|
84
|
+
`video` and `iframe`, which dropped every inline icon onto its own line.
|
|
85
|
+
- **Toasts can stack.** Two `[popover][data-toast]` elements shared one set of
|
|
86
|
+
corner coordinates and overlapped, and an open popover is in the top layer so
|
|
87
|
+
no ordinary wrapper could stack them. `<div popover="manual"
|
|
88
|
+
data-toast-region>` is now the popover, with a `<div data-toast>` per message.
|
|
89
|
+
- **A selected tab is visible in Windows High Contrast.** Its cue was a
|
|
90
|
+
`box-shadow` that the forced-colors layer removes, and the replacement set
|
|
91
|
+
`border-color` on an element with `border: 0`. It now sets a real
|
|
92
|
+
`border-bottom`.
|
|
93
|
+
- **`--on-ac` survives a custom `--ac` in shipping browsers.** The
|
|
94
|
+
`contrast-color()` guard is real but almost nothing implements it. A relative
|
|
95
|
+
colour branch reaches the same black-or-white decision from the accent's own
|
|
96
|
+
lightness, and has been cross-engine since 2024.
|
|
97
|
+
- **`interpolate-size: allow-keywords` is set on `details`, not `:root`.** It is
|
|
98
|
+
inherited, so the old placement changed how *your* `height: auto` transitions
|
|
99
|
+
behaved as a side effect of animating a disclosure.
|
|
100
|
+
- **Two universal rules narrowed to what the sheet actually styles.**
|
|
101
|
+
`scrollbar-width: thin` no longer thins the page's own scrollbar (a
|
|
102
|
+
target-size problem for imprecise pointers), and `corner-shape: squircle` no
|
|
103
|
+
longer reshapes your components.
|
|
104
|
+
- **`input[type=image]` is a button, not a text field.** It was missing from the
|
|
105
|
+
`:not()` list and got full-width sunken-field treatment.
|
|
106
|
+
- **The tooltip is flow-relative and reachable on touch** — logical inset
|
|
107
|
+
properties with a `:dir(rtl)` offset, and `:active` alongside `:hover`. It is
|
|
108
|
+
still decorative, and now says so in the sheet, the README and the docs.
|
|
109
|
+
- **`a[target=_blank]`** no longer appends an arrow to a link wrapping an image.
|
|
110
|
+
- **Print keeps the footer.** It was hidden along with the toolbar, which drops
|
|
111
|
+
the legal line, the contact and the citations from every printout.
|
|
112
|
+
- **The small variant stays small on touch.** `(pointer: coarse)` forced
|
|
113
|
+
`min-height: 44px` on everything; `data-size="sm"` opts down to 32px, still
|
|
114
|
+
above the 24px WCAG 2.5.8 floor.
|
|
115
|
+
- `package.json`'s size claim, the one string `tools/sizes.py` does not reach.
|
|
116
|
+
|
|
117
|
+
### Changed
|
|
118
|
+
|
|
119
|
+
- **`--a1` / `--a2` are now `--fertig-a1` / `--fertig-a2`.** These are
|
|
120
|
+
`@property` registrations, and a registration is global — it cannot be
|
|
121
|
+
layered, scoped or overridden. Two-character names meant a consumer's own
|
|
122
|
+
`--a1` was silently retyped to `<number>`. The other token names are
|
|
123
|
+
deliberately short and are unchanged; they are ordinary custom properties and
|
|
124
|
+
the documented API.
|
|
125
|
+
|
|
126
|
+
**This stays a minor release**: the prefixed tokens read the bare ones as a
|
|
127
|
+
fallback (`--fertig-a1: var(--a1, .08)`), so a sheet that set `--a1` on
|
|
128
|
+
`:root` — the documented way — keeps working exactly as it did, verified in a
|
|
129
|
+
browser. A *scoped* `--a1` further down the tree does not reach the shadows,
|
|
130
|
+
but it never did: `--sh1` has always been computed on `:root`, so the
|
|
131
|
+
fallback restores the capability that existed, not less. `--a1` itself is no
|
|
132
|
+
longer registered, which is the whole point — nothing of yours gets retyped.
|
|
133
|
+
Prefer the prefixed names in new code.
|
|
134
|
+
|
|
135
|
+
## [1.0.3] — 2026-08-30
|
|
136
|
+
|
|
137
|
+
### Changed
|
|
138
|
+
|
|
139
|
+
- `--mut` lifted from 50%/70% lightness to 47%/73%. The weakest muted pairing
|
|
140
|
+
— on the desktop ground in light, on chrome in dark — was 4.96:1 and 5.99:1,
|
|
141
|
+
a hair over AA; it is 5.65:1 and 6.70:1 now. Not taken to AAA, which would need 41.5%: that
|
|
142
|
+
is close enough to `--fg` that muted text stops reading as secondary at all.
|
|
143
|
+
|
|
144
|
+
### Added
|
|
145
|
+
|
|
146
|
+
- `--nw`, the column the toolbar's contents line up with. It follows `--w`, so
|
|
147
|
+
nothing changes by default, and `<nav class="wide">` re-points it at the wide
|
|
148
|
+
column — an app screen built on `.wide` no longer gets a wordmark floating in
|
|
149
|
+
the middle of the viewport while its content spans the full width.
|
|
150
|
+
|
|
151
|
+
### Fixed
|
|
152
|
+
|
|
153
|
+
- Breadcrumb separators no longer leak into other navigation. The `/` was on
|
|
154
|
+
`nav[aria-label] li + li`, so any labelled `<nav>` containing a `<ul>` — an
|
|
155
|
+
ordinary sidebar — got breadcrumb slashes between its links. Scoped to `ol`,
|
|
156
|
+
matching the layout rule directly above it and the documented markup.
|
|
157
|
+
- A `.grid` no longer collides with the block that follows it. It is a
|
|
158
|
+
block-level container and nothing gave it vertical rhythm. The space is on
|
|
159
|
+
`.grid + *` rather than a margin on `.grid` itself, which would collapse out
|
|
160
|
+
through the top of a padding-less container and open a seam above it.
|
|
161
|
+
- A segmented control (`role="group"`) with four or more buttons no longer
|
|
162
|
+
pushes the page sideways on a narrow screen. It scrolls within its own width
|
|
163
|
+
instead of wrapping, which would break the joined run of corner radii.
|
|
164
|
+
- A `<dl>` with a long value no longer widens the page. The value column was
|
|
165
|
+
a bare `1fr`, whose automatic minimum is its content, so it could not shrink;
|
|
166
|
+
it is `minmax(0, 1fr)` now.
|
|
167
|
+
|
|
9
168
|
## [1.0.2] — 2026-08-30
|
|
10
169
|
|
|
11
170
|
### Fixed
|
|
@@ -28,6 +187,15 @@ Packaging only; the stylesheet is unchanged apart from its version banner.
|
|
|
28
187
|
- `fertig` and `fertig.css` added as keywords: the package is `fertig`, but
|
|
29
188
|
people search npm for the project's name.
|
|
30
189
|
|
|
190
|
+
## [1.0.1] - 2026-08-30
|
|
191
|
+
|
|
192
|
+
### Changed
|
|
193
|
+
|
|
194
|
+
- npm keywords only: added `css-framework`, `lightweight`, `minimalist`, `html`,
|
|
195
|
+
`frontend`, `ui` and `responsive`. `css-framework` is the term the rest of the
|
|
196
|
+
category (Pico, Water.css) registers under, and it was missing. No stylesheet
|
|
197
|
+
changes — the CSS is byte-identical to 1.0.0.
|
|
198
|
+
|
|
31
199
|
## [1.0.0] — 2026-08-30
|
|
32
200
|
|
|
33
201
|
First release. The project and the npm package are `fertig`. The stylesheet
|
package/README.md
CHANGED
|
@@ -1,10 +1,53 @@
|
|
|
1
1
|
# fertig
|
|
2
2
|
|
|
3
|
-
A classless CSS file
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
A classless CSS file that gives you **components**, not just styled elements —
|
|
4
|
+
menus, dialogs, drawers, toasts and tooltips from plain semantic HTML,
|
|
5
|
+
addressed by the ARIA that makes them accessible, and working with JavaScript
|
|
6
|
+
switched off.
|
|
7
|
+
|
|
8
|
+
Link it, write ordinary HTML, and the page is finished.
|
|
9
|
+
|
|
10
|
+
**32.8 KB raw · 8.4 KB gzipped · no build step · no dependencies · no JavaScript.**
|
|
11
|
+
|
|
12
|
+
### What makes it different
|
|
13
|
+
|
|
14
|
+
Surveyed across the eleven most-used classless stylesheets on 2026-08-31
|
|
15
|
+
([working notes](docs/classless-landscape-2026.md)):
|
|
16
|
+
|
|
17
|
+
- **Components addressed by ARIA.** Only one other classless sheet ships a
|
|
18
|
+
single ARIA-addressed component. None ships tabs, a segmented control, or an
|
|
19
|
+
anchored popover menu.
|
|
20
|
+
- **Behaviour without JavaScript.** Others style `<dialog>` and leave the open
|
|
21
|
+
and close to you. Here `popover`, `command` and anchor positioning do it —
|
|
22
|
+
[audited with scripting disabled](#components-that-work-without-javascript).
|
|
23
|
+
- **Modern CSS.** Zero of the eleven use `oklch()`, `light-dark()`, `@layer`,
|
|
24
|
+
`@property`, container queries or anchor positioning. This sheet uses all of
|
|
25
|
+
them.
|
|
26
|
+
- **Cascade-layered.** It lives in `@layer fertig`, so your own unlayered CSS
|
|
27
|
+
wins at any specificity and overriding never needs `!important`. No other
|
|
28
|
+
classless sheet does this.
|
|
29
|
+
- **RTL by construction.** Written in logical properties throughout, not
|
|
30
|
+
patched with `[dir=rtl]` overrides afterwards.
|
|
31
|
+
|
|
32
|
+
It is *not* the smallest — Concrete.css is 1.2 KB gzipped, and most of the
|
|
33
|
+
field is a fraction of this because it styles elements and stops there. Against
|
|
34
|
+
the two classless sheets that also ship a component layer, fertig is the
|
|
35
|
+
lightest: 8.4 KB against matcha's 8.6 KB and Pico classless at 10.2 KB, and the
|
|
36
|
+
only one of the three whose components work without JavaScript. Size is a
|
|
37
|
+
constraint here, not the pitch.
|
|
38
|
+
|
|
39
|
+
## Components that work without JavaScript
|
|
40
|
+
|
|
41
|
+
Audited in a browser with scripting disabled:
|
|
42
|
+
|
|
43
|
+
| | |
|
|
44
|
+
|---|---|
|
|
45
|
+
| Popover menu, dialog, drawer, toast, tooltip, disclosure | **work with no script** |
|
|
46
|
+
| Tabs | **styled only** — switching panels needs ~8 lines of your own |
|
|
6
47
|
|
|
7
|
-
|
|
48
|
+
Tabs are the one gap, and it is deliberate: `aria-selected` must be a real
|
|
49
|
+
attribute for a screen reader to announce the right tab, and CSS cannot set
|
|
50
|
+
attributes. The snippet is in the docs.
|
|
8
51
|
|
|
9
52
|
```html
|
|
10
53
|
<link rel="stylesheet" href="fertig.css">
|
|
@@ -31,8 +74,11 @@ npm install fertig
|
|
|
31
74
|
|
|
32
75
|
## What it is
|
|
33
76
|
|
|
34
|
-
|
|
35
|
-
a
|
|
77
|
+
Opinions, so you don't have to have them: system type, one accent, one
|
|
78
|
+
measure, a window on a desktop. The structure is classic — a title bar, sunken
|
|
79
|
+
fields, raised buttons — and the finish is macOS: vibrancy, hairlines, soft
|
|
80
|
+
radii, the blue focus ring. None of it is a period costume, and none of it is
|
|
81
|
+
a picture of an OS: it is all CSS that every current engine already ships.
|
|
36
82
|
|
|
37
83
|
- **System type, set properly** — 16px on a 1.65 line height across roughly
|
|
38
84
|
seventy characters. Code keeps a monospace face, where it earns its place.
|
|
@@ -58,9 +104,25 @@ Direct children of `<body>` are the containers:
|
|
|
58
104
|
</body>
|
|
59
105
|
```
|
|
60
106
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
107
|
+
One wrapper is fine. React, Vue, Svelte and Next render into a mount node, so
|
|
108
|
+
the shell matches `body`'s children *or* the children of a single `#root`,
|
|
109
|
+
`#app`, `#__next`, or `[data-fertig]` wrapper:
|
|
110
|
+
|
|
111
|
+
```html
|
|
112
|
+
<body>
|
|
113
|
+
<div id="root">
|
|
114
|
+
<nav>…</nav>
|
|
115
|
+
<main>…</main>
|
|
116
|
+
</div>
|
|
117
|
+
</body>
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Deeper than that, or a differently named mount node, and you re-point the shell
|
|
121
|
+
yourself — it is the only place `body >` appears:
|
|
122
|
+
|
|
123
|
+
```css
|
|
124
|
+
#shell > *, #shell > header, #shell > main, #shell > footer { /* … */ }
|
|
125
|
+
```
|
|
64
126
|
|
|
65
127
|
## Components
|
|
66
128
|
|
|
@@ -76,11 +138,25 @@ accessible by construction.
|
|
|
76
138
|
| Breadcrumb | `<nav aria-label="Breadcrumb"><ol>` |
|
|
77
139
|
| Dialog | `<dialog>` — animates in, blurs the page behind; optional `<header>`/`<footer>` pin while the body scrolls |
|
|
78
140
|
| Loading | `aria-busy="true"` (inline spinner) |
|
|
79
|
-
| Tooltip | `data-tooltip="…"` |
|
|
80
|
-
| Button variants | `data-variant="ghost\|link"`, `data-size="sm\|lg"`, `data-icon`, `data-block` |
|
|
141
|
+
| Tooltip | `data-tooltip="…"` — decorative; put the same words in `aria-label` too |
|
|
142
|
+
| Button variants | `data-variant="ghost\|link"`, `data-size="sm\|lg"`, `data-icon`, `data-block` — on controls only, so they cannot catch a `<span data-size>` of yours |
|
|
81
143
|
| Card anatomy | `<header>` / `<footer>` inside `.card`; `<a class="card">` lifts on hover |
|
|
82
144
|
| Tones | `data-tone="ok\|warn\|err"` retints any component |
|
|
83
145
|
|
|
146
|
+
And a second set, added for parity with the component libraries — same rule,
|
|
147
|
+
no classes:
|
|
148
|
+
|
|
149
|
+
| Component | Markup |
|
|
150
|
+
|---|---|
|
|
151
|
+
| Avatar | `data-avatar` on an `<img>` or on initials in a `<span>`; `="sm\|lg"` |
|
|
152
|
+
| Skeleton | `data-skeleton` on the element that is still loading |
|
|
153
|
+
| Sheet / drawer | `<dialog data-side="left\|right\|bottom">` — the same dialog, docked to an edge |
|
|
154
|
+
| Toast | `[popover][data-toast]` — non-modal, parked in a corner. Several at once: `<div popover="manual" data-toast-region>` with a `<div data-toast>` per message |
|
|
155
|
+
| List group | a plain `<menu>` outside a popover becomes a bordered list |
|
|
156
|
+
| Nav menu | a `<menu>` inside a `<nav>` is navigation instead — no rules, no bullets, `aria-current` marks the page |
|
|
157
|
+
| Sidebar layout | `data-layout="sidebar"` on a wrapper of two children; the first sticks |
|
|
158
|
+
| Carousel | `data-carousel` — scroll snapping, with real scroll buttons where they exist |
|
|
159
|
+
|
|
84
160
|
## The seven optional classes
|
|
85
161
|
|
|
86
162
|
`.row` `.grid` `.card` `.badge` `.muted` `.center` `.wide`
|
|
@@ -132,8 +208,13 @@ Override the four tokens you'd actually want to change:
|
|
|
132
208
|
|
|
133
209
|
If you change `--ac`, check `--on-ac` too — that is the text colour sitting on
|
|
134
210
|
the accent, and a light accent needs dark text to stay legible.
|
|
135
|
-
`--up` / `--up2` / `--dn` are the elevation scale, `--a1` /
|
|
136
|
-
|
|
211
|
+
`--up` / `--up2` / `--dn` are the elevation scale, `--fertig-a1` /
|
|
212
|
+
`--fertig-a2` the shadow alphas (these two are `@property` registrations, and
|
|
213
|
+
a registration is global — hence the prefix), `--rw` the window radius, and `--nw` the column the toolbar's contents
|
|
214
|
+
line up with. `--nw` follows `--w`, so nothing moves by default; `<nav
|
|
215
|
+
class="wide">` re-points it at the wide column, which is what an app screen
|
|
216
|
+
built on `.wide` wants so its wordmark doesn't float in the middle of the
|
|
217
|
+
viewport.
|
|
137
218
|
|
|
138
219
|
## Also handled
|
|
139
220
|
|
|
@@ -169,12 +250,15 @@ themes, measured in-browser from the computed token values:
|
|
|
169
250
|
|
|
170
251
|
| Pair | Light | Dark |
|
|
171
252
|
|---|---:|---:|
|
|
172
|
-
| Body text on paper |
|
|
173
|
-
| Muted text on paper |
|
|
174
|
-
| Links on paper |
|
|
175
|
-
| Muted on chrome |
|
|
176
|
-
|
|
|
177
|
-
|
|
|
253
|
+
| Body text on paper | 17.05 | 15.31 |
|
|
254
|
+
| Muted text on paper | 6.73 | 7.41 |
|
|
255
|
+
| Links on paper | 6.38 | 8.97 |
|
|
256
|
+
| Muted on chrome | 6.30 | 6.70 |
|
|
257
|
+
| Muted on the desktop ground | 5.65 | 8.11 |
|
|
258
|
+
| Text on accent | 6.48 | 10.63 |
|
|
259
|
+
| Tones (ok / warn / err) | 4.80–6.55 | 7.63–9.43 |
|
|
260
|
+
|
|
261
|
+
The tightest pair in the sheet is the warn tone on paper in light, at 4.80:1.
|
|
178
262
|
|
|
179
263
|
Motion is gated behind `prefers-reduced-motion`, focus uses a visible ring at
|
|
180
264
|
`:focus-visible`, and the component layer is driven by the same ARIA attributes
|
|
@@ -184,10 +268,10 @@ assistive technology reads.
|
|
|
184
268
|
|
|
185
269
|
| Sheet | Raw | Gzip |
|
|
186
270
|
|---|---:|---:|
|
|
187
|
-
| **fertig** | **
|
|
188
|
-
| Pico 2 classless |
|
|
271
|
+
| **fertig** | **32.8 KB** | **8.4 KB** |
|
|
272
|
+
| Pico 2.1.1 classless | 69.4 KB | 10.1 KB |
|
|
189
273
|
|
|
190
|
-
Measured with `gzip -9
|
|
274
|
+
Measured with `gzip -9`, KB = 1024 bytes for every row. Most of the gap is Pico's full
|
|
191
275
|
colour palette and its base64-SVG control icons; see
|
|
192
276
|
`docs/classless-css-research.md`.
|
|
193
277
|
|
|
@@ -204,17 +288,21 @@ button { background: hotpink } /* wins, no !important needed */
|
|
|
204
288
|
|
|
205
289
|
## Modern CSS, used deliberately
|
|
206
290
|
|
|
207
|
-
Everything past the
|
|
291
|
+
Everything past the floor sits behind `@supports` and is additive:
|
|
208
292
|
`contrast-color()` picks the text colour on your accent so an override cannot
|
|
209
293
|
fail contrast; anchor positioning attaches popover menus to their button;
|
|
210
294
|
`::details-content` with `interpolate-size` animates disclosures open;
|
|
211
295
|
`field-sizing` grows textareas; `corner-shape: squircle` gives continuous
|
|
212
296
|
corners; `text-box: trim-both` sits headings on their cap height; and
|
|
213
|
-
|
|
214
|
-
`
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
297
|
+
`appearance: base-select` styles the dropdown picker itself. Without any of it,
|
|
298
|
+
nothing breaks. Relative colour (`oklch(from …)`) is on that list too, for one
|
|
299
|
+
job only: lightening the filled button on hover in OKLCH. The shadow alphas
|
|
300
|
+
that used to need it are taken with `color-mix` against `transparent` instead —
|
|
301
|
+
pixel-identical, and three years older, which is what keeps Safari 17.5 inside
|
|
302
|
+
the floor. Two things are *not* on the list because they are part of the floor:
|
|
303
|
+
`@property`, which types the shadow alphas so elevation can transition, and
|
|
304
|
+
`container-type` on `.card`, which makes every card a container you can write
|
|
305
|
+
`@container` queries against.
|
|
218
306
|
|
|
219
307
|
It also answers to the OS: `prefers-reduced-motion`,
|
|
220
308
|
`prefers-reduced-transparency`, `prefers-contrast`, `forced-colors`,
|
|
@@ -230,14 +318,29 @@ margins with no stranded lines.
|
|
|
230
318
|
|
|
231
319
|
## Browser support
|
|
232
320
|
|
|
233
|
-
The
|
|
234
|
-
|
|
235
|
-
polyfills, no fallback build.
|
|
236
|
-
`@
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
321
|
+
The two-year window is on *browsers*, not on CSS. fertig runs in anything
|
|
322
|
+
released since August 2024 and carries nothing for the ones before it — no
|
|
323
|
+
vendor prefixes, no polyfills, no fallback build. The CSS it uses is mostly
|
|
324
|
+
older than that: `@layer` has been cross-engine since 2022, `oklch()` and
|
|
325
|
+
`color-mix()` since 2023, `light-dark()` since May 2024. The newest thing it
|
|
326
|
+
*requires* is `@starting-style`, cross-engine since August 2024 — nothing it
|
|
327
|
+
needs shipped inside the last two years.
|
|
328
|
+
|
|
329
|
+
| Engine | Minimum | Set by |
|
|
330
|
+
|---|---|---|
|
|
331
|
+
| Chrome / Edge | **123** | `light-dark()` |
|
|
332
|
+
| Safari | **17.5** | `light-dark()`, `@starting-style`, `text-wrap: balance` |
|
|
333
|
+
| Firefox | **129** | `@starting-style`, `transition-behavior` |
|
|
334
|
+
|
|
335
|
+
No component needs more than that floor — anything a component would *like* to
|
|
336
|
+
have it asks for through `@supports`. Anchor positioning, for instance, is
|
|
337
|
+
gated; without it `[popover]` menus centre on screen instead of sitting under
|
|
338
|
+
their button. Below the floor everything degrades to unstyled-but-readable
|
|
339
|
+
HTML.
|
|
340
|
+
|
|
341
|
+
Per-component and per-enhancement version tables, with the shipping dates
|
|
342
|
+
behind them, are in [`docs/browser-support-research.md`](docs/browser-support-research.md)
|
|
343
|
+
and on the [docs site](https://moji2002.github.io/fertig/docs.html#support).
|
|
241
344
|
|
|
242
345
|
## Development
|
|
243
346
|
|
|
@@ -250,22 +353,38 @@ npm run build # regenerate fertig.min.css and print sizes
|
|
|
250
353
|
|
|
251
354
|
| Build | Raw | Gzip | |
|
|
252
355
|
|---|---:|---:|---|
|
|
253
|
-
| `fertig.min.css` |
|
|
254
|
-
| `fertig.core.min.css` |
|
|
356
|
+
| `fertig.min.css` | 32.8 KB | 8.4 KB | everything |
|
|
357
|
+
| `fertig.core.min.css` | 25.1 KB | 6.9 KB | without the ARIA component layer |
|
|
255
358
|
|
|
256
|
-
Dropping the component layer saves
|
|
359
|
+
Dropping the component layer saves 1.4 KB gzipped — worth knowing, rarely worth
|
|
257
360
|
doing. The weight is in the element coverage and forms, not the components.
|
|
258
361
|
|
|
259
362
|
## Files
|
|
260
363
|
|
|
364
|
+
The sheet:
|
|
365
|
+
|
|
261
366
|
- `fertig.css` — source, commented
|
|
262
367
|
- `fertig.min.css` — minified, what you ship
|
|
263
|
-
- `
|
|
264
|
-
- `blocks.html` — ready-to-use markup blocks (16 of them)
|
|
265
|
-
- `llms.txt` — machine-readable summary for LLMs, per llmstxt.org
|
|
266
|
-
- `docs.html` — documentation
|
|
267
|
-
- `app.html` — a full product screen built with no page CSS at all
|
|
368
|
+
- `fertig.core.min.css` — the same without the ARIA component layer
|
|
268
369
|
- `build.js` — minifier and size report
|
|
370
|
+
|
|
371
|
+
The site:
|
|
372
|
+
|
|
373
|
+
- `index.html` — landing page, with a live customiser that writes the token
|
|
374
|
+
block for you
|
|
375
|
+
- `docs.html` — documentation
|
|
376
|
+
- `blocks.html` — ready-to-use markup blocks (16 of them); the code shown is
|
|
377
|
+
generated from the live preview, so it cannot drift
|
|
378
|
+
- `app.html`, `app-invoice.html` — full product screens built with no page CSS
|
|
379
|
+
at all
|
|
380
|
+
- `templates/` — four whole pages: `dashboard`, `article`, `pricing`, `signin`
|
|
381
|
+
- `site.css`, `site.js`, `icons.svg`, `favicon.svg` — the site's own chrome,
|
|
382
|
+
none of it part of the sheet
|
|
383
|
+
|
|
384
|
+
Everything else:
|
|
385
|
+
|
|
386
|
+
- `llms.txt` — machine-readable summary for LLMs, per llmstxt.org
|
|
387
|
+
- `CHANGELOG.md` — what changed and why, per release
|
|
269
388
|
- `docs/classless-css-research.md` — the research behind the decisions
|
|
270
389
|
|
|
271
390
|
## License
|
package/fertig.core.min.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
/*! fertig v1.0.2 — a classless CSS stylesheet. MIT */@property --a1{syntax:"<number>";inherits:true;initial-value:.08}@property --a2{syntax:"<number>";inherits:true;initial-value:.06}@layer fertig,fertig-a11y;@layer fertig{:root{color-scheme:light dark;accent-color:var(--ac);caret-color:var(--ac);--f:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;--fm:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace;--w:38rem;--r:6px;--rw:10px;--stone-100:oklch(97.5% .004 75);--stone-300:oklch(91% .006 75);--stone-500:oklch(72% .008 75);--stone-700:oklch(47% .009 75);--stone-900:oklch(26% .008 75);--sage-100:oklch(96% .022 155);--sage-300:oklch(87% .042 155);--sage-500:oklch(66% .058 155);--sage-700:oklch(47% .055 155);--sage-900:oklch(29% .038 155);--sky-100:oklch(96% .022 240);--sky-300:oklch(87% .045 240);--sky-500:oklch(64% .085 245);--sky-700:oklch(48% .095 250);--sky-900:oklch(30% .06 250);--clay-100:oklch(96% .022 45);--clay-300:oklch(88% .045 45);--clay-500:oklch(68% .085 45);--clay-700:oklch(50% .09 40);--clay-900:oklch(31% .055 40);--plum-100:oklch(96% .02 320);--plum-300:oklch(88% .038 320);--plum-500:oklch(66% .06 320);--plum-700:oklch(47% .065 320);--plum-900:oklch(29% .042 320);--gold-100:oklch(96.5% .028 90);--gold-300:oklch(89% .055 88);--gold-500:oklch(74% .085 85);--gold-700:oklch(55% .085 80);--gold-900:oklch(33% .05 80);--bg:light-dark(oklch(93.5% .006 75),oklch(16% .006 75));--el:light-dark(oklch(99.4% .002 75),oklch(21% .006 75));--face:light-dark(oklch(97.2% .005 75),oklch(25% .007 75));--fg:light-dark(oklch(22% .008 75),oklch(95% .004 75));--mut:light-dark(oklch(50% .009 75),oklch(70% .008 75));--bd:light-dark(oklch(22% .008 75 / .13),oklch(95% .004 75 / .13));--tb:light-dark(oklch(97.2% .005 75 / .85),oklch(25% .007 75 / .85));--ac:light-dark(var(--sky-700),oklch(78% .085 245));--on-ac:light-dark(#fff,#06121f);--sh:oklch(23.1% .007 286);--a1:.08;--a2:.06;--sh1:oklch(from var(--sh) l c h / var(--a1));--sh2:oklch(from var(--sh) l c h / var(--a2));--up:0 1px 1px var(--sh1);--up2:0 1px 2px var(--sh1),0 6px 16px -6px var(--sh2);--dn:inset 0 1px 2px oklch(from var(--sh) l c h / .08);--caps:.74em/1.4 var(--f)}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--a1:.5;--a2:.45}}@supports (color:contrast-color(red)){:root{--on-ac:contrast-color(var(--ac))}}[data-theme=light]{color-scheme:light;--a1:.08;--a2:.06}[data-theme=dark]{color-scheme:dark;--a1:.5;--a2:.45}*,::before,::after{box-sizing:border-box}html{font:16px/1.65 var(--f);-webkit-text-size-adjust:100%;tab-size:2}body{margin:0;background:var(--bg);color:var(--fg);overflow-wrap:break-word;font-variant-numeric:slashed-zero tabular-nums}::selection{background:color-mix(in srgb,var(--ac) 28%,transparent)}:focus-visible{outline:3px solid color-mix(in srgb,var(--ac) 45%,transparent);outline-offset:1px;border-radius:var(--r)}img,svg,video,iframe{display:block;max-width:100%;height:auto}img,video{border-radius:var(--r);box-shadow:var(--up2)}body>*{max-width:var(--w);margin-inline:auto;padding-inline:1.9rem}body>header,body>main,body>footer{background:var(--el);border-inline:1px solid var(--bd)}body>header{padding-block:2.4rem .8rem}body>main{padding-bottom:2.8rem}body>footer{padding-block:1.2rem 2rem;color:var(--mut);font-size:.85em;border-top:1px solid var(--bd);border-bottom:1px solid var(--bd);border-radius:0 0 var(--rw) var(--rw);margin-bottom:2.5rem;box-shadow:0 18px 30px -22px oklch(from var(--sh) l c h / .5)}body>nav{position:sticky;top:0;z-index:9;max-width:none;padding-inline:max(1.9rem,calc(50% - var(--w) / 2 + 1.9rem),env(safe-area-inset-left),env(safe-area-inset-right));display:flex;flex-wrap:wrap;gap:1.1rem;align-items:center;padding-block:calc(.6rem + env(safe-area-inset-top,0px)) .6rem;background:var(--tb);color:var(--fg);backdrop-filter:saturate(180%) blur(20px);border-bottom:1px solid var(--bd);font-size:.92em}body>nav a{color:var(--fg);text-decoration:none;opacity:.75}body>nav a:hover{opacity:1}body>nav:is(strong,b) a{opacity:1}body>nav ul{display:flex;flex-wrap:wrap;gap:1.1rem;list-style:none;padding:0;margin:0;flex:1}h1,h2,h3,h4,h5,h6{line-height:1.3;margin:1.4rem 0 .7rem;text-wrap:balance}h1{font-size:1.55rem;letter-spacing:-.015em}h2{font-size:1.25rem;letter-spacing:-.01em;margin-top:2.4rem}h3{font-size:1.08rem;margin-top:1.9rem}h4{font-size:1rem}h5,h6{font:700 var(--caps);text-transform:uppercase;letter-spacing:.1em;color:var(--mut)}:is(h1,h2,h3,h4,h5,h6):first-child{margin-top:0}@supports (text-box:trim-both cap alphabetic){h1,h2,h3,h4{text-box:trim-both cap alphabetic}}:is(section,article) +:is(section,article){margin-top:2.8rem}p,ul,ol,dl,pre,blockquote,table,figure,details,fieldset,hr{margin:1.1rem 0}p{text-wrap:pretty}a{color:var(--ac);text-underline-offset:3px;text-decoration-thickness:1px}a:hover{text-decoration-thickness:2px}small{font-size:.85em;color:var(--mut)}hr{border:0;border-top:1px solid var(--bd);margin:2.2rem 0}mark{background:light-dark(#ffe58f,#5c4a15);color:inherit;border-radius:3px;padding:0 .15em}abbr[title]{text-decoration:underline dotted;cursor:help}blockquote{border-inline-start:2px solid var(--bd);padding-block:.15rem;padding-inline:1.2rem 0;color:var(--mut)}ul,ol{padding-inline-start:1.5rem}li::marker{color:var(--mut)}dl{display:grid;grid-template-columns:max-content 1fr;gap:.35rem 1rem}dt{color:var(--mut)}dd{margin:0}figcaption{font-size:.85em;color:var(--mut);text-align:center}code,kbd,samp,pre{font-family:var(--fm);font-size:.9em}:not(pre)>code,samp{background:var(--face);border:1px solid var(--bd);border-radius:var(--r);padding:.08em .35em}kbd{background:var(--face);border:1px solid var(--bd);border-bottom-width:2px;border-radius:var(--r);padding:.08em .4em;box-shadow:var(--up)}pre{background:var(--face);border:1px solid var(--bd);border-radius:var(--r);padding:1rem;overflow-x:auto}pre code{background:none;border:0;padding:0;font-size:1em}:root{--syn-comment:light-dark(#6b7280,#8b949e);--syn-key:light-dark(#7c3aed,#c4a7fb);--syn-str:light-dark(#15803d,#7ee787);--syn-num:light-dark(#b45309,#f0b866);--syn-fn:light-dark(#1d4ed8,#93c5fd);--syn-attr:light-dark(#b91c1c,#ff9492)}:is(.hljs-comment,.hljs-quote,.token.comment,.token.prolog,.token.doctype){color:var(--syn-comment);font-style:italic}:is(.hljs-keyword,.hljs-selector-tag,.hljs-literal,.hljs-type,.hljs-built_in,.token.keyword,.token.atrule,.token.rule,.token.important,.token.selector){color:var(--syn-key)}:is(.hljs-string,.hljs-meta-string,.token.string,.token.attr-value,.token.char){color:var(--syn-str)}:is(.hljs-number,.hljs-symbol,.hljs-bullet,.token.number,.token.boolean,.token.constant,.token.unit){color:var(--syn-num)}:is(.hljs-title,.hljs-name,.hljs-section,.hljs-function,.token.tag,.token.function,.token.class-name){color:var(--syn-fn)}:is(.hljs-attr,.hljs-attribute,.hljs-variable,.hljs-template-variable,.token.attr-name,.token.property,.token.variable){color:var(--syn-attr)}:is(.hljs-punctuation,.hljs-operator,.token.punctuation,.token.operator){color:var(--mut)}:is(.hljs-emphasis,.token.italic){font-style:italic}:is(.hljs-strong,.token.bold){font-weight:700}:is(.hljs-deletion,.token.deleted){color:light-dark(#c0392b,#ff6b6b)}:is(.hljs-addition,.token.inserted){color:light-dark(#15803d,#7ee787)}table{width:100%;border-collapse:collapse;font-size:.92em}th,td{border-bottom:1px solid var(--bd);padding-block:.55rem;padding-inline:0 .7rem;text-align:start}th:last-child,td:last-child{padding-inline-end:0}thead th{border-bottom:1px solid color-mix(in srgb,var(--fg) 45%,transparent);font:700 var(--caps);text-transform:uppercase;letter-spacing:.09em;color:var(--mut);padding-bottom:.4rem}tbody tr:last-child td{border-bottom:0}tfoot td{font-weight:700;border-top:1px solid var(--bd);border-bottom:0}:is(th,td)[align=right]{text-align:right}:is(th,td)[align=center]{text-align:center}tbody tr:hover{background:var(--face)}@media (width <= 40rem){table{display:block;overflow-x:auto;overscroll-behavior-x:contain}}caption{text-align:start;color:var(--mut);font-size:.85em;padding-bottom:.35rem}button,input,select,textarea{font:inherit;color:inherit}label{display:block;font-size:.85em;color:var(--mut)}label:has(input){font-size:1rem;color:var(--fg)}:is(input,select,textarea) + label{margin-top:.9rem}textarea{width:100%;min-height:5rem;resize:vertical}@supports (field-sizing:content){textarea{field-sizing:content;max-height:24rem}}input:not([type=checkbox],[type=radio],[type=range],[type=color],[type=file],[type=submit],[type=button],[type=reset]),select,textarea{display:block;width:100%;padding:.4em .6em;background:var(--el);border:1px solid var(--bd);border-radius:var(--r);box-shadow:var(--dn)}select{appearance:none;padding-inline-end:2.2rem;background-image:linear-gradient(45deg,transparent 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,transparent 50%);background-position:calc(100% - 17px) 55%,calc(100% - 12.5px) 55%;background-size:5px 5px;background-repeat:no-repeat}select:dir(rtl){background-position:12.5px 55%,17px 55%}select[multiple]{background-image:none;padding-inline-end:.6em}@supports (appearance:base-select){select,::picker(select){appearance:base-select}select{display:flex;align-items:center;justify-content:space-between;gap:.6em;background-image:none;padding-inline-end:.7em}select::picker-icon{content:"";inline-size:.45em;block-size:.45em;flex:none;border:solid currentColor;border-width:0 1px 1px 0;rotate:45deg;translate:0 -.15em;opacity:.7;transition:rotate .15s ease,translate .15s ease}select:open::picker-icon{rotate:225deg;translate:0 .1em}::picker(select){min-width:anchor-size(width);border:1px solid var(--bd);border-radius:var(--r);padding:.3rem;background:var(--el);margin-block-start:.35rem;box-shadow:var(--up2),0 20px 40px -14px oklch(from var(--sh) l c h / .4)}option{display:flex;align-items:center;gap:.5em;padding:.4em .6em;border-radius:calc(var(--r) - 2px)}option:hover{background:var(--face)}option:checked{background:var(--ac);color:var(--on-ac)}option::checkmark{order:1;margin-inline-start:auto;content:"✓"}}:is(input,select,textarea):hover:not(:disabled){border-color:color-mix(in srgb,var(--fg) 25%,transparent)}:is(input,select,textarea):focus-visible{border-color:var(--ac)}input[type=checkbox],input[type=radio]{width:1.15em;height:1.15em;margin:0 .45em 0 0;vertical-align:-.18em}label:has(input[type=checkbox]),label:has(input[type=radio]){line-height:1.9}input[type=range]{width:100%;height:1.15em}::placeholder{color:var(--mut)}@supports selector(::spelling-error){::spelling-error{text-decoration:wavy underline light-dark(#c0392b,#ff6b6b)}::grammar-error{text-decoration:wavy underline light-dark(#9a6700,#d29922)}}:is(input,textarea):read-only:not(:disabled){background:var(--face);cursor:default}label:has(+:required)::after,label:has(:required)::after{content:" *";color:var(--ac)}input:autofill,input:autofill:hover,input:autofill:focus{-webkit-text-fill-color:var(--fg);box-shadow:var(--dn),inset 0 0 0 100px var(--el);caret-color:var(--ac)}:disabled{color:var(--mut);cursor:not-allowed;box-shadow:none}fieldset{border:1px solid var(--bd);border-radius:var(--r);padding:.9rem 1rem 1rem;background:var(--face)}fieldset:focus-within{border-color:color-mix(in srgb,var(--ac) 45%,var(--bd))}legend{float:left;width:100%;margin-bottom:.8rem;padding:0 0 .6rem;border-bottom:1px solid var(--bd);font-size:.95em;font-weight:700;color:var(--fg)}legend + *{clear:left}button,[type=submit],[type=button],[type=reset],:where(a.primary,a[role=button]),::file-selector-button{display:inline-block;text-decoration:none;text-align:center;padding:.38em 1.1em;background:var(--el);color:var(--fg);cursor:pointer;border:1px solid var(--bd);border-radius:var(--r);box-shadow:var(--up);font:inherit;min-width:5rem}:is(button,[type=submit],[type=button],[type=reset],a.primary,a[role=button]):hover:not(:disabled){background:var(--face)}:is(button,[type=submit],[type=button],[type=reset],a.primary,a[role=button]):active:not(:disabled){box-shadow:var(--dn);translate:0 .5px}[type=submit],.primary{background:var(--ac);border-color:transparent;color:var(--on-ac)}:is([type=submit],.primary,a.primary):hover:not(:disabled){background:oklch(from var(--ac) calc(l + .05) c h)}[data-size=sm]{padding:.2em .7em;font-size:.85em;min-width:0}[data-size=lg]{padding:.55em 1.5em;font-size:1.05em}button[data-icon]{min-width:0;padding:.38em .62em;line-height:1}[data-block]{display:block;width:100%;min-width:0}[data-variant=ghost]{background:none;border-color:transparent;box-shadow:none}[data-variant=ghost]:hover:not(:disabled){background:var(--face);border-color:var(--bd)}[data-variant=link]{background:none;border:0;box-shadow:none;min-width:0;padding-inline:.2em;color:var(--ac);text-decoration:underline;text-underline-offset:3px}[data-variant=link]:hover:not(:disabled){background:none;text-decoration-thickness:2px}button[aria-pressed=true]{background:var(--face);color:var(--ac);font-weight:700}button[aria-pressed=true]:hover:not(:disabled){background:color-mix(in srgb,var(--fg) 7%,var(--face))}:is([type=submit],.primary){box-shadow:var(--up),inset 0 1px 0 light-dark(#fff3,#ffffff26)}:is([type=submit],.primary):active:not(:disabled){box-shadow:inset 0 1px 3px #0006}@supports (corner-shape:squircle){*{corner-shape:squircle}}details{border:1px solid var(--bd);border-radius:var(--r);padding:.7rem 1.1rem;background:var(--el)}summary{cursor:pointer;font-weight:700;list-style:none}summary::before{content:"▸ ";color:var(--mut)}details[open]>summary::before{content:"▾ "}details[open]>summary{margin-bottom:.6rem}dialog{background:var(--el);color:var(--fg);border:1px solid var(--bd);border-radius:var(--rw);padding:1.4rem;max-width:min(30rem,92dvw);box-shadow:0 32px 64px -16px oklch(from var(--sh) l c h / .45)}dialog>:last-child:not(footer){margin-bottom:0}dialog,[popover]{overscroll-behavior:contain}dialog::backdrop{background:oklch(from var(--sh) l c h / .35);backdrop-filter:blur(3px)}dialog:has(>:is(header,footer)){max-block-size:min(44rem,85dvh);overflow:auto}dialog>:is(header,footer){position:sticky;z-index:1;margin-inline:-1.4rem;padding:.7rem 1.4rem;background:var(--el)}dialog>header{inset-block-start:-1.4rem;margin-block:-1.4rem 1rem;font-weight:700;border-bottom:1px solid var(--bd);border-radius:var(--rw) var(--rw) 0 0}dialog>header>:is(h1,h2,h3,h4,p){margin:0;font-size:1.05rem}dialog>footer{inset-block-end:-1.4rem;margin-block:1rem -1.4rem;border-top:1px solid var(--bd);border-radius:0 0 var(--rw) var(--rw);display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;justify-content:flex-end}dialog>footer>:is(p,span):first-child{margin:0;margin-inline-end:auto;color:var(--mut)}@media (prefers-reduced-motion:no-preference) and (update:fast){dialog,dialog::backdrop{transition:opacity .2s,translate .2s,display .2s allow-discrete,overlay .2s allow-discrete}dialog{opacity:0;translate:0 10px}dialog[open]{opacity:1;translate:0}dialog::backdrop{opacity:0}dialog[open]::backdrop{opacity:1}@starting-style{dialog[open]{opacity:0;translate:0 10px}}@starting-style{dialog[open]::backdrop{opacity:0}}[popover]{opacity:0;translate:0 -4px;transition:opacity .13s,translate .13s,display .13s allow-discrete,overlay .13s allow-discrete}[popover]:popover-open{opacity:1;translate:0}@starting-style{[popover]:popover-open{opacity:0;translate:0 -4px}}}search{display:block}::target-text{background:color-mix(in srgb,var(--ac) 28%,transparent)}aside{border:1px solid var(--bd);border-inline-start:3px solid var(--ac);border-radius:var(--r);border-start-start-radius:0;border-end-start-radius:0;background:var(--el);padding:.7rem 1.1rem}progress{width:100%;height:.5rem;border:0;border-radius:calc(infinity * 1px);background:var(--face)}progress::-webkit-progress-bar{background:var(--face);border-radius:calc(infinity * 1px)}progress::-webkit-progress-value{background:var(--ac);border-radius:calc(infinity * 1px)}progress::-moz-progress-bar{background:var(--ac);border-radius:calc(infinity * 1px)}@supports selector(::details-content){@media (prefers-reduced-motion:no-preference) and (update:fast){:root{interpolate-size:allow-keywords}details::details-content{block-size:0;overflow:clip;transition:block-size .28s ease,content-visibility .28s allow-discrete}details[open]::details-content{block-size:auto}}}.muted{color:var(--mut)}.center{text-align:center}.wide{max-width:66rem}.row{display:flex;flex-wrap:wrap;gap:.7rem;align-items:center}.row:is(input:not([type=checkbox],[type=radio]),textarea){width:auto;flex:1 1 10rem;min-width:0}.row select{width:auto;flex:0 1 auto;min-width:0}.row:is(progress,meter){width:auto;flex:1 1 6rem}.row>label{flex:none;margin-top:0}.grid{display:grid;gap:.9rem;grid-template-columns:repeat(auto-fit,minmax(11rem,1fr))}.card{container-type:inline-size;border:1px solid var(--bd);border-radius:var(--r);padding:.9rem;background:var(--el);box-shadow:var(--up2);display:flex;flex-direction:column;gap:.85rem}.card>*{margin-block:0}.flex{display:flex}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.flex-1{flex:1;min-width:0}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.items-start{align-items:start}.items-center{align-items:center}.items-end{align-items:end}.justify-start{justify-content:start}.justify-center{justify-content:center}.justify-end{justify-content:end}.justify-between{justify-content:space-between}.gap-0{gap:0}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.mx-auto{margin-inline:auto}.ms-auto{margin-inline-start:auto}.me-auto{margin-inline-end:auto}.w-full{width:100%}.max-w-xs{max-inline-size:20rem}.max-w-sm{max-inline-size:24rem}.max-w-md{max-inline-size:28rem}.max-w-lg{max-inline-size:32rem}.max-w-xl{max-inline-size:36rem}.max-w-2xl{max-inline-size:42rem}.max-w-3xl{max-inline-size:48rem}.max-w-4xl{max-inline-size:56rem}.max-w-5xl{max-inline-size:64rem}.max-w-6xl{max-inline-size:72rem}.max-w-7xl{max-inline-size:80rem}.max-w-full{max-inline-size:100%}.max-w-none{max-inline-size:none}.max-w-prose{max-inline-size:var(--w)}.hidden{display:none}.badge{border:1px solid var(--bd);border-radius:calc(infinity * 1px);background:var(--face);padding:.1em .6em;font:700 var(--caps);color:var(--mut)}.card>:is(header,footer){margin-inline:-.9rem;padding:.55rem .9rem;background:var(--face)}.card>header{margin-top:-.9rem;font-weight:700;border-bottom:1px solid var(--bd);border-radius:var(--r) var(--r) 0 0}.card>footer{margin-top:auto;margin-bottom:-.9rem;color:var(--mut);font-size:.85em;border-top:1px solid var(--bd);border-radius:0 0 var(--r) var(--r)}.card>:is(img,video):first-child{align-self:stretch;width:auto;max-width:none;margin:-.9rem -.9rem 0;aspect-ratio:16 / 9;object-fit:cover;border:0;border-radius:var(--r) var(--r) 0 0;box-shadow:none}.card[data-tone]{box-shadow:var(--up2),inset 0 2px 0 var(--ac)}.card[data-tone]>header:first-child{box-shadow:inset 0 2px 0 var(--ac)}:is(a,button).card{display:flex;width:100%;text-align:start;color:inherit;text-decoration:none;font:inherit}:is(a,button).card:hover:not(:disabled){border-color:color-mix(in srgb,var(--ac) 45%,var(--bd));box-shadow:var(--up2),0 12px 26px -14px oklch(from var(--sh) l c h / .4);translate:0 -2px}:is(a,button).card:active:not(:disabled){translate:0 0}[hidden]:not([hidden=until-found]){display:none}@media (prefers-reduced-motion:no-preference) and (update:fast){html{scroll-behavior:smooth}}:target{scroll-margin-top:4rem}:is(h1,h2,h3,h4):target{background:color-mix(in srgb,var(--ac) 12%,transparent)}a[target=_blank]::after{content:" ↗";font-size:.85em;opacity:.6}a:has(>img),a:has(>code){text-decoration:none}sup,sub{line-height:0;font-size:.75em}q{quotes:"“" "”" "‘" "’"}dfn{font-style:normal;font-weight:700}ins{text-decoration:underline;text-decoration-style:wavy;text-decoration-color:var(--ac)}del{color:var(--mut)}address{font-style:normal;color:var(--mut)}hgroup>*{margin:0}hgroup>p{color:var(--mut)}output{font-weight:700}meter{width:100%;height:.5rem}optgroup{font-weight:700;color:var(--mut)}::file-selector-button{margin-inline-end:.8em}::file-selector-button:hover{background:var(--face)}input:user-invalid,textarea:user-invalid{border-color:light-dark(#c0392b,#ff6b6b)}input:user-invalid + small{color:light-dark(#c0392b,#ff6b6b)}summary:hover{color:var(--ac)}*{scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--fg) 25%,transparent) transparent}@page{margin:2cm}@media print{:root{--bg:#fff;--el:#fff;--fg:#000;--bd:#999}body>nav,body>footer{display:none}body>*{border:0;max-width:none}p,blockquote,li{orphans:3;widows:3}a[href^="http"]::after{content:" (" attr(href) ")";font-size:.8em;color:#555}pre,table,figure,details,tr,img{break-inside:avoid}h1,h2,h3,h4{break-after:avoid}}@media (pointer:coarse){button,[type=submit],[type=button],[type=reset],:where(a.primary,a[role=button]),select,summary,input:not([type=checkbox],[type=radio],[type=range],[type=color],[type=file]){min-height:44px}input[type=checkbox],input[type=radio]{width:1.4em;height:1.4em}}@media (inverted-colors:inverted){img,video,iframe{filter:invert(1) hue-rotate(180deg)}}@media (color-gamut:p3){@supports (color:oklch(60% .2 250)){:root{--ac:light-dark(oklch(52% .21 258),oklch(76% .15 258))}}}:root{text-spacing-trim:trim-start;text-autospace:normal}@media (prefers-reduced-transparency:reduce){body>nav{background:var(--face);backdrop-filter:none}dialog::backdrop{backdrop-filter:none}}@media (prefers-contrast:more){:root{--bd:light-dark(#00000059,#ffffff6b);--mut:light-dark(#45454a,#c6c6ce)}}@media (prefers-reduced-motion:no-preference) and (update:fast){a,button,input,select,textarea,summary,tr,[type=submit],[type=button],[type=reset]{transition:box-shadow .15s,background-color .15s,border-color .15s,translate .08s}}}@layer fertig-a11y{@media (forced-colors:active){*{box-shadow:none}button,[type=submit],[type=button],[type=reset],input,select,textarea,.card,.badge,details,dialog,[popover],fieldset,table{border:1px solid CanvasText}[role=tab][aria-selected=true],button[aria-pressed=true]{border-color:Highlight}}}
|
|
1
|
+
/*! fertig v1.1.0 — a classless CSS stylesheet. MIT */@property --fertig-a1{syntax:"<number>";inherits:true;initial-value:.08}@property --fertig-a2{syntax:"<number>";inherits:true;initial-value:.06}@layer fertig,fertig-a11y;@layer fertig{:root{color-scheme:light dark;accent-color:var(--ac);caret-color:var(--ac);--f:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;--fm:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace;--w:38rem;--r:9px;--rs:5px;--rw:14px;--stone-100:oklch(97.5% .004 75);--stone-300:oklch(91% .006 75);--stone-500:oklch(72% .008 75);--stone-700:oklch(47% .009 75);--stone-900:oklch(26% .008 75);--sage-100:oklch(96% .022 155);--sage-300:oklch(87% .042 155);--sage-500:oklch(66% .058 155);--sage-700:oklch(47% .055 155);--sage-900:oklch(29% .038 155);--sky-100:oklch(96% .022 240);--sky-300:oklch(87% .045 240);--sky-500:oklch(64% .085 245);--sky-700:oklch(48% .095 250);--sky-900:oklch(30% .06 250);--clay-100:oklch(96% .022 45);--clay-300:oklch(88% .045 45);--clay-500:oklch(68% .085 45);--clay-700:oklch(50% .09 40);--clay-900:oklch(31% .055 40);--plum-100:oklch(96% .02 320);--plum-300:oklch(88% .038 320);--plum-500:oklch(66% .06 320);--plum-700:oklch(47% .065 320);--plum-900:oklch(29% .042 320);--gold-100:oklch(96.5% .028 90);--gold-300:oklch(89% .055 88);--gold-500:oklch(74% .085 85);--gold-700:oklch(55% .085 80);--gold-900:oklch(33% .05 80);--bg:light-dark(oklch(93.5% .006 75),oklch(16% .006 75));--el:light-dark(oklch(99.4% .002 75),oklch(21% .006 75));--face:light-dark(oklch(97.2% .005 75),oklch(25% .007 75));--fg:light-dark(oklch(22% .008 75),oklch(95% .004 75));--mut:light-dark(oklch(47% .009 75),oklch(73% .008 75));--bd:light-dark(oklch(22% .008 75 / .13),oklch(95% .004 75 / .13));--tb:light-dark(oklch(97.2% .005 75 / .85),oklch(25% .007 75 / .85));--ac:light-dark(oklch(50% .19 275),oklch(78% .11 275));--on-ac:light-dark(#fff,#06121f);--sh:oklch(23.1% .007 286);--fertig-a1:var(--a1,.08);--fertig-a2:var(--a2,.06);--sh1:color-mix(in srgb,var(--sh) calc(var(--fertig-a1) * 100%),transparent);--sh2:color-mix(in srgb,var(--sh) calc(var(--fertig-a2) * 100%),transparent);--up:0 1px 1px var(--sh1);--up2:0 1px 2px var(--sh1),0 6px 16px -6px var(--sh2);--dn:inset 0 1px 2px color-mix(in srgb,var(--sh) 8%,transparent);--caps:.74em/1.4 var(--f);--ease-out:cubic-bezier(.22,1,.36,1);--ease-in:cubic-bezier(.55,0,1,.45);--ease:cubic-bezier(.4,0,.2,1);--dur-1:.12s;--dur-2:.2s}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--fertig-a1:var(--a1,.5);--fertig-a2:var(--a2,.45)}}@supports (color:oklch(from red l c h)){:root{--on-ac:oklch(from var(--ac) clamp(0,(l - .62) * -100,1) 0 h)}}@supports (color:contrast-color(red)){:root{--on-ac:contrast-color(var(--ac))}}[data-theme=light]{color-scheme:light;--fertig-a1:var(--a1,.08);--fertig-a2:var(--a2,.06)}[data-theme=dark]{color-scheme:dark;--fertig-a1:var(--a1,.5);--fertig-a2:var(--a2,.45)}[data-accent=indigo]{--ac:light-dark(oklch(50% .19 275),oklch(78% .11 275))}[data-accent=sky]{--ac:light-dark(var(--sky-700),oklch(78% .085 245))}[data-accent=sage]{--ac:light-dark(var(--sage-700),oklch(80% .075 155))}[data-accent=clay]{--ac:light-dark(var(--clay-700),oklch(80% .085 45))}[data-accent=plum]{--ac:light-dark(var(--plum-700),oklch(80% .065 320))}[data-accent=gold]{--ac:light-dark(oklch(55% .085 80),oklch(84% .09 85))}[data-accent=slate]{--ac:light-dark(oklch(35% .01 250),oklch(86% .006 250))}*,::before,::after{box-sizing:border-box}html{font:16px/1.65 var(--f);-webkit-text-size-adjust:100%;tab-size:2}body{margin:0;background:var(--bg);color:var(--fg);overflow-wrap:break-word;font-variant-numeric:slashed-zero tabular-nums}::selection{background:color-mix(in srgb,var(--ac) 28%,transparent)}:focus-visible{outline:3px solid color-mix(in srgb,var(--ac) 45%,transparent);outline-offset:1px}img,video,iframe{display:block;max-width:100%;height:auto}svg{max-width:100%;vertical-align:middle}img,video{border-radius:var(--r);box-shadow:var(--up2)}body>*,body>:where(#root,#app,#__next,[data-fertig])>*{max-width:var(--w);margin-inline:auto;padding-inline:1.9rem}body>:where(#root,#app,#__next,[data-fertig]){max-width:none;padding-inline:0}:is(body,body>:where(#root,#app,#__next,[data-fertig]))>:is(header,main,footer){background:var(--el);border-inline:1px solid var(--bd)}:is(body,body>:where(#root,#app,#__next,[data-fertig]))>header{padding-block:2.4rem .8rem}:is(body,body>:where(#root,#app,#__next,[data-fertig]))>main{padding-bottom:2.8rem}:is(body,body>:where(#root,#app,#__next,[data-fertig]))>footer{padding-block:1.2rem 2rem;color:var(--mut);font-size:.85em;border-top:1px solid var(--bd);border-bottom:1px solid var(--bd);border-radius:0 0 var(--rw) var(--rw);margin-bottom:2.5rem;box-shadow:0 18px 30px -22px color-mix(in srgb,var(--sh) 50%,transparent)}:is(body,body>:where(#root,#app,#__next,[data-fertig]))>nav{position:sticky;top:0;z-index:9;max-width:none;--nw:var(--w);padding-inline:max(1.9rem,calc(50% - var(--nw) / 2 + 1.9rem),env(safe-area-inset-left),env(safe-area-inset-right));display:flex;flex-wrap:wrap;gap:1.1rem;align-items:center;padding-block:calc(.6rem + env(safe-area-inset-top,0px)) .6rem;background:var(--tb);color:var(--fg);backdrop-filter:saturate(180%) blur(20px);border-bottom:1px solid var(--bd);font-size:.92em}:is(body,body>:where(#root,#app,#__next,[data-fertig]))>nav a{color:var(--fg);text-decoration:none;opacity:.75}:is(body,body>:where(#root,#app,#__next,[data-fertig]))>nav a:hover{opacity:1}:is(body,body>:where(#root,#app,#__next,[data-fertig]))>nav:is(strong,b) a{opacity:1}:is(body,body>:where(#root,#app,#__next,[data-fertig]))>nav ul{display:flex;flex-wrap:wrap;gap:1.1rem;list-style:none;padding:0;margin:0;flex:1}h1,h2,h3,h4,h5,h6{line-height:1.3;margin:1.4rem 0 .7rem;text-wrap:balance}h1{font-size:1.55rem;letter-spacing:-.015em}h2{font-size:1.25rem;letter-spacing:-.01em;margin-top:2.4rem}h3{font-size:1.08rem;margin-top:1.9rem}h4{font-size:1rem}h5,h6{font:700 var(--caps);text-transform:uppercase;letter-spacing:.1em;color:var(--mut)}:is(h1,h2,h3,h4,h5,h6):first-child{margin-top:0}@supports (text-box:trim-both cap alphabetic){h1,h2,h3,h4{text-box:trim-both cap alphabetic}}:is(section,article) +:is(section,article){margin-top:2.8rem}p,ul,ol,dl,pre,blockquote,table,figure,details,fieldset,hr{margin:1.1rem 0}p{text-wrap:pretty}a{color:var(--ac);text-underline-offset:3px;text-decoration-thickness:1px}a:hover{text-decoration-thickness:2px}small{font-size:.85em;color:var(--mut)}hr{border:0;border-top:1px solid var(--bd);margin:2.2rem 0}mark{background:light-dark(#ffe58f,#5c4a15);color:inherit;border-radius:3px;padding:0 .15em}abbr[title]{text-decoration:underline dotted;cursor:help}blockquote{border-inline-start:2px solid var(--bd);padding-block:.15rem;padding-inline:1.2rem 0;color:var(--mut)}ul,ol{padding-inline-start:1.5rem}li::marker{color:var(--mut)}dl{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:.35rem 1rem}dt{color:var(--mut)}dd{margin:0}figcaption{font-size:.85em;color:var(--mut);text-align:center}code,kbd,samp,pre{font-family:var(--fm);font-size:.9em}:not(pre)>code,samp{background:var(--face);border:1px solid var(--bd);border-radius:var(--rs);padding:.08em .35em}kbd{background:var(--face);border:1px solid var(--bd);border-bottom-width:2px;border-radius:var(--rs);padding:.08em .4em;box-shadow:var(--up)}pre{background:var(--face);border:1px solid var(--bd);border-radius:var(--r);padding:1rem;overflow-x:auto}pre code{background:none;border:0;padding:0;font-size:1em}:root{--syn-comment:light-dark(#6b7280,#8b949e);--syn-key:light-dark(#7c3aed,#c4a7fb);--syn-str:light-dark(#15803d,#7ee787);--syn-num:light-dark(#b45309,#f0b866);--syn-fn:light-dark(#1d4ed8,#93c5fd);--syn-attr:light-dark(#b91c1c,#ff9492)}:is(.hljs-comment,.hljs-quote,.token.comment,.token.prolog,.token.doctype){color:var(--syn-comment);font-style:italic}:is(.hljs-keyword,.hljs-selector-tag,.hljs-literal,.hljs-type,.hljs-built_in,.token.keyword,.token.atrule,.token.rule,.token.important,.token.selector){color:var(--syn-key)}:is(.hljs-string,.hljs-meta-string,.token.string,.token.attr-value,.token.char){color:var(--syn-str)}:is(.hljs-number,.hljs-symbol,.hljs-bullet,.token.number,.token.boolean,.token.constant,.token.unit){color:var(--syn-num)}:is(.hljs-title,.hljs-name,.hljs-section,.hljs-function,.token.tag,.token.function,.token.class-name){color:var(--syn-fn)}:is(.hljs-attr,.hljs-attribute,.hljs-variable,.hljs-template-variable,.token.attr-name,.token.property,.token.variable){color:var(--syn-attr)}:is(.hljs-punctuation,.hljs-operator,.token.punctuation,.token.operator){color:var(--mut)}:is(.hljs-emphasis,.token.italic){font-style:italic}:is(.hljs-strong,.token.bold){font-weight:700}:is(.hljs-deletion,.token.deleted){color:light-dark(#c0392b,#ff6b6b)}:is(.hljs-addition,.token.inserted){color:light-dark(#15803d,#7ee787)}table{width:100%;border-collapse:collapse;font-size:.92em}th,td{border-bottom:1px solid var(--bd);padding-block:.55rem;padding-inline:0 .7rem;text-align:start}th:last-child,td:last-child{padding-inline-end:0}thead th{border-bottom:1px solid color-mix(in srgb,var(--fg) 45%,transparent);font:700 var(--caps);text-transform:uppercase;letter-spacing:.09em;color:var(--mut);padding-bottom:.4rem}tbody tr:last-child td{border-bottom:0}tfoot td{font-weight:700;border-top:1px solid var(--bd);border-bottom:0}:is(th,td)[align=right]{text-align:right}:is(th,td)[align=center]{text-align:center}tbody tr:hover{background:var(--face)}@media (width <= 40rem){table{display:block;overflow-x:auto;overscroll-behavior-x:contain}}caption{text-align:start;color:var(--mut);font-size:.85em;padding-bottom:.35rem}button,input,select,textarea{font:inherit;color:inherit}label{display:block;font-size:.85em;color:var(--mut)}label:has(input){font-size:1rem;color:var(--fg)}:is(input,select,textarea) + label{margin-top:.9rem}textarea{width:100%;min-height:5rem;resize:vertical}@supports (field-sizing:content){textarea{field-sizing:content;max-height:24rem}}input:not([type=checkbox],[type=radio],[type=range],[type=color],[type=file],[type=image],[type=submit],[type=button],[type=reset]),select,textarea{display:block;width:100%;padding:.52em .7em;background:var(--el);border:1px solid var(--bd);border-radius:var(--r);box-shadow:var(--dn)}select{appearance:none;padding-inline-end:2.2rem;background-image:linear-gradient(45deg,transparent 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,transparent 50%);background-position:calc(100% - 17px) 55%,calc(100% - 12.5px) 55%;background-size:5px 5px;background-repeat:no-repeat}select:dir(rtl){background-position:12.5px 55%,17px 55%}select[multiple]{background-image:none;padding-inline-end:.6em}@supports (appearance:base-select){select,::picker(select){appearance:base-select}select{display:flex;align-items:center;justify-content:space-between;gap:.6em;background-image:none;padding-inline-end:.7em}select::picker-icon{content:"";inline-size:.45em;block-size:.45em;flex:none;border:solid currentColor;border-width:0 1px 1px 0;rotate:45deg;translate:0 -.15em;opacity:.7;transition:rotate var(--dur-1) var(--ease),translate var(--dur-1) var(--ease)}select:open::picker-icon{rotate:225deg;translate:0 .1em}::picker(select){min-width:anchor-size(width);border:1px solid var(--bd);border-radius:var(--r);padding:.3rem;background:var(--el);margin-block-start:.35rem;box-shadow:var(--up2),0 20px 40px -14px color-mix(in srgb,var(--sh) 40%,transparent)}option{display:flex;align-items:center;gap:.5em;padding:.4em .6em;border-radius:calc(var(--r) - 2px)}option:hover{background:var(--face)}option:checked{background:var(--ac);color:var(--on-ac)}option::checkmark{order:1;margin-inline-start:auto;content:"✓"}}:is(input,select,textarea):hover:not(:disabled){border-color:color-mix(in srgb,var(--fg) 25%,transparent)}:is(input,select,textarea):focus-visible{border-color:var(--ac)}input[type=checkbox],input[type=radio]{width:1.15em;height:1.15em;margin:0 .45em 0 0;vertical-align:-.18em}label:has(input[type=checkbox]),label:has(input[type=radio]){line-height:1.9}input[type=range]{width:100%;height:1.15em}::placeholder{color:var(--mut)}@supports selector(::spelling-error){::spelling-error{text-decoration:wavy underline light-dark(#c0392b,#ff6b6b)}::grammar-error{text-decoration:wavy underline light-dark(#9a6700,#d29922)}}:is(input,textarea):read-only:not(:disabled){background:var(--face);cursor:default}label:has(+:required)::after,label:has(:required)::after{content:" *";color:var(--ac)}input:autofill,input:autofill:hover,input:autofill:focus{-webkit-text-fill-color:var(--fg);box-shadow:var(--dn),inset 0 0 0 100px var(--el);caret-color:var(--ac)}:disabled{color:var(--mut);cursor:not-allowed;box-shadow:none}fieldset{border:1px solid var(--bd);border-radius:var(--r);padding:.9rem 1rem 1rem;background:var(--face)}fieldset:focus-within{border-color:color-mix(in srgb,var(--ac) 45%,var(--bd))}legend{float:left;width:100%;margin-bottom:.8rem;padding:0 0 .6rem;border-bottom:1px solid var(--bd);font-size:.95em;font-weight:700;color:var(--fg)}legend + *{clear:left}button,[type=submit],[type=button],[type=reset],:where(a.primary,a[role=button]),::file-selector-button{display:inline-block;text-decoration:none;text-align:center;padding:.48em 1.1em;background:var(--el);color:var(--fg);cursor:pointer;border:1px solid var(--bd);border-radius:var(--r);box-shadow:var(--up);font:inherit;min-width:5rem}:is(button,[type=submit],[type=button],[type=reset],a.primary,a[role=button]):hover:not(:disabled){background:var(--face)}:is(button,[type=submit],[type=button],[type=reset],a.primary,a[role=button]):active:not(:disabled){box-shadow:var(--dn);translate:0 .5px}[type=submit],.primary{background:var(--ac);border-color:transparent;color:var(--on-ac)}:is([type=submit],.primary,a.primary):hover:not(:disabled){background:color-mix(in oklab,var(--ac),#fff 9%)}@supports (color:oklch(from red l c h)){:is([type=submit],.primary,a.primary):hover:not(:disabled){background:oklch(from var(--ac) calc(l + .05) c h)}}:is(button,a,input,select,label)[data-size=sm]{padding:.2em .7em;font-size:.85em;min-width:0}:is(button,a,input,select,label)[data-size=lg]{padding:.55em 1.5em;font-size:1.05em}button[data-icon]{min-width:0;padding:.38em .62em;line-height:1}:is(button,a,input,select,label)[data-block]{display:block;width:100%;min-width:0}:is(button,a,input)[data-variant=ghost]{background:none;border-color:transparent;box-shadow:none}:is(button,a,input)[data-variant=ghost]:hover:not(:disabled){background:var(--face);border-color:var(--bd)}:is(button,a,input)[data-variant=link]{background:none;border:0;box-shadow:none;min-width:0;padding-inline:.2em;color:var(--ac);text-decoration:underline;text-underline-offset:3px}:is(button,a,input)[data-variant=link]:hover:not(:disabled){background:none;text-decoration-thickness:2px}button[aria-pressed=true]{background:var(--face);color:var(--ac);font-weight:700}button[aria-pressed=true]:hover:not(:disabled){background:color-mix(in srgb,var(--fg) 7%,var(--face))}:is([type=submit],.primary){box-shadow:var(--up),inset 0 1px 0 light-dark(#fff3,#ffffff26)}:is([type=submit],.primary):active:not(:disabled){box-shadow:inset 0 1px 3px #0006}@supports (corner-shape:squircle){:is(button,[type=submit],[type=button],[type=reset],input,select,textarea,fieldset,details,dialog,[popover],pre,kbd,code,samp,img,video,menu,aside,[data-avatar],[data-skeleton],.card,.badge){corner-shape:squircle}}details{border:1px solid var(--bd);border-radius:var(--r);padding:.7rem 1.1rem;background:var(--el)}summary{cursor:pointer;font-weight:700;list-style:none}summary::before{content:"▸ ";color:var(--mut)}details[open]>summary::before{content:"▾ "}details[open]>summary{margin-bottom:.6rem}dialog{background:var(--el);color:var(--fg);border:1px solid var(--bd);border-radius:var(--rw);padding:1.4rem;max-width:min(30rem,92dvw);box-shadow:0 32px 64px -16px color-mix(in srgb,var(--sh) 45%,transparent)}dialog>:last-child:not(footer){margin-bottom:0}dialog,[popover]{overscroll-behavior:contain}dialog::backdrop{background:color-mix(in srgb,var(--sh) 35%,transparent);backdrop-filter:blur(3px)}dialog:has(>:is(header,footer)){max-block-size:min(44rem,85dvh);overflow:auto}dialog>:is(header,footer){position:sticky;z-index:1;margin-inline:-1.4rem;padding:.7rem 1.4rem;background:var(--el)}dialog>header{inset-block-start:-1.4rem;margin-block:-1.4rem 1rem;font-weight:700;border-bottom:1px solid var(--bd);border-radius:var(--rw) var(--rw) 0 0}dialog>header>:is(h1,h2,h3,h4,p){margin:0;font-size:1.05rem}dialog>footer{inset-block-end:-1.4rem;margin-block:1rem -1.4rem;border-top:1px solid var(--bd);border-radius:0 0 var(--rw) var(--rw);display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;justify-content:flex-end}dialog>footer>:is(p,span):first-child{margin:0;margin-inline-end:auto;color:var(--mut)}@media (prefers-reduced-motion:no-preference) and (update:fast){dialog,dialog::backdrop{transition:opacity var(--dur-2) var(--ease-out),translate var(--dur-2) var(--ease-out),display var(--dur-2) allow-discrete,overlay var(--dur-2) allow-discrete}dialog{opacity:0;translate:0 10px}dialog[open]{opacity:1;translate:0}dialog::backdrop{opacity:0}dialog[open]::backdrop{opacity:1}@starting-style{dialog[open]{opacity:0;translate:0 10px}}@starting-style{dialog[open]::backdrop{opacity:0}}[popover]{opacity:0;translate:0 -4px;transition:opacity .13s var(--ease-out),translate .13s var(--ease-out),display .13s allow-discrete,overlay .13s allow-discrete}[popover]:popover-open{opacity:1;translate:0}@starting-style{[popover]:popover-open{opacity:0;translate:0 -4px}}}search{display:block;margin-block:1.1rem}::target-text{background:color-mix(in srgb,var(--ac) 28%,transparent)}aside{border:1px solid var(--bd);border-inline-start:3px solid var(--ac);border-radius:var(--r);border-start-start-radius:0;border-end-start-radius:0;background:var(--el);padding:.7rem 1.1rem;margin-block:1.1rem}progress{width:100%;height:.5rem;border:0;border-radius:calc(infinity * 1px);background:var(--face)}progress::-webkit-progress-bar{background:var(--face);border-radius:calc(infinity * 1px)}progress::-webkit-progress-value{background:var(--ac);border-radius:calc(infinity * 1px)}progress::-moz-progress-bar{background:var(--ac);border-radius:calc(infinity * 1px)}@supports selector(::details-content){@media (prefers-reduced-motion:no-preference) and (update:fast){details{interpolate-size:allow-keywords}details::details-content{block-size:0;overflow:clip;transition:block-size .28s var(--ease),content-visibility .28s allow-discrete}details[open]::details-content{block-size:auto}}}.muted{color:var(--mut)}.center{text-align:center}.wide{max-width:66rem}:is(body,body>:where(#root,#app,#__next,[data-fertig]))>nav.wide{max-width:none;--nw:66rem}.row{display:flex;flex-wrap:wrap;gap:.7rem;align-items:center}.row:is(input:not([type=checkbox],[type=radio]),textarea){width:auto;flex:1 1 10rem;min-width:0}.row select{width:auto;flex:0 1 auto;min-width:0}.row:is(progress,meter){width:auto;flex:1 1 6rem}.row>label{flex:none;margin-top:0}.grid{display:grid;gap:.9rem;grid-template-columns:repeat(auto-fit,minmax(11rem,1fr))}.grid + *{margin-top:1.1rem}.card{container-type:inline-size;border:1px solid var(--bd);border-radius:var(--r);padding:1.1rem;background:var(--el);box-shadow:var(--up2);display:flex;flex-direction:column;gap:.85rem}.card>*{margin-block:0}.flex{display:flex}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.flex-1{flex:1;min-width:0}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.items-start{align-items:start}.items-center{align-items:center}.items-end{align-items:end}.justify-start{justify-content:start}.justify-center{justify-content:center}.justify-end{justify-content:end}.justify-between{justify-content:space-between}.gap-0{gap:0}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.mx-auto{margin-inline:auto}.ms-auto{margin-inline-start:auto}.me-auto{margin-inline-end:auto}.w-full{width:100%}.max-w-xs{max-inline-size:20rem}.max-w-sm{max-inline-size:24rem}.max-w-md{max-inline-size:28rem}.max-w-lg{max-inline-size:32rem}.max-w-xl{max-inline-size:36rem}.max-w-2xl{max-inline-size:42rem}.max-w-3xl{max-inline-size:48rem}.max-w-4xl{max-inline-size:56rem}.max-w-5xl{max-inline-size:64rem}.max-w-6xl{max-inline-size:72rem}.max-w-7xl{max-inline-size:80rem}.max-w-full{max-inline-size:100%}.max-w-none{max-inline-size:none}.max-w-prose{max-inline-size:var(--w)}.hidden{display:none}.badge{border:1px solid var(--bd);border-radius:calc(infinity * 1px);background:var(--face);padding:.1em .6em;font:700 var(--caps);color:var(--mut)}.card>:is(header,footer){margin-inline:-1.1rem;padding-inline:1.1rem}.card>header{margin-top:-.25rem;padding-bottom:.7rem;font-weight:600;border-bottom:1px solid var(--bd)}.card>footer{margin-top:auto;margin-bottom:-.25rem;padding-top:.7rem;color:var(--mut);font-size:.85em;border-top:1px solid var(--bd)}.card>:is(img,video):first-child{align-self:stretch;width:auto;max-width:none;margin:-1.1rem -1.1rem 0;aspect-ratio:16 / 9;object-fit:cover;border:0;border-radius:var(--r) var(--r) 0 0;box-shadow:none}.card[data-tone]{background:linear-gradient(var(--ac),var(--ac)) top / 100% 3px no-repeat,var(--el)}:is(a,button).card{display:flex;width:100%;text-align:start;color:inherit;text-decoration:none;font:inherit}:is(a,button).card:hover:not(:disabled){border-color:color-mix(in srgb,var(--ac) 45%,var(--bd));box-shadow:var(--up2),0 12px 26px -14px color-mix(in srgb,var(--sh) 40%,transparent);translate:0 -2px}:is(a,button).card:active:not(:disabled){translate:0 0}[hidden]:not([hidden=until-found]){display:none}@media (prefers-reduced-motion:no-preference) and (update:fast){html{scroll-behavior:smooth}}:target{scroll-margin-top:4rem}:is(h1,h2,h3,h4):target{background:color-mix(in srgb,var(--ac) 12%,transparent)}a[target=_blank]:not(:has(>img,>svg))::after{content:" ↗";font-size:.85em;opacity:.6}a:has(>img),a:has(>code){text-decoration:none}sup,sub{line-height:0;font-size:.75em}q{quotes:"“" "”" "‘" "’"}dfn{font-style:normal;font-weight:700}ins{text-decoration:underline;text-decoration-style:wavy;text-decoration-color:var(--ac)}del{color:var(--mut)}address{font-style:normal;color:var(--mut)}hgroup>*{margin:0}hgroup>p{color:var(--mut)}output{font-weight:700}meter{width:100%;height:.5rem}optgroup{font-weight:700;color:var(--mut)}::file-selector-button{margin-inline-end:.8em}::file-selector-button:hover{background:var(--face)}input:user-invalid,textarea:user-invalid{border-color:light-dark(#c0392b,#ff6b6b)}input:user-invalid + small{color:light-dark(#c0392b,#ff6b6b)}summary:hover{color:var(--ac)}:is(pre,table,textarea,dialog,[popover],menu,fieldset,[role=group],[data-carousel],[data-layout=sidebar]>*){scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--fg) 25%,transparent) transparent}@page{margin:2cm}@media print{:root{--bg:#fff;--el:#fff;--fg:#000;--bd:#999}:is(body,body>:where(#root,#app,#__next,[data-fertig]))>nav{display:none}:is(body,body>:where(#root,#app,#__next,[data-fertig]))>footer{box-shadow:none;margin-bottom:0}body>*,body>:where(#root,#app,#__next,[data-fertig])>*{border:0;max-width:none}p,blockquote,li{orphans:3;widows:3}a[href^="http"]::after{content:" (" attr(href) ")";font-size:.8em;color:#555}pre,table,figure,details,tr,img{break-inside:avoid}h1,h2,h3,h4{break-after:avoid}}@media (pointer:coarse){button,[type=submit],[type=button],[type=reset],:where(a.primary,a[role=button]),select,summary,input:not([type=checkbox],[type=radio],[type=range],[type=color],[type=file]){min-height:44px}input[type=checkbox],input[type=radio]{width:1.4em;height:1.4em}:is(button,a,input,select,label)[data-size=sm]{min-height:32px}}@media (inverted-colors:inverted){img,video,iframe{filter:invert(1) hue-rotate(180deg)}}@media (color-gamut:p3){@supports (color:oklch(60% .2 250)){:root{--ac:light-dark(oklch(52% .21 258),oklch(76% .15 258))}}}:root{text-spacing-trim:trim-start;text-autospace:normal}@media (prefers-reduced-transparency:reduce){body>nav{background:var(--face);backdrop-filter:none}dialog::backdrop{backdrop-filter:none}}@media (prefers-contrast:more){:root{--bd:light-dark(#00000059,#ffffff6b);--mut:light-dark(#45454a,#c6c6ce)}}@media (prefers-reduced-motion:no-preference) and (update:fast){a,button,input,select,textarea,summary,tr,[type=submit],[type=button],[type=reset],.card,.badge,[role=tab],[role=group]>*,[popover]:is(a,button){transition:box-shadow var(--dur-1) var(--ease),background-color var(--dur-1) var(--ease),border-color var(--dur-1) var(--ease),color var(--dur-1) var(--ease),translate .08s var(--ease-out)}:focus-visible{transition:none}}@supports not (color:light-dark(#000,#fff)){:root{--bg:#ece9e5;--el:#fefdfc;--face:#f8f5f2;--fg:#1d1a17;--mut:#5e5a55;--bd:#1d1a1721;--tb:#f8f5f2d9;--ac:#494fcc;--on-ac:#fff}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--bg:#0f0d0a;--el:#1a1815;--face:#24211e;--fg:#f0eeec;--mut:#aba7a2;--bd:#f0eeec21;--tb:#24211ed9;--ac:#a3b2fe;--on-ac:#06121f}}[data-theme=dark]{--bg:#0f0d0a;--el:#1a1815;--face:#24211e;--fg:#f0eeec;--mut:#aba7a2;--bd:#f0eeec21;--tb:#24211ed9;--ac:#a3b2fe;--on-ac:#06121f}}}@layer fertig-a11y{@media (forced-colors:active){*{box-shadow:none}button,[type=submit],[type=button],[type=reset],input,select,textarea,.card,.badge,details,dialog,[popover],fieldset,table{border:1px solid CanvasText}[role=tab][aria-selected=true]{border-bottom:2px solid Highlight}button[aria-pressed=true]{border-color:Highlight}}}
|