@gjsify/adwaita-react-native 0.47.0 → 0.49.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.
package/README.md CHANGED
@@ -4,9 +4,9 @@ Adwaita widgets with **one API surface and two implementations**: the real `Adw.
4
4
  widget on GTK4, React Native primitives on a phone.
5
5
 
6
6
  ```tsx
7
- import { AdwClamp } from '@gjsify/adwaita-react-native';
7
+ import { Adw } from '@gjsify/adwaita-react-native';
8
8
 
9
- <AdwClamp maximumSize={400}>{content}</AdwClamp>;
9
+ <Adw.Clamp maximumSize={400}>{content}</Adw.Clamp>;
10
10
  ```
11
11
 
12
12
  On GTK that is `Adw.Clamp` through [`@gjsify/gtk-host`](../gtk-host). On Android and
@@ -15,11 +15,19 @@ iOS it is a `View` whose width and offset come from
15
15
  `adw_clamp_layout_allocate` — libadwaita's own easing curve, not a `maxWidth`
16
16
  approximation.
17
17
 
18
+ **`Adw.<Name>` is the only spelling the package root has**, and the sameness above is the
19
+ point: the member is libadwaita's own type name with its namespace prefix read back off
20
+ it (ADR 0034 clause 1 + § Amendment 8). There are no `AdwClamp` class exports at the root
21
+ any more. One widget on its own comes from its subpath —
22
+ `import { AdwClamp } from '@gjsify/adwaita-react-native/widgets/clamp'` — where that
23
+ identifier is the widget's only name and not a second one; the prop TYPES keep their flat
24
+ spelling for the same reason, since `Adw.ClampProps` names nothing libadwaita has.
25
+
18
26
  ## What this is, honestly
19
27
 
20
28
  **Not a widget set yet.** The table below is the whole of it, and every row carries the
21
29
  whole vertical — both platform halves, the resolution mechanism, the `exports` entry, a
22
- gate, and a suite on each side that reads the REAL tree. `AdwBin` and `AdwClamp` came
30
+ gate, and a suite on each side that reads the REAL tree. `Adw.Bin` and `Adw.Clamp` came
23
31
  first and proved that shape; the groups since are where it starts earning its keep, and
24
32
  the content-and-feedback widgets are the clearest case — each has a DERIVATION as its
25
33
  shared half (an initials hash, a palette index, a queue policy, a ring geometry), so the
@@ -58,34 +66,34 @@ a GTK-only consumer does not need it installed.
58
66
 
59
67
  | widget | props | notes |
60
68
  |---|---|---|
61
- | `AdwActionRow` | `title`, `subtitle`, `activatable` (false), `onActivated`, `children` | The fundamental boxed-list row. `children` are the SUFFIX |
62
- | `AdwAvatar` | `size` (**required**), `text`, `showInitials`, `iconName` | Initials and palette entry from one port of `extract_initials_from_text` + `set_class_color`. `size` is required because libadwaita's default is the `-1` "ask the stylesheet" sentinel and neither renderer here has one |
63
- | `AdwBanner` | `title`, `buttonLabel`, `revealed`, `useMarkup`, `buttonStyle`, `onButtonClicked` | An omitted `useMarkup` is FALSE on both halves — the value the widget reads back, not the TRUE its `GParamSpec` declares |
64
- | `AdwBin` | `children` | One child, no layout of its own |
65
- | `AdwButtonContent` | `iconName`, `label`, `useUnderline`, `canShrink` | Four derivations from the core, including the 6px gap that is `border-spacing` and not `GtkBox:spacing` |
66
- | `AdwButtonRow` | `title`, `onActivated` | A row that behaves like a button — always activatable, and holds no children at all |
67
- | `AdwClamp` | `children`, `maximumSize` (600), `tighteningThreshold` (400) | Constrain a child's width and centre it, on libadwaita's easing curve |
68
- | `AdwComboRow` | `title`, `subtitle`, `model`, `selected`, `useSubtitle`, `onNotifySelected` | Pick one item of a list. `model` keeps libadwaita's NAME and takes `@gjsify/adwaita-core`'s option vocabulary instead of a `Gio.ListModel` — the GTK half builds the real `Gtk.StringList`. One item or none is not a choice: no chevron, and the row is not activatable. `useSubtitle` MOVES the value into the subtitle rather than adding a second copy of it |
69
- | `AdwEntryRow` | `title`, `text`, `maxLength` (0), `editable` (true), `showApplyButton` (false), `onNotifyText`, `onApply`, `onEntryActivated` | The row IS the entry. `max-length` counts CHARACTERS |
70
- | `AdwExpanderRow` | `title`, `subtitle`, `expanded` (false), `onNotifyExpanded`, `children` | `children` are the DISCLOSED rows. The header toggles, the disclosure does not |
71
- | `AdwHeaderBar` | `start`, `titleWidget`, `title`, `subtitle`, `end` | The three slots as PROPS, in draw order. No window controls: a phone has none |
72
- | `AdwNavigationPage` | `children`, `title`, `tag`, `canPop` (true) | One page of a navigation view, or one pane of a navigation split view. A widget on GTK because `adw_navigation_view_add` takes one; three properties and no drawing of its own |
73
- | `AdwNavigationSplitView` | `children` (the content), `sidebar`, `sidebarTag`, `contentTag`, `sidebarTitle`, `contentTitle`, `collapsed`, `showContent`, `sidebarPosition`, plus the four sizing props | Sidebar beside content; a navigation stack when collapsed. Both panes are wrapped in an `Adw.NavigationPage` on GTK, because the two slots take nothing else |
74
- | `AdwNavigationView` | `children` (the pages, first is the root), `animateTransitions` (true), `popOnEscape` (true), `ref` (`push`, `pop`, `popToTag`, `replaceWithTags`, `visiblePageTag`, `canGoBack`, `backButtonTooltip`) | A page stack. Pushed BY TAG through the ref, never by prop — `Adw.NavigationView:visible-page` is read-only |
75
- | `AdwOverlaySplitView` | `children` (the content), `sidebar`, `collapsed`, `showSidebar` (true), `pinSidebar`, `sidebarPosition`, `enableShowGesture` (true), `enableHideGesture` (true), `onNotifyShowSidebar`, plus the four sizing props | Sidebar that slides OVER the content when collapsed. Collapsing hides an unpinned sidebar itself, which is what `onNotifyShowSidebar` reports |
76
- | `AdwPasswordEntryRow` | `title`, `text`, `maxLength`, `editable`, `showApplyButton`, `onNotifyText`, `onApply`, `onEntryActivated` | `Adw.EntryRow`'s surface exactly — the subclass declares no property of its own. `maxLength` counts CHARACTERS through the core, never `TextInput.maxLength`'s UTF-16 units |
77
- | `AdwPreferencesGroup` | `children` (the rows), `title`, `description` | A titled card. Five visibility answers from one `derivePreferencesGroupHeader` call; the card hides itself at zero rows while its header stays |
78
- | `AdwPreferencesPage` | `children` (the groups), `title`, `iconName`, `name`, `description`, `descriptionCentered`, `useUnderline` | Four of the five properties are identity a view switcher reads, drawn by neither half — as in libadwaita. Only `description` is painted |
79
- | `AdwSpinRow` | `title`, `subtitle`, `value`, `lower`, `upper`, `stepIncrement`, `digits`, `onNotifyValue` | The range is `Gtk.Adjustment`'s three own property names rather than a fourth private spelling. Every mutation clamps, including a bound that moves under the value |
80
- | `AdwSpinner` | `widthRequest`, `heightRequest` | The BOX and the RING are two numbers: an unbounded box around a ring capped at 64 |
81
- | `AdwStatusPage` | `children`, `iconName`, `title`, `description` | A centred empty state. The icon draws on GTK only |
82
- | `AdwSwitchRow` | `title`, `subtitle`, `active` (false), `onNotifyActive` | Controlled. The whole row toggles, not only the handle |
83
- | `AdwToastOverlay` | `children`, `ref` (`addToast`, `dismissAll`) | One toast at a time. A toast is PUSHED through the ref, never declared as a prop — `add_toast` is a call |
84
- | `AdwToolbarView` | `children` (the content), `topBar`, `bottomBar`, `topBarStyle` (`flat`), `bottomBarStyle` (`flat`), `extendContentToTopEdge` (false), `extendContentToBottomEdge` (false) | Content framed by bars. The two styles reach the real widget on GTK and draw nothing on a phone |
85
- | `AdwViewStack` | `pages` (`name`, `title`, `iconName`, `visible`, `badgeNumber`, `needsAttention`, `useUnderline`, `child`), `visibleChildName`, `onNotifyVisibleChild` | Named pages, one visible. A page is a PROP OBJECT because `Adw.ViewStackPage` is a GObject and not a widget |
86
- | `AdwViewSwitcher` | `AdwViewStack`'s props plus `policy` (`narrow`) | A button row over the stack. It BUNDLES the stack libadwaita keeps separate, as both other renderers do — on GTK it still builds a real `Adw.ViewStack` and binds it to `Adw.ViewSwitcher:stack` |
87
- | `AdwWindowTitle` | `title`, `subtitle` | Two labels; an EMPTY one takes no space, a blank one does |
88
- | `AdwWrapBox` | `children` plus libadwaita's fourteen: `childSpacing`/`childSpacingUnit`, `lineSpacing`/`lineSpacingUnit`, `align`, `justify`, `justifyLastLine`, `lineHomogeneous`, `naturalLineLength`/`naturalLineLengthUnit`, `packDirection`, `wrapReverse`, `wrapPolicy`, `orientation` | Children flow onto new lines. The line DECISION is `@gjsify/adwaita-core`'s, the line BREAKING is Yoga's |
69
+ | `Adw.ActionRow` | `title`, `subtitle`, `activatable` (false), `onActivated`, `children` | The fundamental boxed-list row. `children` are the SUFFIX |
70
+ | `Adw.Avatar` | `size` (**required**), `text`, `showInitials`, `iconName` | Initials and palette entry from one port of `extract_initials_from_text` + `set_class_color`. `size` is required because libadwaita's default is the `-1` "ask the stylesheet" sentinel and neither renderer here has one |
71
+ | `Adw.Banner` | `title`, `buttonLabel`, `revealed`, `useMarkup`, `buttonStyle`, `onButtonClicked` | An omitted `useMarkup` is FALSE on both halves — the value the widget reads back, not the TRUE its `GParamSpec` declares |
72
+ | `Adw.Bin` | `children` | One child, no layout of its own |
73
+ | `Adw.ButtonContent` | `iconName`, `label`, `useUnderline`, `canShrink` | Four derivations from the core, including the 6px gap that is `border-spacing` and not `GtkBox:spacing` |
74
+ | `Adw.ButtonRow` | `title`, `onActivated` | A row that behaves like a button — always activatable, and holds no children at all |
75
+ | `Adw.Clamp` | `children`, `maximumSize` (600), `tighteningThreshold` (400) | Constrain a child's width and centre it, on libadwaita's easing curve |
76
+ | `Adw.ComboRow` | `title`, `subtitle`, `model`, `selected`, `useSubtitle`, `onNotifySelected` | Pick one item of a list. `model` keeps libadwaita's NAME and takes `@gjsify/adwaita-core`'s option vocabulary instead of a `Gio.ListModel` — `@gjsify/gtk-host`'s ParamSpec seam builds the real `Gtk.StringList` (ADR 0046 § Amendment), and the GTK half memoises the array so an unrelated re-render does not reset the selection. One item or none is not a choice: no chevron, and the row is not activatable. `useSubtitle` MOVES the value into the subtitle rather than adding a second copy of it |
77
+ | `Adw.EntryRow` | `title`, `text`, `maxLength` (0), `editable` (true), `showApplyButton` (false), `onNotifyText`, `onApply`, `onEntryActivated` | The row IS the entry. `max-length` counts CHARACTERS |
78
+ | `Adw.ExpanderRow` | `title`, `subtitle`, `expanded` (false), `onNotifyExpanded`, `children` | `children` are the DISCLOSED rows. The header toggles, the disclosure does not |
79
+ | `Adw.HeaderBar` | `start`, `titleWidget`, `title`, `subtitle`, `end` | The three slots as PROPS, in draw order. No window controls: a phone has none |
80
+ | `Adw.NavigationPage` | `children`, `title`, `tag`, `canPop` (true) | One page of a navigation view, or one pane of a navigation split view. A widget on GTK because `adw_navigation_view_add` takes one; three properties and no drawing of its own |
81
+ | `Adw.NavigationSplitView` | `children` (the content), `sidebar`, `sidebarTag`, `contentTag`, `sidebarTitle`, `contentTitle`, `collapsed`, `showContent`, `sidebarPosition`, plus the four sizing props | Sidebar beside content; a navigation stack when collapsed. Both panes are wrapped in an `Adw.NavigationPage` on GTK, because the two slots take nothing else |
82
+ | `Adw.NavigationView` | `children` (the pages, first is the root), `animateTransitions` (true), `popOnEscape` (true), `ref` (`push`, `pop`, `popToTag`, `replaceWithTags`, `visiblePageTag`, `canGoBack`, `backButtonTooltip`) | A page stack. Pushed BY TAG through the ref, never by prop — `Adw.NavigationView:visible-page` is read-only |
83
+ | `Adw.OverlaySplitView` | `children` (the content), `sidebar`, `collapsed`, `showSidebar` (true), `pinSidebar`, `sidebarPosition`, `enableShowGesture` (true), `enableHideGesture` (true), `onNotifyShowSidebar`, plus the four sizing props | Sidebar that slides OVER the content when collapsed. Collapsing hides an unpinned sidebar itself, which is what `onNotifyShowSidebar` reports |
84
+ | `Adw.PasswordEntryRow` | `title`, `text`, `maxLength`, `editable`, `showApplyButton`, `onNotifyText`, `onApply`, `onEntryActivated` | `Adw.EntryRow`'s surface exactly — the subclass declares no property of its own. `maxLength` counts CHARACTERS through the core, never `TextInput.maxLength`'s UTF-16 units |
85
+ | `Adw.PreferencesGroup` | `children` (the rows), `title`, `description` | A titled card. Five visibility answers from one `derivePreferencesGroupHeader` call; the card hides itself at zero rows while its header stays |
86
+ | `Adw.PreferencesPage` | `children` (the groups), `title`, `iconName`, `name`, `description`, `descriptionCentered`, `useUnderline` | Four of the five properties are identity a view switcher reads, drawn by neither half — as in libadwaita. Only `description` is painted |
87
+ | `Adw.SpinRow` | `title`, `subtitle`, `value`, `adjustment`, `digits`, `onNotifyValue` | The range is one `adjustment` — `@gjsify/adwaita-core`'s portable `Gtk.Adjustment` (ADR 0047), the same value the two sibling Adwaita renderers take, built into the real one by `@gjsify/gtk-host`'s ParamSpec seam (ADR 0047 § Amendment). Every mutation clamps, including a bound that moves under the value |
88
+ | `Adw.Spinner` | `widthRequest`, `heightRequest` | The BOX and the RING are two numbers: an unbounded box around a ring capped at 64 |
89
+ | `Adw.StatusPage` | `children`, `iconName`, `title`, `description` | A centred empty state. The icon draws on GTK only |
90
+ | `Adw.SwitchRow` | `title`, `subtitle`, `active` (false), `onNotifyActive` | Controlled. The whole row toggles, not only the handle |
91
+ | `Adw.ToastOverlay` | `children`, `ref` (`addToast`, `dismissAll`) | One toast at a time. A toast is PUSHED through the ref, never declared as a prop — `add_toast` is a call |
92
+ | `Adw.ToolbarView` | `children` (the content), `topBar`, `bottomBar`, `topBarStyle` (`flat`), `bottomBarStyle` (`flat`), `extendContentToTopEdge` (false), `extendContentToBottomEdge` (false) | Content framed by bars. The two styles reach the real widget on GTK and draw nothing on a phone |
93
+ | `Adw.ViewStack` | `pages` (`name`, `title`, `iconName`, `visible`, `badgeNumber`, `needsAttention`, `useUnderline`, `child`), `visibleChildName`, `onNotifyVisibleChild` | Named pages, one visible. A page is a PROP OBJECT because `Adw.ViewStackPage` is a GObject and not a widget |
94
+ | `Adw.ViewSwitcher` | `Adw.ViewStack`'s props plus `policy` (`narrow`) | A button row over the stack. It BUNDLES the stack libadwaita keeps separate, as both other renderers do — on GTK it still builds a real `Adw.ViewStack` and binds it to `Adw.ViewSwitcher:stack` |
95
+ | `Adw.WindowTitle` | `title`, `subtitle` | Two labels; an EMPTY one takes no space, a blank one does |
96
+ | `Adw.WrapBox` | `children` plus libadwaita's fourteen: `childSpacing`/`childSpacingUnit`, `lineSpacing`/`lineSpacingUnit`, `align`, `justify`, `justifyLastLine`, `lineHomogeneous`, `naturalLineLength`/`naturalLineLengthUnit`, `packDirection`, `wrapReverse`, `wrapPolicy`, `orientation` | Children flow onto new lines. The line DECISION is `@gjsify/adwaita-core`'s, the line BREAKING is Yoga's |
89
97
 
90
98
  Props are libadwaita's own names, camelCased — `maximumSize` is `AdwClamp:maximum-size`,
91
99
  not a React Native `maxWidth` — so the property you look up in libadwaita's documentation
@@ -96,8 +104,8 @@ A signal is named the way [`@gjsify/gtk-host`](../gtk-host)'s generated surface
96
104
  half hands the prop straight to the host and a second spelling here would be a translation
97
105
  table nothing checks.
98
106
 
99
- **A slot is a prop, never a `slot`-carrying child.** `AdwHeaderBar`'s three ends and
100
- `AdwToolbarView`'s two bars are props because gtk-host routes a child by a `slot` prop on
107
+ **A slot is a prop, never a `slot`-carrying child.** `Adw.HeaderBar`'s three ends and
108
+ `Adw.ToolbarView`'s two bars are props because gtk-host routes a child by a `slot` prop on
101
109
  the CHILD, and a prop of a React component is an arbitrary `ReactNode` with nothing to
102
110
  write it on — `cloneElement` sets a prop on a COMPOSITE component, which forwards
103
111
  nothing, so the slot would be silently dropped for exactly the children this package
@@ -120,7 +128,7 @@ side.
120
128
  `@gjsify/adwaita-core`'s tokens through, so what the React Native half carries is layout
121
129
  and visibility. Inventing a styling seam is a decision this slice does not make.
122
130
 
123
- ### `AdwExpanderRow` needs a curated placement, and this package added it
131
+ ### `Adw.ExpanderRow` needs a curated placement, and this package added it
124
132
 
125
133
  `Adw.ExpanderRow` was in `@gjsify/gtk-host`'s GENERATED table, which knows the tag and no
126
134
  placement rule, so every child of an `<adw-expander-row>` was an `uncurated-placement`
@@ -190,8 +198,8 @@ nothing:
190
198
  | the millisecond&rarr;second conversion cannot turn a brief toast into a permanent one | `Adw.Toast:timeout` counts whole seconds and reads back 5 on a default toast; `DEFAULT_TOAST_TIMEOUT` counts 5000 ms. The conversion is `ceil`, asserted against libadwaita's own default rather than against itself — `Math.round(400 / 1000)` is 0, which is "until dismissed" |
191
199
  | the spinner's box and its ring are held on the half where each is a node | GTK measures the BOX (`[16, 16]` unrequested, 200 requested, no upper bound); React Native asserts the RING, which on GTK is an `AdwSpinnerPaintable` and not a widget at all — 64 points with an 8-point stroke inside a 200-point box |
192
200
  | the rows share libadwaita's derivations rather than re-deriving them | the React Native half runs `@gjsify/adwaita-core` and the GTK half reads the answer back off the real widget: `activatable` false on `Adw.ActionRow` and `BUTTON_ROW_ACTIVATABLE` true on `Adw.ButtonRow`, the `notify` gate that stays SILENT for a set to the value already held on both the switch row and the expander, and `max-length` keeping `'🔒é'` — 2 characters, 3 UTF-16 units — where `TextInput.maxLength` would cut the pair in half |
193
- | `AdwExpanderRow`: the disclosure is an ALLOCATION, not a flag | the live GTK tree, with animations off: the disclosed row is unmapped at 0×0 and still PARENTED while collapsed, and 596 wide below the header once revealed, with the expander's height equal to its header list plus its revealer to the point (109 = 55 + 54 on libadwaita 1.9.3) |
194
- | `AdwExpanderRow`: an unechoed toggle survives the next render, on both halves | a second render with the prop unchanged, asserted on each side — the GTK one against the real widget through `@gjsify/gtk-host`'s patch-on-change, the React Native one through `ExpanderState` |
201
+ | `Adw.ExpanderRow`: the disclosure is an ALLOCATION, not a flag | the live GTK tree, with animations off: the disclosed row is unmapped at 0×0 and still PARENTED while collapsed, and 596 wide below the header once revealed, with the expander's height equal to its header list plus its revealer to the point (109 = 55 + 54 on libadwaita 1.9.3) |
202
+ | `Adw.ExpanderRow`: an unechoed toggle survives the next render, on both halves | a second render with the prop unchanged, asserted on each side — the GTK one against the real widget through `@gjsify/gtk-host`'s patch-on-change, the React Native one through `ExpanderState` |
195
203
 
196
204
  **Not proven: the row THEME.** What the rows lay out is structure — `flexDirection: 'row'`
197
205
  is what makes a row a row — and what they do not carry is padding, the type scale, the
@@ -210,7 +218,7 @@ and until then it is a gap, not a formality.
210
218
  These are places where the two halves cannot be made identical, written down rather
211
219
  than smoothed over.
212
220
 
213
- - **`AdwPreferencesPage` is not a scroller on React Native.** `Adw.PreferencesPage` wraps
221
+ - **`Adw.PreferencesPage` is not a scroller on React Native.** `Adw.PreferencesPage` wraps
214
222
  its groups in a `GtkScrolledWindow`; this half emits the column and a consumer wraps it.
215
223
  Not a shortcut: `testing/react-native.ts` may only double a React Native component that
216
224
  IS a host element with its props forwarded, and `ScrollView` is a COMPOSITE that renders
@@ -218,17 +226,17 @@ than smoothed over.
218
226
  A double of it would be a nesting real React Native never emits, and every assertion
219
227
  written against it would be about the double — the measured reason `spinner.native.tsx`
220
228
  refuses `ActivityIndicator`. The same wrapper carries the page's CLAMP:
221
- `adw-preferences-page.ui` puts an `AdwClamp` inside the scrolled window, so a wide window
222
- centres the groups at the clamp width while this half stretches them. `AdwClamp` is in
229
+ `adw-preferences-page.ui` puts an `Adw.Clamp` inside the scrolled window, so a wide window
230
+ centres the groups at the clamp width while this half stretches them. `Adw.Clamp` is in
223
231
  this package, so a consumer that wants both wraps with both.
224
- - **`AdwPreferencesGroup` has no `header-suffix` and no `separate-rows`.** The first is a
232
+ - **`Adw.PreferencesGroup` has no `header-suffix` and no `separate-rows`.** The first is a
225
233
  placement question, not a naming one: `header-suffix` holds a WIDGET, so a React surface
226
234
  has to spell it as a slot, and the group's curated descriptor in `@gjsify/gtk-host` is
227
235
  `ordered` — `add`/`remove`, `remove-all` to reorder, because `Adw.PreferencesGroup.insert`
228
236
  does not exist on libadwaita 1.x — which has no slots at all. Adding one changes a
229
237
  placement policy other conformance vectors already assert, with its own measurement. The
230
238
  second is pure card styling, and this package's React Native half draws no theme.
231
- - **`AdwPreferencesGroup`'s `single-line` header state is derived and not drawn.** It is a
239
+ - **`Adw.PreferencesGroup`'s `single-line` header state is derived and not drawn.** It is a
232
240
  stylesheet number — `min-height: 34px` against `margin-bottom: 6px` — and there is no
233
241
  theme layer here to spend it in. It is computed because it comes out of the same core call
234
242
  as the four states that ARE drawn.
@@ -238,12 +246,12 @@ than smoothed over.
238
246
  paints the string verbatim and passes `useMarkup: false`, which is the case
239
247
  `derivePreferencesGroupHeader` documents that value for, and which both sibling renderers
240
248
  pass as well.
241
- - **`AdwComboRow` has no popover on React Native.** `Adw.ComboRow` opens a `GtkPopover` over
249
+ - **`Adw.ComboRow` has no popover on React Native.** `Adw.ComboRow` opens a `GtkPopover` over
242
250
  a `GtkListView`; a row with no overlay layer cannot. The press advances to the next option
243
251
  and wraps, which still runs the real `ComboState.select` guard — bounds and
244
252
  no-op-on-same — so the arithmetic underneath is the shipped one and only the gesture is
245
253
  this half's own.
246
- - **`AdwComboRow`'s `useSubtitle` publishes the value at once on React Native and on the
254
+ - **`Adw.ComboRow`'s `useSubtitle` publishes the value at once on React Native and on the
247
255
  next selection change on GTK.** What both halves DO agree on is that the value is drawn in
248
256
  one place: `adw-combo-row.ui` binds the inline value view's `visible` to `use-subtitle`
249
257
  with `sync-create|invert-boolean`, and this half hides its trailing label the same way.
@@ -254,40 +262,25 @@ than smoothed over.
254
262
  `use-subtitle` on and is replaced by the next selection change. Measured on libadwaita
255
263
  1.9.3 and asserted on both halves. Reproducing the lag here would mean carrying a
256
264
  libadwaita ordering artefact into a renderer that has no reason for it.
257
- - **`AdwSpinRow`'s range is spelled `lower`/`upper`/`stepIncrement`, where the two sibling
258
- Adwaita renderers spell it `min`/`max`/`step`.** Those are
259
- `adw_spin_row_new_with_range`'s PARAMETER names; these are `Gtk.Adjustment`'s own GObject
260
- property names for the same three values, and this package's rule is that a caller writes
261
- the property they would look up in libadwaita's documentation. The arithmetic is still
262
- shared — both halves map onto `@gjsify/adwaita-core`'s `SpinState`, which uses the short
263
- names internally.
264
- - **`AdwSpinRow`'s decimal separator is the process locale's on GTK and always `.` on React
265
+ - **`Adw.SpinRow`'s decimal separator is the process locale's on GTK and always `.` on React
265
266
  Native.** `gtk_spin_button_update` formats the displayed value through the C library's
266
267
  locale — measured on gjs 1.88.1 under a de_DE locale, a `digits={2}` row of 3.14159 reads
267
268
  `3,14` — while `Number.prototype.toFixed` is specified never to localise and gives `3.14`
268
269
  on every machine there is. The two halves therefore agree on the DIGIT COUNT and differ by
269
270
  one character. Both suites assert the digits; neither builds its expectation from the
270
271
  locale, because a test that did would be measuring the machine it runs on.
271
- - **A range that moves past itself notifies twice more on React Native than on GTK.** The
272
- GTK half builds one new `Gtk.Adjustment` from `lower`, `upper` and `stepIncrement`
273
- together, so moving 0…100/50 to 200…300/250 is a single step. The React Native half
274
- applies each property in its own effect — one per setter, because each has its own guard
275
- in the C — so it passes through an inverted range: `setMin(200)` runs while the maximum is
276
- still 100, and `SpinState`'s clamp answers the maximum. `onNotifyValue` therefore reports
277
- `100, 200, 250` where GTK reports the end state. The settled value is the same on both,
278
- React batches the renders, and the stream is asserted so that changing it is a decision.
279
- - **`AdwSpinRow` carries no `climb-rate`, `snap-to-ticks`, `numeric`, `update-policy` or
272
+ - **`Adw.SpinRow` carries no `climb-rate`, `snap-to-ticks`, `numeric`, `update-policy` or
280
273
  `wrap`.** Each needs an editable text entry or a key-repeat timer the React Native half
281
274
  does not have, so carrying them would mean a property GTK honours and the phone ignores.
282
275
  Neither sibling renderer has them either.
283
- - **`AdwPasswordEntryRow`'s caps-lock indicator is present and can never show.**
276
+ - **`Adw.PasswordEntryRow`'s caps-lock indicator is present and can never show.**
284
277
  `indicatorVisible` is `editing && show_indicator`, and `show_indicator` is pushed from
285
278
  `!revealed && capsLockOn` — but React Native exposes no keyboard modifier state, and this
286
279
  surface carries no prop libadwaita does not have, so nothing can set it. The node stays in
287
280
  the tree, hidden, and a test asserts that: "no caps-lock warning" and "no caps-lock
288
281
  support" must not be the same picture. `@gjsify/adwaita-nativescript` hit the same wall
289
282
  and answered it with a host seam, which is a surface this package does not have.
290
- - **`AdwPasswordEntryRow` publishes no `revealed`, where both sibling renderers do.**
283
+ - **`Adw.PasswordEntryRow` publishes no `revealed`, where both sibling renderers do.**
291
284
  `Adw.PasswordEntryRow` declares no property of its own — its generated prop interface is
292
285
  empty over `AdwEntryRowProps` — and the peek state is private to the widget. A `revealed`
293
286
  prop would be the one place this surface invents a name; the button owns it on both halves.
@@ -300,13 +293,13 @@ than smoothed over.
300
293
  shared fallback. The accessible NAMES beside them do come from the core, so
301
294
  "Show Password"/"Hide Password"/"Apply"/"Caps Lock is on" are one string in one place
302
295
  across three renderers.
303
- - **`AdwClamp` ignores the child's intrinsic minimum on React Native.** libadwaita's
296
+ - **`Adw.Clamp` ignores the child's intrinsic minimum on React Native.** libadwaita's
304
297
  clamp is a two-pass measure-then-allocate, and a child minimum wider than the clamp
305
298
  RAISES all three thresholds — which is how such a child still gets its minimum
306
299
  instead of being cut off. React Native has no such pass: `onLayout` reports a size
307
300
  after layout and never the child's intrinsic minimum. So `childMin`/`childNat` are
308
301
  passed as 0, and a child wider than the clamp is compressed here and is not on GTK.
309
- - **`AdwClamp`'s `small`/`medium`/`large` size class is not carried.** libadwaita stamps
302
+ - **`Adw.Clamp`'s `small`/`medium`/`large` size class is not carried.** libadwaita stamps
310
303
  it on the child as a style class; React Native has no class system to stamp it into,
311
304
  and inventing a styling seam is a decision this slice does not make.
312
305
  - **One unclamped frame.** Before the first `onLayout` there is no available width, so
@@ -318,30 +311,30 @@ than smoothed over.
318
311
  such limit and renders both. Both behaviours are pinned by a test on each side, so
319
312
  neither can move alone. Refusing more than one child on both halves would close it and
320
313
  is a surface decision this slice does not make.
321
- - **`AdwHeaderBar` resolves an unauthored title on GTK and leaves it blank on a phone.**
314
+ - **`Adw.HeaderBar` resolves an unauthored title on GTK and leaves it blank on a phone.**
322
315
  Authoring neither `title` nor `subtitle` installs no title widget at all, so
323
316
  libadwaita's `update_title` (adw-header-bar.c:475) walks navigation page → dialog →
324
317
  window → application name and puts what it finds in the centre; a phone has none of
325
318
  those to walk. Both sides are asserted — the GTK suite reads the window's own title
326
319
  back out of the bar, the React Native suite reads two collapsed labels.
327
- - **`AdwHeaderBar` has a `title`/`subtitle` that `Adw.HeaderBar` does not.** The real
320
+ - **`Adw.HeaderBar` has a `title`/`subtitle` that `Adw.HeaderBar` does not.** The real
328
321
  widget has no `title` property; its derived centre is a plain `gtk_label_new (NULL)`
329
- with no subtitle at all, and an app that wants one sets an `AdwWindowTitle` as its
322
+ with no subtitle at all, and an app that wants one sets an `Adw.WindowTitle` as its
330
323
  title widget. A declarative surface wants the attribute, so authoring either installs
331
- an `AdwWindowTitle` centre. This is the same divergence `@gjsify/adwaita-web` and
324
+ an `Adw.WindowTitle` centre. This is the same divergence `@gjsify/adwaita-web` and
332
325
  `@gjsify/adwaita-nativescript` carry, recorded as `HeaderBarRenderState.derivedSubtitle`
333
326
  in `@gjsify/adwaita-core`.
334
327
  - **Neither renderer here resolves an icon theme, so `iconName` is accepted and not
335
328
  drawn.** `icon-name` names an entry in an ICON THEME and React Native has none — no
336
329
  `Image` source a GNOME symbolic name resolves to, and no renderer for the SVG
337
330
  `@gjsify/adwaita-nativescript` substituted instead. Drawing the name as text would put
338
- the literal `folder-symbolic` on screen. So `AdwStatusPage` shows no icon, `AdwAvatar`'s
331
+ the literal `folder-symbolic` on screen. So `Adw.StatusPage` shows no icon, `Adw.Avatar`'s
339
332
  icon mode is a coloured circle with the initials hidden where GTK draws
340
- `adw-avatar-default-symbolic`, and `AdwButtonContent`'s icon slot sits in the row with
333
+ `adw-avatar-default-symbolic`, and `Adw.ButtonContent`'s icon slot sits in the row with
341
334
  libadwaita's own `hexpand` and holds no glyph. The props are carried so a GTK consumer's
342
335
  props stay portable, and the ABSENCE of an icon node is asserted in each case, so the
343
336
  day one appears it is a decision and not a drift.
344
- - **`AdwToolbarView` does not run libadwaita's allocation on React Native, and cannot.**
337
+ - **`Adw.ToolbarView` does not run libadwaita's allocation on React Native, and cannot.**
345
338
  `adw_toolbar_view_size_allocate` is two chained CLAMPs over the bars' MINIMUM and
346
339
  NATURAL heights — ported as `toolbarViewAllocate` and held to vectors — and React
347
340
  Native hands a component an already-laid-out size and never a child's intrinsic
@@ -349,40 +342,40 @@ than smoothed over.
349
342
  the identity and dress a pass-through up as libadwaita's arithmetic. The consequence is
350
343
  one-directional: a STRETCHY bar keeps its natural height where libadwaita would shrink
351
344
  it toward its minimum to protect the content.
352
- - **`AdwToolbarView`'s four style classes have nowhere to land on a phone.** `raised`,
345
+ - **`Adw.ToolbarView`'s four style classes have nowhere to land on a phone.** `raised`,
353
346
  `border`, `undershoot-top` and `undershoot-bottom` are what `topBarStyle` and
354
347
  `bottomBarStyle` derive; React Native has no class system to stamp them into. Both
355
348
  props are carried and reach no style, which is asserted on the React Native side and
356
349
  measured against libadwaita's own `update_undershoots` on the GTK side.
357
- - **`AdwWrapBox`'s `naturalLineLength` is a MAX SIZE on React Native.** libadwaita caps
350
+ - **`Adw.WrapBox`'s `naturalLineLength` is a MAX SIZE on React Native.** libadwaita caps
358
351
  the box's NATURAL size REQUEST and leaves a larger allocation free to happen; neither
359
352
  CSS nor Yoga has a property that caps only the intrinsic contribution, so this half
360
353
  writes `maxWidth`/`maxHeight`. `@gjsify/adwaita-web` records the same deliberate
361
354
  deviation. Limiting line length inside a popover — the intended use — behaves the same
362
355
  either way.
363
- - **`AdwWrapBox` wraps every child in a `View` of its own.** `flex-grow` and `flex-shrink`
356
+ - **`Adw.WrapBox` wraps every child in a `View` of its own.** `flex-grow` and `flex-shrink`
364
357
  belong to the CHILD, and this component does not own its children's styles:
365
358
  NativeScript sets them as attached properties and the browser publishes a custom
366
359
  property its stylesheet reads, and neither seam exists here. The wrapper is therefore
367
360
  visible in the tree and is asserted rather than left as an implementation detail.
368
- - **`AdwWrapBox`'s `align` is snapped to three positions on both non-GTK renderers.** C
361
+ - **`Adw.WrapBox`'s `align` is snapped to three positions on both non-GTK renderers.** C
369
362
  offsets the whole line block by `roundf (length_delta * align)` — a continuum — and
370
363
  flexbox has `flex-start`, `center` and `flex-end`. The snap is the renderers'
371
364
  approximation and not libadwaita's rule, which is why it lives in
372
365
  `@gjsify/adwaita-core`'s `wrapBoxFlexStyle` rather than in a conformance vector. The
373
366
  GTK half runs none of it: `Adw.WrapBox` is `adw-wrap-layout.c` itself, and the suite
374
367
  reads the continuum back off the live tree.
375
- - **`AdwAvatar`'s font size is the CAP, not a measurement.** `update_font_size` scales
368
+ - **`Adw.Avatar`'s font size is the CAP, not a measurement.** `update_font_size` scales
376
369
  the label's measured aspect ratio against `avatarMaxFontSize(size)`; React Native
377
370
  reports a text box only through `onLayout`, i.e. after layout — the same missing
378
- measure pass that makes `AdwClamp` pass `childMin: 0`. Using the cap alone stays inside
371
+ measure pass that makes `Adw.Clamp` pass `childMin: 0`. Using the cap alone stays inside
379
372
  libadwaita's bound. The NativeScript port's `size * 0.4` heuristic is deliberately not
380
373
  copied: it is not monotonic in `size` and exceeds the cap above ~54 points.
381
- - **`AdwButtonContent` cannot stamp `image-text-button`.** `adw_button_content_root` puts
374
+ - **`Adw.ButtonContent` cannot stamp `image-text-button`.** `adw_button_content_root` puts
382
375
  the class on the nearest `GtkButton` ancestor, and this package ships no button for it
383
376
  to find. `buttonContentStyleTargetIndex` holds the retarget rule for a renderer that has
384
377
  a tree to walk; when a button lands here, that is the call to make.
385
- - **`AdwSpinner` draws the track and not the arc.** `AdwSpinnerPaintable`'s segment
378
+ - **`Adw.Spinner` draws the track and not the arc.** `AdwSpinnerPaintable`'s segment
386
379
  extends, overlaps, contracts and idles on an ease-in-out-sine while the whole figure
387
380
  turns, and drawing it needs a path renderer that is not a dependency of this package.
388
381
  What is drawn is the circle underneath — `ADW_SPINNER_TRACK_OPACITY` of the current
@@ -400,7 +393,7 @@ than smoothed over.
400
393
  `adw_toast_overlay_dismiss_all` animates the strip out over real time, and pumping the
401
394
  main context for ~1.6s leaves the `AdwToastWidget` in place — measured. GTK asserts that
402
395
  the call lands and costs no diagnostic; the removal is asserted where the queue is ours.
403
- - **`AdwBanner` reduces markup to its plain text.** React Native has no inline-markup
396
+ - **`Adw.Banner` reduces markup to its plain text.** React Native has no inline-markup
404
397
  layer, and painting `<b>Metered</b>` literally is further from what GTK draws than
405
398
  painting `Metered` is. Unparseable markup keeps the raw string, which is Pango's own
406
399
  fallback.
@@ -425,7 +418,7 @@ than smoothed over.
425
418
  Native has no slot mechanism, and giving the surface a `prefix` PROP taking a node would
426
419
  be a second child channel that only one half implements, so the surface offers `children`
427
420
  only — the suffix on the action row, the disclosure on the expander.
428
- - **`AdwExpanderRow` carries no `enable-expansion` and no `show-enable-switch`.** The
421
+ - **`Adw.ExpanderRow` carries no `enable-expansion` and no `show-enable-switch`.** The
429
422
  enable switch is a SECOND control inside the row with its own veto over the disclosure,
430
423
  and the rule tying the two flags together lives in no shared place:
431
424
  `@gjsify/adwaita-core`'s `ExpanderState` — what all three renderers compose — models the
@@ -438,11 +431,11 @@ than smoothed over.
438
431
  libadwaita 1.9.3, a `Gtk.Label` disclosed child leaks on unmount behind a single
439
432
  `Gtk-WARNING`, an `Adw.ActionRow` round-trips cleanly. The curated descriptor carries the
440
433
  measurement. A React Native `View` has no such rule.
441
- - **`AdwEntryRow`'s empty↔filled cross-fade is a hard swap.** libadwaita animates between
434
+ - **`Adw.EntryRow`'s empty↔filled cross-fade is a hard swap.** libadwaita animates between
442
435
  the placeholder and the floating title over its own duration; the React Native half
443
436
  switches at the two endpoints, the same compromise `@gjsify/adwaita-nativescript` makes,
444
437
  because a cross-fade needs an animation seam this slice does not add.
445
- - **`AdwSwitchRow` is strictly controlled and `Adw.SwitchRow` is not.** React Native's own
438
+ - **`Adw.SwitchRow` is strictly controlled and `Adw.SwitchRow` is not.** React Native's own
446
439
  contract for `Switch` is that the component renders the `value` prop whatever the user
447
440
  does, so a toggle the consumer declines to echo back is not kept here — where GTK keeps
448
441
  it. The other two stateful rows go the GTK way (see [Widgets](#widgets)); this one goes
@@ -472,7 +465,7 @@ than smoothed over.
472
465
  the sidebar can take its full share of a view too narrow for both panes, and the view
473
466
  cannot refuse to be narrower than its contents the way GTK does (the GTK suite asserts
474
467
  that refusal at 380 against `measureSplitViewHorizontal`; the React Native suite cannot
475
- ask). Same class as `AdwClamp`'s `childMin`.
468
+ ask). Same class as `Adw.Clamp`'s `childMin`.
476
469
  - **The two sidebar-width rules can only be told apart one at a time on GTK.**
477
470
  `resolveNavigationSidebarWidth` caps the sidebar's MAX BOUND by `width - content_min`
478
471
  and `resolveOverlaySidebarWidth` caps the RESULT, which the core's own vectors separate
@@ -504,7 +497,7 @@ than smoothed over.
504
497
  differs is the push/pop DIRECTION, which a renderer spends on a slide and this one has
505
498
  none of. The position IS asserted where it is observable: the docked draw order.
506
499
  - **`sidebarTitle` and `contentTitle` reach a real page on GTK and nothing on a phone.**
507
- They are `Adw.NavigationPage:title` of the wrap `AdwNavigationSplitView` puts around each
500
+ They are `Adw.NavigationPage:title` of the wrap `Adw.NavigationSplitView` puts around each
508
501
  pane, which libadwaita uses for the header of a collapsed view. The React Native half has
509
502
  no header bar to put a title in, so it carries them and draws neither — the same shape as
510
503
  `iconName`.
@@ -527,7 +520,7 @@ than smoothed over.
527
520
  would be read off (measured — the GTK half used to report `''` there, a name no page
528
521
  carries), and on the other half the core's auto-pick lands before the subscription
529
522
  exists. Both halves are asserted at the two ends of that.
530
- - **`AdwViewSwitcher` bundles the stack libadwaita keeps separate.** `Adw.ViewSwitcher:stack`
523
+ - **`Adw.ViewSwitcher` bundles the stack libadwaita keeps separate.** `Adw.ViewSwitcher:stack`
531
524
  points at an `Adw.ViewStack` elsewhere in the tree, and a React prop cannot hold a widget
532
525
  that does not exist yet on the half where widgets exist at all. Both other renderers made
533
526
  the same call. On GTK nothing is simulated: the component builds a real `Adw.ViewStack`
@@ -1 +1 @@
1
- import{AdwActionRow as e}from"./widgets/action-row.gtk.js";import{AdwAvatar as t}from"./widgets/avatar.gtk.js";import{AdwBanner as n}from"./widgets/banner.gtk.js";import{AdwBin as r}from"./widgets/bin.gtk.js";import{AdwButtonContent as i}from"./widgets/button-content.gtk.js";import{AdwButtonRow as a}from"./widgets/button-row.gtk.js";import{AdwClamp as o}from"./widgets/clamp.gtk.js";import{AdwComboRow as s}from"./widgets/combo-row.gtk.js";import{AdwEntryRow as c}from"./widgets/entry-row.gtk.js";import{AdwExpanderRow as l}from"./widgets/expander-row.gtk.js";import{AdwHeaderBar as u}from"./widgets/header-bar.gtk.js";import{AdwNavigationPage as d}from"./widgets/navigation-page.gtk.js";import{AdwNavigationSplitView as f}from"./widgets/navigation-split-view.gtk.js";import{AdwNavigationView as p}from"./widgets/navigation-view.gtk.js";import{AdwOverlaySplitView as m}from"./widgets/overlay-split-view.gtk.js";import{AdwPasswordEntryRow as h}from"./widgets/password-entry-row.gtk.js";import{AdwPreferencesGroup as g}from"./widgets/preferences-group.gtk.js";import{AdwPreferencesPage as _}from"./widgets/preferences-page.gtk.js";import{AdwSpinRow as v}from"./widgets/spin-row.gtk.js";import{AdwSpinner as y}from"./widgets/spinner.gtk.js";import{AdwStatusPage as b}from"./widgets/status-page.gtk.js";import{AdwSwitchRow as x}from"./widgets/switch-row.gtk.js";import{AdwToastOverlay as S}from"./widgets/toast-overlay.gtk.js";import{AdwToolbarView as C}from"./widgets/toolbar-view.gtk.js";import{AdwViewStack as w}from"./widgets/view-stack.gtk.js";import{AdwViewSwitcher as T}from"./widgets/view-switcher.gtk.js";import{AdwWindowTitle as E}from"./widgets/window-title.gtk.js";import{AdwWrapBox as D}from"./widgets/wrap-box.gtk.js";const O={ActionRow:e,Avatar:t,Banner:n,Bin:r,ButtonContent:i,ButtonRow:a,Clamp:o,ComboRow:s,EntryRow:c,ExpanderRow:l,HeaderBar:u,NavigationPage:d,NavigationSplitView:f,NavigationView:p,OverlaySplitView:m,PasswordEntryRow:h,PreferencesGroup:g,PreferencesPage:_,SpinRow:v,Spinner:y,StatusPage:b,SwitchRow:x,ToastOverlay:S,ToolbarView:C,ViewStack:w,ViewSwitcher:T,WindowTitle:E,WrapBox:D};export{O as Adw,e as AdwActionRow,t as AdwAvatar,n as AdwBanner,r as AdwBin,i as AdwButtonContent,a as AdwButtonRow,o as AdwClamp,s as AdwComboRow,c as AdwEntryRow,l as AdwExpanderRow,u as AdwHeaderBar,d as AdwNavigationPage,f as AdwNavigationSplitView,p as AdwNavigationView,m as AdwOverlaySplitView,h as AdwPasswordEntryRow,g as AdwPreferencesGroup,_ as AdwPreferencesPage,v as AdwSpinRow,y as AdwSpinner,b as AdwStatusPage,x as AdwSwitchRow,S as AdwToastOverlay,C as AdwToolbarView,w as AdwViewStack,T as AdwViewSwitcher,E as AdwWindowTitle,D as AdwWrapBox};
1
+ import{AdwActionRow as e}from"./widgets/action-row.gtk.js";import{AdwAvatar as t}from"./widgets/avatar.gtk.js";import{AdwBanner as n}from"./widgets/banner.gtk.js";import{AdwBin as r}from"./widgets/bin.gtk.js";import{AdwButtonContent as i}from"./widgets/button-content.gtk.js";import{AdwButtonRow as a}from"./widgets/button-row.gtk.js";import{AdwClamp as o}from"./widgets/clamp.gtk.js";import{AdwComboRow as s}from"./widgets/combo-row.gtk.js";import{AdwEntryRow as c}from"./widgets/entry-row.gtk.js";import{AdwExpanderRow as l}from"./widgets/expander-row.gtk.js";import{AdwHeaderBar as u}from"./widgets/header-bar.gtk.js";import{AdwNavigationPage as d}from"./widgets/navigation-page.gtk.js";import{AdwNavigationSplitView as f}from"./widgets/navigation-split-view.gtk.js";import{AdwNavigationView as p}from"./widgets/navigation-view.gtk.js";import{AdwOverlaySplitView as m}from"./widgets/overlay-split-view.gtk.js";import{AdwPasswordEntryRow as h}from"./widgets/password-entry-row.gtk.js";import{AdwPreferencesGroup as g}from"./widgets/preferences-group.gtk.js";import{AdwPreferencesPage as _}from"./widgets/preferences-page.gtk.js";import{AdwSpinRow as v}from"./widgets/spin-row.gtk.js";import{AdwSpinner as y}from"./widgets/spinner.gtk.js";import{AdwStatusPage as b}from"./widgets/status-page.gtk.js";import{AdwSwitchRow as x}from"./widgets/switch-row.gtk.js";import{AdwToastOverlay as S}from"./widgets/toast-overlay.gtk.js";import{AdwToolbarView as C}from"./widgets/toolbar-view.gtk.js";import{AdwViewStack as w}from"./widgets/view-stack.gtk.js";import{AdwViewSwitcher as T}from"./widgets/view-switcher.gtk.js";import{AdwWindowTitle as E}from"./widgets/window-title.gtk.js";import{AdwWrapBox as D}from"./widgets/wrap-box.gtk.js";const O={ActionRow:e,Avatar:t,Banner:n,Bin:r,ButtonContent:i,ButtonRow:a,Clamp:o,ComboRow:s,EntryRow:c,ExpanderRow:l,HeaderBar:u,NavigationPage:d,NavigationSplitView:f,NavigationView:p,OverlaySplitView:m,PasswordEntryRow:h,PreferencesGroup:g,PreferencesPage:_,SpinRow:v,Spinner:y,StatusPage:b,SwitchRow:x,ToastOverlay:S,ToolbarView:C,ViewStack:w,ViewSwitcher:T,WindowTitle:E,WrapBox:D};export{O as Adw};
package/lib/esm/index.js CHANGED
@@ -1 +1 @@
1
- import{AdwActionRow as e}from"./widgets/action-row.js";import{AdwAvatar as t}from"./widgets/avatar.js";import{AdwBanner as n}from"./widgets/banner.js";import{AdwBin as r}from"./widgets/bin.js";import{AdwButtonContent as i}from"./widgets/button-content.js";import{AdwButtonRow as a}from"./widgets/button-row.js";import{AdwClamp as o}from"./widgets/clamp.js";import{AdwComboRow as s}from"./widgets/combo-row.js";import{AdwEntryRow as c}from"./widgets/entry-row.js";import{AdwExpanderRow as l}from"./widgets/expander-row.js";import{AdwHeaderBar as u}from"./widgets/header-bar.js";import{AdwNavigationPage as d}from"./widgets/navigation-page.js";import{AdwNavigationSplitView as f}from"./widgets/navigation-split-view.js";import{AdwNavigationView as p}from"./widgets/navigation-view.js";import{AdwOverlaySplitView as m}from"./widgets/overlay-split-view.js";import{AdwPasswordEntryRow as h}from"./widgets/password-entry-row.js";import{AdwPreferencesGroup as g}from"./widgets/preferences-group.js";import{AdwPreferencesPage as _}from"./widgets/preferences-page.js";import{AdwSpinRow as v}from"./widgets/spin-row.js";import{AdwSpinner as y}from"./widgets/spinner.js";import{AdwStatusPage as b}from"./widgets/status-page.js";import{AdwSwitchRow as x}from"./widgets/switch-row.js";import{AdwToastOverlay as S}from"./widgets/toast-overlay.js";import{AdwToolbarView as C}from"./widgets/toolbar-view.js";import{AdwViewStack as w}from"./widgets/view-stack.js";import{AdwViewSwitcher as T}from"./widgets/view-switcher.js";import{AdwWindowTitle as E}from"./widgets/window-title.js";import{AdwWrapBox as D}from"./widgets/wrap-box.js";const O={ActionRow:e,Avatar:t,Banner:n,Bin:r,ButtonContent:i,ButtonRow:a,Clamp:o,ComboRow:s,EntryRow:c,ExpanderRow:l,HeaderBar:u,NavigationPage:d,NavigationSplitView:f,NavigationView:p,OverlaySplitView:m,PasswordEntryRow:h,PreferencesGroup:g,PreferencesPage:_,SpinRow:v,Spinner:y,StatusPage:b,SwitchRow:x,ToastOverlay:S,ToolbarView:C,ViewStack:w,ViewSwitcher:T,WindowTitle:E,WrapBox:D};export{O as Adw,e as AdwActionRow,t as AdwAvatar,n as AdwBanner,r as AdwBin,i as AdwButtonContent,a as AdwButtonRow,o as AdwClamp,s as AdwComboRow,c as AdwEntryRow,l as AdwExpanderRow,u as AdwHeaderBar,d as AdwNavigationPage,f as AdwNavigationSplitView,p as AdwNavigationView,m as AdwOverlaySplitView,h as AdwPasswordEntryRow,g as AdwPreferencesGroup,_ as AdwPreferencesPage,v as AdwSpinRow,y as AdwSpinner,b as AdwStatusPage,x as AdwSwitchRow,S as AdwToastOverlay,C as AdwToolbarView,w as AdwViewStack,T as AdwViewSwitcher,E as AdwWindowTitle,D as AdwWrapBox};
1
+ import{AdwActionRow as e}from"./widgets/action-row.js";import{AdwAvatar as t}from"./widgets/avatar.js";import{AdwBanner as n}from"./widgets/banner.js";import{AdwBin as r}from"./widgets/bin.js";import{AdwButtonContent as i}from"./widgets/button-content.js";import{AdwButtonRow as a}from"./widgets/button-row.js";import{AdwClamp as o}from"./widgets/clamp.js";import{AdwComboRow as s}from"./widgets/combo-row.js";import{AdwEntryRow as c}from"./widgets/entry-row.js";import{AdwExpanderRow as l}from"./widgets/expander-row.js";import{AdwHeaderBar as u}from"./widgets/header-bar.js";import{AdwNavigationPage as d}from"./widgets/navigation-page.js";import{AdwNavigationSplitView as f}from"./widgets/navigation-split-view.js";import{AdwNavigationView as p}from"./widgets/navigation-view.js";import{AdwOverlaySplitView as m}from"./widgets/overlay-split-view.js";import{AdwPasswordEntryRow as h}from"./widgets/password-entry-row.js";import{AdwPreferencesGroup as g}from"./widgets/preferences-group.js";import{AdwPreferencesPage as _}from"./widgets/preferences-page.js";import{AdwSpinRow as v}from"./widgets/spin-row.js";import{AdwSpinner as y}from"./widgets/spinner.js";import{AdwStatusPage as b}from"./widgets/status-page.js";import{AdwSwitchRow as x}from"./widgets/switch-row.js";import{AdwToastOverlay as S}from"./widgets/toast-overlay.js";import{AdwToolbarView as C}from"./widgets/toolbar-view.js";import{AdwViewStack as w}from"./widgets/view-stack.js";import{AdwViewSwitcher as T}from"./widgets/view-switcher.js";import{AdwWindowTitle as E}from"./widgets/window-title.js";import{AdwWrapBox as D}from"./widgets/wrap-box.js";const O={ActionRow:e,Avatar:t,Banner:n,Bin:r,ButtonContent:i,ButtonRow:a,Clamp:o,ComboRow:s,EntryRow:c,ExpanderRow:l,HeaderBar:u,NavigationPage:d,NavigationSplitView:f,NavigationView:p,OverlaySplitView:m,PasswordEntryRow:h,PreferencesGroup:g,PreferencesPage:_,SpinRow:v,Spinner:y,StatusPage:b,SwitchRow:x,ToastOverlay:S,ToolbarView:C,ViewStack:w,ViewSwitcher:T,WindowTitle:E,WrapBox:D};export{O as Adw};
@@ -1 +1 @@
1
- import{AdwActionRow as e}from"./widgets/action-row.native.js";import{AdwAvatar as t}from"./widgets/avatar.native.js";import{AdwBanner as n}from"./widgets/banner.native.js";import{AdwBin as r}from"./widgets/bin.native.js";import{AdwButtonContent as i}from"./widgets/button-content.native.js";import{AdwButtonRow as a}from"./widgets/button-row.native.js";import{AdwClamp as o}from"./widgets/clamp.native.js";import{AdwComboRow as s}from"./widgets/combo-row.native.js";import{AdwEntryRow as c}from"./widgets/entry-row.native.js";import{AdwExpanderRow as l}from"./widgets/expander-row.native.js";import{AdwWindowTitle as u}from"./widgets/window-title.native.js";import{AdwHeaderBar as d}from"./widgets/header-bar.native.js";import{AdwNavigationPage as f}from"./widgets/navigation-page.native.js";import{AdwNavigationSplitView as p}from"./widgets/navigation-split-view.native.js";import{AdwNavigationView as m}from"./widgets/navigation-view.native.js";import{AdwOverlaySplitView as h}from"./widgets/overlay-split-view.native.js";import{AdwPasswordEntryRow as g}from"./widgets/password-entry-row.native.js";import{AdwPreferencesGroup as _}from"./widgets/preferences-group.native.js";import{AdwPreferencesPage as v}from"./widgets/preferences-page.native.js";import{AdwSpinRow as y}from"./widgets/spin-row.native.js";import{AdwSpinner as b}from"./widgets/spinner.native.js";import{AdwStatusPage as x}from"./widgets/status-page.native.js";import{AdwSwitchRow as S}from"./widgets/switch-row.native.js";import{AdwToastOverlay as C}from"./widgets/toast-overlay.native.js";import{AdwToolbarView as w}from"./widgets/toolbar-view.native.js";import{AdwViewStack as T}from"./widgets/view-stack.native.js";import{AdwViewSwitcher as E}from"./widgets/view-switcher.native.js";import{AdwWrapBox as D}from"./widgets/wrap-box.native.js";const O={ActionRow:e,Avatar:t,Banner:n,Bin:r,ButtonContent:i,ButtonRow:a,Clamp:o,ComboRow:s,EntryRow:c,ExpanderRow:l,HeaderBar:d,NavigationPage:f,NavigationSplitView:p,NavigationView:m,OverlaySplitView:h,PasswordEntryRow:g,PreferencesGroup:_,PreferencesPage:v,SpinRow:y,Spinner:b,StatusPage:x,SwitchRow:S,ToastOverlay:C,ToolbarView:w,ViewStack:T,ViewSwitcher:E,WindowTitle:u,WrapBox:D};export{O as Adw,e as AdwActionRow,t as AdwAvatar,n as AdwBanner,r as AdwBin,i as AdwButtonContent,a as AdwButtonRow,o as AdwClamp,s as AdwComboRow,c as AdwEntryRow,l as AdwExpanderRow,d as AdwHeaderBar,f as AdwNavigationPage,p as AdwNavigationSplitView,m as AdwNavigationView,h as AdwOverlaySplitView,g as AdwPasswordEntryRow,_ as AdwPreferencesGroup,v as AdwPreferencesPage,y as AdwSpinRow,b as AdwSpinner,x as AdwStatusPage,S as AdwSwitchRow,C as AdwToastOverlay,w as AdwToolbarView,T as AdwViewStack,E as AdwViewSwitcher,u as AdwWindowTitle,D as AdwWrapBox};
1
+ import{AdwActionRow as e}from"./widgets/action-row.native.js";import{AdwAvatar as t}from"./widgets/avatar.native.js";import{AdwBanner as n}from"./widgets/banner.native.js";import{AdwBin as r}from"./widgets/bin.native.js";import{AdwButtonContent as i}from"./widgets/button-content.native.js";import{AdwButtonRow as a}from"./widgets/button-row.native.js";import{AdwClamp as o}from"./widgets/clamp.native.js";import{AdwComboRow as s}from"./widgets/combo-row.native.js";import{AdwEntryRow as c}from"./widgets/entry-row.native.js";import{AdwExpanderRow as l}from"./widgets/expander-row.native.js";import{AdwWindowTitle as u}from"./widgets/window-title.native.js";import{AdwHeaderBar as d}from"./widgets/header-bar.native.js";import{AdwNavigationPage as f}from"./widgets/navigation-page.native.js";import{AdwNavigationSplitView as p}from"./widgets/navigation-split-view.native.js";import{AdwNavigationView as m}from"./widgets/navigation-view.native.js";import{AdwOverlaySplitView as h}from"./widgets/overlay-split-view.native.js";import{AdwPasswordEntryRow as g}from"./widgets/password-entry-row.native.js";import{AdwPreferencesGroup as _}from"./widgets/preferences-group.native.js";import{AdwPreferencesPage as v}from"./widgets/preferences-page.native.js";import{AdwSpinRow as y}from"./widgets/spin-row.native.js";import{AdwSpinner as b}from"./widgets/spinner.native.js";import{AdwStatusPage as x}from"./widgets/status-page.native.js";import{AdwSwitchRow as S}from"./widgets/switch-row.native.js";import{AdwToastOverlay as C}from"./widgets/toast-overlay.native.js";import{AdwToolbarView as w}from"./widgets/toolbar-view.native.js";import{AdwViewStack as T}from"./widgets/view-stack.native.js";import{AdwViewSwitcher as E}from"./widgets/view-switcher.native.js";import{AdwWrapBox as D}from"./widgets/wrap-box.native.js";const O={ActionRow:e,Avatar:t,Banner:n,Bin:r,ButtonContent:i,ButtonRow:a,Clamp:o,ComboRow:s,EntryRow:c,ExpanderRow:l,HeaderBar:d,NavigationPage:f,NavigationSplitView:p,NavigationView:m,OverlaySplitView:h,PasswordEntryRow:g,PreferencesGroup:_,PreferencesPage:v,SpinRow:y,Spinner:b,StatusPage:x,SwitchRow:S,ToastOverlay:C,ToolbarView:w,ViewStack:T,ViewSwitcher:E,WindowTitle:u,WrapBox:D};export{O as Adw};
@@ -1 +1 @@
1
- import"../_virtual/_rolldown/runtime.js";import{jsx as e}from"@gjsify/gtk-host/react/jsx-runtime";import{ADW_COMBO_NO_SELECTION as t,normalizeComboOptions as n}from"@gjsify/adwaita-core";import r from"gi://Gtk?version=4.0";import{useCallback as i,useMemo as a,useRef as o}from"react";const s=4294967295,comboSelectedIndex=e=>e===4294967295?t:e;function AdwComboRow({title:t,subtitle:s,model:c,selected:l,useSubtitle:u,onNotifySelected:d}){let f=o(null),p=n(c).map(e=>e.label),m=a(()=>new r.StringList({strings:p}),[p.join(``)]),h=i(()=>{let e=f.current;e!==null&&d?.(comboSelectedIndex(e.selected))},[d]);return e(`adw-combo-row`,{ref:f,title:t,subtitle:s,model:m,selected:l,"use-subtitle":u,onNotifySelected:d===void 0?void 0:h})}export{AdwComboRow,s as GTK_INVALID_LIST_POSITION,comboSelectedIndex};
1
+ import"../_virtual/_rolldown/runtime.js";import{jsx as e}from"@gjsify/gtk-host/react/jsx-runtime";import{ADW_COMBO_NO_SELECTION as t}from"@gjsify/adwaita-core";import{useCallback as n,useRef as r}from"react";const i=4294967295,comboSelectedIndex=e=>e===4294967295?t:e;function AdwComboRow({title:t,subtitle:i,model:a,selected:o,useSubtitle:s,onNotifySelected:c}){let l=r(null),u=n(()=>{let e=l.current;e!==null&&c?.(comboSelectedIndex(e.selected))},[c]);return e(`adw-combo-row`,{ref:l,title:t,subtitle:i,model:a,selected:o,"use-subtitle":s,onNotifySelected:c===void 0?void 0:u})}export{AdwComboRow,i as GTK_INVALID_LIST_POSITION,comboSelectedIndex};
@@ -1 +1 @@
1
- import"../_virtual/_rolldown/runtime.js";import{ADW_ROW_HIDDEN_STYLE as e,ADW_ROW_STYLE as t,AdwRowLabels as n}from"../row-shell.native.js";import{ComboState as r,normalizeComboOptions as i}from"@gjsify/adwaita-core";import{useCallback as a,useEffect as o,useRef as s,useState as c}from"react";import{Pressable as l,Text as u,View as d}from"react-native";import{jsx as f,jsxs as p}from"react/jsx-runtime";const optionsKey=e=>i(e).map(e=>`${e.value}\u0000${e.label}`).join(``);function AdwComboRow({title:m,subtitle:h,model:g,selected:_,useSubtitle:v,onNotifySelected:y}){let[b]=c(()=>{let e=new r;return e.setOptions(i(g)),_!==void 0&&e.setSelectedIndex(_),e}),[x,S]=c(()=>({selected:b.selectedIndex,label:b.selectedLabel,presentsChooser:b.presentsChooser}));o(()=>b.subscribe(e=>{S({selected:e.selected,label:e.label,presentsChooser:b.presentsChooser}),y?.(e.selected)}),[b,y]);let C=optionsKey(g),w=s(C);o(()=>{w.current!==C&&(w.current=C,b.setOptions(i(g)))},[b,C]),o(()=>{_!==void 0&&b.setSelectedIndex(_)},[b,_]);let T=a(()=>{b.select((b.selectedIndex+1)%b.count)},[b]);return p(l,{style:t,accessibilityRole:`combobox`,disabled:!x.presentsChooser,onPress:T,children:[f(n,{title:m,subtitle:v===!0?x.label:h}),f(u,{style:v===!0?e:void 0,children:x.label}),f(d,{style:x.presentsChooser?void 0:e,children:f(u,{children:`▾`})})]})}export{AdwComboRow};
1
+ import"../_virtual/_rolldown/runtime.js";import{ADW_ROW_HIDDEN_STYLE as e,ADW_ROW_STYLE as t,AdwRowLabels as n}from"../row-shell.native.js";import{ComboState as r,normalizeComboOptions as i}from"@gjsify/adwaita-core";import{useCallback as a,useEffect as o,useRef as s,useState as c}from"react";import{Pressable as l,Text as u,View as d}from"react-native";import{jsx as f,jsxs as p}from"react/jsx-runtime";const optionsKey=e=>i(e).map(e=>`${e.value}\u0000${e.label}`).join(``);function AdwComboRow({title:m,subtitle:h,model:g,selected:_,useSubtitle:v,onNotifySelected:y}){let[b]=c(()=>{let e=new r;return e.setModel(i(g)),_!==void 0&&e.setSelectedIndex(_),e}),[x,S]=c(()=>({selected:b.selectedIndex,label:b.selectedLabel,presentsChooser:b.presentsChooser}));o(()=>b.subscribe(e=>{S({selected:e.selected,label:e.label,presentsChooser:b.presentsChooser}),y?.(e.selected)}),[b,y]);let C=optionsKey(g),w=s(C);o(()=>{w.current!==C&&(w.current=C,b.setModel(i(g)))},[b,C]),o(()=>{_!==void 0&&b.setSelectedIndex(_)},[b,_]);let T=a(()=>{b.select((b.selectedIndex+1)%b.count)},[b]);return p(l,{style:t,accessibilityRole:`combobox`,disabled:!x.presentsChooser,onPress:T,children:[f(n,{title:m,subtitle:v===!0?x.label:h}),f(u,{style:v===!0?e:void 0,children:x.label}),f(d,{style:x.presentsChooser?void 0:e,children:f(u,{children:`▾`})})]})}export{AdwComboRow};
@@ -1 +1 @@
1
- import"../_virtual/_rolldown/runtime.js";import{jsx as e}from"@gjsify/gtk-host/react/jsx-runtime";import t from"gi://Gtk?version=4.0";import{useCallback as n,useMemo as r,useRef as i}from"react";const a={lower:0,upper:100,stepIncrement:1,value:0};function AdwSpinRow({title:o,subtitle:s,value:c,lower:l,upper:u,stepIncrement:d,digits:f,onNotifyValue:p}){let m=i(null),h=l??a.lower,g=u??a.upper,_=d??a.stepIncrement,v=c??a.value,y=r(()=>new t.Adjustment({lower:h,upper:g,stepIncrement:_,pageIncrement:_,value:v}),[h,g,_,v]),b=n(()=>{let e=m.current;e!==null&&p?.(e.value)},[p]);return e(`adw-spin-row`,{ref:m,title:o,subtitle:s,adjustment:y,digits:f,onNotifyValue:p===void 0?void 0:b})}export{a as ADW_SPIN_ROW_DEFAULTS,AdwSpinRow};
1
+ import"../_virtual/_rolldown/runtime.js";import{jsx as e}from"@gjsify/gtk-host/react/jsx-runtime";import{ADW_ADJUSTMENT_DEFAULTS as t,clampAdjustmentValue as n,normalizeAdjustment as r}from"@gjsify/adwaita-core";import{useCallback as i,useMemo as a,useRef as o}from"react";const s=t;function AdwSpinRow({title:t,subtitle:s,value:c,adjustment:l,digits:u,onNotifyValue:d}){let f=o(null),p=r(l),m=n(p,c??p.value),h=a(()=>({...p,value:m}),[p.lower,p.upper,p.stepIncrement,p.pageIncrement,p.pageSize,m]),g=i(()=>{let e=f.current;e!==null&&d?.(e.value)},[d]);return e(`adw-spin-row`,{ref:f,title:t,subtitle:s,adjustment:h,digits:u,onNotifyValue:d===void 0?void 0:g})}export{s as ADW_SPIN_ROW_DEFAULTS,AdwSpinRow};
@@ -1 +1 @@
1
- import"../_virtual/_rolldown/runtime.js";import{ADW_ROW_STYLE as e,AdwRowLabels as t}from"../row-shell.native.js";import{SpinState as n}from"@gjsify/adwaita-core";import{useCallback as r,useEffect as i,useState as a}from"react";import{Pressable as o,Text as s}from"react-native";import{jsx as c,jsxs as l}from"react/jsx-runtime";function AdwSpinRow({title:u,subtitle:d,value:f,lower:p,upper:m,stepIncrement:h,digits:g,onNotifyValue:_}){let[v]=a(()=>{let e=new n;return p!==void 0&&e.setMin(p),m!==void 0&&e.setMax(m),h!==void 0&&e.setStep(h),f!==void 0&&e.setValue(f),e}),[y,b]=a(()=>v.value);i(()=>v.subscribe(e=>{b(e.value),_?.(e.value)}),[v,_]),i(()=>{p!==void 0&&v.setMin(p)},[v,p]),i(()=>{m!==void 0&&v.setMax(m)},[v,m]),i(()=>{h!==void 0&&v.setStep(h)},[v,h]),i(()=>{f!==void 0&&v.setValue(f)},[v,f]);let x=r(()=>{v.decrement()},[v]),S=r(()=>{v.increment()},[v]);return l(o,{style:e,accessibilityRole:`adjustable`,children:[c(t,{title:u,subtitle:d}),c(s,{children:y.toFixed(g??0)}),c(o,{accessibilityRole:`button`,disabled:y<=v.min,onPress:x,children:c(s,{children:`−`})}),c(o,{accessibilityRole:`button`,disabled:y>=v.max,onPress:S,children:c(s,{children:`+`})})]})}export{AdwSpinRow};
1
+ import"../_virtual/_rolldown/runtime.js";import{ADW_ROW_STYLE as e,AdwRowLabels as t}from"../row-shell.native.js";import{SpinState as n,adjustmentRange as r,normalizeAdjustment as i}from"@gjsify/adwaita-core";import{useCallback as a,useEffect as o,useMemo as s,useState as c}from"react";import{Pressable as l,Text as u}from"react-native";import{jsx as d,jsxs as f}from"react/jsx-runtime";function AdwSpinRow({title:p,subtitle:m,value:h,adjustment:g,digits:_,onNotifyValue:v}){let[y]=c(()=>{let e=new n;return e.configure(g),h!==void 0&&e.setValue(h),e}),[b,x]=c(()=>y.value),[S,C]=c(()=>r(y.adjustment)),w=s(()=>i(g),[g?.lower,g?.upper,g?.stepIncrement,g?.pageIncrement,g?.pageSize,g?.value]),T=h??g?.value;o(()=>y.subscribe(e=>{x(e.value),v?.(e.value)}),[y,v]),o(()=>y.subscribeChanged(e=>C(r(e))),[y]),o(()=>{let{value:e,...t}=w;y.configure(T===void 0?t:{...t,value:T})},[y,w,T]);let E=a(()=>{y.decrement()},[y]),D=a(()=>{y.increment()},[y]);return f(l,{style:e,accessibilityRole:`adjustable`,children:[d(t,{title:p,subtitle:m}),d(u,{children:b.toFixed(_??0)}),d(l,{accessibilityRole:`button`,disabled:b<=S[0],onPress:E,children:d(u,{children:`−`})}),d(l,{accessibilityRole:`button`,disabled:b>=S[1],onPress:D,children:d(u,{children:`+`})})]})}export{AdwSpinRow};
@@ -1,32 +1,4 @@
1
1
  export type { AdwActionRowProps, AdwAvatarProps, AdwBannerProps, AdwBinProps, AdwButtonContentProps, AdwButtonRowProps, AdwClampProps, AdwComboRowProps, AdwEntryRowProps, AdwExpanderRowProps, AdwHeaderBarProps, AdwNavigationPageProps, AdwNavigationSplitViewProps, AdwNavigationViewHandle, AdwNavigationViewProps, AdwOverlaySplitViewProps, AdwPasswordEntryRowProps, AdwPreferencesGroupProps, AdwPreferencesPageProps, AdwRowProps, AdwSidebarWidthProps, AdwSpinRowProps, AdwSpinnerProps, AdwStatusPageProps, AdwSwitchRowProps, AdwToastOverlayHandle, AdwToastOverlayProps, AdwToolbarViewProps, AdwViewStackPageProps, AdwViewStackProps, AdwViewSwitcherProps, AdwWidgetProps, AdwWindowTitleProps, AdwWrapBoxProps, } from './props.js';
2
- export { AdwActionRow } from './widgets/action-row.js';
3
- export { AdwAvatar } from './widgets/avatar.js';
4
- export { AdwBanner } from './widgets/banner.js';
5
- export { AdwBin } from './widgets/bin.js';
6
- export { AdwButtonContent } from './widgets/button-content.js';
7
- export { AdwButtonRow } from './widgets/button-row.js';
8
- export { AdwClamp } from './widgets/clamp.js';
9
- export { AdwComboRow } from './widgets/combo-row.js';
10
- export { AdwEntryRow } from './widgets/entry-row.js';
11
- export { AdwExpanderRow } from './widgets/expander-row.js';
12
- export { AdwHeaderBar } from './widgets/header-bar.js';
13
- export { AdwNavigationPage } from './widgets/navigation-page.js';
14
- export { AdwNavigationSplitView } from './widgets/navigation-split-view.js';
15
- export { AdwNavigationView } from './widgets/navigation-view.js';
16
- export { AdwOverlaySplitView } from './widgets/overlay-split-view.js';
17
- export { AdwPasswordEntryRow } from './widgets/password-entry-row.js';
18
- export { AdwPreferencesGroup } from './widgets/preferences-group.js';
19
- export { AdwPreferencesPage } from './widgets/preferences-page.js';
20
- export { AdwSpinRow } from './widgets/spin-row.js';
21
- export { AdwSpinner } from './widgets/spinner.js';
22
- export { AdwStatusPage } from './widgets/status-page.js';
23
- export { AdwSwitchRow } from './widgets/switch-row.js';
24
- export { AdwToastOverlay } from './widgets/toast-overlay.js';
25
- export { AdwToolbarView } from './widgets/toolbar-view.js';
26
- export { AdwViewStack } from './widgets/view-stack.js';
27
- export { AdwViewSwitcher } from './widgets/view-switcher.js';
28
- export { AdwWindowTitle } from './widgets/window-title.js';
29
- export { AdwWrapBox } from './widgets/wrap-box.js';
30
2
  import { AdwActionRow as ActionRow } from './widgets/action-row.js';
31
3
  import { AdwAvatar as Avatar } from './widgets/avatar.js';
32
4
  import { AdwBanner as Banner } from './widgets/banner.js';
@@ -1,32 +1,4 @@
1
1
  export type { AdwActionRowProps, AdwAvatarProps, AdwBannerProps, AdwBinProps, AdwButtonContentProps, AdwButtonRowProps, AdwClampProps, AdwComboRowProps, AdwEntryRowProps, AdwExpanderRowProps, AdwHeaderBarProps, AdwNavigationPageProps, AdwNavigationSplitViewProps, AdwNavigationViewHandle, AdwNavigationViewProps, AdwOverlaySplitViewProps, AdwPasswordEntryRowProps, AdwPreferencesGroupProps, AdwPreferencesPageProps, AdwRowProps, AdwSidebarWidthProps, AdwSpinRowProps, AdwSpinnerProps, AdwStatusPageProps, AdwSwitchRowProps, AdwToastOverlayHandle, AdwToastOverlayProps, AdwToolbarViewProps, AdwViewStackPageProps, AdwViewStackProps, AdwViewSwitcherProps, AdwWidgetProps, AdwWindowTitleProps, AdwWrapBoxProps, } from './props.js';
2
- export { AdwActionRow } from './widgets/action-row.gtk.js';
3
- export { AdwAvatar } from './widgets/avatar.gtk.js';
4
- export { AdwBanner } from './widgets/banner.gtk.js';
5
- export { AdwBin } from './widgets/bin.gtk.js';
6
- export { AdwButtonContent } from './widgets/button-content.gtk.js';
7
- export { AdwButtonRow } from './widgets/button-row.gtk.js';
8
- export { AdwClamp } from './widgets/clamp.gtk.js';
9
- export { AdwComboRow } from './widgets/combo-row.gtk.js';
10
- export { AdwEntryRow } from './widgets/entry-row.gtk.js';
11
- export { AdwExpanderRow } from './widgets/expander-row.gtk.js';
12
- export { AdwHeaderBar } from './widgets/header-bar.gtk.js';
13
- export { AdwNavigationPage } from './widgets/navigation-page.gtk.js';
14
- export { AdwNavigationSplitView } from './widgets/navigation-split-view.gtk.js';
15
- export { AdwNavigationView } from './widgets/navigation-view.gtk.js';
16
- export { AdwOverlaySplitView } from './widgets/overlay-split-view.gtk.js';
17
- export { AdwPasswordEntryRow } from './widgets/password-entry-row.gtk.js';
18
- export { AdwPreferencesGroup } from './widgets/preferences-group.gtk.js';
19
- export { AdwPreferencesPage } from './widgets/preferences-page.gtk.js';
20
- export { AdwSpinRow } from './widgets/spin-row.gtk.js';
21
- export { AdwSpinner } from './widgets/spinner.gtk.js';
22
- export { AdwStatusPage } from './widgets/status-page.gtk.js';
23
- export { AdwSwitchRow } from './widgets/switch-row.gtk.js';
24
- export { AdwToastOverlay } from './widgets/toast-overlay.gtk.js';
25
- export { AdwToolbarView } from './widgets/toolbar-view.gtk.js';
26
- export { AdwViewStack } from './widgets/view-stack.gtk.js';
27
- export { AdwViewSwitcher } from './widgets/view-switcher.gtk.js';
28
- export { AdwWindowTitle } from './widgets/window-title.gtk.js';
29
- export { AdwWrapBox } from './widgets/wrap-box.gtk.js';
30
2
  import { AdwActionRow as ActionRow } from './widgets/action-row.gtk.js';
31
3
  import { AdwAvatar as Avatar } from './widgets/avatar.gtk.js';
32
4
  import { AdwBanner as Banner } from './widgets/banner.gtk.js';
@@ -1,32 +1,4 @@
1
1
  export type { AdwActionRowProps, AdwAvatarProps, AdwBannerProps, AdwBinProps, AdwButtonContentProps, AdwButtonRowProps, AdwClampProps, AdwComboRowProps, AdwEntryRowProps, AdwExpanderRowProps, AdwHeaderBarProps, AdwNavigationPageProps, AdwNavigationSplitViewProps, AdwNavigationViewHandle, AdwNavigationViewProps, AdwOverlaySplitViewProps, AdwPasswordEntryRowProps, AdwPreferencesGroupProps, AdwPreferencesPageProps, AdwRowProps, AdwSidebarWidthProps, AdwSpinRowProps, AdwSpinnerProps, AdwStatusPageProps, AdwSwitchRowProps, AdwToastOverlayHandle, AdwToastOverlayProps, AdwToolbarViewProps, AdwViewStackPageProps, AdwViewStackProps, AdwViewSwitcherProps, AdwWidgetProps, AdwWindowTitleProps, AdwWrapBoxProps, } from './props.js';
2
- export { AdwActionRow } from './widgets/action-row.native.js';
3
- export { AdwAvatar } from './widgets/avatar.native.js';
4
- export { AdwBanner } from './widgets/banner.native.js';
5
- export { AdwBin } from './widgets/bin.native.js';
6
- export { AdwButtonContent } from './widgets/button-content.native.js';
7
- export { AdwButtonRow } from './widgets/button-row.native.js';
8
- export { AdwClamp } from './widgets/clamp.native.js';
9
- export { AdwComboRow } from './widgets/combo-row.native.js';
10
- export { AdwEntryRow } from './widgets/entry-row.native.js';
11
- export { AdwExpanderRow } from './widgets/expander-row.native.js';
12
- export { AdwHeaderBar } from './widgets/header-bar.native.js';
13
- export { AdwNavigationPage } from './widgets/navigation-page.native.js';
14
- export { AdwNavigationSplitView } from './widgets/navigation-split-view.native.js';
15
- export { AdwNavigationView } from './widgets/navigation-view.native.js';
16
- export { AdwOverlaySplitView } from './widgets/overlay-split-view.native.js';
17
- export { AdwPasswordEntryRow } from './widgets/password-entry-row.native.js';
18
- export { AdwPreferencesGroup } from './widgets/preferences-group.native.js';
19
- export { AdwPreferencesPage } from './widgets/preferences-page.native.js';
20
- export { AdwSpinRow } from './widgets/spin-row.native.js';
21
- export { AdwSpinner } from './widgets/spinner.native.js';
22
- export { AdwStatusPage } from './widgets/status-page.native.js';
23
- export { AdwSwitchRow } from './widgets/switch-row.native.js';
24
- export { AdwToastOverlay } from './widgets/toast-overlay.native.js';
25
- export { AdwToolbarView } from './widgets/toolbar-view.native.js';
26
- export { AdwViewStack } from './widgets/view-stack.native.js';
27
- export { AdwViewSwitcher } from './widgets/view-switcher.native.js';
28
- export { AdwWindowTitle } from './widgets/window-title.native.js';
29
- export { AdwWrapBox } from './widgets/wrap-box.native.js';
30
2
  import { AdwActionRow as ActionRow } from './widgets/action-row.native.js';
31
3
  import { AdwAvatar as Avatar } from './widgets/avatar.native.js';
32
4
  import { AdwBanner as Banner } from './widgets/banner.native.js';
@@ -1,4 +1,4 @@
1
- import type { AdwBannerButtonStyle, AdwComboOptionInput, AdwLengthUnit, AdwPackType, AdwToast, AdwToolbarStyle, AdwViewSwitcherPolicy, AdwWrapBoxJustify, AdwWrapBoxOrientation, AdwWrapBoxPackDirection, AdwWrapPolicy } from '@gjsify/adwaita-core';
1
+ import type { AdwAdjustmentInput, AdwBannerButtonStyle, AdwLengthUnit, AdwListModelInput, AdwPackType, AdwToast, AdwToolbarStyle, AdwViewSwitcherPolicy, AdwWrapBoxJustify, AdwWrapBoxOrientation, AdwWrapBoxPackDirection, AdwWrapPolicy } from '@gjsify/adwaita-core';
2
2
  import type { ReactNode, Ref } from 'react';
3
3
  /**
4
4
  * What a widget that HOLDS a child accepts.
@@ -475,11 +475,12 @@ export interface AdwPreferencesGroupProps extends AdwWidgetProps {
475
475
  * `model` IS THE LIBADWAITA NAME AND NOT THE LIBADWAITA TYPE, which is the one liberty this
476
476
  * surface takes and the reason it can exist at all. `AdwComboRow:model` is a
477
477
  * `Gio.ListModel`; a props file that may import neither `gi://Gio` nor `react-native` cannot
