@synopackageland/ui 0.12.3 → 0.12.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.12.5 (2026-10-20)
4
+
5
+ - `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.
6
+ - `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.
7
+ - `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.
8
+ - 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.
9
+ - 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.
10
+ - 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.
11
+
12
+ ## 0.12.4 (2026-10-20)
13
+
14
+ - 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.
15
+ - New browser check `pnpm check:full-page` (screenshots in en and zh-TW, full page and DSM window, from phone to wide).
16
+ - 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.
17
+
3
18
  ## 0.12.3 (2026-10-19)
4
19
 
5
20
  - 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.
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
  ```
@@ -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,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 uses a page surface by default. Set flat for card-based dashboards. */
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;
@@ -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;
@@ -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>;
@@ -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;