@monimesl/dot-core 0.1.0-alpha.3 → 0.1.0-alpha.4

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/dist/index.d.ts CHANGED
@@ -54,6 +54,18 @@ type PropsOf<M extends ComponentManifest, Children = never> = { [K in keyof M['p
54
54
  type ComponentRegistry = Readonly<Record<string, ComponentManifest>>;
55
55
  export declare function componentRegistry(manifests: Iterable<ComponentManifest>): ComponentRegistry;
56
56
  //#endregion
57
+ //#region src/view/components/amount-input.d.ts
58
+ export declare const AmountInput: ComponentManifest<"AmountInput", {
59
+ readonly value: "number";
60
+ readonly currency: "string";
61
+ readonly decimals: "number";
62
+ readonly label: "string";
63
+ readonly placeholder: "string";
64
+ readonly hint: "string";
65
+ readonly error: "string";
66
+ readonly disabled: "boolean";
67
+ }, "change", "none">;
68
+ //#endregion
57
69
  //#region src/view/components/button.d.ts
58
70
  export declare const Button: ComponentManifest<"Button", {
59
71
  readonly variant: readonly ["primary", "secondary"];
@@ -61,9 +73,46 @@ export declare const Button: ComponentManifest<"Button", {
61
73
  readonly loading: "boolean";
62
74
  }, "click", "text">;
63
75
  //#endregion
76
+ //#region src/view/components/carousel.d.ts
77
+ export declare const Carousel: ComponentManifest<"Carousel", {
78
+ readonly autoplay: "boolean";
79
+ readonly interval: "number";
80
+ readonly loop: "boolean";
81
+ readonly indicator: readonly ["dots", "none"];
82
+ readonly gap: readonly ["none", "small", "medium", "large"];
83
+ readonly effect: readonly ["slide", "scale"];
84
+ readonly index: "number";
85
+ }, "change", "elements">;
86
+ //#endregion
87
+ //#region src/view/components/chip.d.ts
88
+ export declare const Chip: ComponentManifest<"Chip", {
89
+ readonly label: "string";
90
+ readonly icon: readonly ["arrow-down", "arrow-left", "arrow-right", "arrow-up", "bank", "bell", "bolt", "calendar", "card", "cart", "cash", "check", "chevron-down", "chevron-left", "chevron-right", "chevron-up", "clock", "close", "copy", "download", "edit", "error", "eye", "eye-off", "file", "gift", "grid", "heart", "help", "history", "home", "image", "info", "list", "location", "lock", "logout", "mail", "minus", "mobile", "more", "phone", "plus", "qr-code", "receipt", "refresh", "search", "send", "settings", "share", "star", "success", "trash", "upload", "user", "users", "wallet", "warning", "water", "wifi"];
91
+ readonly selected: "boolean";
92
+ readonly disabled: "boolean";
93
+ }, "tap", "none">;
94
+ //#endregion
95
+ //#region src/view/components/code-input.d.ts
96
+ export declare const CodeInput: ComponentManifest<"CodeInput", {
97
+ readonly value: "string";
98
+ readonly length: "number";
99
+ readonly label: "string";
100
+ readonly hint: "string";
101
+ readonly error: "string";
102
+ readonly secure: "boolean";
103
+ readonly disabled: "boolean";
104
+ }, "change" | "complete", "none">;
105
+ //#endregion
64
106
  //#region src/view/components/divider.d.ts
65
107
  export declare const Divider: ComponentManifest<"Divider", Record<never, PropType>, never, "none">;
66
108
  //#endregion
109
+ //#region src/view/components/empty-state.d.ts
110
+ export declare const EmptyState: ComponentManifest<"EmptyState", {
111
+ readonly icon: readonly ["arrow-down", "arrow-left", "arrow-right", "arrow-up", "bank", "bell", "bolt", "calendar", "card", "cart", "cash", "check", "chevron-down", "chevron-left", "chevron-right", "chevron-up", "clock", "close", "copy", "download", "edit", "error", "eye", "eye-off", "file", "gift", "grid", "heart", "help", "history", "home", "image", "info", "list", "location", "lock", "logout", "mail", "minus", "mobile", "more", "phone", "plus", "qr-code", "receipt", "refresh", "search", "send", "settings", "share", "star", "success", "trash", "upload", "user", "users", "wallet", "warning", "water", "wifi"];
112
+ readonly title: "string";
113
+ readonly text: "string";
114
+ }, never, "elements">;
115
+ //#endregion
67
116
  //#region src/view/components/feedback.d.ts
68
117
  export declare const Spinner: ComponentManifest<"Spinner", {
69
118
  readonly size: readonly ["small", "medium", "large"];
@@ -82,6 +131,18 @@ export declare const Badge: ComponentManifest<"Badge", {
82
131
  //#region src/view/components/footer.d.ts
83
132
  export declare const Footer: ComponentManifest<"Footer", Record<never, PropType>, never, "elements">;
84
133
  //#endregion
134
+ //#region src/view/components/grid.d.ts
135
+ export declare const Grid: ComponentManifest<"Grid", {
136
+ readonly columns: "number";
137
+ readonly gap: readonly ["none", "small", "medium", "large"];
138
+ }, never, "elements">;
139
+ export declare const GridItem: ComponentManifest<"GridItem", {
140
+ readonly label: "string";
141
+ readonly icon: readonly ["arrow-down", "arrow-left", "arrow-right", "arrow-up", "bank", "bell", "bolt", "calendar", "card", "cart", "cash", "check", "chevron-down", "chevron-left", "chevron-right", "chevron-up", "clock", "close", "copy", "download", "edit", "error", "eye", "eye-off", "file", "gift", "grid", "heart", "help", "history", "home", "image", "info", "list", "location", "lock", "logout", "mail", "minus", "mobile", "more", "phone", "plus", "qr-code", "receipt", "refresh", "search", "send", "settings", "share", "star", "success", "trash", "upload", "user", "users", "wallet", "warning", "water", "wifi"];
142
+ readonly image: "string";
143
+ readonly badge: "string";
144
+ }, "tap", "none">;
145
+ //#endregion
85
146
  //#region src/view/components/icon.d.ts
86
147
  export declare const Icon: ComponentManifest<"Icon", {
87
148
  readonly name: readonly ["arrow-down", "arrow-left", "arrow-right", "arrow-up", "bank", "bell", "bolt", "calendar", "card", "cart", "cash", "check", "chevron-down", "chevron-left", "chevron-right", "chevron-up", "clock", "close", "copy", "download", "edit", "error", "eye", "eye-off", "file", "gift", "grid", "heart", "help", "history", "home", "image", "info", "list", "location", "lock", "logout", "mail", "minus", "mobile", "more", "phone", "plus", "qr-code", "receipt", "refresh", "search", "send", "settings", "share", "star", "success", "trash", "upload", "user", "users", "wallet", "warning", "water", "wifi"];
@@ -134,6 +195,13 @@ export declare const Toast: ComponentManifest<"Toast", {
134
195
  readonly duration: "number";
135
196
  }, "hide", "none">;
136
197
  //#endregion
198
+ //#region src/view/components/qr-code.d.ts
199
+ export declare const QRCode: ComponentManifest<"QRCode", {
200
+ readonly value: "string";
201
+ readonly size: "number";
202
+ readonly label: "string";
203
+ }, never, "none">;
204
+ //#endregion
137
205
  //#region src/view/components/select.d.ts
138
206
  export declare const Select: ComponentManifest<"Select", {
139
207
  readonly value: "string";
@@ -155,6 +223,17 @@ export declare const Skeleton: ComponentManifest<"Skeleton", {
155
223
  readonly height: "number";
156
224
  }, never, "none">;
157
225
  //#endregion
226
+ //#region src/view/components/tabs.d.ts
227
+ export declare const Tabs: ComponentManifest<"Tabs", {
228
+ readonly value: "string";
229
+ readonly variant: readonly ["underline", "segmented"];
230
+ }, "change", "elements">;
231
+ export declare const Tab: ComponentManifest<"Tab", {
232
+ readonly value: "string";
233
+ readonly label: "string";
234
+ readonly badge: "number";
235
+ }, never, "none">;
236
+ //#endregion
158
237
  //#region src/view/components/text.d.ts
159
238
  export declare const Text: ComponentManifest<"Text", {
160
239
  readonly variant: readonly ["title", "body", "caption"];
@@ -223,6 +302,16 @@ type IconName = (typeof ICON_NAMES)[number];
223
302
  //#endregion
224
303
  //#region src/view/components/index.d.ts
225
304
  export declare const builtinComponents: {
305
+ readonly AmountInput: ComponentManifest<"AmountInput", {
306
+ readonly value: "number";
307
+ readonly currency: "string";
308
+ readonly decimals: "number";
309
+ readonly label: "string";
310
+ readonly placeholder: "string";
311
+ readonly hint: "string";
312
+ readonly error: "string";
313
+ readonly disabled: "boolean";
314
+ }, "change", "none">;
226
315
  readonly Badge: ComponentManifest<"Badge", {
227
316
  readonly tone: readonly ["default", "info", "success", "warning", "danger"];
228
317
  }, never, "text">;
@@ -231,13 +320,52 @@ export declare const builtinComponents: {
231
320
  readonly disabled: "boolean";
232
321
  readonly loading: "boolean";
233
322
  }, "click", "text">;
323
+ readonly Carousel: ComponentManifest<"Carousel", {
324
+ readonly autoplay: "boolean";
325
+ readonly interval: "number";
326
+ readonly loop: "boolean";
327
+ readonly indicator: readonly ["dots", "none"];
328
+ readonly gap: readonly ["none", "small", "medium", "large"];
329
+ readonly effect: readonly ["slide", "scale"];
330
+ readonly index: "number";
331
+ }, "change", "elements">;
234
332
  readonly Checkbox: ComponentManifest<"Checkbox", {
235
333
  readonly checked: "boolean";
236
334
  readonly label: "string";
237
335
  readonly disabled: "boolean";
238
336
  }, "change", "none">;
337
+ readonly Chip: ComponentManifest<"Chip", {
338
+ readonly label: "string";
339
+ readonly icon: readonly ["arrow-down", "arrow-left", "arrow-right", "arrow-up", "bank", "bell", "bolt", "calendar", "card", "cart", "cash", "check", "chevron-down", "chevron-left", "chevron-right", "chevron-up", "clock", "close", "copy", "download", "edit", "error", "eye", "eye-off", "file", "gift", "grid", "heart", "help", "history", "home", "image", "info", "list", "location", "lock", "logout", "mail", "minus", "mobile", "more", "phone", "plus", "qr-code", "receipt", "refresh", "search", "send", "settings", "share", "star", "success", "trash", "upload", "user", "users", "wallet", "warning", "water", "wifi"];
340
+ readonly selected: "boolean";
341
+ readonly disabled: "boolean";
342
+ }, "tap", "none">;
343
+ readonly CodeInput: ComponentManifest<"CodeInput", {
344
+ readonly value: "string";
345
+ readonly length: "number";
346
+ readonly label: "string";
347
+ readonly hint: "string";
348
+ readonly error: "string";
349
+ readonly secure: "boolean";
350
+ readonly disabled: "boolean";
351
+ }, "change" | "complete", "none">;
239
352
  readonly Divider: ComponentManifest<"Divider", Record<never, PropType>, never, "none">;
353
+ readonly EmptyState: ComponentManifest<"EmptyState", {
354
+ readonly icon: readonly ["arrow-down", "arrow-left", "arrow-right", "arrow-up", "bank", "bell", "bolt", "calendar", "card", "cart", "cash", "check", "chevron-down", "chevron-left", "chevron-right", "chevron-up", "clock", "close", "copy", "download", "edit", "error", "eye", "eye-off", "file", "gift", "grid", "heart", "help", "history", "home", "image", "info", "list", "location", "lock", "logout", "mail", "minus", "mobile", "more", "phone", "plus", "qr-code", "receipt", "refresh", "search", "send", "settings", "share", "star", "success", "trash", "upload", "user", "users", "wallet", "warning", "water", "wifi"];
355
+ readonly title: "string";
356
+ readonly text: "string";
357
+ }, never, "elements">;
240
358
  readonly Footer: ComponentManifest<"Footer", Record<never, PropType>, never, "elements">;
359
+ readonly Grid: ComponentManifest<"Grid", {
360
+ readonly columns: "number";
361
+ readonly gap: readonly ["none", "small", "medium", "large"];
362
+ }, never, "elements">;
363
+ readonly GridItem: ComponentManifest<"GridItem", {
364
+ readonly label: "string";
365
+ readonly icon: readonly ["arrow-down", "arrow-left", "arrow-right", "arrow-up", "bank", "bell", "bolt", "calendar", "card", "cart", "cash", "check", "chevron-down", "chevron-left", "chevron-right", "chevron-up", "clock", "close", "copy", "download", "edit", "error", "eye", "eye-off", "file", "gift", "grid", "heart", "help", "history", "home", "image", "info", "list", "location", "lock", "logout", "mail", "minus", "mobile", "more", "phone", "plus", "qr-code", "receipt", "refresh", "search", "send", "settings", "share", "star", "success", "trash", "upload", "user", "users", "wallet", "warning", "water", "wifi"];
366
+ readonly image: "string";
367
+ readonly badge: "string";
368
+ }, "tap", "none">;
241
369
  readonly Icon: ComponentManifest<"Icon", {
242
370
  readonly name: readonly ["arrow-down", "arrow-left", "arrow-right", "arrow-up", "bank", "bell", "bolt", "calendar", "card", "cart", "cash", "check", "chevron-down", "chevron-left", "chevron-right", "chevron-up", "clock", "close", "copy", "download", "edit", "error", "eye", "eye-off", "file", "gift", "grid", "heart", "help", "history", "home", "image", "info", "list", "location", "lock", "logout", "mail", "minus", "mobile", "more", "phone", "plus", "qr-code", "receipt", "refresh", "search", "send", "settings", "share", "star", "success", "trash", "upload", "user", "users", "wallet", "warning", "water", "wifi"];
243
371
  readonly size: readonly ["small", "medium", "large"];
@@ -282,6 +410,11 @@ export declare const builtinComponents: {
282
410
  readonly ProgressBar: ComponentManifest<"ProgressBar", {
283
411
  readonly value: "number";
284
412
  }, never, "none">;
413
+ readonly QRCode: ComponentManifest<"QRCode", {
414
+ readonly value: "string";
415
+ readonly size: "number";
416
+ readonly label: "string";
417
+ }, never, "none">;
285
418
  readonly Radio: ComponentManifest<"Radio", {
286
419
  readonly value: "string";
287
420
  readonly label: "string";
@@ -317,6 +450,15 @@ export declare const builtinComponents: {
317
450
  readonly label: "string";
318
451
  readonly disabled: "boolean";
319
452
  }, "change", "none">;
453
+ readonly Tab: ComponentManifest<"Tab", {
454
+ readonly value: "string";
455
+ readonly label: "string";
456
+ readonly badge: "number";
457
+ }, never, "none">;
458
+ readonly Tabs: ComponentManifest<"Tabs", {
459
+ readonly value: "string";
460
+ readonly variant: readonly ["underline", "segmented"];
461
+ }, "change", "elements">;
320
462
  readonly Text: ComponentManifest<"Text", {
321
463
  readonly variant: readonly ["title", "body", "caption"];
322
464
  readonly tone: readonly ["default", "muted", "info", "success", "warning", "danger"];
@@ -406,6 +548,29 @@ export declare function connectHost(caller: HostCaller | null): void;
406
548
  export declare function callHost<Result>(method: string, params: unknown, options?: HostCallOptions): HostRequest<Result>;
407
549
  export declare function createHostRequest<Result>(promise: Promise<Result>, cancel?: () => void): HostRequest<Result>;
408
550
  //#endregion
551
+ //#region src/page/bars.d.ts
552
+ interface NavigationBarOptions {
553
+ title?: string | undefined;
554
+ hidden?: boolean | undefined;
555
+ backgroundColor?: string | undefined;
556
+ textColor?: string | undefined;
557
+ }
558
+ interface TabBarOptions {
559
+ hidden?: boolean | undefined;
560
+ }
561
+ interface PageConfigs {
562
+ navigationBar?: NavigationBarOptions | undefined;
563
+ tabBar?: TabBarOptions | undefined;
564
+ }
565
+ interface PageBars {
566
+ navigationBar: NavigationBarOptions;
567
+ tabBar: TabBarOptions;
568
+ }
569
+ export declare function checkNavigationBar(options: NavigationBarOptions): void;
570
+ export declare function checkTabBar(options: TabBarOptions): void;
571
+ export declare function checkConfigs(configs: PageConfigs): void;
572
+ export declare function mergeConfigs(...configs: (PageConfigs | undefined)[]): PageBars;
573
+ //#endregion
409
574
  //#region src/page/navigation.d.ts
410
575
  export declare const MAX_STACK_DEPTH = 8;
411
576
  export declare function isPageId(value: string): boolean;
@@ -488,6 +653,9 @@ interface LogicLayerMessages {
488
653
  hostCancel: {
489
654
  id: number;
490
655
  };
656
+ pageBars: {
657
+ instanceId: number;
658
+ } & PageBars;
491
659
  }
492
660
  interface HostLayerMessages {
493
661
  syncStack: {
@@ -670,5 +838,5 @@ export declare class MessageChannel<Outgoing extends MessageMap, Incoming extend
670
838
  listen(onError: (error: unknown, message: Envelope) => void): () => void;
671
839
  }
672
840
  //#endregion
673
- export type { AppState, BuiltinComponents, ChildrenType, ColorScheme, ComponentManifest, ComponentRegistry, DotEvent, DotHooks, DotPermission, Envelope, EventProp, HostCallOptions, HostCaller, HostErrorCode, HostLayerMessages, HostRequest, HostResult, IconName, LogicLayerMessages, MessageHandler, MessageMap, MessageType, Navigation, PageHooks, PageLaunchOptions, PageState, PropType, PropTypes, PropValue, PropsOf, RenderContext, SchemeColor, SourceLocation, StackEntry, SystemContext, Theme, ThemeColors, Transport, TransportAdapter, UILayerMessages, ViewRender };
841
+ export type { AppState, BuiltinComponents, ChildrenType, ColorScheme, ComponentManifest, ComponentRegistry, DotEvent, DotHooks, DotPermission, Envelope, EventProp, HostCallOptions, HostCaller, HostErrorCode, HostLayerMessages, HostRequest, HostResult, IconName, LogicLayerMessages, MessageHandler, MessageMap, MessageType, Navigation, NavigationBarOptions, PageBars, PageConfigs, PageHooks, PageLaunchOptions, PageState, PropType, PropTypes, PropValue, PropsOf, RenderContext, SchemeColor, SourceLocation, StackEntry, SystemContext, TabBarOptions, Theme, ThemeColors, Transport, TransportAdapter, UILayerMessages, ViewRender };
674
842
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/event/core.ts","../src/view/component.ts","../src/view/components/button.ts","../src/view/components/divider.ts","../src/view/components/feedback.ts","../src/view/components/footer.ts","../src/view/components/icon.ts","../src/view/components/image.ts","../src/view/components/input.ts","../src/view/components/list.ts","../src/view/components/overlays.ts","../src/view/components/select.ts","../src/view/components/skeleton.ts","../src/view/components/text.ts","../src/view/components/text-area.ts","../src/view/components/toggles.ts","../src/view/components/view.ts","../src/view/components/options.ts","../src/view/components/index.ts","../src/theme/theme.ts","../src/host/context.ts","../src/host/calls.ts","../src/page/navigation.ts","../src/protocol/core.ts","../src/view/renderer.ts","../src/view/values.ts","../src/source/location.ts","../src/source/error.ts","../src/event/emitter.ts","../src/protocol/transport.ts","../src/host/host.ts","../src/host/permissions.ts","../src/host/files.ts","../src/host/network.ts","../src/host/react.ts","../src/page/lifecycle.ts","../src/page/state.ts","../src/version/semantic-version.ts","../src/messageChannel.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/event/core.ts","../src/view/component.ts","../src/view/components/amount-input.ts","../src/view/components/button.ts","../src/view/components/carousel.ts","../src/view/components/chip.ts","../src/view/components/code-input.ts","../src/view/components/divider.ts","../src/view/components/empty-state.ts","../src/view/components/feedback.ts","../src/view/components/footer.ts","../src/view/components/grid.ts","../src/view/components/icon.ts","../src/view/components/image.ts","../src/view/components/input.ts","../src/view/components/list.ts","../src/view/components/overlays.ts","../src/view/components/qr-code.ts","../src/view/components/select.ts","../src/view/components/skeleton.ts","../src/view/components/tabs.ts","../src/view/components/text.ts","../src/view/components/text-area.ts","../src/view/components/toggles.ts","../src/view/components/view.ts","../src/view/components/options.ts","../src/view/components/index.ts","../src/theme/theme.ts","../src/host/context.ts","../src/host/calls.ts","../src/page/bars.ts","../src/page/navigation.ts","../src/protocol/core.ts","../src/view/renderer.ts","../src/view/values.ts","../src/source/location.ts","../src/source/error.ts","../src/event/emitter.ts","../src/protocol/transport.ts","../src/host/host.ts","../src/host/permissions.ts","../src/host/files.ts","../src/host/network.ts","../src/host/react.ts","../src/page/lifecycle.ts","../src/page/state.ts","../src/version/semantic-version.ts","../src/messageChannel.ts"],"mappings":";UAEiB,SAAS,kBAAkB,OAAO,SAAS;WACjD;WACA,QAAQ;WACR,MAAM;;wBAGD,YAAY,SAAS,uBACnC,cACA,SAAQ,QACR,OAAM,SAAS,2BACd,SAAS;;;UCVK;EACf;EACA;EACA;EACA;;KAGU,iBAAiB;KAEjB,UAAU,UAAU,YAAY,8BACxC,YACA,gBAAgB,YACd,UAAU;;;;;;KAQJ;;;;;UAMK,kBACf,8BACA,cAAc,eAAe,YAAY,eAAe,WACxD,gCACA,iBAAiB,eAAe;WAEvB,MAAM;WACN,OAAO;WAEP,iBAAiB;WACjB,UAAU;WACV;;wBAGK,sBACR,2BACA,cAAc,eAAe,YAAY,cAAc,iBACvD,qCACA,iBAAiB,eAAe,cACtC;EACA,MAAM;EACN,QAAQ;EACR,kBAAkB;EAClB,UAAU;EACV;IACE,kBAAkB,MAAM,OAAO,QAAQ;KAI/B,UAAU,6BAA6B,WAAW;wBAE9C,UAAU,sBAAsB,OAAO,QAAQ,UAAU;wBAKzD,YAAY;wBAMZ,UAAU;;;;;;KAUd,QAAQ,UAAU,mBAAmB,uBAC9C,WAAW,cAAc,UAAU,WAAW,wBAE9C,KAAK,uBAAuB,UAAU,QAAQ,OAAO,qCACnD;EAA2C,WAAW;;KAE/C,oBAAoB,SAAS,eAAe;wBAExC,kBAAkB,WAAW,SAAS,qBAAqB;;;qBCpF9D,aAAA;;;;;;;;;;;;qBCFA,QAAA;;;;;;;qBCGA,UAAA;;;;;;;;;;;qBCDA,MAAA;;;;;;;;qBCAA,WAAA;;;;;;;;;;;qBCFA,SAAO,6BAAA,cAAP;;;qBCGA,YAAA;;;;;;;qBCFA,SAAA;WAAO;;qBAMP,aAAA;WAAW;;qBAQX,QAAA;;;;qBAMA,OAAA;WAAK;;;;qBCnBL,QAAM,4BAAA,cAAN;;;qBCAA,MAAA;;;;qBAOA,UAAA;;;;;;;;qBCRA,MAAA;;;;;;;qBCDA,OAAA;;;;;;;;;;qBCAA,OAAA;;;;;;;;;;;;;;qBCCA,MAAI,0BAAA,cAAJ;qBAMA,UAAA;;;;;;;;;qBCJA,OAAA;;;;qBASA,OAAA;;;;;;;qBCXA,QAAA;;;;;;;qBCAA,QAAA;;;;;;;;qBAcA,QAAA;;;;;;qBCfA,UAAA;;;;;;;qBCEA,MAAA;;;;qBAWA,KAAA;;;;;;;qBCZA,MAAA;;;;;;;;;qBCDA,UAAA;;;;;;;;;;;;qBCAA,QAAA;;;;;qBAOA,UAAA;;;;;qBAQA,YAAA;;;;;qBAOA,OAAA;;;;;;;qBCrBA,MAAA;;;;;;;;;;;;;;;;qBCHA;qBAKA;qBAEA;qBAEA;KA+DD,mBAAmB;;;qBCRlB;wBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAqCD,2BAA2B;qBAE1B,iBAAe,SAAA,eAAA,0BAAA,eAAf,mBAAe;;;;;;;;UClGX;EAEf,SAAS;EACT,SAAS;EACT;;UAGe;EACf,UAAU;EACV,aAAa;EACb,UAAU;EACV,OAAO;;UAGQ;EACf;EACA;;KAGU;;;KCpBA;UAEK;WACN,QAAQ;WACR,UAAU;;qBAGR,wBAAwB;;;KCXzB;qBAGC,kBAAkB;WACX;WACT,MAAM;EAEH,YAAA,MAAM,eAAe;;UAMlB;EACf;;UAGe,YAAY,WAAW,QAAQ;EAE9C;;KAGU,cACV,gBACA,iBACA,SAAS,oBACN;wBAKW,YAAY,QAAQ;wBAIpB,SAAS,QACvB,gBACA,iBACA,UAAS,kBACR,YAAY;wBAWC,kBAAkB,QAChC,SAAS,QAAQ,SACjB,sBACC,YAAY;;;UClDE;EAEf;EACA;EAEA;EACA;;UAGe;EAEf;;UAIe;EACf,gBAAgB;EAChB,SAAS;;UAGM;EACf,eAAe;EACf,QAAQ;;wBAMM,mBAAmB,SAAS;wBAe5B,YAAY,SAAS;wBAMrB,aAAa,SAAS;wBAMtB,gBAAgB,UAAU,6BAA6B;;;qBC1D1D;wBAIG,SAAS;KAIb,oBAAoB,SAAS;KAE7B;WAEG;WACA;WACA,SAAS;;WAET;WAAyB;;UAEvB;WACN;WACA;WACA,SAAS;;qBAGP;;WACF;EAIG,YAAA;MAIR,kBAAkB;MAIlB,OAAO;;;;;EAQX,MAAM,YAAY;;;;KCtCR,YAAY;UAGP;EAEf,SAAS;EAET;IAAQ;IAAoB;IAAc,SAAS;;EACnD;IAAU;;EACV;IAAQ;;EACR;IAAQ;;EACR;IAAS;IAAoB;IAAiB,OAAO;;;UAItC;EACf;IAAY,OAAO;;EACnB;IAAiB;IAAoB,OAAO;;EAC5C;IAAgB;IAAoB,YAAY;;EAChD;IAAS;IAAqB;;EAE9B,UAAU;IAAe;;EAEzB;IAAY;IAAY;IAAgB;IAAiB;;EAEzD;IAAc;;EAEd;IAAY;MAAuB;;UAIpB;EAEf;IAAa,gBAAgB;IAAc;;EAE3C,mBAAmB;EAEnB,YAAY;;KAGF;EACR;EAAY;;EAAqB;EAAY;IAAS,MAAM;IAAe;;;UAE9D,SAAS,8BAA8B;WAC7C,MAAM;WACN,SAAS;;KAGR;KAEA,YAAY,UAAU,oBAAoB;;;;;;;UClDrC,cAAc;;;;WAIpB,IACP,cACA,OAAO,mCACJ,WAAW,qBACX;;;;;;WAOI,KACP,iBACA,OAAO,SAAS,8BACZ,OAAO;;;;WAKJ,OAAO;;;;;;WAOP,OACP,gBACA,SAAS,eAAe,mBAAmB,kBAC3C,OAAO,eAAe,8BACnB;;;;;;KAOK,cAAc,MAAM,OAAO,WAAW,SAAS,cAAc,UAAU;;;wBChDnE,OAAO;wBAeP,OAAO;;;UCfN;WACN;WACA;WACA;;wBAIK,cAAc,kBAAkB,mBAAmB;wBAsBnD,WAAW,gBAAgB,iBAAiB;wBAI5C,eAAe,iBAAiB,eAAe,WAAW;;;qBC7B7D,oBAAoB;WACtB;WACA;WACA,KAAK;EAEF,YAAA,gBAAgB,eAAe,WAAW;;;;KCTnD,eAAe;qBAEP,aAAa,kBAAkB,WAAW,SAAS;;EAG9D,GAAG,gBAAgB,QAAQ,MAAM,GAAG,UAAU,OAAO;EAOrD,KAAK,gBAAgB,QAAQ,MAAM,MAAM,MAAM,WAAW,OAAO;;;;;;;;UCRlD;EACf,KAAK;EAEL,OAAO,WAAW;;;;;;;UAQH;EACf,YAAY;EACZ,iBAAiB,iBAAiB,WAAW;IAAS;;EACtD,oBAAoB,iBAAiB,WAAW;IAAS;;;wBAG3C,uBAAuB,SAAS,mBAAmB;wBAYnD,wBAAwB,WAAW;;;QC/B3C;MAGF,iBAAiB;;wBAIP,iBAAiB;;;qBCLpB;KAED,wBAAwB;wBAEpB,aAAa,gBAAgB,SAAS;;;qBCRzC;wBAIG,mBAAmB,gBAAgB;;;;;qBCFtC,sBAAoB;qBAGpB;wBAEG,cAAc;wBAId,WAAW,0BAA0B;;;qBCPxC;qBAGA;;;;;wBAQG,aAAa,yBAAyB;wBAMtC,kBAAkB,qBAAqB;wBAQvC,mBAAmB,6BAA6B;;;UC3B/C;EACf,OAAO,SAAS,2BAA2B;EAC3C,iBAAiB;EACjB,iBAAiB;EACjB,mBAAmB;;UAGJ;EACf,mBAAmB;EACnB,QAAQ,OAAO;;qBAWJ,4BAAuD;;;wBCtBpD,aAAa,GAAG,OAAO,GAAG,SAAS,QAAQ,KAAK;;;qBCCnD,gBAAc;wBAWX,kBAAkB,iBAAiB;wBAInC,aAAa;wBAKb,iBAAiB,iBAAiB;wBAMlC,gBAAgB,cAAc;;;KCxBlC,eAAe,YAAY,SAAS;qBAEnC,eAAe,iBAAiB,YAAY,iBAAiB;;EAI5D,YAAA,WAAW;EAIvB,KAAK,UAAU,YAAY,WAAW,MAAM,GAAG,SAAS,SAAS;EAIjE,OAAO,UAAU,YAAY,WAC3B,MAAM,GACN,SAAS,eAAe,SAAS,MAChC,eAAe,SAAS;EAM3B,OAAO,UAAU,gBAAgB,SAAS"}
package/dist/index.js CHANGED
@@ -87,6 +87,23 @@ var SourceError = class extends Error {
87
87
  }
88
88
  };
89
89
  //#endregion
90
+ //#region src/view/components/amount-input.ts
91
+ const AmountInput = defineComponent({
92
+ name: "AmountInput",
93
+ props: {
94
+ value: "number",
95
+ currency: "string",
96
+ decimals: "number",
97
+ label: "string",
98
+ placeholder: "string",
99
+ hint: "string",
100
+ error: "string",
101
+ disabled: "boolean"
102
+ },
103
+ events: ["change"],
104
+ children: "none"
105
+ });
106
+ //#endregion
90
107
  //#region src/view/components/button.ts
91
108
  const Button = defineComponent({
92
109
  name: "Button",
@@ -99,18 +116,18 @@ const Button = defineComponent({
99
116
  children: "text"
100
117
  });
101
118
  //#endregion
102
- //#region src/view/components/divider.ts
103
- const Divider = defineComponent({
104
- name: "Divider",
105
- children: "none"
106
- });
107
- //#endregion
108
119
  //#region src/view/components/options.ts
109
120
  const SIZES = [
110
121
  "small",
111
122
  "medium",
112
123
  "large"
113
124
  ];
125
+ const SPACES = [
126
+ "none",
127
+ "small",
128
+ "medium",
129
+ "large"
130
+ ];
114
131
  const TONES = [
115
132
  "default",
116
133
  "muted",
@@ -189,6 +206,68 @@ const ICON_NAMES = [
189
206
  "wifi"
190
207
  ];
191
208
  //#endregion
209
+ //#region src/view/components/carousel.ts
210
+ const Carousel = defineComponent({
211
+ name: "Carousel",
212
+ props: {
213
+ autoplay: "boolean",
214
+ interval: "number",
215
+ loop: "boolean",
216
+ indicator: ["dots", "none"],
217
+ gap: SPACES,
218
+ effect: ["slide", "scale"],
219
+ index: "number"
220
+ },
221
+ events: ["change"],
222
+ children: "elements"
223
+ });
224
+ //#endregion
225
+ //#region src/view/components/chip.ts
226
+ const Chip = defineComponent({
227
+ name: "Chip",
228
+ props: {
229
+ label: "string",
230
+ icon: ICON_NAMES,
231
+ selected: "boolean",
232
+ disabled: "boolean"
233
+ },
234
+ events: ["tap"],
235
+ children: "none"
236
+ });
237
+ //#endregion
238
+ //#region src/view/components/code-input.ts
239
+ const CodeInput = defineComponent({
240
+ name: "CodeInput",
241
+ props: {
242
+ value: "string",
243
+ length: "number",
244
+ label: "string",
245
+ hint: "string",
246
+ error: "string",
247
+ secure: "boolean",
248
+ disabled: "boolean"
249
+ },
250
+ events: ["change", "complete"],
251
+ children: "none"
252
+ });
253
+ //#endregion
254
+ //#region src/view/components/divider.ts
255
+ const Divider = defineComponent({
256
+ name: "Divider",
257
+ children: "none"
258
+ });
259
+ //#endregion
260
+ //#region src/view/components/empty-state.ts
261
+ const EmptyState = defineComponent({
262
+ name: "EmptyState",
263
+ props: {
264
+ icon: ICON_NAMES,
265
+ title: "string",
266
+ text: "string"
267
+ },
268
+ children: "elements"
269
+ });
270
+ //#endregion
192
271
  //#region src/view/components/feedback.ts
193
272
  const Spinner = defineComponent({
194
273
  name: "Spinner",
@@ -220,6 +299,27 @@ const Footer = defineComponent({
220
299
  children: "elements"
221
300
  });
222
301
  //#endregion
302
+ //#region src/view/components/grid.ts
303
+ const Grid = defineComponent({
304
+ name: "Grid",
305
+ props: {
306
+ columns: "number",
307
+ gap: SPACES
308
+ },
309
+ children: "elements"
310
+ });
311
+ const GridItem = defineComponent({
312
+ name: "GridItem",
313
+ props: {
314
+ label: "string",
315
+ icon: ICON_NAMES,
316
+ image: "string",
317
+ badge: "string"
318
+ },
319
+ events: ["tap"],
320
+ children: "none"
321
+ });
322
+ //#endregion
223
323
  //#region src/view/components/icon.ts
224
324
  const Icon = defineComponent({
225
325
  name: "Icon",
@@ -315,6 +415,17 @@ const Toast = defineComponent({
315
415
  children: "none"
316
416
  });
317
417
  //#endregion
418
+ //#region src/view/components/qr-code.ts
419
+ const QRCode = defineComponent({
420
+ name: "QRCode",
421
+ props: {
422
+ value: "string",
423
+ size: "number",
424
+ label: "string"
425
+ },
426
+ children: "none"
427
+ });
428
+ //#endregion
318
429
  //#region src/view/components/select.ts
319
430
  const Select = defineComponent({
320
431
  name: "Select",
@@ -353,6 +464,26 @@ const Skeleton = defineComponent({
353
464
  children: "none"
354
465
  });
355
466
  //#endregion
467
+ //#region src/view/components/tabs.ts
468
+ const Tabs = defineComponent({
469
+ name: "Tabs",
470
+ props: {
471
+ value: "string",
472
+ variant: ["underline", "segmented"]
473
+ },
474
+ events: ["change"],
475
+ children: "elements"
476
+ });
477
+ const Tab = defineComponent({
478
+ name: "Tab",
479
+ props: {
480
+ value: "string",
481
+ label: "string",
482
+ badge: "number"
483
+ },
484
+ children: "none"
485
+ });
486
+ //#endregion
356
487
  //#region src/view/components/text.ts
357
488
  const Text = defineComponent({
358
489
  name: "Text",
@@ -438,16 +569,10 @@ const Radio = defineComponent({
438
569
  });
439
570
  //#endregion
440
571
  //#region src/view/components/view.ts
441
- const SPACE = [
442
- "none",
443
- "small",
444
- "medium",
445
- "large"
446
- ];
447
572
  const View = defineComponent({
448
573
  name: "View",
449
574
  props: {
450
- gap: SPACE,
575
+ gap: SPACES,
451
576
  direction: ["column", "row"],
452
577
  align: [
453
578
  "stretch",
@@ -463,11 +588,11 @@ const View = defineComponent({
463
588
  ],
464
589
  wrap: "boolean",
465
590
  grow: "boolean",
466
- padding: SPACE,
467
- paddingTop: SPACE,
468
- paddingStart: SPACE,
469
- paddingEnd: SPACE,
470
- paddingBottom: SPACE,
591
+ padding: SPACES,
592
+ paddingTop: SPACES,
593
+ paddingStart: SPACES,
594
+ paddingEnd: SPACES,
595
+ paddingBottom: SPACES,
471
596
  variant: ["plain", "card"]
472
597
  },
473
598
  events: ["tap"],
@@ -476,11 +601,18 @@ const View = defineComponent({
476
601
  //#endregion
477
602
  //#region src/view/components/index.ts
478
603
  const builtinComponents = {
604
+ AmountInput,
479
605
  Badge,
480
606
  Button,
607
+ Carousel,
481
608
  Checkbox,
609
+ Chip,
610
+ CodeInput,
482
611
  Divider,
612
+ EmptyState,
483
613
  Footer,
614
+ Grid,
615
+ GridItem,
484
616
  Icon,
485
617
  Image,
486
618
  Input,
@@ -489,6 +621,7 @@ const builtinComponents = {
489
621
  Notice,
490
622
  Option,
491
623
  ProgressBar,
624
+ QRCode,
492
625
  Radio,
493
626
  RadioGroup,
494
627
  Select,
@@ -496,6 +629,8 @@ const builtinComponents = {
496
629
  Skeleton,
497
630
  Spinner,
498
631
  Switch,
632
+ Tab,
633
+ Tabs,
499
634
  Text,
500
635
  TextArea,
501
636
  Toast,
@@ -759,6 +894,42 @@ function applyChanges(state, changes) {
759
894
  return next;
760
895
  }
761
896
  //#endregion
897
+ //#region src/page/bars.ts
898
+ const HEX_COLOR = /^#[0-9a-fA-F]{6}$/;
899
+ function checkNavigationBar(options) {
900
+ const { title, hidden, backgroundColor, textColor } = options;
901
+ if (title !== void 0 && typeof title !== "string") throw new TypeError("The navigation bar's title must be text");
902
+ if (hidden !== void 0 && typeof hidden !== "boolean") throw new TypeError("The navigation bar's `hidden` must be true or false");
903
+ for (const [name, color] of Object.entries({
904
+ backgroundColor,
905
+ textColor
906
+ })) if (color !== void 0 && (typeof color !== "string" || !HEX_COLOR.test(color))) throw new TypeError(`The navigation bar's ${name} must be a color such as "#1A73E8"`);
907
+ }
908
+ function checkTabBar(options) {
909
+ if (options.hidden !== void 0 && typeof options.hidden !== "boolean") throw new TypeError("The tab bar's `hidden` must be true or false");
910
+ }
911
+ function checkConfigs(configs) {
912
+ checkNavigationBar(configs.navigationBar ?? {});
913
+ checkTabBar(configs.tabBar ?? {});
914
+ }
915
+ function mergeConfigs(...configs) {
916
+ const bars = {
917
+ navigationBar: {},
918
+ tabBar: {}
919
+ };
920
+ for (const config of configs) {
921
+ bars.navigationBar = {
922
+ ...bars.navigationBar,
923
+ ...config?.navigationBar
924
+ };
925
+ bars.tabBar = {
926
+ ...bars.tabBar,
927
+ ...config?.tabBar
928
+ };
929
+ }
930
+ return bars;
931
+ }
932
+ //#endregion
762
933
  //#region src/messageChannel.ts
763
934
  var MessageChannel = class {
764
935
  #transport;
@@ -794,6 +965,6 @@ var MessageChannel = class {
794
965
  }
795
966
  };
796
967
  //#endregion
797
- export { Badge, Button, Checkbox, DEFAULT_SYSTEM_CONTEXT, DOT_FILE_PATH_MAX_LENGTH, Divider, EventEmitter, Footer, HostError, ICON_NAMES, Icon, Image, Input, List, ListItem, MAX_STACK_DEPTH, MessageChannel, NETWORK_HOST_MAX_LENGTH, NETWORK_HOST_PATTERN, NavigationStack, Notice, Option, PAGE_HOOKS, PERMISSIONS, ProgressBar, REACT_HOST_MODULES, REACT_HOST_PATH, Radio, RadioGroup, SEMVER_PATTERN, SIZES, STATUS_TONES, Select, Sheet, Skeleton, SourceError, Spinner, Switch, TONES, Text, TextArea, Toast, View, allowsHost, applyChanges, builtinComponents, builtinRegistry, callHost, compareVersions, componentRegistry, connectHost, createAdaptorTransport, createEvent, createHostRequest, createLocator, createTransportPair, defineComponent, dotFilePathProblem, eventName, eventProp, hostTransport, isEventProp, isNetworkHost, isPageId, isPermission, isReactCompatible, isSemanticVersion, isVersionAtLeast, locatedMessage, locationAt, majorVersion, newestReactOfMajor, reactHostUrl, toList, toText };
968
+ export { AmountInput, Badge, Button, Carousel, Checkbox, Chip, CodeInput, DEFAULT_SYSTEM_CONTEXT, DOT_FILE_PATH_MAX_LENGTH, Divider, EmptyState, EventEmitter, Footer, Grid, GridItem, HostError, ICON_NAMES, Icon, Image, Input, List, ListItem, MAX_STACK_DEPTH, MessageChannel, NETWORK_HOST_MAX_LENGTH, NETWORK_HOST_PATTERN, NavigationStack, Notice, Option, PAGE_HOOKS, PERMISSIONS, ProgressBar, QRCode, REACT_HOST_MODULES, REACT_HOST_PATH, Radio, RadioGroup, SEMVER_PATTERN, SIZES, STATUS_TONES, Select, Sheet, Skeleton, SourceError, Spinner, Switch, TONES, Tab, Tabs, Text, TextArea, Toast, View, allowsHost, applyChanges, builtinComponents, builtinRegistry, callHost, checkConfigs, checkNavigationBar, checkTabBar, compareVersions, componentRegistry, connectHost, createAdaptorTransport, createEvent, createHostRequest, createLocator, createTransportPair, defineComponent, dotFilePathProblem, eventName, eventProp, hostTransport, isEventProp, isNetworkHost, isPageId, isPermission, isReactCompatible, isSemanticVersion, isVersionAtLeast, locatedMessage, locationAt, majorVersion, mergeConfigs, newestReactOfMajor, reactHostUrl, toList, toText };
798
969
 
799
970
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/view/component.ts","../src/view/values.ts","../src/source/location.ts","../src/source/error.ts","../src/view/components/button.ts","../src/view/components/divider.ts","../src/view/components/options.ts","../src/view/components/feedback.ts","../src/view/components/footer.ts","../src/view/components/icon.ts","../src/view/components/image.ts","../src/view/components/input.ts","../src/view/components/list.ts","../src/view/components/overlays.ts","../src/view/components/select.ts","../src/view/components/skeleton.ts","../src/view/components/text.ts","../src/view/components/text-area.ts","../src/view/components/toggles.ts","../src/view/components/view.ts","../src/view/components/index.ts","../src/event/emitter.ts","../src/event/core.ts","../src/host/host.ts","../src/host/context.ts","../src/host/calls.ts","../src/host/permissions.ts","../src/host/files.ts","../src/host/network.ts","../src/version/semantic-version.ts","../src/host/react.ts","../src/protocol/transport.ts","../src/page/lifecycle.ts","../src/page/navigation.ts","../src/page/state.ts","../src/messageChannel.ts"],"sourcesContent":["import type { DotEvent } from '../event/core';\n\nexport interface PropTypes {\n string: string;\n number: number;\n boolean: boolean;\n any: unknown;\n}\n\nexport type PropType = keyof PropTypes | readonly string[];\n\nexport type PropValue<T extends PropType> = T extends readonly string[]\n ? T[number]\n : T extends keyof PropTypes\n ? PropTypes[T]\n : never;\n\n/**\n * - `none`: no children\n * - `text`: text and inline components (such as `Text`).\n * - `elements`: any components, but raw text must be wrapped in an inline component.\n */\nexport type ChildrenType = 'none' | 'text' | 'elements';\n\n/**\n * Describes a UI component independently of any renderer. The compiler checks `.dml` markup\n * against it, and each renderer maps it to its own elements.\n */\nexport interface ComponentManifest<\n Name extends string = string,\n Props extends Record<string, PropType> = Record<string, PropType>,\n Events extends string = string,\n Children extends ChildrenType = ChildrenType,\n> {\n readonly name: Name;\n readonly props: Props;\n // Supported event names; `click` is written `onClick` in markup and received as the `onClick` prop.\n readonly events: readonly Events[];\n readonly children: Children;\n readonly inline?: boolean;\n}\n\nexport function defineComponent<\n const Name extends string,\n const Props extends Record<string, PropType> = Record<never, PropType>,\n const Events extends string = never,\n const Children extends ChildrenType = ChildrenType,\n>(manifest: {\n name: Name;\n props?: Props;\n events?: readonly Events[];\n children: Children;\n inline?: boolean;\n}): ComponentManifest<Name, Props, Events, Children> {\n return { props: {} as Props, events: [], ...manifest };\n}\n\nexport type EventProp<Event extends string> = `on${Capitalize<Event>}`;\n\nexport function eventProp<Event extends string>(event: Event): EventProp<Event> {\n return `on${event.charAt(0).toUpperCase()}${event.slice(1)}` as EventProp<Event>;\n}\n\n// Event props are `on` followed by a capital letter, like `onClick`.\nexport function isEventProp(name: string): boolean {\n const letterAfterOn = name.charAt('on'.length);\n return name.startsWith('on') && letterAfterOn >= 'A' && letterAfterOn <= 'Z';\n}\n\n// The reverse of eventProp: `onClick` -> `click`.\nexport function eventName(prop: string): string {\n const name = prop.slice('on'.length);\n return name.charAt(0).toLowerCase() + name.slice(1);\n}\n\n/**\n * The props a renderer's implementation of `M` receives, with `Children` as its node type. Every\n * prop is optional and may be `undefined`: markup can omit it, and a binding can evaluate to\n * `undefined` at runtime.\n */\nexport type PropsOf<M extends ComponentManifest, Children = never> = {\n [K in keyof M['props']]?: PropValue<M['props'][K]> | undefined;\n} & {\n [E in M['events'][number] as EventProp<E>]?: ((event: DotEvent) => void) | undefined;\n} & (M['children'] extends 'none' ? unknown : { children?: Children | undefined });\n\nexport type ComponentRegistry = Readonly<Record<string, ComponentManifest>>;\n\nexport function componentRegistry(manifests: Iterable<ComponentManifest>): ComponentRegistry {\n const registry: Record<string, ComponentManifest> = {};\n for (const manifest of manifests) {\n if (manifest.name in registry) {\n throw new Error(`Component <${manifest.name}> is defined twice`);\n }\n registry[manifest.name] = manifest;\n }\n return registry;\n}\n","export function toText(value: unknown): string {\n switch (typeof value) {\n case 'string':\n return value;\n case 'number':\n case 'boolean':\n case 'bigint':\n return String(value);\n case 'object':\n return value === null ? '' : JSON.stringify(value);\n default:\n return '';\n }\n}\n\nexport function toList(value: unknown): readonly unknown[] {\n if (Array.isArray(value)) {\n return value;\n }\n if (typeof value === 'object' && value !== null && Symbol.iterator in value) {\n return Array.from(value as Iterable<unknown>);\n }\n return [];\n}\n","export interface SourceLocation {\n readonly line: number;\n readonly column: number;\n readonly offset: number;\n}\n\n// Finds lines by binary search over their start offsets, computed once per source.\nexport function createLocator(source: string): (offset: number) => SourceLocation {\n const lineStarts = [0];\n for (let index = 0; index < source.length; index++) {\n if (source[index] === '\\n') {\n lineStarts.push(index + 1);\n }\n }\n return (offset) => {\n let low = 0;\n let high = lineStarts.length - 1;\n while (low < high) {\n const middle = Math.floor((low + high + 1) / 2);\n if (lineStarts[middle]! <= offset) {\n low = middle;\n } else {\n high = middle - 1;\n }\n }\n return { line: low + 1, column: offset - lineStarts[low]! + 1, offset };\n };\n}\n\nexport function locationAt(source: string, offset: number): SourceLocation {\n return createLocator(source)(offset);\n}\n\nexport function locatedMessage(message: string, file?: string, location?: SourceLocation): string {\n const where = [file, location?.line, location?.column]\n .filter((part) => part !== undefined)\n .join(':');\n return where ? `${where}: ${message}` : message;\n}\n","import type { SourceLocation } from './location';\nimport { locatedMessage } from './location';\n\n// A problem at a place in a source file. The message starts with `file:line:column:`\nexport class SourceError extends Error {\n readonly reason: string;\n readonly file: string | undefined;\n readonly loc: SourceLocation | undefined;\n\n constructor(reason: string, file?: string, location?: SourceLocation) {\n super(locatedMessage(reason, file, location));\n this.reason = reason;\n this.file = file;\n this.loc = location;\n }\n}\n","import { defineComponent } from '../component';\n\nexport const Button = defineComponent({\n name: 'Button',\n props: {\n variant: ['primary', 'secondary'],\n disabled: 'boolean',\n // Shows a spinner and ignores taps, such as while a payment is sent.\n loading: 'boolean',\n },\n events: ['click'],\n children: 'text',\n});\n","import { defineComponent } from '../component';\n\nexport const Divider = defineComponent({\n name: 'Divider',\n children: 'none',\n});\n","export const SIZES = ['small', 'medium', 'large'] as const;\n\nexport const TONES = ['default', 'muted', 'info', 'success', 'warning', 'danger'] as const;\n\nexport const STATUS_TONES = ['default', 'info', 'success', 'warning', 'danger'] as const;\n\nexport const ICON_NAMES = [\n 'arrow-down',\n 'arrow-left',\n 'arrow-right',\n 'arrow-up',\n 'bank',\n 'bell',\n 'bolt',\n 'calendar',\n 'card',\n 'cart',\n 'cash',\n 'check',\n 'chevron-down',\n 'chevron-left',\n 'chevron-right',\n 'chevron-up',\n 'clock',\n 'close',\n 'copy',\n 'download',\n 'edit',\n 'error',\n 'eye',\n 'eye-off',\n 'file',\n 'gift',\n 'grid',\n 'heart',\n 'help',\n 'history',\n 'home',\n 'image',\n 'info',\n 'list',\n 'location',\n 'lock',\n 'logout',\n 'mail',\n 'minus',\n 'mobile',\n 'more',\n 'phone',\n 'plus',\n 'qr-code',\n 'receipt',\n 'refresh',\n 'search',\n 'send',\n 'settings',\n 'share',\n 'star',\n 'success',\n 'trash',\n 'upload',\n 'user',\n 'users',\n 'wallet',\n 'warning',\n 'water',\n 'wifi',\n] as const;\n\nexport type IconName = (typeof ICON_NAMES)[number];\n","import { defineComponent } from '../component';\nimport { SIZES, STATUS_TONES } from './options';\n\nexport const Spinner = defineComponent({\n name: 'Spinner',\n props: { size: SIZES },\n children: 'none',\n});\n\nexport const ProgressBar = defineComponent({\n name: 'ProgressBar',\n // From 0 to 100.\n props: { value: 'number' },\n children: 'none',\n});\n\n// A message in the flow of the page, such as a failed payment's reason.\nexport const Notice = defineComponent({\n name: 'Notice',\n props: { tone: STATUS_TONES, title: 'string' },\n children: 'text',\n});\n\nexport const Badge = defineComponent({\n name: 'Badge',\n props: { tone: STATUS_TONES },\n children: 'text',\n});\n","import { defineComponent } from '../component';\n\n// Stays at the bottom of the screen while the page scrolls, for its main action. Put it last in\n// the page's root View.\nexport const Footer = defineComponent({\n name: 'Footer',\n children: 'elements',\n});\n","import { defineComponent } from '../component';\nimport { ICON_NAMES, SIZES, TONES } from './options';\n\nexport const Icon = defineComponent({\n name: 'Icon',\n props: { name: ICON_NAMES, size: SIZES, tone: TONES },\n children: 'none',\n inline: true,\n});\n","import { defineComponent } from '../component';\n\nexport const Image = defineComponent({\n name: 'Image',\n props: {\n src: 'string',\n alt: 'string',\n width: 'number',\n height: 'number',\n // `cover` fills the box and crops; `contain` shows the whole picture.\n fit: ['cover', 'contain'],\n shape: ['rounded', 'square', 'circle'],\n },\n events: ['load', 'error'],\n children: 'none',\n});\n","import { defineComponent } from '../component';\n\nexport const Input = defineComponent({\n name: 'Input',\n props: {\n value: 'string',\n placeholder: 'string',\n label: 'string',\n // Help shown under the field, which `error` replaces.\n hint: 'string',\n error: 'string',\n // Text shown inside the field, before and after what the person types, such as \"Le\".\n prefix: 'string',\n suffix: 'string',\n type: ['text', 'number', 'email', 'phone', 'password'],\n maxLength: 'number',\n disabled: 'boolean',\n },\n events: ['change', 'submit'],\n children: 'none',\n});\n","import { defineComponent } from '../component';\nimport { ICON_NAMES } from './options';\n\nexport const List = defineComponent({\n name: 'List',\n children: 'elements',\n});\n\n// What it holds shows at its end, in place of `value`. A row with `onTap` shows a chevron.\nexport const ListItem = defineComponent({\n name: 'ListItem',\n props: {\n title: 'string',\n subtitle: 'string',\n value: 'string',\n icon: ICON_NAMES,\n image: 'string',\n },\n events: ['tap'],\n children: 'elements',\n});\n","import { defineComponent } from '../component';\nimport { STATUS_TONES } from './options';\n\n// A panel that slides up over the page while `open` is true, such as an action sheet of buttons.\n// Tapping outside it raises `close`; the page closes it by setting `open` back to false.\nexport const Sheet = defineComponent({\n name: 'Sheet',\n props: { open: 'boolean', title: 'string' },\n events: ['close'],\n children: 'elements',\n});\n\n// Shows `message` briefly over the page, then raises `hide`, where the page clears the message\n// so the same one can show again.\nexport const Toast = defineComponent({\n name: 'Toast',\n props: {\n message: 'string',\n tone: STATUS_TONES,\n // In milliseconds.\n duration: 'number',\n },\n events: ['hide'],\n children: 'none',\n});\n","import { defineComponent } from '../component';\n\n// A field that opens a sheet of the `Option`s it holds; `value` is the chosen one's.\nexport const Select = defineComponent({\n name: 'Select',\n props: {\n value: 'string',\n label: 'string',\n placeholder: 'string',\n hint: 'string',\n error: 'string',\n disabled: 'boolean',\n },\n events: ['change'],\n children: 'elements',\n});\n\nexport const Option = defineComponent({\n name: 'Option',\n props: { value: 'string', label: 'string' },\n children: 'none',\n});\n","import { defineComponent } from '../component';\n\nexport const Skeleton = defineComponent({\n name: 'Skeleton',\n props: {\n shape: ['text', 'circle', 'box'],\n // Lines of text, for `text`.\n lines: 'number',\n // In pixels, for `circle` and `box`.\n height: 'number',\n },\n children: 'none',\n});\n","import { defineComponent } from '../component';\nimport { TONES } from './options';\n\nexport const Text = defineComponent({\n name: 'Text',\n props: {\n variant: ['title', 'body', 'caption'],\n tone: TONES,\n weight: ['regular', 'medium', 'bold'],\n align: ['start', 'center', 'end'],\n // Cuts the text off with an ellipsis after this many lines.\n maxLines: 'number',\n },\n children: 'text',\n inline: true,\n});\n","import { defineComponent } from '../component';\n\nexport const TextArea = defineComponent({\n name: 'TextArea',\n props: {\n value: 'string',\n placeholder: 'string',\n label: 'string',\n hint: 'string',\n error: 'string',\n // The lines of text it shows before scrolling.\n rows: 'number',\n maxLength: 'number',\n disabled: 'boolean',\n },\n events: ['change'],\n children: 'none',\n});\n","import { defineComponent } from '../component';\n\nexport const Switch = defineComponent({\n name: 'Switch',\n props: { checked: 'boolean', label: 'string', disabled: 'boolean' },\n events: ['change'],\n children: 'none',\n});\n\nexport const Checkbox = defineComponent({\n name: 'Checkbox',\n props: { checked: 'boolean', label: 'string', disabled: 'boolean' },\n events: ['change'],\n children: 'none',\n});\n\n// A choice of one `Radio` among those it holds; `value` is the chosen one's.\nexport const RadioGroup = defineComponent({\n name: 'RadioGroup',\n props: { value: 'string', label: 'string', disabled: 'boolean' },\n events: ['change'],\n children: 'elements',\n});\n\nexport const Radio = defineComponent({\n name: 'Radio',\n props: { value: 'string', label: 'string', disabled: 'boolean' },\n children: 'none',\n});\n","import { defineComponent } from '../component';\n\nconst SPACE = ['none', 'small', 'medium', 'large'] as const;\n\nexport const View = defineComponent({\n name: 'View',\n props: {\n gap: SPACE,\n direction: ['column', 'row'],\n // Across `direction`.\n align: ['stretch', 'start', 'center', 'end'],\n // Along `direction`: `between` puts the first and last child at the ends.\n justify: ['start', 'center', 'end', 'between'],\n // Lets children that don't fit flow onto another line.\n wrap: 'boolean',\n // Takes the space its parent has left along the parent's direction.\n grow: 'boolean',\n // Space inside the view's edges. `start` and `end` follow the reading direction, so they\n padding: SPACE,\n paddingTop: SPACE,\n paddingStart: SPACE,\n paddingEnd: SPACE,\n paddingBottom: SPACE,\n variant: ['plain', 'card'],\n },\n events: ['tap'],\n children: 'elements',\n});\n","import { componentRegistry } from '../component';\nimport { Button } from './button';\nimport { Divider } from './divider';\nimport { Badge, Notice, ProgressBar, Spinner } from './feedback';\nimport { Footer } from './footer';\nimport { Icon } from './icon';\nimport { Image } from './image';\nimport { Input } from './input';\nimport { List, ListItem } from './list';\nimport { Sheet, Toast } from './overlays';\nimport { Option, Select } from './select';\nimport { Skeleton } from './skeleton';\nimport { Text } from './text';\nimport { TextArea } from './text-area';\nimport { Checkbox, Radio, RadioGroup, Switch } from './toggles';\nimport { View } from './view';\n\nexport {\n Badge,\n Button,\n Checkbox,\n Divider,\n Footer,\n Icon,\n Image,\n Input,\n List,\n ListItem,\n Notice,\n Option,\n ProgressBar,\n Radio,\n RadioGroup,\n Select,\n Sheet,\n Skeleton,\n Spinner,\n Switch,\n Text,\n TextArea,\n Toast,\n View,\n};\nexport { ICON_NAMES, SIZES, STATUS_TONES, TONES } from './options';\nexport type { IconName } from './options';\n\nexport const builtinComponents = {\n Badge,\n Button,\n Checkbox,\n Divider,\n Footer,\n Icon,\n Image,\n Input,\n List,\n ListItem,\n Notice,\n Option,\n ProgressBar,\n Radio,\n RadioGroup,\n Select,\n Sheet,\n Skeleton,\n Spinner,\n Switch,\n Text,\n TextArea,\n Toast,\n View,\n} as const;\n\nexport type BuiltinComponents = typeof builtinComponents;\n\nexport const builtinRegistry = componentRegistry(Object.values(builtinComponents));\n","type Listener = (...args: never[]) => void;\n\nexport class EventEmitter<Events extends { [K in keyof Events]: Listener }> {\n readonly #listeners = new Map<keyof Events, Set<Listener>>();\n\n on<K extends keyof Events>(name: K, listener: Events[K]): () => void {\n const listeners = this.#listeners.get(name) ?? new Set();\n this.#listeners.set(name, listeners);\n listeners.add(listener);\n return () => listeners.delete(listener);\n }\n\n emit<K extends keyof Events>(name: K, ...args: Parameters<Events[K]>): void {\n const listeners = this.#listeners.get(name) as Set<Events[K]> | undefined;\n listeners?.forEach((listener) => listener(...args));\n }\n}\n","// `data` holds the `data-*` attributes of the component that raised the event: `data-account-id`\n// arrives as `data.accountId`.\nexport interface DotEvent<Detail = unknown, Data = Readonly<Record<string, unknown>>> {\n readonly type: string;\n readonly detail: Detail;\n readonly data: Data;\n}\n\nexport function createEvent<Detail = Record<string, never>>(\n type: string,\n detail: Detail = {} as Detail,\n data: Readonly<Record<string, unknown>> = {},\n): DotEvent<Detail> {\n return { type, detail, data };\n}\n","import type { Transport } from '../protocol/transport';\n\ndeclare global {\n // Installed by the host (the iOS or Android app, or the browser simulator) before Dot starts.\n // noinspection ES6ConvertVarToLetConst\n var __hostTransport: Transport | undefined;\n}\n\n// The transport the host installed. Messages crossing it must be JSON-serializable.\nexport function hostTransport(): Transport {\n const transport = globalThis.__hostTransport;\n if (!transport) {\n throw new Error(\n 'No Dot host found: expected `globalThis.__hostTransport` to be available at runtime. ' +\n 'Dots run inside the Dash App, or a simulator via `dotctl dev`.',\n );\n }\n return transport;\n}\n","import type { ColorScheme } from '../theme/theme';\n\n// `background` while the person is away from Dash: in another app, on the home screen, or with the\n// phone locked.\nexport type AppState = 'active' | 'background';\n\nexport interface SystemContext {\n readonly scheme: ColorScheme;\n readonly appState: AppState;\n}\n\nexport const DEFAULT_SYSTEM_CONTEXT: SystemContext = { scheme: 'light', appState: 'active' };\n","export type HostErrorCode =\n 'unsupported' | 'denied' | 'cancelled' | 'timeout' | 'invalid' | 'failed';\n\nexport class HostError extends Error {\n override readonly name = 'HostError';\n readonly code: HostErrorCode;\n\n constructor(code: HostErrorCode, message: string) {\n super(message);\n this.code = code;\n }\n}\n\nexport interface HostCallOptions {\n timeout?: number | undefined;\n}\n\nexport interface HostRequest<T> extends Promise<T> {\n // Stops waiting: the promise rejects with `cancelled`, and the host stops the work.\n cancel(): void;\n}\n\nexport type HostCaller = (\n method: string,\n params: unknown,\n options: HostCallOptions,\n) => HostRequest<unknown>;\n\nlet connectedCaller: HostCaller | null = null;\n\n// The service connects itself when it starts\nexport function connectHost(caller: HostCaller | null): void {\n connectedCaller = caller;\n}\n\nexport function callHost<Result>(\n method: string,\n params: unknown,\n options: HostCallOptions = {},\n): HostRequest<Result> {\n if (!connectedCaller) {\n const error = new HostError(\n 'unsupported',\n `No host to run \"${method}\": host calls run in the service`,\n );\n return createHostRequest(Promise.reject(error));\n }\n return connectedCaller(method, params, options) as HostRequest<Result>;\n}\n\nexport function createHostRequest<Result>(\n promise: Promise<Result>,\n cancel: () => void = () => {},\n): HostRequest<Result> {\n const request = promise as HostRequest<Result>;\n request.cancel = cancel;\n return request;\n}\n","// What a dot may ask the person for. A dot declares each one it uses in dot.json, with the reason\n// Dash shows the person; a host method that needs one runs only once the person allows it.\n// - `account`: the Dash account the person is logged into: their username (email or phone) and\n// full name.\nexport const PERMISSIONS = ['account'] as const;\n\nexport type DotPermission = (typeof PERMISSIONS)[number];\n\nexport function isPermission(value: string): value is DotPermission {\n return (PERMISSIONS as readonly string[]).includes(value);\n}\n","export const DOT_FILE_PATH_MAX_LENGTH = 512;\nconst MAX_NAME_LENGTH = 255;\n\n// Why `path` isn't a relative path inside a dot's storage, or null when it is.\nexport function dotFilePathProblem(path: string, { allowRoot = false } = {}): string | null {\n if (path === '') {\n return allowRoot ? null : 'A path is needed, such as \"receipts/42.pdf\"';\n }\n if (path.length > DOT_FILE_PATH_MAX_LENGTH) {\n return `\"${path.slice(0, 40)}…\" is longer than ${DOT_FILE_PATH_MAX_LENGTH} characters`;\n }\n if (path.startsWith('/')) {\n return `\"${path}\" starts with \"/\": paths are relative to the dot's storage, such as \"receipts/42.pdf\"`;\n }\n if ([...path].some((char) => char === '\\\\' || char.charCodeAt(0) < 0x20)) {\n return `\"${path}\" has a backslash or a control character`;\n }\n for (const name of path.split('/')) {\n if (name === '' || name === '.' || name === '..') {\n return `\"${path}\" has an empty, \".\" or \"..\" part: write each folder once, such as \"receipts/42.pdf\"`;\n }\n if (name.length > MAX_NAME_LENGTH) {\n return `\"${path}\" has a name longer than ${MAX_NAME_LENGTH} characters`;\n }\n }\n return null;\n}\n","// An exact host name, or \"*.example.com\" for any subdomain of example.com, but not example.com.\nconst LABEL = '[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?';\nexport const NETWORK_HOST_PATTERN = new RegExp(\n `^(?:\\\\*\\\\.${LABEL}(?:\\\\.${LABEL})+|${LABEL}(?:\\\\.${LABEL})*)$`,\n);\nexport const NETWORK_HOST_MAX_LENGTH = 253;\n\nexport function isNetworkHost(value: string): boolean {\n return value.length <= NETWORK_HOST_MAX_LENGTH && NETWORK_HOST_PATTERN.test(value);\n}\n\nexport function allowsHost(hosts: readonly string[], host: string): boolean {\n const name = host.toLowerCase().replace(/\\.$/, '');\n return hosts.some((pattern) =>\n pattern.startsWith('*.') ? name.endsWith(pattern.slice(1)) : name === pattern,\n );\n}\n","// A semantic version, as https://semver.org defines it: `1.4.0`, `2.0.0-beta.1`, `1.0.0+build.7`.\nexport const SEMVER_PATTERN =\n /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\n\ninterface SemanticVersion {\n readonly major: number;\n readonly minor: number;\n readonly patch: number;\n // `[\"beta\", \"1\"]` for `1.0.0-beta.1`; empty for a release.\n readonly prerelease: readonly string[];\n}\n\nexport function isSemanticVersion(value: unknown): value is string {\n return typeof value === 'string' && SEMVER_PATTERN.test(value);\n}\n\nexport function majorVersion(version: string): number {\n return parseVersion(version).major;\n}\n\n// Whether `version` is `minimum` or a later one.\nexport function isVersionAtLeast(version: string, minimum: string): boolean {\n return compareVersions(version, minimum) >= 0;\n}\n\n// Negative when `left` comes before `right`, positive when after, and 0 for the same release.\n// Build metadata, the part after `+`, does not count.\nexport function compareVersions(left: string, right: string): number {\n const leftVersion = parseVersion(left);\n const rightVersion = parseVersion(right);\n const differences = [\n leftVersion.major - rightVersion.major,\n leftVersion.minor - rightVersion.minor,\n leftVersion.patch - rightVersion.patch,\n ];\n for (const difference of differences) {\n if (difference !== 0) {\n return difference;\n }\n }\n return comparePrereleases(leftVersion.prerelease, rightVersion.prerelease);\n}\n\nfunction parseVersion(version: string): SemanticVersion {\n const match = SEMVER_PATTERN.exec(version);\n if (!match) {\n throw new Error(`\"${version}\" is not a semantic version`);\n }\n const [, major, minor, patch, prerelease] = match;\n return {\n major: Number(major),\n minor: Number(minor),\n patch: Number(patch),\n prerelease: prerelease === undefined ? [] : prerelease.split('.'),\n };\n}\n\n// A release comes after its pre-releases (`1.0.0-beta` < `1.0.0`). Between pre-releases, the first\n// identifier that differs decides; if all match, the one with fewer identifiers comes first.\nfunction comparePrereleases(left: readonly string[], right: readonly string[]): number {\n if (left.length === 0 || right.length === 0) {\n return right.length - left.length;\n }\n const shared = Math.min(left.length, right.length);\n for (let index = 0; index < shared; index++) {\n const order = compareIdentifiers(left[index]!, right[index]!);\n if (order !== 0) {\n return order;\n }\n }\n return left.length - right.length;\n}\n\n// Numbers compare as numbers and come before words, which compare as text.\nfunction compareIdentifiers(left: string, right: string): number {\n const leftIsNumber = /^\\d+$/.test(left);\n const rightIsNumber = /^\\d+$/.test(right);\n if (leftIsNumber && rightIsNumber) {\n return Number(left) - Number(right);\n }\n if (leftIsNumber) {\n return -1;\n }\n if (rightIsNumber) {\n return 1;\n }\n if (left < right) {\n return -1;\n }\n if (left > right) {\n return 1;\n }\n return 0;\n}\n","import { compareVersions, isVersionAtLeast, majorVersion } from '../version/semantic-version';\n\n// The host ships React, not each dot: every dot's webview imports these names, and an import map in\n// its index.html points them at the host's copies under `/__dot/react/<major>/`.\nexport const REACT_HOST_PATH = '/__dot/react/';\n\n// Each name a dot's webview imports React by, and the host's file for it.\nexport const REACT_HOST_MODULES = {\n react: 'react.js',\n 'react/jsx-runtime': 'react-jsx-runtime.js',\n 'react-dom/client': 'react-dom-client.js',\n} as const;\n\n// By major version only: the host serves the newest React it has with that major, so it can update\n// React within a major without dots being rebuilt.\nexport function reactHostUrl(dotReactVersion: string, file: string): string {\n return `${REACT_HOST_PATH}${majorVersion(dotReactVersion)}/${file}`;\n}\n\n// A React release only adds to its major version, so a dot runs on the same major at or above the\n// version it was built with. A different major can change or remove what the dot relies on.\nexport function isReactCompatible(hostVersion: string, dotVersion: string): boolean {\n return (\n majorVersion(hostVersion) === majorVersion(dotVersion) &&\n isVersionAtLeast(hostVersion, dotVersion)\n );\n}\n\n// The newest of `versions` with `major`, or undefined when there is none.\nexport function newestReactOfMajor(versions: readonly string[], major: number): string | undefined {\n const matching = versions.filter((version) => majorVersion(version) === major);\n return matching.sort(compareVersions).at(-1);\n}\n","/**\n * A universal bridge for sending and receiving messages,\n * whether across web workers, message ports, or native app boundaries.\n */\nexport interface Transport {\n post(message: unknown): void;\n // Returns a function that removes the listener.\n listen(listener: (message: unknown) => void): () => void;\n}\n\n/**\n * Adapter interface for anything that acts like\n * 1. a MessagePort (https://developer.mozilla.org/en-US/docs/Web/API/MessagePort) or\n * 2. a Web Worker (https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API)\n */\nexport interface TransportAdapter {\n postMessage(message: unknown): void;\n addEventListener(type: 'message', listener: (event: { data: unknown }) => void): void;\n removeEventListener(type: 'message', listener: (event: { data: unknown }) => void): void;\n}\n\nexport function createAdaptorTransport(adapter: TransportAdapter): Transport {\n return {\n post: (message) => adapter.postMessage(message),\n listen(listener) {\n const onMessage = (event: { data: unknown }) => listener(event.data);\n adapter.addEventListener('message', onMessage);\n return () => adapter.removeEventListener('message', onMessage);\n },\n };\n}\n\n// Two transports connected to each other in the same thread, for tests and single-thread setups.\nexport function createTransportPair(): [Transport, Transport] {\n type Listeners = Set<(message: unknown) => void>;\n const firstListeners: Listeners = new Set();\n const secondListeners: Listeners = new Set();\n const createSide = (ownListeners: Listeners, otherListeners: Listeners): Transport => ({\n post: (message) => {\n // Simulate cross-thread memory isolation by cloning the payload\n const copy: unknown = JSON.parse(JSON.stringify(message));\n otherListeners.forEach((listener) => listener(copy));\n },\n listen(listener) {\n ownListeners.add(listener);\n return () => ownListeners.delete(listener);\n },\n });\n return [createSide(firstListeners, secondListeners), createSide(secondListeners, firstListeners)];\n}\n","import type { PageLaunchOptions } from './navigation';\n\nexport interface PageHooks {\n onLoad(options: PageLaunchOptions): void | Promise<void>;\n onShow(): void | Promise<void>;\n onHide(): void | Promise<void>;\n onUnload(): void | Promise<void>;\n}\n\nexport interface DotHooks {\n onLaunch(): void | Promise<void>;\n onError(error: Error): void;\n}\n\n// A record rather than a list, so adding a hook to PageHooks without listing it is a type error.\nconst pageHooks: Record<keyof PageHooks, true> = {\n onLoad: true,\n onShow: true,\n onHide: true,\n onUnload: true,\n};\n\nexport const PAGE_HOOKS = Object.keys(pageHooks) as readonly (keyof PageHooks)[];\n","export const MAX_STACK_DEPTH = 8;\n\nconst PAGE_ID = /^[A-Za-z0-9_-]+(?:\\/[A-Za-z0-9_-]+)*$/;\n\nexport function isPageId(value: string): boolean {\n return PAGE_ID.test(value);\n}\n\nexport type PageLaunchOptions = Readonly<Record<string, string>>;\n\nexport type Navigation =\n | {\n readonly action: 'push' | 'replace' | 'reset';\n readonly page: string;\n readonly options: PageLaunchOptions;\n }\n | { readonly action: 'back'; readonly delta: number };\n\nexport interface StackEntry {\n readonly instanceId: number;\n readonly page: string;\n readonly options: PageLaunchOptions;\n}\n\nexport class NavigationStack {\n readonly limit: number;\n #pages: StackEntry[] = [];\n #nextInstanceId = 1;\n\n constructor(limit = MAX_STACK_DEPTH) {\n this.limit = limit;\n }\n\n get pages(): readonly StackEntry[] {\n return this.#pages;\n }\n\n get top(): StackEntry | undefined {\n return this.#pages.at(-1);\n }\n\n /**\n * Applies a navigation, or refuses it and returns false: a push onto a full stack, or going back\n * from the first page (which the host handles itself, e.g. by closing the dot).\n */\n apply(navigation: Navigation): boolean {\n switch (navigation.action) {\n case 'push':\n if (this.#pages.length >= this.limit) {\n return false;\n }\n break;\n case 'replace':\n this.#pages.pop();\n break;\n case 'reset':\n this.#pages = [];\n break;\n case 'back': {\n const count = Math.min(navigation.delta, this.#pages.length - 1);\n if (count < 1) {\n return false;\n }\n this.#pages = this.#pages.slice(0, -count);\n return true;\n }\n }\n const { page, options } = navigation;\n this.#pages = [...this.#pages, { instanceId: this.#nextInstanceId++, page, options }];\n return true;\n }\n}\n","export function applyChanges<T>(state: T, changes: Partial<T>): T {\n const next = { ...state } as Record<string, unknown>;\n for (const [key, value] of Object.entries(changes)) {\n if (value !== undefined) {\n next[key] = value;\n }\n }\n return next as T;\n}\n","import type { Transport } from './protocol/transport';\nimport type { Envelope, MessageMap, MessageType } from './protocol/core';\n\nexport type MessageHandler<Payload> = (payload: Payload) => void;\n\nexport class MessageChannel<Outgoing extends MessageMap, Incoming extends MessageMap> {\n readonly #transport: Transport;\n readonly #handlers = new Map<string, MessageHandler<never>>();\n\n constructor(transport: Transport) {\n this.#transport = transport;\n }\n\n send<T extends MessageType<Outgoing>>(type: T, payload: Outgoing[T]): void {\n this.#transport.post({ type, payload } satisfies Envelope);\n }\n\n handle<T extends MessageType<Incoming>>(\n type: T,\n handler: MessageHandler<Incoming[T]>,\n ): MessageHandler<Incoming[T]> | undefined {\n const previous = this.#handlers.get(type) as MessageHandler<Incoming[T]> | undefined;\n this.#handlers.set(type, handler);\n return previous;\n }\n\n listen(onError: (error: unknown, message: Envelope) => void): () => void {\n return this.#transport.listen((rawMessage) => {\n const message = rawMessage as Envelope;\n const handler = this.#handlers.get(message.type) as MessageHandler<unknown> | undefined;\n if (!handler) {\n onError(new Error(`No handler registered for message \"${message.type}\"`), message);\n return;\n }\n try {\n handler(message.payload);\n } catch (error) {\n onError(error, message);\n }\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/view/component.ts","../src/view/values.ts","../src/source/location.ts","../src/source/error.ts","../src/view/components/amount-input.ts","../src/view/components/button.ts","../src/view/components/options.ts","../src/view/components/carousel.ts","../src/view/components/chip.ts","../src/view/components/code-input.ts","../src/view/components/divider.ts","../src/view/components/empty-state.ts","../src/view/components/feedback.ts","../src/view/components/footer.ts","../src/view/components/grid.ts","../src/view/components/icon.ts","../src/view/components/image.ts","../src/view/components/input.ts","../src/view/components/list.ts","../src/view/components/overlays.ts","../src/view/components/qr-code.ts","../src/view/components/select.ts","../src/view/components/skeleton.ts","../src/view/components/tabs.ts","../src/view/components/text.ts","../src/view/components/text-area.ts","../src/view/components/toggles.ts","../src/view/components/view.ts","../src/view/components/index.ts","../src/event/emitter.ts","../src/event/core.ts","../src/host/host.ts","../src/host/context.ts","../src/host/calls.ts","../src/host/permissions.ts","../src/host/files.ts","../src/host/network.ts","../src/version/semantic-version.ts","../src/host/react.ts","../src/protocol/transport.ts","../src/page/lifecycle.ts","../src/page/navigation.ts","../src/page/state.ts","../src/page/bars.ts","../src/messageChannel.ts"],"sourcesContent":["import type { DotEvent } from '../event/core';\n\nexport interface PropTypes {\n string: string;\n number: number;\n boolean: boolean;\n any: unknown;\n}\n\nexport type PropType = keyof PropTypes | readonly string[];\n\nexport type PropValue<T extends PropType> = T extends readonly string[]\n ? T[number]\n : T extends keyof PropTypes\n ? PropTypes[T]\n : never;\n\n/**\n * - `none`: no children\n * - `text`: text and inline components (such as `Text`).\n * - `elements`: any components, but raw text must be wrapped in an inline component.\n */\nexport type ChildrenType = 'none' | 'text' | 'elements';\n\n/**\n * Describes a UI component independently of any renderer. The compiler checks `.dml` markup\n * against it, and each renderer maps it to its own elements.\n */\nexport interface ComponentManifest<\n Name extends string = string,\n Props extends Record<string, PropType> = Record<string, PropType>,\n Events extends string = string,\n Children extends ChildrenType = ChildrenType,\n> {\n readonly name: Name;\n readonly props: Props;\n // Supported event names; `click` is written `onClick` in markup and received as the `onClick` prop.\n readonly events: readonly Events[];\n readonly children: Children;\n readonly inline?: boolean;\n}\n\nexport function defineComponent<\n const Name extends string,\n const Props extends Record<string, PropType> = Record<never, PropType>,\n const Events extends string = never,\n const Children extends ChildrenType = ChildrenType,\n>(manifest: {\n name: Name;\n props?: Props;\n events?: readonly Events[];\n children: Children;\n inline?: boolean;\n}): ComponentManifest<Name, Props, Events, Children> {\n return { props: {} as Props, events: [], ...manifest };\n}\n\nexport type EventProp<Event extends string> = `on${Capitalize<Event>}`;\n\nexport function eventProp<Event extends string>(event: Event): EventProp<Event> {\n return `on${event.charAt(0).toUpperCase()}${event.slice(1)}` as EventProp<Event>;\n}\n\n// Event props are `on` followed by a capital letter, like `onClick`.\nexport function isEventProp(name: string): boolean {\n const letterAfterOn = name.charAt('on'.length);\n return name.startsWith('on') && letterAfterOn >= 'A' && letterAfterOn <= 'Z';\n}\n\n// The reverse of eventProp: `onClick` -> `click`.\nexport function eventName(prop: string): string {\n const name = prop.slice('on'.length);\n return name.charAt(0).toLowerCase() + name.slice(1);\n}\n\n/**\n * The props a renderer's implementation of `M` receives, with `Children` as its node type. Every\n * prop is optional and may be `undefined`: markup can omit it, and a binding can evaluate to\n * `undefined` at runtime.\n */\nexport type PropsOf<M extends ComponentManifest, Children = never> = {\n [K in keyof M['props']]?: PropValue<M['props'][K]> | undefined;\n} & {\n [E in M['events'][number] as EventProp<E>]?: ((event: DotEvent) => void) | undefined;\n} & (M['children'] extends 'none' ? unknown : { children?: Children | undefined });\n\nexport type ComponentRegistry = Readonly<Record<string, ComponentManifest>>;\n\nexport function componentRegistry(manifests: Iterable<ComponentManifest>): ComponentRegistry {\n const registry: Record<string, ComponentManifest> = {};\n for (const manifest of manifests) {\n if (manifest.name in registry) {\n throw new Error(`Component <${manifest.name}> is defined twice`);\n }\n registry[manifest.name] = manifest;\n }\n return registry;\n}\n","export function toText(value: unknown): string {\n switch (typeof value) {\n case 'string':\n return value;\n case 'number':\n case 'boolean':\n case 'bigint':\n return String(value);\n case 'object':\n return value === null ? '' : JSON.stringify(value);\n default:\n return '';\n }\n}\n\nexport function toList(value: unknown): readonly unknown[] {\n if (Array.isArray(value)) {\n return value;\n }\n if (typeof value === 'object' && value !== null && Symbol.iterator in value) {\n return Array.from(value as Iterable<unknown>);\n }\n return [];\n}\n","export interface SourceLocation {\n readonly line: number;\n readonly column: number;\n readonly offset: number;\n}\n\n// Finds lines by binary search over their start offsets, computed once per source.\nexport function createLocator(source: string): (offset: number) => SourceLocation {\n const lineStarts = [0];\n for (let index = 0; index < source.length; index++) {\n if (source[index] === '\\n') {\n lineStarts.push(index + 1);\n }\n }\n return (offset) => {\n let low = 0;\n let high = lineStarts.length - 1;\n while (low < high) {\n const middle = Math.floor((low + high + 1) / 2);\n if (lineStarts[middle]! <= offset) {\n low = middle;\n } else {\n high = middle - 1;\n }\n }\n return { line: low + 1, column: offset - lineStarts[low]! + 1, offset };\n };\n}\n\nexport function locationAt(source: string, offset: number): SourceLocation {\n return createLocator(source)(offset);\n}\n\nexport function locatedMessage(message: string, file?: string, location?: SourceLocation): string {\n const where = [file, location?.line, location?.column]\n .filter((part) => part !== undefined)\n .join(':');\n return where ? `${where}: ${message}` : message;\n}\n","import type { SourceLocation } from './location';\nimport { locatedMessage } from './location';\n\n// A problem at a place in a source file. The message starts with `file:line:column:`\nexport class SourceError extends Error {\n readonly reason: string;\n readonly file: string | undefined;\n readonly loc: SourceLocation | undefined;\n\n constructor(reason: string, file?: string, location?: SourceLocation) {\n super(locatedMessage(reason, file, location));\n this.reason = reason;\n this.file = file;\n this.loc = location;\n }\n}\n","import { defineComponent } from '../component';\n\n// A sum of money, in large type and with thousands separators. `change` carries the `value` as a\n// number, or null when the field is empty.\nexport const AmountInput = defineComponent({\n name: 'AmountInput',\n props: {\n value: 'number',\n // Shown before the amount, such as \"Le\".\n currency: 'string',\n // Digits allowed after the decimal point, 0 unless set.\n decimals: 'number',\n label: 'string',\n placeholder: 'string',\n hint: 'string',\n error: 'string',\n disabled: 'boolean',\n },\n events: ['change'],\n children: 'none',\n});\n","import { defineComponent } from '../component';\n\nexport const Button = defineComponent({\n name: 'Button',\n props: {\n variant: ['primary', 'secondary'],\n disabled: 'boolean',\n // Shows a spinner and ignores taps, such as while a payment is sent.\n loading: 'boolean',\n },\n events: ['click'],\n children: 'text',\n});\n","export const SIZES = ['small', 'medium', 'large'] as const;\n\n// Space between or around components.\nexport const SPACES = ['none', 'small', 'medium', 'large'] as const;\n\nexport const TONES = ['default', 'muted', 'info', 'success', 'warning', 'danger'] as const;\n\nexport const STATUS_TONES = ['default', 'info', 'success', 'warning', 'danger'] as const;\n\nexport const ICON_NAMES = [\n 'arrow-down',\n 'arrow-left',\n 'arrow-right',\n 'arrow-up',\n 'bank',\n 'bell',\n 'bolt',\n 'calendar',\n 'card',\n 'cart',\n 'cash',\n 'check',\n 'chevron-down',\n 'chevron-left',\n 'chevron-right',\n 'chevron-up',\n 'clock',\n 'close',\n 'copy',\n 'download',\n 'edit',\n 'error',\n 'eye',\n 'eye-off',\n 'file',\n 'gift',\n 'grid',\n 'heart',\n 'help',\n 'history',\n 'home',\n 'image',\n 'info',\n 'list',\n 'location',\n 'lock',\n 'logout',\n 'mail',\n 'minus',\n 'mobile',\n 'more',\n 'phone',\n 'plus',\n 'qr-code',\n 'receipt',\n 'refresh',\n 'search',\n 'send',\n 'settings',\n 'share',\n 'star',\n 'success',\n 'trash',\n 'upload',\n 'user',\n 'users',\n 'wallet',\n 'warning',\n 'water',\n 'wifi',\n] as const;\n\nexport type IconName = (typeof ICON_NAMES)[number];\n","import { defineComponent } from '../component';\nimport { SPACES } from './options';\n\n// Shows its children one at a time, as slides to swipe between. `change` carries the `index` of\n// the slide it moved to.\nexport const Carousel = defineComponent({\n name: 'Carousel',\n props: {\n // Moves to the next slide every `interval` milliseconds, pausing while touched.\n autoplay: 'boolean',\n interval: 'number',\n // After the last slide comes the first again.\n loop: 'boolean',\n indicator: ['dots', 'none'],\n // Space between slides, seen as one slides in.\n gap: SPACES,\n // `scale` shrinks a slide as it leaves the middle and grows the one coming in, with the swipe.\n effect: ['slide', 'scale'],\n // The slide to show; changing it moves the carousel there.\n index: 'number',\n },\n events: ['change'],\n children: 'elements',\n});\n","import { defineComponent } from '../component';\nimport { ICON_NAMES } from './options';\n\n// A small rounded choice, such as a filter; `selected` fills it.\nexport const Chip = defineComponent({\n name: 'Chip',\n props: { label: 'string', icon: ICON_NAMES, selected: 'boolean', disabled: 'boolean' },\n events: ['tap'],\n children: 'none',\n});\n","import { defineComponent } from '../component';\n\n// A one-time code or PIN, one box per digit. `complete` follows the `change` that fills the last\n// box.\nexport const CodeInput = defineComponent({\n name: 'CodeInput',\n props: {\n value: 'string',\n // How many digits, 6 unless set.\n length: 'number',\n label: 'string',\n hint: 'string',\n error: 'string',\n // Shows dots in place of the digits, as for a PIN.\n secure: 'boolean',\n disabled: 'boolean',\n },\n events: ['change', 'complete'],\n children: 'none',\n});\n","import { defineComponent } from '../component';\n\nexport const Divider = defineComponent({\n name: 'Divider',\n children: 'none',\n});\n","import { defineComponent } from '../component';\nimport { ICON_NAMES } from './options';\n\n// What a page shows where there's nothing yet, such as an empty list. What it holds, such as a\n// button, shows under its text.\nexport const EmptyState = defineComponent({\n name: 'EmptyState',\n props: { icon: ICON_NAMES, title: 'string', text: 'string' },\n children: 'elements',\n});\n","import { defineComponent } from '../component';\nimport { SIZES, STATUS_TONES } from './options';\n\nexport const Spinner = defineComponent({\n name: 'Spinner',\n props: { size: SIZES },\n children: 'none',\n});\n\nexport const ProgressBar = defineComponent({\n name: 'ProgressBar',\n // From 0 to 100.\n props: { value: 'number' },\n children: 'none',\n});\n\n// A message in the flow of the page, such as a failed payment's reason.\nexport const Notice = defineComponent({\n name: 'Notice',\n props: { tone: STATUS_TONES, title: 'string' },\n children: 'text',\n});\n\nexport const Badge = defineComponent({\n name: 'Badge',\n props: { tone: STATUS_TONES },\n children: 'text',\n});\n","import { defineComponent } from '../component';\n\n// Stays at the bottom of the screen while the page scrolls, for its main action. Put it last in\n// the page's root View.\nexport const Footer = defineComponent({\n name: 'Footer',\n children: 'elements',\n});\n","import { defineComponent } from '../component';\nimport { ICON_NAMES, SPACES } from './options';\n\n// Lays its children out in `columns` equal columns, 4 unless set.\nexport const Grid = defineComponent({\n name: 'Grid',\n props: { columns: 'number', gap: SPACES },\n children: 'elements',\n});\n\n// An icon or picture over a short label, such as a service on a home screen.\nexport const GridItem = defineComponent({\n name: 'GridItem',\n props: {\n label: 'string',\n icon: ICON_NAMES,\n image: 'string',\n // A short note on the item's corner, such as \"New\" or a count.\n badge: 'string',\n },\n events: ['tap'],\n children: 'none',\n});\n","import { defineComponent } from '../component';\nimport { ICON_NAMES, SIZES, TONES } from './options';\n\nexport const Icon = defineComponent({\n name: 'Icon',\n props: { name: ICON_NAMES, size: SIZES, tone: TONES },\n children: 'none',\n inline: true,\n});\n","import { defineComponent } from '../component';\n\nexport const Image = defineComponent({\n name: 'Image',\n props: {\n src: 'string',\n alt: 'string',\n width: 'number',\n height: 'number',\n // `cover` fills the box and crops; `contain` shows the whole picture.\n fit: ['cover', 'contain'],\n shape: ['rounded', 'square', 'circle'],\n },\n events: ['load', 'error'],\n children: 'none',\n});\n","import { defineComponent } from '../component';\n\nexport const Input = defineComponent({\n name: 'Input',\n props: {\n value: 'string',\n placeholder: 'string',\n label: 'string',\n // Help shown under the field, which `error` replaces.\n hint: 'string',\n error: 'string',\n // Text shown inside the field, before and after what the person types, such as \"Le\".\n prefix: 'string',\n suffix: 'string',\n type: ['text', 'number', 'email', 'phone', 'password'],\n maxLength: 'number',\n disabled: 'boolean',\n },\n events: ['change', 'submit'],\n children: 'none',\n});\n","import { defineComponent } from '../component';\nimport { ICON_NAMES } from './options';\n\nexport const List = defineComponent({\n name: 'List',\n children: 'elements',\n});\n\n// What it holds shows at its end, in place of `value`. A row with `onTap` shows a chevron.\nexport const ListItem = defineComponent({\n name: 'ListItem',\n props: {\n title: 'string',\n subtitle: 'string',\n value: 'string',\n icon: ICON_NAMES,\n image: 'string',\n },\n events: ['tap'],\n children: 'elements',\n});\n","import { defineComponent } from '../component';\nimport { STATUS_TONES } from './options';\n\n// A panel that slides up over the page while `open` is true, such as an action sheet of buttons.\n// Tapping outside it raises `close`; the page closes it by setting `open` back to false.\nexport const Sheet = defineComponent({\n name: 'Sheet',\n props: { open: 'boolean', title: 'string' },\n events: ['close'],\n children: 'elements',\n});\n\n// Shows `message` briefly over the page, then raises `hide`, where the page clears the message\n// so the same one can show again.\nexport const Toast = defineComponent({\n name: 'Toast',\n props: {\n message: 'string',\n tone: STATUS_TONES,\n // In milliseconds.\n duration: 'number',\n },\n events: ['hide'],\n children: 'none',\n});\n","import { defineComponent } from '../component';\n\n// `value` as a QR code, dark on light whatever the theme, so any camera can read it.\nexport const QRCode = defineComponent({\n name: 'QRCode',\n props: {\n value: 'string',\n // In pixels, 200 unless set.\n size: 'number',\n // Read out in place of the code, by screen readers.\n label: 'string',\n },\n children: 'none',\n});\n","import { defineComponent } from '../component';\n\n// A field that opens a sheet of the `Option`s it holds; `value` is the chosen one's.\nexport const Select = defineComponent({\n name: 'Select',\n props: {\n value: 'string',\n label: 'string',\n placeholder: 'string',\n hint: 'string',\n error: 'string',\n disabled: 'boolean',\n },\n events: ['change'],\n children: 'elements',\n});\n\nexport const Option = defineComponent({\n name: 'Option',\n props: { value: 'string', label: 'string' },\n children: 'none',\n});\n","import { defineComponent } from '../component';\n\nexport const Skeleton = defineComponent({\n name: 'Skeleton',\n props: {\n shape: ['text', 'circle', 'box'],\n // Lines of text, for `text`.\n lines: 'number',\n // In pixels, for `circle` and `box`.\n height: 'number',\n },\n children: 'none',\n});\n","import { defineComponent } from '../component';\n\n// A row of `Tab`s, one of them chosen: `value` is the chosen one's. The page shows what goes with\n// it, such as with an <If> for each.\nexport const Tabs = defineComponent({\n name: 'Tabs',\n props: {\n value: 'string',\n // `underline` marks the chosen tab with a line; `segmented` fills it, in a rounded track.\n variant: ['underline', 'segmented'],\n },\n events: ['change'],\n children: 'elements',\n});\n\nexport const Tab = defineComponent({\n name: 'Tab',\n props: {\n value: 'string',\n label: 'string',\n // A count shown next to the label, such as unread items.\n badge: 'number',\n },\n children: 'none',\n});\n","import { defineComponent } from '../component';\nimport { TONES } from './options';\n\nexport const Text = defineComponent({\n name: 'Text',\n props: {\n variant: ['title', 'body', 'caption'],\n tone: TONES,\n weight: ['regular', 'medium', 'bold'],\n align: ['start', 'center', 'end'],\n // Cuts the text off with an ellipsis after this many lines.\n maxLines: 'number',\n },\n children: 'text',\n inline: true,\n});\n","import { defineComponent } from '../component';\n\nexport const TextArea = defineComponent({\n name: 'TextArea',\n props: {\n value: 'string',\n placeholder: 'string',\n label: 'string',\n hint: 'string',\n error: 'string',\n // The lines of text it shows before scrolling.\n rows: 'number',\n maxLength: 'number',\n disabled: 'boolean',\n },\n events: ['change'],\n children: 'none',\n});\n","import { defineComponent } from '../component';\n\nexport const Switch = defineComponent({\n name: 'Switch',\n props: { checked: 'boolean', label: 'string', disabled: 'boolean' },\n events: ['change'],\n children: 'none',\n});\n\nexport const Checkbox = defineComponent({\n name: 'Checkbox',\n props: { checked: 'boolean', label: 'string', disabled: 'boolean' },\n events: ['change'],\n children: 'none',\n});\n\n// A choice of one `Radio` among those it holds; `value` is the chosen one's.\nexport const RadioGroup = defineComponent({\n name: 'RadioGroup',\n props: { value: 'string', label: 'string', disabled: 'boolean' },\n events: ['change'],\n children: 'elements',\n});\n\nexport const Radio = defineComponent({\n name: 'Radio',\n props: { value: 'string', label: 'string', disabled: 'boolean' },\n children: 'none',\n});\n","import { defineComponent } from '../component';\nimport { SPACES } from './options';\n\nexport const View = defineComponent({\n name: 'View',\n props: {\n gap: SPACES,\n direction: ['column', 'row'],\n // Across `direction`.\n align: ['stretch', 'start', 'center', 'end'],\n // Along `direction`: `between` puts the first and last child at the ends.\n justify: ['start', 'center', 'end', 'between'],\n // Lets children that don't fit flow onto another line.\n wrap: 'boolean',\n // Takes the space its parent has left along the parent's direction.\n grow: 'boolean',\n // Space inside the view's edges. `start` and `end` follow the reading direction, so they\n padding: SPACES,\n paddingTop: SPACES,\n paddingStart: SPACES,\n paddingEnd: SPACES,\n paddingBottom: SPACES,\n variant: ['plain', 'card'],\n },\n events: ['tap'],\n children: 'elements',\n});\n","import { componentRegistry } from '../component';\nimport { AmountInput } from './amount-input';\nimport { Button } from './button';\nimport { Carousel } from './carousel';\nimport { Chip } from './chip';\nimport { CodeInput } from './code-input';\nimport { Divider } from './divider';\nimport { EmptyState } from './empty-state';\nimport { Badge, Notice, ProgressBar, Spinner } from './feedback';\nimport { Footer } from './footer';\nimport { Grid, GridItem } from './grid';\nimport { Icon } from './icon';\nimport { Image } from './image';\nimport { Input } from './input';\nimport { List, ListItem } from './list';\nimport { Sheet, Toast } from './overlays';\nimport { QRCode } from './qr-code';\nimport { Option, Select } from './select';\nimport { Skeleton } from './skeleton';\nimport { Tab, Tabs } from './tabs';\nimport { Text } from './text';\nimport { TextArea } from './text-area';\nimport { Checkbox, Radio, RadioGroup, Switch } from './toggles';\nimport { View } from './view';\n\nexport {\n AmountInput,\n Badge,\n Button,\n Carousel,\n Checkbox,\n Chip,\n CodeInput,\n Divider,\n EmptyState,\n Footer,\n Grid,\n GridItem,\n Icon,\n Image,\n Input,\n List,\n ListItem,\n Notice,\n Option,\n ProgressBar,\n QRCode,\n Radio,\n RadioGroup,\n Select,\n Sheet,\n Skeleton,\n Spinner,\n Switch,\n Tab,\n Tabs,\n Text,\n TextArea,\n Toast,\n View,\n};\nexport { ICON_NAMES, SIZES, STATUS_TONES, TONES } from './options';\nexport type { IconName } from './options';\n\nexport const builtinComponents = {\n AmountInput,\n Badge,\n Button,\n Carousel,\n Checkbox,\n Chip,\n CodeInput,\n Divider,\n EmptyState,\n Footer,\n Grid,\n GridItem,\n Icon,\n Image,\n Input,\n List,\n ListItem,\n Notice,\n Option,\n ProgressBar,\n QRCode,\n Radio,\n RadioGroup,\n Select,\n Sheet,\n Skeleton,\n Spinner,\n Switch,\n Tab,\n Tabs,\n Text,\n TextArea,\n Toast,\n View,\n} as const;\n\nexport type BuiltinComponents = typeof builtinComponents;\n\nexport const builtinRegistry = componentRegistry(Object.values(builtinComponents));\n","type Listener = (...args: never[]) => void;\n\nexport class EventEmitter<Events extends { [K in keyof Events]: Listener }> {\n readonly #listeners = new Map<keyof Events, Set<Listener>>();\n\n on<K extends keyof Events>(name: K, listener: Events[K]): () => void {\n const listeners = this.#listeners.get(name) ?? new Set();\n this.#listeners.set(name, listeners);\n listeners.add(listener);\n return () => listeners.delete(listener);\n }\n\n emit<K extends keyof Events>(name: K, ...args: Parameters<Events[K]>): void {\n const listeners = this.#listeners.get(name) as Set<Events[K]> | undefined;\n listeners?.forEach((listener) => listener(...args));\n }\n}\n","// `data` holds the `data-*` attributes of the component that raised the event: `data-account-id`\n// arrives as `data.accountId`.\nexport interface DotEvent<Detail = unknown, Data = Readonly<Record<string, unknown>>> {\n readonly type: string;\n readonly detail: Detail;\n readonly data: Data;\n}\n\nexport function createEvent<Detail = Record<string, never>>(\n type: string,\n detail: Detail = {} as Detail,\n data: Readonly<Record<string, unknown>> = {},\n): DotEvent<Detail> {\n return { type, detail, data };\n}\n","import type { Transport } from '../protocol/transport';\n\ndeclare global {\n // Installed by the host (the iOS or Android app, or the browser simulator) before Dot starts.\n // noinspection ES6ConvertVarToLetConst\n var __hostTransport: Transport | undefined;\n}\n\n// The transport the host installed. Messages crossing it must be JSON-serializable.\nexport function hostTransport(): Transport {\n const transport = globalThis.__hostTransport;\n if (!transport) {\n throw new Error(\n 'No Dot host found: expected `globalThis.__hostTransport` to be available at runtime. ' +\n 'Dots run inside the Dash App, or a simulator via `dotctl dev`.',\n );\n }\n return transport;\n}\n","import type { ColorScheme } from '../theme/theme';\n\n// `background` while the person is away from Dash: in another app, on the home screen, or with the\n// phone locked.\nexport type AppState = 'active' | 'background';\n\nexport interface SystemContext {\n readonly scheme: ColorScheme;\n readonly appState: AppState;\n}\n\nexport const DEFAULT_SYSTEM_CONTEXT: SystemContext = { scheme: 'light', appState: 'active' };\n","export type HostErrorCode =\n 'unsupported' | 'denied' | 'cancelled' | 'timeout' | 'invalid' | 'failed';\n\nexport class HostError extends Error {\n override readonly name = 'HostError';\n readonly code: HostErrorCode;\n\n constructor(code: HostErrorCode, message: string) {\n super(message);\n this.code = code;\n }\n}\n\nexport interface HostCallOptions {\n timeout?: number | undefined;\n}\n\nexport interface HostRequest<T> extends Promise<T> {\n // Stops waiting: the promise rejects with `cancelled`, and the host stops the work.\n cancel(): void;\n}\n\nexport type HostCaller = (\n method: string,\n params: unknown,\n options: HostCallOptions,\n) => HostRequest<unknown>;\n\nlet connectedCaller: HostCaller | null = null;\n\n// The service connects itself when it starts\nexport function connectHost(caller: HostCaller | null): void {\n connectedCaller = caller;\n}\n\nexport function callHost<Result>(\n method: string,\n params: unknown,\n options: HostCallOptions = {},\n): HostRequest<Result> {\n if (!connectedCaller) {\n const error = new HostError(\n 'unsupported',\n `No host to run \"${method}\": host calls run in the service`,\n );\n return createHostRequest(Promise.reject(error));\n }\n return connectedCaller(method, params, options) as HostRequest<Result>;\n}\n\nexport function createHostRequest<Result>(\n promise: Promise<Result>,\n cancel: () => void = () => {},\n): HostRequest<Result> {\n const request = promise as HostRequest<Result>;\n request.cancel = cancel;\n return request;\n}\n","// What a dot may ask the person for. A dot declares each one it uses in dot.json, with the reason\n// Dash shows the person; a host method that needs one runs only once the person allows it.\n// - `account`: the Dash account the person is logged into: their username (email or phone) and\n// full name.\nexport const PERMISSIONS = ['account'] as const;\n\nexport type DotPermission = (typeof PERMISSIONS)[number];\n\nexport function isPermission(value: string): value is DotPermission {\n return (PERMISSIONS as readonly string[]).includes(value);\n}\n","export const DOT_FILE_PATH_MAX_LENGTH = 512;\nconst MAX_NAME_LENGTH = 255;\n\n// Why `path` isn't a relative path inside a dot's storage, or null when it is.\nexport function dotFilePathProblem(path: string, { allowRoot = false } = {}): string | null {\n if (path === '') {\n return allowRoot ? null : 'A path is needed, such as \"receipts/42.pdf\"';\n }\n if (path.length > DOT_FILE_PATH_MAX_LENGTH) {\n return `\"${path.slice(0, 40)}…\" is longer than ${DOT_FILE_PATH_MAX_LENGTH} characters`;\n }\n if (path.startsWith('/')) {\n return `\"${path}\" starts with \"/\": paths are relative to the dot's storage, such as \"receipts/42.pdf\"`;\n }\n if ([...path].some((char) => char === '\\\\' || char.charCodeAt(0) < 0x20)) {\n return `\"${path}\" has a backslash or a control character`;\n }\n for (const name of path.split('/')) {\n if (name === '' || name === '.' || name === '..') {\n return `\"${path}\" has an empty, \".\" or \"..\" part: write each folder once, such as \"receipts/42.pdf\"`;\n }\n if (name.length > MAX_NAME_LENGTH) {\n return `\"${path}\" has a name longer than ${MAX_NAME_LENGTH} characters`;\n }\n }\n return null;\n}\n","// An exact host name, or \"*.example.com\" for any subdomain of example.com, but not example.com.\nconst LABEL = '[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?';\nexport const NETWORK_HOST_PATTERN = new RegExp(\n `^(?:\\\\*\\\\.${LABEL}(?:\\\\.${LABEL})+|${LABEL}(?:\\\\.${LABEL})*)$`,\n);\nexport const NETWORK_HOST_MAX_LENGTH = 253;\n\nexport function isNetworkHost(value: string): boolean {\n return value.length <= NETWORK_HOST_MAX_LENGTH && NETWORK_HOST_PATTERN.test(value);\n}\n\nexport function allowsHost(hosts: readonly string[], host: string): boolean {\n const name = host.toLowerCase().replace(/\\.$/, '');\n return hosts.some((pattern) =>\n pattern.startsWith('*.') ? name.endsWith(pattern.slice(1)) : name === pattern,\n );\n}\n","// A semantic version, as https://semver.org defines it: `1.4.0`, `2.0.0-beta.1`, `1.0.0+build.7`.\nexport const SEMVER_PATTERN =\n /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\n\ninterface SemanticVersion {\n readonly major: number;\n readonly minor: number;\n readonly patch: number;\n // `[\"beta\", \"1\"]` for `1.0.0-beta.1`; empty for a release.\n readonly prerelease: readonly string[];\n}\n\nexport function isSemanticVersion(value: unknown): value is string {\n return typeof value === 'string' && SEMVER_PATTERN.test(value);\n}\n\nexport function majorVersion(version: string): number {\n return parseVersion(version).major;\n}\n\n// Whether `version` is `minimum` or a later one.\nexport function isVersionAtLeast(version: string, minimum: string): boolean {\n return compareVersions(version, minimum) >= 0;\n}\n\n// Negative when `left` comes before `right`, positive when after, and 0 for the same release.\n// Build metadata, the part after `+`, does not count.\nexport function compareVersions(left: string, right: string): number {\n const leftVersion = parseVersion(left);\n const rightVersion = parseVersion(right);\n const differences = [\n leftVersion.major - rightVersion.major,\n leftVersion.minor - rightVersion.minor,\n leftVersion.patch - rightVersion.patch,\n ];\n for (const difference of differences) {\n if (difference !== 0) {\n return difference;\n }\n }\n return comparePrereleases(leftVersion.prerelease, rightVersion.prerelease);\n}\n\nfunction parseVersion(version: string): SemanticVersion {\n const match = SEMVER_PATTERN.exec(version);\n if (!match) {\n throw new Error(`\"${version}\" is not a semantic version`);\n }\n const [, major, minor, patch, prerelease] = match;\n return {\n major: Number(major),\n minor: Number(minor),\n patch: Number(patch),\n prerelease: prerelease === undefined ? [] : prerelease.split('.'),\n };\n}\n\n// A release comes after its pre-releases (`1.0.0-beta` < `1.0.0`). Between pre-releases, the first\n// identifier that differs decides; if all match, the one with fewer identifiers comes first.\nfunction comparePrereleases(left: readonly string[], right: readonly string[]): number {\n if (left.length === 0 || right.length === 0) {\n return right.length - left.length;\n }\n const shared = Math.min(left.length, right.length);\n for (let index = 0; index < shared; index++) {\n const order = compareIdentifiers(left[index]!, right[index]!);\n if (order !== 0) {\n return order;\n }\n }\n return left.length - right.length;\n}\n\n// Numbers compare as numbers and come before words, which compare as text.\nfunction compareIdentifiers(left: string, right: string): number {\n const leftIsNumber = /^\\d+$/.test(left);\n const rightIsNumber = /^\\d+$/.test(right);\n if (leftIsNumber && rightIsNumber) {\n return Number(left) - Number(right);\n }\n if (leftIsNumber) {\n return -1;\n }\n if (rightIsNumber) {\n return 1;\n }\n if (left < right) {\n return -1;\n }\n if (left > right) {\n return 1;\n }\n return 0;\n}\n","import { compareVersions, isVersionAtLeast, majorVersion } from '../version/semantic-version';\n\n// The host ships React, not each dot: every dot's webview imports these names, and an import map in\n// its index.html points them at the host's copies under `/__dot/react/<major>/`.\nexport const REACT_HOST_PATH = '/__dot/react/';\n\n// Each name a dot's webview imports React by, and the host's file for it.\nexport const REACT_HOST_MODULES = {\n react: 'react.js',\n 'react/jsx-runtime': 'react-jsx-runtime.js',\n 'react-dom/client': 'react-dom-client.js',\n} as const;\n\n// By major version only: the host serves the newest React it has with that major, so it can update\n// React within a major without dots being rebuilt.\nexport function reactHostUrl(dotReactVersion: string, file: string): string {\n return `${REACT_HOST_PATH}${majorVersion(dotReactVersion)}/${file}`;\n}\n\n// A React release only adds to its major version, so a dot runs on the same major at or above the\n// version it was built with. A different major can change or remove what the dot relies on.\nexport function isReactCompatible(hostVersion: string, dotVersion: string): boolean {\n return (\n majorVersion(hostVersion) === majorVersion(dotVersion) &&\n isVersionAtLeast(hostVersion, dotVersion)\n );\n}\n\n// The newest of `versions` with `major`, or undefined when there is none.\nexport function newestReactOfMajor(versions: readonly string[], major: number): string | undefined {\n const matching = versions.filter((version) => majorVersion(version) === major);\n return matching.sort(compareVersions).at(-1);\n}\n","/**\n * A universal bridge for sending and receiving messages,\n * whether across web workers, message ports, or native app boundaries.\n */\nexport interface Transport {\n post(message: unknown): void;\n // Returns a function that removes the listener.\n listen(listener: (message: unknown) => void): () => void;\n}\n\n/**\n * Adapter interface for anything that acts like\n * 1. a MessagePort (https://developer.mozilla.org/en-US/docs/Web/API/MessagePort) or\n * 2. a Web Worker (https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API)\n */\nexport interface TransportAdapter {\n postMessage(message: unknown): void;\n addEventListener(type: 'message', listener: (event: { data: unknown }) => void): void;\n removeEventListener(type: 'message', listener: (event: { data: unknown }) => void): void;\n}\n\nexport function createAdaptorTransport(adapter: TransportAdapter): Transport {\n return {\n post: (message) => adapter.postMessage(message),\n listen(listener) {\n const onMessage = (event: { data: unknown }) => listener(event.data);\n adapter.addEventListener('message', onMessage);\n return () => adapter.removeEventListener('message', onMessage);\n },\n };\n}\n\n// Two transports connected to each other in the same thread, for tests and single-thread setups.\nexport function createTransportPair(): [Transport, Transport] {\n type Listeners = Set<(message: unknown) => void>;\n const firstListeners: Listeners = new Set();\n const secondListeners: Listeners = new Set();\n const createSide = (ownListeners: Listeners, otherListeners: Listeners): Transport => ({\n post: (message) => {\n // Simulate cross-thread memory isolation by cloning the payload\n const copy: unknown = JSON.parse(JSON.stringify(message));\n otherListeners.forEach((listener) => listener(copy));\n },\n listen(listener) {\n ownListeners.add(listener);\n return () => ownListeners.delete(listener);\n },\n });\n return [createSide(firstListeners, secondListeners), createSide(secondListeners, firstListeners)];\n}\n","import type { PageLaunchOptions } from './navigation';\n\nexport interface PageHooks {\n onLoad(options: PageLaunchOptions): void | Promise<void>;\n onShow(): void | Promise<void>;\n onHide(): void | Promise<void>;\n onUnload(): void | Promise<void>;\n}\n\nexport interface DotHooks {\n onLaunch(): void | Promise<void>;\n onError(error: Error): void;\n}\n\n// A record rather than a list, so adding a hook to PageHooks without listing it is a type error.\nconst pageHooks: Record<keyof PageHooks, true> = {\n onLoad: true,\n onShow: true,\n onHide: true,\n onUnload: true,\n};\n\nexport const PAGE_HOOKS = Object.keys(pageHooks) as readonly (keyof PageHooks)[];\n","export const MAX_STACK_DEPTH = 8;\n\nconst PAGE_ID = /^[A-Za-z0-9_-]+(?:\\/[A-Za-z0-9_-]+)*$/;\n\nexport function isPageId(value: string): boolean {\n return PAGE_ID.test(value);\n}\n\nexport type PageLaunchOptions = Readonly<Record<string, string>>;\n\nexport type Navigation =\n | {\n readonly action: 'push' | 'replace' | 'reset';\n readonly page: string;\n readonly options: PageLaunchOptions;\n }\n | { readonly action: 'back'; readonly delta: number };\n\nexport interface StackEntry {\n readonly instanceId: number;\n readonly page: string;\n readonly options: PageLaunchOptions;\n}\n\nexport class NavigationStack {\n readonly limit: number;\n #pages: StackEntry[] = [];\n #nextInstanceId = 1;\n\n constructor(limit = MAX_STACK_DEPTH) {\n this.limit = limit;\n }\n\n get pages(): readonly StackEntry[] {\n return this.#pages;\n }\n\n get top(): StackEntry | undefined {\n return this.#pages.at(-1);\n }\n\n /**\n * Applies a navigation, or refuses it and returns false: a push onto a full stack, or going back\n * from the first page (which the host handles itself, e.g. by closing the dot).\n */\n apply(navigation: Navigation): boolean {\n switch (navigation.action) {\n case 'push':\n if (this.#pages.length >= this.limit) {\n return false;\n }\n break;\n case 'replace':\n this.#pages.pop();\n break;\n case 'reset':\n this.#pages = [];\n break;\n case 'back': {\n const count = Math.min(navigation.delta, this.#pages.length - 1);\n if (count < 1) {\n return false;\n }\n this.#pages = this.#pages.slice(0, -count);\n return true;\n }\n }\n const { page, options } = navigation;\n this.#pages = [...this.#pages, { instanceId: this.#nextInstanceId++, page, options }];\n return true;\n }\n}\n","export function applyChanges<T>(state: T, changes: Partial<T>): T {\n const next = { ...state } as Record<string, unknown>;\n for (const [key, value] of Object.entries(changes)) {\n if (value !== undefined) {\n next[key] = value;\n }\n }\n return next as T;\n}\n","// What a page shows in Dash's bars around the dot. A dot sets them for all its pages in defineDot,\n// for one page in definePage, and while a page runs; Dash puts its own back when the page closes or\n// the dot exits. An option set to undefined goes back to Dash's own.\nexport interface NavigationBarOptions {\n // Shown in place of the dot's name.\n title?: string | undefined;\n hidden?: boolean | undefined;\n // As #RRGGBB.\n backgroundColor?: string | undefined;\n textColor?: string | undefined;\n}\n\nexport interface TabBarOptions {\n // Hides Dash's own tabs at the bottom of the screen.\n hidden?: boolean | undefined;\n}\n\n// The `configs` of defineDot and definePage.\nexport interface PageConfigs {\n navigationBar?: NavigationBarOptions | undefined;\n tabBar?: TabBarOptions | undefined;\n}\n\nexport interface PageBars {\n navigationBar: NavigationBarOptions;\n tabBar: TabBarOptions;\n}\n\nconst HEX_COLOR = /^#[0-9a-fA-F]{6}$/;\n\n// Throws when an option has the wrong type, or a color isn't #RRGGBB.\nexport function checkNavigationBar(options: NavigationBarOptions): void {\n const { title, hidden, backgroundColor, textColor } = options;\n if (title !== undefined && typeof title !== 'string') {\n throw new TypeError(\"The navigation bar's title must be text\");\n }\n if (hidden !== undefined && typeof hidden !== 'boolean') {\n throw new TypeError(\"The navigation bar's `hidden` must be true or false\");\n }\n for (const [name, color] of Object.entries({ backgroundColor, textColor })) {\n if (color !== undefined && (typeof color !== 'string' || !HEX_COLOR.test(color))) {\n throw new TypeError(`The navigation bar's ${name} must be a color such as \"#1A73E8\"`);\n }\n }\n}\n\nexport function checkTabBar(options: TabBarOptions): void {\n if (options.hidden !== undefined && typeof options.hidden !== 'boolean') {\n throw new TypeError(\"The tab bar's `hidden` must be true or false\");\n }\n}\n\nexport function checkConfigs(configs: PageConfigs): void {\n checkNavigationBar(configs.navigationBar ?? {});\n checkTabBar(configs.tabBar ?? {});\n}\n\n// Later configs override earlier ones, option by option.\nexport function mergeConfigs(...configs: (PageConfigs | undefined)[]): PageBars {\n const bars: PageBars = { navigationBar: {}, tabBar: {} };\n for (const config of configs) {\n bars.navigationBar = { ...bars.navigationBar, ...config?.navigationBar };\n bars.tabBar = { ...bars.tabBar, ...config?.tabBar };\n }\n return bars;\n}\n","import type { Transport } from './protocol/transport';\nimport type { Envelope, MessageMap, MessageType } from './protocol/core';\n\nexport type MessageHandler<Payload> = (payload: Payload) => void;\n\nexport class MessageChannel<Outgoing extends MessageMap, Incoming extends MessageMap> {\n readonly #transport: Transport;\n readonly #handlers = new Map<string, MessageHandler<never>>();\n\n constructor(transport: Transport) {\n this.#transport = transport;\n }\n\n send<T extends MessageType<Outgoing>>(type: T, payload: Outgoing[T]): void {\n this.#transport.post({ type, payload } satisfies Envelope);\n }\n\n handle<T extends MessageType<Incoming>>(\n type: T,\n handler: MessageHandler<Incoming[T]>,\n ): MessageHandler<Incoming[T]> | undefined {\n const previous = this.#handlers.get(type) as MessageHandler<Incoming[T]> | undefined;\n this.#handlers.set(type, handler);\n return previous;\n }\n\n listen(onError: (error: unknown, message: Envelope) => void): () => void {\n return this.#transport.listen((rawMessage) => {\n const message = rawMessage as Envelope;\n const handler = this.#handlers.get(message.type) as MessageHandler<unknown> | undefined;\n if (!handler) {\n onError(new Error(`No handler registered for message \"${message.type}\"`), message);\n return;\n }\n try {\n handler(message.payload);\n } catch (error) {\n onError(error, message);\n }\n });\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@monimesl/dot-core",
3
- "version": "0.1.0-alpha.3",
3
+ "version": "0.1.0-alpha.4",
4
4
  "description": "Dot contracts shared by every layer: protocol, transports, component manifests, view renderer",
5
5
  "type": "module",
6
6
  "repository": {