@synopackageland/ui 0.12.4 → 0.13.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.
Files changed (47) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +18 -0
  3. package/dist/components/advanced-panel/AdvancePanelGrid.vue.d.ts +5 -5
  4. package/dist/components/app/page-content/PageContent.vue.d.ts +3 -3
  5. package/dist/components/composite/about-dialog/AboutDialog.vue.d.ts +5 -4
  6. package/dist/components/composite/about-dialog/types.d.ts +3 -2
  7. package/dist/components/composite/connection-topology/ConnectionTopology.vue.d.ts +3 -0
  8. package/dist/components/composite/data-grid/DataGrid.vue.d.ts +1 -1
  9. package/dist/components/composite/data-table/DataTable.vue.d.ts +6 -3
  10. package/dist/components/composite/overflow-toolbar/overflow.d.ts +3 -1
  11. package/dist/components/composite/scroll-edges/ScrollEdges.vue.d.ts +8 -1
  12. package/dist/components/composite/tree-view/TreeView.vue.d.ts +7 -5
  13. package/dist/components/composite/virtual-list/VirtualList.vue.d.ts +2 -0
  14. package/dist/components/containers/card-grid/cardGrid.d.ts +2 -2
  15. package/dist/components/containers/expandable-item/ExpandableItem.vue.d.ts +7 -7
  16. package/dist/components/primitives/color-picker/ColorPicker.vue.d.ts +4 -4
  17. package/dist/components/primitives/context-menu/ContextMenu.vue.d.ts +2 -2
  18. package/dist/components/primitives/context-menu/ContextMenuItems.vue.d.ts +5 -1
  19. package/dist/components/primitives/dropdown-menu/DropdownMenu.vue.d.ts +3 -0
  20. package/dist/components/primitives/dropdown-menu/DropdownMenuItems.vue.d.ts +3 -0
  21. package/dist/components/primitives/dropdown-menu/types.d.ts +3 -0
  22. package/dist/components/primitives/pagination/Pagination.vue.d.ts +3 -0
  23. package/dist/components/primitives/segment-control/SegmentControl.vue.d.ts +4 -0
  24. package/dist/components/primitives/segment-control/SegmentItem.vue.d.ts +1 -1
  25. package/dist/components/primitives/segment-control/context.d.ts +3 -0
  26. package/dist/components/primitives/spinner/Spinner.vue.d.ts +3 -0
  27. package/dist/components/primitives/tooltip/OverflowTooltip.vue.d.ts +3 -0
  28. package/dist/components/primitives/tooltip/Tooltip.vue.d.ts +5 -2
  29. package/dist/components/primitives/tooltip/tooltipStyle.d.ts +1 -1
  30. package/dist/components/primitives/typography/TypoHeader.vue.d.ts +3 -0
  31. package/dist/composables/formControl.d.ts +1 -0
  32. package/dist/composables/scrollEdges.d.ts +8 -4
  33. package/dist/i18n/text.d.ts +1 -0
  34. package/dist/index.js +12400 -11996
  35. package/dist/json/catalog.d.ts +12 -10
  36. package/dist/json/registry.d.ts +204 -170
  37. package/dist/json-ai-prompt.md +1 -1
  38. package/dist/json-catalog.schema.json +2 -1
  39. package/dist/json-preview/preview.js +7104 -7011
  40. package/dist/json.js +1 -1
  41. package/dist/reka-runtime.json +1 -1
  42. package/dist/theme.css +1 -1
  43. package/dist/themes/dsm7-embedded-theme.css +1 -1
  44. package/dist/themes/dsm7-embedded.css +1 -1
  45. package/dist/themes/dsm7.css +1 -1
  46. package/docs/adaptive-layout.md +7 -1
  47. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,41 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.13.0 (2026-10-20)
