@synopackageland/ui 0.9.1 → 0.9.3

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 (34) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +77 -3
  3. package/dist/components/app/page-header/PageHeader.vue.d.ts +4 -1
  4. package/dist/components/composite/about-dialog/AboutDialog.vue.d.ts +1 -1
  5. package/dist/components/composite/connection-topology/ConnectionTopology.vue.d.ts +40 -0
  6. package/dist/components/composite/connection-topology/TopologyLink.vue.d.ts +8 -0
  7. package/dist/components/composite/connection-topology/TopologyNode.vue.d.ts +19 -0
  8. package/dist/components/composite/connection-topology/types.d.ts +30 -0
  9. package/dist/components/composite/data-grid/DataGrid.vue.d.ts +1 -1
  10. package/dist/components/composite/path-display/PathDisplay.vue.d.ts +25 -0
  11. package/dist/components/composite/settings-section/SettingsSection.vue.d.ts +10 -2
  12. package/dist/components/composite/step-list/StepList.vue.d.ts +29 -0
  13. package/dist/components/composite/step-list/types.d.ts +7 -0
  14. package/dist/components/containers/card/Card.vue.d.ts +6 -4
  15. package/dist/components/feedback/validation-popup/ValidationPopup.vue.d.ts +1 -1
  16. package/dist/components/primitives/pagination/Pagination.vue.d.ts +1 -1
  17. package/dist/components/primitives/rich-text/RichText.vue.d.ts +1 -1
  18. package/dist/components/primitives/skeleton/SectionSkeleton.vue.d.ts +8 -0
  19. package/dist/components/primitives/skeleton/Skeleton.vue.d.ts +1 -1
  20. package/dist/components/primitives/status-dot/StatusDot.vue.d.ts +13 -0
  21. package/dist/components/primitives/tag/Tag.vue.d.ts +2 -2
  22. package/dist/i18n/text.d.ts +13 -0
  23. package/dist/index.d.ts +7 -0
  24. package/dist/index.js +8538 -7960
  25. package/dist/json-preview/preview.js +3714 -3458
  26. package/dist/lib/clipboard.d.ts +2 -0
  27. package/dist/reka-runtime.json +1 -1
  28. package/dist/theme.css +1 -1
  29. package/dist/themes/dsm7-embedded-theme.css +1 -1
  30. package/dist/themes/dsm7-embedded.css +1 -1
  31. package/dist/themes/dsm7.css +1 -1
  32. package/docs/app-local-modal.md +6 -1
  33. package/docs/layout-rules.md +37 -0
  34. package/package.json +3 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,41 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.9.3 (2026-10-13)
