@open-mercato/core 0.6.7-develop.6785.1.1dd7cfac55 → 0.6.7-develop.6795.1.8a3f27921c
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/.turbo/turbo-build.log +1 -1
- package/dist/generated/entities.ids.generated.js +1 -0
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/modules/auth/backend/settings/page.js +14 -9
- package/dist/modules/auth/backend/settings/page.js.map +2 -2
- package/dist/modules/customers/cli.js +17 -7
- package/dist/modules/customers/cli.js.map +2 -2
- package/dist/modules/customers/components/detail/ScheduleActivityDialog.js +229 -216
- package/dist/modules/customers/components/detail/ScheduleActivityDialog.js.map +2 -2
- package/dist/modules/customers/search.js +50 -29
- package/dist/modules/customers/search.js.map +2 -2
- package/dist/modules/data_sync/api/mappings/[id]/route.js +22 -9
- package/dist/modules/data_sync/api/mappings/[id]/route.js.map +2 -2
- package/dist/modules/data_sync/api/mappings/route.js +13 -4
- package/dist/modules/data_sync/api/mappings/route.js.map +2 -2
- package/dist/modules/data_sync/api/options.js +7 -2
- package/dist/modules/data_sync/api/options.js.map +2 -2
- package/dist/modules/data_sync/api/run.js +7 -2
- package/dist/modules/data_sync/api/run.js.map +2 -2
- package/dist/modules/data_sync/api/runs/[id]/cancel.js +8 -3
- package/dist/modules/data_sync/api/runs/[id]/cancel.js.map +2 -2
- package/dist/modules/data_sync/api/runs/[id]/retry.js +7 -2
- package/dist/modules/data_sync/api/runs/[id]/retry.js.map +2 -2
- package/dist/modules/data_sync/api/runs/[id]/route.js +8 -3
- package/dist/modules/data_sync/api/runs/[id]/route.js.map +2 -2
- package/dist/modules/data_sync/api/runs.js +7 -2
- package/dist/modules/data_sync/api/runs.js.map +2 -2
- package/dist/modules/data_sync/api/schedules/[id]/route.js +19 -6
- package/dist/modules/data_sync/api/schedules/[id]/route.js.map +2 -2
- package/dist/modules/data_sync/api/schedules/route.js +13 -4
- package/dist/modules/data_sync/api/schedules/route.js.map +2 -2
- package/dist/modules/data_sync/api/validate.js +9 -4
- package/dist/modules/data_sync/api/validate.js.map +2 -2
- package/dist/modules/design_system/acl.js +9 -0
- package/dist/modules/design_system/acl.js.map +7 -0
- package/dist/modules/design_system/backend/design-system/page.js +11 -0
- package/dist/modules/design_system/backend/design-system/page.js.map +7 -0
- package/dist/modules/design_system/backend/design-system/page.meta.js +15 -0
- package/dist/modules/design_system/backend/design-system/page.meta.js.map +7 -0
- package/dist/modules/design_system/gallery/components/CodeSnippet.js +52 -0
- package/dist/modules/design_system/gallery/components/CodeSnippet.js.map +7 -0
- package/dist/modules/design_system/gallery/components/EntryCard.js +63 -0
- package/dist/modules/design_system/gallery/components/EntryCard.js.map +7 -0
- package/dist/modules/design_system/gallery/components/GalleryShell.js +163 -0
- package/dist/modules/design_system/gallery/components/GalleryShell.js.map +7 -0
- package/dist/modules/design_system/gallery/components/VariantPreview.js +9 -0
- package/dist/modules/design_system/gallery/components/VariantPreview.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/banners.js +186 -0
- package/dist/modules/design_system/gallery/entries/banners.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/buttons.js +361 -0
- package/dist/modules/design_system/gallery/entries/buttons.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/charts.js +457 -0
- package/dist/modules/design_system/gallery/entries/charts.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/dates.js +306 -0
- package/dist/modules/design_system/gallery/entries/dates.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/detail.js +358 -0
- package/dist/modules/design_system/gallery/entries/detail.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/display.js +785 -0
- package/dist/modules/design_system/gallery/entries/display.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/feedback.js +658 -0
- package/dist/modules/design_system/gallery/entries/feedback.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/filters.js +505 -0
- package/dist/modules/design_system/gallery/entries/filters.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/foundations.js +453 -0
- package/dist/modules/design_system/gallery/entries/foundations.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/icons.js +140 -0
- package/dist/modules/design_system/gallery/entries/icons.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/inputs.js +1217 -0
- package/dist/modules/design_system/gallery/entries/inputs.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/messages.js +334 -0
- package/dist/modules/design_system/gallery/entries/messages.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/navigation.js +475 -0
- package/dist/modules/design_system/gallery/entries/navigation.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/notifications.js +257 -0
- package/dist/modules/design_system/gallery/entries/notifications.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/overlays.js +576 -0
- package/dist/modules/design_system/gallery/entries/overlays.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/scaffolding.js +378 -0
- package/dist/modules/design_system/gallery/entries/scaffolding.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/schedule.js +297 -0
- package/dist/modules/design_system/gallery/entries/schedule.js.map +7 -0
- package/dist/modules/design_system/gallery/registry.js +139 -0
- package/dist/modules/design_system/gallery/registry.js.map +7 -0
- package/dist/modules/design_system/gallery/types.js +1 -0
- package/dist/modules/design_system/gallery/types.js.map +7 -0
- package/dist/modules/design_system/index.js +9 -0
- package/dist/modules/design_system/index.js.map +7 -0
- package/dist/modules/design_system/setup.js +14 -0
- package/dist/modules/design_system/setup.js.map +7 -0
- package/dist/modules/inbox_ops/search.js +15 -4
- package/dist/modules/inbox_ops/search.js.map +2 -2
- package/dist/modules/integrations/api/[id]/credentials/route.js +11 -5
- package/dist/modules/integrations/api/[id]/credentials/route.js.map +2 -2
- package/dist/modules/integrations/api/[id]/health/route.js +6 -3
- package/dist/modules/integrations/api/[id]/health/route.js.map +2 -2
- package/dist/modules/integrations/api/[id]/route.js +6 -3
- package/dist/modules/integrations/api/[id]/route.js.map +2 -2
- package/dist/modules/integrations/api/[id]/state/route.js +6 -3
- package/dist/modules/integrations/api/[id]/state/route.js.map +2 -2
- package/dist/modules/integrations/api/[id]/version/route.js +6 -3
- package/dist/modules/integrations/api/[id]/version/route.js.map +2 -2
- package/dist/modules/integrations/api/logs/route.js +6 -3
- package/dist/modules/integrations/api/logs/route.js.map +2 -2
- package/dist/modules/integrations/api/route.js +6 -3
- package/dist/modules/integrations/api/route.js.map +2 -2
- package/dist/modules/integrations/api/umes-read.js +2 -2
- package/dist/modules/integrations/api/umes-read.js.map +2 -2
- package/dist/modules/integrations/lib/organization-scope.js +2 -9
- package/dist/modules/integrations/lib/organization-scope.js.map +2 -2
- package/dist/modules/messages/search.js +10 -5
- package/dist/modules/messages/search.js.map +2 -2
- package/dist/modules/query_index/data/entities.js +2 -1
- package/dist/modules/query_index/data/entities.js.map +2 -2
- package/dist/modules/query_index/lib/engine.js +32 -50
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/query_index/migrations/Migration20260731105052_query_index.js +17 -0
- package/dist/modules/query_index/migrations/Migration20260731105052_query_index.js.map +7 -0
- package/generated/entities.ids.generated.ts +1 -0
- package/package.json +16 -16
- package/src/modules/auth/backend/settings/page.tsx +17 -8
- package/src/modules/customers/cli.ts +17 -7
- package/src/modules/customers/components/detail/ScheduleActivityDialog.tsx +24 -13
- package/src/modules/customers/i18n/de.json +17 -0
- package/src/modules/customers/i18n/en.json +17 -0
- package/src/modules/customers/i18n/es.json +17 -0
- package/src/modules/customers/i18n/pl.json +17 -0
- package/src/modules/customers/search.ts +59 -27
- package/src/modules/data_sync/AGENTS.md +1 -0
- package/src/modules/data_sync/api/mappings/[id]/route.ts +22 -9
- package/src/modules/data_sync/api/mappings/route.ts +13 -4
- package/src/modules/data_sync/api/options.ts +7 -2
- package/src/modules/data_sync/api/run.ts +7 -2
- package/src/modules/data_sync/api/runs/[id]/cancel.ts +8 -3
- package/src/modules/data_sync/api/runs/[id]/retry.ts +7 -2
- package/src/modules/data_sync/api/runs/[id]/route.ts +8 -3
- package/src/modules/data_sync/api/runs.ts +7 -2
- package/src/modules/data_sync/api/schedules/[id]/route.ts +19 -6
- package/src/modules/data_sync/api/schedules/route.ts +13 -4
- package/src/modules/data_sync/api/validate.ts +9 -4
- package/src/modules/design_system/AGENTS.md +34 -0
- package/src/modules/design_system/acl.ts +5 -0
- package/src/modules/design_system/backend/design-system/page.meta.ts +11 -0
- package/src/modules/design_system/backend/design-system/page.tsx +14 -0
- package/src/modules/design_system/gallery/components/CodeSnippet.tsx +55 -0
- package/src/modules/design_system/gallery/components/EntryCard.tsx +95 -0
- package/src/modules/design_system/gallery/components/GalleryShell.tsx +206 -0
- package/src/modules/design_system/gallery/components/VariantPreview.tsx +15 -0
- package/src/modules/design_system/gallery/entries/banners.tsx +226 -0
- package/src/modules/design_system/gallery/entries/buttons.tsx +422 -0
- package/src/modules/design_system/gallery/entries/charts.tsx +518 -0
- package/src/modules/design_system/gallery/entries/dates.tsx +325 -0
- package/src/modules/design_system/gallery/entries/detail.tsx +403 -0
- package/src/modules/design_system/gallery/entries/display.tsx +893 -0
- package/src/modules/design_system/gallery/entries/feedback.tsx +746 -0
- package/src/modules/design_system/gallery/entries/filters.tsx +570 -0
- package/src/modules/design_system/gallery/entries/foundations.tsx +529 -0
- package/src/modules/design_system/gallery/entries/icons.tsx +168 -0
- package/src/modules/design_system/gallery/entries/inputs.tsx +1516 -0
- package/src/modules/design_system/gallery/entries/messages.tsx +339 -0
- package/src/modules/design_system/gallery/entries/navigation.tsx +573 -0
- package/src/modules/design_system/gallery/entries/notifications.tsx +285 -0
- package/src/modules/design_system/gallery/entries/overlays.tsx +677 -0
- package/src/modules/design_system/gallery/entries/scaffolding.tsx +430 -0
- package/src/modules/design_system/gallery/entries/schedule.tsx +307 -0
- package/src/modules/design_system/gallery/registry.ts +152 -0
- package/src/modules/design_system/gallery/types.ts +32 -0
- package/src/modules/design_system/i18n/.hardcoded-allowlist.json +71 -0
- package/src/modules/design_system/i18n/de.json +46 -0
- package/src/modules/design_system/i18n/en.json +46 -0
- package/src/modules/design_system/i18n/es.json +46 -0
- package/src/modules/design_system/i18n/pl.json +46 -0
- package/src/modules/design_system/index.ts +7 -0
- package/src/modules/design_system/setup.ts +12 -0
- package/src/modules/inbox_ops/i18n/de.json +3 -0
- package/src/modules/inbox_ops/i18n/en.json +3 -0
- package/src/modules/inbox_ops/i18n/es.json +3 -0
- package/src/modules/inbox_ops/i18n/pl.json +3 -0
- package/src/modules/inbox_ops/search.ts +20 -4
- package/src/modules/integrations/api/[id]/credentials/route.ts +11 -5
- package/src/modules/integrations/api/[id]/health/route.ts +6 -3
- package/src/modules/integrations/api/[id]/route.ts +6 -3
- package/src/modules/integrations/api/[id]/state/route.ts +6 -3
- package/src/modules/integrations/api/[id]/version/route.ts +6 -3
- package/src/modules/integrations/api/logs/route.ts +6 -3
- package/src/modules/integrations/api/route.ts +6 -3
- package/src/modules/integrations/api/umes-read.ts +2 -2
- package/src/modules/integrations/lib/organization-scope.ts +5 -25
- package/src/modules/messages/i18n/de.json +2 -0
- package/src/modules/messages/i18n/en.json +2 -0
- package/src/modules/messages/i18n/es.json +2 -0
- package/src/modules/messages/i18n/pl.json +2 -0
- package/src/modules/messages/search.ts +11 -5
- package/src/modules/query_index/data/entities.ts +7 -0
- package/src/modules/query_index/lib/engine.ts +40 -63
- package/src/modules/query_index/migrations/.snapshot-open-mercato.json +12 -0
- package/src/modules/query_index/migrations/Migration20260731105052_query_index.ts +35 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { useT } from "@open-mercato/shared/lib/i18n/context";
|
|
4
|
+
import { LUCIDE_ICON_REGISTRY } from "@open-mercato/ui/backend/icons/lucideRegistry";
|
|
5
|
+
import { SearchInput } from "@open-mercato/ui/primitives/search-input";
|
|
6
|
+
import {
|
|
7
|
+
Popover,
|
|
8
|
+
PopoverClose,
|
|
9
|
+
PopoverContent,
|
|
10
|
+
PopoverTrigger
|
|
11
|
+
} from "@open-mercato/ui/primitives/popover";
|
|
12
|
+
import { flash } from "@open-mercato/ui/backend/FlashMessages";
|
|
13
|
+
const FIGMA_ICONS_NODE = "2716:25504";
|
|
14
|
+
function pascalCase(registryName) {
|
|
15
|
+
return registryName.split(/[-_]/).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("");
|
|
16
|
+
}
|
|
17
|
+
function IconTile({ name }) {
|
|
18
|
+
const t = useT();
|
|
19
|
+
const Icon = LUCIDE_ICON_REGISTRY[name];
|
|
20
|
+
const jsxSnippet = `<${pascalCase(name)} aria-hidden className="size-4" />`;
|
|
21
|
+
const copy = React.useCallback(async (payload) => {
|
|
22
|
+
try {
|
|
23
|
+
await navigator.clipboard.writeText(payload);
|
|
24
|
+
flash(t("design_system.gallery.iconCopied", "Copied: {snippet}", { snippet: payload }), "success");
|
|
25
|
+
} catch {
|
|
26
|
+
flash(t("design_system.gallery.copyFailed", "Could not copy the snippet"), "error");
|
|
27
|
+
}
|
|
28
|
+
}, [t]);
|
|
29
|
+
return /* @__PURE__ */ jsxs(Popover, { children: [
|
|
30
|
+
/* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
31
|
+
"button",
|
|
32
|
+
{
|
|
33
|
+
type: "button",
|
|
34
|
+
className: "flex flex-col items-center gap-1.5 rounded-md border border-transparent p-2 transition-colors hover:border-border hover:bg-muted/40 focus-visible:outline-none focus-visible:shadow-focus",
|
|
35
|
+
children: [
|
|
36
|
+
/* @__PURE__ */ jsx(Icon, { "aria-hidden": true, className: "size-5 text-foreground", strokeWidth: 1.75 }),
|
|
37
|
+
/* @__PURE__ */ jsx("code", { className: "max-w-full truncate text-[10px] leading-tight text-muted-foreground", children: name })
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
) }),
|
|
41
|
+
/* @__PURE__ */ jsx(PopoverContent, { align: "center", className: "w-auto max-w-xs p-2", children: /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
|
|
42
|
+
/* @__PURE__ */ jsx(PopoverClose, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
43
|
+
"button",
|
|
44
|
+
{
|
|
45
|
+
type: "button",
|
|
46
|
+
onClick: () => copy(name),
|
|
47
|
+
className: "flex w-full flex-col items-start gap-0.5 rounded-md px-2 py-1.5 text-left transition-colors hover:bg-muted focus-visible:outline-none focus-visible:shadow-focus",
|
|
48
|
+
children: [
|
|
49
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-foreground", children: t("design_system.gallery.iconCopyMeta", "Copy name for page.meta icon") }),
|
|
50
|
+
/* @__PURE__ */ jsx("code", { className: "text-[11px] text-muted-foreground", children: name })
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
) }),
|
|
54
|
+
/* @__PURE__ */ jsx(PopoverClose, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
55
|
+
"button",
|
|
56
|
+
{
|
|
57
|
+
type: "button",
|
|
58
|
+
onClick: () => copy(jsxSnippet),
|
|
59
|
+
className: "flex w-full flex-col items-start gap-0.5 rounded-md px-2 py-1.5 text-left transition-colors hover:bg-muted focus-visible:outline-none focus-visible:shadow-focus",
|
|
60
|
+
children: [
|
|
61
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-foreground", children: t("design_system.gallery.iconCopyJsx", "Copy JSX (lucide-react)") }),
|
|
62
|
+
/* @__PURE__ */ jsx("code", { className: "max-w-full truncate text-[11px] text-muted-foreground", children: jsxSnippet })
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
) })
|
|
66
|
+
] }) })
|
|
67
|
+
] });
|
|
68
|
+
}
|
|
69
|
+
function IconGrid() {
|
|
70
|
+
const t = useT();
|
|
71
|
+
const [query, setQuery] = React.useState("");
|
|
72
|
+
const names = React.useMemo(() => Object.keys(LUCIDE_ICON_REGISTRY).sort((a, b) => a.localeCompare(b)), []);
|
|
73
|
+
const needle = query.trim().toLowerCase();
|
|
74
|
+
const visible = needle ? names.filter((name) => name.toLowerCase().includes(needle)) : names;
|
|
75
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
76
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [
|
|
77
|
+
/* @__PURE__ */ jsx("div", { className: "max-w-sm flex-1", children: /* @__PURE__ */ jsx(
|
|
78
|
+
SearchInput,
|
|
79
|
+
{
|
|
80
|
+
value: query,
|
|
81
|
+
onChange: setQuery,
|
|
82
|
+
placeholder: t("design_system.gallery.iconSearchPlaceholder", "Filter icons\u2026"),
|
|
83
|
+
"aria-label": t("design_system.gallery.iconSearchPlaceholder", "Filter icons\u2026")
|
|
84
|
+
}
|
|
85
|
+
) }),
|
|
86
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: needle ? t("design_system.gallery.iconCountFiltered", "{visible} of {total} icons", {
|
|
87
|
+
visible: visible.length,
|
|
88
|
+
total: names.length
|
|
89
|
+
}) : t("design_system.gallery.iconCountAll", "{total} icons", { total: names.length }) })
|
|
90
|
+
] }),
|
|
91
|
+
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-4 gap-1 sm:grid-cols-6 lg:grid-cols-8", children: visible.map((name) => /* @__PURE__ */ jsx(IconTile, { name }, name)) })
|
|
92
|
+
] });
|
|
93
|
+
}
|
|
94
|
+
const iconRegistryEntry = {
|
|
95
|
+
id: "icon-registry",
|
|
96
|
+
title: "Icon registry",
|
|
97
|
+
importPath: "lucide-react",
|
|
98
|
+
usage: {
|
|
99
|
+
do: [
|
|
100
|
+
"size-4 inside buttons, menus and inline text; size-5 in section navs and toolbars.",
|
|
101
|
+
"Always aria-hidden next to a visible label, or aria-label on icon-only controls.",
|
|
102
|
+
"Color with semantic tokens only (text-muted-foreground, text-status-*-icon).",
|
|
103
|
+
"Icon-only actions use IconButton \u2014 it ships the focus ring, sizing and the aria-label contract."
|
|
104
|
+
],
|
|
105
|
+
dont: [
|
|
106
|
+
"No emoji or font glyphs as icons \u2014 Lucide only.",
|
|
107
|
+
"Never convey status by icon color alone; pair with text or a label.",
|
|
108
|
+
"No hand-drawn SVGs when a Lucide icon exists."
|
|
109
|
+
]
|
|
110
|
+
},
|
|
111
|
+
figmaNodeId: FIGMA_ICONS_NODE,
|
|
112
|
+
variants: [
|
|
113
|
+
{
|
|
114
|
+
id: "registry",
|
|
115
|
+
title: "registered icons",
|
|
116
|
+
render: () => /* @__PURE__ */ jsx(IconGrid, {}),
|
|
117
|
+
code: `export const metadata = { icon: 'shapes' }`
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
id: "component-usage",
|
|
121
|
+
title: "usage in components",
|
|
122
|
+
render: () => {
|
|
123
|
+
const Sample = LUCIDE_ICON_REGISTRY.search ?? Object.values(LUCIDE_ICON_REGISTRY)[0];
|
|
124
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4", children: [
|
|
125
|
+
/* @__PURE__ */ jsx(Sample, { "aria-hidden": true, className: "size-4 text-muted-foreground" }),
|
|
126
|
+
/* @__PURE__ */ jsx(Sample, { "aria-hidden": true, className: "size-5 text-foreground" }),
|
|
127
|
+
/* @__PURE__ */ jsx(Sample, { "aria-hidden": true, className: "size-6 text-status-info-icon" })
|
|
128
|
+
] });
|
|
129
|
+
},
|
|
130
|
+
code: `import { Search } from 'lucide-react'
|
|
131
|
+
|
|
132
|
+
<Search aria-hidden className="size-4 text-muted-foreground" />`
|
|
133
|
+
}
|
|
134
|
+
]
|
|
135
|
+
};
|
|
136
|
+
const entries = [iconRegistryEntry];
|
|
137
|
+
export {
|
|
138
|
+
entries
|
|
139
|
+
};
|
|
140
|
+
//# sourceMappingURL=icons.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/design_system/gallery/entries/icons.tsx"],
|
|
4
|
+
"sourcesContent": ["import * as React from 'react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { LUCIDE_ICON_REGISTRY } from '@open-mercato/ui/backend/icons/lucideRegistry'\nimport { SearchInput } from '@open-mercato/ui/primitives/search-input'\nimport {\n Popover,\n PopoverClose,\n PopoverContent,\n PopoverTrigger,\n} from '@open-mercato/ui/primitives/popover'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport type { GalleryEntry } from '../types'\n\n// Mirrors the DS Figma icon sheet (node 2716:25504, \"Lucide icons\"): a plain\n// grid of outline icons with the name beneath each. The gallery shows the\n// icons REGISTERED in the string-icon registry \u2014 the set page.meta.ts `icon`\n// accepts; components import from lucide-react directly.\n\nconst FIGMA_ICONS_NODE = '2716:25504'\n\nfunction pascalCase(registryName: string): string {\n return registryName\n .split(/[-_]/)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('')\n}\n\n// Clicking a tile opens an explicit two-option menu instead of a hidden\n// copy-mode: each option shows exactly what will land in the clipboard.\nfunction IconTile({ name }: { name: string }) {\n const t = useT()\n const Icon = LUCIDE_ICON_REGISTRY[name]\n const jsxSnippet = `<${pascalCase(name)} aria-hidden className=\"size-4\" />`\n\n const copy = React.useCallback(async (payload: string) => {\n try {\n await navigator.clipboard.writeText(payload)\n flash(t('design_system.gallery.iconCopied', 'Copied: {snippet}', { snippet: payload }), 'success')\n } catch {\n flash(t('design_system.gallery.copyFailed', 'Could not copy the snippet'), 'error')\n }\n }, [t])\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"flex flex-col items-center gap-1.5 rounded-md border border-transparent p-2 transition-colors hover:border-border hover:bg-muted/40 focus-visible:outline-none focus-visible:shadow-focus\"\n >\n <Icon aria-hidden className=\"size-5 text-foreground\" strokeWidth={1.75} />\n <code className=\"max-w-full truncate text-[10px] leading-tight text-muted-foreground\">{name}</code>\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"center\" className=\"w-auto max-w-xs p-2\">\n <div className=\"space-y-1\">\n <PopoverClose asChild>\n <button\n type=\"button\"\n onClick={() => copy(name)}\n className=\"flex w-full flex-col items-start gap-0.5 rounded-md px-2 py-1.5 text-left transition-colors hover:bg-muted focus-visible:outline-none focus-visible:shadow-focus\"\n >\n <span className=\"text-xs font-medium text-foreground\">\n {t('design_system.gallery.iconCopyMeta', 'Copy name for page.meta icon')}\n </span>\n <code className=\"text-[11px] text-muted-foreground\">{name}</code>\n </button>\n </PopoverClose>\n <PopoverClose asChild>\n <button\n type=\"button\"\n onClick={() => copy(jsxSnippet)}\n className=\"flex w-full flex-col items-start gap-0.5 rounded-md px-2 py-1.5 text-left transition-colors hover:bg-muted focus-visible:outline-none focus-visible:shadow-focus\"\n >\n <span className=\"text-xs font-medium text-foreground\">\n {t('design_system.gallery.iconCopyJsx', 'Copy JSX (lucide-react)')}\n </span>\n <code className=\"max-w-full truncate text-[11px] text-muted-foreground\">{jsxSnippet}</code>\n </button>\n </PopoverClose>\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n\nfunction IconGrid() {\n const t = useT()\n const [query, setQuery] = React.useState('')\n const names = React.useMemo(() => Object.keys(LUCIDE_ICON_REGISTRY).sort((a, b) => a.localeCompare(b)), [])\n const needle = query.trim().toLowerCase()\n const visible = needle ? names.filter((name) => name.toLowerCase().includes(needle)) : names\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"max-w-sm flex-1\">\n <SearchInput\n value={query}\n onChange={setQuery}\n placeholder={t('design_system.gallery.iconSearchPlaceholder', 'Filter icons\u2026')}\n aria-label={t('design_system.gallery.iconSearchPlaceholder', 'Filter icons\u2026')}\n />\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {needle\n ? t('design_system.gallery.iconCountFiltered', '{visible} of {total} icons', {\n visible: visible.length,\n total: names.length,\n })\n : t('design_system.gallery.iconCountAll', '{total} icons', { total: names.length })}\n </p>\n </div>\n <div className=\"grid grid-cols-4 gap-1 sm:grid-cols-6 lg:grid-cols-8\">\n {visible.map((name) => (\n <IconTile key={name} name={name} />\n ))}\n </div>\n </div>\n )\n}\n\nconst iconRegistryEntry: GalleryEntry = {\n id: 'icon-registry',\n title: 'Icon registry',\n importPath: 'lucide-react',\n usage: {\n do: [\n 'size-4 inside buttons, menus and inline text; size-5 in section navs and toolbars.',\n 'Always aria-hidden next to a visible label, or aria-label on icon-only controls.',\n 'Color with semantic tokens only (text-muted-foreground, text-status-*-icon).',\n 'Icon-only actions use IconButton \u2014 it ships the focus ring, sizing and the aria-label contract.',\n ],\n dont: [\n 'No emoji or font glyphs as icons \u2014 Lucide only.',\n 'Never convey status by icon color alone; pair with text or a label.',\n 'No hand-drawn SVGs when a Lucide icon exists.',\n ],\n },\n figmaNodeId: FIGMA_ICONS_NODE,\n variants: [\n {\n id: 'registry',\n title: 'registered icons',\n render: () => <IconGrid />,\n code: `export const metadata = { icon: 'shapes' }`,\n },\n {\n id: 'component-usage',\n title: 'usage in components',\n render: () => {\n const Sample = LUCIDE_ICON_REGISTRY.search ?? Object.values(LUCIDE_ICON_REGISTRY)[0]\n return (\n <div className=\"flex items-center gap-4\">\n <Sample aria-hidden className=\"size-4 text-muted-foreground\" />\n <Sample aria-hidden className=\"size-5 text-foreground\" />\n <Sample aria-hidden className=\"size-6 text-status-info-icon\" />\n </div>\n )\n },\n code: `import { Search } from 'lucide-react'\n\n<Search aria-hidden className=\"size-4 text-muted-foreground\" />`,\n },\n ],\n}\n\nexport const entries: GalleryEntry[] = [iconRegistryEntry]\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|