478
- * name that type, and the gallery refuses the widget outright for exactly this
479
- * (`adwaita-gallery-trees.mjs`: "its items are a Gio.ListModel; a row without them teaches
480
- * the wrong thing"). What both halves CAN share is `@gjsify/adwaita-core`'s
481
- * `AdwComboOptionInput` — the option vocabulary `<adw-combo-row>` and
482
- * `@gjsify/adwaita-nativescript` already accept — so the property keeps libadwaita's name
478
+ * name that type, and the gallery still refuses the widget — no longer for the value but for
479
+ * the seam (`adwaita-gallery-trees.mjs`: "its model is a Gio.ListModel, and nothing turns
480
+ * the portable list form into one at the ParamSpec seam"). What both halves CAN share is
481
+ * `@gjsify/adwaita-core`'s `AdwListModelInput` — the portable list model (ADR 0046), the
482
+ * item vocabulary `<adw-combo-row>` and `@gjsify/adwaita-nativescript` already accept —
483
+ * so the property keeps libadwaita's name
483
484
  * and takes the shared description of a model. The GTK half turns it into the real
484
485
  * `Gtk.StringList` it has to be; the React Native half feeds it to `ComboState`.
485
486
  *
@@ -502,7 +503,7 @@ export interface AdwPreferencesGroupProps extends AdwWidgetProps {
502
503
  */
503
504
  export interface AdwComboRowProps extends AdwRowProps {
504
505
  /** `model` — the selectable items. See above on the type. */
505
- model?: readonly AdwComboOptionInput[];
506
+ model?: AdwListModelInput;
506
507
  /** `selected` — the position of the selected item. Default 0. */
507
508
  selected?: number;
508
509
  /**
@@ -525,19 +526,15 @@ export interface AdwComboRowProps extends AdwRowProps {
525
526
  *
526
527
  * The two labels are {@link AdwRowProps}', as on every other boxed-list row here.
527
528
  *
528
- * THE RANGE IS THREE SCALARS AND libadwaita SPELLS IT AS ONE OBJECT. `AdwSpinRow:adjustment`
529
- * is a `Gtk.Adjustment` — a GObject that is not a widget, which is what the gallery refuses
530
- * the widget for — so the same rule as {@link AdwComboRowProps}' `model` applies: this file
531
- * cannot name the type, and the three values it carries are named here instead. The names
532
- * are the ADJUSTMENT's own GObject property names — `Gtk.Adjustment:lower`, `:upper`,
533
- * `:step-increment` — rather than a fourth private spelling.
529
+ * THE RANGE IS ONE OBJECT, as libadwaita spells it. `AdwSpinRow:adjustment` is a
530
+ * `Gtk.Adjustment` — a GObject that is not a widget — and this file names the portable form
531
+ * of it, `@gjsify/adwaita-core`'s {@link AdwAdjustmentInput} (ADR 0047), which is the value
532
+ * all four surfaces take under this one key.
534
533
  *
535
- * THAT IS A DECLARED DIVERGENCE FROM THE TWO SIBLING RENDERERS, which flatten the same three
536
- * onto `min`/`max`/`step`. Those are `adw_spin_row_new_with_range`'s PARAMETER names, not
537
- * property names, and `props.ts`' rule is that a caller writes the property they would look
538
- * up in libadwaita's documentation. `@gjsify/adwaita-core`'s `SpinState` calls them
539
- * `min`/`max`/`step` internally; both halves here map onto that, so the arithmetic is still
540
- * shared and only the spelling at the surface differs.
534
+ * IT USED TO BE THREE SCALARS HERE, hoisted onto the ROW: `lower`, `upper` and
535
+ * `stepIncrement` — the adjustment's own GObject property names, on an object that has
536
+ * none of them. The right vocabulary in the wrong place, and a fourth shape beside the two
537
+ * sibling renderers' `min`/`max`/`step`. All three converged on the one key the row has.
541
538
  *
542
539
  * `digits` IS A ROW PROPERTY AND NOT AN ADJUSTMENT ONE — `AdwSpinRow:digits`, the number of
543
540
  * decimal places DISPLAYED. It is carried because it is the only one of the row's own
@@ -550,14 +547,18 @@ export interface AdwComboRowProps extends AdwRowProps {
550
547
  * sibling renderer has them either.
551
548
  */
552
549
  export interface AdwSpinRowProps extends AdwRowProps {
553
- /** `value` — the current number, clamped into {@link lower}…{@link upper}. Default 0. */
550
+ /** `value` — the current number, clamped into the {@link adjustment}'s range. Default 0. */
554
551
  value?: number;
555
- /** `Gtk.Adjustment:lower` — the smallest value the stepper reaches. Default 0. */
556
- lower?: number;
557
- /** `Gtk.Adjustment:upper` — the largest. Default 100, which is `SpinState`'s own. */
558
- upper?: number;
559
- /** `Gtk.Adjustment:step-increment` — one stepper press. Default 1. */
560
- stepIncrement?: number;
552
+ /**
553
+ * `adjustment` — the range this row steps through, as `@gjsify/adwaita-core`'s portable
554
+ * {@link AdwAdjustmentInput} (ADR 0047).
555
+ *
556
+ * It used to be three flat props here (`lower`, `upper`, `stepIncrement`), which were
557
+ * `Gtk.Adjustment`'s own field names hoisted onto the ROW — the right vocabulary in the
558
+ * wrong place, since `Adw.SpinRow` has no such properties. Unwritten fields take
559
+ * `ADW_ADJUSTMENT_DEFAULTS`, so `adjustment={{ upper: 20 }}` is 0…20 step 1.
560
+ */
561
+ adjustment?: AdwAdjustmentInput;
561
562
  /** `digits` — decimal places DISPLAYED. Default 0. */
562
563
  digits?: number;
563
564
  /**
@@ -1,20 +1,15 @@
1
1
  /** @jsxImportSource @gjsify/gtk-host/react */
2
2
  import { type ReactElement } from 'react';
3
+ import { type AdwAdjustment } from '@gjsify/adwaita-core';
3
4
  import type { AdwSpinRowProps } from '../props.js';
4
5
  /**
5
- * `SpinState`'s own defaults, which are the ones the React Native half falls back to.
6
+ * The defaults both halves fall back to — re-exported from `@gjsify/adwaita-core`, which is
7
+ * where they moved with the value they describe (ADR 0047).
6
8
  *
7
- * Exported so the spec asserts the two halves against ONE table rather than each against its
8
- * own literals. They are not libadwaita's: a bare `Gtk.Adjustment` is 0…0 with a step of 0,
9
- * which is a spin row that cannot move. `@gjsify/adwaita-core` picked 0…100 step 1, both
10
- * sibling renderers use it, and the GTK half adopts it here rather than shipping a widget
11
- * whose omitted range means something else than it does on a phone.
9
+ * Kept exported under this name because the spec asserts the two halves against ONE table
10
+ * rather than each against its own literals. They are not libadwaita's: a bare
11
+ * `Gtk.Adjustment` is 0…0 with a step of 0, which is a spin row that cannot move.
12
12
  */
13
- export declare const ADW_SPIN_ROW_DEFAULTS: {
14
- readonly lower: 0;
15
- readonly upper: 100;
16
- readonly stepIncrement: 1;
17
- readonly value: 0;
18
- };
13
+ export declare const ADW_SPIN_ROW_DEFAULTS: AdwAdjustment;
19
14
  /** {@link import('./spin-row.js').AdwSpinRow} on GTK. */
20
- export declare function AdwSpinRow({ title, subtitle, value, lower, upper, stepIncrement, digits, onNotifyValue, }: AdwSpinRowProps): ReactElement | null;
15
+ export declare function AdwSpinRow({ title, subtitle, value, adjustment, digits, onNotifyValue, }: AdwSpinRowProps): ReactElement | null;
@@ -2,4 +2,4 @@
2
2
  import { type ReactElement } from 'react';
3
3
  import type { AdwSpinRowProps } from '../props.js';
4
4
  /** {@link import('./spin-row.js').AdwSpinRow} on React Native. */
5
- export declare function AdwSpinRow({ title, subtitle, value, lower, upper, stepIncrement, digits, onNotifyValue, }: AdwSpinRowProps): ReactElement | null;
5
+ export declare function AdwSpinRow({ title, subtitle, value, adjustment, digits, onNotifyValue, }: AdwSpinRowProps): ReactElement | null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gjsify/adwaita-react-native",
3
- "version": "0.47.0",
3
+ "version": "0.49.0",
4
4
  "description": "Adwaita widgets with one API surface and two implementations — the real Adw.* widget on GTK4, React Native primitives on a phone",
5
5
  "type": "module",
6
6
  "module": "lib/esm/index.js",
@@ -182,8 +182,8 @@
182
182
  "design-system"
183
183
  ],
184
184
  "dependencies": {
185
- "@gjsify/adwaita-core": "^0.47.0",
186
- "@gjsify/gtk-host": "^0.47.0"
185
+ "@gjsify/adwaita-core": "^0.49.0",
186
+ "@gjsify/gtk-host": "^0.49.0"
187
187
  },
188
188
  "peerDependencies": {
189
189
  "react": "^19.2.0",
@@ -198,8 +198,8 @@
198
198
  "@girs/adw-1": "4.6.0",
199
199
  "@girs/gjs": "4.6.0",
200
200
  "@girs/gtk-4.0": "4.6.0",
201
- "@gjsify/cli": "^0.47.0",
202
- "@gjsify/unit": "^0.47.0",
201
+ "@gjsify/cli": "^0.49.0",
202
+ "@gjsify/unit": "^0.49.0",
203
203
  "@types/node": "^25.9.2",
204
204
  "@types/react": "^19.2.2",
205
205
  "@types/react-test-renderer": "^19.1.0",