@synopackageland/ui 0.15.1 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.16.0 (2026-10-25)
4
+
5
+ Visual change: `Wizard`. Its props, slots, events and exposed methods keep working; the footer's Previous is now Back on the left.
6
+
7
+ - `Wizard` is a window-sized layout: a step rail with numbered markers, done / current / upcoming states, a connecting line and a progress bar beside the step, or a stepper band above it when the wizard is under 600px wide (`stepper="auto" | "rail" | "header" | "none"`). The step scrolls between the band and a fixed footer: Back at the start; the step's `#actions`, Cancel and the one main action at the end.
8
+ - `WizardStep` gets a hero: `icon` (a tile beside the headline) or the `#hero` slot (a picture or diagram on a stage), plus `description`, a short `label` for the step list, `next-label`, `next-disabled`, `show-next`, `show-back`, `lazy` and an `#actions` footer slot. `type="done"` is a closing step with a success mark that pops in once, Finish, and no Back or Cancel.
9
+ - `WizardDialog`: the wizard in an app-local dialog, `xl` wide (860px) and 600px high, capped to the window; a phone-width window shows it as a bottom sheet with the band. Cancel closes it, Finish too unless `close-on-finish="false"`.
10
+ - `Wizard` props `title`, `description` (above the rail) and `framed` (a wizard on a page). `show-steps` is deprecated; `false` still hides the step list. The `#footer` slot also receives `stepKey`.
11
+ - A step changed with the focus in the wizard moves the focus to the new headline; steps slide in from the side they come from; reduced motion turns the motion off. A step mounted later with `v-if` keeps its document order in the step list.
12
+ - `Dialog flush`: no body padding or scrolling, for content that scrolls itself.
13
+ - New translated defaults "Back", "Finish" and "Steps" in all nine locales.
14
+ - `ConnectionTopology` compact lanes stay on one line in a ~230px card: the compact frame gives its padding to the row and a lane that still wraps is centred.
15
+ - Add [docs/wizard.md](docs/wizard.md).
16
+
3
17
  ## 0.15.1 (2026-10-25)
4
18
 