4
+
5
+ Behavior changes: `Checkbox` renders its root as a `span` with a `label` for its text, `Input type="password"` adds a show/hide button, number inputs are 128px wide, `PageHeader` is sticky by default, and disabled primary and danger buttons are tinted instead of faded. Layout rules are in `docs/layout-rules.md`.
6
+ 行為變化:`Checkbox` 根元素改為 `span`,文字用 `label`;`Input type="password"` 加上顯示/隱藏按鈕;數字欄位寬 128px;`PageHeader` 預設 sticky;停用的主要與危險按鈕改為淡色底而非半透明。版面規則見 `docs/layout-rules.md`。
7
+
8
+ - **Behavior change.** `Checkbox` keeps its box and text on one line even when App CSS sets `label { display: grid }`: the root is a `span` and only the text is a `label` bound to the box.
9
+ - **行為變化。** App CSS 設 `label { display: grid }` 時,`Checkbox` 的方塊與文字仍在同一行:根元素改為 `span`,只有文字是綁定方塊的 `label`。
10
+ - **Behavior change.** `Input type="password"` has a show/hide button (`data-ui-password-toggle`, `aria-pressed`). `Input type="number"` is 128px wide instead of the full row.
11
+ - **行為變化。** `Input type="password"` 加上顯示/隱藏按鈕(`data-ui-password-toggle`、`aria-pressed`)。`Input type="number"` 寬 128px,不再撐滿整列。
12
+ - **Behavior change.** `PageHeader` sticks to the top while the page scrolls; `:sticky="false"` turns it off. `EmptyState` fills the remaining height so its content is centred.
13
+ - **行為變化。** `PageHeader` 捲動時固定在頂端,`:sticky="false"` 可關閉。`EmptyState` 撐滿剩餘高度,內容垂直置中。
14
+ - **Behavior change.** Disabled primary and danger buttons use a pale tint of their colour with readable text (4.5:1) instead of 40% opacity.
15
+ - **行為變化。** 停用的主要與危險按鈕改用淡色底與可讀文字(4.5:1),不再是 40% 透明度。
16
+ - `SettingsSection` takes a `description` (one paragraph, at most 72ch) and a `#footer` slot for its actions; its title is body-colour text over a solid divider. `SettingsSection` and `Card` take `loading`, which keeps the title and shows the new `SectionSkeleton` in place of the content and actions.
17
+ - `SettingsSection` 新增 `description`(一段,最寬 72ch)與放動作的 `#footer` slot;標題改為內文色、下方實線分隔。`SettingsSection` 與 `Card` 新增 `loading`:保留標題,內容與動作改顯示新的 `SectionSkeleton`。
18
+ - `PathDisplay` shows a NAS path read-only: folder icon, truncated from the start with the full path as its tooltip, and a copy button. It emits `copied` and `copy-failed`.
19
+ - 新增 `PathDisplay`:唯讀顯示 NAS 路徑,含資料夾圖示,從開頭截斷並以 tooltip 顯示完整路徑,附複製按鈕;發出 `copied`、`copy-failed`。
20
+ - Fix: `SectionTabs` spans the full toolbar width and its first tab starts at the content edge. The `Select` chevron is vertically centred.
21
+ - 修正:`SectionTabs` 撐滿整個 toolbar,第一個分頁與內容左緣對齊。`Select` 的箭頭垂直置中。
22
+ - `pnpm check:polish` checks these rules in Chrome against a DSM host page.
23
+ - `pnpm check:polish` 在 Chrome 中以 DSM 主機頁檢查上述規則。
24
+
25
+ ## 0.9.2 (2026-10-12)
26
+
27
+ One behavior change: while a Dialog floats outside its window (`dialog-bounds="viewport"`), focus that lands on the owning DSM window returns to the top Dialog, so Escape closes that Dialog instead of the window. Everything else is additive: Badge looks the same in the DSM 7 theme.
28
+ 一項行為變化:Dialog 浮出視窗外(`dialog-bounds="viewport"`)期間,落到所屬 DSM 視窗的焦點會回到最上層 Dialog,Esc 因此只關該 Dialog,不再關掉視窗。其餘皆為新增;DSM 7 主題下 Badge 外觀不變。
29
+
30
+ - `ConnectionTopology` draws paths from several sources, each through an optional relay, to one shared target, with no product wording built in. Each link is one of `active`, `pending`, `attention`, `error`, `idle` or `unknown`, shown with colour, a glyph and a word: working links flow dots toward the target, changing ones move slow dashes with a pulsing dot. Lanes are buttons that emit `select-lane` (Enter/Space; arrow keys, Home and End move between lanes); `lane-footer-<id>` and `node-<id>` slots add content. Below 600px of container width, or with `compact`, lanes stack with their own target. `pnpm check:topology` checks it in Chrome.
31
+ - 新增 `ConnectionTopology`:畫出多個來源各自經過(可省略的)中繼、連到同一個目標的路徑,元件本身不含產品用語。每段連線是 `active`、`pending`、`attention`、`error`、`idle`、`unknown` 之一,以顏色、圖示與文字表示:運作中的連線有點點流向目標,變化中的連線是慢速虛線加脈動圓點。每條 lane 是按鈕,發出 `select-lane`(Enter/Space;方向鍵、Home、End 在 lane 間移動);`lane-footer-<id>`、`node-<id>` slot 可加內容。容器寬度小於 600px 或設 `compact` 時改為直向堆疊、每條 lane 各帶目標。`pnpm check:topology` 在 Chrome 中檢查。
32
+ - `StatusDot` is a tone dot; `pulse` ripples a ring out of it. `StepList` is a static numbered list of instructions or checklist items, each with an optional status (`done`, `current`, `pending`, `error`, `warning`) and `#description`/`#action` slots.
33
+ - 新增 `StatusDot`(色調圓點,`pulse` 會向外擴散光圈)與 `StepList`(靜態編號步驟清單,可作操作說明或檢查清單;每項可帶狀態 `done`、`current`、`pending`、`error`、`warning`,並有 `#description`/`#action` slot)。
34
+ - Theme tokens `--ui-{neutral,info,success,warning,danger}-soft` and `-text` give each status tone a soft fill and the text that reads on it; `Badge` now uses them (same colours in the DSM 7 theme), so a theme recolours every tone. New keyframes `ui-flow` and `ui-pulse`; both stop under `prefers-reduced-motion`.
35
+ - 新增主題 token `--ui-{neutral,info,success,warning,danger}-soft` 與 `-text`,為每個狀態色提供淡底色與其上的文字色;`Badge` 改用它們(DSM 7 主題下顏色不變),主題可一次改掉所有色調。新增 keyframe `ui-flow`、`ui-pulse`,在 `prefers-reduced-motion` 下皆停止。
36
+ - **Behavior change.** Fix: with `dialog-bounds="viewport"`, Escape after pressing a floating Dialog no longer closes the whole DSM window. The `activate` handler's `toFront()` moved focus to the window's own anchor, so Escape skipped the Dialog and reached the window's keymap. Focus that lands on the owning window while a Dialog floats now returns to the top Dialog, so Escape closes only that Dialog. Apps need no change.
37
+ - **行為變化。** 修正:`dialog-bounds="viewport"` 下,按過浮出的 Dialog 後再按 Esc,不再關掉整個 DSM 視窗。`activate` 處理中的 `toFront()` 會把焦點移到視窗自己的錨點,Esc 因此繞過 Dialog、由視窗 keymap 處理。現在 Dialog 浮出期間,落到所屬視窗的焦點會回到最上層 Dialog,Esc 只關該 Dialog。App 不需修改。
38
+
3
39
  ## 0.9.1 (2026-10-12)
