@gjsify/adwaita-nativescript 0.31.0 → 0.33.0

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.
Files changed (147) hide show
  1. package/lib/esm/index.js +1 -1
  2. package/lib/esm/widgets/adw-action-row.js +1 -1
  3. package/lib/esm/widgets/adw-avatar.js +1 -1
  4. package/lib/esm/widgets/adw-banner.js +1 -1
  5. package/lib/esm/widgets/adw-bottom-sheet.js +1 -1
  6. package/lib/esm/widgets/adw-button-content.js +1 -1
  7. package/lib/esm/widgets/adw-button-row.js +1 -1
  8. package/lib/esm/widgets/adw-carousel.js +1 -1
  9. package/lib/esm/widgets/adw-clamp.js +1 -1
  10. package/lib/esm/widgets/adw-combo-row.js +1 -1
  11. package/lib/esm/widgets/adw-data-grid.js +1 -0
  12. package/lib/esm/widgets/adw-drop-down.js +1 -0
  13. package/lib/esm/widgets/adw-entry-row.js +1 -1
  14. package/lib/esm/widgets/adw-entry.js +1 -0
  15. package/lib/esm/widgets/adw-expander-row.js +1 -1
  16. package/lib/esm/widgets/adw-header-bar.js +1 -1
  17. package/lib/esm/widgets/adw-inline-view-switcher.js +1 -1
  18. package/lib/esm/widgets/adw-navigation-split-view.js +1 -1
  19. package/lib/esm/widgets/adw-navigation-view.js +1 -1
  20. package/lib/esm/widgets/adw-overlay-split-view.js +1 -1
  21. package/lib/esm/widgets/adw-password-entry-row.js +1 -1
  22. package/lib/esm/widgets/adw-preferences-dialog.js +1 -1
  23. package/lib/esm/widgets/adw-preferences-group.js +1 -1
  24. package/lib/esm/widgets/adw-preferences-page.js +1 -1
  25. package/lib/esm/widgets/adw-sidebar.js +1 -1
  26. package/lib/esm/widgets/adw-spin-row.js +1 -1
  27. package/lib/esm/widgets/adw-spinner.js +1 -1
  28. package/lib/esm/widgets/adw-split-button.js +1 -1
  29. package/lib/esm/widgets/adw-status-page.js +1 -1
  30. package/lib/esm/widgets/adw-switch-row.js +1 -1
  31. package/lib/esm/widgets/adw-tab-view.js +1 -1
  32. package/lib/esm/widgets/adw-toolbar-view.js +1 -1
  33. package/lib/esm/widgets/adw-view-stack.js +1 -1
  34. package/lib/esm/widgets/adw-view-switcher-bar.js +1 -1
  35. package/lib/esm/widgets/adw-window-title.js +1 -1
  36. package/lib/esm/widgets/adw-wrap-box.js +1 -1
  37. package/lib/esm/widgets/avatar-color.js +1 -0
  38. package/lib/esm/widgets/bottom-sheet-state.js +1 -0
  39. package/lib/esm/widgets/button-content.js +1 -0
  40. package/lib/esm/widgets/carousel-state.js +1 -0
  41. package/lib/esm/widgets/chrome.js +1 -0
  42. package/lib/esm/widgets/data-grid-model.js +1 -0
  43. package/lib/esm/widgets/entry-row-view.js +1 -0
  44. package/lib/esm/widgets/icon-path.js +2 -2
  45. package/lib/esm/widgets/icons.ios.js +1 -0
  46. package/lib/esm/widgets/index.js +1 -1
  47. package/lib/esm/widgets/navigation-stack.js +1 -0
  48. package/lib/esm/widgets/preferences-group-state.js +1 -0
  49. package/lib/esm/widgets/preferences-search.js +1 -0
  50. package/lib/esm/widgets/row-state.js +1 -0
  51. package/lib/esm/widgets/sidebar-model.js +1 -0
  52. package/lib/esm/widgets/split-button.js +1 -0
  53. package/lib/esm/widgets/split-view-base.js +1 -1
  54. package/lib/esm/widgets/split-view-state.js +1 -0
  55. package/lib/esm/widgets/split-view-width.js +1 -0
  56. package/lib/esm/widgets/status-page-content.js +1 -0
  57. package/lib/esm/widgets/svg-path.js +2 -0
  58. package/lib/esm/widgets/tab-view-state.js +1 -0
  59. package/lib/esm/widgets/view-stack-state.js +1 -0
  60. package/lib/esm/widgets/view-switcher-base.js +1 -1
  61. package/lib/esm/widgets/view-switcher-model.js +1 -0
  62. package/lib/esm/widgets/wrap-box-layout.js +1 -0
  63. package/lib/types/banner.spec.d.ts +2 -0
  64. package/lib/types/bottom-sheet.spec.d.ts +2 -0
  65. package/lib/types/button-content.spec.d.ts +2 -0
  66. package/lib/types/carousel.spec.d.ts +1 -0
  67. package/lib/types/chrome.spec.d.ts +2 -0
  68. package/lib/types/data-grid.spec.d.ts +2 -0
  69. package/lib/types/drop-down.spec.d.ts +2 -0
  70. package/lib/types/entry-rows.spec.d.ts +2 -0
  71. package/lib/types/entry.spec.d.ts +2 -0
  72. package/lib/types/index.d.ts +2 -2
  73. package/lib/types/navigation-view.spec.d.ts +2 -0
  74. package/lib/types/preferences.spec.d.ts +2 -0
  75. package/lib/types/row-state.spec.d.ts +2 -0
  76. package/lib/types/sidebar.spec.d.ts +1 -0
  77. package/lib/types/split-button.spec.d.ts +1 -0
  78. package/lib/types/split-view-state.spec.d.ts +2 -0
  79. package/lib/types/split-view-width.spec.d.ts +2 -0
  80. package/lib/types/status-page.spec.d.ts +2 -0
  81. package/lib/types/svg-path.spec.d.ts +2 -0
  82. package/lib/types/tab-view.spec.d.ts +2 -0
  83. package/lib/types/view-stack.spec.d.ts +2 -0
  84. package/lib/types/view-switcher.spec.d.ts +1 -0
  85. package/lib/types/widgets/adw-action-row.d.ts +63 -7
  86. package/lib/types/widgets/adw-avatar.d.ts +2 -7
  87. package/lib/types/widgets/adw-banner.d.ts +26 -7
  88. package/lib/types/widgets/adw-bottom-sheet.d.ts +29 -11
  89. package/lib/types/widgets/adw-button-content.d.ts +41 -6
  90. package/lib/types/widgets/adw-button-row.d.ts +31 -9
  91. package/lib/types/widgets/adw-carousel.d.ts +70 -15
  92. package/lib/types/widgets/adw-clamp.d.ts +21 -4
  93. package/lib/types/widgets/adw-combo-row.d.ts +9 -0
  94. package/lib/types/widgets/adw-data-grid.d.ts +73 -0
  95. package/lib/types/widgets/adw-drop-down.d.ts +45 -0
  96. package/lib/types/widgets/adw-entry-row.d.ts +98 -2
  97. package/lib/types/widgets/adw-entry.d.ts +43 -0
  98. package/lib/types/widgets/adw-expander-row.d.ts +3 -0
  99. package/lib/types/widgets/adw-header-bar.d.ts +11 -2
  100. package/lib/types/widgets/adw-inline-view-switcher.d.ts +26 -0
  101. package/lib/types/widgets/adw-navigation-split-view.d.ts +23 -1
  102. package/lib/types/widgets/adw-navigation-view.d.ts +71 -16
  103. package/lib/types/widgets/adw-overlay-split-view.d.ts +29 -2
  104. package/lib/types/widgets/adw-password-entry-row.d.ts +33 -3
  105. package/lib/types/widgets/adw-preferences-dialog.d.ts +18 -0
  106. package/lib/types/widgets/adw-preferences-group.d.ts +56 -8
  107. package/lib/types/widgets/adw-preferences-page.d.ts +32 -1
  108. package/lib/types/widgets/adw-sidebar.d.ts +49 -7
  109. package/lib/types/widgets/adw-spinner.d.ts +22 -6
  110. package/lib/types/widgets/adw-split-button.d.ts +48 -13
  111. package/lib/types/widgets/adw-status-page.d.ts +5 -10
  112. package/lib/types/widgets/adw-switch-row.d.ts +21 -1
  113. package/lib/types/widgets/adw-tab-view.d.ts +129 -15
  114. package/lib/types/widgets/adw-toolbar-view.d.ts +39 -0
  115. package/lib/types/widgets/adw-view-stack.d.ts +30 -27
  116. package/lib/types/widgets/adw-view-switcher-bar.d.ts +22 -10
  117. package/lib/types/widgets/adw-window-title.d.ts +12 -8
  118. package/lib/types/widgets/adw-wrap-box.d.ts +93 -7
  119. package/lib/types/widgets/avatar-color.d.ts +14 -0
  120. package/lib/types/widgets/bottom-sheet-state.d.ts +73 -0
  121. package/lib/types/widgets/button-content.d.ts +43 -0
  122. package/lib/types/widgets/carousel-state.d.ts +85 -0
  123. package/lib/types/widgets/chrome.d.ts +161 -0
  124. package/lib/types/widgets/data-grid-model.d.ts +104 -0
  125. package/lib/types/widgets/entry-row-view.d.ts +88 -0
  126. package/lib/types/widgets/icon-path.d.ts +20 -0
  127. package/lib/types/widgets/icons.ios.d.ts +13 -0
  128. package/lib/types/widgets/index.d.ts +20 -5
  129. package/lib/types/widgets/navigation-stack.d.ts +153 -0
  130. package/lib/types/widgets/preferences-group-state.d.ts +52 -0
  131. package/lib/types/widgets/preferences-search.d.ts +68 -0
  132. package/lib/types/widgets/row-state.d.ts +71 -0
  133. package/lib/types/widgets/sidebar-model.d.ts +18 -0
  134. package/lib/types/widgets/split-button.d.ts +55 -0
  135. package/lib/types/widgets/split-view-base.d.ts +72 -12
  136. package/lib/types/widgets/split-view-state.d.ts +228 -0
  137. package/lib/types/widgets/split-view-width.d.ts +76 -0
  138. package/lib/types/widgets/status-page-content.d.ts +23 -0
  139. package/lib/types/widgets/svg-path.d.ts +28 -0
  140. package/lib/types/widgets/tab-view-state.d.ts +74 -0
  141. package/lib/types/widgets/view-stack-state.d.ts +35 -0
  142. package/lib/types/widgets/view-switcher-base.d.ts +75 -33
  143. package/lib/types/widgets/view-switcher-model.d.ts +114 -0
  144. package/lib/types/widgets/wrap-box-layout.d.ts +97 -0
  145. package/lib/types/wrap-box.spec.d.ts +2 -0
  146. package/package.json +7 -7
  147. package/src/theme/adwaita.css +413 -8
