@synopackageland/ui 0.25.15 → 0.25.17

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,29 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.25.17 (2026-11-14)
6
+
7
+ ### Grid
8
+
9
+ - **A click on the row number opens the record.** In `@synopackageland/ui/grid`, a mouse click on the row header outside its controls now emits `row-expand(row)`, the event the expand control and Space already send. The cursor there is a pointer. The checkbox keeps toggling the selection and never opens.
10
+ - Only when a `row-expand` listener is bound. Without one, the click keeps the old behaviour (nothing opens, the selection stays), so Apps that do not open records are unaffected.
11
+ - With only a `checkbox` control, the checkbox covers the number, so a click there still selects.
12
+ - `GridHostController` takes an optional `canExpandRow()` hook, asked at click time.
13
+ - Touch is unchanged: a tap on the row header follows the finger rules.
14
+
15
+ ## 0.25.16 (2026-11-14)
16
+
17
+ ### Phone shell
18
+
19
+ - **Home in the browser launcher too, and drawn as Home.** Inside the Package Land launcher, the button now shows in the browser build as well as in the phone app.
20
+ - The browser launcher names the App's frame `synopkg-shell:1:close`, and a tap posts `{ v: 1, type: 'close' }` to the parent at the page's own origin.
21
+ - The button is now a home icon labelled Home, matching the launcher's own bars. It was a back arrow labelled "Back to apps".
22
+ - **Inside the launcher, every page leads with Home; Back is the system one.**
23
+ - A sub-page (AppLayout `back`, a `PageHeader` with `back`, a pushed page) shows Home before its title instead of the Back arrow.
24
+ - Each sub-page is a history entry of the App, so the system Back steps through sub-pages before the launcher leaves the App. Android's back and the browser's back or swipe both work this way.
25
+ - A pushed page keeps its single entry.
26
+ - Outside the launcher, sub-pages keep their Back arrow and take no entry.
27
+
5
28
  ## 0.25.15 (2026-11-13)
6
29
 
7
30
  ### Tags
@@ -15,6 +15,11 @@ interface PageTitleEntry {
15
15
  * AppLayout's own `title` says: the page and its way back are one row.
16
16
  */
17
17
  back?: () => void;
18
+ /**
19
+ * The sub-page already owns a history entry (a pushed page), so the
20
+ * browser's Back reaches it without another one from the layout.
21
+ */
22
+ history?: boolean;
18
23
  }
19
24
  /**
20
25
  * The bar's page title (the phone bar, or the bar of a short screen). A
@@ -75,6 +80,7 @@ export declare function createPageTitleHost(main: Readonly<Ref<HTMLElement | nul
75
80
  export declare function usePageTitle(element: Readonly<Ref<HTMLElement | null>>, title: () => string, options?: {
76
81
  back?: () => (() => void) | undefined;
77
82
  when?: () => boolean;
83
+ history?: boolean;
78
84
  }): ComputedRef<boolean>;
79
85
  /**
80
86
  * Where a component's actions render on a phone: the phone bar or the FAB
@@ -1,14 +1,14 @@
1
1
  import { ComputedRef, InjectionKey, Ref } from 'vue';
2
2
  /**
3
- * Back to the phone app's App list (docs/mobile-native.md, "Back to the App
4
- * list"). On a root page AppLayout leads its phone bar with it. When that bar
3
+ * Home in the Package Land launcher, the phone app or its browser build
4
+ * (docs/adaptive-layout.md). On a root page AppLayout leads its phone bar with it. When that bar
5
5
  * is not drawn (a tab page with `phone-bar-title="none"` and nothing else in
6
6
  * the bar), the page's first row takes it instead: the first PageToolbar,
7
7
  * SectionTabs row or PageHeader in the page, in document order, so it costs
8
8
  * no row of its own. With no such row the bar is drawn for it.
9
9
  */
10
10
  export interface ShellBackHost {
11
- /** The page's first row should lead with Back. */
11
+ /** The page's first row should lead with Home. */
12
12
  readonly wanted: Readonly<Ref<boolean>>;
13
13
  /** The row that holds Back now (its registration), if any. */
14
14
  readonly owner: Readonly<Ref<symbol | undefined>>;
@@ -19,5 +19,5 @@ export interface ShellBackHost {
19
19
  export declare const APP_SHELL_BACK_KEY: InjectionKey<ShellBackHost>;
20
20
  /** AppLayout's side: the rows that could hold Back, and the one that does. */
21
21
  export declare function createShellBackHost(wanted: Readonly<Ref<boolean>>): ShellBackHost;
22
- /** A row's side: true while this row leads with Back. */
22
+ /** A row's side: true while this row leads with Home. */
23
23
  export declare function useShellBackRow(element: () => HTMLElement | null | undefined): ComputedRef<boolean>;
@@ -48,6 +48,13 @@ export interface GridHostHooks {
48
48
  clearRequest: (selection: GridSelectionState) => void;
49
49
  /** Open the row's record. `columnIndex`: the tapped field, on a phone (scroll the record to it). */
50
50
  rowExpand: (rowIndex: number, columnIndex?: number) => void;
51
+ /**
52
+ * Whether anyone opens records (`GridHost`: a `row-expand` listener is
53
+ * bound). True: a click on the row header outside its controls (on the row
54
+ * number) opens the record. False or absent: that click selects nothing and
55
+ * opens nothing, as before.
56
+ */
57
+ canExpandRow?: () => boolean;
51
58
  headerMenu: (columnIndex: number, rect: GridRect) => void;
52
59
  columnResize: (columnIndex: number, width: number, done: boolean) => void;
53
60
  reorder: (kind: 'columns' | 'rows', ranges: readonly GridRange[], dropIndex: number) => void;
@@ -158,6 +165,8 @@ export declare class GridHostController {
158
165
  private get isFillEnabled();
159
166
  /** No resize handle on touch: a 5 px edge is no finger target. */
160
167
  private get isResizeEnabled();
168
+ /** A click on the row number opens the record (someone listens for `rowExpand`). */
169
+ private get canExpandRow();
161
170
  /** True while the fill handle is dragged. */
162
171
  get isFilling(): boolean;
163
172
  /**