glimpse-sdk 0.7.0 → 0.9.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/LICENSE +24 -17
- package/PROTOCOL.md +536 -0
- package/README.md +40 -115
- package/dist/index.d.ts +174 -0
- package/dist/index.js +78 -0
- package/dist/jsx-runtime.d.ts +16 -0
- package/dist/jsx-runtime.js +7 -0
- package/dist/reconciler.d.ts +30 -0
- package/dist/reconciler.js +583 -0
- package/package.json +40 -39
- package/dist/src/app.d.ts +0 -66
- package/dist/src/app.js +0 -272
- package/dist/src/events.d.ts +0 -36
- package/dist/src/events.js +0 -37
- package/dist/src/index.d.ts +0 -5
- package/dist/src/index.js +0 -5
- package/dist/src/ipc.d.ts +0 -28
- package/dist/src/ipc.js +0 -214
- package/dist/src/protocol.d.ts +0 -15
- package/dist/src/protocol.js +0 -22
- package/dist/src/widgets.d.ts +0 -528
- package/dist/src/widgets.js +0 -602
- package/src/app.ts +0 -347
- package/src/events.ts +0 -85
- package/src/index.ts +0 -68
- package/src/ipc.ts +0 -233
- package/src/protocol.ts +0 -27
- package/src/widgets.ts +0 -467
package/src/app.ts
DELETED
|
@@ -1,347 +0,0 @@
|
|
|
1
|
-
import { createInterface } from "node:readline";
|
|
2
|
-
import { spawn } from "node:child_process";
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
type CallbackEvent,
|
|
6
|
-
type ChangeEvent,
|
|
7
|
-
type ClickEvent,
|
|
8
|
-
type InitEvent,
|
|
9
|
-
type InputEvent,
|
|
10
|
-
type PopoverEvent,
|
|
11
|
-
type ScrollEvent,
|
|
12
|
-
type ToggleEvent,
|
|
13
|
-
parseCallbackEvent,
|
|
14
|
-
parseInitEvent,
|
|
15
|
-
} from "./events.js";
|
|
16
|
-
import { StatusItem } from "./protocol.js";
|
|
17
|
-
import { type TreeNode, InlineHandlerRegistry } from "./widgets.js";
|
|
18
|
-
|
|
19
|
-
type Handler<EventT> = (event: EventT) => void | Promise<void>;
|
|
20
|
-
|
|
21
|
-
interface OutgoingMessage {
|
|
22
|
-
command: string;
|
|
23
|
-
data: unknown;
|
|
24
|
-
line: string;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
interface ShowNotificationOptions {
|
|
28
|
-
body?: string;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export interface CommandResult {
|
|
32
|
-
stdout: string;
|
|
33
|
-
stderr: string;
|
|
34
|
-
rc: number;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
interface DismissNotificationArgs {
|
|
38
|
-
id: number;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export abstract class Applet<State extends object> {
|
|
42
|
-
state: State;
|
|
43
|
-
|
|
44
|
-
private readonly handlerMap = new Map<string, Handler<CallbackEvent>>();
|
|
45
|
-
private inlineHandlerMap = new Map<string, (event: CallbackEvent) => void | Promise<void>>();
|
|
46
|
-
private readonly outgoing: OutgoingMessage[] = [];
|
|
47
|
-
private flushPromise: Promise<void> | null = null;
|
|
48
|
-
private renderQueued = false;
|
|
49
|
-
private lastStatus: unknown[] | null = null;
|
|
50
|
-
private lastTree: Record<string, unknown> | null = null;
|
|
51
|
-
private popoverOpen = false;
|
|
52
|
-
|
|
53
|
-
protected constructor() {
|
|
54
|
-
this.state = this.initialState();
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
protected abstract initialState(): State;
|
|
58
|
-
|
|
59
|
-
protected cssClass(): string | null {
|
|
60
|
-
return null;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
protected async onStart(): Promise<void> {}
|
|
64
|
-
|
|
65
|
-
protected async onInit(_event: InitEvent): Promise<void> {}
|
|
66
|
-
|
|
67
|
-
protected async onCallback(_event: CallbackEvent): Promise<void> {}
|
|
68
|
-
|
|
69
|
-
protected async status(_state: State): Promise<StatusItem[]> {
|
|
70
|
-
return [];
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
protected async popover(_state: State): Promise<TreeNode | null> {
|
|
74
|
-
return null;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
async setState(patch: Partial<State>): Promise<void> {
|
|
78
|
-
this.state = { ...this.state, ...patch };
|
|
79
|
-
await this.scheduleRender();
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
onClick(id: string, handler: Handler<ClickEvent>): void {
|
|
83
|
-
this.register("click", id, handler as Handler<CallbackEvent>);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
onScroll(id: string, handler: Handler<ScrollEvent>): void {
|
|
87
|
-
this.register("scroll", id, handler as Handler<CallbackEvent>);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
onInput(id: string, handler: Handler<InputEvent>): void {
|
|
91
|
-
this.register("input", id, handler as Handler<CallbackEvent>);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
onChange(id: string, handler: Handler<ChangeEvent>): void {
|
|
95
|
-
this.register("change", id, handler as Handler<CallbackEvent>);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
onToggle(id: string, handler: Handler<ToggleEvent>): void {
|
|
99
|
-
this.register("toggle", id, handler as Handler<CallbackEvent>);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
onPopover(handler: Handler<PopoverEvent>): void {
|
|
103
|
-
this.register("open", "popover", handler as Handler<CallbackEvent>);
|
|
104
|
-
this.register("close", "popover", handler as Handler<CallbackEvent>);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
isPopoverOpen(): boolean {
|
|
108
|
-
return this.popoverOpen;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
log(...args: unknown[]): void {
|
|
112
|
-
process.stderr.write(args.map(String).join(" ") + "\n");
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
protected async showNotification(summary: string, options: ShowNotificationOptions = {}): Promise<void> {
|
|
116
|
-
const args = [summary];
|
|
117
|
-
if (options.body !== undefined) {
|
|
118
|
-
args.push(options.body);
|
|
119
|
-
}
|
|
120
|
-
await this.runDesktopCommand("notify-send", args);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
protected async openUri(uri: string): Promise<void> {
|
|
124
|
-
await this.runDesktopCommand("xdg-open", [uri]);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
protected async copyToClipboard(text: string): Promise<void> {
|
|
128
|
-
await this.runDesktopCommand("wl-copy", [], text);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
protected async runCommand(command: string[]): Promise<CommandResult> {
|
|
132
|
-
return await runCommand(command);
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
protected dismissNotification(args: DismissNotificationArgs): void {
|
|
136
|
-
this.emitAction("dismiss_notification", args);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
protected closePopover(): void {
|
|
140
|
-
this.emitAction("close_popover", {});
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
protected async runDesktopCommand(command: string, args: string[], input?: string): Promise<void> {
|
|
144
|
-
await runDesktopCommand([command, ...args], input);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
async run(): Promise<void> {
|
|
148
|
-
process.stdout.on("error", (err: NodeJS.ErrnoException) => {
|
|
149
|
-
if (err.code === "EPIPE") {
|
|
150
|
-
process.exit(0);
|
|
151
|
-
}
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
await this.onStart();
|
|
155
|
-
const cssClass = this.cssClass();
|
|
156
|
-
if (cssClass !== null) {
|
|
157
|
-
process.stdout.write(`class ${cssClass}\n`);
|
|
158
|
-
}
|
|
159
|
-
await this.scheduleRender();
|
|
160
|
-
|
|
161
|
-
const rl = createInterface({
|
|
162
|
-
input: process.stdin,
|
|
163
|
-
crlfDelay: Infinity,
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
for await (const line of rl) {
|
|
167
|
-
if (!line) {
|
|
168
|
-
continue;
|
|
169
|
-
}
|
|
170
|
-
let raw: { command: string; data: unknown } | null;
|
|
171
|
-
try {
|
|
172
|
-
raw = parseLine(line);
|
|
173
|
-
} catch (err) {
|
|
174
|
-
process.stderr.write(`glimpse-sdk: ignoring malformed input: ${err}\n`);
|
|
175
|
-
continue;
|
|
176
|
-
}
|
|
177
|
-
if (raw === null) {
|
|
178
|
-
continue;
|
|
179
|
-
}
|
|
180
|
-
const data = raw.data as Record<string, unknown>;
|
|
181
|
-
try {
|
|
182
|
-
await this.handleIncoming(raw.command, data);
|
|
183
|
-
} catch (err) {
|
|
184
|
-
process.stderr.write(`glimpse-sdk: error handling input: ${err}\n`);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
protected async drainOutgoingForTest(): Promise<OutgoingMessage[]> {
|
|
190
|
-
await this.scheduleRender();
|
|
191
|
-
const drained = [...this.outgoing];
|
|
192
|
-
this.outgoing.length = 0;
|
|
193
|
-
return drained;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
private register(event: string, id: string, handler: Handler<CallbackEvent>): void {
|
|
197
|
-
this.handlerMap.set(`${event}:${id}`, handler);
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
private async dispatchCallback(event: CallbackEvent): Promise<void> {
|
|
201
|
-
const key = `${event.event}:${event.id}`;
|
|
202
|
-
const inlineHandler = this.inlineHandlerMap.get(key);
|
|
203
|
-
if (inlineHandler !== undefined) {
|
|
204
|
-
await inlineHandler(event);
|
|
205
|
-
return;
|
|
206
|
-
}
|
|
207
|
-
const handler = this.handlerMap.get(key);
|
|
208
|
-
if (handler !== undefined) {
|
|
209
|
-
await handler(event);
|
|
210
|
-
return;
|
|
211
|
-
}
|
|
212
|
-
await this.onCallback(event);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
private async handleIncoming(type: string, data: Record<string, unknown>): Promise<void> {
|
|
216
|
-
if (type === "init") {
|
|
217
|
-
await this.onInit(parseInitEvent(data));
|
|
218
|
-
await this.scheduleRender();
|
|
219
|
-
return;
|
|
220
|
-
}
|
|
221
|
-
if (type === "event") {
|
|
222
|
-
const event = parseCallbackEvent(data);
|
|
223
|
-
if (isPopoverEvent(event)) {
|
|
224
|
-
this.popoverOpen = event.open;
|
|
225
|
-
}
|
|
226
|
-
await this.dispatchCallback(event);
|
|
227
|
-
await this.scheduleRender();
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
private async scheduleRender(): Promise<void> {
|
|
232
|
-
this.renderQueued = true;
|
|
233
|
-
if (this.flushPromise === null) {
|
|
234
|
-
this.flushPromise = Promise.resolve().then(async () => {
|
|
235
|
-
try {
|
|
236
|
-
while (this.renderQueued) {
|
|
237
|
-
this.renderQueued = false;
|
|
238
|
-
await this.flushRender();
|
|
239
|
-
}
|
|
240
|
-
} finally {
|
|
241
|
-
this.flushPromise = null;
|
|
242
|
-
}
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
await this.flushPromise;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
private async flushRender(): Promise<void> {
|
|
249
|
-
const statusItems = await this.status(this.state);
|
|
250
|
-
const status = statusItems.map((item) => item.toProtocol());
|
|
251
|
-
if (!deepEqual(status, this.lastStatus)) {
|
|
252
|
-
this.lastStatus = status;
|
|
253
|
-
this.emit("status", { items: status });
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
const widget = await this.popover(this.state);
|
|
257
|
-
if (widget !== null) {
|
|
258
|
-
const registry = new InlineHandlerRegistry();
|
|
259
|
-
widget.bindHandlers?.(registry, []);
|
|
260
|
-
this.inlineHandlerMap = registry.handlers;
|
|
261
|
-
} else {
|
|
262
|
-
this.inlineHandlerMap = new Map();
|
|
263
|
-
}
|
|
264
|
-
const tree = { root: widget?.toProtocol() ?? null };
|
|
265
|
-
if (!deepEqual(tree, this.lastTree)) {
|
|
266
|
-
this.lastTree = tree;
|
|
267
|
-
this.emit("popover", tree);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
private emit(command: string, data: unknown): void {
|
|
272
|
-
const line = `${command} ${JSON.stringify(data)}`;
|
|
273
|
-
this.outgoing.push({ command, data, line });
|
|
274
|
-
try {
|
|
275
|
-
process.stdout.write(`${line}\n`);
|
|
276
|
-
} catch (err) {
|
|
277
|
-
const code = (err as NodeJS.ErrnoException)?.code;
|
|
278
|
-
if (code !== "EPIPE") {
|
|
279
|
-
throw err;
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
private emitAction(type: string, args: object): void {
|
|
285
|
-
this.emit("action", { type, arguments: args });
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
function parseLine(line: string): { command: string; data: unknown } | null {
|
|
290
|
-
const trimmed = line.trim();
|
|
291
|
-
if (trimmed === "") {
|
|
292
|
-
return null;
|
|
293
|
-
}
|
|
294
|
-
const split = trimmed.search(/\s/);
|
|
295
|
-
if (split < 0) {
|
|
296
|
-
throw new Error("missing command payload");
|
|
297
|
-
}
|
|
298
|
-
return {
|
|
299
|
-
command: trimmed.slice(0, split),
|
|
300
|
-
data: JSON.parse(trimmed.slice(split).trimStart()),
|
|
301
|
-
};
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
function deepEqual(left: unknown, right: unknown): boolean {
|
|
305
|
-
return JSON.stringify(left) === JSON.stringify(right);
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
function isPopoverEvent(event: CallbackEvent): event is PopoverEvent {
|
|
309
|
-
return event.event === "open" || event.event === "close";
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
export async function runCommand(command: string[]): Promise<CommandResult> {
|
|
313
|
-
return await runCommandWithInput(command);
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
async function runDesktopCommand(command: string[], input?: string): Promise<void> {
|
|
317
|
-
const result = await runCommandWithInput(command, input);
|
|
318
|
-
if (result.rc !== 0) {
|
|
319
|
-
throw new Error(`${command[0]} exited with status ${result.rc}`);
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
async function runCommandWithInput(command: string[], input?: string): Promise<CommandResult> {
|
|
324
|
-
if (command.length === 0) {
|
|
325
|
-
throw new Error("command must not be empty");
|
|
326
|
-
}
|
|
327
|
-
return await new Promise<CommandResult>((resolve, reject) => {
|
|
328
|
-
const child = spawn(command[0], command.slice(1), { stdio: ["pipe", "pipe", "pipe"] });
|
|
329
|
-
const stdout: Buffer[] = [];
|
|
330
|
-
const stderr: Buffer[] = [];
|
|
331
|
-
child.on("error", reject);
|
|
332
|
-
child.stdout.on("data", (chunk: Buffer) => stdout.push(chunk));
|
|
333
|
-
child.stderr.on("data", (chunk: Buffer) => stderr.push(chunk));
|
|
334
|
-
child.on("close", (code) => {
|
|
335
|
-
resolve({
|
|
336
|
-
stdout: Buffer.concat(stdout).toString("utf8"),
|
|
337
|
-
stderr: Buffer.concat(stderr).toString("utf8"),
|
|
338
|
-
rc: code ?? -1,
|
|
339
|
-
});
|
|
340
|
-
});
|
|
341
|
-
if (input !== undefined) {
|
|
342
|
-
child.stdin.end(input);
|
|
343
|
-
} else {
|
|
344
|
-
child.stdin.end();
|
|
345
|
-
}
|
|
346
|
-
});
|
|
347
|
-
}
|
package/src/events.ts
DELETED
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
export interface InitEvent {
|
|
2
|
-
instance: string;
|
|
3
|
-
options: Record<string, unknown>;
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
interface CallbackEventBase {
|
|
7
|
-
id: string;
|
|
8
|
-
event: string;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export interface ClickEvent extends CallbackEventBase {
|
|
12
|
-
event: "click";
|
|
13
|
-
button?: string | null;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export interface ScrollEvent extends CallbackEventBase {
|
|
17
|
-
event: "scroll";
|
|
18
|
-
delta_y?: number;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export interface InputEvent extends CallbackEventBase {
|
|
22
|
-
event: "input";
|
|
23
|
-
text: string;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface ChangeEvent extends CallbackEventBase {
|
|
27
|
-
event: "change";
|
|
28
|
-
value: unknown;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export interface ToggleEvent extends CallbackEventBase {
|
|
32
|
-
event: "toggle";
|
|
33
|
-
value: boolean;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export interface PopoverEvent extends CallbackEventBase {
|
|
37
|
-
event: "open" | "close";
|
|
38
|
-
open: boolean;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export type CallbackEvent =
|
|
42
|
-
| ClickEvent
|
|
43
|
-
| ScrollEvent
|
|
44
|
-
| InputEvent
|
|
45
|
-
| ChangeEvent
|
|
46
|
-
| ToggleEvent
|
|
47
|
-
| PopoverEvent;
|
|
48
|
-
|
|
49
|
-
export function parseInitEvent(payload: Record<string, unknown>): InitEvent {
|
|
50
|
-
return {
|
|
51
|
-
instance: String(payload.instance ?? ""),
|
|
52
|
-
options: (payload.options ?? {}) as Record<string, unknown>,
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export function parseCallbackEvent(payload: Record<string, unknown>): CallbackEvent {
|
|
57
|
-
const event = String(payload.type ?? payload.event ?? "");
|
|
58
|
-
const id = String(payload.id ?? "");
|
|
59
|
-
if (event === "click") {
|
|
60
|
-
return { id, event, button: payload.button === undefined ? null : String(payload.button) };
|
|
61
|
-
}
|
|
62
|
-
if (event === "scroll") {
|
|
63
|
-
return {
|
|
64
|
-
id,
|
|
65
|
-
event,
|
|
66
|
-
delta_y: typeof payload.delta_y === "number" ? payload.delta_y : undefined,
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
if (event === "input") {
|
|
70
|
-
return { id, event, text: String(payload.text ?? "") };
|
|
71
|
-
}
|
|
72
|
-
if (event === "toggle") {
|
|
73
|
-
let value = false;
|
|
74
|
-
if (typeof payload.active === "boolean") {
|
|
75
|
-
value = payload.active;
|
|
76
|
-
} else if (typeof payload.value === "boolean") {
|
|
77
|
-
value = payload.value;
|
|
78
|
-
}
|
|
79
|
-
return { id, event, value };
|
|
80
|
-
}
|
|
81
|
-
if (event === "open" || event === "close") {
|
|
82
|
-
return { id, event, open: event === "open" };
|
|
83
|
-
}
|
|
84
|
-
return { id, event: "change", value: payload.value };
|
|
85
|
-
}
|
package/src/index.ts
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
export { Applet, runCommand } from "./app.js";
|
|
2
|
-
export {
|
|
3
|
-
type CallbackEvent,
|
|
4
|
-
type ChangeEvent,
|
|
5
|
-
type ClickEvent,
|
|
6
|
-
type InitEvent,
|
|
7
|
-
type InputEvent,
|
|
8
|
-
type PopoverEvent,
|
|
9
|
-
type ScrollEvent,
|
|
10
|
-
type ToggleEvent,
|
|
11
|
-
parseCallbackEvent,
|
|
12
|
-
parseInitEvent,
|
|
13
|
-
} from "./events.js";
|
|
14
|
-
export { ipc, IpcError, Subscriber } from "./ipc.js";
|
|
15
|
-
export { StatusItem } from "./protocol.js";
|
|
16
|
-
export {
|
|
17
|
-
Badge,
|
|
18
|
-
type BadgeKind,
|
|
19
|
-
BatteryHero,
|
|
20
|
-
BoxedList,
|
|
21
|
-
ButtonRow,
|
|
22
|
-
Calendar,
|
|
23
|
-
CameraIndicator,
|
|
24
|
-
Choice,
|
|
25
|
-
ChoiceList,
|
|
26
|
-
ChoiceTile,
|
|
27
|
-
CircleBox,
|
|
28
|
-
Column,
|
|
29
|
-
Container,
|
|
30
|
-
DateHero,
|
|
31
|
-
EmptyState,
|
|
32
|
-
EventItem,
|
|
33
|
-
Events,
|
|
34
|
-
ExpanderTile,
|
|
35
|
-
Header,
|
|
36
|
-
Hero,
|
|
37
|
-
KeyValueGrid,
|
|
38
|
-
Label,
|
|
39
|
-
LocationIndicator,
|
|
40
|
-
Meter,
|
|
41
|
-
MicIndicator,
|
|
42
|
-
MutedIndicator,
|
|
43
|
-
type PagerAppearance,
|
|
44
|
-
PagerItem,
|
|
45
|
-
PagerStrip,
|
|
46
|
-
PanelIndicator,
|
|
47
|
-
PopoverShell,
|
|
48
|
-
type PopoverSize,
|
|
49
|
-
Row,
|
|
50
|
-
ScreenCastIndicator,
|
|
51
|
-
Scroll,
|
|
52
|
-
SegmentedTile,
|
|
53
|
-
Separator,
|
|
54
|
-
SliderTile,
|
|
55
|
-
Spinner,
|
|
56
|
-
StatusDot,
|
|
57
|
-
type StatusDotStatus,
|
|
58
|
-
SwitchTile,
|
|
59
|
-
Tile,
|
|
60
|
-
type TreeNode,
|
|
61
|
-
WeatherForecastItem,
|
|
62
|
-
WeatherForecastList,
|
|
63
|
-
WeatherHourlyItem,
|
|
64
|
-
WeatherHourlyStrip,
|
|
65
|
-
WidgetBase,
|
|
66
|
-
WorldClock,
|
|
67
|
-
WorldClockRow,
|
|
68
|
-
} from "./widgets.js";
|