{"version":3,"file":"view.js","names":[],"sources":["esm/platform/widgets/view.js"],"sourcesContent":["import {\n  Children,\n  Fragment,\n  isValidElement\n} from \"react\";\nconst WidgetUI = Object.freeze({\n  Text: \"one-widget-text\",\n  VStack: \"one-widget-vstack\",\n  HStack: \"one-widget-hstack\",\n  ZStack: \"one-widget-zstack\",\n  Spacer: \"one-widget-spacer\",\n  Divider: \"one-widget-divider\",\n  Image: \"one-widget-image\",\n  Progress: \"one-widget-progress\",\n  Gauge: \"one-widget-gauge\",\n  Circle: \"one-widget-circle\",\n  Rectangle: \"one-widget-rectangle\",\n  RoundedRectangle: \"one-widget-rounded-rectangle\",\n  Link: \"one-widget-link\"\n});\nconst hexColor = /^#[0-9a-fA-F]{6}$/;\nconst styleNumberKeys = [\n  \"fontSize\",\n  \"padding\",\n  \"borderRadius\",\n  \"spacing\",\n  \"width\",\n  \"height\",\n  \"opacity\"\n];\nconst styleStringKeys = [\"fontWeight\", \"fontDesign\", \"alignment\"];\nfunction checkStyle(style, fill) {\n  if (fill != null && (typeof fill !== \"string\" || !hexColor.test(fill))) {\n    throw new Error(\"WidgetUI fill must be six-digit hex like #1685B1\");\n  }\n  if (style == null) return;\n  if (typeof style !== \"object\" || Array.isArray(style)) {\n    throw new Error(\"WidgetUI style must be an object\");\n  }\n  for (const key of [\"color\", \"backgroundColor\"]) {\n    const value = style[key];\n    if (value != null && (typeof value !== \"string\" || !hexColor.test(value))) {\n      throw new Error(`WidgetUI ${key} must be six-digit hex like #1685B1`);\n    }\n  }\n  if (style.lineLimit != null && (typeof style.lineLimit !== \"number\" || !Number.isInteger(style.lineLimit))) {\n    throw new Error(\"WidgetUI lineLimit must be an integer\");\n  }\n  for (const key of styleNumberKeys) {\n    if (style[key] != null && typeof style[key] !== \"number\") {\n      throw new Error(`WidgetUI ${key} must be a number`);\n    }\n  }\n  for (const key of styleStringKeys) {\n    if (style[key] != null && typeof style[key] !== \"string\") {\n      throw new Error(`WidgetUI ${key} must be a string`);\n    }\n  }\n}\nfunction node(view) {\n  if (view == null || typeof view === \"boolean\") return null;\n  if (typeof view === \"string\" || typeof view === \"number\") {\n    return { type: \"text\", text: String(view) };\n  }\n  if (Array.isArray(view)) {\n    return { type: \"vstack\", children: children(view) };\n  }\n  if (!isValidElement(view)) {\n    throw new Error(\"Widget JSX needs a WidgetUI root\");\n  }\n  if (view.type === Fragment) {\n    return { type: \"vstack\", children: children(view.props.children) };\n  }\n  if (typeof view.type === \"function\") {\n    if (view.type.prototype && \"isReactComponent\" in view.type.prototype) {\n      throw new Error(\"Widget JSX supports pure function components\");\n    }\n    return node(view.type(view.props));\n  }\n  const type = typeof view.type === \"string\" && view.type.startsWith(\"one-widget-\") ? view.type.slice(\"one-widget-\".length) : void 0;\n  if (!type || ![\n    \"text\",\n    \"vstack\",\n    \"hstack\",\n    \"zstack\",\n    \"spacer\",\n    \"divider\",\n    \"image\",\n    \"progress\",\n    \"gauge\",\n    \"circle\",\n    \"rectangle\",\n    \"rounded-rectangle\",\n    \"link\"\n  ].includes(type)) {\n    throw new Error(\"Widget JSX only supports WidgetUI primitives and pure components\");\n  }\n  const {\n    children: content,\n    style,\n    ...props\n  } = view.props;\n  checkStyle(style, props.fill);\n  if (props.cornerRadius != null && typeof props.cornerRadius !== \"number\") {\n    throw new Error(\"WidgetUI cornerRadius must be a number\");\n  }\n  if (type === \"text\") {\n    const parts = Children.toArray(content);\n    if (parts.some((part) => typeof part !== \"string\" && typeof part !== \"number\")) {\n      throw new Error(\"WidgetUI.Text children must be text or numbers\");\n    }\n    return { type, text: parts.join(\"\"), style };\n  }\n  if (type === \"image\") {\n    if (typeof props.systemName !== \"string\" || !props.systemName) {\n      throw new Error(\"WidgetUI.Image needs a systemName\");\n    }\n    return { type, style, systemName: props.systemName };\n  }\n  if (type === \"progress\" || type === \"gauge\") {\n    if (!Number.isFinite(props.value) || !Number.isFinite(props.total ?? 1) || (props.total ?? 1) <= 0) {\n      throw new Error(\n        \"WidgetUI progress values must be finite and total must be positive\"\n      );\n    }\n    return { type, style, value: props.value, total: props.total ?? 1 };\n  }\n  if (type === \"circle\" || type === \"rectangle\" || type === \"rounded-rectangle\") {\n    return { type, style, fill: props.fill, cornerRadius: props.cornerRadius };\n  }\n  if (type === \"link\") {\n    let valid = false;\n    try {\n      valid = Boolean(new URL(props.url).protocol);\n    } catch {\n    }\n    if (!valid) {\n      throw new Error(\"WidgetUI.Link needs an absolute URL\");\n    }\n    return { type, style, url: props.url, children: children(content) };\n  }\n  if (type === \"spacer\" || type === \"divider\") return { type, style };\n  return { type, style, children: children(content) };\n}\nfunction children(content) {\n  const nodes = [];\n  for (const child of Children.toArray(content)) {\n    const next = node(child);\n    if (next) nodes.push(next);\n  }\n  return nodes;\n}\nfunction encodeWidgetView(view) {\n  const root = node(view);\n  if (!root) {\n    throw new Error(\"Widget JSX needs a WidgetUI root\");\n  }\n  return JSON.stringify(root);\n}\nfunction encodeActivityView(view) {\n  const lockScreen = node(view.lockScreen);\n  if (!lockScreen) {\n    throw new Error(\"Live Activity JSX needs a lockScreen layout\");\n  }\n  const encoded = JSON.stringify({\n    lockScreen,\n    compactLeading: view.compactLeading == null ? null : node(view.compactLeading),\n    compactTrailing: view.compactTrailing == null ? null : node(view.compactTrailing),\n    minimal: view.minimal == null ? null : node(view.minimal),\n    expandedLeading: view.expandedLeading == null ? null : node(view.expandedLeading),\n    expandedTrailing: view.expandedTrailing == null ? null : node(view.expandedTrailing),\n    expandedBottom: view.expandedBottom == null ? null : node(view.expandedBottom)\n  });\n  if (new TextEncoder().encode(encoded).length > 3500) {\n    throw new Error(\"Live Activity JSX must fit within 3500 UTF-8 bytes\");\n  }\n  return encoded;\n}\nexport {\n  WidgetUI,\n  encodeActivityView,\n  encodeWidgetView\n};\n//# sourceMappingURL=view.js.map\n"],"mappings":";;;AAKA,MAAM,WAAW,OAAO,OAAO;CAC7B,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,OAAO;CACP,UAAU;CACV,OAAO;CACP,QAAQ;CACR,WAAW;CACX,kBAAkB;CAClB,MAAM;AACR,CAAC;AACD,MAAM,WAAW;AACjB,MAAM,kBAAkB;CACtB;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AACA,MAAM,kBAAkB;CAAC;CAAc;CAAc;AAAW;AAChE,SAAS,WAAW,OAAO,MAAM;CAC/B,IAAI,QAAQ,SAAS,OAAO,SAAS,YAAY,CAAC,SAAS,KAAK,IAAI,IAAI;EACtE,MAAM,IAAI,MAAM,kDAAkD;CACpE;CACA,IAAI,SAAS,MAAM;CACnB,IAAI,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;EACrD,MAAM,IAAI,MAAM,kCAAkC;CACpD;CACA,KAAK,MAAM,OAAO,CAAC,SAAS,iBAAiB,GAAG;EAC9C,MAAM,QAAQ,MAAM;EACpB,IAAI,SAAS,SAAS,OAAO,UAAU,YAAY,CAAC,SAAS,KAAK,KAAK,IAAI;GACzE,MAAM,IAAI,MAAM,YAAY,IAAI,oCAAoC;EACtE;CACF;CACA,IAAI,MAAM,aAAa,SAAS,OAAO,MAAM,cAAc,YAAY,CAAC,OAAO,UAAU,MAAM,SAAS,IAAI;EAC1G,MAAM,IAAI,MAAM,uCAAuC;CACzD;CACA,KAAK,MAAM,OAAO,iBAAiB;EACjC,IAAI,MAAM,QAAQ,QAAQ,OAAO,MAAM,SAAS,UAAU;GACxD,MAAM,IAAI,MAAM,YAAY,IAAI,kBAAkB;EACpD;CACF;CACA,KAAK,MAAM,OAAO,iBAAiB;EACjC,IAAI,MAAM,QAAQ,QAAQ,OAAO,MAAM,SAAS,UAAU;GACxD,MAAM,IAAI,MAAM,YAAY,IAAI,kBAAkB;EACpD;CACF;AACF;AACA,SAAS,KAAK,MAAM;CAClB,IAAI,QAAQ,QAAQ,OAAO,SAAS,WAAW,OAAO;CACtD,IAAI,OAAO,SAAS,YAAY,OAAO,SAAS,UAAU;EACxD,OAAO;GAAE,MAAM;GAAQ,MAAM,OAAO,IAAI;EAAE;CAC5C;CACA,IAAI,MAAM,QAAQ,IAAI,GAAG;EACvB,OAAO;GAAE,MAAM;GAAU,UAAU,SAAS,IAAI;EAAE;CACpD;CACA,IAAI,CAAC,eAAe,IAAI,GAAG;EACzB,MAAM,IAAI,MAAM,kCAAkC;CACpD;CACA,IAAI,KAAK,SAAS,UAAU;EAC1B,OAAO;GAAE,MAAM;GAAU,UAAU,SAAS,KAAK,MAAM,QAAQ;EAAE;CACnE;CACA,IAAI,OAAO,KAAK,SAAS,YAAY;EACnC,IAAI,KAAK,KAAK,aAAa,sBAAsB,KAAK,KAAK,WAAW;GACpE,MAAM,IAAI,MAAM,8CAA8C;EAChE;EACA,OAAO,KAAK,KAAK,KAAK,KAAK,KAAK,CAAC;CACnC;CACA,MAAM,OAAO,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,WAAW,aAAa,IAAI,KAAK,KAAK,MAAM,cAAc,MAAM,IAAI,KAAK;CACjI,IAAI,CAAC,QAAQ,CAAC;EACZ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,SAAS,IAAI,GAAG;EAChB,MAAM,IAAI,MAAM,kEAAkE;CACpF;CACA,MAAM,EACJ,UAAU,SACV,OACA,GAAG,UACD,KAAK;CACT,WAAW,OAAO,MAAM,IAAI;CAC5B,IAAI,MAAM,gBAAgB,QAAQ,OAAO,MAAM,iBAAiB,UAAU;EACxE,MAAM,IAAI,MAAM,wCAAwC;CAC1D;CACA,IAAI,SAAS,QAAQ;EACnB,MAAM,QAAQ,SAAS,QAAQ,OAAO;EACtC,IAAI,MAAM,MAAM,SAAS,OAAO,SAAS,YAAY,OAAO,SAAS,QAAQ,GAAG;GAC9E,MAAM,IAAI,MAAM,gDAAgD;EAClE;EACA,OAAO;GAAE;GAAM,MAAM,MAAM,KAAK,EAAE;GAAG;EAAM;CAC7C;CACA,IAAI,SAAS,SAAS;EACpB,IAAI,OAAO,MAAM,eAAe,YAAY,CAAC,MAAM,YAAY;GAC7D,MAAM,IAAI,MAAM,mCAAmC;EACrD;EACA,OAAO;GAAE;GAAM;GAAO,YAAY,MAAM;EAAW;CACrD;CACA,IAAI,SAAS,cAAc,SAAS,SAAS;EAC3C,IAAI,CAAC,OAAO,SAAS,MAAM,KAAK,KAAK,CAAC,OAAO,SAAS,MAAM,SAAS,CAAC,MAAM,MAAM,SAAS,MAAM,GAAG;GAClG,MAAM,IAAI,MACR,oEACF;EACF;EACA,OAAO;GAAE;GAAM;GAAO,OAAO,MAAM;GAAO,OAAO,MAAM,SAAS;EAAE;CACpE;CACA,IAAI,SAAS,YAAY,SAAS,eAAe,SAAS,qBAAqB;EAC7E,OAAO;GAAE;GAAM;GAAO,MAAM,MAAM;GAAM,cAAc,MAAM;EAAa;CAC3E;CACA,IAAI,SAAS,QAAQ;EACnB,IAAI,QAAQ;EACZ,IAAI;GACF,QAAQ,QAAQ,IAAI,IAAI,MAAM,GAAG,CAAC,CAAC,QAAQ;EAC7C,QAAQ,CACR;EACA,IAAI,CAAC,OAAO;GACV,MAAM,IAAI,MAAM,qCAAqC;EACvD;EACA,OAAO;GAAE;GAAM;GAAO,KAAK,MAAM;GAAK,UAAU,SAAS,OAAO;EAAE;CACpE;CACA,IAAI,SAAS,YAAY,SAAS,WAAW,OAAO;EAAE;EAAM;CAAM;CAClE,OAAO;EAAE;EAAM;EAAO,UAAU,SAAS,OAAO;CAAE;AACpD;AACA,SAAS,SAAS,SAAS;CACzB,MAAM,QAAQ,CAAC;CACf,KAAK,MAAM,SAAS,SAAS,QAAQ,OAAO,GAAG;EAC7C,MAAM,OAAO,KAAK,KAAK;EACvB,IAAI,MAAM,MAAM,KAAK,IAAI;CAC3B;CACA,OAAO;AACT;AACA,SAAS,iBAAiB,MAAM;CAC9B,MAAM,OAAO,KAAK,IAAI;CACtB,IAAI,CAAC,MAAM;EACT,MAAM,IAAI,MAAM,kCAAkC;CACpD;CACA,OAAO,KAAK,UAAU,IAAI;AAC5B;AACA,SAAS,mBAAmB,MAAM;CAChC,MAAM,aAAa,KAAK,KAAK,UAAU;CACvC,IAAI,CAAC,YAAY;EACf,MAAM,IAAI,MAAM,6CAA6C;CAC/D;CACA,MAAM,UAAU,KAAK,UAAU;EAC7B;EACA,gBAAgB,KAAK,kBAAkB,OAAO,OAAO,KAAK,KAAK,cAAc;EAC7E,iBAAiB,KAAK,mBAAmB,OAAO,OAAO,KAAK,KAAK,eAAe;EAChF,SAAS,KAAK,WAAW,OAAO,OAAO,KAAK,KAAK,OAAO;EACxD,iBAAiB,KAAK,mBAAmB,OAAO,OAAO,KAAK,KAAK,eAAe;EAChF,kBAAkB,KAAK,oBAAoB,OAAO,OAAO,KAAK,KAAK,gBAAgB;EACnF,gBAAgB,KAAK,kBAAkB,OAAO,OAAO,KAAK,KAAK,cAAc;CAC/E,CAAC;CACD,IAAI,IAAI,YAAY,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,SAAS,MAAM;EACnD,MAAM,IAAI,MAAM,oDAAoD;CACtE;CACA,OAAO;AACT"}