@monimesl/dot-simulator 0.1.0-alpha.16 → 0.1.0-alpha.18

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.
@@ -348,6 +348,45 @@
348
348
  because: "the aspect sets the height"
349
349
  }]
350
350
  });
351
+ const Slider = defineComponent({
352
+ name: "Slider",
353
+ props: {
354
+ value: "number",
355
+ min: "number",
356
+ max: "number",
357
+ step: "number",
358
+ showValue: "boolean",
359
+ label: "string",
360
+ hint: "string",
361
+ disabled: "boolean"
362
+ },
363
+ events: ["change"],
364
+ children: "none"
365
+ });
366
+ const Prose = defineComponent({
367
+ name: "Prose",
368
+ props: { ...PADDING_PROPS },
369
+ children: "elements"
370
+ });
371
+ const Quote = defineComponent({
372
+ name: "Quote",
373
+ props: { cite: "string" },
374
+ children: "elements"
375
+ });
376
+ const BulletList = defineComponent({
377
+ name: "BulletList",
378
+ props: { ordered: "boolean" },
379
+ children: "elements"
380
+ });
381
+ const Bullet = defineComponent({
382
+ name: "Bullet",
383
+ children: "elements"
384
+ });
385
+ const RichText = defineComponent({
386
+ name: "RichText",
387
+ props: { markdown: "string" },
388
+ children: "none"
389
+ });
351
390
  const Input = defineComponent({
352
391
  name: "Input",
353
392
  props: {
@@ -508,6 +547,7 @@
508
547
  "display",
509
548
  "title",
510
549
  "subtitle",
550
+ "lead",
511
551
  "body",
512
552
  "caption"
513
553
  ],
@@ -529,6 +569,13 @@
529
569
  "strikethrough"
530
570
  ],
531
571
  numeric: "boolean",
572
+ leading: [
573
+ "tight",
574
+ "normal",
575
+ "relaxed"
576
+ ],
577
+ italic: "boolean",
578
+ selectable: "boolean",
532
579
  ...PADDING_PROPS
533
580
  },
534
581
  children: "text",
