@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,316 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Styles for panel content (catalog, component and foundation details). Every rule is scoped to
|
|
3
|
+
* `.wb-content`, so the same sheet works inside a panel's shadow root and in the shell's light DOM.
|
|
4
|
+
* Values come from Oddkin tokens, inherited from the host document.
|
|
5
|
+
*/
|
|
6
|
+
import { css } from '@oddkin/core/styles';
|
|
7
|
+
export const panelHostStyles = css `
|
|
8
|
+
:host {
|
|
9
|
+
display: block;
|
|
10
|
+
color: var(--odd-color-text-primary);
|
|
11
|
+
font-family: var(--odd-font-family-sans);
|
|
12
|
+
font-size: var(--odd-font-size-md);
|
|
13
|
+
line-height: var(--odd-line-height-normal);
|
|
14
|
+
}
|
|
15
|
+
`;
|
|
16
|
+
export const contentStyles = css `
|
|
17
|
+
.wb-content {
|
|
18
|
+
container: wb-content / inline-size;
|
|
19
|
+
min-inline-size: 0;
|
|
20
|
+
}
|
|
21
|
+
.wb-content :focus-visible {
|
|
22
|
+
outline: var(--odd-focus-width) solid var(--odd-color-focus-ring);
|
|
23
|
+
outline-offset: var(--odd-focus-offset);
|
|
24
|
+
}
|
|
25
|
+
.wb-content a {
|
|
26
|
+
color: var(--odd-color-link);
|
|
27
|
+
}
|
|
28
|
+
.wb-content code,
|
|
29
|
+
.wb-content pre {
|
|
30
|
+
font-family: var(--odd-font-family-mono);
|
|
31
|
+
font-size: 0.9em;
|
|
32
|
+
}
|
|
33
|
+
.wb-content input,
|
|
34
|
+
.wb-content select,
|
|
35
|
+
.wb-content textarea,
|
|
36
|
+
.wb-content button {
|
|
37
|
+
font: inherit;
|
|
38
|
+
color: inherit;
|
|
39
|
+
}
|
|
40
|
+
.wb-content input:not([type='checkbox']),
|
|
41
|
+
.wb-content select,
|
|
42
|
+
.wb-content textarea {
|
|
43
|
+
max-inline-size: 100%;
|
|
44
|
+
padding: var(--odd-space-2xs) var(--odd-space-xs);
|
|
45
|
+
background: var(--odd-color-surface-default);
|
|
46
|
+
border: var(--odd-border-width-default) solid var(--odd-color-border-strong);
|
|
47
|
+
border-radius: var(--odd-radius-sm);
|
|
48
|
+
}
|
|
49
|
+
.wb-content button {
|
|
50
|
+
padding: var(--odd-space-2xs) var(--odd-space-sm);
|
|
51
|
+
background: var(--odd-color-surface-default);
|
|
52
|
+
border: var(--odd-border-width-default) solid var(--odd-color-border-strong);
|
|
53
|
+
border-radius: var(--odd-radius-sm);
|
|
54
|
+
cursor: pointer;
|
|
55
|
+
}
|
|
56
|
+
.wb-content > section + section {
|
|
57
|
+
margin-block-start: var(--odd-space-2xl);
|
|
58
|
+
}
|
|
59
|
+
.wb-content h2 {
|
|
60
|
+
margin: 0 0 var(--odd-space-sm);
|
|
61
|
+
font-size: var(--odd-font-size-xl);
|
|
62
|
+
font-weight: var(--odd-font-weight-semibold);
|
|
63
|
+
}
|
|
64
|
+
.wb-content h3 {
|
|
65
|
+
margin: var(--odd-space-lg) 0 var(--odd-space-xs);
|
|
66
|
+
font-size: var(--odd-font-size-lg);
|
|
67
|
+
font-weight: var(--odd-font-weight-semibold);
|
|
68
|
+
}
|
|
69
|
+
.wb-content .wb-muted,
|
|
70
|
+
.wb-content .wb-meta {
|
|
71
|
+
color: var(--odd-color-text-secondary);
|
|
72
|
+
}
|
|
73
|
+
.wb-content .wb-meta {
|
|
74
|
+
font-size: var(--odd-font-size-sm);
|
|
75
|
+
}
|
|
76
|
+
.wb-content .wb-not-documented {
|
|
77
|
+
color: var(--odd-color-text-secondary);
|
|
78
|
+
font-style: italic;
|
|
79
|
+
}
|
|
80
|
+
/* Coverage markers (data-coverage) wrap an item without adding layout. */
|
|
81
|
+
.wb-content [data-coverage] {
|
|
82
|
+
display: contents;
|
|
83
|
+
}
|
|
84
|
+
.wb-content .wb-visually-hidden {
|
|
85
|
+
position: absolute;
|
|
86
|
+
inline-size: 1px;
|
|
87
|
+
block-size: 1px;
|
|
88
|
+
overflow: hidden;
|
|
89
|
+
clip-path: inset(50%);
|
|
90
|
+
white-space: nowrap;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/* Tables: stacked rows on narrow containers. */
|
|
94
|
+
.wb-content .wb-table-wrap {
|
|
95
|
+
overflow-x: auto;
|
|
96
|
+
}
|
|
97
|
+
.wb-content table {
|
|
98
|
+
inline-size: 100%;
|
|
99
|
+
border-collapse: collapse;
|
|
100
|
+
font-size: var(--odd-font-size-sm);
|
|
101
|
+
}
|
|
102
|
+
.wb-content caption {
|
|
103
|
+
padding-block-end: var(--odd-space-xs);
|
|
104
|
+
color: var(--odd-color-text-secondary);
|
|
105
|
+
text-align: start;
|
|
106
|
+
}
|
|
107
|
+
.wb-content th,
|
|
108
|
+
.wb-content td {
|
|
109
|
+
padding: var(--odd-space-xs);
|
|
110
|
+
border-block-end: var(--odd-border-width-default) solid var(--odd-color-border-default);
|
|
111
|
+
text-align: start;
|
|
112
|
+
vertical-align: top;
|
|
113
|
+
}
|
|
114
|
+
.wb-content th {
|
|
115
|
+
font-weight: var(--odd-font-weight-semibold);
|
|
116
|
+
}
|
|
117
|
+
.wb-content td small {
|
|
118
|
+
display: block;
|
|
119
|
+
color: var(--odd-color-text-secondary);
|
|
120
|
+
}
|
|
121
|
+
@container wb-content (width < 40rem) {
|
|
122
|
+
.wb-content .wb-stack thead {
|
|
123
|
+
position: absolute;
|
|
124
|
+
inline-size: 1px;
|
|
125
|
+
block-size: 1px;
|
|
126
|
+
overflow: hidden;
|
|
127
|
+
clip-path: inset(50%);
|
|
128
|
+
}
|
|
129
|
+
.wb-content .wb-stack tr {
|
|
130
|
+
display: grid;
|
|
131
|
+
gap: var(--odd-space-2xs);
|
|
132
|
+
padding-block: var(--odd-space-sm);
|
|
133
|
+
border-block-end: var(--odd-border-width-default) solid var(--odd-color-border-default);
|
|
134
|
+
}
|
|
135
|
+
.wb-content .wb-stack td {
|
|
136
|
+
display: grid;
|
|
137
|
+
grid-template-columns: 7rem minmax(0, 1fr);
|
|
138
|
+
gap: var(--odd-space-xs);
|
|
139
|
+
padding: 0;
|
|
140
|
+
border: 0;
|
|
141
|
+
}
|
|
142
|
+
.wb-content .wb-stack td::before {
|
|
143
|
+
content: attr(data-label);
|
|
144
|
+
color: var(--odd-color-text-secondary);
|
|
145
|
+
font-weight: var(--odd-font-weight-semibold);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/* Interactive example */
|
|
150
|
+
.wb-content .wb-toolbar {
|
|
151
|
+
display: flex;
|
|
152
|
+
flex-wrap: wrap;
|
|
153
|
+
align-items: end;
|
|
154
|
+
gap: var(--odd-space-sm) var(--odd-space-md);
|
|
155
|
+
margin-block-end: var(--odd-space-sm);
|
|
156
|
+
}
|
|
157
|
+
.wb-content .wb-toolbar label {
|
|
158
|
+
display: grid;
|
|
159
|
+
gap: var(--odd-space-2xs);
|
|
160
|
+
color: var(--odd-color-text-secondary);
|
|
161
|
+
font-size: var(--odd-font-size-sm);
|
|
162
|
+
}
|
|
163
|
+
.wb-content .wb-previews {
|
|
164
|
+
display: grid;
|
|
165
|
+
grid-template-columns: minmax(0, 1fr);
|
|
166
|
+
gap: var(--odd-space-md);
|
|
167
|
+
}
|
|
168
|
+
.wb-content .wb-previews.wb-pair {
|
|
169
|
+
grid-template-columns: repeat(auto-fit, minmax(min(100%, 18rem), 1fr));
|
|
170
|
+
}
|
|
171
|
+
.wb-content .wb-preview {
|
|
172
|
+
min-inline-size: 0;
|
|
173
|
+
border: var(--odd-border-width-default) solid var(--odd-color-border-default);
|
|
174
|
+
border-radius: var(--odd-radius-md);
|
|
175
|
+
background: var(--odd-color-surface-default);
|
|
176
|
+
}
|
|
177
|
+
.wb-content .wb-preview > p {
|
|
178
|
+
margin: 0;
|
|
179
|
+
padding: var(--odd-space-2xs) var(--odd-space-xs);
|
|
180
|
+
color: var(--odd-color-text-secondary);
|
|
181
|
+
font-size: var(--odd-font-size-xs);
|
|
182
|
+
}
|
|
183
|
+
.wb-content .wb-preview iframe {
|
|
184
|
+
display: block;
|
|
185
|
+
inline-size: 100%;
|
|
186
|
+
block-size: 14rem;
|
|
187
|
+
border: 0;
|
|
188
|
+
}
|
|
189
|
+
.wb-content .wb-status:empty {
|
|
190
|
+
display: none;
|
|
191
|
+
}
|
|
192
|
+
.wb-content [role='alert'] {
|
|
193
|
+
color: var(--odd-color-danger-foreground, var(--odd-color-text-primary));
|
|
194
|
+
}
|
|
195
|
+
.wb-content .wb-code {
|
|
196
|
+
overflow-x: auto;
|
|
197
|
+
margin: var(--odd-space-xs) 0 0;
|
|
198
|
+
padding: var(--odd-space-sm);
|
|
199
|
+
background: var(--odd-color-surface-sunken);
|
|
200
|
+
border-radius: var(--odd-radius-sm);
|
|
201
|
+
white-space: pre;
|
|
202
|
+
}
|
|
203
|
+
.wb-content .wb-log {
|
|
204
|
+
max-block-size: 14rem;
|
|
205
|
+
overflow: auto;
|
|
206
|
+
margin: 0;
|
|
207
|
+
padding: 0;
|
|
208
|
+
list-style: none;
|
|
209
|
+
font-size: var(--odd-font-size-sm);
|
|
210
|
+
}
|
|
211
|
+
.wb-content .wb-log li {
|
|
212
|
+
padding-block: var(--odd-space-2xs);
|
|
213
|
+
border-block-end: var(--odd-border-width-default) solid var(--odd-color-border-default);
|
|
214
|
+
}
|
|
215
|
+
.wb-content .wb-cell-controls {
|
|
216
|
+
display: flex;
|
|
217
|
+
flex-wrap: wrap;
|
|
218
|
+
align-items: center;
|
|
219
|
+
gap: var(--odd-space-2xs) var(--odd-space-xs);
|
|
220
|
+
}
|
|
221
|
+
.wb-content .wb-error {
|
|
222
|
+
color: var(--odd-color-danger-foreground, var(--odd-color-text-primary));
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/* Theme Studio */
|
|
226
|
+
.wb-content fieldset.wb-group {
|
|
227
|
+
border: var(--odd-border-width-default) solid var(--odd-color-border-default);
|
|
228
|
+
border-radius: var(--odd-radius-sm);
|
|
229
|
+
padding: var(--odd-space-md);
|
|
230
|
+
}
|
|
231
|
+
.wb-content .wb-field {
|
|
232
|
+
display: grid;
|
|
233
|
+
gap: var(--odd-space-2xs);
|
|
234
|
+
margin-block: var(--odd-space-sm);
|
|
235
|
+
}
|
|
236
|
+
.wb-content .wb-json textarea {
|
|
237
|
+
inline-size: 100%;
|
|
238
|
+
box-sizing: border-box;
|
|
239
|
+
}
|
|
240
|
+
.wb-content .wb-swatch {
|
|
241
|
+
display: inline-block;
|
|
242
|
+
inline-size: 1.5rem;
|
|
243
|
+
block-size: 1.5rem;
|
|
244
|
+
border: var(--odd-border-width-default) solid var(--odd-color-border-strong);
|
|
245
|
+
border-radius: var(--odd-radius-sm);
|
|
246
|
+
}
|
|
247
|
+
.wb-content .wb-list {
|
|
248
|
+
margin: 0;
|
|
249
|
+
padding-inline-start: var(--odd-space-lg);
|
|
250
|
+
}
|
|
251
|
+
.wb-content .wb-bar {
|
|
252
|
+
display: block;
|
|
253
|
+
block-size: 0.75rem;
|
|
254
|
+
min-inline-size: 1px;
|
|
255
|
+
max-inline-size: 100%;
|
|
256
|
+
background: var(--odd-color-action-default);
|
|
257
|
+
border-radius: var(--odd-radius-sm);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/* Catalog */
|
|
261
|
+
.wb-content .wb-catalog-filters {
|
|
262
|
+
display: flex;
|
|
263
|
+
flex-wrap: wrap;
|
|
264
|
+
align-items: end;
|
|
265
|
+
gap: var(--odd-space-md);
|
|
266
|
+
margin-block-end: var(--odd-space-lg);
|
|
267
|
+
}
|
|
268
|
+
.wb-content .wb-catalog-filters label {
|
|
269
|
+
display: grid;
|
|
270
|
+
gap: var(--odd-space-2xs);
|
|
271
|
+
color: var(--odd-color-text-secondary);
|
|
272
|
+
font-size: var(--odd-font-size-sm);
|
|
273
|
+
}
|
|
274
|
+
.wb-content .wb-catalog-filters p {
|
|
275
|
+
margin: 0;
|
|
276
|
+
}
|
|
277
|
+
.wb-content .wb-group + .wb-group {
|
|
278
|
+
margin-block-start: var(--odd-space-2xl);
|
|
279
|
+
}
|
|
280
|
+
.wb-content .wb-cards {
|
|
281
|
+
display: grid;
|
|
282
|
+
grid-template-columns: minmax(0, 1fr);
|
|
283
|
+
gap: var(--odd-space-md);
|
|
284
|
+
margin: 0;
|
|
285
|
+
padding: 0;
|
|
286
|
+
list-style: none;
|
|
287
|
+
}
|
|
288
|
+
.wb-content .wb-card {
|
|
289
|
+
block-size: 100%;
|
|
290
|
+
}
|
|
291
|
+
.wb-content .wb-card h2,
|
|
292
|
+
.wb-content .wb-card h3 {
|
|
293
|
+
margin: 0;
|
|
294
|
+
font-size: var(--odd-font-size-lg);
|
|
295
|
+
font-weight: var(--odd-font-weight-semibold);
|
|
296
|
+
}
|
|
297
|
+
.wb-content .wb-card p {
|
|
298
|
+
margin: var(--odd-space-xs) 0 0;
|
|
299
|
+
}
|
|
300
|
+
@container wb-content (width >= 32rem) {
|
|
301
|
+
.wb-content .wb-cards {
|
|
302
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
@container wb-content (width >= 52rem) {
|
|
306
|
+
.wb-content .wb-cards {
|
|
307
|
+
grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
@media (forced-colors: active) {
|
|
311
|
+
.wb-content .wb-bar {
|
|
312
|
+
background: CanvasText;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
`;
|
|
316
|
+
//# sourceMappingURL=styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/panels/styles.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1C,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAA;;;;;;;;CAQjC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2S/B,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme Studio's editor model (workbench.md §6.3), DOM-free: the form fields a draft offers, in
|
|
3
|
+
* groups that follow the design file's variable collections (theme inputs, then role overrides
|
|
4
|
+
* with one column per mode), and immutable edits by configuration path. The form and the JSON
|
|
5
|
+
* editor change the same draft; nothing here generates tokens.
|
|
6
|
+
*/
|
|
7
|
+
export type ConfigPath = readonly string[];
|
|
8
|
+
type Json = null | boolean | number | string | Json[] | {
|
|
9
|
+
[key: string]: Json;
|
|
10
|
+
};
|
|
11
|
+
/** How a value enters the theme (workbench.md §6.3). */
|
|
12
|
+
export type ValueOrigin = 'foundation input' | 'explicit override';
|
|
13
|
+
export interface ThemeField {
|
|
14
|
+
readonly path: ConfigPath;
|
|
15
|
+
readonly label: string;
|
|
16
|
+
readonly kind: 'color' | 'length' | 'number' | 'integer' | 'text';
|
|
17
|
+
readonly origin: ValueOrigin;
|
|
18
|
+
readonly value: string | number | undefined;
|
|
19
|
+
}
|
|
20
|
+
export interface OverrideRow {
|
|
21
|
+
readonly token: string;
|
|
22
|
+
/** One cell per mode; a single value applies to every mode. */
|
|
23
|
+
readonly cells: readonly ThemeField[];
|
|
24
|
+
}
|
|
25
|
+
export interface ThemeFieldGroup {
|
|
26
|
+
readonly id: string;
|
|
27
|
+
readonly title: string;
|
|
28
|
+
readonly note?: string;
|
|
29
|
+
readonly fields: readonly ThemeField[];
|
|
30
|
+
readonly rows?: readonly OverrideRow[];
|
|
31
|
+
readonly modes?: readonly string[];
|
|
32
|
+
}
|
|
33
|
+
export declare function getPath(value: unknown, path: ConfigPath): unknown;
|
|
34
|
+
/** A copy of `value` with `path` set; `undefined` removes the key. Untouched branches are shared. */
|
|
35
|
+
export declare function setPath(value: unknown, path: ConfigPath, next: unknown): unknown;
|
|
36
|
+
export declare const pathText: (path: ConfigPath) => string;
|
|
37
|
+
/** The form over a draft: only fields that apply to it (e.g. the chosen spacing strategy). */
|
|
38
|
+
export declare function themeFields(config: unknown): ThemeFieldGroup[];
|
|
39
|
+
/** A form entry as the configuration value it writes; empty clears the key. */
|
|
40
|
+
export declare function fieldValue(field: ThemeField, input: string): string | number | undefined;
|
|
41
|
+
export interface DraftParse {
|
|
42
|
+
readonly ok: boolean;
|
|
43
|
+
readonly value?: Json;
|
|
44
|
+
readonly message?: string;
|
|
45
|
+
}
|
|
46
|
+
/** The JSON editor's text as a draft; a syntax error never replaces the current draft. */
|
|
47
|
+
export declare function parseDraft(text: string): DraftParse;
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=theme-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-model.d.ts","sourceRoot":"","sources":["../../src/panels/theme-model.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,UAAU,GAAG,SAAS,MAAM,EAAE,CAAC;AAC3C,KAAK,IAAI,GAAG,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,EAAE,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAEhF,wDAAwD;AACxD,MAAM,MAAM,WAAW,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;AAEnE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IAClE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAC7C;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;IACvC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAKD,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAOjE;AAED,qGAAqG;AACrG,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAShF;AAED,eAAO,MAAM,QAAQ,SAAU,UAAU,WAAyB,CAAC;AA+BnE,8FAA8F;AAC9F,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,eAAe,EAAE,CAqE9D;AAED,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAQxF;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,0FAA0F;AAC1F,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CASnD"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme Studio's editor model (workbench.md §6.3), DOM-free: the form fields a draft offers, in
|
|
3
|
+
* groups that follow the design file's variable collections (theme inputs, then role overrides
|
|
4
|
+
* with one column per mode), and immutable edits by configuration path. The form and the JSON
|
|
5
|
+
* editor change the same draft; nothing here generates tokens.
|
|
6
|
+
*/
|
|
7
|
+
const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
8
|
+
export function getPath(value, path) {
|
|
9
|
+
let current = value;
|
|
10
|
+
for (const key of path) {
|
|
11
|
+
if (!isRecord(current))
|
|
12
|
+
return undefined;
|
|
13
|
+
current = current[key];
|
|
14
|
+
}
|
|
15
|
+
return current;
|
|
16
|
+
}
|
|
17
|
+
/** A copy of `value` with `path` set; `undefined` removes the key. Untouched branches are shared. */
|
|
18
|
+
export function setPath(value, path, next) {
|
|
19
|
+
const [key, ...rest] = path;
|
|
20
|
+
if (key === undefined)
|
|
21
|
+
return next;
|
|
22
|
+
const record = isRecord(value) ? value : {};
|
|
23
|
+
const child = rest.length ? setPath(record[key], rest, next) : next;
|
|
24
|
+
const copy = { ...record };
|
|
25
|
+
if (child === undefined)
|
|
26
|
+
delete copy[key];
|
|
27
|
+
else
|
|
28
|
+
copy[key] = child;
|
|
29
|
+
return copy;
|
|
30
|
+
}
|
|
31
|
+
export const pathText = (path) => `/${path.join('/')}`;
|
|
32
|
+
const scalar = (value) => typeof value === 'string' || typeof value === 'number' ? value : undefined;
|
|
33
|
+
const BRAND = [
|
|
34
|
+
['brand', 'primary', 'Brand primary'],
|
|
35
|
+
['brand', 'neutral', 'Neutral'],
|
|
36
|
+
['status', 'danger', 'Danger'],
|
|
37
|
+
['status', 'success', 'Success'],
|
|
38
|
+
['status', 'warning', 'Warning'],
|
|
39
|
+
['status', 'info', 'Info'],
|
|
40
|
+
];
|
|
41
|
+
const SPACING = {
|
|
42
|
+
multiples: [
|
|
43
|
+
['unit', 'Unit', 'length'],
|
|
44
|
+
['snap', 'Snap to', 'length'],
|
|
45
|
+
],
|
|
46
|
+
ratio: [
|
|
47
|
+
['base', 'Base', 'length'],
|
|
48
|
+
['ratio', 'Ratio', 'number'],
|
|
49
|
+
['stepsBelow', 'Steps below', 'integer'],
|
|
50
|
+
['stepsAbove', 'Steps above', 'integer'],
|
|
51
|
+
['snap', 'Snap to', 'length'],
|
|
52
|
+
],
|
|
53
|
+
explicit: [['snap', 'Snap to', 'length']],
|
|
54
|
+
};
|
|
55
|
+
/** The form over a draft: only fields that apply to it (e.g. the chosen spacing strategy). */
|
|
56
|
+
export function themeFields(config) {
|
|
57
|
+
const groups = [
|
|
58
|
+
{
|
|
59
|
+
id: 'inputs',
|
|
60
|
+
title: 'Theme inputs',
|
|
61
|
+
note: 'Foundation inputs: ramps and roles are generated from them.',
|
|
62
|
+
fields: BRAND.map(([group, key, label]) => ({
|
|
63
|
+
path: [group, key],
|
|
64
|
+
label,
|
|
65
|
+
kind: 'color',
|
|
66
|
+
origin: 'foundation input',
|
|
67
|
+
value: scalar(getPath(config, [group, key])),
|
|
68
|
+
})),
|
|
69
|
+
},
|
|
70
|
+
];
|
|
71
|
+
const spacing = getPath(config, ['spacing']);
|
|
72
|
+
const strategy = isRecord(spacing) ? spacing['strategy'] : undefined;
|
|
73
|
+
groups.push({
|
|
74
|
+
id: 'spacing',
|
|
75
|
+
title: 'Spacing',
|
|
76
|
+
note: typeof strategy === 'string' && SPACING[strategy]
|
|
77
|
+
? `Strategy: ${strategy}. Change the strategy or its steps in the JSON editor.`
|
|
78
|
+
: 'No spacing strategy configured: the generator default applies. Add `spacing` in the JSON editor.',
|
|
79
|
+
fields: (typeof strategy === 'string' ? (SPACING[strategy] ?? []) : []).map(([key, label, kind]) => ({
|
|
80
|
+
path: ['spacing', key],
|
|
81
|
+
label,
|
|
82
|
+
kind,
|
|
83
|
+
origin: 'foundation input',
|
|
84
|
+
value: scalar(getPath(config, ['spacing', key])),
|
|
85
|
+
})),
|
|
86
|
+
});
|
|
87
|
+
const overrides = getPath(config, ['overrides']);
|
|
88
|
+
const entries = isRecord(overrides) ? Object.entries(overrides) : [];
|
|
89
|
+
const modes = [
|
|
90
|
+
...new Set(entries.flatMap(([, value]) => (isRecord(value) ? Object.keys(value) : []))),
|
|
91
|
+
];
|
|
92
|
+
groups.push({
|
|
93
|
+
id: 'overrides',
|
|
94
|
+
title: 'Role overrides',
|
|
95
|
+
note: entries.length
|
|
96
|
+
? 'Explicit overrides win over generated values. Values are colours, lengths, or {aliases}.'
|
|
97
|
+
: 'No explicit overrides: every role is generated.',
|
|
98
|
+
fields: [],
|
|
99
|
+
modes,
|
|
100
|
+
rows: entries.map(([token, value]) => ({
|
|
101
|
+
token,
|
|
102
|
+
cells: isRecord(value)
|
|
103
|
+
? modes.map((mode) => ({
|
|
104
|
+
path: ['overrides', token, mode],
|
|
105
|
+
label: `${token} (${mode})`,
|
|
106
|
+
kind: 'text',
|
|
107
|
+
origin: 'explicit override',
|
|
108
|
+
value: scalar(value[mode]),
|
|
109
|
+
}))
|
|
110
|
+
: [
|
|
111
|
+
{
|
|
112
|
+
path: ['overrides', token],
|
|
113
|
+
label: token,
|
|
114
|
+
kind: 'text',
|
|
115
|
+
origin: 'explicit override',
|
|
116
|
+
value: scalar(value),
|
|
117
|
+
},
|
|
118
|
+
],
|
|
119
|
+
})),
|
|
120
|
+
});
|
|
121
|
+
return groups;
|
|
122
|
+
}
|
|
123
|
+
/** A form entry as the configuration value it writes; empty clears the key. */
|
|
124
|
+
export function fieldValue(field, input) {
|
|
125
|
+
const text = input.trim();
|
|
126
|
+
if (text === '')
|
|
127
|
+
return undefined;
|
|
128
|
+
if (field.kind === 'number' || field.kind === 'integer') {
|
|
129
|
+
const number = Number(text);
|
|
130
|
+
return Number.isFinite(number) ? number : text;
|
|
131
|
+
}
|
|
132
|
+
return text;
|
|
133
|
+
}
|
|
134
|
+
/** The JSON editor's text as a draft; a syntax error never replaces the current draft. */
|
|
135
|
+
export function parseDraft(text) {
|
|
136
|
+
try {
|
|
137
|
+
const value = JSON.parse(text);
|
|
138
|
+
return isRecord(value)
|
|
139
|
+
? { ok: true, value }
|
|
140
|
+
: { ok: false, message: 'A theme configuration is a JSON object.' };
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
return { ok: false, message: error instanceof Error ? error.message : String(error) };
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=theme-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-model.js","sourceRoot":"","sources":["../../src/panels/theme-model.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+BH,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CACpE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEvE,MAAM,UAAU,OAAO,CAAC,KAAc,EAAE,IAAgB;IACtD,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,SAAS,CAAC;QACzC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,OAAO,CAAC,KAAc,EAAE,IAAgB,EAAE,IAAa;IACrE,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5B,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpE,MAAM,IAAI,GAA4B,EAAE,GAAG,MAAM,EAAE,CAAC;IACpD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;;QACrC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACvB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAgB,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAEnE,MAAM,MAAM,GAAG,CAAC,KAAc,EAAE,EAAE,CAChC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAE7E,MAAM,KAAK,GAAG;IACZ,CAAC,OAAO,EAAE,SAAS,EAAE,eAAe,CAAC;IACrC,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC;IAC/B,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;IAC9B,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC;IAChC,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC;IAChC,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;CAClB,CAAC;AAEX,MAAM,OAAO,GAET;IACF,SAAS,EAAE;QACT,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;QAC1B,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC;KAC9B;IACD,KAAK,EAAE;QACL,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;QAC1B,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC;QAC5B,CAAC,YAAY,EAAE,aAAa,EAAE,SAAS,CAAC;QACxC,CAAC,YAAY,EAAE,aAAa,EAAE,SAAS,CAAC;QACxC,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC;KAC9B;IACD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;CAC1C,CAAC;AAEF,8FAA8F;AAC9F,MAAM,UAAU,WAAW,CAAC,MAAe;IACzC,MAAM,MAAM,GAAsB;QAChC;YACE,EAAE,EAAE,QAAQ;YACZ,KAAK,EAAE,cAAc;YACrB,IAAI,EAAE,6DAA6D;YACnE,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1C,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC;gBAClB,KAAK;gBACL,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,kBAAkB;gBAC1B,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;aAC7C,CAAC,CAAC;SACJ;KACF,CAAC;IACF,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,MAAM,CAAC,IAAI,CAAC;QACV,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,SAAS;QAChB,IAAI,EACF,OAAO,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;YAC/C,CAAC,CAAC,aAAa,QAAQ,wDAAwD;YAC/E,CAAC,CAAC,kGAAkG;QACxG,MAAM,EAAE,CAAC,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CACzE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YACvB,IAAI,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC;YACtB,KAAK;YACL,IAAI;YACJ,MAAM,EAAE,kBAA2B;YACnC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;SACjD,CAAC,CACH;KACF,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,MAAM,KAAK,GAAG;QACZ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;KACxF,CAAC;IACF,MAAM,CAAC,IAAI,CAAC;QACV,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,gBAAgB;QACvB,IAAI,EAAE,OAAO,CAAC,MAAM;YAClB,CAAC,CAAC,0FAA0F;YAC5F,CAAC,CAAC,iDAAiD;QACrD,MAAM,EAAE,EAAE;QACV,KAAK;QACL,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YACrC,KAAK;YACL,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC;gBACpB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBACnB,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC;oBAChC,KAAK,EAAE,GAAG,KAAK,KAAK,IAAI,GAAG;oBAC3B,IAAI,EAAE,MAAe;oBACrB,MAAM,EAAE,mBAA4B;oBACpC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;iBAC3B,CAAC,CAAC;gBACL,CAAC,CAAC;oBACE;wBACE,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC;wBAC1B,KAAK,EAAE,KAAK;wBACZ,IAAI,EAAE,MAAe;wBACrB,MAAM,EAAE,mBAA4B;wBACpC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;qBACrB;iBACF;SACN,CAAC,CAAC;KACJ,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,UAAU,CAAC,KAAiB,EAAE,KAAa;IACzD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC1B,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAClC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAQD,0FAA0F;AAC1F,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAS,CAAC;QACvC,OAAO,QAAQ,CAAC,KAAK,CAAC;YACpB,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;YACrB,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,yCAAyC,EAAE,CAAC;IACxE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IACxF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme Studio content (workbench.md §6, workbench-pages.md §8): one draft of the library's theme
|
|
3
|
+
* configuration, edited through a form and a JSON editor; generated in a Worker by the library's
|
|
4
|
+
* own generator; applied to light and dark specimen frames as a preview-owned stylesheet, so the
|
|
5
|
+
* real components update in place (no remount). An invalid draft keeps the last valid theme and
|
|
6
|
+
* lists the generator's diagnostics with their configuration paths.
|
|
7
|
+
*/
|
|
8
|
+
import { OddkinElement } from '@oddkin/core/element';
|
|
9
|
+
import { type Scope } from '@oddkin/core/scope';
|
|
10
|
+
import type { StyleInput } from '@oddkin/core/styles';
|
|
11
|
+
import type { ThemeStudioPageData } from '../data/types.js';
|
|
12
|
+
import { type IsolatedPreview } from '../preview/frame.js';
|
|
13
|
+
import { type ThemeGeneration } from '../preview/theme-generation.js';
|
|
14
|
+
declare const ThemeStudioElement_base: import("@oddkin/core/element").WithProps<typeof OddkinElement, {
|
|
15
|
+
readonly page: import("@oddkin/core/element").PropDefinition<ThemeStudioPageData | undefined>;
|
|
16
|
+
readonly frameUrl: import("@oddkin/core/element").PropDefinition<string>;
|
|
17
|
+
}>;
|
|
18
|
+
export declare class ThemeStudioElement extends ThemeStudioElement_base {
|
|
19
|
+
#private;
|
|
20
|
+
static styles: StyleInput;
|
|
21
|
+
constructor();
|
|
22
|
+
/** The current draft (for tests and embedding); read-only snapshot. */
|
|
23
|
+
get draft(): unknown;
|
|
24
|
+
/** Light and dark specimen frames, in that order. */
|
|
25
|
+
get previews(): readonly IsolatedPreview[];
|
|
26
|
+
/** Generation counters: requests sent, superseded, and results applied. */
|
|
27
|
+
get generation(): ThemeGeneration['stats'] | undefined;
|
|
28
|
+
protected connected(scope: Scope): void;
|
|
29
|
+
protected render(): import("@oddkin/core/template").TemplateResult;
|
|
30
|
+
}
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=theme-studio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-studio.d.ts","sourceRoot":"","sources":["../../src/panels/theme-studio.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,aAAa,EAAQ,MAAM,sBAAsB,CAAC;AAG3D,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,gCAAgC,CAAC;;;;;AAcxC,qBAAa,kBAAmB,SAAQ,uBAMtC;;IACA,OAAgB,MAAM,EAAE,UAAU,CAAoC;IAiBtE,cAGC;IAED,uEAAuE;IACvE,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,qDAAqD;IACrD,IAAI,QAAQ,IAAI,SAAS,eAAe,EAAE,CAEzC;IAED,2EAA2E;IAC3E,IAAI,UAAU,IAAI,eAAe,CAAC,OAAO,CAAC,GAAG,SAAS,CAErD;IAED,UAAmB,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAc/C;IAgID,UAAmB,MAAM,mDAoLxB;CACF"}
|