@@ -0,0 +1,85 @@
1
+ import type { Label } from '@nativescript/core';
2
+ import { CarouselState } from '@gjsify/adwaita-core';
3
+ import type { CarouselScrollRequest, CarouselStateChange } from '@gjsify/adwaita-core';
4
+ /**
5
+ * Default page width (DIPs) used for offset math until the consumer sets
6
+ * `pageWidth`. libadwaita MEASURES its pages (adw-carousel.c:739-765); NS gives
7
+ * a widget no size before its first layout pass, so a plausible phone-width
8
+ * default keeps the offsets sane until the consumer supplies the real one.
9
+ */
10
+ export declare const DEFAULT_CAROUSEL_PAGE_WIDTH = 320;
11
+ /** Construction seams an `AdwCarousel` hands to its state machine. */
12
+ export interface NsCarouselStateOptions {
13
+ /** Clock for the wheel lockout — injected so a spec can step past it. */
14
+ now?: () => number;
15
+ /** Invoked for every accepted scroll; the widget turns it into a `scrollToHorizontalOffset`. */
16
+ onScrollTo?: (request: CarouselScrollRequest) => void;
17
+ }
18
+ /**
19
+ * The state machine an `AdwCarousel` delegates to.
20
+ *
21
+ * `animateScroll` is FALSE: the `ScrollView` animates the pixels, but it reports
22
+ * nothing until it has, and on an untested platform it may report nothing at
23
+ * all. Keeping the model authoritative means a `scrollToPage` is correct the
24
+ * instant it is called, which is also what the port did before the lift —
25
+ * {@link CarouselScrollSync} is what keeps the two from fighting.
26
+ */
27
+ export declare function createCarouselState(options?: NsCarouselStateOptions): CarouselState;
28
+ /** A page width that can be divided by — anything else falls back to the default. */
29
+ export declare function normalizeCarouselPageWidth(value: number): number;
30
+ /** The horizontal scroll offset in DIPs for a position — `distance * position` (adw-carousel.c:797-801). */
31
+ export declare function carouselScrollOffset(position: number, distance: number): number;
32
+ /** The inverse: the position a `ScrollView` at `offset` is showing. */
33
+ export declare function carouselPositionAtOffset(offset: number, distance: number): number;
34
+ /**
35
+ * Keeps the model in step with a `ScrollView` that animates its own scrolls.
36
+ *
37
+ * Without this the two fight: the widget moves the model the moment
38
+ * `scrollToPage` is called, then the animation replays every intermediate offset
39
+ * back at it, so the dots would run backwards to where the scroll STARTED and
40
+ * crawl forward again, emitting a second `page-changed` on arrival.
41
+ *
42
+ * So a programmatic scroll declares its destination with {@link expect}, and
43
+ * every offset before that destination is ignored. A scroll nobody declared is a
44
+ * user swipe and drives the model directly — which is how a free flick gets a
45
+ * fractional position at all, something the port had no way to observe.
46
+ */
47
+ export declare class CarouselScrollSync {
48
+ /** Position a programmatic scroll is animating towards, `null` while idle. */
49
+ private _expected;
50
+ /** Declare where a programmatic scroll is heading; its intermediate offsets are then ignored. */
51
+ expect(position: number): void;
52
+ /**
53
+ * Feed one `ScrollView` scroll event. Returns whether the model was updated
54
+ * — `false` while a programmatic scroll is still in flight.
55
+ */
56
+ apply(state: CarouselState, position: number, epsilon?: number): boolean;
57
+ }
58
+ /** The class string each dot `Label` must carry, in page order. */
59
+ export declare function carouselDotClasses(state: CarouselState): string[];
60
+ /**
61
+ * Push {@link carouselDotClasses} onto the real dot labels.
62
+ *
63
+ * The selected dot comes from `get_page_at_position` (adw-carousel.c:222-239),
64
+ * not from `Math.round`, so a carousel resting half-way between two pages marks
65
+ * the LOWER one — and, unlike the integer compare this replaces, it marks
66
+ * something at all while a swipe is in progress.
67
+ */
68
+ export declare function applyCarouselDots(state: CarouselState, dots: readonly Label[]): void;
69
+ /** The data half of the `notify::position` event (minus NS's `eventName`/`object`). */
70
+ export interface CarouselNotifyPayload {
71
+ /** The clamped fractional scroll position. */
72
+ position: number;
73
+ /** The number of pages. */
74
+ nPages: number;
75
+ /** The page the position settles on, `-1` when the carousel is empty. */
76
+ page: number;
77
+ /** `true` for a user navigation (swipe, dot tap, keynav). */
78
+ interactive: boolean;
79
+ }
80
+ /**
81
+ * Project a core change onto the event payload. Kept as a function rather than
82
+ * spreading the change so the internal `reason` discriminator — which names a C
83
+ * notification site, not an NS event — never leaks into consumer code.
84
+ */
85
+ export declare function carouselNotifyPayload(change: CarouselStateChange): CarouselNotifyPayload;
@@ -0,0 +1,161 @@
1
+ import { ADW_BANNER_BUTTON_STYLE_CLASSES, ADW_BANNER_DEFAULTS, ADW_CLAMP_SIZE_CLASSES, ADW_SPINNER_MIN_SIZE, ADW_TOOLBAR_BAR_CLASSES, ADW_TOOLBAR_VIEW_CLASSES, ADW_TOOLBAR_VIEW_DEFAULTS, type AdwBannerButtonStyle, type AdwBannerProps, type AdwClampSizeClass, type AdwToolbarStyle } from '@gjsify/adwaita-core';
2
+ export { ADW_BANNER_BUTTON_STYLE_CLASSES, ADW_BANNER_DEFAULTS, ADW_CLAMP_SIZE_CLASSES, ADW_SPINNER_MIN_SIZE, ADW_TOOLBAR_BAR_CLASSES, ADW_TOOLBAR_VIEW_CLASSES, ADW_TOOLBAR_VIEW_DEFAULTS, };
3
+ export type { AdwBannerButtonStyle, AdwClampSizeClass, AdwToolbarStyle };
4
+ /** `Adw.Clamp:maximum-size` default, in DIPs. */
5
+ export declare const DEFAULT_CLAMP_MAX_SIZE: number;
6
+ /** `Adw.Clamp:tightening-threshold` default, in DIPs. */
7
+ export declare const DEFAULT_CLAMP_TIGHTENING_THRESHOLD: number;
8
+ /** The two clamp properties, as the widget holds them. */
9
+ export interface ClampProps {
10
+ /** How wide the child may ever get. Defaults to libadwaita's 600. */
11
+ maximumSize: number;
12
+ /** Where the eased tightening starts. Defaults to libadwaita's 400. */
13
+ tighteningThreshold: number;
14
+ }
15
+ /** The property defaults a fresh clamp starts with. */
16
+ export declare function defaultClampProps(): ClampProps;
17
+ /**
18
+ * Normalise one clamp property, keeping a nonsense value out of the layout.
19
+ *
20
+ * Delegates to core so the NativeScript widget and the browser element agree on
21
+ * the three inputs they used to answer differently — `0` (valid, and NOT the
22
+ * default), a non-numeric value (never reaches the layout, so the DEFAULT
23
+ * applies), and a negative (clamped to the range floor).
24
+ */
25
+ export declare function normalizeClampProp(value: number | string | null | undefined, fallback: number): number;
26
+ /** What one clamp layout pass tells the widget to do with its child. */
27
+ export interface ClampAllocationForWidth {
28
+ /**
29
+ * The child's `width` — a DIP number, or `'auto'` while the clamp has not
30
+ * been laid out yet, which leaves the child at its natural size instead of
31
+ * pinning it to a width derived from a container of size zero.
32
+ */
33
+ width: number | 'auto';
34
+ /** The `small`/`medium`/`large` class the child carries, or `null` before the first layout. */
35
+ sizeClass: AdwClampSizeClass | null;
36
+ }
37
+ /**
38
+ * The child width and size class for a clamp `availableWidth` DIPs wide.
39
+ *
40
+ * `availableWidth <= 0` means NativeScript has not laid the view out yet — it
41
+ * reports a zero size before the first pass — and the honest answer there is
42
+ * "do not constrain", the same shape `sidebarWidthFor` uses for the same reason.
43
+ * Anything else runs libadwaita's curve, so a narrow container yields a narrow
44
+ * child rather than the maximum.
45
+ *
46
+ * `childMin`/`childNat` are 0: NativeScript does not expose a child's measured
47
+ * minimum before layout, and `lower = MAX (…, child_min)` only ever RAISES the
48
+ * child's width — an NS child whose own content is wider than the clamp already
49
+ * overflows rather than being cut, so nothing is lost by leaving it out.
50
+ */
51
+ export declare function clampAllocationFor(availableWidth: number, props: ClampProps): ClampAllocationForWidth;
52
+ /**
53
+ * Default spinner diameter in DIPs — `Adw.Spinner`'s measured natural size,
54
+ * which equals its minimum (adw-spinner.c:78-81).
55
+ *
56
+ * Replaces an invented 32: nothing in libadwaita produces that number.
57
+ */
58
+ export declare const DEFAULT_SPINNER_SIZE = 16;
59
+ /**
60
+ * The RING diameter for a requested BOX size — floored at the measured minimum
61
+ * 16 and capped at Adwaita's 64, with the odd-size flooring (`31` draws a 30 DIP
62
+ * ring) coming from the paintable rather than from here.
63
+ *
64
+ * The two are different numbers, which is the whole point: `AdwSpinner` sizes
65
+ * its BOX to the request and its `ActivityIndicator` to this. They used to be
66
+ * one, so `size = 200` occupied 64 DIPs of layout where GTK occupies 200.
67
+ */
68
+ export declare function spinnerDiameter(value: number | string | null | undefined): number;
69
+ /** The four toolbar-view properties the style classes are derived from. */
70
+ export interface ToolbarViewProps {
71
+ /** `top-bar-style`. */
72
+ topBarStyle: AdwToolbarStyle;
73
+ /** `bottom-bar-style`. */
74
+ bottomBarStyle: AdwToolbarStyle;
75
+ /** `extend-content-to-top-edge`. */
76
+ extendContentToTopEdge: boolean;
77
+ /** `extend-content-to-bottom-edge`. */
78
+ extendContentToBottomEdge: boolean;
79
+ }
80
+ /** The property defaults a fresh toolbar view starts with. */
81
+ export declare function defaultToolbarViewProps(): ToolbarViewProps;
82
+ /** The three `className` strings a toolbar view distributes over its own node and its two bar boxes. */
83
+ export interface ToolbarViewClassNames {
84
+ /** `className` for the view. */
85
+ view: string;
86
+ /** `className` for the top-bar box. */
87
+ topBar: string;
88
+ /** `className` for the bottom-bar box. */
89
+ bottomBar: string;
90
+ }
91
+ /**
92
+ * Swap the classes a widget MANAGES on a NativeScript `className`, leaving every
93
+ * other token in place.
94
+ *
95
+ * NS views carry a space-separated string rather than a `classList`, so there is
96
+ * no `toggle`: the whole string is rewritten on every derivation. Composing from
97
+ * a fixed base instead would silently drop what a CONSUMER added — the storybook
98
+ * appends `sb-sidebar-pane` to an `AdwToolbarView`, and a re-style would have
99
+ * taken it away again.
100
+ */
101
+ export declare function replaceClasses(current: string, managed: readonly string[], next: readonly string[]): string;
102
+ /** The child `className` for a clamp allocation — the size class, and nothing else touched. */
103
+ export declare function clampChildClassName(current: string, sizeClass: AdwClampSizeClass | null): string;
104
+ /** The five banner properties, as the widget holds them. */
105
+ export type BannerProps = AdwBannerProps;
106
+ /**
107
+ * The property defaults a fresh banner starts with — libadwaita's, not this
108
+ * port's.
109
+ *
110
+ * This is the whole reason the banner is here. `AdwBanner` used to initialise
111
+ * `_revealed = true` AND never write `visibility` in its constructor, so a
112
+ * banner put itself on screen on a device while the same markup stayed hidden in
113
+ * the browser. `Adw.Banner:revealed` defaults to FALSE (adw-banner.c:456-459) —
114
+ * "Banners are hidden by default" (:47) — and `use-markup` to TRUE (:422-425),
115
+ * which the port had backwards as well.
116
+ */
117
+ export declare function defaultBannerProps(): BannerProps;
118
+ /**
119
+ * The text the NS title `Label` is given.
120
+ *
121
+ * `Adw.Banner`'s title is Pango markup by default (:422-425) and the NS CSS
122
+ * subset has no inline-markup layer at all, so the honest reduction is the
123
+ * markup's PLAIN TEXT: `<b>Metered</b>` reads `Metered`, which is what GTK
124
+ * paints minus the weight, where writing the raw string would paint the tags.
125
+ * Unparseable markup keeps the raw string, reproducing the C fallback that
126
+ * {@link stripMarkup} already models.
127
+ */
128
+ export declare function bannerTitleText(title: string, useMarkup: boolean): string;
129
+ /**
130
+ * The NS `visibility` for a `revealed` value.
131
+ *
132
+ * `Adw.Banner` reveals through a `GtkRevealer` (:817); the NS subset has no
133
+ * revealer, so `collapse` — which takes the view out of layout entirely — is the
134
+ * closest thing to a fully retracted one.
135
+ */
136
+ export declare function bannerVisibility(revealed: boolean): 'visible' | 'collapse';
137
+ /**
138
+ * The `className` for the banner button — the managed `button-style` class
139
+ * swapped in, every other token left alone.
140
+ *
141
+ * `adw_banner_set_button_style` only ever adds or removes `suggested-action`
142
+ * (:766, :769); it never rewrites the button's class list, and neither does
143
+ * this.
144
+ */
145
+ export declare function bannerButtonClassName(current: string, style: AdwBannerButtonStyle): string;
146
+ /**
147
+ * The `className` strings for a toolbar view, given its CURRENT ones, its
148
+ * properties and the measured bar heights.
149
+ *
150
+ * `topBarHeight`/`bottomBarHeight` are the ALLOCATED heights, exactly as
151
+ * `update_undershoots` reads `gtk_widget_get_height (self->top_bar)` — a bar box
152
+ * that was never given a height fades nothing, so it gets no undershoot.
153
+ */
154
+ export declare function toolbarViewClassNames(current: {
155
+ view: string;
156
+ topBar: string;
157
+ bottomBar: string;
158
+ }, props: ToolbarViewProps, heights: {
159
+ topBarHeight: number;
160
+ bottomBarHeight: number;
161
+ }): ToolbarViewClassNames;
@@ -0,0 +1,104 @@
1
+ import type { AdwDataGridRowVariant, DataGridTrack } from '@gjsify/adwaita-core';
2
+ import type { GridUnitType } from '@nativescript/core';
3
+ /** The two numbers a NativeScript `ItemSpec` is constructed from. */
4
+ export interface DataGridItemSpec {
5
+ /** The `ItemSpec` value: a star weight, a pixel length, or 1 for `auto`. */
6
+ value: number;
7
+ /** The `GridUnitType` — `'star'`, `'pixel'` or `'auto'`. */
8
+ type: GridUnitType;
9
+ }
10
+ /** The class the header row's background carries. */
11
+ export declare const DATA_GRID_HEADER_ROW_CLASS = "adw-data-grid-row header";
12
+ /** The class a section row's single spanning cell carries. */
13
+ export declare const DATA_GRID_SECTION_CELL_CLASS = "adw-data-grid-cell align-start section-cell";
14
+ /** The class a header CELL carries, on top of its column's own classes. */
15
+ export declare const DATA_GRID_HEADER_CELL_CLASS = "header-cell";
16
+ /**
17
+ * A fixed track's CSS length in device-independent pixels, or `null` when this
18
+ * renderer cannot resolve it.
19
+ *
20
+ * `DataGridTrack`'s `fixed` kind carries the author's `width` string verbatim,
21
+ * because only a CSS engine can resolve every unit CSS has. NativeScript has
22
+ * exactly one length unit — the DIP — and its own stylesheet subset writes it as
23
+ * a bare number (`min-height: 34`, `padding: 5 10 5 10`), so BOTH `'80px'` and
24
+ * `'80'` are read as 80 here and everything else (`6rem`, `50%`, `calc(...)`)
25
+ * is unresolvable and falls back to a content-sized track.
26
+ *
27
+ * That bare-number acceptance is a deliberate divergence from the browser, where
28
+ * `width: '80'` is not a valid CSS length and takes the WHOLE
29
+ * `grid-template-columns` declaration down with it. Falling back to `auto` for
30
+ * one column is the smaller failure, and refusing a spelling that is valid in
31
+ * this renderer's own stylesheet would be the surprising half.
32
+ *
33
+ * A negative or non-finite length is rejected rather than clamped: `ItemSpec`
34
+ * refuses one, and a column silently pinned to 0 reads as a missing column.
35
+ */
36
+ export declare function parseDataGridWidth(css: string): number | null;
37
+ /**
38
+ * The `ItemSpec` numbers for one column track.
39
+ *
40
+ * The four track kinds map onto the three `GridUnitType`s:
41
+ * - `slack` → `1 star`. The slack column takes what the fixed and content
42
+ * columns leave, which is what `minmax(0px, 1fr)` does in the browser.
43
+ * - `flex` → `<weight> star`, the same proportional share `<weight>fr` gives.
44
+ * - `fixed` → `<px> pixel` when {@link parseDataGridWidth} can read the length,
45
+ * `auto` when it cannot.
46
+ * - `auto` → `1 auto` (the value is ignored for an auto track).
47
+ *
48
+ * A `flex` weight of 0 becomes a ZERO-WIDTH PIXEL track rather than a star one:
49
+ * `0fr` collapses the column in the browser, and `ItemSpec(0, 'star')` is not a
50
+ * spelling for that — a star weight is a divisor. Same for a negative or
51
+ * non-finite weight, which cannot mean anything a layout can honour.
52
+ */
53
+ export declare function dataGridItemSpec(track: DataGridTrack): DataGridItemSpec;
54
+ /**
55
+ * A stable key for a track list — what the widget re-declares its columns on.
56
+ *
57
+ * The precedent is `AdwViewSwitcherBar`, which rebuilds its buttons only when the
58
+ * page COUNT moves so that a selection change cannot replace the button under
59
+ * the user's finger. The same discipline applies here, with one difference the
60
+ * grid forces: a column list can change WITHOUT changing length — pinning a
61
+ * column's `width` on a narrow screen is exactly that — and a count guard would
62
+ * keep painting against the old tracks. So the guard is the tracks themselves,
63
+ * which is a strict superset: whenever the count moves the key moves too, and a
64
+ * repaint (new rows, a toggled `interactive`) never touches the columns.
65
+ */
66
+ export declare function dataGridTracksKey(tracks: ReadonlyArray<DataGridTrack>): string;
67
+ /**
68
+ * A stable key for the grid's SHAPE — what the widget rebuilds its views on.
69
+ *
70
+ * Rows and columns only, deliberately: every row is built with one cell per
71
+ * column whatever its variant, and a `section` row spans its first cell over the
72
+ * rest instead of dropping them. So changing a row's variant is a repaint, not a
73
+ * rebuild, and the cell views survive a data change of the same size.
74
+ */
75
+ export declare function dataGridShapeKey(columnCount: number, rowCount: number): string;
76
+ /**
77
+ * The classes a data row's background carries.
78
+ *
79
+ * The row background is a NativeScript-only node and this is why it exists: the
80
+ * browser paints the fill, the hairline rules and the hover affordance on the
81
+ * row ELEMENT, which is a real element there because it is a subgrid. Here the
82
+ * cells are direct children of the one grid, so a full-width `StackLayout`
83
+ * placed first at the same row — below the cells, spanning every column — is
84
+ * what carries them, plus the tap target and the press feedback.
85
+ *
86
+ * `interactive` is a class rather than a widget flag so the press-darken keys off
87
+ * it: `attachRowPressFeedback` is wired on EVERY data row, and a non-interactive
88
+ * one gets a `highlighted` pseudo-class that no stylesheet rule claims.
89
+ */
90
+ export declare function dataGridRowClass(variant: AdwDataGridRowVariant, interactive: boolean): string;
91
+ /**
92
+ * The classes a body cell carries: its column's own, plus the row's variant.
93
+ *
94
+ * The variant is repeated onto the CELL because of the same structural
95
+ * difference: the browser bolds a subtotal's figures with
96
+ * `.variant-subtotal .adw-data-grid-cell`, a DESCENDANT selector, and here the
97
+ * cell is not inside the row background — the two are siblings in one grid. So
98
+ * the row class cannot reach the cells and the cell has to say it itself.
99
+ *
100
+ * `normal` adds nothing: it is every row in a statement but the handful that
101
+ * carry emphasis, and a class the stylesheet has no rule for is only noise in
102
+ * the one place a reader looks when the emphasis is wrong.
103
+ */
104
+ export declare function dataGridCellClass(columnClasses: ReadonlyArray<string>, variant: AdwDataGridRowVariant): string;
@@ -0,0 +1,88 @@
1
+ import type { EntryRowRenderState, PasswordEntryRowRenderState } from '@gjsify/adwaita-core';
2
+ /** The two NS visibility values the Adwaita widgets use — `collapse` takes no space. */
3
+ export type NsVisibility = 'visible' | 'collapse';
4
+ /** A view the render state shows or hides. */
5
+ export interface ToggleableView {
6
+ visibility: string;
7
+ }
8
+ /** A view whose CSS class list the render state drives. */
9
+ export interface ClassedView {
10
+ className: string;
11
+ }
12
+ /** The views an entry row paints, narrowed to what the render state touches. */
13
+ export interface EntryRowViews {
14
+ /** The row itself — carries the `focused` / `empty` state classes (C:183-186). */
15
+ row: ClassedView;
16
+ /** The large placeholder title (`empty_title` in adw-entry-row.ui). */
17
+ emptyTitle: ToggleableView;
18
+ /** The small label above the value (`title` in adw-entry-row.ui). */
19
+ title: ToggleableView;
20
+ /** The editable field. */
21
+ field: {
22
+ text: string;
23
+ editable: boolean;
24
+ };
25
+ /** The trailing pencil — hidden AND desensitized independently (C:149-150). */
26
+ editIcon: ToggleableView & ClassedView & {
27
+ opacity: number;
28
+ };
29
+ /** The caps-lock warning slot. */
30
+ indicator: ToggleableView;
31
+ /** The apply button. */
32
+ applyButton: ToggleableView;
33
+ }
34
+ /** The views a password entry row adds. */
35
+ export interface PasswordEntryRowViews {
36
+ /** The masked field. */
37
+ field: {
38
+ secure: boolean;
39
+ };
40
+ /** The peek toggle, whose `icon` takes an Adwaita symbolic SVG string. */
41
+ peekButton: {
42
+ icon: string;
43
+ };
44
+ }
45
+ /** Base class list of an entry row, before the state classes. */
46
+ export declare const NS_ENTRY_ROW_CLASS = "adw-row adw-action-row adw-entry-row";
47
+ /** Base class list of a password entry row. */
48
+ export declare const NS_PASSWORD_ENTRY_ROW_CLASS = "adw-row adw-action-row adw-entry-row adw-password-entry-row";
49
+ /** Class list of the trailing pencil. */
50
+ export declare const NS_EDIT_ICON_CLASS = "adw-icon adw-entry-edit";
51
+ /**
52
+ * Marker class for a desensitized part. NS has no insensitive state, so the
53
+ * class is only a styling hook — {@link NS_INSENSITIVE_OPACITY} is what the user
54
+ * actually sees.
55
+ */
56
+ export declare const NS_INSENSITIVE_CLASS = "adw-insensitive";
57
+ /** Opacity of a desensitized part (`gtk_widget_set_sensitive (…, FALSE)`, C:150). */
58
+ export declare const NS_INSENSITIVE_OPACITY = 0.4;
59
+ /** Map a boolean onto NativeScript's `visibility`. */
60
+ export declare function nsVisibility(visible: boolean): NsVisibility;
61
+ /**
62
+ * The row's class list for one render snapshot.
63
+ *
64
+ * `focused` is libadwaita's own class name — `text_state_flags_changed_cb` adds
65
+ * and removes it on the ROW node (adw-entry-row.c:183-186). `empty` has no C
66
+ * counterpart (GTK animates instead of styling), but the NS CSS subset cannot
67
+ * express `:focus-within` at all, so both states have to be reachable as classes
68
+ * or they are not reachable at all on this port.
69
+ */
70
+ export declare function entryRowClassName(base: string, state: EntryRowRenderState): string;
71
+ /**
72
+ * Paint one entry-row render snapshot.
73
+ *
74
+ * The two titles are the endpoints of libadwaita's cross-fade (C:433-439): GTK
75
+ * lerps between them over `EMPTY_ANIMATION_DURATION_MS`, NS swaps at
76
+ * `emptyTarget` because its CSS subset has no transform/animation.
77
+ */
78
+ export declare function applyEntryRowState(views: EntryRowViews, state: EntryRowRenderState, base: string): void;
79
+ /**
80
+ * The Adwaita symbolic SVG for a canonical peek icon name.
81
+ *
82
+ * The core names the icon the way the C does (`view-reveal-symbolic` /
83
+ * `view-conceal-symbolic`, adw-password-entry-row.c:68,73); this is the one
84
+ * place that maps a name onto the asset `@gjsify/adwaita-icons` ships.
85
+ */
86
+ export declare function peekIconSvg(iconName: PasswordEntryRowRenderState['peekIconName']): string;
87
+ /** Paint one password-entry-row render snapshot — `notify_visibility_cb` (C:62-81). */
88
+ export declare function applyPasswordEntryRowState(views: PasswordEntryRowViews, state: PasswordEntryRowRenderState): void;
@@ -31,6 +31,26 @@ export declare function extractIconPaths(svg: string): IconPath[];
31
31
  * `''` when the SVG carries no path data.
