@synopackageland/ui 0.25.9 → 0.25.11

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
@@ -2,6 +2,30 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.25.11 (2026-11-12)
6
+
7
+ ### Phone layout
8
+
9
+ - **The soft keyboard stays up on Android.** AppRoot's focus handling called `focus()` on every pressed control during pointerdown. On Android Chrome and WebView, focusing a text field from script before the tap's own mousedown hides the keyboard it has just raised, and focus moves to the app root about 150ms later, so a chat composer could not be typed into. A press on a text field or inside editable content is now left to the browser; buttons, links and other controls are focused as before. Apps need no change
10
+ - **Equal left and right margins on a touch phone.** The UI's styled `::-webkit-scrollbar` made Chromium (Android included) draw a classic 10px scrollbar inside every scroller, so pages, lists and toolbars ran 10px past the right margin. The webkit bar rules now apply only with a fine pointer; touch keeps the overlay bar, and Select and Combobox lists a thin one
11
+ - **A natural-height list keeps its full width in a flex row.** The phone natural-height chain (`flex: 0 0 auto`, 0.25.8) shrank a pane in a flex row such as `ListDetail` to its content, so a list took half the screen. It now stretches to the row (`inline-size: stretch`), also in a flush BottomSheet
12
+ - **Only actions float.** PageHeader, AppToolbar and PushTransition keep their actions in the page's own row, with no FAB or bar icons, while the actions hold anything that is not an action: a status badge, a count, a field. This includes content an App shell teleports in later. A status no longer floats as a pill over the list. Put a page's status in its meta (the SDK `PageInfo`)
13
+ - **Toolbar actions wrap.** AppToolbar's actions row wraps within the page instead of pushing it into horizontal scroll
14
+ - **Segmented controls of up to four segments are not cut.** A label wider than its share grows its column, and labels too wide together scroll the track sideways; none ends in an ellipsis
15
+ - **A search field fills its row on a phone.** `SearchField` (now `data-ui-search-field`), alone or in a wrapper holding only it, grows to its row and ignores a fixed basis or `max-width`
16
+ - **A DataGrid group title wraps in list mode.** A `#group-title` slot was wrapped in a `truncate` span, so a title with its own links ran over them on a narrow screen. It now wraps
17
+
18
+ ### Docs
19
+
20
+ - Button policy and layout rules: a page's header actions (the SDK `AppShell`'s `#actions`, `PageHeader` `#actions`) hold only the page's own actions, such as Add. There is no page-wide refresh: a page reads its data again on `ctx.reopen` and when it is shown, and a failed read puts Retry next to its error. The demos no longer show one
21
+
22
+ ## 0.25.10 (2026-11-12)
23
+
24
+ ### Aside
25
+
26
+ - **New `aside-dock="wide"` on AppLayout docks the aside in a wide DSM window.** Until now an open aside floated over the page in every DSM window (`wide-layout="window"`), however wide, and had no resize handle, so an assistant in a maximized window covered the page it talks about. With `aside-dock="wide"`, a DSM window at least 960px wide docks the open panel beside the page as the web presentation does: the page takes the rest, the handle on its start edge resizes it (Arrow keys, Home and End; written on release to `v-model:aside-width`), and collapsing gives the page the whole width but the 48px rail. A window under 960px, or one where the page would be left under 480px beside the theme's sidebar (`--ui-sidebar-width`), still floats it. The default (`'web'`) keeps today's behavior. Found in Syngle, whose IT Assistant moves into the aside in a DSM window
27
+ - **An aside slot given after the first render now appears.** AppLayout decided once, at setup, whether it had an `aside` slot, so an App that adds it later (Syngle shows its IT Assistant only once a read says AI is on) got neither the region nor the rail, and one taken away left an empty rail. The layout now checks the slot again before each update
28
+
5
29
  ## 0.25.9 (2026-11-12)
6
30
 
7
31
  ### Dialog
@@ -66,6 +66,13 @@ type __VLS_Props = {
66
66
  * keeps them; a page opts out alone with PageContent `hide-on-scroll="false"`.
67
67
  */
68
68
  hideOnScroll?: boolean;
69
+ /**
70
+ * Where an open `aside` may sit beside the page instead of floating over
71
+ * it. `'web'` (default): only in the web presentation. `'wide'`: also in a
72
+ * DSM window at least 960px wide, with the same resize handle; a narrower
73
+ * window and a page that would be left under 480px still float it.
74
+ */
75
+ asideDock?: 'web' | 'wide';
69
76
  };
70
77
  type __VLS_Slots = {
71
78
  sidebar?: () => unknown;
@@ -136,6 +143,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_PublicProps, {}, {
136
143
  phoneBarTitle: "auto" | "none";
137
144
  headerActions: DropdownMenuEntry[];
138
145
  hideOnScroll: boolean;
146
+ asideDock: "web" | "wide";
139
147
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
140
148
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
141
149
  declare const _default: typeof __VLS_export;
@@ -0,0 +1,35 @@
1
+ import { PropType, VNode } from 'vue';
2
+ /**
3
+ * True when `node` shows something that is not an action: text outside a
4
+ * button (a status badge, a count, a date) or a field. Neither belongs in a
5
+ * floating button or the 44px bar: there it would float over the page's rows.
6
+ */
7
+ export declare function showsPassiveContent(node: Node): boolean;
8
+ /**
9
+ * A page's actions on a phone (PageHeader, AppToolbar, PushTransition): in
10
+ * place, or teleported to `to` (the FAB or the phone bar). It reports
11
+ * `passive` while the actions hold anything that is not an action, whichever
12
+ * place they are in, so the owner keeps them in its own row and they never
13
+ * float over the page. Content that arrives later (a teleport of the App's
14
+ * own, as an App shell's page actions) is watched too.
15
+ */
16
+ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropTypes<{
17
+ to: {
18
+ type: PropType<HTMLElement | null>;
19
+ default: null;
20
+ };
21
+ }>, () => VNode<import('vue').RendererNode, import('vue').RendererElement, {
22
+ [key: string]: any;
23
+ }>, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
24
+ passive: (value: boolean) => boolean;
25
+ }, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<{
26
+ to: {
27
+ type: PropType<HTMLElement | null>;
28
+ default: null;
29
+ };
30
+ }>> & Readonly<{
31
+ onPassive?: ((value: boolean) => any) | undefined;
32
+ }>, {
33
+ to: HTMLElement | null;
34
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
35
+ export default _default;
@@ -8,11 +8,9 @@ type __VLS_Props = {
8
8
  /** Where `#actions` go on a phone: `fab`, `bar` or `inline` (this header's row). Defaults to AppLayout's `phone-actions`. */
9
9
  phoneActions?: PhoneActionsPlacement;
10
10
  };
11
- declare var __VLS_19: {}, __VLS_27: {}, __VLS_29: {};
11
+ declare var __VLS_19: {}, __VLS_29: {};
12
12
  type __VLS_Slots = {} & {
13
13
  meta?: (props: typeof __VLS_19) => any;
14
- } & {
15
- actions?: (props: typeof __VLS_27) => any;
16
14
  } & {
17
15
  actions?: (props: typeof __VLS_29) => any;
18
16
  };