@tangle-network/agent-app 0.45.47 → 0.45.49

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.
Files changed (94) hide show
  1. package/dist/{DesignCanvas-P2ZVK6FM.js → DesignCanvas-JRBCAWHW.js} +2 -2
  2. package/dist/{DesignCanvasEditor-DGNCA54P.js → DesignCanvasEditor-J2OLS22G.js} +4 -4
  3. package/dist/{IntakeInterview-3ZIQMZS6.js → IntakeInterview-OKT6DCBN.js} +2 -2
  4. package/dist/InvitationsPanel-OFCYVSAE.js +9 -0
  5. package/dist/InviteAcceptPage-BDOO4JSE.js +7 -0
  6. package/dist/MembersPanel-3ZK2GCMC.js +9 -0
  7. package/dist/{TimelineEditor-OTNPJ3SN.js → TimelineEditor-52YEPDX5.js} +2 -2
  8. package/dist/VaultPane-IGJKB6CX.js +7 -0
  9. package/dist/assistant/index.d.ts +36 -11
  10. package/dist/assistant/index.js +235 -90
  11. package/dist/assistant/index.js.map +1 -1
  12. package/dist/{billing-BibxgALe.d.ts → billing-BuNlaKlE.d.ts} +15 -23
  13. package/dist/chat-react/index.js +2 -1
  14. package/dist/chat-react/index.js.map +1 -1
  15. package/dist/{chunk-TL37E5YY.js → chunk-33BN7P57.js} +6 -6
  16. package/dist/chunk-33BN7P57.js.map +1 -0
  17. package/dist/{chunk-IUSO2XRE.js → chunk-5MI2SKQH.js} +14 -15
  18. package/dist/chunk-5MI2SKQH.js.map +1 -0
  19. package/dist/{chunk-65OZT566.js → chunk-7LJYCHXK.js} +29 -27
  20. package/dist/chunk-7LJYCHXK.js.map +1 -0
  21. package/dist/chunk-AULM4X7U.js +77 -0
  22. package/dist/chunk-AULM4X7U.js.map +1 -0
  23. package/dist/{chunk-GNPN6ED4.js → chunk-CJHIAZKK.js} +128 -166
  24. package/dist/chunk-CJHIAZKK.js.map +1 -0
  25. package/dist/{chunk-54FYYXAX.js → chunk-ENLRJYVW.js} +21 -18
  26. package/dist/chunk-ENLRJYVW.js.map +1 -0
  27. package/dist/{chunk-F4XLTVQ3.js → chunk-GRDLGQ6A.js} +19 -18
  28. package/dist/chunk-GRDLGQ6A.js.map +1 -0
  29. package/dist/{chunk-BT4QFCTB.js → chunk-HSBJB46C.js} +13 -1
  30. package/dist/chunk-HSBJB46C.js.map +1 -0
  31. package/dist/{chunk-VOJB7MVG.js → chunk-I2CA5N7V.js} +70 -28
  32. package/dist/chunk-I2CA5N7V.js.map +1 -0
  33. package/dist/chunk-MLG6XKPV.js +44 -0
  34. package/dist/chunk-MLG6XKPV.js.map +1 -0
  35. package/dist/{chunk-IN6LNZ7O.js → chunk-Q2QKEV6J.js} +7 -7
  36. package/dist/{chunk-IN6LNZ7O.js.map → chunk-Q2QKEV6J.js.map} +1 -1
  37. package/dist/{chunk-B62EZF52.js → chunk-UMV45ZDF.js} +3 -3
  38. package/dist/{chunk-JJJEO4ND.js → chunk-VWTODXRW.js} +2 -2
  39. package/dist/{chunk-JJJEO4ND.js.map → chunk-VWTODXRW.js.map} +1 -1
  40. package/dist/{chunk-VCPZ3HTN.js → chunk-W7P5KV6O.js} +51 -27
  41. package/dist/chunk-W7P5KV6O.js.map +1 -0
  42. package/dist/{chunk-ZX5UT4HF.js → chunk-ZAKKG6WI.js} +354 -273
  43. package/dist/chunk-ZAKKG6WI.js.map +1 -0
  44. package/dist/{chunk-PE67O2LH.js → chunk-ZGY6QB4F.js} +21 -16
  45. package/dist/chunk-ZGY6QB4F.js.map +1 -0
  46. package/dist/design-canvas-react/index.js +18 -16
  47. package/dist/design-canvas-react/index.js.map +1 -1
  48. package/dist/design-canvas-react/lazy.js +1 -1
  49. package/dist/intakes-react/index.js +1 -1
  50. package/dist/intakes-react/lazy.js +1 -1
  51. package/dist/platform/index.d.ts +1 -1
  52. package/dist/platform/index.js +16 -16
  53. package/dist/platform/index.js.map +1 -1
  54. package/dist/sequences-react/index.js +2 -2
  55. package/dist/studio/index.d.ts +13 -1
  56. package/dist/studio/index.js +13 -1
  57. package/dist/studio-react/index.js +115 -78
  58. package/dist/studio-react/index.js.map +1 -1
  59. package/dist/studio-react/studio.css +0 -56
  60. package/dist/teams-react/index.js +4 -3
  61. package/dist/teams-react/lazy.js +3 -3
  62. package/dist/theme/index.js +1 -1
  63. package/dist/theme/tokens.css +15 -13
  64. package/dist/vault/index.js +1 -1
  65. package/dist/vault/lazy.js +1 -1
  66. package/dist/web-react/index.d.ts +16 -12
  67. package/dist/web-react/index.js +6 -4
  68. package/dist/work-product-react/index.js +9 -27
  69. package/dist/work-product-react/index.js.map +1 -1
  70. package/package.json +3 -3
  71. package/dist/InvitationsPanel-F56UOQXA.js +0 -8
  72. package/dist/InviteAcceptPage-P3QJC3C6.js +0 -7
  73. package/dist/MembersPanel-XNLF3SA4.js +0 -8
  74. package/dist/VaultPane-MUWGYVJ7.js +0 -7
  75. package/dist/chunk-54FYYXAX.js.map +0 -1
  76. package/dist/chunk-65OZT566.js.map +0 -1
  77. package/dist/chunk-BT4QFCTB.js.map +0 -1
  78. package/dist/chunk-F4XLTVQ3.js.map +0 -1
  79. package/dist/chunk-GNPN6ED4.js.map +0 -1
  80. package/dist/chunk-IUSO2XRE.js.map +0 -1
  81. package/dist/chunk-PE67O2LH.js.map +0 -1
  82. package/dist/chunk-TL37E5YY.js.map +0 -1
  83. package/dist/chunk-VCPZ3HTN.js.map +0 -1
  84. package/dist/chunk-VOJB7MVG.js.map +0 -1
  85. package/dist/chunk-ZX5UT4HF.js.map +0 -1
  86. /package/dist/{DesignCanvas-P2ZVK6FM.js.map → DesignCanvas-JRBCAWHW.js.map} +0 -0
  87. /package/dist/{DesignCanvasEditor-DGNCA54P.js.map → DesignCanvasEditor-J2OLS22G.js.map} +0 -0
  88. /package/dist/{IntakeInterview-3ZIQMZS6.js.map → IntakeInterview-OKT6DCBN.js.map} +0 -0
  89. /package/dist/{InvitationsPanel-F56UOQXA.js.map → InvitationsPanel-OFCYVSAE.js.map} +0 -0
  90. /package/dist/{InviteAcceptPage-P3QJC3C6.js.map → InviteAcceptPage-BDOO4JSE.js.map} +0 -0
  91. /package/dist/{MembersPanel-XNLF3SA4.js.map → MembersPanel-3ZK2GCMC.js.map} +0 -0
  92. /package/dist/{TimelineEditor-OTNPJ3SN.js.map → TimelineEditor-52YEPDX5.js.map} +0 -0
  93. /package/dist/{VaultPane-MUWGYVJ7.js.map → VaultPane-IGJKB6CX.js.map} +0 -0
  94. /package/dist/{chunk-B62EZF52.js.map → chunk-UMV45ZDF.js.map} +0 -0
