@arbidocs/blocks 0.5.22 → 0.5.24
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/{WorkspaceTableView-6JVHGDUB.cjs → WorkspaceTableView-GIDGNGBW.cjs} +6 -6
- package/dist/{WorkspaceTableView-6JVHGDUB.cjs.map → WorkspaceTableView-GIDGNGBW.cjs.map} +1 -1
- package/dist/{WorkspaceTableView-ECPHGWHF.js → WorkspaceTableView-S2PTTVHL.js} +4 -4
- package/dist/{WorkspaceTableView-ECPHGWHF.js.map → WorkspaceTableView-S2PTTVHL.js.map} +1 -1
- package/dist/auth/index.cjs +47 -47
- package/dist/auth/index.js +2 -2
- package/dist/{chunk-7DDMF3DZ.cjs → chunk-53T2FY4Z.cjs} +5 -31
- package/dist/chunk-53T2FY4Z.cjs.map +1 -0
- package/dist/chunk-5ZBXFHZW.js +434 -0
- package/dist/chunk-5ZBXFHZW.js.map +1 -0
- package/dist/{chunk-K237IYOD.cjs → chunk-BYJUI4AT.cjs} +54 -2
- package/dist/chunk-BYJUI4AT.cjs.map +1 -0
- package/dist/{chunk-O4EQYPLO.cjs → chunk-C2SZQKX2.cjs} +169 -27
- package/dist/chunk-C2SZQKX2.cjs.map +1 -0
- package/dist/{chunk-MSPNYW6Z.cjs → chunk-DTLVC6MN.cjs} +2 -53
- package/dist/chunk-DTLVC6MN.cjs.map +1 -0
- package/dist/{chunk-RVKVGS72.js → chunk-FDUQQNDT.js} +2 -2
- package/dist/{chunk-RVKVGS72.js.map → chunk-FDUQQNDT.js.map} +1 -1
- package/dist/{chunk-TTJGCJWX.cjs → chunk-H3XAHVDT.cjs} +42 -2
- package/dist/chunk-H3XAHVDT.cjs.map +1 -0
- package/dist/{chunk-XL55UDLO.js → chunk-IJJKUTKM.js} +5 -30
- package/dist/chunk-IJJKUTKM.js.map +1 -0
- package/dist/{chunk-ZX663X3X.cjs → chunk-KNRAKOCO.cjs} +6 -428
- package/dist/chunk-KNRAKOCO.cjs.map +1 -0
- package/dist/chunk-KUQOHPKP.cjs +443 -0
- package/dist/chunk-KUQOHPKP.cjs.map +1 -0
- package/dist/{chunk-F2BYURQZ.cjs → chunk-LYF47OXX.cjs} +5 -5
- package/dist/{chunk-F2BYURQZ.cjs.map → chunk-LYF47OXX.cjs.map} +1 -1
- package/dist/{chunk-PZRTRYPD.js → chunk-MKTEVOC3.js} +44 -5
- package/dist/chunk-MKTEVOC3.js.map +1 -0
- package/dist/{chunk-6XW3CMU4.js → chunk-N3KNAQ55.js} +144 -4
- package/dist/chunk-N3KNAQ55.js.map +1 -0
- package/dist/{chunk-KL6XOSEN.js → chunk-PLAGIVFF.js} +4 -52
- package/dist/chunk-PLAGIVFF.js.map +1 -0
- package/dist/{chunk-FZVAJFRH.cjs → chunk-RHKFCSFC.cjs} +2 -2
- package/dist/{chunk-FZVAJFRH.cjs.map → chunk-RHKFCSFC.cjs.map} +1 -1
- package/dist/{chunk-NVRJ6WTR.js → chunk-RTAYJUQM.js} +3 -3
- package/dist/{chunk-NVRJ6WTR.js.map → chunk-RTAYJUQM.js.map} +1 -1
- package/dist/{chunk-IXBJEQH5.js → chunk-VN4FSGBR.js} +53 -4
- package/dist/chunk-VN4FSGBR.js.map +1 -0
- package/dist/{chunk-SLRVI2YU.js → chunk-X6U6L6BG.js} +29 -4
- package/dist/chunk-X6U6L6BG.js.map +1 -0
- package/dist/{chunk-SQ5F5BFW.cjs → chunk-XDU3HHUU.cjs} +32 -6
- package/dist/chunk-XDU3HHUU.cjs.map +1 -0
- package/dist/{chunk-SKVVOEMX.js → chunk-XXUPUXBF.js} +8 -423
- package/dist/chunk-XXUPUXBF.js.map +1 -0
- package/dist/connect/index.cjs +1203 -624
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.js +770 -197
- package/dist/connect/index.js.map +1 -1
- package/dist/connection/auth/CompactLogin.d.ts +26 -0
- package/dist/connection/auth/ConnectedLoginPage.d.ts +9 -1
- package/dist/connection/auth/index.d.ts +3 -1
- package/dist/connection/auth/sso-popup.d.ts +13 -0
- package/dist/connection/auth/sso-sign-in.d.ts +38 -0
- package/dist/connection/auth/support.d.ts +17 -0
- package/dist/connection/auth/useLoginActions.d.ts +9 -2
- package/dist/connection/billing/ConnectedQuotaDialog.d.ts +5 -13
- package/dist/connection/billing/index.d.ts +1 -1
- package/dist/connection/connectors/ConnectedSharePointAdminConsentPage.d.ts +26 -0
- package/dist/connection/connectors/index.d.ts +1 -0
- package/dist/connection/projects/ConnectedProjectsPanel.d.ts +9 -1
- package/dist/connection/projects/ProjectsListPage.d.ts +40 -0
- package/dist/connection/projects/index.d.ts +1 -0
- package/dist/connection/settings-page/ConnectedAccountSettings.d.ts +2 -1
- package/dist/connection/settings-page/ConnectedBoxPortalSection.d.ts +6 -0
- package/dist/connection/settings-page/appearanceSection.d.ts +30 -0
- package/dist/connection/settings-page/index.d.ts +1 -0
- package/dist/index.cjs +209 -237
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +11 -50
- package/dist/index.js.map +1 -1
- package/dist/settings/AppearanceSettings.d.ts +1 -2
- package/dist/settings/index.cjs +153 -153
- package/dist/settings/index.d.ts +2 -1
- package/dist/settings/index.js +1 -1
- package/dist/site/index.cjs +82 -74
- package/dist/site/index.d.ts +2 -0
- package/dist/site/index.js +3 -3
- package/dist/studio/index.cjs +73 -73
- package/dist/studio/index.js +5 -5
- package/dist/theme/appearance.d.ts +47 -0
- package/dist/theme/fromCss.d.ts +33 -0
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/dist/chunk-6XW3CMU4.js.map +0 -1
- package/dist/chunk-7DDMF3DZ.cjs.map +0 -1
- package/dist/chunk-AMTWY22T.js +0 -11
- package/dist/chunk-AMTWY22T.js.map +0 -1
- package/dist/chunk-IXBJEQH5.js.map +0 -1
- package/dist/chunk-K237IYOD.cjs.map +0 -1
- package/dist/chunk-KL6XOSEN.js.map +0 -1
- package/dist/chunk-MSPNYW6Z.cjs.map +0 -1
- package/dist/chunk-O4EQYPLO.cjs.map +0 -1
- package/dist/chunk-PZRTRYPD.js.map +0 -1
- package/dist/chunk-SKVVOEMX.js.map +0 -1
- package/dist/chunk-SLRVI2YU.js.map +0 -1
- package/dist/chunk-SQ5F5BFW.cjs.map +0 -1
- package/dist/chunk-TTJGCJWX.cjs.map +0 -1
- package/dist/chunk-XL55UDLO.js.map +0 -1
- package/dist/chunk-ZU2B2RZK.cjs +0 -13
- package/dist/chunk-ZU2B2RZK.cjs.map +0 -1
- package/dist/chunk-ZX663X3X.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/DataTableBlock.tsx","../src/components/MetricCard.tsx","../src/components/StatGroup.tsx"],"names":["jsxs","jsx","cn"],"mappings":"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","file":"chunk-IJJKUTKM.js","sourcesContent":["/**\n * A **serializable** data table for the Puck builder.\n *\n * The library's developer-facing {@link DataTable} is driven by `Column<T>` whose\n * `header`/`render` are React nodes and functions — powerful, but non-serializable,\n * so it can never be a Puck block. `DataTableBlock` closes that gap with a flat,\n * JSON-safe schema (string headers, string field keys, string cells) and rebuilds\n * the non-serializable `Column<Row>[]` internally, rendering through the very same\n * {@link DataTable} so it inherits the library's markup and tokens verbatim.\n */\nimport { DataTable, type Column } from './DataTable'\n\nexport interface DataTableBlockColumn {\n /** Column heading text. */\n header: string\n /** Key used to look a cell up in each row record. */\n field: string\n /** Cell/heading alignment. */\n align?: 'left' | 'right' | 'center'\n}\n\nexport interface DataTableBlockProps {\n /** Serializable column schema. */\n columns: DataTableBlockColumn[]\n /** One record per row; cells are looked up by each column's `field`. */\n rows: Array<Record<string, string>>\n /** Optional caption rendered above the table. */\n caption?: string\n /** Empty-state title shown when there are no rows. */\n emptyText?: string\n /** testid area prefix; also set on the wrapper element. */\n testId?: string\n}\n\n/** A row wrapper so {@link DataTable} gets a stable id without polluting the record. */\ninterface TableRowData {\n __id: string\n cells: Record<string, string>\n}\n\n/**\n * Renders a {@link DataTable} from a flat, serializable schema. Columns are mapped\n * to `Column<TableRowData>[]` (header string, positional-stable key, alignment) and\n * each cell is resolved by `field`; rows carry a synthetic id for React keys/testids.\n */\nexport function DataTableBlock({ columns, rows, caption, emptyText, testId }: DataTableBlockProps) {\n const area = testId ?? 'data-table-block'\n\n const tableColumns: Column<TableRowData>[] = columns.map((col, index) => ({\n key: col.field || `col-${index}`,\n header: col.header,\n align: col.align,\n render: (row) => row.cells[col.field] ?? '',\n }))\n\n const tableRows: TableRowData[] = rows.map((cells, index) => ({ __id: String(index), cells }))\n\n return (\n <div data-testid={testId}>\n {caption ? (\n <p\n className=\"mb-2 text-sm text-muted-foreground\"\n data-testid={testId ? `${testId}-caption` : undefined}\n >\n {caption}\n </p>\n ) : null}\n <DataTable\n columns={tableColumns}\n rows={tableRows}\n getRowId={(row) => row.__id}\n area={area}\n emptyTitle={emptyText}\n />\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { ArrowDownRight, ArrowUpRight } from 'lucide-react'\nimport { Card, cn } from '@arbidocs/react/ui'\nimport { ActionLink } from './ActionLink'\n\nexport interface MetricCardProps {\n label: ReactNode\n value: ReactNode\n icon?: LucideIcon\n hint?: ReactNode\n delta?: { value: string; direction: 'up' | 'down'; good?: boolean }\n /**\n * Icon accent as a theme colour-token key (e.g. `primary`, `success`, or the host's own brand\n * token). Resolved to `var(--color-<accent>)` at render. `'default'` inherits `foreground`.\n */\n accent?: string\n /** Show a placeholder instead of the value (the figure is still being fetched). */\n isLoading?: boolean\n /** Makes the tile a real link (ctrl/cmd-click works). */\n href?: string\n /** Click handler; with `href`, a plain click calls it instead of navigating. */\n onSelect?: () => void\n className?: string\n testId?: string\n}\n\n/** The one true KPI tile. Used across every dashboard and module header. */\nexport function MetricCard({\n label,\n value,\n icon: Icon,\n hint,\n delta,\n accent = 'default',\n isLoading = false,\n href,\n onSelect,\n className,\n testId,\n}: MetricCardProps) {\n const accentStyle =\n accent && accent !== 'default' ? { color: `var(--color-${accent})` } : undefined\n const deltaGood = delta?.good ?? delta?.direction === 'up'\n const isInteractive = Boolean(href || onSelect)\n const card = (\n <Card\n variant=\"elevated\"\n className={cn('card-hover min-w-0 rounded-xl p-5', className)}\n data-testid={isInteractive ? undefined : testId}\n aria-busy={isLoading || undefined}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <p className=\"min-w-0 text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {label}\n </p>\n {Icon && <Icon className=\"size-4 shrink-0\" style={accentStyle} />}\n </div>\n {isLoading ? (\n <div\n className=\"mt-2 h-8 w-20 animate-pulse rounded bg-muted\"\n data-slot=\"metric-card-skeleton\"\n />\n ) : (\n <p\n className=\"mt-2 font-display text-2xl font-semibold tracking-tight [overflow-wrap:anywhere]\"\n data-testid={testId && `${testId}-value`}\n >\n {value}\n </p>\n )}\n <div className=\"mt-1 flex items-center gap-2\">\n {delta && !isLoading && (\n <span\n className={cn(\n 'inline-flex items-center gap-0.5 text-xs font-medium',\n deltaGood ? 'text-success' : 'text-destructive'\n )}\n >\n {delta.direction === 'up' ? (\n <ArrowUpRight className=\"size-3\" />\n ) : (\n <ArrowDownRight className=\"size-3\" />\n )}\n {delta.value}\n </span>\n )}\n {hint && <span className=\"text-xs text-muted-foreground\">{hint}</span>}\n </div>\n </Card>\n )\n if (!isInteractive) return card\n return (\n <ActionLink\n href={href}\n onSelect={onSelect}\n className=\"block rounded-xl text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n data-testid={testId}\n >\n {card}\n </ActionLink>\n )\n}\n","import { cn } from '@arbidocs/react/ui'\n\nexport interface StatItem {\n value: string\n label: string\n /** Optional caption under the label (e.g. a qualifier or unit). */\n sub?: string\n}\n\nexport interface StatGroupProps {\n items: StatItem[]\n testId?: string\n}\n\nconst GRID: Record<number, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-2',\n 3: 'grid-cols-2 sm:grid-cols-3',\n 4: 'grid-cols-2 lg:grid-cols-4',\n}\n\n/** Big-number stat group — headline metrics with captions. */\nexport function StatGroup({ items, testId }: StatGroupProps) {\n const list = items ?? []\n const cols = GRID[Math.min(list.length, 4)] ?? GRID[4]\n return (\n <dl className={cn('grid gap-8', cols)} data-testid={testId}>\n {list.map((item, i) => (\n <div key={i} className=\"min-w-0 text-center\" data-testid={testId && `${testId}-item-${i}`}>\n <dt className=\"sr-only\">{item.label}</dt>\n <dd className=\"text-4xl font-semibold tracking-tight [overflow-wrap:anywhere] sm:text-5xl\">\n {item.value}\n </dd>\n <p className=\"mt-2 text-sm text-muted-foreground\">{item.label}</p>\n {item.sub && <p className=\"mt-1 text-xs text-muted-foreground/80\">{item.sub}</p>}\n </div>\n ))}\n </dl>\n )\n}\n"]}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
+
var chunkKUQOHPKP_cjs = require('./chunk-KUQOHPKP.cjs');
|
|
4
5
|
var chunkNWNVWO6L_cjs = require('./chunk-NWNVWO6L.cjs');
|
|
5
6
|
var chunkUFEXJIEY_cjs = require('./chunk-UFEXJIEY.cjs');
|
|
6
7
|
var zustand = require('zustand');
|
|
7
8
|
var middleware = require('zustand/middleware');
|
|
8
|
-
var react = require('react');
|
|
9
|
-
var lucideReact = require('lucide-react');
|
|
10
9
|
var ui = require('@arbidocs/react/ui');
|
|
11
10
|
var jsxRuntime = require('react/jsx-runtime');
|
|
11
|
+
var react = require('react');
|
|
12
|
+
var lucideReact = require('lucide-react');
|
|
12
13
|
var TabsPrimitive = require('@radix-ui/react-tabs');
|
|
13
14
|
|
|
14
15
|
function _interopNamespace(e) {
|
|
@@ -31,134 +32,6 @@ function _interopNamespace(e) {
|
|
|
31
32
|
|
|
32
33
|
var TabsPrimitive__namespace = /*#__PURE__*/_interopNamespace(TabsPrimitive);
|
|
33
34
|
|
|
34
|
-
// src/theme/tokens.ts
|
|
35
|
-
var THEME_STYLE_ID = "arbi-theme-vars";
|
|
36
|
-
var TRIPLET_RE = /^-?\d+(?:\.\d+)?\s+-?\d+(?:\.\d+)?%\s+-?\d+(?:\.\d+)?%$/;
|
|
37
|
-
function parseRgb(color) {
|
|
38
|
-
if (color.startsWith("#")) {
|
|
39
|
-
let hex = color.slice(1);
|
|
40
|
-
if (hex.length === 3) {
|
|
41
|
-
hex = hex.split("").map((ch) => ch + ch).join("");
|
|
42
|
-
}
|
|
43
|
-
if (hex.length === 6 && /^[0-9a-fA-F]{6}$/.test(hex)) {
|
|
44
|
-
return {
|
|
45
|
-
r: parseInt(hex.slice(0, 2), 16),
|
|
46
|
-
g: parseInt(hex.slice(2, 4), 16),
|
|
47
|
-
b: parseInt(hex.slice(4, 6), 16)
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
return null;
|
|
51
|
-
}
|
|
52
|
-
const m = color.match(/^rgba?\(\s*([\d.]+)[\s,]+([\d.]+)[\s,]+([\d.]+)/i);
|
|
53
|
-
if (m) return { r: Number(m[1]), g: Number(m[2]), b: Number(m[3]) };
|
|
54
|
-
return null;
|
|
55
|
-
}
|
|
56
|
-
function rgbToHslTriplet(r, g, b) {
|
|
57
|
-
const rn = r / 255;
|
|
58
|
-
const gn = g / 255;
|
|
59
|
-
const bn = b / 255;
|
|
60
|
-
const max = Math.max(rn, gn, bn);
|
|
61
|
-
const min = Math.min(rn, gn, bn);
|
|
62
|
-
const l = (max + min) / 2;
|
|
63
|
-
const d = max - min;
|
|
64
|
-
let h = 0;
|
|
65
|
-
let s = 0;
|
|
66
|
-
if (d !== 0) {
|
|
67
|
-
s = d / (1 - Math.abs(2 * l - 1));
|
|
68
|
-
switch (max) {
|
|
69
|
-
case rn:
|
|
70
|
-
h = 60 * ((gn - bn) / d % 6);
|
|
71
|
-
break;
|
|
72
|
-
case gn:
|
|
73
|
-
h = 60 * ((bn - rn) / d + 2);
|
|
74
|
-
break;
|
|
75
|
-
default:
|
|
76
|
-
h = 60 * ((rn - gn) / d + 4);
|
|
77
|
-
break;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
if (h < 0) h += 360;
|
|
81
|
-
return `${Math.round(h)} ${Math.round(s * 100)}% ${Math.round(l * 100)}%`;
|
|
82
|
-
}
|
|
83
|
-
function toHslTriplet(color) {
|
|
84
|
-
const c = color.trim();
|
|
85
|
-
if (TRIPLET_RE.test(c)) return c;
|
|
86
|
-
const rgb = parseRgb(c);
|
|
87
|
-
if (!rgb) return c;
|
|
88
|
-
return rgbToHslTriplet(rgb.r, rgb.g, rgb.b);
|
|
89
|
-
}
|
|
90
|
-
function renderTripletBlock(colors) {
|
|
91
|
-
return Object.entries(colors).map(([key, value]) => ` --${key}: ${toHslTriplet(value)};`).join("\n");
|
|
92
|
-
}
|
|
93
|
-
function emitCssVars(theme, dark) {
|
|
94
|
-
if (typeof document === "undefined") return;
|
|
95
|
-
const meta = [
|
|
96
|
-
` --font-display: ${theme.fonts.display};`,
|
|
97
|
-
` --font-sans: ${theme.fonts.sans};`,
|
|
98
|
-
` --radius: ${theme.radius}rem;`
|
|
99
|
-
].join("\n");
|
|
100
|
-
let css = `:root {
|
|
101
|
-
${renderTripletBlock(theme.colors)}
|
|
102
|
-
${meta}
|
|
103
|
-
}`;
|
|
104
|
-
if (dark) {
|
|
105
|
-
css += `
|
|
106
|
-
:root.dark {
|
|
107
|
-
${renderTripletBlock(dark)}
|
|
108
|
-
}`;
|
|
109
|
-
}
|
|
110
|
-
let style = document.getElementById(THEME_STYLE_ID);
|
|
111
|
-
if (!style) {
|
|
112
|
-
style = document.createElement("style");
|
|
113
|
-
style.id = THEME_STYLE_ID;
|
|
114
|
-
document.head.appendChild(style);
|
|
115
|
-
}
|
|
116
|
-
style.textContent = css;
|
|
117
|
-
}
|
|
118
|
-
function removeCssVars() {
|
|
119
|
-
if (typeof document === "undefined") return;
|
|
120
|
-
document.getElementById(THEME_STYLE_ID)?.remove();
|
|
121
|
-
}
|
|
122
|
-
function normalizeOptions(optionsOrRoot) {
|
|
123
|
-
if (typeof HTMLElement !== "undefined" && optionsOrRoot instanceof HTMLElement) {
|
|
124
|
-
return { root: optionsOrRoot };
|
|
125
|
-
}
|
|
126
|
-
return optionsOrRoot;
|
|
127
|
-
}
|
|
128
|
-
function applyThemeVars(theme, optionsOrRoot = {}) {
|
|
129
|
-
const { mode = "flat", dark, root = document.documentElement } = normalizeOptions(optionsOrRoot);
|
|
130
|
-
if (mode === "cssVars") {
|
|
131
|
-
emitCssVars(theme, dark);
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
for (const [key, value] of Object.entries(theme.colors)) {
|
|
135
|
-
root.style.setProperty(`--color-${key}`, value);
|
|
136
|
-
}
|
|
137
|
-
root.style.setProperty("--font-display", theme.fonts.display);
|
|
138
|
-
root.style.setProperty("--font-sans", theme.fonts.sans);
|
|
139
|
-
root.style.setProperty("--radius", `${theme.radius}rem`);
|
|
140
|
-
}
|
|
141
|
-
function applyFontVars(fonts, root = document.documentElement) {
|
|
142
|
-
root.style.setProperty("--font-display", fonts.display);
|
|
143
|
-
root.style.setProperty("--font-sans", fonts.sans);
|
|
144
|
-
}
|
|
145
|
-
function clearFontVars(root = document.documentElement) {
|
|
146
|
-
root.style.removeProperty("--font-display");
|
|
147
|
-
root.style.removeProperty("--font-sans");
|
|
148
|
-
}
|
|
149
|
-
function clearThemeVars(theme, optionsOrRoot = {}) {
|
|
150
|
-
const { mode = "flat", root = document.documentElement } = normalizeOptions(optionsOrRoot);
|
|
151
|
-
if (mode === "cssVars") {
|
|
152
|
-
removeCssVars();
|
|
153
|
-
return;
|
|
154
|
-
}
|
|
155
|
-
for (const key of Object.keys(theme.colors)) {
|
|
156
|
-
root.style.removeProperty(`--color-${key}`);
|
|
157
|
-
}
|
|
158
|
-
root.style.removeProperty("--font-display");
|
|
159
|
-
root.style.removeProperty("--font-sans");
|
|
160
|
-
root.style.removeProperty("--radius");
|
|
161
|
-
}
|
|
162
35
|
function createThemeStore(config) {
|
|
163
36
|
const { defaultTheme, presets, storageKey } = config;
|
|
164
37
|
const useStore = zustand.create()(
|
|
@@ -204,295 +77,7 @@ function createThemeStore(config) {
|
|
|
204
77
|
}
|
|
205
78
|
function applyStoredTheme(bundle) {
|
|
206
79
|
const { colors, fonts, radius } = bundle.useStore.getState();
|
|
207
|
-
applyThemeVars({ colors, fonts, radius }, { mode: bundle.mode, dark: bundle.darkColors });
|
|
208
|
-
}
|
|
209
|
-
function ThemeEditor({
|
|
210
|
-
bundle,
|
|
211
|
-
variant = "panel",
|
|
212
|
-
preview,
|
|
213
|
-
onSave,
|
|
214
|
-
testIdPrefix = "theme",
|
|
215
|
-
defaultOpen = false
|
|
216
|
-
}) {
|
|
217
|
-
const { useStore, tokens, presets, groupLabels, mode, darkColors } = bundle;
|
|
218
|
-
const colors = useStore((s) => s.colors);
|
|
219
|
-
const fonts = useStore((s) => s.fonts);
|
|
220
|
-
const radius = useStore((s) => s.radius);
|
|
221
|
-
const activePresetId = useStore((s) => s.activePresetId);
|
|
222
|
-
const setColor = useStore((s) => s.setColor);
|
|
223
|
-
const setFont = useStore((s) => s.setFont);
|
|
224
|
-
const setFontPairing = useStore((s) => s.setFontPairing);
|
|
225
|
-
const setRadius = useStore((s) => s.setRadius);
|
|
226
|
-
const applyPreset = useStore((s) => s.applyPreset);
|
|
227
|
-
const reset = useStore((s) => s.reset);
|
|
228
|
-
const [open, setOpen] = react.useState(defaultOpen);
|
|
229
|
-
const [saving, setSaving] = react.useState(false);
|
|
230
|
-
const [savedVia, setSavedVia] = react.useState(null);
|
|
231
|
-
react.useEffect(() => {
|
|
232
|
-
applyThemeVars({ colors, fonts, radius }, { mode, dark: darkColors });
|
|
233
|
-
}, [colors, fonts, radius, mode, darkColors]);
|
|
234
|
-
const tid = (suffix) => `${testIdPrefix}-${suffix}`;
|
|
235
|
-
const groups = [...new Set(tokens.map((t) => t.group))];
|
|
236
|
-
const save = async () => {
|
|
237
|
-
if (!onSave) return;
|
|
238
|
-
setSaving(true);
|
|
239
|
-
try {
|
|
240
|
-
const via = await onSave();
|
|
241
|
-
setSavedVia(typeof via === "string" ? via : "saved");
|
|
242
|
-
} catch {
|
|
243
|
-
setSavedVia(null);
|
|
244
|
-
} finally {
|
|
245
|
-
setSaving(false);
|
|
246
|
-
}
|
|
247
|
-
};
|
|
248
|
-
const Presets = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
249
|
-
presets.map((p) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
250
|
-
"button",
|
|
251
|
-
{
|
|
252
|
-
type: "button",
|
|
253
|
-
onClick: () => applyPreset(p.id),
|
|
254
|
-
className: `rounded-full border px-3 py-1 text-xs font-medium transition-colors ${activePresetId === p.id ? "border-primary bg-primary text-primary-foreground" : "border-border text-foreground hover:border-primary"}`,
|
|
255
|
-
"data-testid": tid(`preset-${p.id}`),
|
|
256
|
-
children: p.label
|
|
257
|
-
},
|
|
258
|
-
p.id
|
|
259
|
-
)),
|
|
260
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
261
|
-
"button",
|
|
262
|
-
{
|
|
263
|
-
type: "button",
|
|
264
|
-
onClick: reset,
|
|
265
|
-
className: "ml-auto inline-flex items-center gap-1.5 text-xs font-medium text-muted-foreground hover:text-foreground",
|
|
266
|
-
"data-testid": tid("reset"),
|
|
267
|
-
children: [
|
|
268
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.RotateCcw, { className: "size-3" }),
|
|
269
|
-
" Reset"
|
|
270
|
-
]
|
|
271
|
-
}
|
|
272
|
-
)
|
|
273
|
-
] });
|
|
274
|
-
const colorRow = (k, label) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
|
|
275
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
276
|
-
"input",
|
|
277
|
-
{
|
|
278
|
-
type: "color",
|
|
279
|
-
value: colors[k] ?? "#000000",
|
|
280
|
-
onChange: (e) => setColor(k, e.target.value),
|
|
281
|
-
className: "size-9 shrink-0 cursor-pointer rounded-md border border-border bg-transparent",
|
|
282
|
-
"aria-label": label,
|
|
283
|
-
"data-testid": tid(`color-${k}`)
|
|
284
|
-
}
|
|
285
|
-
),
|
|
286
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
287
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-xs text-muted-foreground", children: label }),
|
|
288
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
289
|
-
ui.Input,
|
|
290
|
-
{
|
|
291
|
-
value: colors[k] ?? "",
|
|
292
|
-
onChange: (e) => setColor(k, e.target.value),
|
|
293
|
-
"aria-label": `${label} hex value`,
|
|
294
|
-
className: "bg-card placeholder:text-muted-foreground focus-visible:border-ring/60 focus-visible:ring-2 focus-visible:ring-ring h-7 font-mono text-xs",
|
|
295
|
-
"data-testid": tid(`hex-${k}`)
|
|
296
|
-
}
|
|
297
|
-
)
|
|
298
|
-
] })
|
|
299
|
-
] }, k);
|
|
300
|
-
const activePairing = chunkNWNVWO6L_cjs.matchFontPairing(fonts);
|
|
301
|
-
const Typography = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
|
|
302
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
303
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-xs text-muted-foreground", children: "Typeface" }),
|
|
304
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
305
|
-
"select",
|
|
306
|
-
{
|
|
307
|
-
value: activePairing?.id ?? "",
|
|
308
|
-
onChange: (e) => setFontPairing(e.target.value),
|
|
309
|
-
"aria-label": "Typeface",
|
|
310
|
-
className: "mt-1 h-8 w-full rounded-md border border-border bg-card px-2 text-xs text-foreground focus-visible:border-ring/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
311
|
-
"data-testid": tid("font-pairing"),
|
|
312
|
-
children: [
|
|
313
|
-
!activePairing && /* @__PURE__ */ jsxRuntime.jsx("option", { value: "", children: "Custom" }),
|
|
314
|
-
chunkNWNVWO6L_cjs.FONT_PAIRINGS.map((pairing) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: pairing.id, children: pairing.label }, pairing.id))
|
|
315
|
-
]
|
|
316
|
-
}
|
|
317
|
-
),
|
|
318
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: activePairing?.description ?? "Hand-edited font stacks." })
|
|
319
|
-
] }),
|
|
320
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
321
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-xs text-muted-foreground", children: "Display font stack" }),
|
|
322
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
323
|
-
ui.Input,
|
|
324
|
-
{
|
|
325
|
-
value: fonts.display,
|
|
326
|
-
onChange: (e) => setFont("display", e.target.value),
|
|
327
|
-
"aria-label": "Display font stack",
|
|
328
|
-
className: "bg-card placeholder:text-muted-foreground focus-visible:border-ring/60 focus-visible:ring-2 focus-visible:ring-ring mt-1 font-mono text-xs",
|
|
329
|
-
"data-testid": tid("font-display")
|
|
330
|
-
}
|
|
331
|
-
)
|
|
332
|
-
] }),
|
|
333
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
334
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-xs text-muted-foreground", children: "Body font stack" }),
|
|
335
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
336
|
-
ui.Input,
|
|
337
|
-
{
|
|
338
|
-
value: fonts.sans,
|
|
339
|
-
onChange: (e) => setFont("sans", e.target.value),
|
|
340
|
-
"aria-label": "Body font stack",
|
|
341
|
-
className: "bg-card placeholder:text-muted-foreground focus-visible:border-ring/60 focus-visible:ring-2 focus-visible:ring-ring mt-1 font-mono text-xs",
|
|
342
|
-
"data-testid": tid("font-sans")
|
|
343
|
-
}
|
|
344
|
-
)
|
|
345
|
-
] }),
|
|
346
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
347
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "block text-xs text-muted-foreground", children: [
|
|
348
|
-
"Base radius \u2014 ",
|
|
349
|
-
radius,
|
|
350
|
-
"rem"
|
|
351
|
-
] }),
|
|
352
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
353
|
-
"input",
|
|
354
|
-
{
|
|
355
|
-
type: "range",
|
|
356
|
-
min: 0,
|
|
357
|
-
max: 1.5,
|
|
358
|
-
step: 0.125,
|
|
359
|
-
value: radius,
|
|
360
|
-
onChange: (e) => setRadius(Number(e.target.value)),
|
|
361
|
-
"aria-label": "Base radius",
|
|
362
|
-
className: "mt-2 w-full accent-[color:var(--color-primary)]",
|
|
363
|
-
"data-testid": tid("radius")
|
|
364
|
-
}
|
|
365
|
-
)
|
|
366
|
-
] })
|
|
367
|
-
] });
|
|
368
|
-
const Preview = /* @__PURE__ */ jsxRuntime.jsxs(ui.Card, { variant: "elevated", className: "rounded-lg", "data-testid": tid("preview"), children: [
|
|
369
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.CardHeader, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.CardTitle, { className: "text-base", children: "Live preview" }) }),
|
|
370
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.CardContent, { className: "space-y-3", children: [
|
|
371
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-[var(--radius)] bg-primary p-4 text-primary-foreground", children: [
|
|
372
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "font-display text-lg font-semibold", children: preview?.title ?? "Preview" }),
|
|
373
|
-
preview?.subtitle && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs opacity-80", children: preview.subtitle })
|
|
374
|
-
] }),
|
|
375
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-6 gap-1.5", children: tokens.map((t) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
376
|
-
"div",
|
|
377
|
-
{
|
|
378
|
-
title: t.label,
|
|
379
|
-
className: "aspect-square rounded-md border border-border",
|
|
380
|
-
style: { background: `var(--color-${t.key})` }
|
|
381
|
-
},
|
|
382
|
-
t.key
|
|
383
|
-
)) }),
|
|
384
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-[var(--radius)] border border-border bg-[color:var(--color-ai-accent-soft,var(--color-accent))] p-3", children: [
|
|
385
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium text-[color:var(--color-ai-accent,var(--color-primary))]", children: "AI action surface" }),
|
|
386
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: "Themed by the AI-kit accent tokens." })
|
|
387
|
-
] })
|
|
388
|
-
] })
|
|
389
|
-
] });
|
|
390
|
-
const SaveBar = onSave && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-6 flex items-center gap-3", children: [
|
|
391
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
392
|
-
"button",
|
|
393
|
-
{
|
|
394
|
-
type: "button",
|
|
395
|
-
onClick: () => void save(),
|
|
396
|
-
disabled: saving,
|
|
397
|
-
className: "inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:opacity-90 disabled:opacity-60",
|
|
398
|
-
"data-testid": tid("save"),
|
|
399
|
-
children: [
|
|
400
|
-
savedVia ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "size-4" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Save, { className: "size-4" }),
|
|
401
|
-
saving ? "Saving\u2026" : savedVia ? "Saved" : "Save theme"
|
|
402
|
-
]
|
|
403
|
-
}
|
|
404
|
-
),
|
|
405
|
-
savedVia && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs text-muted-foreground", "data-testid": tid("via"), children: [
|
|
406
|
-
"stored via ",
|
|
407
|
-
savedVia
|
|
408
|
-
] })
|
|
409
|
-
] });
|
|
410
|
-
if (variant === "collapsed") {
|
|
411
|
-
const controlsId = `${testIdPrefix}-controls`;
|
|
412
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", "data-testid": testIdPrefix, children: [
|
|
413
|
-
Presets,
|
|
414
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-8 gap-1.5 @xl:grid-cols-12", "aria-hidden": "true", children: tokens.slice(0, 12).map((t) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
415
|
-
"div",
|
|
416
|
-
{
|
|
417
|
-
title: t.label,
|
|
418
|
-
className: "aspect-square rounded-md border border-border",
|
|
419
|
-
style: { background: `var(--color-${t.key})` }
|
|
420
|
-
},
|
|
421
|
-
t.key
|
|
422
|
-
)) }),
|
|
423
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
424
|
-
"button",
|
|
425
|
-
{
|
|
426
|
-
type: "button",
|
|
427
|
-
onClick: () => setOpen((o) => !o),
|
|
428
|
-
"aria-expanded": open,
|
|
429
|
-
"aria-controls": controlsId,
|
|
430
|
-
className: "inline-flex items-center gap-1.5 text-sm font-medium text-foreground hover:text-primary",
|
|
431
|
-
"data-testid": tid("customize"),
|
|
432
|
-
children: [
|
|
433
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: `size-4 transition-transform ${open ? "rotate-180" : ""}` }),
|
|
434
|
-
"Customize colours and type"
|
|
435
|
-
]
|
|
436
|
-
}
|
|
437
|
-
),
|
|
438
|
-
open && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
439
|
-
"div",
|
|
440
|
-
{
|
|
441
|
-
id: controlsId,
|
|
442
|
-
className: "max-h-[28rem] overflow-y-auto rounded-md border border-border bg-card p-4",
|
|
443
|
-
"data-testid": tid("controls"),
|
|
444
|
-
children: [
|
|
445
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground", children: "Colours" }),
|
|
446
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid gap-3 @xl:grid-cols-2", children: tokens.map((t) => colorRow(t.key, t.label)) }),
|
|
447
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-6 mb-2 text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground", children: "Typography & shape" }),
|
|
448
|
-
Typography
|
|
449
|
-
]
|
|
450
|
-
}
|
|
451
|
-
),
|
|
452
|
-
SaveBar
|
|
453
|
-
] });
|
|
454
|
-
}
|
|
455
|
-
if (variant === "drawer") {
|
|
456
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full flex-col overflow-y-auto bg-card p-5", "data-testid": testIdPrefix, children: [
|
|
457
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-4 flex items-center justify-between", children: /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "font-display text-lg font-semibold text-foreground", children: "Theme" }) }),
|
|
458
|
-
Presets,
|
|
459
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-5 mb-2 text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground", children: "Colours" }),
|
|
460
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: tokens.map((t) => colorRow(t.key, t.label)) }),
|
|
461
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-6 mb-2 text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground", children: "Typography & shape" }),
|
|
462
|
-
Typography,
|
|
463
|
-
SaveBar
|
|
464
|
-
] });
|
|
465
|
-
}
|
|
466
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid gap-6 lg:grid-cols-[1fr_320px]", "data-testid": testIdPrefix, children: [
|
|
467
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-6", children: [
|
|
468
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.Card, { variant: "elevated", className: "rounded-lg", children: [
|
|
469
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.CardHeader, { children: /* @__PURE__ */ jsxRuntime.jsxs(ui.CardTitle, { className: "flex items-center gap-2 text-base", children: [
|
|
470
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Palette, { className: "size-4 text-[color:var(--color-primary)]" }),
|
|
471
|
-
" Presets"
|
|
472
|
-
] }) }),
|
|
473
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.CardContent, { children: Presets })
|
|
474
|
-
] }),
|
|
475
|
-
groups.map((group) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
476
|
-
ui.Card,
|
|
477
|
-
{
|
|
478
|
-
variant: "elevated",
|
|
479
|
-
className: "rounded-lg",
|
|
480
|
-
"data-testid": tid(`group-${group}`),
|
|
481
|
-
children: [
|
|
482
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.CardHeader, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.CardTitle, { className: "text-base", children: groupLabels[group] ?? group }) }),
|
|
483
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.CardContent, { className: "grid gap-3 @xl:grid-cols-2", children: tokens.filter((t) => t.group === group).map((t) => colorRow(t.key, t.label)) })
|
|
484
|
-
]
|
|
485
|
-
},
|
|
486
|
-
group
|
|
487
|
-
)),
|
|
488
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.Card, { variant: "elevated", className: "rounded-lg", children: [
|
|
489
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.CardHeader, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.CardTitle, { className: "text-base", children: "Typography & shape" }) }),
|
|
490
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.CardContent, { children: Typography })
|
|
491
|
-
] }),
|
|
492
|
-
SaveBar
|
|
493
|
-
] }),
|
|
494
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "lg:sticky lg:top-4 lg:self-start", children: Preview })
|
|
495
|
-
] });
|
|
80
|
+
chunkKUQOHPKP_cjs.applyThemeVars({ colors, fonts, radius }, { mode: bundle.mode, dark: bundle.darkColors });
|
|
496
81
|
}
|
|
497
82
|
function SectionHeading({
|
|
498
83
|
eyebrow,
|
|
@@ -1654,27 +1239,20 @@ exports.RichTextBlock = RichTextBlock;
|
|
|
1654
1239
|
exports.SectionHeading = SectionHeading;
|
|
1655
1240
|
exports.Spacer = Spacer;
|
|
1656
1241
|
exports.Steps = Steps;
|
|
1657
|
-
exports.THEME_STYLE_ID = THEME_STYLE_ID;
|
|
1658
1242
|
exports.Tabs = Tabs;
|
|
1659
1243
|
exports.TeamGrid = TeamGrid;
|
|
1660
1244
|
exports.Testimonial = Testimonial;
|
|
1661
1245
|
exports.TestimonialGrid = TestimonialGrid;
|
|
1662
|
-
exports.ThemeEditor = ThemeEditor;
|
|
1663
1246
|
exports.VideoEmbed = VideoEmbed;
|
|
1664
|
-
exports.applyFontVars = applyFontVars;
|
|
1665
1247
|
exports.applyStoredTheme = applyStoredTheme;
|
|
1666
|
-
exports.applyThemeVars = applyThemeVars;
|
|
1667
1248
|
exports.asAssetRef = asAssetRef;
|
|
1668
1249
|
exports.assetRefId = assetRefId;
|
|
1669
|
-
exports.clearFontVars = clearFontVars;
|
|
1670
|
-
exports.clearThemeVars = clearThemeVars;
|
|
1671
1250
|
exports.createThemeStore = createThemeStore;
|
|
1672
1251
|
exports.formatIndex = formatIndex;
|
|
1673
1252
|
exports.isAssetRef = isAssetRef;
|
|
1674
1253
|
exports.toEmbedUrl = toEmbedUrl;
|
|
1675
|
-
exports.toHslTriplet = toHslTriplet;
|
|
1676
1254
|
exports.useAssetRenderer = useAssetRenderer;
|
|
1677
1255
|
exports.useAssetResolverActive = useAssetResolverActive;
|
|
1678
1256
|
exports.useEditorialTone = useEditorialTone;
|
|
1679
|
-
//# sourceMappingURL=chunk-
|
|
1680
|
-
//# sourceMappingURL=chunk-
|
|
1257
|
+
//# sourceMappingURL=chunk-KNRAKOCO.cjs.map
|
|
1258
|
+
//# sourceMappingURL=chunk-KNRAKOCO.cjs.map
|