@synopackageland/ui 0.23.5 → 0.23.6

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,17 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.23.6 (2026-11-07)
6
+
7
+ Phone fixes for a fill page whose scroller is an App's own element: it is no longer cut off above the tab bar in portrait (a 0.23.5 regression), its header's "…" no longer pans it sideways in landscape, and a sticky row in it sticks below its PageHeader. No App change is required; a DSM window and desktop are unchanged.
8
+
9
+ - **Fixed (regression in 0.23.5): a fill page's nested scroller stopped about 110px above the tab bar in portrait.** PageContent read `--ui-page-end-space` with `parseFloat` when it looked for a fill page's scroller. Under docked bars (0.23.5's `data-ui-bars-overlay`) the property's text is a `calc()` expression (`calc(24px + calc(45px + max(49px, 0px) + 0px))`), which parsed as 0, so an App scroller nested in the page with the end space on a wrapper around it was not found as the page's scroller: the end space (118px at 390x844) stayed under it and the FAB's room (88px) and the bars' room went under the page instead of at the end of its content. PageContent now reads the resolved length from a hidden probe (`display: none`, `margin-top: var(--ui-page-end-space)`). Landscape was not affected (a plain `24px`). The other `parseFloat`/`parseInt` calls in the package read computed lengths or the UI's own pixel tokens; none parses a `calc()` custom property
10
+ - **A PageHeader's last action no longer pans an App's nested scroller sideways.** In a fill page whose scroller is the App's own element holding the PageHeader, the 44px tap box of a trailing "…" IconButton reached 13px past the scroller's edge (590/578 at 825x360, 518/506 at 753x279); 0.23.5's clip covered only a PageContent that is itself the scroller. The last action in a PageHeader's actions now sets `--ui-hit-end-room` to the header's end padding: its box stops at the header's edge and grows towards its start side, still 44px. The scroller is not clipped, so an App scroller that also scrolls a table sideways is unchanged
11
+ - **An Accordion no longer pans an App's own scroller sideways.** Its trigger was 8px wider than the accordion (`-mx-1`, `width: calc(100% + 0.5rem)`) so its pressed wash reached past the text; flush with the edge of a scroller without a PageContent clip (an App's record pane) that scroller scrolled 4px sideways at every width. The trigger is now exactly as wide as the accordion, its text where it was, and the pressed wash reaches 4px past each side by `box-shadow`, which no scroller counts
12
+ - **A sticky row in a nested scroller sticks below a sticky PageHeader in that scroller.** A `data-ui-sticky` row (an audio player) in an App's own scroller stacked from that scroller's top and covered a sticky PageHeader in the same scroller (title, Share, "…") once the page scrolled. A PageHeader now reports its element with its height, and PageContent places each sticky header and tabs strip in the scroller it sticks in: in a nested scroller its height is where the scroller's rows start, it counts in that scroller's `--ui-sticky-top-offset` and sets that scroller's `--ui-page-sticky-top`, and it is left out of the page's offset
13
+ - docs/mobile-native.md: the phone behaviour contract, the hit-area, sticky-row and end-space sections describe the nested scroller cases
14
+ - `check:phone-layout`: `search-nested` and `search-nested-end` (a fill page whose scroller is the App's own pane holding the PageHeader with a trailing "…", the App's end space on a wrapper around it) check that the pane is the page's scroller, reaches the screen's bottom with no end space under it, holds the FAB's and the bars' room, and with the bars kept ends its last row above the FAB (a speed dial's + when the page has two actions); `record-player-nested` checks the player sticks right below the PageHeader in the App's pane, counts in its offset and `scrollToStart` lands below it. The side-pan check runs both at portrait and the two landscape sizes
15
+
5
16
  ## 0.23.5 (2026-11-07)
6
17
 
7
18
  Phone fixes: a fling keeps its momentum while the bars hide, the page never pans sideways (also from a tap box at its edge), and the FAB is a circle. Gesture decisions share one velocity estimator, and a sticky row in an App's own side pane sticks in that pane. No App change is required; a DSM window and desktop are unchanged.
@@ -1,5 +1,17 @@
1
1
  import { Ref } from 'vue';
2
- /** For PageContent: the tallest height its sticky headers report, in px. */
3
- export declare function providePageSticky(): Readonly<Ref<number>>;
2
+ /**
3
+ * The sticky PageHeaders of a PageContent and the height each takes while it
4
+ * sticks, so what else sticks in the page (a SectionTabs strip, an App's
5
+ * `data-ui-sticky` row) sticks below it instead of under it. PageContent
6
+ * places each header in the scroller it sticks in: one in the page's own
7
+ * scroller sets `--ui-page-sticky-top`, one inside a scroll container of the
8
+ * App's own (a fill page's record pane) counts only in that container.
9
+ */
10
+ export type PageStickyHeader = {
11
+ element: HTMLElement;
12
+ height: number;
13
+ };
14
+ /** For PageContent: its sticky headers, in the order they reported. */
15
+ export declare function providePageSticky(): Readonly<Ref<readonly PageStickyHeader[]>>;
4
16
  /** For PageHeader: reports its height while it sticks, and nothing once it scrolls with the page. */
5
17
  export declare function useStickyHeight(element: Readonly<Ref<HTMLElement | null>>, sticks: () => boolean): void;