@gjsify/adwaita-core 0.51.0 → 0.52.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 (48) hide show
  1. package/lib/esm/box.js +1 -0
  2. package/lib/esm/conformance/box.js +1 -0
  3. package/lib/esm/conformance/dialog.js +1 -1
  4. package/lib/esm/conformance/index.js +1 -1
  5. package/lib/esm/conformance/label.js +1 -0
  6. package/lib/esm/conformance/rows.js +1 -1
  7. package/lib/esm/conformance/shared-trees.js +1 -1
  8. package/lib/esm/conformance/tags.js +1 -0
  9. package/lib/esm/conformance/value-lists.js +1 -0
  10. package/lib/esm/dialog.js +1 -1
  11. package/lib/esm/gio-menu.js +1 -0
  12. package/lib/esm/gtk-adjustment.js +1 -0
  13. package/lib/esm/gtk-string-list.js +1 -0
  14. package/lib/esm/index.js +1 -1
  15. package/lib/esm/label.js +1 -0
  16. package/lib/esm/markup.js +4 -0
  17. package/lib/esm/rows.js +1 -1
  18. package/lib/esm/source.js +1 -0
  19. package/lib/esm/tags.js +1 -0
  20. package/lib/esm/tokens.generated.js +1 -1
  21. package/lib/types/box.d.ts +18 -0
  22. package/lib/types/box.spec.d.ts +2 -0
  23. package/lib/types/conformance/box.d.ts +21 -0
  24. package/lib/types/conformance/dialog.d.ts +123 -1
  25. package/lib/types/conformance/index.d.ts +14 -6
  26. package/lib/types/conformance/label.d.ts +115 -0
  27. package/lib/types/conformance/rows.d.ts +29 -0
  28. package/lib/types/conformance/shared-trees.d.ts +155 -5
  29. package/lib/types/conformance/tags.d.ts +46 -0
  30. package/lib/types/conformance/value-lists.d.ts +19 -0
  31. package/lib/types/dialog.d.ts +163 -0
  32. package/lib/types/gio-menu.d.ts +46 -0
  33. package/lib/types/gtk-adjustment.d.ts +73 -0
  34. package/lib/types/gtk-adjustment.spec.d.ts +2 -0
  35. package/lib/types/gtk-string-list.d.ts +70 -0
  36. package/lib/types/gtk-string-list.spec.d.ts +2 -0
  37. package/lib/types/index.d.ts +14 -3
  38. package/lib/types/label.d.ts +135 -0
  39. package/lib/types/label.spec.d.ts +2 -0
  40. package/lib/types/markup.d.ts +14 -0
  41. package/lib/types/markup.spec.d.ts +2 -0
  42. package/lib/types/rows.d.ts +20 -0
  43. package/lib/types/source.d.ts +94 -0
  44. package/lib/types/source.spec.d.ts +2 -0
  45. package/lib/types/tags.d.ts +48 -0
  46. package/lib/types/tags.spec.d.ts +2 -0
  47. package/lib/types/tokens.generated.d.ts +1 -1
  48. package/package.json +12 -4
@@ -1,4 +1,4 @@
1
- import type { BottomSheetCloseOutcome, BottomSheetCloseSource, BottomSheetTeardownCallback } from '../dialog.js';
1
+ import type { BottomSheetChrome, BottomSheetCloseOutcome, BottomSheetCloseSource, BottomSheetOpenOutcome, BottomSheetOpenSource, BottomSheetSwipeTrackerConfig, BottomSheetSwipeTrackerState, BottomSheetTeardownCallback } from '../dialog.js';
2
2
  /** One `resolveBottomSheetClose` expectation. */
