@synopackageland/ui 0.25.10 → 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,23 @@
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
+
5
22
  ## 0.25.10 (2026-11-12)
6
23
 
7
24
  ### Aside
@@ -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
  };