32
32
  */
33
33
  export declare function extractPathData(svg: string): string;
34
+ /** A colour split into the 0..1 components UIKit and CoreGraphics take. */
35
+ export interface IconColorComponents {
36
+ red: number;
37
+ green: number;
38
+ blue: number;
39
+ alpha: number;
40
+ }
41
+ /**
42
+ * Parse `#RGB` / `#RRGGBB` / `#AARRGGBB` into 0..1 components.
43
+ *
44
+ * Android does not need this — `android.graphics.Color.parseColor` takes the
45
+ * string directly — but UIKit has no hex constructor, so the iOS backend has to
46
+ * do the arithmetic. Note the ALPHA-FIRST order in the 8-digit form: that is the
47
+ * Android convention {@link SymbolicIconOptions.color} is documented in, and the
48
+ * two backends must read the same string the same way.
49
+ *
50
+ * Returns opaque black for anything unparsable, so a typo in a caller's colour
51
+ * yields a visible icon rather than an invisible one.
52
+ */
53
+ export declare function parseHexColor(hex: string): IconColorComponents;
34
54
  /**
35
55
  * Space-separate the two single-digit ARC FLAGS (large-arc, sweep) in every
36
56
  * elliptical-arc command (`A`/`a`) of an SVG path-data string.
@@ -0,0 +1,13 @@
1
+ import { ImageSource } from '@nativescript/core';
2
+ import { type SymbolicIconOptions } from './icon-path.js';
3
+ /**
4
+ * Render an Adwaita symbolic SVG to a native {@link ImageSource} on iOS, or
5
+ * `null` when the SVG has no path data / UIKit is unavailable.
6
+ *
7
+ * Drawn at `size` points × the screen scale so it stays crisp on Retina; place
8
+ * it in an `Image` sized `size`×`size` with `stretch:'aspectFit'`, exactly as on
9
+ * Android.
10
+ */
11
+ export declare function renderSymbolicIcon(svg: string, options?: SymbolicIconOptions): ImageSource | null;
12
+ export { ADWAITA_ICON_GRID, DEFAULT_ICON_COLOR, DEFAULT_ICON_COLOR_DARK, extractIconPaths, extractPathData, } from './icon-path.js';
13
+ export type { IconPath, SymbolicIconOptions } from './icon-path.js';
@@ -6,8 +6,12 @@ export type { NotifyActiveEventData } from './adw-switch-row.js';
6
6
  export { AdwEntryRow, NOTIFY_TEXT } from './adw-entry-row.js';
