@synopackageland/ui 0.20.0 → 0.20.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 +12 -0
- package/README.md +7 -6
- package/dist/components/app/app-toolbar/AppToolbar.vue.d.ts +3 -3
- package/dist/components/app/page-content/PageContent.vue.d.ts +1 -1
- package/dist/components/app/page-header/PageHeader.vue.d.ts +3 -3
- package/dist/components/composite/callout/Callout.vue.d.ts +10 -5
- package/dist/components/composite/callout/CalloutRecall.vue.d.ts +3 -0
- package/dist/components/composite/callout/CalloutRecallList.vue.d.ts +3 -0
- package/dist/components/composite/callout/calloutDismissal.d.ts +37 -0
- package/dist/components/containers/list-detail/ListDetail.vue.d.ts +52 -0
- package/dist/i18n/text.d.ts +2 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +8392 -8086
- package/dist/json-ai-prompt.md +1 -1
- package/dist/json-catalog.schema.json +1 -1
- package/dist/json-preview/preview.js +6098 -5939
- package/dist/json.js +9 -9
- package/dist/reka-runtime.json +1 -1
- package/dist/theme.css +1 -1
- package/dist/themes/dsm7-embedded-theme.css +1 -1
- package/dist/themes/dsm7-embedded.css +1 -1
- package/dist/themes/dsm7.css +1 -1
- package/docs/adaptive-layout.md +8 -1
- package/docs/app-local-modal.md +4 -4
- package/docs/callout.md +61 -23
- package/docs/{component-defaults-0.5.7.md → component-defaults.md} +1 -1
- package/docs/json-ui.md +2 -2
- package/docs/theme-hooks.md +3 -2
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.20.2 (2026-11-04)
|
|
4
|
+
|
|
5
|
+
- List pages stay white when a detail pane opens, even while another App built with an older release is open in the same DSM session
|
|
6
|
+
- Add `ListDetail`: the list with the selected item's detail beside it in a bordered white pane. Drag the separator or use the arrow, Home and End keys to resize it; double click resets the width. The width is remembered per App and `storageKey`, and the pane moves above the list in narrow windows
|
|
7
|
+
|
|
8
|
+
## 0.20.1 (2026-11-04)
|
|
9
|
+
|
|
10
|
+
- List pages stay white when a detail pane opens beside a `DataGrid`: the pane keeps its 1px border with no card shadow, and the selected row shows DSM's light blue.
|
|
11
|
+
- `Callout` spans its container, is one form row high with the icon, text, action button and close button centred, and drops the top gradient band.
|
|
12
|
+
- A closed `Callout` is remembered in browser storage (keyed by App and `dismissKey`, or by page, tone and text) and leaves no empty row; it shows again when its text or state changes. A `danger` callout is hidden for the page load only.
|
|
13
|
+
- Closed callouts are listed under the page's single info button, each with a button to show it again.
|
|
14
|
+
|
|
3
15
|
## 0.20.0 (2026-11-04)
|
|
4
16
|
|
|
5
17
|
- `PageContent height="fill"` gives its height to a `SectionTabs fill` or a `SettingsPage` however deeply the App wraps it: every element between the page body and that component becomes a flex column that takes the room its siblings leave, so an App needs no CSS of its own to pass the height through its page wrappers. A hidden wrapper (`v-show`, `hidden`) stays hidden.
|
package/README.md
CHANGED
|
@@ -167,7 +167,7 @@ portal (Dialog, Sheet, Toast, Popover, Select, DropdownMenu, ContextMenu,
|
|
|
167
167
|
Tooltip) into itself, not `document.body`, where the scoped tokens
|
|
168
168
|
and reset would not reach them. Each `AppRoot` teleports into its own element;
|
|
169
169
|
theme and density tokens on sibling roots reach their own portals. By default
|
|
170
|
-
(`modal-scope="app"
|
|
170
|
+
(`modal-scope="app"`) each root owns its Dialog/Sheet and popup
|
|
171
171
|
layers and never mutates `document.body`, so give it a bounded size such as
|
|
172
172
|
`style="height: 100%"`. A full-page web or Portal app that wants document-wide
|
|
173
173
|
modality passes `modal-scope="document"` (see below).
|
|
@@ -388,7 +388,7 @@ Without a listener the existing logo/name markup stays unchanged. The `brand`
|
|
|
388
388
|
slot replaces the default brand and owns its own interaction; it is never
|
|
389
389
|
wrapped in a button. A DSM window's title bar remains managed by DSM.
|
|
390
390
|
|
|
391
|
-
`navigation="top"`
|
|
391
|
+
`navigation="top"` lays the `sidebar` slot out as one bar above the
|
|
392
392
|
page instead of a left column: the brand, then the `AppSidebar` items in a row
|
|
393
393
|
(a row with children opens them in a menu; the bar scrolls sideways when the
|
|
394
394
|
items run out of room), then `sidebar-footer`. It applies in the DSM-window
|
|
@@ -407,7 +407,7 @@ forward it before an app can choose it through that shell.
|
|
|
407
407
|
For standalone content that owns its layout, use `<PageContent surface="none" height="fill">`.
|
|
408
408
|
It removes the page's horizontal gutters and adds no surface in web, DSM-window
|
|
409
409
|
or phone layouts. The default `surface="auto"` remains unchanged; `flat` keeps
|
|
410
|
-
the dashboard canvas.
|
|
410
|
+
the dashboard canvas. `auto` has no outer page card in web
|
|
411
411
|
mode. Child components keep their own styling and spacing. The JSON `Page`
|
|
412
412
|
component accepts the same `surface="none"` option. SDK `AppShell` is a separate
|
|
413
413
|
package: if it creates `PageContent` internally, it must expose/forward this
|
|
@@ -498,7 +498,7 @@ tones (`--ui-success`, …).
|
|
|
498
498
|
|
|
499
499
|
**Theme hooks.** The `data-ui-*` and `data-*` attributes and the layout tokens
|
|
500
500
|
listed in [docs/theme-hooks.md](docs/theme-hooks.md) are public API with
|
|
501
|
-
stability rules
|
|
501
|
+
stability rules: `--ui-icon-size`, `--ui-heading-weight`,
|
|
502
502
|
`--ui-card-padding`, the top bar's `--ui-top-nav-*` and the phone bar's
|
|
503
503
|
`--ui-mobile-bar-*`, `Button`'s `data-variant`, the layout regions
|
|
504
504
|
(`data-ui-layout-sidebar`, `data-ui-layout-main`, `data-ui-mobile-navigation`,
|
|
@@ -546,6 +546,7 @@ DSM-style application building blocks:
|
|
|
546
546
|
- TimelineRow (one event in a list) / NewItemsPill (a floating "N new" pill) / SectionSkeleton `variant="lines" | "figures" | "rows"`
|
|
547
547
|
- FacetPanel (filter groups with counts; a bottom sheet on a phone) / TagEditor (tags edited in place, saved optimistically)
|
|
548
548
|
- SplitPane / StorageMeter / StackedBar (see [docs/size-and-split.md](docs/size-and-split.md))
|
|
549
|
+
- ListDetail (a list with the selected item's detail beside it, the pane's width set by dragging and remembered; see [docs/list-detail.md](docs/list-detail.md))
|
|
549
550
|
|
|
550
551
|
`Tabs` and `SectionTabs` move a raised selection notch in 120ms. Selected labels
|
|
551
552
|
are blue; main labels are bold 14px and section labels bold 13px. `Tabs` fades its
|
|
@@ -1127,7 +1128,7 @@ Linux motion 使用 `MOTION_BROWSER=playwright`,本機預設 ego-browser 保
|
|
|
1127
1128
|
本機只送工作樹並等待;未設時照舊在本機跑。`check:local-browser` 仍在本機用 ego-browser。
|
|
1128
1129
|
|
|
1129
1130
|
|
|
1130
|
-
## Form controls and compact settings
|
|
1131
|
+
## Form controls and compact settings
|
|
1131
1132
|
|
|
1132
1133
|
`Form` and standalone `FormItem` default to `direction="auto"`. They use the
|
|
1133
1134
|
container's width, including a DSM package window, and stack labels below 520px.
|
|
@@ -1210,7 +1211,7 @@ DatePicker's calendar inherits Provider locale unless its own Intl `locale` is
|
|
|
1210
1211
|
supplied. Caller-owned option labels, content, URLs, rules' custom messages and
|
|
1211
1212
|
business terminology stay caller-owned. Validation fallbacks use the locale at
|
|
1212
1213
|
validation time; imperative message-box default titles use the locale at opening.
|
|
1213
|
-
See [the complete default-text and container audit](docs/component-defaults
|
|
1214
|
+
See [the complete default-text and container audit](docs/component-defaults.md).
|
|
1214
1215
|
|
|
1215
1216
|
`KeyValueRow` renders a `dl` with `dt`/`dd`; its default slot accepts rich values,
|
|
1216
1217
|
including Link. The `Wizard` step list shows the registered steps and does not
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
type __VLS_Props = {
|
|
2
2
|
height?: string;
|
|
3
3
|
};
|
|
4
|
-
declare var __VLS_1: {},
|
|
4
|
+
declare var __VLS_1: {}, __VLS_8: {}, __VLS_10: {};
|
|
5
5
|
type __VLS_Slots = {} & {
|
|
6
6
|
leading?: (props: typeof __VLS_1) => any;
|
|
7
7
|
} & {
|
|
8
|
-
default?: (props: typeof
|
|
8
|
+
default?: (props: typeof __VLS_8) => any;
|
|
9
9
|
} & {
|
|
10
|
-
actions?: (props: typeof
|
|
10
|
+
actions?: (props: typeof __VLS_10) => any;
|
|
11
11
|
};
|
|
12
12
|
declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
13
13
|
height: string;
|
|
@@ -4,7 +4,7 @@ type __VLS_Props = {
|
|
|
4
4
|
* `--ui-page-readable-width`; any other value is a CSS maximum width.
|
|
5
5
|
*/
|
|
6
6
|
width?: 'fill' | 'readable' | (string & {});
|
|
7
|
-
/** card uses the white content area; flat uses the page grey; auto is white unless the page holds a card, then grey like flat. none adds no surface or horizontal gutters, for content that owns its layout at every width. */
|
|
7
|
+
/** card uses the white content area; flat uses the page grey; auto is white unless the page holds a card, then grey like flat; a list page (a DataGrid on the page, outside any card) stays white when a pane opens beside it. none adds no surface or horizontal gutters, for content that owns its layout at every width. */
|
|
8
8
|
surface?: 'auto' | 'flat' | 'card' | 'none';
|
|
9
9
|
/**
|
|
10
10
|
* `'fill'` takes the container's height and does not scroll: the header,
|
|
@@ -3,11 +3,11 @@ type __VLS_Props = {
|
|
|
3
3
|
description?: string;
|
|
4
4
|
sticky?: boolean;
|
|
5
5
|
};
|
|
6
|
-
declare var
|
|
6
|
+
declare var __VLS_6: {}, __VLS_8: {};
|
|
7
7
|
type __VLS_Slots = {} & {
|
|
8
|
-
meta?: (props: typeof
|
|
8
|
+
meta?: (props: typeof __VLS_6) => any;
|
|
9
9
|
} & {
|
|
10
|
-
actions?: (props: typeof
|
|
10
|
+
actions?: (props: typeof __VLS_8) => any;
|
|
11
11
|
};
|
|
12
12
|
declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
13
13
|
sticky: boolean;
|
|
@@ -8,17 +8,22 @@ type __VLS_Props = {
|
|
|
8
8
|
variant?: 'soft' | 'inline' | 'hint';
|
|
9
9
|
title?: string;
|
|
10
10
|
/**
|
|
11
|
-
* Shows a close button (default). Closing hides the callout
|
|
12
|
-
* tone, title or text
|
|
13
|
-
*
|
|
11
|
+
* Shows a close button (default). Closing hides the callout, also after a
|
|
12
|
+
* reload, until its tone, title or text changes; a `danger` callout is
|
|
13
|
+
* hidden for this page load only. The page's info button lists it to show
|
|
14
|
+
* again. Turn it off only for a state that must stay in view, such as a
|
|
15
|
+
* blocking setup requirement.
|
|
14
16
|
*/
|
|
15
17
|
dismissible?: boolean;
|
|
16
|
-
/**
|
|
18
|
+
/**
|
|
19
|
+
* A stable id for the callout within the App (e.g. `'recycle-bin-dsm-hint'`), under which
|
|
20
|
+
* its dismissal is stored. Without it the id is drawn from the page path, the tone and the text.
|
|
21
|
+
*/
|
|
17
22
|
dismissKey?: string;
|
|
18
23
|
closeLabel?: string;
|
|
19
24
|
/** A machine code (e.g. `login_wait_timeout`), shown after the message in a quieter style. */
|
|
20
25
|
code?: string;
|
|
21
|
-
/**
|
|
26
|
+
/** @deprecated A Callout spans its container by default; `--ui-callout-max-width` caps it. */
|
|
22
27
|
fill?: boolean;
|
|
23
28
|
/** The toggle for the `details` slot. */
|
|
24
29
|
moreLabel?: string;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const __VLS_export: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const __VLS_export: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Component } from 'vue';
|
|
2
|
+
/** FNV-1a, 32 bits, as 8 hex digits: a short, stable name for a text. */
|
|
3
|
+
export declare function hashText(text: string): string;
|
|
4
|
+
/** The App a dismissal belongs to: the DSM package, else the page's host and directory. */
|
|
5
|
+
export declare function appScope(): string;
|
|
6
|
+
/** The storage key of a callout: the App's id for it, or one drawn from the page, the tone and the text. */
|
|
7
|
+
export declare function dismissalKey(dismissKey: string | undefined, tone: string, text: string): string;
|
|
8
|
+
export declare function isDismissed(key: string, signature: string): boolean;
|
|
9
|
+
export declare function rememberDismissal(key: string, signature: string, persist: boolean): void;
|
|
10
|
+
export declare function forgetDismissal(key: string): void;
|
|
11
|
+
/** A closed callout that is still on the page, as the info button lists it. */
|
|
12
|
+
export interface HiddenCallout {
|
|
13
|
+
tone: 'info' | 'success' | 'warning' | 'danger';
|
|
14
|
+
icon: Component;
|
|
15
|
+
label: string;
|
|
16
|
+
restore: () => void;
|
|
17
|
+
}
|
|
18
|
+
export declare const hiddenCallouts: import('vue').ShallowReactive<Map<number, HiddenCallout>>;
|
|
19
|
+
export declare function registerHiddenCallout(entry: HiddenCallout): () => void;
|
|
20
|
+
type Host = {
|
|
21
|
+
kind: 'info' | 'chrome';
|
|
22
|
+
id: symbol;
|
|
23
|
+
};
|
|
24
|
+
export declare function registerRecallHost(kind: Host['kind']): {
|
|
25
|
+
id: symbol;
|
|
26
|
+
unregister: () => void;
|
|
27
|
+
};
|
|
28
|
+
export declare const activeRecallHost: import('vue').ComputedRef<symbol | null>;
|
|
29
|
+
/**
|
|
30
|
+
* For a toolbar or a page header: whether it shows its own info button for the
|
|
31
|
+
* closed callouts (CalloutRecall). Only the first one mounted does, and only
|
|
32
|
+
* while no info button already there (a page's notes) lists them.
|
|
33
|
+
*/
|
|
34
|
+
export declare function useCalloutRecallHost(): import('vue').ComputedRef<boolean>;
|
|
35
|
+
/** Tests only: forget this page load's dismissals, as a reload does. */
|
|
36
|
+
export declare function resetSessionDismissals(): void;
|
|
37
|
+
export {};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
/** Shows the pane; by default it shows while the `detail` slot is given. */
|
|
3
|
+
open?: boolean;
|
|
4
|
+
/** The pane's heading; with it the pane has a header with a Close button. */
|
|
5
|
+
title?: string;
|
|
6
|
+
/** Shows the Close button in the header. */
|
|
7
|
+
closable?: boolean;
|
|
8
|
+
/** The pane's width before the user sets one: a share of the room (0–1) or px. A share is kept between 400px and 640px. */
|
|
9
|
+
defaultWidth?: number;
|
|
10
|
+
/** The pane's minimum width in px. */
|
|
11
|
+
minWidth?: number;
|
|
12
|
+
/** The list's minimum width in px; the pane never grows into it. */
|
|
13
|
+
listMinWidth?: number;
|
|
14
|
+
/** Names this pane among the App's panes for the remembered width (with the App it runs in). */
|
|
15
|
+
storageKey?: string;
|
|
16
|
+
/** The separator's accessible name. */
|
|
17
|
+
label?: string;
|
|
18
|
+
};
|
|
19
|
+
/** Goes back to the default width and forgets the remembered one. */
|
|
20
|
+
declare function reset(): void;
|
|
21
|
+
declare var __VLS_1: {}, __VLS_3: {}, __VLS_13: {};
|
|
22
|
+
type __VLS_Slots = {} & {
|
|
23
|
+
default?: (props: typeof __VLS_1) => any;
|
|
24
|
+
} & {
|
|
25
|
+
header?: (props: typeof __VLS_3) => any;
|
|
26
|
+
} & {
|
|
27
|
+
detail?: (props: typeof __VLS_13) => any;
|
|
28
|
+
};
|
|
29
|
+
declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
30
|
+
reset: typeof reset;
|
|
31
|
+
}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
32
|
+
close: () => any;
|
|
33
|
+
}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
34
|
+
onClose?: (() => any) | undefined;
|
|
35
|
+
}>, {
|
|
36
|
+
label: string;
|
|
37
|
+
title: string;
|
|
38
|
+
open: boolean;
|
|
39
|
+
minWidth: number;
|
|
40
|
+
closable: boolean;
|
|
41
|
+
storageKey: string;
|
|
42
|
+
defaultWidth: number;
|
|
43
|
+
listMinWidth: number;
|
|
44
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
45
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
46
|
+
declare const _default: typeof __VLS_export;
|
|
47
|
+
export default _default;
|
|
48
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
49
|
+
new (): {
|
|
50
|
+
$slots: S;
|
|
51
|
+
};
|
|
52
|
+
};
|
package/dist/i18n/text.d.ts
CHANGED
|
@@ -52,6 +52,8 @@ export declare const englishUiText: {
|
|
|
52
52
|
readonly "Opens in a new tab": "Opens in a new tab";
|
|
53
53
|
readonly Download: "Download";
|
|
54
54
|
readonly Close: "Close";
|
|
55
|
+
readonly "Hidden notices": "Hidden notices";
|
|
56
|
+
readonly "Show again": "Show again";
|
|
55
57
|
readonly Cancel: "Cancel";
|
|
56
58
|
readonly Confirm: "Confirm";
|
|
57
59
|
readonly OK: "OK";
|
package/dist/index.d.ts
CHANGED
|
@@ -231,6 +231,7 @@ export { default as AppActionBar } from './components/app/app-action-bar/AppActi
|
|
|
231
231
|
export { default as PageHeader } from './components/app/page-header/PageHeader.vue';
|
|
232
232
|
export { default as PageToolbar } from './components/app/page-toolbar/PageToolbar.vue';
|
|
233
233
|
export { default as SplitPane } from './components/containers/split-pane/SplitPane.vue';
|
|
234
|
+
export { default as ListDetail } from './components/containers/list-detail/ListDetail.vue';
|
|
234
235
|
export { default as StorageMeter } from './components/composite/storage-meter/StorageMeter.vue';
|
|
235
236
|
export type { StorageMeterLabels } from './components/composite/storage-meter/StorageMeter.vue';
|
|
236
237
|
export { default as StackedBar } from './components/composite/stacked-bar/StackedBar.vue';
|