@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
@@ -1,4 +1,4 @@
1
- import { d as Size, P as PaletteRow, a as ChromeIsland, c as ShellHost } from './types-B6NfkiUG.cjs';
1
+ import { e as Size, P as PaletteRow, b as ChromeIsland, d as ShellHost, k as ToastStatus } from './toasts-Bp0REqdq.cjs';
2
2
  import { A as Appearance, T as Theme, C as ColorThemeSetting } from './appearance-D3FUcbu6.cjs';
3
3
 
4
4
  /**
@@ -22,6 +22,16 @@ interface PageLike {
22
22
  up(): Promise<void>;
23
23
  };
24
24
  waitForTimeout(timeout: number): Promise<void>;
25
+ /**
26
+ * Playwright's `page.emulateMedia`; the web-host cases need it for the system's mode and contrast
27
+ * (`appearance`) and report a skip with `hook: "open"` without it.
28
+ */
29
+ emulateMedia?(options: {
30
+ colorScheme?: "light" | "dark" | "no-preference" | null;
31
+ contrast?: "more" | "no-preference" | null;
32
+ reducedMotion?: "reduce" | "no-preference" | null;
33
+ forcedColors?: "active" | "none" | null;
34
+ }): Promise<void>;
25
35
  }
26
36
 
27
37
  /** Every island box must match within this many pixels (guide §13.4). */
@@ -42,12 +52,21 @@ interface ChromeMeasurement {
42
52
  paletteRow: PaletteRow;
43
53
  /** The visible islands, found by `[data-chrome]`. */
44
54
  islands: Partial<Record<ChromeIsland, IslandBox>>;
45
- /** `[data-legend="open"]`, `[data-inspector="open"]`, `[data-problems="shown"]` on the root. */
55
+ /**
56
+ * State attributes of the root: `[data-legend="open"]`, `[data-inspector="open"]`,
57
+ * `[data-problems="shown"]`, and in the web host `[data-empty-state="shown"]`,
58
+ * `[data-primary="collapsed"]` and `[data-zoom-row="raised"]`.
59
+ */
46
60
  open: {
47
61
  legend: boolean;
48
62
  inspector: boolean;
49
63
  problems: boolean;
64
+ emptyState: boolean;
65
+ primaryCollapsed: boolean;
66
+ zoomRaised: boolean;
50
67
  };
68
+ /** Width of the widest visible toast card (`[data-status]` in the stack); absent without a toast. */
69
+ toastCardWidth?: number;
51
70
  }
52
71
  /** Constraints of one island; every given field must hold within `GEOMETRY_TOLERANCE_PX`. */