7
7
  export type { NotifyTextEventData } from './adw-entry-row.js';
8
8
  export { AdwPasswordEntryRow } from './adw-password-entry-row.js';
9
+ export { AdwEntry, ACTIVATE as ENTRY_ACTIVATE, NOTIFY_TEXT as NOTIFY_ENTRY_TEXT } from './adw-entry.js';
10
+ export type { NotifyEntryTextEventData } from './adw-entry.js';
9
11
  export { AdwComboRow, ComboState, NOTIFY_SELECTED } from './adw-combo-row.js';
10
12
  export type { AdwComboOption, ComboStateChange, ComboStateListener, NotifySelectedEventData } from './adw-combo-row.js';
13
+ export { AdwDropDown, NOTIFY_SELECTED as NOTIFY_DROP_DOWN_SELECTED } from './adw-drop-down.js';
14
+ export type { NotifyDropDownSelectedEventData } from './adw-drop-down.js';
11
15
  export { AdwSpinRow, NOTIFY_VALUE, SpinState } from './adw-spin-row.js';
12
16
  export type { NotifyValueEventData, SpinStateChange, SpinStateListener } from './adw-spin-row.js';
13
17
  export { AdwSliderRow, NOTIFY_SLIDER_VALUE } from './adw-slider-row.js';
