@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.
- package/README.md +59 -0
- package/dist/chunk-3NG33DV2.cjs +607 -0
- package/dist/chunk-3NG33DV2.cjs.map +1 -0
- package/dist/chunk-5CZOYONP.js +343 -0
- package/dist/chunk-5CZOYONP.js.map +1 -0
- package/dist/{chunk-P2P6ST6J.js → chunk-7ZNK6JSS.js} +9 -394
- package/dist/chunk-7ZNK6JSS.js.map +1 -0
- package/dist/chunk-GVCOAJLO.js +397 -0
- package/dist/chunk-GVCOAJLO.js.map +1 -0
- package/dist/chunk-GWNNLYX4.cjs +353 -0
- package/dist/chunk-GWNNLYX4.cjs.map +1 -0
- package/dist/{chunk-NBZDIMP3.cjs → chunk-ONVERVFG.cjs} +33 -438
- package/dist/chunk-ONVERVFG.cjs.map +1 -0
- package/dist/chunk-P2QU5MN5.js +555 -0
- package/dist/chunk-P2QU5MN5.js.map +1 -0
- package/dist/chunk-WHJR5S4L.cjs +418 -0
- package/dist/chunk-WHJR5S4L.cjs.map +1 -0
- package/dist/framework/CollectionBuilder.d.ts +12 -0
- package/dist/framework/CollectionsBrowser.d.ts +26 -19
- package/dist/framework/DocTypeRecords.d.ts +31 -11
- package/dist/framework/MediaGrid.d.ts +42 -0
- package/dist/framework/RecordCards.d.ts +35 -0
- package/dist/framework/builder-logic.d.ts +76 -0
- package/dist/framework/client.d.ts +31 -44
- package/dist/framework/core.cjs +213 -0
- package/dist/framework/core.cjs.map +1 -0
- package/dist/framework/core.d.ts +6 -0
- package/dist/framework/core.js +4 -0
- package/dist/framework/core.js.map +1 -0
- package/dist/framework/data.d.ts +2 -2
- package/dist/framework/fields.d.ts +47 -4
- package/dist/framework/index.cjs +1340 -0
- package/dist/framework/index.cjs.map +1 -0
- package/dist/framework/index.d.ts +9 -23
- package/dist/framework/index.js +1119 -0
- package/dist/framework/index.js.map +1 -0
- package/dist/framework/media.d.ts +53 -0
- package/dist/framework/parts.d.ts +74 -0
- package/dist/framework/responsive.d.ts +41 -0
- package/dist/framework/types.d.ts +13 -7
- package/dist/product/SelectMenu.d.ts +13 -1
- package/dist/product/index.cjs +2061 -336
- package/dist/product/index.cjs.map +1 -1
- package/dist/product/index.js +1909 -3
- package/dist/product/index.js.map +1 -1
- package/dist/product/social/index.cjs +17 -16
- package/dist/product/social/index.js +3 -2
- package/package.json +11 -5
- package/dist/chunk-2BM42AZR.cjs +0 -2301
- package/dist/chunk-2BM42AZR.cjs.map +0 -1
- package/dist/chunk-7P7R7FC5.js +0 -2231
- package/dist/chunk-7P7R7FC5.js.map +0 -1
- package/dist/chunk-NBZDIMP3.cjs.map +0 -1
- package/dist/chunk-P2P6ST6J.js.map +0 -1
- package/dist/framework/Loader.d.ts +0 -4
- package/dist/framework.cjs +0 -760
- package/dist/framework.cjs.map +0 -1
- package/dist/framework.d.ts +0 -1
- package/dist/framework.js +0 -730
- package/dist/framework.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/framework/responsive.ts","../../src/framework/parts.tsx","../../src/framework/CollectionBuilder.tsx","../../src/framework/CollectionsBrowser.tsx","../../src/framework/MediaGrid.tsx","../../src/framework/RecordCards.tsx","../../src/framework/DocTypeRecords.tsx","../../src/framework/DocTypeDetail.tsx"],"names":["useState","useCallback","PrimaryButton","Button","jsx","XStack","Card","jsxs","TriangleAlert","Text","Spinner","YStack","BUILDER_FIELD_TYPES","fieldsFromDocType","starterFields","useMemo","validateBuilder","blankField","moveField","toDocType","classifyBackend","Input","fieldNameFromLabel","GripVertical","SelectMenu","FieldSwitch","ArrowUp","ArrowDown","Trash2","fieldNeedsOptions","Plus","Boxes","moduleDoctypes","useEffect","PageHeader","BackendStateCard","EmptyState","mediaFileField","useRef","mediaDocPayload","ImageIcon","Upload","titleOf","looksLikeImage","cardFields","searchRecords","Search","ChevronRight","FieldDisplay","loadLinkOptions","hasProjectField","PROJECT_FIELD","enrichLinks","toRecord","docTypeToFields","makeFieldOptions","listHiddenFields","savePayload","RefreshCw","isMediaDoctype","RecordsView","dt","record","newDraft","ArrowLeft","isDraft","statusField","SUBMITTED","CANCELLED","Fragment","X","Save","Ban","Send","PenOff","Globe","Pencil","RecordForm","RecordDetail"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client'\n\n/**\n * MOBILE-FIRST layout, measured from the CONTAINER — not the viewport.\n *\n * A viewport media query is the wrong question here: the DocType renderer is\n * mounted inside whatever pane a host gives it (a console with a 260px sidebar, a\n * split view, a modal), so \"is the window narrow\" and \"is MY box narrow\" are\n * different facts, and only the second one decides whether a table fits. `onLayout`\n * answers the second, works identically on web and native (no media config, no\n * `window`), and needs no host wiring.\n *\n * The first render has NO measurement, and the mobile-first answer to \"I don't\n * know yet\" is PHONE: a card list is usable at every width, a 12-column table is\n * not. So the first paint — including SSR — is the phone layout, and the desktop\n * layout is the enhancement applied after the box reports its size. That also\n * means server and client render the same tree: no hydration mismatch.\n */\nimport { useCallback, useState } from 'react'\n\n/** The width at which a data TABLE starts being readable rather than a scroll trap. */\nexport const TABLE_MIN = 720\n\n/** The width at which fixed-size cards can sit two-up. */\nexport const GRID_MIN = 560\n\n/**\n * Minimum interactive target, in px. WCAG 2.5.5 (AAA) asks for 44×44 and the iOS\n * HIG for 44pt; Material asks 48. 44 is the floor every control in this layer\n * meets on a phone — a 28px icon button next to a 28px icon button is the single\n * most common reason a mobile admin surface is unusable.\n */\nexport const TAP = 44\n\nexport type Layout = 'phone' | 'desktop'\n\n/**\n * The layout decision, as a pure function of the measured width — so the rule\n * (\"unmeasured means phone\") is testable without rendering anything.\n */\nexport function layoutFor(width: number, tableMin: number = TABLE_MIN): Layout {\n return width > 0 && width >= tableMin ? 'desktop' : 'phone'\n}\n\nexport interface ContainerLayout {\n /** 'phone' until the box has been measured wide enough for a table. */\n layout: Layout\n /** Shorthand for `layout === 'phone'`. */\n phone: boolean\n /** True once the box is wide enough to sit fixed-size cards side by side. */\n wideEnoughForGrid: boolean\n /** Measured content width in px (0 before the first layout pass). */\n width: number\n /** Spread onto the container element: `<YStack {...layoutProps} />`. */\n onLayout: (e: { nativeEvent: { layout: { width: number } } }) => void\n}\n\n/**\n * Measure the container and derive the layout. Mobile-first: `phone` until proven\n * otherwise. The setter is width-guarded so a layout pass that reports the same\n * width does not re-render.\n */\nexport function useContainerLayout(tableMin: number = TABLE_MIN): ContainerLayout {\n const [width, setWidth] = useState(0)\n\n const onLayout = useCallback((e: { nativeEvent: { layout: { width: number } } }) => {\n const w = Math.round(e?.nativeEvent?.layout?.width ?? 0)\n setWidth((prev) => (w > 0 && w !== prev ? w : prev))\n }, [])\n\n const layout = layoutFor(width, tableMin)\n const phone = layout === 'phone'\n return {\n layout,\n phone,\n wideEnoughForGrid: width >= GRID_MIN,\n width,\n onLayout,\n }\n}\n","'use client'\n\n/**\n * The small shared pieces every DocType view draws with — one definition each, so\n * an action button, an error bar and an inline loader look and behave the same in\n * the browser, the records list, the detail and the builder.\n *\n * MOBILE FIRST is a property of these parts, not of each view: `Action` is the\n * only button the layer uses, and it grows to the 44px tap floor and takes a full\n * row on a phone, so no view has to remember. Colour, type and spacing are token\n * references (`$color10`, `$red7`, `$3`) resolved by the shared @hanzo/ui scale —\n * there is no hex in this layer.\n */\nimport type { ReactElement, ReactNode } from 'react'\nimport { Button, Card, Spinner, Text, XStack, YStack } from '@hanzo/gui'\nimport { TriangleAlert } from '@hanzogui/lucide-icons-2'\n\nimport { PrimaryButton } from '../product/PrimaryButton'\nimport { TAP } from './responsive'\n\nexport interface ActionProps {\n children?: ReactNode\n icon?: ReactElement\n onPress?: () => void\n disabled?: boolean\n /** Filled, high-emphasis (Save / Create / Publish). */\n primary?: boolean\n /** Destructive tint (Delete). */\n danger?: boolean\n /** The container is phone-width: meet the tap floor and fill the row. */\n phone?: boolean\n /** Keep the label off-screen readers only — for icon-only controls. */\n label?: string\n}\n\n/**\n * THE button of this layer. On a phone it is at least `TAP` (44px) tall and\n * stretches to the row, so a thumb hits it and two actions never end up 6px apart;\n * on a wider box it collapses back to the compact `$2` admin control.\n */\nexport function Action({ children, icon, onPress, disabled, primary, danger, phone, label }: ActionProps) {\n const Cmp = primary ? PrimaryButton : Button\n return (\n <Cmp\n size={phone ? '$4' : '$2'}\n minH={phone ? TAP : undefined}\n grow={phone ? 1 : 0}\n flexBasis={phone ? 0 : 'auto'}\n minW={phone ? 140 : undefined}\n icon={icon}\n disabled={disabled}\n onPress={onPress}\n aria-label={label}\n {...(danger ? { theme: 'red' as const } : {})}\n >\n {children}\n </Cmp>\n )\n}\n\n/** A row of `Action`s that wraps rather than clipping its last control. */\nexport function Actions({ children, phone }: { children: ReactNode; phone?: boolean }) {\n return (\n <XStack gap=\"$2\" items=\"center\" flexWrap=\"wrap\" width={phone ? '100%' : undefined}>\n {children}\n </XStack>\n )\n}\n\n/** An honest inline failure — never a fabricated success, never a silent no-op. */\nexport function ErrorBar({ message }: { message: string }) {\n return (\n <Card borderWidth={1} borderColor=\"$red7\" bg=\"$red2\" p=\"$3\" maxW={620}>\n <XStack gap=\"$2\" items=\"flex-start\">\n <TriangleAlert size={15} />\n <Text fontSize=\"$3\" color=\"$red11\" flex={1}>\n {message}\n </Text>\n </XStack>\n </Card>\n )\n}\n\n/** In-flow loader — the DocType views live inside a host shell, so this never\n * takes the viewport (that is the host's own full-screen brand loader). */\nexport function Loading({ label, size = 'small' }: { label?: string; size?: 'small' | 'large' }) {\n return (\n <XStack items=\"center\" justify=\"center\" gap=\"$3\" py=\"$8\">\n <Spinner size={size} />\n {label ? (\n <Text fontSize=\"$3\" color=\"$color11\">\n {label}\n </Text>\n ) : null}\n </XStack>\n )\n}\n\n/** The name 8.0.24 shipped for the same in-flow loader. One component, two spellings. */\nexport function Loader({ label, size }: { label?: string; size?: number }) {\n return <Loading label={label} size={size && size >= 32 ? 'large' : 'small'} />\n}\n\n/** A dimmed metadata line (record count, field count, type). */\nexport function Meta({ children }: { children: ReactNode }) {\n return (\n <Text fontSize=\"$2\" color=\"$color10\" numberOfLines={1}>\n {children}\n </Text>\n )\n}\n\n/**\n * Long values must WRAP, not push the page sideways. A field can hold a URL, a\n * hash, a Lexical blob or a 400-character token with no spaces, and the default\n * `overflow-wrap: normal` refuses to break inside a word — so one such value paints\n * past the right edge of a phone. `html { overflow-x: clip }` then HIDES it rather\n * than scrolling to it, which makes the value unreadable AND invisible to\n * `scrollWidth`. Both properties are inherited, so declaring them on the container\n * covers every value inside it.\n */\nexport const WRAP_ANYWHERE = { overflowWrap: 'anywhere', wordBreak: 'break-word' } as const\n\n/** A titled section wrapper used by the detail + builder panels. */\nexport function Panel({ children, phone }: { children: ReactNode; phone?: boolean }) {\n return (\n <Card\n borderWidth={1}\n borderColor=\"$borderColor\"\n p={phone ? '$3' : '$4'}\n maxW={760}\n width=\"100%\"\n style={WRAP_ANYWHERE}\n >\n <YStack gap=\"$3\">{children}</YStack>\n </Card>\n )\n}\n","'use client'\n\n/**\n * CollectionBuilder — the content-type builder: define a collection's NAME and its\n * typed FIELDS on-page (add / remove / reorder / require / show-in-list), then\n * create it as a framework DocType. Every framework fieldtype is offered (Text,\n * Rich text, Long text, Number, Decimal, Currency, Checkbox, Date, Date & time,\n * Select, Relation, Attachment, Table, JSON), with the extra inputs each type needs\n * (Select options, Relation target). Pure decisions live in `builder-logic.ts`.\n *\n * Used for BOTH \"New collection\" (create) and, on an existing collection, editing\n * its schema — the SAME builder over `client.doctypes.create/update`.\n *\n * MOBILE FIRST: a field row is a name input, a type picker, two switches and three\n * buttons. Side by side that is ~560px of controls, which on a phone either\n * overflows or crushes each control below the tap floor. So a row STACKS into\n * labelled bands on a phone (name · type · flags · move/remove) and collapses back\n * to one line on a wide box. The type picker is the shared `SelectMenu` (the ONE\n * menu system, tokenised, native-safe) rather than a hand-styled `<select>` —\n * which is also how the last hardcoded hex left this layer.\n */\nimport { useCallback, useMemo, useState } from 'react'\nimport { Button, Card, Input, Text, XStack, YStack } from '@hanzo/gui'\nimport { ArrowDown, ArrowUp, GripVertical, Plus, Trash2, TriangleAlert } from '@hanzogui/lucide-icons-2'\n\nimport { FieldSwitch } from '../product/Field'\nimport { SelectMenu } from '../product/SelectMenu'\nimport { classifyBackend } from '../product/BackendState'\nimport type { FrameworkClient } from './client'\nimport type { DocType, Fieldtype } from './types'\nimport {\n BUILDER_FIELD_TYPES,\n blankField,\n fieldNameFromLabel,\n fieldNeedsOptions,\n fieldsFromDocType,\n moveField,\n starterFields,\n toDocType,\n validateBuilder,\n type BuilderField,\n} from './builder-logic'\nimport { Action, Actions, ErrorBar } from './parts'\nimport { useContainerLayout, TAP } from './responsive'\n\nconst TYPE_OPTIONS = BUILDER_FIELD_TYPES.map((t) => ({ key: t.type, label: t.label }))\n\nexport interface CollectionBuilderProps {\n client: FrameworkClient\n module: string\n /** Editing an existing collection's schema (name locked), else creating a new one. */\n existing?: DocType\n /** Called with the saved collection's name after create/update. */\n onSaved: (name: string) => void\n onCancel: () => void\n}\n\nexport function CollectionBuilder({ client, module, existing, onSaved, onCancel }: CollectionBuilderProps) {\n const editing = Boolean(existing)\n const [name, setName] = useState(existing?.name ?? '')\n const [fields, setFields] = useState<BuilderField[]>(() =>\n existing ? fieldsFromDocType(existing) : starterFields(),\n )\n const [busy, setBusy] = useState(false)\n const [saveError, setSaveError] = useState<string | null>(null)\n const [showErrors, setShowErrors] = useState(false)\n const { phone, onLayout } = useContainerLayout()\n\n const validation = useMemo(() => validateBuilder(name, fields), [name, fields])\n\n const patch = useCallback((key: string, next: Partial<BuilderField>) => {\n setFields((fs) => fs.map((f) => (f.key === key ? { ...f, ...next } : f)))\n }, [])\n const addField = useCallback(() => setFields((fs) => [...fs, blankField()]), [])\n const removeField = useCallback((key: string) => setFields((fs) => fs.filter((f) => f.key !== key)), [])\n const move = useCallback((key: string, dir: -1 | 1) => setFields((fs) => moveField(fs, key, dir)), [])\n\n const save = useCallback(async () => {\n setShowErrors(true)\n if (!validation.ok) return\n setBusy(true)\n setSaveError(null)\n try {\n const dt = toDocType(name, module, fields)\n if (editing) await client.doctypes.update(name, dt)\n else await client.doctypes.create(dt)\n onSaved(name)\n } catch (e) {\n setSaveError(classifyBackend(e).message)\n } finally {\n setBusy(false)\n }\n }, [client, editing, fields, module, name, onSaved, validation.ok])\n\n const iconBtn = (icon: React.ReactElement, label: string, onPress: () => void, disabled?: boolean, danger?: boolean) => (\n <Button\n size={phone ? '$3' : '$1'}\n circular\n minW={phone ? TAP : undefined}\n minH={phone ? TAP : undefined}\n aria-label={label}\n icon={icon}\n disabled={disabled}\n onPress={onPress}\n {...(danger ? { theme: 'red' as const } : {})}\n />\n )\n\n return (\n <Card onLayout={onLayout} borderWidth={1} borderColor=\"$borderColor\" p={phone ? '$3' : '$4'} gap=\"$4\" maxW={820} width=\"100%\">\n <YStack gap=\"$2\">\n <Text fontSize=\"$5\" fontWeight=\"800\">\n {editing ? `Edit ${name}` : 'New collection'}\n </Text>\n <Text fontSize=\"$2\" color=\"$color10\">\n A content type on the Hanzo Framework — name it and define its fields. Every field type is available; a\n rich-text field gives a full WYSIWYG body.\n </Text>\n </YStack>\n\n {/* Name — label above the input, so it never competes for the row. */}\n <YStack gap=\"$1.5\" width=\"100%\">\n <Text fontSize=\"$1\" color=\"$color11\" textTransform=\"uppercase\" letterSpacing={0.4}>\n Collection\n </Text>\n <Input\n width=\"100%\"\n minH={phone ? TAP : undefined}\n size={phone ? '$4' : '$3'}\n placeholder=\"e.g. Recipe or LandingPage\"\n value={name}\n onChangeText={setName}\n disabled={busy || editing}\n autoCapitalize=\"none\"\n />\n {editing ? (\n <Text fontSize=\"$1\" color=\"$color9\">\n A collection’s name is its identity and can’t change.\n </Text>\n ) : null}\n </YStack>\n\n {/* Fields */}\n <YStack gap=\"$2\" width=\"100%\">\n <XStack items=\"center\" justify=\"space-between\">\n <Text fontSize=\"$3\" fontWeight=\"700\" color=\"$color11\">\n Fields\n </Text>\n <Text fontSize=\"$1\" color=\"$color9\">\n {fields.length} field{fields.length === 1 ? '' : 's'}\n </Text>\n </XStack>\n\n <YStack gap=\"$2\" width=\"100%\">\n {fields.map((f, i) => {\n const err = showErrors ? validation.fieldErrors[f.key] : undefined\n const fname = f.label.trim() ? fieldNameFromLabel(f.label) : ''\n return (\n <YStack\n key={f.key}\n borderWidth={1}\n borderColor={err ? '$red7' : '$borderColor'}\n rounded=\"$4\"\n p=\"$3\"\n gap=\"$2\"\n bg=\"$color1\"\n width=\"100%\"\n >\n {/* Row 1 — the field's name. Full width on a phone. */}\n <XStack gap=\"$2\" items=\"center\" width=\"100%\">\n {phone ? null : <GripVertical size={15} opacity={0.5} />}\n <Input\n flex={1}\n minW={0}\n minH={phone ? TAP : undefined}\n size={phone ? '$4' : '$3'}\n placeholder=\"Field name (e.g. Title)\"\n value={f.label}\n onChangeText={(v: string) => patch(f.key, { label: v })}\n disabled={busy}\n autoCapitalize=\"none\"\n />\n {phone ? null : (\n <YStack minW={150}>\n <SelectMenu\n required\n ariaLabel=\"Field type\"\n options={TYPE_OPTIONS}\n value={f.type}\n onChange={(v) => v && patch(f.key, { type: v as Fieldtype })}\n disabled={busy}\n minWidth={150}\n />\n </YStack>\n )}\n </XStack>\n\n {/* Row 2 (phone) — the type picker gets its own full-width row. */}\n {phone ? (\n <YStack width=\"100%\">\n <SelectMenu\n required\n ariaLabel=\"Field type\"\n options={TYPE_OPTIONS}\n value={f.type}\n onChange={(v) => v && patch(f.key, { type: v as Fieldtype })}\n disabled={busy}\n minWidth={0}\n minHeight={TAP}\n />\n </YStack>\n ) : null}\n\n {/* Row 3 — flags + move/remove. Wraps; never clips the delete button. */}\n <XStack gap=\"$4\" items=\"center\" justify=\"space-between\" flexWrap=\"wrap\" width=\"100%\">\n <XStack gap=\"$4\" items=\"center\">\n <XStack gap=\"$2\" items=\"center\" minH={phone ? TAP : undefined}>\n <FieldSwitch checked={f.required} onChange={(v) => patch(f.key, { required: v })} disabled={busy} />\n <Text fontSize=\"$2\" color=\"$color10\">\n Required\n </Text>\n </XStack>\n <XStack gap=\"$2\" items=\"center\" minH={phone ? TAP : undefined}>\n <FieldSwitch checked={f.inListView} onChange={(v) => patch(f.key, { inListView: v })} disabled={busy} />\n <Text fontSize=\"$2\" color=\"$color10\">\n In list\n </Text>\n </XStack>\n </XStack>\n <XStack gap=\"$2\">\n {iconBtn(<ArrowUp size={14} />, 'Move field up', () => move(f.key, -1), busy || i === 0)}\n {iconBtn(<ArrowDown size={14} />, 'Move field down', () => move(f.key, 1), busy || i === fields.length - 1)}\n {iconBtn(<Trash2 size={14} />, 'Remove field', () => removeField(f.key), busy, true)}\n </XStack>\n </XStack>\n\n {/* Per-type extra input: Select options / Relation target. */}\n {fieldNeedsOptions(f.type) ? (\n <YStack gap=\"$1.5\" width=\"100%\">\n <Text fontSize=\"$1\" color=\"$color10\" textTransform=\"uppercase\" letterSpacing={0.4}>\n {f.type === 'Select' ? 'Options' : f.type === 'Link' ? 'Relates to' : 'Child type'}\n </Text>\n <Input\n width=\"100%\"\n minH={phone ? TAP : undefined}\n size={phone ? '$4' : '$2'}\n placeholder={\n f.type === 'Select' ? 'One per line — Draft / Published' : 'Collection name (e.g. Author)'\n }\n value={f.options}\n onChangeText={(v: string) => patch(f.key, { options: v })}\n multiline={f.type === 'Select'}\n numberOfLines={f.type === 'Select' ? 3 : 1}\n disabled={busy}\n autoCapitalize=\"none\"\n />\n </YStack>\n ) : null}\n\n <XStack items=\"center\" justify=\"space-between\" gap=\"$2\" flexWrap=\"wrap\">\n {fname ? (\n <Text fontSize=\"$1\" color=\"$color8\">\n field: {fname}\n </Text>\n ) : (\n <YStack />\n )}\n {err ? (\n <XStack gap=\"$1\" items=\"center\">\n <TriangleAlert size={12} />\n <Text fontSize=\"$1\" color=\"$red11\">\n {err}\n </Text>\n </XStack>\n ) : null}\n </XStack>\n </YStack>\n )\n })}\n </YStack>\n\n <XStack width={phone ? '100%' : undefined}>\n <Action phone={phone} icon={<Plus size={14} />} onPress={addField} disabled={busy}>\n Add field\n </Action>\n </XStack>\n </YStack>\n\n {showErrors && validation.formError ? <ErrorBar message={validation.formError} /> : null}\n {saveError ? <ErrorBar message={saveError} /> : null}\n\n <Actions phone={phone}>\n <Action phone={phone} disabled={busy} onPress={onCancel}>\n Cancel\n </Action>\n <Action phone={phone} primary disabled={busy} onPress={save}>\n {busy ? 'Saving…' : editing ? 'Save collection' : 'Create collection'}\n </Action>\n </Actions>\n </Card>\n )\n}\n","'use client'\n\n/**\n * CollectionsBrowser — the app-lane home: the DocTypes of a `module` (a CMS\n * \"collection\", an ERP document type, a Helpdesk ticket type are all just a\n * framework DocType tagged with that lane's module). It lists them, offers a\n * first-run \"Set up\" that installs the lane's fixtures\n * (`POST /v1/framework/modules/:module/install`), and a \"New collection\" that\n * opens the on-page content-type builder.\n *\n * Generic over the lane by construction: `module`, `label` and the first-run copy\n * are props, and where copy is unset it is DERIVED FROM THE LANE rather than\n * borrowed from one — the old default was the CMS's words, so an ERP org read\n * about Pages and Posts. CMS, ERP, Helpdesk and anything later render this same\n * component.\n *\n * Honest by construction — an org with the lane not yet installed sees the setup\n * call to action, never a fabricated collection.\n */\nimport { useCallback, useEffect, useState, type ReactNode } from 'react'\nimport { Text, XStack, YStack } from '@hanzo/gui'\nimport { Boxes, Plus } from '@hanzogui/lucide-icons-2'\n\nimport { PageHeader } from '../product/PageHeader'\nimport { EmptyState } from '../product/EmptyState'\nimport { BackendStateCard, classifyBackend, type BackendState } from '../product/BackendState'\nimport type { IconLike } from '../product/color'\nimport type { FrameworkClient } from './client'\nimport type { DocType } from './types'\nimport { moduleDoctypes } from './fields'\nimport { CollectionBuilder } from './CollectionBuilder'\nimport { Action, ErrorBar, Loading, Meta } from './parts'\nimport { useContainerLayout } from './responsive'\n\nexport interface CollectionsBrowserProps {\n client: FrameworkClient\n /** The app lane: 'cms' | 'erp' | 'help' | 'crm' | … */\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 * First-run (pre-install) copy. The defect this fixes was not \"there is a\n * default\" — it was that the default was ONE LANE'S copy (the CMS's), so an ERP\n * org read about Pages and Posts. Unset now falls back to copy derived from the\n * lane's own `label`, which is true for every lane; a host that has better words\n * passes them.\n */\n setupDescription?: string\n setupBullets?: string[]\n /**\n * Schema AUTHORING injected. The library ships a real `CollectionBuilder`, so a\n * host that omits this still gets one; a host that wants its own (or wants the\n * affordance withheld from a read-only surface) supplies or suppresses it.\n */\n renderBuilder?: (p: { onSaved: (doctype: string) => void; onCancel: () => void }) => ReactNode\n /** Lane icon (defaults to the generic collection glyph). */\n icon?: IconLike\n}\n\ntype LoadState =\n | { phase: 'loading' }\n | { phase: 'error'; error: BackendState }\n | { phase: 'ready'; collections: DocType[]; registered: boolean }\n\nexport function CollectionsBrowser({\n client,\n module,\n label,\n subtitle,\n onOpen,\n setupDescription,\n setupBullets,\n renderBuilder,\n icon = Boxes,\n}: 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 const { phone, onLayout } = useContainerLayout()\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), // lane may not be registered on an older engine\n ])\n if (signal.cancelled) return\n setState({\n phase: 'ready',\n collections: moduleDoctypes(dts, module),\n registered: Boolean(mod && mod.doctypes.length),\n })\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 () => {\n signal.cancelled = true\n }\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') {\n return (\n <YStack onLayout={onLayout} width=\"100%\">\n <Loading label={`Loading ${label}…`} />\n </YStack>\n )\n }\n\n if (state.phase === 'error') {\n return (\n <YStack onLayout={onLayout} gap=\"$3\" width=\"100%\">\n <PageHeader title={label} subtitle={subtitle} />\n <BackendStateCard state={state.error} onRetry={reload} hint=\"framework · GET /v1/framework/doctypes\" />\n </YStack>\n )\n }\n\n const { collections } = state\n return (\n <YStack onLayout={onLayout} gap=\"$3\" width=\"100%\">\n <PageHeader\n title={label}\n subtitle={subtitle}\n actions={\n collections.length && !creating ? (\n <Action\n phone={phone}\n primary\n icon={<Plus size={15} />}\n onPress={() => {\n setCreating(true)\n setActionError(null)\n }}\n >\n New collection\n </Action>\n ) : undefined\n }\n />\n\n {actionError ? <ErrorBar message={actionError} /> : null}\n\n {creating ? (\n (renderBuilder ?? ((p) => <CollectionBuilder client={client} module={module} {...p} />))({\n onSaved: (name: string) => {\n setCreating(false)\n onOpen(name)\n },\n onCancel: () => setCreating(false),\n })\n ) : null}\n\n {collections.length === 0 && !creating ? (\n <EmptyState\n icon={icon}\n title={`Set up ${label}`}\n description={\n setupDescription ??\n `${label} is a set of collections on the Hanzo Framework — typed documents, per organization.`\n }\n bullets={\n setupBullets ?? [\n `Installs the default ${label} collections into your organization`,\n 'Every record is a document on the framework — versioned, permissioned, per-org',\n 'Add your own collections and fields any time',\n ]\n }\n primary={state.registered ? { label: busy ? 'Setting up…' : `Set up ${label}`, onPress: install } : undefined}\n secondary={{ label: 'New collection', onPress: () => setCreating(true) }}\n />\n ) : !creating ? (\n // A fixed 240px card is a 240px column on a 390px phone with dead space\n // beside it. `flexBasis` + `flexGrow` makes each card fill the row on a\n // phone and settle back to a 240px tile once the box can hold several.\n <XStack gap=\"$3\" flexWrap=\"wrap\" width=\"100%\">\n {collections.map((dt) => (\n <YStack\n key={dt.name}\n onPress={() => onOpen(dt.name)}\n hoverStyle={{ borderColor: '$color8' }}\n pressStyle={{ bg: '$color3' }}\n cursor=\"pointer\"\n borderWidth={1}\n borderColor=\"$borderColor\"\n rounded=\"$4\"\n p=\"$4\"\n gap=\"$2\"\n minH={88}\n grow={phone ? 1 : 0}\n flexBasis={phone ? '100%' : 240}\n maxW={phone ? undefined : 240}\n >\n <XStack gap=\"$2\" items=\"center\">\n <Boxes size={16} />\n <Text fontSize=\"$4\" fontWeight=\"700\" flex={1} minW={0} numberOfLines={1}>\n {dt.name}\n </Text>\n </XStack>\n <Meta>\n {dt.fields?.length ?? 0} field{(dt.fields?.length ?? 0) === 1 ? '' : 's'}\n {dt.isSubmittable ? ' · submittable' : ''}\n </Meta>\n </YStack>\n ))}\n </XStack>\n ) : null}\n </YStack>\n )\n}\n","'use client'\n\n/**\n * MediaGrid — the DAM (media library) for a media DocType (an Attach-backed\n * collection). A REAL asset manager: drag/drop or pick files → they upload through\n * the injected `MediaUploader` (the host's own per-org object store) → a document\n * is created from the DocType's OWN schema → the grid shows a live thumbnail\n * (presigned on view, since object URLs are short-lived). Delete removes the\n * document AND the object.\n *\n * The document body is `mediaDocPayload(dt, facts)` — metadata-driven. This used\n * to write a hardcoded `{title, file, mime, size, width, height}`, which is the\n * CMS Media fixture's schema: a lane whose media type labels its rows `caption`\n * got untitled rows, silently, because the engine drops unknown keys. Now the\n * filename lands on the DocType's declared title field and each fact is written\n * only if that DocType has somewhere to put it.\n *\n * MOBILE FIRST: tiles are flex-basis, not a fixed 200px — two-up on a phone,\n * filling whatever the box gives on a desktop. The upload control is a full-width\n * tap target on a phone, and the per-tile delete is a 44px control rather than a\n * 13px glyph.\n *\n * Web-first by nature (file picker + drag/drop + `<img>` thumbnails), like the\n * other file-touching components in this layer.\n */\nimport { useCallback, useEffect, useRef, useState, type ReactNode } from 'react'\nimport { Button, Card, Text, XStack, YStack } from '@hanzo/gui'\nimport { Image as ImageIcon, Trash2, Upload } from '@hanzogui/lucide-icons-2'\n\nimport { EmptyState } from '../product/EmptyState'\nimport { classifyBackend } from '../product/BackendState'\nimport type { FrameworkClient } from './client'\nimport type { DocType, FrameworkDoc } from './types'\nimport { mediaDocPayload, mediaFileField, titleOf } from './fields'\nimport { looksLikeImage, type MediaUploader } from './media'\nimport { Action, ErrorBar, Meta } from './parts'\nimport { useContainerLayout, TAP } from './responsive'\n\nexport interface MediaGridProps {\n client: FrameworkClient\n dt: DocType\n docs: FrameworkDoc[]\n /** The host's object store, bound to this lane's bucket. */\n media: MediaUploader\n /** Open a media document's detail (edit alt text, replace, etc.). */\n onOpen: (name: string) => void\n /** Re-fetch the media list after an upload/delete. */\n onChanged: () => void\n toolbarExtra?: ReactNode\n /** Accepted file types for the picker. */\n accept?: string\n}\n\nexport function MediaGrid({\n client,\n dt,\n docs,\n media,\n onOpen,\n onChanged,\n toolbarExtra,\n accept = 'image/*,application/pdf,video/*,audio/*',\n}: MediaGridProps) {\n const fileField = mediaFileField(dt)\n const inputRef = useRef<HTMLInputElement | null>(null)\n const [busy, setBusy] = useState(false)\n const [progress, setProgress] = useState<{ done: number; total: number } | null>(null)\n const [error, setError] = useState<string | null>(null)\n const { phone, onLayout } = useContainerLayout()\n\n const upload = useCallback(\n async (files: FileList | File[]) => {\n const list = Array.from(files)\n if (list.length === 0) return\n setBusy(true)\n setError(null)\n setProgress({ done: 0, total: list.length })\n try {\n for (let i = 0; i < list.length; i += 1) {\n const facts = await media.upload(list[i])\n await client.records.create(dt.name, mediaDocPayload(dt, facts))\n setProgress({ done: i + 1, total: list.length })\n }\n onChanged()\n } catch (e) {\n setError(classifyBackend(e).message)\n } finally {\n setBusy(false)\n setProgress(null)\n }\n },\n [client, dt, media, onChanged],\n )\n\n const pick = () => inputRef.current?.click()\n const onInput = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files) void upload(e.target.files)\n e.target.value = '' // allow re-selecting the same file\n }\n\n const HiddenInput = (\n <input ref={inputRef} type=\"file\" multiple accept={accept} style={{ display: 'none' }} onChange={onInput} />\n )\n\n const uploadLabel = busy ? (progress ? `Uploading ${progress.done}/${progress.total}…` : 'Uploading…') : 'Upload'\n\n if (docs.length === 0) {\n return (\n <YStack onLayout={onLayout} gap=\"$3\" width=\"100%\">\n {HiddenInput}\n {toolbarExtra ? (\n <XStack justify={phone ? 'flex-start' : 'flex-end'} gap=\"$2\" width=\"100%\">\n {toolbarExtra}\n </XStack>\n ) : null}\n {error ? <ErrorBar message={error} /> : null}\n <DropZone busy={busy} onDrop={upload}>\n <EmptyState\n icon={ImageIcon}\n title=\"No media yet\"\n description=\"Drag files here, or upload — images and files go to your organization's object storage and become reusable media you can attach to any record.\"\n primary={{ label: uploadLabel, onPress: pick }}\n />\n </DropZone>\n </YStack>\n )\n }\n\n return (\n <YStack onLayout={onLayout} gap=\"$3\" width=\"100%\">\n {HiddenInput}\n <XStack gap=\"$2\" items=\"center\" flexWrap=\"wrap\" justify={phone ? 'flex-start' : 'flex-end'} width=\"100%\">\n {toolbarExtra}\n <Action phone={phone} primary icon={<Upload size={15} />} disabled={busy} onPress={pick}>\n {uploadLabel}\n </Action>\n </XStack>\n {error ? <ErrorBar message={error} /> : null}\n <DropZone busy={busy} onDrop={upload}>\n <XStack gap=\"$3\" flexWrap=\"wrap\" width=\"100%\">\n {docs.map((d) => (\n <MediaCard\n key={String(d.name)}\n doc={d}\n dt={dt}\n fileField={fileField}\n media={media}\n phone={phone}\n onOpen={() => onOpen(String(d.name))}\n onDelete={async () => {\n setBusy(true)\n setError(null)\n try {\n await media.remove(d[fileField])\n await client.records.remove(dt.name, String(d.name))\n onChanged()\n } catch (e) {\n setError(classifyBackend(e).message)\n } finally {\n setBusy(false)\n }\n }}\n disabled={busy}\n />\n ))}\n </XStack>\n </DropZone>\n </YStack>\n )\n}\n\n/** One asset card — presigned thumbnail, title, type, and a delete affordance. */\nfunction MediaCard({\n doc,\n dt,\n fileField,\n media,\n phone,\n onOpen,\n onDelete,\n disabled,\n}: {\n doc: FrameworkDoc\n dt: DocType\n fileField: string\n media: MediaUploader\n phone: boolean\n onOpen: () => void\n onDelete: () => void | Promise<void>\n disabled?: boolean\n}) {\n const [url, setUrl] = useState('')\n const [confirming, setConfirming] = useState(false)\n const raw = String(doc[fileField] ?? '')\n const title = titleOf(doc, dt)\n\n useEffect(() => {\n let cancelled = false\n void media.resolveUrl(raw).then((u) => {\n if (!cancelled) setUrl(u)\n })\n return () => {\n cancelled = true\n }\n }, [raw, media])\n\n return (\n <YStack\n borderWidth={1}\n borderColor=\"$borderColor\"\n rounded=\"$4\"\n // Two-up on a phone, a 200px tile once there is room — never a fixed column\n // with dead space beside it.\n grow={0}\n flexBasis={phone ? '47%' : 200}\n maxW={phone ? undefined : 200}\n minW={140}\n overflow=\"hidden\"\n hoverStyle={{ borderColor: '$color8' }}\n >\n <YStack\n height={phone ? 110 : 130}\n bg=\"$color3\"\n items=\"center\"\n justify=\"center\"\n overflow=\"hidden\"\n cursor=\"pointer\"\n pressStyle={{ opacity: 0.8 }}\n onPress={onOpen}\n >\n {url && (looksLikeImage(raw) || looksLikeImage(url)) ? (\n // eslint-disable-next-line @next/next/no-img-element\n <img src={url} alt={String(doc.alt ?? title)} style={{ width: '100%', height: '100%', objectFit: 'cover' }} />\n ) : (\n <ImageIcon size={28} />\n )}\n </YStack>\n <YStack p=\"$3\" gap=\"$1\">\n <Text fontSize=\"$3\" fontWeight=\"700\" numberOfLines={1}>\n {title}\n </Text>\n <XStack justify=\"space-between\" items=\"center\" gap=\"$2\">\n <Meta>{String(doc.mime ?? 'file')}</Meta>\n {confirming ? (\n <XStack gap=\"$1\">\n <Button\n size={phone ? '$3' : '$1'}\n minH={phone ? TAP : undefined}\n theme=\"red\"\n disabled={disabled}\n onPress={() => {\n setConfirming(false)\n void onDelete()\n }}\n >\n Delete\n </Button>\n <Button size={phone ? '$3' : '$1'} minH={phone ? TAP : undefined} disabled={disabled} onPress={() => setConfirming(false)}>\n No\n </Button>\n </XStack>\n ) : (\n <Button\n size={phone ? '$3' : '$1'}\n circular\n chromeless\n minW={phone ? TAP : undefined}\n minH={phone ? TAP : undefined}\n aria-label={`Delete ${title}`}\n icon={<Trash2 size={phone ? 16 : 13} />}\n disabled={disabled}\n onPress={() => setConfirming(true)}\n />\n )}\n </XStack>\n </YStack>\n </YStack>\n )\n}\n\n/** A drag-and-drop wrapper that highlights on drag-over and uploads on drop. */\nfunction DropZone({\n children,\n busy,\n onDrop,\n}: {\n children: ReactNode\n busy?: boolean\n onDrop: (files: FileList) => void | Promise<void>\n}) {\n const [over, setOver] = useState(false)\n return (\n <YStack\n width=\"100%\"\n onDragOver={(e: React.DragEvent) => {\n e.preventDefault()\n if (!busy) setOver(true)\n }}\n onDragLeave={() => setOver(false)}\n onDrop={(e: React.DragEvent) => {\n e.preventDefault()\n setOver(false)\n if (!busy && e.dataTransfer?.files?.length) void onDrop(e.dataTransfer.files)\n }}\n rounded=\"$4\"\n p={over ? '$3' : 0}\n borderWidth={over ? 2 : 0}\n borderColor=\"$color8\"\n style={{ borderStyle: 'dashed' }}\n >\n {children}\n </YStack>\n )\n}\n","'use client'\n\n/**\n * RecordCards — the PHONE view of a DocType's documents: one stacked card per\n * record instead of a horizontally-scrolling grid.\n *\n * A 12-column ERP Sales Order in a table on a 390px screen is a wall you drag\n * sideways to read one row; the same record as a card is a title plus its declared\n * list columns as label → value pairs, reading top to bottom in the width you\n * have. Nothing is hidden that the table would have shown — the card renders the\n * DocType's OWN `inListView` projection (`cardFields`), and the full record is one\n * tap away.\n *\n * The whole card is the tap target (far past the 44px floor), values render\n * through the SAME `FieldDisplay` router the table uses, so every field type\n * behaves identically in both, and search is the pure `searchRecords` — no second\n * filtering model.\n */\nimport { useMemo, useState, type ReactNode } from 'react'\nimport { Card, Input, Text, XStack, YStack } from '@hanzo/gui'\nimport { ChevronRight, Search } from '@hanzogui/lucide-icons-2'\nimport { FieldDisplay, searchRecords, type FieldDefinition } from '@hanzo/data'\n\nimport { Action, Loading, Meta, WRAP_ANYWHERE } from './parts'\n\nexport interface RecordCardsProps {\n /** The field shown as the card's headline (the DocType's titleField). */\n titleField?: string\n /** All fields (used for search); `cardFields` decides what a card shows. */\n fields: FieldDefinition[]\n /** The subset rendered as label → value rows on each card. */\n cardFields: FieldDefinition[]\n records: Record<string, unknown>[]\n loading?: boolean\n empty?: ReactNode\n onOpen?: (record: Record<string, unknown>) => void\n onCreate?: () => void\n createLabel?: string\n /** Extra toolbar control (e.g. Refresh). */\n toolbarExtra?: ReactNode\n}\n\n/** The headline for a card: the title field, else the record key. */\nfunction headline(record: Record<string, unknown>, titleField?: string): string {\n const t = titleField ? record[titleField] : undefined\n if (typeof t === 'string' && t.trim()) return t\n if (typeof t === 'number') return String(t)\n const name = record.name ?? record.id\n return typeof name === 'string' && name ? name : 'Untitled'\n}\n\nexport function RecordCards({\n titleField,\n fields,\n cardFields,\n records,\n loading,\n empty,\n onOpen,\n onCreate,\n createLabel = 'New record',\n toolbarExtra,\n}: RecordCardsProps) {\n const [query, setQuery] = useState('')\n const visible = useMemo(() => searchRecords(records, query, fields), [records, query, fields])\n\n return (\n <YStack testID=\"doctype-cards\" gap=\"$3\" width=\"100%\">\n {/* Toolbar: search takes the full row on a phone; the create action sits\n below it at full width, so both are thumb-reachable and neither clips. */}\n <YStack gap=\"$2\" width=\"100%\">\n <XStack\n items=\"center\"\n gap=\"$2\"\n px=\"$3\"\n minH={44}\n rounded=\"$3\"\n borderWidth={1}\n borderColor=\"$borderColor\"\n width=\"100%\"\n >\n <Search size={15} opacity={0.6} />\n <Input\n unstyled\n flex={1}\n minW={0}\n height={42}\n fontSize=\"$3\"\n color=\"$color12\"\n placeholder=\"Search\"\n value={query}\n onChangeText={setQuery}\n autoCapitalize=\"none\"\n />\n </XStack>\n <XStack gap=\"$2\" items=\"center\" flexWrap=\"wrap\" width=\"100%\">\n {onCreate ? (\n <Action phone primary onPress={onCreate}>\n {createLabel}\n </Action>\n ) : null}\n {toolbarExtra}\n </XStack>\n </YStack>\n\n {loading ? <Loading label=\"Loading records…\" /> : null}\n\n {!loading && visible.length === 0 ? (\n <Card borderWidth={1} borderColor=\"$borderColor\" p=\"$4\" width=\"100%\">\n <Text fontSize=\"$3\" color=\"$color10\">\n {query ? `No records match “${query}”.` : empty ?? 'No records yet.'}\n </Text>\n </Card>\n ) : null}\n\n <YStack gap=\"$2\" width=\"100%\">\n {visible.map((rec, i) => {\n const key = String(rec.name ?? rec.id ?? i)\n return (\n <Card\n key={key}\n borderWidth={1}\n borderColor=\"$borderColor\"\n rounded=\"$3\"\n p=\"$3\"\n width=\"100%\"\n cursor={onOpen ? 'pointer' : undefined}\n pressStyle={onOpen ? { bg: '$color3' } : undefined}\n hoverStyle={onOpen ? { borderColor: '$color8' } : undefined}\n onPress={onOpen ? () => onOpen(rec) : undefined}\n style={WRAP_ANYWHERE}\n >\n <YStack gap=\"$2\" width=\"100%\">\n <XStack items=\"center\" gap=\"$2\" width=\"100%\">\n <Text fontSize=\"$4\" fontWeight=\"700\" flex={1} minW={0} numberOfLines={2}>\n {headline(rec, titleField)}\n </Text>\n {onOpen ? <ChevronRight size={16} opacity={0.5} /> : null}\n </XStack>\n\n {cardFields.map((f) => (\n // Label above value: a two-column row forces the value into a\n // sliver at 390px. Stacked, every field type gets the full width.\n <YStack key={f.name} gap=\"$0.5\" width=\"100%\">\n <Text fontSize=\"$1\" color=\"$color10\" textTransform=\"uppercase\" letterSpacing={0.4}>\n {f.label}\n </Text>\n <XStack width=\"100%\" flexWrap=\"wrap\">\n <FieldDisplay field={f} value={rec[f.name]} />\n </XStack>\n </YStack>\n ))}\n </YStack>\n </Card>\n )\n })}\n </YStack>\n\n {visible.length ? (\n <Meta>\n {visible.length} of {records.length} record{records.length === 1 ? '' : 's'}\n </Meta>\n ) : null}\n </YStack>\n )\n}\n","'use client'\n\n/**\n * DocTypeRecords — the documents surface for ONE framework DocType, driven\n * 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 them in the shape the CONTAINER can actually\n * hold. Every field type shows the right Display/Input with ZERO per-doctype code,\n * so a CMS Page, an ERP Invoice, or a Helpdesk Ticket all render here.\n *\n * MOBILE FIRST — the layout is a decision, not a media query afterthought:\n * · phone → `RecordCards`, a stacked card per record. A table of 12 columns on\n * a 390px screen is a sideways drag; a card is a read.\n * · desktop → @hanzo/data's `RecordsView` (table ⇆ board, filter/sort/group,\n * inline cell editing).\n * The first paint is ALWAYS the card list (see `responsive.ts`), and the table is\n * the enhancement applied once the box measures wide enough.\n *\n * The table also finally honors the DocType's OWN column projection\n * (`listHiddenFields` → `inListView`): a Sales Order that declares 4 list columns\n * out of 12 fields now renders 4. That projection was implemented and tested but\n * never passed to a view — which is exactly why the grid was unusable narrow.\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, YStack } from '@hanzo/gui'\nimport { RefreshCw } from '@hanzogui/lucide-icons-2'\nimport { RecordsView, type FieldDefinition, type SelectOption, type ViewConfig } from '@hanzo/data'\n\nimport { BackendStateCard, classifyBackend, type BackendState } from '../product/BackendState'\nimport type { FrameworkClient } from './client'\nimport type { DocType, FrameworkDoc } from './types'\nimport {\n cardFields as pickCardFields,\n docTypeToFields,\n enrichLinks,\n hasProjectField,\n isMediaDoctype,\n listHiddenFields,\n PROJECT_FIELD,\n savePayload,\n toRecord,\n} from './fields'\nimport { loadLinkOptions, makeFieldOptions } from './data'\nimport { MediaGrid } from './MediaGrid'\nimport { RecordCards } from './RecordCards'\nimport { Action, ErrorBar } from './parts'\nimport { useContainerLayout, TAP } from './responsive'\nimport type { MediaUploader } from './media'\n\ntype LoadState =\n | { phase: 'loading' }\n | { phase: 'error'; error: BackendState }\n | {\n phase: 'ready'\n dt: DocType\n fields: FieldDefinition[]\n docs: FrameworkDoc[]\n records: Record<string, unknown>[]\n linkOptions: Record<string, SelectOption[]>\n }\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 * Object storage for a media/asset collection. Without it a media DocType still\n * renders as records (honest) — the DAM gallery needs a real place to put bytes,\n * and this layer refuses to invent one.\n */\n media?: MediaUploader\n /**\n * A host that would rather draw the asset gallery itself supplies this; it wins\n * over the built-in `MediaGrid`. Both paths need somewhere real to put bytes, so\n * a host with neither gets the honest generic table — nothing is faked.\n */\n renderMedia?: (p: {\n dt: DocType\n docs: FrameworkDoc[]\n onOpen: (name: string) => void\n onChanged: () => void\n toolbarExtra: ReactNode\n }) => ReactNode\n /** How many documents to fetch (the engine caps its own page). */\n limit?: number\n}\n\nexport function DocTypeRecords({\n client,\n doctype,\n onOpen,\n onCreate,\n project,\n title,\n media,\n renderMedia,\n limit = 200,\n}: DocTypeRecordsProps) {\n const [state, setState] = useState<LoadState>({ phase: 'loading' })\n const [mutationError, setMutationError] = useState<string | null>(null)\n const { phone, onLayout } = useContainerLayout()\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, ...(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, limit],\n )\n\n useEffect(() => {\n const signal = { cancelled: false }\n void load(signal)\n return () => {\n signal.cancelled = true\n }\n }, [load])\n\n const reload = useCallback(() => void load({ cancelled: false }), [load])\n\n const ready = state.phase === 'ready' ? state : undefined\n\n const fieldOptions = useMemo(\n () => (ready ? makeFieldOptions(ready.linkOptions) : undefined),\n [ready],\n )\n\n /**\n * The table view starts from the DocType's own column projection. Controlled,\n * because a host that later persists saved views hands one in — but the DEFAULT\n * is the schema's answer, not \"every field\".\n */\n const [view, setView] = useState<ViewConfig | undefined>(undefined)\n const dtName = ready?.dt.name\n useEffect(() => {\n if (!ready) return\n setView({\n id: `doctype:${ready.dt.name}`,\n name: ready.dt.name,\n kind: 'table',\n filters: [],\n sorts: [],\n hiddenFields: listHiddenFields(ready.dt),\n })\n // Re-seed only when the DocType changes; user edits to the view persist.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dtName])\n\n const cards = useMemo(\n () => (ready ? pickCardFields(ready.dt, ready.fields) : []),\n [ready],\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 (\n <YStack onLayout={onLayout} width=\"100%\">\n <BackendStateCard state={state.error} onRetry={reload} hint={`framework · GET /v1/framework/${doctype}`} />\n </YStack>\n )\n }\n\n const refresh = phone ? (\n <Action phone icon={<RefreshCw size={15} />} onPress={reload}>\n Refresh\n </Action>\n ) : (\n <Button size=\"$2\" minH={TAP - 12} icon={<RefreshCw size={15} />} onPress={reload}>\n Refresh\n </Button>\n )\n\n // A media/asset library (a required Attach) gets the DAM gallery instead of the\n // record views — real upload to the host's object storage + presigned thumbnails.\n if (ready && (media || renderMedia) && isMediaDoctype(ready.dt)) {\n return (\n <YStack onLayout={onLayout} width=\"100%\">\n {renderMedia ? (\n renderMedia({ dt: ready.dt, docs: ready.docs, onOpen, onChanged: reload, toolbarExtra: refresh })\n ) : (\n <MediaGrid\n client={client}\n dt={ready.dt}\n docs={ready.docs}\n media={media!}\n onOpen={onOpen}\n onChanged={reload}\n toolbarExtra={refresh}\n />\n )}\n </YStack>\n )\n }\n\n const openByKey = (r: Record<string, unknown>) =>\n onOpen(String((r as { name?: unknown }).name ?? (r as { id?: unknown }).id ?? ''))\n\n return (\n <YStack onLayout={onLayout} gap=\"$3\" width=\"100%\">\n {mutationError ? <ErrorBar message={mutationError} /> : null}\n\n {phone ? (\n <RecordCards\n titleField={ready?.dt.titleField}\n fields={ready?.fields ?? []}\n cardFields={cards}\n records={ready?.records ?? []}\n loading={state.phase === 'loading'}\n empty={`No records in ${doctype} yet.`}\n onOpen={openByKey}\n onCreate={onCreate}\n toolbarExtra={refresh}\n />\n ) : (\n <YStack testID=\"doctype-table\" width=\"100%\">\n <RecordsView\n title={title}\n fields={ready?.fields ?? []}\n records={ready?.records ?? []}\n loading={state.phase === 'loading'}\n view={view}\n onViewChange={setView}\n onOpen={openByKey}\n onCreate={onCreate}\n createLabel=\"New record\"\n onEditCommit={onEditCommit}\n fieldOptions={fieldOptions}\n toolbarExtra={refresh}\n titleField={ready?.dt.titleField}\n empty={`No records in ${doctype} yet.`}\n />\n </YStack>\n )}\n </YStack>\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 * ONLY OFFERS WHAT THE ENGINE ALLOWS. `ops.go` refuses to edit a non-draft\n * (\"document is not a draft (docstatus %d); cannot edit\") and refuses to delete a\n * submitted document (\"must be cancelled before deletion\") — so Edit and Delete\n * are gated on `isDraft`. A user filling in a whole form on a submitted invoice\n * and getting an error card on Save is a bug, not a validation.\n *\n * MOBILE FIRST: the label-above-value form (@hanzo/data's `RecordForm`) already\n * reads top-to-bottom at any width; what did not fit was the header — a back\n * button, a title and up to five actions on one line. On a phone the actions take\n * their own full-width wrapping row at the 44px tap floor.\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 { Card, Text, XStack, YStack } from '@hanzo/gui'\nimport { ArrowLeft, Ban, Globe, Pencil, PenOff, Save, Send, Trash2, X } from '@hanzogui/lucide-icons-2'\nimport { RecordDetail, RecordForm, type FieldDefinition, type SelectOption } from '@hanzo/data'\n\nimport { BackendStateCard, classifyBackend, type BackendState } from '../product/BackendState'\nimport type { FrameworkClient } from './client'\nimport type { DocType, FrameworkDoc } from './types'\nimport { CANCELLED, SUBMITTED } from './types'\nimport {\n docTypeToFields,\n enrichLinks,\n hasProjectField,\n isDraft,\n newDraft,\n PROJECT_FIELD,\n savePayload,\n statusField,\n titleOf,\n toRecord,\n} from './fields'\nimport { loadLinkOptions, makeFieldOptions } from './data'\nimport { Action, Actions, ErrorBar, Loading, Panel } from './parts'\nimport { useContainerLayout } from './responsive'\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 const { phone, onLayout } = useContainerLayout()\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 () => {\n signal.cancelled = true\n }\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(() => (dt ? docTypeToFields(dt, { editing: !isNew }) : []), [dt, isNew])\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). */\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 <Action phone={phone} icon={<ArrowLeft size={15} />} onPress={onBack}>\n Back\n </Action>\n )\n\n if (state.phase === 'loading') {\n return (\n <YStack onLayout={onLayout} width=\"100%\">\n <Loading label={`Loading ${doctype}…`} />\n </YStack>\n )\n }\n if (state.phase === 'error') {\n return (\n <YStack onLayout={onLayout} gap=\"$3\" width=\"100%\">\n <XStack>{backButton}</XStack>\n <BackendStateCard state={state.error} onRetry={reload} hint={`framework · ${doctype}/${name}`} />\n </YStack>\n )\n }\n if (!dt) {\n return (\n <YStack onLayout={onLayout} gap=\"$3\" width=\"100%\">\n <XStack>{backButton}</XStack>\n </YStack>\n )\n }\n\n // What the engine will actually accept, asked once. A submitted document is\n // immutable until cancelled; a cancelled one is a tombstone.\n const draftDoc = isDraft(record)\n const statusF = statusField(dt)\n const status = record ? String(record[statusF] ?? '') : ''\n const docstatus = record ? Number(record.docstatus ?? 0) : 0\n const canEdit = !editing && !isNew && draftDoc\n const canDelete = !editing && !isNew && draftDoc\n const canPublish = canEdit && Boolean(statusF)\n const canSubmit = !editing && !isNew && Boolean(dt.isSubmittable) && draftDoc\n const canCancel = !editing && !isNew && Boolean(dt.isSubmittable) && docstatus === SUBMITTED\n\n const lifecycle =\n docstatus === SUBMITTED ? ' · submitted' : docstatus === CANCELLED ? ' · cancelled' : ''\n\n return (\n <YStack onLayout={onLayout} gap=\"$3\" width=\"100%\">\n {/* Header. On a phone the title owns its row and the actions wrap onto their\n own full-width row below — nothing is pushed off-screen. */}\n <YStack gap=\"$3\" width=\"100%\">\n <XStack items=\"center\" gap=\"$3\" width=\"100%\" flexWrap=\"wrap\">\n {phone ? null : backButton}\n <YStack flex={1} minW={200}>\n <Text fontSize=\"$6\" fontWeight=\"800\" numberOfLines={2}>\n {title}\n </Text>\n <Text fontSize=\"$2\" color=\"$color10\" numberOfLines={1}>\n {doctype}\n {status ? ` · ${status}` : ''}\n {lifecycle}\n </Text>\n </YStack>\n </XStack>\n\n <Actions phone={phone}>\n {phone ? backButton : null}\n {editing ? (\n <>\n {!isNew ? (\n <Action\n phone={phone}\n icon={<X size={15} />}\n disabled={busy}\n onPress={() => {\n setDraft(record ? { ...record } : {})\n setEditing(false)\n setSaveError(null)\n }}\n >\n Cancel\n </Action>\n ) : null}\n <Action phone={phone} primary icon={<Save size={15} />} disabled={busy} onPress={save}>\n {busy ? 'Saving…' : isNew ? 'Create' : 'Save'}\n </Action>\n </>\n ) : (\n <>\n {canDelete ? (\n <Action phone={phone} danger icon={<Trash2 size={15} />} disabled={busy} onPress={() => setConfirmingDelete(true)}>\n Delete\n </Action>\n ) : null}\n {canCancel ? (\n <Action\n phone={phone}\n icon={<Ban size={15} />}\n disabled={busy}\n onPress={() => run(() => client.records.cancel(doctype, String(record!.name)))}\n >\n Cancel doc\n </Action>\n ) : null}\n {canSubmit ? (\n <Action\n phone={phone}\n icon={<Send size={15} />}\n disabled={busy}\n onPress={() => run(() => client.records.submit(doctype, String(record!.name)))}\n >\n Submit\n </Action>\n ) : null}\n {canPublish ? (\n status === 'Published' ? (\n <Action\n phone={phone}\n icon={<PenOff size={15} />}\n disabled={busy}\n onPress={() =>\n run(async () =>\n client.records.update(doctype, String(record!.name), savePayload({ ...record, [statusF]: 'Draft' }, dt)),\n )\n }\n >\n Unpublish\n </Action>\n ) : (\n <Action\n phone={phone}\n primary\n icon={<Globe size={15} />}\n disabled={busy}\n onPress={() =>\n run(async () =>\n client.records.update(\n doctype,\n String(record!.name),\n savePayload({ ...record, [statusF]: 'Published' }, dt),\n ),\n )\n }\n >\n Publish\n </Action>\n )\n ) : null}\n {canEdit ? (\n <Action phone={phone} primary icon={<Pencil size={15} />} onPress={() => setEditing(true)}>\n Edit\n </Action>\n ) : null}\n </>\n )}\n </Actions>\n </YStack>\n\n {/* Say WHY the actions are gone, rather than silently offering nothing. */}\n {!editing && !isNew && !draftDoc ? (\n <Card borderWidth={1} borderColor=\"$borderColor\" bg=\"$color2\" p=\"$3\" maxW={620}>\n <Text fontSize=\"$2\" color=\"$color11\">\n {docstatus === SUBMITTED\n ? 'This document is submitted. Cancel it to make further changes — the engine refuses edits and deletes on a submitted document.'\n : 'This document is cancelled. It is kept as a record and can no longer be edited or deleted.'}\n </Text>\n </Card>\n ) : null}\n\n {confirmingDelete ? (\n <Card borderWidth={1} borderColor=\"$red7\" bg=\"$red2\" p=\"$3\" gap=\"$3\" maxW={620}>\n <Text fontSize=\"$3\" fontWeight=\"700\">\n Delete “{title}”? This cannot be undone.\n </Text>\n <Actions phone={phone}>\n <Action phone={phone} danger disabled={busy} onPress={remove}>\n {busy ? 'Deleting…' : 'Confirm delete'}\n </Action>\n <Action phone={phone} disabled={busy} onPress={() => setConfirmingDelete(false)}>\n Keep\n </Action>\n </Actions>\n </Card>\n ) : null}\n\n {saveError ? <ErrorBar message={saveError} /> : null}\n\n <Panel phone={phone}>\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 </Panel>\n </YStack>\n )\n}\n"]}
|
|
@@ -1,23 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
|
|
10
|
-
* Three seams keep it host-agnostic:
|
|
11
|
-
* • `Transport` — how a host reaches /v1/framework (BFF proxy vs IAM bearer).
|
|
12
|
-
* • `renderBuilder` — schema AUTHORING, which only an admin surface offers.
|
|
13
|
-
* • `renderMedia` — an asset gallery, which needs the host's object store.
|
|
14
|
-
* Anything a host does not supply is simply not offered; nothing is faked.
|
|
15
|
-
*/
|
|
16
|
-
export * from './types';
|
|
17
|
-
export * from './fields';
|
|
18
|
-
export * from './client';
|
|
19
|
-
export * from './data';
|
|
20
|
-
export { Loader } from './Loader';
|
|
21
|
-
export { CollectionsBrowser, type CollectionsBrowserProps } from './CollectionsBrowser';
|
|
22
|
-
export { DocTypeRecords, type DocTypeRecordsProps } from './DocTypeRecords';
|
|
23
|
-
export { DocTypeDetail, type DocTypeDetailProps } from './DocTypeDetail';
|
|
1
|
+
export * from './core';
|
|
2
|
+
export * from './responsive';
|
|
3
|
+
export * from './CollectionsBrowser';
|
|
4
|
+
export * from './DocTypeRecords';
|
|
5
|
+
export * from './RecordCards';
|
|
6
|
+
export * from './DocTypeDetail';
|
|
7
|
+
export * from './CollectionBuilder';
|
|
8
|
+
export * from './MediaGrid';
|
|
9
|
+
export { Action, Actions, ErrorBar, Loading, Meta, Panel } from './parts';
|