@synopackageland/ui 0.12.2 → 0.12.4

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,10 +1,25 @@
1
1
  # Changelog
2
2
 
3
- ## 0.12.2 (unreleased)
3
+ ## 0.12.4 (2026-10-20)
4
+
5
+ - Full-page (`web`) layout is flush and compact: the page content sits straight beside the sidebar and under the toolbar, with the same page padding as a DSM window (16px), the DSM window section and field gaps, and the page header's bottom space. The rounded page card around `PageContent` (its border, background, shadow, outer margin and inner padding) is gone for `surface="auto"` and `surface="card"`, and content starts at the left edge instead of centring when capped by `width`. An `AppToolbar` lines up with the page content. `surface="flat"` keeps the canvas behind its own cards. DSM-window and phone layouts are unchanged.
6
+ - New browser check `pnpm check:full-page` (screenshots in en and zh-TW, full page and DSM window, from phone to wide).
7
+ - Visible changes for apps: full-page apps at 1200px or wider show more content and no outer card. An app that relied on the card's inner padding for its own spacing gets the DSM window padding instead; an app that set `--ui-page-padding-x` or `--ui-page-padding-y` keeps its values.
8
+
9
+ ## 0.12.3 (2026-10-19)
10
+
11
+ - Cut text shows its whole text in the UI tooltip, and only when it is cut. A `DataGrid` cell or header that ends in "…" opens a tooltip after the hover delay, or at once on keyboard focus, measured at that moment (`scrollWidth > clientWidth`), so a resized column is right and a large grid adds no observer per cell. It finds the cut text inside rich cells too: a `CellText` link, a `PathDisplay` folder (icon and name), a `CellStatus` label. A cell that fits shows nothing. The native `title` on grid cells, headers, `CellText`, `CellStatus` and `PathDisplay` is gone, so one tooltip shows, not two.
12
+ - New `DataGridColumn.tooltip`: `false` turns the cell tooltip off for a column, a function `(row) => string` names the whole text itself. `headerTooltip: false` does the same for the header. An element in a cell can set `data-ui-tooltip-text` (its whole text), `data-ui-tooltip-hint` (a tooltip it shows even when not cut) or `data-ui-tooltip-off`; an element with its own `title` keeps it.
13
+ - New `OverflowTooltip` (exported): the same behaviour for an app's own list or region; wrap it, or point `target` at its element.
14
+ - `CellText` with `openLabel` shows the action in the UI tooltip, after the whole name when the name is cut. `PathDisplay display="name"` still names the whole path on hover; the framed path only when it is cut.
15
+ - `MultipleSelect` and `SuperboxSelect` lists: every row has a checkbox at the left, checked when chosen; the row under the pointer or keyboard gets a neutral grey tint (`--ui-neutral-soft`) and keeps its text colour, no more blue text on blue. "+N" is a quiet count chip whose tooltip names the hidden values, one per line; a cut tag names itself. `Select` and the single `Combobox`: the chosen row keeps its check and the selected tint, the active row the same grey tint, never blue text.
16
+ - New browser check `pnpm check:truncation` (before/after screenshots in en and zh-TW).
17
+ - Visible changes for apps: tooltips on cut cells and headers; the select lists described above. An app that set its own `title` on a cell slot keeps it; it can drop it now.
18
+
19
+ ## 0.12.2 (2026-10-19)
4
20
 
5
21
  - Remove environment-specific release notes and source comments from distributed content.
6
22
  - Prepare npm releases from a clean package directory without local archive references.
7
- - 清理發佈內容中的環境識別敘述;以乾淨套件目錄準備 npm 發佈。
8
23
 
9
24
  ## 0.12.1 (2026-10-19)
10
25
 
@@ -4,7 +4,7 @@ type __VLS_Props = {
4
4
  minHeight?: string;
5
5
  /** Disable responsive layout if an application deliberately manages it itself. */
6
6
  responsive?: boolean;
7
- /** `web` opts a full-page Portal into the spacious layout at 1200px or wider; DSM windows keep `window`. */
7
+ /** `web` opts a full-page Portal into the full-page layout at 1200px or wider; DSM windows keep `window`. */
8
8
  wideLayout?: WideLayout;
9
9
  /** Remembers the web sidebar's width and collapse under `${key}:app-sidebar`; use an app-unique key. */
10
10
  sidebarStorageKey?: 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
- /** Web/portal mode uses a page surface by default. Set flat for card-based dashboards. */
7
+ /** Web/portal mode puts the page flush on a white content area (`auto`, `card`). Set flat for card-based dashboards on the canvas. */
8
8
  surface?: 'auto' | 'flat' | 'card';
9
9
  /**
10
10
  * `'fill'` takes the container's height and does not scroll: the header,
@@ -15,6 +15,14 @@ export type DataGridColumn = {
15
15
  flex?: number;
16
16
  /** Wraps the cell text instead of cutting it to one line with an ellipsis. */
17
17
  wrap?: boolean;
18
+ /**
19
+ * A cell cut with an ellipsis shows its whole text in a tooltip on hover or
20
+ * keyboard focus. `false` turns that off for this column's cells; a function
21
+ * names the whole text itself (a link or a rich cell).
22
+ */
23
+ tooltip?: boolean | ((row: Record<string, unknown>) => string | undefined);
24
+ /** `false` keeps a cut header label from naming itself in a tooltip. */
25
+ headerTooltip?: boolean;
18
26
  /** `false` keeps the column shown: the column chooser cannot hide it. */
19
27
  hideable?: boolean;
20
28
  /** Starts hidden; the user can show it from the column chooser. */
@@ -42,11 +42,11 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
42
42
  }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