@@ -27,6 +31,10 @@ export { AdwClamp, DEFAULT_CLAMP_MAX_SIZE } from './adw-clamp.js';
27
31
  export { AdwHeaderBar } from './adw-header-bar.js';
28
32
  export { AdwToolbarView } from './adw-toolbar-view.js';
29
33
  export { AdwWrapBox } from './adw-wrap-box.js';
34
+ export { AdwDataGrid, ROW_ACTIVATED } from './adw-data-grid.js';
35
+ export type { RowActivatedEventData } from './adw-data-grid.js';
36
+ export { DATA_GRID_HEADER_CELL_CLASS, DATA_GRID_HEADER_ROW_CLASS, DATA_GRID_SECTION_CELL_CLASS, dataGridCellClass, dataGridItemSpec, dataGridRowClass, dataGridShapeKey, dataGridTracksKey, parseDataGridWidth, } from './data-grid-model.js';
37
+ export type { DataGridItemSpec } from './data-grid-model.js';
30
38
  export { AdwSpinner, DEFAULT_SPINNER_SIZE } from './adw-spinner.js';
31
39
  export { AdwStatusPage } from './adw-status-page.js';
32
40
  export { AdwButtonRow, ACTIVATED } from './adw-button-row.js';
@@ -42,18 +50,25 @@ export type { AdwViewPage, NotifyViewSelectedEventData } from './view-switcher-b
42
50
  export { AdwViewSwitcher } from './adw-view-switcher.js';
