@miragon/modeler-shell 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/API.md +1051 -84
  2. package/README.md +162 -31
  3. package/dist/appearance-BBaM_4bD.d.ts +323 -0
  4. package/dist/appearance-XX3JC3pI.d.cts +323 -0
  5. package/dist/{chunk-6LQOFACK.js → chunk-66HCSJNY.js} +1247 -31
  6. package/dist/chunk-66HCSJNY.js.map +1 -0
  7. package/dist/{chunk-RJRFR6N3.js → chunk-KYDG5DMX.js} +2 -2
  8. package/dist/{chunk-5JSZ4VGA.js → chunk-OADW3GPA.js} +240 -6
  9. package/dist/chunk-OADW3GPA.js.map +1 -0
  10. package/dist/core.cjs +260 -6
  11. package/dist/core.cjs.map +1 -1
  12. package/dist/core.d.cts +81 -6
  13. package/dist/core.d.ts +81 -6
  14. package/dist/core.js +43 -3
  15. package/dist/diagram-js.cjs +34 -2
  16. package/dist/diagram-js.cjs.map +1 -1
  17. package/dist/diagram-js.d.cts +10 -3
  18. package/dist/diagram-js.d.ts +10 -3
  19. package/dist/diagram-js.js +14 -2
  20. package/dist/diagram-js.js.map +1 -1
  21. package/dist/index.cjs +1654 -197
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.d.cts +18 -9
  24. package/dist/index.d.ts +18 -9
  25. package/dist/index.js +44 -4
  26. package/dist/shell.css +692 -3
  27. package/dist/testing-vscode-stub.js +2 -2
  28. package/dist/testing.cjs +2849 -550
  29. package/dist/testing.cjs.map +1 -1
  30. package/dist/testing.d.cts +75 -9
  31. package/dist/testing.d.ts +75 -9
  32. package/dist/testing.js +2744 -558
  33. package/dist/testing.js.map +1 -1
  34. package/dist/toasts-Bp0REqdq.d.cts +142 -0
  35. package/dist/toasts-Bp0REqdq.d.ts +142 -0
  36. package/dist/{types-OuFlqZp0.d.cts → types-CnRrINRs.d.cts} +170 -9
  37. package/dist/{types-DnZn9CPw.d.ts → types-PuDZczzy.d.ts} +170 -9
  38. package/dist/vscode-extension.js +2 -2
  39. package/dist/vscode-webview.cjs +1541 -178
  40. package/dist/vscode-webview.cjs.map +1 -1
  41. package/dist/vscode-webview.d.cts +6 -4
  42. package/dist/vscode-webview.d.ts +6 -4
  43. package/dist/vscode-webview.js +11 -2
  44. package/dist/vscode-webview.js.map +1 -1
  45. package/package.json +2 -2
  46. package/src/core/feedback/appearance.ts +141 -0
  47. package/src/core/feedback/problems.ts +23 -0
  48. package/src/core/feedback/toasts.ts +118 -0
  49. package/src/core/fit.ts +18 -3
  50. package/src/core/index.ts +43 -0
  51. package/src/core/keymap.ts +20 -0
  52. package/src/core/messages.ts +71 -0
  53. package/src/core/types.ts +24 -2
  54. package/src/core/web-chrome/bottom-row.ts +37 -0
  55. package/src/core/web-chrome/drop.ts +78 -0
  56. package/src/core/web-chrome/top-row.ts +66 -0
  57. package/src/diagram-js/service.ts +4 -1
  58. package/src/diagram-js/viewport.ts +19 -0
  59. package/src/dom/buttons.css +124 -0
  60. package/src/dom/feedback/appearance.ts +184 -0
  61. package/src/dom/feedback/feedback.css +435 -0
  62. package/src/dom/feedback/problems-popover.ts +287 -0
  63. package/src/dom/feedback/toasts.ts +431 -0
  64. package/src/dom/index.ts +13 -0
  65. package/src/dom/keys.ts +8 -0
  66. package/src/dom/menu.ts +28 -17
  67. package/src/dom/mount.ts +290 -20
  68. package/src/dom/problems.ts +5 -4
  69. package/src/dom/shell-dom.css +7 -4
  70. package/src/dom/types.ts +188 -6
  71. package/src/dom/web/drop-zone.ts +181 -0
  72. package/src/dom/web/empty-state.ts +144 -0
  73. package/src/dom/web/legal.ts +75 -0
  74. package/src/dom/web/menu-groups.ts +69 -0
  75. package/src/dom/web/primary.ts +124 -0
  76. package/src/dom/web/web.css +386 -0
  77. package/src/shell.css +3 -0
  78. package/src/testing/case-tools.ts +164 -0
  79. package/src/testing/cases.ts +209 -144
  80. package/src/testing/checks.ts +51 -15
  81. package/src/testing/facts.ts +56 -2
  82. package/src/testing/geometry.ts +206 -26
  83. package/src/testing/harness.ts +56 -7
  84. package/src/testing/index.ts +4 -0
  85. package/src/testing/page-tools.ts +24 -1
  86. package/src/testing/page.ts +10 -0
  87. package/src/testing/web-cases.ts +913 -0
  88. package/src/testing/web-checks.ts +1049 -0
  89. package/src/testing/web-facts.ts +713 -0
  90. package/src/vscode/webview/mount.ts +13 -1
  91. package/dist/chunk-5JSZ4VGA.js.map +0 -1
  92. package/dist/chunk-6LQOFACK.js.map +0 -1
  93. package/dist/keymap-CObQE6q6.d.cts +0 -151
  94. package/dist/keymap-DORzHnK-.d.ts +0 -151
  95. package/dist/types-B6NfkiUG.d.cts +0 -66
  96. package/dist/types-B6NfkiUG.d.ts +0 -66
  97. /package/dist/{chunk-RJRFR6N3.js.map → chunk-KYDG5DMX.js.map} +0 -0
