@leftium/nimble.css 0.1.0 → 0.2.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/README.md CHANGED
@@ -1,12 +1,12 @@
1
1
  # nimble.css
2
2
 
3
- A minimal class/classless CSS library. Drop it in and your semantic HTML looks good — no classes required. ~3 KB gzipped.
3
+ A minimal class/classless CSS library. Drop it in and your semantic HTML looks good — no classes required. ~3.3 KB brotli (core).
4
4
 
5
5
  - **Classless by default** — style every standard HTML element with zero markup changes
6
6
  - **Automatic dark mode** — via `prefers-color-scheme` and `light-dark()`
7
7
  - **OKLCH color system** — perceptually uniform, fully customizable via SCSS config
8
8
  - **Cascade layers** — plays nicely alongside your own styles
9
- - **Tiny** — 11.9 KB minified, ~3.1 KB gzipped
9
+ - **Tiny** — core is 15.4 KB minified, ~3.3 KB brotli; full bundle is 18.9 KB minified, ~4 KB brotli
10
10
 
11
11
  ## Demos
12
12
 
@@ -15,38 +15,83 @@ A minimal class/classless CSS library. Drop it in and your semantic HTML looks g
15
15
 
16
16
  ## Quick Start
17
17
 
18
+ ### npm
19
+
20
+ ```bash
21
+ npm install @leftium/nimble.css
22
+ ```
23
+
24
+ Then import in your CSS, JS, or framework:
25
+
26
+ ```css
27
+ /* CSS */
28
+ @import '@leftium/nimble.css';
29
+ ```
30
+
31
+ ```js
32
+ // JS / framework entry point
33
+ import '@leftium/nimble.css';
34
+ ```
35
+
18
36
  ### CDN
19
37
 
38
+ Via jsDelivr (npm):
39
+
40
+ ```html
41
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@leftium/nimble.css/dist/nimble.min.css">
42
+ ```
43
+
44
+ Or via GitHub (latest on `main`):
45
+
20
46
  ```html
21
47
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/Leftium/nimble.css@main/dist/nimble.min.css">
22
48
  ```
23
49
 
24
50
  That's it. Write semantic HTML and it just works.
25
51
 
26
- ### Sub-bundles
52
+ ### Bundles
27
53
 
28
- Pick only what you need:
54
+ `nimble.min.css` (18.9 KB) includes everything.
29
55
 