@@ -622,6 +669,8 @@
622
669
  const builtinComponents = {
623
670
  AmountInput,
624
671
  Badge,
672
+ Bullet,
673
+ BulletList,
625
674
  Button,
626
675
  Carousel,
627
676
  Checkbox,
@@ -642,13 +691,17 @@
642
691
  Notice,
643
692
  Option,
644
693
  ProgressBar,
694
+ Prose,
645
695
  QRCode,
696
+ Quote,
646
697
  Radio,
647
698
  RadioGroup,
699
+ RichText,
648
700
  Scroll,
649
701
  Select,
650
702
  Sheet,
651
703
  Skeleton,
704
+ Slider,
652
705
  Spinner,
653
706
  Stack: defineComponent({
654
707
  name: "Stack",
@@ -1 +1 @@
1
- {"version":3,"file":"service-bridge.js","names":[],"sources":["../../../../core/dist/index.js","../../src/paths.ts","../../src/client/hot-reload.ts","../../src/client/wire.ts","../../src/client/service-bridge.ts"],"sourcesContent":["//#region src/view/component.ts\nfunction isWordsOr(type) {\n\treturn typeof type === \"object\" && !Array.isArray(type);\n}\nfunction otherThanWords(type) {\n\treturn type.or === \"number\" ? \"a number\" : \"a colour from the theme's custom colours\";\n}\nfunction defineComponent(manifest) {\n\treturn {\n\t\tprops: {},\n\t\tevents: [],\n\t\t...manifest\n\t};\n}\nfunction eventProp(event) {\n\treturn `on${event.charAt(0).toUpperCase()}${event.slice(1)}`;\n}\nfunction isEventProp(name) {\n\tconst letterAfterOn = name.charAt(2);\n\treturn name.startsWith(\"on\") && letterAfterOn >= \"A\" && letterAfterOn <= \"Z\";\n}\nfunction eventName(prop) {\n\tconst name = prop.slice(2);\n\treturn name.charAt(0).toLowerCase() + name.slice(1);\n}\nfunction componentRegistry(manifests) {\n\tconst registry = {};\n\tfor (const manifest of manifests) {\n\t\tif (manifest.name in registry) throw new Error(`Component <${manifest.name}> is defined twice`);\n\t\tregistry[manifest.name] = manifest;\n\t}\n\treturn registry;\n}\n//#endregion\n//#region src/view/values.ts\nfunction toText(value) {\n\tswitch (typeof value) {\n\t\tcase \"string\": return value;\n\t\tcase \"number\":\n\t\tcase \"boolean\":\n\t\tcase \"bigint\": return String(value);\n\t\tcase \"object\": return value === null ? \"\" : JSON.stringify(value);\n\t\tdefault: return \"\";\n\t}\n}\nfunction toList(value) {\n\tif (Array.isArray(value)) return value;\n\tif (typeof value === \"object\" && value !== null && Symbol.iterator in value) return Array.from(value);\n\treturn [];\n}\n//#endregion\n//#region src/view/components/amount-input.ts\nconst AmountInput = defineComponent({\n\tname: \"AmountInput\",\n\tprops: {\n\t\tvalue: \"number\",\n\t\tcurrency: \"string\",\n\t\tminorUnits: \"number\",\n\t\tunit: [\"minor\", \"major\"],\n\t\tlabel: \"string\",\n\t\tplaceholder: \"string\",\n\t\thint: \"string\",\n\t\terror: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/button.ts\nconst Button = defineComponent({\n\tname: \"Button\",\n\tprops: {\n\t\tvariant: [\"primary\", \"secondary\"],\n\t\tdisabled: \"boolean\",\n\t\tloading: \"boolean\"\n\t},\n\tevents: [\"click\"],\n\tchildren: \"text\"\n});\n//#endregion\n//#region src/view/components/options.ts\nconst SIZES = [\n\t\"small\",\n\t\"medium\",\n\t\"large\"\n];\nconst SPACES = [\n\t\"none\",\n\t\"small\",\n\t\"medium\",\n\t\"large\"\n];\nconst PADDING_PROPS = {\n\tpadding: SPACES,\n\tpaddingTop: SPACES,\n\tpaddingStart: SPACES,\n\tpaddingEnd: SPACES,\n\tpaddingBottom: SPACES\n};\nconst ASPECTS = [\n\t\"1:1\",\n\t\"4:3\",\n\t\"3:2\",\n\t\"16:9\",\n\t\"3:4\",\n\t\"2:3\",\n\t\"9:16\"\n];\nconst TONES = [\n\t\"default\",\n\t\"muted\",\n\t\"info\",\n\t\"success\",\n\t\"warning\",\n\t\"danger\"\n];\nconst TEXT_TONES = {\n\twords: [...TONES, \"onPrimary\"],\n\tor: \"themeColor\"\n};\nconst BACKGROUNDS = {\n\twords: [\n\t\t\"background\",\n\t\t\"surface\",\n\t\t\"primary\",\n\t\t\"muted\",\n\t\t\"info\",\n\t\t\"success\",\n\t\t\"warning\",\n\t\t\"danger\"\n\t],\n\tor: \"themeColor\"\n};\nconst BORDERS = [\n\t\"none\",\n\t\"subtle\",\n\t\"strong\"\n];\nconst RADII = [\n\t\"none\",\n\t\"small\",\n\t\"medium\",\n\t\"large\",\n\t\"full\"\n];\nconst LENGTH = {\n\twords: [\"fill\"],\n\tor: \"number\"\n};\nconst BOX_PROPS = {\n\tbackground: BACKGROUNDS,\n\tborder: BORDERS,\n\tradius: RADII,\n\twidth: LENGTH,\n\theight: LENGTH,\n\tminHeight: \"number\",\n\tmaxWidth: \"number\",\n\taspect: ASPECTS\n};\nconst STATUS_TONES = [\n\t\"default\",\n\t\"info\",\n\t\"success\",\n\t\"warning\",\n\t\"danger\"\n];\nconst ICON_NAMES = [\n\t\"arrow-down\",\n\t\"arrow-left\",\n\t\"arrow-right\",\n\t\"arrow-up\",\n\t\"bank\",\n\t\"bell\",\n\t\"bolt\",\n\t\"calendar\",\n\t\"card\",\n\t\"cart\",\n\t\"cash\",\n\t\"check\",\n\t\"chevron-down\",\n\t\"chevron-left\",\n\t\"chevron-right\",\n\t\"chevron-up\",\n\t\"clock\",\n\t\"close\",\n\t\"copy\",\n\t\"download\",\n\t\"edit\",\n\t\"error\",\n\t\"external-link\",\n\t\"eye\",\n\t\"eye-off\",\n\t\"file\",\n\t\"gift\",\n\t\"globe\",\n\t\"grid\",\n\t\"headphones\",\n\t\"heart\",\n\t\"help\",\n\t\"history\",\n\t\"home\",\n\t\"image\",\n\t\"info\",\n\t\"link\",\n\t\"list\",\n\t\"location\",\n\t\"lock\",\n\t\"logout\",\n\t\"mail\",\n\t\"microphone\",\n\t\"minus\",\n\t\"mobile\",\n\t\"more\",\n\t\"music\",\n\t\"phone\",\n\t\"playlist\",\n\t\"plus\",\n\t\"qr-code\",\n\t\"receipt\",\n\t\"refresh\",\n\t\"search\",\n\t\"send\",\n\t\"settings\",\n\t\"share\",\n\t\"star\",\n\t\"success\",\n\t\"ticket\",\n\t\"trash\",\n\t\"upload\",\n\t\"user\",\n\t\"users\",\n\t\"video\",\n\t\"wallet\",\n\t\"warning\",\n\t\"water\",\n\t\"wifi\"\n];\n//#endregion\n//#region src/view/components/carousel.ts\nconst Carousel = defineComponent({\n\tname: \"Carousel\",\n\tprops: {\n\t\tautoplay: \"boolean\",\n\t\tinterval: \"number\",\n\t\tloop: \"boolean\",\n\t\tindicator: [\"dots\", \"none\"],\n\t\tgap: SPACES,\n\t\teffect: [\"slide\", \"scale\"],\n\t\tindex: \"number\",\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"change\"],\n\tchildren: \"elements\"\n});\n//#endregion\n//#region src/view/components/chip.ts\nconst Chip = defineComponent({\n\tname: \"Chip\",\n\tprops: {\n\t\tlabel: \"string\",\n\t\ticon: ICON_NAMES,\n\t\tselected: \"boolean\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"tap\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/code-input.ts\nconst CodeInput = defineComponent({\n\tname: \"CodeInput\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlength: \"number\",\n\t\tlabel: \"string\",\n\t\thint: \"string\",\n\t\terror: \"string\",\n\t\tsecure: \"boolean\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\", \"complete\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/detail-row.ts\nconst DetailRow = defineComponent({\n\tname: \"DetailRow\",\n\tprops: {\n\t\tlabel: \"string\",\n\t\tvalue: \"string\",\n\t\ttone: TONES,\n\t\tweight: [\n\t\t\t\"regular\",\n\t\t\t\"medium\",\n\t\t\t\"bold\"\n\t\t],\n\t\t...PADDING_PROPS\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/divider.ts\nconst Divider = defineComponent({\n\tname: \"Divider\",\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/empty-state.ts\nconst EmptyState = defineComponent({\n\tname: \"EmptyState\",\n\tprops: {\n\t\ticon: ICON_NAMES,\n\t\ttitle: \"string\",\n\t\ttext: \"string\",\n\t\t...PADDING_PROPS\n\t},\n\tchildren: \"elements\"\n});\n//#endregion\n//#region src/view/components/feedback.ts\nconst Spinner = defineComponent({\n\tname: \"Spinner\",\n\tprops: { size: SIZES },\n\tchildren: \"none\"\n});\nconst ProgressBar = defineComponent({\n\tname: \"ProgressBar\",\n\tprops: { value: \"number\" },\n\tchildren: \"none\"\n});\nconst Notice = defineComponent({\n\tname: \"Notice\",\n\tprops: {\n\t\ttone: STATUS_TONES,\n\t\ttitle: \"string\",\n\t\t...PADDING_PROPS\n\t},\n\tchildren: \"text\"\n});\nconst Badge = defineComponent({\n\tname: \"Badge\",\n\tprops: { tone: STATUS_TONES },\n\tchildren: \"text\"\n});\n//#endregion\n//#region src/view/components/footer.ts\nconst Footer = defineComponent({\n\tname: \"Footer\",\n\tprops: PADDING_PROPS,\n\tchildren: \"elements\"\n});\n//#endregion\n//#region src/view/components/grid.ts\nconst Grid = defineComponent({\n\tname: \"Grid\",\n\tprops: {\n\t\tcolumns: \"number\",\n\t\tgap: SPACES,\n\t\t...PADDING_PROPS\n\t},\n\tchildren: \"elements\"\n});\nconst GridItem = defineComponent({\n\tname: \"GridItem\",\n\tprops: {\n\t\tlabel: \"string\",\n\t\ticon: ICON_NAMES,\n\t\timage: \"string\",\n\t\tbadge: \"string\"\n\t},\n\tevents: [\"tap\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/icon.ts\nconst Icon = defineComponent({\n\tname: \"Icon\",\n\tprops: {\n\t\tname: ICON_NAMES,\n\t\tsize: SIZES,\n\t\ttone: TONES\n\t},\n\tchildren: \"none\",\n\tinline: true\n});\n//#endregion\n//#region src/view/components/image.ts\nconst Image = defineComponent({\n\tname: \"Image\",\n\tprops: {\n\t\tsrc: \"string\",\n\t\talt: \"string\",\n\t\twidth: \"number\",\n\t\theight: \"number\",\n\t\tfit: [\"cover\", \"contain\"],\n\t\tshape: [\n\t\t\t\"rounded\",\n\t\t\t\"square\",\n\t\t\t\"circle\"\n\t\t],\n\t\taspect: ASPECTS\n\t},\n\tevents: [\"load\", \"error\"],\n\tchildren: \"none\",\n\toverrides: [{\n\t\tprop: \"aspect\",\n\t\tignores: \"height\",\n\t\tbecause: \"the aspect sets the height\"\n\t}]\n});\n//#endregion\n//#region src/view/components/input.ts\nconst Input = defineComponent({\n\tname: \"Input\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tplaceholder: \"string\",\n\t\tlabel: \"string\",\n\t\thint: \"string\",\n\t\terror: \"string\",\n\t\tprefix: \"string\",\n\t\tsuffix: \"string\",\n\t\ttype: [\n\t\t\t\"text\",\n\t\t\t\"number\",\n\t\t\t\"email\",\n\t\t\t\"phone\",\n\t\t\t\"password\"\n\t\t],\n\t\tmaxLength: \"number\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\", \"submit\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/link.ts\nconst Link = defineComponent({\n\tname: \"Link\",\n\tprops: {\n\t\thref: \"string\",\n\t\ttone: TONES\n\t},\n\tevents: [\"tap\"],\n\tchildren: \"text\",\n\tinline: true\n});\n//#endregion\n//#region src/view/components/list.ts\nconst List = defineComponent({\n\tname: \"List\",\n\tprops: {\n\t\tsize: [\"sm\", \"md\"],\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"endReached\"],\n\tchildren: \"elements\"\n});\nconst ListItem = defineComponent({\n\tname: \"ListItem\",\n\tprops: {\n\t\ttitle: \"string\",\n\t\tsubtitle: \"string\",\n\t\tvalue: \"string\",\n\t\ticon: ICON_NAMES,\n\t\timage: \"string\",\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"tap\"],\n\tchildren: \"elements\"\n});\n//#endregion\n//#region src/view/components/overlays.ts\nconst Sheet = defineComponent({\n\tname: \"Sheet\",\n\tprops: {\n\t\topen: \"boolean\",\n\t\ttitle: \"string\",\n\t\tshowCloseIcon: \"boolean\",\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"close\"],\n\tchildren: \"elements\"\n});\nconst Toast = defineComponent({\n\tname: \"Toast\",\n\tprops: {\n\t\tmessage: \"string\",\n\t\ttone: STATUS_TONES,\n\t\tduration: \"number\"\n\t},\n\tevents: [\"hide\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/qr-code.ts\nconst QRCode = defineComponent({\n\tname: \"QRCode\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tsize: \"number\",\n\t\tlabel: \"string\"\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/select.ts\nconst Select = defineComponent({\n\tname: \"Select\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlabel: \"string\",\n\t\tplaceholder: \"string\",\n\t\thint: \"string\",\n\t\terror: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"elements\"\n});\nconst Option = defineComponent({\n\tname: \"Option\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlabel: \"string\"\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/scroll.ts\nconst Scroll = defineComponent({\n\tname: \"Scroll\",\n\tprops: {\n\t\tgap: SPACES,\n\t\tsnap: [\n\t\t\t\"none\",\n\t\t\t\"start\",\n\t\t\t\"center\"\n\t\t],\n\t\tindex: \"number\",\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"change\"],\n\tchildren: \"elements\"\n});\n//#endregion\n//#region src/view/components/skeleton.ts\nconst Skeleton = defineComponent({\n\tname: \"Skeleton\",\n\tprops: {\n\t\tshape: [\n\t\t\t\"text\",\n\t\t\t\"circle\",\n\t\t\t\"box\"\n\t\t],\n\t\tlines: \"number\",\n\t\theight: \"number\"\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/tabs.ts\nconst Tabs = defineComponent({\n\tname: \"Tabs\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tvariant: [\"underline\", \"segmented\"],\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"change\"],\n\tchildren: \"elements\"\n});\nconst Tab = defineComponent({\n\tname: \"Tab\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlabel: \"string\",\n\t\tbadge: \"number\"\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/text.ts\nconst Text = defineComponent({\n\tname: \"Text\",\n\tprops: {\n\t\tvariant: [\n\t\t\t\"display\",\n\t\t\t\"title\",\n\t\t\t\"subtitle\",\n\t\t\t\"body\",\n\t\t\t\"caption\"\n\t\t],\n\t\ttone: TEXT_TONES,\n\t\tweight: [\n\t\t\t\"regular\",\n\t\t\t\"medium\",\n\t\t\t\"bold\"\n\t\t],\n\t\talign: [\n\t\t\t\"start\",\n\t\t\t\"center\",\n\t\t\t\"end\"\n\t\t],\n\t\tmaxLines: \"number\",\n\t\tdecoration: [\n\t\t\t\"none\",\n\t\t\t\"underline\",\n\t\t\t\"strikethrough\"\n\t\t],\n\t\tnumeric: \"boolean\",\n\t\t...PADDING_PROPS\n\t},\n\tchildren: \"text\",\n\tinline: true\n});\n//#endregion\n//#region src/view/components/text-area.ts\nconst TextArea = defineComponent({\n\tname: \"TextArea\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tplaceholder: \"string\",\n\t\tlabel: \"string\",\n\t\thint: \"string\",\n\t\terror: \"string\",\n\t\trows: \"number\",\n\t\tmaxLength: \"number\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/toggles.ts\nconst Switch = defineComponent({\n\tname: \"Switch\",\n\tprops: {\n\t\tchecked: \"boolean\",\n\t\tlabel: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"none\"\n});\nconst Checkbox = defineComponent({\n\tname: \"Checkbox\",\n\tprops: {\n\t\tchecked: \"boolean\",\n\t\tlabel: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"none\"\n});\nconst RadioGroup = defineComponent({\n\tname: \"RadioGroup\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlabel: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"elements\"\n});\nconst Radio = defineComponent({\n\tname: \"Radio\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlabel: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/view.ts\nconst View = defineComponent({\n\tname: \"View\",\n\tprops: {\n\t\tgap: SPACES,\n\t\tdirection: [\"column\", \"row\"],\n\t\talign: [\n\t\t\t\"stretch\",\n\t\t\t\"start\",\n\t\t\t\"center\",\n\t\t\t\"end\"\n\t\t],\n\t\tjustify: [\n\t\t\t\"start\",\n\t\t\t\"center\",\n\t\t\t\"end\",\n\t\t\t\"between\"\n\t\t],\n\t\twrap: \"boolean\",\n\t\tgrow: \"boolean\",\n\t\t...PADDING_PROPS,\n\t\tvariant: [\"plain\", \"card\"],\n\t\t...BOX_PROPS\n\t},\n\tevents: [\"tap\"],\n\tchildren: \"elements\",\n\toverrides: [{\n\t\tprop: \"aspect\",\n\t\tignores: \"height\",\n\t\tbecause: \"the aspect sets the height\"\n\t}]\n});\nconst Stack = defineComponent({\n\tname: \"Stack\",\n\tprops: {\n\t\tradius: BOX_PROPS.radius,\n\t\twidth: BOX_PROPS.width,\n\t\theight: BOX_PROPS.height,\n\t\taspect: BOX_PROPS.aspect\n\t},\n\tchildren: \"elements\",\n\toverrides: [{\n\t\tprop: \"aspect\",\n\t\tignores: \"height\",\n\t\tbecause: \"the aspect sets the height\"\n\t}]\n});\n//#endregion\n//#region src/view/components/index.ts\nconst builtinComponents = {\n\tAmountInput,\n\tBadge,\n\tButton,\n\tCarousel,\n\tCheckbox,\n\tChip,\n\tCodeInput,\n\tDetailRow,\n\tDivider,\n\tEmptyState,\n\tFooter,\n\tGrid,\n\tGridItem,\n\tIcon,\n\tImage,\n\tInput,\n\tLink,\n\tList,\n\tListItem,\n\tNotice,\n\tOption,\n\tProgressBar,\n\tQRCode,\n\tRadio,\n\tRadioGroup,\n\tScroll,\n\tSelect,\n\tSheet,\n\tSkeleton,\n\tSpinner,\n\tStack,\n\tSwitch,\n\tTab,\n\tTabs,\n\tText,\n\tTextArea,\n\tToast,\n\tView\n};\nconst builtinRegistry = componentRegistry(Object.values(builtinComponents));\n//#endregion\n//#region src/source/location.ts\nfunction createLocator(source) {\n\tconst lineStarts = [0];\n\tfor (let index = 0; index < source.length; index++) if (source[index] === \"\\n\") lineStarts.push(index + 1);\n\treturn (offset) => {\n\t\tlet low = 0;\n\t\tlet high = lineStarts.length - 1;\n\t\twhile (low < high) {\n\t\t\tconst middle = Math.floor((low + high + 1) / 2);\n\t\t\tif (lineStarts[middle] <= offset) low = middle;\n\t\t\telse high = middle - 1;\n\t\t}\n\t\treturn {\n\t\t\tline: low + 1,\n\t\t\tcolumn: offset - lineStarts[low] + 1,\n\t\t\toffset\n\t\t};\n\t};\n}\nfunction locationAt(source, offset) {\n\treturn createLocator(source)(offset);\n}\nfunction locatedMessage(message, file, location) {\n\tconst where = [\n\t\tfile,\n\t\tlocation?.line,\n\t\tlocation?.column\n\t].filter((part) => part !== void 0).join(\":\");\n\treturn where ? `${where}: ${message}` : message;\n}\n//#endregion\n//#region src/source/error.ts\nvar SourceError = class extends Error {\n\treason;\n\tfile;\n\tloc;\n\tconstructor(reason, file, location) {\n\t\tsuper(locatedMessage(reason, file, location));\n\t\tthis.reason = reason;\n\t\tthis.file = file;\n\t\tthis.loc = location;\n\t}\n};\n//#endregion\n//#region src/event/emitter.ts\nvar EventEmitter = class {\n\t#listeners = /* @__PURE__ */ new Map();\n\ton(name, listener) {\n\t\tconst listeners = this.#listeners.get(name) ?? /* @__PURE__ */ new Set();\n\t\tthis.#listeners.set(name, listeners);\n\t\tlisteners.add(listener);\n\t\treturn () => listeners.delete(listener);\n\t}\n\temit(name, ...args) {\n\t\tthis.#listeners.get(name)?.forEach((listener) => listener(...args));\n\t}\n};\n//#endregion\n//#region src/event/core.ts\nfunction createEvent(type, detail = {}, data = {}) {\n\treturn {\n\t\ttype,\n\t\tdetail,\n\t\tdata\n\t};\n}\n//#endregion\n//#region src/host/host.ts\nfunction hostTransport() {\n\tconst transport = globalThis.__hostTransport;\n\tif (!transport) throw new Error(\"No Dot host found: `globalThis.__hostTransport` is not set. Run the dot in the Dash app, or in the simulator with `dotctl dev`.\");\n\treturn transport;\n}\n//#endregion\n//#region src/host/context.ts\nconst DEFAULT_SYSTEM_CONTEXT = {\n\tscheme: \"light\",\n\tappState: \"active\"\n};\n//#endregion\n//#region src/host/calls.ts\nvar HostError = class extends Error {\n\tname = \"HostError\";\n\tcode;\n\tconstructor(code, message) {\n\t\tsuper(message);\n\t\tthis.code = code;\n\t}\n};\nlet connectedCaller = null;\nfunction connectHost(caller) {\n\tconnectedCaller = caller;\n}\nfunction callHost(method, params, options = {}) {\n\tif (!connectedCaller) {\n\t\tconst error = new HostError(\"unsupported\", `Can't run \"${method}\" here: call Dash from the dot's logic`);\n\t\treturn createHostRequest(Promise.reject(error));\n\t}\n\treturn connectedCaller(method, params, options);\n}\nfunction createHostRequest(promise, cancel = () => {}) {\n\tconst request = promise;\n\trequest.cancel = cancel;\n\treturn request;\n}\n//#endregion\n//#region src/host/permissions.ts\nconst PERMISSIONS = [\n\t\"account\",\n\t\"camera\",\n\t\"photoLibrary\",\n\t\"files\"\n];\nfunction isPermission(value) {\n\treturn PERMISSIONS.includes(value);\n}\n//#endregion\n//#region src/host/files.ts\nconst DOT_FILE_PATH_MAX_LENGTH = 512;\nconst MAX_NAME_LENGTH = 255;\nfunction dotFilePathProblem(path, { allowRoot = false } = {}) {\n\tif (path === \"\") return allowRoot ? null : \"A path is needed, such as \\\"receipts/42.pdf\\\"\";\n\tif (path.length > 512) return `\"${path.slice(0, 40)}…\" is longer than 512 characters`;\n\tif (path.startsWith(\"/\")) return `\"${path}\" starts with \"/\". Start paths without it, such as \"receipts/42.pdf\"`;\n\tif ([...path].some((char) => char === \"\\\\\" || char.charCodeAt(0) < 32)) return `\"${path}\" has a backslash or another character paths can't use`;\n\tfor (const name of path.split(\"/\")) {\n\t\tif (name === \"\" || name === \".\" || name === \"..\") return `\"${path}\" has an empty, \".\" or \"..\" part. Name each folder, such as \"receipts/42.pdf\"`;\n\t\tif (name.length > MAX_NAME_LENGTH) return `\"${path}\" has a name longer than ${MAX_NAME_LENGTH} characters`;\n\t}\n\treturn null;\n}\n//#endregion\n//#region src/host/network.ts\nconst LABEL = \"[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\";\nconst NETWORK_HOST_PATTERN = new RegExp(`^(?:\\\\*\\\\.${LABEL}(?:\\\\.${LABEL})+|${LABEL}(?:\\\\.${LABEL})*)$`);\nconst NETWORK_HOST_MAX_LENGTH = 253;\nfunction isNetworkHost(value) {\n\treturn value.length <= 253 && NETWORK_HOST_PATTERN.test(value);\n}\nfunction allowsHost(hosts, host) {\n\tconst name = host.toLowerCase().replace(/\\.$/, \"\");\n\treturn hosts.some((pattern) => pattern.startsWith(\"*.\") ? name.endsWith(pattern.slice(1)) : name === pattern);\n}\n//#endregion\n//#region src/version/semantic-version.ts\nconst SEMVER_PATTERN = /^(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-]+)*))?$/;\nfunction isSemanticVersion(value) {\n\treturn typeof value === \"string\" && SEMVER_PATTERN.test(value);\n}\nfunction majorVersion(version) {\n\treturn parseVersion(version).major;\n}\nfunction isVersionAtLeast(version, minimum) {\n\treturn compareVersions(version, minimum) >= 0;\n}\nfunction isNewerMajor(version, current) {\n\treturn parseVersion(version).major > parseVersion(current).major;\n}\nfunction compareVersions(left, right) {\n\tconst leftVersion = parseVersion(left);\n\tconst rightVersion = parseVersion(right);\n\tconst differences = [\n\t\tleftVersion.major - rightVersion.major,\n\t\tleftVersion.minor - rightVersion.minor,\n\t\tleftVersion.patch - rightVersion.patch\n\t];\n\tfor (const difference of differences) if (difference !== 0) return difference;\n\treturn comparePrereleases(leftVersion.prerelease, rightVersion.prerelease);\n}\nfunction parseVersion(version) {\n\tconst match = SEMVER_PATTERN.exec(version);\n\tif (!match) throw new Error(`\"${version}\" is not a semantic version`);\n\tconst [, major, minor, patch, prerelease] = match;\n\treturn {\n\t\tmajor: Number(major),\n\t\tminor: Number(minor),\n\t\tpatch: Number(patch),\n\t\tprerelease: prerelease === void 0 ? [] : prerelease.split(\".\")\n\t};\n}\nfunction comparePrereleases(left, right) {\n\tif (left.length === 0 || right.length === 0) return right.length - left.length;\n\tconst shared = Math.min(left.length, right.length);\n\tfor (let index = 0; index < shared; index++) {\n\t\tconst order = compareIdentifiers(left[index], right[index]);\n\t\tif (order !== 0) return order;\n\t}\n\treturn left.length - right.length;\n}\nfunction compareIdentifiers(left, right) {\n\tconst leftIsNumber = /^\\d+$/.test(left);\n\tconst rightIsNumber = /^\\d+$/.test(right);\n\tif (leftIsNumber && rightIsNumber) return Number(left) - Number(right);\n\tif (leftIsNumber) return -1;\n\tif (rightIsNumber) return 1;\n\tif (left < right) return -1;\n\tif (left > right) return 1;\n\treturn 0;\n}\n//#endregion\n//#region src/host/react.ts\nconst REACT_HOST_PATH = \"/__dot/react/\";\nconst REACT_HOST_MODULES = {\n\treact: \"react.js\",\n\t\"react/jsx-runtime\": \"react-jsx-runtime.js\",\n\t\"react-dom\": \"react-dom.js\",\n\t\"react-dom/client\": \"react-dom-client.js\"\n};\nfunction reactHostUrl(dotReactVersion, file) {\n\treturn `${REACT_HOST_PATH}${majorVersion(dotReactVersion)}/${file}`;\n}\nfunction isReactCompatible(hostVersion, dotVersion) {\n\treturn majorVersion(hostVersion) === majorVersion(dotVersion) && isVersionAtLeast(hostVersion, dotVersion);\n}\nfunction newestReactOfMajor(versions, major) {\n\treturn versions.filter((version) => majorVersion(version) === major).sort(compareVersions).at(-1);\n}\n//#endregion\n//#region src/protocol/transport.ts\nfunction createAdaptorTransport(adapter) {\n\treturn {\n\t\tpost: (message) => adapter.postMessage(message),\n\t\tlisten(listener) {\n\t\t\tconst onMessage = (event) => listener(event.data);\n\t\t\tadapter.addEventListener(\"message\", onMessage);\n\t\t\treturn () => adapter.removeEventListener(\"message\", onMessage);\n\t\t}\n\t};\n}\nfunction createTransportPair() {\n\tconst firstListeners = /* @__PURE__ */ new Set();\n\tconst secondListeners = /* @__PURE__ */ new Set();\n\tconst createSide = (ownListeners, otherListeners) => ({\n\t\tpost: (message) => {\n\t\t\tconst copy = JSON.parse(JSON.stringify(message));\n\t\t\totherListeners.forEach((listener) => listener(copy));\n\t\t},\n\t\tlisten(listener) {\n\t\t\townListeners.add(listener);\n\t\t\treturn () => ownListeners.delete(listener);\n\t\t}\n\t});\n\treturn [createSide(firstListeners, secondListeners), createSide(secondListeners, firstListeners)];\n}\nconst PAGE_HOOKS = Object.keys({\n\tonLoad: true,\n\tonShow: true,\n\tonHide: true,\n\tonUnload: true\n});\n//#endregion\n//#region src/page/navigation.ts\nconst MAX_STACK_DEPTH = 16;\nconst PAGE_ID = /^[A-Za-z0-9_-]+(?:\\/[A-Za-z0-9_-]+)*$/;\nfunction isPageId(value) {\n\treturn PAGE_ID.test(value);\n}\nvar NavigationStack = class {\n\tlimit;\n\t#pages = [];\n\t#nextInstanceId = 1;\n\tconstructor(limit = 16) {\n\t\tthis.limit = limit;\n\t}\n\tget pages() {\n\t\treturn this.#pages;\n\t}\n\tget top() {\n\t\treturn this.#pages.at(-1);\n\t}\n\tapply(navigation) {\n\t\tswitch (navigation.action) {\n\t\t\tcase \"push\":\n\t\t\t\tif (this.#pages.length >= this.limit) return false;\n\t\t\t\tbreak;\n\t\t\tcase \"replace\":\n\t\t\t\tthis.#pages.pop();\n\t\t\t\tbreak;\n\t\t\tcase \"reset\":\n\t\t\t\tthis.#pages = [];\n\t\t\t\tbreak;\n\t\t\tcase \"back\": {\n\t\t\t\tconst count = Math.min(navigation.delta, this.#pages.length - 1);\n\t\t\t\tif (count < 1) return false;\n\t\t\t\tthis.#pages = this.#pages.slice(0, -count);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\tconst { page, options } = navigation;\n\t\tthis.#pages = [...this.#pages, {\n\t\t\tinstanceId: this.#nextInstanceId++,\n\t\t\tpage,\n\t\t\toptions\n\t\t}];\n\t\treturn true;\n\t}\n};\n//#endregion\n//#region src/page/state.ts\nfunction applyChanges(state, changes) {\n\tconst next = { ...state };\n\tfor (const [key, value] of Object.entries(changes)) if (value !== void 0) next[key] = value;\n\treturn next;\n}\n//#endregion\n//#region src/page/bars.ts\nconst HEX_COLOR = /^#[0-9a-fA-F]{6}$/;\nfunction checkNavigationBar(options) {\n\tconst { title, hidden, backgroundColor, textColor } = options;\n\tif (title !== void 0 && typeof title !== \"string\") throw new TypeError(\"The navigation bar's title must be text\");\n\tif (hidden !== void 0 && typeof hidden !== \"boolean\") throw new TypeError(\"The navigation bar's `hidden` must be true or false\");\n\tfor (const [name, color] of Object.entries({\n\t\tbackgroundColor,\n\t\ttextColor\n\t})) 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\"`);\n}\nfunction checkTabBar(options) {\n\tif (options.hidden !== void 0 && typeof options.hidden !== \"boolean\") throw new TypeError(\"The tab bar's `hidden` must be true or false\");\n}\nfunction checkConfigs(configs) {\n\tcheckNavigationBar(configs.navigationBar ?? {});\n\tcheckTabBar(configs.tabBar ?? {});\n}\nfunction mergeConfigs(...configs) {\n\tconst bars = {\n\t\tnavigationBar: {},\n\t\ttabBar: {}\n\t};\n\tfor (const config of configs) {\n\t\tbars.navigationBar = {\n\t\t\t...bars.navigationBar,\n\t\t\t...config?.navigationBar\n\t\t};\n\t\tbars.tabBar = {\n\t\t\t...bars.tabBar,\n\t\t\t...config?.tabBar\n\t\t};\n\t}\n\treturn bars;\n}\n//#endregion\n//#region src/messageChannel.ts\nvar MessageChannel = class {\n\t#transport;\n\t#handlers = /* @__PURE__ */ new Map();\n\tconstructor(transport) {\n\t\tthis.#transport = transport;\n\t}\n\tsend(type, payload) {\n\t\tthis.#transport.post({\n\t\t\ttype,\n\t\t\tpayload\n\t\t});\n\t}\n\thandle(type, handler) {\n\t\tconst previous = this.#handlers.get(type);\n\t\tthis.#handlers.set(type, handler);\n\t\treturn previous;\n\t}\n\tlisten(onError) {\n\t\treturn this.#transport.listen((rawMessage) => {\n\t\t\tconst message = rawMessage;\n\t\t\tconst handler = this.#handlers.get(message.type);\n\t\t\tif (!handler) {\n\t\t\t\tonError(/* @__PURE__ */ new Error(`No handler for message \"${message.type}\"`), message);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\thandler(message.payload);\n\t\t\t} catch (error) {\n\t\t\t\tonError(error, message);\n\t\t\t}\n\t\t});\n\t}\n};\n//#endregion\nexport { ASPECTS, AmountInput, BACKGROUNDS, BORDERS, BOX_PROPS, Badge, Button, Carousel, Checkbox, Chip, CodeInput, DEFAULT_SYSTEM_CONTEXT, DOT_FILE_PATH_MAX_LENGTH, DetailRow, Divider, EmptyState, EventEmitter, Footer, Grid, GridItem, HostError, ICON_NAMES, Icon, Image, Input, LENGTH, Link, List, ListItem, MAX_STACK_DEPTH, MessageChannel, NETWORK_HOST_MAX_LENGTH, NETWORK_HOST_PATTERN, NavigationStack, Notice, Option, PADDING_PROPS, PAGE_HOOKS, PERMISSIONS, ProgressBar, QRCode, RADII, REACT_HOST_MODULES, REACT_HOST_PATH, Radio, RadioGroup, SEMVER_PATTERN, SIZES, SPACES, STATUS_TONES, Scroll, Select, Sheet, Skeleton, SourceError, Spinner, Stack, Switch, TEXT_TONES, 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, isNewerMajor, isPageId, isPermission, isReactCompatible, isSemanticVersion, isVersionAtLeast, isWordsOr, locatedMessage, locationAt, majorVersion, mergeConfigs, newestReactOfMajor, otherThanWords, reactHostUrl, toList, toText };\n\n//# sourceMappingURL=index.js.map","export const CLIENT_PATH = '/__dot/';\nexport const EVENTS_PATH = `${CLIENT_PATH}events`;\nexport const HTTP_PATH = `${CLIENT_PATH}network/http/`;\nexport const FILE_PATH = `${CLIENT_PATH}storage/file/`;\nexport const CACHE_PATH = `${CLIENT_PATH}storage/cache/`;\nexport const SECRET_PATH = `${CLIENT_PATH}storage/secret/`;\nexport const MEDIA_PATH = `${CLIENT_PATH}media/`;\nexport const TEMPORARY_FILES_PATH = `${CLIENT_PATH}files/`;\n\nexport const DOT_PATH = '/dot/';\nexport const WEBVIEW_URL = `${DOT_PATH}ui/index.html`;\nexport const WEBVIEW_SCRIPT_URL = `${DOT_PATH}ui/dot.js`;\nexport const SERVICE_URL = `${DOT_PATH}logic/dot.js`;\nexport const MANIFEST_URL = `${DOT_PATH}manifest.json`;\n","// What the simulator page posts to the dot's worker and web view to run its new build in place.\nexport interface HotReload {\n readonly dotHotReload: number;\n}\n\nexport function hotReloadIn(data: unknown): number | undefined {\n const reload = (data as Partial<HotReload> | null)?.dotHotReload;\n return typeof reload === 'number' ? reload : undefined;\n}\n","import type { Transport } from '@monimesl/dot-core';\n\n// Native bridges only carry strings. Encoding to JSON here makes state that a device can't carry\n// fail in the simulator too.\ninterface Wire {\n readonly dot: string;\n}\n\nfunction isWire(data: unknown): data is Wire {\n return typeof (data as Partial<Wire> | null)?.dot === 'string';\n}\n\nexport function wireTransport(channel: Transport): Transport {\n return {\n post: (message) => channel.post({ dot: JSON.stringify(message) } satisfies Wire),\n listen: (listener) =>\n channel.listen((data) => {\n if (isWire(data)) {\n listener(JSON.parse(data.dot));\n }\n }),\n };\n}\n\n// The simulator page and the webview's iframe, each accepting messages only from the other.\nexport function windowChannel(other: () => Window | null): Transport {\n return {\n post: (message) => other()?.postMessage(message, location.origin),\n listen(listener) {\n const onMessage = (event: MessageEvent) => {\n if (event.source === other()) {\n listener(event.data);\n }\n };\n window.addEventListener('message', onMessage);\n return () => window.removeEventListener('message', onMessage);\n },\n };\n}\n","import type { TransportAdapter } from '@monimesl/dot-core';\nimport { createAdaptorTransport } from '@monimesl/dot-core';\n\nimport { SERVICE_URL } from '../paths';\nimport { hotReloadIn } from './hot-reload';\nimport { wireTransport } from './wire';\n\ninterface WorkerScope extends TransportAdapter {\n importScripts(...urls: string[]): void;\n}\n\nconst scope = globalThis as unknown as WorkerScope;\n\nglobalThis.__hostTransport = wireTransport(createAdaptorTransport(scope));\n\nscope.importScripts(SERVICE_URL);\n\n// The new build hands its pages to the service already running here.\nscope.addEventListener('message', ({ data }) => {\n const reload = hotReloadIn(data);\n if (reload !== undefined) {\n scope.importScripts(`${SERVICE_URL}?hot=${reload}`);\n }\n});\n"],"mappings":";;CAOA,SAAS,gBAAgB,UAAU;EAClC,OAAO;GACN,OAAO,CAAC;GACR,QAAQ,CAAC;GACT,GAAG;EACJ;CACD;CAYA,SAAS,kBAAkB,WAAW;EACrC,MAAM,WAAW,CAAC;EAClB,KAAK,MAAM,YAAY,WAAW;GACjC,IAAI,SAAS,QAAQ,UAAU,MAAM,IAAI,MAAM,cAAc,SAAS,KAAK,mBAAmB;GAC9F,SAAS,SAAS,QAAQ;EAC3B;EACA,OAAO;CACR;CAoBA,MAAM,cAAc,gBAAgB;EACnC,MAAM;EACN,OAAO;GACN,OAAO;GACP,UAAU;GACV,YAAY;GACZ,MAAM,CAAC,SAAS,OAAO;GACvB,OAAO;GACP,aAAa;GACb,MAAM;GACN,OAAO;GACP,UAAU;EACX;EACA,QAAQ,CAAC,QAAQ;EACjB,UAAU;CACX,CAAC;CAGD,MAAM,SAAS,gBAAgB;EAC9B,MAAM;EACN,OAAO;GACN,SAAS,CAAC,WAAW,WAAW;GAChC,UAAU;GACV,SAAS;EACV;EACA,QAAQ,CAAC,OAAO;EAChB,UAAU;CACX,CAAC;CAGD,MAAM,QAAQ;EACb;EACA;EACA;CACD;CACA,MAAM,SAAS;EACd;EACA;EACA;EACA;CACD;CACA,MAAM,gBAAgB;EACrB,SAAS;EACT,YAAY;EACZ,cAAc;EACd,YAAY;EACZ,eAAe;CAChB;CACA,MAAM,UAAU;EACf;EACA;EACA;EACA;EACA;EACA;EACA;CACD;CACA,MAAM,QAAQ;EACb;EACA;EACA;EACA;EACA;EACA;CACD;CACA,MAAM,aAAa;EAClB,OAAO,CAAC,GAAG,OAAO,WAAW;EAC7B,IAAI;CACL;CACA,MAAM,cAAc;EACnB,OAAO;GACN;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACD;EACA,IAAI;CACL;CACA,MAAM,UAAU;EACf;EACA;EACA;CACD;CACA,MAAM,QAAQ;EACb;EACA;EACA;EACA;EACA;CACD;CACA,MAAM,SAAS;EACd,OAAO,CAAC,MAAM;EACd,IAAI;CACL;CACA,MAAM,YAAY;EACjB,YAAY;EACZ,QAAQ;EACR,QAAQ;EACR,OAAO;EACP,QAAQ;EACR,WAAW;EACX,UAAU;EACV,QAAQ;CACT;CACA,MAAM,eAAe;EACpB;EACA;EACA;EACA;EACA;CACD;CACA,MAAM,aAAa;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD;CAGA,MAAM,WAAW,gBAAgB;EAChC,MAAM;EACN,OAAO;GACN,UAAU;GACV,UAAU;GACV,MAAM;GACN,WAAW,CAAC,QAAQ,MAAM;GAC1B,KAAK;GACL,QAAQ,CAAC,SAAS,OAAO;GACzB,OAAO;GACP,GAAG;EACJ;EACA,QAAQ,CAAC,QAAQ;EACjB,UAAU;CACX,CAAC;CAGD,MAAM,OAAO,gBAAgB;EAC5B,MAAM;EACN,OAAO;GACN,OAAO;GACP,MAAM;GACN,UAAU;GACV,UAAU;EACX;EACA,QAAQ,CAAC,KAAK;EACd,UAAU;CACX,CAAC;CAGD,MAAM,YAAY,gBAAgB;EACjC,MAAM;EACN,OAAO;GACN,OAAO;GACP,QAAQ;GACR,OAAO;GACP,MAAM;GACN,OAAO;GACP,QAAQ;GACR,UAAU;EACX;EACA,QAAQ,CAAC,UAAU,UAAU;EAC7B,UAAU;CACX,CAAC;CAGD,MAAM,YAAY,gBAAgB;EACjC,MAAM;EACN,OAAO;GACN,OAAO;GACP,OAAO;GACP,MAAM;GACN,QAAQ;IACP;IACA;IACA;GACD;GACA,GAAG;EACJ;EACA,UAAU;CACX,CAAC;CAGD,MAAM,UAAU,gBAAgB;EAC/B,MAAM;EACN,UAAU;CACX,CAAC;CAGD,MAAM,aAAa,gBAAgB;EAClC,MAAM;EACN,OAAO;GACN,MAAM;GACN,OAAO;GACP,MAAM;GACN,GAA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"}
1
+ {"version":3,"file":"service-bridge.js","names":[],"sources":["../../../../core/dist/index.js","../../src/paths.ts","../../src/client/hot-reload.ts","../../src/client/wire.ts","../../src/client/service-bridge.ts"],"sourcesContent":["//#region src/view/component.ts\nfunction isWordsOr(type) {\n\treturn typeof type === \"object\" && !Array.isArray(type);\n}\nfunction otherThanWords(type) {\n\treturn type.or === \"number\" ? \"a number\" : \"a colour from the theme's custom colours\";\n}\nfunction defineComponent(manifest) {\n\treturn {\n\t\tprops: {},\n\t\tevents: [],\n\t\t...manifest\n\t};\n}\nfunction eventProp(event) {\n\treturn `on${event.charAt(0).toUpperCase()}${event.slice(1)}`;\n}\nfunction isEventProp(name) {\n\tconst letterAfterOn = name.charAt(2);\n\treturn name.startsWith(\"on\") && letterAfterOn >= \"A\" && letterAfterOn <= \"Z\";\n}\nfunction eventName(prop) {\n\tconst name = prop.slice(2);\n\treturn name.charAt(0).toLowerCase() + name.slice(1);\n}\nfunction componentRegistry(manifests) {\n\tconst registry = {};\n\tfor (const manifest of manifests) {\n\t\tif (manifest.name in registry) throw new Error(`Component <${manifest.name}> is defined twice`);\n\t\tregistry[manifest.name] = manifest;\n\t}\n\treturn registry;\n}\n//#endregion\n//#region src/view/values.ts\nfunction toText(value) {\n\tswitch (typeof value) {\n\t\tcase \"string\": return value;\n\t\tcase \"number\":\n\t\tcase \"boolean\":\n\t\tcase \"bigint\": return String(value);\n\t\tcase \"object\": return value === null ? \"\" : JSON.stringify(value);\n\t\tdefault: return \"\";\n\t}\n}\nfunction toList(value) {\n\tif (Array.isArray(value)) return value;\n\tif (typeof value === \"object\" && value !== null && Symbol.iterator in value) return Array.from(value);\n\treturn [];\n}\n//#endregion\n//#region src/view/components/amount-input.ts\nconst AmountInput = defineComponent({\n\tname: \"AmountInput\",\n\tprops: {\n\t\tvalue: \"number\",\n\t\tcurrency: \"string\",\n\t\tminorUnits: \"number\",\n\t\tunit: [\"minor\", \"major\"],\n\t\tlabel: \"string\",\n\t\tplaceholder: \"string\",\n\t\thint: \"string\",\n\t\terror: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/button.ts\nconst Button = defineComponent({\n\tname: \"Button\",\n\tprops: {\n\t\tvariant: [\"primary\", \"secondary\"],\n\t\tdisabled: \"boolean\",\n\t\tloading: \"boolean\"\n\t},\n\tevents: [\"click\"],\n\tchildren: \"text\"\n});\n//#endregion\n//#region src/view/components/options.ts\nconst SIZES = [\n\t\"small\",\n\t\"medium\",\n\t\"large\"\n];\nconst SPACES = [\n\t\"none\",\n\t\"small\",\n\t\"medium\",\n\t\"large\"\n];\nconst PADDING_PROPS = {\n\tpadding: SPACES,\n\tpaddingTop: SPACES,\n\tpaddingStart: SPACES,\n\tpaddingEnd: SPACES,\n\tpaddingBottom: SPACES\n};\nconst ASPECTS = [\n\t\"1:1\",\n\t\"4:3\",\n\t\"3:2\",\n\t\"16:9\",\n\t\"3:4\",\n\t\"2:3\",\n\t\"9:16\"\n];\nconst TONES = [\n\t\"default\",\n\t\"muted\",\n\t\"info\",\n\t\"success\",\n\t\"warning\",\n\t\"danger\"\n];\nconst TEXT_TONES = {\n\twords: [...TONES, \"onPrimary\"],\n\tor: \"themeColor\"\n};\nconst BACKGROUNDS = {\n\twords: [\n\t\t\"background\",\n\t\t\"surface\",\n\t\t\"primary\",\n\t\t\"muted\",\n\t\t\"info\",\n\t\t\"success\",\n\t\t\"warning\",\n\t\t\"danger\"\n\t],\n\tor: \"themeColor\"\n};\nconst BORDERS = [\n\t\"none\",\n\t\"subtle\",\n\t\"strong\"\n];\nconst RADII = [\n\t\"none\",\n\t\"small\",\n\t\"medium\",\n\t\"large\",\n\t\"full\"\n];\nconst LENGTH = {\n\twords: [\"fill\"],\n\tor: \"number\"\n};\nconst BOX_PROPS = {\n\tbackground: BACKGROUNDS,\n\tborder: BORDERS,\n\tradius: RADII,\n\twidth: LENGTH,\n\theight: LENGTH,\n\tminHeight: \"number\",\n\tmaxWidth: \"number\",\n\taspect: ASPECTS\n};\nconst STATUS_TONES = [\n\t\"default\",\n\t\"info\",\n\t\"success\",\n\t\"warning\",\n\t\"danger\"\n];\nconst ICON_NAMES = [\n\t\"arrow-down\",\n\t\"arrow-left\",\n\t\"arrow-right\",\n\t\"arrow-up\",\n\t\"bank\",\n\t\"bell\",\n\t\"bolt\",\n\t\"calendar\",\n\t\"card\",\n\t\"cart\",\n\t\"cash\",\n\t\"check\",\n\t\"chevron-down\",\n\t\"chevron-left\",\n\t\"chevron-right\",\n\t\"chevron-up\",\n\t\"clock\",\n\t\"close\",\n\t\"copy\",\n\t\"download\",\n\t\"edit\",\n\t\"error\",\n\t\"external-link\",\n\t\"eye\",\n\t\"eye-off\",\n\t\"file\",\n\t\"gift\",\n\t\"globe\",\n\t\"grid\",\n\t\"headphones\",\n\t\"heart\",\n\t\"help\",\n\t\"history\",\n\t\"home\",\n\t\"image\",\n\t\"info\",\n\t\"link\",\n\t\"list\",\n\t\"location\",\n\t\"lock\",\n\t\"logout\",\n\t\"mail\",\n\t\"microphone\",\n\t\"minus\",\n\t\"mobile\",\n\t\"more\",\n\t\"music\",\n\t\"phone\",\n\t\"playlist\",\n\t\"plus\",\n\t\"qr-code\",\n\t\"receipt\",\n\t\"refresh\",\n\t\"search\",\n\t\"send\",\n\t\"settings\",\n\t\"share\",\n\t\"star\",\n\t\"success\",\n\t\"ticket\",\n\t\"trash\",\n\t\"upload\",\n\t\"user\",\n\t\"users\",\n\t\"video\",\n\t\"wallet\",\n\t\"warning\",\n\t\"water\",\n\t\"wifi\"\n];\n//#endregion\n//#region src/view/components/carousel.ts\nconst Carousel = defineComponent({\n\tname: \"Carousel\",\n\tprops: {\n\t\tautoplay: \"boolean\",\n\t\tinterval: \"number\",\n\t\tloop: \"boolean\",\n\t\tindicator: [\"dots\", \"none\"],\n\t\tgap: SPACES,\n\t\teffect: [\"slide\", \"scale\"],\n\t\tindex: \"number\",\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"change\"],\n\tchildren: \"elements\"\n});\n//#endregion\n//#region src/view/components/chip.ts\nconst Chip = defineComponent({\n\tname: \"Chip\",\n\tprops: {\n\t\tlabel: \"string\",\n\t\ticon: ICON_NAMES,\n\t\tselected: \"boolean\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"tap\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/code-input.ts\nconst CodeInput = defineComponent({\n\tname: \"CodeInput\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlength: \"number\",\n\t\tlabel: \"string\",\n\t\thint: \"string\",\n\t\terror: \"string\",\n\t\tsecure: \"boolean\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\", \"complete\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/detail-row.ts\nconst DetailRow = defineComponent({\n\tname: \"DetailRow\",\n\tprops: {\n\t\tlabel: \"string\",\n\t\tvalue: \"string\",\n\t\ttone: TONES,\n\t\tweight: [\n\t\t\t\"regular\",\n\t\t\t\"medium\",\n\t\t\t\"bold\"\n\t\t],\n\t\t...PADDING_PROPS\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/divider.ts\nconst Divider = defineComponent({\n\tname: \"Divider\",\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/empty-state.ts\nconst EmptyState = defineComponent({\n\tname: \"EmptyState\",\n\tprops: {\n\t\ticon: ICON_NAMES,\n\t\ttitle: \"string\",\n\t\ttext: \"string\",\n\t\t...PADDING_PROPS\n\t},\n\tchildren: \"elements\"\n});\n//#endregion\n//#region src/view/components/feedback.ts\nconst Spinner = defineComponent({\n\tname: \"Spinner\",\n\tprops: { size: SIZES },\n\tchildren: \"none\"\n});\nconst ProgressBar = defineComponent({\n\tname: \"ProgressBar\",\n\tprops: { value: \"number\" },\n\tchildren: \"none\"\n});\nconst Notice = defineComponent({\n\tname: \"Notice\",\n\tprops: {\n\t\ttone: STATUS_TONES,\n\t\ttitle: \"string\",\n\t\t...PADDING_PROPS\n\t},\n\tchildren: \"text\"\n});\nconst Badge = defineComponent({\n\tname: \"Badge\",\n\tprops: { tone: STATUS_TONES },\n\tchildren: \"text\"\n});\n//#endregion\n//#region src/view/components/footer.ts\nconst Footer = defineComponent({\n\tname: \"Footer\",\n\tprops: PADDING_PROPS,\n\tchildren: \"elements\"\n});\n//#endregion\n//#region src/view/components/grid.ts\nconst Grid = defineComponent({\n\tname: \"Grid\",\n\tprops: {\n\t\tcolumns: \"number\",\n\t\tgap: SPACES,\n\t\t...PADDING_PROPS\n\t},\n\tchildren: \"elements\"\n});\nconst GridItem = defineComponent({\n\tname: \"GridItem\",\n\tprops: {\n\t\tlabel: \"string\",\n\t\ticon: ICON_NAMES,\n\t\timage: \"string\",\n\t\tbadge: \"string\"\n\t},\n\tevents: [\"tap\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/icon.ts\nconst Icon = defineComponent({\n\tname: \"Icon\",\n\tprops: {\n\t\tname: ICON_NAMES,\n\t\tsize: SIZES,\n\t\ttone: TONES\n\t},\n\tchildren: \"none\",\n\tinline: true\n});\n//#endregion\n//#region src/view/components/image.ts\nconst Image = defineComponent({\n\tname: \"Image\",\n\tprops: {\n\t\tsrc: \"string\",\n\t\talt: \"string\",\n\t\twidth: \"number\",\n\t\theight: \"number\",\n\t\tfit: [\"cover\", \"contain\"],\n\t\tshape: [\n\t\t\t\"rounded\",\n\t\t\t\"square\",\n\t\t\t\"circle\"\n\t\t],\n\t\taspect: ASPECTS\n\t},\n\tevents: [\"load\", \"error\"],\n\tchildren: \"none\",\n\toverrides: [{\n\t\tprop: \"aspect\",\n\t\tignores: \"height\",\n\t\tbecause: \"the aspect sets the height\"\n\t}]\n});\n//#endregion\n//#region src/view/components/slider.ts\nconst Slider = defineComponent({\n\tname: \"Slider\",\n\tprops: {\n\t\tvalue: \"number\",\n\t\tmin: \"number\",\n\t\tmax: \"number\",\n\t\tstep: \"number\",\n\t\tshowValue: \"boolean\",\n\t\tlabel: \"string\",\n\t\thint: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/prose.ts\nconst Prose = defineComponent({\n\tname: \"Prose\",\n\tprops: { ...PADDING_PROPS },\n\tchildren: \"elements\"\n});\nconst Quote = defineComponent({\n\tname: \"Quote\",\n\tprops: { cite: \"string\" },\n\tchildren: \"elements\"\n});\nconst BulletList = defineComponent({\n\tname: \"BulletList\",\n\tprops: { ordered: \"boolean\" },\n\tchildren: \"elements\"\n});\nconst Bullet = defineComponent({\n\tname: \"Bullet\",\n\tchildren: \"elements\"\n});\nconst RichText = defineComponent({\n\tname: \"RichText\",\n\tprops: { markdown: \"string\" },\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/input.ts\nconst Input = defineComponent({\n\tname: \"Input\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tplaceholder: \"string\",\n\t\tlabel: \"string\",\n\t\thint: \"string\",\n\t\terror: \"string\",\n\t\tprefix: \"string\",\n\t\tsuffix: \"string\",\n\t\ttype: [\n\t\t\t\"text\",\n\t\t\t\"number\",\n\t\t\t\"email\",\n\t\t\t\"phone\",\n\t\t\t\"password\"\n\t\t],\n\t\tmaxLength: \"number\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\", \"submit\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/link.ts\nconst Link = defineComponent({\n\tname: \"Link\",\n\tprops: {\n\t\thref: \"string\",\n\t\ttone: TONES\n\t},\n\tevents: [\"tap\"],\n\tchildren: \"text\",\n\tinline: true\n});\n//#endregion\n//#region src/view/components/list.ts\nconst List = defineComponent({\n\tname: \"List\",\n\tprops: {\n\t\tsize: [\"sm\", \"md\"],\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"endReached\"],\n\tchildren: \"elements\"\n});\nconst ListItem = defineComponent({\n\tname: \"ListItem\",\n\tprops: {\n\t\ttitle: \"string\",\n\t\tsubtitle: \"string\",\n\t\tvalue: \"string\",\n\t\ticon: ICON_NAMES,\n\t\timage: \"string\",\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"tap\"],\n\tchildren: \"elements\"\n});\n//#endregion\n//#region src/view/components/overlays.ts\nconst Sheet = defineComponent({\n\tname: \"Sheet\",\n\tprops: {\n\t\topen: \"boolean\",\n\t\ttitle: \"string\",\n\t\tshowCloseIcon: \"boolean\",\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"close\"],\n\tchildren: \"elements\"\n});\nconst Toast = defineComponent({\n\tname: \"Toast\",\n\tprops: {\n\t\tmessage: \"string\",\n\t\ttone: STATUS_TONES,\n\t\tduration: \"number\"\n\t},\n\tevents: [\"hide\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/qr-code.ts\nconst QRCode = defineComponent({\n\tname: \"QRCode\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tsize: \"number\",\n\t\tlabel: \"string\"\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/select.ts\nconst Select = defineComponent({\n\tname: \"Select\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlabel: \"string\",\n\t\tplaceholder: \"string\",\n\t\thint: \"string\",\n\t\terror: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"elements\"\n});\nconst Option = defineComponent({\n\tname: \"Option\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlabel: \"string\"\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/scroll.ts\nconst Scroll = defineComponent({\n\tname: \"Scroll\",\n\tprops: {\n\t\tgap: SPACES,\n\t\tsnap: [\n\t\t\t\"none\",\n\t\t\t\"start\",\n\t\t\t\"center\"\n\t\t],\n\t\tindex: \"number\",\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"change\"],\n\tchildren: \"elements\"\n});\n//#endregion\n//#region src/view/components/skeleton.ts\nconst Skeleton = defineComponent({\n\tname: \"Skeleton\",\n\tprops: {\n\t\tshape: [\n\t\t\t\"text\",\n\t\t\t\"circle\",\n\t\t\t\"box\"\n\t\t],\n\t\tlines: \"number\",\n\t\theight: \"number\"\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/tabs.ts\nconst Tabs = defineComponent({\n\tname: \"Tabs\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tvariant: [\"underline\", \"segmented\"],\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"change\"],\n\tchildren: \"elements\"\n});\nconst Tab = defineComponent({\n\tname: \"Tab\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlabel: \"string\",\n\t\tbadge: \"number\"\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/text.ts\nconst Text = defineComponent({\n\tname: \"Text\",\n\tprops: {\n\t\tvariant: [\n\t\t\t\"display\",\n\t\t\t\"title\",\n\t\t\t\"subtitle\",\n\t\t\t\"lead\",\n\t\t\t\"body\",\n\t\t\t\"caption\"\n\t\t],\n\t\ttone: TEXT_TONES,\n\t\tweight: [\n\t\t\t\"regular\",\n\t\t\t\"medium\",\n\t\t\t\"bold\"\n\t\t],\n\t\talign: [\n\t\t\t\"start\",\n\t\t\t\"center\",\n\t\t\t\"end\"\n\t\t],\n\t\tmaxLines: \"number\",\n\t\tdecoration: [\n\t\t\t\"none\",\n\t\t\t\"underline\",\n\t\t\t\"strikethrough\"\n\t\t],\n\t\tnumeric: \"boolean\",\n\t\tleading: [\n\t\t\t\"tight\",\n\t\t\t\"normal\",\n\t\t\t\"relaxed\"\n\t\t],\n\t\titalic: \"boolean\",\n\t\tselectable: \"boolean\",\n\t\t...PADDING_PROPS\n\t},\n\tchildren: \"text\",\n\tinline: true\n});\n//#endregion\n//#region src/view/components/text-area.ts\nconst TextArea = defineComponent({\n\tname: \"TextArea\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tplaceholder: \"string\",\n\t\tlabel: \"string\",\n\t\thint: \"string\",\n\t\terror: \"string\",\n\t\trows: \"number\",\n\t\tmaxLength: \"number\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/toggles.ts\nconst Switch = defineComponent({\n\tname: \"Switch\",\n\tprops: {\n\t\tchecked: \"boolean\",\n\t\tlabel: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"none\"\n});\nconst Checkbox = defineComponent({\n\tname: \"Checkbox\",\n\tprops: {\n\t\tchecked: \"boolean\",\n\t\tlabel: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"none\"\n});\nconst RadioGroup = defineComponent({\n\tname: \"RadioGroup\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlabel: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"elements\"\n});\nconst Radio = defineComponent({\n\tname: \"Radio\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlabel: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/view.ts\nconst View = defineComponent({\n\tname: \"View\",\n\tprops: {\n\t\tgap: SPACES,\n\t\tdirection: [\"column\", \"row\"],\n\t\talign: [\n\t\t\t\"stretch\",\n\t\t\t\"start\",\n\t\t\t\"center\",\n\t\t\t\"end\"\n\t\t],\n\t\tjustify: [\n\t\t\t\"start\",\n\t\t\t\"center\",\n\t\t\t\"end\",\n\t\t\t\"between\"\n\t\t],\n\t\twrap: \"boolean\",\n\t\tgrow: \"boolean\",\n\t\t...PADDING_PROPS,\n\t\tvariant: [\"plain\", \"card\"],\n\t\t...BOX_PROPS\n\t},\n\tevents: [\"tap\"],\n\tchildren: \"elements\",\n\toverrides: [{\n\t\tprop: \"aspect\",\n\t\tignores: \"height\",\n\t\tbecause: \"the aspect sets the height\"\n\t}]\n});\nconst Stack = defineComponent({\n\tname: \"Stack\",\n\tprops: {\n\t\tradius: BOX_PROPS.radius,\n\t\twidth: BOX_PROPS.width,\n\t\theight: BOX_PROPS.height,\n\t\taspect: BOX_PROPS.aspect\n\t},\n\tchildren: \"elements\",\n\toverrides: [{\n\t\tprop: \"aspect\",\n\t\tignores: \"height\",\n\t\tbecause: \"the aspect sets the height\"\n\t}]\n});\n//#endregion\n//#region src/view/components/index.ts\nconst builtinComponents = {\n\tAmountInput,\n\tBadge,\n\tBullet,\n\tBulletList,\n\tButton,\n\tCarousel,\n\tCheckbox,\n\tChip,\n\tCodeInput,\n\tDetailRow,\n\tDivider,\n\tEmptyState,\n\tFooter,\n\tGrid,\n\tGridItem,\n\tIcon,\n\tImage,\n\tInput,\n\tLink,\n\tList,\n\tListItem,\n\tNotice,\n\tOption,\n\tProgressBar,\n\tProse,\n\tQRCode,\n\tQuote,\n\tRadio,\n\tRadioGroup,\n\tRichText,\n\tScroll,\n\tSelect,\n\tSheet,\n\tSkeleton,\n\tSlider,\n\tSpinner,\n\tStack,\n\tSwitch,\n\tTab,\n\tTabs,\n\tText,\n\tTextArea,\n\tToast,\n\tView\n};\nconst builtinRegistry = componentRegistry(Object.values(builtinComponents));\n//#endregion\n//#region src/source/location.ts\nfunction createLocator(source) {\n\tconst lineStarts = [0];\n\tfor (let index = 0; index < source.length; index++) if (source[index] === \"\\n\") lineStarts.push(index + 1);\n\treturn (offset) => {\n\t\tlet low = 0;\n\t\tlet high = lineStarts.length - 1;\n\t\twhile (low < high) {\n\t\t\tconst middle = Math.floor((low + high + 1) / 2);\n\t\t\tif (lineStarts[middle] <= offset) low = middle;\n\t\t\telse high = middle - 1;\n\t\t}\n\t\treturn {\n\t\t\tline: low + 1,\n\t\t\tcolumn: offset - lineStarts[low] + 1,\n\t\t\toffset\n\t\t};\n\t};\n}\nfunction locationAt(source, offset) {\n\treturn createLocator(source)(offset);\n}\nfunction locatedMessage(message, file, location) {\n\tconst where = [\n\t\tfile,\n\t\tlocation?.line,\n\t\tlocation?.column\n\t].filter((part) => part !== void 0).join(\":\");\n\treturn where ? `${where}: ${message}` : message;\n}\n//#endregion\n//#region src/source/error.ts\nvar SourceError = class extends Error {\n\treason;\n\tfile;\n\tloc;\n\tconstructor(reason, file, location) {\n\t\tsuper(locatedMessage(reason, file, location));\n\t\tthis.reason = reason;\n\t\tthis.file = file;\n\t\tthis.loc = location;\n\t}\n};\n//#endregion\n//#region src/event/emitter.ts\nvar EventEmitter = class {\n\t#listeners = /* @__PURE__ */ new Map();\n\ton(name, listener) {\n\t\tconst listeners = this.#listeners.get(name) ?? /* @__PURE__ */ new Set();\n\t\tthis.#listeners.set(name, listeners);\n\t\tlisteners.add(listener);\n\t\treturn () => listeners.delete(listener);\n\t}\n\temit(name, ...args) {\n\t\tthis.#listeners.get(name)?.forEach((listener) => listener(...args));\n\t}\n};\n//#endregion\n//#region src/event/core.ts\nfunction createEvent(type, detail = {}, data = {}) {\n\treturn {\n\t\ttype,\n\t\tdetail,\n\t\tdata\n\t};\n}\n//#endregion\n//#region src/host/host.ts\nfunction hostTransport() {\n\tconst transport = globalThis.__hostTransport;\n\tif (!transport) throw new Error(\"No Dot host found: `globalThis.__hostTransport` is not set. Run the dot in the Dash app, or in the simulator with `dotctl dev`.\");\n\treturn transport;\n}\n//#endregion\n//#region src/host/context.ts\nconst DEFAULT_SYSTEM_CONTEXT = {\n\tscheme: \"light\",\n\tappState: \"active\"\n};\n//#endregion\n//#region src/host/calls.ts\nvar HostError = class extends Error {\n\tname = \"HostError\";\n\tcode;\n\tconstructor(code, message) {\n\t\tsuper(message);\n\t\tthis.code = code;\n\t}\n};\nlet connectedCaller = null;\nfunction connectHost(caller) {\n\tconnectedCaller = caller;\n}\nfunction callHost(method, params, options = {}) {\n\tif (!connectedCaller) {\n\t\tconst error = new HostError(\"unsupported\", `Can't run \"${method}\" here: call Dash from the dot's logic`);\n\t\treturn createHostRequest(Promise.reject(error));\n\t}\n\treturn connectedCaller(method, params, options);\n}\nfunction createHostRequest(promise, cancel = () => {}) {\n\tconst request = promise;\n\trequest.cancel = cancel;\n\treturn request;\n}\n//#endregion\n//#region src/host/permissions.ts\nconst PERMISSIONS = [\n\t\"account\",\n\t\"camera\",\n\t\"photoLibrary\",\n\t\"files\"\n];\nfunction isPermission(value) {\n\treturn PERMISSIONS.includes(value);\n}\n//#endregion\n//#region src/host/files.ts\nconst DOT_FILE_PATH_MAX_LENGTH = 512;\nconst MAX_NAME_LENGTH = 255;\nfunction dotFilePathProblem(path, { allowRoot = false } = {}) {\n\tif (path === \"\") return allowRoot ? null : \"A path is needed, such as \\\"receipts/42.pdf\\\"\";\n\tif (path.length > 512) return `\"${path.slice(0, 40)}…\" is longer than 512 characters`;\n\tif (path.startsWith(\"/\")) return `\"${path}\" starts with \"/\". Start paths without it, such as \"receipts/42.pdf\"`;\n\tif ([...path].some((char) => char === \"\\\\\" || char.charCodeAt(0) < 32)) return `\"${path}\" has a backslash or another character paths can't use`;\n\tfor (const name of path.split(\"/\")) {\n\t\tif (name === \"\" || name === \".\" || name === \"..\") return `\"${path}\" has an empty, \".\" or \"..\" part. Name each folder, such as \"receipts/42.pdf\"`;\n\t\tif (name.length > MAX_NAME_LENGTH) return `\"${path}\" has a name longer than ${MAX_NAME_LENGTH} characters`;\n\t}\n\treturn null;\n}\n//#endregion\n//#region src/host/network.ts\nconst LABEL = \"[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\";\nconst NETWORK_HOST_PATTERN = new RegExp(`^(?:\\\\*\\\\.${LABEL}(?:\\\\.${LABEL})+|${LABEL}(?:\\\\.${LABEL})*)$`);\nconst NETWORK_HOST_MAX_LENGTH = 253;\nfunction isNetworkHost(value) {\n\treturn value.length <= 253 && NETWORK_HOST_PATTERN.test(value);\n}\nfunction allowsHost(hosts, host) {\n\tconst name = host.toLowerCase().replace(/\\.$/, \"\");\n\treturn hosts.some((pattern) => pattern.startsWith(\"*.\") ? name.endsWith(pattern.slice(1)) : name === pattern);\n}\n//#endregion\n//#region src/version/semantic-version.ts\nconst SEMVER_PATTERN = /^(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-]+)*))?$/;\nfunction isSemanticVersion(value) {\n\treturn typeof value === \"string\" && SEMVER_PATTERN.test(value);\n}\nfunction majorVersion(version) {\n\treturn parseVersion(version).major;\n}\nfunction isVersionAtLeast(version, minimum) {\n\treturn compareVersions(version, minimum) >= 0;\n}\nfunction isNewerMajor(version, current) {\n\treturn parseVersion(version).major > parseVersion(current).major;\n}\nfunction compareVersions(left, right) {\n\tconst leftVersion = parseVersion(left);\n\tconst rightVersion = parseVersion(right);\n\tconst differences = [\n\t\tleftVersion.major - rightVersion.major,\n\t\tleftVersion.minor - rightVersion.minor,\n\t\tleftVersion.patch - rightVersion.patch\n\t];\n\tfor (const difference of differences) if (difference !== 0) return difference;\n\treturn comparePrereleases(leftVersion.prerelease, rightVersion.prerelease);\n}\nfunction parseVersion(version) {\n\tconst match = SEMVER_PATTERN.exec(version);\n\tif (!match) throw new Error(`\"${version}\" is not a semantic version`);\n\tconst [, major, minor, patch, prerelease] = match;\n\treturn {\n\t\tmajor: Number(major),\n\t\tminor: Number(minor),\n\t\tpatch: Number(patch),\n\t\tprerelease: prerelease === void 0 ? [] : prerelease.split(\".\")\n\t};\n}\nfunction comparePrereleases(left, right) {\n\tif (left.length === 0 || right.length === 0) return right.length - left.length;\n\tconst shared = Math.min(left.length, right.length);\n\tfor (let index = 0; index < shared; index++) {\n\t\tconst order = compareIdentifiers(left[index], right[index]);\n\t\tif (order !== 0) return order;\n\t}\n\treturn left.length - right.length;\n}\nfunction compareIdentifiers(left, right) {\n\tconst leftIsNumber = /^\\d+$/.test(left);\n\tconst rightIsNumber = /^\\d+$/.test(right);\n\tif (leftIsNumber && rightIsNumber) return Number(left) - Number(right);\n\tif (leftIsNumber) return -1;\n\tif (rightIsNumber) return 1;\n\tif (left < right) return -1;\n\tif (left > right) return 1;\n\treturn 0;\n}\n//#endregion\n//#region src/host/react.ts\nconst REACT_HOST_PATH = \"/__dot/react/\";\nconst REACT_HOST_MODULES = {\n\treact: \"react.js\",\n\t\"react/jsx-runtime\": \"react-jsx-runtime.js\",\n\t\"react-dom\": \"react-dom.js\",\n\t\"react-dom/client\": \"react-dom-client.js\"\n};\nfunction reactHostUrl(dotReactVersion, file) {\n\treturn `${REACT_HOST_PATH}${majorVersion(dotReactVersion)}/${file}`;\n}\nfunction isReactCompatible(hostVersion, dotVersion) {\n\treturn majorVersion(hostVersion) === majorVersion(dotVersion) && isVersionAtLeast(hostVersion, dotVersion);\n}\nfunction newestReactOfMajor(versions, major) {\n\treturn versions.filter((version) => majorVersion(version) === major).sort(compareVersions).at(-1);\n}\n//#endregion\n//#region src/protocol/transport.ts\nfunction createAdaptorTransport(adapter) {\n\treturn {\n\t\tpost: (message) => adapter.postMessage(message),\n\t\tlisten(listener) {\n\t\t\tconst onMessage = (event) => listener(event.data);\n\t\t\tadapter.addEventListener(\"message\", onMessage);\n\t\t\treturn () => adapter.removeEventListener(\"message\", onMessage);\n\t\t}\n\t};\n}\nfunction createTransportPair() {\n\tconst firstListeners = /* @__PURE__ */ new Set();\n\tconst secondListeners = /* @__PURE__ */ new Set();\n\tconst createSide = (ownListeners, otherListeners) => ({\n\t\tpost: (message) => {\n\t\t\tconst copy = JSON.parse(JSON.stringify(message));\n\t\t\totherListeners.forEach((listener) => listener(copy));\n\t\t},\n\t\tlisten(listener) {\n\t\t\townListeners.add(listener);\n\t\t\treturn () => ownListeners.delete(listener);\n\t\t}\n\t});\n\treturn [createSide(firstListeners, secondListeners), createSide(secondListeners, firstListeners)];\n}\nconst PAGE_HOOKS = Object.keys({\n\tonLoad: true,\n\tonShow: true,\n\tonHide: true,\n\tonUnload: true\n});\n//#endregion\n//#region src/page/navigation.ts\nconst MAX_STACK_DEPTH = 16;\nconst PAGE_ID = /^[A-Za-z0-9_-]+(?:\\/[A-Za-z0-9_-]+)*$/;\nfunction isPageId(value) {\n\treturn PAGE_ID.test(value);\n}\nvar NavigationStack = class {\n\tlimit;\n\t#pages = [];\n\t#nextInstanceId = 1;\n\tconstructor(limit = 16) {\n\t\tthis.limit = limit;\n\t}\n\tget pages() {\n\t\treturn this.#pages;\n\t}\n\tget top() {\n\t\treturn this.#pages.at(-1);\n\t}\n\tapply(navigation) {\n\t\tswitch (navigation.action) {\n\t\t\tcase \"push\":\n\t\t\t\tif (this.#pages.length >= this.limit) return false;\n\t\t\t\tbreak;\n\t\t\tcase \"replace\":\n\t\t\t\tthis.#pages.pop();\n\t\t\t\tbreak;\n\t\t\tcase \"reset\":\n\t\t\t\tthis.#pages = [];\n\t\t\t\tbreak;\n\t\t\tcase \"back\": {\n\t\t\t\tconst count = Math.min(navigation.delta, this.#pages.length - 1);\n\t\t\t\tif (count < 1) return false;\n\t\t\t\tthis.#pages = this.#pages.slice(0, -count);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\tconst { page, options } = navigation;\n\t\tthis.#pages = [...this.#pages, {\n\t\t\tinstanceId: this.#nextInstanceId++,\n\t\t\tpage,\n\t\t\toptions\n\t\t}];\n\t\treturn true;\n\t}\n};\n//#endregion\n//#region src/page/state.ts\nfunction applyChanges(state, changes) {\n\tconst next = { ...state };\n\tfor (const [key, value] of Object.entries(changes)) if (value !== void 0) next[key] = value;\n\treturn next;\n}\n//#endregion\n//#region src/page/bars.ts\nconst HEX_COLOR = /^#[0-9a-fA-F]{6}$/;\nfunction checkNavigationBar(options) {\n\tconst { title, hidden, backgroundColor, textColor } = options;\n\tif (title !== void 0 && typeof title !== \"string\") throw new TypeError(\"The navigation bar's title must be text\");\n\tif (hidden !== void 0 && typeof hidden !== \"boolean\") throw new TypeError(\"The navigation bar's `hidden` must be true or false\");\n\tfor (const [name, color] of Object.entries({\n\t\tbackgroundColor,\n\t\ttextColor\n\t})) 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\"`);\n}\nfunction checkTabBar(options) {\n\tif (options.hidden !== void 0 && typeof options.hidden !== \"boolean\") throw new TypeError(\"The tab bar's `hidden` must be true or false\");\n}\nfunction checkConfigs(configs) {\n\tcheckNavigationBar(configs.navigationBar ?? {});\n\tcheckTabBar(configs.tabBar ?? {});\n}\nfunction mergeConfigs(...configs) {\n\tconst bars = {\n\t\tnavigationBar: {},\n\t\ttabBar: {}\n\t};\n\tfor (const config of configs) {\n\t\tbars.navigationBar = {\n\t\t\t...bars.navigationBar,\n\t\t\t...config?.navigationBar\n\t\t};\n\t\tbars.tabBar = {\n\t\t\t...bars.tabBar,\n\t\t\t...config?.tabBar\n\t\t};\n\t}\n\treturn bars;\n}\n//#endregion\n//#region src/messageChannel.ts\nvar MessageChannel = class {\n\t#transport;\n\t#handlers = /* @__PURE__ */ new Map();\n\tconstructor(transport) {\n\t\tthis.#transport = transport;\n\t}\n\tsend(type, payload) {\n\t\tthis.#transport.post({\n\t\t\ttype,\n\t\t\tpayload\n\t\t});\n\t}\n\thandle(type, handler) {\n\t\tconst previous = this.#handlers.get(type);\n\t\tthis.#handlers.set(type, handler);\n\t\treturn previous;\n\t}\n\tlisten(onError) {\n\t\treturn this.#transport.listen((rawMessage) => {\n\t\t\tconst message = rawMessage;\n\t\t\tconst handler = this.#handlers.get(message.type);\n\t\t\tif (!handler) {\n\t\t\t\tonError(/* @__PURE__ */ new Error(`No handler for message \"${message.type}\"`), message);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\thandler(message.payload);\n\t\t\t} catch (error) {\n\t\t\t\tonError(error, message);\n\t\t\t}\n\t\t});\n\t}\n};\n//#endregion\nexport { ASPECTS, AmountInput, BACKGROUNDS, BORDERS, BOX_PROPS, Badge, Bullet, BulletList, Button, Carousel, Checkbox, Chip, CodeInput, DEFAULT_SYSTEM_CONTEXT, DOT_FILE_PATH_MAX_LENGTH, DetailRow, Divider, EmptyState, EventEmitter, Footer, Grid, GridItem, HostError, ICON_NAMES, Icon, Image, Input, LENGTH, Link, List, ListItem, MAX_STACK_DEPTH, MessageChannel, NETWORK_HOST_MAX_LENGTH, NETWORK_HOST_PATTERN, NavigationStack, Notice, Option, PADDING_PROPS, PAGE_HOOKS, PERMISSIONS, ProgressBar, Prose, QRCode, Quote, RADII, REACT_HOST_MODULES, REACT_HOST_PATH, Radio, RadioGroup, RichText, SEMVER_PATTERN, SIZES, SPACES, STATUS_TONES, Scroll, Select, Sheet, Skeleton, Slider, SourceError, Spinner, Stack, Switch, TEXT_TONES, 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, isNewerMajor, isPageId, isPermission, isReactCompatible, isSemanticVersion, isVersionAtLeast, isWordsOr, locatedMessage, locationAt, majorVersion, mergeConfigs, newestReactOfMajor, otherThanWords, reactHostUrl, toList, toText };\n\n//# sourceMappingURL=index.js.map","export const CLIENT_PATH = '/__dot/';\nexport const EVENTS_PATH = `${CLIENT_PATH}events`;\nexport const HTTP_PATH = `${CLIENT_PATH}network/http/`;\nexport const FILE_PATH = `${CLIENT_PATH}storage/file/`;\nexport const CACHE_PATH = `${CLIENT_PATH}storage/cache/`;\nexport const SECRET_PATH = `${CLIENT_PATH}storage/secret/`;\nexport const MEDIA_PATH = `${CLIENT_PATH}media/`;\nexport const TEMPORARY_FILES_PATH = `${CLIENT_PATH}files/`;\n\nexport const DOT_PATH = '/dot/';\nexport const WEBVIEW_URL = `${DOT_PATH}ui/index.html`;\nexport const WEBVIEW_SCRIPT_URL = `${DOT_PATH}ui/dot.js`;\nexport const SERVICE_URL = `${DOT_PATH}logic/dot.js`;\nexport const MANIFEST_URL = `${DOT_PATH}manifest.json`;\n","// What the simulator page posts to the dot's worker and web view to run its new build in place.\nexport interface HotReload {\n readonly dotHotReload: number;\n}\n\nexport function hotReloadIn(data: unknown): number | undefined {\n const reload = (data as Partial<HotReload> | null)?.dotHotReload;\n return typeof reload === 'number' ? reload : undefined;\n}\n","import type { Transport } from '@monimesl/dot-core';\n\n// Native bridges only carry strings. Encoding to JSON here makes state that a device can't carry\n// fail in the simulator too.\ninterface Wire {\n readonly dot: string;\n}\n\nfunction isWire(data: unknown): data is Wire {\n return typeof (data as Partial<Wire> | null)?.dot === 'string';\n}\n\nexport function wireTransport(channel: Transport): Transport {\n return {\n post: (message) => channel.post({ dot: JSON.stringify(message) } satisfies Wire),\n listen: (listener) =>\n channel.listen((data) => {\n if (isWire(data)) {\n listener(JSON.parse(data.dot));\n }\n }),\n };\n}\n\n// The simulator page and the webview's iframe, each accepting messages only from the other.\nexport function windowChannel(other: () => Window | null): Transport {\n return {\n post: (message) => other()?.postMessage(message, location.origin),\n listen(listener) {\n const onMessage = (event: MessageEvent) => {\n if (event.source === other()) {\n listener(event.data);\n }\n };\n window.addEventListener('message', onMessage);\n return () => window.removeEventListener('message', onMessage);\n },\n };\n}\n","import type { TransportAdapter } from '@monimesl/dot-core';\nimport { createAdaptorTransport } from '@monimesl/dot-core';\n\nimport { SERVICE_URL } from '../paths';\nimport { hotReloadIn } from './hot-reload';\nimport { wireTransport } from './wire';\n\ninterface WorkerScope extends TransportAdapter {\n importScripts(...urls: string[]): void;\n}\n\nconst scope = globalThis as unknown as WorkerScope;\n\nglobalThis.__hostTransport = wireTransport(createAdaptorTransport(scope));\n\nscope.importScripts(SERVICE_URL);\n\n// The new build hands its pages to the service already running here.\nscope.addEventListener('message', ({ data }) => {\n const reload = hotReloadIn(data);\n if (reload !== undefined) {\n scope.importScripts(`${SERVICE_URL}?hot=${reload}`);\n }\n});\n"],"mappings":";;CAOA,SAAS,gBAAgB,UAAU;EAClC,OAAO;GACN,OAAO,CAAC;GACR,QAAQ,CAAC;GACT,GAAG;EACJ;CACD;CAYA,SAAS,kBAAkB,WAAW;EACrC,MAAM,WAAW,CAAC;EAClB,KAAK,MAAM,YAAY,WAAW;GACjC,IAAI,SAAS,QAAQ,UAAU,MAAM,IAAI,MAAM,cAAc,SAAS,KAAK,mBAAmB;GAC9F,SAAS,SAAS,QAAQ;EAC3B;EACA,OAAO;CACR;CAoBA,MAAM,cAAc,gBAAgB;EACnC,MAAM;EACN,OAAO;GACN,OAAO;GACP,UAAU;GACV,YAAY;GACZ,MAAM,CAAC,SAAS,OAAO;GACvB,OAAO;GACP,aAAa;GACb,MAAM;GACN,OAAO;GACP,UAAU;EACX;EACA,QAAQ,CAAC,QAAQ;EACjB,UAAU;CACX,CAAC;CAGD,MAAM,SAAS,gBAAgB;EAC9B,MAAM;EACN,OAAO;GACN,SAAS,CAAC,WAAW,WAAW;GAChC,UAAU;GACV,SAAS;EACV;EACA,QAAQ,CAAC,OAAO;EAChB,UAAU;CACX,CAAC;CAGD,MAAM,QAAQ;EACb;EACA;EACA;CACD;CACA,MAAM,SAAS;EACd;EACA;EACA;EACA;CACD;CACA,MAAM,gBAAgB;EACrB,SAAS;EACT,YAAY;EACZ,cAAc;EACd,YAAY;EACZ,eAAe;CAChB;CACA,MAAM,UAAU;EACf;EACA;EACA;EACA;EACA;EACA;EACA;CACD;CACA,MAAM,QAAQ;EACb;EACA;EACA;EACA;EACA;EACA;CACD;CACA,MAAM,aAAa;EAClB,OAAO,CAAC,GAAG,OAAO,WAAW;EAC7B,IAAI;CACL;CACA,MAAM,cAAc;EACnB,OAAO;GACN;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACD;EACA,IAAI;CACL;CACA,MAAM,UAAU;EACf;EACA;EACA;CACD;CACA,MAAM,QAAQ;EACb;EACA;EACA;EACA;EACA;CACD;CACA,MAAM,SAAS;EACd,OAAO,CAAC,MAAM;EACd,IAAI;CACL;CACA,MAAM,YAAY;EACjB,YAAY;EACZ,QAAQ;EACR,QAAQ;EACR,OAAO;EACP,QAAQ;EACR,WAAW;EACX,UAAU;EACV,QAAQ;CACT;CACA,MAAM,eAAe;EACpB;EACA;EACA;EACA;EACA;CACD;CACA,MAAM,aAAa;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD;CAGA,MAAM,WAAW,gBAAgB;EAChC,MAAM;EACN,OAAO;GACN,UAAU;GACV,UAAU;GACV,MAAM;GACN,WAAW,CAAC,QAAQ,MAAM;GAC1B,KAAK;GACL,QAAQ,CAAC,SAAS,OAAO;GACzB,OAAO;GACP,GAAG;EACJ;EACA,QAAQ,CAAC,QAAQ;EACjB,UAAU;CACX,CAAC;CAGD,MAAM,OAAO,gBAAgB;EAC5B,MAAM;EACN,OAAO;GACN,OAAO;GACP,MAAM;GACN,UAAU;GACV,UAAU;EACX;EACA,QAAQ,CAAC,KAAK;EACd,UAAU;CACX,CAAC;CAGD,MAAM,YAAY,gBAAgB;EACjC,MAAM;EACN,OAAO;GACN,OAAO;GACP,QAAQ;GACR,OAAO;GACP,MAAM;GACN,OAAO;GACP,QAAQ;GACR,UAAU;EACX;EACA,QAAQ,CAAC,UAAU,UAAU;EAC7B,UAAU;CACX,CAAC;CAGD,MAAM,YAAY,gBAAgB;EACjC,MAAM;EACN,OAAO;GACN,OAAO;GACP,OAAO;GACP,MAAM;GACN,QAAQ;IACP;IACA;IACA;GACD;GACA,GAAG;EACJ;EACA,UAAU;CACX,CAAC;CAGD,MAAM,UAAU,gBAAgB;EAC/B,MAAM;EACN,UAAU;CACX,CAAC;CAGD,MAAM,aAAa,gBAAgB;EAClC,MAAM;EACN,OAAO;GACN,MAAM;GACN,OAAO;GACP,MAAM;GACN,GAA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"}
@@ -348,6 +348,45 @@
348
348
  because: "the aspect sets the height"
349
349
  }]
350
350
  });
351
+ const Slider = defineComponent({
352
+ name: "Slider",
353
+ props: {
354
+ value: "number",
355
+ min: "number",
356
+ max: "number",
357
+ step: "number",
358
+ showValue: "boolean",
359
+ label: "string",
360
+ hint: "string",
361
+ disabled: "boolean"
362
+ },
363
+ events: ["change"],
364
+ children: "none"
365
+ });
366
+ const Prose = defineComponent({
367
+ name: "Prose",
368
+ props: { ...PADDING_PROPS },
369
+ children: "elements"
370
+ });
371
+ const Quote = defineComponent({
372
+ name: "Quote",
373
+ props: { cite: "string" },
374
+ children: "elements"
375
+ });
376
+ const BulletList = defineComponent({
377
+ name: "BulletList",
378
+ props: { ordered: "boolean" },
379
+ children: "elements"
380
+ });
381
+ const Bullet = defineComponent({
382
+ name: "Bullet",
383
+ children: "elements"
384
+ });
385
+ const RichText = defineComponent({
386
+ name: "RichText",
387
+ props: { markdown: "string" },
388
+ children: "none"
389
+ });
351
390
  const Input = defineComponent({
352
391
  name: "Input",
353
392
  props: {
@@ -508,6 +547,7 @@
508
547
  "display",
509
548
  "title",
510
549
  "subtitle",
550
+ "lead",
511
551
  "body",
512
552
  "caption"
513
553
  ],
@@ -529,6 +569,13 @@
529
569
  "strikethrough"
530
570
  ],
531
571
  numeric: "boolean",
572
+ leading: [
573
+ "tight",
574
+ "normal",
575
+ "relaxed"
576
+ ],
577
+ italic: "boolean",
578
+ selectable: "boolean",
532
579
  ...PADDING_PROPS
533
580
  },
534
581
  children: "text",
@@ -622,6 +669,8 @@
622
669
  const builtinComponents = {
623
670
  AmountInput,
624
671
  Badge,
672
+ Bullet,
673
+ BulletList,
625
674
  Button,
626
675
  Carousel,
627
676
  Checkbox,
@@ -642,13 +691,17 @@
642
691
  Notice,
643
692
  Option,
644
693
  ProgressBar,
694
+ Prose,
645
695
  QRCode,
696
+ Quote,
646
697
  Radio,
647
698
  RadioGroup,
699
+ RichText,
648
700
  Scroll,
649
701
  Select,
650
702
  Sheet,
651
703
  Skeleton,
704
+ Slider,
652
705
  Spinner,
653
706
  Stack: defineComponent({
654
707
  name: "Stack",
@@ -1054,7 +1107,7 @@
1054
1107
  }
1055
1108
  //#endregion
1056
1109
  //#region src/versions.ts
1057
- const SIMULATOR_VERSIONS = { runtimeVersion: "0.1.0-alpha.16" };
1110
+ const SIMULATOR_VERSIONS = { runtimeVersion: "0.1.0-alpha.18" };
1058
1111
  //#endregion
1059
1112
  //#region src/paths.ts
1060
1113
  const CLIENT_PATH = "/__dot/";
@@ -1325,6 +1378,56 @@
1325
1378
  });
1326
1379
  }
1327
1380
  //#endregion
1381
+ //#region src/client/dash/pickers.ts
1382
+ const DATE = /^\d{4}-\d{2}-\d{2}$/;
1383
+ const TIME = /^\d{2}:\d{2}$/;
1384
+ function pickDate(phone, note, params, signal) {
1385
+ const { title, value, min, max } = params ?? {};
1386
+ for (const [name, date] of Object.entries({
1387
+ value,
1388
+ min,
1389
+ max
1390
+ })) if (date !== void 0 && !DATE.test(date)) throw new HostError("invalid", `"${name}" must be a date such as "2026-10-24", not "${date}"`);
1391
+ if (min && max && min > max) throw new HostError("invalid", `"min" (${min}) is after "max" (${max})`);
1392
+ return pick(phone, note, signal, {
1393
+ type: "date",
1394
+ title: title ?? "Choose a date",
1395
+ value,
1396
+ min,
1397
+ max
1398
+ });
1399
+ }
1400
+ function pickTime(phone, note, params, signal) {
1401
+ const { title, value } = params ?? {};
1402
+ if (value !== void 0 && !TIME.test(value)) throw new HostError("invalid", `"value" must be a time such as "19:30", not "${value}"`);
1403
+ return pick(phone, note, signal, {
1404
+ type: "time",
1405
+ title: title ?? "Choose a time",
1406
+ value
1407
+ });
1408
+ }
1409
+ async function pick(phone, note, signal, { type, title, value, min, max }) {
1410
+ const field = createElement("input", "dialog-input");
1411
+ field.type = type;
1412
+ field.value = value ?? "";
1413
+ field.min = min ?? "";
1414
+ field.max = max ?? "";
1415
+ const { action } = await alert(phone, {
1416
+ title,
1417
+ actions: [{
1418
+ id: "cancel",
1419
+ label: "Cancel",
1420
+ role: "cancel"
1421
+ }, {
1422
+ id: "done",
1423
+ label: "Done"
1424
+ }]
1425
+ }, signal, field);
1426
+ if (action !== "done" || field.value === "") throw new HostError("cancelled", `No ${type} was chosen`);
1427
+ note(`${type}: ${field.value}`);
1428
+ return field.value;
1429
+ }
1430
+ //#endregion
1328
1431
  //#region src/client/dash/index.ts
1329
1432
  const HTTP_METHODS = [
1330
1433
  "request",
@@ -1361,6 +1464,8 @@
1361
1464
  function dashHandlers(phone, note) {
1362
1465
  return {
1363
1466
  "dash.ui.alert": ({ params, signal }) => alert(phone, params, signal),
1467
+ "dash.ui.pickDate": ({ params, signal }) => pickDate(phone, note, params, signal),
1468
+ "dash.ui.pickTime": ({ params, signal }) => pickTime(phone, note, params, signal),
1364
1469
  "dash.system.vibrate": ({ params }) => vibrate(phone, note, params),
1365
1470
  "dash.system.torch": ({ params }) => torch(phone, note, params.state),
1366
1471
  "dash.system.copyText": ({ params }) => copyText(note, params.text),
@@ -1 +1 @@
1
- {"version":3,"file":"simulator.js","names":["simulatorPackage.version"],"sources":["../../../../core/dist/index.js","../../src/compatibility.ts","../../src/host-calls.ts","../../src/permissions.ts","../../src/host.ts","../../package.json","../../src/versions.ts","../../src/paths.ts","../../src/client/dash/dev-server.ts","../../src/limits.ts","../../src/client/dom.ts","../../src/client/dash/ui.ts","../../src/client/dash/media.ts","../../src/client/dash/system.ts","../../src/client/dash/index.ts","../../src/client/dash/permissions.ts","../../src/client/wire.ts","../../src/client/simulator.ts"],"sourcesContent":["//#region src/view/component.ts\nfunction isWordsOr(type) {\n\treturn typeof type === \"object\" && !Array.isArray(type);\n}\nfunction otherThanWords(type) {\n\treturn type.or === \"number\" ? \"a number\" : \"a colour from the theme's custom colours\";\n}\nfunction defineComponent(manifest) {\n\treturn {\n\t\tprops: {},\n\t\tevents: [],\n\t\t...manifest\n\t};\n}\nfunction eventProp(event) {\n\treturn `on${event.charAt(0).toUpperCase()}${event.slice(1)}`;\n}\nfunction isEventProp(name) {\n\tconst letterAfterOn = name.charAt(2);\n\treturn name.startsWith(\"on\") && letterAfterOn >= \"A\" && letterAfterOn <= \"Z\";\n}\nfunction eventName(prop) {\n\tconst name = prop.slice(2);\n\treturn name.charAt(0).toLowerCase() + name.slice(1);\n}\nfunction componentRegistry(manifests) {\n\tconst registry = {};\n\tfor (const manifest of manifests) {\n\t\tif (manifest.name in registry) throw new Error(`Component <${manifest.name}> is defined twice`);\n\t\tregistry[manifest.name] = manifest;\n\t}\n\treturn registry;\n}\n//#endregion\n//#region src/view/values.ts\nfunction toText(value) {\n\tswitch (typeof value) {\n\t\tcase \"string\": return value;\n\t\tcase \"number\":\n\t\tcase \"boolean\":\n\t\tcase \"bigint\": return String(value);\n\t\tcase \"object\": return value === null ? \"\" : JSON.stringify(value);\n\t\tdefault: return \"\";\n\t}\n}\nfunction toList(value) {\n\tif (Array.isArray(value)) return value;\n\tif (typeof value === \"object\" && value !== null && Symbol.iterator in value) return Array.from(value);\n\treturn [];\n}\n//#endregion\n//#region src/view/components/amount-input.ts\nconst AmountInput = defineComponent({\n\tname: \"AmountInput\",\n\tprops: {\n\t\tvalue: \"number\",\n\t\tcurrency: \"string\",\n\t\tminorUnits: \"number\",\n\t\tunit: [\"minor\", \"major\"],\n\t\tlabel: \"string\",\n\t\tplaceholder: \"string\",\n\t\thint: \"string\",\n\t\terror: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/button.ts\nconst Button = defineComponent({\n\tname: \"Button\",\n\tprops: {\n\t\tvariant: [\"primary\", \"secondary\"],\n\t\tdisabled: \"boolean\",\n\t\tloading: \"boolean\"\n\t},\n\tevents: [\"click\"],\n\tchildren: \"text\"\n});\n//#endregion\n//#region src/view/components/options.ts\nconst SIZES = [\n\t\"small\",\n\t\"medium\",\n\t\"large\"\n];\nconst SPACES = [\n\t\"none\",\n\t\"small\",\n\t\"medium\",\n\t\"large\"\n];\nconst PADDING_PROPS = {\n\tpadding: SPACES,\n\tpaddingTop: SPACES,\n\tpaddingStart: SPACES,\n\tpaddingEnd: SPACES,\n\tpaddingBottom: SPACES\n};\nconst ASPECTS = [\n\t\"1:1\",\n\t\"4:3\",\n\t\"3:2\",\n\t\"16:9\",\n\t\"3:4\",\n\t\"2:3\",\n\t\"9:16\"\n];\nconst TONES = [\n\t\"default\",\n\t\"muted\",\n\t\"info\",\n\t\"success\",\n\t\"warning\",\n\t\"danger\"\n];\nconst TEXT_TONES = {\n\twords: [...TONES, \"onPrimary\"],\n\tor: \"themeColor\"\n};\nconst BACKGROUNDS = {\n\twords: [\n\t\t\"background\",\n\t\t\"surface\",\n\t\t\"primary\",\n\t\t\"muted\",\n\t\t\"info\",\n\t\t\"success\",\n\t\t\"warning\",\n\t\t\"danger\"\n\t],\n\tor: \"themeColor\"\n};\nconst BORDERS = [\n\t\"none\",\n\t\"subtle\",\n\t\"strong\"\n];\nconst RADII = [\n\t\"none\",\n\t\"small\",\n\t\"medium\",\n\t\"large\",\n\t\"full\"\n];\nconst LENGTH = {\n\twords: [\"fill\"],\n\tor: \"number\"\n};\nconst BOX_PROPS = {\n\tbackground: BACKGROUNDS,\n\tborder: BORDERS,\n\tradius: RADII,\n\twidth: LENGTH,\n\theight: LENGTH,\n\tminHeight: \"number\",\n\tmaxWidth: \"number\",\n\taspect: ASPECTS\n};\nconst STATUS_TONES = [\n\t\"default\",\n\t\"info\",\n\t\"success\",\n\t\"warning\",\n\t\"danger\"\n];\nconst ICON_NAMES = [\n\t\"arrow-down\",\n\t\"arrow-left\",\n\t\"arrow-right\",\n\t\"arrow-up\",\n\t\"bank\",\n\t\"bell\",\n\t\"bolt\",\n\t\"calendar\",\n\t\"card\",\n\t\"cart\",\n\t\"cash\",\n\t\"check\",\n\t\"chevron-down\",\n\t\"chevron-left\",\n\t\"chevron-right\",\n\t\"chevron-up\",\n\t\"clock\",\n\t\"close\",\n\t\"copy\",\n\t\"download\",\n\t\"edit\",\n\t\"error\",\n\t\"external-link\",\n\t\"eye\",\n\t\"eye-off\",\n\t\"file\",\n\t\"gift\",\n\t\"globe\",\n\t\"grid\",\n\t\"headphones\",\n\t\"heart\",\n\t\"help\",\n\t\"history\",\n\t\"home\",\n\t\"image\",\n\t\"info\",\n\t\"link\",\n\t\"list\",\n\t\"location\",\n\t\"lock\",\n\t\"logout\",\n\t\"mail\",\n\t\"microphone\",\n\t\"minus\",\n\t\"mobile\",\n\t\"more\",\n\t\"music\",\n\t\"phone\",\n\t\"playlist\",\n\t\"plus\",\n\t\"qr-code\",\n\t\"receipt\",\n\t\"refresh\",\n\t\"search\",\n\t\"send\",\n\t\"settings\",\n\t\"share\",\n\t\"star\",\n\t\"success\",\n\t\"ticket\",\n\t\"trash\",\n\t\"upload\",\n\t\"user\",\n\t\"users\",\n\t\"video\",\n\t\"wallet\",\n\t\"warning\",\n\t\"water\",\n\t\"wifi\"\n];\n//#endregion\n//#region src/view/components/carousel.ts\nconst Carousel = defineComponent({\n\tname: \"Carousel\",\n\tprops: {\n\t\tautoplay: \"boolean\",\n\t\tinterval: \"number\",\n\t\tloop: \"boolean\",\n\t\tindicator: [\"dots\", \"none\"],\n\t\tgap: SPACES,\n\t\teffect: [\"slide\", \"scale\"],\n\t\tindex: \"number\",\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"change\"],\n\tchildren: \"elements\"\n});\n//#endregion\n//#region src/view/components/chip.ts\nconst Chip = defineComponent({\n\tname: \"Chip\",\n\tprops: {\n\t\tlabel: \"string\",\n\t\ticon: ICON_NAMES,\n\t\tselected: \"boolean\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"tap\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/code-input.ts\nconst CodeInput = defineComponent({\n\tname: \"CodeInput\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlength: \"number\",\n\t\tlabel: \"string\",\n\t\thint: \"string\",\n\t\terror: \"string\",\n\t\tsecure: \"boolean\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\", \"complete\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/detail-row.ts\nconst DetailRow = defineComponent({\n\tname: \"DetailRow\",\n\tprops: {\n\t\tlabel: \"string\",\n\t\tvalue: \"string\",\n\t\ttone: TONES,\n\t\tweight: [\n\t\t\t\"regular\",\n\t\t\t\"medium\",\n\t\t\t\"bold\"\n\t\t],\n\t\t...PADDING_PROPS\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/divider.ts\nconst Divider = defineComponent({\n\tname: \"Divider\",\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/empty-state.ts\nconst EmptyState = defineComponent({\n\tname: \"EmptyState\",\n\tprops: {\n\t\ticon: ICON_NAMES,\n\t\ttitle: \"string\",\n\t\ttext: \"string\",\n\t\t...PADDING_PROPS\n\t},\n\tchildren: \"elements\"\n});\n//#endregion\n//#region src/view/components/feedback.ts\nconst Spinner = defineComponent({\n\tname: \"Spinner\",\n\tprops: { size: SIZES },\n\tchildren: \"none\"\n});\nconst ProgressBar = defineComponent({\n\tname: \"ProgressBar\",\n\tprops: { value: \"number\" },\n\tchildren: \"none\"\n});\nconst Notice = defineComponent({\n\tname: \"Notice\",\n\tprops: {\n\t\ttone: STATUS_TONES,\n\t\ttitle: \"string\",\n\t\t...PADDING_PROPS\n\t},\n\tchildren: \"text\"\n});\nconst Badge = defineComponent({\n\tname: \"Badge\",\n\tprops: { tone: STATUS_TONES },\n\tchildren: \"text\"\n});\n//#endregion\n//#region src/view/components/footer.ts\nconst Footer = defineComponent({\n\tname: \"Footer\",\n\tprops: PADDING_PROPS,\n\tchildren: \"elements\"\n});\n//#endregion\n//#region src/view/components/grid.ts\nconst Grid = defineComponent({\n\tname: \"Grid\",\n\tprops: {\n\t\tcolumns: \"number\",\n\t\tgap: SPACES,\n\t\t...PADDING_PROPS\n\t},\n\tchildren: \"elements\"\n});\nconst GridItem = defineComponent({\n\tname: \"GridItem\",\n\tprops: {\n\t\tlabel: \"string\",\n\t\ticon: ICON_NAMES,\n\t\timage: \"string\",\n\t\tbadge: \"string\"\n\t},\n\tevents: [\"tap\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/icon.ts\nconst Icon = defineComponent({\n\tname: \"Icon\",\n\tprops: {\n\t\tname: ICON_NAMES,\n\t\tsize: SIZES,\n\t\ttone: TONES\n\t},\n\tchildren: \"none\",\n\tinline: true\n});\n//#endregion\n//#region src/view/components/image.ts\nconst Image = defineComponent({\n\tname: \"Image\",\n\tprops: {\n\t\tsrc: \"string\",\n\t\talt: \"string\",\n\t\twidth: \"number\",\n\t\theight: \"number\",\n\t\tfit: [\"cover\", \"contain\"],\n\t\tshape: [\n\t\t\t\"rounded\",\n\t\t\t\"square\",\n\t\t\t\"circle\"\n\t\t],\n\t\taspect: ASPECTS\n\t},\n\tevents: [\"load\", \"error\"],\n\tchildren: \"none\",\n\toverrides: [{\n\t\tprop: \"aspect\",\n\t\tignores: \"height\",\n\t\tbecause: \"the aspect sets the height\"\n\t}]\n});\n//#endregion\n//#region src/view/components/input.ts\nconst Input = defineComponent({\n\tname: \"Input\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tplaceholder: \"string\",\n\t\tlabel: \"string\",\n\t\thint: \"string\",\n\t\terror: \"string\",\n\t\tprefix: \"string\",\n\t\tsuffix: \"string\",\n\t\ttype: [\n\t\t\t\"text\",\n\t\t\t\"number\",\n\t\t\t\"email\",\n\t\t\t\"phone\",\n\t\t\t\"password\"\n\t\t],\n\t\tmaxLength: \"number\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\", \"submit\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/link.ts\nconst Link = defineComponent({\n\tname: \"Link\",\n\tprops: {\n\t\thref: \"string\",\n\t\ttone: TONES\n\t},\n\tevents: [\"tap\"],\n\tchildren: \"text\",\n\tinline: true\n});\n//#endregion\n//#region src/view/components/list.ts\nconst List = defineComponent({\n\tname: \"List\",\n\tprops: {\n\t\tsize: [\"sm\", \"md\"],\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"endReached\"],\n\tchildren: \"elements\"\n});\nconst ListItem = defineComponent({\n\tname: \"ListItem\",\n\tprops: {\n\t\ttitle: \"string\",\n\t\tsubtitle: \"string\",\n\t\tvalue: \"string\",\n\t\ticon: ICON_NAMES,\n\t\timage: \"string\",\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"tap\"],\n\tchildren: \"elements\"\n});\n//#endregion\n//#region src/view/components/overlays.ts\nconst Sheet = defineComponent({\n\tname: \"Sheet\",\n\tprops: {\n\t\topen: \"boolean\",\n\t\ttitle: \"string\",\n\t\tshowCloseIcon: \"boolean\",\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"close\"],\n\tchildren: \"elements\"\n});\nconst Toast = defineComponent({\n\tname: \"Toast\",\n\tprops: {\n\t\tmessage: \"string\",\n\t\ttone: STATUS_TONES,\n\t\tduration: \"number\"\n\t},\n\tevents: [\"hide\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/qr-code.ts\nconst QRCode = defineComponent({\n\tname: \"QRCode\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tsize: \"number\",\n\t\tlabel: \"string\"\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/select.ts\nconst Select = defineComponent({\n\tname: \"Select\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlabel: \"string\",\n\t\tplaceholder: \"string\",\n\t\thint: \"string\",\n\t\terror: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"elements\"\n});\nconst Option = defineComponent({\n\tname: \"Option\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlabel: \"string\"\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/scroll.ts\nconst Scroll = defineComponent({\n\tname: \"Scroll\",\n\tprops: {\n\t\tgap: SPACES,\n\t\tsnap: [\n\t\t\t\"none\",\n\t\t\t\"start\",\n\t\t\t\"center\"\n\t\t],\n\t\tindex: \"number\",\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"change\"],\n\tchildren: \"elements\"\n});\n//#endregion\n//#region src/view/components/skeleton.ts\nconst Skeleton = defineComponent({\n\tname: \"Skeleton\",\n\tprops: {\n\t\tshape: [\n\t\t\t\"text\",\n\t\t\t\"circle\",\n\t\t\t\"box\"\n\t\t],\n\t\tlines: \"number\",\n\t\theight: \"number\"\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/tabs.ts\nconst Tabs = defineComponent({\n\tname: \"Tabs\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tvariant: [\"underline\", \"segmented\"],\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"change\"],\n\tchildren: \"elements\"\n});\nconst Tab = defineComponent({\n\tname: \"Tab\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlabel: \"string\",\n\t\tbadge: \"number\"\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/text.ts\nconst Text = defineComponent({\n\tname: \"Text\",\n\tprops: {\n\t\tvariant: [\n\t\t\t\"display\",\n\t\t\t\"title\",\n\t\t\t\"subtitle\",\n\t\t\t\"body\",\n\t\t\t\"caption\"\n\t\t],\n\t\ttone: TEXT_TONES,\n\t\tweight: [\n\t\t\t\"regular\",\n\t\t\t\"medium\",\n\t\t\t\"bold\"\n\t\t],\n\t\talign: [\n\t\t\t\"start\",\n\t\t\t\"center\",\n\t\t\t\"end\"\n\t\t],\n\t\tmaxLines: \"number\",\n\t\tdecoration: [\n\t\t\t\"none\",\n\t\t\t\"underline\",\n\t\t\t\"strikethrough\"\n\t\t],\n\t\tnumeric: \"boolean\",\n\t\t...PADDING_PROPS\n\t},\n\tchildren: \"text\",\n\tinline: true\n});\n//#endregion\n//#region src/view/components/text-area.ts\nconst TextArea = defineComponent({\n\tname: \"TextArea\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tplaceholder: \"string\",\n\t\tlabel: \"string\",\n\t\thint: \"string\",\n\t\terror: \"string\",\n\t\trows: \"number\",\n\t\tmaxLength: \"number\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/toggles.ts\nconst Switch = defineComponent({\n\tname: \"Switch\",\n\tprops: {\n\t\tchecked: \"boolean\",\n\t\tlabel: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"none\"\n});\nconst Checkbox = defineComponent({\n\tname: \"Checkbox\",\n\tprops: {\n\t\tchecked: \"boolean\",\n\t\tlabel: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"none\"\n});\nconst RadioGroup = defineComponent({\n\tname: \"RadioGroup\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlabel: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"elements\"\n});\nconst Radio = defineComponent({\n\tname: \"Radio\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlabel: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/view.ts\nconst View = defineComponent({\n\tname: \"View\",\n\tprops: {\n\t\tgap: SPACES,\n\t\tdirection: [\"column\", \"row\"],\n\t\talign: [\n\t\t\t\"stretch\",\n\t\t\t\"start\",\n\t\t\t\"center\",\n\t\t\t\"end\"\n\t\t],\n\t\tjustify: [\n\t\t\t\"start\",\n\t\t\t\"center\",\n\t\t\t\"end\",\n\t\t\t\"between\"\n\t\t],\n\t\twrap: \"boolean\",\n\t\tgrow: \"boolean\",\n\t\t...PADDING_PROPS,\n\t\tvariant: [\"plain\", \"card\"],\n\t\t...BOX_PROPS\n\t},\n\tevents: [\"tap\"],\n\tchildren: \"elements\",\n\toverrides: [{\n\t\tprop: \"aspect\",\n\t\tignores: \"height\",\n\t\tbecause: \"the aspect sets the height\"\n\t}]\n});\nconst Stack = defineComponent({\n\tname: \"Stack\",\n\tprops: {\n\t\tradius: BOX_PROPS.radius,\n\t\twidth: BOX_PROPS.width,\n\t\theight: BOX_PROPS.height,\n\t\taspect: BOX_PROPS.aspect\n\t},\n\tchildren: \"elements\",\n\toverrides: [{\n\t\tprop: \"aspect\",\n\t\tignores: \"height\",\n\t\tbecause: \"the aspect sets the height\"\n\t}]\n});\n//#endregion\n//#region src/view/components/index.ts\nconst builtinComponents = {\n\tAmountInput,\n\tBadge,\n\tButton,\n\tCarousel,\n\tCheckbox,\n\tChip,\n\tCodeInput,\n\tDetailRow,\n\tDivider,\n\tEmptyState,\n\tFooter,\n\tGrid,\n\tGridItem,\n\tIcon,\n\tImage,\n\tInput,\n\tLink,\n\tList,\n\tListItem,\n\tNotice,\n\tOption,\n\tProgressBar,\n\tQRCode,\n\tRadio,\n\tRadioGroup,\n\tScroll,\n\tSelect,\n\tSheet,\n\tSkeleton,\n\tSpinner,\n\tStack,\n\tSwitch,\n\tTab,\n\tTabs,\n\tText,\n\tTextArea,\n\tToast,\n\tView\n};\nconst builtinRegistry = componentRegistry(Object.values(builtinComponents));\n//#endregion\n//#region src/source/location.ts\nfunction createLocator(source) {\n\tconst lineStarts = [0];\n\tfor (let index = 0; index < source.length; index++) if (source[index] === \"\\n\") lineStarts.push(index + 1);\n\treturn (offset) => {\n\t\tlet low = 0;\n\t\tlet high = lineStarts.length - 1;\n\t\twhile (low < high) {\n\t\t\tconst middle = Math.floor((low + high + 1) / 2);\n\t\t\tif (lineStarts[middle] <= offset) low = middle;\n\t\t\telse high = middle - 1;\n\t\t}\n\t\treturn {\n\t\t\tline: low + 1,\n\t\t\tcolumn: offset - lineStarts[low] + 1,\n\t\t\toffset\n\t\t};\n\t};\n}\nfunction locationAt(source, offset) {\n\treturn createLocator(source)(offset);\n}\nfunction locatedMessage(message, file, location) {\n\tconst where = [\n\t\tfile,\n\t\tlocation?.line,\n\t\tlocation?.column\n\t].filter((part) => part !== void 0).join(\":\");\n\treturn where ? `${where}: ${message}` : message;\n}\n//#endregion\n//#region src/source/error.ts\nvar SourceError = class extends Error {\n\treason;\n\tfile;\n\tloc;\n\tconstructor(reason, file, location) {\n\t\tsuper(locatedMessage(reason, file, location));\n\t\tthis.reason = reason;\n\t\tthis.file = file;\n\t\tthis.loc = location;\n\t}\n};\n//#endregion\n//#region src/event/emitter.ts\nvar EventEmitter = class {\n\t#listeners = /* @__PURE__ */ new Map();\n\ton(name, listener) {\n\t\tconst listeners = this.#listeners.get(name) ?? /* @__PURE__ */ new Set();\n\t\tthis.#listeners.set(name, listeners);\n\t\tlisteners.add(listener);\n\t\treturn () => listeners.delete(listener);\n\t}\n\temit(name, ...args) {\n\t\tthis.#listeners.get(name)?.forEach((listener) => listener(...args));\n\t}\n};\n//#endregion\n//#region src/event/core.ts\nfunction createEvent(type, detail = {}, data = {}) {\n\treturn {\n\t\ttype,\n\t\tdetail,\n\t\tdata\n\t};\n}\n//#endregion\n//#region src/host/host.ts\nfunction hostTransport() {\n\tconst transport = globalThis.__hostTransport;\n\tif (!transport) throw new Error(\"No Dot host found: `globalThis.__hostTransport` is not set. Run the dot in the Dash app, or in the simulator with `dotctl dev`.\");\n\treturn transport;\n}\n//#endregion\n//#region src/host/context.ts\nconst DEFAULT_SYSTEM_CONTEXT = {\n\tscheme: \"light\",\n\tappState: \"active\"\n};\n//#endregion\n//#region src/host/calls.ts\nvar HostError = class extends Error {\n\tname = \"HostError\";\n\tcode;\n\tconstructor(code, message) {\n\t\tsuper(message);\n\t\tthis.code = code;\n\t}\n};\nlet connectedCaller = null;\nfunction connectHost(caller) {\n\tconnectedCaller = caller;\n}\nfunction callHost(method, params, options = {}) {\n\tif (!connectedCaller) {\n\t\tconst error = new HostError(\"unsupported\", `Can't run \"${method}\" here: call Dash from the dot's logic`);\n\t\treturn createHostRequest(Promise.reject(error));\n\t}\n\treturn connectedCaller(method, params, options);\n}\nfunction createHostRequest(promise, cancel = () => {}) {\n\tconst request = promise;\n\trequest.cancel = cancel;\n\treturn request;\n}\n//#endregion\n//#region src/host/permissions.ts\nconst PERMISSIONS = [\n\t\"account\",\n\t\"camera\",\n\t\"photoLibrary\",\n\t\"files\"\n];\nfunction isPermission(value) {\n\treturn PERMISSIONS.includes(value);\n}\n//#endregion\n//#region src/host/files.ts\nconst DOT_FILE_PATH_MAX_LENGTH = 512;\nconst MAX_NAME_LENGTH = 255;\nfunction dotFilePathProblem(path, { allowRoot = false } = {}) {\n\tif (path === \"\") return allowRoot ? null : \"A path is needed, such as \\\"receipts/42.pdf\\\"\";\n\tif (path.length > 512) return `\"${path.slice(0, 40)}…\" is longer than 512 characters`;\n\tif (path.startsWith(\"/\")) return `\"${path}\" starts with \"/\". Start paths without it, such as \"receipts/42.pdf\"`;\n\tif ([...path].some((char) => char === \"\\\\\" || char.charCodeAt(0) < 32)) return `\"${path}\" has a backslash or another character paths can't use`;\n\tfor (const name of path.split(\"/\")) {\n\t\tif (name === \"\" || name === \".\" || name === \"..\") return `\"${path}\" has an empty, \".\" or \"..\" part. Name each folder, such as \"receipts/42.pdf\"`;\n\t\tif (name.length > MAX_NAME_LENGTH) return `\"${path}\" has a name longer than ${MAX_NAME_LENGTH} characters`;\n\t}\n\treturn null;\n}\n//#endregion\n//#region src/host/network.ts\nconst LABEL = \"[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\";\nconst NETWORK_HOST_PATTERN = new RegExp(`^(?:\\\\*\\\\.${LABEL}(?:\\\\.${LABEL})+|${LABEL}(?:\\\\.${LABEL})*)$`);\nconst NETWORK_HOST_MAX_LENGTH = 253;\nfunction isNetworkHost(value) {\n\treturn value.length <= 253 && NETWORK_HOST_PATTERN.test(value);\n}\nfunction allowsHost(hosts, host) {\n\tconst name = host.toLowerCase().replace(/\\.$/, \"\");\n\treturn hosts.some((pattern) => pattern.startsWith(\"*.\") ? name.endsWith(pattern.slice(1)) : name === pattern);\n}\n//#endregion\n//#region src/version/semantic-version.ts\nconst SEMVER_PATTERN = /^(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-]+)*))?$/;\nfunction isSemanticVersion(value) {\n\treturn typeof value === \"string\" && SEMVER_PATTERN.test(value);\n}\nfunction majorVersion(version) {\n\treturn parseVersion(version).major;\n}\nfunction isVersionAtLeast(version, minimum) {\n\treturn compareVersions(version, minimum) >= 0;\n}\nfunction isNewerMajor(version, current) {\n\treturn parseVersion(version).major > parseVersion(current).major;\n}\nfunction compareVersions(left, right) {\n\tconst leftVersion = parseVersion(left);\n\tconst rightVersion = parseVersion(right);\n\tconst differences = [\n\t\tleftVersion.major - rightVersion.major,\n\t\tleftVersion.minor - rightVersion.minor,\n\t\tleftVersion.patch - rightVersion.patch\n\t];\n\tfor (const difference of differences) if (difference !== 0) return difference;\n\treturn comparePrereleases(leftVersion.prerelease, rightVersion.prerelease);\n}\nfunction parseVersion(version) {\n\tconst match = SEMVER_PATTERN.exec(version);\n\tif (!match) throw new Error(`\"${version}\" is not a semantic version`);\n\tconst [, major, minor, patch, prerelease] = match;\n\treturn {\n\t\tmajor: Number(major),\n\t\tminor: Number(minor),\n\t\tpatch: Number(patch),\n\t\tprerelease: prerelease === void 0 ? [] : prerelease.split(\".\")\n\t};\n}\nfunction comparePrereleases(left, right) {\n\tif (left.length === 0 || right.length === 0) return right.length - left.length;\n\tconst shared = Math.min(left.length, right.length);\n\tfor (let index = 0; index < shared; index++) {\n\t\tconst order = compareIdentifiers(left[index], right[index]);\n\t\tif (order !== 0) return order;\n\t}\n\treturn left.length - right.length;\n}\nfunction compareIdentifiers(left, right) {\n\tconst leftIsNumber = /^\\d+$/.test(left);\n\tconst rightIsNumber = /^\\d+$/.test(right);\n\tif (leftIsNumber && rightIsNumber) return Number(left) - Number(right);\n\tif (leftIsNumber) return -1;\n\tif (rightIsNumber) return 1;\n\tif (left < right) return -1;\n\tif (left > right) return 1;\n\treturn 0;\n}\n//#endregion\n//#region src/host/react.ts\nconst REACT_HOST_PATH = \"/__dot/react/\";\nconst REACT_HOST_MODULES = {\n\treact: \"react.js\",\n\t\"react/jsx-runtime\": \"react-jsx-runtime.js\",\n\t\"react-dom\": \"react-dom.js\",\n\t\"react-dom/client\": \"react-dom-client.js\"\n};\nfunction reactHostUrl(dotReactVersion, file) {\n\treturn `${REACT_HOST_PATH}${majorVersion(dotReactVersion)}/${file}`;\n}\nfunction isReactCompatible(hostVersion, dotVersion) {\n\treturn majorVersion(hostVersion) === majorVersion(dotVersion) && isVersionAtLeast(hostVersion, dotVersion);\n}\nfunction newestReactOfMajor(versions, major) {\n\treturn versions.filter((version) => majorVersion(version) === major).sort(compareVersions).at(-1);\n}\n//#endregion\n//#region src/protocol/transport.ts\nfunction createAdaptorTransport(adapter) {\n\treturn {\n\t\tpost: (message) => adapter.postMessage(message),\n\t\tlisten(listener) {\n\t\t\tconst onMessage = (event) => listener(event.data);\n\t\t\tadapter.addEventListener(\"message\", onMessage);\n\t\t\treturn () => adapter.removeEventListener(\"message\", onMessage);\n\t\t}\n\t};\n}\nfunction createTransportPair() {\n\tconst firstListeners = /* @__PURE__ */ new Set();\n\tconst secondListeners = /* @__PURE__ */ new Set();\n\tconst createSide = (ownListeners, otherListeners) => ({\n\t\tpost: (message) => {\n\t\t\tconst copy = JSON.parse(JSON.stringify(message));\n\t\t\totherListeners.forEach((listener) => listener(copy));\n\t\t},\n\t\tlisten(listener) {\n\t\t\townListeners.add(listener);\n\t\t\treturn () => ownListeners.delete(listener);\n\t\t}\n\t});\n\treturn [createSide(firstListeners, secondListeners), createSide(secondListeners, firstListeners)];\n}\nconst PAGE_HOOKS = Object.keys({\n\tonLoad: true,\n\tonShow: true,\n\tonHide: true,\n\tonUnload: true\n});\n//#endregion\n//#region src/page/navigation.ts\nconst MAX_STACK_DEPTH = 16;\nconst PAGE_ID = /^[A-Za-z0-9_-]+(?:\\/[A-Za-z0-9_-]+)*$/;\nfunction isPageId(value) {\n\treturn PAGE_ID.test(value);\n}\nvar NavigationStack = class {\n\tlimit;\n\t#pages = [];\n\t#nextInstanceId = 1;\n\tconstructor(limit = 16) {\n\t\tthis.limit = limit;\n\t}\n\tget pages() {\n\t\treturn this.#pages;\n\t}\n\tget top() {\n\t\treturn this.#pages.at(-1);\n\t}\n\tapply(navigation) {\n\t\tswitch (navigation.action) {\n\t\t\tcase \"push\":\n\t\t\t\tif (this.#pages.length >= this.limit) return false;\n\t\t\t\tbreak;\n\t\t\tcase \"replace\":\n\t\t\t\tthis.#pages.pop();\n\t\t\t\tbreak;\n\t\t\tcase \"reset\":\n\t\t\t\tthis.#pages = [];\n\t\t\t\tbreak;\n\t\t\tcase \"back\": {\n\t\t\t\tconst count = Math.min(navigation.delta, this.#pages.length - 1);\n\t\t\t\tif (count < 1) return false;\n\t\t\t\tthis.#pages = this.#pages.slice(0, -count);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\tconst { page, options } = navigation;\n\t\tthis.#pages = [...this.#pages, {\n\t\t\tinstanceId: this.#nextInstanceId++,\n\t\t\tpage,\n\t\t\toptions\n\t\t}];\n\t\treturn true;\n\t}\n};\n//#endregion\n//#region src/page/state.ts\nfunction applyChanges(state, changes) {\n\tconst next = { ...state };\n\tfor (const [key, value] of Object.entries(changes)) if (value !== void 0) next[key] = value;\n\treturn next;\n}\n//#endregion\n//#region src/page/bars.ts\nconst HEX_COLOR = /^#[0-9a-fA-F]{6}$/;\nfunction checkNavigationBar(options) {\n\tconst { title, hidden, backgroundColor, textColor } = options;\n\tif (title !== void 0 && typeof title !== \"string\") throw new TypeError(\"The navigation bar's title must be text\");\n\tif (hidden !== void 0 && typeof hidden !== \"boolean\") throw new TypeError(\"The navigation bar's `hidden` must be true or false\");\n\tfor (const [name, color] of Object.entries({\n\t\tbackgroundColor,\n\t\ttextColor\n\t})) 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\"`);\n}\nfunction checkTabBar(options) {\n\tif (options.hidden !== void 0 && typeof options.hidden !== \"boolean\") throw new TypeError(\"The tab bar's `hidden` must be true or false\");\n}\nfunction checkConfigs(configs) {\n\tcheckNavigationBar(configs.navigationBar ?? {});\n\tcheckTabBar(configs.tabBar ?? {});\n}\nfunction mergeConfigs(...configs) {\n\tconst bars = {\n\t\tnavigationBar: {},\n\t\ttabBar: {}\n\t};\n\tfor (const config of configs) {\n\t\tbars.navigationBar = {\n\t\t\t...bars.navigationBar,\n\t\t\t...config?.navigationBar\n\t\t};\n\t\tbars.tabBar = {\n\t\t\t...bars.tabBar,\n\t\t\t...config?.tabBar\n\t\t};\n\t}\n\treturn bars;\n}\n//#endregion\n//#region src/messageChannel.ts\nvar MessageChannel = class {\n\t#transport;\n\t#handlers = /* @__PURE__ */ new Map();\n\tconstructor(transport) {\n\t\tthis.#transport = transport;\n\t}\n\tsend(type, payload) {\n\t\tthis.#transport.post({\n\t\t\ttype,\n\t\t\tpayload\n\t\t});\n\t}\n\thandle(type, handler) {\n\t\tconst previous = this.#handlers.get(type);\n\t\tthis.#handlers.set(type, handler);\n\t\treturn previous;\n\t}\n\tlisten(onError) {\n\t\treturn this.#transport.listen((rawMessage) => {\n\t\t\tconst message = rawMessage;\n\t\t\tconst handler = this.#handlers.get(message.type);\n\t\t\tif (!handler) {\n\t\t\t\tonError(/* @__PURE__ */ new Error(`No handler for message \"${message.type}\"`), message);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\thandler(message.payload);\n\t\t\t} catch (error) {\n\t\t\t\tonError(error, message);\n\t\t\t}\n\t\t});\n\t}\n};\n//#endregion\nexport { ASPECTS, AmountInput, BACKGROUNDS, BORDERS, BOX_PROPS, Badge, Button, Carousel, Checkbox, Chip, CodeInput, DEFAULT_SYSTEM_CONTEXT, DOT_FILE_PATH_MAX_LENGTH, DetailRow, Divider, EmptyState, EventEmitter, Footer, Grid, GridItem, HostError, ICON_NAMES, Icon, Image, Input, LENGTH, Link, List, ListItem, MAX_STACK_DEPTH, MessageChannel, NETWORK_HOST_MAX_LENGTH, NETWORK_HOST_PATTERN, NavigationStack, Notice, Option, PADDING_PROPS, PAGE_HOOKS, PERMISSIONS, ProgressBar, QRCode, RADII, REACT_HOST_MODULES, REACT_HOST_PATH, Radio, RadioGroup, SEMVER_PATTERN, SIZES, SPACES, STATUS_TONES, Scroll, Select, Sheet, Skeleton, SourceError, Spinner, Stack, Switch, TEXT_TONES, 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, isNewerMajor, isPageId, isPermission, isReactCompatible, isSemanticVersion, isVersionAtLeast, isWordsOr, locatedMessage, locationAt, majorVersion, mergeConfigs, newestReactOfMajor, otherThanWords, reactHostUrl, toList, toText };\n\n//# sourceMappingURL=index.js.map","import { isNewerMajor, isReactCompatible } from '@monimesl/dot-core';\n\nimport type { HostManifest } from './manifest';\n\nexport type IncompatibilityReason = 'runtimeTooNew' | 'reactUnavailable';\n\nexport interface HostVersions {\n // The @monimesl/dot-runtime this host is released with. Dots built with a newer major version need\n // a newer host. A newer minor or patch is fine.\n readonly runtimeVersion: string;\n // The React versions the host ships. A host that serves the React the dot was built with, such as\n // the simulator, leaves it out.\n readonly reactVersions?: readonly string[] | undefined;\n}\n\n// Thrown when a host can't run a dot. `reason` names the check that failed.\nexport class IncompatibleDotError extends Error {\n override readonly name = 'IncompatibleDotError';\n readonly reason: IncompatibilityReason;\n\n constructor(reason: IncompatibilityReason, message: string) {\n super(message);\n this.reason = reason;\n }\n}\n\n// Throws an IncompatibleDotError when a host with these versions cannot run the dot.\nexport function checkCompatibility(\n manifest: HostManifest,\n { runtimeVersion, reactVersions }: HostVersions,\n): void {\n if (isNewerMajor(manifest.runtime, runtimeVersion)) {\n throw new IncompatibleDotError(\n 'runtimeTooNew',\n `This dot was built with Dot runtime ${manifest.runtime}, which is newer than this Dash ` +\n 'supports. Update Dash to open it.',\n );\n }\n if (\n reactVersions !== undefined &&\n !reactVersions.some((version) => isReactCompatible(version, manifest.react))\n ) {\n throw new IncompatibleDotError(\n 'reactUnavailable',\n `This dot needs React ${manifest.react}, which this host doesn't have.`,\n );\n }\n}\n","import type {\n DotPermission,\n HostErrorCode,\n HostResult,\n LogicLayerMessages,\n} from '@monimesl/dot-core';\nimport { HostError } from '@monimesl/dot-core';\n\nimport type { PermissionGate } from './permissions';\n\nexport interface HostCall {\n readonly method: string;\n readonly params: unknown;\n // Aborted when the call ends early: cancelled, out of time, or dismissed with its page.\n readonly signal: AbortSignal;\n}\n\n// Runs one host method. Throw a `HostError` to fail with its code; anything else fails as `failed`.\nexport type HostHandler = (call: HostCall) => unknown;\n\n// A method that needs a permission: it runs only if the dot declared it and the person allowed it.\n// A method whose permission depends on its params, such as the photo's source, picks it from them.\nexport interface PermissionedHandler {\n readonly permission: DotPermission | ((params: unknown) => DotPermission);\n readonly handle: HostHandler;\n}\n\nexport type HostHandlers = Readonly<Record<string, HostHandler | PermissionedHandler>>;\n\nconst UI_METHOD_PREFIX = 'dash.ui.';\n\ninterface RunningCall {\n readonly method: string;\n readonly controller: AbortController;\n timer?: ReturnType<typeof setTimeout>;\n}\n\n// Runs the service's host calls with `handlers`, and answers each one exactly once.\nexport class HostCallRunner {\n readonly #handlers: HostHandlers;\n readonly #permissions: PermissionGate;\n readonly #answer: (result: HostResult) => void;\n readonly #running = new Map<number, RunningCall>();\n\n constructor(\n handlers: HostHandlers,\n permissions: PermissionGate,\n answer: (result: HostResult) => void,\n ) {\n this.#handlers = handlers;\n this.#permissions = permissions;\n this.#answer = answer;\n }\n\n run({ id, method, params, timeout }: LogicLayerMessages['hostCall']): void {\n const entry = this.#handlers[method];\n if (!entry) {\n this.#answer({\n id,\n error: { code: 'unsupported', message: `This host doesn't support \"${method}\"` },\n });\n return;\n }\n const call: RunningCall = { method, controller: new AbortController() };\n if (timeout !== undefined) {\n call.timer = setTimeout(() => {\n this.#fail(id, new HostError('timeout', `\"${method}\" took longer than ${timeout}ms`));\n }, timeout);\n }\n this.#running.set(id, call);\n void this.#invoke(id, entry, { method, params, signal: call.controller.signal });\n }\n\n // The service stopped waiting, so the call ends without an answer.\n cancel(id: number): void {\n this.#end(id)?.controller.abort();\n }\n\n // Dialogs belong to the page on top. When that page changes, any dialog still open is dismissed.\n dismissUI(): void {\n for (const [id, call] of this.#running) {\n if (call.method.startsWith(UI_METHOD_PREFIX)) {\n this.#fail(\n id,\n new HostError('cancelled', 'The page that showed this dialog is no longer on screen'),\n );\n }\n }\n }\n\n async #invoke(\n id: number,\n entry: HostHandler | PermissionedHandler,\n call: HostCall,\n ): Promise<void> {\n try {\n if (typeof entry === 'function') {\n this.#succeed(id, await entry(call));\n return;\n }\n const permission =\n typeof entry.permission === 'function' ? entry.permission(call.params) : entry.permission;\n await this.#permissions.check(call.method, permission, call.signal);\n this.#succeed(id, await entry.handle(call));\n } catch (error) {\n this.#fail(id, error);\n }\n }\n\n #succeed(id: number, value: unknown): void {\n if (this.#end(id)) {\n this.#answer({ id, value });\n }\n }\n\n #fail(id: number, error: unknown): void {\n const call = this.#end(id);\n if (!call) {\n return;\n }\n call.controller.abort();\n this.#answer({ id, error: describeError(error) });\n }\n\n #end(id: number): RunningCall | undefined {\n const call = this.#running.get(id);\n if (call) {\n this.#running.delete(id);\n clearTimeout(call.timer);\n }\n return call;\n }\n}\n\nfunction describeError(error: unknown): { code: HostErrorCode; message: string } {\n if (error instanceof HostError) {\n return { code: error.code, message: error.message };\n }\n return { code: 'failed', message: error instanceof Error ? error.message : String(error) };\n}\n","import type { DotPermission } from '@monimesl/dot-core';\nimport { HostError } from '@monimesl/dot-core';\n\n// A dot asking for a permission it declared, the first time a call needs it.\nexport interface PermissionRequest {\n readonly dotName: string;\n readonly permission: DotPermission;\n // Why the dot needs it, from its dot.json.\n readonly reason: string;\n}\n\n// Each permission a dot declared in its dot.json, with the reason Dash shows the person.\nexport type DeclaredPermissions = Readonly<Partial<Record<string, string>>>;\n\n// Asks the person, and resolves with whether they allowed it. `signal` aborts if the call that needs\n// the permission ends first. The host then takes its prompt down and rejects.\nexport type AskPermission = (request: PermissionRequest, signal: AbortSignal) => Promise<boolean>;\n\n// Lets a call that needs a permission through only if the dot declared it and the person allowed\n// it. The person is asked once per run, and their answer is kept.\nexport class PermissionGate {\n readonly #dotName: string;\n readonly #declared: DeclaredPermissions;\n readonly #ask: AskPermission;\n readonly #answers = new Map<DotPermission, boolean>();\n\n constructor(dotName: string, declared: DeclaredPermissions, ask: AskPermission) {\n this.#dotName = dotName;\n this.#declared = declared;\n this.#ask = ask;\n }\n\n // Rejects with a `denied` HostError when the call may not run.\n async check(method: string, permission: DotPermission, signal: AbortSignal): Promise<void> {\n const reason = this.#declared[permission];\n if (reason === undefined) {\n throw new HostError(\n 'denied',\n `\"${method}\" needs the \"${permission}\" permission. Add it to permissions in dot.json, with a reason to show the person.`,\n );\n }\n let allowed = this.#answers.get(permission);\n if (allowed === undefined) {\n allowed = await this.#ask({ dotName: this.#dotName, permission, reason }, signal);\n this.#answers.set(permission, allowed);\n }\n if (!allowed) {\n throw new HostError('denied', `The person didn't allow the \"${permission}\" permission`);\n }\n }\n}\n","import type {\n Envelope,\n HostLayerMessages,\n HostResult,\n LogicLayerMessages,\n Navigation,\n PageBars,\n StackEntry,\n SystemContext,\n Transport,\n} from '@monimesl/dot-core';\nimport { NavigationStack } from '@monimesl/dot-core';\n\nimport type { HostVersions } from './compatibility';\nimport { checkCompatibility } from './compatibility';\nimport type { HostHandlers } from './host-calls';\nimport { HostCallRunner } from './host-calls';\nimport type { HostManifest } from './manifest';\nimport type { AskPermission } from './permissions';\nimport { PermissionGate } from './permissions';\n\nexport type Direction = 'toService' | 'toWebview' | 'toHost' | 'fromHost';\n\n// What Dash's bars show for the page on top. The title is the dot's name unless the page set one.\nexport interface HostBars {\n readonly title: string;\n readonly navigationBarHidden: boolean;\n // As #RRGGBB, or undefined for Dash's own colors.\n readonly navigationBarColor: string | undefined;\n readonly navigationBarTextColor: string | undefined;\n readonly tabBarHidden: boolean;\n}\n\nexport interface HostOptions extends HostVersions {\n ui: Transport;\n logic: Transport;\n manifest: HostManifest;\n systemContext: SystemContext;\n // The methods dots may call, such as `dash.ui.alert`. Any other method fails as `unsupported`.\n handlers?: HostHandlers | undefined;\n // Asks the person for a permission the dot declared, the first time a method needs it.\n askPermission: AskPermission;\n observe?: ((direction: Direction, message: Envelope) => void) | undefined;\n // Opened in place of the dot's first page, such as the pages open before it reloaded. Pages the\n // dot no longer has are left out.\n restorePages?: readonly StackEntry[] | undefined;\n onBarsChange?: ((bars: HostBars, pages: readonly StackEntry[]) => void) | undefined;\n}\n\nexport interface Host {\n // The open pages, first page first.\n readonly pages: readonly StackEntry[];\n stop(): void;\n // Returns false on the first page, where a device closes the dot instead.\n back(): boolean;\n setSystemContext(context: SystemContext): void;\n}\n\n// The host contract in JavaScript. Native hosts implement the same contract in Swift or Kotlin.\n// Throws an IncompatibleDotError if it can't run the dot, before either layer hears anything.\nexport function startHost({\n logic,\n ui,\n manifest,\n runtimeVersion,\n systemContext,\n handlers = {},\n askPermission,\n observe,\n restorePages = [],\n onBarsChange,\n}: HostOptions): Host {\n checkCompatibility(manifest, { runtimeVersion });\n const stack = new NavigationStack();\n let context = systemContext;\n const permissions = new PermissionGate(manifest.name, manifest.permissions ?? {}, askPermission);\n const calls = new HostCallRunner(handlers, permissions, (result) => {\n const message: Envelope<'hostResult', HostResult> = { type: 'hostResult', payload: result };\n observe?.('fromHost', message);\n logic.post(message);\n });\n const broadcast = (message: Envelope) => {\n observe?.('fromHost', message);\n ui.post(message);\n logic.post(message);\n };\n const barsByInstance = new Map<number, PageBars>();\n const showBars = () => {\n const top = stack.top;\n const bars = top && barsByInstance.get(top.instanceId);\n onBarsChange?.(\n {\n title: bars?.navigationBar.title ?? manifest.name,\n navigationBarHidden: bars?.navigationBar.hidden ?? false,\n navigationBarColor: bars?.navigationBar.backgroundColor,\n navigationBarTextColor: bars?.navigationBar.textColor,\n tabBarHidden: bars?.tabBar.hidden ?? false,\n },\n stack.pages,\n );\n };\n const syncStack = () => {\n const message: Envelope<'syncStack', HostLayerMessages['syncStack']> = {\n type: 'syncStack',\n payload: { pages: stack.pages, limit: stack.limit },\n };\n broadcast(message);\n const open = new Set(stack.pages.map((entry) => entry.instanceId));\n for (const instanceId of barsByInstance.keys()) {\n if (!open.has(instanceId)) {\n barsByInstance.delete(instanceId);\n }\n }\n showBars();\n };\n const syncSystemContext = () => {\n const message: Envelope<'syncSystemContext', HostLayerMessages['syncSystemContext']> = {\n type: 'syncSystemContext',\n payload: context,\n };\n broadcast(message);\n };\n const navigate = (navigation: Navigation): boolean => {\n if (navigation.action !== 'back' && !manifest.pages.includes(navigation.page)) {\n return false;\n }\n const previousTop = stack.top;\n if (!stack.apply(navigation)) {\n return false;\n }\n syncStack();\n if (stack.top !== previousTop) {\n calls.dismissUI();\n }\n return true;\n };\n\n const openFirstPages = () => {\n const [first, ...rest] = restorePages.filter((entry) => manifest.pages.includes(entry.page));\n if (!first) {\n navigate({ action: 'reset', page: manifest.entry, options: {} });\n return;\n }\n stack.apply({ action: 'reset', page: first.page, options: first.options });\n for (const entry of rest) {\n stack.apply({ action: 'push', page: entry.page, options: entry.options });\n }\n syncStack();\n };\n\n // Only the page on top may navigate. A request from a page below it is dropped.\n const navigateFromPage = ({ from, ...navigation }: LogicLayerMessages['navigate']) => {\n if (from === stack.top?.instanceId) {\n navigate(navigation);\n }\n };\n // Service messages meant for the host itself. Every other message is relayed to the webview.\n const hostMessageHandlers = new Map<string, (payload: unknown) => void>([\n ['navigate', (payload) => navigateFromPage(payload as LogicLayerMessages['navigate'])],\n ['hostCall', (payload) => calls.run(payload as LogicLayerMessages['hostCall'])],\n ['hostCancel', (payload) => calls.cancel((payload as LogicLayerMessages['hostCancel']).id)],\n [\n 'pageBars',\n (payload) => {\n const { instanceId, ...bars } = payload as LogicLayerMessages['pageBars'];\n barsByInstance.set(instanceId, bars);\n showBars();\n },\n ],\n ]);\n\n const stopService = logic.listen((raw) => {\n const message = raw as Envelope;\n const handleHostMessage = hostMessageHandlers.get(message.type);\n if (handleHostMessage) {\n observe?.('toHost', message);\n handleHostMessage(message.payload);\n return;\n }\n observe?.('toWebview', message);\n ui.post(message);\n });\n const stopWebview = ui.listen((raw) => {\n const message = raw as Envelope;\n observe?.('toService', message);\n logic.post(message);\n if (message.type === 'connect') {\n syncSystemContext();\n openFirstPages();\n }\n });\n return {\n get pages() {\n return stack.pages;\n },\n back: () => navigate({ action: 'back', delta: 1 }),\n setSystemContext: (next) => {\n context = next;\n syncSystemContext();\n },\n stop: () => {\n stopService();\n stopWebview();\n },\n };\n}\n","","import simulatorPackage from '../package.json' with { type: 'json' };\n\nimport type { HostVersions } from './compatibility';\n\n// The simulator is released with the runtime, at the same version.\nexport const SIMULATOR_VERSIONS: HostVersions = {\n runtimeVersion: simulatorPackage.version,\n};\n","export const CLIENT_PATH = '/__dot/';\nexport const EVENTS_PATH = `${CLIENT_PATH}events`;\nexport const HTTP_PATH = `${CLIENT_PATH}network/http/`;\nexport const FILE_PATH = `${CLIENT_PATH}storage/file/`;\nexport const CACHE_PATH = `${CLIENT_PATH}storage/cache/`;\nexport const SECRET_PATH = `${CLIENT_PATH}storage/secret/`;\nexport const MEDIA_PATH = `${CLIENT_PATH}media/`;\nexport const TEMPORARY_FILES_PATH = `${CLIENT_PATH}files/`;\n\nexport const DOT_PATH = '/dot/';\nexport const WEBVIEW_URL = `${DOT_PATH}ui/index.html`;\nexport const WEBVIEW_SCRIPT_URL = `${DOT_PATH}ui/dot.js`;\nexport const SERVICE_URL = `${DOT_PATH}logic/dot.js`;\nexport const MANIFEST_URL = `${DOT_PATH}manifest.json`;\n","import type { HostErrorCode } from '@monimesl/dot-core';\nimport { HostError } from '@monimesl/dot-core';\n\ntype Answer<Result> = { result: Result } | { error: { code: HostErrorCode; message: string } };\n\n// Runs a Dash call on the dev server, as a native host runs it on the device.\nexport async function callDevServer<Result>(\n path: string,\n params: unknown,\n signal: AbortSignal,\n): Promise<Result> {\n const response = await fetch(path, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(params),\n signal,\n });\n const answer = (await response.json()) as Answer<Result>;\n if ('error' in answer) {\n throw new HostError(answer.error.code, answer.error.message);\n }\n return answer.result;\n}\n","// The largest file dash.storage.file.pick gives a dot, as on a phone.\nexport const MAX_PICKED_FILE_SIZE = 25 * 1024 * 1024;\n\nexport function tooLargeMessage(name: string): string {\n return `\"${name}\" is larger than 25 MB`;\n}\n","export function element<T extends Element>(selector: string): T {\n const node = document.querySelector<T>(selector);\n if (!node) {\n throw new Error(`The simulator page is missing ${selector}`);\n }\n return node;\n}\n\nexport function createElement<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n className: string,\n text?: string,\n): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n node.className = className;\n if (text !== undefined) {\n node.textContent = text;\n }\n return node;\n}\n","import { HostError } from '@monimesl/dot-core';\nimport type { AlertAction, AlertOptions, AlertResult } from '@monimesl/dot-dash';\n\nimport { createElement } from '../dom';\n\n// dash.ui.alert always sends actions, but a host doesn't trust what the service sends.\nconst DEFAULT_ACTIONS: AlertAction[] = [{ id: 'ok', label: 'OK' }];\n\n// `field`, when given, shows under the message. Enter in it chooses the last action.\nexport function alert(\n phone: HTMLElement,\n options: AlertOptions,\n signal: AbortSignal,\n field?: HTMLInputElement,\n): Promise<AlertResult> {\n return new Promise((resolve, reject) => {\n const layer = createElement('div', 'dialog-layer');\n const dialog = createElement('div', 'dialog');\n dialog.setAttribute('role', 'alertdialog');\n const body = createElement('div', 'dialog-body');\n body.append(createElement('div', 'dialog-title', options.title));\n if (options.message) {\n body.append(createElement('div', 'dialog-message', options.message));\n }\n if (field) {\n body.append(field);\n }\n const actions = options.actions ?? DEFAULT_ACTIONS;\n // Two actions sit side by side, as on iOS; more are stacked.\n const buttons = createElement(\n 'div',\n actions.length === 2 ? 'dialog-actions' : 'dialog-actions stacked',\n );\n for (const action of actions) {\n const button = createElement('button', action.role ?? 'default', action.label);\n button.addEventListener('click', () => {\n layer.remove();\n resolve({ action: action.id });\n });\n buttons.append(button);\n }\n dialog.append(body, buttons);\n layer.append(dialog);\n field?.addEventListener('keydown', (event) => {\n if (event.key === 'Enter') {\n (buttons.lastElementChild as HTMLButtonElement | null)?.click();\n }\n });\n signal.addEventListener('abort', () => {\n layer.remove();\n reject(new HostError('cancelled', 'The alert was dismissed'));\n });\n phone.append(layer);\n field?.focus();\n });\n}\n","import type { DotPermission } from '@monimesl/dot-core';\nimport { HostError } from '@monimesl/dot-core';\nimport type { DashMethods, DotFile, PhotoSource, ScannedCode } from '@monimesl/dot-dash';\n\nimport { MAX_PICKED_FILE_SIZE, tooLargeMessage } from '../../limits';\nimport { MEDIA_PATH } from '../../paths';\nimport { createElement } from '../dom';\nimport { callDevServer } from './dev-server';\nimport { alert } from './ui';\n\ntype PickPhotoParams = DashMethods['dash.media.pickPhoto']['params'];\ntype PickFileParams = DashMethods['dash.storage.file.pick']['params'];\n\n// The same limit and quality as DotHost on a phone.\nconst MAX_PHOTO_SIDE = 2048;\nconst JPEG_QUALITY = 0.85;\n\nexport function photoPermission(params: unknown): DotPermission {\n return photoSource(params) === 'camera' ? 'camera' : 'photoLibrary';\n}\n\n// A computer rarely has a camera, so both sources choose a file. The photo is redrawn as a JPEG,\n// which drops its location and other details, as a phone does.\nexport async function pickPhoto(\n phone: HTMLElement,\n note: (text: string) => void,\n params: unknown,\n signal: AbortSignal,\n): Promise<DotFile> {\n const source = photoSource(params);\n await allowPicker(phone, source === 'camera' ? 'Take a photo' : 'Choose a photo', signal);\n const file = await chooseFile('image/*', signal);\n const jpeg = await toJpeg(file);\n const name = jpegName(file.name);\n note(`photo (${source}): ${name}`);\n return keepOnDevServer('photo', { name, data: await base64(jpeg) }, signal);\n}\n\nexport async function pickFile(\n phone: HTMLElement,\n note: (text: string) => void,\n params: unknown,\n signal: AbortSignal,\n): Promise<DotFile> {\n const types = fileTypes(params);\n await allowPicker(phone, 'Choose a file', signal);\n const file = await chooseFile(types.join(','), signal);\n if (file.size > MAX_PICKED_FILE_SIZE) {\n throw new HostError('invalid', tooLargeMessage(file.name));\n }\n note(`file: ${file.name}`);\n const contentType = file.type || 'application/octet-stream';\n return keepOnDevServer(\n 'file',\n { name: file.name, contentType, data: await base64(file) },\n signal,\n );\n}\n\n// A computer has no scanner to point at a code, so the simulator asks for the text it holds.\nexport async function scanCode(\n phone: HTMLElement,\n note: (text: string) => void,\n signal: AbortSignal,\n): Promise<ScannedCode> {\n const field = createElement('input', 'dialog-input');\n field.placeholder = 'https://monime.io/pay/…';\n const { action } = await alert(\n phone,\n {\n title: 'Scan a QR code',\n message: 'Type or paste the text the code holds.',\n actions: [\n { id: 'cancel', label: 'Cancel', role: 'cancel' },\n { id: 'scan', label: 'Scan' },\n ],\n },\n signal,\n field,\n );\n const text = field.value.trim();\n if (action !== 'scan' || text === '') {\n throw new HostError('cancelled', 'No code was scanned');\n }\n note(`scanned: ${text}`);\n return { text, format: 'qr' };\n}\n\n// The photo's own name as a JPEG's. \"IMG_2041.HEIC\" becomes \"IMG_2041.jpg\".\nfunction jpegName(fileName: string): string {\n const dot = fileName.lastIndexOf('.');\n const withoutExtension = dot > 0 ? fileName.slice(0, dot) : fileName;\n return `${withoutExtension || 'photo'}.jpg`;\n}\n\nfunction photoSource(params: unknown): PhotoSource {\n const source = (params as Partial<PickPhotoParams> | null)?.source;\n if (source !== 'library' && source !== 'camera') {\n throw new HostError('invalid', '\"source\" must be \"library\" or \"camera\"');\n }\n return source;\n}\n\nfunction fileTypes(params: unknown): string[] {\n const types = (params as Partial<PickFileParams> | null)?.types ?? [];\n if (\n !Array.isArray(types) ||\n types.some((type) => typeof type !== 'string' || !type.includes('/'))\n ) {\n throw new HostError(\n 'invalid',\n '\"types\" must list content types, such as \"application/pdf\" or \"image/*\"',\n );\n }\n return types;\n}\n\n// The browser opens its file picker only soon after a tap. A call that comes later asks for one.\nasync function allowPicker(phone: HTMLElement, title: string, signal: AbortSignal): Promise<void> {\n if (navigator.userActivation.isActive) {\n return;\n }\n const { action } = await alert(\n phone,\n {\n title,\n message: 'The simulator picks a file from this computer.',\n actions: [\n { id: 'cancel', label: 'Cancel', role: 'cancel' },\n { id: 'choose', label: 'Choose' },\n ],\n },\n signal,\n );\n if (action !== 'choose') {\n throw new HostError('cancelled', 'Nothing was chosen');\n }\n}\n\nfunction chooseFile(accept: string, signal: AbortSignal): Promise<File> {\n return new Promise((resolve, reject) => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = accept;\n input.addEventListener('change', () => {\n const file = input.files?.[0];\n if (file) {\n resolve(file);\n } else {\n reject(new HostError('cancelled', 'Nothing was chosen'));\n }\n });\n input.addEventListener('cancel', () => {\n reject(new HostError('cancelled', 'Nothing was chosen'));\n });\n signal.addEventListener('abort', () => {\n reject(new HostError('cancelled', 'The call ended before anything was chosen'));\n });\n input.click();\n });\n}\n\nasync function toJpeg(file: File): Promise<Blob> {\n let image: ImageBitmap;\n try {\n image = await createImageBitmap(file, { imageOrientation: 'from-image' });\n } catch {\n throw new HostError('failed', `\"${file.name}\" isn't a photo the simulator can read`);\n }\n const scale = Math.min(1, MAX_PHOTO_SIDE / Math.max(image.width, image.height));\n const canvas = new OffscreenCanvas(\n Math.round(image.width * scale),\n Math.round(image.height * scale),\n );\n const context = canvas.getContext('2d');\n if (!context) {\n throw new HostError('failed', \"The browser couldn't draw the photo\");\n }\n context.drawImage(image, 0, 0, canvas.width, canvas.height);\n image.close();\n return canvas.convertToBlob({ type: 'image/jpeg', quality: JPEG_QUALITY });\n}\n\n// The dev server keeps what the person chose as a temporary file, as a phone does.\nfunction keepOnDevServer(\n kind: 'photo' | 'file',\n params: { name: string; contentType?: string; data: string },\n signal: AbortSignal,\n): Promise<DotFile> {\n return callDevServer<DotFile>(`${MEDIA_PATH}${kind}`, params, signal);\n}\n\n// A data URL is \"data:<type>;base64,<data>\", so the data is what follows the comma.\nfunction base64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.addEventListener('load', () => {\n const url = reader.result as string;\n resolve(url.slice(url.indexOf(',') + 1));\n });\n reader.addEventListener('error', () =>\n reject(new HostError('failed', \"The file couldn't be read\")),\n );\n reader.readAsDataURL(blob);\n });\n}\n","import type { DashMethods, TorchState, VibrateOptions } from '@monimesl/dot-dash';\nimport { HostError } from '@monimesl/dot-core';\n\nexport type ShareParams = DashMethods['dash.system.share']['params'];\n\nconst SHAKE_DURATION_MS = 300;\n\nconst SHAKE: Keyframe[] = [\n { transform: 'translateX(0)' },\n { transform: 'translateX(-5px)' },\n { transform: 'translateX(5px)' },\n { transform: 'translateX(-3px)' },\n { transform: 'translateX(3px)' },\n { transform: 'translateX(0)' },\n];\n\nexport async function vibrate(\n phone: HTMLElement,\n note: (text: string) => void,\n options: VibrateOptions,\n): Promise<void> {\n note(`vibrated: ${options.style}`);\n await phone.animate(SHAKE, { duration: SHAKE_DURATION_MS }).finished;\n}\n\nexport function torch(phone: HTMLElement, note: (text: string) => void, state: TorchState): void {\n phone.dataset.torch = state;\n note(`torch: ${state}`);\n}\n\nexport async function copyText(note: (text: string) => void, text: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(text);\n } catch (error) {\n throw new HostError('failed', `The browser blocked the clipboard: ${(error as Error).message}`);\n }\n note(`copied: ${text}`);\n}\n\n// Logs what a device's share sheet would get.\nexport function share(note: (text: string) => void, params: ShareParams): void {\n const parts = [params.text, params.url, params.file && `file ${params.file}`].filter(Boolean);\n if (parts.length === 0) {\n throw new HostError('invalid', 'share needs a text, a url or a file');\n }\n note(`shared: ${parts.join(' · ')}`);\n}\n\n// Opens the address in a new tab, as Dash opens it in the device's browser.\nexport function openUrl(note: (text: string) => void, url: string): void {\n if (!isHttps(url)) {\n throw new HostError('invalid', `Dash only opens https addresses, not ${url}`);\n }\n window.open(url, '_blank', 'noopener');\n note(`opened: ${url}`);\n}\n\nfunction isHttps(url: string): boolean {\n try {\n return new URL(url).protocol === 'https:';\n } catch {\n return false;\n }\n}\n\nexport function delay(milliseconds: number, signal: AbortSignal): Promise<void> {\n if (!Number.isFinite(milliseconds) || milliseconds < 0) {\n throw new HostError(\n 'invalid',\n `A delay is a number of milliseconds, 0 or more, not ${milliseconds}`,\n );\n }\n return new Promise((resolve) => {\n const timer = setTimeout(resolve, milliseconds);\n signal.addEventListener('abort', () => clearTimeout(timer));\n });\n}\n","import type { AlertOptions, TorchState, VibrateOptions } from '@monimesl/dot-dash';\n\nimport type { HostCall, HostHandlers } from '../../host-calls';\nimport { CACHE_PATH, FILE_PATH, HTTP_PATH, SECRET_PATH } from '../../paths';\nimport { callDevServer } from './dev-server';\nimport { photoPermission, pickFile, pickPhoto, scanCode } from './media';\nimport type { ShareParams } from './system';\nimport { copyText, delay, openUrl, share, torch, vibrate } from './system';\nimport { alert } from './ui';\n\nconst HTTP_METHODS = ['request', 'download', 'upload'] as const;\n\nconst FILE_OPERATIONS = [\n 'read',\n 'write',\n 'stat',\n 'list',\n 'createFolder',\n 'move',\n 'copy',\n 'remove',\n 'save',\n 'open',\n 'usage',\n] as const;\n\nconst CACHE_OPERATIONS = ['get', 'set', 'remove', 'exists', 'keys', 'clear'] as const;\n\nconst SECRET_OPERATIONS = ['get', 'set', 'remove', 'clear'] as const;\n\n// Stand-ins for what a device does natively. Network and storage calls go to the dev server.\nexport function dashHandlers(phone: HTMLElement, note: (text: string) => void): HostHandlers {\n return {\n 'dash.ui.alert': ({ params, signal }) => alert(phone, params as AlertOptions, signal),\n 'dash.system.vibrate': ({ params }) => vibrate(phone, note, params as VibrateOptions),\n 'dash.system.torch': ({ params }) =>\n torch(phone, note, (params as { state: TorchState }).state),\n 'dash.system.copyText': ({ params }) => copyText(note, (params as { text: string }).text),\n 'dash.system.share': ({ params }) => share(note, params as ShareParams),\n 'dash.system.openUrl': ({ params }) => openUrl(note, (params as { url: string }).url),\n 'dash.system.delay': ({ params, signal }) =>\n delay((params as { milliseconds: number }).milliseconds, signal),\n 'dash.media.pickPhoto': {\n permission: photoPermission,\n handle: ({ params, signal }) => pickPhoto(phone, note, params, signal),\n },\n 'dash.media.scanCode': {\n permission: 'camera',\n handle: ({ signal }) => scanCode(phone, note, signal),\n },\n 'dash.storage.file.pick': {\n permission: 'files',\n handle: ({ params, signal }) => pickFile(phone, note, params, signal),\n },\n ...devServerHandlers('dash.network.http', HTTP_PATH, HTTP_METHODS),\n ...devServerHandlers('dash.storage.file', FILE_PATH, FILE_OPERATIONS),\n ...devServerHandlers('dash.storage.cache', CACHE_PATH, CACHE_OPERATIONS),\n ...devServerHandlers('dash.storage.secret', SECRET_PATH, SECRET_OPERATIONS),\n };\n}\n\nfunction devServerHandlers(group: string, path: string, names: readonly string[]): HostHandlers {\n return Object.fromEntries(\n names.map((name) => [\n `${group}.${name}`,\n ({ params, signal }: HostCall) => callDevServer(`${path}${name}`, params, signal),\n ]),\n );\n}\n","import type { DotPermission } from '@monimesl/dot-core';\n\nimport type { PermissionRequest } from '../../permissions';\nimport { alert } from './ui';\n\n// Finishes \"Allow “Counter” to …?\".\nconst PERMISSION_SUMMARIES: Record<DotPermission, string> = {\n account: 'see your Dash account: your name, and your email or phone',\n camera: 'use your camera to take photos and scan codes',\n photoLibrary: 'use photos you choose from your library',\n files: 'use files you choose from your phone',\n};\n\n// Asks as Dash would, with the dot's name, what it wants, and the reason from its dot.json.\nexport async function askPermission(\n phone: HTMLElement,\n note: (text: string) => void,\n request: PermissionRequest,\n signal: AbortSignal,\n): Promise<boolean> {\n const { action } = await alert(\n phone,\n {\n title: `Allow “${request.dotName}” to ${PERMISSION_SUMMARIES[request.permission]}?`,\n message: request.reason,\n actions: [\n { id: 'deny', label: \"Don't Allow\", role: 'cancel' },\n { id: 'allow', label: 'Allow' },\n ],\n },\n signal,\n );\n const allowed = action === 'allow';\n if (allowed) {\n note(`permission ${request.permission}: allowed`);\n } else {\n note(`permission ${request.permission}: not allowed`);\n }\n return allowed;\n}\n","import type { Transport } from '@monimesl/dot-core';\n\n// Native bridges only carry strings. Encoding to JSON here makes state that a device can't carry\n// fail in the simulator too.\ninterface Wire {\n readonly dot: string;\n}\n\nfunction isWire(data: unknown): data is Wire {\n return typeof (data as Partial<Wire> | null)?.dot === 'string';\n}\n\nexport function wireTransport(channel: Transport): Transport {\n return {\n post: (message) => channel.post({ dot: JSON.stringify(message) } satisfies Wire),\n listen: (listener) =>\n channel.listen((data) => {\n if (isWire(data)) {\n listener(JSON.parse(data.dot));\n }\n }),\n };\n}\n\n// The simulator page and the webview's iframe, each accepting messages only from the other.\nexport function windowChannel(other: () => Window | null): Transport {\n return {\n post: (message) => other()?.postMessage(message, location.origin),\n listen(listener) {\n const onMessage = (event: MessageEvent) => {\n if (event.source === other()) {\n listener(event.data);\n }\n };\n window.addEventListener('message', onMessage);\n return () => window.removeEventListener('message', onMessage);\n },\n };\n}\n","import type {\n AppState,\n ColorScheme,\n Envelope,\n StackEntry,\n SystemContext,\n} from '@monimesl/dot-core';\nimport { createAdaptorTransport } from '@monimesl/dot-core';\n\nimport type { Direction, Host, HostBars } from '../host';\nimport type { HostManifest } from '../manifest';\nimport { checkCompatibility } from '../compatibility';\nimport { startHost } from '../host';\nimport { SIMULATOR_VERSIONS } from '../versions';\nimport { CLIENT_PATH, EVENTS_PATH, MANIFEST_URL, WEBVIEW_URL } from '../paths';\nimport { dashHandlers } from './dash';\nimport { askPermission } from './dash/permissions';\nimport { createElement, element } from './dom';\nimport type { HotReload } from './hot-reload';\nimport { windowChannel, wireTransport } from './wire';\n\nconst MAX_LOG_ENTRIES = 500;\n// Where this browser remembers whether the messages panel shows.\nconst MESSAGES_SHOWN_KEY = 'dot-simulator-messages';\n\nconst screen = element<HTMLIFrameElement>('#screen');\nconst log = element<HTMLOListElement>('#log');\nconst messagesPanel = element<HTMLElement>('#messages-panel');\nconst messagesButton = element<HTMLButtonElement>('#messages');\nconst errorBanner = element<HTMLPreElement>('#error');\nconst phone = element<HTMLDivElement>('.phone');\nconst schemeSelect = element<HTMLSelectElement>('#scheme');\nconst navigationBar = element<HTMLElement>('.navigation-bar');\nconst navigationTitle = element<HTMLElement>('#navigation-title');\nconst navigationBack = element<HTMLButtonElement>('#navigation-back');\nconst tabBar = element<HTMLElement>('.tab-bar');\nconst clock = element<HTMLElement>('.clock');\nconst browserDark = matchMedia('(prefers-color-scheme: dark)');\n// The status bar's clock follows the computer's, in 24-hour time, such as 14:05.\nconst timeFormat = new Intl.DateTimeFormat('en-GB', {\n hour: '2-digit',\n minute: '2-digit',\n hourCycle: 'h23',\n});\nfunction showTime(): void {\n clock.textContent = timeFormat.format(new Date());\n}\nshowTime();\nsetInterval(showTime, 1000);\n\ninterface RunningDot {\n readonly host: Host;\n readonly worker: Worker;\n}\n\nlet runningDot: RunningDot | null = null;\nlet launchCount = 0;\nlet hotReloads = 0;\n\nasync function launch(restorePages: readonly StackEntry[] = []): Promise<void> {\n stopRunningDot();\n launchCount += 1;\n const thisLaunch = launchCount;\n if (log.childElementCount > 0) {\n note('dot restarted');\n }\n\n let manifest: HostManifest;\n try {\n const response = await fetch(MANIFEST_URL);\n manifest = (await response.json()) as HostManifest;\n } catch {\n showError(\n `There's nothing to run, because ${MANIFEST_URL} is missing. Check whether the build failed.`,\n );\n return;\n }\n // Another reload started while the manifest loaded. Only the newest launch may start the dot.\n if (thisLaunch !== launchCount) {\n return;\n }\n\n // startHost checks too, but checking here means a refused dot never starts a worker.\n const handlers = dashHandlers(phone, note);\n try {\n checkCompatibility(manifest, SIMULATOR_VERSIONS);\n } catch (error) {\n screen.src = 'about:blank';\n showError((error as Error).message);\n return;\n }\n\n const worker = new Worker(`${CLIENT_PATH}service-bridge.js`);\n const service = wireTransport(createAdaptorTransport(worker));\n const webview = wireTransport(windowChannel(() => screen.contentWindow));\n const host = startHost({\n logic: service,\n ui: webview,\n manifest,\n ...SIMULATOR_VERSIONS,\n systemContext: systemContext(),\n handlers,\n askPermission: (request, signal) => askPermission(phone, note, request, signal),\n observe: record,\n restorePages,\n onBarsChange: showBars,\n });\n worker.addEventListener('error', (event) =>\n showError(`The dot's service crashed: ${event.message}`),\n );\n screen.src = WEBVIEW_URL;\n runningDot = { host, worker };\n}\n\nfunction stopRunningDot(): void {\n if (!runningDot) {\n return;\n }\n runningDot.host.stop();\n runningDot.worker.terminate();\n runningDot = null;\n}\n\n// Shows the bars for the page on top, as Dash would.\nfunction showBars(bars: HostBars, pages: readonly StackEntry[]): void {\n navigationBar.hidden = bars.navigationBarHidden;\n navigationTitle.textContent = bars.title;\n navigationBack.hidden = pages.length < 2;\n setBarColor('--bar', bars.navigationBarColor);\n setBarColor('--bar-text', bars.navigationBarTextColor);\n tabBar.hidden = bars.tabBarHidden;\n}\n\n// Falls back to Dash's own color when the page sets none.\nfunction setBarColor(property: string, color: string | undefined): void {\n if (color) {\n phone.style.setProperty(property, color);\n } else {\n phone.style.removeProperty(property);\n }\n}\n\nfunction goBack(): void {\n if (runningDot && !runningDot.host.back()) {\n note('back on the first page, where a phone would close the dot');\n }\n}\n\nconst ARROWS: Record<Direction, string> = {\n toHost: 'both --> host',\n fromHost: 'host --> both',\n toService: 'ui --> logic',\n toWebview: 'ui <-- logic',\n};\n\nfunction note(text: string): void {\n log.append(createElement('li', 'note', text));\n}\n\nfunction record(direction: Direction, message: Envelope): void {\n const entry = createElement('li', direction);\n const details = document.createElement('details');\n const summary = document.createElement('summary');\n const time = new Date().toLocaleTimeString([], { hour12: false });\n summary.append(\n createElement('span', 'time', time),\n createElement('span', 'arrow', ARROWS[direction]),\n createElement('span', 'type', message.type),\n );\n const payload = document.createElement('pre');\n payload.textContent = JSON.stringify(message.payload, null, 2);\n details.append(summary, payload);\n entry.append(details);\n if (message.type === 'error') {\n entry.classList.add('failed');\n }\n log.append(entry);\n while (log.childElementCount > MAX_LOG_ENTRIES) {\n log.firstElementChild?.remove();\n }\n log.scrollTop = log.scrollHeight;\n}\n\nfunction restart(restorePages: readonly StackEntry[] = []): void {\n launch(restorePages).catch((error: unknown) => {\n showError(`Could not start the dot: ${String(error)}`);\n });\n}\n\n// A new build, so the dot starts again on the pages it had open.\nfunction relaunch(): void {\n restart(runningDot?.host.pages ?? []);\n}\n\n// A new build that changed only pages. It runs in place, and each open page keeps its state.\nfunction hotReload(): void {\n if (!runningDot) {\n restart();\n return;\n }\n hotReloads += 1;\n const reload: HotReload = { dotHotReload: hotReloads };\n // The service goes first, so a page whose initial state changed has already reset when its view redraws.\n runningDot.worker.postMessage(reload);\n screen.contentWindow?.postMessage(reload, location.origin);\n note('dot updated in place');\n}\n\nfunction showError(message: string | null): void {\n errorBanner.hidden = message === null;\n errorBanner.textContent = message ?? '';\n}\n\nfunction syncSystemContext(): void {\n runningDot?.host.setSystemContext(systemContext());\n}\n\nfunction systemContext(): SystemContext {\n return {\n scheme: schemeSelect.value as ColorScheme,\n appState: appState(),\n };\n}\n\n// Leaving the simulator's tab stands in for leaving Dash.\nfunction appState(): AppState {\n if (document.visibilityState === 'hidden') {\n return 'background';\n }\n return 'active';\n}\n\nfunction browserScheme(): ColorScheme {\n return browserDark.matches ? 'dark' : 'light';\n}\n\nfunction changeScheme(scheme: ColorScheme): void {\n schemeSelect.value = scheme;\n phone.dataset.scheme = scheme;\n syncSystemContext();\n}\n\nconst events = new EventSource(EVENTS_PATH);\nevents.addEventListener('reload', () => {\n showError(null);\n relaunch();\n});\nevents.addEventListener('hot-reload', () => {\n showError(null);\n hotReload();\n});\nevents.addEventListener('build-error', (event) => showError(String(event.data)));\n\n// Hidden, the panel still collects messages, so showing it again shows what happened meanwhile.\nfunction showMessages(shown: boolean): void {\n messagesPanel.hidden = !shown;\n messagesButton.setAttribute('aria-pressed', String(shown));\n}\n\n// Shows the panel if it's hidden, or hides it, and remembers that in this browser.\nfunction toggleMessages(): void {\n const shown = messagesPanel.hidden;\n showMessages(shown);\n try {\n localStorage.setItem(MESSAGES_SHOWN_KEY, String(shown));\n } catch {\n // The browser keeps no site data, so the choice lasts until the page reloads.\n }\n}\n\n// Shown unless this browser hid it last time.\nfunction messagesShownLastTime(): boolean {\n try {\n return localStorage.getItem(MESSAGES_SHOWN_KEY) !== 'false';\n } catch {\n return true;\n }\n}\n\n// Starts the dot over, on its first page.\nelement('#reload').addEventListener('click', () => restart());\nelement('#back').addEventListener('click', goBack);\nnavigationBack.addEventListener('click', goBack);\nelement('#clear').addEventListener('click', () => log.replaceChildren());\nmessagesButton.addEventListener('click', toggleMessages);\nschemeSelect.addEventListener('change', () => changeScheme(schemeSelect.value as ColorScheme));\nbrowserDark.addEventListener('change', () => changeScheme(browserScheme()));\ndocument.addEventListener('visibilitychange', syncSystemContext);\n\nchangeScheme(browserScheme());\nshowMessages(messagesShownLastTime());\nrestart();\n"],"mappings":";;CAOA,SAAS,gBAAgB,UAAU;EAClC,OAAO;GACN,OAAO,CAAC;GACR,QAAQ,CAAC;GACT,GAAG;EACJ;CACD;CAYA,SAAS,kBAAkB,WAAW;EACrC,MAAM,WAAW,CAAC;EAClB,KAAK,MAAM,YAAY,WAAW;GACjC,IAAI,SAAS,QAAQ,UAAU,MAAM,IAAI,MAAM,cAAc,SAAS,KAAK,mBAAmB;GAC9F,SAAS,SAAS,QAAQ;EAC3B;EACA,OAAO;CACR;CAoBA,MAAM,cAAc,gBAAgB;EACnC,MAAM;EACN,OAAO;GACN,OAAO;GACP,UAAU;GACV,YAAY;GACZ,MAAM,CAAC,SAAS,OAAO;GACvB,OAAO;GACP,aAAa;GACb,MAAM;GACN,OAAO;GACP,UAAU;EACX;EACA,QAAQ,CAAC,QAAQ;EACjB,UAAU;CACX,CAAC;CAGD,MAAM,SAAS,gBAAgB;EAC9B,MAAM;EACN,OAAO;GACN,SAAS,CAAC,WAAW,WAAW;GAChC,UAAU;GACV,SAAS;EACV;EACA,QAAQ,CAAC,OAAO;EAChB,UAAU;CACX,CAAC;CAGD,MAAM,QAAQ;EACb;EACA;EACA;CACD;CACA,MAAM,SAAS;EACd;EACA;EACA;EACA;CACD;CACA,MAAM,gBAAgB;EACrB,SAAS;EACT,YAAY;EACZ,cAAc;EACd,YAAY;EACZ,eAAe;CAChB;CACA,MAAM,UAAU;EACf;EACA;EACA;EACA;EACA;EACA;EACA;CACD;CACA,MAAM,QAAQ;EACb;EACA;EACA;EACA;EACA;EACA;CACD;CACA,MAAM,aAAa;EAClB,OAAO,CAAC,GAAG,OAAO,WAAW;EAC7B,IAAI;CACL;CACA,MAAM,cAAc;EACnB,OAAO;GACN;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACD;EACA,IAAI;CACL;CACA,MAAM,UAAU;EACf;EACA;EACA;CACD;CACA,MAAM,QAAQ;EACb;EACA;EACA;EACA;EACA;CACD;CACA,MAAM,SAAS;EACd,OAAO,CAAC,MAAM;EACd,IAAI;CACL;CACA,MAAM,YAAY;EACjB,YAAY;EACZ,QAAQ;EACR,QAAQ;EACR,OAAO;EACP,QAAQ;EACR,WAAW;EACX,UAAU;EACV,QAAQ;CACT;CACA,MAAM,eAAe;EACpB;EACA;EACA;EACA;EACA;CACD;CACA,MAAM,aAAa;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD;CAGA,MAAM,WAAW,gBAAgB;EAChC,MAAM;EACN,OAAO;GACN,UAAU;GACV,UAAU;GACV,MAAM;GACN,WAAW,CAAC,QAAQ,MAAM;GAC1B,KAAK;GACL,QAAQ,CAAC,SAAS,OAAO;GACzB,OAAO;GACP,GAAG;EACJ;EACA,QAAQ,CAAC,QAAQ;EACjB,UAAU;CACX,CAAC;CAGD,MAAM,OAAO,gBAAgB;EAC5B,MAAM;EACN,OAAO;GACN,OAAO;GACP,MAAM;GACN,UAAU;GACV,UAAU;EACX;EACA,QAAQ,CAAC,KAAK;EACd,UAAU;CACX,CAAC;CAGD,MAAM,YAAY,gBAAgB;EACjC,MAAM;EACN,OAAO;GACN,OAAO;GACP,QAAQ;GACR,OAAO;GACP,MAAM;GACN,OAAO;GACP,QAAQ;GACR,UAAU;EACX;EACA,QAAQ,CAAC,UAAU,UAAU;EAC7B,UAAU;CACX,CAAC;CAGD,MAAM,YAAY,gBAAgB;EACjC,MAAM;EACN,OAAO;GACN,OAAO;GACP,OAAO;GACP,MAAM;GACN,QAAQ;IACP;IACA;IACA;GACD;GACA,GAAG;EACJ;EACA,UAAU;CACX,CAAC;CAGD,MAAM,UAAU,gBAAgB;EAC/B,MAAM;EACN,UAAU;CACX,CAAC;CAGD,MAAM,aAAa,gBAAgB;EAClC,MAAM;EACN,OAAO;GACN,MAAM;GACN,OAAO;GACP,MAAM;GACN,GAA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"}
1
+ {"version":3,"file":"simulator.js","names":["simulatorPackage.version"],"sources":["../../../../core/dist/index.js","../../src/compatibility.ts","../../src/host-calls.ts","../../src/permissions.ts","../../src/host.ts","../../package.json","../../src/versions.ts","../../src/paths.ts","../../src/client/dash/dev-server.ts","../../src/limits.ts","../../src/client/dom.ts","../../src/client/dash/ui.ts","../../src/client/dash/media.ts","../../src/client/dash/system.ts","../../src/client/dash/pickers.ts","../../src/client/dash/index.ts","../../src/client/dash/permissions.ts","../../src/client/wire.ts","../../src/client/simulator.ts"],"sourcesContent":["//#region src/view/component.ts\nfunction isWordsOr(type) {\n\treturn typeof type === \"object\" && !Array.isArray(type);\n}\nfunction otherThanWords(type) {\n\treturn type.or === \"number\" ? \"a number\" : \"a colour from the theme's custom colours\";\n}\nfunction defineComponent(manifest) {\n\treturn {\n\t\tprops: {},\n\t\tevents: [],\n\t\t...manifest\n\t};\n}\nfunction eventProp(event) {\n\treturn `on${event.charAt(0).toUpperCase()}${event.slice(1)}`;\n}\nfunction isEventProp(name) {\n\tconst letterAfterOn = name.charAt(2);\n\treturn name.startsWith(\"on\") && letterAfterOn >= \"A\" && letterAfterOn <= \"Z\";\n}\nfunction eventName(prop) {\n\tconst name = prop.slice(2);\n\treturn name.charAt(0).toLowerCase() + name.slice(1);\n}\nfunction componentRegistry(manifests) {\n\tconst registry = {};\n\tfor (const manifest of manifests) {\n\t\tif (manifest.name in registry) throw new Error(`Component <${manifest.name}> is defined twice`);\n\t\tregistry[manifest.name] = manifest;\n\t}\n\treturn registry;\n}\n//#endregion\n//#region src/view/values.ts\nfunction toText(value) {\n\tswitch (typeof value) {\n\t\tcase \"string\": return value;\n\t\tcase \"number\":\n\t\tcase \"boolean\":\n\t\tcase \"bigint\": return String(value);\n\t\tcase \"object\": return value === null ? \"\" : JSON.stringify(value);\n\t\tdefault: return \"\";\n\t}\n}\nfunction toList(value) {\n\tif (Array.isArray(value)) return value;\n\tif (typeof value === \"object\" && value !== null && Symbol.iterator in value) return Array.from(value);\n\treturn [];\n}\n//#endregion\n//#region src/view/components/amount-input.ts\nconst AmountInput = defineComponent({\n\tname: \"AmountInput\",\n\tprops: {\n\t\tvalue: \"number\",\n\t\tcurrency: \"string\",\n\t\tminorUnits: \"number\",\n\t\tunit: [\"minor\", \"major\"],\n\t\tlabel: \"string\",\n\t\tplaceholder: \"string\",\n\t\thint: \"string\",\n\t\terror: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/button.ts\nconst Button = defineComponent({\n\tname: \"Button\",\n\tprops: {\n\t\tvariant: [\"primary\", \"secondary\"],\n\t\tdisabled: \"boolean\",\n\t\tloading: \"boolean\"\n\t},\n\tevents: [\"click\"],\n\tchildren: \"text\"\n});\n//#endregion\n//#region src/view/components/options.ts\nconst SIZES = [\n\t\"small\",\n\t\"medium\",\n\t\"large\"\n];\nconst SPACES = [\n\t\"none\",\n\t\"small\",\n\t\"medium\",\n\t\"large\"\n];\nconst PADDING_PROPS = {\n\tpadding: SPACES,\n\tpaddingTop: SPACES,\n\tpaddingStart: SPACES,\n\tpaddingEnd: SPACES,\n\tpaddingBottom: SPACES\n};\nconst ASPECTS = [\n\t\"1:1\",\n\t\"4:3\",\n\t\"3:2\",\n\t\"16:9\",\n\t\"3:4\",\n\t\"2:3\",\n\t\"9:16\"\n];\nconst TONES = [\n\t\"default\",\n\t\"muted\",\n\t\"info\",\n\t\"success\",\n\t\"warning\",\n\t\"danger\"\n];\nconst TEXT_TONES = {\n\twords: [...TONES, \"onPrimary\"],\n\tor: \"themeColor\"\n};\nconst BACKGROUNDS = {\n\twords: [\n\t\t\"background\",\n\t\t\"surface\",\n\t\t\"primary\",\n\t\t\"muted\",\n\t\t\"info\",\n\t\t\"success\",\n\t\t\"warning\",\n\t\t\"danger\"\n\t],\n\tor: \"themeColor\"\n};\nconst BORDERS = [\n\t\"none\",\n\t\"subtle\",\n\t\"strong\"\n];\nconst RADII = [\n\t\"none\",\n\t\"small\",\n\t\"medium\",\n\t\"large\",\n\t\"full\"\n];\nconst LENGTH = {\n\twords: [\"fill\"],\n\tor: \"number\"\n};\nconst BOX_PROPS = {\n\tbackground: BACKGROUNDS,\n\tborder: BORDERS,\n\tradius: RADII,\n\twidth: LENGTH,\n\theight: LENGTH,\n\tminHeight: \"number\",\n\tmaxWidth: \"number\",\n\taspect: ASPECTS\n};\nconst STATUS_TONES = [\n\t\"default\",\n\t\"info\",\n\t\"success\",\n\t\"warning\",\n\t\"danger\"\n];\nconst ICON_NAMES = [\n\t\"arrow-down\",\n\t\"arrow-left\",\n\t\"arrow-right\",\n\t\"arrow-up\",\n\t\"bank\",\n\t\"bell\",\n\t\"bolt\",\n\t\"calendar\",\n\t\"card\",\n\t\"cart\",\n\t\"cash\",\n\t\"check\",\n\t\"chevron-down\",\n\t\"chevron-left\",\n\t\"chevron-right\",\n\t\"chevron-up\",\n\t\"clock\",\n\t\"close\",\n\t\"copy\",\n\t\"download\",\n\t\"edit\",\n\t\"error\",\n\t\"external-link\",\n\t\"eye\",\n\t\"eye-off\",\n\t\"file\",\n\t\"gift\",\n\t\"globe\",\n\t\"grid\",\n\t\"headphones\",\n\t\"heart\",\n\t\"help\",\n\t\"history\",\n\t\"home\",\n\t\"image\",\n\t\"info\",\n\t\"link\",\n\t\"list\",\n\t\"location\",\n\t\"lock\",\n\t\"logout\",\n\t\"mail\",\n\t\"microphone\",\n\t\"minus\",\n\t\"mobile\",\n\t\"more\",\n\t\"music\",\n\t\"phone\",\n\t\"playlist\",\n\t\"plus\",\n\t\"qr-code\",\n\t\"receipt\",\n\t\"refresh\",\n\t\"search\",\n\t\"send\",\n\t\"settings\",\n\t\"share\",\n\t\"star\",\n\t\"success\",\n\t\"ticket\",\n\t\"trash\",\n\t\"upload\",\n\t\"user\",\n\t\"users\",\n\t\"video\",\n\t\"wallet\",\n\t\"warning\",\n\t\"water\",\n\t\"wifi\"\n];\n//#endregion\n//#region src/view/components/carousel.ts\nconst Carousel = defineComponent({\n\tname: \"Carousel\",\n\tprops: {\n\t\tautoplay: \"boolean\",\n\t\tinterval: \"number\",\n\t\tloop: \"boolean\",\n\t\tindicator: [\"dots\", \"none\"],\n\t\tgap: SPACES,\n\t\teffect: [\"slide\", \"scale\"],\n\t\tindex: \"number\",\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"change\"],\n\tchildren: \"elements\"\n});\n//#endregion\n//#region src/view/components/chip.ts\nconst Chip = defineComponent({\n\tname: \"Chip\",\n\tprops: {\n\t\tlabel: \"string\",\n\t\ticon: ICON_NAMES,\n\t\tselected: \"boolean\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"tap\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/code-input.ts\nconst CodeInput = defineComponent({\n\tname: \"CodeInput\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlength: \"number\",\n\t\tlabel: \"string\",\n\t\thint: \"string\",\n\t\terror: \"string\",\n\t\tsecure: \"boolean\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\", \"complete\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/detail-row.ts\nconst DetailRow = defineComponent({\n\tname: \"DetailRow\",\n\tprops: {\n\t\tlabel: \"string\",\n\t\tvalue: \"string\",\n\t\ttone: TONES,\n\t\tweight: [\n\t\t\t\"regular\",\n\t\t\t\"medium\",\n\t\t\t\"bold\"\n\t\t],\n\t\t...PADDING_PROPS\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/divider.ts\nconst Divider = defineComponent({\n\tname: \"Divider\",\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/empty-state.ts\nconst EmptyState = defineComponent({\n\tname: \"EmptyState\",\n\tprops: {\n\t\ticon: ICON_NAMES,\n\t\ttitle: \"string\",\n\t\ttext: \"string\",\n\t\t...PADDING_PROPS\n\t},\n\tchildren: \"elements\"\n});\n//#endregion\n//#region src/view/components/feedback.ts\nconst Spinner = defineComponent({\n\tname: \"Spinner\",\n\tprops: { size: SIZES },\n\tchildren: \"none\"\n});\nconst ProgressBar = defineComponent({\n\tname: \"ProgressBar\",\n\tprops: { value: \"number\" },\n\tchildren: \"none\"\n});\nconst Notice = defineComponent({\n\tname: \"Notice\",\n\tprops: {\n\t\ttone: STATUS_TONES,\n\t\ttitle: \"string\",\n\t\t...PADDING_PROPS\n\t},\n\tchildren: \"text\"\n});\nconst Badge = defineComponent({\n\tname: \"Badge\",\n\tprops: { tone: STATUS_TONES },\n\tchildren: \"text\"\n});\n//#endregion\n//#region src/view/components/footer.ts\nconst Footer = defineComponent({\n\tname: \"Footer\",\n\tprops: PADDING_PROPS,\n\tchildren: \"elements\"\n});\n//#endregion\n//#region src/view/components/grid.ts\nconst Grid = defineComponent({\n\tname: \"Grid\",\n\tprops: {\n\t\tcolumns: \"number\",\n\t\tgap: SPACES,\n\t\t...PADDING_PROPS\n\t},\n\tchildren: \"elements\"\n});\nconst GridItem = defineComponent({\n\tname: \"GridItem\",\n\tprops: {\n\t\tlabel: \"string\",\n\t\ticon: ICON_NAMES,\n\t\timage: \"string\",\n\t\tbadge: \"string\"\n\t},\n\tevents: [\"tap\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/icon.ts\nconst Icon = defineComponent({\n\tname: \"Icon\",\n\tprops: {\n\t\tname: ICON_NAMES,\n\t\tsize: SIZES,\n\t\ttone: TONES\n\t},\n\tchildren: \"none\",\n\tinline: true\n});\n//#endregion\n//#region src/view/components/image.ts\nconst Image = defineComponent({\n\tname: \"Image\",\n\tprops: {\n\t\tsrc: \"string\",\n\t\talt: \"string\",\n\t\twidth: \"number\",\n\t\theight: \"number\",\n\t\tfit: [\"cover\", \"contain\"],\n\t\tshape: [\n\t\t\t\"rounded\",\n\t\t\t\"square\",\n\t\t\t\"circle\"\n\t\t],\n\t\taspect: ASPECTS\n\t},\n\tevents: [\"load\", \"error\"],\n\tchildren: \"none\",\n\toverrides: [{\n\t\tprop: \"aspect\",\n\t\tignores: \"height\",\n\t\tbecause: \"the aspect sets the height\"\n\t}]\n});\n//#endregion\n//#region src/view/components/slider.ts\nconst Slider = defineComponent({\n\tname: \"Slider\",\n\tprops: {\n\t\tvalue: \"number\",\n\t\tmin: \"number\",\n\t\tmax: \"number\",\n\t\tstep: \"number\",\n\t\tshowValue: \"boolean\",\n\t\tlabel: \"string\",\n\t\thint: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/prose.ts\nconst Prose = defineComponent({\n\tname: \"Prose\",\n\tprops: { ...PADDING_PROPS },\n\tchildren: \"elements\"\n});\nconst Quote = defineComponent({\n\tname: \"Quote\",\n\tprops: { cite: \"string\" },\n\tchildren: \"elements\"\n});\nconst BulletList = defineComponent({\n\tname: \"BulletList\",\n\tprops: { ordered: \"boolean\" },\n\tchildren: \"elements\"\n});\nconst Bullet = defineComponent({\n\tname: \"Bullet\",\n\tchildren: \"elements\"\n});\nconst RichText = defineComponent({\n\tname: \"RichText\",\n\tprops: { markdown: \"string\" },\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/input.ts\nconst Input = defineComponent({\n\tname: \"Input\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tplaceholder: \"string\",\n\t\tlabel: \"string\",\n\t\thint: \"string\",\n\t\terror: \"string\",\n\t\tprefix: \"string\",\n\t\tsuffix: \"string\",\n\t\ttype: [\n\t\t\t\"text\",\n\t\t\t\"number\",\n\t\t\t\"email\",\n\t\t\t\"phone\",\n\t\t\t\"password\"\n\t\t],\n\t\tmaxLength: \"number\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\", \"submit\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/link.ts\nconst Link = defineComponent({\n\tname: \"Link\",\n\tprops: {\n\t\thref: \"string\",\n\t\ttone: TONES\n\t},\n\tevents: [\"tap\"],\n\tchildren: \"text\",\n\tinline: true\n});\n//#endregion\n//#region src/view/components/list.ts\nconst List = defineComponent({\n\tname: \"List\",\n\tprops: {\n\t\tsize: [\"sm\", \"md\"],\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"endReached\"],\n\tchildren: \"elements\"\n});\nconst ListItem = defineComponent({\n\tname: \"ListItem\",\n\tprops: {\n\t\ttitle: \"string\",\n\t\tsubtitle: \"string\",\n\t\tvalue: \"string\",\n\t\ticon: ICON_NAMES,\n\t\timage: \"string\",\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"tap\"],\n\tchildren: \"elements\"\n});\n//#endregion\n//#region src/view/components/overlays.ts\nconst Sheet = defineComponent({\n\tname: \"Sheet\",\n\tprops: {\n\t\topen: \"boolean\",\n\t\ttitle: \"string\",\n\t\tshowCloseIcon: \"boolean\",\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"close\"],\n\tchildren: \"elements\"\n});\nconst Toast = defineComponent({\n\tname: \"Toast\",\n\tprops: {\n\t\tmessage: \"string\",\n\t\ttone: STATUS_TONES,\n\t\tduration: \"number\"\n\t},\n\tevents: [\"hide\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/qr-code.ts\nconst QRCode = defineComponent({\n\tname: \"QRCode\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tsize: \"number\",\n\t\tlabel: \"string\"\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/select.ts\nconst Select = defineComponent({\n\tname: \"Select\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlabel: \"string\",\n\t\tplaceholder: \"string\",\n\t\thint: \"string\",\n\t\terror: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"elements\"\n});\nconst Option = defineComponent({\n\tname: \"Option\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlabel: \"string\"\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/scroll.ts\nconst Scroll = defineComponent({\n\tname: \"Scroll\",\n\tprops: {\n\t\tgap: SPACES,\n\t\tsnap: [\n\t\t\t\"none\",\n\t\t\t\"start\",\n\t\t\t\"center\"\n\t\t],\n\t\tindex: \"number\",\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"change\"],\n\tchildren: \"elements\"\n});\n//#endregion\n//#region src/view/components/skeleton.ts\nconst Skeleton = defineComponent({\n\tname: \"Skeleton\",\n\tprops: {\n\t\tshape: [\n\t\t\t\"text\",\n\t\t\t\"circle\",\n\t\t\t\"box\"\n\t\t],\n\t\tlines: \"number\",\n\t\theight: \"number\"\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/tabs.ts\nconst Tabs = defineComponent({\n\tname: \"Tabs\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tvariant: [\"underline\", \"segmented\"],\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"change\"],\n\tchildren: \"elements\"\n});\nconst Tab = defineComponent({\n\tname: \"Tab\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlabel: \"string\",\n\t\tbadge: \"number\"\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/text.ts\nconst Text = defineComponent({\n\tname: \"Text\",\n\tprops: {\n\t\tvariant: [\n\t\t\t\"display\",\n\t\t\t\"title\",\n\t\t\t\"subtitle\",\n\t\t\t\"lead\",\n\t\t\t\"body\",\n\t\t\t\"caption\"\n\t\t],\n\t\ttone: TEXT_TONES,\n\t\tweight: [\n\t\t\t\"regular\",\n\t\t\t\"medium\",\n\t\t\t\"bold\"\n\t\t],\n\t\talign: [\n\t\t\t\"start\",\n\t\t\t\"center\",\n\t\t\t\"end\"\n\t\t],\n\t\tmaxLines: \"number\",\n\t\tdecoration: [\n\t\t\t\"none\",\n\t\t\t\"underline\",\n\t\t\t\"strikethrough\"\n\t\t],\n\t\tnumeric: \"boolean\",\n\t\tleading: [\n\t\t\t\"tight\",\n\t\t\t\"normal\",\n\t\t\t\"relaxed\"\n\t\t],\n\t\titalic: \"boolean\",\n\t\tselectable: \"boolean\",\n\t\t...PADDING_PROPS\n\t},\n\tchildren: \"text\",\n\tinline: true\n});\n//#endregion\n//#region src/view/components/text-area.ts\nconst TextArea = defineComponent({\n\tname: \"TextArea\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tplaceholder: \"string\",\n\t\tlabel: \"string\",\n\t\thint: \"string\",\n\t\terror: \"string\",\n\t\trows: \"number\",\n\t\tmaxLength: \"number\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/toggles.ts\nconst Switch = defineComponent({\n\tname: \"Switch\",\n\tprops: {\n\t\tchecked: \"boolean\",\n\t\tlabel: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"none\"\n});\nconst Checkbox = defineComponent({\n\tname: \"Checkbox\",\n\tprops: {\n\t\tchecked: \"boolean\",\n\t\tlabel: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"none\"\n});\nconst RadioGroup = defineComponent({\n\tname: \"RadioGroup\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlabel: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"elements\"\n});\nconst Radio = defineComponent({\n\tname: \"Radio\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlabel: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/view.ts\nconst View = defineComponent({\n\tname: \"View\",\n\tprops: {\n\t\tgap: SPACES,\n\t\tdirection: [\"column\", \"row\"],\n\t\talign: [\n\t\t\t\"stretch\",\n\t\t\t\"start\",\n\t\t\t\"center\",\n\t\t\t\"end\"\n\t\t],\n\t\tjustify: [\n\t\t\t\"start\",\n\t\t\t\"center\",\n\t\t\t\"end\",\n\t\t\t\"between\"\n\t\t],\n\t\twrap: \"boolean\",\n\t\tgrow: \"boolean\",\n\t\t...PADDING_PROPS,\n\t\tvariant: [\"plain\", \"card\"],\n\t\t...BOX_PROPS\n\t},\n\tevents: [\"tap\"],\n\tchildren: \"elements\",\n\toverrides: [{\n\t\tprop: \"aspect\",\n\t\tignores: \"height\",\n\t\tbecause: \"the aspect sets the height\"\n\t}]\n});\nconst Stack = defineComponent({\n\tname: \"Stack\",\n\tprops: {\n\t\tradius: BOX_PROPS.radius,\n\t\twidth: BOX_PROPS.width,\n\t\theight: BOX_PROPS.height,\n\t\taspect: BOX_PROPS.aspect\n\t},\n\tchildren: \"elements\",\n\toverrides: [{\n\t\tprop: \"aspect\",\n\t\tignores: \"height\",\n\t\tbecause: \"the aspect sets the height\"\n\t}]\n});\n//#endregion\n//#region src/view/components/index.ts\nconst builtinComponents = {\n\tAmountInput,\n\tBadge,\n\tBullet,\n\tBulletList,\n\tButton,\n\tCarousel,\n\tCheckbox,\n\tChip,\n\tCodeInput,\n\tDetailRow,\n\tDivider,\n\tEmptyState,\n\tFooter,\n\tGrid,\n\tGridItem,\n\tIcon,\n\tImage,\n\tInput,\n\tLink,\n\tList,\n\tListItem,\n\tNotice,\n\tOption,\n\tProgressBar,\n\tProse,\n\tQRCode,\n\tQuote,\n\tRadio,\n\tRadioGroup,\n\tRichText,\n\tScroll,\n\tSelect,\n\tSheet,\n\tSkeleton,\n\tSlider,\n\tSpinner,\n\tStack,\n\tSwitch,\n\tTab,\n\tTabs,\n\tText,\n\tTextArea,\n\tToast,\n\tView\n};\nconst builtinRegistry = componentRegistry(Object.values(builtinComponents));\n//#endregion\n//#region src/source/location.ts\nfunction createLocator(source) {\n\tconst lineStarts = [0];\n\tfor (let index = 0; index < source.length; index++) if (source[index] === \"\\n\") lineStarts.push(index + 1);\n\treturn (offset) => {\n\t\tlet low = 0;\n\t\tlet high = lineStarts.length - 1;\n\t\twhile (low < high) {\n\t\t\tconst middle = Math.floor((low + high + 1) / 2);\n\t\t\tif (lineStarts[middle] <= offset) low = middle;\n\t\t\telse high = middle - 1;\n\t\t}\n\t\treturn {\n\t\t\tline: low + 1,\n\t\t\tcolumn: offset - lineStarts[low] + 1,\n\t\t\toffset\n\t\t};\n\t};\n}\nfunction locationAt(source, offset) {\n\treturn createLocator(source)(offset);\n}\nfunction locatedMessage(message, file, location) {\n\tconst where = [\n\t\tfile,\n\t\tlocation?.line,\n\t\tlocation?.column\n\t].filter((part) => part !== void 0).join(\":\");\n\treturn where ? `${where}: ${message}` : message;\n}\n//#endregion\n//#region src/source/error.ts\nvar SourceError = class extends Error {\n\treason;\n\tfile;\n\tloc;\n\tconstructor(reason, file, location) {\n\t\tsuper(locatedMessage(reason, file, location));\n\t\tthis.reason = reason;\n\t\tthis.file = file;\n\t\tthis.loc = location;\n\t}\n};\n//#endregion\n//#region src/event/emitter.ts\nvar EventEmitter = class {\n\t#listeners = /* @__PURE__ */ new Map();\n\ton(name, listener) {\n\t\tconst listeners = this.#listeners.get(name) ?? /* @__PURE__ */ new Set();\n\t\tthis.#listeners.set(name, listeners);\n\t\tlisteners.add(listener);\n\t\treturn () => listeners.delete(listener);\n\t}\n\temit(name, ...args) {\n\t\tthis.#listeners.get(name)?.forEach((listener) => listener(...args));\n\t}\n};\n//#endregion\n//#region src/event/core.ts\nfunction createEvent(type, detail = {}, data = {}) {\n\treturn {\n\t\ttype,\n\t\tdetail,\n\t\tdata\n\t};\n}\n//#endregion\n//#region src/host/host.ts\nfunction hostTransport() {\n\tconst transport = globalThis.__hostTransport;\n\tif (!transport) throw new Error(\"No Dot host found: `globalThis.__hostTransport` is not set. Run the dot in the Dash app, or in the simulator with `dotctl dev`.\");\n\treturn transport;\n}\n//#endregion\n//#region src/host/context.ts\nconst DEFAULT_SYSTEM_CONTEXT = {\n\tscheme: \"light\",\n\tappState: \"active\"\n};\n//#endregion\n//#region src/host/calls.ts\nvar HostError = class extends Error {\n\tname = \"HostError\";\n\tcode;\n\tconstructor(code, message) {\n\t\tsuper(message);\n\t\tthis.code = code;\n\t}\n};\nlet connectedCaller = null;\nfunction connectHost(caller) {\n\tconnectedCaller = caller;\n}\nfunction callHost(method, params, options = {}) {\n\tif (!connectedCaller) {\n\t\tconst error = new HostError(\"unsupported\", `Can't run \"${method}\" here: call Dash from the dot's logic`);\n\t\treturn createHostRequest(Promise.reject(error));\n\t}\n\treturn connectedCaller(method, params, options);\n}\nfunction createHostRequest(promise, cancel = () => {}) {\n\tconst request = promise;\n\trequest.cancel = cancel;\n\treturn request;\n}\n//#endregion\n//#region src/host/permissions.ts\nconst PERMISSIONS = [\n\t\"account\",\n\t\"camera\",\n\t\"photoLibrary\",\n\t\"files\"\n];\nfunction isPermission(value) {\n\treturn PERMISSIONS.includes(value);\n}\n//#endregion\n//#region src/host/files.ts\nconst DOT_FILE_PATH_MAX_LENGTH = 512;\nconst MAX_NAME_LENGTH = 255;\nfunction dotFilePathProblem(path, { allowRoot = false } = {}) {\n\tif (path === \"\") return allowRoot ? null : \"A path is needed, such as \\\"receipts/42.pdf\\\"\";\n\tif (path.length > 512) return `\"${path.slice(0, 40)}…\" is longer than 512 characters`;\n\tif (path.startsWith(\"/\")) return `\"${path}\" starts with \"/\". Start paths without it, such as \"receipts/42.pdf\"`;\n\tif ([...path].some((char) => char === \"\\\\\" || char.charCodeAt(0) < 32)) return `\"${path}\" has a backslash or another character paths can't use`;\n\tfor (const name of path.split(\"/\")) {\n\t\tif (name === \"\" || name === \".\" || name === \"..\") return `\"${path}\" has an empty, \".\" or \"..\" part. Name each folder, such as \"receipts/42.pdf\"`;\n\t\tif (name.length > MAX_NAME_LENGTH) return `\"${path}\" has a name longer than ${MAX_NAME_LENGTH} characters`;\n\t}\n\treturn null;\n}\n//#endregion\n//#region src/host/network.ts\nconst LABEL = \"[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\";\nconst NETWORK_HOST_PATTERN = new RegExp(`^(?:\\\\*\\\\.${LABEL}(?:\\\\.${LABEL})+|${LABEL}(?:\\\\.${LABEL})*)$`);\nconst NETWORK_HOST_MAX_LENGTH = 253;\nfunction isNetworkHost(value) {\n\treturn value.length <= 253 && NETWORK_HOST_PATTERN.test(value);\n}\nfunction allowsHost(hosts, host) {\n\tconst name = host.toLowerCase().replace(/\\.$/, \"\");\n\treturn hosts.some((pattern) => pattern.startsWith(\"*.\") ? name.endsWith(pattern.slice(1)) : name === pattern);\n}\n//#endregion\n//#region src/version/semantic-version.ts\nconst SEMVER_PATTERN = /^(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-]+)*))?$/;\nfunction isSemanticVersion(value) {\n\treturn typeof value === \"string\" && SEMVER_PATTERN.test(value);\n}\nfunction majorVersion(version) {\n\treturn parseVersion(version).major;\n}\nfunction isVersionAtLeast(version, minimum) {\n\treturn compareVersions(version, minimum) >= 0;\n}\nfunction isNewerMajor(version, current) {\n\treturn parseVersion(version).major > parseVersion(current).major;\n}\nfunction compareVersions(left, right) {\n\tconst leftVersion = parseVersion(left);\n\tconst rightVersion = parseVersion(right);\n\tconst differences = [\n\t\tleftVersion.major - rightVersion.major,\n\t\tleftVersion.minor - rightVersion.minor,\n\t\tleftVersion.patch - rightVersion.patch\n\t];\n\tfor (const difference of differences) if (difference !== 0) return difference;\n\treturn comparePrereleases(leftVersion.prerelease, rightVersion.prerelease);\n}\nfunction parseVersion(version) {\n\tconst match = SEMVER_PATTERN.exec(version);\n\tif (!match) throw new Error(`\"${version}\" is not a semantic version`);\n\tconst [, major, minor, patch, prerelease] = match;\n\treturn {\n\t\tmajor: Number(major),\n\t\tminor: Number(minor),\n\t\tpatch: Number(patch),\n\t\tprerelease: prerelease === void 0 ? [] : prerelease.split(\".\")\n\t};\n}\nfunction comparePrereleases(left, right) {\n\tif (left.length === 0 || right.length === 0) return right.length - left.length;\n\tconst shared = Math.min(left.length, right.length);\n\tfor (let index = 0; index < shared; index++) {\n\t\tconst order = compareIdentifiers(left[index], right[index]);\n\t\tif (order !== 0) return order;\n\t}\n\treturn left.length - right.length;\n}\nfunction compareIdentifiers(left, right) {\n\tconst leftIsNumber = /^\\d+$/.test(left);\n\tconst rightIsNumber = /^\\d+$/.test(right);\n\tif (leftIsNumber && rightIsNumber) return Number(left) - Number(right);\n\tif (leftIsNumber) return -1;\n\tif (rightIsNumber) return 1;\n\tif (left < right) return -1;\n\tif (left > right) return 1;\n\treturn 0;\n}\n//#endregion\n//#region src/host/react.ts\nconst REACT_HOST_PATH = \"/__dot/react/\";\nconst REACT_HOST_MODULES = {\n\treact: \"react.js\",\n\t\"react/jsx-runtime\": \"react-jsx-runtime.js\",\n\t\"react-dom\": \"react-dom.js\",\n\t\"react-dom/client\": \"react-dom-client.js\"\n};\nfunction reactHostUrl(dotReactVersion, file) {\n\treturn `${REACT_HOST_PATH}${majorVersion(dotReactVersion)}/${file}`;\n}\nfunction isReactCompatible(hostVersion, dotVersion) {\n\treturn majorVersion(hostVersion) === majorVersion(dotVersion) && isVersionAtLeast(hostVersion, dotVersion);\n}\nfunction newestReactOfMajor(versions, major) {\n\treturn versions.filter((version) => majorVersion(version) === major).sort(compareVersions).at(-1);\n}\n//#endregion\n//#region src/protocol/transport.ts\nfunction createAdaptorTransport(adapter) {\n\treturn {\n\t\tpost: (message) => adapter.postMessage(message),\n\t\tlisten(listener) {\n\t\t\tconst onMessage = (event) => listener(event.data);\n\t\t\tadapter.addEventListener(\"message\", onMessage);\n\t\t\treturn () => adapter.removeEventListener(\"message\", onMessage);\n\t\t}\n\t};\n}\nfunction createTransportPair() {\n\tconst firstListeners = /* @__PURE__ */ new Set();\n\tconst secondListeners = /* @__PURE__ */ new Set();\n\tconst createSide = (ownListeners, otherListeners) => ({\n\t\tpost: (message) => {\n\t\t\tconst copy = JSON.parse(JSON.stringify(message));\n\t\t\totherListeners.forEach((listener) => listener(copy));\n\t\t},\n\t\tlisten(listener) {\n\t\t\townListeners.add(listener);\n\t\t\treturn () => ownListeners.delete(listener);\n\t\t}\n\t});\n\treturn [createSide(firstListeners, secondListeners), createSide(secondListeners, firstListeners)];\n}\nconst PAGE_HOOKS = Object.keys({\n\tonLoad: true,\n\tonShow: true,\n\tonHide: true,\n\tonUnload: true\n});\n//#endregion\n//#region src/page/navigation.ts\nconst MAX_STACK_DEPTH = 16;\nconst PAGE_ID = /^[A-Za-z0-9_-]+(?:\\/[A-Za-z0-9_-]+)*$/;\nfunction isPageId(value) {\n\treturn PAGE_ID.test(value);\n}\nvar NavigationStack = class {\n\tlimit;\n\t#pages = [];\n\t#nextInstanceId = 1;\n\tconstructor(limit = 16) {\n\t\tthis.limit = limit;\n\t}\n\tget pages() {\n\t\treturn this.#pages;\n\t}\n\tget top() {\n\t\treturn this.#pages.at(-1);\n\t}\n\tapply(navigation) {\n\t\tswitch (navigation.action) {\n\t\t\tcase \"push\":\n\t\t\t\tif (this.#pages.length >= this.limit) return false;\n\t\t\t\tbreak;\n\t\t\tcase \"replace\":\n\t\t\t\tthis.#pages.pop();\n\t\t\t\tbreak;\n\t\t\tcase \"reset\":\n\t\t\t\tthis.#pages = [];\n\t\t\t\tbreak;\n\t\t\tcase \"back\": {\n\t\t\t\tconst count = Math.min(navigation.delta, this.#pages.length - 1);\n\t\t\t\tif (count < 1) return false;\n\t\t\t\tthis.#pages = this.#pages.slice(0, -count);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\tconst { page, options } = navigation;\n\t\tthis.#pages = [...this.#pages, {\n\t\t\tinstanceId: this.#nextInstanceId++,\n\t\t\tpage,\n\t\t\toptions\n\t\t}];\n\t\treturn true;\n\t}\n};\n//#endregion\n//#region src/page/state.ts\nfunction applyChanges(state, changes) {\n\tconst next = { ...state };\n\tfor (const [key, value] of Object.entries(changes)) if (value !== void 0) next[key] = value;\n\treturn next;\n}\n//#endregion\n//#region src/page/bars.ts\nconst HEX_COLOR = /^#[0-9a-fA-F]{6}$/;\nfunction checkNavigationBar(options) {\n\tconst { title, hidden, backgroundColor, textColor } = options;\n\tif (title !== void 0 && typeof title !== \"string\") throw new TypeError(\"The navigation bar's title must be text\");\n\tif (hidden !== void 0 && typeof hidden !== \"boolean\") throw new TypeError(\"The navigation bar's `hidden` must be true or false\");\n\tfor (const [name, color] of Object.entries({\n\t\tbackgroundColor,\n\t\ttextColor\n\t})) 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\"`);\n}\nfunction checkTabBar(options) {\n\tif (options.hidden !== void 0 && typeof options.hidden !== \"boolean\") throw new TypeError(\"The tab bar's `hidden` must be true or false\");\n}\nfunction checkConfigs(configs) {\n\tcheckNavigationBar(configs.navigationBar ?? {});\n\tcheckTabBar(configs.tabBar ?? {});\n}\nfunction mergeConfigs(...configs) {\n\tconst bars = {\n\t\tnavigationBar: {},\n\t\ttabBar: {}\n\t};\n\tfor (const config of configs) {\n\t\tbars.navigationBar = {\n\t\t\t...bars.navigationBar,\n\t\t\t...config?.navigationBar\n\t\t};\n\t\tbars.tabBar = {\n\t\t\t...bars.tabBar,\n\t\t\t...config?.tabBar\n\t\t};\n\t}\n\treturn bars;\n}\n//#endregion\n//#region src/messageChannel.ts\nvar MessageChannel = class {\n\t#transport;\n\t#handlers = /* @__PURE__ */ new Map();\n\tconstructor(transport) {\n\t\tthis.#transport = transport;\n\t}\n\tsend(type, payload) {\n\t\tthis.#transport.post({\n\t\t\ttype,\n\t\t\tpayload\n\t\t});\n\t}\n\thandle(type, handler) {\n\t\tconst previous = this.#handlers.get(type);\n\t\tthis.#handlers.set(type, handler);\n\t\treturn previous;\n\t}\n\tlisten(onError) {\n\t\treturn this.#transport.listen((rawMessage) => {\n\t\t\tconst message = rawMessage;\n\t\t\tconst handler = this.#handlers.get(message.type);\n\t\t\tif (!handler) {\n\t\t\t\tonError(/* @__PURE__ */ new Error(`No handler for message \"${message.type}\"`), message);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\thandler(message.payload);\n\t\t\t} catch (error) {\n\t\t\t\tonError(error, message);\n\t\t\t}\n\t\t});\n\t}\n};\n//#endregion\nexport { ASPECTS, AmountInput, BACKGROUNDS, BORDERS, BOX_PROPS, Badge, Bullet, BulletList, Button, Carousel, Checkbox, Chip, CodeInput, DEFAULT_SYSTEM_CONTEXT, DOT_FILE_PATH_MAX_LENGTH, DetailRow, Divider, EmptyState, EventEmitter, Footer, Grid, GridItem, HostError, ICON_NAMES, Icon, Image, Input, LENGTH, Link, List, ListItem, MAX_STACK_DEPTH, MessageChannel, NETWORK_HOST_MAX_LENGTH, NETWORK_HOST_PATTERN, NavigationStack, Notice, Option, PADDING_PROPS, PAGE_HOOKS, PERMISSIONS, ProgressBar, Prose, QRCode, Quote, RADII, REACT_HOST_MODULES, REACT_HOST_PATH, Radio, RadioGroup, RichText, SEMVER_PATTERN, SIZES, SPACES, STATUS_TONES, Scroll, Select, Sheet, Skeleton, Slider, SourceError, Spinner, Stack, Switch, TEXT_TONES, 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, isNewerMajor, isPageId, isPermission, isReactCompatible, isSemanticVersion, isVersionAtLeast, isWordsOr, locatedMessage, locationAt, majorVersion, mergeConfigs, newestReactOfMajor, otherThanWords, reactHostUrl, toList, toText };\n\n//# sourceMappingURL=index.js.map","import { isNewerMajor, isReactCompatible } from '@monimesl/dot-core';\n\nimport type { HostManifest } from './manifest';\n\nexport type IncompatibilityReason = 'runtimeTooNew' | 'reactUnavailable';\n\nexport interface HostVersions {\n // The @monimesl/dot-runtime this host is released with. Dots built with a newer major version need\n // a newer host. A newer minor or patch is fine.\n readonly runtimeVersion: string;\n // The React versions the host ships. A host that serves the React the dot was built with, such as\n // the simulator, leaves it out.\n readonly reactVersions?: readonly string[] | undefined;\n}\n\n// Thrown when a host can't run a dot. `reason` names the check that failed.\nexport class IncompatibleDotError extends Error {\n override readonly name = 'IncompatibleDotError';\n readonly reason: IncompatibilityReason;\n\n constructor(reason: IncompatibilityReason, message: string) {\n super(message);\n this.reason = reason;\n }\n}\n\n// Throws an IncompatibleDotError when a host with these versions cannot run the dot.\nexport function checkCompatibility(\n manifest: HostManifest,\n { runtimeVersion, reactVersions }: HostVersions,\n): void {\n if (isNewerMajor(manifest.runtime, runtimeVersion)) {\n throw new IncompatibleDotError(\n 'runtimeTooNew',\n `This dot was built with Dot runtime ${manifest.runtime}, which is newer than this Dash ` +\n 'supports. Update Dash to open it.',\n );\n }\n if (\n reactVersions !== undefined &&\n !reactVersions.some((version) => isReactCompatible(version, manifest.react))\n ) {\n throw new IncompatibleDotError(\n 'reactUnavailable',\n `This dot needs React ${manifest.react}, which this host doesn't have.`,\n );\n }\n}\n","import type {\n DotPermission,\n HostErrorCode,\n HostResult,\n LogicLayerMessages,\n} from '@monimesl/dot-core';\nimport { HostError } from '@monimesl/dot-core';\n\nimport type { PermissionGate } from './permissions';\n\nexport interface HostCall {\n readonly method: string;\n readonly params: unknown;\n // Aborted when the call ends early: cancelled, out of time, or dismissed with its page.\n readonly signal: AbortSignal;\n}\n\n// Runs one host method. Throw a `HostError` to fail with its code; anything else fails as `failed`.\nexport type HostHandler = (call: HostCall) => unknown;\n\n// A method that needs a permission: it runs only if the dot declared it and the person allowed it.\n// A method whose permission depends on its params, such as the photo's source, picks it from them.\nexport interface PermissionedHandler {\n readonly permission: DotPermission | ((params: unknown) => DotPermission);\n readonly handle: HostHandler;\n}\n\nexport type HostHandlers = Readonly<Record<string, HostHandler | PermissionedHandler>>;\n\nconst UI_METHOD_PREFIX = 'dash.ui.';\n\ninterface RunningCall {\n readonly method: string;\n readonly controller: AbortController;\n timer?: ReturnType<typeof setTimeout>;\n}\n\n// Runs the service's host calls with `handlers`, and answers each one exactly once.\nexport class HostCallRunner {\n readonly #handlers: HostHandlers;\n readonly #permissions: PermissionGate;\n readonly #answer: (result: HostResult) => void;\n readonly #running = new Map<number, RunningCall>();\n\n constructor(\n handlers: HostHandlers,\n permissions: PermissionGate,\n answer: (result: HostResult) => void,\n ) {\n this.#handlers = handlers;\n this.#permissions = permissions;\n this.#answer = answer;\n }\n\n run({ id, method, params, timeout }: LogicLayerMessages['hostCall']): void {\n const entry = this.#handlers[method];\n if (!entry) {\n this.#answer({\n id,\n error: { code: 'unsupported', message: `This host doesn't support \"${method}\"` },\n });\n return;\n }\n const call: RunningCall = { method, controller: new AbortController() };\n if (timeout !== undefined) {\n call.timer = setTimeout(() => {\n this.#fail(id, new HostError('timeout', `\"${method}\" took longer than ${timeout}ms`));\n }, timeout);\n }\n this.#running.set(id, call);\n void this.#invoke(id, entry, { method, params, signal: call.controller.signal });\n }\n\n // The service stopped waiting, so the call ends without an answer.\n cancel(id: number): void {\n this.#end(id)?.controller.abort();\n }\n\n // Dialogs belong to the page on top. When that page changes, any dialog still open is dismissed.\n dismissUI(): void {\n for (const [id, call] of this.#running) {\n if (call.method.startsWith(UI_METHOD_PREFIX)) {\n this.#fail(\n id,\n new HostError('cancelled', 'The page that showed this dialog is no longer on screen'),\n );\n }\n }\n }\n\n async #invoke(\n id: number,\n entry: HostHandler | PermissionedHandler,\n call: HostCall,\n ): Promise<void> {\n try {\n if (typeof entry === 'function') {\n this.#succeed(id, await entry(call));\n return;\n }\n const permission =\n typeof entry.permission === 'function' ? entry.permission(call.params) : entry.permission;\n await this.#permissions.check(call.method, permission, call.signal);\n this.#succeed(id, await entry.handle(call));\n } catch (error) {\n this.#fail(id, error);\n }\n }\n\n #succeed(id: number, value: unknown): void {\n if (this.#end(id)) {\n this.#answer({ id, value });\n }\n }\n\n #fail(id: number, error: unknown): void {\n const call = this.#end(id);\n if (!call) {\n return;\n }\n call.controller.abort();\n this.#answer({ id, error: describeError(error) });\n }\n\n #end(id: number): RunningCall | undefined {\n const call = this.#running.get(id);\n if (call) {\n this.#running.delete(id);\n clearTimeout(call.timer);\n }\n return call;\n }\n}\n\nfunction describeError(error: unknown): { code: HostErrorCode; message: string } {\n if (error instanceof HostError) {\n return { code: error.code, message: error.message };\n }\n return { code: 'failed', message: error instanceof Error ? error.message : String(error) };\n}\n","import type { DotPermission } from '@monimesl/dot-core';\nimport { HostError } from '@monimesl/dot-core';\n\n// A dot asking for a permission it declared, the first time a call needs it.\nexport interface PermissionRequest {\n readonly dotName: string;\n readonly permission: DotPermission;\n // Why the dot needs it, from its dot.json.\n readonly reason: string;\n}\n\n// Each permission a dot declared in its dot.json, with the reason Dash shows the person.\nexport type DeclaredPermissions = Readonly<Partial<Record<string, string>>>;\n\n// Asks the person, and resolves with whether they allowed it. `signal` aborts if the call that needs\n// the permission ends first. The host then takes its prompt down and rejects.\nexport type AskPermission = (request: PermissionRequest, signal: AbortSignal) => Promise<boolean>;\n\n// Lets a call that needs a permission through only if the dot declared it and the person allowed\n// it. The person is asked once per run, and their answer is kept.\nexport class PermissionGate {\n readonly #dotName: string;\n readonly #declared: DeclaredPermissions;\n readonly #ask: AskPermission;\n readonly #answers = new Map<DotPermission, boolean>();\n\n constructor(dotName: string, declared: DeclaredPermissions, ask: AskPermission) {\n this.#dotName = dotName;\n this.#declared = declared;\n this.#ask = ask;\n }\n\n // Rejects with a `denied` HostError when the call may not run.\n async check(method: string, permission: DotPermission, signal: AbortSignal): Promise<void> {\n const reason = this.#declared[permission];\n if (reason === undefined) {\n throw new HostError(\n 'denied',\n `\"${method}\" needs the \"${permission}\" permission. Add it to permissions in dot.json, with a reason to show the person.`,\n );\n }\n let allowed = this.#answers.get(permission);\n if (allowed === undefined) {\n allowed = await this.#ask({ dotName: this.#dotName, permission, reason }, signal);\n this.#answers.set(permission, allowed);\n }\n if (!allowed) {\n throw new HostError('denied', `The person didn't allow the \"${permission}\" permission`);\n }\n }\n}\n","import type {\n Envelope,\n HostLayerMessages,\n HostResult,\n LogicLayerMessages,\n Navigation,\n PageBars,\n StackEntry,\n SystemContext,\n Transport,\n} from '@monimesl/dot-core';\nimport { NavigationStack } from '@monimesl/dot-core';\n\nimport type { HostVersions } from './compatibility';\nimport { checkCompatibility } from './compatibility';\nimport type { HostHandlers } from './host-calls';\nimport { HostCallRunner } from './host-calls';\nimport type { HostManifest } from './manifest';\nimport type { AskPermission } from './permissions';\nimport { PermissionGate } from './permissions';\n\nexport type Direction = 'toService' | 'toWebview' | 'toHost' | 'fromHost';\n\n// What Dash's bars show for the page on top. The title is the dot's name unless the page set one.\nexport interface HostBars {\n readonly title: string;\n readonly navigationBarHidden: boolean;\n // As #RRGGBB, or undefined for Dash's own colors.\n readonly navigationBarColor: string | undefined;\n readonly navigationBarTextColor: string | undefined;\n readonly tabBarHidden: boolean;\n}\n\nexport interface HostOptions extends HostVersions {\n ui: Transport;\n logic: Transport;\n manifest: HostManifest;\n systemContext: SystemContext;\n // The methods dots may call, such as `dash.ui.alert`. Any other method fails as `unsupported`.\n handlers?: HostHandlers | undefined;\n // Asks the person for a permission the dot declared, the first time a method needs it.\n askPermission: AskPermission;\n observe?: ((direction: Direction, message: Envelope) => void) | undefined;\n // Opened in place of the dot's first page, such as the pages open before it reloaded. Pages the\n // dot no longer has are left out.\n restorePages?: readonly StackEntry[] | undefined;\n onBarsChange?: ((bars: HostBars, pages: readonly StackEntry[]) => void) | undefined;\n}\n\nexport interface Host {\n // The open pages, first page first.\n readonly pages: readonly StackEntry[];\n stop(): void;\n // Returns false on the first page, where a device closes the dot instead.\n back(): boolean;\n setSystemContext(context: SystemContext): void;\n}\n\n// The host contract in JavaScript. Native hosts implement the same contract in Swift or Kotlin.\n// Throws an IncompatibleDotError if it can't run the dot, before either layer hears anything.\nexport function startHost({\n logic,\n ui,\n manifest,\n runtimeVersion,\n systemContext,\n handlers = {},\n askPermission,\n observe,\n restorePages = [],\n onBarsChange,\n}: HostOptions): Host {\n checkCompatibility(manifest, { runtimeVersion });\n const stack = new NavigationStack();\n let context = systemContext;\n const permissions = new PermissionGate(manifest.name, manifest.permissions ?? {}, askPermission);\n const calls = new HostCallRunner(handlers, permissions, (result) => {\n const message: Envelope<'hostResult', HostResult> = { type: 'hostResult', payload: result };\n observe?.('fromHost', message);\n logic.post(message);\n });\n const broadcast = (message: Envelope) => {\n observe?.('fromHost', message);\n ui.post(message);\n logic.post(message);\n };\n const barsByInstance = new Map<number, PageBars>();\n const showBars = () => {\n const top = stack.top;\n const bars = top && barsByInstance.get(top.instanceId);\n onBarsChange?.(\n {\n title: bars?.navigationBar.title ?? manifest.name,\n navigationBarHidden: bars?.navigationBar.hidden ?? false,\n navigationBarColor: bars?.navigationBar.backgroundColor,\n navigationBarTextColor: bars?.navigationBar.textColor,\n tabBarHidden: bars?.tabBar.hidden ?? false,\n },\n stack.pages,\n );\n };\n const syncStack = () => {\n const message: Envelope<'syncStack', HostLayerMessages['syncStack']> = {\n type: 'syncStack',\n payload: { pages: stack.pages, limit: stack.limit },\n };\n broadcast(message);\n const open = new Set(stack.pages.map((entry) => entry.instanceId));\n for (const instanceId of barsByInstance.keys()) {\n if (!open.has(instanceId)) {\n barsByInstance.delete(instanceId);\n }\n }\n showBars();\n };\n const syncSystemContext = () => {\n const message: Envelope<'syncSystemContext', HostLayerMessages['syncSystemContext']> = {\n type: 'syncSystemContext',\n payload: context,\n };\n broadcast(message);\n };\n const navigate = (navigation: Navigation): boolean => {\n if (navigation.action !== 'back' && !manifest.pages.includes(navigation.page)) {\n return false;\n }\n const previousTop = stack.top;\n if (!stack.apply(navigation)) {\n return false;\n }\n syncStack();\n if (stack.top !== previousTop) {\n calls.dismissUI();\n }\n return true;\n };\n\n const openFirstPages = () => {\n const [first, ...rest] = restorePages.filter((entry) => manifest.pages.includes(entry.page));\n if (!first) {\n navigate({ action: 'reset', page: manifest.entry, options: {} });\n return;\n }\n stack.apply({ action: 'reset', page: first.page, options: first.options });\n for (const entry of rest) {\n stack.apply({ action: 'push', page: entry.page, options: entry.options });\n }\n syncStack();\n };\n\n // Only the page on top may navigate. A request from a page below it is dropped.\n const navigateFromPage = ({ from, ...navigation }: LogicLayerMessages['navigate']) => {\n if (from === stack.top?.instanceId) {\n navigate(navigation);\n }\n };\n // Service messages meant for the host itself. Every other message is relayed to the webview.\n const hostMessageHandlers = new Map<string, (payload: unknown) => void>([\n ['navigate', (payload) => navigateFromPage(payload as LogicLayerMessages['navigate'])],\n ['hostCall', (payload) => calls.run(payload as LogicLayerMessages['hostCall'])],\n ['hostCancel', (payload) => calls.cancel((payload as LogicLayerMessages['hostCancel']).id)],\n [\n 'pageBars',\n (payload) => {\n const { instanceId, ...bars } = payload as LogicLayerMessages['pageBars'];\n barsByInstance.set(instanceId, bars);\n showBars();\n },\n ],\n ]);\n\n const stopService = logic.listen((raw) => {\n const message = raw as Envelope;\n const handleHostMessage = hostMessageHandlers.get(message.type);\n if (handleHostMessage) {\n observe?.('toHost', message);\n handleHostMessage(message.payload);\n return;\n }\n observe?.('toWebview', message);\n ui.post(message);\n });\n const stopWebview = ui.listen((raw) => {\n const message = raw as Envelope;\n observe?.('toService', message);\n logic.post(message);\n if (message.type === 'connect') {\n syncSystemContext();\n openFirstPages();\n }\n });\n return {\n get pages() {\n return stack.pages;\n },\n back: () => navigate({ action: 'back', delta: 1 }),\n setSystemContext: (next) => {\n context = next;\n syncSystemContext();\n },\n stop: () => {\n stopService();\n stopWebview();\n },\n };\n}\n","","import simulatorPackage from '../package.json' with { type: 'json' };\n\nimport type { HostVersions } from './compatibility';\n\n// The simulator is released with the runtime, at the same version.\nexport const SIMULATOR_VERSIONS: HostVersions = {\n runtimeVersion: simulatorPackage.version,\n};\n","export const CLIENT_PATH = '/__dot/';\nexport const EVENTS_PATH = `${CLIENT_PATH}events`;\nexport const HTTP_PATH = `${CLIENT_PATH}network/http/`;\nexport const FILE_PATH = `${CLIENT_PATH}storage/file/`;\nexport const CACHE_PATH = `${CLIENT_PATH}storage/cache/`;\nexport const SECRET_PATH = `${CLIENT_PATH}storage/secret/`;\nexport const MEDIA_PATH = `${CLIENT_PATH}media/`;\nexport const TEMPORARY_FILES_PATH = `${CLIENT_PATH}files/`;\n\nexport const DOT_PATH = '/dot/';\nexport const WEBVIEW_URL = `${DOT_PATH}ui/index.html`;\nexport const WEBVIEW_SCRIPT_URL = `${DOT_PATH}ui/dot.js`;\nexport const SERVICE_URL = `${DOT_PATH}logic/dot.js`;\nexport const MANIFEST_URL = `${DOT_PATH}manifest.json`;\n","import type { HostErrorCode } from '@monimesl/dot-core';\nimport { HostError } from '@monimesl/dot-core';\n\ntype Answer<Result> = { result: Result } | { error: { code: HostErrorCode; message: string } };\n\n// Runs a Dash call on the dev server, as a native host runs it on the device.\nexport async function callDevServer<Result>(\n path: string,\n params: unknown,\n signal: AbortSignal,\n): Promise<Result> {\n const response = await fetch(path, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(params),\n signal,\n });\n const answer = (await response.json()) as Answer<Result>;\n if ('error' in answer) {\n throw new HostError(answer.error.code, answer.error.message);\n }\n return answer.result;\n}\n","// The largest file dash.storage.file.pick gives a dot, as on a phone.\nexport const MAX_PICKED_FILE_SIZE = 25 * 1024 * 1024;\n\nexport function tooLargeMessage(name: string): string {\n return `\"${name}\" is larger than 25 MB`;\n}\n","export function element<T extends Element>(selector: string): T {\n const node = document.querySelector<T>(selector);\n if (!node) {\n throw new Error(`The simulator page is missing ${selector}`);\n }\n return node;\n}\n\nexport function createElement<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n className: string,\n text?: string,\n): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n node.className = className;\n if (text !== undefined) {\n node.textContent = text;\n }\n return node;\n}\n","import { HostError } from '@monimesl/dot-core';\nimport type { AlertAction, AlertOptions, AlertResult } from '@monimesl/dot-dash';\n\nimport { createElement } from '../dom';\n\n// dash.ui.alert always sends actions, but a host doesn't trust what the service sends.\nconst DEFAULT_ACTIONS: AlertAction[] = [{ id: 'ok', label: 'OK' }];\n\n// `field`, when given, shows under the message. Enter in it chooses the last action.\nexport function alert(\n phone: HTMLElement,\n options: AlertOptions,\n signal: AbortSignal,\n field?: HTMLInputElement,\n): Promise<AlertResult> {\n return new Promise((resolve, reject) => {\n const layer = createElement('div', 'dialog-layer');\n const dialog = createElement('div', 'dialog');\n dialog.setAttribute('role', 'alertdialog');\n const body = createElement('div', 'dialog-body');\n body.append(createElement('div', 'dialog-title', options.title));\n if (options.message) {\n body.append(createElement('div', 'dialog-message', options.message));\n }\n if (field) {\n body.append(field);\n }\n const actions = options.actions ?? DEFAULT_ACTIONS;\n // Two actions sit side by side, as on iOS; more are stacked.\n const buttons = createElement(\n 'div',\n actions.length === 2 ? 'dialog-actions' : 'dialog-actions stacked',\n );\n for (const action of actions) {\n const button = createElement('button', action.role ?? 'default', action.label);\n button.addEventListener('click', () => {\n layer.remove();\n resolve({ action: action.id });\n });\n buttons.append(button);\n }\n dialog.append(body, buttons);\n layer.append(dialog);\n field?.addEventListener('keydown', (event) => {\n if (event.key === 'Enter') {\n (buttons.lastElementChild as HTMLButtonElement | null)?.click();\n }\n });\n signal.addEventListener('abort', () => {\n layer.remove();\n reject(new HostError('cancelled', 'The alert was dismissed'));\n });\n phone.append(layer);\n field?.focus();\n });\n}\n","import type { DotPermission } from '@monimesl/dot-core';\nimport { HostError } from '@monimesl/dot-core';\nimport type { DashMethods, DotFile, PhotoSource, ScannedCode } from '@monimesl/dot-dash';\n\nimport { MAX_PICKED_FILE_SIZE, tooLargeMessage } from '../../limits';\nimport { MEDIA_PATH } from '../../paths';\nimport { createElement } from '../dom';\nimport { callDevServer } from './dev-server';\nimport { alert } from './ui';\n\ntype PickPhotoParams = DashMethods['dash.media.pickPhoto']['params'];\ntype PickFileParams = DashMethods['dash.storage.file.pick']['params'];\n\n// The same limit and quality as DotHost on a phone.\nconst MAX_PHOTO_SIDE = 2048;\nconst JPEG_QUALITY = 0.85;\n\nexport function photoPermission(params: unknown): DotPermission {\n return photoSource(params) === 'camera' ? 'camera' : 'photoLibrary';\n}\n\n// A computer rarely has a camera, so both sources choose a file. The photo is redrawn as a JPEG,\n// which drops its location and other details, as a phone does.\nexport async function pickPhoto(\n phone: HTMLElement,\n note: (text: string) => void,\n params: unknown,\n signal: AbortSignal,\n): Promise<DotFile> {\n const source = photoSource(params);\n await allowPicker(phone, source === 'camera' ? 'Take a photo' : 'Choose a photo', signal);\n const file = await chooseFile('image/*', signal);\n const jpeg = await toJpeg(file);\n const name = jpegName(file.name);\n note(`photo (${source}): ${name}`);\n return keepOnDevServer('photo', { name, data: await base64(jpeg) }, signal);\n}\n\nexport async function pickFile(\n phone: HTMLElement,\n note: (text: string) => void,\n params: unknown,\n signal: AbortSignal,\n): Promise<DotFile> {\n const types = fileTypes(params);\n await allowPicker(phone, 'Choose a file', signal);\n const file = await chooseFile(types.join(','), signal);\n if (file.size > MAX_PICKED_FILE_SIZE) {\n throw new HostError('invalid', tooLargeMessage(file.name));\n }\n note(`file: ${file.name}`);\n const contentType = file.type || 'application/octet-stream';\n return keepOnDevServer(\n 'file',\n { name: file.name, contentType, data: await base64(file) },\n signal,\n );\n}\n\n// A computer has no scanner to point at a code, so the simulator asks for the text it holds.\nexport async function scanCode(\n phone: HTMLElement,\n note: (text: string) => void,\n signal: AbortSignal,\n): Promise<ScannedCode> {\n const field = createElement('input', 'dialog-input');\n field.placeholder = 'https://monime.io/pay/…';\n const { action } = await alert(\n phone,\n {\n title: 'Scan a QR code',\n message: 'Type or paste the text the code holds.',\n actions: [\n { id: 'cancel', label: 'Cancel', role: 'cancel' },\n { id: 'scan', label: 'Scan' },\n ],\n },\n signal,\n field,\n );\n const text = field.value.trim();\n if (action !== 'scan' || text === '') {\n throw new HostError('cancelled', 'No code was scanned');\n }\n note(`scanned: ${text}`);\n return { text, format: 'qr' };\n}\n\n// The photo's own name as a JPEG's. \"IMG_2041.HEIC\" becomes \"IMG_2041.jpg\".\nfunction jpegName(fileName: string): string {\n const dot = fileName.lastIndexOf('.');\n const withoutExtension = dot > 0 ? fileName.slice(0, dot) : fileName;\n return `${withoutExtension || 'photo'}.jpg`;\n}\n\nfunction photoSource(params: unknown): PhotoSource {\n const source = (params as Partial<PickPhotoParams> | null)?.source;\n if (source !== 'library' && source !== 'camera') {\n throw new HostError('invalid', '\"source\" must be \"library\" or \"camera\"');\n }\n return source;\n}\n\nfunction fileTypes(params: unknown): string[] {\n const types = (params as Partial<PickFileParams> | null)?.types ?? [];\n if (\n !Array.isArray(types) ||\n types.some((type) => typeof type !== 'string' || !type.includes('/'))\n ) {\n throw new HostError(\n 'invalid',\n '\"types\" must list content types, such as \"application/pdf\" or \"image/*\"',\n );\n }\n return types;\n}\n\n// The browser opens its file picker only soon after a tap. A call that comes later asks for one.\nasync function allowPicker(phone: HTMLElement, title: string, signal: AbortSignal): Promise<void> {\n if (navigator.userActivation.isActive) {\n return;\n }\n const { action } = await alert(\n phone,\n {\n title,\n message: 'The simulator picks a file from this computer.',\n actions: [\n { id: 'cancel', label: 'Cancel', role: 'cancel' },\n { id: 'choose', label: 'Choose' },\n ],\n },\n signal,\n );\n if (action !== 'choose') {\n throw new HostError('cancelled', 'Nothing was chosen');\n }\n}\n\nfunction chooseFile(accept: string, signal: AbortSignal): Promise<File> {\n return new Promise((resolve, reject) => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = accept;\n input.addEventListener('change', () => {\n const file = input.files?.[0];\n if (file) {\n resolve(file);\n } else {\n reject(new HostError('cancelled', 'Nothing was chosen'));\n }\n });\n input.addEventListener('cancel', () => {\n reject(new HostError('cancelled', 'Nothing was chosen'));\n });\n signal.addEventListener('abort', () => {\n reject(new HostError('cancelled', 'The call ended before anything was chosen'));\n });\n input.click();\n });\n}\n\nasync function toJpeg(file: File): Promise<Blob> {\n let image: ImageBitmap;\n try {\n image = await createImageBitmap(file, { imageOrientation: 'from-image' });\n } catch {\n throw new HostError('failed', `\"${file.name}\" isn't a photo the simulator can read`);\n }\n const scale = Math.min(1, MAX_PHOTO_SIDE / Math.max(image.width, image.height));\n const canvas = new OffscreenCanvas(\n Math.round(image.width * scale),\n Math.round(image.height * scale),\n );\n const context = canvas.getContext('2d');\n if (!context) {\n throw new HostError('failed', \"The browser couldn't draw the photo\");\n }\n context.drawImage(image, 0, 0, canvas.width, canvas.height);\n image.close();\n return canvas.convertToBlob({ type: 'image/jpeg', quality: JPEG_QUALITY });\n}\n\n// The dev server keeps what the person chose as a temporary file, as a phone does.\nfunction keepOnDevServer(\n kind: 'photo' | 'file',\n params: { name: string; contentType?: string; data: string },\n signal: AbortSignal,\n): Promise<DotFile> {\n return callDevServer<DotFile>(`${MEDIA_PATH}${kind}`, params, signal);\n}\n\n// A data URL is \"data:<type>;base64,<data>\", so the data is what follows the comma.\nfunction base64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.addEventListener('load', () => {\n const url = reader.result as string;\n resolve(url.slice(url.indexOf(',') + 1));\n });\n reader.addEventListener('error', () =>\n reject(new HostError('failed', \"The file couldn't be read\")),\n );\n reader.readAsDataURL(blob);\n });\n}\n","import type { DashMethods, TorchState, VibrateOptions } from '@monimesl/dot-dash';\nimport { HostError } from '@monimesl/dot-core';\n\nexport type ShareParams = DashMethods['dash.system.share']['params'];\n\nconst SHAKE_DURATION_MS = 300;\n\nconst SHAKE: Keyframe[] = [\n { transform: 'translateX(0)' },\n { transform: 'translateX(-5px)' },\n { transform: 'translateX(5px)' },\n { transform: 'translateX(-3px)' },\n { transform: 'translateX(3px)' },\n { transform: 'translateX(0)' },\n];\n\nexport async function vibrate(\n phone: HTMLElement,\n note: (text: string) => void,\n options: VibrateOptions,\n): Promise<void> {\n note(`vibrated: ${options.style}`);\n await phone.animate(SHAKE, { duration: SHAKE_DURATION_MS }).finished;\n}\n\nexport function torch(phone: HTMLElement, note: (text: string) => void, state: TorchState): void {\n phone.dataset.torch = state;\n note(`torch: ${state}`);\n}\n\nexport async function copyText(note: (text: string) => void, text: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(text);\n } catch (error) {\n throw new HostError('failed', `The browser blocked the clipboard: ${(error as Error).message}`);\n }\n note(`copied: ${text}`);\n}\n\n// Logs what a device's share sheet would get.\nexport function share(note: (text: string) => void, params: ShareParams): void {\n const parts = [params.text, params.url, params.file && `file ${params.file}`].filter(Boolean);\n if (parts.length === 0) {\n throw new HostError('invalid', 'share needs a text, a url or a file');\n }\n note(`shared: ${parts.join(' · ')}`);\n}\n\n// Opens the address in a new tab, as Dash opens it in the device's browser.\nexport function openUrl(note: (text: string) => void, url: string): void {\n if (!isHttps(url)) {\n throw new HostError('invalid', `Dash only opens https addresses, not ${url}`);\n }\n window.open(url, '_blank', 'noopener');\n note(`opened: ${url}`);\n}\n\nfunction isHttps(url: string): boolean {\n try {\n return new URL(url).protocol === 'https:';\n } catch {\n return false;\n }\n}\n\nexport function delay(milliseconds: number, signal: AbortSignal): Promise<void> {\n if (!Number.isFinite(milliseconds) || milliseconds < 0) {\n throw new HostError(\n 'invalid',\n `A delay is a number of milliseconds, 0 or more, not ${milliseconds}`,\n );\n }\n return new Promise((resolve) => {\n const timer = setTimeout(resolve, milliseconds);\n signal.addEventListener('abort', () => clearTimeout(timer));\n });\n}\n","import { HostError } from '@monimesl/dot-core';\nimport type { PickDateOptions, PickTimeOptions } from '@monimesl/dot-dash';\n\nimport { createElement } from '../dom';\nimport { alert } from './ui';\n\n// \"2026-10-24\", and \"19:30\" in 24 hours, as on a phone.\nconst DATE = /^\\d{4}-\\d{2}-\\d{2}$/;\nconst TIME = /^\\d{2}:\\d{2}$/;\n\n// The browser's own date input in a dialog, standing in for the phone's calendar.\nexport function pickDate(\n phone: HTMLElement,\n note: (text: string) => void,\n params: unknown,\n signal: AbortSignal,\n): Promise<string> {\n const { title, value, min, max } = (params ?? {}) as PickDateOptions;\n for (const [name, date] of Object.entries({ value, min, max })) {\n if (date !== undefined && !DATE.test(date)) {\n throw new HostError(\n 'invalid',\n `\"${name}\" must be a date such as \"2026-10-24\", not \"${date}\"`,\n );\n }\n }\n if (min && max && min > max) {\n throw new HostError('invalid', `\"min\" (${min}) is after \"max\" (${max})`);\n }\n return pick(phone, note, signal, {\n type: 'date',\n title: title ?? 'Choose a date',\n value,\n min,\n max,\n });\n}\n\n// The browser's own time input in a dialog, standing in for the phone's clock.\nexport function pickTime(\n phone: HTMLElement,\n note: (text: string) => void,\n params: unknown,\n signal: AbortSignal,\n): Promise<string> {\n const { title, value } = (params ?? {}) as PickTimeOptions;\n if (value !== undefined && !TIME.test(value)) {\n throw new HostError('invalid', `\"value\" must be a time such as \"19:30\", not \"${value}\"`);\n }\n return pick(phone, note, signal, { type: 'time', title: title ?? 'Choose a time', value });\n}\n\ninterface PickOptions {\n type: 'date' | 'time';\n title: string;\n value?: string | undefined;\n min?: string | undefined;\n max?: string | undefined;\n}\n\nasync function pick(\n phone: HTMLElement,\n note: (text: string) => void,\n signal: AbortSignal,\n { type, title, value, min, max }: PickOptions,\n): Promise<string> {\n const field = createElement('input', 'dialog-input');\n field.type = type;\n field.value = value ?? '';\n field.min = min ?? '';\n field.max = max ?? '';\n const { action } = await alert(\n phone,\n {\n title,\n actions: [\n { id: 'cancel', label: 'Cancel', role: 'cancel' },\n { id: 'done', label: 'Done' },\n ],\n },\n signal,\n field,\n );\n if (action !== 'done' || field.value === '') {\n throw new HostError('cancelled', `No ${type} was chosen`);\n }\n note(`${type}: ${field.value}`);\n return field.value;\n}\n","import type { AlertOptions, TorchState, VibrateOptions } from '@monimesl/dot-dash';\n\nimport type { HostCall, HostHandlers } from '../../host-calls';\nimport { CACHE_PATH, FILE_PATH, HTTP_PATH, SECRET_PATH } from '../../paths';\nimport { callDevServer } from './dev-server';\nimport { photoPermission, pickFile, pickPhoto, scanCode } from './media';\nimport type { ShareParams } from './system';\nimport { copyText, delay, openUrl, share, torch, vibrate } from './system';\nimport { pickDate, pickTime } from './pickers';\nimport { alert } from './ui';\n\nconst HTTP_METHODS = ['request', 'download', 'upload'] as const;\n\nconst FILE_OPERATIONS = [\n 'read',\n 'write',\n 'stat',\n 'list',\n 'createFolder',\n 'move',\n 'copy',\n 'remove',\n 'save',\n 'open',\n 'usage',\n] as const;\n\nconst CACHE_OPERATIONS = ['get', 'set', 'remove', 'exists', 'keys', 'clear'] as const;\n\nconst SECRET_OPERATIONS = ['get', 'set', 'remove', 'clear'] as const;\n\n// Stand-ins for what a device does natively. Network and storage calls go to the dev server.\nexport function dashHandlers(phone: HTMLElement, note: (text: string) => void): HostHandlers {\n return {\n 'dash.ui.alert': ({ params, signal }) => alert(phone, params as AlertOptions, signal),\n 'dash.ui.pickDate': ({ params, signal }) => pickDate(phone, note, params, signal),\n 'dash.ui.pickTime': ({ params, signal }) => pickTime(phone, note, params, signal),\n 'dash.system.vibrate': ({ params }) => vibrate(phone, note, params as VibrateOptions),\n 'dash.system.torch': ({ params }) =>\n torch(phone, note, (params as { state: TorchState }).state),\n 'dash.system.copyText': ({ params }) => copyText(note, (params as { text: string }).text),\n 'dash.system.share': ({ params }) => share(note, params as ShareParams),\n 'dash.system.openUrl': ({ params }) => openUrl(note, (params as { url: string }).url),\n 'dash.system.delay': ({ params, signal }) =>\n delay((params as { milliseconds: number }).milliseconds, signal),\n 'dash.media.pickPhoto': {\n permission: photoPermission,\n handle: ({ params, signal }) => pickPhoto(phone, note, params, signal),\n },\n 'dash.media.scanCode': {\n permission: 'camera',\n handle: ({ signal }) => scanCode(phone, note, signal),\n },\n 'dash.storage.file.pick': {\n permission: 'files',\n handle: ({ params, signal }) => pickFile(phone, note, params, signal),\n },\n ...devServerHandlers('dash.network.http', HTTP_PATH, HTTP_METHODS),\n ...devServerHandlers('dash.storage.file', FILE_PATH, FILE_OPERATIONS),\n ...devServerHandlers('dash.storage.cache', CACHE_PATH, CACHE_OPERATIONS),\n ...devServerHandlers('dash.storage.secret', SECRET_PATH, SECRET_OPERATIONS),\n };\n}\n\nfunction devServerHandlers(group: string, path: string, names: readonly string[]): HostHandlers {\n return Object.fromEntries(\n names.map((name) => [\n `${group}.${name}`,\n ({ params, signal }: HostCall) => callDevServer(`${path}${name}`, params, signal),\n ]),\n );\n}\n","import type { DotPermission } from '@monimesl/dot-core';\n\nimport type { PermissionRequest } from '../../permissions';\nimport { alert } from './ui';\n\n// Finishes \"Allow “Counter” to …?\".\nconst PERMISSION_SUMMARIES: Record<DotPermission, string> = {\n account: 'see your Dash account: your name, and your email or phone',\n camera: 'use your camera to take photos and scan codes',\n photoLibrary: 'use photos you choose from your library',\n files: 'use files you choose from your phone',\n};\n\n// Asks as Dash would, with the dot's name, what it wants, and the reason from its dot.json.\nexport async function askPermission(\n phone: HTMLElement,\n note: (text: string) => void,\n request: PermissionRequest,\n signal: AbortSignal,\n): Promise<boolean> {\n const { action } = await alert(\n phone,\n {\n title: `Allow “${request.dotName}” to ${PERMISSION_SUMMARIES[request.permission]}?`,\n message: request.reason,\n actions: [\n { id: 'deny', label: \"Don't Allow\", role: 'cancel' },\n { id: 'allow', label: 'Allow' },\n ],\n },\n signal,\n );\n const allowed = action === 'allow';\n if (allowed) {\n note(`permission ${request.permission}: allowed`);\n } else {\n note(`permission ${request.permission}: not allowed`);\n }\n return allowed;\n}\n","import type { Transport } from '@monimesl/dot-core';\n\n// Native bridges only carry strings. Encoding to JSON here makes state that a device can't carry\n// fail in the simulator too.\ninterface Wire {\n readonly dot: string;\n}\n\nfunction isWire(data: unknown): data is Wire {\n return typeof (data as Partial<Wire> | null)?.dot === 'string';\n}\n\nexport function wireTransport(channel: Transport): Transport {\n return {\n post: (message) => channel.post({ dot: JSON.stringify(message) } satisfies Wire),\n listen: (listener) =>\n channel.listen((data) => {\n if (isWire(data)) {\n listener(JSON.parse(data.dot));\n }\n }),\n };\n}\n\n// The simulator page and the webview's iframe, each accepting messages only from the other.\nexport function windowChannel(other: () => Window | null): Transport {\n return {\n post: (message) => other()?.postMessage(message, location.origin),\n listen(listener) {\n const onMessage = (event: MessageEvent) => {\n if (event.source === other()) {\n listener(event.data);\n }\n };\n window.addEventListener('message', onMessage);\n return () => window.removeEventListener('message', onMessage);\n },\n };\n}\n","import type {\n AppState,\n ColorScheme,\n Envelope,\n StackEntry,\n SystemContext,\n} from '@monimesl/dot-core';\nimport { createAdaptorTransport } from '@monimesl/dot-core';\n\nimport type { Direction, Host, HostBars } from '../host';\nimport type { HostManifest } from '../manifest';\nimport { checkCompatibility } from '../compatibility';\nimport { startHost } from '../host';\nimport { SIMULATOR_VERSIONS } from '../versions';\nimport { CLIENT_PATH, EVENTS_PATH, MANIFEST_URL, WEBVIEW_URL } from '../paths';\nimport { dashHandlers } from './dash';\nimport { askPermission } from './dash/permissions';\nimport { createElement, element } from './dom';\nimport type { HotReload } from './hot-reload';\nimport { windowChannel, wireTransport } from './wire';\n\nconst MAX_LOG_ENTRIES = 500;\n// Where this browser remembers whether the messages panel shows.\nconst MESSAGES_SHOWN_KEY = 'dot-simulator-messages';\n\nconst screen = element<HTMLIFrameElement>('#screen');\nconst log = element<HTMLOListElement>('#log');\nconst messagesPanel = element<HTMLElement>('#messages-panel');\nconst messagesButton = element<HTMLButtonElement>('#messages');\nconst errorBanner = element<HTMLPreElement>('#error');\nconst phone = element<HTMLDivElement>('.phone');\nconst schemeSelect = element<HTMLSelectElement>('#scheme');\nconst navigationBar = element<HTMLElement>('.navigation-bar');\nconst navigationTitle = element<HTMLElement>('#navigation-title');\nconst navigationBack = element<HTMLButtonElement>('#navigation-back');\nconst tabBar = element<HTMLElement>('.tab-bar');\nconst clock = element<HTMLElement>('.clock');\nconst browserDark = matchMedia('(prefers-color-scheme: dark)');\n// The status bar's clock follows the computer's, in 24-hour time, such as 14:05.\nconst timeFormat = new Intl.DateTimeFormat('en-GB', {\n hour: '2-digit',\n minute: '2-digit',\n hourCycle: 'h23',\n});\nfunction showTime(): void {\n clock.textContent = timeFormat.format(new Date());\n}\nshowTime();\nsetInterval(showTime, 1000);\n\ninterface RunningDot {\n readonly host: Host;\n readonly worker: Worker;\n}\n\nlet runningDot: RunningDot | null = null;\nlet launchCount = 0;\nlet hotReloads = 0;\n\nasync function launch(restorePages: readonly StackEntry[] = []): Promise<void> {\n stopRunningDot();\n launchCount += 1;\n const thisLaunch = launchCount;\n if (log.childElementCount > 0) {\n note('dot restarted');\n }\n\n let manifest: HostManifest;\n try {\n const response = await fetch(MANIFEST_URL);\n manifest = (await response.json()) as HostManifest;\n } catch {\n showError(\n `There's nothing to run, because ${MANIFEST_URL} is missing. Check whether the build failed.`,\n );\n return;\n }\n // Another reload started while the manifest loaded. Only the newest launch may start the dot.\n if (thisLaunch !== launchCount) {\n return;\n }\n\n // startHost checks too, but checking here means a refused dot never starts a worker.\n const handlers = dashHandlers(phone, note);\n try {\n checkCompatibility(manifest, SIMULATOR_VERSIONS);\n } catch (error) {\n screen.src = 'about:blank';\n showError((error as Error).message);\n return;\n }\n\n const worker = new Worker(`${CLIENT_PATH}service-bridge.js`);\n const service = wireTransport(createAdaptorTransport(worker));\n const webview = wireTransport(windowChannel(() => screen.contentWindow));\n const host = startHost({\n logic: service,\n ui: webview,\n manifest,\n ...SIMULATOR_VERSIONS,\n systemContext: systemContext(),\n handlers,\n askPermission: (request, signal) => askPermission(phone, note, request, signal),\n observe: record,\n restorePages,\n onBarsChange: showBars,\n });\n worker.addEventListener('error', (event) =>\n showError(`The dot's service crashed: ${event.message}`),\n );\n screen.src = WEBVIEW_URL;\n runningDot = { host, worker };\n}\n\nfunction stopRunningDot(): void {\n if (!runningDot) {\n return;\n }\n runningDot.host.stop();\n runningDot.worker.terminate();\n runningDot = null;\n}\n\n// Shows the bars for the page on top, as Dash would.\nfunction showBars(bars: HostBars, pages: readonly StackEntry[]): void {\n navigationBar.hidden = bars.navigationBarHidden;\n navigationTitle.textContent = bars.title;\n navigationBack.hidden = pages.length < 2;\n setBarColor('--bar', bars.navigationBarColor);\n setBarColor('--bar-text', bars.navigationBarTextColor);\n tabBar.hidden = bars.tabBarHidden;\n}\n\n// Falls back to Dash's own color when the page sets none.\nfunction setBarColor(property: string, color: string | undefined): void {\n if (color) {\n phone.style.setProperty(property, color);\n } else {\n phone.style.removeProperty(property);\n }\n}\n\nfunction goBack(): void {\n if (runningDot && !runningDot.host.back()) {\n note('back on the first page, where a phone would close the dot');\n }\n}\n\nconst ARROWS: Record<Direction, string> = {\n toHost: 'both --> host',\n fromHost: 'host --> both',\n toService: 'ui --> logic',\n toWebview: 'ui <-- logic',\n};\n\nfunction note(text: string): void {\n log.append(createElement('li', 'note', text));\n}\n\nfunction record(direction: Direction, message: Envelope): void {\n const entry = createElement('li', direction);\n const details = document.createElement('details');\n const summary = document.createElement('summary');\n const time = new Date().toLocaleTimeString([], { hour12: false });\n summary.append(\n createElement('span', 'time', time),\n createElement('span', 'arrow', ARROWS[direction]),\n createElement('span', 'type', message.type),\n );\n const payload = document.createElement('pre');\n payload.textContent = JSON.stringify(message.payload, null, 2);\n details.append(summary, payload);\n entry.append(details);\n if (message.type === 'error') {\n entry.classList.add('failed');\n }\n log.append(entry);\n while (log.childElementCount > MAX_LOG_ENTRIES) {\n log.firstElementChild?.remove();\n }\n log.scrollTop = log.scrollHeight;\n}\n\nfunction restart(restorePages: readonly StackEntry[] = []): void {\n launch(restorePages).catch((error: unknown) => {\n showError(`Could not start the dot: ${String(error)}`);\n });\n}\n\n// A new build, so the dot starts again on the pages it had open.\nfunction relaunch(): void {\n restart(runningDot?.host.pages ?? []);\n}\n\n// A new build that changed only pages. It runs in place, and each open page keeps its state.\nfunction hotReload(): void {\n if (!runningDot) {\n restart();\n return;\n }\n hotReloads += 1;\n const reload: HotReload = { dotHotReload: hotReloads };\n // The service goes first, so a page whose initial state changed has already reset when its view redraws.\n runningDot.worker.postMessage(reload);\n screen.contentWindow?.postMessage(reload, location.origin);\n note('dot updated in place');\n}\n\nfunction showError(message: string | null): void {\n errorBanner.hidden = message === null;\n errorBanner.textContent = message ?? '';\n}\n\nfunction syncSystemContext(): void {\n runningDot?.host.setSystemContext(systemContext());\n}\n\nfunction systemContext(): SystemContext {\n return {\n scheme: schemeSelect.value as ColorScheme,\n appState: appState(),\n };\n}\n\n// Leaving the simulator's tab stands in for leaving Dash.\nfunction appState(): AppState {\n if (document.visibilityState === 'hidden') {\n return 'background';\n }\n return 'active';\n}\n\nfunction browserScheme(): ColorScheme {\n return browserDark.matches ? 'dark' : 'light';\n}\n\nfunction changeScheme(scheme: ColorScheme): void {\n schemeSelect.value = scheme;\n phone.dataset.scheme = scheme;\n syncSystemContext();\n}\n\nconst events = new EventSource(EVENTS_PATH);\nevents.addEventListener('reload', () => {\n showError(null);\n relaunch();\n});\nevents.addEventListener('hot-reload', () => {\n showError(null);\n hotReload();\n});\nevents.addEventListener('build-error', (event) => showError(String(event.data)));\n\n// Hidden, the panel still collects messages, so showing it again shows what happened meanwhile.\nfunction showMessages(shown: boolean): void {\n messagesPanel.hidden = !shown;\n messagesButton.setAttribute('aria-pressed', String(shown));\n}\n\n// Shows the panel if it's hidden, or hides it, and remembers that in this browser.\nfunction toggleMessages(): void {\n const shown = messagesPanel.hidden;\n showMessages(shown);\n try {\n localStorage.setItem(MESSAGES_SHOWN_KEY, String(shown));\n } catch {\n // The browser keeps no site data, so the choice lasts until the page reloads.\n }\n}\n\n// Shown unless this browser hid it last time.\nfunction messagesShownLastTime(): boolean {\n try {\n return localStorage.getItem(MESSAGES_SHOWN_KEY) !== 'false';\n } catch {\n return true;\n }\n}\n\n// Starts the dot over, on its first page.\nelement('#reload').addEventListener('click', () => restart());\nelement('#back').addEventListener('click', goBack);\nnavigationBack.addEventListener('click', goBack);\nelement('#clear').addEventListener('click', () => log.replaceChildren());\nmessagesButton.addEventListener('click', toggleMessages);\nschemeSelect.addEventListener('change', () => changeScheme(schemeSelect.value as ColorScheme));\nbrowserDark.addEventListener('change', () => changeScheme(browserScheme()));\ndocument.addEventListener('visibilitychange', syncSystemContext);\n\nchangeScheme(browserScheme());\nshowMessages(messagesShownLastTime());\nrestart();\n"],"mappings":";;CAOA,SAAS,gBAAgB,UAAU;EAClC,OAAO;GACN,OAAO,CAAC;GACR,QAAQ,CAAC;GACT,GAAG;EACJ;CACD;CAYA,SAAS,kBAAkB,WAAW;EACrC,MAAM,WAAW,CAAC;EAClB,KAAK,MAAM,YAAY,WAAW;GACjC,IAAI,SAAS,QAAQ,UAAU,MAAM,IAAI,MAAM,cAAc,SAAS,KAAK,mBAAmB;GAC9F,SAAS,SAAS,QAAQ;EAC3B;EACA,OAAO;CACR;CAoBA,MAAM,cAAc,gBAAgB;EACnC,MAAM;EACN,OAAO;GACN,OAAO;GACP,UAAU;GACV,YAAY;GACZ,MAAM,CAAC,SAAS,OAAO;GACvB,OAAO;GACP,aAAa;GACb,MAAM;GACN,OAAO;GACP,UAAU;EACX;EACA,QAAQ,CAAC,QAAQ;EACjB,UAAU;CACX,CAAC;CAGD,MAAM,SAAS,gBAAgB;EAC9B,MAAM;EACN,OAAO;GACN,SAAS,CAAC,WAAW,WAAW;GAChC,UAAU;GACV,SAAS;EACV;EACA,QAAQ,CAAC,OAAO;EAChB,UAAU;CACX,CAAC;CAGD,MAAM,QAAQ;EACb;EACA;EACA;CACD;CACA,MAAM,SAAS;EACd;EACA;EACA;EACA;CACD;CACA,MAAM,gBAAgB;EACrB,SAAS;EACT,YAAY;EACZ,cAAc;EACd,YAAY;EACZ,eAAe;CAChB;CACA,MAAM,UAAU;EACf;EACA;EACA;EACA;EACA;EACA;EACA;CACD;CACA,MAAM,QAAQ;EACb;EACA;EACA;EACA;EACA;EACA;CACD;CACA,MAAM,aAAa;EAClB,OAAO,CAAC,GAAG,OAAO,WAAW;EAC7B,IAAI;CACL;CACA,MAAM,cAAc;EACnB,OAAO;GACN;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACD;EACA,IAAI;CACL;CACA,MAAM,UAAU;EACf;EACA;EACA;CACD;CACA,MAAM,QAAQ;EACb;EACA;EACA;EACA;EACA;CACD;CACA,MAAM,SAAS;EACd,OAAO,CAAC,MAAM;EACd,IAAI;CACL;CACA,MAAM,YAAY;EACjB,YAAY;EACZ,QAAQ;EACR,QAAQ;EACR,OAAO;EACP,QAAQ;EACR,WAAW;EACX,UAAU;EACV,QAAQ;CACT;CACA,MAAM,eAAe;EACpB;EACA;EACA;EACA;EACA;CACD;CACA,MAAM,aAAa;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD;CAGA,MAAM,WAAW,gBAAgB;EAChC,MAAM;EACN,OAAO;GACN,UAAU;GACV,UAAU;GACV,MAAM;GACN,WAAW,CAAC,QAAQ,MAAM;GAC1B,KAAK;GACL,QAAQ,CAAC,SAAS,OAAO;GACzB,OAAO;GACP,GAAG;EACJ;EACA,QAAQ,CAAC,QAAQ;EACjB,UAAU;CACX,CAAC;CAGD,MAAM,OAAO,gBAAgB;EAC5B,MAAM;EACN,OAAO;GACN,OAAO;GACP,MAAM;GACN,UAAU;GACV,UAAU;EACX;EACA,QAAQ,CAAC,KAAK;EACd,UAAU;CACX,CAAC;CAGD,MAAM,YAAY,gBAAgB;EACjC,MAAM;EACN,OAAO;GACN,OAAO;GACP,QAAQ;GACR,OAAO;GACP,MAAM;GACN,OAAO;GACP,QAAQ;GACR,UAAU;EACX;EACA,QAAQ,CAAC,UAAU,UAAU;EAC7B,UAAU;CACX,CAAC;CAGD,MAAM,YAAY,gBAAgB;EACjC,MAAM;EACN,OAAO;GACN,OAAO;GACP,OAAO;GACP,MAAM;GACN,QAAQ;IACP;IACA;IACA;GACD;GACA,GAAG;EACJ;EACA,UAAU;CACX,CAAC;CAGD,MAAM,UAAU,gBAAgB;EAC/B,MAAM;EACN,UAAU;CACX,CAAC;CAGD,MAAM,aAAa,gBAAgB;EAClC,MAAM;EACN,OAAO;GACN,MAAM;GACN,OAAO;GACP,MAAM;GACN,GAA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"}
@@ -271,7 +271,7 @@ function startHost({ logic, ui, manifest, runtimeVersion, systemContext, handler
271
271
  }
272
272
  //#endregion
273
273
  //#region src/versions.ts
274
- const SIMULATOR_VERSIONS = { runtimeVersion: "0.1.0-alpha.16" };
274
+ const SIMULATOR_VERSIONS = { runtimeVersion: "0.1.0-alpha.18" };
275
275
  //#endregion
276
276
  //#region src/paths.ts
277
277
  const CLIENT_PATH = "/__dot/";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@monimesl/dot-simulator",
3
- "version": "0.1.0-alpha.16",
3
+ "version": "0.1.0-alpha.18",
4
4
  "description": "Browser host for Dot mini apps: runs the service in a Worker and the webview in a device frame",
5
5
  "type": "module",
6
6
  "repository": {
@@ -24,7 +24,7 @@
24
24
  "main": "./dist/node/index.js",
25
25
  "types": "./dist/node/index.d.ts",
26
26
  "dependencies": {
27
- "@monimesl/dot-core": "0.1.0-alpha.16"
27
+ "@monimesl/dot-core": "0.1.0-alpha.18"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@types/node": "^22.20.4",
@@ -33,7 +33,7 @@
33
33
  "tsdown": "^0.23.0",
34
34
  "typescript": "^5.9.3",
35
35
  "vitest": "^5.0.1",
36
- "@monimesl/dot-dash": "0.1.0-alpha.16"
36
+ "@monimesl/dot-dash": "0.1.0-alpha.18"
37
37
  },
38
38
  "publishConfig": {
39
39
  "access": "public"