@oddkin/workbench 0.0.0-stage → 1.0.0-beta.1

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.
Files changed (243) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +66 -2
  3. package/dist/app/card-previews.d.ts +14 -0
  4. package/dist/app/card-previews.d.ts.map +1 -0
  5. package/dist/app/card-previews.js +140 -0
  6. package/dist/app/card-previews.js.map +1 -0
  7. package/dist/app/copy.d.ts +48 -0
  8. package/dist/app/copy.d.ts.map +1 -0
  9. package/dist/app/copy.js +52 -0
  10. package/dist/app/copy.js.map +1 -0
  11. package/dist/app/define.d.ts +3 -0
  12. package/dist/app/define.d.ts.map +1 -0
  13. package/dist/app/define.js +10 -0
  14. package/dist/app/define.js.map +1 -0
  15. package/dist/app/details.d.ts +22 -0
  16. package/dist/app/details.d.ts.map +1 -0
  17. package/dist/app/details.js +17 -0
  18. package/dist/app/details.js.map +1 -0
  19. package/dist/app/index.d.ts +12 -0
  20. package/dist/app/index.d.ts.map +1 -0
  21. package/dist/app/index.js +9 -0
  22. package/dist/app/index.js.map +1 -0
  23. package/dist/app/routes.d.ts +26 -0
  24. package/dist/app/routes.d.ts.map +1 -0
  25. package/dist/app/routes.js +96 -0
  26. package/dist/app/routes.js.map +1 -0
  27. package/dist/app/search.d.ts +17 -0
  28. package/dist/app/search.d.ts.map +1 -0
  29. package/dist/app/search.js +52 -0
  30. package/dist/app/search.js.map +1 -0
  31. package/dist/app/shell.d.ts +29 -0
  32. package/dist/app/shell.d.ts.map +1 -0
  33. package/dist/app/shell.js +478 -0
  34. package/dist/app/shell.js.map +1 -0
  35. package/dist/app/styles.d.ts +2 -0
  36. package/dist/app/styles.d.ts.map +1 -0
  37. package/dist/app/styles.js +356 -0
  38. package/dist/app/styles.js.map +1 -0
  39. package/dist/app/theme-studio.d.ts +12 -0
  40. package/dist/app/theme-studio.d.ts.map +1 -0
  41. package/dist/app/theme-studio.js +14 -0
  42. package/dist/app/theme-studio.js.map +1 -0
  43. package/dist/app/views.d.ts +38 -0
  44. package/dist/app/views.d.ts.map +1 -0
  45. package/dist/app/views.js +252 -0
  46. package/dist/app/views.js.map +1 -0
  47. package/dist/config/index.d.ts +170 -0
  48. package/dist/config/index.d.ts.map +1 -0
  49. package/dist/config/index.js +148 -0
  50. package/dist/config/index.js.map +1 -0
  51. package/dist/conformance/button.d.ts +2 -0
  52. package/dist/conformance/button.d.ts.map +1 -0
  53. package/dist/conformance/button.js +233 -0
  54. package/dist/conformance/button.js.map +1 -0
  55. package/dist/conformance/index.d.ts +107 -0
  56. package/dist/conformance/index.d.ts.map +1 -0
  57. package/dist/conformance/index.js +60 -0
  58. package/dist/conformance/index.js.map +1 -0
  59. package/dist/data/build.d.ts +36 -0
  60. package/dist/data/build.d.ts.map +1 -0
  61. package/dist/data/build.js +260 -0
  62. package/dist/data/build.js.map +1 -0
  63. package/dist/data/import-map.d.ts +59 -0
  64. package/dist/data/import-map.d.ts.map +1 -0
  65. package/dist/data/import-map.js +195 -0
  66. package/dist/data/import-map.js.map +1 -0
  67. package/dist/data/index.d.ts +14 -0
  68. package/dist/data/index.d.ts.map +1 -0
  69. package/dist/data/index.js +10 -0
  70. package/dist/data/index.js.map +1 -0
  71. package/dist/data/theme-studio.d.ts +21 -0
  72. package/dist/data/theme-studio.d.ts.map +1 -0
  73. package/dist/data/theme-studio.js +112 -0
  74. package/dist/data/theme-studio.js.map +1 -0
  75. package/dist/data/types.d.ts +187 -0
  76. package/dist/data/types.d.ts.map +1 -0
  77. package/dist/data/types.js +4 -0
  78. package/dist/data/types.js.map +1 -0
  79. package/dist/examples/index.d.ts +101 -0
  80. package/dist/examples/index.d.ts.map +1 -0
  81. package/dist/examples/index.js +106 -0
  82. package/dist/examples/index.js.map +1 -0
  83. package/dist/frame/index.d.ts +9 -0
  84. package/dist/frame/index.d.ts.map +1 -0
  85. package/dist/frame/index.js +482 -0
  86. package/dist/frame/index.js.map +1 -0
  87. package/dist/internal/diagnostics.d.ts +17 -0
  88. package/dist/internal/diagnostics.d.ts.map +1 -0
  89. package/dist/internal/diagnostics.js +19 -0
  90. package/dist/internal/diagnostics.js.map +1 -0
  91. package/dist/node/bin.d.ts +3 -0
  92. package/dist/node/bin.d.ts.map +1 -0
  93. package/dist/node/bin.js +12 -0
  94. package/dist/node/bin.js.map +1 -0
  95. package/dist/node/cli.d.ts +17 -0
  96. package/dist/node/cli.d.ts.map +1 -0
  97. package/dist/node/cli.js +198 -0
  98. package/dist/node/cli.js.map +1 -0
  99. package/dist/node/config.d.ts +28 -0
  100. package/dist/node/config.d.ts.map +1 -0
  101. package/dist/node/config.js +80 -0
  102. package/dist/node/config.js.map +1 -0
  103. package/dist/node/example-modules.d.ts +8 -0
  104. package/dist/node/example-modules.d.ts.map +1 -0
  105. package/dist/node/example-modules.js +28 -0
  106. package/dist/node/example-modules.js.map +1 -0
  107. package/dist/node/generated.d.ts +19 -0
  108. package/dist/node/generated.d.ts.map +1 -0
  109. package/dist/node/generated.js +109 -0
  110. package/dist/node/generated.js.map +1 -0
  111. package/dist/node/html.d.ts +35 -0
  112. package/dist/node/html.d.ts.map +1 -0
  113. package/dist/node/html.js +51 -0
  114. package/dist/node/html.js.map +1 -0
  115. package/dist/node/index.d.ts +24 -0
  116. package/dist/node/index.d.ts.map +1 -0
  117. package/dist/node/index.js +15 -0
  118. package/dist/node/index.js.map +1 -0
  119. package/dist/node/inputs.d.ts +26 -0
  120. package/dist/node/inputs.d.ts.map +1 -0
  121. package/dist/node/inputs.js +282 -0
  122. package/dist/node/inputs.js.map +1 -0
  123. package/dist/node/packages.d.ts +35 -0
  124. package/dist/node/packages.d.ts.map +1 -0
  125. package/dist/node/packages.js +87 -0
  126. package/dist/node/packages.js.map +1 -0
  127. package/dist/node/preload.d.ts +10 -0
  128. package/dist/node/preload.d.ts.map +1 -0
  129. package/dist/node/preload.js +61 -0
  130. package/dist/node/preload.js.map +1 -0
  131. package/dist/node/server.d.ts +42 -0
  132. package/dist/node/server.d.ts.map +1 -0
  133. package/dist/node/server.js +410 -0
  134. package/dist/node/server.js.map +1 -0
  135. package/dist/node/static.d.ts +43 -0
  136. package/dist/node/static.d.ts.map +1 -0
  137. package/dist/node/static.js +157 -0
  138. package/dist/node/static.js.map +1 -0
  139. package/dist/node/workbench.d.ts +43 -0
  140. package/dist/node/workbench.d.ts.map +1 -0
  141. package/dist/node/workbench.js +204 -0
  142. package/dist/node/workbench.js.map +1 -0
  143. package/dist/pages/build.d.ts +22 -0
  144. package/dist/pages/build.d.ts.map +1 -0
  145. package/dist/pages/build.js +363 -0
  146. package/dist/pages/build.js.map +1 -0
  147. package/dist/pages/defaults.d.ts +16 -0
  148. package/dist/pages/defaults.d.ts.map +1 -0
  149. package/dist/pages/defaults.js +88 -0
  150. package/dist/pages/defaults.js.map +1 -0
  151. package/dist/pages/index.d.ts +14 -0
  152. package/dist/pages/index.d.ts.map +1 -0
  153. package/dist/pages/index.js +10 -0
  154. package/dist/pages/index.js.map +1 -0
  155. package/dist/pages/navigation.d.ts +48 -0
  156. package/dist/pages/navigation.d.ts.map +1 -0
  157. package/dist/pages/navigation.js +83 -0
  158. package/dist/pages/navigation.js.map +1 -0
  159. package/dist/pages/types.d.ts +148 -0
  160. package/dist/pages/types.d.ts.map +1 -0
  161. package/dist/pages/types.js +3 -0
  162. package/dist/pages/types.js.map +1 -0
  163. package/dist/panels/catalog-define.d.ts +3 -0
  164. package/dist/panels/catalog-define.d.ts.map +1 -0
  165. package/dist/panels/catalog-define.js +7 -0
  166. package/dist/panels/catalog-define.js.map +1 -0
  167. package/dist/panels/catalog-layout-styles.d.ts +2 -0
  168. package/dist/panels/catalog-layout-styles.d.ts.map +1 -0
  169. package/dist/panels/catalog-layout-styles.js +54 -0
  170. package/dist/panels/catalog-layout-styles.js.map +1 -0
  171. package/dist/panels/catalog-styles.d.ts +2 -0
  172. package/dist/panels/catalog-styles.d.ts.map +1 -0
  173. package/dist/panels/catalog-styles.js +106 -0
  174. package/dist/panels/catalog-styles.js.map +1 -0
  175. package/dist/panels/catalog.d.ts +37 -0
  176. package/dist/panels/catalog.d.ts.map +1 -0
  177. package/dist/panels/catalog.js +74 -0
  178. package/dist/panels/catalog.js.map +1 -0
  179. package/dist/panels/component-define.d.ts +3 -0
  180. package/dist/panels/component-define.d.ts.map +1 -0
  181. package/dist/panels/component-define.js +6 -0
  182. package/dist/panels/component-define.js.map +1 -0
  183. package/dist/panels/component-detail.d.ts +49 -0
  184. package/dist/panels/component-detail.d.ts.map +1 -0
  185. package/dist/panels/component-detail.js +1352 -0
  186. package/dist/panels/component-detail.js.map +1 -0
  187. package/dist/panels/component.d.ts +17 -0
  188. package/dist/panels/component.d.ts.map +1 -0
  189. package/dist/panels/component.js +10 -0
  190. package/dist/panels/component.js.map +1 -0
  191. package/dist/panels/example-styles.d.ts +2 -0
  192. package/dist/panels/example-styles.d.ts.map +1 -0
  193. package/dist/panels/example-styles.js +343 -0
  194. package/dist/panels/example-styles.js.map +1 -0
  195. package/dist/panels/foundation-define.d.ts +3 -0
  196. package/dist/panels/foundation-define.d.ts.map +1 -0
  197. package/dist/panels/foundation-define.js +6 -0
  198. package/dist/panels/foundation-define.js.map +1 -0
  199. package/dist/panels/foundation-detail.d.ts +23 -0
  200. package/dist/panels/foundation-detail.d.ts.map +1 -0
  201. package/dist/panels/foundation-detail.js +216 -0
  202. package/dist/panels/foundation-detail.js.map +1 -0
  203. package/dist/panels/foundation.d.ts +15 -0
  204. package/dist/panels/foundation.d.ts.map +1 -0
  205. package/dist/panels/foundation.js +9 -0
  206. package/dist/panels/foundation.js.map +1 -0
  207. package/dist/panels/model.d.ts +184 -0
  208. package/dist/panels/model.d.ts.map +1 -0
  209. package/dist/panels/model.js +488 -0
  210. package/dist/panels/model.js.map +1 -0
  211. package/dist/panels/styles.d.ts +3 -0
  212. package/dist/panels/styles.d.ts.map +1 -0
  213. package/dist/panels/styles.js +265 -0
  214. package/dist/panels/styles.js.map +1 -0
  215. package/dist/panels/theme-model.d.ts +69 -0
  216. package/dist/panels/theme-model.d.ts.map +1 -0
  217. package/dist/panels/theme-model.js +166 -0
  218. package/dist/panels/theme-model.js.map +1 -0
  219. package/dist/panels/theme-studio.d.ts +32 -0
  220. package/dist/panels/theme-studio.d.ts.map +1 -0
  221. package/dist/panels/theme-studio.js +375 -0
  222. package/dist/panels/theme-studio.js.map +1 -0
  223. package/dist/preview/frame.d.ts +44 -0
  224. package/dist/preview/frame.d.ts.map +1 -0
  225. package/dist/preview/frame.js +260 -0
  226. package/dist/preview/frame.js.map +1 -0
  227. package/dist/preview/index.d.ts +26 -0
  228. package/dist/preview/index.d.ts.map +1 -0
  229. package/dist/preview/index.js +58 -0
  230. package/dist/preview/index.js.map +1 -0
  231. package/dist/preview/theme-generation.d.ts +33 -0
  232. package/dist/preview/theme-generation.d.ts.map +1 -0
  233. package/dist/preview/theme-generation.js +48 -0
  234. package/dist/preview/theme-generation.js.map +1 -0
  235. package/dist/protocol/index.d.ts +222 -0
  236. package/dist/protocol/index.d.ts.map +1 -0
  237. package/dist/protocol/index.js +272 -0
  238. package/dist/protocol/index.js.map +1 -0
  239. package/dist/testing/index.d.ts +47 -0
  240. package/dist/testing/index.d.ts.map +1 -0
  241. package/dist/testing/index.js +145 -0
  242. package/dist/testing/index.js.map +1 -0
  243. package/package.json +118 -4