43
51
  export { AdwViewSwitcherBar } from './adw-view-switcher-bar.js';
44
52
  export { AdwInlineViewSwitcher } from './adw-inline-view-switcher.js';
45
- export { AdwTabView } from './adw-tab-view.js';
46
- export { AdwCarousel, DEFAULT_CAROUSEL_PAGE_WIDTH, NOTIFY_POSITION } from './adw-carousel.js';
47
- export type { NotifyPositionEventData } from './adw-carousel.js';
53
+ export { AdwTabView, CLOSE_PAGE, NOTIFY_SELECTED_PAGE, PAGES_CHANGED } from './adw-tab-view.js';
54
+ export type { ClosePageEventData, NotifySelectedPageEventData, PagesChangedEventData } from './adw-tab-view.js';
55
+ export { applyTabViewVisibility, createTabViewState, tabBarVisibility, tabCloseVisibilities, tabLabelText, tabPageVisibilities, tabTooltipText, tabViewNotifyPayload, } from './tab-view-state.js';
56
+ export type { AdwTabPage, NsVisibility, TabViewNotifyPayload } from './tab-view-state.js';
57
+ export { AdwCarousel, DEFAULT_CAROUSEL_PAGE_WIDTH, NOTIFY_N_PAGES, NOTIFY_POSITION, PAGE_CHANGED, } from './adw-carousel.js';
58
+ export type { NotifyPositionEventData, PageChangedEventData } from './adw-carousel.js';
59
+ export { CarouselScrollSync, applyCarouselDots, carouselDotClasses, carouselNotifyPayload, carouselPositionAtOffset, carouselScrollOffset, createCarouselState, normalizeCarouselPageWidth, } from './carousel-state.js';
60
+ export type { CarouselNotifyPayload, NsCarouselStateOptions } from './carousel-state.js';
48
61
  export { AdwNavigationView, NOTIFY_VISIBLE_PAGE } from './adw-navigation-view.js';