30
- | Bundle | Minified | Contents |
31
- |---|---|---|
32
- | `nimble.min.css` | 11.9 KB | Everything |
33
- | `nimble-base.min.css` | 5.2 KB | Reset + colors + document + typography |
34
- | `nimble-reset.min.css` | 1.7 KB | Modern CSS reset only |
35
- | `nimble-utilities.min.css` | 572 B | Utility classes only |
56
+ To trim size, use `nimble-core.min.css` (15.4 KB) + only the add-ons you need:
57
+
58
+ | Add-on | Minified |
59
+ |---|---|
60
+ | `nimble-progress.min.css` | 1.6 KB |
61
+ | `nimble-meter.min.css` | 1.0 KB |
62
+ | `nimble-select.min.css` | 1.0 KB |
63
+
64
+ Mix and match with CDN links (comment out what you don't need):
36
65
 
37
66
  ```html
38
- <!-- Just the classless core, no element styles or utilities -->
39
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/Leftium/nimble.css@main/dist/nimble-base.min.css">
67
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@leftium/nimble.css/dist/nimble-core.min.css">
68
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@leftium/nimble.css/dist/nimble-progress.min.css">
69
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@leftium/nimble.css/dist/nimble-meter.min.css">
70
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@leftium/nimble.css/dist/nimble-select.min.css">
40
71
  ```
41
72
 
42
- ### Download
73
+ Or with SCSS (comment out what you don't need):
43
74
 
44
- Grab [`nimble.min.css`](dist/nimble.min.css) from this repo and include it locally:
45
-
46
- ```html
47
- <link rel="stylesheet" href="nimble.min.css">
75
+ ```scss
76
+ @use '@leftium/nimble.css/scss/core'; // core
77
+ @use '@leftium/nimble.css/scss/progress'; // add-ons
78
+ @use '@leftium/nimble.css/scss/meter';
79
+ @use '@leftium/nimble.css/scss/select';
48
80
  ```
49
81
 
82
+ <details>
83
+ <summary>Granular sub-bundles</summary>
84
+
85
+ For advanced use, `nimble-core` is composed of these non-overlapping layers:
86
+
87
+ | Sub-bundle | Minified | Contents |
88
+ |---|---|---|
89
+ | `nimble-reset.min.css` | 1.8 KB | Modern CSS reset |
90
+ | `nimble-base.min.css` | 3.4 KB | Colors + document + typography |
91
+ | `nimble-utilities.min.css` | 572 B | Utility classes |
92
+
93
+ </details>
94
+
50
95
  ## Utility Classes
51
96
 
52
97
  Content is centered at `720px` by default — no class needed. These opt-in utilities handle the rest. Disable all with `$enable-utilities: false`.
@@ -63,7 +108,42 @@ Content is centered at `720px` by default — no class needed. These opt-in util
63
108
 
64
109
  ## Customization
65
110
 
66
- nimble.css is built with SCSS. Override any config variable:
111
+ ### CSS Custom Properties
112
+
113
+ Override any property at runtime — no build step needed:
114
+
115
+ ```css
116
+ :root {
117
+ --nc-primary: oklch(0.50 0.15 150);
118
+ --nc-radius: 0.5rem;
119
+ --nc-spacing: 1.25rem;
120
+ }
121
+ ```
122
+
123
+ | Property | Description |
124
+ |---|---|
125
+ | `--nc-surface-1` .. `--nc-surface-4` | Background hierarchy (page, card, input, overlay) |
126
+ | `--nc-text` | Text color (adapts to light/dark mode) |
127
+ | `--nc-border` | Default border color |
128
+ | `--nc-primary` | Accent color (links, buttons, focus rings) |
129
+ | `--nc-primary-hover` | Accent hover state |
130
+ | `--nc-primary-focus` | Accent focus ring (semi-transparent) |
131
+ | `--nc-primary-contrast` | Text on primary backgrounds |
132
+ | `--nc-secondary` | Secondary accent (reset buttons) |
133
+ | `--nc-secondary-hover` | Secondary hover state |
134
+ | `--nc-secondary-focus` | Secondary focus ring |
135
+ | `--nc-secondary-contrast` | Text on secondary backgrounds |
136
+ | `--nc-valid` | Validation success color |
137
+ | `--nc-invalid` | Validation error color |
138
+ | `--nc-font-sans` | Body font stack |
139
+ | `--nc-font-mono` | Code font stack |
140
+ | `--nc-spacing` | Base spacing unit |
141
+ | `--nc-radius` | Border radius |
142
+ | `--nc-content-width` | Max content width |
143
+
144
+ ### SCSS
145
+
146
+ For build-time customization, override any SCSS config variable:
67
147
 
68
148
  ```scss
69
149
  @use 'nimble' with (
@@ -103,7 +183,7 @@ nimble.css is built with SCSS. Override any config variable:
103
183
  nimble.css combines [Open Props](https://open-props.style/)'s design token philosophy with [PicoCSS](https://picocss.com/)'s classless aesthetics. Key concepts borrowed from Open Props:
104
184
 
105
185
  - **Surface hierarchy** (`surface-1` through `surface-4`) — layered backgrounds for page, card, input, and overlay contexts. Defined in `_colors.scss` from OKLCH parameters rather than imported at runtime.
106
- - **Text hierarchy** (`text-1`, `text-2`) — primary and muted text colors, same naming convention as Open Props.
186
+ - **Text color** (`text`) — single text color variable; muted text derived inline via `color-mix()`.
107
187
  - **OKLCH color space** — perceptually uniform color system. Change `$primary-hue` and the entire palette regenerates consistently.
108
188
  - **Curated scale values** — `$spacing: 1rem` (~Open Props `size-3`) and `$radius: 0.25rem` (~Open Props `radius-2`) are sourced from Open Props' scales.
109
189
  - **Minimal DevTools pollution** — ~20 semantic custom properties on `:root` plus scoped `--_` internals per component, rather than dumping hundreds of variables globally.
@@ -1,123 +1,4 @@
1
1
  @layer nimble.reset, nimble.base;
2
- @layer nimble.reset {
3
- :where(*),
4
- :where(*::before),
5
- :where(*::after) {
6
- box-sizing: border-box;
7
- background-repeat: no-repeat;
8
- }
9
- :where(html) {
10
- line-height: 1.5;
11
- -webkit-text-size-adjust: 100%;
12
- tab-size: 4;
13
- }
14
- :where(body) {
15
- margin: 0;
16
- }
17
- :where(h1) {
18
- font-size: 2em;
19
- margin-block: 0.67em;
20
- }
21
- :where(hr) {
22
- height: 0;
23
- color: inherit;
24
- }
25
- :where(nav) :where(ol, ul) {
26
- list-style-type: none;
27
- padding: 0;
28
- }
29
- :where(pre) {
30
- font-family: monospace, monospace;
31
- font-size: 1em;
32
- }
33
- :where(abbr[title]) {
34
- text-decoration: underline dotted;
35
- }
36
- :where(b, strong) {
37
- font-weight: bolder;
38
- }
39
- :where(code, kbd, samp) {
40
- font-family: monospace, monospace;
41
- font-size: 1em;
42
- }
43
- :where(small) {
44
- font-size: 80%;
45
- }
46
- :where(sub, sup) {
47
- font-size: 75%;
48
- line-height: 0;
49
- position: relative;
50
- vertical-align: baseline;
51
- }
52
- :where(sub) {
53
- bottom: -0.25em;
54
- }
55
- :where(sup) {
56
- top: -0.5em;
57
- }
58
- :where(iframe) {
59
- border-style: none;
60
- }
61
- :where(table) {
62
- border-collapse: collapse;
63
- border-color: currentColor;
64
- text-indent: 0;
65
- }
66
- :where(button, input, select, textarea) {
67
- font: inherit;
68
- letter-spacing: inherit;
69
- }
70
- :where(button, [type=button], [type=reset], [type=submit]) {
71
- -webkit-appearance: button;
72
- }
73
- :where(fieldset) {
74
- border: 1px solid #a0a0a0;
75
- }
76
- :where(progress) {
77
- vertical-align: baseline;
78
- }
79
- :where(textarea) {
80
- resize: vertical;
81
- overflow: auto;
82
- }
83
- :where([type=search]) {
84
- -webkit-appearance: textfield;
85
- outline-offset: -2px;
86
- }
87
- :where(::-webkit-search-decoration) {
88
- -webkit-appearance: none;
89
- }
90
- :where(::-webkit-inner-spin-button),
91
- :where(::-webkit-outer-spin-button) {
92
- height: auto;
93
- }
94
- :where(::-webkit-file-upload-button) {
95
- -webkit-appearance: button;
96
- font: inherit;
97
- }
98
- :where(summary) {
99
- display: list-item;
100
- }
101
- :where(a, area, button, input, label, select, summary, textarea, [tabindex]) {
102
- touch-action: manipulation;
103
- }
104
- :where([aria-busy=true]) {
105
- cursor: progress;
106
- }
107
- :where([aria-disabled=true], [disabled]) {
108
- cursor: not-allowed;
109
- }
110
- @media (prefers-reduced-motion: reduce) {
111
- :where(*),
112
- :where(*::before),
113
- :where(*::after) {
114
- animation-duration: 0.01ms !important;
115
- animation-iteration-count: 1 !important;
116
- transition-duration: 0.01ms !important;
117
- scroll-behavior: auto !important;
118
- }
119
- }
120
- }
121
2
  @layer nimble.base {
122
3
  :root {
123
4
  color-scheme: light dark;
@@ -125,8 +6,7 @@
125
6
  --nc-surface-2: light-dark(oklch(0.955 0.002 250), oklch(0.2 0.005 260));
126
7
  --nc-surface-3: light-dark(oklch(0.925 0.002 250), oklch(0.23 0.005 260));
127
8
  --nc-surface-4: light-dark(oklch(0.885 0.002 250), oklch(0.27 0.005 260));
128
- --nc-text-1: light-dark(oklch(0.28 0.005 250), oklch(0.86 0.005 250));
129
- --nc-text-2: light-dark(oklch(0.58 0.005 250), oklch(0.65 0.005 250));
9
+ --nc-text: light-dark(oklch(0.28 0.005 250), oklch(0.86 0.005 250));
130
10
  --nc-border: light-dark(oklch(0.83 0.005 250), oklch(0.28 0.005 260));
131
11
  --nc-primary: light-dark(oklch(0.5 0.2 250), oklch(0.6 0.2 250));
132
12
  --nc-primary-hover: light-dark(oklch(0.4 0.2 250), oklch(0.7 0.2 250));
@@ -156,7 +36,7 @@
156
36
  font-family: var(--nc-font-sans);
157
37
  font-size: 100%;
158
38
  line-height: 1.5;
159
- color: var(--nc-text-1);
39
+ color: var(--nc-text);
160
40
  background-color: var(--nc-surface-1);
161
41
  }
162
42
  body {
@@ -166,10 +46,11 @@
166
46
  }
167
47
  body > * {
168
48
  grid-column: 2;
49
+ min-width: 0;
169
50
  }
170
51
  ::selection {
171
52
  background-color: var(--nc-primary-focus);
172
- color: var(--nc-text-1);
53
+ color: var(--nc-text);
173
54
  }
174
55
  }
175
56
  @layer nimble.base {
@@ -184,7 +65,7 @@
184
65
  h2 {
185
66
  font-size: 1.75rem;
186
67
  line-height: 1.15;
187
- margin-top: 0;
68
+ margin-top: 2rem;
188
69
  margin-bottom: var(--nc-spacing);
189
70
  font-weight: 700;
190
71
  text-wrap: balance;
@@ -192,7 +73,7 @@
192
73
  h3 {
193
74
  font-size: 1.5rem;
194
75
  line-height: 1.2;
195
- margin-top: 0;
76
+ margin-top: 1.5rem;
196
77
  margin-bottom: var(--nc-spacing);
197
78
  font-weight: 700;
198
79
  text-wrap: balance;
@@ -200,7 +81,7 @@
200
81
  h4 {
201
82
  font-size: 1.25rem;
202
83
  line-height: 1.3;
203
- margin-top: 0;
84
+ margin-top: 1.5rem;
204
85
  margin-bottom: var(--nc-spacing);
205
86
  font-weight: 700;
206
87
  text-wrap: balance;
@@ -208,7 +89,7 @@
208
89
  h5 {
209
90
  font-size: 1.125rem;
210
91
  line-height: 1.4;
211
- margin-top: 0;
92
+ margin-top: 1.5rem;
212
93
  margin-bottom: var(--nc-spacing);
213
94
  font-weight: 700;
214
95
  text-wrap: balance;
@@ -216,7 +97,7 @@
216
97
  h6 {
217
98
  font-size: 1rem;
218
99
  line-height: 1.5;
219
- margin-top: 0;
100
+ margin-top: 1.5rem;
220
101
  margin-bottom: var(--nc-spacing);
221
102
  font-weight: 700;
222
103
  text-wrap: balance;
@@ -236,9 +117,6 @@
236
117
  margin-top: 0;
237
118
  margin-bottom: var(--nc-spacing);
238
119
  }
239
- :where(p, ul, ol, dl, blockquote, pre, table, figure, form) + :is(h1, h2, h3, h4, h5, h6) {
240
- margin-top: calc(var(--nc-spacing) * 2);
241
- }
242
120
  ul, ol {
243
121
  padding-inline-start: 1.5em;
244
122
  }
@@ -266,7 +144,7 @@
266
144
  :where(blockquote) cite {
267
145
  font-style: normal;
268
146
  font-size: 0.9em;
269
- color: var(--nc-text-2);
147
+ color: color-mix(in oklch, var(--nc-text), transparent 40%);
270
148
  }
271
149
  hr {
272
150
  border: none;
@@ -1 +1 @@
1
- @layer nimble.reset{:where(*),:where(),:where(){box-sizing:border-box;background-repeat:no-repeat}:where(html){-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5}:where(body){margin:0}:where(h1){margin-block:.67em;font-size:2em}:where(hr){height:0;color:inherit}:where(nav) :where(ol,ul){padding:0;list-style-type:none}:where(pre){font-family:monospace;font-size:1em}:where(abbr[title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}:where(b,strong){font-weight:bolder}:where(code,kbd,samp){font-family:monospace;font-size:1em}:where(small){font-size:80%}:where(sub,sup){vertical-align:baseline;font-size:75%;line-height:0;position:relative}:where(sub){bottom:-.25em}:where(sup){top:-.5em}:where(iframe){border-style:none}:where(table){border-collapse:collapse;text-indent:0;border-color:currentColor}:where(button,input,select,textarea){font:inherit;letter-spacing:inherit}:where(button,[type=button],[type=reset],[type=submit]){-webkit-appearance:button}:where(fieldset){border:1px solid #a0a0a0}:where(progress){vertical-align:baseline}:where(textarea){resize:vertical;overflow:auto}:where([type=search]){-webkit-appearance:textfield;outline-offset:-2px}:where(){-webkit-appearance:none}:where(),:where(){height:auto}:where(){-webkit-appearance:button;font:inherit}:where(summary){display:list-item}:where(a,area,button,input,label,select,summary,textarea,[tabindex]){touch-action:manipulation}:where([aria-busy=true]){cursor:progress}:where([aria-disabled=true],[disabled]){cursor:not-allowed}@media (prefers-reduced-motion:reduce){:where(*),:where(),:where(){scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}}@layer nimble.base{:root{color-scheme:light dark;--nc-surface-1:light-dark(oklch(98.5% .002 250),oklch(17% .005 260));--nc-surface-2:light-dark(oklch(95.5% .002 250),oklch(20% .005 260));--nc-surface-3:light-dark(oklch(92.5% .002 250),oklch(23% .005 260));--nc-surface-4:light-dark(oklch(88.5% .002 250),oklch(27% .005 260));--nc-text-1:light-dark(oklch(28% .005 250),oklch(86% .005 250));--nc-text-2:light-dark(oklch(58% .005 250),oklch(65% .005 250));--nc-border:light-dark(oklch(83% .005 250),oklch(28% .005 260));--nc-primary:light-dark(oklch(50% .2 250),oklch(60% .2 250));--nc-primary-hover:light-dark(oklch(40% .2 250),oklch(70% .2 250));--nc-primary-focus:oklch(50% .2 250/.4);--nc-primary-contrast:light-dark(#fff,oklch(15% .005 250));--nc-secondary:light-dark(oklch(45% .05 250),oklch(60% .05 250));--nc-secondary-hover:light-dark(oklch(35% .05 250),oklch(70% .05 250));--nc-secondary-focus:oklch(45% .05 250/.3);--nc-secondary-contrast:light-dark(#fff,oklch(15% .005 250));--nc-valid:light-dark(oklch(52% .17 145),oklch(65% .2 145));--nc-invalid:light-dark(oklch(55% .22 25),oklch(65% .22 25));--nc-font-sans:system-ui, sans-serif;--nc-font-mono:ui-monospace, Cascadia Code, Source Code Pro, Menlo, Consolas, DejaVu Sans Mono, monospace;--nc-spacing:1rem;--nc-radius:.25rem;--nc-content-width:720px}[data-theme=dark]{color-scheme:dark}[data-theme=light]{color-scheme:light}html{font-family:var(--nc-font-sans);color:var(--nc-text-1);background-color:var(--nc-surface-1);font-size:100%;line-height:1.5}body{grid-template-columns:1fr min(var(--nc-content-width), calc(100% - 2 * var(--nc-spacing))) 1fr;min-height:100dvh;display:grid}body>*{grid-column:2}::selection{background-color:var(--nc-primary-focus);color:var(--nc-text-1)}h1{margin-top:0;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:2rem;font-weight:700;line-height:1.1}h2{margin-top:0;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:1.75rem;font-weight:700;line-height:1.15}h3{margin-top:0;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:1.5rem;font-weight:700;line-height:1.2}h4{margin-top:0;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:1.25rem;font-weight:700;line-height:1.3}h5{margin-top:0;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:1.125rem;font-weight:700;line-height:1.4}h6{margin-top:0;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:1rem;font-weight:700;line-height:1.5}@media (width<=720px){h1{font-size:1.75rem}h2{font-size:1.5rem}h3{font-size:1.3rem}}p,ul,ol,dl,blockquote,pre,table,figure,form,fieldset{margin-top:0;margin-bottom:var(--nc-spacing)}:where(p,ul,ol,dl,blockquote,pre,table,figure,form)+:is(h1,h2,h3,h4,h5,h6){margin-top:calc(var(--nc-spacing) * 2)}ul,ol{padding-inline-start:1.5em}li{margin-bottom:.25em}:where(li)>:where(ul,ol){margin-bottom:0}dt{font-weight:600}dd{margin-inline-start:1.5em;margin-bottom:.5em}blockquote{margin-block:var(--nc-spacing);padding:.25em var(--nc-spacing);border-inline-start:.25rem solid var(--nc-border);margin-inline:0;font-style:italic}:where(blockquote) footer,:where(blockquote) cite{color:var(--nc-text-2);font-size:.9em;font-style:normal}hr{background-color:color-mix(in oklch, var(--nc-border), transparent 40%);height:1px;margin:calc(var(--nc-spacing) * 2) 0;border:none}mark{color:light-dark(inherit,oklch(95% .01 85));background-color:light-dark(#fde68a,oklch(55% .12 85));border-radius:2px;padding:.1em .25em}address{font-style:normal}}
1
+ @layer nimble.reset;@layer nimble.base{:root{color-scheme:light dark;--nc-surface-1:light-dark(oklch(98.5% .002 250),oklch(17% .005 260));--nc-surface-2:light-dark(oklch(95.5% .002 250),oklch(20% .005 260));--nc-surface-3:light-dark(oklch(92.5% .002 250),oklch(23% .005 260));--nc-surface-4:light-dark(oklch(88.5% .002 250),oklch(27% .005 260));--nc-text:light-dark(oklch(28% .005 250),oklch(86% .005 250));--nc-border:light-dark(oklch(83% .005 250),oklch(28% .005 260));--nc-primary:light-dark(oklch(50% .2 250),oklch(60% .2 250));--nc-primary-hover:light-dark(oklch(40% .2 250),oklch(70% .2 250));--nc-primary-focus:oklch(50% .2 250/.4);--nc-primary-contrast:light-dark(#fff,oklch(15% .005 250));--nc-secondary:light-dark(oklch(45% .05 250),oklch(60% .05 250));--nc-secondary-hover:light-dark(oklch(35% .05 250),oklch(70% .05 250));--nc-secondary-focus:oklch(45% .05 250/.3);--nc-secondary-contrast:light-dark(#fff,oklch(15% .005 250));--nc-valid:light-dark(oklch(52% .17 145),oklch(65% .2 145));--nc-invalid:light-dark(oklch(55% .22 25),oklch(65% .22 25));--nc-font-sans:system-ui, sans-serif;--nc-font-mono:ui-monospace, Cascadia Code, Source Code Pro, Menlo, Consolas, DejaVu Sans Mono, monospace;--nc-spacing:1rem;--nc-radius:.25rem;--nc-content-width:720px}[data-theme=dark]{color-scheme:dark}[data-theme=light]{color-scheme:light}html{font-family:var(--nc-font-sans);color:var(--nc-text);background-color:var(--nc-surface-1);font-size:100%;line-height:1.5}body{grid-template-columns:1fr min(var(--nc-content-width), calc(100% - 2 * var(--nc-spacing))) 1fr;min-height:100dvh;display:grid}body>*{grid-column:2;min-width:0}::selection{background-color:var(--nc-primary-focus);color:var(--nc-text)}h1{margin-top:0;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:2rem;font-weight:700;line-height:1.1}h2{margin-top:2rem;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:1.75rem;font-weight:700;line-height:1.15}h3{margin-top:1.5rem;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:1.5rem;font-weight:700;line-height:1.2}h4{margin-top:1.5rem;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:1.25rem;font-weight:700;line-height:1.3}h5{margin-top:1.5rem;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:1.125rem;font-weight:700;line-height:1.4}h6{margin-top:1.5rem;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:1rem;font-weight:700;line-height:1.5}@media (width<=720px){h1{font-size:1.75rem}h2{font-size:1.5rem}h3{font-size:1.3rem}}p,ul,ol,dl,blockquote,pre,table,figure,form,fieldset{margin-top:0;margin-bottom:var(--nc-spacing)}ul,ol{padding-inline-start:1.5em}li{margin-bottom:.25em}:where(li)>:where(ul,ol){margin-bottom:0}dt{font-weight:600}dd{margin-inline-start:1.5em;margin-bottom:.5em}blockquote{margin-block:var(--nc-spacing);padding:.25em var(--nc-spacing);border-inline-start:.25rem solid var(--nc-border);margin-inline:0;font-style:italic}:where(blockquote) footer,:where(blockquote) cite{color:color-mix(in oklch, var(--nc-text), transparent 40%);font-size:.9em;font-style:normal}hr{background-color:color-mix(in oklch, var(--nc-border), transparent 40%);height:1px;margin:calc(var(--nc-spacing) * 2) 0;border:none}mark{color:light-dark(inherit,oklch(95% .01 85));background-color:light-dark(#fde68a,oklch(55% .12 85));border-radius:2px;padding:.1em .25em}address{font-style:normal}}