react-x11 2.10.2 → 2.12.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 +278 -129
- package/package.json +10 -3
- package/src/Reconciler.js +15 -17
- package/src/a11y.js +2 -2
- package/src/anchor.js +7 -5
- package/src/bootstrap.js +14 -0
- package/src/clientmessage.js +1 -1
- package/src/cocoa/app.js +304 -49
- package/src/cocoa/bezels.js +175 -30
- package/src/cocoa/dnd.js +27 -13
- package/src/cocoa/fonts.js +3 -3
- package/src/cocoa/glarea.js +20 -3
- package/src/cocoa/main.d.ts +8 -0
- package/src/cocoa/main.js +43 -0
- package/src/cocoa/panehost.js +15 -5
- package/src/cocoa/presenter.js +13 -9
- package/src/cocoa/promotion.js +4 -7
- package/src/cocoa/relaunch.js +207 -0
- package/src/cocoa/screencolor.js +62 -0
- package/src/cocoa/threaded.js +246 -0
- package/src/cocoa/window.js +256 -42
- package/src/components/Select.js +2 -2
- package/src/components/anchor.js +3 -3
- package/src/components/native.js +12 -7
- package/src/components/theme.js +2 -2
- package/src/debug.js +1 -1
- package/src/decorations.js +1 -1
- package/src/editmenu.js +2 -2
- package/src/errors.js +46 -0
- package/src/events.js +6 -6
- package/src/foreignnodes.js +3 -2
- package/src/frames.js +2 -2
- package/src/glnodes.js +1 -1
- package/src/grid.js +1653 -0
- package/src/host.d.ts +230 -0
- package/src/host.js +11 -3
- package/src/imagesource.js +1 -1
- package/src/index.d.ts +21 -4
- package/src/index.js +9 -1
- package/src/layouts.js +721 -0
- package/src/node.d.ts +4 -2
- package/src/node.js +19 -21
- package/src/nodes/animation.js +644 -0
- package/src/nodes/box.js +21 -0
- package/src/nodes/boxpaint.js +473 -0
- package/src/nodes/canvas.js +269 -0
- package/src/nodes/cascade.js +600 -0
- package/src/nodes/damage.js +183 -0
- package/src/nodes/edithistory.js +124 -0
- package/src/nodes/editmenupopup.js +260 -0
- package/src/nodes/hittest.js +185 -0
- package/src/nodes/image.js +266 -0
- package/src/nodes/install.js +75 -0
- package/src/nodes/invalidate.js +465 -0
- package/src/nodes/kinds.js +31 -0
- package/src/nodes/layout.js +439 -0
- package/src/nodes/layouthost.js +949 -0
- package/src/nodes/node.js +868 -0
- package/src/nodes/paint.js +466 -0
- package/src/nodes/position.js +366 -0
- package/src/nodes/preedit.js +127 -0
- package/src/nodes/queries.js +330 -0
- package/src/nodes/rects.js +102 -0
- package/src/nodes/scrollable.js +891 -0
- package/src/nodes/scrollbars.js +138 -0
- package/src/nodes/scrollblit.js +1034 -0
- package/src/nodes/selectable.js +142 -0
- package/src/nodes/styling.js +225 -0
- package/src/nodes/text.js +649 -0
- package/src/nodes/textarea.js +391 -0
- package/src/nodes/textinput.js +1146 -0
- package/src/nodes/util.js +17 -0
- package/src/nodes/window/anchoring.js +161 -0
- package/src/nodes/window/capabilities.js +190 -0
- package/src/nodes/window/debugpaint.js +83 -0
- package/src/nodes/window/droptarget.js +145 -0
- package/src/nodes/window/floors.js +577 -0
- package/src/nodes/window/flush.js +334 -0
- package/src/nodes/window/hints.js +482 -0
- package/src/nodes/window/listeners.js +222 -0
- package/src/nodes/window/popup.js +71 -0
- package/src/nodes/window/size.js +591 -0
- package/src/nodes/window/window.js +945 -0
- package/src/palette.js +1 -1
- package/src/registry.js +7 -3
- package/src/screencolor.js +212 -38
- package/src/screencolorhooks.js +6 -2
- package/src/styles.js +137 -15
- package/src/svgnodes.js +2 -1
- package/src/testing/harness.js +2 -2
- package/src/textselection.js +5 -3
- package/src/trace-registry.js +1 -1
- package/src/types/components.d.ts +38 -6
- package/src/types/elements.d.ts +11 -1
- package/src/types/nodes.d.ts +33 -5
- package/src/types/screencolor.d.ts +20 -14
- package/src/types/style.d.ts +94 -3
- package/src/windowstate.js +1 -1
- package/src/yoga.js +1 -1
- package/src/nodes.js +0 -13120
package/src/host.d.ts
CHANGED
|
@@ -86,3 +86,233 @@ export function knownElements(): string[];
|
|
|
86
86
|
|
|
87
87
|
/** Kinds that lay out with yoga and paint into the owning window (a copy). */
|
|
88
88
|
export function drawnKinds(): string[];
|
|
89
|
+
|
|
90
|
+
// --- layouts and positions (docs/extending.md) ------------------------------
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* What an option of a layout or a position may be. A `'length'` is written
|
|
94
|
+
* in logical pixels, like every length in a style, and handed to the
|
|
95
|
+
* algorithm in device pixels. An array is the values the option may take.
|
|
96
|
+
*/
|
|
97
|
+
export type OptionType =
|
|
98
|
+
| 'length'
|
|
99
|
+
| 'number'
|
|
100
|
+
| 'integer'
|
|
101
|
+
| 'boolean'
|
|
102
|
+
| 'string'
|
|
103
|
+
| 'any'
|
|
104
|
+
| readonly (string | number | boolean)[];
|
|
105
|
+
|
|
106
|
+
export interface OptionSpec {
|
|
107
|
+
type: OptionType;
|
|
108
|
+
default?: unknown;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** The options a layout or a position takes, by name. */
|
|
112
|
+
export type OptionSchema = Record<string, OptionSpec>;
|
|
113
|
+
|
|
114
|
+
export type MeasureMode = 'exactly' | 'at-most' | 'unconstrained';
|
|
115
|
+
|
|
116
|
+
/** The room on offer, in the vocabulary `measureContent` speaks: device
|
|
117
|
+
* pixels, and `Infinity` on an axis with no bound. */
|
|
118
|
+
export interface LayoutConstraints {
|
|
119
|
+
width: number;
|
|
120
|
+
height: number;
|
|
121
|
+
widthMode: MeasureMode;
|
|
122
|
+
heightMode: MeasureMode;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* A child, as a layout algorithm sees it: something to measure and read
|
|
127
|
+
* options off, never a node. Every size is the child's **margin box**, in
|
|
128
|
+
* device pixels.
|
|
129
|
+
*/
|
|
130
|
+
export interface LayoutChild {
|
|
131
|
+
/** Where it is in the list the algorithm was handed. */
|
|
132
|
+
readonly index: number;
|
|
133
|
+
/** Its `layoutItem`, against the layout's `childOptions`: defaults filled
|
|
134
|
+
* in, lengths in device pixels. */
|
|
135
|
+
readonly options: Readonly<Record<string, any>>;
|
|
136
|
+
/**
|
|
137
|
+
* The size it takes under `constraints`. An axis given a number and no
|
|
138
|
+
* mode is `'exactly'` that; an axis left out is `'unconstrained'`;
|
|
139
|
+
* `'at-most'` is CSS's fit-content, never below its content floor.
|
|
140
|
+
*/
|
|
141
|
+
measure(constraints?: Partial<LayoutConstraints>): {
|
|
142
|
+
width: number;
|
|
143
|
+
height: number;
|
|
144
|
+
};
|
|
145
|
+
/** The narrowest it can be drawn at — its content floor — and the width
|
|
146
|
+
* it would take with no bound at all. */
|
|
147
|
+
intrinsicSizes(): { minContentWidth: number; maxContentWidth: number };
|
|
148
|
+
/** Its own resolved style, in device pixels — what a grid places it by
|
|
149
|
+
* (`gridColumn`, `gridArea`) and aligns it with (`alignSelf`,
|
|
150
|
+
* `justifySelf`). */
|
|
151
|
+
readonly style: Readonly<import('./types/style.js').StyleProperties>;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/** Where one child goes, from the content box's corner. A `width` or
|
|
155
|
+
* `height` left out is the child's own. */
|
|
156
|
+
export interface LayoutRect {
|
|
157
|
+
x: number;
|
|
158
|
+
y: number;
|
|
159
|
+
width?: number;
|
|
160
|
+
height?: number;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export interface LayoutResult {
|
|
164
|
+
/** The content box's size, device pixels. */
|
|
165
|
+
width: number;
|
|
166
|
+
height: number;
|
|
167
|
+
/** One rect per child — required of the call that places, the one with
|
|
168
|
+
* both modes `'exactly'`. */
|
|
169
|
+
children?: readonly LayoutRect[];
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export interface LayoutInfo {
|
|
173
|
+
/** The box's own resolved style — `gap`, `justifyContent`, `alignItems`
|
|
174
|
+
* — in device pixels. */
|
|
175
|
+
style: Readonly<import('./types/style.js').StyleProperties>;
|
|
176
|
+
scale: number;
|
|
177
|
+
/**
|
|
178
|
+
* Say that something in the style is wrong but can be laid out around —
|
|
179
|
+
* a grid area nobody named — the way a bad style value is said: once,
|
|
180
|
+
* on the console and to the test harness. `consequence` is what happens
|
|
181
|
+
* instead. A throw is for what cannot be laid out at all.
|
|
182
|
+
*/
|
|
183
|
+
report(message: string, consequence: string): void;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export interface LayoutDefinition {
|
|
187
|
+
options?: OptionSchema;
|
|
188
|
+
/** What a child's `layoutItem` may say to this layout. */
|
|
189
|
+
childOptions?: OptionSchema;
|
|
190
|
+
/**
|
|
191
|
+
* How big the box's content is for `constraints` — asked several times
|
|
192
|
+
* per pass, so a pure function of its arguments — and, when both modes
|
|
193
|
+
* are `'exactly'`, where each child goes.
|
|
194
|
+
*/
|
|
195
|
+
layout(
|
|
196
|
+
children: readonly LayoutChild[],
|
|
197
|
+
constraints: LayoutConstraints,
|
|
198
|
+
options: Readonly<Record<string, any>>,
|
|
199
|
+
info: LayoutInfo,
|
|
200
|
+
): LayoutResult;
|
|
201
|
+
/** Replace an existing registration. Off by default. */
|
|
202
|
+
override?: boolean;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/** Teach react-x11 a layout algorithm, for `style={{ layout: name }}`
|
|
206
|
+
* (docs/extending.md, "A layout algorithm of your own"). */
|
|
207
|
+
export function registerLayout(
|
|
208
|
+
name: string,
|
|
209
|
+
definition: LayoutDefinition,
|
|
210
|
+
): void;
|
|
211
|
+
|
|
212
|
+
/** Undo a registration; true if there was one. The built-in layouts stay. */
|
|
213
|
+
export function unregisterLayout(name: string): boolean;
|
|
214
|
+
|
|
215
|
+
/** Registered layout names, the built-in ones first. */
|
|
216
|
+
export function registeredLayouts(): string[];
|
|
217
|
+
|
|
218
|
+
export interface Edges {
|
|
219
|
+
left: number;
|
|
220
|
+
top: number;
|
|
221
|
+
right: number;
|
|
222
|
+
bottom: number;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/** What a position's `place` is handed: window coordinates, device
|
|
226
|
+
* pixels, the space `abs` is in. */
|
|
227
|
+
export interface PositionContext {
|
|
228
|
+
/** Where layout put the node, before any placement moved it. */
|
|
229
|
+
laidOut: { x: number; y: number; width: number; height: number };
|
|
230
|
+
/** The nearest scroll pane above the node — its scrollport is inside its
|
|
231
|
+
* border and over its padding — or null when nothing above scrolls. */
|
|
232
|
+
pane: { scrollport: Edges; scrollX: number; scrollY: number } | null;
|
|
233
|
+
/** The box it is contained by: its parent's content box, or the whole
|
|
234
|
+
* scrolled content for a direct child of the pane. */
|
|
235
|
+
container: Edges;
|
|
236
|
+
margin: Edges;
|
|
237
|
+
direction: 'ltr' | 'rtl';
|
|
238
|
+
scale: number;
|
|
239
|
+
/** The frame clock, in ms. */
|
|
240
|
+
now: number;
|
|
241
|
+
options: Readonly<Record<string, any>>;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
export interface PositionDefinition {
|
|
245
|
+
options?: OptionSchema;
|
|
246
|
+
/**
|
|
247
|
+
* How far to move the node from where layout put it, or null for not at
|
|
248
|
+
* all. `again: true` asks for another frame, for a position that
|
|
249
|
+
* animates. Runs after every layout pass; resizes nothing.
|
|
250
|
+
*/
|
|
251
|
+
place(
|
|
252
|
+
node: Node,
|
|
253
|
+
context: PositionContext,
|
|
254
|
+
): { x: number; y: number; again?: boolean } | null;
|
|
255
|
+
/** Replace an existing registration. Off by default. */
|
|
256
|
+
override?: boolean;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/** Teach react-x11 a positioning scheme, for `style={{ position: name }}`
|
|
260
|
+
* (docs/extending.md, "A position of your own"). CSS's own names —
|
|
261
|
+
* `static`, `relative`, `absolute`, `fixed`, `sticky` — are not available. */
|
|
262
|
+
export function registerPosition(
|
|
263
|
+
name: string,
|
|
264
|
+
definition: PositionDefinition,
|
|
265
|
+
): void;
|
|
266
|
+
|
|
267
|
+
/** Undo a registration; true if there was one. */
|
|
268
|
+
export function unregisterPosition(name: string): boolean;
|
|
269
|
+
|
|
270
|
+
/** Registered position names, in registration order. */
|
|
271
|
+
export function registeredPositions(): string[];
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* The layouts a style can name, each with the options it takes. Augment it
|
|
275
|
+
* to add yours:
|
|
276
|
+
*
|
|
277
|
+
* ```ts
|
|
278
|
+
* declare module 'react-x11/host' {
|
|
279
|
+
* interface CustomLayouts {
|
|
280
|
+
* radial: { radius?: number };
|
|
281
|
+
* }
|
|
282
|
+
* }
|
|
283
|
+
* ```
|
|
284
|
+
*/
|
|
285
|
+
export interface CustomLayouts {
|
|
286
|
+
masonry: { columns?: number; columnWidth?: number };
|
|
287
|
+
'equal-row': Record<never, never>;
|
|
288
|
+
/** CSS grid — `layout: 'grid'` is `display: 'grid'`. It takes no options:
|
|
289
|
+
* its tracks are the box's own style, `gridTemplateColumns` and the rest. */
|
|
290
|
+
grid: Record<never, never>;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/** What a child's `layoutItem` may tell the layout arranging it — augmented
|
|
294
|
+
* the same way. */
|
|
295
|
+
export interface CustomLayoutItem {
|
|
296
|
+
/** `masonry`: how many columns the child is laid across. */
|
|
297
|
+
span?: number;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/** The registered positions a style can name, each with its options —
|
|
301
|
+
* augmented the same way as `CustomLayouts`. */
|
|
302
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
303
|
+
export interface CustomPositions {}
|
|
304
|
+
|
|
305
|
+
/** A layout, by name or written with its options. */
|
|
306
|
+
export type LayoutValue = {
|
|
307
|
+
[K in keyof CustomLayouts]: K | ({ name: K } & CustomLayouts[K]);
|
|
308
|
+
}[keyof CustomLayouts];
|
|
309
|
+
|
|
310
|
+
/** CSS's positions, and the registered ones by name or with their options. */
|
|
311
|
+
export type PositionValue =
|
|
312
|
+
| 'static'
|
|
313
|
+
| 'relative'
|
|
314
|
+
| 'absolute'
|
|
315
|
+
| 'sticky'
|
|
316
|
+
| {
|
|
317
|
+
[K in keyof CustomPositions]: K | ({ name: K } & CustomPositions[K]);
|
|
318
|
+
}[keyof CustomPositions];
|
package/src/host.js
CHANGED
|
@@ -1,13 +1,21 @@
|
|
|
1
1
|
// `react-x11/host` — the seam a package that is not react-x11 uses to add
|
|
2
|
-
// a host element
|
|
3
|
-
// only the entry point.
|
|
2
|
+
// a host element, a layout algorithm or a positioning scheme. See
|
|
3
|
+
// docs/extending.md for the contracts; this file is only the entry point.
|
|
4
4
|
export {
|
|
5
5
|
registerElement,
|
|
6
6
|
unregisterElement,
|
|
7
7
|
registeredElements,
|
|
8
8
|
} from './registry.js';
|
|
9
|
+
export {
|
|
10
|
+
registerLayout,
|
|
11
|
+
unregisterLayout,
|
|
12
|
+
registeredLayouts,
|
|
13
|
+
registerPosition,
|
|
14
|
+
unregisterPosition,
|
|
15
|
+
registeredPositions,
|
|
16
|
+
} from './layouts.js';
|
|
9
17
|
|
|
10
|
-
import { DRAWN_KINDS as DRAWN } from './nodes.js';
|
|
18
|
+
import { DRAWN_KINDS as DRAWN } from './nodes/kinds.js';
|
|
11
19
|
import { registeredElements } from './registry.js';
|
|
12
20
|
|
|
13
21
|
const BUILT_IN = Object.freeze([
|
package/src/imagesource.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
//
|
|
5
5
|
// The split follows `decorations.js`: classification, validation, decoding
|
|
6
6
|
// and the `cacheKey` cache live here, where a test needs no server; the node
|
|
7
|
-
// half in nodes.js is only lifecycle — when to resolve, when to claim
|
|
7
|
+
// half in nodes/image.js is only lifecycle — when to resolve, when to claim
|
|
8
8
|
// damage, when to let go.
|
|
9
9
|
import { Image, Picture, decodeImage } from 'ntk';
|
|
10
10
|
|
package/src/index.d.ts
CHANGED
|
@@ -76,7 +76,10 @@ export type TransferType = 'text' | 'files' | 'uris' | (string & {});
|
|
|
76
76
|
|
|
77
77
|
export interface ClipboardOptions {
|
|
78
78
|
/** Selection atom name; `'CLIPBOARD'` by default, `'PRIMARY'` for the
|
|
79
|
-
* middle-click buffer. Any name works.
|
|
79
|
+
* middle-click buffer. Any name works on X11. On the Cocoa backend only
|
|
80
|
+
* `'CLIPBOARD'` is the pasteboard: every other name is a selection nobody
|
|
81
|
+
* can paste from — writes resolve and change nothing, reads find it
|
|
82
|
+
* empty. */
|
|
80
83
|
selection?: string;
|
|
81
84
|
/** ms to wait for the owner at each protocol step. */
|
|
82
85
|
timeout?: number;
|
|
@@ -154,8 +157,14 @@ export function useClipboard(): Clipboard;
|
|
|
154
157
|
* policy it is false whatever the machine could do, because the indirect
|
|
155
158
|
* backend is what draws. `app.glCapabilities()` is the machine's answer, and
|
|
156
159
|
* says why.
|
|
160
|
+
*
|
|
161
|
+
* `'nativeControls'` is whether this backend renders the platform's own
|
|
162
|
+
* control bezels — the Cocoa backend, never X11. The widget set already
|
|
163
|
+
* branches on it through the theme's `controls: 'auto'` policy; this is for
|
|
164
|
+
* application code composing its own controls to sit beside native ones. It
|
|
165
|
+
* is a property of the backend and never changes over the app's life.
|
|
157
166
|
*/
|
|
158
|
-
export type SupportsFeature = 'transparency' | 'shaders';
|
|
167
|
+
export type SupportsFeature = 'transparency' | 'shaders' | 'nativeControls';
|
|
159
168
|
|
|
160
169
|
/**
|
|
161
170
|
* Can this **display** do something? `'transparency'` is true when the
|
|
@@ -206,11 +215,18 @@ export interface RootOptions {
|
|
|
206
215
|
* as the bridge reports it, 16 where the OS cannot say. A number here
|
|
207
216
|
* applies to every window instead. `pumpInterval` is the AppKit event
|
|
208
217
|
* pump's cadence, in ms (8 by default), which is the floor under input
|
|
209
|
-
* latency
|
|
218
|
+
* latency; an app started under `react-x11/cocoa-main` has no pump.
|
|
219
|
+
* `resizeWait` is how long, in ms, AppKit may hold a live-resize tick for
|
|
220
|
+
* the app's frame at the new size under `react-x11/cocoa-main`, where
|
|
221
|
+
* the frame is painted on another thread (50 by default; 0 lets the edge
|
|
222
|
+
* move without waiting). `appName` is what the Dock, ⌘-Tab and the app menu print for
|
|
210
223
|
* an unbundled process (a bundle's Info.plist wins); `activationPolicy`
|
|
211
224
|
* is `'regular'` (a Dock tile, a ⌘-Tab entry — the default),
|
|
212
225
|
* `'accessory'` (a menu-bar app: windows but no tile) or `'prohibited'`,
|
|
213
|
-
* fixed before the app finishes launching
|
|
226
|
+
* fixed before the app finishes launching — under `react-x11/cocoa-main`
|
|
227
|
+
* the app launches before its code runs, so there the launch policy is
|
|
228
|
+
* `APPKIT_ACTIVATION_POLICY`'s, and this one a switch once the code
|
|
229
|
+
* runs. `exitOnQuit` (default `true`)
|
|
214
230
|
* ends the process once a quit request — the Dock's Quit, ⌘Q, a logout —
|
|
215
231
|
* has closed the app: the request routes through the primary window's
|
|
216
232
|
* close request first, so `onCloseRequest` there is where an app
|
|
@@ -222,6 +238,7 @@ export interface RootOptions {
|
|
|
222
238
|
promote?: boolean;
|
|
223
239
|
frameInterval?: number;
|
|
224
240
|
pumpInterval?: number;
|
|
241
|
+
resizeWait?: number;
|
|
225
242
|
appName?: string;
|
|
226
243
|
activationPolicy?: 'regular' | 'accessory' | 'prohibited';
|
|
227
244
|
exitOnQuit?: boolean;
|
package/src/index.js
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
// First, before anything else in the package: on macOS it moves the app
|
|
2
|
+
// onto a worker before the app's own code runs (src/bootstrap.js).
|
|
3
|
+
import './bootstrap.js';
|
|
4
|
+
|
|
1
5
|
export { createRoot, Renderer } from './Reconciler.js';
|
|
2
6
|
export { createStyles, flattenStyle } from './styles.js';
|
|
3
7
|
export { windowIdOf, useWindowId, useTopLevelWindow } from './windowid.js';
|
|
@@ -42,7 +46,11 @@ export { BusUnavailableError, closeBus, sessionBus, systemBus } from './bus.js';
|
|
|
42
46
|
export { announce } from './a11y.js';
|
|
43
47
|
// the standard Undo/Cut/Copy/Paste menu, for an element that edits or
|
|
44
48
|
// selects text of its own — `<textinput>`'s own menu is a caller of it
|
|
45
|
-
export {
|
|
49
|
+
export {
|
|
50
|
+
closeEditMenu,
|
|
51
|
+
editMenuOpen,
|
|
52
|
+
openEditMenu,
|
|
53
|
+
} from './nodes/editmenupopup.js';
|
|
46
54
|
export { useSessionBus, useSystemBus } from './bushooks.js';
|
|
47
55
|
export { REGISTRAR_NAME, useGlobalMenu } from './globalmenu.js';
|
|
48
56
|
export {
|