49
62
  export type { NotifyVisiblePageEventData } from './adw-navigation-view.js';
50
- export { AdwSplitViewBase, DEFAULT_SIDEBAR_WIDTH, NOTIFY_SHOW_SIDEBAR } from './split-view-base.js';
63
+ export { AdwSplitViewBase, NOTIFY_SHOW_SIDEBAR } from './split-view-base.js';
51
64
  export type { NotifyShowSidebarEventData } from './split-view-base.js';
52
65
  export { AdwNavigationSplitView } from './adw-navigation-split-view.js';
53
66
  export { AdwOverlaySplitView } from './adw-overlay-split-view.js';
67
+ export { NsNavigationSplitViewState, NsOverlaySplitViewState, splitViewColumns } from './split-view-state.js';
68
+ export type { NsShowSidebarNotification, NsSplitViewHost, NsSplitViewState } from './split-view-state.js';
54
69
  export { AdwSidebar, NOTIFY_SELECTED as NOTIFY_SIDEBAR_SELECTED } from './adw-sidebar.js';
55
70
  export type { NotifySidebarSelectedEventData } from './adw-sidebar.js';
56
- export { AdwBottomSheet, NOTIFY_OPEN } from './adw-bottom-sheet.js';
71
+ export { AdwBottomSheet, CLOSE_ATTEMPT, NOTIFY_OPEN, SHEET_CLOSE } from './adw-bottom-sheet.js';
57
72
  export type { NotifyOpenEventData } from './adw-bottom-sheet.js';
58
73
  export { AdwToast, AdwToastOverlay, AdwToastQueue, DEFAULT_TOAST_TIMEOUT, TOAST_BUTTON_CLICKED, } from './adw-toast-overlay.js';
59
74
  export type { AdwToastOptions, AdwToastQueueHandlers, AdwToastQueueOptions, ToastScheduler, ToastTimerHandle, } from './adw-toast-overlay.js';