@arqel-dev/ui 0.13.0 → 0.15.0
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/dist/ArqelCreatePage-MV4JN2MO.js +8 -0
- package/dist/{ArqelCreatePage-P3G6TKIK.js.map → ArqelCreatePage-MV4JN2MO.js.map} +1 -1
- package/dist/ArqelDashboardPage-QK3BYVK3.js +6 -0
- package/dist/{ArqelDashboardPage-PX3Y75AA.js.map → ArqelDashboardPage-QK3BYVK3.js.map} +1 -1
- package/dist/ArqelEditPage-7J3IS2BR.js +8 -0
- package/dist/{ArqelEditPage-HKQSE6E5.js.map → ArqelEditPage-7J3IS2BR.js.map} +1 -1
- package/dist/ArqelIndexPage-R6JL5KOH.js +12 -0
- package/dist/{ArqelIndexPage-MRH3572Z.js.map → ArqelIndexPage-R6JL5KOH.js.map} +1 -1
- package/dist/ArqelShowPage-5WWUSYC7.js +6 -0
- package/dist/{ArqelShowPage-4FS5MTUN.js.map → ArqelShowPage-5WWUSYC7.js.map} +1 -1
- package/dist/action.d.ts +1 -1
- package/dist/action.js +5 -5
- package/dist/{chunk-VSTRVXXZ.js → chunk-37FLEB4N.js} +4 -4
- package/dist/{chunk-VSTRVXXZ.js.map → chunk-37FLEB4N.js.map} +1 -1
- package/dist/chunk-3HN4ARGG.js +157 -0
- package/dist/chunk-3HN4ARGG.js.map +1 -0
- package/dist/{chunk-ERT7LL6C.js → chunk-4I5S6MH3.js} +12 -6
- package/dist/chunk-4I5S6MH3.js.map +1 -0
- package/dist/{chunk-PZEVKMZX.js → chunk-AZICSFBA.js} +218 -129
- package/dist/chunk-AZICSFBA.js.map +1 -0
- package/dist/{chunk-PXON56HL.js → chunk-BJER6TOI.js} +3 -3
- package/dist/{chunk-PXON56HL.js.map → chunk-BJER6TOI.js.map} +1 -1
- package/dist/{chunk-2LTZJ4R7.js → chunk-CVAMCRLL.js} +11 -6
- package/dist/chunk-CVAMCRLL.js.map +1 -0
- package/dist/{chunk-TNJEHYRF.js → chunk-FP5R6WED.js} +130 -24
- package/dist/chunk-FP5R6WED.js.map +1 -0
- package/dist/{chunk-FHRQ7PWE.js → chunk-H23VX3RR.js} +4 -3
- package/dist/chunk-H23VX3RR.js.map +1 -0
- package/dist/{chunk-47HD7ALI.js → chunk-HSDZM4AM.js} +3 -3
- package/dist/{chunk-47HD7ALI.js.map → chunk-HSDZM4AM.js.map} +1 -1
- package/dist/{chunk-MTZJDFQ6.js → chunk-MZMYV43C.js} +11 -7
- package/dist/chunk-MZMYV43C.js.map +1 -0
- package/dist/{chunk-6UJQP7KU.js → chunk-N5U2BB6T.js} +30 -116
- package/dist/chunk-N5U2BB6T.js.map +1 -0
- package/dist/{chunk-7LSZADUC.js → chunk-N6WLCHQE.js} +3 -3
- package/dist/{chunk-7LSZADUC.js.map → chunk-N6WLCHQE.js.map} +1 -1
- package/dist/{chunk-WKWV36PG.js → chunk-PSPJA5U6.js} +5 -3
- package/dist/chunk-PSPJA5U6.js.map +1 -0
- package/dist/{chunk-3JJOHYD7.js → chunk-UXN67E5L.js} +4 -4
- package/dist/{chunk-3JJOHYD7.js.map → chunk-UXN67E5L.js.map} +1 -1
- package/dist/{chunk-MSRTGCTJ.js → chunk-ZAM5TUPP.js} +59 -12
- package/dist/chunk-ZAM5TUPP.js.map +1 -0
- package/dist/form.d.ts +1 -1
- package/dist/form.js +3 -3
- package/dist/index.js +9 -9
- package/dist/pages.js +19 -19
- package/dist/resource.js +3 -3
- package/dist/shell.js +3 -3
- package/dist/table.js +2 -2
- package/dist/widgets.js +2 -2
- package/package.json +6 -6
- package/src/styles/globals.css +7 -0
- package/dist/ArqelCreatePage-P3G6TKIK.js +0 -8
- package/dist/ArqelDashboardPage-PX3Y75AA.js +0 -6
- package/dist/ArqelEditPage-HKQSE6E5.js +0 -8
- package/dist/ArqelIndexPage-MRH3572Z.js +0 -12
- package/dist/ArqelShowPage-4FS5MTUN.js +0 -6
- package/dist/chunk-2LTZJ4R7.js.map +0 -1
- package/dist/chunk-6UJQP7KU.js.map +0 -1
- package/dist/chunk-ERT7LL6C.js.map +0 -1
- package/dist/chunk-EYAUPJ6J.js +0 -64
- package/dist/chunk-EYAUPJ6J.js.map +0 -1
- package/dist/chunk-FHRQ7PWE.js.map +0 -1
- package/dist/chunk-MSRTGCTJ.js.map +0 -1
- package/dist/chunk-MTZJDFQ6.js.map +0 -1
- package/dist/chunk-PZEVKMZX.js.map +0 -1
- package/dist/chunk-TNJEHYRF.js.map +0 -1
- package/dist/chunk-WKWV36PG.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/pages/ArqelShowPage.tsx"],"names":[],"mappings":";;;;;AAgBA,IAAM,eAAA,GAA8B;AAAA,EAClC,QAAQ,EAAC;AAAA,EACT,OAAA,EAAS,CAAA;AAAA,EACT,KAAA,EAAO,IAAA;AAAA,EACP,MAAA,EAAQ,KAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAA;AAEe,SAAR,aAAA,GAAuF;AAC5F,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,EAAA,MAAM,MAAA,GAAU,KAAA,CAAM,MAAA,IAAU,EAAC;AAIjC,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,IAAA,IAAI,OAAO,SAAS,QAAA,IAAY,KAAA,CAAM,WAAW,IAAA,IAAQ,OAAO,KAAA,CAAM,MAAA,KAAW,QAAA,EAAU;AACzF,MAAA,MAAA,CAAO,IAAI,CAAA,GAAK,KAAA,CAAM,MAAA,CAAmC,IAAI,CAAA;AAAA,IAC/D;AAAA,EACF;AAEA,EAAA,MAAM,eAAgB,KAAA,CAA2C,IAAA;AACjE,EAAA,MAAM,SAAqB,YAAA,GAAe,EAAE,GAAG,YAAA,EAAc,QAAA,EAAU,MAAK,GAAI,eAAA;AAEhF,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,UAAU,KAAA,IAAS,QAAA;AAAA,QACrD,WAAA,EAAa,MAAM,cAAA,IAAkB;AAAA;AAAA,KACvC;AAAA,oBACA,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,MAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,UAAU,MAAM;AAAA,QAEhB,CAAA;AAAA,QACA,QAAQ;AAAC;AAAA;AACX,GAAA,EACF,CAAA;AAEJ","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/pages/ArqelShowPage.tsx"],"names":[],"mappings":";;;;;AAgBA,IAAM,eAAA,GAA8B;AAAA,EAClC,QAAQ,EAAC;AAAA,EACT,OAAA,EAAS,CAAA;AAAA,EACT,KAAA,EAAO,IAAA;AAAA,EACP,MAAA,EAAQ,KAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAA;AAEe,SAAR,aAAA,GAAuF;AAC5F,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,EAAA,MAAM,MAAA,GAAU,KAAA,CAAM,MAAA,IAAU,EAAC;AAIjC,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,IAAA,IAAI,OAAO,SAAS,QAAA,IAAY,KAAA,CAAM,WAAW,IAAA,IAAQ,OAAO,KAAA,CAAM,MAAA,KAAW,QAAA,EAAU;AACzF,MAAA,MAAA,CAAO,IAAI,CAAA,GAAK,KAAA,CAAM,MAAA,CAAmC,IAAI,CAAA;AAAA,IAC/D;AAAA,EACF;AAEA,EAAA,MAAM,eAAgB,KAAA,CAA2C,IAAA;AACjE,EAAA,MAAM,SAAqB,YAAA,GAAe,EAAE,GAAG,YAAA,EAAc,QAAA,EAAU,MAAK,GAAI,eAAA;AAEhF,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,UAAU,KAAA,IAAS,QAAA;AAAA,QACrD,WAAA,EAAa,MAAM,cAAA,IAAkB;AAAA;AAAA,KACvC;AAAA,oBACA,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,MAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,UAAU,MAAM;AAAA,QAEhB,CAAA;AAAA,QACA,QAAQ;AAAC;AAAA;AACX,GAAA,EACF,CAAA;AAEJ","file":"chunk-N6WLCHQE.js","sourcesContent":["/**\n * Default Inertia page for `arqel::show`.\n *\n * Read-only render of the record. Re-uses `<FormRenderer>` with\n * every field forced to disabled — keeps a single rendering path\n * for create/edit/show without a parallel \"DetailRenderer\" stack.\n */\n\nimport type { FieldSchema } from '@arqel-dev/types/fields';\nimport type { FormSchema } from '@arqel-dev/types/forms';\nimport type { RecordType, ResourceDetailProps } from '@arqel-dev/types/resources';\nimport { usePage } from '@inertiajs/react';\nimport type { JSX } from 'react';\nimport { FormRenderer } from '../form/FormRenderer.js';\nimport { PageHeader } from '../utility/PageHeader.js';\n\nconst FALLBACK_SCHEMA: FormSchema = {\n schema: [],\n columns: 1,\n model: null,\n inline: false,\n disabled: true,\n};\n\nexport default function ArqelShowPage<TRecord extends RecordType = RecordType>(): JSX.Element {\n const page = usePage();\n const props = page.props as unknown as ResourceDetailProps<TRecord>;\n const fields = (props.fields ?? []) as FieldSchema[];\n\n // Seed values from the record so FormRenderer has something to\n // display. Detail mode disables every field.\n const values: Record<string, unknown> = {};\n for (const field of fields) {\n const name = field.name;\n if (typeof name === 'string' && props.record !== null && typeof props.record === 'object') {\n values[name] = (props.record as Record<string, unknown>)[name];\n }\n }\n\n const declaredForm = (props as unknown as { form?: FormSchema }).form;\n const schema: FormSchema = declaredForm ? { ...declaredForm, disabled: true } : FALLBACK_SCHEMA;\n\n return (\n <div className=\"space-y-6\">\n <PageHeader\n title={props.recordTitle ?? props.resource?.label ?? 'Record'}\n description={props.recordSubtitle ?? null}\n />\n <FormRenderer\n schema={schema}\n fields={fields}\n values={values}\n onChange={() => {\n // No-op — show pages are read-only.\n }}\n errors={{}}\n />\n </div>\n );\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { cn } from './chunk-B7ULUJVO.js';
|
|
2
|
+
import { useArqelTranslations } from '@arqel-dev/react/utils';
|
|
2
3
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
3
4
|
|
|
4
5
|
function resolveColumnSpan(columnSpan) {
|
|
@@ -16,6 +17,7 @@ function WidgetWrapper({
|
|
|
16
17
|
className,
|
|
17
18
|
children
|
|
18
19
|
}) {
|
|
20
|
+
const t = useArqelTranslations();
|
|
19
21
|
const baseClass = cn(
|
|
20
22
|
"rounded border bg-background p-4",
|
|
21
23
|
resolveColumnSpan(columnSpan),
|
|
@@ -42,7 +44,7 @@ function WidgetWrapper({
|
|
|
42
44
|
type: "button",
|
|
43
45
|
onClick: onRetry,
|
|
44
46
|
className: "self-start rounded border px-2 py-1 text-xs text-foreground hover:bg-muted",
|
|
45
|
-
children: "Retry"
|
|
47
|
+
children: t("arqel.actions.retry", "Retry")
|
|
46
48
|
}
|
|
47
49
|
)
|
|
48
50
|
] }) });
|
|
@@ -136,5 +138,5 @@ function StatCard({ widget, className, columnSpan }) {
|
|
|
136
138
|
}
|
|
137
139
|
|
|
138
140
|
export { StatCard, WidgetWrapper };
|
|
139
|
-
//# sourceMappingURL=chunk-
|
|
140
|
-
//# sourceMappingURL=chunk-
|
|
141
|
+
//# sourceMappingURL=chunk-PSPJA5U6.js.map
|
|
142
|
+
//# sourceMappingURL=chunk-PSPJA5U6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/widgets/WidgetWrapper.tsx","../src/widgets/StatCard.tsx"],"names":["jsx","jsxs"],"mappings":"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","file":"chunk-PSPJA5U6.js","sourcesContent":["/**\n * `<WidgetWrapper>` — common chrome for dashboard widgets.\n *\n * Provides:\n * - Heading / description header.\n * - Loading skeleton (CLS-safe placeholder while deferred widgets fetch).\n * - Error state (`role=\"alert\"`) with optional retry action.\n * - `aria-label`-ed `<section>` so widgets are individually navigable.\n *\n * Used by `<StatCard>` (and shortly `<ChartCard>` / `<TableCard>`) so the\n * outer card chrome is consistent across widget types.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport interface WidgetWrapperProps {\n heading?: string | undefined;\n description?: string | undefined;\n loading?: boolean | undefined;\n error?: Error | null | undefined;\n onRetry?: (() => void) | undefined;\n /** Tailwind grid column span (number → `col-span-{n}`, or raw class). */\n columnSpan?: number | string | undefined;\n className?: string | undefined;\n children: ReactNode;\n}\n\nfunction resolveColumnSpan(columnSpan?: number | string): string | undefined {\n if (columnSpan === undefined) return undefined;\n if (typeof columnSpan === 'number') return `col-span-${columnSpan}`;\n return columnSpan;\n}\n\nexport function WidgetWrapper({\n heading,\n description,\n loading = false,\n error = null,\n onRetry,\n columnSpan,\n className,\n children,\n}: WidgetWrapperProps) {\n const t = useArqelTranslations();\n const baseClass = cn(\n 'rounded border bg-background p-4',\n resolveColumnSpan(columnSpan),\n className,\n );\n\n if (loading) {\n return (\n <section\n aria-label={heading}\n aria-busy=\"true\"\n className={baseClass}\n data-widget-state=\"loading\"\n >\n <div className=\"animate-pulse h-32 bg-muted rounded\" />\n </section>\n );\n }\n\n if (error) {\n return (\n <section aria-label={heading} className={baseClass} data-widget-state=\"error\">\n <div role=\"alert\" className=\"flex flex-col gap-2 text-sm text-destructive\">\n <p>{error.message}</p>\n {onRetry && (\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"self-start rounded border px-2 py-1 text-xs text-foreground hover:bg-muted\"\n >\n {t('arqel.actions.retry', 'Retry')}\n </button>\n )}\n </div>\n </section>\n );\n }\n\n return (\n <section aria-label={heading} className={baseClass} data-widget-state=\"ready\">\n {heading && <h2 className=\"text-sm font-medium text-muted-foreground\">{heading}</h2>}\n {description && <p className=\"mt-1 text-xs text-muted-foreground\">{description}</p>}\n <div className={cn(heading || description ? 'mt-3' : undefined)}>{children}</div>\n </section>\n );\n}\n","/**\n * `<StatCard>` — KPI / \"big number\" widget.\n *\n * Renders the payload produced by `Arqel\\Widgets\\StatWidget::data()`:\n *\n * {\n * name, type: 'stat', heading?, description?,\n * value, statDescription?, descriptionIcon?,\n * color, icon?, chart?: number[], url?\n * }\n *\n * Includes a tiny inline-SVG sparkline (no Recharts dep) when `chart`\n * is set. ChartCard / TableCard (Recharts-based) ship in a separate\n * cluster; this component is intentionally Recharts-free so the\n * common \"big number\" case stays bundle-cheap.\n */\n\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn.js';\nimport { WidgetWrapper } from './WidgetWrapper.js';\n\nexport type StatCardColor = 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info';\n\nexport interface StatCardWidget {\n name: string;\n type: 'stat';\n heading?: string;\n description?: string;\n value: string | number | null;\n statDescription?: string | null;\n descriptionIcon?: string | null;\n color: StatCardColor;\n icon?: string | null;\n chart?: number[] | null;\n url?: string | null;\n}\n\nexport interface StatCardProps {\n widget: StatCardWidget;\n className?: string | undefined;\n columnSpan?: number | string | undefined;\n}\n\nconst COLOR_TEXT: Record<StatCardColor, string> = {\n primary: 'text-primary',\n secondary: 'text-secondary-foreground',\n success: 'text-green-600',\n warning: 'text-amber-600',\n danger: 'text-red-600',\n info: 'text-sky-600',\n};\n\nconst COLOR_STROKE: Record<StatCardColor, string> = {\n primary: 'stroke-primary',\n secondary: 'stroke-secondary-foreground',\n success: 'stroke-green-500',\n warning: 'stroke-amber-500',\n danger: 'stroke-red-500',\n info: 'stroke-sky-500',\n};\n\ninterface SparklineProps {\n points: number[];\n color: StatCardColor;\n}\n\nfunction Sparkline({ points, color }: SparklineProps) {\n if (points.length < 2) return null;\n\n const min = Math.min(...points);\n const max = Math.max(...points);\n const range = max - min || 1;\n const stepX = 100 / (points.length - 1);\n\n const coords = points\n .map((value, index) => {\n const x = index * stepX;\n // Invert Y so larger values render higher in the viewBox.\n const y = 30 - ((value - min) / range) * 30;\n return `${x.toFixed(2)},${y.toFixed(2)}`;\n })\n .join(' ');\n\n return (\n <svg\n viewBox=\"0 0 100 30\"\n preserveAspectRatio=\"none\"\n className={cn('mt-3 h-8 w-full', COLOR_STROKE[color])}\n role=\"img\"\n aria-label=\"Trend sparkline\"\n data-testid=\"stat-card-sparkline\"\n >\n <polyline\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n points={coords}\n />\n </svg>\n );\n}\n\nexport function StatCard({ widget, className, columnSpan }: StatCardProps) {\n const { heading, description, value, statDescription, descriptionIcon, color, chart, url } =\n widget;\n\n const hasChart = Array.isArray(chart) && chart.length >= 2;\n\n const body: ReactNode = (\n <>\n <div className={cn('text-4xl font-bold tabular-nums', COLOR_TEXT[color])}>{value ?? '—'}</div>\n {statDescription && (\n <div className=\"mt-2 flex items-center gap-1 text-xs text-muted-foreground\">\n {descriptionIcon && (\n <span aria-hidden=\"true\" data-testid=\"stat-card-icon\">\n {/* Icon name passed through; an icon registry resolves it app-side. */}\n {descriptionIcon}\n </span>\n )}\n <span>{statDescription}</span>\n </div>\n )}\n {hasChart && <Sparkline points={chart as number[]} color={color} />}\n </>\n );\n\n const inner = url ? (\n <a\n href={url}\n className=\"block rounded outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n data-testid=\"stat-card-link\"\n >\n {body}\n </a>\n ) : (\n body\n );\n\n return (\n <WidgetWrapper\n heading={heading}\n description={description}\n columnSpan={columnSpan}\n className={className}\n >\n {inner}\n </WidgetWrapper>\n );\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { PageHeader } from './chunk-MXUXMHOK.js';
|
|
2
|
-
import { FormActions } from './chunk-
|
|
3
|
-
import { FormRenderer } from './chunk-
|
|
2
|
+
import { FormActions } from './chunk-MZMYV43C.js';
|
|
3
|
+
import { FormRenderer } from './chunk-ZAM5TUPP.js';
|
|
4
4
|
import { useArqelForm } from '@arqel-dev/hooks';
|
|
5
5
|
import { usePage, router } from '@inertiajs/react';
|
|
6
6
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
@@ -53,5 +53,5 @@ function ArqelEditPage() {
|
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
export { ArqelEditPage };
|
|
56
|
-
//# sourceMappingURL=chunk-
|
|
57
|
-
//# sourceMappingURL=chunk-
|
|
56
|
+
//# sourceMappingURL=chunk-UXN67E5L.js.map
|
|
57
|
+
//# sourceMappingURL=chunk-UXN67E5L.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/pages/ArqelEditPage.tsx"],"names":[],"mappings":";;;;;;;AAiBA,IAAM,eAAA,GAA8B;AAAA,EAClC,QAAQ,EAAC;AAAA,EACT,OAAA,EAAS,CAAA;AAAA,EACT,KAAA,EAAO,IAAA;AAAA,EACP,MAAA,EAAQ,KAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAA;AASe,SAAR,aAAA,GAAuF;AAC5F,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,EAAA,MAAM,MAAA,GAAU,KAAA,CAAM,MAAA,IAAU,EAAC;AACjC,EAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,EAAA,MAAM,MAAA,GAAU,MAA2C,IAAA,IAAQ,eAAA;AAEnE,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAE5C,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAuB;AACrC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,MAAM,EAAA,GAAK,MAAA,CAAQ,MAAA,EAAiD,EAAA,IAAM,EAAE,CAAA;AAC5E,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,EAAU,IAAA,IAAQ,EAAA;AACrC,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,EAAU,SAAA,IAAa,QAAA;AAC9C,IAAA,MAAA,CAAO,GAAA,CAAI,GAAG,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,IAAA,CAAK,IAAA,EAA+B;AAAA,MAC1E,cAAA,EAAgB;AAAA,KACjB,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAO,KAAA,CAAM,WAAA,IAAe,QAAQ,KAAA,CAAM,QAAA,EAAU,SAAS,QAAQ,CAAA,CAAA;AAAA,QACrE,WAAA,EAAa,MAAM,cAAA,IAAkB;AAAA;AAAA,KACvC;AAAA,oBACA,IAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,MAAA,EAAQ,WAAU,WAAA,EAChC,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,MAAA;AAAA,UACA,MAAA;AAAA,UACA,QAAQ,IAAA,CAAK,IAAA;AAAA,UACb,UAAU,CAAC,IAAA,EAAM,UAAU,IAAA,CAAK,OAAA,CAAQ,MAAM,KAAK,CAAA;AAAA,UACnD,QAAQ,IAAA,CAAK;AAAA;AAAA,OACf;AAAA,sBACA,GAAA,CAAC,WAAA,EAAA,EAAY,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,UAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAK,EAAG;AAAA,KAAA,EACnF;AAAA,GAAA,EACF,CAAA;AAEJ","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/pages/ArqelEditPage.tsx"],"names":[],"mappings":";;;;;;;AAiBA,IAAM,eAAA,GAA8B;AAAA,EAClC,QAAQ,EAAC;AAAA,EACT,OAAA,EAAS,CAAA;AAAA,EACT,KAAA,EAAO,IAAA;AAAA,EACP,MAAA,EAAQ,KAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAA;AASe,SAAR,aAAA,GAAuF;AAC5F,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,EAAA,MAAM,MAAA,GAAU,KAAA,CAAM,MAAA,IAAU,EAAC;AACjC,EAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,EAAA,MAAM,MAAA,GAAU,MAA2C,IAAA,IAAQ,eAAA;AAEnE,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAE5C,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAuB;AACrC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,MAAM,EAAA,GAAK,MAAA,CAAQ,MAAA,EAAiD,EAAA,IAAM,EAAE,CAAA;AAC5E,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,EAAU,IAAA,IAAQ,EAAA;AACrC,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,EAAU,SAAA,IAAa,QAAA;AAC9C,IAAA,MAAA,CAAO,GAAA,CAAI,GAAG,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,IAAA,CAAK,IAAA,EAA+B;AAAA,MAC1E,cAAA,EAAgB;AAAA,KACjB,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAO,KAAA,CAAM,WAAA,IAAe,QAAQ,KAAA,CAAM,QAAA,EAAU,SAAS,QAAQ,CAAA,CAAA;AAAA,QACrE,WAAA,EAAa,MAAM,cAAA,IAAkB;AAAA;AAAA,KACvC;AAAA,oBACA,IAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,MAAA,EAAQ,WAAU,WAAA,EAChC,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,MAAA;AAAA,UACA,MAAA;AAAA,UACA,QAAQ,IAAA,CAAK,IAAA;AAAA,UACb,UAAU,CAAC,IAAA,EAAM,UAAU,IAAA,CAAK,OAAA,CAAQ,MAAM,KAAK,CAAA;AAAA,UACnD,QAAQ,IAAA,CAAK;AAAA;AAAA,OACf;AAAA,sBACA,GAAA,CAAC,WAAA,EAAA,EAAY,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,UAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAK,EAAG;AAAA,KAAA,EACnF;AAAA,GAAA,EACF,CAAA;AAEJ","file":"chunk-UXN67E5L.js","sourcesContent":["/**\n * Default Inertia page for `arqel::edit`.\n *\n * Same shape as `ArqelCreatePage` but seeds the form with the\n * server-emitted `record`. Submission posts to PUT `/{slug}/{id}`.\n */\n\nimport { useArqelForm } from '@arqel-dev/hooks';\nimport type { FieldSchema } from '@arqel-dev/types/fields';\nimport type { FormSchema } from '@arqel-dev/types/forms';\nimport type { RecordType, ResourceEditProps } from '@arqel-dev/types/resources';\nimport { router, usePage } from '@inertiajs/react';\nimport type { FormEvent, JSX } from 'react';\nimport { FormActions } from '../form/FormActions.js';\nimport { FormRenderer } from '../form/FormRenderer.js';\nimport { PageHeader } from '../utility/PageHeader.js';\n\nconst FALLBACK_SCHEMA: FormSchema = {\n schema: [],\n columns: 1,\n model: null,\n inline: false,\n disabled: false,\n};\n\ninterface ArqelFormShape {\n data: Record<string, unknown>;\n setData: (name: string, value: unknown) => void;\n errors: Record<string, string[]>;\n processing: boolean;\n}\n\nexport default function ArqelEditPage<TRecord extends RecordType = RecordType>(): JSX.Element {\n const page = usePage();\n const props = page.props as unknown as ResourceEditProps<TRecord>;\n const fields = (props.fields ?? []) as FieldSchema[];\n const record = props.record;\n const schema = (props as unknown as { form?: FormSchema }).form ?? FALLBACK_SCHEMA;\n\n const form = useArqelForm({ fields, record }) as unknown as ArqelFormShape;\n\n const submit = (e: FormEvent): void => {\n e.preventDefault();\n const id = String((record as { id?: string | number } | undefined)?.id ?? '');\n const slug = props.resource?.slug ?? '';\n const basePath = props.resource?.panelPath ?? '/admin';\n router.put(`${basePath}/${slug}/${id}`, form.data as Record<string, never>, {\n preserveScroll: true,\n });\n };\n\n return (\n <div className=\"space-y-6\">\n <PageHeader\n title={props.recordTitle ?? `Edit ${props.resource?.label ?? 'record'}`}\n description={props.recordSubtitle ?? null}\n />\n <form onSubmit={submit} className=\"space-y-6\">\n <FormRenderer\n schema={schema}\n fields={fields}\n values={form.data}\n onChange={(name, value) => form.setData(name, value)}\n errors={form.errors}\n />\n <FormActions processing={form.processing} onCancel={() => window.history.back()} />\n </form>\n </div>\n );\n}\n"]}
|
|
@@ -59,9 +59,34 @@ function NativeFieldInput(props) {
|
|
|
59
59
|
case "image":
|
|
60
60
|
return /* @__PURE__ */ jsx(FileInput, { ...props });
|
|
61
61
|
default:
|
|
62
|
-
return
|
|
62
|
+
return /* @__PURE__ */ jsx(UnregisteredField, { field });
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
|
+
function UnregisteredField({ field }) {
|
|
66
|
+
if (field.component) {
|
|
67
|
+
console.warn(
|
|
68
|
+
`[arqel] field "${field.name}" uses unregistered component "${field.component}" \u2014 did you import its /register module?`
|
|
69
|
+
);
|
|
70
|
+
} else {
|
|
71
|
+
console.warn(`[arqel] field "${field.name}" has no native input for type "${field.type}".`);
|
|
72
|
+
}
|
|
73
|
+
const detail = field.component ? `unregistered component "${field.component}"` : `unsupported type "${field.type}"`;
|
|
74
|
+
return /* @__PURE__ */ jsxs(
|
|
75
|
+
"p",
|
|
76
|
+
{
|
|
77
|
+
"data-testid": "arqel-unregistered-field",
|
|
78
|
+
role: "alert",
|
|
79
|
+
className: "rounded-sm border border-destructive/40 bg-destructive/10 px-3 py-2 text-xs text-destructive",
|
|
80
|
+
children: [
|
|
81
|
+
'Field "',
|
|
82
|
+
field.name,
|
|
83
|
+
'" could not render: ',
|
|
84
|
+
detail,
|
|
85
|
+
"."
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
);
|
|
89
|
+
}
|
|
65
90
|
function TextLike({
|
|
66
91
|
field,
|
|
67
92
|
value,
|
|
@@ -360,20 +385,36 @@ function FormFieldset({ config, children, className }) {
|
|
|
360
385
|
)
|
|
361
386
|
] });
|
|
362
387
|
}
|
|
388
|
+
var BREAKPOINT_PREFIX = {
|
|
389
|
+
sm: "sm:",
|
|
390
|
+
md: "md:",
|
|
391
|
+
lg: "lg:",
|
|
392
|
+
xl: "xl:",
|
|
393
|
+
"2xl": "2xl:"
|
|
394
|
+
};
|
|
363
395
|
function FormGrid({ config, children, className }) {
|
|
364
|
-
const columns = typeof config.columns === "number" ? config.columns : config.columns["md"] ?? 1;
|
|
365
396
|
return /* @__PURE__ */ jsx(
|
|
366
397
|
"div",
|
|
367
398
|
{
|
|
368
|
-
className: cn("grid", className),
|
|
369
|
-
style: {
|
|
370
|
-
gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))`,
|
|
371
|
-
gap: config.gap ?? "1rem"
|
|
372
|
-
},
|
|
399
|
+
className: cn("grid", gridColsClass(config.columns), className),
|
|
400
|
+
style: { gap: config.gap ?? "1rem" },
|
|
373
401
|
children
|
|
374
402
|
}
|
|
375
403
|
);
|
|
376
404
|
}
|
|
405
|
+
function gridColsClass(columns) {
|
|
406
|
+
if (typeof columns === "number") {
|
|
407
|
+
return `grid-cols-${Math.max(1, Math.min(12, columns))}`;
|
|
408
|
+
}
|
|
409
|
+
const parts = ["grid-cols-1"];
|
|
410
|
+
for (const bp of ["sm", "md", "lg", "xl", "2xl"]) {
|
|
411
|
+
const value = columns[bp];
|
|
412
|
+
if (typeof value === "number") {
|
|
413
|
+
parts.push(`${BREAKPOINT_PREFIX[bp]}grid-cols-${Math.max(1, Math.min(12, value))}`);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
return parts.join(" ");
|
|
417
|
+
}
|
|
377
418
|
function FormSection({ config, children, className }) {
|
|
378
419
|
const [open, setOpen] = useState(!config.collapsed);
|
|
379
420
|
const collapsible = config.collapsible === true;
|
|
@@ -476,7 +517,7 @@ function FormTabs({ config, tabs, className }) {
|
|
|
476
517
|
onClick: () => setActive(tab.id),
|
|
477
518
|
onKeyDown,
|
|
478
519
|
className: cn(
|
|
479
|
-
"-mb-px border-b-2 px-3 py-2 text-sm transition-colors",
|
|
520
|
+
"-mb-px inline-flex min-h-11 items-center border-b-2 px-3 py-2 text-sm transition-colors",
|
|
480
521
|
selected ? "border-primary font-medium text-foreground" : "border-transparent text-muted-foreground hover:text-foreground"
|
|
481
522
|
),
|
|
482
523
|
children: [
|
|
@@ -510,7 +551,13 @@ function FormRenderer({
|
|
|
510
551
|
disabled = false,
|
|
511
552
|
className
|
|
512
553
|
}) {
|
|
513
|
-
const
|
|
554
|
+
const remaining = [...fields];
|
|
555
|
+
const claimField = (entry) => {
|
|
556
|
+
let idx = remaining.findIndex((f) => f.name === entry.name && f.type === entry.type);
|
|
557
|
+
if (idx === -1) idx = remaining.findIndex((f) => f.name === entry.name);
|
|
558
|
+
if (idx === -1) return void 0;
|
|
559
|
+
return remaining.splice(idx, 1)[0];
|
|
560
|
+
};
|
|
514
561
|
const renderEntry = (entry, key) => {
|
|
515
562
|
if (isFieldEntry(entry)) {
|
|
516
563
|
return renderFieldEntry(entry, key);
|
|
@@ -521,7 +568,7 @@ function FormRenderer({
|
|
|
521
568
|
return null;
|
|
522
569
|
};
|
|
523
570
|
const renderFieldEntry = (entry, key) => {
|
|
524
|
-
const field =
|
|
571
|
+
const field = claimField(entry);
|
|
525
572
|
if (!field) return null;
|
|
526
573
|
return /* @__PURE__ */ jsx(
|
|
527
574
|
FieldRenderer,
|
|
@@ -593,5 +640,5 @@ function FormRenderer({
|
|
|
593
640
|
}
|
|
594
641
|
|
|
595
642
|
export { FieldRenderer, FormFieldset, FormGrid, FormRenderer, FormSection, FormTabs, NativeFieldInput, clearFieldRegistry, getFieldComponent, getRegisteredFields, registerField, unregisterField };
|
|
596
|
-
//# sourceMappingURL=chunk-
|
|
597
|
-
//# sourceMappingURL=chunk-
|
|
643
|
+
//# sourceMappingURL=chunk-ZAM5TUPP.js.map
|
|
644
|
+
//# sourceMappingURL=chunk-ZAM5TUPP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/form/FieldRegistry.tsx","../src/form/nativeFields.tsx","../src/form/FieldRenderer.tsx","../src/form/FormFieldset.tsx","../src/form/FormGrid.tsx","../src/form/FormSection.tsx","../src/form/FormTabs.tsx","../src/form/FormRenderer.tsx"],"names":["jsxs","jsx","useState","useId"],"mappings":"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","file":"chunk-ZAM5TUPP.js","sourcesContent":["/**\n * `FieldRegistry` — name → React component mapping for FieldRenderer.\n *\n * `@arqel-dev/fields` (FIELDS-JS-*) calls `registerField` at module init to\n * plug rich inputs in; until then FieldRenderer falls back to the\n * native HTML primitives in `nativeFields.tsx`. Registration is global\n * by design — apps can override Arqel defaults by re-registering with\n * the same name.\n */\n\nimport type { ComponentType } from 'react';\nimport type { FieldRendererProps } from './FieldRenderer.js';\n\nexport type FieldComponent = ComponentType<FieldRendererProps>;\n\nconst registry = new Map<string, FieldComponent>();\n\nexport function registerField(name: string, component: FieldComponent): void {\n registry.set(name, component);\n}\n\nexport function getFieldComponent(name: string): FieldComponent | undefined {\n return registry.get(name);\n}\n\nexport function unregisterField(name: string): void {\n registry.delete(name);\n}\n\nexport function getRegisteredFields(): string[] {\n return Array.from(registry.keys()).sort();\n}\n\n/** Test-only helper. */\nexport function clearFieldRegistry(): void {\n registry.clear();\n}\n","/**\n * Native HTML fallback inputs — used until `@arqel-dev/fields` registers\n * richer impls. One renderer per FieldSchema discriminant.\n */\n\nimport type {\n BelongsToFieldSchema,\n BooleanFieldSchema,\n CurrencyFieldSchema,\n DateFieldSchema,\n DateTimeFieldSchema,\n EmailFieldSchema,\n FieldSchema,\n HasManyFieldSchema,\n MultiSelectFieldSchema,\n NumberFieldSchema,\n PasswordFieldSchema,\n RadioFieldSchema,\n SelectFieldSchema,\n SlugFieldSchema,\n TextareaFieldSchema,\n TextFieldSchema,\n ToggleFieldSchema,\n UrlFieldSchema,\n} from '@arqel-dev/types/fields';\nimport { cn } from '../utils/cn.js';\n\nexport interface NativeProps {\n field: FieldSchema;\n value: unknown;\n onChange: (value: unknown) => void;\n disabled?: boolean | undefined;\n errors?: string[] | undefined;\n className?: string | undefined;\n inputId?: string | undefined;\n describedBy?: string | undefined;\n}\n\nconst inputClasses = cn(\n 'h-9 rounded-sm border border-[var(--input)]',\n 'bg-background px-3 text-sm',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n);\n\nexport function NativeFieldInput(props: NativeProps) {\n const { field } = props;\n\n switch (field.type) {\n case 'text':\n case 'email':\n case 'url':\n case 'password':\n case 'slug':\n return <TextLike {...props} field={field} />;\n case 'textarea':\n return <Textarea {...props} field={field} />;\n case 'number':\n case 'currency':\n return <NumericInput {...props} field={field} />;\n case 'boolean':\n case 'toggle':\n return <Checkbox {...props} field={field} />;\n case 'select':\n return <SelectInput {...props} field={field} />;\n case 'multiSelect':\n case 'hasMany':\n return <MultiSelectInput {...props} field={field} />;\n case 'radio':\n return <RadioGroup {...props} field={field} />;\n case 'belongsTo':\n return <BelongsToInput {...props} field={field} />;\n case 'date':\n case 'dateTime':\n return <DateInput {...props} field={field} />;\n case 'file':\n case 'image':\n return <FileInput {...props} />;\n default:\n return <UnregisteredField field={field} />;\n }\n}\n\n/**\n * Visible fallback when a field's `type` has no native input. This usually\n * means the field declared a custom `component` whose `/register` module was\n * never imported, so `getFieldComponent` returned undefined and we fell\n * through here. Instead of rendering nothing (a bare label, no control, no\n * diagnostic — #233), surface an inline notice and warn in the console.\n */\nfunction UnregisteredField({ field }: { field: FieldSchema }) {\n if (field.component) {\n console.warn(\n `[arqel] field \"${field.name}\" uses unregistered component \"${field.component}\" — ` +\n 'did you import its /register module?',\n );\n } else {\n console.warn(`[arqel] field \"${field.name}\" has no native input for type \"${field.type}\".`);\n }\n const detail = field.component\n ? `unregistered component \"${field.component}\"`\n : `unsupported type \"${field.type}\"`;\n return (\n <p\n data-testid=\"arqel-unregistered-field\"\n role=\"alert\"\n className=\"rounded-sm border border-destructive/40 bg-destructive/10 px-3 py-2 text-xs text-destructive\"\n >\n Field \"{field.name}\" could not render: {detail}.\n </p>\n );\n}\n\n/* ─── primitives ─────────────────────────────────────────────────── */\n\ntype TextLikeField =\n | TextFieldSchema\n | EmailFieldSchema\n | UrlFieldSchema\n | PasswordFieldSchema\n | SlugFieldSchema;\n\nfunction TextLike({\n field,\n value,\n onChange,\n disabled,\n inputId,\n describedBy,\n}: NativeProps & { field: TextLikeField }) {\n const htmlType =\n field.type === 'email'\n ? 'email'\n : field.type === 'password'\n ? 'password'\n : field.type === 'url'\n ? 'url'\n : 'text';\n const isDisabled = disabled || field.disabled || field.readonly;\n return (\n <input\n id={inputId}\n type={htmlType}\n className={inputClasses}\n value={typeof value === 'string' ? value : ((value ?? '')?.toString() ?? '')}\n placeholder={field.placeholder ?? undefined}\n disabled={isDisabled}\n readOnly={field.readonly === true}\n required={field.required === true}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n}\n\nfunction Textarea({\n field,\n value,\n onChange,\n disabled,\n inputId,\n describedBy,\n}: NativeProps & { field: TextareaFieldSchema }) {\n return (\n <textarea\n id={inputId}\n className={cn(inputClasses, 'h-auto min-h-[5rem] py-2')}\n value={typeof value === 'string' ? value : ''}\n placeholder={field.placeholder ?? undefined}\n disabled={disabled || field.disabled || field.readonly}\n readOnly={field.readonly === true}\n required={field.required === true}\n rows={4}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n}\n\nfunction NumericInput({\n field,\n value,\n onChange,\n disabled,\n inputId,\n describedBy,\n}: NativeProps & { field: NumberFieldSchema | CurrencyFieldSchema }) {\n return (\n <input\n id={inputId}\n type=\"number\"\n className={inputClasses}\n value={value === null || value === undefined ? '' : String(value)}\n placeholder={field.placeholder ?? undefined}\n disabled={disabled || field.disabled || field.readonly}\n readOnly={field.readonly === true}\n required={field.required === true}\n aria-describedby={describedBy}\n onChange={(e) => {\n const raw = e.target.value;\n if (raw === '') {\n onChange(null);\n return;\n }\n const num = Number(raw);\n onChange(Number.isNaN(num) ? null : num);\n }}\n />\n );\n}\n\nfunction Checkbox({\n field,\n value,\n onChange,\n disabled,\n inputId,\n describedBy,\n}: NativeProps & { field: BooleanFieldSchema | ToggleFieldSchema }) {\n return (\n <input\n id={inputId}\n type=\"checkbox\"\n className=\"h-4 w-4 rounded border-[var(--input)]\"\n checked={value === true}\n disabled={disabled || field.disabled || field.readonly}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.checked)}\n />\n );\n}\n\nfunction normaliseOptions(\n options: SelectFieldSchema['props']['options'] | undefined,\n): Array<{ value: string | number; label: string }> {\n if (!options) return [];\n if (Array.isArray(options)) return options;\n return Object.entries(options).map(([value, label]) => ({ value, label }));\n}\n\nfunction SelectInput({\n field,\n value,\n onChange,\n disabled,\n inputId,\n describedBy,\n}: NativeProps & { field: SelectFieldSchema }) {\n const options = normaliseOptions(field.props.options);\n return (\n <select\n id={inputId}\n className={inputClasses}\n value={value === null || value === undefined ? '' : String(value)}\n disabled={disabled || field.disabled || field.readonly}\n required={field.required === true}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value === '' ? null : e.target.value)}\n >\n {field.placeholder && <option value=\"\">{field.placeholder}</option>}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n );\n}\n\nfunction MultiSelectInput({\n field,\n value,\n onChange,\n disabled,\n inputId,\n describedBy,\n}: NativeProps & { field: MultiSelectFieldSchema | HasManyFieldSchema }) {\n const arr = Array.isArray(value) ? (value as Array<string | number>) : [];\n const options = field.type === 'multiSelect' ? normaliseOptions(field.props.options) : [];\n return (\n <select\n id={inputId}\n multiple\n className={cn(inputClasses, 'h-auto min-h-[6rem] py-1')}\n value={arr.map(String)}\n disabled={disabled || field.disabled || field.readonly}\n aria-describedby={describedBy}\n onChange={(e) => {\n const next = Array.from(e.target.selectedOptions, (o) => o.value);\n onChange(next);\n }}\n >\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n );\n}\n\nfunction RadioGroup({\n field,\n value,\n onChange,\n disabled,\n inputId,\n describedBy,\n}: NativeProps & { field: RadioFieldSchema }) {\n return (\n <div\n id={inputId}\n className=\"flex flex-col gap-1\"\n aria-describedby={describedBy}\n role=\"radiogroup\"\n >\n {(field.props.options ?? []).map((opt) => (\n <label key={opt.value} className=\"inline-flex items-center gap-2 text-sm\">\n <input\n type=\"radio\"\n name={field.name}\n value={String(opt.value)}\n checked={String(value ?? '') === String(opt.value)}\n disabled={disabled || field.disabled || field.readonly}\n onChange={() => onChange(opt.value)}\n />\n {opt.label}\n </label>\n ))}\n </div>\n );\n}\n\nfunction BelongsToInput({\n field,\n value,\n onChange,\n disabled,\n inputId,\n describedBy,\n}: NativeProps & { field: BelongsToFieldSchema }) {\n // Phase 1 fallback: native text input. The full async-search picker\n // ships in `@arqel-dev/fields/BelongsToField` and registers via FieldRegistry.\n return (\n <input\n id={inputId}\n type=\"text\"\n className={inputClasses}\n value={value === null || value === undefined ? '' : String(value)}\n placeholder={field.placeholder ?? `Search ${field.props.relatedResource}…`}\n disabled={disabled || field.disabled || field.readonly}\n readOnly={field.readonly === true}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value === '' ? null : e.target.value)}\n />\n );\n}\n\nfunction DateInput({\n field,\n value,\n onChange,\n disabled,\n inputId,\n describedBy,\n}: NativeProps & { field: DateFieldSchema | DateTimeFieldSchema }) {\n return (\n <input\n id={inputId}\n type={field.type === 'dateTime' ? 'datetime-local' : 'date'}\n className={inputClasses}\n value={typeof value === 'string' ? value : ''}\n disabled={disabled || field.disabled || field.readonly}\n readOnly={field.readonly === true}\n required={field.required === true}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value === '' ? null : e.target.value)}\n />\n );\n}\n\nfunction FileInput({\n field,\n onChange,\n disabled,\n inputId,\n describedBy,\n}: NativeProps & { field: FieldSchema }) {\n return (\n <input\n id={inputId}\n type=\"file\"\n className=\"text-sm\"\n disabled={disabled || field.disabled || field.readonly}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.files?.[0] ?? null)}\n />\n );\n}\n","/**\n * `<FieldRenderer>` — renders a single field.\n *\n * Resolution order:\n * 1. Component registered via `registerField(field.component)` (rich\n * inputs from `@arqel-dev/fields`)\n * 2. Native fallback dispatched by `field.type` (text/number/boolean/...)\n *\n * Errors come from `errors[name]` (Inertia or client). The component\n * also honours `disabled` / `readonly` / `required` from the schema.\n */\n\nimport type { FieldSchema } from '@arqel-dev/types/fields';\nimport { type ChangeEvent, type ReactNode, useId } from 'react';\nimport { cn } from '../utils/cn.js';\nimport { getFieldComponent } from './FieldRegistry.js';\nimport { NativeFieldInput } from './nativeFields.js';\n\nexport interface FieldRendererProps {\n field: FieldSchema;\n value: unknown;\n onChange: (value: unknown) => void;\n errors?: string[] | undefined;\n disabled?: boolean | undefined;\n className?: string | undefined;\n inputId?: string | undefined;\n describedBy?: string | undefined;\n}\n\nexport function FieldRenderer(props: FieldRendererProps): ReactNode {\n const { field, errors, className } = props;\n const id = useId();\n const errorId = `${id}-error`;\n const helperId = `${id}-helper`;\n const hasError = errors && errors.length > 0;\n\n const Custom = field.component ? getFieldComponent(field.component) : undefined;\n const Input = Custom ?? (NativeFieldInput as typeof NativeFieldInput);\n\n const describedBy = [field.helperText ? helperId : null, hasError ? errorId : null]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n data-arqel-field={field.name}\n data-field-type={field.type}\n className={cn('flex flex-col gap-1', className)}\n >\n {field.label !== null && field.label !== '' && (\n <label htmlFor={id} className=\"text-sm font-medium\">\n {field.label}\n {field.required && (\n <span aria-hidden=\"true\" className=\"ml-0.5 text-destructive\">\n *\n </span>\n )}\n </label>\n )}\n <Input {...props} inputId={id} describedBy={describedBy || undefined} />\n {field.helperText && !hasError && (\n <p id={helperId} className=\"text-xs text-muted-foreground\">\n {field.helperText}\n </p>\n )}\n {hasError && (\n <p id={errorId} role=\"alert\" className=\"text-xs text-destructive\">\n {errors[0]}\n </p>\n )}\n </div>\n );\n}\n\n/* ─── helpers ────────────────────────────────────────────────────── */\n\nexport function asInputChange<T>(\n cast: (raw: string) => T,\n): (event: ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>) => T {\n return (event) => cast(event.target.value);\n}\n","/**\n * `<FormFieldset>` — semantic `<fieldset>` with grid body.\n */\n\nimport type { FieldsetProps } from '@arqel-dev/types/forms';\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport interface FormFieldsetProps {\n config: FieldsetProps;\n children: ReactNode;\n className?: string;\n}\n\nexport function FormFieldset({ config, children, className }: FormFieldsetProps) {\n return (\n <fieldset className={cn('rounded-md border border-border p-4', className)}>\n <legend className=\"px-1 text-sm font-medium\">{config.legend}</legend>\n <div\n className=\"grid gap-4\"\n style={{ gridTemplateColumns: `repeat(${config.columns ?? 1}, minmax(0, 1fr))` }}\n >\n {children}\n </div>\n </fieldset>\n );\n}\n","/**\n * `<FormGrid>` — responsive CSS-grid container.\n */\n\nimport type { GridProps } from '@arqel-dev/types/forms';\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport interface FormGridProps {\n config: GridProps;\n children: ReactNode;\n className?: string;\n}\n\nconst BREAKPOINT_PREFIX: Record<string, string> = {\n sm: 'sm:',\n md: 'md:',\n lg: 'lg:',\n xl: 'xl:',\n '2xl': '2xl:',\n};\n\nexport function FormGrid({ config, children, className }: FormGridProps) {\n return (\n <div\n className={cn('grid', gridColsClass(config.columns), className)}\n style={{ gap: config.gap ?? '1rem' }}\n >\n {children}\n </div>\n );\n}\n\n/**\n * Emit responsive Tailwind column classes from a flat int or a\n * `{sm,md,lg,xl,2xl}` map. Mirrors `<DashboardGrid>`'s generator so a\n * `{sm:1, md:2, lg:3}` map genuinely reflows (1 col on mobile → multi-col on\n * desktop) instead of locking to a single inline `grid-template-columns` value.\n */\nfunction gridColsClass(columns: GridProps['columns']): string {\n if (typeof columns === 'number') {\n return `grid-cols-${Math.max(1, Math.min(12, columns))}`;\n }\n // Base fallback = 1 column on the smallest screens.\n const parts: string[] = ['grid-cols-1'];\n for (const bp of ['sm', 'md', 'lg', 'xl', '2xl'] as const) {\n const value = columns[bp];\n if (typeof value === 'number') {\n parts.push(`${BREAKPOINT_PREFIX[bp]}grid-cols-${Math.max(1, Math.min(12, value))}`);\n }\n }\n return parts.join(' ');\n}\n","/**\n * `<FormSection>` — heading + optional description + collapsible body.\n *\n * Renders a SectionEntry. Aside layout (heading on the left, body on the\n * right) ships behind the `aside` prop so wide forms can read like docs.\n */\n\nimport type { SectionProps } from '@arqel-dev/types/forms';\nimport { type ReactNode, useState } from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport interface FormSectionProps {\n config: SectionProps;\n children: ReactNode;\n className?: string;\n}\n\nexport function FormSection({ config, children, className }: FormSectionProps) {\n const [open, setOpen] = useState(!config.collapsed);\n const collapsible = config.collapsible === true;\n\n const heading = (\n <div className=\"flex items-start gap-2\">\n <div className=\"flex-1\">\n <h3 className=\"text-sm font-semibold\">{config.heading}</h3>\n {config.description && (\n <p className=\"text-xs text-muted-foreground\">{config.description}</p>\n )}\n </div>\n {collapsible && (\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => setOpen((v) => !v)}\n className=\"text-sm text-muted-foreground hover:underline\"\n >\n {open ? 'Hide' : 'Show'}\n </button>\n )}\n </div>\n );\n\n const body = open && (\n <div\n className=\"grid gap-4\"\n style={{ gridTemplateColumns: `repeat(${config.columns ?? 1}, minmax(0, 1fr))` }}\n >\n {children}\n </div>\n );\n\n return (\n <section\n data-arqel-section=\"\"\n className={cn(\n 'rounded-md border border-border bg-background',\n config.compact ? 'p-3' : 'p-4',\n className,\n )}\n >\n {config.aside ? (\n <div className=\"grid gap-4 md:grid-cols-[16rem_1fr]\">\n <div>{heading}</div>\n <div>{body}</div>\n </div>\n ) : (\n <>\n <div className=\"mb-3\">{heading}</div>\n {body}\n </>\n )}\n </section>\n );\n}\n","/**\n * `<FormTabs>` — minimal tabs implementation (Phase 1).\n *\n * UI-002+ wires Base UI Tabs primitive properly; this Phase 1 version\n * is keyboard-accessible (Arrow keys + Home/End) but doesn't yet support\n * lazy mounting or controlled mode.\n */\n\nimport type { TabsProps } from '@arqel-dev/types/forms';\nimport { type ReactElement, type ReactNode, useId, useRef, useState } from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport interface FormTabConfig {\n id: string;\n label: string;\n badge?: number | undefined;\n content: ReactNode;\n}\n\nexport interface FormTabsProps {\n config: TabsProps;\n tabs: FormTabConfig[];\n className?: string;\n}\n\nexport function FormTabs({ config, tabs, className }: FormTabsProps): ReactElement | null {\n const [active, setActive] = useState(config.defaultTab ?? tabs[0]?.id ?? null);\n const baseId = useId();\n const refs = useRef<(HTMLButtonElement | null)[]>([]);\n\n if (tabs.length === 0 || active === null) return null;\n const activeIndex = Math.max(\n 0,\n tabs.findIndex((t) => t.id === active),\n );\n const activeTab = tabs[activeIndex];\n if (!activeTab) return null;\n\n const focus = (i: number) => {\n const target = tabs[i];\n if (!target) return;\n setActive(target.id);\n refs.current[i]?.focus();\n };\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === 'ArrowRight') {\n e.preventDefault();\n focus((activeIndex + 1) % tabs.length);\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n focus((activeIndex - 1 + tabs.length) % tabs.length);\n } else if (e.key === 'Home') {\n e.preventDefault();\n focus(0);\n } else if (e.key === 'End') {\n e.preventDefault();\n focus(tabs.length - 1);\n }\n };\n\n return (\n <div className={className}>\n <div\n role=\"tablist\"\n aria-orientation={config.orientation}\n className=\"flex gap-1 border-b border-border\"\n >\n {tabs.map((tab, i) => {\n const selected = tab.id === active;\n return (\n <button\n key={tab.id}\n ref={(el) => {\n refs.current[i] = el;\n }}\n type=\"button\"\n role=\"tab\"\n id={`${baseId}-tab-${tab.id}`}\n aria-controls={`${baseId}-panel-${tab.id}`}\n aria-selected={selected}\n tabIndex={selected ? 0 : -1}\n onClick={() => setActive(tab.id)}\n onKeyDown={onKeyDown}\n className={cn(\n '-mb-px inline-flex min-h-11 items-center border-b-2 px-3 py-2 text-sm transition-colors',\n selected\n ? 'border-primary font-medium text-foreground'\n : 'border-transparent text-muted-foreground hover:text-foreground',\n )}\n >\n {tab.label}\n {tab.badge !== undefined && tab.badge !== null && (\n <span className=\"ml-1 rounded-full bg-muted px-1.5 text-xs\">{tab.badge}</span>\n )}\n </button>\n );\n })}\n </div>\n <div\n role=\"tabpanel\"\n id={`${baseId}-panel-${activeTab.id}`}\n aria-labelledby={`${baseId}-tab-${activeTab.id}`}\n className=\"pt-4\"\n >\n {activeTab.content}\n </div>\n </div>\n );\n}\n","/**\n * `<FormRenderer>` — recursive walker over `FormSchema`.\n *\n * Each `SchemaEntry` dispatches to the matching layout component\n * (`Section`, `Fieldset`, `Grid`, `Tabs`, …) or to `<FieldRenderer>`\n * when it's a leaf. `Tabs` collects child `Tab` entries so the\n * keyboard-accessible `<FormTabs>` can render them as panels.\n *\n * The renderer is *presentational*: state lives in the caller (typically\n * `useArqelForm`). `value(name)` and `setValue(name, value)` resolve\n * field state, while `errors[name]` carries server/client validation\n * messages.\n */\n\nimport type { FieldSchema } from '@arqel-dev/types/fields';\nimport {\n type FieldEntry,\n type FormSchema,\n isFieldEntry,\n isLayoutEntry,\n type LayoutEntry,\n type SchemaEntry,\n type TabEntry,\n} from '@arqel-dev/types/forms';\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn.js';\nimport { FieldRenderer } from './FieldRenderer.js';\nimport { FormFieldset } from './FormFieldset.js';\nimport { FormGrid } from './FormGrid.js';\nimport { FormSection } from './FormSection.js';\nimport { type FormTabConfig, FormTabs } from './FormTabs.js';\n\nexport interface FormRendererProps {\n schema: FormSchema;\n fields: FieldSchema[];\n values: Record<string, unknown>;\n errors?: Record<string, string[]>;\n onChange: (name: string, value: unknown) => void;\n disabled?: boolean;\n className?: string;\n}\n\nexport function FormRenderer({\n schema,\n fields,\n values,\n errors = {},\n onChange,\n disabled = false,\n className,\n}: FormRendererProps) {\n // Resolve each schema entry to its OWN field object. A name-keyed Map\n // would silently collapse two fields sharing a `name` (e.g. a `status`\n // text + a `status` select) onto the last one, dropping a control. We\n // instead consume matching fields positionally — preferring an exact\n // (name, type) match and never reusing an already-claimed field — so\n // duplicate-named entries each render their distinct schema (#233).\n const remaining = [...fields];\n\n const claimField = (entry: FieldEntry): FieldSchema | undefined => {\n let idx = remaining.findIndex((f) => f.name === entry.name && f.type === entry.type);\n if (idx === -1) idx = remaining.findIndex((f) => f.name === entry.name);\n if (idx === -1) return undefined;\n return remaining.splice(idx, 1)[0];\n };\n\n const renderEntry = (entry: SchemaEntry, key: string): ReactNode => {\n if (isFieldEntry(entry)) {\n return renderFieldEntry(entry, key);\n }\n if (isLayoutEntry(entry)) {\n return renderLayoutEntry(entry, key);\n }\n return null;\n };\n\n const renderFieldEntry = (entry: FieldEntry, key: string): ReactNode => {\n const field = claimField(entry);\n if (!field) return null;\n return (\n <FieldRenderer\n key={key}\n field={field}\n value={values[entry.name]}\n errors={errors[entry.name]}\n disabled={disabled || schema.disabled === true}\n onChange={(value) => onChange(entry.name, value)}\n />\n );\n };\n\n const renderChildren = (entries: SchemaEntry[] | undefined): ReactNode => {\n if (!entries) return null;\n return entries.map((child, i) => renderEntry(child, `${i}`));\n };\n\n const renderLayoutEntry = (entry: LayoutEntry, key: string): ReactNode => {\n switch (entry.type) {\n case 'section':\n return (\n <FormSection key={key} config={entry.props}>\n {renderChildren(entry.schema)}\n </FormSection>\n );\n case 'fieldset':\n return (\n <FormFieldset key={key} config={entry.props}>\n {renderChildren(entry.schema)}\n </FormFieldset>\n );\n case 'grid':\n case 'columns':\n return (\n <FormGrid\n key={key}\n config={entry.type === 'columns' ? { columns: entry.props.columns } : entry.props}\n >\n {renderChildren(entry.schema)}\n </FormGrid>\n );\n case 'group':\n return (\n <div\n key={key}\n className={cn(\n 'flex gap-4',\n entry.props.orientation === 'vertical' ? 'flex-col' : 'flex-row',\n )}\n >\n {renderChildren(entry.schema)}\n </div>\n );\n case 'tabs': {\n const tabs: FormTabConfig[] = (entry.schema ?? [])\n .filter((c): c is TabEntry => isLayoutEntry(c) && c.type === 'tab')\n .map((tab) => ({\n id: tab.props.id,\n label: tab.props.label,\n badge: tab.props.badge,\n content: renderChildren(tab.schema) ?? <span key={`tab-${tab.props.id}-empty`} />,\n }));\n return <FormTabs key={key} config={entry.props} tabs={tabs} />;\n }\n case 'tab':\n // Tabs collect their children directly; lone Tab entries are\n // a no-op to avoid rendering the same content twice.\n return null;\n }\n };\n\n const columns = schema.columns ?? 1;\n\n return (\n <div\n data-arqel-form=\"\"\n className={cn('grid gap-4', className)}\n style={\n columns > 1 ? { gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` } : undefined\n }\n >\n {schema.schema.map((entry, i) => renderEntry(entry, `${i}`))}\n </div>\n );\n}\n"]}
|
package/dist/form.d.ts
CHANGED
|
@@ -56,6 +56,6 @@ interface NativeProps {
|
|
|
56
56
|
inputId?: string | undefined;
|
|
57
57
|
describedBy?: string | undefined;
|
|
58
58
|
}
|
|
59
|
-
declare function NativeFieldInput(props: NativeProps): react_jsx_runtime.JSX.Element
|
|
59
|
+
declare function NativeFieldInput(props: NativeProps): react_jsx_runtime.JSX.Element;
|
|
60
60
|
|
|
61
61
|
export { FormFieldset, type FormFieldsetProps, FormGrid, type FormGridProps, FormSection, type FormSectionProps, type FormTabConfig, FormTabs, type FormTabsProps, NativeFieldInput };
|
package/dist/form.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { FormActions } from './chunk-
|
|
2
|
-
export { FieldRenderer, FormFieldset, FormGrid, FormRenderer, FormSection, FormTabs, NativeFieldInput, clearFieldRegistry, getFieldComponent, getRegisteredFields, registerField, unregisterField } from './chunk-
|
|
3
|
-
import './chunk-
|
|
1
|
+
export { FormActions } from './chunk-MZMYV43C.js';
|
|
2
|
+
export { FieldRenderer, FormFieldset, FormGrid, FormRenderer, FormSection, FormTabs, NativeFieldInput, clearFieldRegistry, getFieldComponent, getRegisteredFields, registerField, unregisterField } from './chunk-ZAM5TUPP.js';
|
|
3
|
+
import './chunk-H23VX3RR.js';
|
|
4
4
|
import './chunk-B7ULUJVO.js';
|
|
5
5
|
//# sourceMappingURL=form.js.map
|
|
6
6
|
//# sourceMappingURL=form.js.map
|
package/dist/index.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
export { Breadcrumbs, EmptyState, ErrorState, LoadingSkeleton } from './chunk-MTNFFSVA.js';
|
|
2
|
-
export { StatCard, WidgetWrapper } from './chunk-
|
|
2
|
+
export { StatCard, WidgetWrapper } from './chunk-PSPJA5U6.js';
|
|
3
3
|
export { Alert, AlertDescription, AlertTitle, Badge, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle, Label, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue, Textarea, badgeVariants } from './chunk-K7QY56XN.js';
|
|
4
4
|
export { PageHeader } from './chunk-MXUXMHOK.js';
|
|
5
|
-
export { AppShell, Footer, MainContent, Sidebar, Topbar } from './chunk-
|
|
5
|
+
export { AppShell, Footer, MainContent, Sidebar, Topbar } from './chunk-N5U2BB6T.js';
|
|
6
6
|
export { CommandPalette } from './chunk-FV7RESKL.js';
|
|
7
7
|
export { Input, Separator, Skeleton } from './chunk-R4BOUU6Y.js';
|
|
8
|
-
export { ResourceIndex } from './chunk-
|
|
9
|
-
export { DataTable, TableFilters, TablePagination, TableToolbar } from './chunk-
|
|
8
|
+
export { ResourceIndex } from './chunk-CVAMCRLL.js';
|
|
9
|
+
export { DataTable, TableFilters, TablePagination, TableToolbar } from './chunk-AZICSFBA.js';
|
|
10
10
|
import './chunk-RMPOR2YZ.js';
|
|
11
|
-
export { ActionButton, ActionFormModal, ActionMenu, ConfirmDialog } from './chunk-
|
|
12
|
-
import './chunk-
|
|
13
|
-
export { FormActions } from './chunk-
|
|
14
|
-
export { FieldRenderer, FormRenderer, clearFieldRegistry, getFieldComponent, registerField } from './chunk-
|
|
15
|
-
export { Button, buttonVariants } from './chunk-
|
|
11
|
+
export { ActionButton, ActionFormModal, ActionMenu, ConfirmDialog } from './chunk-FP5R6WED.js';
|
|
12
|
+
import './chunk-3HN4ARGG.js';
|
|
13
|
+
export { FormActions } from './chunk-MZMYV43C.js';
|
|
14
|
+
export { FieldRenderer, FormRenderer, clearFieldRegistry, getFieldComponent, registerField } from './chunk-ZAM5TUPP.js';
|
|
15
|
+
export { Button, buttonVariants } from './chunk-H23VX3RR.js';
|
|
16
16
|
export { CanAccess } from './chunk-RNAMHQM6.js';
|
|
17
17
|
export { FlashContainer, FlashToast } from './chunk-DSULVRB6.js';
|
|
18
18
|
export { cn } from './chunk-B7ULUJVO.js';
|
package/dist/pages.js
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
export { ArqelShowPage } from './chunk-
|
|
2
|
-
export { ArqelDashboardPage } from './chunk-
|
|
3
|
-
export { ArqelEditPage } from './chunk-
|
|
4
|
-
export { ArqelIndexPage } from './chunk-
|
|
5
|
-
import './chunk-
|
|
6
|
-
export { ArqelCreatePage } from './chunk-
|
|
7
|
-
import './chunk-
|
|
1
|
+
export { ArqelShowPage } from './chunk-N6WLCHQE.js';
|
|
2
|
+
export { ArqelDashboardPage } from './chunk-BJER6TOI.js';
|
|
3
|
+
export { ArqelEditPage } from './chunk-UXN67E5L.js';
|
|
4
|
+
export { ArqelIndexPage } from './chunk-4I5S6MH3.js';
|
|
5
|
+
import './chunk-HSDZM4AM.js';
|
|
6
|
+
export { ArqelCreatePage } from './chunk-37FLEB4N.js';
|
|
7
|
+
import './chunk-PSPJA5U6.js';
|
|
8
8
|
import './chunk-MXUXMHOK.js';
|
|
9
|
-
import './chunk-
|
|
10
|
-
import './chunk-
|
|
9
|
+
import './chunk-CVAMCRLL.js';
|
|
10
|
+
import './chunk-AZICSFBA.js';
|
|
11
11
|
import './chunk-RMPOR2YZ.js';
|
|
12
|
-
import './chunk-
|
|
13
|
-
import './chunk-
|
|
14
|
-
import './chunk-
|
|
15
|
-
import './chunk-
|
|
16
|
-
import './chunk-
|
|
12
|
+
import './chunk-FP5R6WED.js';
|
|
13
|
+
import './chunk-3HN4ARGG.js';
|
|
14
|
+
import './chunk-MZMYV43C.js';
|
|
15
|
+
import './chunk-ZAM5TUPP.js';
|
|
16
|
+
import './chunk-H23VX3RR.js';
|
|
17
17
|
import './chunk-B7ULUJVO.js';
|
|
18
18
|
|
|
19
19
|
// src/pages/index.ts
|
|
20
20
|
var arqelPages = {
|
|
21
|
-
"arqel::index": () => import('./ArqelIndexPage-
|
|
22
|
-
"arqel::create": () => import('./ArqelCreatePage-
|
|
23
|
-
"arqel::edit": () => import('./ArqelEditPage-
|
|
24
|
-
"arqel::show": () => import('./ArqelShowPage-
|
|
25
|
-
"arqel::dashboard": () => import('./ArqelDashboardPage-
|
|
21
|
+
"arqel::index": () => import('./ArqelIndexPage-R6JL5KOH.js'),
|
|
22
|
+
"arqel::create": () => import('./ArqelCreatePage-MV4JN2MO.js'),
|
|
23
|
+
"arqel::edit": () => import('./ArqelEditPage-7J3IS2BR.js'),
|
|
24
|
+
"arqel::show": () => import('./ArqelShowPage-5WWUSYC7.js'),
|
|
25
|
+
"arqel::dashboard": () => import('./ArqelDashboardPage-QK3BYVK3.js')
|
|
26
26
|
};
|
|
27
27
|
|
|
28
28
|
export { arqelPages };
|
package/dist/resource.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { ResourceIndex } from './chunk-
|
|
2
|
-
import './chunk-
|
|
1
|
+
export { ResourceIndex } from './chunk-CVAMCRLL.js';
|
|
2
|
+
import './chunk-AZICSFBA.js';
|
|
3
3
|
import './chunk-RMPOR2YZ.js';
|
|
4
|
-
import './chunk-
|
|
4
|
+
import './chunk-H23VX3RR.js';
|
|
5
5
|
import './chunk-B7ULUJVO.js';
|
|
6
6
|
//# sourceMappingURL=resource.js.map
|
|
7
7
|
//# sourceMappingURL=resource.js.map
|
package/dist/shell.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export { AppShell, Footer, MainContent, Sidebar, Topbar } from './chunk-
|
|
1
|
+
export { AppShell, Footer, MainContent, Sidebar, Topbar } from './chunk-N5U2BB6T.js';
|
|
2
2
|
import './chunk-FV7RESKL.js';
|
|
3
3
|
import './chunk-R4BOUU6Y.js';
|
|
4
4
|
import './chunk-RMPOR2YZ.js';
|
|
5
|
-
import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem } from './chunk-
|
|
6
|
-
import { Button } from './chunk-
|
|
5
|
+
import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem } from './chunk-3HN4ARGG.js';
|
|
6
|
+
import { Button } from './chunk-H23VX3RR.js';
|
|
7
7
|
import './chunk-B7ULUJVO.js';
|
|
8
8
|
import { router } from '@inertiajs/react';
|
|
9
9
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
package/dist/table.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { DataTable, TableCell, TableFilters, TablePagination, TableToolbar } from './chunk-
|
|
1
|
+
export { DataTable, TableCell, TableFilters, TablePagination, TableToolbar } from './chunk-AZICSFBA.js';
|
|
2
2
|
import './chunk-RMPOR2YZ.js';
|
|
3
|
-
import './chunk-
|
|
3
|
+
import './chunk-H23VX3RR.js';
|
|
4
4
|
import './chunk-B7ULUJVO.js';
|
|
5
5
|
//# sourceMappingURL=table.js.map
|
|
6
6
|
//# sourceMappingURL=table.js.map
|
package/dist/widgets.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { ChartCard, DashboardFilters, DashboardGrid, TableCard, WidgetRenderer } from './chunk-
|
|
2
|
-
export { StatCard, WidgetWrapper } from './chunk-
|
|
1
|
+
export { ChartCard, DashboardFilters, DashboardGrid, TableCard, WidgetRenderer } from './chunk-HSDZM4AM.js';
|
|
2
|
+
export { StatCard, WidgetWrapper } from './chunk-PSPJA5U6.js';
|
|
3
3
|
import './chunk-B7ULUJVO.js';
|
|
4
4
|
//# sourceMappingURL=widgets.js.map
|
|
5
5
|
//# sourceMappingURL=widgets.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@arqel-dev/ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.0",
|
|
4
4
|
"description": "Structural React components (AppShell, DataTable, FormRenderer, etc.) for Arqel admin panels.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://arqel.dev",
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
"clsx": "^2.1.1",
|
|
93
93
|
"radix-ui": "^1.4.3",
|
|
94
94
|
"tailwind-merge": "^2.5.5",
|
|
95
|
-
"@arqel-dev/types": "0.
|
|
95
|
+
"@arqel-dev/types": "0.15.0"
|
|
96
96
|
},
|
|
97
97
|
"peerDependencies": {
|
|
98
98
|
"@inertiajs/react": "^3.0.0",
|
|
@@ -102,8 +102,8 @@
|
|
|
102
102
|
"react-dom": "^19.2.0",
|
|
103
103
|
"recharts": "^2.15.0",
|
|
104
104
|
"tailwindcss": "^4.0.0",
|
|
105
|
-
"@arqel-dev/hooks": "0.
|
|
106
|
-
"@arqel-dev/react": "0.
|
|
105
|
+
"@arqel-dev/hooks": "0.15.0",
|
|
106
|
+
"@arqel-dev/react": "0.15.0"
|
|
107
107
|
},
|
|
108
108
|
"devDependencies": {
|
|
109
109
|
"@base-ui-components/react": "^1.0.0-alpha.0",
|
|
@@ -125,8 +125,8 @@
|
|
|
125
125
|
"tsup": "^8.5.0",
|
|
126
126
|
"typescript": "^5.6.3",
|
|
127
127
|
"vitest": "^4.1.0",
|
|
128
|
-
"@arqel-dev/hooks": "0.
|
|
129
|
-
"@arqel-dev/react": "0.
|
|
128
|
+
"@arqel-dev/hooks": "0.15.0",
|
|
129
|
+
"@arqel-dev/react": "0.15.0"
|
|
130
130
|
},
|
|
131
131
|
"publishConfig": {
|
|
132
132
|
"access": "public"
|
package/src/styles/globals.css
CHANGED
|
@@ -13,6 +13,13 @@
|
|
|
13
13
|
|
|
14
14
|
@import 'tailwindcss';
|
|
15
15
|
|
|
16
|
+
/* Safelist the responsive grid-column utilities that FormGrid/DashboardGrid
|
|
17
|
+
* generate at runtime (e.g. `lg:grid-cols-3`). Because those class strings are
|
|
18
|
+
* built by concatenation, Tailwind's content scanner never sees the literals,
|
|
19
|
+
* so without this they'd be purged. The 1–12 range matches gridColsClass()'s
|
|
20
|
+
* Math.min(12, n) clamp. */
|
|
21
|
+
@source inline("{,sm:,md:,lg:,xl:,2xl:}grid-cols-{1,2,3,4,5,6,7,8,9,10,11,12}");
|
|
22
|
+
|
|
16
23
|
@custom-variant dark (&:is(.dark *));
|
|
17
24
|
|
|
18
25
|
:root {
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export { ArqelCreatePage as default } from './chunk-VSTRVXXZ.js';
|
|
2
|
-
import './chunk-MXUXMHOK.js';
|
|
3
|
-
import './chunk-MTZJDFQ6.js';
|
|
4
|
-
import './chunk-MSRTGCTJ.js';
|
|
5
|
-
import './chunk-FHRQ7PWE.js';
|
|
6
|
-
import './chunk-B7ULUJVO.js';
|
|
7
|
-
//# sourceMappingURL=ArqelCreatePage-P3G6TKIK.js.map
|
|
8
|
-
//# sourceMappingURL=ArqelCreatePage-P3G6TKIK.js.map
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export { ArqelDashboardPage as default } from './chunk-PXON56HL.js';
|
|
2
|
-
import './chunk-47HD7ALI.js';
|
|
3
|
-
import './chunk-WKWV36PG.js';
|
|
4
|
-
import './chunk-B7ULUJVO.js';
|
|
5
|
-
//# sourceMappingURL=ArqelDashboardPage-PX3Y75AA.js.map
|
|
6
|
-
//# sourceMappingURL=ArqelDashboardPage-PX3Y75AA.js.map
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export { ArqelEditPage as default } from './chunk-3JJOHYD7.js';
|
|
2
|
-
import './chunk-MXUXMHOK.js';
|
|
3
|
-
import './chunk-MTZJDFQ6.js';
|
|
4
|
-
import './chunk-MSRTGCTJ.js';
|
|
5
|
-
import './chunk-FHRQ7PWE.js';
|
|
6
|
-
import './chunk-B7ULUJVO.js';
|
|
7
|
-
//# sourceMappingURL=ArqelEditPage-HKQSE6E5.js.map
|
|
8
|
-
//# sourceMappingURL=ArqelEditPage-HKQSE6E5.js.map
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export { ArqelIndexPage as default } from './chunk-ERT7LL6C.js';
|
|
2
|
-
import './chunk-2LTZJ4R7.js';
|
|
3
|
-
import './chunk-PZEVKMZX.js';
|
|
4
|
-
import './chunk-RMPOR2YZ.js';
|
|
5
|
-
import './chunk-TNJEHYRF.js';
|
|
6
|
-
import './chunk-EYAUPJ6J.js';
|
|
7
|
-
import './chunk-MTZJDFQ6.js';
|
|
8
|
-
import './chunk-MSRTGCTJ.js';
|
|
9
|
-
import './chunk-FHRQ7PWE.js';
|
|
10
|
-
import './chunk-B7ULUJVO.js';
|
|
11
|
-
//# sourceMappingURL=ArqelIndexPage-MRH3572Z.js.map
|
|
12
|
-
//# sourceMappingURL=ArqelIndexPage-MRH3572Z.js.map
|