@@ -0,0 +1,323 @@
1
+ import { d as ShellHost } from './toasts-Bp0REqdq.cjs';
2
+ import { T as Theme } from './appearance-D3FUcbu6.cjs';
3
+
4
+ /** The severity of one problem; the pill and the list show `circle-x` or `triangle-alert` (guide §5.10). */
5
+ type ProblemSeverity = "error" | "warning";
6
+ /** One row of the web app's problems list (guide §5.10). */
7
+ interface ProblemItem {
8
+ severity: ProblemSeverity;
9
+ /** 13px `--cd-ui-text`: "Unknown sticky type “evnt”." */
10
+ message: string;
11
+ /** The place in 13px `--cd-ui-text-leise` below the message: "Line 12", "“Order Placed”". */
12
+ location?: string | undefined;
13
+ /** The diagram element a click on the row selects (`ProblemsOptions.onSelectItem`). */
14
+ elementId?: string | undefined;
15
+ }
16
+ /** `ShellHandle.setProblems` input built from the items: count, errors and the items themselves. */
17
+ declare function problemSummary(items: readonly ProblemItem[]): {
18
+ count: number;
19
+ errors: number;
20
+ items: readonly ProblemItem[];
21
+ };
22
+
23
+ /** Why a drag cannot be dropped (guide §9 Drop forbidden); `messages.dropForbidden` words each one. */
24
+ type DropForbiddenReason = "multiple" | "type" | "dialog";
25
+ /** One entry of `DataTransfer.items` as a drag shows it (names are not readable before the drop). */
26
+ interface DragItemLike {
27
+ kind: string;
28
+ type: string;
29
+ }
30
+ interface DragContext {
31
+ /** `DropZoneOptions.accept`: extensions (".storm") and MIME types ("application/json", "text/*"). */
32
+ accept: readonly string[];
33
+ /** `DropZoneOptions.multiple`. */
34
+ multiple: boolean;
35
+ /** A modal dialog is open (the shell's dialog test, as for the keys). */
36
+ dialogOpen: boolean;
37
+ }
38
+ /** What the drop zone shows for the drag over the page right now (guide §9). */
39
+ type DragVerdict = {
40
+ state: "none";
41
+ } | {
42
+ state: "over";
43
+ } | {
44
+ state: "forbidden";
45
+ reason: DropForbiddenReason;
46
+ };
47
+ /**
48
+ * The drop zone's state for a drag (guide §9, Drag-over and Drop forbidden):
49
+ *
50
+ * - `none`: no item of kind `file` (a palette drag, selected text): the drop zone stays out of it.
51
+ * - `forbidden` / `dialog`: a modal dialog is open.
52
+ * - `forbidden` / `multiple`: more than one file and `multiple` is false.
53
+ * - `forbidden` / `type`: `accept` lists at least one MIME type and every file item carries a
54
+ * non-empty type that none of them matches (`type/*` wildcards included). Extensions cannot be
55
+ * checked before the drop, and an empty type (".storm" has none) never forbids.
56
+ * - `over` otherwise.
57
+ */
58
+ declare function dragVerdict(items: readonly DragItemLike[], context: DragContext): DragVerdict;
59
+ /**
60
+ * A dropped file matches `accept` like `<input accept>`: an entry starting with "." matches the
61
+ * end of the name (case-insensitive), an entry with "/" the MIME type exactly or as `type/*`; an
62
+ * empty `accept` matches every file.
63
+ */
64
+ declare function acceptsFile(file: {
65
+ name: string;
66
+ type: string;
67
+ }, accept: readonly string[]): boolean;
68
+
69
+ /**
70
+ * Every text the shell shows or announces, in one table (guide §2, shared terms). English by
71
+ * default; a localized modeler overrides the whole table in its language, numbers arrive already
72
+ * formatted through `Intl` in that language.
73
+ */
74
+ interface ShellMessages {
75
+ /** Menu trigger `aria-label` and tooltip, dropdown `aria-label`. */
76
+ menu: string;
77
+ /** Palette `aria-label`. */
78
+ tools: string;
79
+ /** `aria-label` of the focusable canvas `<svg>` (`role="application"`); a modeler names its notation. */
80
+ canvas: string;
81
+ /** Zoom panel `aria-label`. */
82
+ zoom: string;
83
+ zoomOut: string;
84
+ zoomIn: string;
85
+ /** Tooltip of the readout, e.g. `(percent) => "Zoom to " + percent` with percent "100%". */
86
+ zoomToActual(percent: string): string;
87
+ /** `aria-label` of the readout: "Zoom to 100% (now 86%)". */
88
+ zoomToActualNow(percent: string, now: string): string;
89
+ fit: string;
90
+ /** Legend title and the Model-group checkbox. */
91
+ legend: string;
92
+ closeLegend: string;
93
+ /** Pill text: "1 problem", "2 problems". */
94
+ problems(count: number, formattedCount: string): string;
95
+ /** Pill `aria-label`: "2 problems, 1 error", "2 problems, no errors". */
96
+ problemsLabel(count: number, errors: number, formattedCount: string, formattedErrors: string): string;
97
+ /** Pill tooltip in the IDE host. */
98
+ showProblems: string;
99
+ /** Empty-file hint (guide §13.5). */
100
+ emptyHint: string;
101
+ insertExample: string;
102
+ /** Status box for an invalid file; `diagram` names the notation ("Event Storming board"). */
103
+ invalidFile(diagram: string): string;
104
+ /** Key names in shortcut chips outside macOS (German: Strg, Umschalt, Plus, Minus). */
105
+ keyNames: {
106
+ ctrl: string;
107
+ shift: string;
108
+ plus: string;
109
+ minus: string;
110
+ };
111
+ /** Default label and `aria-label` of the primary action (web app, top right). */
112
+ share: string;
113
+ /** `aria-label` of the legal line's `<nav>`. "Impressum" and "Datenschutz" are never translated (guide §2). */
114
+ legal: string;
115
+ /** First entry of the legal line, linking the Miragon home page: "© 2026 Miragon GmbH". */
116
+ copyright(year: number): string;
117
+ /** The description of every legal link for screen readers: they open in a new tab. */
118
+ opensInNewTab: string;
119
+ /** File group (web app) and the empty state's primary button. */
120
+ newDiagram: string;
121
+ /** File group: "Open…" (U+2026, it opens the browser's file dialog). */
122
+ openFile: string;
123
+ /** File group and the empty state's ghost button. */
124
+ showExample: string;
125
+ /** File group: "Import…". */
126
+ importFile: string;
127
+ /** Heading and `aria-label` of the Appearance radio group (web app with dark only, guide §13.3). */
128
+ appearance: string;
129
+ appearanceSystem: string;
130
+ appearanceLight: string;
131
+ appearanceDark: string;
132
+ /** Title of the problems popover (web app). */
133
+ problemsTitle: string;
134
+ /** A row's severity for screen readers, the `aria-label` of its icon: "Error", "Warning". */
135
+ problemSeverity(severity: ProblemSeverity): string;
136
+ /** `aria-label` of a Close button (toasts). */
137
+ close: string;
138
+ /** Chip of the drop zone while a drag can be dropped (guide §9 Drag-over). */
139
+ dropFile: string;
140
+ /** Chip of the drop zone while the drag cannot be dropped (guide §9 Drop forbidden). */
141
+ dropForbidden(reason: DropForbiddenReason): string;
142
+ /** The empty state's drag-and-drop hint when the modeler has a drop zone. */
143
+ dropHint: string;
144
+ /** The text link after the empty state's hint that runs the File group's "Open…". */
145
+ openFileLink: string;
146
+ /**
147
+ * Danger toast for a dropped file outside `DropZoneOptions.accept`; `accepted` is the accept list
148
+ * joined by `Intl.ListFormat` (disjunction) in `lang`: ".storm, .json, or .txt".
149
+ */
150
+ cannotOpenFile(name: string, accepted: string): string;
151
+ }
152
+ /** Every key optional; an `undefined` value keeps the default (a conditional override). */
153
+ type ShellMessageOverrides = {
154
+ [Key in Exclude<keyof ShellMessages, "keyNames">]?: ShellMessages[Key] | undefined;
155
+ } & {
156
+ keyNames?: {
157
+ [Key in keyof ShellMessages["keyNames"]]?: string | undefined;
158
+ } | undefined;
159
+ };
160
+ declare const defaultMessages: ShellMessages;
161
+ /** `defaultMessages` with `overrides` applied (`keyNames` merged key by key). */
162
+ declare function resolveMessages(overrides?: ShellMessageOverrides | undefined): ShellMessages;
163
+
164
+ /** The only keys the chrome handles (guide §5.8). */
165
+ type ChromeKey = "zoomIn" | "zoomOut" | "zoomToActual" | "fit";
166
+ /** The `KeyboardEvent` fields the keymap reads. */
167
+ interface KeyLike {
168
+ key: string;
169
+ code: string;
170
+ metaKey: boolean;
171
+ ctrlKey: boolean;
172
+ shiftKey: boolean;
173
+ altKey: boolean;
174
+ isComposing?: boolean | undefined;
175
+ }
176
+ /**
177
+ * Which chrome key `event` is, ignoring where it was pressed:
178
+ * - `zoomIn`: Cmd/Ctrl + `+` or `=` (by `key`, with or without Shift), or `NumpadAdd` (by `code`);
179
+ * - `zoomOut`: Cmd/Ctrl + `-` or `_`, or `NumpadSubtract`;
180
+ * - `zoomToActual`: Cmd/Ctrl + `0`, or `Numpad0` (also with NumLock off);
181
+ * - `fit`: Shift + `Digit1` (by `code`, every layout) without Cmd, Ctrl or Alt.
182
+ * Cmd/Ctrl is `metaKey || ctrlKey` on every platform; nothing matches with `altKey` (AltGr).
183
+ */
184
+ declare function matchChromeKey(event: KeyLike): ChromeKey | undefined;
185
+ /**
186
+ * Cmd/Ctrl + Z, Cmd/Ctrl + Shift + Z or Cmd/Ctrl + Y, without Alt (by `key`, `code` as fallback).
187
+ * Cmd/Ctrl + Shift + Y is not redo (VS Code toggles its Debug Console with it).
188
+ */
189
+ declare function isUndoRedoKey(event: KeyLike): boolean;
190
+ /** A text field: every input, select list and editable text (label editor, inspector, dialogs). */
191
+ declare const TEXT_FIELD_SELECTOR = "input, textarea, select, [contenteditable]:not([contenteditable='false'])";
192
+ /** Where a key was pressed, as the shell's one `keydown` listener sees it. */
193
+ interface KeyContext {
194
+ host: ShellHost;
195
+ /** The event target matches `TEXT_FIELD_SELECTOR` or is `isContentEditable`. */
196
+ inTextField: boolean;
197
+ /** The shell's menu dropdown is open. */
198
+ menuOpen: boolean;
199
+ /** A popover or dialog (`[role="dialog"]`, modal or not) is open. */
200
+ dialogOpen: boolean;
201
+ /** A modal dialog (`[role="dialog"][aria-modal="true"]`) is open: chrome keys do not act. */
202
+ modalOpen: boolean;
203
+ /** `event.defaultPrevented` when the listener ran: the canvas (or the modeler) handled the key. */
204
+ defaultPrevented: boolean;
205
+ /**
206
+ * The web app's start screen shows (`setEmptyState(true)`): there is no diagram to zoom, so the
207
+ * zoom keys and Shift+1 are left to the browser, which zooms the page.
208
+ */
209
+ startScreen?: boolean | undefined;
210
+ }
211
+ type KeyAction = ChromeKey | "closeMenu";
212
+ interface KeyDecision {
213
+ /** What the shell executes; `undefined` = nothing. */
214
+ action?: KeyAction;
215
+ preventDefault: boolean;
216
+ stopPropagation: boolean;
217
+ }
218
+ /**
219
+ * The key rules of guide §5.8 and §13.5 in one place:
220
+ * 1. Escape with the menu open: `closeMenu`, prevented; in the IDE host stopped whenever the menu
221
+ * or a dialog/popover is open. During IME composition Escape belongs to the IME: no `closeMenu`.
222
+ * 2. Zoom keys: executed and prevented unless composing, in a text field or with a modal dialog;
223
+ * in the IDE host always stopped, also when not executed (VS Code must never zoom the window).
224
+ * Behind the web app's start screen untouched: the browser zooms the page (WCAG 1.4.4).
225
+ * 3. Shift+1: `fit` under the same conditions; otherwise untouched (it types "!").
226
+ * 4. IDE host, text field, undo/redo key: stopped only (the field keeps its native undo).
227
+ * 5. IDE host, `defaultPrevented`: stopped (the canvas handled it; VS Code must not run it again).
228
+ * Everything else passes untouched. `stopPropagation` is only ever true in the IDE host.
229
+ */
230
+ declare function decideKey(event: KeyLike, context: KeyContext): KeyDecision;
231
+ /** The keyboard the user sits at; decides the shortcut labels (guide §5.8). */
232
+ type Platform = "mac" | "other";
233
+ /** The `navigator` fields `detectPlatform` reads. */
234
+ interface NavigatorLike {
235
+ platform?: string | undefined;
236
+ userAgentData?: {
237
+ platform?: string | undefined;
238
+ } | undefined;
239
+ }
240
+ /**
241
+ * `mac` when `userAgentData.platform ?? platform` matches `/mac/i`, else `other`; `other` without a
242
+ * navigator. Read it in the webview or page itself, never from the extension host (VS Code Remote).
243
+ */
244
+ declare function detectPlatform(navigator?: NavigatorLike | undefined): Platform;
245
+ /**
246
+ * The tooltip chip text: macOS `⌘+`, `⌘−` (U+2212), `⌘0`, `⇧1`; elsewhere `Ctrl+Plus`,
247
+ * `Ctrl+Minus`, `Ctrl+0`, `Shift+1` with the key names of the messages table.
248
+ */
249
+ declare function shortcutLabel(key: ChromeKey, platform: Platform, keyNames: ShellMessages["keyNames"]): string;
250
+ /**
251
+ * The chip of a Cmd/Ctrl key a modeler binds itself (the web app's File entries, guide §5.4): macOS
252
+ * `⌘O`, elsewhere `Ctrl+O` with the key name of the messages table (`Strg+O`). `key` as printed on
253
+ * the key cap; pass the result to `FileMenuAction.shortcut` or `MenuActionEntry.shortcut`.
254
+ */
255
+ declare function commandKeyLabel(key: string, platform: Platform, keyNames: Pick<ShellMessages["keyNames"], "ctrl">): string;
256
+ /**
257
+ * The `aria-keyshortcuts` value (WAI-ARIA names): zoom in `Meta+= Meta+Plus`, zoom out `Meta+-`,
258
+ * 100 % `Meta+0`, fit `Shift+1`; outside macOS `Control` instead of `Meta`.
259
+ */
260
+ declare function ariaKeyShortcuts(key: ChromeKey, platform: Platform): string;
261
+ /**
262
+ * The `aria-keyshortcuts` value (WAI-ARIA names, guide §5.6) for a shortcut chip label: `"L"` →
263
+ * `"L"`, `"⇧L"` → `"Shift+L"`, `"⌘⇧Z"` → `"Meta+Shift+Z"`, `"Ctrl+Shift+E"` → `"Control+Shift+E"`,
264
+ * `"Del"` → `"Delete"`, `"Ctrl++"` → `"Control+Plus"`. `undefined` for a label that is not one key
265
+ * combination (`"G then D"`, `"1–9"`, empty).
266
+ */
267
+ declare function ariaKeyShortcutsFromLabel(label: string): string | undefined;
268
+
269
+ /** The web app's mode choice (guide §13.3): Appearance, System · Light · Dark. */
270
+ type AppearanceChoice = "system" | "light" | "dark";
271
+ /** Where the web app keeps the choice: `light` or `dark`; "System" removes the entry (guide §13.3). */
272
+ declare const APPEARANCE_STORAGE_KEY = "miragon.darstellung";
273
+ /**
274
+ * The two `theme-color` values (guide §11, §13.3): light is the app's own value (`#335DE5`, `fest`
275
+ * `--cd-blau` of the vendored `cd-tokens.generated.json`), dark `#1D1D1D` (`dunkel`
276
+ * `--cd-ui-grund`). The modeler reads both from its vendored JSON; the shell keeps no colour.
277
+ */
278
+ interface ThemeColors {
279
+ light: string;
280
+ dark: string;
281
+ }
282
+ /** `"light"` and `"dark"` pass, everything else (a missing entry, a foreign value) is `"system"`. */
283
+ declare function parseAppearanceChoice(stored: unknown): AppearanceChoice;
284
+ /** What `<html>` and the meta tags carry for a choice. */
285
+ interface DocumentMode {
286
+ /** `data-cd-theme` on `<html>`. */
287
+ theme: "system" | Theme;
288
+ /** `<meta name="color-scheme" content>`. */
289
+ colorScheme: "light dark" | Theme;
290
+ /** The `content` of the `theme-color` metas with `media="(prefers-color-scheme: light|dark)"`. */
291
+ themeColor: ThemeColors;
292
+ }
293
+ /**
294
+ * The document mode for `choice` (guide §13.3). A modeler that cannot show dark (`themes` without
295
+ * `"dark"`) is `light` whatever the choice: theme `light`, color-scheme `light`, both theme
296
+ * colours `colors.light`. Dark-capable: `system` → theme `system`, color-scheme `light dark`,
297
+ * `colors` as they are; `light`/`dark` → that theme and color-scheme, both theme colours the
298
+ * chosen mode's, so the browser bar matches a fixed choice under the other system mode.
299
+ */
300
+ declare function documentMode(choice: AppearanceChoice, themes: readonly Theme[], colors: ThemeColors): DocumentMode;
301
+ interface WebModeScriptOptions {
302
+ /** The modes the modeler can show, as passed to `mountShell`. */
303
+ themes: readonly Theme[];
304
+ themeColors: ThemeColors;
305
+ }
306
+ /**
307
+ * The body of the inline `<script>` in `<head>`, before the first stylesheet (guide §13.3). With
308
+ * `themes` including `"dark"`: the guide's script, which reads `APPEARANCE_STORAGE_KEY` inside
309
+ * `try`/`catch`, writes `data-cd-theme`, `color-scheme` and both `theme-color` metas for a fixed
310
+ * choice and sets `data-cd-kontrast="hoch"` under `(prefers-contrast: more)`. Light-only: the
311
+ * contrast line alone. Plain ES5 without the modeler's bundle, so it runs before the first paint.
312
+ */
313
+ declare function webModeScript(options: WebModeScriptOptions): string;
314
+ /**
315
+ * The `<head>` markup the web app's `index.html` carries for its mode, as one string (for a Vite
316
+ * `transformIndexHtml` hook or to paste): dark-capable `<meta name="color-scheme" content="light
317
+ * dark">`, two `theme-color` metas with `media` and the script; light-only one `theme-color`
318
+ * without `media` and the contrast script. `<html>` itself carries `lang` and
319
+ * `data-cd-theme="<documentMode("system", themes, colors).theme>"` statically.
320
+ */
321
+ declare function webHeadMarkup(options: WebModeScriptOptions): string;
322
+
323
+ export { APPEARANCE_STORAGE_KEY as A, shortcutLabel as B, type ChromeKey as C, type DocumentMode as D, webHeadMarkup as E, webModeScript as F, type KeyAction as K, type NavigatorLike as N, type Platform as P, type ShellMessageOverrides as S, TEXT_FIELD_SELECTOR as T, type WebModeScriptOptions as W, type AppearanceChoice as a, type DragContext as b, type DragItemLike as c, type DragVerdict as d, type DropForbiddenReason as e, type KeyContext as f, type KeyDecision as g, type KeyLike as h, type ProblemItem as i, type ProblemSeverity as j, type ShellMessages as k, type ThemeColors as l, acceptsFile as m, ariaKeyShortcuts as n, ariaKeyShortcutsFromLabel as o, commandKeyLabel as p, decideKey as q, defaultMessages as r, detectPlatform as s, documentMode as t, dragVerdict as u, isUndoRedoKey as v, matchChromeKey as w, parseAppearanceChoice as x, problemSummary as y, resolveMessages as z };