43
43
  select: (node: TreeNode) => any;
44
44
  "update:modelValue": (value: string | string[] | undefined) => any;
45
- "update:checkedKeys": (value: string[]) => any;
46
45
  load: (payload: {
47
46
  node: TreeNode;
48
47
  children: TreeNode[];
49
48
  }) => any;
49
+ "update:checkedKeys": (value: string[]) => any;
50
50
  reorder: (payload: {
51
51
  node: TreeNode;
52
52
  target: TreeNode;
@@ -61,11 +61,11 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
61
61
  }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
62
62
  onSelect?: ((node: TreeNode) => any) | undefined;
63
63
  "onUpdate:modelValue"?: ((value: string | string[] | undefined) => any) | undefined;
64
- "onUpdate:checkedKeys"?: ((value: string[]) => any) | undefined;
65
64
  onLoad?: ((payload: {
66
65
  node: TreeNode;
67
66
  children: TreeNode[];
68
67
  }) => any) | undefined;
68
+ "onUpdate:checkedKeys"?: ((value: string[]) => any) | undefined;
69
69
  onReorder?: ((payload: {
70
70
  node: TreeNode;
71
71
  target: TreeNode;
@@ -32,9 +32,9 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {},
32
32
  }>, {
33
33
  title: string | false;
34
34
  open: boolean;
35
- tone: NotificationTone;
36
- content: string | false;
37
35
  cancel: NotificationAction;
36
+ content: string | false;
37
+ tone: NotificationTone;
38
38
  duration: number | false;
39
39
  confirm: NotificationAction;
40
40
  paused: boolean;
@@ -0,0 +1,30 @@
1
+ import { CutText } from '../../../lib/truncation';
2
+ type __VLS_Props = {
3
+ /** The region's element; without it the tooltip wraps its slot. */
4
+ target?: HTMLElement | null;
5
+ side?: 'top' | 'right' | 'bottom' | 'left';
6
+ /** `start` lines the tooltip up with the start of the cut text it completes. */
7
+ align?: 'start' | 'center' | 'end';
8
+ delay?: number;
9
+ /** Replaces the whole text of a cut element; `false` shows nothing for it. */
10
+ resolve?: (found: CutText) => string | false | undefined;
11
+ };
12
+ declare var __VLS_1: {};
13
+ type __VLS_Slots = {} & {
14
+ default?: (props: typeof __VLS_1) => any;
15
+ };
16
+ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
17
+ target: HTMLElement | null;
18
+ side: "top" | "right" | "bottom" | "left";
19
+ align: "start" | "center" | "end";
20
+ delay: number;
21
+ resolve: (found: CutText) => string | false | undefined;
22
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
23
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
24
+ declare const _default: typeof __VLS_export;
25
+ export default _default;
26
+ type __VLS_WithSlots<T, S> = T & {
27
+ new (): {
28
+ $slots: S;
29
+ };
30
+ };
@@ -0,0 +1 @@
1
+ export declare const TOOLTIP_CONTENT_CLASS = "z-[1100] max-w-72 rounded-[var(--ui-radius-sm)] bg-[var(--ui-tooltip-bg)] px-2.5 py-1.5 text-[12px] leading-4 text-[var(--ui-tooltip-fg)] whitespace-pre-line shadow-[var(--ui-shadow-menu)] [overflow-wrap:anywhere] animate-[ui-fade-in_var(--ui-motion-fast)_var(--ui-motion-ease)]";
package/dist/index.d.ts CHANGED
@@ -34,6 +34,7 @@ export { default as Skeleton } from './components/primitives/skeleton/Skeleton.v
34
34
  export { default as SectionSkeleton } from './components/primitives/skeleton/SectionSkeleton.vue';
35
35
  export { default as Surface } from './components/primitives/surface/Surface.vue';
36
36
  export { default as Tooltip } from './components/primitives/tooltip/Tooltip.vue';
37
+ export { default as OverflowTooltip } from './components/primitives/tooltip/OverflowTooltip.vue';
37
38
  export { default as Popover } from './components/primitives/popover/Popover.vue';
38
39
  export { default as DropdownMenu } from './components/primitives/dropdown-menu/DropdownMenu.vue';
39
40
  export type { DropdownMenuEntry } from './components/primitives/dropdown-menu/DropdownMenu.vue';