@synopackageland/ui 0.25.7 → 0.25.8
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 +24 -0
- package/dist/components/advanced-panel/AdvancePanelGrid.vue.d.ts +12 -4
- package/dist/components/containers/split-pane/SplitPane.vue.d.ts +5 -1
- package/dist/components/primitives/sheet/phone.d.ts +5 -0
- package/dist/composables/pageWindow.d.ts +24 -0
- package/dist/index.js +12443 -12309
- package/dist/json-preview/preview.js +4505 -4473
- package/dist/reka-runtime.json +1 -1
- package/dist/theme.css +1 -1
- package/dist/themes/dsm7-embedded-theme.css +1 -1
- package/dist/themes/dsm7-embedded.css +1 -1
- package/dist/themes/dsm7.css +1 -1
- package/docs/layout-rules.md +1 -1
- package/docs/list-detail.md +5 -2
- package/docs/mobile-native.md +19 -2
- package/docs/size-and-split.md +6 -0
- package/package.json +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.25.8 (2026-11-11)
|
|
4
|
+
|
|
5
|
+
On a phone (640px or narrower) a list is no longer a short inner scroller under the page's other content. Found in an App whose Explore page put a map above a DataGrid in a vertical SplitPane: at 360px the grid scrolled in a 385px box with a drag handle, and a pager count was cut to "38 ite…". The fix is in the SDK; Apps need no change and there is no new prop.
|
|
6
|
+
|
|
7
|
+
### Phone layout
|
|
8
|
+
|
|
9
|
+
- **Lists take their rows' height and the page scrolls as one.** `DataGrid`, `DataTable`, `SplitPane`, `VirtualList`, `VirtualCardGrid`, `DataView` and `Panel` mark themselves `data-ui-natural-height` in the phone presentation. The content area becomes the page's one scroller, and every element between it and the list takes its content's height, also an App's own `min-h-0 flex-1 overflow-hidden` and `h-full` wrappers. `fill` does nothing on a phone: the list bar sticks under the bar (`--ui-sticky-top-offset`), the selection bar sticks to the bottom above the phone bars, and the footer (count, pager) follows the last row instead of being pinned. A long list keeps its pages, and clips sideways only, so a row action's tap area never widens the page
|
|
10
|
+
- **An App's `maxHeight` keeps at least 60% of the screen.** A DataGrid's `maxHeight` stays on a phone as `max(<maxHeight>, 60dvh)` (`PHONE_MIN_CAP`)
|
|
11
|
+
- **SplitPane stacks.** On a phone both orientations stack start above end with no separator (`data-stacked`). A start pane with no height of its own keeps `min(size, 45%)` of the screen, at least `minStart`
|
|
12
|
+
- **Virtual lists virtualize against the page's scroll.** VirtualList and VirtualCardGrid read their visible range from the content area's scroll position (`usePageWindow`, TanStack `scrollMargin`), so they still render only a window of rows (19 of 2,000 at 390px)
|
|
13
|
+
- **A pushed page opens at its top, and Back returns to the scroll position.** ListDetail's pushed detail and a SectionTabs push pane take their content's height instead of clipping
|
|
14
|
+
- **A flush Dialog (a bottom sheet) scrolls a list in its body.** The sheet's body is its one scroller instead of clipping the list at 92% of the screen
|
|
15
|
+
- **A phone pager never cuts the count.** In a narrow card `‹ Page 1 of N ›` moves to its own line under "38 items" instead of cutting it
|
|
16
|
+
- **KeyValueRow caps an App's `labelWidth` at 40% of the row on a phone**, as the theme's default label column does
|
|
17
|
+
- **AdvancePanelGrid shows its row action on touch.** Under a coarse pointer the `row-hover-action` slot shows at the end of the last cell, beside the text. Before, it was invisible but still took taps, over the text
|
|
18
|
+
|
|
19
|
+
### Development
|
|
20
|
+
|
|
21
|
+
- `node scripts/check-phone-fill.mjs` (`tests/dsm-host/phone-fill.html`) checks ten fill layouts at 360, 390 and 1280 px: one scroller, the first row not cut, the list bar sticking, no splitter handle, the footer and pager whole, virtual windows, a flush sheet, labels and row actions. Before this change it had 49 failures
|
|
22
|
+
|
|
23
|
+
### Migration notes
|
|
24
|
+
|
|
25
|
+
- A test or an App style that relied on a phone DataGrid with `fill` scrolling inside its own box should scroll the content area instead (`[data-ui-layout-scroll='page'] > [data-ui-layout-main] > main`)
|
|
26
|
+
|
|
3
27
|
## 0.25.7 (2026-11-11)
|
|
4
28
|
|
|
5
29
|
### Grid
|
|
@@ -9,12 +9,18 @@ type __VLS_Props = {
|
|
|
9
9
|
declare function deactivateRow(): void;
|
|
10
10
|
declare var __VLS_2: `header-${string}`, __VLS_3: {
|
|
11
11
|
column: AdvancePanelGridColumn;
|
|
12
|
-
}, __VLS_36: {},
|
|
12
|
+
}, __VLS_36: {}, __VLS_38: {
|
|
13
|
+
item: AdvancePanelGridRow;
|
|
14
|
+
column: AdvancePanelGridColumn;
|
|
15
|
+
index: number;
|
|
16
|
+
activate: () => void;
|
|
17
|
+
deactivate: typeof deactivateRow;
|
|
18
|
+
}, __VLS_41: string, __VLS_42: {
|
|
13
19
|
cell: AdvancePanelGridCell;
|
|
14
20
|
item: AdvancePanelGridRow;
|
|
15
21
|
column: AdvancePanelGridColumn;
|
|
16
22
|
index: number;
|
|
17
|
-
},
|
|
23
|
+
}, __VLS_44: {
|
|
18
24
|
item: AdvancePanelGridRow;
|
|
19
25
|
column: AdvancePanelGridColumn;
|
|
20
26
|
index: number;
|
|
@@ -24,11 +30,13 @@ declare var __VLS_2: `header-${string}`, __VLS_3: {
|
|
|
24
30
|
type __VLS_Slots = {} & {
|
|
25
31
|
[K in NonNullable<typeof __VLS_2>]?: (props: typeof __VLS_3) => any;
|
|
26
32
|
} & {
|
|
27
|
-
[K in NonNullable<typeof
|
|
33
|
+
[K in NonNullable<typeof __VLS_41>]?: (props: typeof __VLS_42) => any;
|
|
28
34
|
} & {
|
|
29
35
|
'empty-body'?: (props: typeof __VLS_36) => any;
|
|
30
36
|
} & {
|
|
31
|
-
'row-hover-action'?: (props: typeof
|
|
37
|
+
'row-hover-action'?: (props: typeof __VLS_38) => any;
|
|
38
|
+
} & {
|
|
39
|
+
'row-hover-action'?: (props: typeof __VLS_44) => any;
|
|
32
40
|
};
|
|
33
41
|
declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
34
42
|
"update:sort": (sort: AdvancePanelGridSort) => any;
|
|
@@ -17,11 +17,15 @@ type __VLS_Props = {
|
|
|
17
17
|
label?: string;
|
|
18
18
|
};
|
|
19
19
|
declare function reset(): void;
|
|
20
|
-
declare var __VLS_1: {}, __VLS_3: {};
|
|
20
|
+
declare var __VLS_1: {}, __VLS_3: {}, __VLS_5: {}, __VLS_7: {};
|
|
21
21
|
type __VLS_Slots = {} & {
|
|
22
22
|
start?: (props: typeof __VLS_1) => any;
|
|
23
23
|
} & {
|
|
24
24
|
end?: (props: typeof __VLS_3) => any;
|
|
25
|
+
} & {
|
|
26
|
+
start?: (props: typeof __VLS_5) => any;
|
|
27
|
+
} & {
|
|
28
|
+
end?: (props: typeof __VLS_7) => any;
|
|
25
29
|
};
|
|
26
30
|
declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
27
31
|
reset: typeof reset;
|
|
@@ -5,3 +5,8 @@ import { ComputedRef } from 'vue';
|
|
|
5
5
|
* viewport width decides instead. Call it in a component's setup.
|
|
6
6
|
*/
|
|
7
7
|
export declare function usePhonePresentation(): ComputedRef<boolean>;
|
|
8
|
+
/**
|
|
9
|
+
* The least an App's own height cap leaves a list or a pane on a phone, where
|
|
10
|
+
* the page scrolls as one: a cap lower than this made a short inner scroller.
|
|
11
|
+
*/
|
|
12
|
+
export declare const PHONE_MIN_CAP = "60dvh";
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Ref } from 'vue';
|
|
2
|
+
/** The content area of an AppLayout whose page scrolls as one (a phone). */
|
|
3
|
+
export declare const PAGE_SCROLL_MAIN = "[data-ui-layout-scroll='page'] > [data-ui-layout-main] > main";
|
|
4
|
+
/**
|
|
5
|
+
* A virtual list on a phone page that scrolls as one. On a desktop a virtual
|
|
6
|
+
* list is its own fixed-height scroller; on a phone that is a short inner
|
|
7
|
+
* scroller under the page's other content. There the list takes its full
|
|
8
|
+
* height (it marks itself `data-ui-natural-height`, see adaptive.css), the
|
|
9
|
+
* page's scroller moves it, and the visible range is read from that scroller:
|
|
10
|
+
* `top` is how far the list's top has scrolled above the scroller's top edge
|
|
11
|
+
* (0 while the list starts below it) and `height` the scroller's visible
|
|
12
|
+
* height. Outside such a page `active` stays false and the list scrolls
|
|
13
|
+
* itself as before.
|
|
14
|
+
*/
|
|
15
|
+
export declare function usePageWindow(target: Ref<HTMLElement | null | undefined>): {
|
|
16
|
+
natural: import('vue').ComputedRef<boolean>;
|
|
17
|
+
active: import('vue').ComputedRef<boolean>;
|
|
18
|
+
scroller: import('vue').ShallowRef<HTMLElement | null, HTMLElement | null>;
|
|
19
|
+
top: Ref<number, number>;
|
|
20
|
+
height: Ref<number, number>;
|
|
21
|
+
read: () => void;
|
|
22
|
+
scrollTo: (offset: number, behavior?: ScrollBehavior) => void;
|
|
23
|
+
margin: () => number;
|
|
24
|
+
};
|