3
3
  export interface BottomSheetCloseVector {
4
4
  /** Which affordance asked to close. */
@@ -90,3 +90,125 @@ export declare function runBottomSheetSteps(adapter: BottomSheetPresentationAdap
90
90
  * carrying an unchanged payload.
91
91
  */
92
92
  export declare const BOTTOM_SHEET_PRESENTATION_VECTORS: ReadonlyArray<BottomSheetPresentationVector>;
93
+ /** One `resolveBottomSheetOpen` expectation. */
94
+ export interface BottomSheetOpenVector {
95
+ /** Which affordance asked to open. */
96
+ source: BottomSheetOpenSource;
97
+ /** `AdwBottomSheet:open` at the time of the request. */
98
+ open: boolean;
99
+ /** `AdwBottomSheet:can-open` at the time of the request. */
100
+ canOpen: boolean;
101
+ /** Whether `AdwBottomSheet:bottom-bar` is set. */
102
+ hasBottomBar: boolean;
103
+ /** `AdwBottomSheet:reveal-bottom-bar`. */
104
+ revealBottomBar: boolean;
105
+ /** What the C source does with it. */
106
+ outcome: BottomSheetOpenOutcome;
107
+ rule: string;
108
+ derivedFrom: string;
109
+ }
110
+ /**
111
+ * Every distinguishable `(source, open, canOpen, hasBottomBar, revealBottomBar)` the open
112
+ * gate answers differently for — so a renderer cannot pass by wiring the bar to `open = true`
113
+ * and calling it done.
114
+ */
115
+ export declare const BOTTOM_SHEET_OPEN_VECTORS: ReadonlyArray<BottomSheetOpenVector>;
116
+ /** One `resolveBottomSheetSwipeTracker` expectation. */
117
+ export interface BottomSheetSwipeTrackerVector {
118
+ /** The four properties `update_swipe_tracker` reads. */
119
+ state: BottomSheetSwipeTrackerState;
120
+ /** The three settings it writes. */
121
+ config: BottomSheetSwipeTrackerConfig;
122
+ rule: string;
123
+ derivedFrom: string;
124
+ }
125
+ /**
126
+ * `update_swipe_tracker`'s three assignments, row by row.
127
+ *
128
+ * CORE-ONLY: an `AdwSwipeTracker` has no counterpart in either port — neither renderer runs a
129
+ * gesture tracker, so there is no object to read these settings off. Its `enabled` line is
130
+ * the same fact as the `'swipe'` rows of BOTTOM_SHEET_OPEN_VECTORS and BOTTOM_SHEET_CLOSE_VECTORS,
131
+ * which both renderers drive against their real widgets; this table is the third assignment
132
+ * and the conjunction written out, not a second source of truth.
133
+ */
134
+ export declare const BOTTOM_SHEET_SWIPE_TRACKER_VECTORS: ReadonlyArray<BottomSheetSwipeTrackerVector>;
135
+ /** One step of a {@link BottomSheetBottomBarVector}, in the order it is applied. */
136
+ export type BottomSheetBottomBarStep =
137
+ /** `adw_bottom_sheet_set_bottom_bar` — a widget, or NULL. */
138
+ {
139
+ readonly kind: 'setBottomBar';
140
+ readonly present: boolean;
141
+ }
142
+ /** `adw_bottom_sheet_set_can_open`. */
143
+ | {
144
+ readonly kind: 'setCanOpen';
145
+ readonly canOpen: boolean;
146
+ }
147
+ /** `adw_bottom_sheet_set_reveal_bottom_bar`. */
148
+ | {
149
+ readonly kind: 'setRevealBottomBar';
150
+ readonly reveal: boolean;
151
+ }
152
+ /** `adw_bottom_sheet_set_modal`. */
153
+ | {
154
+ readonly kind: 'setModal';
155
+ readonly modal: boolean;
156
+ }
157
+ /** The programmatic path — `adw_bottom_sheet_set_open`, ignores `can-open`. */
158
+ | {
159
+ readonly kind: 'setOpen';
160
+ readonly open: boolean;
161
+ }
162
+ /** The interactive path — runs the {@link BOTTOM_SHEET_OPEN_VECTORS} gate. */
163
+ | {
164
+ readonly kind: 'requestOpen';
165
+ readonly source: BottomSheetOpenSource;
166
+ };
167
+ /**
168
+ * One end-to-end bottom-bar expectation.
169
+ *
170
+ * Every field is observable from a RENDERER: `chrome` is what it has to paint (which layer
171
+ * shows, whether the surface is on screen, whether the bar looks inert) and `notifications`
172
+ * is the `notify::open` stream. So the same row drives the core suite and both renderer
173
+ * suites against their real widgets.
174
+ */
175
+ export interface BottomSheetBottomBarVector {
176
+ /** Applied in order, through the surface every implementation exposes. */
177
+ steps: readonly BottomSheetBottomBarStep[];
178
+ /** The outcome of each `requestOpen` step, in order. */
179
+ outcomes: readonly BottomSheetOpenOutcome[];
180
+ /** Every `notify::open` payload, in order. */
181
+ notifications: readonly boolean[];
182
+ /** `open` after the last step. */
183
+ open: boolean;
184
+ /** What the renderer must be showing after the last step. */
185
+ chrome: BottomSheetChrome;
186
+ rule: string;
187
+ derivedFrom: string;
188
+ }
189
+ /**
190
+ * The three-plus-two-method surface a {@link BottomSheetBottomBarVector} is replayed
191
+ * against. Core implements it directly; each renderer implements it by driving its REAL
192
+ * widget (adopting a bar child, writing an attribute, clicking the bar).
193
+ */
194
+ export interface BottomSheetBottomBarAdapter {
195
+ /** Give the sheet a bottom bar, or take it away (`AdwBottomSheet:bottom-bar`). */
196
+ setBottomBar(present: boolean): void;
197
+ /** `AdwBottomSheet:can-open`. */
198
+ setCanOpen(canOpen: boolean): void;
199
+ /** `AdwBottomSheet:reveal-bottom-bar`. */
200
+ setRevealBottomBar(reveal: boolean): void;
201
+ /** `AdwBottomSheet:modal`. */
202
+ setModal(modal: boolean): void;
203
+ /** The programmatic path (`AdwBottomSheet:open`). */
204
+ setOpen(open: boolean): void;
205
+ /** The interactive path — returns what the gate decided. */
206
+ requestOpen(source: BottomSheetOpenSource): BottomSheetOpenOutcome;
207
+ }
208
+ /**
209
+ * Replay a vector's steps against `adapter`, collecting the outcome of each `requestOpen`
210
+ * step in order. Shared by all three suites so no side can drift in HOW it replays a row.
211
+ */
212
+ export declare function runBottomSheetBottomBarSteps(adapter: BottomSheetBottomBarAdapter, steps: readonly BottomSheetBottomBarStep[]): BottomSheetOpenOutcome[];
213
+ /** The bottom bar's life as scripts: adopting one, gating it, revealing it, clicking it. */
214
+ export declare const BOTTOM_SHEET_BOTTOM_BAR_VECTORS: ReadonlyArray<BottomSheetBottomBarVector>;
@@ -12,8 +12,8 @@ export { BUTTON_STYLE_CLASS_VECTORS } from './button.js';
12
12
  export type { ButtonStyleClassVector } from './button.js';
13
13
  export { RADIO_GROUP_VECTORS } from './checks.js';
14
14
  export type { RadioGroupStep, RadioGroupVector } from './checks.js';
15
- export { COMBO_CHOOSER_VECTORS, COMBO_SELECTION_VECTORS } from './rows.js';
16
- export type { ComboChooserVector, ComboSelectionStep, ComboSelectionVector } from './rows.js';
15
+ export { COMBO_CHOOSER_VECTORS, COMBO_SELECTION_VECTORS, TOGGLE_ACTIVE_NAME_VECTORS } from './rows.js';
16
+ export type { ComboChooserVector, ComboSelectionStep, ComboSelectionVector, ToggleActiveNameVector } from './rows.js';
17
17
  export { VIEW_STACK_ICON_NAME_VECTORS, VIEW_STACK_PAGE_VECTORS, VIEW_STACK_VECTORS } from './view-stack.js';
18
18
  export type { ViewStackIconNameVector, ViewStackPageDescriptorVector, ViewStackVector, ViewStackVectorChange, ViewStackVectorOp, ViewStackVectorPage, } from './view-stack.js';
19
19
  export { NAVIGATION_VIEW_VECTORS, collectNavigationState, navigationEventLog, runNavigationSteps, } from './navigation-view.js';
@@ -44,8 +44,8 @@ export { CASE_FOLD_VECTORS, MAKE_COMPARABLE_VECTORS, PREFERENCES_GROUP_HEADER_VE
44
44
  export type { CaseFoldVector, MakeComparableVector, PreferencesGroupHeaderVector, PreferencesSearchExpectation, PreferencesSearchVector, RowMatchVector, SearchCorpusVector, SearchRowSubtitleVector, StripMarkupVector, StripMnemonicVector, } from './preferences.js';
45
45
  export { CLAMP_ALLOCATE_VECTORS, CLAMP_CHILD_SIZE_VECTORS, CLAMP_PROPERTY_VECTORS, CLAMP_SIZE_FROM_CHILD_VECTORS, CLAMP_THRESHOLD_VECTORS, SPINNER_GEOMETRY_VECTORS, SPINNER_SIZE_VECTORS, TOOLBAR_VIEW_ALLOCATE_VECTORS, TOOLBAR_VIEW_CLASS_VECTORS, TOOLBAR_VIEW_CONTENT_FOR_SIZE_VECTORS, TOOLBAR_VIEW_MEASURE_VECTORS, } from './chrome.js';
46
46
  export type { ClampAllocateVector, ClampChildSizeVector, ClampPropertyVector, ClampSizeFromChildVector, ClampThresholdsVector, SpinnerGeometryVector, SpinnerSizeVector, ToolbarViewAllocateVector, ToolbarViewClassVector, ToolbarViewContentForSizeVector, ToolbarViewMeasureVector, } from './chrome.js';
47
- export { BOTTOM_SHEET_CLOSE_VECTORS, BOTTOM_SHEET_PRESENTATION_VECTORS, runBottomSheetSteps } from './dialog.js';
48
- export type { BottomSheetCloseVector, BottomSheetPresentationAdapter, BottomSheetPresentationStep, BottomSheetPresentationVector, } from './dialog.js';
47
+ export { BOTTOM_SHEET_BOTTOM_BAR_VECTORS, BOTTOM_SHEET_CLOSE_VECTORS, BOTTOM_SHEET_OPEN_VECTORS, BOTTOM_SHEET_PRESENTATION_VECTORS, BOTTOM_SHEET_SWIPE_TRACKER_VECTORS, runBottomSheetBottomBarSteps, runBottomSheetSteps, } from './dialog.js';
48
+ export type { BottomSheetBottomBarAdapter, BottomSheetBottomBarStep, BottomSheetBottomBarVector, BottomSheetCloseVector, BottomSheetOpenVector, BottomSheetPresentationAdapter, BottomSheetPresentationStep, BottomSheetPresentationVector, BottomSheetSwipeTrackerVector, } from './dialog.js';
49
49
  export { POPOVER_KEY_VECTORS, POPOVER_SURFACE_VECTORS } from './popover.js';
50
50
  export type { PopoverKeyVector, PopoverSurfaceVariant, PopoverSurfaceVector } from './popover.js';
51
51
  export { ACCENT_COLOR_VECTORS } from './accent.js';
@@ -54,11 +54,19 @@ export { formatShortcutLabelNodes, SHORTCUT_LABEL_VECTORS } from './shortcut-lab
54
54
  export type { ShortcutLabelVector } from './shortcut-label.js';
55
55
  export { SPINNER_ARC_ENVELOPE, SPINNER_ARC_PHASE_VECTORS, SPINNER_ARC_TOLERANCE, SPINNER_CONSTANT_VECTORS, } from './spinner.js';
56
56
  export type { SpinnerArcShapeVector, SpinnerConstantVector } from './spinner.js';
57
+ export { BOX_ORIENTATION_VECTORS, BOX_SPACING_VECTORS } from './box.js';
58
+ export type { BoxOrientationVector, BoxSpacingVector } from './box.js';
59
+ export { LABEL_CHAR_COUNT_VECTORS, LABEL_DISPLAY_TEXT_VECTORS, LABEL_EFFECTIVE_LINES_VECTORS, LABEL_ELLIPSIZE_OVERFLOW_VECTORS, LABEL_ELLIPSIZE_VECTORS, LABEL_JUSTIFY_VECTORS, LABEL_WIDTH_CHARS_EXTENT_VECTORS, LABEL_WRAP_MODE_VECTORS, LABEL_XALIGN_VECTORS, LABEL_YALIGN_ALIGN_ITEMS_VECTORS, LABEL_YALIGN_VECTORS, } from './label.js';
60
+ export type { LabelCharCountVector, LabelDisplayTextVector, LabelEffectiveLinesVector, LabelEllipsizeOverflowVector, LabelEllipsizeVector, LabelJustifyVector, LabelWidthCharsExtentVector, LabelWrapModeVector, LabelXalignVector, LabelYalignAlignItemsVector, LabelYalignVector, } from './label.js';
57
61
  export { WRAP_BOX_CHILD_ORDER_VECTORS, WRAP_BOX_LENGTH_VECTORS, WRAP_BOX_LINE_VECTORS, WRAP_BOX_NATURAL_LENGTH_VECTORS, WRAP_BOX_NOTIFY_PROPERTIES, WRAP_BOX_POLICY_VECTORS, WRAP_BOX_SPACING_NOTIFY_VECTORS, WRAP_BOX_SPACING_VECTORS, } from './wrap-box.js';
58
62
  export type { WrapBoxChildOrderVector, WrapBoxLengthVector, WrapBoxLineVector, WrapBoxNaturalLengthVector, WrapBoxPolicyVector, WrapBoxSpacingNotifyVector, WrapBoxSpacingVector, } from './wrap-box.js';
59
63
  export { BREAKPOINT_PICK_VECTORS, BREAKPOINT_TRANSITION_VECTORS } from './breakpoint-bin.js';
60
64
  export type { BreakpointPickVector, BreakpointTransitionVector } from './breakpoint-bin.js';
61
65
  export { HEADER_BAR_PACK_VECTORS, HEADER_BAR_TITLE_SOURCE_VECTORS, HEADER_BAR_TITLE_WIDGET_VECTORS, } from './header-bar.js';
62
66
  export type { HeaderBarPackVector, HeaderBarTitleSourceVector, HeaderBarTitleWidgetVector } from './header-bar.js';
63
- export { SHARED_TREE_BLOCKS_WITHOUT_EXPECTATIONS, SHARED_TREE_TABLES, authoredNodes, authoredTags, reachedTables, sharedTreeExpectations, subjectIndexOf, } from './shared-trees.js';
64
- export type { SharedTreeExpectation, SharedTreeNode, SharedTreeObservable } from './shared-trees.js';
67
+ export { ATTRIBUTE_OF_VECTORS, HOST_TAG_VECTORS, PROPERTY_OF_VECTORS } from './tags.js';
68
+ export type { AttributeOfVector, HostTagVector, PropertyOfVector } from './tags.js';
69
+ export { VALUE_LIST_VECTORS } from './value-lists.js';
70
+ export type { ValueListResponse, ValueListVector } from './value-lists.js';
71
+ export { SHARED_TREE_BLOCKS_WITHOUT_EXPECTATIONS, SHARED_TREE_TABLES, authoredNodes, authoredTags, reachedTables, sharedTreeExpectations, sharedTreePlacements, subjectIndexOf, withoutPlacements, } from './shared-trees.js';
72
+ export type { SharedTreeExpectation, SharedTreeNode, SharedTreeObservable, SharedTreePlacement, } from './shared-trees.js';
@@ -0,0 +1,115 @@
1
+ /** One `label` + flags and the text shown. */
2
+ export interface LabelDisplayTextVector {
3
+ label: string;
4
+ useMarkup: boolean;
5
+ useUnderline: boolean;
6
+ text: string;
7
+ rule: string;
8
+ }
9
+ export declare const LABEL_DISPLAY_TEXT_VECTORS: ReadonlyArray<LabelDisplayTextVector>;
10
+ /** One authored `xalign` and the value the label holds. */
11
+ export interface LabelXalignVector {
12
+ value: number | string | null;
13
+ xalign: number;
14
+ rule: string;
15
+ }
16
+ /** `gtk_label_set_xalign` CLAMPs to 0…1 itself; the pspec default is 0.5. */
17
+ export declare const LABEL_XALIGN_VECTORS: ReadonlyArray<LabelXalignVector>;
18
+ /** One authored `justify` and the `Gtk.Justification` nick the label holds. */
19
+ export interface LabelJustifyVector {
20
+ value: string | null;
21
+ justify: 'left' | 'right' | 'center' | 'fill';
22
+ rule: string;
23
+ }
24
+ export declare const LABEL_JUSTIFY_VECTORS: ReadonlyArray<LabelJustifyVector>;
25
+ /** One authored `yalign` and the value the label holds. Same shape as `xalign`. */
26
+ export interface LabelYalignVector {
27
+ value: number | string | null;
28
+ yalign: number;
29
+ rule: string;
30
+ }
31
+ /** `gtk_label_set_yalign` CLAMPs to 0…1 itself; the pspec default is 0.5. */
32
+ export declare const LABEL_YALIGN_VECTORS: ReadonlyArray<LabelYalignVector>;
33
+ /** One `yalign` and the `align-items` zone it is nearest to. */
34
+ export interface LabelYalignAlignItemsVector {
35
+ yalign: number;
36
+ alignItems: 'flex-start' | 'center' | 'flex-end';
37
+ rule: string;
38
+ }
39
+ /**
40
+ * TRUE nearest-of-three, not a strict half-split: the boundary between "nearest 0" and
41
+ * "nearest 0.5" is their midpoint, `0.25`, and symmetrically `0.75` on the other side —
42
+ * a `yalign` short of a full CSS continuum still lands on the CLOSER zone rather than
43
+ * whichever half of `[0, 1]` it falls in. Exact at the three values GTK's own default and
44
+ * both edges take (0, 0.5, 1); the four intermediate rows (`0.2`/`0.3`/`0.7`/`0.8`) are the
45
+ * ones a strict `< 0.5`/`> 0.5` split gets wrong — `0.3` is closer to `0.5` than to `0`,
46
+ * so it belongs in `center`, not `flex-start`.
47
+ */
48
+ export declare const LABEL_YALIGN_ALIGN_ITEMS_VECTORS: ReadonlyArray<LabelYalignAlignItemsVector>;
49
+ /** One authored `ellipsize` and the `Pango.EllipsizeMode` nick the label holds. */
50
+ export interface LabelEllipsizeVector {
51
+ value: string | null;
52
+ ellipsize: 'none' | 'start' | 'middle' | 'end';
53
+ rule: string;
54
+ }
55
+ /** `Pango-1.0.gir`'s four `EllipsizeMode` nicks, read via `gi://Pango` under gjs 1.88.1. */
56
+ export declare const LABEL_ELLIPSIZE_VECTORS: ReadonlyArray<LabelEllipsizeVector>;
57
+ /** One `Pango.EllipsizeMode` nick and the ONE truncating value both renderers can draw. */
58
+ export interface LabelEllipsizeOverflowVector {
59
+ ellipsize: 'none' | 'start' | 'middle' | 'end';
60
+ overflow: 'clip' | 'ellipsis';
61
+ rule: string;
62
+ }
63
+ /**
64
+ * Neither CSS `text-overflow` nor NativeScript's `textOverflow` has a start- or
65
+ * middle-truncating mode — see `labelEllipsizeOverflowValue`'s own comment for why every
66
+ * non-`none` mode draws an end-ellipsis rather than a silent `clip`. `start` and `middle`
67
+ * are the DECLARED divergence these two rows pin.
68
+ */
69
+ export declare const LABEL_ELLIPSIZE_OVERFLOW_VECTORS: ReadonlyArray<LabelEllipsizeOverflowVector>;
70
+ /** One authored `wrap-mode` and the `Pango.WrapMode` nick the label holds. */
71
+ export interface LabelWrapModeVector {
72
+ value: string | null;
73
+ wrapMode: 'word' | 'char' | 'word-char';
74
+ rule: string;
75
+ }
76
+ /** `Pango-1.0.gir`'s three `WrapMode` nicks, read via `gi://Pango` under gjs 1.88.1. */
77
+ export declare const LABEL_WRAP_MODE_VECTORS: ReadonlyArray<LabelWrapModeVector>;
78
+ /** One authored value and the int `width-chars` / `max-width-chars` / `lines` all hold. */
79
+ export interface LabelCharCountVector {
80
+ value: number | string | null;
81
+ count: number;
82
+ rule: string;
83
+ }
84
+ /**
85
+ * `width-chars`, `max-width-chars` and `lines` share one pspec shape — floor `-1`, default
86
+ * `-1` — so one table drives all three normalizers in `label.spec.ts`. Measured through
87
+ * `label.set_property()`, the door an attribute-driven tree uses (`label.ts`'s header).
88
+ */
89
+ export declare const LABEL_CHAR_COUNT_VECTORS: ReadonlyArray<LabelCharCountVector>;
90
+ /** One `lines` / `ellipsize` combination and the line count a renderer applies. */
91
+ export interface LabelEffectiveLinesVector {
92
+ lines: number;
93
+ ellipsize: 'none' | 'start' | 'middle' | 'end';
94
+ effective: number | null;
95
+ rule: string;
96
+ }
97
+ /**
98
+ * MEASURED (a real `Gtk.Label`, allocated, gjs 1.88.1 / gtk 4.22.5) — `wrap` is
99
+ * deliberately not a column here, because it changes NONE of these outcomes.
100
+ * `wrap=TRUE, ellipsize=NONE, lines=2` laid out 15 lines (the cap ignored);
101
+ * `wrap=FALSE, ellipsize=END, lines=2` laid out exactly 2, ellipsized. `label.ts`'s header
102
+ * carries the fuller measurement, including the two prior, WRONG readings of the pspec's
103
+ * "has no effect if the label is not wrapping or ellipsized" this table replaced.
104
+ */
105
+ export declare const LABEL_EFFECTIVE_LINES_VECTORS: ReadonlyArray<LabelEffectiveLinesVector>;
106
+ /** One `width-chars` + `max-width-chars` pair and the `ch`-unit extent it derives. */
107
+ export interface LabelWidthCharsExtentVector {
108
+ widthChars: number;
109
+ maxWidthChars: number;
110
+ minCh: number | null;
111
+ maxCh: number | null;
112
+ rule: string;
113
+ }
114
+ /** `get_default_widths` (gtklabel.c): minimum is `width-chars`, natural is their MAX. */
115
+ export declare const LABEL_WIDTH_CHARS_EXTENT_VECTORS: ReadonlyArray<LabelWidthCharsExtentVector>;
@@ -65,3 +65,32 @@ export interface ComboChooserVector {
65
65
  * which is why this lives on the combo ROW rather than in the shared chooser.
66
66
  */
67
67
  export declare const COMBO_CHOOSER_VECTORS: ReadonlyArray<ComboChooserVector>;
68
+ /** One authored `active-name`, over toggles carrying these names. */
69
+ export interface ToggleActiveNameVector {
70
+ /** Each authored toggle's `name`, in document order; `null` is unnamed. */
71
+ names: readonly (string | null)[];
72
+ /** The authored `Adw.ToggleGroup:active-name`. */
73
+ activeName: string;
74
+ /** How many toggles the group keeps — `keptToggles`, the buttons a built group draws. */
75
+ kept: number;
76
+ /** What `toggleIndexOfName` answers over the kept names — `-1` for none. */
77
+ index: number;
78
+ /** The button a BUILT group shows active afterwards. */
79
+ active: number;
80
+ rule: string;
81
+ }
82
+ /**
83
+ * `adw_toggle_group_set_active_name` (adw-toggle-group.c:1989) resolves the name through
84
+ * the table `add_toggle` fills (:898), and a `.blp` writes it BEFORE the toggles exist —
85
+ * GtkBuilder sets properties first and children after, which is why the C holds the name
86
+ * back in `delayed_active_name` until `parser_finished` (:1247). `active` is therefore a
87
+ * row about the built tree, not about the lookup: a renderer that resolves the name the
88
+ * moment it is written finds no toggles and drops it.
89
+ *
90
+ * The first toggle is active before the name is applied, because `add_toggle` activates
91
+ * the first toggle it is given (:903). Every row was measured against libadwaita 1.9.3
92
+ * through `Gtk.Builder`, and the shared-name row is the one the source reading got wrong
93
+ * first: the table insert at :898 looks like "last one wins", but :849 refuses the second
94
+ * toggle before it is ever reached.
95
+ */
96
+ export declare const TOGGLE_ACTIVE_NAME_VECTORS: ReadonlyArray<ToggleActiveNameVector>;
@@ -1,9 +1,124 @@
1
- /** One node of an authored tree — the shape `ADWAITA_GALLERY_SHARED_TREES` is written in. */
1
+ /**
2
+ * One node of an authored tree — the shape `ADWAITA_GALLERY_SHARED_TREES` is written in.
3
+ *
4
+ * THIS DECLARATION IS THE ORIGINAL. Every other spelling of the shape in this repository
5
+ * restates it — `scripts/adwaita-gallery-shared-trees.d.mts` for the plain-Node generators,
6
+ * `packages/infra/blueprint/src/shared-node.d.mts` for the projection, and more besides —
7
+ * each because it cannot import from here, each saying why in its own header.
8
+ * `scripts/check-shared-tree-shape.mjs` carries the list, holds every entry to this
9
+ * declaration field by field, and fails on a spelling that declares itself nowhere. So a
10
+ * field added here is added there too, or the gate says which field and where.
11
+ */
2
12
  export interface SharedTreeNode {
3
13
  /** A GIR class name, e.g. `AdwPreferencesGroup`. */
4
14
  tag: string;
15
+ /**
16
+ * The name this node is addressed by from OUTSIDE the tree.
17
+ *
18
+ * Renderer-neutral because every surface already has one — a GtkBuilder object id, a DOM
19
+ * `id`, a NativeScript `id` — and worth carrying although `bind` stays a refusal: measured
20
+ * in ADR 0066, EVERY id in this repository's shipped `.blp` is named by the sibling
21
+ * TypeScript through `InternalChildren` and NONE by a `bind` inside the file. A name read
22
+ * from outside is the component's addressing surface, not an input to a binding language.
23
+ */
24
+ id?: string;
25
+ /**
26
+ * On the ROOT node: the composite class this tree DEFINES, where `tag` is the type it
27
+ * extends.
28
+ *
29
+ * `template $GalleryHeaderBar : Adw.Bin` is `{ tag: 'AdwBin', template: 'GalleryHeaderBar' }`
30
+ * — two facts that a single tag cannot carry, which is why the root of every shipped `.blp`
31
+ * projected to its PARENT type and said nothing about the class the file is about. The value
32
+ * is what GtkBuilder writes as `<template class="…">`, so `emitGtkBuilderXml` and the
33
+ * projection can be held against each other on it — and are, by stage D's addressing arm.
34
+ */
35
+ template?: string;
36
+ /**
37
+ * Where in the parent this child goes — the placement, spelled as the GTK side spells it.
38
+ *
39
+ * ONE FIELD FOR TWO GtkBuilder CONSTRUCTS, and the conflation is the projection's, not a
40
+ * choice made here: `[start]` is `<child type="start">` and `content: …` is a
41
+ * property-valued child, and both land on this field, so it cannot be inverted (the
42
+ * Blueprint corpus's `expectations.mjs` states it as finding 1). A renderer therefore has
43
+ * to answer to both spellings of a placement it has — `gtk-host` derives the property name
44
+ * from its own `set_`-prefixed slot method, `<adw-header-bar>` names `title-widget` beside
45
+ * its own `center`.
46
+ *
47
+ * A SHARED TREE MAY CARRY ONE ONLY WHERE EVERY RENDERER SPELLS IT THE SAME. That is the
48
+ * corpus's no-alias admission rule applied to a placement, and it is narrow: a row's
49
+ * `prefix`/`suffix` qualify, a header bar's `start`/`title`/`end` do not
50
+ * (`startBox`/`titleWidget`/`endBox` on the NativeScript port), which is why those blocks
51
+ * are ledgered as `vocabulary` divergences. A renderer handed a name it has no destination
52
+ * for REFUSES and says which — the alternative was measured on a shipped `.blp`, where a
53
+ * `[top]` header bar landed in the content and the window title was then discarded by the
54
+ * bar's own construction, at exit 0.
55
+ */
5
56
  slot?: string;
6
57
  props?: Readonly<Record<string, string | number | boolean>>;
58
+ /**
59
+ * Which of this node's `props` are marked for translation, keyed by the prop name.
60
+ *
61
+ * A present key means marked; `context` carries the message context `C_("noun", …)` gives
62
+ * one. BESIDE `props` and not inside it, because that is what the marking is wherever a
63
+ * surface has one: GtkBuilder writes `translatable="yes" context="noun"` as attributes NEXT
64
+ * to the value, and a marked value is still the same value. Widening `props` to a union
65
+ * would make every reader of a value narrow past something that is not one.
66
+ *
67
+ * Worth carrying although no renderer here translates: a caption whose marking was dropped
68
+ * looks finished and is unreachable by `xgettext`, which is the exact defect ADR 0033 gives
69
+ * as its reason for preferring a declarative template. ADR 0067 measures it and says why
70
+ * the file-level `translation-domain` is not a node fact and stays a loss.
71
+ */
72
+ translatable?: Readonly<Record<string, {
73
+ readonly context?: string;
74
+ }>>;
75
+ /**
76
+ * The style classes this node carries, as a list, in the order the source wrote them.
77
+ *
78
+ * ONE FIELD FOR TWO SPELLINGS, because they are one GTK property. Blueprint writes
79
+ * `styles ["flat", "circular"]` as a block and `css-classes: ["flat", "narrow"]` as a
80
+ * property value, and both set `GtkWidget:css-classes` — measured against the reference
81
+ * compiler, which writes the first as `<style><class name="flat"/></style>` and the second
82
+ * as a `<property>` whose text is NEWLINE-joined. A joined string in `props` would have to
83
+ * pick one of those two joins and could then not be held against the other golden, which is
84
+ * why the list is the field and not a string (ADR 0068 § 2).
85
+ *
86
+ * `styleClasses` and not `cssClasses`: ADR 0049 § 1 measured that name fatal on
87
+ * NativeScript, where `ViewBase` owns it as a live `Set` its CSS engine reads. So the field
88
+ * carries the name the three surfaces CAN share, and each driver maps it to its own door —
89
+ * the same arrangement `slot` already has, where GTK writes `<child type="start">` and the
90
+ * web writes `slot="start"`.
91
+ */
92
+ styleClasses?: readonly string[];
93
+ /**
94
+ * Blueprint's value-carrying extension blocks, one key per kind (ADR 0072).
95
+ *
96
+ * `strings` is `Gtk.StringList { strings [ … ] }`: GtkBuilder writes it as `<items>` and
97
+ * fills it through `gtk_string_list_append`. `responses` is `Adw.AlertDialog { responses
98
+ * [ … ] }`: filled through `adw_alert_dialog_add_response`, with `destructive`/`suggested`
99
+ * as the `appearance` and `disabled` as `enabled: false`. A string keeps its `_()` marking
100
+ * beside it, in the same `{ context? }` that `translatable` holds for a prop.
101
+ *
102
+ * A CLOSED SET. Every other extension (`menu`, `layout`, `marks`, `items`, …) stays a named
103
+ * loss of the projection, so no renderer meets a kind it has no door for.
104
+ */
105
+ extensions?: Readonly<{
106
+ strings?: readonly {
107
+ readonly value: string;
108
+ readonly translatable?: {
109
+ readonly context?: string;
110
+ };
111
+ }[];
112
+ responses?: readonly {
113
+ readonly id: string;
114
+ readonly label: string;
115
+ readonly translatable?: {
116
+ readonly context?: string;
117
+ };
118
+ readonly appearance?: 'suggested' | 'destructive';
119
+ readonly enabled?: boolean;
120
+ }[];
121
+ }>;
7
122
  children?: readonly SharedTreeNode[];
8
123
  }
9
124
  /**
@@ -64,12 +179,47 @@ export declare function authoredNodes(root: SharedTreeNode): {
64
179
  /**
65
180
  * The authored classes a realised tree must carry, in authored order.
66
181
  *
67
- * `tagOf` is the renderer's own spelling of a GIR class name — `hostTagOf` on the web, the
68
- * GIR name itself in GTK. Both drivers filter their real tree down to this list and compare
69
- * against it, so it lives here rather than in each of them: a driver deriving it privately
70
- * is a second walk, free to disagree with the one {@link subjectIndexOf} addresses into.
182
+ * `tagOf` is the renderer's own spelling of a GIR class name — `hostTagOf` from the sibling
183
+ * `@gjsify/adwaita-core/tags` on the web, the GIR name itself in GTK. Both drivers filter
184
+ * their real tree down to this list and compare against it, so it lives here rather than in
185
+ * each of them: a driver deriving it privately is a second walk, free to disagree with the
186
+ * one {@link subjectIndexOf} addresses into.
71
187
  */
72
188
  export declare function authoredTags(root: SharedTreeNode, tagOf?: (gtype: string) => string): string[];
189
+ /** One authored placement: the node's address, and the slot it named. */
190
+ export interface SharedTreePlacement {
191
+ /** The pre-order address {@link subjectIndexOf} reads, so a failure names a node. */
192
+ path: string;
193
+ /** The slot the tree authored, spelled the way every renderer admitting the block spells it. */
194
+ slot: string;
195
+ }
196
+ /**
197
+ * Every node of `root` that names a placement.
198
+ *
199
+ * WHAT THIS IS FOR. A driver comparing only the authored classes IN ORDER cannot see a
200
+ * slot at all: a child placed in the wrong slot of the right parent keeps every authored
201
+ * node in every authored position. ADR 0051 § Amendment 3 measured exactly that on the
202
+ * NativeScript port — two deliberate mis-placements, both GREEN — and the corpus authored
203
+ * no slot to catch it with until one did. This is the renderer-free half of the answer;
204
+ * what a driver DOES with it is its own, because "the child ended up in slot X" has no
205
+ * shared observable.
206
+ */
207
+ export declare function sharedTreePlacements(root: SharedTreeNode): SharedTreePlacement[];
208
+ /**
209
+ * The same tree with every placement dropped — what a renderer that never read `slot`
210
+ * builds.
211
+ *
212
+ * THE CONTROL, and it is why a placement assertion can be made without a per-widget table
213
+ * of where each slot lands. A driver builds the tree twice and asserts the two REALISED
214
+ * trees differ: with the slots honoured a suffix sits in its row's header, without them it
215
+ * sits wherever that parent's default placement puts it. Every builder here read only
216
+ * `tag`, `props` and `children`, so the two builds were byte-identical — which is the
217
+ * regression this control turns red.
218
+ *
219
+ * Fresh nodes all the way down, never the authored ones: a driver handed the corpus's own
220
+ * objects could edit what the next block builds.
221
+ */
222
+ export declare function withoutPlacements(root: SharedTreeNode): SharedTreeNode;
73
223
  /**
74
224
  * Where the node an expectation is about sits in that filtered walk.
75
225
  *
@@ -0,0 +1,46 @@
1
+ /** One `hostTagOf` expectation — a class that resolves, or a name it must refuse. */
2
+ export interface HostTagVector {
3
+ /** A GIR class name, or a string that is deliberately not one. */
4
+ gtype: string;
5
+ /** The kebab tag `hostTagOf` must return. Absent for a row that must throw instead. */
6
+ expected?: string;
7
+ /** The exact `Error#message` `hostTagOf` must throw. Absent for a row that must resolve. */
8
+ error?: string;
9
+ rule: string;
10
+ }
11
+ /**
12
+ * `hostTagOf` — GIR class name to kebab tag, and the refusal boundary.
13
+ *
14
+ * `AdwPreferencesGroup`/`AdwSwitchRow`/`GtkBox` pin the floor: one dash per word boundary,
15
+ * no acronym involved. `GtkGLArea`/`GtkATContext`/`GtkIMMulticontext` pin THE rule the floor
16
+ * cannot show — a run of two or more capitals closes at its LAST one, so `GL` stays one word
17
+ * and `Area` opens a new one, rather than `g-l-area`. `GtkPad2Btn` pins what a digit does:
18
+ * it is not an uppercase letter, so it ends a lower run exactly like a lowercase letter
19
+ * would, and the capital after it still opens a new word.
20
+ */
21
+ export declare const HOST_TAG_VECTORS: ReadonlyArray<HostTagVector>;
22
+ /** One `attributeOf` expectation. */
23
+ export interface AttributeOfVector {
24
+ /** The authored property name, as an `AdwXyz`/`GtkXyz` prop is spelled in a `SharedTreeNode`. */
25
+ prop: string;
26
+ /** The attribute `attributeOf` must return. */
27
+ expected: string;
28
+ rule: string;
29
+ }
30
+ /**
31
+ * `attributeOf` — camelCase property name to kebab DOM attribute.
32
+ *
33
+ * Every capital gets its own dash, with no acronym awareness — see the header for why that
34
+ * boundary is out of scope for this table.
35
+ */
36
+ export declare const ATTRIBUTE_OF_VECTORS: ReadonlyArray<AttributeOfVector>;
37
+ /** One `propertyOf` expectation. */
38
+ export interface PropertyOfVector {
39
+ /** A property name as a projected `.blp` spells it, or as a hand-authored tree does. */
40
+ name: string;
41
+ /** The member `propertyOf` must return. */
42
+ expected: string;
43
+ rule: string;
44
+ }
45
+ /** `propertyOf` — a GIR property name to the camel-case member a NativeScript widget declares. */
46
+ export declare const PROPERTY_OF_VECTORS: ReadonlyArray<PropertyOfVector>;
@@ -0,0 +1,19 @@
1
+ import type { AdwResponseAppearance } from '../dialog.js';
2
+ /** One registered response, as the built dialog reports it. */
3
+ export interface ValueListResponse {
4
+ readonly id: string;
5
+ readonly label: string;
6
+ readonly appearance: AdwResponseAppearance;
7
+ readonly enabled: boolean;
8
+ }
9
+ /** One Blueprint source and what the widget it builds hands back. */
10
+ export interface ValueListVector {
11
+ readonly rule: string;
12
+ /** The object, written after `using Gtk 4.0; using Adw 1;`. */
13
+ readonly blueprint: string;
14
+ /** The labels of the root's list model, in order — a combo row or a drop-down. */
15
+ readonly strings?: readonly string[];
16
+ /** The root dialog's responses, in the order they were added. */
17
+ readonly responses?: readonly ValueListResponse[];
18
+ }
19
+ export declare const VALUE_LIST_VECTORS: readonly ValueListVector[];