4
+
5
+ - Fix `SegmentControl variant="sheet"`: the selected tab keeps the content surface and accent text. Unselected background and text classes now apply only to unselected tabs, so stylesheet order cannot make the selected tab grey again (#16).
6
+ - Component visual audit (#17): address 194 findings across controls, navigation, menus, feedback, containers and app layouts, and add a state gallery and checklist. The changes include clearer focus, disabled, invalid and selected states, long-label handling, spacing and narrow layouts. The audit's fixes passed automated checks; they were not rechecked with screenshots.
7
+ - Add opt-in `Spinner inline`, `TypoHeader anchorPlacement`, `ScrollEdges axis`, `ConnectionTopology selectedLane` and `Tooltip openOnTap`; add `#empty` slots to `VirtualList` and `TreeView`. `DataTable mobileView="container"` chooses cards from its measured container width, with `containerBreakpoint` (default 480px). Existing defaults for these additions stay unchanged.
8
+ - `AboutDialog fetchVersion` can return `{ upToDate: true }` for a successful check with no newer version; the message is available in all nine built-in languages. An empty result still means the check failed.
9
+ - Fix DSM-window CSS rescoping: selectors beginning with a tag name, such as `label:has(...)`, remain valid instead of losing their rules during the build.
10
+
11
+ ### Visible changes for apps
12
+
13
+ These defaults change from 0.12.5, so this release advances the minor version. Existing opt-outs are listed below; changes without a compatibility switch need an app-owned layout, event handler or CSS override.
14
+
15
+ - `Pagination` groups numbers using the active locale. Use `:group-digits="false"` for ungrouped digits.
16
+ - `DropdownMenu` radio entries use a dot. Set `radio-indicator="check"` to keep the previous check mark.
17
+ - `OverflowTooltip` opens the full text on a touch or pen tap on truncated text; a second tap or a tap elsewhere closes it. Use `:open-on-tap="false"` to keep hover and keyboard focus only. Plain `Tooltip` still defaults to `openOnTap: false`.
18
+ - Vertical `ToggleButtonGroup` buttons stretch to equal widths. Add `class="items-start"` to restore content-sized buttons.
19
+ - `Dialog` initially focuses the first enabled focusable element other than its header close button, or the panel when none exists. To restore close-button focus, handle `@open-auto-focus`, call `event.preventDefault()` and focus `event.target.querySelector('[data-dialog-close]')` in the handler.
20
+ - `Combobox` with `allowCreate` creates a typed label without an exact match on Enter instead of accepting the automatically highlighted first result. Moving the highlight deliberately still selects that result. There is no legacy Enter switch; use `:allow-create="false"` to disable creation, or provide app-owned keyboard handling when both creation and the old selection rule are required. Reopening a selected combobox also shows the full list instead of filtering by its mirrored label.
21
+ - Empty `AdvancePanelGrid` now displays the localized “No data” message. Supply `<template #empty-body><span /></template>` to retain a blank message area, or put an app-owned empty message in that slot.
22
+ - Height-constrained `Panel` bodies scroll even with `scrollable` unset or false. There is no legacy switch; app code can use the exposed `getScrollEl()` to restore `overflow: visible; min-height: auto` if an outer container must own scrolling.
23
+ - In a collapsed `AppSidebar`, rows without icons are hidden and a hidden selection marks its nearest visible ancestor. Supply an icon on every row that must remain reachable in the rail, or keep the sidebar expanded. Group headings now use `--ui-text-secondary`; an app stylesheet can restore `color: rgba(65,75,85,0.5)` on its `[data-nav-group-label]` elements.
24
+ - `DataGrid` cells reserve `calc(var(--ui-grid-row-height) + 1px)`, changing the default desktop row from 28px to 29px. To retain a 28px minimum, set `--ui-grid-row-height: 27px` on the grid; rows with taller content can still grow. The theme token itself remains 28px by default.
25
+ - `Button` wraps its slot in a label span and truncates long labels. Update selectors that assumed a direct-child label or icon. There is no legacy DOM switch; app CSS can restore label `overflow: visible; text-overflow: clip` and override the button's `max-width` when overflow is intentional.
26
+ - With a coarse pointer and no explicit `data-ui-density`, small/medium control tokens become 32px and grid row/header tokens become 36px; text inputs and textareas use the 16px title font tier. Set `data-ui-density="default"` on the theme root to retain desktop control/grid tokens and input font sizing. Slider touch padding and mobile Dialog/Sheet header/footer hit areas have separate rules; those need targeted app CSS if the old sizes are required.
27
+ - `Footbar` stacks its three regions below 28rem of container width and lets buttons wrap. There is no legacy layout prop; use app-owned footer markup to retain three columns at narrow widths.
28
+ - The popups changed by the audit (including menus, selects, date/color pickers, popovers, tooltips and validation tips) use `z-index: 1450` to share a layer. There is no global legacy-layer token; adjust the specific popup in app CSS if it must interleave with app-owned overlays. This is not a change to every overlay: `ContextMenu`, Dialog/Sheet, notifications and toasts retain their separate layers.
29
+
30
+ ## 0.12.5 (2026-10-20)
31
+
32
+ - `DropdownMenu` label column: a plain action menu no longer reserves an empty check-mark slot before every label, so its labels start at the left edge. The slot is kept, for every entry of that level, when any entry can show a check mark, an indicator or an icon; an unchecked checkbox or radio now keeps its slot, so its label lines up with the rest. All entries share the same 10px side padding. The menu's 11rem minimum width now holds (it resolved against a content-sized popper and collapsed short menus to their labels), still capped by the viewport.
33
+ - `DropdownMenuEntry.icon`: an optional leading icon component for an item or submenu entry (pencil, copy, trash). It sits in the label slot in secondary text, or the danger colour on a `danger` entry; a check mark takes precedence.
34
+ - `SegmentControl variant="sheet"`: joined sheet tabs on a rule, for the views and forms over a table. Unselected tabs sit on the subtle surface in secondary text; the selected tab takes the content's surface over the rule, accent text and an accent line on top. Keyboard, `aria-selected` and the `segment` default are unchanged.
35
+ - Fix DatePicker calendar clipping in app-local modal scope: mark the calendar as a popup so Dialog width constraints do not shrink it. Date and date-time popups stay within the app/viewport collision bounds, use the available width and height, and scroll when space is limited. Portals, calendar selection and Escape behavior are preserved.
36
+ - Add `PageContent surface="none"` (also JSON `Page`): no page surface or horizontal gutters at any presentation width, for full-bleed editors and standalone app content. Width limits, fill height and child spacing still work; `auto`, `card` and `flat` retain their existing behavior.
37
+ - Add a full-bleed Histoire example and `pnpm check:date-picker` browser regression coverage for popup geometry, clipped containers, viewport edges, nested Dialog Escape and page surfaces.
38
+
3
39
  ## 0.12.4 (2026-10-20)
4
40
 
5
41
  - 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.
package/README.md CHANGED
@@ -350,6 +350,23 @@ import { AppLayout, Button, PageHeader } from '@synopackageland/ui'
350
350
 
351
351
  `AppLayout` also accepts `sidebar`, `toolbar`, and `footer` slots.
352
352
 
353
+ For standalone content that owns its layout, use `<PageContent surface="none" height="fill">`.
354
+ It removes the page's horizontal gutters and adds no surface in web, DSM-window
355
+ or phone layouts. The default `surface="auto"` remains unchanged; `flat` keeps
356
+ the dashboard canvas. In 0.12.4+, `auto` already has no outer page card in web
357
+ mode. Child components keep their own styling and spacing. The JSON `Page`
358
+ component accepts the same `surface="none"` option. SDK `AppShell` is a separate
359
+ package: if it creates `PageContent` internally, it must expose/forward this
360
+ option before an application can select it through that shell.
361
+
362
+ ```vue
363
+ <AppLayout wide-layout="web" height="fill" min-height="0">
364
+ <PageContent surface="none" height="fill">
365
+ <MyEditor />
366
+ </PageContent>
367
+ </AppLayout>
368
+ ```
369
+
353
370
  `PageContent` stacks its direct children (a search row, a toolbar, cards) at
354
371
  `--ui-section-gap`, so a page needs no margins between them. Under a
355
372
  `PageHeader` the space is the header's own bottom padding (12px in a DSM
@@ -611,6 +628,7 @@ pnpm check # production build, then lint, typecheck and tests in parallel,
611
628
  pnpm check:fast # as check, but only the tests the changes since origin/master reach (vitest --changed)
612
629
  pnpm story:build # build the component workbench
613
630
  pnpm check:host # after pnpm build: DSM host simulation screenshots (Chrome)
631
+ pnpm check:date-picker # after pnpm build: app-local calendars, Dialog Escape and full-bleed pages (ego-browser)
614
632
  pnpm check:switch # after pnpm build: Switch knob geometry and click toggling (Chrome)
615
633
  pnpm check:topology # after pnpm build: ConnectionTopology motion, keyboard and narrow layout (Chrome)
616
634
  ```
@@ -9,12 +9,12 @@ type __VLS_Props = {
9
9
  declare function deactivateRow(): void;
10
10
  declare var __VLS_2: `header-${string}`, __VLS_3: {
11
11
  column: AdvancePanelGridColumn;
12
- }, __VLS_25: {}, __VLS_28: string, __VLS_29: {
12
+ }, __VLS_36: {}, __VLS_39: string, __VLS_40: {
13
13
  cell: AdvancePanelGridCell;
14
14
  item: AdvancePanelGridRow;
15
15
  column: AdvancePanelGridColumn;
16
16
  index: number;
17
- }, __VLS_31: {
17
+ }, __VLS_42: {
18
18
  item: AdvancePanelGridRow;
19
19
  column: AdvancePanelGridColumn;
20
20
  index: number;
@@ -24,11 +24,11 @@ declare var __VLS_2: `header-${string}`, __VLS_3: {
24
24
  type __VLS_Slots = {} & {
25
25
  [K in NonNullable<typeof __VLS_2>]?: (props: typeof __VLS_3) => any;
26
26
  } & {
27
- [K in NonNullable<typeof __VLS_28>]?: (props: typeof __VLS_29) => any;
27
+ [K in NonNullable<typeof __VLS_39>]?: (props: typeof __VLS_40) => any;
28
28
  } & {
29
- 'empty-body'?: (props: typeof __VLS_25) => any;
29
+ 'empty-body'?: (props: typeof __VLS_36) => any;
30
30
  } & {
31
- 'row-hover-action'?: (props: typeof __VLS_31) => any;
31
+ 'row-hover-action'?: (props: typeof __VLS_42) => any;
32
32
  };
33
33
  declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
34
34
  "update:sort": (sort: AdvancePanelGridSort) => any;
@@ -4,8 +4,8 @@ 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 puts the page flush on a white content area (`auto`, `card`). Set flat for card-based dashboards on the canvas. */
8
- surface?: 'auto' | 'flat' | 'card';
7
+ /** Web/portal: auto/card use the white content area; flat uses the dashboard canvas. none adds no surface or horizontal gutters, for content that owns its layout at every width. */
8
+ surface?: 'auto' | 'flat' | 'card' | 'none';
9
9
  /**
10
10
  * `'fill'` takes the container's height and does not scroll: the header,
11
11
  * tabs and toolbar stay, and the last child (a DataGrid, or a flex column
@@ -20,7 +20,7 @@ type __VLS_Slots = {} & {
20
20
  declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
21
21
  height: "auto" | "fill";
22
22
  width: "fill" | "readable" | (string & {});
23
- surface: "auto" | "flat" | "card";
23
+ surface: "auto" | "flat" | "card" | "none";
24
24
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
25
25
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
26
26
  declare const _default: typeof __VLS_export;
@@ -6,6 +6,7 @@ type __VLS_Props = {
6
6
  checking: string;
7
7
  available: string;
8
8
  betaAvailable: string;
9
+ upToDate: string;
9
10
  failed: string;
10
11
  retry: string;
11
12
  releaseNotes: string;
@@ -27,22 +28,22 @@ type __VLS_Props = {
27
28
  /** App-provided Privacy Policy URL. Omitted or empty hides the link. */
28
29
  privacyUrl?: string;
29
30
  releaseNotesUrl?: string;
30
- /** Runs on open. Return `newVersion` for an update, `betaVersion` for beta info, `{}`/undefined for failure. */
31
+ /** Runs on open. Return `newVersion` for an update, `betaVersion` for beta info, `upToDate: true` when nothing newer exists, `{}`/undefined for failure. */
31
32
  fetchVersion?: () => Promise<AboutVersionInfo>;
32
33
  checkUpdates?: boolean;
33
34
  width?: string;
34
35
  closeLabel?: string;
35
36
  };
36
37
  declare function checkForUpdates(): Promise<AboutVersionInfo | null>;
37
- declare var __VLS_11: {}, __VLS_13: {}, __VLS_58: {}, __VLS_61: {};
38
+ declare var __VLS_11: {}, __VLS_13: {}, __VLS_63: {}, __VLS_66: {};
38
39
  type __VLS_Slots = {} & {
39
40
  trigger?: (props: typeof __VLS_11) => any;
40
41
  } & {
41
42
  icon?: (props: typeof __VLS_13) => any;
42
43
  } & {
43
- default?: (props: typeof __VLS_58) => any;
44
+ default?: (props: typeof __VLS_63) => any;
44
45
  } & {
45
- copyright?: (props: typeof __VLS_61) => any;
46
+ copyright?: (props: typeof __VLS_66) => any;
46
47
  };
47
48
  declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
48
49
  checkForUpdates: typeof checkForUpdates;
@@ -1,6 +1,7 @@
1
- /** Result of the optional `fetchVersion` request. An empty result means the check failed. */
1
+ /** Result of the optional `fetchVersion` request. An empty result means the check failed; `upToDate` reports a successful check with nothing newer. */
2
2
  export type AboutVersionInfo = {
3
3
  newVersion?: string;
4
4
  betaVersion?: string;
5
+ upToDate?: boolean;
5
6
  };
6
- export type AboutCheckState = 'idle' | 'checking' | 'update-available' | 'beta-available' | 'failed';
7
+ export type AboutCheckState = 'idle' | 'checking' | 'update-available' | 'beta-available' | 'up-to-date' | 'failed';
@@ -14,6 +14,8 @@ type __VLS_Props = {
14
14
  /** Render lanes as buttons that emit `select-lane`. */
15
15
  selectable?: boolean;
16
16
  emptyLabel?: string;
17
+ /** The `id` of the lane shown as selected (a pressed button); `select-lane` still only reports clicks. */
18
+ selectedLane?: string | number;
17
19
  /** State words for links without a label. */
18
20
  text?: Partial<Record<LinkState, string>>;
19
21
  };
@@ -29,6 +31,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {},
29
31
  }>, {
30
32
  compact: boolean;
31
33
  selectable: boolean;
34
+ selectedLane: string | number;
32
35
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
33
36
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
34
37
  declare const _default: typeof __VLS_export;
@@ -30,7 +30,7 @@ export type DataGridColumn = {
30
30
  /**
31
31
  * Leaves the column out when the grid is too narrow for every column's
32
32
  * minimum width: the lowest priority goes first. Without one the column
33
- * always shows. The column chooser still lists it, to show it anyway.
33
+ * always shows (a `hideable: false` column only drops with an explicit one). The column chooser still lists it, to show it anyway.
34
34
  */
35
35
  priority?: number;
36
36
  /** `false` leaves the column out of the quick filter. */
@@ -14,8 +14,10 @@ type __VLS_Props = {
14
14
  rowKey?: string;
15
15
  emptyText?: string;
16
16
  compact?: boolean;
17
- /** Simple tables become fully labeled cards in mobile mode unless set to table. */
18
- mobileView?: 'auto' | 'cards' | 'table';
17
+ /** Simple tables become fully labeled cards in mobile mode unless set to table. `container` picks cards from the measured width (see `containerBreakpoint`) whatever the app presentation. */
18
+ mobileView?: 'auto' | 'cards' | 'table' | 'container';
19
+ /** Width in px under which `mobileView="container"` shows cards. */
20
+ containerBreakpoint?: number;
19
21
  };
20
22
  declare var __VLS_2: `cell-${string}`, __VLS_3: {
21
23
  row: Record<string, unknown>;
@@ -40,7 +42,8 @@ type __VLS_Slots = {} & {
40
42
  declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
41
43
  compact: boolean;
42
44
  rowKey: string;
43
- mobileView: "auto" | "cards" | "table";
45
+ mobileView: "auto" | "cards" | "table" | "container";
46
+ containerBreakpoint: number;
44
47
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
45
48
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
46
49
  declare const _default: typeof __VLS_export;
@@ -9,6 +9,8 @@ export type OverflowFitInput = {
9
9
  moreWidth: number;
10
10
  gap: number;
11
11
  minVisibleItems: number;
12
+ /** Which items are dividers; a divider never ends the visible run, since it would separate nothing from More. */
13
+ dividers?: boolean[];
12
14
  };
13
15
  export type OverflowFit = {
14
16
  visibleCount: number;
@@ -22,4 +24,4 @@ export type OverflowFit = {
22
24
  * `More` is reserved as soon as the row cannot hold everything, and at least
23
25
  * `minVisibleItems` items stay out of it even when they do not fit.
24
26
  */
25
- export declare function computeOverflowFit({ widths, availableWidth, moreWidth, gap, minVisibleItems }: OverflowFitInput): OverflowFit;
27
+ export declare function computeOverflowFit({ widths, availableWidth, moreWidth, gap, minVisibleItems, dividers }: OverflowFitInput): OverflowFit;
@@ -1,7 +1,10 @@
1
1
  import { StyleValue } from 'vue';
2
+ import { ScrollEdgesAxis } from '../../../composables/scrollEdges';
2
3
  type __VLS_Props = {
3
4
  viewportClass?: string;
4
5
  viewportStyle?: StyleValue;
6
+ /** Which edges are shaded: the left and right (`x`, default), the top and bottom (`y`) or all four. */
7
+ axis?: ScrollEdgesAxis;
5
8
  };
6
9
  declare var __VLS_1: {};
7
10
  type __VLS_Slots = {} & {
@@ -9,7 +12,11 @@ type __VLS_Slots = {} & {
9
12
  };
10
13
  declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
11
14
  viewport: Readonly<import('vue').ShallowRef<HTMLElement | null>>;
12
- }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
15
+ }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
16
+ axis: ScrollEdgesAxis;
17
+ viewportClass: string;
18
+ viewportStyle: string | false | import('vue').CSSProperties | StyleValue[] | null;
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;
15
22
  export default _default;
@@ -24,12 +24,14 @@ declare function getCheckedNodes(includeHalf?: boolean): TreeNode[];
24
24
  /** Moves a node among its siblings; used by the Alt+Arrow keys and the exposed API. */
25
25
  declare function moveSiblingBy(node: TreeNode, delta: number): void;
26
26
  declare function moveNode(sourceId: string, targetId: string, position: TreeViewPosition): void;
27
- declare var __VLS_63: {
27
+ declare var __VLS_64: {
28
28
  node: TreeNode;
29
29
  selected: boolean;
30
- };
30
+ }, __VLS_66: {};
31
31
  type __VLS_Slots = {} & {
32
- trailing?: (props: typeof __VLS_63) => any;
32
+ trailing?: (props: typeof __VLS_64) => any;
33
+ } & {
34
+ empty?: (props: typeof __VLS_66) => any;
33
35
  };
34
36
  declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
35
37
  getNodes: () => TreeNode[];
@@ -46,6 +48,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
46
48
  node: TreeNode;
47
49
  children: TreeNode[];
48
50
  }) => any;
51
+ check: (payload: TreeViewCheckPayload) => any;
49
52
  "update:checkedKeys": (value: string[]) => any;
50
53
  reorder: (payload: {
51
54
  node: TreeNode;
@@ -56,7 +59,6 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
56
59
  expand: (node: TreeNode) => any;
57
60
  "update:expanded": (value: string[]) => any;
58
61
  "update:nodes": (value: TreeNode[]) => any;
59
- check: (payload: TreeViewCheckPayload) => any;
60
62
  collapse: (node: TreeNode) => any;
61
63
  }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
62
64
  onSelect?: ((node: TreeNode) => any) | undefined;
@@ -65,6 +67,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
65
67
  node: TreeNode;
66
68
  children: TreeNode[];
67
69
  }) => any) | undefined;
70
+ onCheck?: ((payload: TreeViewCheckPayload) => any) | undefined;
68
71
  "onUpdate:checkedKeys"?: ((value: string[]) => any) | undefined;
69
72
  onReorder?: ((payload: {
70
73
  node: TreeNode;
@@ -75,7 +78,6 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
75
78
  onExpand?: ((node: TreeNode) => any) | undefined;
76
79
  "onUpdate:expanded"?: ((value: string[]) => any) | undefined;
77
80
  "onUpdate:nodes"?: ((value: TreeNode[]) => any) | undefined;
78
- onCheck?: ((payload: TreeViewCheckPayload) => any) | undefined;
79
81
  onCollapse?: ((node: TreeNode) => any) | undefined;
80
82
  }>, {
81
83
  multiple: boolean;
@@ -30,6 +30,8 @@ declare const __VLS_export: <T>(__VLS_props: NonNullable<Awaited<typeof __VLS_se
30
30
  item: T;
31
31
  index: number | string;
32
32
  }) => unknown;
33
+ /** Shown when `items` is empty. */
34
+ empty?: () => unknown;
33
35
  };
34
36
  emit: {};
35
37
  }>) => import('vue').VNode & {
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Columns for `count` cards in a `width`-wide grid, all in px: as many as fit
3
3
  * at the minimum width, or one more if every card keeps 90% of it, then spread
4
- * evenly over the rows it takes, so no row is left with a lone card
5
- * (3 → 3, 4 → 2 + 2, 5 → 3 + 2). Unknown without a width or cards.
4
+ * evenly over the rows it takes, which avoids a lone card when the count
5
+ * allows it (3 → 3, 4 → 2 + 2, 5 → 3 + 2); 7 cards may still leave one orphan. Unknown without a width or cards.
6
6
  */
7
7
  export declare function cardGridColumns({ width, count, minItemWidth, gap }: {
8
8
  width: number;
@@ -31,23 +31,23 @@ type __VLS_Props = {
31
31
  /** Emits `select` when the summary row is clicked. */
32
32
  selectable?: boolean;
33
33
  };
34
- declare var __VLS_1: {}, __VLS_8: {}, __VLS_15: {}, __VLS_17: {}, __VLS_19: {}, __VLS_21: {}, __VLS_23: {}, __VLS_25: {};
34
+ declare var __VLS_1: {}, __VLS_8: {}, __VLS_20: {}, __VLS_22: {}, __VLS_24: {}, __VLS_26: {}, __VLS_28: {}, __VLS_30: {};
35
35
  type __VLS_Slots = {} & {
36
36
  icon?: (props: typeof __VLS_1) => any;
37
37
  } & {
38
38
  'icon-status'?: (props: typeof __VLS_8) => any;
39
39
  } & {
40
- title?: (props: typeof __VLS_15) => any;
40
+ title?: (props: typeof __VLS_20) => any;
41
41
  } & {
42
- status?: (props: typeof __VLS_17) => any;
42
+ status?: (props: typeof __VLS_22) => any;
43
43
  } & {
44
- label?: (props: typeof __VLS_19) => any;
44
+ label?: (props: typeof __VLS_24) => any;
45
45
  } & {
46
- block?: (props: typeof __VLS_21) => any;
46
+ block?: (props: typeof __VLS_26) => any;
47
47
  } & {
48
- detail?: (props: typeof __VLS_23) => any;
48
+ detail?: (props: typeof __VLS_28) => any;
49
49
  } & {
50
- 'toggle-icon'?: (props: typeof __VLS_25) => any;
50
+ 'toggle-icon'?: (props: typeof __VLS_30) => any;
51
51
  };
52
52
  declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
53
53
  select: (event: MouseEvent) => any;
@@ -34,13 +34,13 @@ type __VLS_Props = {
34
34
  declare function reset(): void;
35
35
  declare function showCustom(): void;
36
36
  declare function closeDropdown(): void;
37
- declare var __VLS_34: {}, __VLS_36: {}, __VLS_38: {};
37
+ declare var __VLS_36: {}, __VLS_38: {}, __VLS_40: {};
38
38
  type __VLS_Slots = {} & {
39
- 'top-custom'?: (props: typeof __VLS_34) => any;
39
+ 'top-custom'?: (props: typeof __VLS_36) => any;
40
40
  } & {
41
- 'bottom-custom'?: (props: typeof __VLS_36) => any;
41
+ 'bottom-custom'?: (props: typeof __VLS_38) => any;
42
42
  } & {
43
- bottom?: (props: typeof __VLS_38) => any;
43
+ bottom?: (props: typeof __VLS_40) => any;
44
44
  };
45
45
  declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
46
46
  reset: typeof reset;
@@ -3,9 +3,9 @@ type __VLS_Props = {
3
3
  items: ContextMenuEntry[];
4
4
  disabled?: boolean;
5
5
  };
6
- declare var __VLS_14: {};
6
+ declare var __VLS_18: {};
7
7
  type __VLS_Slots = {} & {
8
- default?: (props: typeof __VLS_14) => any;
8
+ default?: (props: typeof __VLS_18) => any;
9
9
  };
10
10
  declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
11
11
  select: (key: string) => any;
@@ -1,6 +1,8 @@
1
1
  import { ContextMenuEntry } from './types';
2
2
  type __VLS_Props = {
3
3
  items: ContextMenuEntry[];
4
+ /** Where submenus must stay; see useCollisionBoundary. */
5
+ collisionBoundary?: HTMLElement | HTMLElement[];
4
6
  };
5
7
  declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
6
8
  select: (key: string) => any;
@@ -8,6 +10,8 @@ declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {
8
10
  }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
9
11
  onSelect?: ((key: string) => any) | undefined;
10
12
  onToggle?: ((key: string, checked: boolean) => any) | undefined;
11
- }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
13
+ }>, {
14
+ collisionBoundary: HTMLElement | HTMLElement[];
15
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
12
16
  declare const _default: typeof __VLS_export;
13
17
  export default _default;
@@ -9,6 +9,8 @@ type __VLS_Props = {
9
9
  radioValue?: string;
10
10
  /** Controlled values of named radio groups, keyed by `group`. */
11
11
  radioValues?: Record<string, string>;
12
+ /** Mark of the selected radio entry: a filled dot (default) or a check. */
13
+ radioIndicator?: 'dot' | 'check';
12
14
  };
13
15
  declare var __VLS_16: {};
14
16
  type __VLS_Slots = {} & {
@@ -30,6 +32,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {},
30
32
  onRadioSelect?: ((value: string, key: string, group: string) => any) | undefined;
31
33
  }>, {
32
34
  align: "start" | "center" | "end";
35
+ radioIndicator: "dot" | "check";
33
36
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
34
37
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
35
38
  declare const _default: typeof __VLS_export;
@@ -5,6 +5,8 @@ type __VLS_Props = {
5
5
  radioValues?: Record<string, string>;
6
6
  /** Where submenus must stay; see useCollisionBoundary. */
7
7
  collisionBoundary?: HTMLElement | HTMLElement[];
8
+ /** Mark of the selected radio entry: a filled dot (default) or a check. */
9
+ radioIndicator?: 'dot' | 'check';
8
10
  };
9
11
  declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
10
12
  select: (key: string) => any;
@@ -18,6 +20,7 @@ declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {
18
20
  collisionBoundary: HTMLElement | HTMLElement[];
19
21
  checkedKeys: string[];
20
22
  radioValues: Record<string, string>;
23
+ radioIndicator: "dot" | "check";
21
24
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
22
25
  declare const _default: typeof __VLS_export;
23
26
  export default _default;
@@ -1,3 +1,4 @@
1
+ import { Component } from 'vue';
1
2
  export type DropdownMenuSubEntry = {
2
3
  type?: 'item';
3
4
  key: string;
@@ -6,6 +7,8 @@ export type DropdownMenuSubEntry = {
6
7
  /** Legacy visual check mark. Use `type: 'checkbox'` for a real, togglable item. */
7
8
  checked?: boolean;
8
9
  danger?: boolean;
10
+ /** A small leading icon, such as a pencil for "Rename". Takes the place of the check mark. */
11
+ icon?: Component;
9
12
  shortcut?: string;
10
13
  /** @deprecated A real submenu is rendered when `children` is present. */
11
14
  submenu?: boolean;
@@ -40,6 +40,8 @@ type __VLS_Props = {
40
40
  maxPageButtons?: number;
41
41
  /** Shows the refresh control, which emits `refresh`. */
42
42
  refresh?: boolean;
43
+ /** Groups thousands in the total text and page numbers (`1,234,567`); false prints plain digits. */
44
+ groupDigits?: boolean;
43
45
  totalTextMode?: PaginationTotalTextMode;
44
46
  totalTextFormat?: Partial<Record<PaginationTotalTextMode, string>>;
45
47
  labels?: Partial<PaginationLabels>;
@@ -98,6 +100,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
98
100
  autoLess: boolean;
99
101
  lessWidth: number;
100
102
  maxPageButtons: number;
103
+ groupDigits: boolean;
101
104
  totalTextMode: PaginationTotalTextMode;
102
105
  totalTextFormat: Partial<Record<PaginationTotalTextMode, string>>;
103
106
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
@@ -1,3 +1,4 @@
1
+ import { SegmentVariant } from './context';
1
2
  type __VLS_Props = {
2
3
  /** Selected item value. */
3
4
  modelValue?: string;
@@ -7,6 +8,8 @@ type __VLS_Props = {
7
8
  ariaLabelledby?: string;
8
9
  /** Disables every item of the group. */
9
10
  disabled?: boolean;
11
+ /** `sheet` draws joined sheet tabs on a rule, as above a table, instead of a segmented control. */
12
+ variant?: SegmentVariant;
10
13
  };
11
14
  declare var __VLS_1: {};
12
15
  type __VLS_Slots = {} & {
@@ -19,6 +22,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {},
19
22
  onChange?: ((value: string) => any) | undefined;
20
23
  "onUpdate:modelValue"?: ((value: string) => any) | undefined;
21
24
  }>, {
25
+ variant: SegmentVariant;
22
26
  disabled: boolean;
23
27
  modelValue: string;
24
28
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
@@ -19,8 +19,8 @@ type __VLS_Slots = {} & {
19
19
  };
20
20
  declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
21
21
  disabled: boolean;
22
- tooltip: string | boolean | Record<string, unknown>;
23
22
  dot: string | boolean;
23
+ tooltip: string | boolean | Record<string, unknown>;
24
24
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
25
25
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
26
26
  declare const _default: typeof __VLS_export;
@@ -6,9 +6,12 @@ export type SegmentItemHandle = {
6
6
  element: () => HTMLElement | undefined;
7
7
  };
8
8
  export type SegmentMove = 'previous' | 'next' | 'first' | 'last';
9
+ /** `segment`: a segmented control; `sheet`: joined sheet tabs on a rule, the selected one open to the content below. */
10
+ export type SegmentVariant = 'segment' | 'sheet';
9
11
  export type SegmentControlContext = {
10
12
  selected: Ref<string>;
11
13
  groupDisabled: Ref<boolean>;
14
+ variant: Ref<SegmentVariant>;
12
15
  select: (value: string) => void;
13
16
  register: (handle: SegmentItemHandle) => void;
14
17
  unregister: (handle: SegmentItemHandle) => void;
@@ -1,9 +1,12 @@
1
1
  type __VLS_Props = {
2
2
  label?: string;
3
3
  size?: number;
4
+ /** The ring fills the whole `size` box (an 16px ring beside text) instead of DSM's 2/3 ring in a 24px box. */
5
+ inline?: boolean;
4
6
  };
5
7
  declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
6
8
  size: number;
9
+ inline: boolean;
7
10
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
8
11
  declare const _default: typeof __VLS_export;
9
12
  export default _default;
@@ -8,6 +8,8 @@ type __VLS_Props = {
8
8
  delay?: number;
9
9
  /** Replaces the whole text of a cut element; `false` shows nothing for it. */
10
10
  resolve?: (found: CutText) => string | false | undefined;
11
+ /** Touch and pen taps on cut text toggle the tooltip. */
12
+ openOnTap?: boolean;
11
13
  };
12
14
  declare var __VLS_1: {};
13
15
  type __VLS_Slots = {} & {
@@ -19,6 +21,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {},
19
21
  align: "start" | "center" | "end";
20
22
  delay: number;
21
23
  resolve: (found: CutText) => string | false | undefined;
24
+ openOnTap: boolean;
22
25
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
23
26
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
24
27
  declare const _default: typeof __VLS_export;
@@ -4,15 +4,18 @@ type __VLS_Props = {
4
4
  delay?: number;
5
5
  /** Keeps the trigger from opening a tooltip at all. */
6
6
  disabled?: boolean;
7
+ /** A tap on the trigger toggles the tooltip (touch has no hover). Off by default so an icon button's tap only acts. */
8
+ openOnTap?: boolean;
7
9
  };
8
- declare var __VLS_20: {};
10
+ declare var __VLS_25: {};
9
11
  type __VLS_Slots = {} & {
10
- default?: (props: typeof __VLS_20) => any;
12
+ default?: (props: typeof __VLS_25) => any;
11
13
  };
12
14
  declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
13
15
  disabled: boolean;
14
16
  side: "top" | "right" | "bottom" | "left";
15
17
  delay: number;
18
+ openOnTap: boolean;
16
19
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
17
20
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
18
21
  declare const _default: typeof __VLS_export;
@@ -1 +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)]";
1
+ export declare const TOOLTIP_CONTENT_CLASS = "z-[1450] 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)]";
@@ -11,6 +11,8 @@ type __VLS_Props = {
11
11
  /** Render the permalink anchor. */
12
12
  anchor?: boolean;
13
13
  anchorLabel?: string;
14
+ /** `end` puts the anchor after the text; `start` hangs it in the left margin (it is cut at a container's edge). */
15
+ anchorPlacement?: 'start' | 'end';
14
16
  };
15
17
  declare var __VLS_8: {};
16
18
  type __VLS_Slots = {} & {
@@ -22,6 +24,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {},
22
24
  href: string;
23
25
  level: HeaderLevel;
24
26
  baseUrl: string;
27
+ anchorPlacement: "start" | "end";
25
28
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
26
29
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
27
30
  declare const _default: typeof __VLS_export;
@@ -18,4 +18,5 @@ export declare function useFormControl(options: {
18
18
  style: import('vue').StyleValue;
19
19
  };
20
20
  changed: (value: unknown) => void;
21
+ invalid: import('vue').ComputedRef<boolean>;
21
22
  };