4
40
 
5
41
  Two behavior changes: a Dialog without `width` is 520px wide inside `AppRoot`, and Breadcrumb's last level no longer emits `click-item`.
package/README.md CHANGED
@@ -8,7 +8,8 @@ Import the components you need into your Vue application.
8
8
  For DSM window / full-page Portal / phone layouts, see
9
9
  [Responsive DSM application layout](docs/adaptive-layout.md). To generate UI
10
10
  as JSON (including with an AI and the `syno-pkg-land-ui` validate/render CLI), see
11
- [Declarative DSM UI](docs/json-ui.md).
11
+ [Declarative DSM UI](docs/json-ui.md). For page layout rules, see
12
+ [Layout rules](docs/layout-rules.md).
12
13
 
13
14
  Synology Package Land UI provides Vue components for Synology package applications,
14
15
  including an embedded theme and AppRoot for shared DSM desktop windows.
@@ -227,6 +228,9 @@ packed-consumer Chromium acceptance run (requires ego-browser).
227
228
 
228
229
  ## Common component patterns
229
230
 
231
+ Spacing, action rows, field widths, status display and section loading follow
232
+ [Layout rules](docs/layout-rules.md).
233
+
230
234
  ### Dialog
231
235
 
232
236
  Use `v-model:open` to control visibility. The default slot contains the body;
@@ -328,6 +332,19 @@ Components use semantic CSS tokens. Import your override stylesheet after the li
328
332
  }
329
333
  ```
330
334
 
335
+ Status tones come in pairs, a soft fill and the text that reads on it:
336
+ `--ui-{neutral,info,success,warning,danger}-soft` and `-text`. `Badge`,
337
+ `StatusDot`, `StepList` and `ConnectionTopology` use only these and the base
338
+ tones (`--ui-success`, …), so a dark theme overrides the pairs once:
339
+
340
+ ```css
341
+ [data-ui-theme='dark'] {
342
+ --ui-success-soft: #173222;
343
+ --ui-success-text: #6fdc8a;
344
+ /* … the other tones, and the surface and text tokens */
345
+ }
346
+ ```
347
+
331
348
  Density can be switched per application subtree:
332
349
 
333
350
  ```html
@@ -344,7 +361,7 @@ Primitives:
344
361
  - Input / Textarea
345
362
  - Checkbox / RadioGroup / Switch
346
363
  - Select
347
- - Badge / Separator / Spinner / LoadingMask / LoadingArea / Progress / Skeleton / Surface
364
+ - Badge / StatusDot / Separator / Spinner / LoadingMask / LoadingArea / Progress / Skeleton / Surface
348
365
  - SplitButton
349
366
  - Tooltip / Popover / DropdownMenu / ContextMenu / Dialog
350
367
  - Sheet / Drawer
@@ -356,7 +373,8 @@ DSM-style application building blocks:
356
373
 
357
374
  - SearchField
358
375
  - SettingsRow / SettingsSection
359
- - Callout / EmptyState
376
+ - Callout / EmptyState / StepList
377
+ - ConnectionTopology
360
378
  - DataTable / DataGrid
361
379
  - TreeView
362
380
  - FilePicker
@@ -385,6 +403,54 @@ by the caller, add `class="ui-tab-panel"` to a panel keyed by the selected value
385
403
  to use the same short fade. These effects and the loading ring respect the
386
404
  system's reduced-motion preference.
387
405
 
