@almadar/ui 5.128.0 → 5.130.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/avl/index.cjs +349 -11
- package/dist/avl/index.js +349 -11
- package/dist/components/index.cjs +352 -11
- package/dist/components/index.d.cts +119 -5
- package/dist/components/index.d.ts +119 -5
- package/dist/components/index.js +353 -12
- package/dist/providers/index.cjs +349 -11
- package/dist/providers/index.js +349 -11
- package/dist/runtime/index.cjs +349 -11
- package/dist/runtime/index.js +349 -11
- package/package.json +6 -5
- package/scripts/audit-tailwind-safelist.ts +237 -0
- package/scripts/export-static.js +61 -0
- package/scripts/generate-design-system.ts +344 -0
- package/scripts/generate-theme-from-schema.ts +480 -0
- package/scripts/generate.ts +835 -0
- package/scripts/strip-base-tokens-from-themes.mjs +179 -0
- package/scripts/suggest-components.ts +508 -0
- package/scripts/theme-contrast-audit.mjs +132 -0
- package/scripts/types.ts +282 -0
- package/themes/_contract.md +1 -1
|
@@ -22705,7 +22705,7 @@ var init_useQuerySingleton = __esm({
|
|
|
22705
22705
|
queryStores = /* @__PURE__ */ new Map();
|
|
22706
22706
|
}
|
|
22707
22707
|
});
|
|
22708
|
-
var resolveFilterType, lookStyles6; exports.FilterGroup = void 0;
|
|
22708
|
+
var resolveFilterType, lookStyles6, FilterGroupControls, FilterGroupPopover; exports.FilterGroup = void 0;
|
|
22709
22709
|
var init_FilterGroup = __esm({
|
|
22710
22710
|
"components/core/molecules/FilterGroup.tsx"() {
|
|
22711
22711
|
"use client";
|
|
@@ -22723,10 +22723,10 @@ var init_FilterGroup = __esm({
|
|
|
22723
22723
|
toolbar: "",
|
|
22724
22724
|
chips: "gap-1 [&_input]:rounded-pill [&_select]:rounded-pill [&_button]:rounded-pill [&_input]:!px-3 [&_select]:!px-3 [&_input]:bg-muted [&_select]:bg-muted [&_label]:hidden",
|
|
22725
22725
|
pills: "gap-2 [&_input]:rounded-pill [&_select]:rounded-pill [&_button]:rounded-pill",
|
|
22726
|
-
"popover-trigger": "
|
|
22726
|
+
"popover-trigger": "",
|
|
22727
22727
|
"inline-column-header": "hidden"
|
|
22728
22728
|
};
|
|
22729
|
-
|
|
22729
|
+
FilterGroupControls = ({
|
|
22730
22730
|
entity,
|
|
22731
22731
|
filters,
|
|
22732
22732
|
onFilterChange,
|
|
@@ -23062,7 +23062,7 @@ var init_FilterGroup = __esm({
|
|
|
23062
23062
|
className: "text-muted-foreground",
|
|
23063
23063
|
children: [
|
|
23064
23064
|
/* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "filter", className: "h-4 w-4" }),
|
|
23065
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-
|
|
23065
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
|
|
23066
23066
|
]
|
|
23067
23067
|
}
|
|
23068
23068
|
),
|
|
@@ -23153,6 +23153,42 @@ var init_FilterGroup = __esm({
|
|
|
23153
23153
|
}
|
|
23154
23154
|
);
|
|
23155
23155
|
};
|
|
23156
|
+
FilterGroupControls.displayName = "FilterGroupControls";
|
|
23157
|
+
FilterGroupPopover = (props) => {
|
|
23158
|
+
const { t } = hooks.useTranslate();
|
|
23159
|
+
const [open, setOpen] = React74.useState(false);
|
|
23160
|
+
const queryState = useQuerySingleton(props.query);
|
|
23161
|
+
const activeFilterCount = queryState?.filters ? Object.values(queryState.filters).filter((v) => v !== null && v !== void 0).length : 0;
|
|
23162
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative inline-block", props.className), children: [
|
|
23163
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
23164
|
+
exports.Button,
|
|
23165
|
+
{
|
|
23166
|
+
variant: activeFilterCount > 0 ? "secondary" : "ghost",
|
|
23167
|
+
size: "sm",
|
|
23168
|
+
leftIcon: "filter",
|
|
23169
|
+
onClick: () => setOpen((o) => !o),
|
|
23170
|
+
"aria-expanded": open,
|
|
23171
|
+
"aria-haspopup": "true",
|
|
23172
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "xs", align: "center", children: [
|
|
23173
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: t("filterGroup.filters") }),
|
|
23174
|
+
activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: "primary", size: "sm", children: activeFilterCount })
|
|
23175
|
+
] })
|
|
23176
|
+
}
|
|
23177
|
+
),
|
|
23178
|
+
open && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute left-0 z-50 mt-2 min-w-[16rem] rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-card-md shadow-main", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
23179
|
+
FilterGroupControls,
|
|
23180
|
+
{
|
|
23181
|
+
...props,
|
|
23182
|
+
className: void 0,
|
|
23183
|
+
look: "toolbar",
|
|
23184
|
+
variant: "vertical",
|
|
23185
|
+
showIcon: false
|
|
23186
|
+
}
|
|
23187
|
+
) })
|
|
23188
|
+
] });
|
|
23189
|
+
};
|
|
23190
|
+
FilterGroupPopover.displayName = "FilterGroupPopover";
|
|
23191
|
+
exports.FilterGroup = (props) => props.look === "popover-trigger" ? /* @__PURE__ */ jsxRuntime.jsx(FilterGroupPopover, { ...props }) : /* @__PURE__ */ jsxRuntime.jsx(FilterGroupControls, { ...props });
|
|
23156
23192
|
exports.FilterGroup.displayName = "FilterGroup";
|
|
23157
23193
|
}
|
|
23158
23194
|
});
|
|
@@ -28622,12 +28658,12 @@ var init_MapView = __esm({
|
|
|
28622
28658
|
shadowSize: [41, 41]
|
|
28623
28659
|
});
|
|
28624
28660
|
L.Marker.prototype.options.icon = defaultIcon;
|
|
28625
|
-
const { useEffect: useEffect65, useRef:
|
|
28661
|
+
const { useEffect: useEffect65, useRef: useRef63, useCallback: useCallback105, useState: useState102 } = React74__namespace.default;
|
|
28626
28662
|
const { Typography: Typography2 } = await Promise.resolve().then(() => (init_Typography(), Typography_exports));
|
|
28627
28663
|
const { useEventBus: useEventBus2 } = await Promise.resolve().then(() => (init_useEventBus(), useEventBus_exports));
|
|
28628
28664
|
function MapUpdater({ centerLat, centerLng, zoom }) {
|
|
28629
28665
|
const map = useMap();
|
|
28630
|
-
const prevRef =
|
|
28666
|
+
const prevRef = useRef63({ centerLat, centerLng, zoom });
|
|
28631
28667
|
useEffect65(() => {
|
|
28632
28668
|
const prev = prevRef.current;
|
|
28633
28669
|
if (prev.centerLat !== centerLat || prev.centerLng !== centerLng || prev.zoom !== zoom) {
|
|
@@ -29606,9 +29642,19 @@ function TableView({
|
|
|
29606
29642
|
const inlineActionCount = hasActions ? maxInlineActions != null ? Math.min(itemActions.length, maxInlineActions) : itemActions.length : 0;
|
|
29607
29643
|
const hasOverflowActions = hasActions && maxInlineActions != null && itemActions.length > maxInlineActions;
|
|
29608
29644
|
const actionsTrack = hasActions ? `${inlineActionCount * 6 + (hasOverflowActions ? 3 : 0)}rem` : null;
|
|
29645
|
+
const colFloors = React74__namespace.default.useMemo(
|
|
29646
|
+
() => colDefs.map((col) => {
|
|
29647
|
+
const longest = data.reduce((widest, row) => {
|
|
29648
|
+
const cell = formatCell(asFieldValue(getNestedValue(row, col.field ?? col.key)), col.format);
|
|
29649
|
+
return Math.max(widest, cell.length);
|
|
29650
|
+
}, columnLabel(col).length);
|
|
29651
|
+
return Math.min(longest, MAX_MEASURED_COL_CH);
|
|
29652
|
+
}),
|
|
29653
|
+
[colDefs, data]
|
|
29654
|
+
);
|
|
29609
29655
|
const gridTemplateColumns = [
|
|
29610
29656
|
selectable ? "auto" : null,
|
|
29611
|
-
...colDefs.map((c) => c.width ??
|
|
29657
|
+
...colDefs.map((c, i) => c.width ?? `minmax(${colFloors[i]}ch, 1fr)`),
|
|
29612
29658
|
actionsTrack
|
|
29613
29659
|
].filter(Boolean).join(" ");
|
|
29614
29660
|
const header = /* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -29775,7 +29821,7 @@ function TableView({
|
|
|
29775
29821
|
}
|
|
29776
29822
|
);
|
|
29777
29823
|
}
|
|
29778
|
-
var alignClass, weightClass, LOOKS;
|
|
29824
|
+
var MAX_MEASURED_COL_CH, alignClass, weightClass, LOOKS;
|
|
29779
29825
|
var init_TableView = __esm({
|
|
29780
29826
|
"components/core/molecules/TableView.tsx"() {
|
|
29781
29827
|
"use client";
|
|
@@ -29793,6 +29839,7 @@ var init_TableView = __esm({
|
|
|
29793
29839
|
init_Menu();
|
|
29794
29840
|
init_useDataDnd();
|
|
29795
29841
|
logger.createLogger("almadar:ui:table-view");
|
|
29842
|
+
MAX_MEASURED_COL_CH = 32;
|
|
29796
29843
|
alignClass = {
|
|
29797
29844
|
left: "justify-start text-left",
|
|
29798
29845
|
center: "justify-center text-center",
|
|
@@ -37817,6 +37864,293 @@ var init_GraphCanvas = __esm({
|
|
|
37817
37864
|
exports.GraphCanvas.displayName = "GraphCanvas";
|
|
37818
37865
|
}
|
|
37819
37866
|
});
|
|
37867
|
+
exports.ImportSourcePicker = void 0;
|
|
37868
|
+
var init_ImportSourcePicker = __esm({
|
|
37869
|
+
"components/core/molecules/import/ImportSourcePicker.tsx"() {
|
|
37870
|
+
"use client";
|
|
37871
|
+
init_Box();
|
|
37872
|
+
init_Icon();
|
|
37873
|
+
init_Typography();
|
|
37874
|
+
init_cn();
|
|
37875
|
+
exports.ImportSourcePicker = ({
|
|
37876
|
+
sources,
|
|
37877
|
+
onSelect,
|
|
37878
|
+
onFilesSelected,
|
|
37879
|
+
title,
|
|
37880
|
+
moreSources,
|
|
37881
|
+
className
|
|
37882
|
+
}) => {
|
|
37883
|
+
const fileInputRef = React74.useRef(null);
|
|
37884
|
+
const handlePick = (source) => {
|
|
37885
|
+
if (source.disabled) return;
|
|
37886
|
+
if (source.kind === "file") {
|
|
37887
|
+
const input = fileInputRef.current;
|
|
37888
|
+
if (!input) return;
|
|
37889
|
+
input.accept = source.accept ?? "";
|
|
37890
|
+
input.multiple = source.multiple ?? false;
|
|
37891
|
+
input.click();
|
|
37892
|
+
return;
|
|
37893
|
+
}
|
|
37894
|
+
onSelect?.(source.id);
|
|
37895
|
+
};
|
|
37896
|
+
const handleFiles = (event) => {
|
|
37897
|
+
const files = event.target.files ? Array.from(event.target.files) : [];
|
|
37898
|
+
event.target.value = "";
|
|
37899
|
+
if (files.length > 0) onFilesSelected?.(files);
|
|
37900
|
+
};
|
|
37901
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: cn("flex flex-col gap-2", className), children: [
|
|
37902
|
+
title ? /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "h4", children: title }) : null,
|
|
37903
|
+
sources.map((source) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
37904
|
+
exports.Box,
|
|
37905
|
+
{
|
|
37906
|
+
role: "button",
|
|
37907
|
+
tabIndex: source.disabled ? -1 : 0,
|
|
37908
|
+
"aria-disabled": source.disabled,
|
|
37909
|
+
onClick: () => handlePick(source),
|
|
37910
|
+
onKeyDown: (event) => {
|
|
37911
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
37912
|
+
event.preventDefault();
|
|
37913
|
+
handlePick(source);
|
|
37914
|
+
}
|
|
37915
|
+
},
|
|
37916
|
+
className: cn(
|
|
37917
|
+
"flex items-center gap-3 rounded-md border border-border bg-card px-4 py-3 text-left",
|
|
37918
|
+
source.disabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer hover:bg-accent hover:text-accent-foreground"
|
|
37919
|
+
),
|
|
37920
|
+
children: [
|
|
37921
|
+
source.icon ? /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { icon: source.icon, size: "md" }) : null,
|
|
37922
|
+
/* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: "flex flex-col", children: [
|
|
37923
|
+
/* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "label", children: source.label }),
|
|
37924
|
+
source.description ? /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", className: "text-muted-foreground", children: source.description }) : null
|
|
37925
|
+
] })
|
|
37926
|
+
]
|
|
37927
|
+
},
|
|
37928
|
+
source.id
|
|
37929
|
+
)),
|
|
37930
|
+
moreSources,
|
|
37931
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
37932
|
+
"input",
|
|
37933
|
+
{
|
|
37934
|
+
ref: fileInputRef,
|
|
37935
|
+
type: "file",
|
|
37936
|
+
className: "hidden",
|
|
37937
|
+
onChange: handleFiles,
|
|
37938
|
+
"data-testid": "import-source-file-input"
|
|
37939
|
+
}
|
|
37940
|
+
)
|
|
37941
|
+
] });
|
|
37942
|
+
};
|
|
37943
|
+
}
|
|
37944
|
+
});
|
|
37945
|
+
function formatFieldValue(value) {
|
|
37946
|
+
if (value === null) return "\u2014";
|
|
37947
|
+
if (value instanceof Date) return value.toISOString();
|
|
37948
|
+
if (Array.isArray(value)) return value.map(formatFieldValue).join(", ");
|
|
37949
|
+
if (typeof value === "object") return JSON.stringify(value);
|
|
37950
|
+
return String(value);
|
|
37951
|
+
}
|
|
37952
|
+
function unitTitle(unit) {
|
|
37953
|
+
for (const key of TITLE_KEYS) {
|
|
37954
|
+
const value = unit.fields[key];
|
|
37955
|
+
if (typeof value === "string" && value.length > 0) return value;
|
|
37956
|
+
}
|
|
37957
|
+
return unit.ref;
|
|
37958
|
+
}
|
|
37959
|
+
function fieldSummary(unit) {
|
|
37960
|
+
return Object.entries(unit.fields).filter(([key]) => !TITLE_KEYS.includes(key)).map(([key, value]) => `${key}: ${formatFieldValue(value)}`).join(" \xB7 ");
|
|
37961
|
+
}
|
|
37962
|
+
var TITLE_KEYS; exports.ImportPreviewTree = void 0;
|
|
37963
|
+
var init_ImportPreviewTree = __esm({
|
|
37964
|
+
"components/core/molecules/import/ImportPreviewTree.tsx"() {
|
|
37965
|
+
"use client";
|
|
37966
|
+
init_Box();
|
|
37967
|
+
init_Badge();
|
|
37968
|
+
init_Button();
|
|
37969
|
+
init_Icon();
|
|
37970
|
+
init_Typography();
|
|
37971
|
+
init_cn();
|
|
37972
|
+
TITLE_KEYS = ["title", "name", "label"];
|
|
37973
|
+
exports.ImportPreviewTree = ({
|
|
37974
|
+
units,
|
|
37975
|
+
skipped = [],
|
|
37976
|
+
entityDisplay,
|
|
37977
|
+
onConfirm,
|
|
37978
|
+
onCancel,
|
|
37979
|
+
confirmLabel = "Confirm import",
|
|
37980
|
+
cancelLabel = "Cancel",
|
|
37981
|
+
indent = 16,
|
|
37982
|
+
className
|
|
37983
|
+
}) => {
|
|
37984
|
+
const groups = /* @__PURE__ */ new Map();
|
|
37985
|
+
for (const unit of units) {
|
|
37986
|
+
const group = groups.get(unit.targetEntity);
|
|
37987
|
+
if (group) group.push(unit);
|
|
37988
|
+
else groups.set(unit.targetEntity, [unit]);
|
|
37989
|
+
}
|
|
37990
|
+
const renderUnit = (unit, childrenByParent, depth) => {
|
|
37991
|
+
const summary = fieldSummary(unit);
|
|
37992
|
+
const children = childrenByParent.get(unit.ref) ?? [];
|
|
37993
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(React74__namespace.default.Fragment, { children: [
|
|
37994
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
37995
|
+
exports.Box,
|
|
37996
|
+
{
|
|
37997
|
+
className: "flex flex-col py-1",
|
|
37998
|
+
style: { paddingLeft: depth * indent },
|
|
37999
|
+
"data-testid": `import-preview-unit-${unit.ref}`,
|
|
38000
|
+
children: [
|
|
38001
|
+
/* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: "flex items-center gap-2", children: [
|
|
38002
|
+
/* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { icon: "file-text", size: "xs", className: "text-muted-foreground" }),
|
|
38003
|
+
/* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "body2", children: unitTitle(unit) })
|
|
38004
|
+
] }),
|
|
38005
|
+
summary ? /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", className: "text-muted-foreground", children: summary }) : null
|
|
38006
|
+
]
|
|
38007
|
+
}
|
|
38008
|
+
),
|
|
38009
|
+
children.map((child) => renderUnit(child, childrenByParent, depth + 1))
|
|
38010
|
+
] }, unit.ref);
|
|
38011
|
+
};
|
|
38012
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: cn("flex flex-col gap-4", className), children: [
|
|
38013
|
+
units.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "body2", className: "text-muted-foreground", children: "No units staged." }) : null,
|
|
38014
|
+
Array.from(groups.entries()).map(([entity, groupUnits]) => {
|
|
38015
|
+
const refs = new Set(groupUnits.map((unit) => unit.ref));
|
|
38016
|
+
const childrenByParent = /* @__PURE__ */ new Map();
|
|
38017
|
+
const roots = [];
|
|
38018
|
+
for (const unit of groupUnits) {
|
|
38019
|
+
if (unit.parentRef && refs.has(unit.parentRef)) {
|
|
38020
|
+
const siblings = childrenByParent.get(unit.parentRef);
|
|
38021
|
+
if (siblings) siblings.push(unit);
|
|
38022
|
+
else childrenByParent.set(unit.parentRef, [unit]);
|
|
38023
|
+
} else {
|
|
38024
|
+
roots.push(unit);
|
|
38025
|
+
}
|
|
38026
|
+
}
|
|
38027
|
+
const label = entityDisplay[entity]?.plural ?? entity;
|
|
38028
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { border: true, className: "rounded-md border-border bg-card p-3", children: [
|
|
38029
|
+
/* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: "flex items-center gap-2 pb-2", children: [
|
|
38030
|
+
/* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "label", children: label }),
|
|
38031
|
+
/* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { amount: groupUnits.length })
|
|
38032
|
+
] }),
|
|
38033
|
+
roots.map((unit) => renderUnit(unit, childrenByParent, 0))
|
|
38034
|
+
] }, entity);
|
|
38035
|
+
}),
|
|
38036
|
+
skipped.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { border: true, className: "rounded-md border-border bg-card p-3", children: [
|
|
38037
|
+
/* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: "flex items-center gap-2 pb-2", children: [
|
|
38038
|
+
/* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "label", children: "Skipped" }),
|
|
38039
|
+
/* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { amount: skipped.length })
|
|
38040
|
+
] }),
|
|
38041
|
+
skipped.map((element) => /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: "flex items-baseline gap-2 py-1", children: [
|
|
38042
|
+
/* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "body2", children: element.ref }),
|
|
38043
|
+
/* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", className: "text-muted-foreground", children: element.reason })
|
|
38044
|
+
] }, element.ref))
|
|
38045
|
+
] }) : null,
|
|
38046
|
+
onConfirm || onCancel ? /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: "flex items-center justify-end gap-2", children: [
|
|
38047
|
+
onCancel ? /* @__PURE__ */ jsxRuntime.jsx(exports.Button, { variant: "default", label: cancelLabel, onClick: onCancel }) : null,
|
|
38048
|
+
onConfirm ? /* @__PURE__ */ jsxRuntime.jsx(exports.Button, { variant: "primary", label: confirmLabel, onClick: onConfirm }) : null
|
|
38049
|
+
] }) : null
|
|
38050
|
+
] });
|
|
38051
|
+
};
|
|
38052
|
+
}
|
|
38053
|
+
});
|
|
38054
|
+
var PIPELINE, DEFAULT_LABELS; exports.ImportProgress = void 0;
|
|
38055
|
+
var init_ImportProgress = __esm({
|
|
38056
|
+
"components/core/molecules/import/ImportProgress.tsx"() {
|
|
38057
|
+
"use client";
|
|
38058
|
+
init_Box();
|
|
38059
|
+
init_Badge();
|
|
38060
|
+
init_Icon();
|
|
38061
|
+
init_Typography();
|
|
38062
|
+
init_cn();
|
|
38063
|
+
PIPELINE = [
|
|
38064
|
+
"fetching",
|
|
38065
|
+
"mapping",
|
|
38066
|
+
"reviewing",
|
|
38067
|
+
"committing"
|
|
38068
|
+
];
|
|
38069
|
+
DEFAULT_LABELS = {
|
|
38070
|
+
fetching: "Fetching",
|
|
38071
|
+
mapping: "Mapping",
|
|
38072
|
+
reviewing: "Reviewing",
|
|
38073
|
+
committing: "Committing",
|
|
38074
|
+
done: "Done",
|
|
38075
|
+
failed: "Failed"
|
|
38076
|
+
};
|
|
38077
|
+
exports.ImportProgress = ({
|
|
38078
|
+
step,
|
|
38079
|
+
counts,
|
|
38080
|
+
labels,
|
|
38081
|
+
className
|
|
38082
|
+
}) => {
|
|
38083
|
+
const label = (key) => labels?.[key] ?? DEFAULT_LABELS[key];
|
|
38084
|
+
const currentIndex = step === "done" || step === "failed" ? PIPELINE.length : PIPELINE.indexOf(step);
|
|
38085
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: cn("flex flex-col gap-3", className), children: [
|
|
38086
|
+
/* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: "flex items-center gap-2", children: [
|
|
38087
|
+
PIPELINE.map((key, index) => {
|
|
38088
|
+
const isComplete = index < currentIndex;
|
|
38089
|
+
const isActive = index === currentIndex;
|
|
38090
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(React74__namespace.default.Fragment, { children: [
|
|
38091
|
+
index > 0 ? /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "h-px w-4 bg-border" }) : null,
|
|
38092
|
+
/* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: "flex items-center gap-1", "data-testid": `import-progress-step-${key}`, children: [
|
|
38093
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
38094
|
+
exports.Icon,
|
|
38095
|
+
{
|
|
38096
|
+
icon: isComplete ? "check" : isActive ? "loader" : "circle",
|
|
38097
|
+
size: "sm",
|
|
38098
|
+
className: cn(
|
|
38099
|
+
isComplete ? "text-success" : isActive ? "text-primary" : "text-muted-foreground"
|
|
38100
|
+
)
|
|
38101
|
+
}
|
|
38102
|
+
),
|
|
38103
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
38104
|
+
exports.Typography,
|
|
38105
|
+
{
|
|
38106
|
+
variant: "caption",
|
|
38107
|
+
className: cn(isActive ? "text-foreground" : "text-muted-foreground"),
|
|
38108
|
+
children: label(key)
|
|
38109
|
+
}
|
|
38110
|
+
)
|
|
38111
|
+
] })
|
|
38112
|
+
] }, key);
|
|
38113
|
+
}),
|
|
38114
|
+
step === "done" || step === "failed" ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
38115
|
+
/* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "h-px w-4 bg-border" }),
|
|
38116
|
+
/* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: "flex items-center gap-1", "data-testid": `import-progress-step-${step}`, children: [
|
|
38117
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
38118
|
+
exports.Icon,
|
|
38119
|
+
{
|
|
38120
|
+
icon: step === "done" ? "check" : "x",
|
|
38121
|
+
size: "sm",
|
|
38122
|
+
className: step === "done" ? "text-success" : "text-error"
|
|
38123
|
+
}
|
|
38124
|
+
),
|
|
38125
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
38126
|
+
exports.Typography,
|
|
38127
|
+
{
|
|
38128
|
+
variant: "caption",
|
|
38129
|
+
className: step === "done" ? "text-success" : "text-error",
|
|
38130
|
+
children: label(step)
|
|
38131
|
+
}
|
|
38132
|
+
)
|
|
38133
|
+
] })
|
|
38134
|
+
] }) : null
|
|
38135
|
+
] }),
|
|
38136
|
+
counts ? /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: "flex items-center gap-2", children: [
|
|
38137
|
+
counts.staged !== void 0 ? /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { label: `Staged ${counts.staged}` }) : null,
|
|
38138
|
+
counts.committed !== void 0 ? /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: "success", label: `Committed ${counts.committed}` }) : null,
|
|
38139
|
+
counts.failed !== void 0 ? /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: "danger", label: `Failed ${counts.failed}` }) : null
|
|
38140
|
+
] }) : null
|
|
38141
|
+
] });
|
|
38142
|
+
};
|
|
38143
|
+
}
|
|
38144
|
+
});
|
|
38145
|
+
|
|
38146
|
+
// components/core/molecules/import/index.ts
|
|
38147
|
+
var init_import = __esm({
|
|
38148
|
+
"components/core/molecules/import/index.ts"() {
|
|
38149
|
+
init_ImportSourcePicker();
|
|
38150
|
+
init_ImportPreviewTree();
|
|
38151
|
+
init_ImportProgress();
|
|
38152
|
+
}
|
|
38153
|
+
});
|
|
37820
38154
|
exports.ReflectionBlock = void 0;
|
|
37821
38155
|
var init_ReflectionBlock = __esm({
|
|
37822
38156
|
"components/core/molecules/ReflectionBlock.tsx"() {
|
|
@@ -38103,6 +38437,7 @@ var init_molecules2 = __esm({
|
|
|
38103
38437
|
init_SignaturePad();
|
|
38104
38438
|
init_DocumentViewer();
|
|
38105
38439
|
init_GraphCanvas();
|
|
38440
|
+
init_import();
|
|
38106
38441
|
init_ActivationBlock();
|
|
38107
38442
|
init_ReflectionBlock();
|
|
38108
38443
|
init_ConnectionBlock();
|
|
@@ -38589,7 +38924,7 @@ function getBadgeVariant(fieldName, value) {
|
|
|
38589
38924
|
function formatFieldLabel(fieldName) {
|
|
38590
38925
|
return fieldName.replace(/([A-Z])/g, " $1").replace(/^./, (str2) => str2.toUpperCase());
|
|
38591
38926
|
}
|
|
38592
|
-
function
|
|
38927
|
+
function formatFieldValue2(value, fieldName) {
|
|
38593
38928
|
if (typeof value === "number") {
|
|
38594
38929
|
if (fieldName.toLowerCase().includes("progress") || fieldName.toLowerCase().includes("percent")) {
|
|
38595
38930
|
return `${value}%`;
|
|
@@ -38684,7 +39019,7 @@ function renderRichFieldValue(value, fieldName, fieldType) {
|
|
|
38684
39019
|
return str2;
|
|
38685
39020
|
}
|
|
38686
39021
|
default:
|
|
38687
|
-
return
|
|
39022
|
+
return formatFieldValue2(value, fieldName);
|
|
38688
39023
|
}
|
|
38689
39024
|
}
|
|
38690
39025
|
function normalizeFieldDefs(fields) {
|
|
@@ -38795,7 +39130,7 @@ var init_DetailPanel = __esm({
|
|
|
38795
39130
|
const value = getNestedValue(normalizedData, field);
|
|
38796
39131
|
return {
|
|
38797
39132
|
label: labelFor(field),
|
|
38798
|
-
value:
|
|
39133
|
+
value: formatFieldValue2(value, field),
|
|
38799
39134
|
icon: getFieldIcon(field)
|
|
38800
39135
|
};
|
|
38801
39136
|
}
|
|
@@ -44807,6 +45142,9 @@ var init_component_registry_generated = __esm({
|
|
|
44807
45142
|
init_HeroOrganism();
|
|
44808
45143
|
init_HeroSection();
|
|
44809
45144
|
init_Icon();
|
|
45145
|
+
init_ImportPreviewTree();
|
|
45146
|
+
init_ImportProgress();
|
|
45147
|
+
init_ImportSourcePicker();
|
|
44810
45148
|
init_InfiniteScrollSentinel();
|
|
44811
45149
|
init_Input();
|
|
44812
45150
|
init_InputGroup();
|
|
@@ -45070,6 +45408,9 @@ var init_component_registry_generated = __esm({
|
|
|
45070
45408
|
"HeroOrganism": exports.HeroOrganism,
|
|
45071
45409
|
"HeroSection": exports.HeroSection,
|
|
45072
45410
|
"Icon": exports.Icon,
|
|
45411
|
+
"ImportPreviewTree": exports.ImportPreviewTree,
|
|
45412
|
+
"ImportProgress": exports.ImportProgress,
|
|
45413
|
+
"ImportSourcePicker": exports.ImportSourcePicker,
|
|
45073
45414
|
"InfiniteScrollSentinel": exports.InfiniteScrollSentinel,
|
|
45074
45415
|
"Input": exports.Input,
|
|
45075
45416
|
"InputGroup": exports.InputGroup,
|