@hanzo/ui 8.0.24 → 8.0.25

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 (60) hide show
  1. package/README.md +59 -0
  2. package/dist/chunk-3NG33DV2.cjs +607 -0
  3. package/dist/chunk-3NG33DV2.cjs.map +1 -0
  4. package/dist/chunk-5CZOYONP.js +343 -0
  5. package/dist/chunk-5CZOYONP.js.map +1 -0
  6. package/dist/{chunk-P2P6ST6J.js → chunk-7ZNK6JSS.js} +9 -394
  7. package/dist/chunk-7ZNK6JSS.js.map +1 -0
  8. package/dist/chunk-GVCOAJLO.js +397 -0
  9. package/dist/chunk-GVCOAJLO.js.map +1 -0
  10. package/dist/chunk-GWNNLYX4.cjs +353 -0
  11. package/dist/chunk-GWNNLYX4.cjs.map +1 -0
  12. package/dist/{chunk-NBZDIMP3.cjs → chunk-ONVERVFG.cjs} +33 -438
  13. package/dist/chunk-ONVERVFG.cjs.map +1 -0
  14. package/dist/chunk-P2QU5MN5.js +555 -0
  15. package/dist/chunk-P2QU5MN5.js.map +1 -0
  16. package/dist/chunk-WHJR5S4L.cjs +418 -0
  17. package/dist/chunk-WHJR5S4L.cjs.map +1 -0
  18. package/dist/framework/CollectionBuilder.d.ts +12 -0
  19. package/dist/framework/CollectionsBrowser.d.ts +26 -19
  20. package/dist/framework/DocTypeRecords.d.ts +31 -11
  21. package/dist/framework/MediaGrid.d.ts +42 -0
  22. package/dist/framework/RecordCards.d.ts +35 -0
  23. package/dist/framework/builder-logic.d.ts +76 -0
  24. package/dist/framework/client.d.ts +31 -44
  25. package/dist/framework/core.cjs +213 -0
  26. package/dist/framework/core.cjs.map +1 -0
  27. package/dist/framework/core.d.ts +6 -0
  28. package/dist/framework/core.js +4 -0
  29. package/dist/framework/core.js.map +1 -0
  30. package/dist/framework/data.d.ts +2 -2
  31. package/dist/framework/fields.d.ts +47 -4
  32. package/dist/framework/index.cjs +1340 -0
  33. package/dist/framework/index.cjs.map +1 -0
  34. package/dist/framework/index.d.ts +9 -23
  35. package/dist/framework/index.js +1119 -0
  36. package/dist/framework/index.js.map +1 -0
  37. package/dist/framework/media.d.ts +53 -0
  38. package/dist/framework/parts.d.ts +74 -0
  39. package/dist/framework/responsive.d.ts +41 -0
  40. package/dist/framework/types.d.ts +13 -7
  41. package/dist/product/SelectMenu.d.ts +13 -1
  42. package/dist/product/index.cjs +2061 -336
  43. package/dist/product/index.cjs.map +1 -1
  44. package/dist/product/index.js +1909 -3
  45. package/dist/product/index.js.map +1 -1
  46. package/dist/product/social/index.cjs +17 -16
  47. package/dist/product/social/index.js +3 -2
  48. package/package.json +11 -5
  49. package/dist/chunk-2BM42AZR.cjs +0 -2301
  50. package/dist/chunk-2BM42AZR.cjs.map +0 -1
  51. package/dist/chunk-7P7R7FC5.js +0 -2231
  52. package/dist/chunk-7P7R7FC5.js.map +0 -1
  53. package/dist/chunk-NBZDIMP3.cjs.map +0 -1
  54. package/dist/chunk-P2P6ST6J.js.map +0 -1
  55. package/dist/framework/Loader.d.ts +0 -4
  56. package/dist/framework.cjs +0 -760
  57. package/dist/framework.cjs.map +0 -1
  58. package/dist/framework.d.ts +0 -1
  59. package/dist/framework.js +0 -730
  60. package/dist/framework.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/framework/types.ts","../src/framework/fields.ts","../src/framework/client.ts","../src/framework/data.ts","../src/framework/Loader.tsx","../src/framework/CollectionsBrowser.tsx","../src/framework/DocTypeRecords.tsx","../src/framework/DocTypeDetail.tsx"],"names":["jsx","jsxs","Text","YStack","useState","useCallback","useEffect","Fragment","dt","record","useMemo","Button","XStack","Card","TriangleAlert"],"mappings":"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","file":"framework.js","sourcesContent":["/**\n * The Hanzo Framework wire types — the DocType/DocField/document contract the\n * cloud `clients/framework` engine serves at /v1/framework/* (Frappe's DocType\n * metadata core, rebuilt native in Go). These mirror the Go JSON tags exactly.\n *\n * This is the ONE metadata vocabulary the generic @hanzo/data DocType renderer\n * builds from, so CMS/ERP/CRM/Helpdesk — all \"just DocTypes\" on the engine —\n * render through the SAME components. Types only; no runtime.\n */\n\n/** The engine's closed fieldtype set (mirrors clients/framework/doctype.go). */\nexport type Fieldtype =\n | 'Data'\n | 'Int'\n | 'Float'\n | 'Currency'\n | 'Check'\n | 'Date'\n | 'Datetime'\n | 'Text'\n | 'SmallText'\n | 'LongText'\n | 'RichText'\n | 'Select'\n | 'Link'\n | 'Table'\n | 'Attach'\n | 'JSON'\n | 'Password'\n\n/** One field of a DocType (Frappe's DocField). */\nexport interface DocField {\n fieldname: string\n fieldtype: Fieldtype\n label?: string\n reqd?: boolean\n /** Select → newline-separated choices; Link → target DocType; Table → child DocType. */\n options?: string\n default?: string\n unique?: boolean\n readOnly?: boolean\n hidden?: boolean\n inListView?: boolean\n fetchFrom?: string\n}\n\n/** A role's rights on a DocType (Frappe's DocPerm). */\nexport interface DocPerm {\n role: string\n read?: boolean\n write?: boolean\n create?: boolean\n delete?: boolean\n submit?: boolean\n cancel?: boolean\n}\n\n/** A DocType definition — per-org metadata. */\nexport interface DocType {\n name: string\n module?: string\n isSingle?: boolean\n isSubmittable?: boolean\n autoname?: string\n titleField?: string\n fields: DocField[]\n permissions?: DocPerm[]\n createdAt?: number\n updatedAt?: number\n}\n\n/** The managed document envelope keys the engine always returns. */\nexport interface DocEnvelope {\n name: string\n doctype: string\n /** 0 = draft, 1 = submitted, 2 = cancelled. */\n docstatus: number\n createdAt: number\n updatedAt: number\n}\n\n/** A document: the field data overlaid with the managed envelope keys. */\nexport type FrameworkDoc = Record<string, unknown> & DocEnvelope\n\n/** A registered app lane and (optionally, per-org) which fixtures are installed. */\nexport interface ModuleInfo {\n module: string\n doctypes: string[]\n installed?: string[]\n}\n\n/** The result of installing a module into the caller's org. */\nexport interface InstallResult {\n module: string\n created: string[]\n existing: string[]\n}\n\n/** List query for the generic document surface. */\nexport interface ListQuery {\n filters?: Record<string, string | number | boolean>\n fields?: string[]\n orderBy?: string\n limit?: number\n}\n\n/** The redacted-Password marker the engine returns for a set secret. */\nexport const REDACTED_MARKER = '__set__'\n","/**\n * Pure mapping between the Hanzo Framework DocType metadata and @hanzo/data's\n * render model — the brain of the generic DocType renderer. It is the ONE place\n * that translates the engine's Frappe field vocabulary into @hanzo/data's, so\n * EVERY app lane (CMS/ERP/CRM/Helpdesk) renders list/form/detail identically with\n * zero per-doctype code. A new DocType — or a whole new lane — \"just works\".\n *\n * No I/O, no React — data in, data out, trivially testable (the @hanzo/data\n * imports are `import type`, erased at build, so the unit test runs in plain Node).\n */\nimport type { FieldDefinition, FieldType, SelectOption } from '@hanzo/data'\nimport type { DocField, DocType, FrameworkDoc } from './types'\nimport { REDACTED_MARKER } from './types'\n\n/**\n * Frappe fieldtype → @hanzo/data field type. 1:1 cases; the value shape each\n * needs is handled in `toRecord`/`savePayload` (currency object, boolean, etc).\n * Attach is a single asset URL → `url` (a clickable link + text input); a Table /\n * JSON renders as raw JSON (honest — no silent wrong guess). Password → `text`\n * (write-only; the value is never surfaced, only set).\n */\nconst TYPE_MAP: Record<DocField['fieldtype'], FieldType> = {\n Data: 'text',\n SmallText: 'text',\n Text: 'longText',\n LongText: 'longText',\n RichText: 'richText',\n Int: 'number',\n Float: 'number',\n Currency: 'currency',\n Check: 'boolean',\n Date: 'date',\n Datetime: 'dateTime',\n Select: 'select',\n Link: 'relation',\n Table: 'json',\n Attach: 'url',\n JSON: 'json',\n Password: 'text',\n}\n\nconst ACRONYMS = new Set(['id', 'url', 'seo', 'api', 'ip'])\n\n/** `first_name` / `firstName` → \"First Name\"; known acronyms upper-cased. */\nexport function humanize(name: string): string {\n return name\n .replace(/[_-]+/g, ' ')\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .trim()\n .split(/\\s+/)\n .filter(Boolean)\n .map((w) => (ACRONYMS.has(w.toLowerCase()) ? w.toUpperCase() : w.charAt(0).toUpperCase() + w.slice(1)))\n .join(' ')\n}\n\n/** Select field's newline-separated choices → @hanzo/data options (blank dropped). */\nfunction selectOptions(options: string | undefined): SelectOption[] {\n return (options ?? '')\n .split('\\n')\n .map((s) => s.replace(/\\r$/, '').trim())\n .filter(Boolean)\n .map((v) => ({ value: v, label: v }))\n}\n\n/** Per-field @hanzo/data metadata (select options, currency code, relation target). */\nfunction metadataFor(f: DocField): FieldDefinition['metadata'] | undefined {\n switch (f.fieldtype) {\n case 'Select':\n return { options: selectOptions(f.options) }\n case 'Currency':\n return { currencyCode: 'USD' }\n case 'Int':\n return { decimals: 0 }\n case 'Link':\n return { objectName: f.options }\n default:\n return undefined\n }\n}\n\n/** The autoname source field for a `field:xxx` rule (`\"\"` otherwise). */\nexport function autonameSource(dt: DocType): string {\n const a = (dt.autoname ?? '').trim()\n return a.startsWith('field:') ? a.slice('field:'.length).trim() : ''\n}\n\nexport interface FieldMapOpts {\n /** Editing an existing record: the autoname-source field is fixed (the URL key). */\n editing?: boolean\n}\n\n/**\n * Map a DocType's fields to the ordered `FieldDefinition[]` every @hanzo/data view\n * renders from. Hidden fields are dropped; the engine's readOnly is honored; and\n * when editing an existing record the autoname source (e.g. `slug`) is made\n * read-only because it IS the document's immutable URL key.\n */\nexport function docTypeToFields(dt: DocType, opts: FieldMapOpts = {}): FieldDefinition[] {\n const src = autonameSource(dt)\n return (dt.fields ?? [])\n .filter((f) => !f.hidden)\n .map((f) => {\n const readOnly = f.readOnly || (opts.editing && f.fieldname === src) || undefined\n const metadata = metadataFor(f)\n return {\n name: f.fieldname,\n label: f.label || humanize(f.fieldname),\n type: TYPE_MAP[f.fieldtype] ?? 'text',\n ...(metadata ? { metadata } : {}),\n ...(readOnly ? { readOnly: true as const } : {}),\n }\n })\n}\n\n/** The status field a publishable content type uses (a Select including \"Published\"). */\nexport function statusField(dt: DocType): string {\n const f = (dt.fields ?? []).find(\n (x) => x.fieldtype === 'Select' && x.fieldname === 'status' && (x.options ?? '').includes('Published'),\n )\n return f ? f.fieldname : ''\n}\n\n/** Fields shown as table columns: the `inListView` subset (all, if none flagged). */\nexport function listHiddenFields(dt: DocType): string[] {\n const anyListed = (dt.fields ?? []).some((f) => f.inListView)\n if (!anyListed) return []\n return (dt.fields ?? []).filter((f) => !f.inListView && !f.hidden).map((f) => f.fieldname)\n}\n\n/** True when a DocType is a media/asset library (a required Attach) → grid view. */\nexport function isMediaDoctype(dt: DocType): boolean {\n return (dt.fields ?? []).some((f) => f.fieldtype === 'Attach' && f.reqd)\n}\n\n/** The primary Attach field name (the asset URL) of a media doctype. */\nexport function mediaFileField(dt: DocType): string {\n const f = (dt.fields ?? []).find((x) => x.fieldtype === 'Attach' && x.reqd) ?? (dt.fields ?? []).find((x) => x.fieldtype === 'Attach')\n return f ? f.fieldname : ''\n}\n\n/** DocTypes belonging to an app lane (module) — a CMS \"collection\" is one of these. */\nexport function moduleDoctypes(dts: DocType[], module: string): DocType[] {\n return dts.filter((dt) => (dt.module ?? '') === module)\n}\n\n/** The conventional field a collection uses to scope documents to a project. */\nexport const PROJECT_FIELD = 'project'\n\n/** True when a DocType declares the `project` scope field (→ project filtering works). */\nexport function hasProjectField(dt: DocType): boolean {\n return (dt.fields ?? []).some((f) => f.fieldname === PROJECT_FIELD)\n}\n\n/** A record's human title — the DocType's titleField, else its name. */\nexport function titleOf(doc: Record<string, unknown>, dt: DocType): string {\n if (dt.titleField && typeof doc[dt.titleField] === 'string' && doc[dt.titleField]) return String(doc[dt.titleField])\n return typeof doc.name === 'string' && doc.name ? doc.name : '(untitled)'\n}\n\n/**\n * URL-safe slug from arbitrary text: lower-case, any run of non-alphanumerics\n * collapsed to a single dash, ends trimmed. Guarantees a no-space, `%`-free\n * document name (the engine and the console's own proxy path both require it).\n */\nexport function slugify(s: unknown): string {\n return String(s ?? '')\n .normalize('NFKD')\n .replace(/[\\u0300-\\u036f]/g, '') // strip diacritics (accents → ASCII)\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n\n/** Valid Pascal/slug DocType name (letters/digits/dash/underscore, alnum-led, no space). */\nexport function isValidDoctypeName(name: string): boolean {\n return /^[A-Za-z0-9][A-Za-z0-9_-]*$/.test(name.trim())\n}\n\nconst secToMs = (v: unknown): number | undefined => {\n const n = Number(v)\n return Number.isFinite(n) && n > 0 ? n * 1000 : undefined\n}\nconst numOrNull = (v: unknown): number | null => {\n const n = Number(v)\n return Number.isFinite(n) ? n : null\n}\n\n/** One field value, framework wire → @hanzo/data display shape. */\nfunction coerceForDisplay(f: DocField, v: unknown): unknown {\n switch (f.fieldtype) {\n case 'Currency':\n return { amount: numOrNull(v), currencyCode: 'USD' }\n case 'Check':\n return v === 1 || v === true || v === '1'\n case 'Datetime':\n return typeof v === 'string' ? v.replace(' ', 'T') : v\n case 'Password':\n return v === REDACTED_MARKER ? '' : v // never surface the marker\n default:\n return v\n }\n}\n\n/**\n * A framework document → a flat @hanzo/data record: the field values coerced to\n * their display shapes, plus `id` (the record key every view uses) and the managed\n * envelope. The ONE read mapping every DocType view shares.\n */\nexport function toRecord(doc: FrameworkDoc, dt: DocType): Record<string, unknown> {\n const rec: Record<string, unknown> = {\n id: doc.name,\n name: doc.name,\n doctype: doc.doctype,\n docstatus: doc.docstatus,\n createdAt: secToMs(doc.createdAt),\n updatedAt: secToMs(doc.updatedAt),\n }\n for (const f of dt.fields ?? []) {\n if (!(f.fieldname in doc)) continue\n rec[f.fieldname] = coerceForDisplay(f, doc[f.fieldname])\n }\n return rec\n}\n\n/** One draft value, @hanzo/data edit shape → framework wire. */\nfunction coerceForWrite(f: DocField, v: unknown): unknown {\n switch (f.fieldtype) {\n case 'Currency':\n return v && typeof v === 'object' && 'amount' in v ? Number((v as { amount: unknown }).amount) : Number(v)\n case 'Check':\n return Boolean(v)\n case 'Int':\n case 'Float':\n return Number(v)\n case 'Datetime':\n if (v instanceof Date) return v.toISOString()\n if (typeof v === 'number' && Number.isFinite(v)) return new Date(v).toISOString()\n return v\n case 'Link':\n // The picker stores a plain id (string); an unedited enriched value is\n // {id,label}; a cleared value is null. The engine wants the id string ('' = clear).\n if (v == null || v === '') return ''\n if (typeof v === 'object') return String((v as { id?: unknown; value?: unknown }).id ?? (v as { value?: unknown }).value ?? '')\n return v\n default:\n return v\n }\n}\n\n/**\n * Enrich a record's Link values with the target's human label ({id,label}), so a\n * relation renders as its title (not a raw id) in BOTH the list cell and the\n * detail — @hanzo/data's relation display reads `.label`, its input reads `.id`.\n * `optionsByField` is the loaded picker options per Link field (value=id, label=title).\n */\nexport function enrichLinks(\n record: Record<string, unknown>,\n dt: DocType,\n optionsByField: Record<string, SelectOption[]>,\n): Record<string, unknown> {\n const out = { ...record }\n for (const f of dt.fields ?? []) {\n if (f.fieldtype !== 'Link') continue\n const raw = out[f.fieldname]\n if (typeof raw === 'string' && raw) {\n const opt = (optionsByField[f.fieldname] ?? []).find((o) => o.value === raw)\n out[f.fieldname] = { id: raw, label: opt?.label ?? raw }\n }\n }\n return out\n}\n\n/** The Link fields of a DocType (their options must be loaded for the picker). */\nexport function linkFields(dt: DocType): DocField[] {\n return (dt.fields ?? []).filter((f) => f.fieldtype === 'Link')\n}\n\n/** A blank create-form draft seeded with each field's declared default (Check → bool). */\nexport function newDraft(dt: DocType): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n for (const f of dt.fields ?? []) {\n if (f.default === undefined || f.default === '') continue\n out[f.fieldname] = f.fieldtype === 'Check' ? f.default === '1' || f.default === 'true' : f.default\n }\n return out\n}\n\n/**\n * A draft record → the framework write body: editable field values only (the\n * engine owns `name`/`docstatus`/timestamps), each coerced to its wire shape, and\n * the autoname source (e.g. `slug`) slugified so the document name is always URL-\n * safe. Fields left `undefined` are dropped — a partial edit never nulls a value.\n */\nexport function savePayload(draft: Record<string, unknown>, dt: DocType): Record<string, unknown> {\n const src = autonameSource(dt)\n const out: Record<string, unknown> = {}\n for (const f of dt.fields ?? []) {\n if (f.readOnly) continue // engine-owned; never written back\n let v = draft[f.fieldname]\n if (v === undefined) continue\n v = coerceForWrite(f, v)\n if (f.fieldname === src && typeof v === 'string') v = slugify(v)\n out[f.fieldname] = v\n }\n return out\n}\n","/**\n * FrameworkApi — the ONE generic client for the Hanzo Framework DocType engine\n * (cloud `clients/framework`, live at /v1/framework/*). It is metadata-driven and\n * doctype-agnostic: the SAME `records` CRUD serves a CMS Page, an ERP Invoice, or\n * a Helpdesk Ticket — an app lane is just a `module` filter over `doctypes`.\n *\n * TRANSPORT IS INJECTED. This layer knows the framework's *shape*, never how a\n * given host reaches it: the console proxies through its own user-bearer BFF, the\n * site shells (erp/crm/cms/help.<brand>) call the API origin with the IAM bearer\n * directly. Both hand a `Transport` to `createFrameworkClient` and get the SAME\n * client, so there is exactly one definition of the wire surface.\n *\n * Names (DocType + document) are used verbatim in the URL path, so a host keeps\n * them slug-style (no spaces/`%`) and this encodes each segment. Payloads are read\n * defensively from `{ data }` (or a bare array), so a shape drift degrades a list\n * rather than throwing.\n */\nimport type { DocType, FrameworkDoc, ListQuery, ModuleInfo, InstallResult } from './types'\n\n/**\n * The four verbs the framework surface needs, relative to the caller's\n * `/v1/framework` root. A host implements this over whatever credential path it\n * already owns — this layer never touches auth, cookies, or origins.\n */\nexport interface Transport {\n get: <T>(path: string) => Promise<T>\n post: <T>(path: string, body?: unknown) => Promise<T>\n put: <T>(path: string, body?: unknown) => Promise<T>\n del: (path: string) => Promise<void>\n}\n\nconst enc = encodeURIComponent\n\nconst asRecord = (v: unknown): Record<string, unknown> =>\n v && typeof v === 'object' && !Array.isArray(v) ? (v as Record<string, unknown>) : {}\n\n/** Pull the first array under a common envelope key (the engine uses `data`). */\nfunction rows(payload: unknown): Record<string, unknown>[] {\n if (Array.isArray(payload)) return payload.filter((x) => x && typeof x === 'object') as Record<string, unknown>[]\n const o = asRecord(payload)\n for (const k of ['data', 'items', 'rows']) {\n if (Array.isArray(o[k])) return (o[k] as unknown[]).filter((x) => x && typeof x === 'object') as Record<string, unknown>[]\n }\n return []\n}\n\n/** A framework document is already a flat map + envelope; keep it as-is (typed). */\nconst asDoc = (v: unknown): FrameworkDoc => asRecord(v) as FrameworkDoc\nconst asDocType = (v: unknown): DocType => {\n const r = asRecord(v)\n return { ...(r as object), name: String(r.name ?? ''), fields: Array.isArray(r.fields) ? (r.fields as DocType['fields']) : [] } as DocType\n}\n\n/** Build the generic document list querystring from a typed ListQuery. */\nexport function listQuery(q?: ListQuery): string {\n if (!q) return ''\n const p = new URLSearchParams()\n if (q.filters && Object.keys(q.filters).length) p.set('filters', JSON.stringify(q.filters))\n if (q.fields && q.fields.length) p.set('fields', q.fields.join(','))\n if (q.orderBy) p.set('order_by', q.orderBy)\n if (q.limit) p.set('limit', String(q.limit))\n const s = p.toString()\n return s ? `?${s}` : ''\n}\n\n/** Build the framework client over a host's transport. */\nexport function createFrameworkClient(t: Transport) {\n return {\n /** The DocType registry (schemas) — the collection definitions of every app lane. */\n doctypes: {\n list: (): Promise<DocType[]> => t.get<unknown>('doctypes').then((r) => rows(r).map(asDocType)),\n get: (name: string): Promise<DocType> => t.get<unknown>(`doctypes/${enc(name)}`).then(asDocType),\n create: (dt: DocType): Promise<DocType> => t.post<unknown>('doctypes', dt).then(asDocType),\n update: (name: string, dt: DocType): Promise<DocType> => t.put<unknown>(`doctypes/${enc(name)}`, dt).then(asDocType),\n remove: (name: string): Promise<void> => t.del(`doctypes/${enc(name)}`),\n },\n\n /** Generic, metadata-driven document CRUD — the SAME calls for ANY doctype. */\n records: {\n list: (doctype: string, q?: ListQuery): Promise<FrameworkDoc[]> =>\n t.get<unknown>(`${enc(doctype)}${listQuery(q)}`).then((r) => rows(r).map(asDoc)),\n get: (doctype: string, name: string): Promise<FrameworkDoc> =>\n t.get<unknown>(`${enc(doctype)}/${enc(name)}`).then(asDoc),\n create: (doctype: string, data: Record<string, unknown>): Promise<FrameworkDoc> =>\n t.post<unknown>(enc(doctype), data).then(asDoc),\n update: (doctype: string, name: string, data: Record<string, unknown>): Promise<FrameworkDoc> =>\n t.put<unknown>(`${enc(doctype)}/${enc(name)}`, data).then(asDoc),\n remove: (doctype: string, name: string): Promise<void> => t.del(`${enc(doctype)}/${enc(name)}`),\n submit: (doctype: string, name: string): Promise<FrameworkDoc> =>\n t.post<unknown>(`${enc(doctype)}/${enc(name)}/submit`).then(asDoc),\n cancel: (doctype: string, name: string): Promise<FrameworkDoc> =>\n t.post<unknown>(`${enc(doctype)}/${enc(name)}/cancel`).then(asDoc),\n },\n\n /** App-lane fixtures: list the registered lanes, inspect one, install into the org. */\n modules: {\n list: (): Promise<ModuleInfo[]> =>\n t.get<unknown>('modules').then((r) =>\n rows(r).map((m) => ({\n module: String(m.module ?? ''),\n doctypes: Array.isArray(m.doctypes) ? (m.doctypes as string[]) : [],\n })),\n ),\n get: (module: string): Promise<ModuleInfo> =>\n t.get<unknown>(`modules/${enc(module)}`).then((v) => {\n const r = asRecord(v)\n return {\n module: String(r.module ?? module),\n doctypes: Array.isArray(r.doctypes) ? (r.doctypes as string[]) : [],\n installed: Array.isArray(r.installed) ? (r.installed as string[]) : [],\n }\n }),\n install: (module: string): Promise<InstallResult> =>\n t.post<unknown>(`modules/${enc(module)}/install`).then((v) => {\n const r = asRecord(v)\n return {\n module: String(r.module ?? module),\n created: Array.isArray(r.created) ? (r.created as string[]) : [],\n existing: Array.isArray(r.existing) ? (r.existing as string[]) : [],\n }\n }),\n },\n\n /** Per-org role assignments (grant editors; the owner is seeded System Manager). */\n roles: {\n list: (): Promise<{ user: string; role: string }[]> =>\n t.get<unknown>('roles').then((r) => rows(r).map((x) => ({ user: String(x.user ?? ''), role: String(x.role ?? '') }))),\n assign: (user: string, role: string): Promise<void> => t.post('roles', { user, role }).then(() => undefined),\n revoke: (user: string, role: string): Promise<void> => t.del(`roles/${enc(user)}/${enc(role)}`),\n },\n }\n}\n\nexport type FrameworkClient = ReturnType<typeof createFrameworkClient>\n\n/** An HTTP failure carrying the status, so `classifyBackend` can tell 401 from 403 from 404. */\nexport class FrameworkHttpError extends Error {\n constructor(\n public readonly status: number,\n message: string,\n ) {\n super(message)\n this.name = 'FrameworkHttpError'\n }\n}\n\nexport interface FetchTransportOptions {\n /** Absolute `/v1/framework` root, e.g. `https://api.hanzo.ai/v1/framework`. */\n baseUrl: string\n /** Called per request — a bearer token, or null when signed out. */\n token?: () => string | null | undefined\n /** Injectable for tests; defaults to the global `fetch`. */\n fetchImpl?: typeof fetch\n}\n\n/**\n * The bearer transport every site shell uses: the caller's IAM access token on\n * the Authorization header, straight to the API origin. No cookie, no second\n * credential path — the engine resolves the org from the token's owner claim.\n */\nexport function fetchTransport(opts: FetchTransportOptions): Transport {\n const base = opts.baseUrl.replace(/\\/+$/, '')\n const doFetch = opts.fetchImpl ?? ((...a: Parameters<typeof fetch>) => fetch(...a))\n\n async function req<T>(method: string, path: string, body?: unknown): Promise<T> {\n const tok = opts.token?.()\n const res = await doFetch(`${base}/${path}`, {\n method,\n headers: {\n Accept: 'application/json',\n ...(body === undefined ? null : { 'Content-Type': 'application/json' }),\n ...(tok ? { Authorization: `Bearer ${tok}` } : null),\n },\n ...(body === undefined ? null : { body: JSON.stringify(body) }),\n })\n const text = await res.text()\n let payload: unknown = null\n try {\n payload = text ? JSON.parse(text) : null\n } catch {\n payload = null\n }\n if (!res.ok) {\n const o = asRecord(payload)\n const said = [o.error, o.msg, o.message].find((v) => typeof v === 'string' && v.trim() !== '')\n throw new FrameworkHttpError(res.status, typeof said === 'string' ? said : `HTTP ${res.status}`)\n }\n return payload as T\n }\n\n return {\n get: (p) => req('GET', p),\n post: (p, b) => req('POST', p, b),\n put: (p, b) => req('PUT', p, b),\n del: (p) => req<void>('DELETE', p).then(() => undefined),\n }\n}\n","/**\n * Shared, non-React data helpers for the generic DocType renderer. A relation\n * (Link) field is a picker over the TARGET doctype's records, so before a view\n * can render or edit one it must load those records (+ the target's schema for\n * the human label). This is the ONE place that does it, used by both the records\n * list and the record detail — no per-view duplication.\n */\nimport type { SelectOption, FieldDefinition } from '@hanzo/data'\nimport type { DocType } from './types'\nimport type { FrameworkClient } from './client'\nimport { linkFields, titleOf } from './fields'\n\n/** The picker options for every Link field of `dt`: value = target id, label = its title. */\nexport async function loadLinkOptions(\n client: FrameworkClient,\n dt: DocType,\n): Promise<Record<string, SelectOption[]>> {\n const links = linkFields(dt)\n const out: Record<string, SelectOption[]> = {}\n await Promise.all(\n links.map(async (f) => {\n const target = f.options\n if (!target) return\n // A target the caller can't read (403) → no options → the field falls back\n // to a raw-id input (honest, never a fabricated candidate list).\n const [tdt, docs] = await Promise.all([\n client.doctypes.get(target).catch(() => null),\n client.records.list(target, { limit: 200 }).catch(() => []),\n ])\n out[f.fieldname] = docs.map((d) => ({\n value: String(d.name),\n label: tdt ? titleOf(d, tdt) : String(d.name),\n }))\n }),\n )\n return out\n}\n\n/**\n * The `fieldOptions` callback @hanzo/data's views take: relation fields get their\n * loaded target records; select fields get the choices declared in metadata (so\n * the table cell and the form input agree). Everything else → undefined.\n */\nexport function makeFieldOptions(\n linkOptions: Record<string, SelectOption[]>,\n): (field: FieldDefinition) => SelectOption[] | undefined {\n return (field) => {\n if (field.type === 'relation') return linkOptions[field.name] ?? []\n if (field.type === 'select' || field.type === 'multiSelect') {\n return (field.metadata as { options?: SelectOption[] } | undefined)?.options\n }\n return undefined\n }\n}\n","'use client'\n\n/**\n * Loader — the layer's own pending state: the brand mark, pulsing. It uses the\n * product layer's `HanzoMark` (which already inherits `currentColor`, so it\n * themes and white-labels for free) rather than importing a brand package, so\n * this stays a presentational primitive with no host coupling.\n */\nimport { Text, YStack } from '@hanzo/gui'\n\nimport { HanzoMark } from '../product/HanzoMark'\n\nexport function Loader({ label, size = 40 }: { label?: string; size?: number }) {\n return (\n <YStack flex={1} minH={280} items=\"center\" justify=\"center\" gap=\"$3\">\n <style>\n {'@keyframes hz-pulse{0%,100%{opacity:.45}50%{opacity:1}}.hz-pulse{animation:hz-pulse 1.5s ease-in-out infinite;display:inline-flex}@media (prefers-reduced-motion:reduce){.hz-pulse{animation:none}}'}\n </style>\n <div className=\"hz-pulse\">\n <HanzoMark size={size} />\n </div>\n {label ? (\n <Text fontSize=\"$3\" color=\"$color11\">\n {label}\n </Text>\n ) : null}\n </YStack>\n )\n}\n","'use client'\n\n/**\n * CollectionsBrowser — the app-lane home: the DocTypes of a `module` (a CMS\n * \"collection\" IS a framework DocType tagged with the lane's module). It lists\n * them as cards, offers a first-run \"Set up\" that installs the lane's fixtures\n * (POST /v1/framework/modules/:module/install), and a \"New collection\" that opens\n * the dynamic content-type builder (name + typed fields, on-page). Everything is\n * per-org and honest — an org with the lane not yet installed sees the setup CTA,\n * never a fabricated collection.\n *\n * This is generic over `module`, so CMS (`cms`), ERP (`erp`), and Helpdesk\n * (`help`) all reuse it — the ONE collections home for every lane.\n */\nimport { useCallback, useEffect, useState, type ReactNode } from 'react'\nimport { Card, Text, XStack, YStack } from '@hanzo/gui'\nimport { Boxes, Plus, TriangleAlert } from '@hanzogui/lucide-icons-2'\n\nimport { PageHeader } from '../product'\nimport { PrimaryButton } from '../product'\nimport { EmptyState } from '../product'\nimport { Loader } from './Loader'\nimport { BackendStateCard, classifyBackend, type BackendState } from '../product'\nimport type { FrameworkClient } from './client'\nimport type { DocType } from './types'\nimport { moduleDoctypes } from './fields'\n\nexport interface CollectionsBrowserProps {\n client: FrameworkClient\n /** The app lane: 'cms' | 'erp' | 'help' | … */\n module: string\n /** Human label for the lane (e.g. \"Content\"). */\n label: string\n subtitle: string\n /** Open a collection's records. */\n onOpen: (doctype: string) => void\n /**\n * Lane-appropriate copy for the first-run (pre-install) empty state. Optional and\n * defaulted to the CMS wording, so this component stays generic over the lane: a\n * CMS caller renders identically, while ERP/Help pass their own description +\n * bullets. Additive only — no behavior/permission/proxy change.\n */\n setupDescription?: string\n setupBullets?: string[]\n /**\n * Schema AUTHORING is a separate concern from schema USE, so it is injected\n * rather than imported: a host that can define collections (the console's\n * CollectionBuilder) supplies this; a host that only consumes them (a site\n * shell) omits it and the \"New collection\" affordance is simply not offered.\n * Nothing is faked either way.\n */\n renderBuilder?: (p: { onSaved: (doctype: string) => void; onCancel: () => void }) => ReactNode\n}\n\ntype LoadState =\n | { phase: 'loading' }\n | { phase: 'error'; error: BackendState }\n | { phase: 'ready'; collections: DocType[]; registered: boolean }\n\nexport function CollectionsBrowser({ client, module, label, subtitle, onOpen, setupDescription, setupBullets, renderBuilder }: CollectionsBrowserProps) {\n const [state, setState] = useState<LoadState>({ phase: 'loading' })\n const [busy, setBusy] = useState(false)\n const [creating, setCreating] = useState(false)\n const [actionError, setActionError] = useState<string | null>(null)\n\n const load = useCallback(\n async (signal: { cancelled: boolean }) => {\n setState({ phase: 'loading' })\n try {\n const [dts, mod] = await Promise.all([\n client.doctypes.list(),\n client.modules.get(module).catch(() => null), // module may not be registered on older cloud\n ])\n if (signal.cancelled) return\n setState({ phase: 'ready', collections: moduleDoctypes(dts, module), registered: Boolean(mod && mod.doctypes.length) })\n } catch (e) {\n if (!signal.cancelled) setState({ phase: 'error', error: classifyBackend(e) })\n }\n },\n [client, module],\n )\n\n useEffect(() => {\n const signal = { cancelled: false }\n void load(signal)\n return () => { signal.cancelled = true }\n }, [load])\n\n const reload = useCallback(() => void load({ cancelled: false }), [load])\n\n const install = useCallback(async () => {\n setBusy(true)\n setActionError(null)\n try {\n await client.modules.install(module)\n reload()\n } catch (e) {\n setActionError(classifyBackend(e).message)\n } finally {\n setBusy(false)\n }\n }, [client, module, reload])\n\n if (state.phase === 'loading') return <Loader label={`Loading ${label}…`} />\n if (state.phase === 'error') {\n return (\n <>\n <PageHeader title={label} subtitle={subtitle} />\n <BackendStateCard state={state.error} onRetry={reload} hint=\"framework · GET /v1/framework/doctypes\" />\n </>\n )\n }\n\n const { collections } = state\n return (\n <>\n <PageHeader\n title={label}\n subtitle={subtitle}\n actions={\n renderBuilder && collections.length && !creating ? (\n <PrimaryButton size=\"$2\" icon={<Plus size={15} />} onPress={() => { setCreating(true); setActionError(null) }}>New collection</PrimaryButton>\n ) : undefined\n }\n />\n\n {actionError ? (\n <Card borderWidth={1} borderColor=\"$red7\" bg=\"$red2\" p=\"$3\" mb=\"$3\" maxWidth={620}>\n <XStack gap=\"$2\" items=\"center\"><TriangleAlert size={15} /><Text fontSize=\"$3\" color=\"$red11\">{actionError}</Text></XStack>\n </Card>\n ) : null}\n\n {creating && renderBuilder ? (\n <YStack mb=\"$3\">\n {renderBuilder({\n onSaved: (name) => { setCreating(false); onOpen(name) },\n onCancel: () => setCreating(false),\n })}\n </YStack>\n ) : null}\n\n {collections.length === 0 && !creating ? (\n <EmptyState\n icon={Boxes}\n title={`Set up ${label}`}\n description={setupDescription ?? `${label} is a set of content collections — Pages, Posts, Articles, Media, and Navigation — as DocTypes on the Hanzo Framework, per organization.`}\n bullets={setupBullets ?? [\n 'Installs the default collections into your organization',\n 'Content is documents on the framework — versioned, permissioned, per-org',\n 'Add your own collections and fields any time',\n ]}\n primary={state.registered ? { label: busy ? 'Setting up…' : `Set up ${label}`, onPress: install } : undefined}\n secondary={renderBuilder ? { label: 'New collection', onPress: () => setCreating(true) } : undefined}\n />\n ) : !creating ? (\n <XStack gap=\"$3\" flexWrap=\"wrap\">\n {collections.map((dt) => (\n <YStack\n key={dt.name}\n onPress={() => onOpen(dt.name)}\n hoverStyle={{ borderColor: '$color8' }}\n cursor=\"pointer\"\n borderWidth={1}\n borderColor=\"$borderColor\"\n rounded=\"$4\"\n p=\"$4\"\n gap=\"$2\"\n // Mobile first: fill the column on a phone, settle into a grid of\n // ~260px cards as the viewport allows. A fixed width would leave a\n // dead gutter at 390px, which is the width that has to work.\n flex={1}\n flexBasis={240}\n minW={200}\n maxW={340}\n >\n <XStack gap=\"$2\" items=\"center\">\n <Boxes size={16} />\n <Text fontSize=\"$4\" fontWeight=\"700\" numberOfLines={1}>{dt.name}</Text>\n </XStack>\n <Text fontSize=\"$2\" color=\"$color10\">\n {(dt.fields?.length ?? 0)} field{(dt.fields?.length ?? 0) === 1 ? '' : 's'}\n {dt.isSubmittable ? ' · submittable' : ''}\n </Text>\n </YStack>\n ))}\n </XStack>\n ) : null}\n </>\n )\n}\n\n","'use client'\n\n/**\n * DocTypeRecords — the Twenty-grade records surface for ONE framework DocType,\n * driven ENTIRELY by DocType metadata. It loads the schema (→ @hanzo/data\n * `FieldDefinition[]` via `docTypeToFields`), the documents, and each relation's\n * candidate records, then renders through @hanzo/data's `RecordsView` — the shared\n * table ⇆ board view with filter/sort/group, inline cell editing, and a detail\n * hand-off. Every field type shows the right Display/Input with ZERO per-doctype\n * code, so a CMS Page, an ERP Invoice, or a Helpdesk Ticket all render here.\n *\n * Persistence is REAL: an inline cell edit sends the FULL record (the engine\n * validates the whole document on update) via `savePayload`, and reflects the\n * server's row. States are honest — loading / empty / backend-error, never a\n * fabricated row.\n */\nimport { useCallback, useEffect, useMemo, useState, type ReactNode } from 'react'\nimport { Button } from '@hanzo/gui'\nimport { RefreshCw } from '@hanzogui/lucide-icons-2'\nimport { RecordsView, type FieldDefinition, type SelectOption } from '@hanzo/data'\n\nimport { BackendStateCard, classifyBackend, type BackendState } from '../product'\nimport type { FrameworkClient } from './client'\nimport type { DocType, FrameworkDoc } from './types'\nimport { docTypeToFields, toRecord, enrichLinks, savePayload, isMediaDoctype, hasProjectField, PROJECT_FIELD } from './fields'\nimport { loadLinkOptions, makeFieldOptions } from './data'\n\ntype LoadState =\n | { phase: 'loading' }\n | { phase: 'error'; error: BackendState }\n | { phase: 'ready'; dt: DocType; fields: FieldDefinition[]; docs: FrameworkDoc[]; records: Record<string, unknown>[]; linkOptions: Record<string, SelectOption[]> }\n\nexport interface DocTypeRecordsProps {\n client: FrameworkClient\n /** DocType name to render. */\n doctype: string\n /** Open a document's detail (by document name). */\n onOpen: (name: string) => void\n /** Start creating a document. */\n onCreate: () => void\n /** Active project scope — filters the list when the collection has a `project` field. */\n project?: string\n title?: ReactNode\n /**\n * An asset library (a DocType whose required field is an Attach) is better\n * shown as a gallery than a table, but uploading bytes needs the HOST's object\n * store — not something this layer can know. So the gallery is injected: a host\n * with a DAM supplies it, a host without one gets the honest generic table.\n */\n renderMedia?: (p: { dt: DocType; docs: FrameworkDoc[]; onOpen: (name: string) => void; onChanged: () => void; toolbarExtra: ReactNode }) => ReactNode\n}\n\nexport function DocTypeRecords({ client, doctype, onOpen, onCreate, project, title, renderMedia }: DocTypeRecordsProps) {\n const [state, setState] = useState<LoadState>({ phase: 'loading' })\n const [mutationError, setMutationError] = useState<string | null>(null)\n\n const load = useCallback(\n async (signal: { cancelled: boolean }) => {\n setState({ phase: 'loading' })\n try {\n const dt = await client.doctypes.get(doctype)\n const linkOptions = await loadLinkOptions(client, dt)\n // Scope the list to the selected project ONLY when the collection declares\n // a `project` field (the engine 400s a filter on an unknown field). No\n // project selected, or a collection without the field → org-level list.\n const filters = project && hasProjectField(dt) ? { [PROJECT_FIELD]: project } : undefined\n const docs = await client.records.list(doctype, { limit: 200, ...(filters ? { filters } : {}) })\n if (signal.cancelled) return\n const records = docs.map((d) => enrichLinks(toRecord(d, dt), dt, linkOptions))\n setState({ phase: 'ready', dt, fields: docTypeToFields(dt), docs, records, linkOptions })\n } catch (e) {\n if (!signal.cancelled) setState({ phase: 'error', error: classifyBackend(e) })\n }\n },\n [client, doctype, project],\n )\n\n useEffect(() => {\n const signal = { cancelled: false }\n void load(signal)\n return () => { signal.cancelled = true }\n }, [load])\n\n const reload = useCallback(() => void load({ cancelled: false }), [load])\n\n const fieldOptions = useMemo(\n () => (state.phase === 'ready' ? makeFieldOptions(state.linkOptions) : undefined),\n [state],\n )\n\n /** Persist ONE inline edit. The engine validates the whole document on update,\n * so send the full record with the cell change merged in (never a partial body). */\n const onEditCommit = useCallback(\n async (record: Record<string, unknown>, field: FieldDefinition, value: unknown) => {\n if (state.phase !== 'ready') return\n const name = typeof record.name === 'string' ? record.name : ''\n if (!name) return\n setMutationError(null)\n try {\n const body = savePayload({ ...record, [field.name]: value }, state.dt)\n const saved = await client.records.update(doctype, name, body)\n const next = enrichLinks(toRecord(saved, state.dt), state.dt, state.linkOptions)\n setState((s) => (s.phase === 'ready' ? { ...s, records: s.records.map((r) => (r.name === name ? next : r)) } : s))\n } catch (e) {\n setMutationError(classifyBackend(e).message)\n throw e // let the board revert its optimistic move\n }\n },\n [client, doctype, state],\n )\n\n if (state.phase === 'error') {\n return <BackendStateCard state={state.error} onRetry={reload} hint={`framework · GET /v1/framework/${doctype}`} />\n }\n\n const refresh = <Button size=\"$2\" icon={<RefreshCw size={15} />} onPress={reload}>Refresh</Button>\n\n // A media/asset library (a required Attach) gets the DAM gallery instead of the\n // table — real upload to the org's S3 + presigned-on-view thumbnails.\n if (renderMedia && state.phase === 'ready' && isMediaDoctype(state.dt)) {\n return <>{renderMedia({ dt: state.dt, docs: state.docs, onOpen, onChanged: reload, toolbarExtra: refresh })}</>\n }\n\n const ready = state.phase === 'ready' ? state : undefined\n return (\n <RecordsView\n title={title}\n fields={ready?.fields ?? []}\n records={ready?.records ?? []}\n loading={state.phase === 'loading'}\n onOpen={(r) => onOpen(String((r as { name?: unknown }).name ?? (r as { id?: unknown }).id ?? ''))}\n onCreate={onCreate}\n createLabel=\"New record\"\n onEditCommit={onEditCommit}\n fieldOptions={fieldOptions}\n toolbarExtra={refresh}\n empty={mutationError ?? `No records in ${doctype} yet.`}\n />\n )\n}\n\n","'use client'\n\n/**\n * DocTypeDetail — view / edit / create / delete ONE framework document, plus the\n * lifecycle actions the engine exposes: PUBLISH (a status field flips Draft ⇆\n * Published) and, for a submittable DocType, SUBMIT / CANCEL (docstatus 0→1→2).\n * All metadata-driven: it loads the schema (→ @hanzo/data `FieldDefinition[]`) and\n * renders through `RecordDetail` (read) + `RecordForm` (edit) — the SAME field\n * routers the list uses — so every field type just works with zero per-doctype\n * code. Create (`name === 'new'`) opens the form over a defaulted blank draft.\n *\n * The engine validates the WHOLE document on update, so save/publish always send\n * the full record (via `savePayload`, which slugifies the URL key + strips the\n * redacted Password). States are honest: backend-error, inline save error, and a\n * two-step delete confirmation — never optimistic fakery.\n */\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { Button, Card, Text, XStack, YStack } from '@hanzo/gui'\nimport { ArrowLeft, Ban, Globe, Pencil, PenOff, Save, Send, Trash2, TriangleAlert, X } from '@hanzogui/lucide-icons-2'\nimport { RecordDetail, RecordForm, type FieldDefinition, type SelectOption } from '@hanzo/data'\n\nimport { BackendStateCard, classifyBackend, type BackendState } from '../product'\nimport { PrimaryButton } from '../product'\nimport type { FrameworkClient } from './client'\nimport type { DocType, FrameworkDoc } from './types'\nimport { docTypeToFields, toRecord, enrichLinks, savePayload, newDraft, statusField, titleOf, hasProjectField, PROJECT_FIELD } from './fields'\nimport { loadLinkOptions, makeFieldOptions } from './data'\n\nexport interface DocTypeDetailProps {\n client: FrameworkClient\n doctype: string\n /** Document name, or `'new'` to open the create form. */\n name: string\n /** Active project scope — stamped onto a NEW record when the collection has a `project` field. */\n project?: string\n onBack: () => void\n /** Land on a document (after create). */\n onView: (name: string) => void\n}\n\ntype LoadState =\n | { phase: 'loading' }\n | { phase: 'error'; error: BackendState }\n | { phase: 'ready'; dt: DocType; record: Record<string, unknown> | null; linkOptions: Record<string, SelectOption[]> }\n\nexport function DocTypeDetail({ client, doctype, name, project, onBack, onView }: DocTypeDetailProps) {\n const isNew = name === 'new'\n const [state, setState] = useState<LoadState>({ phase: 'loading' })\n const [editing, setEditing] = useState(isNew)\n const [draft, setDraft] = useState<Record<string, unknown>>({})\n const [busy, setBusy] = useState(false)\n const [saveError, setSaveError] = useState<string | null>(null)\n const [confirmingDelete, setConfirmingDelete] = useState(false)\n\n const load = useCallback(\n async (signal: { cancelled: boolean }) => {\n setState({ phase: 'loading' })\n try {\n const dt = await client.doctypes.get(doctype)\n const linkOptions = await loadLinkOptions(client, dt)\n const doc = isNew ? null : await client.records.get(doctype, name)\n if (signal.cancelled) return\n const record = doc ? enrichLinks(toRecord(doc, dt), dt, linkOptions) : null\n setState({ phase: 'ready', dt, record, linkOptions })\n // A NEW record inherits the active project scope (when the collection has a\n // `project` field), so content created under a selected project is tagged\n // with it and shows up in that project's filtered list.\n const seed = newDraft(dt)\n if (record == null && project && hasProjectField(dt)) seed[PROJECT_FIELD] = project\n setDraft(record ? { ...record } : seed)\n setEditing(isNew)\n setSaveError(null)\n setConfirmingDelete(false)\n } catch (e) {\n if (!signal.cancelled) setState({ phase: 'error', error: classifyBackend(e) })\n }\n },\n [client, doctype, name, isNew, project],\n )\n\n useEffect(() => {\n const signal = { cancelled: false }\n void load(signal)\n return () => { signal.cancelled = true }\n }, [load])\n\n const reload = useCallback(() => void load({ cancelled: false }), [load])\n\n const ready = state.phase === 'ready' ? state : undefined\n const dt = ready?.dt\n const record = ready?.record ?? null\n const fields: FieldDefinition[] = useMemo(\n () => (dt ? docTypeToFields(dt, { editing: !isNew }) : []),\n [dt, isNew],\n )\n const fieldOptions = useMemo(() => (ready ? makeFieldOptions(ready.linkOptions) : undefined), [ready])\n const title = dt ? (isNew ? `New ${doctype}` : titleOf(record ?? {}, dt)) : doctype\n\n const onChange = useCallback((field: string, value: unknown) => {\n setDraft((d) => ({ ...d, [field]: value }))\n }, [])\n\n const reflect = useCallback(\n (saved: FrameworkDoc) => {\n if (!dt || !ready) return\n const next = enrichLinks(toRecord(saved, dt), dt, ready.linkOptions)\n setState({ phase: 'ready', dt, record: next, linkOptions: ready.linkOptions })\n setDraft({ ...next })\n },\n [dt, ready],\n )\n\n const save = useCallback(async () => {\n if (!dt) return\n setBusy(true)\n setSaveError(null)\n try {\n const body = savePayload(draft, dt)\n if (isNew) {\n const created = await client.records.create(doctype, body)\n if (created.name) onView(String(created.name))\n else onBack()\n return\n }\n if (!record?.name) throw new Error('This record has no name to update.')\n reflect(await client.records.update(doctype, String(record.name), body))\n setEditing(false)\n } catch (e) {\n setSaveError(classifyBackend(e).message)\n } finally {\n setBusy(false)\n }\n }, [client, doctype, draft, dt, isNew, onBack, onView, record, reflect])\n\n /** Lifecycle op on the current record (publish/unpublish/submit/cancel/delete). */\n const run = useCallback(\n async (op: () => Promise<FrameworkDoc | void>) => {\n setBusy(true)\n setSaveError(null)\n try {\n const saved = await op()\n if (saved) reflect(saved)\n } catch (e) {\n setSaveError(classifyBackend(e).message)\n } finally {\n setBusy(false)\n }\n },\n [reflect],\n )\n\n const remove = useCallback(async () => {\n if (!record?.name) return\n setBusy(true)\n setSaveError(null)\n try {\n await client.records.remove(doctype, String(record.name))\n onBack()\n } catch (e) {\n setSaveError(classifyBackend(e).message)\n setBusy(false)\n setConfirmingDelete(false)\n }\n }, [client, doctype, onBack, record])\n\n const backButton = (\n <Button size=\"$2\" icon={<ArrowLeft size={15} />} onPress={onBack}>Back</Button>\n )\n\n if (state.phase === 'error') {\n return (\n <YStack gap=\"$3\">\n {backButton}\n <BackendStateCard state={state.error} onRetry={reload} hint={`framework · ${doctype}/${name}`} />\n </YStack>\n )\n }\n if (!dt) return <YStack gap=\"$3\">{backButton}</YStack>\n\n // Publish (status field) + submit/cancel (submittable) are only offered in read\n // mode on a persisted, draft-status document.\n const statusF = statusField(dt)\n const status = record ? String(record[statusF] ?? '') : ''\n const docstatus = record ? Number(record.docstatus ?? 0) : 0\n const canPublish = !editing && !isNew && statusF && docstatus === 0\n const canSubmit = !editing && !isNew && dt.isSubmittable && docstatus === 0\n const canCancel = !editing && !isNew && dt.isSubmittable && docstatus === 1\n\n return (\n <YStack gap=\"$3\">\n <XStack items=\"center\" justify=\"space-between\" gap=\"$4\" flexWrap=\"wrap\">\n <XStack items=\"center\" gap=\"$3\" flex={1}>\n {backButton}\n <YStack flex={1}>\n <Text fontSize=\"$6\" fontWeight=\"800\" numberOfLines={1}>{title}</Text>\n <Text fontSize=\"$2\" color=\"$color10\">\n {doctype}{status ? ` · ${status}` : ''}{docstatus === 1 ? ' · submitted' : docstatus === 2 ? ' · cancelled' : ''}\n </Text>\n </YStack>\n </XStack>\n <XStack items=\"center\" gap=\"$2\" flexWrap=\"wrap\">\n {editing ? (\n <>\n {!isNew ? (\n <Button size=\"$2\" icon={<X size={15} />} disabled={busy} onPress={() => { setDraft(record ? { ...record } : {}); setEditing(false); setSaveError(null) }}>Cancel</Button>\n ) : null}\n <PrimaryButton size=\"$2\" icon={<Save size={15} />} disabled={busy} onPress={save}>\n {busy ? 'Saving…' : isNew ? 'Create' : 'Save'}\n </PrimaryButton>\n </>\n ) : (\n <>\n <Button size=\"$2\" theme=\"red\" icon={<Trash2 size={15} />} disabled={busy} onPress={() => setConfirmingDelete(true)}>Delete</Button>\n {canCancel ? (\n <Button size=\"$2\" icon={<Ban size={15} />} disabled={busy} onPress={() => run(() => client.records.cancel(doctype, String(record!.name)))}>Cancel doc</Button>\n ) : null}\n {canSubmit ? (\n <Button size=\"$2\" icon={<Send size={15} />} disabled={busy} onPress={() => run(() => client.records.submit(doctype, String(record!.name)))}>Submit</Button>\n ) : null}\n {canPublish ? (\n status === 'Published' ? (\n <Button size=\"$2\" icon={<PenOff size={15} />} disabled={busy} onPress={() => run(async () => client.records.update(doctype, String(record!.name), savePayload({ ...record, [statusF]: 'Draft' }, dt)))}>Unpublish</Button>\n ) : (\n <PrimaryButton size=\"$2\" icon={<Globe size={15} />} disabled={busy} onPress={() => run(async () => client.records.update(doctype, String(record!.name), savePayload({ ...record, [statusF]: 'Published' }, dt)))}>Publish</PrimaryButton>\n )\n ) : null}\n <PrimaryButton size=\"$2\" icon={<Pencil size={15} />} onPress={() => setEditing(true)}>Edit</PrimaryButton>\n </>\n )}\n </XStack>\n </XStack>\n\n {confirmingDelete ? (\n <Card borderWidth={1} borderColor=\"$red7\" bg=\"$red2\" p=\"$3\" gap=\"$2\" maxWidth={620}>\n <Text fontSize=\"$3\" fontWeight=\"700\">Delete “{title}”? This cannot be undone.</Text>\n <XStack gap=\"$2\">\n <Button size=\"$2\" theme=\"red\" disabled={busy} onPress={remove}>{busy ? 'Deleting…' : 'Confirm delete'}</Button>\n <Button size=\"$2\" disabled={busy} onPress={() => setConfirmingDelete(false)}>Cancel</Button>\n </XStack>\n </Card>\n ) : null}\n\n {saveError ? (\n <Card borderWidth={1} borderColor=\"$red7\" bg=\"$red2\" p=\"$3\" maxWidth={620}>\n <XStack gap=\"$2\" items=\"center\"><TriangleAlert size={15} /><Text fontSize=\"$3\" color=\"$red11\">{saveError}</Text></XStack>\n </Card>\n ) : null}\n\n <Card borderWidth={1} borderColor=\"$borderColor\" p=\"$4\" maxWidth={760}>\n {editing ? (\n <RecordForm fields={fields} values={draft} onChange={onChange} fieldOptions={fieldOptions} />\n ) : record ? (\n <RecordDetail title={title} fields={fields} record={record} fieldOptions={fieldOptions} />\n ) : null}\n </Card>\n </YStack>\n )\n}\n\n"]}