@oddkin/workbench 0.0.0-stage → 1.0.0-beta.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 +36 -2
- package/dist/app/copy.d.ts +43 -0
- package/dist/app/copy.d.ts.map +1 -0
- package/dist/app/copy.js +47 -0
- package/dist/app/copy.js.map +1 -0
- package/dist/app/define.d.ts +3 -0
- package/dist/app/define.d.ts.map +1 -0
- package/dist/app/define.js +10 -0
- package/dist/app/define.js.map +1 -0
- package/dist/app/details.d.ts +22 -0
- package/dist/app/details.d.ts.map +1 -0
- package/dist/app/details.js +16 -0
- package/dist/app/details.js.map +1 -0
- package/dist/app/index.d.ts +12 -0
- package/dist/app/index.d.ts.map +1 -0
- package/dist/app/index.js +9 -0
- package/dist/app/index.js.map +1 -0
- package/dist/app/routes.d.ts +26 -0
- package/dist/app/routes.d.ts.map +1 -0
- package/dist/app/routes.js +94 -0
- package/dist/app/routes.js.map +1 -0
- package/dist/app/search.d.ts +17 -0
- package/dist/app/search.d.ts.map +1 -0
- package/dist/app/search.js +52 -0
- package/dist/app/search.js.map +1 -0
- package/dist/app/shell.d.ts +29 -0
- package/dist/app/shell.d.ts.map +1 -0
- package/dist/app/shell.js +435 -0
- package/dist/app/shell.js.map +1 -0
- package/dist/app/styles.d.ts +2 -0
- package/dist/app/styles.d.ts.map +1 -0
- package/dist/app/styles.js +373 -0
- package/dist/app/styles.js.map +1 -0
- package/dist/app/theme-studio.d.ts +12 -0
- package/dist/app/theme-studio.d.ts.map +1 -0
- package/dist/app/theme-studio.js +14 -0
- package/dist/app/theme-studio.js.map +1 -0
- package/dist/app/views.d.ts +34 -0
- package/dist/app/views.d.ts.map +1 -0
- package/dist/app/views.js +230 -0
- package/dist/app/views.js.map +1 -0
- package/dist/config/index.d.ts +170 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +148 -0
- package/dist/config/index.js.map +1 -0
- package/dist/conformance/button.d.ts +2 -0
- package/dist/conformance/button.d.ts.map +1 -0
- package/dist/conformance/button.js +233 -0
- package/dist/conformance/button.js.map +1 -0
- package/dist/conformance/index.d.ts +107 -0
- package/dist/conformance/index.d.ts.map +1 -0
- package/dist/conformance/index.js +60 -0
- package/dist/conformance/index.js.map +1 -0
- package/dist/data/build.d.ts +36 -0
- package/dist/data/build.d.ts.map +1 -0
- package/dist/data/build.js +248 -0
- package/dist/data/build.js.map +1 -0
- package/dist/data/import-map.d.ts +53 -0
- package/dist/data/import-map.d.ts.map +1 -0
- package/dist/data/import-map.js +160 -0
- package/dist/data/import-map.js.map +1 -0
- package/dist/data/index.d.ts +14 -0
- package/dist/data/index.d.ts.map +1 -0
- package/dist/data/index.js +10 -0
- package/dist/data/index.js.map +1 -0
- package/dist/data/theme-studio.d.ts +21 -0
- package/dist/data/theme-studio.d.ts.map +1 -0
- package/dist/data/theme-studio.js +116 -0
- package/dist/data/theme-studio.js.map +1 -0
- package/dist/data/types.d.ts +169 -0
- package/dist/data/types.d.ts.map +1 -0
- package/dist/data/types.js +4 -0
- package/dist/data/types.js.map +1 -0
- package/dist/examples/index.d.ts +101 -0
- package/dist/examples/index.d.ts.map +1 -0
- package/dist/examples/index.js +106 -0
- package/dist/examples/index.js.map +1 -0
- package/dist/frame/index.d.ts +9 -0
- package/dist/frame/index.d.ts.map +1 -0
- package/dist/frame/index.js +468 -0
- package/dist/frame/index.js.map +1 -0
- package/dist/internal/diagnostics.d.ts +17 -0
- package/dist/internal/diagnostics.d.ts.map +1 -0
- package/dist/internal/diagnostics.js +19 -0
- package/dist/internal/diagnostics.js.map +1 -0
- package/dist/node/bin.d.ts +3 -0
- package/dist/node/bin.d.ts.map +1 -0
- package/dist/node/bin.js +12 -0
- package/dist/node/bin.js.map +1 -0
- package/dist/node/cli.d.ts +17 -0
- package/dist/node/cli.d.ts.map +1 -0
- package/dist/node/cli.js +198 -0
- package/dist/node/cli.js.map +1 -0
- package/dist/node/config.d.ts +28 -0
- package/dist/node/config.d.ts.map +1 -0
- package/dist/node/config.js +80 -0
- package/dist/node/config.js.map +1 -0
- package/dist/node/generated.d.ts +19 -0
- package/dist/node/generated.d.ts.map +1 -0
- package/dist/node/generated.js +109 -0
- package/dist/node/generated.js.map +1 -0
- package/dist/node/html.d.ts +35 -0
- package/dist/node/html.d.ts.map +1 -0
- package/dist/node/html.js +51 -0
- package/dist/node/html.js.map +1 -0
- package/dist/node/index.d.ts +24 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +15 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/inputs.d.ts +24 -0
- package/dist/node/inputs.d.ts.map +1 -0
- package/dist/node/inputs.js +259 -0
- package/dist/node/inputs.js.map +1 -0
- package/dist/node/packages.d.ts +35 -0
- package/dist/node/packages.d.ts.map +1 -0
- package/dist/node/packages.js +87 -0
- package/dist/node/packages.js.map +1 -0
- package/dist/node/preload.d.ts +10 -0
- package/dist/node/preload.d.ts.map +1 -0
- package/dist/node/preload.js +61 -0
- package/dist/node/preload.js.map +1 -0
- package/dist/node/server.d.ts +42 -0
- package/dist/node/server.d.ts.map +1 -0
- package/dist/node/server.js +369 -0
- package/dist/node/server.js.map +1 -0
- package/dist/node/static.d.ts +33 -0
- package/dist/node/static.d.ts.map +1 -0
- package/dist/node/static.js +141 -0
- package/dist/node/static.js.map +1 -0
- package/dist/node/workbench.d.ts +43 -0
- package/dist/node/workbench.d.ts.map +1 -0
- package/dist/node/workbench.js +183 -0
- package/dist/node/workbench.js.map +1 -0
- package/dist/pages/build.d.ts +22 -0
- package/dist/pages/build.d.ts.map +1 -0
- package/dist/pages/build.js +363 -0
- package/dist/pages/build.js.map +1 -0
- package/dist/pages/defaults.d.ts +16 -0
- package/dist/pages/defaults.d.ts.map +1 -0
- package/dist/pages/defaults.js +88 -0
- package/dist/pages/defaults.js.map +1 -0
- package/dist/pages/index.d.ts +14 -0
- package/dist/pages/index.d.ts.map +1 -0
- package/dist/pages/index.js +10 -0
- package/dist/pages/index.js.map +1 -0
- package/dist/pages/navigation.d.ts +48 -0
- package/dist/pages/navigation.d.ts.map +1 -0
- package/dist/pages/navigation.js +83 -0
- package/dist/pages/navigation.js.map +1 -0
- package/dist/pages/types.d.ts +143 -0
- package/dist/pages/types.d.ts.map +1 -0
- package/dist/pages/types.js +3 -0
- package/dist/pages/types.js.map +1 -0
- package/dist/panels/catalog-define.d.ts +3 -0
- package/dist/panels/catalog-define.d.ts.map +1 -0
- package/dist/panels/catalog-define.js +7 -0
- package/dist/panels/catalog-define.js.map +1 -0
- package/dist/panels/catalog.d.ts +33 -0
- package/dist/panels/catalog.d.ts.map +1 -0
- package/dist/panels/catalog.js +54 -0
- package/dist/panels/catalog.js.map +1 -0
- package/dist/panels/component-define.d.ts +3 -0
- package/dist/panels/component-define.d.ts.map +1 -0
- package/dist/panels/component-define.js +6 -0
- package/dist/panels/component-define.js.map +1 -0
- package/dist/panels/component-detail.d.ts +46 -0
- package/dist/panels/component-detail.d.ts.map +1 -0
- package/dist/panels/component-detail.js +1120 -0
- package/dist/panels/component-detail.js.map +1 -0
- package/dist/panels/component.d.ts +17 -0
- package/dist/panels/component.d.ts.map +1 -0
- package/dist/panels/component.js +10 -0
- package/dist/panels/component.js.map +1 -0
- package/dist/panels/foundation-define.d.ts +3 -0
- package/dist/panels/foundation-define.d.ts.map +1 -0
- package/dist/panels/foundation-define.js +6 -0
- package/dist/panels/foundation-define.js.map +1 -0
- package/dist/panels/foundation-detail.d.ts +23 -0
- package/dist/panels/foundation-detail.d.ts.map +1 -0
- package/dist/panels/foundation-detail.js +216 -0
- package/dist/panels/foundation-detail.js.map +1 -0
- package/dist/panels/foundation.d.ts +15 -0
- package/dist/panels/foundation.d.ts.map +1 -0
- package/dist/panels/foundation.js +9 -0
- package/dist/panels/foundation.js.map +1 -0
- package/dist/panels/model.d.ts +173 -0
- package/dist/panels/model.d.ts.map +1 -0
- package/dist/panels/model.js +462 -0
- package/dist/panels/model.js.map +1 -0
- package/dist/panels/styles.d.ts +3 -0
- package/dist/panels/styles.d.ts.map +1 -0
- package/dist/panels/styles.js +316 -0
- package/dist/panels/styles.js.map +1 -0
- package/dist/panels/theme-model.d.ts +49 -0
- package/dist/panels/theme-model.d.ts.map +1 -0
- package/dist/panels/theme-model.js +146 -0
- package/dist/panels/theme-model.js.map +1 -0
- package/dist/panels/theme-studio.d.ts +32 -0
- package/dist/panels/theme-studio.d.ts.map +1 -0
- package/dist/panels/theme-studio.js +312 -0
- package/dist/panels/theme-studio.js.map +1 -0
- package/dist/preview/frame.d.ts +44 -0
- package/dist/preview/frame.d.ts.map +1 -0
- package/dist/preview/frame.js +250 -0
- package/dist/preview/frame.js.map +1 -0
- package/dist/preview/index.d.ts +26 -0
- package/dist/preview/index.d.ts.map +1 -0
- package/dist/preview/index.js +58 -0
- package/dist/preview/index.js.map +1 -0
- package/dist/preview/theme-generation.d.ts +33 -0
- package/dist/preview/theme-generation.d.ts.map +1 -0
- package/dist/preview/theme-generation.js +48 -0
- package/dist/preview/theme-generation.js.map +1 -0
- package/dist/protocol/index.d.ts +207 -0
- package/dist/protocol/index.d.ts.map +1 -0
- package/dist/protocol/index.js +261 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/testing/index.d.ts +47 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +145 -0
- package/dist/testing/index.js.map +1 -0
- package/package.json +118 -4
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell styles (workbench-pages.md §3): light DOM, so every selector is scoped to
|
|
3
|
+
* `oddkin-workbench`. Values come from Oddkin tokens; layout responds to container widths. The
|
|
4
|
+
* shell page links `@oddkin/components/css/layout.css`: rows, clusters, stacks, and the card grid
|
|
5
|
+
* are its classes on the templates (with their override properties here). The two-column frame
|
|
6
|
+
* (`.wb-layout`, `.wb-page`) is this sheet's own: it switches at the `wb-shell` and `wb-main`
|
|
7
|
+
* thresholds together with the sidebar disclosure and the table of contents.
|
|
8
|
+
*/
|
|
9
|
+
import { css } from '@oddkin/core/styles';
|
|
10
|
+
export const shellStyles = css `
|
|
11
|
+
body:has(> oddkin-workbench) {
|
|
12
|
+
margin: 0;
|
|
13
|
+
}
|
|
14
|
+
oddkin-workbench {
|
|
15
|
+
container: wb-shell / inline-size;
|
|
16
|
+
display: block;
|
|
17
|
+
min-block-size: 100vh;
|
|
18
|
+
background: var(--odd-color-canvas);
|
|
19
|
+
color: var(--odd-color-text-primary);
|
|
20
|
+
font-family: var(--odd-font-family-sans);
|
|
21
|
+
font-size: var(--odd-font-size-md);
|
|
22
|
+
line-height: var(--odd-line-height-normal);
|
|
23
|
+
}
|
|
24
|
+
oddkin-workbench :focus-visible {
|
|
25
|
+
outline: var(--odd-focus-width) solid var(--odd-color-focus-ring);
|
|
26
|
+
outline-offset: var(--odd-focus-offset);
|
|
27
|
+
}
|
|
28
|
+
oddkin-workbench a {
|
|
29
|
+
color: var(--odd-color-link);
|
|
30
|
+
}
|
|
31
|
+
oddkin-workbench code {
|
|
32
|
+
font-family: var(--odd-font-family-mono);
|
|
33
|
+
font-size: 0.9em;
|
|
34
|
+
}
|
|
35
|
+
oddkin-workbench .wb-visually-hidden {
|
|
36
|
+
position: absolute;
|
|
37
|
+
inline-size: 1px;
|
|
38
|
+
block-size: 1px;
|
|
39
|
+
overflow: hidden;
|
|
40
|
+
clip-path: inset(50%);
|
|
41
|
+
white-space: nowrap;
|
|
42
|
+
}
|
|
43
|
+
oddkin-workbench .wb-skip {
|
|
44
|
+
position: absolute;
|
|
45
|
+
inset-block-start: var(--odd-space-sm);
|
|
46
|
+
inset-inline-start: var(--odd-space-sm);
|
|
47
|
+
z-index: 2;
|
|
48
|
+
padding: var(--odd-space-xs) var(--odd-space-sm);
|
|
49
|
+
background: var(--odd-color-surface-raised);
|
|
50
|
+
border: var(--odd-border-width-default) solid var(--odd-color-border-strong);
|
|
51
|
+
border-radius: var(--odd-radius-sm);
|
|
52
|
+
}
|
|
53
|
+
oddkin-workbench .wb-skip:not(:focus) {
|
|
54
|
+
clip-path: inset(50%);
|
|
55
|
+
inline-size: 1px;
|
|
56
|
+
block-size: 1px;
|
|
57
|
+
overflow: hidden;
|
|
58
|
+
padding: 0;
|
|
59
|
+
border: 0;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* Header */
|
|
63
|
+
oddkin-workbench .wb-header {
|
|
64
|
+
--odd-cluster-gap: var(--odd-space-sm) var(--odd-space-lg);
|
|
65
|
+
padding: var(--odd-space-sm) var(--odd-space-xl);
|
|
66
|
+
background: var(--odd-color-surface-default);
|
|
67
|
+
border-block-end: var(--odd-border-width-default) solid var(--odd-color-border-default);
|
|
68
|
+
}
|
|
69
|
+
oddkin-workbench .wb-brand {
|
|
70
|
+
--odd-row-gap: var(--odd-space-xs);
|
|
71
|
+
color: inherit;
|
|
72
|
+
font-weight: var(--odd-font-weight-semibold);
|
|
73
|
+
text-decoration: none;
|
|
74
|
+
}
|
|
75
|
+
oddkin-workbench .wb-brand img {
|
|
76
|
+
block-size: 1.5rem;
|
|
77
|
+
}
|
|
78
|
+
oddkin-workbench .wb-primary ul,
|
|
79
|
+
oddkin-workbench .wb-sidebar ul,
|
|
80
|
+
oddkin-workbench .wb-toc ul,
|
|
81
|
+
oddkin-workbench .wb-cards,
|
|
82
|
+
oddkin-workbench .wb-search-results {
|
|
83
|
+
list-style: none;
|
|
84
|
+
margin: 0;
|
|
85
|
+
padding: 0;
|
|
86
|
+
}
|
|
87
|
+
oddkin-workbench .wb-primary ul {
|
|
88
|
+
--odd-cluster-gap: var(--odd-space-xs) var(--odd-space-lg);
|
|
89
|
+
align-items: stretch;
|
|
90
|
+
}
|
|
91
|
+
oddkin-workbench .wb-primary a {
|
|
92
|
+
display: inline-block;
|
|
93
|
+
padding-block: var(--odd-space-2xs);
|
|
94
|
+
color: var(--odd-color-text-secondary);
|
|
95
|
+
text-decoration: none;
|
|
96
|
+
}
|
|
97
|
+
oddkin-workbench .wb-primary a[aria-current] {
|
|
98
|
+
color: var(--odd-color-text-primary);
|
|
99
|
+
box-shadow: inset 0 calc(-1 * var(--odd-border-width-strong)) 0 var(--odd-color-action-default);
|
|
100
|
+
}
|
|
101
|
+
oddkin-workbench .wb-tools {
|
|
102
|
+
--odd-cluster-gap: var(--odd-space-sm) var(--odd-space-md);
|
|
103
|
+
margin-inline-start: auto;
|
|
104
|
+
}
|
|
105
|
+
oddkin-workbench .wb-tools label {
|
|
106
|
+
--odd-row-gap: var(--odd-space-xs);
|
|
107
|
+
color: var(--odd-color-text-secondary);
|
|
108
|
+
font-size: var(--odd-font-size-sm);
|
|
109
|
+
}
|
|
110
|
+
oddkin-workbench input,
|
|
111
|
+
oddkin-workbench select,
|
|
112
|
+
oddkin-workbench button {
|
|
113
|
+
font: inherit;
|
|
114
|
+
color: inherit;
|
|
115
|
+
}
|
|
116
|
+
oddkin-workbench input[type='search'],
|
|
117
|
+
oddkin-workbench select {
|
|
118
|
+
padding: var(--odd-space-2xs) var(--odd-space-xs);
|
|
119
|
+
background: var(--odd-color-surface-default);
|
|
120
|
+
border: var(--odd-border-width-default) solid var(--odd-color-border-strong);
|
|
121
|
+
border-radius: var(--odd-radius-sm);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/* Search */
|
|
125
|
+
oddkin-workbench .wb-search {
|
|
126
|
+
position: relative;
|
|
127
|
+
}
|
|
128
|
+
oddkin-workbench .wb-search-results {
|
|
129
|
+
position: absolute;
|
|
130
|
+
inset-inline-end: 0;
|
|
131
|
+
inset-block-start: calc(100% + var(--odd-space-2xs));
|
|
132
|
+
z-index: 3;
|
|
133
|
+
inline-size: min(28rem, 90cqi);
|
|
134
|
+
max-block-size: 70vh;
|
|
135
|
+
overflow: auto;
|
|
136
|
+
padding: var(--odd-space-xs);
|
|
137
|
+
background: var(--odd-color-surface-raised);
|
|
138
|
+
border: var(--odd-border-width-default) solid var(--odd-color-border-default);
|
|
139
|
+
border-radius: var(--odd-radius-md);
|
|
140
|
+
box-shadow: var(--odd-elevation-md);
|
|
141
|
+
}
|
|
142
|
+
oddkin-workbench .wb-search-results a {
|
|
143
|
+
display: block;
|
|
144
|
+
padding: var(--odd-space-2xs) var(--odd-space-xs);
|
|
145
|
+
border-radius: var(--odd-radius-sm);
|
|
146
|
+
color: inherit;
|
|
147
|
+
text-decoration: none;
|
|
148
|
+
}
|
|
149
|
+
oddkin-workbench .wb-search-results a:hover {
|
|
150
|
+
background: var(--odd-color-surface-hover);
|
|
151
|
+
}
|
|
152
|
+
oddkin-workbench .wb-search-results small {
|
|
153
|
+
display: block;
|
|
154
|
+
color: var(--odd-color-text-secondary);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/* Layout */
|
|
158
|
+
oddkin-workbench .wb-banner {
|
|
159
|
+
margin: 0;
|
|
160
|
+
padding: var(--odd-space-xs) var(--odd-space-xl);
|
|
161
|
+
background: var(--odd-color-warning-surface);
|
|
162
|
+
color: var(--odd-color-warning-foreground);
|
|
163
|
+
}
|
|
164
|
+
oddkin-workbench .wb-layout {
|
|
165
|
+
display: grid;
|
|
166
|
+
grid-template-columns: minmax(11rem, 15rem) minmax(0, 1fr);
|
|
167
|
+
gap: var(--odd-space-xl);
|
|
168
|
+
max-inline-size: 88rem;
|
|
169
|
+
margin-inline: auto;
|
|
170
|
+
padding: var(--odd-space-xl);
|
|
171
|
+
}
|
|
172
|
+
oddkin-workbench .wb-layout.wb-no-sidebar {
|
|
173
|
+
grid-template-columns: minmax(0, 1fr);
|
|
174
|
+
}
|
|
175
|
+
oddkin-workbench .wb-sidebar .wb-group-label {
|
|
176
|
+
margin: var(--odd-space-md) 0 var(--odd-space-2xs);
|
|
177
|
+
color: var(--odd-color-text-secondary);
|
|
178
|
+
font-size: var(--odd-font-size-xs);
|
|
179
|
+
font-weight: var(--odd-font-weight-semibold);
|
|
180
|
+
letter-spacing: 0.06em;
|
|
181
|
+
text-transform: uppercase;
|
|
182
|
+
}
|
|
183
|
+
oddkin-workbench .wb-sidebar a {
|
|
184
|
+
display: block;
|
|
185
|
+
padding: var(--odd-space-2xs) var(--odd-space-xs);
|
|
186
|
+
border-radius: var(--odd-radius-sm);
|
|
187
|
+
color: var(--odd-color-text-secondary);
|
|
188
|
+
text-decoration: none;
|
|
189
|
+
}
|
|
190
|
+
oddkin-workbench .wb-sidebar a[aria-current] {
|
|
191
|
+
background: var(--odd-color-surface-sunken);
|
|
192
|
+
color: var(--odd-color-text-primary);
|
|
193
|
+
font-weight: var(--odd-font-weight-medium);
|
|
194
|
+
}
|
|
195
|
+
oddkin-workbench .wb-sidebar-toggle {
|
|
196
|
+
display: none;
|
|
197
|
+
padding: var(--odd-space-2xs) var(--odd-space-sm);
|
|
198
|
+
background: var(--odd-color-surface-default);
|
|
199
|
+
border: var(--odd-border-width-default) solid var(--odd-color-border-strong);
|
|
200
|
+
border-radius: var(--odd-radius-sm);
|
|
201
|
+
cursor: pointer;
|
|
202
|
+
}
|
|
203
|
+
oddkin-workbench .wb-main {
|
|
204
|
+
container: wb-main / inline-size;
|
|
205
|
+
min-inline-size: 0;
|
|
206
|
+
}
|
|
207
|
+
oddkin-workbench .wb-main:focus {
|
|
208
|
+
outline: none;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/* Page */
|
|
212
|
+
oddkin-workbench .wb-page {
|
|
213
|
+
display: grid;
|
|
214
|
+
gap: var(--odd-space-lg) var(--odd-space-2xl);
|
|
215
|
+
grid-template-areas: 'header' 'toc' 'body';
|
|
216
|
+
}
|
|
217
|
+
oddkin-workbench .wb-page-header {
|
|
218
|
+
grid-area: header;
|
|
219
|
+
max-inline-size: 48rem;
|
|
220
|
+
}
|
|
221
|
+
oddkin-workbench .wb-eyebrow {
|
|
222
|
+
margin: 0 0 var(--odd-space-xs);
|
|
223
|
+
color: var(--odd-color-text-secondary);
|
|
224
|
+
font-size: var(--odd-font-size-xs);
|
|
225
|
+
font-weight: var(--odd-font-weight-semibold);
|
|
226
|
+
letter-spacing: 0.08em;
|
|
227
|
+
text-transform: uppercase;
|
|
228
|
+
}
|
|
229
|
+
oddkin-workbench h1 {
|
|
230
|
+
margin: 0;
|
|
231
|
+
font-family: var(--odd-font-family-display);
|
|
232
|
+
font-size: var(--odd-font-size-3xl);
|
|
233
|
+
font-weight: var(--odd-font-weight-regular);
|
|
234
|
+
line-height: var(--odd-line-height-tight);
|
|
235
|
+
}
|
|
236
|
+
oddkin-workbench .wb-summary {
|
|
237
|
+
margin: var(--odd-space-sm) 0 0;
|
|
238
|
+
color: var(--odd-color-text-secondary);
|
|
239
|
+
font-size: var(--odd-font-size-lg);
|
|
240
|
+
}
|
|
241
|
+
oddkin-workbench .wb-back {
|
|
242
|
+
display: inline-block;
|
|
243
|
+
margin-block-start: var(--odd-space-md);
|
|
244
|
+
}
|
|
245
|
+
oddkin-workbench .wb-toc {
|
|
246
|
+
grid-area: toc;
|
|
247
|
+
font-size: var(--odd-font-size-sm);
|
|
248
|
+
}
|
|
249
|
+
oddkin-workbench .wb-toc h2 {
|
|
250
|
+
margin: 0 0 var(--odd-space-xs);
|
|
251
|
+
color: var(--odd-color-text-secondary);
|
|
252
|
+
font-size: var(--odd-font-size-xs);
|
|
253
|
+
letter-spacing: 0.08em;
|
|
254
|
+
text-transform: uppercase;
|
|
255
|
+
}
|
|
256
|
+
oddkin-workbench .wb-toc li + li {
|
|
257
|
+
margin-block-start: var(--odd-space-2xs);
|
|
258
|
+
}
|
|
259
|
+
oddkin-workbench .wb-body {
|
|
260
|
+
grid-area: body;
|
|
261
|
+
min-inline-size: 0;
|
|
262
|
+
}
|
|
263
|
+
oddkin-workbench .wb-body > section + section {
|
|
264
|
+
margin-block-start: var(--odd-space-2xl);
|
|
265
|
+
}
|
|
266
|
+
oddkin-workbench .wb-body h2 {
|
|
267
|
+
margin: 0 0 var(--odd-space-sm);
|
|
268
|
+
font-size: var(--odd-font-size-xl);
|
|
269
|
+
font-weight: var(--odd-font-weight-semibold);
|
|
270
|
+
}
|
|
271
|
+
oddkin-workbench .wb-muted {
|
|
272
|
+
color: var(--odd-color-text-secondary);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/* Overview cards: 3, 2, or 1 columns by the content's width. */
|
|
276
|
+
oddkin-workbench .wb-group + .wb-group {
|
|
277
|
+
margin-block-start: var(--odd-space-2xl);
|
|
278
|
+
}
|
|
279
|
+
oddkin-workbench .wb-cards {
|
|
280
|
+
--odd-grid-columns: 1;
|
|
281
|
+
--odd-grid-gap: var(--odd-space-md);
|
|
282
|
+
}
|
|
283
|
+
oddkin-workbench .wb-card {
|
|
284
|
+
block-size: 100%;
|
|
285
|
+
}
|
|
286
|
+
oddkin-workbench .wb-catalog-filters {
|
|
287
|
+
--odd-cluster-gap: var(--odd-space-md);
|
|
288
|
+
align-items: end;
|
|
289
|
+
margin-block-end: var(--odd-space-lg);
|
|
290
|
+
}
|
|
291
|
+
oddkin-workbench .wb-catalog-filters label {
|
|
292
|
+
--odd-stack-gap: var(--odd-space-2xs);
|
|
293
|
+
color: var(--odd-color-text-secondary);
|
|
294
|
+
font-size: var(--odd-font-size-sm);
|
|
295
|
+
}
|
|
296
|
+
oddkin-workbench .wb-catalog-filters input,
|
|
297
|
+
oddkin-workbench .wb-catalog-filters select {
|
|
298
|
+
min-inline-size: 12rem;
|
|
299
|
+
padding: var(--odd-space-2xs) var(--odd-space-xs);
|
|
300
|
+
background: var(--odd-color-surface-default);
|
|
301
|
+
border: var(--odd-border-width-default) solid var(--odd-color-border-strong);
|
|
302
|
+
border-radius: var(--odd-radius-sm);
|
|
303
|
+
}
|
|
304
|
+
oddkin-workbench .wb-catalog-filters p {
|
|
305
|
+
margin: 0;
|
|
306
|
+
}
|
|
307
|
+
oddkin-workbench .wb-card h2,
|
|
308
|
+
oddkin-workbench .wb-card h3 {
|
|
309
|
+
margin: 0;
|
|
310
|
+
font-size: var(--odd-font-size-lg);
|
|
311
|
+
font-weight: var(--odd-font-weight-semibold);
|
|
312
|
+
}
|
|
313
|
+
oddkin-workbench .wb-card p {
|
|
314
|
+
margin: var(--odd-space-xs) 0 0;
|
|
315
|
+
}
|
|
316
|
+
oddkin-workbench .wb-meta {
|
|
317
|
+
color: var(--odd-color-text-secondary);
|
|
318
|
+
font-size: var(--odd-font-size-sm);
|
|
319
|
+
}
|
|
320
|
+
@container wb-main (width >= 32rem) {
|
|
321
|
+
oddkin-workbench .wb-cards {
|
|
322
|
+
--odd-grid-columns: 2;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
@container wb-main (width >= 52rem) {
|
|
326
|
+
oddkin-workbench .wb-cards {
|
|
327
|
+
--odd-grid-columns: 3;
|
|
328
|
+
}
|
|
329
|
+
oddkin-workbench .wb-page.wb-has-toc {
|
|
330
|
+
grid-template-columns: minmax(0, 1fr) 13rem;
|
|
331
|
+
grid-template-areas: 'header toc' 'body toc';
|
|
332
|
+
align-items: start;
|
|
333
|
+
}
|
|
334
|
+
oddkin-workbench .wb-has-toc .wb-toc {
|
|
335
|
+
position: sticky;
|
|
336
|
+
inset-block-start: var(--odd-space-lg);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/* Narrow: one column; the sidebar is behind a disclosure button. */
|
|
341
|
+
@container wb-shell (width < 48rem) {
|
|
342
|
+
oddkin-workbench .wb-header {
|
|
343
|
+
padding-inline: var(--odd-space-md);
|
|
344
|
+
}
|
|
345
|
+
oddkin-workbench .wb-tools {
|
|
346
|
+
margin-inline-start: 0;
|
|
347
|
+
}
|
|
348
|
+
oddkin-workbench .wb-layout {
|
|
349
|
+
grid-template-columns: minmax(0, 1fr);
|
|
350
|
+
gap: var(--odd-space-lg);
|
|
351
|
+
padding: var(--odd-space-md);
|
|
352
|
+
}
|
|
353
|
+
oddkin-workbench .wb-sidebar-toggle {
|
|
354
|
+
display: inline-flex;
|
|
355
|
+
}
|
|
356
|
+
oddkin-workbench .wb-sidebar:not(.wb-expanded) .wb-sidebar-list {
|
|
357
|
+
display: none;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
@media (forced-colors: active) {
|
|
362
|
+
oddkin-workbench .wb-primary a[aria-current],
|
|
363
|
+
oddkin-workbench .wb-sidebar a[aria-current] {
|
|
364
|
+
text-decoration: underline;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
@media (prefers-reduced-motion: reduce) {
|
|
368
|
+
oddkin-workbench * {
|
|
369
|
+
scroll-behavior: auto;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
`;
|
|
373
|
+
//# sourceMappingURL=styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/app/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1C,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0W7B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { StyleInput } from '@oddkin/core/styles';
|
|
2
|
+
import { ThemeStudioElement } from '../panels/theme-studio.js';
|
|
3
|
+
export declare class WorkbenchThemeStudio extends ThemeStudioElement {
|
|
4
|
+
static shadowRootOptions: null;
|
|
5
|
+
static styles: StyleInput;
|
|
6
|
+
}
|
|
7
|
+
declare global {
|
|
8
|
+
interface HTMLElementTagNameMap {
|
|
9
|
+
'oddkin-workbench-theme-studio': WorkbenchThemeStudio;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=theme-studio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-studio.d.ts","sourceRoot":"","sources":["../../src/app/theme-studio.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,qBAAa,oBAAqB,SAAQ,kBAAkB;IAC1D,OAAgB,iBAAiB,OAAQ;IACzC,OAAgB,MAAM,EAAE,UAAU,CAAiB;CACpD;AAID,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,+BAA+B,EAAE,oBAAoB,CAAC;KACvD;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registers `<oddkin-workbench-theme-studio>`, Theme Studio's content in the shell's light DOM.
|
|
3
|
+
* The shell imports this module only when the Theme Studio route renders, so other pages never
|
|
4
|
+
* load the editor, its model, or the generation client.
|
|
5
|
+
*/
|
|
6
|
+
import { define } from '@oddkin/core/element';
|
|
7
|
+
import { contentStyles } from '../panels/styles.js';
|
|
8
|
+
import { ThemeStudioElement } from '../panels/theme-studio.js';
|
|
9
|
+
export class WorkbenchThemeStudio extends ThemeStudioElement {
|
|
10
|
+
static shadowRootOptions = null;
|
|
11
|
+
static styles = contentStyles;
|
|
12
|
+
}
|
|
13
|
+
define('oddkin-workbench-theme-studio', WorkbenchThemeStudio);
|
|
14
|
+
//# sourceMappingURL=theme-studio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-studio.js","sourceRoot":"","sources":["../../src/app/theme-studio.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,MAAM,OAAO,oBAAqB,SAAQ,kBAAkB;IAC1D,MAAM,CAAU,iBAAiB,GAAG,IAAI,CAAC;IACzC,MAAM,CAAU,MAAM,GAAe,aAAa,CAAC;CACpD;AAED,MAAM,CAAC,+BAA+B,EAAE,oBAAoB,CAAC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { PageEntry, PageRegistry } from '../pages/types.js';
|
|
2
|
+
export interface ViewContext {
|
|
3
|
+
readonly registry: PageRegistry;
|
|
4
|
+
/** URL of an application path (`/components/odd-button#api`) in the configured routing mode. */
|
|
5
|
+
readonly href: (to: string) => string;
|
|
6
|
+
readonly lang: string;
|
|
7
|
+
readonly catalog?: {
|
|
8
|
+
readonly query: string;
|
|
9
|
+
readonly category: string;
|
|
10
|
+
readonly update: (query: string, category: string) => void;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export type Appearance = 'system' | 'light' | 'dark';
|
|
14
|
+
/** Text with Markdown code spans (`name`) shown as code; everything stays text, never markup. */
|
|
15
|
+
export declare function inline(text: string): (string | import("@oddkin/core/template").TemplateResult)[];
|
|
16
|
+
/** `Updated <date> · tag, tag`: each part only when known. */
|
|
17
|
+
export declare function metaLine(page: PageEntry, lang: string): import("@oddkin/core/template").TemplateResult | null;
|
|
18
|
+
/** The overview page of a section, if the registry has one. */
|
|
19
|
+
export declare const overviewOf: (registry: PageRegistry, section: string) => PageEntry | undefined;
|
|
20
|
+
export declare function header(ctx: ViewContext, brand: {
|
|
21
|
+
readonly name: string;
|
|
22
|
+
readonly logo?: string;
|
|
23
|
+
}, current: PageEntry | undefined, tools: unknown): import("@oddkin/core/template").TemplateResult;
|
|
24
|
+
export declare function appearanceControl(value: Appearance, change: (value: Appearance) => void): import("@oddkin/core/template").TemplateResult;
|
|
25
|
+
export declare function sidebarView(ctx: ViewContext, current: PageEntry, expanded: boolean, toggle: () => void): import("@oddkin/core/template").TemplateResult | null;
|
|
26
|
+
export declare function pageHeader(ctx: ViewContext, page: PageEntry): import("@oddkin/core/template").TemplateResult;
|
|
27
|
+
/** Overview body: the section's cards, grouped when the section has groups (components). */
|
|
28
|
+
export declare function overviewBody(ctx: ViewContext, page: PageEntry): import("@oddkin/core/template").TemplateResult;
|
|
29
|
+
/** Detail pages without generated content: a section per visible registry section. */
|
|
30
|
+
export declare function sectionsBody(page: PageEntry): import("@oddkin/core/template").TemplateResult;
|
|
31
|
+
export declare function toc(ctx: ViewContext, page: PageEntry): import("@oddkin/core/template").TemplateResult | null;
|
|
32
|
+
/** A page with a heading and one paragraph: not found, a failed page, a notice. */
|
|
33
|
+
export declare function messagePage(ctx: ViewContext, title: string, text: string, link?: PageEntry): import("@oddkin/core/template").TemplateResult;
|
|
34
|
+
//# sourceMappingURL=views.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../src/app/views.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,gGAAgG;IAChG,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE;QACjB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;KAC5D,CAAC;CACH;AAED,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAYrD,iGAAiG;AACjG,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,+DAKlC;AAED,8DAA8D;AAC9D,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,yDASrD;AAED,+DAA+D;AAC/D,eAAO,MAAM,UAAU,aAAc,YAAY,WAAW,MAAM,0BACuB,CAAC;AAE1F,wBAAgB,MAAM,CACpB,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EACxD,OAAO,EAAE,SAAS,GAAG,SAAS,EAC9B,KAAK,EAAE,OAAO,kDAwBf;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,kDAcvF;AAED,wBAAgB,WAAW,CACzB,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,OAAO,EACjB,MAAM,EAAE,MAAM,IAAI,yDAoCnB;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,kDAkB3D;AAYD,4FAA4F;AAC5F,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,kDAyF7D;AAED,sFAAsF;AACtF,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,kDAY3C;AAED,wBAAgB,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,yDAcpD;AAED,mFAAmF;AACnF,wBAAgB,WAAW,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,SAAS,kDAQ1F"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell views (workbench-pages.md §3–§6): header, primary navigation, contextual sidebar, page
|
|
3
|
+
* headers, overview cards, the section scaffold, and "On this page". Everything is projected
|
|
4
|
+
* from the page registry, so navigation, cards, routes, and search cannot drift apart.
|
|
5
|
+
*/
|
|
6
|
+
import { html, nothing, repeat } from '@oddkin/core/template';
|
|
7
|
+
import { cards, onThisPage, primaryNavigation, sidebar } from '../pages/navigation.js';
|
|
8
|
+
import { COPY } from './copy.js';
|
|
9
|
+
const formatDate = (iso, lang) => {
|
|
10
|
+
try {
|
|
11
|
+
return new Intl.DateTimeFormat(lang, { dateStyle: 'medium', timeZone: 'UTC' }).format(new Date(`${iso}T00:00:00Z`));
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return iso;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
/** Text with Markdown code spans (`name`) shown as code; everything stays text, never markup. */
|
|
18
|
+
export function inline(text) {
|
|
19
|
+
const parts = text.split('`');
|
|
20
|
+
// An unmatched backtick stays literal.
|
|
21
|
+
if (parts.length % 2 === 0)
|
|
22
|
+
parts[parts.length - 2] += `\`${parts.pop()}`;
|
|
23
|
+
return parts.map((part, i) => (i % 2 ? html `<code>${part}</code>` : part));
|
|
24
|
+
}
|
|
25
|
+
/** `Updated <date> · tag, tag`: each part only when known. */
|
|
26
|
+
export function metaLine(page, lang) {
|
|
27
|
+
const parts = [];
|
|
28
|
+
if (page.updated)
|
|
29
|
+
parts.push(html `${COPY.updated} <time datetime=${page.updated}>${formatDate(page.updated, lang)}</time>`);
|
|
30
|
+
if (page.tags?.length)
|
|
31
|
+
parts.push(page.tags.join(', '));
|
|
32
|
+
if (!parts.length)
|
|
33
|
+
return nothing;
|
|
34
|
+
return html `<p class="wb-meta">${parts.flatMap((part, i) => (i ? [' · ', part] : [part]))}</p>`;
|
|
35
|
+
}
|
|
36
|
+
/** The overview page of a section, if the registry has one. */
|
|
37
|
+
export const overviewOf = (registry, section) => registry.pages.find((p) => p.visible && p.section === section && p.kind === 'overview');
|
|
38
|
+
export function header(ctx, brand, current, tools) {
|
|
39
|
+
const primary = primaryNavigation(ctx.registry);
|
|
40
|
+
const home = ctx.registry.pages.find((p) => p.id === 'home' && p.visible) ?? primary[0];
|
|
41
|
+
const state = (entry) => current?.id === entry.id ? 'page' : current?.section === entry.section ? 'true' : null;
|
|
42
|
+
return html `<header class="wb-header odd-cluster">
|
|
43
|
+
<a class="wb-brand odd-row" href=${ctx.href(home?.route ?? '/')}
|
|
44
|
+
>${brand.logo ? html `<img src=${brand.logo} alt="" />` : nothing}<span>${brand.name}</span></a
|
|
45
|
+
>
|
|
46
|
+
<nav class="wb-primary" aria-label=${COPY.primaryNavigation}>
|
|
47
|
+
<ul class="odd-cluster">
|
|
48
|
+
${repeat(primary, (entry) => entry.id, (entry) => html `<li>
|
|
49
|
+
<a href=${ctx.href(entry.route)} aria-current=${state(entry)}>${entry.title}</a>
|
|
50
|
+
</li>`)}
|
|
51
|
+
</ul>
|
|
52
|
+
</nav>
|
|
53
|
+
<div class="wb-tools odd-cluster">${tools}</div>
|
|
54
|
+
</header>`;
|
|
55
|
+
}
|
|
56
|
+
export function appearanceControl(value, change) {
|
|
57
|
+
const options = Object.entries(COPY.appearances);
|
|
58
|
+
return html `<label class="odd-row"
|
|
59
|
+
>${COPY.appearance}
|
|
60
|
+
<select
|
|
61
|
+
class="wb-appearance"
|
|
62
|
+
.value=${value}
|
|
63
|
+
@change=${(event) => change(event.target.value)}
|
|
64
|
+
>
|
|
65
|
+
${options.map(([key, label]) => html `<option value=${key} ?selected=${key === value}>${label}</option>`)}
|
|
66
|
+
</select></label
|
|
67
|
+
>`;
|
|
68
|
+
}
|
|
69
|
+
export function sidebarView(ctx, current, expanded, toggle) {
|
|
70
|
+
const groups = sidebar(ctx.registry, current.section);
|
|
71
|
+
if (!groups.length)
|
|
72
|
+
return nothing;
|
|
73
|
+
const title = overviewOf(ctx.registry, current.section)?.title ?? current.section;
|
|
74
|
+
return html `<nav class=${expanded ? 'wb-sidebar wb-expanded' : 'wb-sidebar'} aria-label=${title}>
|
|
75
|
+
<button
|
|
76
|
+
type="button"
|
|
77
|
+
class="wb-sidebar-toggle"
|
|
78
|
+
aria-expanded=${expanded ? 'true' : 'false'}
|
|
79
|
+
aria-controls="wb-sidebar-list"
|
|
80
|
+
@click=${toggle}
|
|
81
|
+
>
|
|
82
|
+
${expanded ? COPY.hideSection(title) : COPY.showSection(title)}
|
|
83
|
+
</button>
|
|
84
|
+
<div class="wb-sidebar-list" id="wb-sidebar-list">
|
|
85
|
+
${groups.map(({ group, pages }, i) => {
|
|
86
|
+
const label = group ? `wb-sidebar-group-${i}` : undefined;
|
|
87
|
+
return html `${group ? html `<p class="wb-group-label" id=${label}>${group}</p>` : nothing}
|
|
88
|
+
<ul aria-labelledby=${label ?? null}>
|
|
89
|
+
${repeat(pages, (page) => page.id, (page) => html `<li>
|
|
90
|
+
<a
|
|
91
|
+
href=${ctx.href(page.route)}
|
|
92
|
+
aria-current=${page.id === current.id ? 'page' : null}
|
|
93
|
+
>${page.title}</a
|
|
94
|
+
>
|
|
95
|
+
</li>`)}
|
|
96
|
+
</ul>`;
|
|
97
|
+
})}
|
|
98
|
+
</div>
|
|
99
|
+
</nav>`;
|
|
100
|
+
}
|
|
101
|
+
export function pageHeader(ctx, page) {
|
|
102
|
+
const overview = page.kind === 'overview';
|
|
103
|
+
const eyebrow = page.eyebrow ?? (overview ? COPY.overviewEyebrow : undefined);
|
|
104
|
+
const summary = page.summary ?? COPY.summaries[page.id];
|
|
105
|
+
const back = page.kind === 'component' || page.kind === 'foundation' || page.kind === 'products'
|
|
106
|
+
? overviewOf(ctx.registry, page.section)
|
|
107
|
+
: undefined;
|
|
108
|
+
return html `<header class="wb-page-header">
|
|
109
|
+
${eyebrow ? html `<p class="wb-eyebrow">${eyebrow}</p>` : nothing}
|
|
110
|
+
<h1>${page.title}</h1>
|
|
111
|
+
${summary ? html `<p class="wb-summary">${inline(summary)}</p>` : nothing}
|
|
112
|
+
${back
|
|
113
|
+
? html `<a class="wb-back" href=${ctx.href(back.route)}>${COPY.allPages(back.title)}</a>`
|
|
114
|
+
: nothing}
|
|
115
|
+
</header>`;
|
|
116
|
+
}
|
|
117
|
+
function card(ctx, page, level) {
|
|
118
|
+
const title = html `<a href=${ctx.href(page.route)}>${page.title}</a>`;
|
|
119
|
+
return html `<li>
|
|
120
|
+
<odd-card class="wb-card">
|
|
121
|
+
${level === 2 ? html `<h2>${title}</h2>` : html `<h3>${title}</h3>`}
|
|
122
|
+
${page.summary ? html `<p>${inline(page.summary)}</p>` : nothing} ${metaLine(page, ctx.lang)}
|
|
123
|
+
</odd-card>
|
|
124
|
+
</li>`;
|
|
125
|
+
}
|
|
126
|
+
/** Overview body: the section's cards, grouped when the section has groups (components). */
|
|
127
|
+
export function overviewBody(ctx, page) {
|
|
128
|
+
if (page.availability === 'unavailable')
|
|
129
|
+
return html `<div class="wb-body">
|
|
130
|
+
<p><strong>${page.id === 'foundations' ? COPY.noFoundations : COPY.noComponents}</strong></p>
|
|
131
|
+
${page.id === 'foundations' ? html `<p class="wb-muted">${COPY.noFoundationsHelp}</p>` : nothing}
|
|
132
|
+
</div>`;
|
|
133
|
+
const allEntries = cards(ctx.registry, page.section);
|
|
134
|
+
const filters = page.section === 'components' ? ctx.catalog : undefined;
|
|
135
|
+
const categories = [...new Set(allEntries.map((entry) => entry.group ?? ''))];
|
|
136
|
+
const selectedCategory = filters && categories.includes(filters.category) ? filters.category : '';
|
|
137
|
+
const entries = filters
|
|
138
|
+
? allEntries.filter((entry) => {
|
|
139
|
+
const text = `${entry.title} ${entry.id} ${entry.summary ?? ''} ${(entry.tags ?? []).join(' ')}`.toLowerCase();
|
|
140
|
+
return ((!filters.query.trim() || text.includes(filters.query.trim().toLowerCase())) &&
|
|
141
|
+
(!selectedCategory || (entry.group ?? '') === selectedCategory));
|
|
142
|
+
})
|
|
143
|
+
: allEntries;
|
|
144
|
+
const groups = new Map();
|
|
145
|
+
for (const entry of entries)
|
|
146
|
+
groups.set(entry.group ?? '', [...(groups.get(entry.group ?? '') ?? []), entry]);
|
|
147
|
+
const controls = filters === undefined
|
|
148
|
+
? nothing
|
|
149
|
+
: html `<form
|
|
150
|
+
class="wb-catalog-filters odd-cluster"
|
|
151
|
+
role="search"
|
|
152
|
+
@submit=${(event) => event.preventDefault()}
|
|
153
|
+
>
|
|
154
|
+
<label class="odd-stack"
|
|
155
|
+
>${COPY.componentSearch}
|
|
156
|
+
<input
|
|
157
|
+
type="search"
|
|
158
|
+
name="q"
|
|
159
|
+
.value=${filters.query}
|
|
160
|
+
@input=${(event) => filters.update(event.target.value, filters.category)}
|
|
161
|
+
/>
|
|
162
|
+
</label>
|
|
163
|
+
<label class="odd-stack"
|
|
164
|
+
>${COPY.categoryFilter}
|
|
165
|
+
<select
|
|
166
|
+
name="category"
|
|
167
|
+
.value=${selectedCategory}
|
|
168
|
+
@change=${(event) => filters.update(filters.query, event.target.value)}
|
|
169
|
+
>
|
|
170
|
+
<option value="">${COPY.allCategories}</option>
|
|
171
|
+
${categories.map((category) => html `<option value=${category}>${category}</option>`)}
|
|
172
|
+
</select>
|
|
173
|
+
</label>
|
|
174
|
+
<p class="wb-muted" aria-live="polite">
|
|
175
|
+
${COPY.componentResults(entries.length, allEntries.length)}
|
|
176
|
+
</p>
|
|
177
|
+
</form>`;
|
|
178
|
+
if (!entries.length)
|
|
179
|
+
return html `<div class="wb-body">
|
|
180
|
+
${controls}
|
|
181
|
+
<p role="status">${COPY.noComponentResults}</p>
|
|
182
|
+
</div>`;
|
|
183
|
+
if (groups.size === 1 && groups.has(''))
|
|
184
|
+
return html `<div class="wb-body">
|
|
185
|
+
${controls}
|
|
186
|
+
<ul class="wb-cards odd-grid">
|
|
187
|
+
${repeat(entries, (entry) => entry.id, (entry) => card(ctx, entry, 2))}
|
|
188
|
+
</ul>
|
|
189
|
+
</div>`;
|
|
190
|
+
return html `<div class="wb-body">
|
|
191
|
+
${controls}
|
|
192
|
+
${[...groups].map(([group, pages], i) => html `<section class="wb-group" aria-labelledby=${`wb-group-${i}`}>
|
|
193
|
+
<h2 id=${`wb-group-${i}`}>${group} <span class="wb-muted">(${pages.length})</span></h2>
|
|
194
|
+
<ul class="wb-cards odd-grid">
|
|
195
|
+
${repeat(pages, (entry) => entry.id, (entry) => card(ctx, entry, 3))}
|
|
196
|
+
</ul>
|
|
197
|
+
</section>`)}
|
|
198
|
+
</div>`;
|
|
199
|
+
}
|
|
200
|
+
/** Detail pages without generated content: a section per visible registry section. */
|
|
201
|
+
export function sectionsBody(page) {
|
|
202
|
+
return html `<div class="wb-body">
|
|
203
|
+
${repeat(page.sections.filter((s) => s.visible), (section) => section.id, (section) => html `<section id=${section.id} aria-labelledby=${`${section.id}-title`}>
|
|
204
|
+
<h2 id=${`${section.id}-title`}>${section.title}</h2>
|
|
205
|
+
<p class="wb-muted">${COPY.sectionPending}</p>
|
|
206
|
+
</section>`)}
|
|
207
|
+
</div>`;
|
|
208
|
+
}
|
|
209
|
+
export function toc(ctx, page) {
|
|
210
|
+
const entries = onThisPage(page);
|
|
211
|
+
if (!entries.length)
|
|
212
|
+
return nothing;
|
|
213
|
+
return html `<nav class="wb-toc" aria-labelledby="wb-toc-title">
|
|
214
|
+
<h2 id="wb-toc-title">${COPY.onThisPage}</h2>
|
|
215
|
+
<ul>
|
|
216
|
+
${repeat(entries, (entry) => entry.id, (entry) => html `<li><a href=${ctx.href(`${page.route}#${entry.id}`)}>${entry.title}</a></li>`)}
|
|
217
|
+
</ul>
|
|
218
|
+
</nav>`;
|
|
219
|
+
}
|
|
220
|
+
/** A page with a heading and one paragraph: not found, a failed page, a notice. */
|
|
221
|
+
export function messagePage(ctx, title, text, link) {
|
|
222
|
+
return html `<div class="wb-page">
|
|
223
|
+
<header class="wb-page-header">
|
|
224
|
+
<h1>${title}</h1>
|
|
225
|
+
<p class="wb-summary">${text}</p>
|
|
226
|
+
${link ? html `<a class="wb-back" href=${ctx.href(link.route)}>${link.title}</a>` : nothing}
|
|
227
|
+
</header>
|
|
228
|
+
</div>`;
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=views.js.map
|