53
72
  interface ExpectedBox {
@@ -59,6 +78,8 @@ interface ExpectedBox {
59
78
  height?: number;
60
79
  /** Horizontal centre relative to the root. */
61
80
  centerX?: number;
81
+ /** Vertical centre relative to the root (the web app's empty-state card). */
82
+ centerY?: number;
62
83
  }
63
84
  /** Measures the islands of the shell under `root` (default `.cd-shell`) in the page. */
64
85
  declare function measureChrome(page: PageLike, root?: string): Promise<ChromeMeasurement>;
@@ -71,7 +92,10 @@ interface OpenContext {
71
92
  /**
72
93
  * What the host requests before the modeler resolves it: in an IDE host the VS Code color theme
73
94
  * (`vsCodeStubSearch` hands it to a page with the VS Code stub). For an embedded host the kit
74
- * itself puts the foreign page's `<html>` in this mode once `open` resolved.
95
+ * itself puts the foreign page's `<html>` in this mode once `open` resolved. In the web host the
96
+ * system's preference without a stored choice: the kit emulates `prefers-color-scheme` and
97
+ * `prefers-contrast` (`PageLike.emulateMedia`) before `open`, and `open` loads the page with an
98
+ * empty `localStorage` entry `miragon.darstellung`.
75
99
  */
76
100
  requested: Appearance;
77
101
  }
@@ -89,9 +113,47 @@ interface ShowHooks<P extends PageLike = PageLike> {
89
113
  * read-only canvas and the status box. The kit waits `INVALID_STATUS_DELAY_MS` afterwards.
90
114
  */
91
115
  invalid?: ((page: P) => Promise<void>) | undefined;
116
+ /**
117
+ * Web host: puts the page on its start screen, the way a fresh visit without a document shows
118
+ * it (`shell.setEmptyState(true)`); `open` itself loads a document.
119
+ */
120
+ emptyState?: ((page: P) => Promise<void>) | undefined;
121
+ /**
122
+ * Web and embedded hosts: shows `toast` through the modeler's `shell.toast`, with
123
+ * `{ label: toast.actionLabel, onSelect() {} }` as its action when `actionLabel` is given.
124
+ */
125
+ toast?: ((page: P, toast: ToastFixture) => Promise<void>) | undefined;
92
126
  }
93
- /** A show hook by name: the islands `legend`, `inspector`, `problems`, `status` and the state `invalid`. */
127
+ /** A toast the kit asks the `toast` hook to show (cases `toasts`, `geometry`). */
128
+ interface ToastFixture {
129
+ status: ToastStatus;
130
+ text: string;
131
+ actionLabel?: string | undefined;
132
+ }
133
+ /** A file the kit drops on the page (case `dropZone`), built in the page as `new File([text], name, { type })`. */
134
+ interface DropFixture {
135
+ name: string;
136
+ type: string;
137
+ text: string;
138
+ }
139
+ interface DropFixtures {
140
+ /** A file `DropZoneOptions.accept` takes; dropping it on the start screen opens it (the card goes). */
141
+ accepted: DropFixture;
142
+ /** A file outside `accept`; dropping it opens nothing and shows a danger toast (or the modeler's `onReject`). */
143
+ rejected?: DropFixture | undefined;
144
+ /** `DropZoneOptions.multiple` of the modeler; default `false`, so a drag of two files is forbidden. */
145
+ multiple?: boolean | undefined;
146
+ }
147
+ /**
148
+ * A show hook by name: the islands `legend`, `inspector`, `problems`, `status`, the state
149
+ * `invalid`, and in the web column `emptyState` and `toast`.
150
+ */
94
151
  type ShowHook = keyof ShowHooks;
152
+ /**
153
+ * What a harness can lack: a show hook, the web app's drop zone (`drop`), or problems that point at
154
+ * an element (`problemSelection`: the modeler's diagnostics only name lines, so no row selects).
155
+ */
156
+ type AbsentFeature = ShowHook | "drop" | "problemSelection";
95
157
  interface ShellConformanceHarness<P extends PageLike = PageLike> {
96
158
  host: ShellHost;
97
159
  /** The modes the modeler declares (static); the appearance case requests dark from `["light"]`. */
@@ -104,12 +166,14 @@ interface ShellConformanceHarness<P extends PageLike = PageLike> {
104
166
  root?: string | undefined;
105
167
  /** Hooks for the islands and states the modeler has; one that is neither given nor `absent` is reported as skipped. */
106
168
  show?: ShowHooks<P> | undefined;
169
+ /** Web host: the files the `dropZone` case drops; without them (and not `absent`) it is skipped with `hook: "drop"`. */
170
+ drop?: DropFixtures | undefined;
107
171
  /**
108
172
  * The islands and states the modeler does not have. An absent hook is not reported as skipped,
109
173
  * and `geometry` and `aria` assert that its island is never visible. Listing a hook that `show`
110
174
  * also gives fails every case that uses it.
111
175
  */
112
- absent?: readonly ShowHook[] | undefined;
176
+ absent?: readonly AbsentFeature[] | undefined;
113
177
  /** Container sizes of the geometry case; default wide 1280 × 900, narrow 720 × 700, very narrow 420 × 700. */
114
178
  sizes?: readonly Size[] | undefined;
115
179
  }
@@ -119,7 +183,7 @@ interface ShellSkip {
119
183
  * The harness field that would feed it: a show hook, `destroy`, or `open` when the document it
120
184
  * opens lacks what the case needs (a shape on the canvas).
121
185
  */
122
- hook: ShowHook | "destroy" | "open";
186
+ hook: ShowHook | "drop" | "destroy" | "open";
123
187
  reason: string;
124
188
  }
125
189
  interface ShellCaseOutcome {
@@ -138,8 +202,10 @@ interface ShellConformanceCase {
138
202
  * canvas only), `create` (Enter on the first creating palette entry places one selected element in
139
203
  * the free rectangle and focuses the canvas), `readOnly` (the invalid-file lock of guide §13.5),
140
204
  * `appearance` (dark requested from a light-only modeler: nothing turns dark, `color-scheme` light
141
- * everywhere, the canvas surround and the palette's tool colours from the roles) and `cleanup` (after
142
- * `destroy` no shell element, class, attribute or key handling remains).
205
+ * everywhere, the canvas surround and the palette's tool colours from the roles; the web app's mode
206
+ * and its Appearance group) and `cleanup` (after `destroy` no shell element, class, attribute or
207
+ * key handling remains); then the web column's `webChrome`, `emptyState`, `toasts`,
208
+ * `problemsList` and `dropZone`, which assert in the other hosts that nothing of them shows.
143
209
  */
144
210
  declare function shellConformanceCases(): ShellConformanceCase[];
145
211
  /** Playwright's `test` (or any runner whose body receives `{ page }`). */
@@ -162,4 +228,4 @@ declare function vsCodeStubSearch(requested: Appearance, extra?: {
162
228
  /** Registers every case as `shell conformance: <name>`. */
163
229
  declare function registerShellConformance<P extends PageLike>(harness: ShellConformanceHarness<P>, test: ShellConformanceTest<P>, options?: RegisterShellConformanceOptions): void;
164
230
 
165
- export { type ChromeMeasurement, type ExpectedBox, GEOMETRY_TOLERANCE_PX, type IslandBox, type OpenContext, type PageLike, type RegisterShellConformanceOptions, type ShellCaseOutcome, type ShellConformanceCase, type ShellConformanceHarness, type ShellConformanceTest, type ShellSkip, type ShowHook, type ShowHooks, expectedChromeBoxes, measureChrome, registerShellConformance, shellConformanceCases, vsCodeStubSearch };
231
+ export { type AbsentFeature, type ChromeMeasurement, type DropFixture, type DropFixtures, type ExpectedBox, GEOMETRY_TOLERANCE_PX, type IslandBox, type OpenContext, type PageLike, type RegisterShellConformanceOptions, type ShellCaseOutcome, type ShellConformanceCase, type ShellConformanceHarness, type ShellConformanceTest, type ShellSkip, type ShowHook, type ShowHooks, type ToastFixture, expectedChromeBoxes, measureChrome, registerShellConformance, shellConformanceCases, vsCodeStubSearch };
package/dist/testing.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { d as Size, P as PaletteRow, a as ChromeIsland, c as ShellHost } from './types-B6NfkiUG.js';
1
+ import { e as Size, P as PaletteRow, b as ChromeIsland, d as ShellHost, k as ToastStatus } from './toasts-Bp0REqdq.js';
2
2
  import { A as Appearance, T as Theme, C as ColorThemeSetting } from './appearance-D3FUcbu6.js';
3
3
 
4
4
  /**
@@ -22,6 +22,16 @@ interface PageLike {
22
22
  up(): Promise<void>;
23
23
  };
24
24
  waitForTimeout(timeout: number): Promise<void>;
25
+ /**
26
+ * Playwright's `page.emulateMedia`; the web-host cases need it for the system's mode and contrast
27
+ * (`appearance`) and report a skip with `hook: "open"` without it.
28
+ */
29
+ emulateMedia?(options: {
30
+ colorScheme?: "light" | "dark" | "no-preference" | null;
31
+ contrast?: "more" | "no-preference" | null;
32
+ reducedMotion?: "reduce" | "no-preference" | null;
33
+ forcedColors?: "active" | "none" | null;
34
+ }): Promise<void>;
25
35
  }
26
36
 
27
37
  /** Every island box must match within this many pixels (guide §13.4). */
@@ -42,12 +52,21 @@ interface ChromeMeasurement {
42
52
  paletteRow: PaletteRow;
43
53
  /** The visible islands, found by `[data-chrome]`. */
44
54
  islands: Partial<Record<ChromeIsland, IslandBox>>;
45
- /** `[data-legend="open"]`, `[data-inspector="open"]`, `[data-problems="shown"]` on the root. */
55
+ /**
56
+ * State attributes of the root: `[data-legend="open"]`, `[data-inspector="open"]`,
57
+ * `[data-problems="shown"]`, and in the web host `[data-empty-state="shown"]`,
58
+ * `[data-primary="collapsed"]` and `[data-zoom-row="raised"]`.
59
+ */
46
60
  open: {
47
61
  legend: boolean;
48
62
  inspector: boolean;
49
63
  problems: boolean;
64
+ emptyState: boolean;
65
+ primaryCollapsed: boolean;
66
+ zoomRaised: boolean;
50
67
  };
68
+ /** Width of the widest visible toast card (`[data-status]` in the stack); absent without a toast. */
69
+ toastCardWidth?: number;
51
70
  }
52
71
  /** Constraints of one island; every given field must hold within `GEOMETRY_TOLERANCE_PX`. */
53
72
  interface ExpectedBox {
@@ -59,6 +78,8 @@ interface ExpectedBox {
59
78
  height?: number;
60
79
  /** Horizontal centre relative to the root. */
61
80
  centerX?: number;
81
+ /** Vertical centre relative to the root (the web app's empty-state card). */
82
+ centerY?: number;
62
83
  }
63
84
  /** Measures the islands of the shell under `root` (default `.cd-shell`) in the page. */
64
85
  declare function measureChrome(page: PageLike, root?: string): Promise<ChromeMeasurement>;
@@ -71,7 +92,10 @@ interface OpenContext {
71
92
  /**
72
93
  * What the host requests before the modeler resolves it: in an IDE host the VS Code color theme
73
94
  * (`vsCodeStubSearch` hands it to a page with the VS Code stub). For an embedded host the kit
74
- * itself puts the foreign page's `<html>` in this mode once `open` resolved.
95
+ * itself puts the foreign page's `<html>` in this mode once `open` resolved. In the web host the
96
+ * system's preference without a stored choice: the kit emulates `prefers-color-scheme` and
97
+ * `prefers-contrast` (`PageLike.emulateMedia`) before `open`, and `open` loads the page with an
98
+ * empty `localStorage` entry `miragon.darstellung`.
75
99
  */
76
100
  requested: Appearance;
77
101
  }
@@ -89,9 +113,47 @@ interface ShowHooks<P extends PageLike = PageLike> {
89
113
  * read-only canvas and the status box. The kit waits `INVALID_STATUS_DELAY_MS` afterwards.
90
114
  */
91
115
  invalid?: ((page: P) => Promise<void>) | undefined;
116
+ /**
117
+ * Web host: puts the page on its start screen, the way a fresh visit without a document shows
118
+ * it (`shell.setEmptyState(true)`); `open` itself loads a document.
119
+ */
120
+ emptyState?: ((page: P) => Promise<void>) | undefined;
121
+ /**
122
+ * Web and embedded hosts: shows `toast` through the modeler's `shell.toast`, with
123
+ * `{ label: toast.actionLabel, onSelect() {} }` as its action when `actionLabel` is given.
124
+ */
125
+ toast?: ((page: P, toast: ToastFixture) => Promise<void>) | undefined;
92
126
  }
93
- /** A show hook by name: the islands `legend`, `inspector`, `problems`, `status` and the state `invalid`. */
127
+ /** A toast the kit asks the `toast` hook to show (cases `toasts`, `geometry`). */
128
+ interface ToastFixture {
129
+ status: ToastStatus;
130
+ text: string;
131
+ actionLabel?: string | undefined;
132
+ }
133
+ /** A file the kit drops on the page (case `dropZone`), built in the page as `new File([text], name, { type })`. */
134
+ interface DropFixture {
135
+ name: string;
136
+ type: string;
137
+ text: string;
138
+ }
139
+ interface DropFixtures {
140
+ /** A file `DropZoneOptions.accept` takes; dropping it on the start screen opens it (the card goes). */
141
+ accepted: DropFixture;
142
+ /** A file outside `accept`; dropping it opens nothing and shows a danger toast (or the modeler's `onReject`). */
143
+ rejected?: DropFixture | undefined;
144
+ /** `DropZoneOptions.multiple` of the modeler; default `false`, so a drag of two files is forbidden. */
145
+ multiple?: boolean | undefined;
146
+ }
147
+ /**
148
+ * A show hook by name: the islands `legend`, `inspector`, `problems`, `status`, the state
149
+ * `invalid`, and in the web column `emptyState` and `toast`.
150
+ */
94
151
  type ShowHook = keyof ShowHooks;
152
+ /**
153
+ * What a harness can lack: a show hook, the web app's drop zone (`drop`), or problems that point at
154
+ * an element (`problemSelection`: the modeler's diagnostics only name lines, so no row selects).
155
+ */
156
+ type AbsentFeature = ShowHook | "drop" | "problemSelection";
95
157
  interface ShellConformanceHarness<P extends PageLike = PageLike> {
96
158
  host: ShellHost;
97
159
  /** The modes the modeler declares (static); the appearance case requests dark from `["light"]`. */
@@ -104,12 +166,14 @@ interface ShellConformanceHarness<P extends PageLike = PageLike> {
104
166
  root?: string | undefined;
105
167
  /** Hooks for the islands and states the modeler has; one that is neither given nor `absent` is reported as skipped. */
106
168
  show?: ShowHooks<P> | undefined;
169
+ /** Web host: the files the `dropZone` case drops; without them (and not `absent`) it is skipped with `hook: "drop"`. */
170
+ drop?: DropFixtures | undefined;
107
171
  /**
108
172
  * The islands and states the modeler does not have. An absent hook is not reported as skipped,
109
173
  * and `geometry` and `aria` assert that its island is never visible. Listing a hook that `show`
110
174
  * also gives fails every case that uses it.
111
175
  */
112
- absent?: readonly ShowHook[] | undefined;
176
+ absent?: readonly AbsentFeature[] | undefined;
113
177
  /** Container sizes of the geometry case; default wide 1280 × 900, narrow 720 × 700, very narrow 420 × 700. */
114
178
  sizes?: readonly Size[] | undefined;
115
179
  }
@@ -119,7 +183,7 @@ interface ShellSkip {
119
183
  * The harness field that would feed it: a show hook, `destroy`, or `open` when the document it
120
184
  * opens lacks what the case needs (a shape on the canvas).
121
185
  */
122
- hook: ShowHook | "destroy" | "open";
186
+ hook: ShowHook | "drop" | "destroy" | "open";
123
187
  reason: string;
124
188
  }
125
189
  interface ShellCaseOutcome {
@@ -138,8 +202,10 @@ interface ShellConformanceCase {
138
202
  * canvas only), `create` (Enter on the first creating palette entry places one selected element in
139
203
  * the free rectangle and focuses the canvas), `readOnly` (the invalid-file lock of guide §13.5),
140
204
  * `appearance` (dark requested from a light-only modeler: nothing turns dark, `color-scheme` light
141
- * everywhere, the canvas surround and the palette's tool colours from the roles) and `cleanup` (after
142
- * `destroy` no shell element, class, attribute or key handling remains).
205
+ * everywhere, the canvas surround and the palette's tool colours from the roles; the web app's mode
206
+ * and its Appearance group) and `cleanup` (after `destroy` no shell element, class, attribute or
207
+ * key handling remains); then the web column's `webChrome`, `emptyState`, `toasts`,
208
+ * `problemsList` and `dropZone`, which assert in the other hosts that nothing of them shows.
143
209
  */
144
210
  declare function shellConformanceCases(): ShellConformanceCase[];
145
211
  /** Playwright's `test` (or any runner whose body receives `{ page }`). */
@@ -162,4 +228,4 @@ declare function vsCodeStubSearch(requested: Appearance, extra?: {
162
228
  /** Registers every case as `shell conformance: <name>`. */
163
229
  declare function registerShellConformance<P extends PageLike>(harness: ShellConformanceHarness<P>, test: ShellConformanceTest<P>, options?: RegisterShellConformanceOptions): void;
164
230
 
165
- export { type ChromeMeasurement, type ExpectedBox, GEOMETRY_TOLERANCE_PX, type IslandBox, type OpenContext, type PageLike, type RegisterShellConformanceOptions, type ShellCaseOutcome, type ShellConformanceCase, type ShellConformanceHarness, type ShellConformanceTest, type ShellSkip, type ShowHook, type ShowHooks, expectedChromeBoxes, measureChrome, registerShellConformance, shellConformanceCases, vsCodeStubSearch };
231
+ export { type AbsentFeature, type ChromeMeasurement, type DropFixture, type DropFixtures, type ExpectedBox, GEOMETRY_TOLERANCE_PX, type IslandBox, type OpenContext, type PageLike, type RegisterShellConformanceOptions, type ShellCaseOutcome, type ShellConformanceCase, type ShellConformanceHarness, type ShellConformanceTest, type ShellSkip, type ShowHook, type ShowHooks, type ToastFixture, expectedChromeBoxes, measureChrome, registerShellConformance, shellConformanceCases, vsCodeStubSearch };