406
+ ### Status: StatusDot, StepList, ConnectionTopology
407
+
408
+ `StatusDot` is an 8px tone dot; `pulse` ripples a ring out of it for a state
409
+ that is still changing. It is decorative unless it has a `label`.
410
+
411
+ `StepList` is a static numbered list (`items: { title, description?, status? }[]`)
412
+ for instructions or a checklist. `status` (`done`, `current`, `pending`, `error`,
413
+ `warning`) recolours the marker and is read out to assistive technology;
414
+ `#description` and `#action` scoped slots add content per step. It does not
415
+ navigate; use `Wizard` for that.
416
+
417
+ `ConnectionTopology` draws paths from several sources, each through an optional
418
+ relay, to one shared target. It knows nothing about any product: the caller
419
+ maps its own states to six link states.
420
+
421
+ ```vue
422
+ <ConnectionTopology
423
+ aria-label="Connections"
424
+ :target="{ id: 'server', label: 'Server', caption: 'office-01', icon: Server }"
425
+ :lanes="[{
426
+ id: 'relay',
427
+ source: { id: 'browser', label: 'Any browser', icon: Globe },
428
+ via: { id: 'relay', label: 'Edge relay', icon: Cloud },
429
+ links: [{ state: 'active', label: 'Reachable' }, { state: 'active', label: 'Running' }],
430
+ }]"
431
+ @select-lane="open"
432
+ >
433
+ <template #lane-footer-relay>https://office.example.com</template>
434
+ </ConnectionTopology>
435
+ ```
436
+
437
+ - **States.** `active` (green, dots flow toward the target), `pending` (amber,
438
+ slow dashes and a pulsing dot), `attention` (amber, waits for the user),
439
+ `error` (red), `idle` (grey dashes), `unknown` (grey dots). Every state but
440
+ `idle` has a glyph and every link a word, so colour is never the only cue;
441
+ `link.icon` replaces the glyph (a key for a sign-in, say). A missing `label`
442
+ shows the localized state word (`text` overrides them); `label: ''` hides it.
443
+ - **Keyboard and screen readers.** Each lane is a button named after its nodes
444
+ and link states; Enter or Space emits `select-lane`, the arrow keys, Home and
445
+ End move between lanes. `selectable: false` renders plain rows.
446
+ `lane-footer-<id>` content sits below the lane button, so it may hold its own
447
+ buttons and links; `node-<id>` replaces a node's content.
448
+ - **Layout.** Below 600px of container width (or with `compact`), each lane
449
+ stacks with its own copy of the target and the link words move to a caption
450
+ line. With no lanes, one idle line shows `empty-label`.
451
+ - **Motion.** The keyframes `ui-flow` and `ui-pulse` stop under
452
+ `prefers-reduced-motion`; a working link then turns solid with an arrow.
453
+
388
454
  `FilePicker` owns file selection/validation/drop-zone UI only; applications remain responsible for upload transport.
389
455
 
390
456
  ### DataGrid
@@ -443,6 +509,7 @@ pnpm check # lint, typecheck, tests, and production build
443
509
  pnpm story:build # build the component workbench
444
510
  pnpm check:host # after pnpm build: DSM host simulation screenshots (Chrome)
445
511
  pnpm check:switch # after pnpm build: Switch knob geometry and click toggling (Chrome)