@@ -0,0 +1,252 @@
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 tag = page.kind === 'component' ? page.id.replace(/^components\//, '') : undefined;
119
+ const preview = ctx.catalog?.preview?.(page);
120
+ return html `<li>
121
+ <odd-card
122
+ class=${preview ? 'wb-card wb-has-preview' : 'wb-card'}
123
+ padding=${preview ? 'none' : null}
124
+ >
125
+ ${preview ? html `<div class="wb-card-preview" slot="header">${preview}</div>` : nothing}
126
+ ${level === 2 ? html `<h2>${page.title}</h2>` : html `<h3>${page.title}</h3>`}
127
+ ${page.summary ? html `<p>${inline(page.summary)}</p>` : nothing} ${metaLine(page, ctx.lang)}
128
+ <div class="wb-card-footer" slot="footer">
129
+ ${tag ? html `<p class="wb-card-tag"><code>${tag}</code></p>` : nothing}
130
+ <a
131
+ class="wb-card-action"
132
+ href=${ctx.href(page.route)}
133
+ aria-label=${`${COPY.viewPage(tag !== undefined)}: ${page.title}`}
134
+ >${COPY.viewPage(tag !== undefined)}</a
135
+ >
136
+ </div>
137
+ </odd-card>
138
+ </li>`;
139
+ }
140
+ /** Overview body: the section's cards, grouped when the section has groups (components). */
141
+ export function overviewBody(ctx, page) {
142
+ if (page.availability === 'unavailable')
143
+ return html `<div class="wb-body">
144
+ <p><strong>${page.id === 'foundations' ? COPY.noFoundations : COPY.noComponents}</strong></p>
145
+ ${page.id === 'foundations' ? html `<p class="wb-muted">${COPY.noFoundationsHelp}</p>` : nothing}
146
+ </div>`;
147
+ const filters = page.section === 'components' ? ctx.catalog : undefined;
148
+ const shown = filters?.groups?.length ? new Set(filters.groups) : undefined;
149
+ const allEntries = cards(ctx.registry, page.section).filter((entry) => !shown || shown.has(entry.group ?? ''));
150
+ const categories = [...new Set(allEntries.map((entry) => entry.group ?? ''))];
151
+ const selectedCategory = filters && categories.includes(filters.category) ? filters.category : '';
152
+ const entries = filters
153
+ ? allEntries.filter((entry) => {
154
+ const text = `${entry.title} ${entry.id} ${entry.summary ?? ''} ${(entry.tags ?? []).join(' ')}`.toLowerCase();
155
+ return ((!filters.query.trim() || text.includes(filters.query.trim().toLowerCase())) &&
156
+ (!selectedCategory || (entry.group ?? '') === selectedCategory));
157
+ })
158
+ : allEntries;
159
+ const groups = new Map();
160
+ for (const entry of entries)
161
+ groups.set(entry.group ?? '', [...(groups.get(entry.group ?? '') ?? []), entry]);
162
+ const controls = filters === undefined
163
+ ? nothing
164
+ : html `<form
165
+ class="wb-catalog-filters odd-stack"
166
+ role="search"
167
+ @submit=${(event) => event.preventDefault()}
168
+ >
169
+ <div class="wb-catalog-search odd-cluster">
170
+ <label class="odd-stack"
171
+ >${COPY.componentSearch}
172
+ <input
173
+ type="search"
174
+ name="q"
175
+ placeholder=${COPY.componentSearchPlaceholder}
176
+ aria-describedby="wb-catalog-hint"
177
+ .value=${filters.query}
178
+ @input=${(event) => filters.update(event.target.value, filters.category)}
179
+ />
180
+ <small id="wb-catalog-hint">${COPY.componentSearchHint}</small>
181
+ </label>
182
+ <p class="wb-counts odd-cluster">
183
+ <span class="wb-count">${COPY.componentCount(allEntries.length)}</span>
184
+ <span class="wb-count">${COPY.categoryCount(categories.length)}</span>
185
+ </p>
186
+ </div>
187
+ <div class="wb-categories odd-cluster" role="group" aria-label=${COPY.categoryFilter}>
188
+ ${['', ...categories].map((category) => html `<button
189
+ type="button"
190
+ aria-pressed=${category === selectedCategory ? 'true' : 'false'}
191
+ @click=${() => filters.update(filters.query, category)}
192
+ >
193
+ ${category || COPY.allCategories}
194
+ </button>`)}
195
+ </div>
196
+ <p class="wb-muted" aria-live="polite">
197
+ ${COPY.componentResults(entries.length, allEntries.length)}
198
+ </p>
199
+ </form>`;
200
+ if (!entries.length)
201
+ return html `<div class="wb-body">
202
+ ${controls}
203
+ <p role="status">${COPY.noComponentResults}</p>
204
+ </div>`;
205
+ if (groups.size === 1 && groups.has(''))
206
+ return html `<div class="wb-body">
207
+ ${controls}
208
+ <ul class="wb-cards odd-grid">
209
+ ${repeat(entries, (entry) => entry.id, (entry) => card(ctx, entry, 2))}
210
+ </ul>
211
+ </div>`;
212
+ return html `<div class="wb-body">
213
+ ${controls}
214
+ ${[...groups].map(([group, pages], i) => html `<section class="wb-group" aria-labelledby=${`wb-group-${i}`}>
215
+ <h2 id=${`wb-group-${i}`}>${group} <span class="wb-muted">(${pages.length})</span></h2>
216
+ <ul class="wb-cards odd-grid">
217
+ ${repeat(pages, (entry) => entry.id, (entry) => card(ctx, entry, 3))}
218
+ </ul>
219
+ </section>`)}
220
+ </div>`;
221
+ }
222
+ /** Detail pages without generated content: a section per visible registry section. */
223
+ export function sectionsBody(page) {
224
+ return html `<div class="wb-body">
225
+ ${repeat(page.sections.filter((s) => s.visible), (section) => section.id, (section) => html `<section id=${section.id} aria-labelledby=${`${section.id}-title`}>
226
+ <h2 id=${`${section.id}-title`}>${section.title}</h2>
227
+ <p class="wb-muted">${COPY.sectionPending}</p>
228
+ </section>`)}
229
+ </div>`;
230
+ }
231
+ export function toc(ctx, page) {
232
+ const entries = onThisPage(page);
233
+ if (!entries.length)
234
+ return nothing;
235
+ return html `<nav class="wb-toc" aria-labelledby="wb-toc-title">
236
+ <h2 id="wb-toc-title">${COPY.onThisPage}</h2>
237
+ <ul>
238
+ ${repeat(entries, (entry) => entry.id, (entry) => html `<li><a href=${ctx.href(`${page.route}#${entry.id}`)}>${entry.title}</a></li>`)}
239
+ </ul>
240
+ </nav>`;
241
+ }
242
+ /** A page with a heading and one paragraph: not found, a failed page, a notice. */
243
+ export function messagePage(ctx, title, text, link) {
244
+ return html `<div class="wb-page">
245
+ <header class="wb-page-header">
246
+ <h1>${title}</h1>
247
+ <p class="wb-summary">${text}</p>
248
+ ${link ? html `<a class="wb-back" href=${ctx.href(link.route)}>${link.title}</a>` : nothing}
249
+ </header>
250
+ </div>`;
251
+ }
252
+ //# sourceMappingURL=views.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"views.js","sourceRoot":"","sources":["../../src/app/views.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * `@oddkin/workbench/config` — `defineWorkbenchConfig` and `defineDocs` with types matching the
3
+ * `workbench-config.v1` and `docs-content.v1` schemas, plus default resolution and validation.
4
+ * DOM-free. Values here describe presentation; generated facts always come from metadata
5
+ * and token inspection (ADR 0024).
6
+ */
7
+ import { type WorkbenchDiagnostic } from '../internal/diagnostics.js';
8
+ export type { WorkbenchDiagnostic } from '../internal/diagnostics.js';
9
+ export type Routing = 'history' | 'hash';
10
+ export type ProductPlacement = 'foundations' | 'primary';
11
+ export type ProductSource = {
12
+ readonly theme: string;
13
+ readonly product: string;
14
+ } | {
15
+ readonly package: string;
16
+ readonly export?: string;
17
+ } | {
18
+ readonly manifest: string;
19
+ readonly version: string;
20
+ };
21
+ export interface WorkbenchConfig {
22
+ readonly $schema?: string;
23
+ readonly library: {
24
+ readonly packages: readonly string[];
25
+ readonly cem?: readonly string[];
26
+ };
27
+ readonly branding?: {
28
+ readonly name?: string;
29
+ readonly logo?: string;
30
+ readonly theme?: string;
31
+ readonly links?: readonly {
32
+ readonly label: string;
33
+ readonly href: string;
34
+ }[];
35
+ };
36
+ readonly hosting?: {
37
+ readonly basePath?: string;
38
+ readonly routing?: Routing;
39
+ };
40
+ readonly navigation?: {
41
+ readonly home?: boolean;
42
+ /** Ordered section ids; defaults to foundations, components, theme-studio. */
43
+ readonly primary?: readonly string[];
44
+ readonly legacyRedirects?: boolean;
45
+ };
46
+ readonly categories?: {
47
+ readonly definitions?: readonly {
48
+ readonly id: string;
49
+ readonly label: string;
50
+ readonly description?: string;
51
+ readonly order?: number;
52
+ }[];
53
+ /** tag → category id overrides. */
54
+ readonly assign?: Readonly<Record<string, string>>;
55
+ readonly fallback?: string;
56
+ };
57
+ readonly themeStudio?: {
58
+ readonly enabled?: boolean;
59
+ readonly route?: string;
60
+ readonly themeConfig?: string;
61
+ readonly preview?: {
62
+ readonly recipe?: string;
63
+ readonly roles?: Readonly<Record<string, string | {
64
+ readonly component: string;
65
+ readonly example?: string;
66
+ readonly adapter?: string;
67
+ }>>;
68
+ };
69
+ };
70
+ readonly products?: {
71
+ readonly enabled?: boolean;
72
+ readonly placement?: readonly ProductPlacement[];
73
+ readonly sources?: readonly {
74
+ readonly id: string;
75
+ readonly from: ProductSource;
76
+ }[];
77
+ readonly discovery?: {
78
+ readonly workspace?: boolean;
79
+ readonly exclude?: readonly string[];
80
+ };
81
+ };
82
+ readonly content?: {
83
+ readonly files?: readonly string[];
84
+ readonly locales?: readonly string[];
85
+ readonly defaultLocale?: string;
86
+ };
87
+ readonly assets?: readonly string[];
88
+ }
89
+ /** A configuration with every default applied. */
90
+ export interface ResolvedWorkbenchConfig {
91
+ readonly library: WorkbenchConfig['library'];
92
+ readonly branding: NonNullable<WorkbenchConfig['branding']>;
93
+ readonly hosting: {
94
+ readonly basePath: string;
95
+ readonly routing: Routing;
96
+ };
97
+ readonly navigation: {
98
+ readonly home: boolean;
99
+ readonly primary: readonly string[];
100
+ readonly legacyRedirects: boolean;
101
+ };
102
+ readonly categories: {
103
+ readonly definitions: NonNullable<NonNullable<WorkbenchConfig['categories']>['definitions']>;
104
+ readonly assign: Readonly<Record<string, string>>;
105
+ readonly fallback: string;
106
+ };
107
+ readonly themeStudio: {
108
+ readonly enabled: boolean;
109
+ readonly route: string;
110
+ readonly themeConfig?: string;
111
+ readonly preview: NonNullable<NonNullable<WorkbenchConfig['themeStudio']>['preview']>;
112
+ };
113
+ readonly products: {
114
+ readonly enabled: boolean;
115
+ readonly placement: readonly ProductPlacement[];
116
+ readonly sources: NonNullable<NonNullable<WorkbenchConfig['products']>['sources']>;
117
+ readonly discovery: {
118
+ readonly workspace: boolean;
119
+ readonly exclude: readonly string[];
120
+ };
121
+ };
122
+ readonly content: NonNullable<WorkbenchConfig['content']>;
123
+ readonly assets: readonly string[];
124
+ }
125
+ /** Identity with types, for `oddkin.config.ts`. */
126
+ export declare function defineWorkbenchConfig(config: WorkbenchConfig): WorkbenchConfig;
127
+ export declare const DEFAULT_PRIMARY: readonly ['foundations', 'components', 'theme-studio'];
128
+ export declare const KNOWN_SECTIONS: string[];
129
+ /**
130
+ * Validate a configuration (from `oddkin.config.*` or JSON) and apply defaults. Returns
131
+ * `config: undefined` when there are errors.
132
+ */
133
+ export declare function resolveWorkbenchConfig(input: unknown): {
134
+ config: ResolvedWorkbenchConfig | undefined;
135
+ diagnostics: WorkbenchDiagnostic[];
136
+ };
137
+ export declare const DOCS_SCHEMA = "https://oddkin.dev/schemas/docs-content/v1.json";
138
+ export interface SectionContent {
139
+ readonly title?: string;
140
+ readonly guidance?: string;
141
+ readonly visible?: boolean;
142
+ readonly order?: number;
143
+ /** `example:<tag>/<name>` references. */
144
+ readonly examples?: readonly string[];
145
+ }
146
+ export interface PageContent {
147
+ readonly title?: string;
148
+ readonly eyebrow?: string;
149
+ readonly summary?: string;
150
+ readonly intro?: string;
151
+ readonly tags?: readonly string[];
152
+ /** ISO date (YYYY-MM-DD), declared by the author. */
153
+ readonly updated?: string;
154
+ readonly order?: number;
155
+ readonly visible?: boolean;
156
+ readonly useFor?: readonly string[];
157
+ readonly notFor?: readonly string[];
158
+ readonly sections?: Readonly<Record<string, SectionContent>>;
159
+ }
160
+ export interface DocsContent {
161
+ readonly schema: typeof DOCS_SCHEMA;
162
+ readonly locale?: string;
163
+ /** Renamed page/section id → current id. */
164
+ readonly aliases?: Readonly<Record<string, string>>;
165
+ /** Keyed by stable page id (`foundations/spacing`, `components/<tag>`, `theme-studio`). */
166
+ readonly pages: Readonly<Record<string, PageContent>>;
167
+ }
168
+ /** Identity with types, for `oddkin.docs.ts`; fills in the schema id. */
169
+ export declare function defineDocs(content: Omit<DocsContent, 'schema'>): DocsContent;
170
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * `@oddkin/workbench/config` — `defineWorkbenchConfig` and `defineDocs` with types matching the
3
+ * `workbench-config.v1` and `docs-content.v1` schemas, plus default resolution and validation.
4
+ * DOM-free. Values here describe presentation; generated facts always come from metadata
5
+ * and token inspection (ADR 0024).
6
+ */
7
+ import { DiagnosticList, isObject } from '../internal/diagnostics.js';
8
+ /** Identity with types, for `oddkin.config.ts`. */
9
+ export function defineWorkbenchConfig(config) {
10
+ return config;
11
+ }
12
+ export const DEFAULT_PRIMARY = ['foundations', 'components', 'theme-studio'];
13
+ export const KNOWN_SECTIONS = [
14
+ 'home',
15
+ 'foundations',
16
+ 'components',
17
+ 'theme-studio',
18
+ 'products',
19
+ 'guides',
20
+ ];
21
+ const TOP_LEVEL = new Set([
22
+ '$schema',
23
+ 'library',
24
+ 'branding',
25
+ 'hosting',
26
+ 'navigation',
27
+ 'categories',
28
+ 'themeStudio',
29
+ 'products',
30
+ 'content',
31
+ 'assets',
32
+ ]);
33
+ const BASE_PATH = /^\/(.*\/)?$/;
34
+ /**
35
+ * Validate a configuration (from `oddkin.config.*` or JSON) and apply defaults. Returns
36
+ * `config: undefined` when there are errors.
37
+ */
38
+ export function resolveWorkbenchConfig(input) {
39
+ const out = new DiagnosticList();
40
+ if (!isObject(input)) {
41
+ out.error('config.invalid', 'The Workbench configuration must be an object.');
42
+ return { config: undefined, diagnostics: out.items };
43
+ }
44
+ for (const key of Object.keys(input)) {
45
+ if (TOP_LEVEL.has(key))
46
+ continue;
47
+ out.error('config.key.unknown', key === 'playground'
48
+ ? 'There is no Playground destination: interactive examples live on each component page. Remove "playground"; legacy /playground links redirect to Components.'
49
+ : `Unknown configuration key "${key}".`, `/${key}`);
50
+ }
51
+ const c = input;
52
+ const packages = c.library?.packages;
53
+ if (!Array.isArray(packages) ||
54
+ packages.length === 0 ||
55
+ !packages.every((p) => typeof p === 'string')) {
56
+ out.error('config.library.missing', 'library.packages must list at least one package to document.', '/library/packages');
57
+ }
58
+ const basePath = c.hosting?.basePath ?? '/';
59
+ if (!BASE_PATH.test(basePath)) {
60
+ out.error('config.basePath.invalid', `hosting.basePath "${basePath}" must start and end with "/" (for example "/docs/").`, '/hosting/basePath');
61
+ }
62
+ const routing = c.hosting?.routing ?? 'history';
63
+ if (routing !== 'history' && routing !== 'hash') {
64
+ out.error('config.routing.invalid', 'hosting.routing must be "history" or "hash".', '/hosting/routing');
65
+ }
66
+ const primary = c.navigation?.primary ?? DEFAULT_PRIMARY;
67
+ primary.forEach((section, i) => {
68
+ if (!KNOWN_SECTIONS.includes(section)) {
69
+ out.warn('config.navigation.unknown', `navigation.primary entry "${section}" is not a Workbench section (${KNOWN_SECTIONS.join(', ')}).`, `/navigation/primary/${i}`);
70
+ }
71
+ });
72
+ const definitions = c.categories?.definitions ?? [];
73
+ const seen = new Set();
74
+ definitions.forEach((d, i) => {
75
+ if (seen.has(d.id)) {
76
+ out.error('config.category.duplicate', `Category id "${d.id}" is defined twice.`, `/categories/definitions/${i}`);
77
+ }
78
+ seen.add(d.id);
79
+ });
80
+ for (const [tag, id] of Object.entries(c.categories?.assign ?? {})) {
81
+ if (!seen.has(id)) {
82
+ out.error('config.category.unknown', `categories.assign maps <${tag}> to "${id}", which is not in categories.definitions.`, `/categories/assign/${tag}`);
83
+ }
84
+ }
85
+ const route = c.themeStudio?.route ?? '/theme-studio';
86
+ if (!route.startsWith('/')) {
87
+ out.error('config.route.invalid', `themeStudio.route "${route}" must start with "/".`, '/themeStudio/route');
88
+ }
89
+ const placement = c.products?.placement ?? ['foundations'];
90
+ placement.forEach((p, i) => {
91
+ if (p !== 'foundations' && p !== 'primary') {
92
+ out.error('config.products.placement', `products.placement "${String(p)}" must be "foundations" or "primary".`, `/products/placement/${i}`);
93
+ }
94
+ });
95
+ const productIds = new Set();
96
+ (c.products?.sources ?? []).forEach((source, i) => {
97
+ if (productIds.has(source.id)) {
98
+ out.error('config.product.duplicate', `Product id "${source.id}" is configured twice.`, `/products/sources/${i}`);
99
+ }
100
+ productIds.add(source.id);
101
+ });
102
+ if (out.hasErrors)
103
+ return { config: undefined, diagnostics: out.items };
104
+ const themeConfig = c.themeStudio?.themeConfig;
105
+ return {
106
+ config: {
107
+ library: c.library,
108
+ branding: c.branding ?? {},
109
+ hosting: { basePath, routing },
110
+ navigation: {
111
+ home: c.navigation?.home ?? false,
112
+ primary,
113
+ legacyRedirects: c.navigation?.legacyRedirects ?? true,
114
+ },
115
+ categories: {
116
+ definitions,
117
+ assign: c.categories?.assign ?? {},
118
+ fallback: c.categories?.fallback ?? 'Other components',
119
+ },
120
+ themeStudio: {
121
+ enabled: c.themeStudio?.enabled ?? true,
122
+ route,
123
+ ...(themeConfig === undefined ? {} : { themeConfig }),
124
+ preview: c.themeStudio?.preview ?? {},
125
+ },
126
+ products: {
127
+ enabled: c.products?.enabled ?? false,
128
+ placement,
129
+ sources: c.products?.sources ?? [],
130
+ discovery: {
131
+ workspace: c.products?.discovery?.workspace ?? false,
132
+ exclude: c.products?.discovery?.exclude ?? [],
133
+ },
134
+ },
135
+ content: c.content ?? {},
136
+ assets: c.assets ?? [],
137
+ },
138
+ diagnostics: out.items,
139
+ };
140
+ }
141
+ // ---------------------------------------------------------------------------
142
+ // Authored content (oddkin.docs.ts / Markdown front matter), docs-content.v1
143
+ export const DOCS_SCHEMA = 'https://oddkin.dev/schemas/docs-content/v1.json';
144
+ /** Identity with types, for `oddkin.docs.ts`; fills in the schema id. */
145
+ export function defineDocs(content) {
146
+ return { schema: DOCS_SCHEMA, ...content };
147
+ }
148
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,cAAc,EAAE,QAAQ,EAA4B,MAAM,4BAA4B,CAAC;AAmGhG,mDAAmD;AACnD,MAAM,UAAU,qBAAqB,CAAC,MAAuB;IAC3D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,aAAa,EAAE,YAAY,EAAE,cAAc,CAAU,CAAC;AACtF,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,MAAM;IACN,aAAa;IACb,YAAY;IACZ,cAAc;IACd,UAAU;IACV,QAAQ;CACT,CAAC;AACF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IACxB,SAAS;IACT,SAAS;IACT,UAAU;IACV,SAAS;IACT,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,UAAU;IACV,SAAS;IACT,QAAQ;CACT,CAAC,CAAC;AACH,MAAM,SAAS,GAAG,aAAa,CAAC;AAEhC;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAc;IAInD,MAAM,GAAG,GAAG,IAAI,cAAc,EAAE,CAAC;IACjC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,GAAG,CAAC,KAAK,CAAC,gBAAgB,EAAE,gDAAgD,CAAC,CAAC;QAC9E,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;IACvD,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QACjC,GAAG,CAAC,KAAK,CACP,oBAAoB,EACpB,GAAG,KAAK,YAAY;YAClB,CAAC,CAAC,6JAA6J;YAC/J,CAAC,CAAC,8BAA8B,GAAG,IAAI,EACzC,IAAI,GAAG,EAAE,CACV,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,GAAG,KAAmC,CAAC;IAC9C,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC;IACrC,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QACxB,QAAQ,CAAC,MAAM,KAAK,CAAC;QACrB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAC7C,CAAC;QACD,GAAG,CAAC,KAAK,CACP,wBAAwB,EACxB,8DAA8D,EAC9D,mBAAmB,CACpB,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,IAAI,GAAG,CAAC;IAC5C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,GAAG,CAAC,KAAK,CACP,yBAAyB,EACzB,qBAAqB,QAAQ,uDAAuD,EACpF,mBAAmB,CACpB,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,IAAI,SAAS,CAAC;IAChD,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QAChD,GAAG,CAAC,KAAK,CACP,wBAAwB,EACxB,8CAA8C,EAC9C,kBAAkB,CACnB,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,CAAC,UAAU,EAAE,OAAO,IAAI,eAAe,CAAC;IACzD,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE;QAC7B,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACtC,GAAG,CAAC,IAAI,CACN,2BAA2B,EAC3B,6BAA6B,OAAO,iCAAiC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAClG,uBAAuB,CAAC,EAAE,CAC3B,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,CAAC,CAAC,UAAU,EAAE,WAAW,IAAI,EAAE,CAAC;IACpD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YACnB,GAAG,CAAC,KAAK,CACP,2BAA2B,EAC3B,gBAAgB,CAAC,CAAC,EAAE,qBAAqB,EACzC,2BAA2B,CAAC,EAAE,CAC/B,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;IACH,KAAK,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;QACnE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAClB,GAAG,CAAC,KAAK,CACP,yBAAyB,EACzB,2BAA2B,GAAG,SAAS,EAAE,4CAA4C,EACrF,sBAAsB,GAAG,EAAE,CAC5B,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,eAAe,CAAC;IACtD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,KAAK,CACP,sBAAsB,EACtB,sBAAsB,KAAK,wBAAwB,EACnD,oBAAoB,CACrB,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3D,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACzB,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YAC3C,GAAG,CAAC,KAAK,CACP,2BAA2B,EAC3B,uBAAuB,MAAM,CAAC,CAAC,CAAC,uCAAuC,EACvE,uBAAuB,CAAC,EAAE,CAC3B,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAChD,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;YAC9B,GAAG,CAAC,KAAK,CACP,0BAA0B,EAC1B,eAAe,MAAM,CAAC,EAAE,wBAAwB,EAChD,qBAAqB,CAAC,EAAE,CACzB,CAAC;QACJ,CAAC;QACD,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IACH,IAAI,GAAG,CAAC,SAAS;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;IAExE,MAAM,WAAW,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC;IAC/C,OAAO;QACL,MAAM,EAAE;YACN,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE;YAC1B,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;YAC9B,UAAU,EAAE;gBACV,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,IAAI,KAAK;gBACjC,OAAO;gBACP,eAAe,EAAE,CAAC,CAAC,UAAU,EAAE,eAAe,IAAI,IAAI;aACvD;YACD,UAAU,EAAE;gBACV,WAAW;gBACX,MAAM,EAAE,CAAC,CAAC,UAAU,EAAE,MAAM,IAAI,EAAE;gBAClC,QAAQ,EAAE,CAAC,CAAC,UAAU,EAAE,QAAQ,IAAI,kBAAkB;aACvD;YACD,WAAW,EAAE;gBACX,OAAO,EAAE,CAAC,CAAC,WAAW,EAAE,OAAO,IAAI,IAAI;gBACvC,KAAK;gBACL,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;gBACrD,OAAO,EAAE,CAAC,CAAC,WAAW,EAAE,OAAO,IAAI,EAAE;aACtC;YACD,QAAQ,EAAE;gBACR,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,OAAO,IAAI,KAAK;gBACrC,SAAS;gBACT,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE;gBAClC,SAAS,EAAE;oBACT,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,IAAI,KAAK;oBACpD,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,IAAI,EAAE;iBAC9C;aACF;YACD,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;YACxB,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE;SACvB;QACD,WAAW,EAAE,GAAG,CAAC,KAAK;KACvB,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,6EAA6E;AAE7E,MAAM,CAAC,MAAM,WAAW,GAAG,iDAAiD,CAAC;AAmC7E,yEAAyE;AACzE,MAAM,UAAU,UAAU,CAAC,OAAoC;IAC7D,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,EAAE,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const buttonConformance: import("./index.js").ConformanceSuite;
2
+ //# sourceMappingURL=button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../src/conformance/button.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,iBAAiB,uCAuN5B,CAAC"}