5
19
  - Defer responsive width updates to `requestAnimationFrame` so `CardGrid` and other components using `useElementWidth` avoid ResizeObserver delivery loops. Width changes are coalesced into one update per frame, and pending updates are cancelled when the component unmounts. (#53)
package/README.md CHANGED
@@ -300,6 +300,14 @@ content from collapsing. In a DSM window, `<AppRoot dialog-bounds="viewport">`
300
300
  lets dialogs be dragged out of the window, within the browser viewport. See
301
301
  [docs/app-local-modal.md](docs/app-local-modal.md#floating-dialogs-in-a-dsm-window).
302
302
 
303
+ ### Wizard
304
+
305
+ `WizardDialog` opens a multi-step setup in a large app-local dialog: a step
306
+ rail (a stepper band under 600px), a hero, headline and one line per step, a
307
+ scrolling step area and a fixed footer with Back on the left and one main
308
+ action on the right. `Wizard` is the same layout for a `<Dialog flush>` of your
309
+ own or a page (`framed`). See [docs/wizard.md](docs/wizard.md).
310
+
303
311
  ### Toast notifications
304
312
 
305
313
  Wrap your page with `ToastProvider` in `App.vue`:
@@ -922,7 +930,7 @@ validation time; imperative message-box default titles use the locale at opening
922
930
  See [the complete default-text and container audit](docs/component-defaults-0.5.7.md).
923
931
 
924
932
  `KeyValueRow` renders a `dl` with `dt`/`dd`; its default slot accepts rich values,
925
- including Link. `Wizard show-steps` shows registered step headlines and does not
933
+ including Link. The `Wizard` step list shows the registered steps and does not
926
934
  permit jumping past guards. Its built-in accessible name, `footer` actions and
927
935
  step progress follow Provider locale; explicit overrides remain available. `RepeatRow` places wrapped cells
928
936
  inside `[data-repeat-fields]` and keeps its remove action beside the first control;
@@ -1,4 +1,4 @@
1
- import { WizardFooterConfig, WizardStepChange } from './types';
1
+ import { WizardFooterConfig, WizardStepChange, WizardStepper } from './types';
2
2
  type __VLS_Props = {
3
3
  /** Initial / external reset key. Internal navigation keeps working when the caller does not bind it back. */
4
4
  activeStepKey?: string;
@@ -6,14 +6,23 @@ type __VLS_Props = {
6
6
  /** Shows the Cancel action in the footer. */
7
7
  cancellable?: boolean;
8
8
  ariaLabel?: string;
9
+ /** The wizard's name, at the top of the step rail. */
10
+ title?: string;
11
+ /** One short line under the title in the step rail. */
12
+ description?: string;
13
+ /** Where the steps show; see `WizardStepper`. */
14
+ stepper?: WizardStepper;
15
+ /** @deprecated Use `stepper`. `false` is `stepper="none"`. */
9
16
  showSteps?: boolean;
17
+ /** Draws a border, rounded corners and a shadow, for a wizard placed on a page rather than in a dialog. */
18
+ framed?: boolean;
10
19
  progressText?: (current: number, total: number) => string;
11
20
  };
12
21
  declare function toNextStep(): Promise<void>;
13
22
  declare function toPreviousStep(): Promise<void>;
14
23
  declare function finish(): Promise<void>;
15
24
  declare function cancel(): void;
16
- declare var __VLS_1: {}, __VLS_9: {
25
+ declare var __VLS_11: {}, __VLS_19: {
17
26
  nextStep: typeof toNextStep;
18
27
  previousStep: typeof toPreviousStep;
19
28
  finish: typeof finish;
@@ -21,11 +30,12 @@ declare var __VLS_1: {}, __VLS_9: {
21
30
  canGoPrevious: boolean;
22
31
  isLastStep: boolean;
23
32
  busy: boolean;
33
+ stepKey: string;
24
34
  };
25
35
  type __VLS_Slots = {} & {
26
- default?: (props: typeof __VLS_1) => any;
36
+ default?: (props: typeof __VLS_11) => any;
27
37
  } & {
28
- footer?: (props: typeof __VLS_9) => any;
38
+ footer?: (props: typeof __VLS_19) => any;
29
39
  };
30
40
  declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
31
41
  activeStepKey: import('vue').ComputedRef<string>;
@@ -53,6 +63,9 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
53
63
  }>, {
54
64
  footer: WizardFooterConfig;
55
65
  cancellable: boolean;
66
+ stepper: WizardStepper;
67
+ showSteps: boolean;
68
+ framed: boolean;
56
69
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
57
70
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
58
71
  declare const _default: typeof __VLS_export;
@@ -0,0 +1,44 @@
1
+ import { DialogSize } from '../../primitives/dialog/dialogSize';
2
+ type __VLS_Props = {
3
+ open?: boolean;
4
+ defaultOpen?: boolean;
5
+ title?: string;
6
+ description?: string;
7
+ size?: DialogSize;
8
+ width?: string;
9
+ /** The panel's height, capped to the room the window leaves. */
10
+ height?: string;
11
+ closeLabel?: string;
12
+ showClose?: boolean;
13
+ closeOnFinish?: boolean;
14
+ };
15
+ declare var __VLS_9: {}, __VLS_20: {};
16
+ type __VLS_Slots = {} & {
17
+ trigger?: (props: typeof __VLS_9) => any;
18
+ } & {
19
+ default?: (props: typeof __VLS_20) => any;
20
+ };
21
+ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
22
+ "update:open": (value: boolean) => any;
23
+ cancel: () => any;
24
+ finished: () => any;
25
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
26
+ "onUpdate:open"?: ((value: boolean) => any) | undefined;
27
+ onCancel?: (() => any) | undefined;
28
+ onFinished?: (() => any) | undefined;
29
+ }>, {
30
+ size: DialogSize;
31
+ height: string;
32
+ defaultOpen: boolean;
33
+ open: boolean;
34
+ showClose: boolean;
35
+ closeOnFinish: boolean;
36
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
37
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
38
+ declare const _default: typeof __VLS_export;
39
+ export default _default;
40
+ type __VLS_WithSlots<T, S> = T & {
41
+ new (): {
42
+ $slots: S;
43
+ };
44
+ };
@@ -1,7 +1,10 @@
1
1
  import { WizardStepProps } from './types';
2
- declare var __VLS_1: {};
3
- type __VLS_Slots = {} & {
4
- default?: (props: typeof __VLS_1) => any;
2
+ type __VLS_Slots = {
3
+ default?: () => unknown;
4
+ /** A picture or a diagram above the headline, in place of the icon tile. */
5
+ hero?: () => unknown;
6
+ /** Secondary actions drawn in the wizard footer, before Cancel and the main action, while this step shows. */
7
+ actions?: () => unknown;
5
8
  };
6
9
  declare const __VLS_base: import('vue').DefineComponent<WizardStepProps, {
7
10
  active: import('vue').ComputedRef<boolean>;
@@ -9,6 +12,10 @@ declare const __VLS_base: import('vue').DefineComponent<WizardStepProps, {
9
12
  footer: boolean;
10
13
  type: import('./types').WizardStepType;
11
14
  headline: string;
15
+ nextDisabled: boolean;
16
+ showNext: boolean;
17
+ showBack: boolean;
18
+ lazy: boolean;
12
19
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
13
20
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
14
21
  declare const _default: typeof __VLS_export;
@@ -1,12 +1,29 @@
1
- export type WizardStepType = 'normal' | 'welcome';
1
+ import { Component } from 'vue';
2
+ /**
3
+ * `'welcome'` is the entry step and only offers the forward action; `'done'`
4
+ * is the closing step: a success hero, no Back or Cancel, and Finish.
5
+ */
6
+ export type WizardStepType = 'normal' | 'welcome' | 'done';
7
+ /**
8
+ * Where the wizard shows its steps: a rail beside the step (`'rail'`), a
9
+ * stepper band above it (`'header'`), the rail when the wizard is at least
10
+ * 600px wide and the band below that (`'auto'`), or nowhere (`'none'`).
11
+ */
12
+ export type WizardStepper = 'auto' | 'rail' | 'header' | 'none';
2
13
  /** A guard may return `false` (or resolve `false`) to block the step change. */
3
14
  export type MaybePromise<T> = T | Promise<T>;
4
15
  export type WizardStepProps = {
5
16
  /** Unique key the wizard uses to identify this step. */
6
17
  stepKey: string;
7
- /** `'welcome'` is the entry step and only offers the forward action. */
8
18
  type?: WizardStepType;
19
+ /** The step's title, above its content. */
9
20
  headline?: string;
21
+ /** A shorter name for the step list; falls back to `headline`. */
22
+ label?: string;
23
+ /** One short line under the headline. */
24
+ description?: string;
25
+ /** An icon shown in a tile beside the headline; the `#hero` slot replaces it with a picture or a diagram. */
26
+ icon?: Component;
10
27
  /** Omitted on the final step: the forward button then becomes Apply. */
11
28
  nextStepKey?: string | (() => string);
12
29
  /** Omitted falls back to the step registered just before this one. */
@@ -19,12 +36,23 @@ export type WizardStepProps = {
19
36
  finished?: () => MaybePromise<void>;
20
37
  /** `false` hides the shared footer while this step is active. */
21
38
  footer?: boolean;
39
+ /** The forward button's label on this step. */
40
+ nextLabel?: string;
41
+ /** Disables the forward button, for a step that is not complete yet. */
42
+ nextDisabled?: boolean;
43
+ /** `false` hides the forward button, for a step that moves on by itself or through its own choices. */
44
+ showNext?: boolean;
45
+ /** `false` hides Back on this step. */
46
+ showBack?: boolean;
47
+ /** Renders the content only while the step is shown, instead of keeping it mounted for its form state. */
48
+ lazy?: boolean;
22
49
  };
23
50
  export type WizardFooterConfig = boolean | {
24
51
  startLabel?: string;
25
52
  previousLabel?: string;
26
53
  nextLabel?: string;
27
54
  applyLabel?: string;
55
+ finishLabel?: string;
28
56
  cancelLabel?: string;
29
57
  };
30
58
  export type WizardStepChange = {
@@ -1,12 +1,19 @@
1
- import { ComputedRef, InjectionKey, Ref } from 'vue';
1
+ import { ComputedRef, InjectionKey, Ref, Slots } from 'vue';
2
2
  import { WizardStepProps } from './types';
3
3
  /** A mounted `WizardStep` as seen by its `Wizard`. `props` stays reactive. */
4
4
  export type WizardStepRegistration = {
5
5
  key: string;
6
6
  props: WizardStepProps;
7
+ /** The step's slots: the wizard draws `#actions` in its footer. */
8
+ slots: Slots;
9
+ /** The step's element, which orders a step mounted later (a `v-if`) among the others. */
10
+ element: () => HTMLElement | null | undefined;
7
11
  };
12
+ /** Which way the wizard last moved, for the step's entrance. */
13
+ export type WizardDirection = 'forward' | 'back' | undefined;
8
14
  export type WizardContext = {
9
15
  activeStepKey: ComputedRef<string | undefined>;
16
+ direction: Ref<WizardDirection>;
10
17
  steps: Ref<WizardStepRegistration[]>;
11
18
  busy: Ref<boolean>;
12
19
  register: (registration: WizardStepRegistration) => void;
@@ -17,6 +17,8 @@ type __VLS_Props = {
17
17
  closeLabel?: string;
18
18
  /** Hides the header close affordance for fixed-flow dialogs that own their dismiss path. */
19
19
  showClose?: boolean;
20
+ /** Drops the body's padding and scrolling, for content that lays out and scrolls itself (a `Wizard`). */
21
+ flush?: boolean;
20
22
  };
21
23
  declare var __VLS_14: {}, __VLS_71: {}, __VLS_79: {};
22
24
  type __VLS_Slots = {} & {
@@ -43,6 +45,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {},
43
45
  }>, {
44
46
  defaultOpen: boolean;
45
47
  open: boolean;
48
+ flush: boolean;
46
49
  showClose: boolean;
47
50
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
48
51
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -89,6 +89,9 @@ export declare const englishUiText: {
89
89
  readonly Next: "Next";
90
90
  readonly Previous: "Previous";
91
91
  readonly "Step {step} of {total}": "Step {step} of {total}";
92
+ readonly Back: "Back";
93
+ readonly Finish: "Finish";
94
+ readonly Steps: "Steps";
92
95
  readonly "Password:": "Password:";
93
96
  readonly "Enter password": "Enter password";
94
97
  readonly "Unsaved changes": "Unsaved changes";
package/dist/index.d.ts CHANGED
@@ -176,7 +176,8 @@ export type { LostChangeResult, MessageBox as MessageBoxController, MessageBoxBu
176
176
  export { messageBoxKey } from './components/composite/message-box/types';
177
177
  export { default as Wizard } from './components/composite/wizard/Wizard.vue';
178
178
  export { default as WizardStep } from './components/composite/wizard/WizardStep.vue';
179
- export type { WizardFooterConfig, WizardStepChange, WizardStepProps, WizardStepType } from './components/composite/wizard/types';
179
+ export { default as WizardDialog } from './components/composite/wizard/WizardDialog.vue';
180
+ export type { WizardFooterConfig, WizardStepChange, WizardStepProps, WizardStepType, WizardStepper } from './components/composite/wizard/types';
180
181
  export { default as AboutDialog } from './components/composite/about-dialog/AboutDialog.vue';
181
182
  export type { AboutCheckState, AboutVersionInfo } from './components/composite/about-dialog/types';
182
183
  export { default as AppRoot } from './components/app/app-root/AppRoot.vue';