@@ -1,3 +1,6 @@
1
+ import {
2
+ RoleSelect
3
+ } from "./chunk-AULM4X7U.js";
1
4
  import {
2
5
  hasWorkspaceRole
3
6
  } from "./chunk-6XIAPIW6.js";
@@ -5,12 +8,7 @@ import {
5
8
  // src/teams-react/components/InvitationsPanel.tsx
6
9
  import { useState } from "react";
7
10
  import { jsx, jsxs } from "react/jsx-runtime";
8
- var ASSIGNABLE = [
9
- { value: "viewer", label: "Viewer" },
10
- { value: "editor", label: "Editor" },
11
- { value: "admin", label: "Admin" }
12
- ];
13
- var BADGE_BASE = "inline-flex items-center rounded border px-2 py-0.5 text-[11px] font-semibold uppercase tracking-[0.05em]";
11
+ var BADGE_BASE = "inline-flex items-center rounded border px-2 py-0.5 text-xs font-semibold uppercase tracking-[0.05em]";
14
12
  var STATUS_BADGE = {
15
13
  accepted: "border-[var(--surface-success-border)] bg-[var(--surface-success-bg)] text-[var(--surface-success-text)]",
16
14
  pending: "border-[var(--surface-warning-border)] bg-[var(--surface-warning-bg)] text-[var(--surface-warning-text)]",
@@ -22,6 +20,9 @@ var EMAIL_BADGE = {
22
20
  not_sent: "border-[var(--surface-warning-border)] bg-[var(--surface-warning-bg)] text-[var(--surface-warning-text)]",
23
21
  failed: "border-[var(--surface-danger-border)] bg-[var(--surface-danger-bg)] text-[var(--surface-danger-text)]"
24
22
  };
23
+ function capitalize(text) {
24
+ return text.length === 0 ? text : text[0].toUpperCase() + text.slice(1);
25
+ }
25
26
  function InvitationsPanel({
26
27
  invitations,
27
28
  currentRole,
@@ -103,13 +104,11 @@ function InvitationsPanel({
103
104
  }
104
105
  ),
105
106
  /* @__PURE__ */ jsx(
106
- "select",
107
+ RoleSelect,
107
108
  {
108
109
  value: inviteRole,
109
- "aria-label": "Invite role",
110
- onChange: (event) => setInviteRole(event.target.value),
111
- className: "rounded border border-[var(--border-default)] bg-[var(--bg-input)] px-2 py-1.5 text-xs text-[var(--text-secondary)]",
112
- children: ASSIGNABLE.map((option) => /* @__PURE__ */ jsx("option", { value: option.value, children: option.label }, option.value))
110
+ ariaLabel: "Invite role",
111
+ onChange: setInviteRole
113
112
  }
114
113
  ),
115
114
  /* @__PURE__ */ jsx(
@@ -118,7 +117,7 @@ function InvitationsPanel({
118
117
  type: "button",
119
118
  onClick: () => void submitInvite(),
120
119
  disabled: inviting || !inviteEmail.trim(),
121
- className: "rounded bg-[var(--brand-primary)] px-3 py-1.5 text-sm text-white disabled:opacity-50",
120
+ className: "rounded bg-[var(--brand-primary)] px-3 py-1.5 text-sm text-[hsl(var(--primary-foreground))] disabled:opacity-50",
122
121
  children: inviting ? "Inviting\u2026" : "Invite"
123
122
  }
124
123
  )
@@ -159,8 +158,8 @@ function InvitationRow({ invitation, canManage, busy, onCopy, onResend, onRevoke
159
158
  /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-3", children: [
160
159
  /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
161
160
  /* @__PURE__ */ jsx("p", { className: "truncate text-sm font-medium text-[var(--text-primary)]", children: invitation.email }),
162
- /* @__PURE__ */ jsxs("p", { className: "text-xs capitalize text-[var(--text-muted)]", children: [
163
- invitation.permissions,
161
+ /* @__PURE__ */ jsxs("p", { className: "text-xs text-[var(--text-muted)]", children: [
162
+ capitalize(invitation.permissions),
164
163
  " \xB7 expires ",
165
164
  expiry
166
165
  ] }),
@@ -209,4 +208,4 @@ function InvitationRow({ invitation, canManage, busy, onCopy, onResend, onRevoke
209
208
  export {
210
209
  InvitationsPanel
211
210
  };
212
- //# sourceMappingURL=chunk-IUSO2XRE.js.map
211
+ //# sourceMappingURL=chunk-5MI2SKQH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/teams-react/components/InvitationsPanel.tsx"],"sourcesContent":["/**\n * Email-invitation panel: invite by email + role, and a history of every\n * invitation (pending / accepted / expired / revoked) with its email-delivery\n * status. Pending rows expose copy-link / resend / revoke. Fully callback-driven\n * — the host supplies the data and the async `onInvite` / `onResend` / `onRevoke`\n * callbacks (backed by `./teams/invitations-api`), so this imports no app router,\n * fetch client, or toast. Styled with the shipped Tangle Quiet tokens (`var(--*)`).\n *\n * Mount alongside a list-only `MembersPanel` (`showInviteForm={false}`): the\n * members panel shows accepted members, this owns the invite flow + pending list.\n */\n\nimport { useState } from 'react'\nimport type { WorkspaceRole } from '../../teams/roles'\nimport { hasWorkspaceRole } from '../../teams/roles'\nimport type { InvitationView, InvitationsPanelProps } from '../contracts'\nimport { RoleSelect } from './RoleSelect'\n\nconst BADGE_BASE = 'inline-flex items-center rounded border px-2 py-0.5 text-xs font-semibold uppercase tracking-[0.05em]'\n\n// Lifecycle status: green = in, amber = awaiting, red = killed, muted = lapsed.\nconst STATUS_BADGE: Record<InvitationView['status'], string> = {\n accepted: 'border-[var(--surface-success-border)] bg-[var(--surface-success-bg)] text-[var(--surface-success-text)]',\n pending: 'border-[var(--surface-warning-border)] bg-[var(--surface-warning-bg)] text-[var(--surface-warning-text)]',\n revoked: 'border-[var(--surface-danger-border)] bg-[var(--surface-danger-bg)] text-[var(--surface-danger-text)]',\n expired: 'border-[var(--border-default)] text-[var(--text-muted)]',\n}\n\n// Delivery status: red = bounced, amber = not yet attempted, muted = the normal happy path.\nconst EMAIL_BADGE: Record<InvitationView['emailStatus'], string> = {\n sent: 'border-[var(--border-default)] text-[var(--text-muted)]',\n not_sent: 'border-[var(--surface-warning-border)] bg-[var(--surface-warning-bg)] text-[var(--surface-warning-text)]',\n failed: 'border-[var(--surface-danger-border)] bg-[var(--surface-danger-bg)] text-[var(--surface-danger-text)]',\n}\n\n/** Uppercase the role's first letter in JS (not CSS `capitalize`, which would\n * also hit the lowercase \"expires\" in the same line). */\nfunction capitalize(text: string): string {\n return text.length === 0 ? text : text[0]!.toUpperCase() + text.slice(1)\n}\n\nexport function InvitationsPanel({\n invitations,\n currentRole,\n onInvite,\n onResend,\n onRevoke,\n onCopy,\n onNotice,\n}: InvitationsPanelProps) {\n const [inviteEmail, setInviteEmail] = useState('')\n const [inviteRole, setInviteRole] = useState<WorkspaceRole>('editor')\n const [inviting, setInviting] = useState(false)\n const [busyId, setBusyId] = useState<string | null>(null)\n\n const canManage = hasWorkspaceRole(currentRole, 'admin')\n\n function notify(kind: 'success' | 'error', message: string) {\n onNotice?.({ kind, message })\n }\n\n async function submitInvite() {\n const email = inviteEmail.trim()\n if (!email || inviting) return\n setInviting(true)\n try {\n await onInvite({ email, role: inviteRole })\n notify('success', `Invitation sent to ${email}`)\n setInviteEmail('')\n } catch (err) {\n notify('error', err instanceof Error ? err.message : 'Failed to invite')\n } finally {\n setInviting(false)\n }\n }\n\n async function copyLink(inviteUrl: string) {\n try {\n if (onCopy) await onCopy({ inviteUrl })\n else await navigator.clipboard.writeText(inviteUrl)\n notify('success', 'Invite link copied')\n } catch (err) {\n notify('error', err instanceof Error ? err.message : 'Failed to copy link')\n }\n }\n\n async function resend(invitationId: string) {\n setBusyId(invitationId)\n try {\n await onResend({ invitationId })\n notify('success', 'Invitation resent')\n } catch (err) {\n notify('error', err instanceof Error ? err.message : 'Failed to resend invitation')\n } finally {\n setBusyId(null)\n }\n }\n\n async function revoke(invitationId: string) {\n setBusyId(invitationId)\n try {\n await onRevoke({ invitationId })\n notify('success', 'Invitation revoked')\n } catch (err) {\n notify('error', err instanceof Error ? err.message : 'Failed to revoke invitation')\n } finally {\n setBusyId(null)\n }\n }\n\n return (\n <section className=\"flex flex-col gap-4\">\n {canManage && (\n <div className=\"flex flex-col gap-1.5\">\n <label className=\"text-xs font-medium text-[var(--text-muted)]\">Invite by email</label>\n <div className=\"flex gap-2\">\n <input\n type=\"email\"\n placeholder=\"colleague@example.com\"\n value={inviteEmail}\n aria-label=\"Invite email address\"\n onChange={(event) => setInviteEmail(event.target.value)}\n onKeyDown={(event) => { if (event.key === 'Enter') void submitInvite() }}\n className=\"flex-1 rounded border border-[var(--border-default)] bg-[var(--bg-input)] px-3 py-1.5 text-sm text-[var(--text-primary)] placeholder:text-[var(--text-muted)]\"\n />\n <RoleSelect\n value={inviteRole}\n ariaLabel=\"Invite role\"\n onChange={setInviteRole}\n />\n <button\n type=\"button\"\n onClick={() => void submitInvite()}\n disabled={inviting || !inviteEmail.trim()}\n className=\"rounded bg-[var(--brand-primary)] px-3 py-1.5 text-sm text-[hsl(var(--primary-foreground))] disabled:opacity-50\"\n >\n {inviting ? 'Inviting…' : 'Invite'}\n </button>\n </div>\n </div>\n )}\n\n <div className=\"flex flex-col gap-2 border-t border-[var(--border-default)] pt-3\">\n <div className=\"flex items-center justify-between\">\n <h4 className=\"text-xs font-semibold text-[var(--text-primary)]\">Invitation history</h4>\n <span className=\"text-xs text-[var(--text-muted)]\">{invitations.length} total</span>\n </div>\n {invitations.length === 0 ? (\n <p className=\"text-sm text-[var(--text-muted)]\">No invitations yet.</p>\n ) : (\n invitations.map((invitation) => (\n <InvitationRow\n key={invitation.id}\n invitation={invitation}\n canManage={canManage}\n busy={busyId === invitation.id}\n onCopy={() => void copyLink(invitation.inviteUrl)}\n onResend={() => void resend(invitation.id)}\n onRevoke={() => void revoke(invitation.id)}\n />\n ))\n )}\n </div>\n </section>\n )\n}\n\ninterface InvitationRowProps {\n invitation: InvitationView\n canManage: boolean\n busy: boolean\n onCopy(): void\n onResend(): void\n onRevoke(): void\n}\n\nfunction InvitationRow({ invitation, canManage, busy, onCopy, onResend, onRevoke }: InvitationRowProps) {\n const isPending = invitation.status === 'pending'\n const emailFailed = invitation.emailStatus === 'failed'\n const expiry = new Date(invitation.expiresAt).toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n })\n\n return (\n <div className=\"rounded-lg border border-[var(--border-default)] bg-[var(--bg-input)] p-3\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-medium text-[var(--text-primary)]\">{invitation.email}</p>\n <p className=\"text-xs text-[var(--text-muted)]\">\n {capitalize(invitation.permissions)} · expires {expiry}\n </p>\n {emailFailed && (\n <p className=\"mt-1 text-xs text-[var(--surface-danger-text)]\">Email was not sent — copy the link to share it.</p>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n <span className={`${BADGE_BASE} ${STATUS_BADGE[invitation.status]}`}>\n {invitation.status}\n </span>\n <span className={`${BADGE_BASE} ${EMAIL_BADGE[invitation.emailStatus]}`}>\n {invitation.emailStatus.replace('_', ' ')}\n </span>\n </div>\n </div>\n {canManage && isPending && (\n <div className=\"mt-3 flex items-center justify-end gap-2\">\n <button\n type=\"button\"\n onClick={onCopy}\n disabled={busy}\n className=\"rounded border border-[var(--border-default)] px-2 py-1 text-xs text-[var(--text-secondary)] hover:text-[var(--text-primary)] disabled:opacity-50\"\n >\n Copy link\n </button>\n <button\n type=\"button\"\n onClick={onResend}\n disabled={busy}\n className=\"rounded border border-[var(--border-default)] px-2 py-1 text-xs text-[var(--text-secondary)] hover:text-[var(--text-primary)] disabled:opacity-50\"\n >\n {busy ? 'Working…' : 'Resend'}\n </button>\n <button\n type=\"button\"\n onClick={onRevoke}\n disabled={busy}\n className=\"rounded px-2 py-1 text-xs text-[var(--text-danger)] hover:bg-[var(--border-default)] disabled:opacity-50\"\n >\n Revoke\n </button>\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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","names":[]}
@@ -278,6 +278,7 @@ var AlignRightGlyph = glyph(
278
278
  var BoldGlyph = glyph(/* @__PURE__ */ jsx3("path", { d: "M6 4h8a4 4 0 0 1 0 8H6zM6 12h9a4 4 0 0 1 0 8H6z", fill: "currentColor", stroke: "none" }));
279
279
  var ItalicGlyph = glyph(/* @__PURE__ */ jsx3("path", { d: "M11 4h6M7 20h6M14 4 8 20" }));
280
280
  var PlusGlyph = glyph(/* @__PURE__ */ jsx3("path", { d: "M12 5v14M5 12h14" }));
281
+ var MinusGlyph = glyph(/* @__PURE__ */ jsx3("path", { d: "M5 12h14" }));
281
282
  var ChevronDownGlyph = glyph(/* @__PURE__ */ jsx3("path", { d: "m6 9 6 6 6-6" }));
282
283
  var RectGlyph = glyph(/* @__PURE__ */ jsx3("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }));
283
284
  var EllipseGlyph = glyph(/* @__PURE__ */ jsx3("ellipse", { cx: "12", cy: "12", rx: "10", ry: "7" }));
@@ -298,8 +299,8 @@ var VideoGlyph = glyph(
298
299
  );
299
300
  var SlotGlyph = glyph(
300
301
  /* @__PURE__ */ jsxs2(Fragment2, { children: [
301
- /* @__PURE__ */ jsx3("circle", { cx: "12", cy: "12", r: "3" }),
302
- /* @__PURE__ */ jsx3("path", { d: "M12 1v4M12 19v4M4.2 4.2l2.8 2.8M17 17l2.8 2.8M1 12h4M19 12h4M4.2 19.8l2.8-2.8M17 7 19.8 4.2" })
302
+ /* @__PURE__ */ jsx3("path", { d: "M3 4h6.5l2.5 3.5L14.5 4H21v16H3z" }),
303
+ /* @__PURE__ */ jsx3("circle", { cx: "12", cy: "14", r: "2" })
303
304
  ] })
304
305
  );
305
306
  var PageGlyph = glyph(
@@ -410,7 +411,7 @@ function PagesStrip({
410
411
  return /* @__PURE__ */ jsxs3("div", { className: "flex shrink-0 flex-col bg-[var(--bg-input)]", children: [
411
412
  label ? /* @__PURE__ */ jsxs3("div", { className: "flex items-center gap-1.5 px-3 pt-1.5 text-[var(--text-muted)]", children: [
412
413
  /* @__PURE__ */ jsx5(PageGlyph, { className: "h-3 w-3" }),
413
- /* @__PURE__ */ jsx5("span", { className: "text-[11px] font-semibold uppercase tracking-[0.05em]", children: label })
414
+ /* @__PURE__ */ jsx5("span", { className: "text-xs font-semibold uppercase tracking-[0.05em]", children: label })
414
415
  ] }) : null,
415
416
  /* @__PURE__ */ jsxs3(
416
417
  "div",
@@ -477,7 +478,7 @@ function PagesStrip({
477
478
  ) : /* @__PURE__ */ jsx5("div", { className: "flex h-full w-full items-center justify-center", children: /* @__PURE__ */ jsx5(PageGlyph, { className: "h-5 w-5 text-[var(--text-muted)]" }) })
478
479
  }
479
480
  ),
480
- /* @__PURE__ */ jsx5("span", { className: "max-w-[80px] truncate text-[11px] text-[var(--text-secondary)]", children: page.name })
481
+ /* @__PURE__ */ jsx5("span", { className: "max-w-[80px] truncate text-xs text-[var(--text-secondary)]", children: page.name })
481
482
  ]
482
483
  }
483
484
  ),
@@ -524,7 +525,7 @@ function PagesStrip({
524
525
  className: "flex h-[72px] w-[80px] shrink-0 flex-col items-center justify-center gap-1 rounded border border-dashed border-[var(--border-default)] text-[var(--text-muted)] transition hover:border-[var(--brand-primary)] hover:text-[var(--brand-primary)]",
525
526
  children: [
526
527
  /* @__PURE__ */ jsx5(PlusGlyph, { className: "h-4 w-4" }),
527
- /* @__PURE__ */ jsx5("span", { className: "text-[11px]", children: "Add page" })
528
+ /* @__PURE__ */ jsx5("span", { className: "text-xs", children: "Add page" })
528
529
  ]
529
530
  }
530
531
  ) : null
@@ -881,7 +882,7 @@ function Popover({
881
882
  open ? children : null
882
883
  ] });
883
884
  }
884
- var FIELD_LABEL = "text-[11px] font-semibold uppercase tracking-[0.05em] text-[var(--text-muted)]";
885
+ var FIELD_LABEL = "text-xs font-semibold uppercase tracking-[0.05em] text-[var(--text-muted)]";
885
886
  function NumberInput({
886
887
  label,
887
888
  value,
@@ -944,7 +945,7 @@ function SelectControl({
944
945
  className: `${buttonClassName} flex items-center justify-between gap-1 rounded border border-[var(--border-default)] bg-[var(--bg-input)] px-2 py-0.5 text-left text-xs text-[var(--text-primary)] hover:border-[var(--brand-primary)] disabled:cursor-default disabled:opacity-40`,
945
946
  children: [
946
947
  /* @__PURE__ */ jsx7("span", { className: "truncate", children: current?.label ?? value }),
947
- /* @__PURE__ */ jsx7("span", { className: "text-[8px] text-[var(--text-muted)]", children: "\u25BE" })
948
+ /* @__PURE__ */ jsx7(ChevronDownGlyph, { className: "h-3 w-3 shrink-0 text-[var(--text-muted)]" })
948
949
  ]
949
950
  }
950
951
  ),
@@ -999,7 +1000,7 @@ function FontPicker({
999
1000
  style: { fontFamily: value },
1000
1001
  children: [
1001
1002
  /* @__PURE__ */ jsx7("span", { className: "truncate", children: value }),
1002
- /* @__PURE__ */ jsx7("span", { className: "text-[8px] text-[var(--text-muted)]", children: "\u25BE" })
1003
+ /* @__PURE__ */ jsx7(ChevronDownGlyph, { className: "h-3 w-3 shrink-0 text-[var(--text-muted)]" })
1003
1004
  ]
1004
1005
  }
1005
1006
  ),
@@ -1015,7 +1016,7 @@ function FontPicker({
1015
1016
  className: "m-1 rounded border border-[var(--border-default)] bg-transparent px-2 py-1 text-xs text-[var(--text-primary)] focus:border-[var(--brand-primary)]"
1016
1017
  }
1017
1018
  ),
1018
- /* @__PURE__ */ jsx7("div", { role: "listbox", className: "max-h-60 overflow-y-auto py-1", children: filtered.length === 0 ? /* @__PURE__ */ jsx7("div", { className: "px-3 py-2 text-[11px] text-[var(--text-muted)]", children: "No matches" }) : filtered.map((family) => /* @__PURE__ */ jsx7(
1019
+ /* @__PURE__ */ jsx7("div", { role: "listbox", className: "max-h-60 overflow-y-auto py-1", children: filtered.length === 0 ? /* @__PURE__ */ jsx7("div", { className: "px-3 py-2 text-xs text-[var(--text-muted)]", children: "No matches" }) : filtered.map((family) => /* @__PURE__ */ jsx7(
1019
1020
  "button",
1020
1021
  {
1021
1022
  type: "button",
@@ -1294,7 +1295,7 @@ function SelectionControls({
1294
1295
  onBindSlot(slotInput.trim() || null);
1295
1296
  setSlotPopoverOpen(false);
1296
1297
  },
1297
- className: "flex-1 rounded border border-[var(--brand-primary)] px-2 py-0.5 text-[11px] text-[var(--brand-primary)] hover:bg-[color-mix(in_srgb,var(--brand-primary)_10%,transparent)]",
1298
+ className: "flex-1 rounded border border-[var(--brand-primary)] px-2 py-0.5 text-xs text-[var(--brand-primary)] hover:bg-[color-mix(in_srgb,var(--brand-primary)_10%,transparent)]",
1298
1299
  children: slotInput.trim() ? "Bind" : "Unbind"
1299
1300
  }
1300
1301
  ),
@@ -1303,7 +1304,7 @@ function SelectionControls({
1303
1304
  {
1304
1305
  type: "button",
1305
1306
  onClick: () => setSlotPopoverOpen(false),
1306
- className: "rounded border border-[var(--border-default)] px-2 py-0.5 text-[11px] text-[var(--text-secondary)]",
1307
+ className: "rounded border border-[var(--border-default)] px-2 py-0.5 text-xs text-[var(--text-secondary)]",
1307
1308
  children: "Cancel"
1308
1309
  }
1309
1310
  )
@@ -1442,7 +1443,7 @@ function ImageControls({ element, canWrite, onPatch }) {
1442
1443
  onPatch({ src: swapUrl.trim() });
1443
1444
  setSwapOpen(false);
1444
1445
  },
1445
- className: "flex-1 rounded border border-[var(--brand-primary)] px-2 py-0.5 text-[11px] text-[var(--brand-primary)] hover:bg-[color-mix(in_srgb,var(--brand-primary)_10%,transparent)] disabled:cursor-default disabled:opacity-40",
1446
+ className: "flex-1 rounded border border-[var(--brand-primary)] px-2 py-0.5 text-xs text-[var(--brand-primary)] hover:bg-[color-mix(in_srgb,var(--brand-primary)_10%,transparent)] disabled:cursor-default disabled:opacity-40",
1446
1447
  children: "Replace"
1447
1448
  }
1448
1449
  ),
@@ -1451,7 +1452,7 @@ function ImageControls({ element, canWrite, onPatch }) {
1451
1452
  {
1452
1453
  type: "button",
1453
1454
  onClick: () => setSwapOpen(false),
1454
- className: "rounded border border-[var(--border-default)] px-2 py-0.5 text-[11px] text-[var(--text-secondary)]",
1455
+ className: "rounded border border-[var(--border-default)] px-2 py-0.5 text-xs text-[var(--text-secondary)]",
1455
1456
  children: "Cancel"
1456
1457
  }
1457
1458
  )
@@ -1484,7 +1485,7 @@ function PagePropsControls({ page, canWrite, onSetPageProps, onSetPageGuides, pa
1484
1485
  value: page.name,
1485
1486
  disabled: !canWrite,
1486
1487
  onChange: (event) => onSetPageProps({ name: event.target.value }),
1487
- className: "w-28 rounded border border-[var(--border-default)] bg-[var(--bg-input)] px-2 py-0.5 text-xs text-[var(--text-primary)] focus:border-[var(--brand-primary)]"
1488
+ className: "w-28 rounded border border-[var(--border-default)] bg-[var(--bg-input)] px-2 py-0.5 text-xs text-[var(--text-primary)] focus:border-[var(--brand-primary)] disabled:cursor-default disabled:opacity-40"
1488
1489
  }
1489
1490
  ),
1490
1491
  SEP,
@@ -1517,7 +1518,7 @@ function PagePropsControls({ page, canWrite, onSetPageProps, onSetPageGuides, pa
1517
1518
  if (event.key === "Enter") commitDimension("width", event.target.value);
1518
1519
  if (event.key === "Escape") setCustomW(null);
1519
1520
  },
1520
- className: "w-16 rounded border border-[var(--border-default)] bg-[var(--bg-input)] px-1 py-0.5 text-center text-xs text-[var(--text-primary)] focus:border-[var(--brand-primary)]"
1521
+ className: "w-16 rounded border border-[var(--border-default)] bg-[var(--bg-input)] px-1 py-0.5 text-center text-xs text-[var(--text-primary)] focus:border-[var(--brand-primary)] disabled:cursor-default disabled:opacity-40"
1521
1522
  }
1522
1523
  )
1523
1524
  ] }),
@@ -1537,7 +1538,7 @@ function PagePropsControls({ page, canWrite, onSetPageProps, onSetPageGuides, pa
1537
1538
  if (event.key === "Enter") commitDimension("height", event.target.value);
1538
1539
  if (event.key === "Escape") setCustomH(null);
1539
1540
  },
1540
- className: "w-16 rounded border border-[var(--border-default)] bg-[var(--bg-input)] px-1 py-0.5 text-center text-xs text-[var(--text-primary)] focus:border-[var(--brand-primary)]"
1541
+ className: "w-16 rounded border border-[var(--border-default)] bg-[var(--bg-input)] px-1 py-0.5 text-center text-xs text-[var(--text-primary)] focus:border-[var(--brand-primary)] disabled:cursor-default disabled:opacity-40"
1541
1542
  }
1542
1543
  )
1543
1544
  ] }),
@@ -1629,7 +1630,7 @@ function ZoomControls({ zoom, onZoom, onFit, fitLabel = "Fit to screen" }) {
1629
1630
  onClick: zoomOut,
1630
1631
  disabled: zoom <= MIN,
1631
1632
  className: BTN_SM,
1632
- children: /* @__PURE__ */ jsx8("span", { className: "text-base leading-none", children: "\u2212" })
1633
+ children: /* @__PURE__ */ jsx8(MinusGlyph, { className: "h-3.5 w-3.5" })
1633
1634
  }
1634
1635
  ),
1635
1636
  /* @__PURE__ */ jsxs6(
@@ -1638,7 +1639,7 @@ function ZoomControls({ zoom, onZoom, onFit, fitLabel = "Fit to screen" }) {
1638
1639
  type: "button",
1639
1640
  "aria-label": "Reset to 100%",
1640
1641
  onClick: resetHundred,
1641
- className: "rounded px-1.5 py-0.5 font-mono text-[11px] tabular-nums text-[var(--text-secondary)] transition hover:bg-[var(--border-default)] hover:text-[var(--text-primary)]",
1642
+ className: "rounded px-1.5 py-0.5 font-mono text-xs tabular-nums text-[var(--text-secondary)] transition hover:bg-[var(--border-default)] hover:text-[var(--text-primary)]",
1642
1643
  title: "Reset to 100%",
1643
1644
  children: [
1644
1645
  Math.round(zoom * 100),
@@ -1654,7 +1655,7 @@ function ZoomControls({ zoom, onZoom, onFit, fitLabel = "Fit to screen" }) {
1654
1655
  onClick: zoomIn,
1655
1656
  disabled: zoom >= MAX,
1656
1657
  className: BTN_SM,
1657
- children: /* @__PURE__ */ jsx8("span", { className: "text-sm leading-none", children: "+" })
1658
+ children: /* @__PURE__ */ jsx8(PlusGlyph, { className: "h-3.5 w-3.5" })
1658
1659
  }
1659
1660
  )
1660
1661
  ] });
@@ -1671,6 +1672,7 @@ var SCALES = [
1671
1672
  { value: 1, label: "1x" },
1672
1673
  { value: 2, label: "2x" }
1673
1674
  ];
1675
+ var FIELD_LABEL2 = "text-xs font-semibold uppercase tracking-[0.05em] text-[var(--text-muted)]";
1674
1676
  function ExportControl({ defaults, onExport, className }) {
1675
1677
  const [open, setOpen] = useState4(false);
1676
1678
  const [format, setFormat] = useState4(defaults?.format ?? "png");
@@ -1715,28 +1717,28 @@ function ExportControl({ defaults, onExport, className }) {
1715
1717
  className: "absolute right-0 top-full z-50 mt-1 flex w-52 flex-col gap-3 rounded-md border border-[var(--card-edge)] bg-[hsl(var(--popover))] p-3 shadow-[var(--shadow-overlay)]",
1716
1718
  children: [
1717
1719
  /* @__PURE__ */ jsxs7("div", { className: "flex flex-col gap-1.5", children: [
1718
- /* @__PURE__ */ jsx9("span", { className: "text-[11px] font-medium text-[var(--text-muted)]", children: "Format" }),
1720
+ /* @__PURE__ */ jsx9("span", { className: FIELD_LABEL2, children: "Format" }),
1719
1721
  /* @__PURE__ */ jsx9("div", { className: "flex gap-1.5", children: FORMATS.map((f) => /* @__PURE__ */ jsx9(
1720
1722
  "button",
1721
1723
  {
1722
1724
  type: "button",
1723
1725
  "aria-pressed": format === f.id,
1724
1726
  onClick: () => setFormat(f.id),
1725
- className: `flex-1 rounded border px-2 py-1 text-[11px] transition-colors ${format === f.id ? "border-[var(--brand-primary)] text-[var(--brand-primary)]" : "border-[var(--border-default)] text-[var(--text-secondary)] hover:text-[var(--text-primary)]"}`,
1727
+ className: `flex-1 rounded border px-2 py-1 text-xs transition-colors ${format === f.id ? "border-[var(--brand-primary)] text-[var(--brand-primary)]" : "border-[var(--border-default)] text-[var(--text-secondary)] hover:text-[var(--text-primary)]"}`,
1726
1728
  children: f.label
1727
1729
  },
1728
1730
  f.id
1729
1731
  )) })
1730
1732
  ] }),
1731
1733
  /* @__PURE__ */ jsxs7("div", { className: "flex flex-col gap-1.5", children: [
1732
- /* @__PURE__ */ jsx9("span", { className: "text-[11px] font-medium text-[var(--text-muted)]", children: "Scale" }),
1734
+ /* @__PURE__ */ jsx9("span", { className: FIELD_LABEL2, children: "Scale" }),
1733
1735
  /* @__PURE__ */ jsx9("div", { className: "flex gap-1.5", children: SCALES.map((s) => /* @__PURE__ */ jsx9(
1734
1736
  "button",
1735
1737
  {
1736
1738
  type: "button",
1737
1739
  "aria-pressed": pixelRatio === s.value,
1738
1740
  onClick: () => setPixelRatio(s.value),
1739
- className: `flex-1 rounded border px-2 py-1 text-[11px] transition-colors ${pixelRatio === s.value ? "border-[var(--brand-primary)] text-[var(--brand-primary)]" : "border-[var(--border-default)] text-[var(--text-secondary)] hover:text-[var(--text-primary)]"}`,
1741
+ className: `flex-1 rounded border px-2 py-1 text-xs transition-colors ${pixelRatio === s.value ? "border-[var(--brand-primary)] text-[var(--brand-primary)]" : "border-[var(--border-default)] text-[var(--text-secondary)] hover:text-[var(--text-primary)]"}`,
1740
1742
  children: s.label
1741
1743
  },
1742
1744
  s.value
@@ -1748,7 +1750,7 @@ function ExportControl({ defaults, onExport, className }) {
1748
1750
  type: "button",
1749
1751
  "aria-label": "Export image",
1750
1752
  onClick: confirm,
1751
- className: "rounded border border-[var(--brand-primary)] px-2 py-1 text-[11px] font-medium text-[var(--brand-primary)] transition-colors hover:bg-[color-mix(in_srgb,var(--brand-primary)_10%,transparent)]",
1753
+ className: "rounded border border-[var(--brand-primary)] px-2 py-1 text-xs font-medium text-[var(--brand-primary)] transition-colors hover:bg-[color-mix(in_srgb,var(--brand-primary)_10%,transparent)]",
1752
1754
  children: "Export"
1753
1755
  }
1754
1756
  )
@@ -2052,7 +2054,7 @@ function DesignCanvas({
2052
2054
  }, [activePage, editorState.selectedElementIds]);
2053
2055
  const review = mode === "review";
2054
2056
  if (!activePage) {
2055
- return /* @__PURE__ */ jsx10("div", { className: `flex h-full items-center justify-center bg-[var(--bg-input)] text-[var(--text-muted)] ${className ?? ""}`, children: "No pages in document" });
2057
+ return /* @__PURE__ */ jsx10("div", { className: `flex h-full items-center justify-center bg-[var(--bg-input)] ${className ?? ""}`, children: /* @__PURE__ */ jsx10("p", { className: "text-xs text-[var(--text-muted)]", children: "This document has no pages." }) });
2056
2058
  }
2057
2059
  const bleedScreen = editorState.showBleed && activePage.bleed ? {
2058
2060
  top: activePage.bleed.top * editorState.zoom,
@@ -2126,7 +2128,7 @@ function DesignCanvas({
2126
2128
  /* @__PURE__ */ jsx10(BrandKnot, { size: 32, className: "shrink-0" }),
2127
2129
  /* @__PURE__ */ jsxs8("div", { className: "flex flex-col gap-1", children: [
2128
2130
  /* @__PURE__ */ jsx10("p", { className: "text-sm font-semibold text-[var(--text-primary)]", children: "Best edited on a larger screen" }),
2129
- /* @__PURE__ */ jsx10("p", { className: "text-xs leading-5 text-[var(--text-secondary)]", children: "The design canvas needs room to work. Open this on a tablet or desktop to edit pages, elements, and export." })
2131
+ /* @__PURE__ */ jsx10("p", { className: "text-xs leading-5 text-[var(--text-secondary)]", children: "Open this on a tablet or desktop to edit and export." })
2130
2132
  ] })
2131
2133
  ] }),
2132
2134
  /* @__PURE__ */ jsxs8("div", { className: `relative hidden min-h-0 flex-1 sm:block ${editorState.showRulers ? "pl-[20px] pt-[20px]" : ""}`, children: [
@@ -2259,4 +2261,4 @@ export {
2259
2261
  ExportControl,
2260
2262
  DesignCanvas
2261
2263
  };
2262
- //# sourceMappingURL=chunk-65OZT566.js.map
2264
+ //# sourceMappingURL=chunk-7LJYCHXK.js.map