512
+ pnpm check:topology # after pnpm build: ConnectionTopology motion, keyboard and narrow layout (Chrome)
446
513
  ```
447
514
 
448
515
  `pnpm check:host` serves `tests/dsm-host` and screenshots each overlay scene in
@@ -457,6 +524,13 @@ embedded theme (also under `host-simulation.css`), checks in headless Chrome tha
457
524
  inside and centred in the track and that a real mouse click toggles an enabled switch. Screenshots
458
525
  are left in `.switch-shots/`.
459
526
 
527
+ `pnpm check:topology` renders every link state wide, on dark tokens, at 360px and
528
+ empty, on the standalone and the embedded theme. In headless Chrome it checks
529
+ that working links flow and changing ones pulse, that reduced motion stills
530
+ them, that the arrow keys and Enter select a lane with a visible focus ring, and
531
+ that the narrow layout stacks without overflow. Screenshots are left in
532
+ `.topology-shots/`.
533
+
460
534
  In the workbench, open `DSM 7 / App Interior` and `DSM 7 / Advanced Components`
461
535
  for reference compositions. See [SPEC.md](./SPEC.md) for architecture and
462
536
  contribution rules, and [src/index.ts](./src/index.ts) for public exports.
@@ -1,12 +1,15 @@
1
1
  type __VLS_Props = {
2
2
  title: string;
3
3
  description?: string;
4
+ sticky?: boolean;
4
5
  };
5
6
  declare var __VLS_1: {};
6
7
  type __VLS_Slots = {} & {
7
8
  actions?: (props: typeof __VLS_1) => any;
8
9
  };
9
- declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
10
+ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
11
+ sticky: boolean;
12
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
10
13
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
11
14
  declare const _default: typeof __VLS_export;
12
15
  export default _default;
@@ -58,9 +58,9 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
58
58
  "onCheck-error"?: ((error: unknown) => any) | undefined;
59
59
  }>, {
60
60
  width: string;
61
+ version: string;
61
62
  defaultOpen: boolean;
62
63
  open: boolean;
63
- version: string;
64
64
  tagline: string;
65
65
  iconSrc: string;
66
66
  beta: boolean;
@@ -0,0 +1,40 @@
1
+ import { LinkState, TopologyLane, TopologyNode } from './types';
2
+ /**
3
+ * Paths from several sources, each through an optional relay, to one shared
4
+ * target. Each link shows its state with colour, a glyph and text; working
5
+ * links flow toward the target. Every lane is a button that emits
6
+ * `select-lane`. Below 600px of container width the lanes stack compactly.
7
+ */
8
+ type __VLS_Props = {
9
+ target: TopologyNode;
10
+ lanes: TopologyLane[];
11
+ ariaLabel?: string;
12
+ /** Always use the stacked narrow layout. */
13
+ compact?: boolean;
14
+ /** Render lanes as buttons that emit `select-lane`. */
15
+ selectable?: boolean;
16
+ emptyLabel?: string;
17
+ /** State words for links without a label. */
18
+ text?: Partial<Record<LinkState, string>>;
19
+ };
20
+ type __VLS_Slots = Record<`node-${string}`, (props: {
21
+ node: TopologyNode;
22
+ }) => unknown> & Record<`lane-footer-${string}`, (props: {
23
+ lane: TopologyLane;
24
+ }) => unknown>;
25
+ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
26
+ "select-lane": (id: string) => any;
27
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
28
+ "onSelect-lane"?: ((id: string) => any) | undefined;
29
+ }>, {
30
+ compact: boolean;
31
+ selectable: boolean;
32
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
33
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
34
+ declare const _default: typeof __VLS_export;
35
+ export default _default;
36
+ type __VLS_WithSlots<T, S> = T & {
37
+ new (): {
38
+ $slots: S;
39
+ };
40
+ };
@@ -0,0 +1,8 @@
1
+ import { TopologyLink } from './types';
2
+ type __VLS_Props = {
3
+ link: TopologyLink;
4
+ text: string;
5
+ };
6
+ declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
7
+ declare const _default: typeof __VLS_export;
8
+ export default _default;
@@ -0,0 +1,19 @@
1
+ import { TopologyNode } from './types';
2
+ type __VLS_Props = {
3
+ node: TopologyNode;
4
+ };
5
+ declare var __VLS_1: {
6
+ node: TopologyNode;
7
+ };
8
+ type __VLS_Slots = {} & {
9
+ default?: (props: typeof __VLS_1) => any;
10
+ };
11
+ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
12
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
13
+ declare const _default: typeof __VLS_export;
14
+ export default _default;
15
+ type __VLS_WithSlots<T, S> = T & {
16
+ new (): {
17
+ $slots: S;
18
+ };
19
+ };
@@ -0,0 +1,30 @@
1
+ import { Component } from 'vue';
2
+ /**
3
+ * `active` works, `pending` is still changing, `attention` waits for the user,
4
+ * `error` failed, `idle` is not set up or turned off, `unknown` cannot be told.
5
+ */
6
+ export type LinkState = 'active' | 'pending' | 'attention' | 'error' | 'idle' | 'unknown';
7
+ export interface TopologyNode {
8
+ id: string;
9
+ label: string;
10
+ caption?: string;
11
+ icon?: Component;
12
+ }
13
+ export interface TopologyLink {
14
+ state: LinkState;
15
+ /** Short visible text; the state word stands in when it is missing, and an
16
+ * empty string shows none (the lane's accessible name keeps the state word). */
17
+ label?: string;
18
+ /** Replaces the state's glyph, e.g. a key for a sign-in. */
19
+ icon?: Component;
20
+ }
21
+ export interface TopologyLane {
22
+ id: string;
23
+ /** The far end, e.g. the people or devices that connect. */
24
+ source: TopologyNode;
25
+ /** The relay in between; without it the lane is a direct path. */
26
+ via?: TopologyNode;
27
+ /** Source to relay, then relay to the shared target. */
28
+ links: [TopologyLink, TopologyLink];
29
+ disabled?: boolean;
30
+ }
@@ -229,10 +229,10 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
229
229
  draggable: boolean | DataGridDraggable;
230
230
  page: number;
231
231
  pageSize: number;
232
+ selectable: boolean;
232
233
  rowKey: string;
233
234
  defaultSort: DataGridSort | null;
234
235
  selectedKeys: string[];
235
- selectable: boolean;
236
236
  selectOnRowClick: boolean;
237
237
  singleSelect: boolean;
238
238
  localSort: boolean;
@@ -0,0 +1,25 @@
1
+ type __VLS_Props = {
2
+ path: string;
3
+ copyable?: boolean;
4
+ };
5
+ declare var __VLS_16: {};
6
+ type __VLS_Slots = {} & {
7
+ actions?: (props: typeof __VLS_16) => any;
8
+ };
9
+ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
10
+ copied: (path: string) => any;
11
+ copyFailed: () => any;
12
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
13
+ onCopied?: ((path: string) => any) | undefined;
14
+ onCopyFailed?: (() => any) | undefined;
15
+ }>, {
16
+ copyable: boolean;
17
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
18
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
19
+ declare const _default: typeof __VLS_export;
20
+ export default _default;
21
+ type __VLS_WithSlots<T, S> = T & {
22
+ new (): {
23
+ $slots: S;
24
+ };
25
+ };
@@ -1,11 +1,15 @@
1
1
  type __VLS_Props = {
2
2
  title: string;
3
+ /** One paragraph under the title; its width is capped for reading. */
4
+ description?: string;
5
+ /** Shows a skeleton in place of the content and actions while they load. */
6
+ loading?: boolean;
3
7
  collapsible?: boolean;
4
8
  defaultOpen?: boolean;
5
9
  /** Bound with `v-model:open` for controlled collapse. */
6
10
  open?: boolean;
7
11
  };
8
- declare var __VLS_6: {}, __VLS_8: {}, __VLS_10: {}, __VLS_12: {}, __VLS_14: {};
12
+ declare var __VLS_6: {}, __VLS_8: {}, __VLS_10: {}, __VLS_12: {}, __VLS_14: {}, __VLS_21: {}, __VLS_23: {};
9
13
  type __VLS_Slots = {} & {
10
14
  title?: (props: typeof __VLS_6) => any;
11
15
  } & {
@@ -15,7 +19,11 @@ type __VLS_Slots = {} & {
15
19
  } & {
16
20
  actions?: (props: typeof __VLS_12) => any;
17
21
  } & {
18
- default?: (props: typeof __VLS_14) => any;
22
+ description?: (props: typeof __VLS_14) => any;
23
+ } & {
24
+ default?: (props: typeof __VLS_21) => any;
25
+ } & {
26
+ footer?: (props: typeof __VLS_23) => any;
19
27
  };
20
28
  declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
21
29
  "update:open": (value: boolean) => any;
@@ -0,0 +1,29 @@
1
+ import { StepListItem, StepStatus } from './types';
2
+ /**
3
+ * A static, numbered list of steps: instructions to follow or a checklist
4
+ * whose items each carry a status. It does not navigate; see Wizard for that.
5
+ */
6
+ type __VLS_Props = {
7
+ items: StepListItem[];
8
+ /** Status words read to assistive technology. */
9
+ text?: Partial<Record<Exclude<StepStatus, 'pending'>, string>>;
10
+ };
11
+ type __VLS_Slots = {
12
+ description?: (props: {
13
+ item: StepListItem;
14
+ index: number;
15
+ }) => unknown;
16
+ action?: (props: {
17
+ item: StepListItem;
18
+ index: number;
19
+ }) => unknown;
20
+ };
21
+ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
22
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
23
+ declare const _default: typeof __VLS_export;
24
+ export default _default;
25
+ type __VLS_WithSlots<T, S> = T & {
26
+ new (): {
27
+ $slots: S;
28
+ };
29
+ };
@@ -0,0 +1,7 @@
1
+ export type StepStatus = 'done' | 'current' | 'pending' | 'error' | 'warning';
2
+ export interface StepListItem {
3
+ title: string;
4
+ description?: string;
5
+ /** Defaults to `pending`. */
6
+ status?: StepStatus;
7
+ }
@@ -11,18 +11,20 @@ type __VLS_Props = {
11
11
  toggleLabel?: string;
12
12
  /** Where footer actions sit; DSM aligns them to a side, never the centre. */
13
13
  footerAlign?: 'start' | 'end' | 'between';
14
+ /** Shows a skeleton in place of the body and footer while they load. */
15
+ loading?: boolean;
14
16
  };
15
- declare var __VLS_8: {}, __VLS_10: {}, __VLS_17: {}, __VLS_19: {}, __VLS_21: {};
17
+ declare var __VLS_8: {}, __VLS_10: {}, __VLS_22: {}, __VLS_24: {}, __VLS_26: {};
16
18
  type __VLS_Slots = {} & {
17
19
  title?: (props: typeof __VLS_8) => any;
18
20
  } & {
19
21
  'header-actions'?: (props: typeof __VLS_10) => any;
20
22
  } & {
21
- body?: (props: typeof __VLS_17) => any;
23
+ body?: (props: typeof __VLS_22) => any;
22
24
  } & {
23
- default?: (props: typeof __VLS_19) => any;
25
+ default?: (props: typeof __VLS_24) => any;
24
26
  } & {
25
- footer?: (props: typeof __VLS_21) => any;
27
+ footer?: (props: typeof __VLS_26) => any;
26
28
  };
27
29
  declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
28
30
  "update:expanded": (value: boolean) => any;
@@ -24,11 +24,11 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
24
24
  }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
25
25
  "onUpdate:open"?: ((value: boolean) => any) | undefined;
26
26
  }>, {
27
+ offset: number;
27
28
  side: "top" | "right" | "bottom" | "left";
28
29
  align: "start" | "center" | "end";
29
30
  defaultOpen: boolean;
30
31
  open: boolean;
31
- offset: number;
32
32
  disable: boolean;
33
33
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
34
34
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -77,9 +77,9 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
77
77
  onChangePage?: ((payload: PaginationSwitch) => any) | undefined;
78
78
  }>, {
79
79
  modelValue: number;
80
- labels: Partial<PaginationLabels>;
81
80
  end: string | number;
82
81
  mode: "normal" | "less";
82
+ labels: Partial<PaginationLabels>;
83
83
  start: string | number;
84
84
  refresh: boolean;
85
85
  total: string | number;
@@ -48,7 +48,7 @@ declare const __VLS_export: import('vue').DefineComponent<import('vue').ExtractP
48
48
  default: () => string[];
49
49
  };
50
50
  }>> & Readonly<{
51
- "onClick-link"?: ((linkId: string, attrs: Record<string, string>, event: KeyboardEvent | MouseEvent) => any) | undefined;
51
+ "onClick-link"?: ((linkId: string, attrs: Record<string, string>, event: MouseEvent | KeyboardEvent) => any) | undefined;
52
52
  }>, {
53
53
  text: string;
54
54
  parseTags: string[];
@@ -0,0 +1,8 @@
1
+ type __VLS_Props = {
2
+ lines?: number;
3
+ };
4
+ declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
5
+ lines: number;
6
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
7
+ declare const _default: typeof __VLS_export;
8
+ export default _default;
@@ -4,8 +4,8 @@ type __VLS_Props = {
4
4
  radius?: string;
5
5
  };
6
6
  declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
7
- width: string;
8
7
  height: string;
8
+ width: string;
9
9
  radius: string;
10
10
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
11
11
  declare const _default: typeof __VLS_export;
@@ -0,0 +1,13 @@
1
+ type __VLS_Props = {
2
+ tone?: 'neutral' | 'info' | 'success' | 'warning' | 'danger';
3
+ /** Ripple a ring out of the dot, for a state that is still changing. */
4
+ pulse?: boolean;
5
+ /** Names the state for assistive technology; without it the dot is decorative. */
6
+ label?: string;
7
+ };
8
+ declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
9
+ tone: "neutral" | "info" | "success" | "warning" | "danger";
10
+ pulse: boolean;
11
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
12
+ declare const _default: typeof __VLS_export;
13
+ export default _default;
@@ -35,10 +35,10 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
35
35
  measure: typeof measure;
36
36
  }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
37
37
  remove: () => any;
38
- click: (event: KeyboardEvent | MouseEvent) => any;
38
+ click: (event: MouseEvent | KeyboardEvent) => any;
39
39
  }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
40
40
  onRemove?: (() => any) | undefined;
41
- onClick?: ((event: KeyboardEvent | MouseEvent) => any) | undefined;
41
+ onClick?: ((event: MouseEvent | KeyboardEvent) => any) | undefined;
42
42
  }>, {
43
43
  label: string;
44
44
  disabled: boolean;
@@ -43,6 +43,15 @@ export declare const englishUiText: {
43
43
  readonly Info: "Info";
44
44
  readonly Warning: "Warning";
45
45
  readonly Error: "Error";
46
+ readonly Completed: "Completed";
47
+ readonly "Current step": "Current step";
48
+ readonly Connected: "Connected";
49
+ readonly Connecting: "Connecting";
50
+ readonly "Needs attention": "Needs attention";
51
+ readonly Failed: "Failed";
52
+ readonly "Not set up": "Not set up";
53
+ readonly Unknown: "Unknown";
54
+ readonly "No connections": "No connections";
46
55
  readonly Reset: "Reset";
47
56
  readonly Custom: "Custom";
48
57
  readonly Color: "Color";
@@ -129,6 +138,10 @@ export declare const englishUiText: {
129
138
  readonly "Pagination, {total} item total": "Pagination, {total} item total";
130
139
  readonly Notification: "Notification";
131
140
  readonly "Notifications ({hotkey})": "Notifications ({hotkey})";
141
+ readonly "Show password": "Show password";
142
+ readonly "Hide password": "Hide password";
143
+ readonly "Copy path": "Copy path";
144
+ readonly Copied: "Copied";
132
145
  };
133
146
  export type UiTextKey = keyof typeof englishUiText;
134
147
  export type UiTranslator = (key: UiTextKey, values?: Record<string, string | number>) => string;
package/dist/index.d.ts CHANGED
@@ -19,6 +19,7 @@ export { default as MultipleSelect } from './components/primitives/multiple-sele
19
19
  export { default as SuperboxSelect } from './components/primitives/superbox-select/SuperboxSelect.vue';
20
20
  export type { SelectAllowCreate, SelectCreateOptions, SelectOptionGroup, SelectOptions, SelectOptionsRecord, SelectSearch, } from './components/primitives/select/internal/types';
21
21
  export { default as Badge } from './components/primitives/badge/Badge.vue';
22
+ export { default as StatusDot } from './components/primitives/status-dot/StatusDot.vue';
22
23
  export { default as Separator } from './components/primitives/separator/Separator.vue';
23
24
  export { default as Spinner } from './components/primitives/spinner/Spinner.vue';
24
25
  export { default as LoadingMask } from './components/primitives/loading/LoadingMask.vue';
@@ -26,6 +27,7 @@ export { default as LoadingArea } from './components/primitives/loading/LoadingA
26
27
  export { default as LoadingIndicator } from './components/primitives/loading/LoadingIndicator.vue';
27
28
  export { default as Progress } from './components/primitives/progress/Progress.vue';
28
29
  export { default as Skeleton } from './components/primitives/skeleton/Skeleton.vue';
30
+ export { default as SectionSkeleton } from './components/primitives/skeleton/SectionSkeleton.vue';
29
31
  export { default as Surface } from './components/primitives/surface/Surface.vue';
30
32
  export { default as Tooltip } from './components/primitives/tooltip/Tooltip.vue';
31
33
  export { default as Popover } from './components/primitives/popover/Popover.vue';
@@ -103,6 +105,10 @@ export { default as SettingsSection } from './components/composite/settings-sect
103
105
  export { default as Footbar } from './components/composite/footbar/Footbar.vue';
104
106
  export type { FootbarButton, FootbarButtonRegion, FootbarButtonSize, FootbarButtonVariant, } from './components/composite/footbar/types';
105
107
  export { default as Callout } from './components/composite/callout/Callout.vue';
108
+ export { default as StepList } from './components/composite/step-list/StepList.vue';
109
+ export type { StepListItem, StepStatus } from './components/composite/step-list/types';
110
+ export { default as ConnectionTopology } from './components/composite/connection-topology/ConnectionTopology.vue';
111
+ export type { LinkState, TopologyLane, TopologyLink, TopologyNode } from './components/composite/connection-topology/types';
106
112
  export { default as EmptyState } from './components/composite/empty-state/EmptyState.vue';
107
113
  export { default as DataTable } from './components/composite/data-table/DataTable.vue';
108
114
  export type { DataTableColumn } from './components/composite/data-table/DataTable.vue';
@@ -113,6 +119,7 @@ export type { TreeNode, TreeViewCheckPayload, TreeViewDraggableConfig, TreeViewP
113
119
  export { default as FilePicker } from './components/composite/file-picker/FilePicker.vue';
114
120
  export type { FileRejection } from './components/composite/file-picker/FilePicker.vue';
115
121
  export { default as CopyCutField } from './components/composite/copy-cut-field/CopyCutField.vue';
122
+ export { default as PathDisplay } from './components/composite/path-display/PathDisplay.vue';
116
123
  export type { CopyCutFieldAutosize } from './components/composite/copy-cut-field/CopyCutField.vue';
117
124
  export { default as DataView } from './components/composite/data-view/DataView.vue';
118
125
  export { default as VirtualList } from './components/composite/virtual-list/VirtualList.vue';