vue-dockable-desktop 1.8.0 → 1.8.2

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/CHANGELOG.md CHANGED
@@ -11,6 +11,82 @@ correspondence lives, alongside the feature-by-feature map in [docs/PARITY.md](d
11
11
 
12
12
  ## [Unreleased]
13
13
 
14
+ ## [1.8.2] — 2026-10-06
15
+
16
+ **Parity: react-dockable-desktop 7.7.3** (code health). Neither of rdd's last two releases needs a
17
+ port: 7.7.2 fixed panels re-rendering on every workspace change, which vdd never did (each panel
18
+ host reads only its own entry), and 7.7.3 is rdd's own lint and dead-code tooling. This release is
19
+ vdd's matching lint cleanup. No API or behaviour change; the built code differs only in the
20
+ explicit `undefined` prop defaults below.
21
+
22
+ ### Internal
23
+
24
+ - **A lint warning now fails the gate.** ESLint runs with `--max-warnings 0` in the standing gate
25
+ (CI), `npm run verify` and `npm run lint`. Warnings never failed anything before, and 721 had
26
+ built up.
27
+ - **Template-layout rules are off.** `vue/max-attributes-per-line` and five other Vue
28
+ template-formatting rules accounted for 706 of the 721: they only reflow markup, and the
29
+ templates keep their own consistent layout.
30
+ - The 12 optional props without a default (`VddAlert`'s `okLabel`, `VddConfirm`'s callbacks, the
31
+ icon props, and others) declare `undefined` explicitly in `withDefaults`, as `icon` already did.
32
+ Their behaviour is unchanged.
33
+ - The demo's Markdown preview: the `v-html` lint exemption now covers the right line, and its
34
+ comment no longer calls the output sanitised. It isn't: `rehype-raw` passes raw HTML through,
35
+ which is acceptable in a demo that renders only what is typed into its own editor.
36
+
37
+ ## [1.8.1] — 2026-10-05
38
+
39
+ **Parity: react-dockable-desktop 7.7.1.** Two desktops on one page no longer strip each other's
40
+ skin.
41
+
42
+ ### Fixed
43
+
44
+ - **Unmounting one desktop stripped `<html>` of the other's skin, animations opt-out and stacking
45
+ base** (`data-vdd-skin`, `vdd-no-animations`, `--vdd-z-base`), and each desktop overwrote the
46
+ other's while both were mounted. The most recently mounted desktop now decides these, and
47
+ unmounting it hands them back to the others instead of removing them. Teleported chrome (menus,
48
+ toasts, flyouts, modals) therefore follows the newest desktop's skin when two desktops use
49
+ different skins.
50
+
51
+ rdd 7.7.1 also fixed panel DOM, sizes and lifecycle handlers shared between workspaces. None of it
52
+ applied here: vdd's panel cache has been per desktop from the start.
53
+
54
+ ### Internal
55
+
56
+ Faster checks, the same checks. Nothing in the published package changes.
57
+
58
+ - **`npm run verify`** — types, lint and the test suite, about a minute: the check to run while
59
+ working. **`npm run gate:release`** — the coverage sweep, then every milestone gate M1–M17 in
60
+ one call: the check to run before a release.
61
+ - **`npm run gate -- M13 M15 M16`** runs several milestones on one standing gate (types, lint,
62
+ tests, build…) instead of repeating it for each. Each step's time is recorded in
63
+ `artifacts/M<n>/gate.json`.
64
+ - **The branding gates wait for the page to be still instead of sleeping.** A scene, the overlays
65
+ and each hover now wait until nothing is animating or changing, with the old sleep as the
66
+ ceiling; the wait after the pointer leaves a control stays fixed, since the timers it starts are
67
+ invisible to such a check. M16 checks its three corner scales on one page per scene, and no
68
+ longer runs the hover walk for corners, which never read it. M15 captures a scene twice only
69
+ for an unexpected difference. Rewriting both baselines with the new code gave byte-identical
70
+ fixtures.
71
+ - **The baselines key elements by library class, not position**, so a new wrapper element no
72
+ longer renames everything after it (this release's dialog row renamed a whole modal). Both
73
+ fixtures were regenerated once: every scene has the same entries with identical values, under
74
+ the new keys.
75
+ - **`gate:selftest` leaves the tree fresh**: it rebuilds `dist/` and re-runs the coverage sweep at
76
+ the end, so a following M13 never reads the report a seeded violation left behind.
77
+ - **Three stale milestone rules updated** ([0020](docs/decisions/0020-stale-milestone-rules.md)):
78
+ M2 still required `src/core/rtl.ts`, deleted at M13 as dead code; M5 looked for the window clamp
79
+ where it no longer lives; M6 expected the pre-1.1.2 side for an RTL tab drop. Each keeps its
80
+ intent and checks today's code, and the new M2 and M5 rules have seeded violations in the
81
+ selftest (100 rules).
82
+
83
+ | | before | after |
84
+ |---|---|---|
85
+ | every gate, M1–M17 | ≈26 min (17 standing gates) | ≈9 min (one) |
86
+ | M16 browser gate | 435 s | 137–145 s |
87
+ | M15 browser gate | 236 s | 173–183 s |
88
+ | while working | a gate run | `npm run verify`, ≈1 min |
89
+
14
90
  ## [1.8.0] — 2026-10-05
15
91
 
16
92
  **Parity: react-dockable-desktop 7.7.0.** Ready-made dialogs: the confirmation shows an icon,
@@ -14,6 +14,8 @@ type __VLS_Props = {
14
14
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
15
15
  icon: Component | null;
16
16
  alertType: AlertType;
17
+ onSettled: () => void;
18
+ okLabel: Label;
17
19
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
18
20
  declare const _default: typeof __VLS_export;
19
21
  export default _default;
@@ -19,8 +19,12 @@ type __VLS_Props = {
19
19
  };
20
20
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
21
21
  icon: Component | null;
22
+ alert: string;
22
23
  alertType: AlertType;
24
+ onCancel: () => void;
23
25
  yesNo: boolean;
26
+ onOk: () => void;
27
+ onSettled: (ok: boolean) => void;
24
28
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
25
29
  declare const _default: typeof __VLS_export;
26
30
  export default _default;
@@ -23,6 +23,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {
23
23
  skin: string;
24
24
  animations: boolean;
25
25
  taskbar: TaskbarVisibility;
26
+ defaultPanelIcon: undefined;
26
27
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
27
28
  declare const _default: typeof __VLS_export;
28
29
  export default _default;
@@ -45,6 +45,7 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {}, {
45
45
  }>, {
46
46
  width: number;
47
47
  height: number;
48
+ icon: Component;
48
49
  stretchable: boolean;
49
50
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
50
51
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -15,6 +15,7 @@ type __VLS_Slots = {} & {
15
15
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
16
16
  variant: ToolbarVariant;
17
17
  buttonVariant: ButtonVariant;
18
+ buttonSize: number;
18
19
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
19
20
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
20
21
  declare const _default: typeof __VLS_export;
@@ -12,6 +12,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {
12
12
  onContextMenu?: ((panelId: string, event: MouseEvent | PointerEvent) => any) | undefined;
13
13
  }>, {
14
14
  visibility: TaskbarVisibility;
15
+ defaultIcon: undefined;
15
16
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
16
17
  declare const _default: typeof __VLS_export;
17
18
  export default _default;
@@ -25,6 +25,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {
25
25
  width: number;
26
26
  position: ToastPosition;
27
27
  animation: "slide" | "fade" | "none";
28
+ adapter: ToastAdapter;
28
29
  pauseOnHover: boolean;
29
30
  defaultDuration: number;
30
31
  defaultClosable: boolean;
@@ -21,6 +21,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {
21
21
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
22
22
  onSelect?: ((result: SearchResult) => any) | undefined;
23
23
  }>, {
24
+ placeholder: string;
24
25
  debounce: number;
25
26
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
26
27
  declare const _default: typeof __VLS_export;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * What a desktop mirrors onto `<html>`: its skin, its animations opt-out and its stacking base.
3
+ *
4
+ * Chrome teleported to `document.body` (menus, toasts, flyouts, modals) can only inherit these from
5
+ * the document, so they are written there. The document is shared by every desktop on the page, which
6
+ * is why this module keeps state at module level, per document — and why it is a stack of owners
7
+ * rather than a plain write: with two desktops mounted, each used to overwrite the other, and
8
+ * unmounting either one removed the values for the one still on screen.
9
+ *
10
+ * Each field shows the most recently mounted owner that claims it. Releasing the last claim of a field
11
+ * removes it from `<html>`, as a single desktop always did. A field nobody claims is never touched, so
12
+ * a value the page set itself survives. rdd 7.7.1's `src/utils/documentMirror.ts` is the same rule.
13
+ */
14
+ export interface DocumentMirrorValues {
15
+ /** `data-vdd-skin`. An empty value claims "no skin attribute". */
16
+ skin?: string | null;
17
+ /** The `vdd-no-animations` class. */
18
+ noAnimations?: boolean;
19
+ /** `--vdd-z-base`. */
20
+ zBase?: number;
21
+ }
22
+ type Field = keyof DocumentMirrorValues;
23
+ /**
24
+ * Claims (or updates) `owner`'s values. A first claim puts the owner on top; an update keeps its
25
+ * place, so changing one desktop's skin never lets it jump over a desktop mounted after it.
26
+ */
27
+ export declare function claimDocumentMirror(owner: object, values: DocumentMirrorValues, doc?: Document): void;
28
+ /** Releases `owner`'s claim on `fields`; the owner leaves the stack once it claims nothing. */
29
+ export declare function releaseDocumentMirror(owner: object, fields?: readonly Field[], doc?: Document): void;
30
+ export {};