@luz-ds/docs 0.0.0-stage → 0.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/LICENSE +21 -0
- package/README.md +93 -2
- package/dist/classes.json +47 -0
- package/dist/components/dodont.css +85 -0
- package/dist/components/dodont.min.css +1 -0
- package/dist/components/example.css +46 -0
- package/dist/components/example.min.css +1 -0
- package/dist/components/page-foot.css +31 -0
- package/dist/components/page-foot.min.css +1 -0
- package/dist/components/page-head.css +99 -0
- package/dist/components/page-head.min.css +1 -0
- package/dist/components/pager.css +70 -0
- package/dist/components/pager.min.css +1 -0
- package/dist/components/rail.css +161 -0
- package/dist/components/rail.min.css +1 -0
- package/dist/components/shell.css +126 -0
- package/dist/components/shell.min.css +1 -0
- package/dist/docs.css +613 -0
- package/dist/docs.min.css +1 -0
- package/package.json +53 -3
package/dist/docs.css
ADDED
|
@@ -0,0 +1,613 @@
|
|
|
1
|
+
@layer luz.tokens, luz.themes, luz.settings, luz.generic, luz.elements, luz.objects, luz.components, luz.utilities, luz.site, luz.landing, luz.cms, luz.app, luz.docs, luz.print;
|
|
2
|
+
@layer luz.docs {
|
|
3
|
+
/* ==========================================================================
|
|
4
|
+
LUZ DOCS
|
|
5
|
+
The pieces of a documentation page: the shell (sidebar, content, rail),
|
|
6
|
+
the page head, the rail ("On this page" and the page's actions), the
|
|
7
|
+
example frame, do and don't, Previous / Next and the page foot. Each is a
|
|
8
|
+
class on a native element, on core's objects and components (.o-shell,
|
|
9
|
+
.o-main, .luz-sidebar, .luz-code-block). Docs adds only its layout, its
|
|
10
|
+
skin and its rhythm. No JavaScript.
|
|
11
|
+
Requires: @luz-ds/tokens and @luz-ds/core loaded first; @luz-ds/site
|
|
12
|
+
optional, loaded before this file.
|
|
13
|
+
========================================================================== */
|
|
14
|
+
|
|
15
|
+
/* ==========================================================================
|
|
16
|
+
LUZ DOCS: shell.
|
|
17
|
+
body.o-shell.luz-docs-shell > header, nav.luz-sidebar.luz-docs-nav,
|
|
18
|
+
aside.luz-docs-rail, main.o-main.luz-docs-main, footer. "On this page"
|
|
19
|
+
comes before the content, in the markup and on screen: three columns
|
|
20
|
+
from 80rem (the sidebar, the content, the rail, which stretches over the
|
|
21
|
+
content's row), two from 60rem (the rail above the content, in its
|
|
22
|
+
column), one below, in the order of the markup: nothing is lost when the
|
|
23
|
+
third column goes (WCAG 1.4.10). The skip link goes to main, past the
|
|
24
|
+
sidebar and the rail. The header and the footer span the shell. The
|
|
25
|
+
content's children keep to the measure, --luz-docs-measure.
|
|
26
|
+
Core gives the grid, the sidebar and its drawer (a popover nav at 768px
|
|
27
|
+
and below); docs gives the tracks and the measure.
|
|
28
|
+
========================================================================== */
|
|
29
|
+
|
|
30
|
+
.luz-docs-shell {
|
|
31
|
+
--luz-docs-measure: 46rem;
|
|
32
|
+
--luz-docs-nav-w: 16.5rem;
|
|
33
|
+
--luz-docs-rail-w: 14rem;
|
|
34
|
+
--luz-docs-rail-top: var(--luz-space-lg);
|
|
35
|
+
|
|
36
|
+
/* The content takes the free height: on a short page the header keeps
|
|
37
|
+
its own height (core's shell is at least the height of the window) */
|
|
38
|
+
grid-template:
|
|
39
|
+
"head" auto
|
|
40
|
+
"nav" auto
|
|
41
|
+
"rail" auto
|
|
42
|
+
"main" 1fr
|
|
43
|
+
"foot" auto / minmax(0, 1fr);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.luz-docs-shell > :where(header) {
|
|
47
|
+
grid-area: head;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.luz-docs-nav {
|
|
51
|
+
grid-area: nav;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.luz-docs-main {
|
|
55
|
+
grid-area: main;
|
|
56
|
+
display: grid;
|
|
57
|
+
grid-template-columns: minmax(0, 1fr);
|
|
58
|
+
align-content: start;
|
|
59
|
+
gap: var(--luz-space-md);
|
|
60
|
+
min-inline-size: 0;
|
|
61
|
+
/* The footer follows the content: room for one break, not two */
|
|
62
|
+
padding: var(--luz-space-lg) var(--luz-space-md) var(--luz-space-xl);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.luz-docs-rail {
|
|
66
|
+
grid-area: rail;
|
|
67
|
+
min-inline-size: 0;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.luz-docs-shell > :where(footer) {
|
|
71
|
+
grid-area: foot;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/* Every child of the content keeps to the measure: a line of running text,
|
|
75
|
+
an example and its code alike. A section starts with more room above its
|
|
76
|
+
heading than between its blocks. */
|
|
77
|
+
.luz-docs-main > * {
|
|
78
|
+
max-inline-size: var(--luz-docs-measure);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.luz-docs-main > :where(h2) {
|
|
82
|
+
margin-block-start: var(--luz-space-xl);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/* Between core's drawer (768px and below) and two columns, the sidebar is
|
|
86
|
+
the first block above the content, popover or not */
|
|
87
|
+
@media (769px <= width < 60rem) {
|
|
88
|
+
.luz-docs-nav {
|
|
89
|
+
position: static;
|
|
90
|
+
block-size: auto;
|
|
91
|
+
inline-size: auto;
|
|
92
|
+
min-inline-size: 0;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
@media (min-width: 60rem) {
|
|
97
|
+
.luz-docs-shell {
|
|
98
|
+
grid-template:
|
|
99
|
+
"head head" auto
|
|
100
|
+
"nav rail" auto
|
|
101
|
+
"nav main" 1fr
|
|
102
|
+
"nav foot" auto / var(--luz-docs-nav-w) minmax(0, 1fr);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.luz-docs-nav {
|
|
106
|
+
inline-size: auto;
|
|
107
|
+
min-inline-size: 0;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.luz-docs-main {
|
|
111
|
+
padding-inline: var(--luz-space-xl);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
@media (min-width: 80rem) {
|
|
116
|
+
.luz-docs-shell {
|
|
117
|
+
grid-template:
|
|
118
|
+
"head head head" auto
|
|
119
|
+
"nav main rail" 1fr
|
|
120
|
+
"nav foot foot" auto / var(--luz-docs-nav-w) minmax(0, 1fr) var(--luz-docs-rail-w);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.luz-docs-main {
|
|
124
|
+
padding-block-end: var(--luz-space-3xl);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
@media print {
|
|
129
|
+
.luz-docs-shell {
|
|
130
|
+
display: block;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.luz-docs-rail {
|
|
134
|
+
display: none;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/* ==========================================================================
|
|
139
|
+
LUZ DOCS: page head.
|
|
140
|
+
header.luz-docs-page-head > p.__eyebrow (the area · the group), h1,
|
|
141
|
+
p.__lead (one sentence), ul.__meta (chips: the files, the script or "No
|
|
142
|
+
JavaScript", the modes, whether it is tested, its known issues). A chip
|
|
143
|
+
is a word in a rounded outline; a link in one is a 28px target. A page
|
|
144
|
+
that is not a component says its files in p.__files instead, one quiet
|
|
145
|
+
line ("Files: <code>…</code>"), without the chips.
|
|
146
|
+
========================================================================== */
|
|
147
|
+
|
|
148
|
+
.luz-docs-page-head {
|
|
149
|
+
display: grid;
|
|
150
|
+
grid-template-columns: minmax(0, 1fr);
|
|
151
|
+
gap: var(--luz-space-sm);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.luz-docs-page-head > :where(h1) {
|
|
155
|
+
margin: 0;
|
|
156
|
+
font-size: var(--luz-text-4xl);
|
|
157
|
+
line-height: 1.1;
|
|
158
|
+
text-wrap: balance;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
.luz-docs-page-head__eyebrow {
|
|
162
|
+
margin: 0;
|
|
163
|
+
font-family: var(--luz-font-sans);
|
|
164
|
+
font-size: var(--luz-text-xs);
|
|
165
|
+
font-weight: 500;
|
|
166
|
+
letter-spacing: 0.1em;
|
|
167
|
+
text-transform: uppercase;
|
|
168
|
+
color: var(--luz-text-secondary);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/* A package name in it keeps its own case: @luz-ds/core */
|
|
172
|
+
.luz-docs-page-head__eyebrow :where(code) {
|
|
173
|
+
letter-spacing: 0;
|
|
174
|
+
text-transform: none;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/* Spacing between letters breaks the joins of Arabic script */
|
|
178
|
+
.luz-docs-page-head__eyebrow:lang(ar) {
|
|
179
|
+
letter-spacing: 0;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.luz-docs-page-head__lead {
|
|
183
|
+
margin: 0;
|
|
184
|
+
font-size: var(--luz-text-lg);
|
|
185
|
+
color: var(--luz-text-secondary);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
.luz-docs-page-head__meta {
|
|
189
|
+
display: flex;
|
|
190
|
+
flex-wrap: wrap;
|
|
191
|
+
gap: var(--luz-space-xs);
|
|
192
|
+
margin: 0;
|
|
193
|
+
padding: 0;
|
|
194
|
+
list-style: none;
|
|
195
|
+
font-family: var(--luz-font-sans);
|
|
196
|
+
font-size: var(--luz-text-xs);
|
|
197
|
+
color: var(--luz-text-secondary);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
.luz-docs-page-head__meta > :where(li) {
|
|
201
|
+
display: inline-flex;
|
|
202
|
+
align-items: center;
|
|
203
|
+
min-block-size: var(--luz-control-sm);
|
|
204
|
+
padding-inline: var(--luz-space-sm);
|
|
205
|
+
border: 1px solid var(--luz-divider);
|
|
206
|
+
border-radius: var(--luz-radius-full);
|
|
207
|
+
overflow-wrap: anywhere;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.luz-docs-page-head__meta :where(a) {
|
|
211
|
+
display: inline-flex;
|
|
212
|
+
align-items: center;
|
|
213
|
+
min-block-size: var(--luz-control-sm);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
.luz-docs-page-head__files {
|
|
217
|
+
margin: 0;
|
|
218
|
+
font-family: var(--luz-font-sans);
|
|
219
|
+
font-size: var(--luz-text-xs);
|
|
220
|
+
color: var(--luz-text-secondary);
|
|
221
|
+
overflow-wrap: anywhere;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
@media (max-width: 640px) {
|
|
225
|
+
.luz-docs-page-head > :where(h1) {
|
|
226
|
+
font-size: var(--luz-text-2xl);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
.luz-docs-page-head__lead {
|
|
230
|
+
font-size: var(--luz-text-base);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/* ==========================================================================
|
|
235
|
+
LUZ DOCS: rail.
|
|
236
|
+
aside.luz-docs-rail > div.luz-docs-rail__inner > nav.luz-docs-rail__onpage
|
|
237
|
+
("On this page": a details.__fold, its summary.__title, ul.__list of
|
|
238
|
+
a.__link, an h3 in a nested ul.__sub) + .luz-docs-rail__actions (Copy
|
|
239
|
+
page, Edit, Report). In the shell's third column from 80rem the aside
|
|
240
|
+
stretches over its grid area and its inner box stays in view while the
|
|
241
|
+
page scrolls (native sticky) inside it, so it never covers the footer
|
|
242
|
+
under it (WCAG 2.4.11); the inner box scrolls on its own when it is
|
|
243
|
+
taller than the window, with room at its start for a focus ring. Below
|
|
244
|
+
80rem the rail is drawn above the content (it comes before main in the
|
|
245
|
+
markup), in its column, and does not stick; a script may fold the list
|
|
246
|
+
there (its details is written open, so without one it reads in full). A link of the list also carries core's .luz-sidebar__link,
|
|
247
|
+
so core's scroll spy marks the section in view (aria-current="true"):
|
|
248
|
+
the mark is the weight and a start border, never the colour alone.
|
|
249
|
+
========================================================================== */
|
|
250
|
+
|
|
251
|
+
/* Above the content (below 80rem): the content's own top padding is the gap */
|
|
252
|
+
.luz-docs-rail {
|
|
253
|
+
padding: var(--luz-space-lg) var(--luz-space-md) 0;
|
|
254
|
+
font-family: var(--luz-font-sans);
|
|
255
|
+
font-size: var(--luz-text-sm);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/* Above the content (below 80rem) it keeps the content's gutters */
|
|
259
|
+
@media (min-width: 60rem) {
|
|
260
|
+
.luz-docs-rail {
|
|
261
|
+
padding-inline: var(--luz-space-xl);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
@media (min-width: 80rem) {
|
|
266
|
+
.luz-docs-rail {
|
|
267
|
+
padding-block: var(--luz-space-lg);
|
|
268
|
+
padding-inline: 0 var(--luz-space-md);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
.luz-docs-rail__inner {
|
|
272
|
+
position: sticky;
|
|
273
|
+
inset-block-start: var(--luz-docs-rail-top, 0);
|
|
274
|
+
max-block-size: calc(100dvh - var(--luz-docs-rail-top, 0rem));
|
|
275
|
+
overflow-y: auto;
|
|
276
|
+
/* The box clips: a focus ring (2px, 2px away) keeps its start edge */
|
|
277
|
+
padding-inline-start: var(--luz-space-xs);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
.luz-docs-rail__title {
|
|
282
|
+
min-block-size: var(--luz-control-sm);
|
|
283
|
+
font-weight: 600;
|
|
284
|
+
color: var(--luz-text-primary);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/* In the rail, "On this page" is a list under its title, not core's box */
|
|
288
|
+
.luz-docs-rail .luz-docs-rail__onpage .luz-docs-rail__fold {
|
|
289
|
+
margin: 0;
|
|
290
|
+
padding: 0;
|
|
291
|
+
border: 0;
|
|
292
|
+
border-radius: 0;
|
|
293
|
+
background: none;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
.luz-docs-rail .luz-docs-rail__onpage .luz-docs-rail__title {
|
|
297
|
+
margin: 0 0 var(--luz-space-xs);
|
|
298
|
+
padding-inline: 0;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
.luz-docs-rail__list,
|
|
302
|
+
.luz-docs-rail__sub {
|
|
303
|
+
margin: 0;
|
|
304
|
+
padding: 0;
|
|
305
|
+
list-style: none;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
.luz-docs-rail__list {
|
|
309
|
+
border-inline-start: 1px solid var(--luz-divider);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/* Core's sidebar link is drawn for the sidebar's own surface: here it is
|
|
313
|
+
text on the page */
|
|
314
|
+
.luz-docs-rail__link {
|
|
315
|
+
display: flex;
|
|
316
|
+
align-items: center;
|
|
317
|
+
min-block-size: var(--luz-control-sm);
|
|
318
|
+
margin-inline-start: -1px;
|
|
319
|
+
padding: var(--luz-space-2xs) var(--luz-space-sm);
|
|
320
|
+
border-inline-start: 2px solid transparent;
|
|
321
|
+
background: none;
|
|
322
|
+
color: var(--luz-text-secondary);
|
|
323
|
+
font-size: inherit;
|
|
324
|
+
font-weight: 400;
|
|
325
|
+
text-decoration: none;
|
|
326
|
+
/* A heading's long word ("accessibility" at 400 % text, 320 px) breaks
|
|
327
|
+
inside the column instead of widening the page (WCAG 1.4.10) */
|
|
328
|
+
overflow-wrap: anywhere;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
.luz-docs-rail__sub .luz-docs-rail__link {
|
|
332
|
+
padding-inline-start: var(--luz-space-lg);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
.luz-docs-rail__link:hover {
|
|
336
|
+
background: var(--luz-surface-muted);
|
|
337
|
+
color: var(--luz-text-primary);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
.luz-docs-rail__link[aria-current="true"] {
|
|
341
|
+
border-inline-start-color: var(--luz-brand-primary);
|
|
342
|
+
background: none;
|
|
343
|
+
color: var(--luz-text-primary);
|
|
344
|
+
font-weight: 600;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
.luz-docs-rail__actions {
|
|
348
|
+
display: grid;
|
|
349
|
+
justify-items: start;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/* A rule between the list and the actions; without a list, none */
|
|
353
|
+
.luz-docs-rail__onpage + .luz-docs-rail__actions {
|
|
354
|
+
margin-block-start: var(--luz-space-lg);
|
|
355
|
+
padding-block-start: var(--luz-space-md);
|
|
356
|
+
border-block-start: 1px solid var(--luz-divider);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
.luz-docs-rail__actions > :where(a, button) {
|
|
360
|
+
display: inline-flex;
|
|
361
|
+
align-items: center;
|
|
362
|
+
min-block-size: var(--luz-control-sm);
|
|
363
|
+
overflow-wrap: anywhere;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/* An action a script turns into a button (copy, not go) reads as one of
|
|
367
|
+
the list: the same text, colour and underline as its links */
|
|
368
|
+
.luz-docs-rail__actions > :where(button) {
|
|
369
|
+
padding: 0;
|
|
370
|
+
border: 0;
|
|
371
|
+
background: none;
|
|
372
|
+
color: var(--luz-brand-primary);
|
|
373
|
+
font: inherit;
|
|
374
|
+
text-align: start;
|
|
375
|
+
text-decoration: underline;
|
|
376
|
+
text-underline-offset: 0.18em;
|
|
377
|
+
cursor: pointer;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/* Forced colours drop the transparent start border to the text colour: the
|
|
381
|
+
current section is the only one with a border of its own */
|
|
382
|
+
@media (forced-colors: active) {
|
|
383
|
+
.luz-docs-rail__link {
|
|
384
|
+
border-inline-start-color: Canvas;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
.luz-docs-rail__link[aria-current="true"] {
|
|
388
|
+
border-inline-start-color: Highlight;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/* ==========================================================================
|
|
393
|
+
LUZ DOCS: example.
|
|
394
|
+
figure.luz-docs-example > div.__preview (the live markup, in a
|
|
395
|
+
div.__frame) + an optional div.__code (core's pre.luz-code-block). One
|
|
396
|
+
frame for both: the code sits under the preview, across its width, and a
|
|
397
|
+
long line scrolls inside its own box. The frame is as wide as the
|
|
398
|
+
preview, or as --luz-docs-example-w says (a width selector sets it:
|
|
399
|
+
20rem is a phone), never wider; it is a size container, so what is in it
|
|
400
|
+
answers to the frame.
|
|
401
|
+
========================================================================== */
|
|
402
|
+
|
|
403
|
+
.luz-docs-example {
|
|
404
|
+
display: grid;
|
|
405
|
+
grid-template-columns: minmax(0, 1fr);
|
|
406
|
+
margin: 0;
|
|
407
|
+
padding: 0;
|
|
408
|
+
border: 1px solid var(--luz-divider);
|
|
409
|
+
border-radius: var(--luz-radius-md);
|
|
410
|
+
background: var(--luz-surface);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
.luz-docs-example__preview {
|
|
414
|
+
padding: var(--luz-space-md);
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
.luz-docs-example__frame {
|
|
418
|
+
inline-size: min(100%, var(--luz-docs-example-w, 100%));
|
|
419
|
+
margin-inline: auto;
|
|
420
|
+
container-type: inline-size;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
.luz-docs-example__code {
|
|
424
|
+
min-inline-size: 0;
|
|
425
|
+
border-block-start: 1px solid var(--luz-divider);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/* The frame draws the edge: the code block keeps only its inner corners */
|
|
429
|
+
.luz-docs-example__code > :where(pre) {
|
|
430
|
+
margin: 0;
|
|
431
|
+
border: 0;
|
|
432
|
+
border-radius: 0 0 calc(var(--luz-radius-md) - 1px) calc(var(--luz-radius-md) - 1px);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
/* ==========================================================================
|
|
436
|
+
LUZ DOCS: do and don't.
|
|
437
|
+
div.luz-docs-dodont > figure.__item.__item--do, then --dont, each a
|
|
438
|
+
figcaption > strong.__verdict ("Do", "Don't") and its reason, then a
|
|
439
|
+
div.__stage (the example, inert and aria-hidden: the caption says what it
|
|
440
|
+
shows) or a code block. Side by side when there is room, stacked below.
|
|
441
|
+
The verdict is a word; the mark before it (a tick, a cross) and the
|
|
442
|
+
frame (solid, dashed) are extra cues, never the only one, and so is the
|
|
443
|
+
colour (green, red).
|
|
444
|
+
========================================================================== */
|
|
445
|
+
|
|
446
|
+
.luz-docs-dodont {
|
|
447
|
+
display: grid;
|
|
448
|
+
grid-template-columns: repeat(auto-fit, minmax(min(100%, 17.5rem), 1fr));
|
|
449
|
+
gap: var(--luz-space-md);
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
.luz-docs-dodont__item {
|
|
453
|
+
display: grid;
|
|
454
|
+
grid-template-rows: auto 1fr;
|
|
455
|
+
gap: var(--luz-space-sm);
|
|
456
|
+
min-inline-size: 0;
|
|
457
|
+
margin: 0;
|
|
458
|
+
padding: var(--luz-space-sm);
|
|
459
|
+
border: 2px solid var(--luz-divider);
|
|
460
|
+
border-radius: var(--luz-radius-md);
|
|
461
|
+
background: var(--luz-surface);
|
|
462
|
+
color: var(--luz-text-primary);
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
.luz-docs-dodont__item--do {
|
|
466
|
+
border-color: var(--luz-color-success);
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
.luz-docs-dodont__item--dont {
|
|
470
|
+
border-style: dashed;
|
|
471
|
+
border-color: var(--luz-color-danger);
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
.luz-docs-dodont__item > :where(figcaption) {
|
|
475
|
+
font-style: normal;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
.luz-docs-dodont__verdict {
|
|
479
|
+
display: block;
|
|
480
|
+
color: var(--luz-color-success);
|
|
481
|
+
font-family: var(--luz-font-sans);
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
.luz-docs-dodont__item--dont .luz-docs-dodont__verdict {
|
|
485
|
+
color: var(--luz-color-danger);
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
/* The mark is decoration: the word says it. A browser without alternative
|
|
489
|
+
text for content reads the first value */
|
|
490
|
+
.luz-docs-dodont__verdict::before {
|
|
491
|
+
content: "\2713 ";
|
|
492
|
+
content: "\2713 " / "";
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
.luz-docs-dodont__item--dont .luz-docs-dodont__verdict::before {
|
|
496
|
+
content: "\2715 ";
|
|
497
|
+
content: "\2715 " / "";
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
.luz-docs-dodont__stage {
|
|
501
|
+
display: grid;
|
|
502
|
+
gap: var(--luz-space-sm);
|
|
503
|
+
align-content: center;
|
|
504
|
+
min-inline-size: 0;
|
|
505
|
+
padding: var(--luz-space-md);
|
|
506
|
+
border: 1px solid var(--luz-divider);
|
|
507
|
+
border-radius: var(--luz-radius-sm);
|
|
508
|
+
background: var(--luz-surface-page);
|
|
509
|
+
color: var(--luz-text-primary);
|
|
510
|
+
overflow-wrap: anywhere;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
.luz-docs-dodont__stage > :where(*) {
|
|
514
|
+
margin-block: 0;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
/* ==========================================================================
|
|
518
|
+
LUZ DOCS: pager.
|
|
519
|
+
nav[aria-label] > ul.luz-docs-pager > li.__prev / li.__next >
|
|
520
|
+
a.__link[rel] > span.__label ("Previous", "Next") + span.__title (the
|
|
521
|
+
page). Two link blocks side by side, Next at the end, the whole block the
|
|
522
|
+
link; stacked at 640px and below. Name each link from its visible text
|
|
523
|
+
first ("Previous: Badge").
|
|
524
|
+
========================================================================== */
|
|
525
|
+
|
|
526
|
+
.luz-docs-pager {
|
|
527
|
+
display: grid;
|
|
528
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
529
|
+
gap: var(--luz-space-md);
|
|
530
|
+
margin: 0;
|
|
531
|
+
padding: 0;
|
|
532
|
+
list-style: none;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
.luz-docs-pager__prev {
|
|
536
|
+
grid-column: 1;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
.luz-docs-pager__next {
|
|
540
|
+
grid-column: 2;
|
|
541
|
+
text-align: end;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
.luz-docs-pager__link {
|
|
545
|
+
display: grid;
|
|
546
|
+
grid-template-columns: minmax(0, 1fr);
|
|
547
|
+
gap: var(--luz-space-3xs);
|
|
548
|
+
block-size: 100%;
|
|
549
|
+
padding: var(--luz-space-sm) var(--luz-space-md);
|
|
550
|
+
border: 1px solid var(--luz-divider);
|
|
551
|
+
border-radius: var(--luz-radius-md);
|
|
552
|
+
text-decoration: none;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
.luz-docs-pager__link:hover {
|
|
556
|
+
border-color: var(--luz-outline);
|
|
557
|
+
background: var(--luz-surface-hover);
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
.luz-docs-pager__link:hover .luz-docs-pager__title {
|
|
561
|
+
text-decoration: underline;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
.luz-docs-pager__label {
|
|
565
|
+
font-size: var(--luz-text-sm);
|
|
566
|
+
color: var(--luz-text-secondary);
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
.luz-docs-pager__title {
|
|
570
|
+
font-size: var(--luz-text-lg);
|
|
571
|
+
font-weight: 600;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
@media (max-width: 640px) {
|
|
575
|
+
.luz-docs-pager {
|
|
576
|
+
grid-template-columns: minmax(0, 1fr);
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
.luz-docs-pager__next {
|
|
580
|
+
grid-column: 1;
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
/* ==========================================================================
|
|
585
|
+
LUZ DOCS: page foot.
|
|
586
|
+
p.luz-docs-page-foot: "Last updated" and a <time>, then "Edit this page"
|
|
587
|
+
and "Report a problem", separated by a middle dot in the text. Small
|
|
588
|
+
print under the content, after the pager; it wraps on a narrow screen
|
|
589
|
+
and each link is a 28px target.
|
|
590
|
+
========================================================================== */
|
|
591
|
+
|
|
592
|
+
.luz-docs-page-foot {
|
|
593
|
+
margin: 0;
|
|
594
|
+
padding-block-start: var(--luz-space-md);
|
|
595
|
+
border-block-start: 1px solid var(--luz-divider);
|
|
596
|
+
font-family: var(--luz-font-sans);
|
|
597
|
+
font-size: var(--luz-text-sm);
|
|
598
|
+
color: var(--luz-text-secondary);
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
.luz-docs-page-foot > :where(a) {
|
|
602
|
+
display: inline-flex;
|
|
603
|
+
align-items: center;
|
|
604
|
+
min-block-size: var(--luz-control-sm);
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
/* The date in the size of the line, not core's smaller <time> */
|
|
608
|
+
.luz-docs-page-foot > :where(time) {
|
|
609
|
+
font-size: inherit;
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
|
|
613
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@layer luz.tokens,luz.themes,luz.settings,luz.generic,luz.elements,luz.objects,luz.components,luz.utilities,luz.site,luz.landing,luz.cms,luz.app,luz.docs,luz.print;@layer luz.docs{.luz-docs-shell{--luz-docs-measure: 46rem;--luz-docs-nav-w: 16.5rem;--luz-docs-rail-w: 14rem;--luz-docs-rail-top: var(--luz-space-lg);grid-template:"head" auto "nav" auto "rail" auto "main" 1fr "foot" auto / minmax(0,1fr)}.luz-docs-shell>:where(header){grid-area:head}.luz-docs-nav{grid-area:nav}.luz-docs-main{grid-area:main;display:grid;grid-template-columns:minmax(0,1fr);align-content:start;gap:var(--luz-space-md);min-inline-size:0;padding:var(--luz-space-lg) var(--luz-space-md) var(--luz-space-xl)}.luz-docs-rail{grid-area:rail;min-inline-size:0}.luz-docs-shell>:where(footer){grid-area:foot}.luz-docs-main>*{max-inline-size:var(--luz-docs-measure)}.luz-docs-main>:where(h2){margin-block-start:var(--luz-space-xl)}@media(769px<=width<60rem){.luz-docs-nav{position:static;block-size:auto;inline-size:auto;min-inline-size:0}}@media(min-width:60rem){.luz-docs-shell{grid-template:"head head" auto "nav rail" auto "nav main" 1fr "nav foot" auto / var(--luz-docs-nav-w) minmax(0,1fr)}.luz-docs-nav{inline-size:auto;min-inline-size:0}.luz-docs-main{padding-inline:var(--luz-space-xl)}}@media(min-width:80rem){.luz-docs-shell{grid-template:"head head head" auto "nav main rail" 1fr "nav foot foot" auto / var(--luz-docs-nav-w) minmax(0,1fr) var(--luz-docs-rail-w)}.luz-docs-main{padding-block-end:var(--luz-space-3xl)}}@media print{.luz-docs-shell{display:block}.luz-docs-rail{display:none}}.luz-docs-page-head{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--luz-space-sm)}.luz-docs-page-head>:where(h1){margin:0;font-size:var(--luz-text-4xl);line-height:1.1;text-wrap:balance}.luz-docs-page-head__eyebrow{margin:0;font-family:var(--luz-font-sans);font-size:var(--luz-text-xs);font-weight:500;letter-spacing:.1em;text-transform:uppercase;color:var(--luz-text-secondary)}.luz-docs-page-head__eyebrow :where(code){letter-spacing:0;text-transform:none}.luz-docs-page-head__eyebrow:lang(ar){letter-spacing:0}.luz-docs-page-head__lead{margin:0;font-size:var(--luz-text-lg);color:var(--luz-text-secondary)}.luz-docs-page-head__meta{display:flex;flex-wrap:wrap;gap:var(--luz-space-xs);margin:0;padding:0;list-style:none;font-family:var(--luz-font-sans);font-size:var(--luz-text-xs);color:var(--luz-text-secondary)}.luz-docs-page-head__meta>:where(li){display:inline-flex;align-items:center;min-block-size:var(--luz-control-sm);padding-inline:var(--luz-space-sm);border:1px solid var(--luz-divider);border-radius:var(--luz-radius-full);overflow-wrap:anywhere}.luz-docs-page-head__meta :where(a){display:inline-flex;align-items:center;min-block-size:var(--luz-control-sm)}.luz-docs-page-head__files{margin:0;font-family:var(--luz-font-sans);font-size:var(--luz-text-xs);color:var(--luz-text-secondary);overflow-wrap:anywhere}@media(max-width:640px){.luz-docs-page-head>:where(h1){font-size:var(--luz-text-2xl)}.luz-docs-page-head__lead{font-size:var(--luz-text-base)}}.luz-docs-rail{padding:var(--luz-space-lg) var(--luz-space-md) 0;font-family:var(--luz-font-sans);font-size:var(--luz-text-sm)}@media(min-width:60rem){.luz-docs-rail{padding-inline:var(--luz-space-xl)}}@media(min-width:80rem){.luz-docs-rail{padding-block:var(--luz-space-lg);padding-inline:0 var(--luz-space-md)}.luz-docs-rail__inner{position:sticky;inset-block-start:var(--luz-docs-rail-top, 0);max-block-size:calc(100dvh - var(--luz-docs-rail-top, 0rem));overflow-y:auto;padding-inline-start:var(--luz-space-xs)}}.luz-docs-rail__title{min-block-size:var(--luz-control-sm);font-weight:600;color:var(--luz-text-primary)}.luz-docs-rail .luz-docs-rail__onpage .luz-docs-rail__fold{margin:0;padding:0;border:0;border-radius:0;background:none}.luz-docs-rail .luz-docs-rail__onpage .luz-docs-rail__title{margin:0 0 var(--luz-space-xs);padding-inline:0}.luz-docs-rail__list,.luz-docs-rail__sub{margin:0;padding:0;list-style:none}.luz-docs-rail__list{border-inline-start:1px solid var(--luz-divider)}.luz-docs-rail__link{display:flex;align-items:center;min-block-size:var(--luz-control-sm);margin-inline-start:-1px;padding:var(--luz-space-2xs) var(--luz-space-sm);border-inline-start:2px solid transparent;background:none;color:var(--luz-text-secondary);font-size:inherit;font-weight:400;text-decoration:none;overflow-wrap:anywhere}.luz-docs-rail__sub .luz-docs-rail__link{padding-inline-start:var(--luz-space-lg)}.luz-docs-rail__link:hover{background:var(--luz-surface-muted);color:var(--luz-text-primary)}.luz-docs-rail__link[aria-current=true]{border-inline-start-color:var(--luz-brand-primary);background:none;color:var(--luz-text-primary);font-weight:600}.luz-docs-rail__actions{display:grid;justify-items:start}.luz-docs-rail__onpage+.luz-docs-rail__actions{margin-block-start:var(--luz-space-lg);padding-block-start:var(--luz-space-md);border-block-start:1px solid var(--luz-divider)}.luz-docs-rail__actions>:where(a,button){display:inline-flex;align-items:center;min-block-size:var(--luz-control-sm);overflow-wrap:anywhere}.luz-docs-rail__actions>:where(button){padding:0;border:0;background:none;color:var(--luz-brand-primary);font:inherit;text-align:start;text-decoration:underline;text-underline-offset:.18em;cursor:pointer}@media(forced-colors:active){.luz-docs-rail__link{border-inline-start-color:Canvas}.luz-docs-rail__link[aria-current=true]{border-inline-start-color:Highlight}}.luz-docs-example{display:grid;grid-template-columns:minmax(0,1fr);margin:0;padding:0;border:1px solid var(--luz-divider);border-radius:var(--luz-radius-md);background:var(--luz-surface)}.luz-docs-example__preview{padding:var(--luz-space-md)}.luz-docs-example__frame{inline-size:min(100%,var(--luz-docs-example-w, 100%));margin-inline:auto;container-type:inline-size}.luz-docs-example__code{min-inline-size:0;border-block-start:1px solid var(--luz-divider)}.luz-docs-example__code>:where(pre){margin:0;border:0;border-radius:0 0 calc(var(--luz-radius-md) - 1px) calc(var(--luz-radius-md) - 1px)}.luz-docs-dodont{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,17.5rem),1fr));gap:var(--luz-space-md)}.luz-docs-dodont__item{display:grid;grid-template-rows:auto 1fr;gap:var(--luz-space-sm);min-inline-size:0;margin:0;padding:var(--luz-space-sm);border:2px solid var(--luz-divider);border-radius:var(--luz-radius-md);background:var(--luz-surface);color:var(--luz-text-primary)}.luz-docs-dodont__item--do{border-color:var(--luz-color-success)}.luz-docs-dodont__item--dont{border-style:dashed;border-color:var(--luz-color-danger)}.luz-docs-dodont__item>:where(figcaption){font-style:normal}.luz-docs-dodont__verdict{display:block;color:var(--luz-color-success);font-family:var(--luz-font-sans)}.luz-docs-dodont__item--dont .luz-docs-dodont__verdict{color:var(--luz-color-danger)}.luz-docs-dodont__verdict:before{content:"\2713 ";content:"\2713 " / ""}.luz-docs-dodont__item--dont .luz-docs-dodont__verdict:before{content:"\2715 ";content:"\2715 " / ""}.luz-docs-dodont__stage{display:grid;gap:var(--luz-space-sm);align-content:center;min-inline-size:0;padding:var(--luz-space-md);border:1px solid var(--luz-divider);border-radius:var(--luz-radius-sm);background:var(--luz-surface-page);color:var(--luz-text-primary);overflow-wrap:anywhere}.luz-docs-dodont__stage>:where(*){margin-block:0}.luz-docs-pager{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--luz-space-md);margin:0;padding:0;list-style:none}.luz-docs-pager__prev{grid-column:1}.luz-docs-pager__next{grid-column:2;text-align:end}.luz-docs-pager__link{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--luz-space-3xs);block-size:100%;padding:var(--luz-space-sm) var(--luz-space-md);border:1px solid var(--luz-divider);border-radius:var(--luz-radius-md);text-decoration:none}.luz-docs-pager__link:hover{border-color:var(--luz-outline);background:var(--luz-surface-hover)}.luz-docs-pager__link:hover .luz-docs-pager__title{text-decoration:underline}.luz-docs-pager__label{font-size:var(--luz-text-sm);color:var(--luz-text-secondary)}.luz-docs-pager__title{font-size:var(--luz-text-lg);font-weight:600}@media(max-width:640px){.luz-docs-pager{grid-template-columns:minmax(0,1fr)}.luz-docs-pager__next{grid-column:1}}.luz-docs-page-foot{margin:0;padding-block-start:var(--luz-space-md);border-block-start:1px solid var(--luz-divider);font-family:var(--luz-font-sans);font-size:var(--luz-text-sm);color:var(--luz-text-secondary)}.luz-docs-page-foot>:where(a){display:inline-flex;align-items:center;min-block-size:var(--luz-control-sm)}.luz-docs-page-foot>:where(time){font-size:inherit}}
|
package/package.json
CHANGED
|
@@ -1,6 +1,56 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@luz-ds/docs",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "LUZ Design System — the pieces of a documentation page (the shell, the page head, the rail, the example frame, do and don't, the pager and the page foot), built on @luz-ds/core",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"exports": {
|
|
8
|
+
"./css": "./dist/docs.css",
|
|
9
|
+
"./css/min": "./dist/docs.min.css",
|
|
10
|
+
"./components/*": "./dist/components/*",
|
|
11
|
+
"./classes.json": "./dist/classes.json",
|
|
12
|
+
"./package.json": "./package.json"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"LICENSE"
|
|
17
|
+
],
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "https://github.com/nandovejer/luz.git",
|
|
21
|
+
"directory": "packages/docs"
|
|
22
|
+
},
|
|
23
|
+
"homepage": "https://github.com/nandovejer/luz#readme",
|
|
24
|
+
"bugs": {
|
|
25
|
+
"url": "https://github.com/nandovejer/luz/issues"
|
|
26
|
+
},
|
|
27
|
+
"keywords": [
|
|
28
|
+
"design-system",
|
|
29
|
+
"css",
|
|
30
|
+
"documentation",
|
|
31
|
+
"docs",
|
|
32
|
+
"patterns",
|
|
33
|
+
"vanilla"
|
|
34
|
+
],
|
|
35
|
+
"sideEffects": [
|
|
36
|
+
"*.css"
|
|
37
|
+
],
|
|
38
|
+
"publishConfig": {
|
|
39
|
+
"access": "public"
|
|
40
|
+
},
|
|
41
|
+
"peerDependencies": {
|
|
42
|
+
"@luz-ds/core": "^0.1.0",
|
|
43
|
+
"@luz-ds/site": "^0.1.0",
|
|
44
|
+
"@luz-ds/tokens": "^0.1.0"
|
|
45
|
+
},
|
|
46
|
+
"peerDependenciesMeta": {
|
|
47
|
+
"@luz-ds/site": {
|
|
48
|
+
"optional": true
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@luz-ds/core": "0.1.0",
|
|
53
|
+
"@luz-ds/site": "0.1.0",
|
|
54
|
+
"@luz-ds/tokens": "0.1.0"
|
|
55
|
+
}
|
|
6
56
|
}
|