@intent-driven/adapter-mantine 0.1.1

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/index.mjs ADDED
@@ -0,0 +1,605 @@
1
+ // src/adapter.jsx
2
+ import {
3
+ TextInput,
4
+ Textarea,
5
+ NumberInput,
6
+ Select,
7
+ Button,
8
+ ActionIcon,
9
+ Modal,
10
+ Tabs,
11
+ Title,
12
+ Text,
13
+ Badge,
14
+ Avatar,
15
+ Paper,
16
+ Menu
17
+ } from "@mantine/core";
18
+ import { DateInput, TimeInput } from "@mantine/dates";
19
+ import { Icon, labels } from "@intent-driven/renderer";
20
+ import {
21
+ Pencil,
22
+ Trash2,
23
+ Plus,
24
+ Check,
25
+ X,
26
+ Send,
27
+ Paperclip,
28
+ Mic,
29
+ Image as ImageIcon,
30
+ Video,
31
+ MapPin,
32
+ Vote,
33
+ CornerUpRight,
34
+ BookmarkPlus,
35
+ Bookmark,
36
+ Pin,
37
+ PinOff,
38
+ Copy,
39
+ Languages,
40
+ BellOff,
41
+ Bell,
42
+ Phone,
43
+ PhoneOff,
44
+ Star,
45
+ Search,
46
+ Filter,
47
+ ArrowUpDown,
48
+ MessageCircle,
49
+ Users,
50
+ Megaphone,
51
+ UserPlus,
52
+ LogOut,
53
+ ArrowUp,
54
+ ArrowDown,
55
+ Key,
56
+ Settings,
57
+ Download,
58
+ Upload,
59
+ Info,
60
+ CircleSlash,
61
+ AlertTriangle,
62
+ Play,
63
+ Pause,
64
+ Square,
65
+ Save,
66
+ Unplug,
67
+ Plug,
68
+ Link2,
69
+ Scissors,
70
+ Move,
71
+ MessageSquare,
72
+ Lock,
73
+ Lightbulb,
74
+ Clock,
75
+ RotateCcw,
76
+ Smile,
77
+ Eye,
78
+ EyeOff,
79
+ Share,
80
+ Zap,
81
+ MoreHorizontal
82
+ } from "lucide-react";
83
+ import { jsx, jsxs } from "react/jsx-runtime";
84
+ var { humanLabel } = labels;
85
+ var EMOJI_TO_LUCIDE = {
86
+ "\u270E": Pencil,
87
+ "\u{1F5D1}": Trash2,
88
+ "\u2795": Plus,
89
+ "+": Plus,
90
+ "\u2713": Check,
91
+ "\u2715": X,
92
+ "\xD7": X,
93
+ "\u{1F4E4}": Send,
94
+ "\u{1F4CE}": Paperclip,
95
+ "\u{1F3A4}": Mic,
96
+ "\u{1F399}": Mic,
97
+ "\u{1F5BC}": ImageIcon,
98
+ "\u{1F3AC}": Video,
99
+ "\u{1F4CD}": MapPin,
100
+ "\u{1F4CC}": Pin,
101
+ "\u{1F5F3}": Vote,
102
+ "\u2197": CornerUpRight,
103
+ "\u2B50": Star,
104
+ "\u2606": BookmarkPlus,
105
+ "\u2398": Copy,
106
+ "\u{1F310}": Languages,
107
+ "\u{1F507}": BellOff,
108
+ "\u{1F514}": Bell,
109
+ "\u{1F4DE}": Phone,
110
+ "\u{1F4F9}": Video,
111
+ "\u{1F4F5}": PhoneOff,
112
+ "\u{1F50D}": Search,
113
+ "\u22EF": MoreHorizontal,
114
+ "\u2026": MoreHorizontal,
115
+ "\u21C5": ArrowUpDown,
116
+ "\u2699": Settings,
117
+ "\u{1F464}": Users,
118
+ "\u{1F465}": Users,
119
+ "\u{1F4E2}": Megaphone,
120
+ "\u2709": Send,
121
+ "\u2B06": ArrowUp,
122
+ "\u2B07": ArrowDown,
123
+ "\u{1F511}": Key,
124
+ "\u2190": LogOut,
125
+ "\u2192": LogOut,
126
+ "\u2139": Info,
127
+ "\u26A1": Zap,
128
+ "\u25CF": Eye,
129
+ "\u{1F4AC}": MessageCircle,
130
+ "\u{1F512}": Lock,
131
+ "\u{1F4A1}": Lightbulb,
132
+ "\u23F0": Clock,
133
+ "\u{1F504}": RotateCcw,
134
+ "\u25B6": Play,
135
+ "\u23F8": Pause,
136
+ "\u23F9": Square,
137
+ "\u{1F4BE}": Save,
138
+ "\u{1F517}": Link2,
139
+ "\u2702": Scissors,
140
+ "\u2725": Move,
141
+ "\u{1F6AB}": CircleSlash,
142
+ "\u26A0": AlertTriangle,
143
+ "\u{1F4E6}": BookmarkPlus,
144
+ "\u{1F60A}": Smile,
145
+ "\u{1F4CA}": Vote,
146
+ "\u{1F4C5}": Clock,
147
+ "\u{1F3B5}": Play,
148
+ "\u{1F389}": Star,
149
+ "\u{1F525}": Zap
150
+ };
151
+ function resolveLucide(emoji) {
152
+ return EMOJI_TO_LUCIDE[emoji] || null;
153
+ }
154
+ function MantineTextInput({ spec, value, onChange, error }) {
155
+ return /* @__PURE__ */ jsx(
156
+ TextInput,
157
+ {
158
+ label: humanLabel(spec.name, spec.label),
159
+ value: value ?? "",
160
+ onChange: (e) => onChange(e.currentTarget.value),
161
+ placeholder: spec.placeholder,
162
+ required: spec.required,
163
+ error
164
+ }
165
+ );
166
+ }
167
+ function MantineEmail({ spec, value, onChange, error }) {
168
+ return /* @__PURE__ */ jsx(
169
+ TextInput,
170
+ {
171
+ type: "email",
172
+ label: humanLabel(spec.name, spec.label),
173
+ value: value ?? "",
174
+ onChange: (e) => onChange(e.currentTarget.value),
175
+ placeholder: spec.placeholder || "name@example.com",
176
+ required: spec.required,
177
+ error
178
+ }
179
+ );
180
+ }
181
+ function MantineUrl({ spec, value, onChange, error }) {
182
+ return /* @__PURE__ */ jsx(
183
+ TextInput,
184
+ {
185
+ type: "url",
186
+ label: humanLabel(spec.name, spec.label),
187
+ value: value ?? "",
188
+ onChange: (e) => onChange(e.currentTarget.value),
189
+ placeholder: spec.placeholder,
190
+ required: spec.required,
191
+ error
192
+ }
193
+ );
194
+ }
195
+ function MantineTel({ spec, value, onChange, error }) {
196
+ return /* @__PURE__ */ jsx(
197
+ TextInput,
198
+ {
199
+ type: "tel",
200
+ label: humanLabel(spec.name, spec.label),
201
+ value: value ?? "",
202
+ onChange: (e) => onChange(e.currentTarget.value),
203
+ placeholder: spec.placeholder,
204
+ required: spec.required,
205
+ error
206
+ }
207
+ );
208
+ }
209
+ function MantineTextarea({ spec, value, onChange, error }) {
210
+ return /* @__PURE__ */ jsx(
211
+ Textarea,
212
+ {
213
+ label: humanLabel(spec.name, spec.label),
214
+ value: value ?? "",
215
+ onChange: (e) => onChange(e.currentTarget.value),
216
+ placeholder: spec.placeholder,
217
+ required: spec.required,
218
+ error,
219
+ autosize: true,
220
+ minRows: 2,
221
+ maxRows: 6
222
+ }
223
+ );
224
+ }
225
+ function MantineNumber({ spec, value, onChange, error }) {
226
+ return /* @__PURE__ */ jsx(
227
+ NumberInput,
228
+ {
229
+ label: humanLabel(spec.name, spec.label),
230
+ value: value === "" || value == null ? "" : value,
231
+ onChange: (v) => onChange(v),
232
+ placeholder: spec.placeholder,
233
+ required: spec.required,
234
+ error
235
+ }
236
+ );
237
+ }
238
+ function MantineDateTime({ spec, value, onChange, error }) {
239
+ const name = spec.name || "";
240
+ const label = humanLabel(name, spec.label);
241
+ const isTimeOnly = /time/i.test(name) && !/date/i.test(name);
242
+ if (isTimeOnly) {
243
+ return /* @__PURE__ */ jsx(
244
+ TimeInput,
245
+ {
246
+ label,
247
+ value: value ?? "",
248
+ onChange: (e) => onChange(e.currentTarget.value),
249
+ required: spec.required,
250
+ error
251
+ }
252
+ );
253
+ }
254
+ return /* @__PURE__ */ jsx(
255
+ DateInput,
256
+ {
257
+ label,
258
+ value: value ?? null,
259
+ onChange: (v) => onChange(v || ""),
260
+ placeholder: "\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u0430\u0442\u0443",
261
+ required: spec.required,
262
+ error,
263
+ valueFormat: "DD.MM.YYYY",
264
+ clearable: true
265
+ }
266
+ );
267
+ }
268
+ function MantineSelect({ spec, value, onChange, error }) {
269
+ const data = (spec.options || []).map(
270
+ (o) => typeof o === "string" ? { value: o, label: o } : o
271
+ );
272
+ return /* @__PURE__ */ jsx(
273
+ Select,
274
+ {
275
+ label: humanLabel(spec.name, spec.label),
276
+ data,
277
+ value: value ?? null,
278
+ onChange: (v) => onChange(v || ""),
279
+ placeholder: spec.placeholder || "\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435\u2026",
280
+ required: spec.required,
281
+ error,
282
+ clearable: true
283
+ }
284
+ );
285
+ }
286
+ function normalizeIcon(icon) {
287
+ if (!icon) return void 0;
288
+ if (typeof icon === "string") return /* @__PURE__ */ jsx(Icon, { emoji: icon, size: 16 });
289
+ return icon;
290
+ }
291
+ function MantinePrimaryButton({ label, icon, onClick, disabled, title, size }) {
292
+ return /* @__PURE__ */ jsx(
293
+ Button,
294
+ {
295
+ onClick,
296
+ disabled,
297
+ title,
298
+ leftSection: normalizeIcon(icon),
299
+ color: "indigo",
300
+ size: size || "sm",
301
+ children: label
302
+ }
303
+ );
304
+ }
305
+ function MantineSecondaryButton({ label, icon, onClick, disabled, title, size }) {
306
+ return /* @__PURE__ */ jsx(
307
+ Button,
308
+ {
309
+ onClick,
310
+ disabled,
311
+ title,
312
+ leftSection: normalizeIcon(icon),
313
+ variant: "default",
314
+ size: size || "sm",
315
+ children: label
316
+ }
317
+ );
318
+ }
319
+ function MantineDangerButton({ label, icon, onClick, disabled, title, size }) {
320
+ return /* @__PURE__ */ jsx(
321
+ Button,
322
+ {
323
+ onClick,
324
+ disabled,
325
+ title,
326
+ leftSection: normalizeIcon(icon),
327
+ color: "red",
328
+ size: size || "sm",
329
+ children: label
330
+ }
331
+ );
332
+ }
333
+ function MantineOverflowMenu({ items, triggerIcon, triggerLabel }) {
334
+ if (!items || items.length === 0) return null;
335
+ const grouped = groupOverflowItems(items);
336
+ const hasSections = grouped.length > 1;
337
+ return /* @__PURE__ */ jsxs(Menu, { shadow: "md", width: 240, position: "bottom-end", withArrow: true, children: [
338
+ /* @__PURE__ */ jsx(Menu.Target, { children: /* @__PURE__ */ jsx(
339
+ ActionIcon,
340
+ {
341
+ variant: "default",
342
+ size: "lg",
343
+ title: triggerLabel || "\u0415\u0449\u0451",
344
+ "aria-label": triggerLabel || "\u0415\u0449\u0451",
345
+ children: /* @__PURE__ */ jsx(Icon, { emoji: triggerIcon || "\u22EF", size: 18 })
346
+ }
347
+ ) }),
348
+ /* @__PURE__ */ jsx(Menu.Dropdown, { style: { maxHeight: "60vh", overflowY: "auto" }, children: grouped.map((section, si) => /* @__PURE__ */ jsxs("span", { children: [
349
+ hasSections && si > 0 && /* @__PURE__ */ jsx(Menu.Divider, {}),
350
+ hasSections && section.label && /* @__PURE__ */ jsx(Menu.Label, { children: section.label }),
351
+ section.items.map((item) => item.divider ? /* @__PURE__ */ jsx(Menu.Divider, {}, item.key) : /* @__PURE__ */ jsx(
352
+ Menu.Item,
353
+ {
354
+ leftSection: item.icon ? /* @__PURE__ */ jsx(Icon, { emoji: item.icon, size: 14 }) : void 0,
355
+ onClick: item.onClick,
356
+ children: item.label
357
+ },
358
+ item.key
359
+ ))
360
+ ] }, si)) })
361
+ ] });
362
+ }
363
+ function groupOverflowItems(items) {
364
+ if (items.length <= 8) return [{ label: null, items }];
365
+ const byIcon = /* @__PURE__ */ new Map();
366
+ const order = [];
367
+ for (const item of items) {
368
+ const key = item.icon || "__none__";
369
+ if (!byIcon.has(key)) {
370
+ byIcon.set(key, []);
371
+ order.push(key);
372
+ }
373
+ byIcon.get(key).push(item);
374
+ }
375
+ const sections = [];
376
+ const singles = [];
377
+ for (const key of order) {
378
+ const group = byIcon.get(key);
379
+ if (group.length >= 2) {
380
+ sections.push({ label: group[0].label?.split(" ")[0] || null, items: group });
381
+ } else {
382
+ singles.push(...group);
383
+ }
384
+ }
385
+ if (singles.length > 0) {
386
+ sections.push({ label: sections.length > 0 ? "\u0414\u0440\u0443\u0433\u043E\u0435" : null, items: singles });
387
+ }
388
+ return sections.length > 0 ? sections : [{ label: null, items }];
389
+ }
390
+ function MantineIntentButton({ spec, onClick, disabled }) {
391
+ const label = spec.label || spec.intentId;
392
+ const icon = spec.icon;
393
+ const LABEL_MAX = 14;
394
+ const showLabel = label.length <= LABEL_MAX;
395
+ const isDanger = spec.variant === "danger" || spec.irreversibility === "high";
396
+ const isPrimary = spec.variant === "primary";
397
+ const color = isDanger ? "red" : isPrimary ? "indigo" : void 0;
398
+ const variant = isDanger || isPrimary ? "light" : "default";
399
+ if (!showLabel || !label) {
400
+ return /* @__PURE__ */ jsx(
401
+ ActionIcon,
402
+ {
403
+ onClick,
404
+ disabled,
405
+ title: label,
406
+ size: "lg",
407
+ variant,
408
+ color,
409
+ children: /* @__PURE__ */ jsx(Icon, { emoji: icon, size: 18 })
410
+ }
411
+ );
412
+ }
413
+ return /* @__PURE__ */ jsx(
414
+ Button,
415
+ {
416
+ onClick,
417
+ disabled,
418
+ title: label,
419
+ size: "sm",
420
+ variant,
421
+ color,
422
+ leftSection: icon ? /* @__PURE__ */ jsx(Icon, { emoji: icon, size: 16 }) : void 0,
423
+ children: label
424
+ }
425
+ );
426
+ }
427
+ function MantineHeading({ level = 2, children }) {
428
+ const order = Math.min(6, Math.max(1, level));
429
+ return /* @__PURE__ */ jsx(Title, { order, children });
430
+ }
431
+ var TEXT_PRESETS = {
432
+ body: { size: "sm" },
433
+ secondary: { size: "xs", c: "dimmed" },
434
+ muted: { size: "xs", c: "dimmed" },
435
+ heading: { fw: 700, size: "md" },
436
+ accent: { fw: 600, c: "indigo" },
437
+ danger: { c: "red" },
438
+ success: { c: "green" }
439
+ };
440
+ function MantineText({ children, preset, style }) {
441
+ const props = preset && TEXT_PRESETS[preset] || {};
442
+ return /* @__PURE__ */ jsx(Text, { ...props, style, children });
443
+ }
444
+ function MantineBadge({ children, color }) {
445
+ return /* @__PURE__ */ jsx(Badge, { color: color || "indigo", variant: "light", size: "sm", radius: "sm", children });
446
+ }
447
+ function MantineAvatar({ src, name, size = 40 }) {
448
+ return /* @__PURE__ */ jsx(
449
+ Avatar,
450
+ {
451
+ src: src || void 0,
452
+ name: name || "?",
453
+ color: "initials",
454
+ size,
455
+ radius: "xl",
456
+ children: !src && name ? name[0]?.toUpperCase() : null
457
+ }
458
+ );
459
+ }
460
+ function MantinePaper({ children, padding, withBorder, style }) {
461
+ return /* @__PURE__ */ jsx(
462
+ Paper,
463
+ {
464
+ p: padding ?? "md",
465
+ withBorder: withBorder !== false,
466
+ radius: "md",
467
+ style,
468
+ children
469
+ }
470
+ );
471
+ }
472
+ function MantineModalShell({ onClose, children, title }) {
473
+ return /* @__PURE__ */ jsx(
474
+ Modal,
475
+ {
476
+ opened: true,
477
+ onClose,
478
+ title,
479
+ centered: true,
480
+ size: "md",
481
+ padding: "lg",
482
+ radius: "md",
483
+ overlayProps: { backgroundOpacity: 0.55, blur: 2 },
484
+ children
485
+ }
486
+ );
487
+ }
488
+ function MantineTabs({ items, active, onSelect, extra }) {
489
+ return /* @__PURE__ */ jsxs("div", { style: {
490
+ display: "flex",
491
+ alignItems: "center",
492
+ borderBottom: "1px solid var(--mantine-color-default-border)",
493
+ background: "var(--mantine-color-default)"
494
+ }, children: [
495
+ /* @__PURE__ */ jsx(
496
+ Tabs,
497
+ {
498
+ value: active || null,
499
+ onChange: (v) => v && onSelect && onSelect(v),
500
+ variant: "default",
501
+ style: { flex: 1 },
502
+ children: /* @__PURE__ */ jsx(Tabs.List, { style: { border: "none" }, children: items.map((item) => /* @__PURE__ */ jsx(Tabs.Tab, { value: item.value, children: item.label }, item.value)) })
503
+ }
504
+ ),
505
+ extra && /* @__PURE__ */ jsx("div", { style: { marginRight: 8 }, children: extra })
506
+ ] });
507
+ }
508
+ var mantineAdapter = {
509
+ name: "mantine",
510
+ // §26.4 + §26.6: capability surface. Mantine-адаптер не реализует
511
+ // chart/sparkline/statistic напрямую — primitive.jsx рендерит SVG-
512
+ // fallback, капабилити явно документируют.
513
+ capabilities: {
514
+ primitive: {
515
+ chart: { chartTypes: ["line", "pie"], fallback: "svg" },
516
+ sparkline: { fallback: "svg" },
517
+ statistic: false,
518
+ // нет — используется chart-fallback или text-primitive
519
+ heading: true,
520
+ text: true,
521
+ badge: true,
522
+ avatar: true,
523
+ paper: true
524
+ },
525
+ shell: { modal: true, tabs: true },
526
+ button: { primary: true, secondary: true, danger: true, intent: true, overflow: true }
527
+ },
528
+ parameter: {
529
+ text: MantineTextInput,
530
+ textarea: MantineTextarea,
531
+ email: MantineEmail,
532
+ url: MantineUrl,
533
+ tel: MantineTel,
534
+ number: MantineNumber,
535
+ datetime: MantineDateTime,
536
+ select: MantineSelect
537
+ // image и file оставляем на built-in — у них специфичная логика
538
+ // FileReader→data URL (ImageControl.jsx). Адаптируем позже через
539
+ // Mantine FileButton / Dropzone.
540
+ },
541
+ button: {
542
+ primary: MantinePrimaryButton,
543
+ secondary: MantineSecondaryButton,
544
+ danger: MantineDangerButton,
545
+ intent: MantineIntentButton,
546
+ overflow: MantineOverflowMenu
547
+ },
548
+ shell: {
549
+ modal: MantineModalShell,
550
+ tabs: MantineTabs
551
+ },
552
+ primitive: {
553
+ heading: MantineHeading,
554
+ text: MantineText,
555
+ badge: MantineBadge,
556
+ avatar: MantineAvatar,
557
+ paper: MantinePaper
558
+ },
559
+ icon: {
560
+ // resolve — функция (не компонент), используется <Icon> для lookup.
561
+ // Принимает emoji-строку, возвращает React-компонент или null.
562
+ resolve: resolveLucide
563
+ }
564
+ };
565
+
566
+ // src/provider.jsx
567
+ import React from "react";
568
+ import {
569
+ MantineProvider,
570
+ ColorSchemeScript,
571
+ localStorageColorSchemeManager
572
+ } from "@mantine/core";
573
+ import { DatesProvider } from "@mantine/dates";
574
+ import { registerUIAdapter } from "@intent-driven/renderer";
575
+ import "@mantine/core/styles.css";
576
+ import "@mantine/dates/styles.css";
577
+ import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
578
+ function MantineAdapterProvider({
579
+ children,
580
+ colorSchemeManager,
581
+ theme = { primaryColor: "indigo" },
582
+ datesSettings = { locale: "ru", firstDayOfWeek: 1, weekendDays: [0, 6] },
583
+ defaultColorScheme = "light"
584
+ }) {
585
+ React.useEffect(() => {
586
+ registerUIAdapter(mantineAdapter);
587
+ }, []);
588
+ return /* @__PURE__ */ jsxs2(Fragment, { children: [
589
+ /* @__PURE__ */ jsx2(ColorSchemeScript, { defaultColorScheme }),
590
+ /* @__PURE__ */ jsx2(
591
+ MantineProvider,
592
+ {
593
+ defaultColorScheme,
594
+ colorSchemeManager: colorSchemeManager ?? localStorageColorSchemeManager({ key: "idf_theme" }),
595
+ theme,
596
+ children: /* @__PURE__ */ jsx2(DatesProvider, { settings: datesSettings, children })
597
+ }
598
+ )
599
+ ] });
600
+ }
601
+ export {
602
+ MantineAdapterProvider,
603
+ mantineAdapter
604
+ };
605
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapter.jsx","../src/provider.jsx"],"sourcesContent":["/**\n * Mantine UI-адаптер (§17 манифеста — адаптивный слой).\n *\n * Мапит declarative control-specs в компоненты @mantine/core и @mantine/dates.\n * Регистрируется один раз при bootstrap приложения через\n * `registerUIAdapter(mantineAdapter)`.\n *\n * Категории (ключи adapter'а):\n * - parameter: text/textarea/datetime/email/... — формы\n * - button: primary/secondary/danger — кнопки\n */\n\nimport {\n TextInput,\n Textarea,\n NumberInput,\n Select,\n Button,\n ActionIcon,\n Modal,\n Tabs,\n Title,\n Text,\n Badge,\n Avatar,\n Paper,\n Menu,\n} from \"@mantine/core\";\nimport { DateInput, TimeInput } from \"@mantine/dates\";\nimport { Icon, labels } from \"@intent-driven/renderer\";\nimport {\n Pencil,\n Trash2,\n Plus,\n Check,\n X,\n Send,\n Paperclip,\n Mic,\n Image as ImageIcon,\n Video,\n MapPin,\n Vote,\n CornerUpRight,\n BookmarkPlus,\n Bookmark,\n Pin,\n PinOff,\n Copy,\n Languages,\n BellOff,\n Bell,\n Phone,\n PhoneOff,\n Star,\n Search,\n Filter,\n ArrowUpDown,\n MessageCircle,\n Users,\n Megaphone,\n UserPlus,\n LogOut,\n ArrowUp,\n ArrowDown,\n Key,\n Settings,\n Download,\n Upload,\n Info,\n CircleSlash,\n AlertTriangle,\n Play,\n Pause,\n Square,\n Save,\n Unplug,\n Plug,\n Link2,\n Scissors,\n Move,\n MessageSquare,\n Lock,\n Lightbulb,\n Clock,\n RotateCcw,\n Smile,\n Eye,\n EyeOff,\n Share,\n Zap,\n MoreHorizontal,\n} from \"lucide-react\";\n\nconst { humanLabel } = labels;\n\n// ============================================================\n// Icon map: emoji → Lucide component\n// ============================================================\n\n/**\n * Маппинг emoji-кодов (из getIntentIcon) в компоненты lucide-react.\n * Позволяет рендерить профессиональные SVG-иконки вместо emoji, сохраняя\n * backward-совместимость с декларативным spec.icon = \"✎\" / \"🗑\".\n *\n * Не покрытые emoji рендерятся как fallback-текст в <Icon>.\n */\nconst EMOJI_TO_LUCIDE = {\n \"✎\": Pencil,\n \"🗑\": Trash2,\n \"➕\": Plus,\n \"+\": Plus,\n \"✓\": Check,\n \"✕\": X,\n \"×\": X,\n \"📤\": Send,\n \"📎\": Paperclip,\n \"🎤\": Mic,\n \"🎙\": Mic,\n \"🖼\": ImageIcon,\n \"🎬\": Video,\n \"📍\": MapPin,\n \"📌\": Pin,\n \"🗳\": Vote,\n \"↗\": CornerUpRight,\n \"⭐\": Star,\n \"☆\": BookmarkPlus,\n \"⎘\": Copy,\n \"🌐\": Languages,\n \"🔇\": BellOff,\n \"🔔\": Bell,\n \"📞\": Phone,\n \"📹\": Video,\n \"📵\": PhoneOff,\n \"🔍\": Search,\n \"⋯\": MoreHorizontal,\n \"…\": MoreHorizontal,\n \"⇅\": ArrowUpDown,\n \"⚙\": Settings,\n \"👤\": Users,\n \"👥\": Users,\n \"📢\": Megaphone,\n \"✉\": Send,\n \"⬆\": ArrowUp,\n \"⬇\": ArrowDown,\n \"🔑\": Key,\n \"←\": LogOut,\n \"→\": LogOut,\n \"ℹ\": Info,\n \"⚡\": Zap,\n \"●\": Eye,\n \"💬\": MessageCircle,\n \"🔒\": Lock,\n \"💡\": Lightbulb,\n \"⏰\": Clock,\n \"🔄\": RotateCcw,\n \"▶\": Play,\n \"⏸\": Pause,\n \"⏹\": Square,\n \"💾\": Save,\n \"🔗\": Link2,\n \"✂\": Scissors,\n \"✥\": Move,\n \"🚫\": CircleSlash,\n \"⚠\": AlertTriangle,\n \"📦\": BookmarkPlus,\n \"😊\": Smile,\n \"📊\": Vote,\n \"📅\": Clock,\n \"🎵\": Play,\n \"🎉\": Star,\n \"🔥\": Zap,\n};\n\nfunction resolveLucide(emoji) {\n return EMOJI_TO_LUCIDE[emoji] || null;\n}\n\n// ============================================================\n// Parameter controls\n// ============================================================\n\nfunction MantineTextInput({ spec, value, onChange, error }) {\n return (\n <TextInput\n label={humanLabel(spec.name, spec.label)}\n value={value ?? \"\"}\n onChange={(e) => onChange(e.currentTarget.value)}\n placeholder={spec.placeholder}\n required={spec.required}\n error={error}\n />\n );\n}\n\nfunction MantineEmail({ spec, value, onChange, error }) {\n return (\n <TextInput\n type=\"email\"\n label={humanLabel(spec.name, spec.label)}\n value={value ?? \"\"}\n onChange={(e) => onChange(e.currentTarget.value)}\n placeholder={spec.placeholder || \"name@example.com\"}\n required={spec.required}\n error={error}\n />\n );\n}\n\nfunction MantineUrl({ spec, value, onChange, error }) {\n return (\n <TextInput\n type=\"url\"\n label={humanLabel(spec.name, spec.label)}\n value={value ?? \"\"}\n onChange={(e) => onChange(e.currentTarget.value)}\n placeholder={spec.placeholder}\n required={spec.required}\n error={error}\n />\n );\n}\n\nfunction MantineTel({ spec, value, onChange, error }) {\n return (\n <TextInput\n type=\"tel\"\n label={humanLabel(spec.name, spec.label)}\n value={value ?? \"\"}\n onChange={(e) => onChange(e.currentTarget.value)}\n placeholder={spec.placeholder}\n required={spec.required}\n error={error}\n />\n );\n}\n\nfunction MantineTextarea({ spec, value, onChange, error }) {\n return (\n <Textarea\n label={humanLabel(spec.name, spec.label)}\n value={value ?? \"\"}\n onChange={(e) => onChange(e.currentTarget.value)}\n placeholder={spec.placeholder}\n required={spec.required}\n error={error}\n autosize\n minRows={2}\n maxRows={6}\n />\n );\n}\n\nfunction MantineNumber({ spec, value, onChange, error }) {\n return (\n <NumberInput\n label={humanLabel(spec.name, spec.label)}\n value={value === \"\" || value == null ? \"\" : value}\n onChange={(v) => onChange(v)}\n placeholder={spec.placeholder}\n required={spec.required}\n error={error}\n />\n );\n}\n\n/**\n * DateTime control — две стратегии по spec.name:\n * - pure time (startTime/endTime/time) → TimeInput (HH:MM)\n * - date и остальное → DateInput с календарём\n *\n * Mantine 9: DateInput использует string (\"YYYY-MM-DD\"), TimeInput —\n * обычный <input type=\"time\">. Value передаём/принимаем как string.\n */\nfunction MantineDateTime({ spec, value, onChange, error }) {\n const name = spec.name || \"\";\n const label = humanLabel(name, spec.label);\n const isTimeOnly = /time/i.test(name) && !/date/i.test(name);\n\n if (isTimeOnly) {\n return (\n <TimeInput\n label={label}\n value={value ?? \"\"}\n onChange={(e) => onChange(e.currentTarget.value)}\n required={spec.required}\n error={error}\n />\n );\n }\n\n return (\n <DateInput\n label={label}\n value={value ?? null}\n onChange={(v) => onChange(v || \"\")}\n placeholder=\"Выберите дату\"\n required={spec.required}\n error={error}\n valueFormat=\"DD.MM.YYYY\"\n clearable\n />\n );\n}\n\nfunction MantineSelect({ spec, value, onChange, error }) {\n const data = (spec.options || []).map((o) =>\n typeof o === \"string\" ? { value: o, label: o } : o\n );\n return (\n <Select\n label={humanLabel(spec.name, spec.label)}\n data={data}\n value={value ?? null}\n onChange={(v) => onChange(v || \"\")}\n placeholder={spec.placeholder || \"Выберите…\"}\n required={spec.required}\n error={error}\n clearable\n />\n );\n}\n\n// ============================================================\n// Buttons\n// ============================================================\n\n// Helper: icon может приехать как emoji-строка или как React-элемент.\n// Приводим к React-узлу через <Icon> если строка.\nfunction normalizeIcon(icon) {\n if (!icon) return undefined;\n if (typeof icon === \"string\") return <Icon emoji={icon} size={16} />;\n return icon;\n}\n\nfunction MantinePrimaryButton({ label, icon, onClick, disabled, title, size }) {\n return (\n <Button\n onClick={onClick}\n disabled={disabled}\n title={title}\n leftSection={normalizeIcon(icon)}\n color=\"indigo\"\n size={size || \"sm\"}\n >\n {label}\n </Button>\n );\n}\n\nfunction MantineSecondaryButton({ label, icon, onClick, disabled, title, size }) {\n return (\n <Button\n onClick={onClick}\n disabled={disabled}\n title={title}\n leftSection={normalizeIcon(icon)}\n variant=\"default\"\n size={size || \"sm\"}\n >\n {label}\n </Button>\n );\n}\n\nfunction MantineDangerButton({ label, icon, onClick, disabled, title, size }) {\n return (\n <Button\n onClick={onClick}\n disabled={disabled}\n title={title}\n leftSection={normalizeIcon(icon)}\n color=\"red\"\n size={size || \"sm\"}\n >\n {label}\n </Button>\n );\n}\n\n/**\n * Overflow menu — Mantine Menu. trigger-кнопка = ActionIcon с \"⋯\",\n * при клике открывается dropdown c списком items (label + иконка).\n *\n * items: [{ key, label, icon, onClick }]\n */\nfunction MantineOverflowMenu({ items, triggerIcon, triggerLabel }) {\n if (!items || items.length === 0) return null;\n\n // Группировка по иконке: элементы с одинаковой иконкой попадают в секцию.\n // Если секций > 1, разделяем Menu.Divider'ами для лучшей читаемости.\n const grouped = groupOverflowItems(items);\n const hasSections = grouped.length > 1;\n\n return (\n <Menu shadow=\"md\" width={240} position=\"bottom-end\" withArrow>\n <Menu.Target>\n <ActionIcon\n variant=\"default\"\n size=\"lg\"\n title={triggerLabel || \"Ещё\"}\n aria-label={triggerLabel || \"Ещё\"}\n >\n <Icon emoji={triggerIcon || \"⋯\"} size={18} />\n </ActionIcon>\n </Menu.Target>\n <Menu.Dropdown style={{ maxHeight: \"60vh\", overflowY: \"auto\" }}>\n {grouped.map((section, si) => (\n <span key={si}>\n {hasSections && si > 0 && <Menu.Divider />}\n {hasSections && section.label && (\n <Menu.Label>{section.label}</Menu.Label>\n )}\n {section.items.map((item) => (\n item.divider\n ? <Menu.Divider key={item.key} />\n : <Menu.Item\n key={item.key}\n leftSection={item.icon ? <Icon emoji={item.icon} size={14} /> : undefined}\n onClick={item.onClick}\n >\n {item.label}\n </Menu.Item>\n ))}\n </span>\n ))}\n </Menu.Dropdown>\n </Menu>\n );\n}\n\n/**\n * Группировка overflow-элементов по иконке. Элементы с одинаковой иконкой\n * объединяются в секцию. Одиночные элементы (уникальная иконка) идут в\n * секцию «Другое» в конце.\n */\nfunction groupOverflowItems(items) {\n if (items.length <= 8) return [{ label: null, items }];\n const byIcon = new Map();\n const order = [];\n for (const item of items) {\n const key = item.icon || \"__none__\";\n if (!byIcon.has(key)) { byIcon.set(key, []); order.push(key); }\n byIcon.get(key).push(item);\n }\n const sections = [];\n const singles = [];\n for (const key of order) {\n const group = byIcon.get(key);\n if (group.length >= 2) {\n sections.push({ label: group[0].label?.split(\" \")[0] || null, items: group });\n } else {\n singles.push(...group);\n }\n }\n if (singles.length > 0) {\n sections.push({ label: sections.length > 0 ? \"Другое\" : null, items: singles });\n }\n return sections.length > 0 ? sections : [{ label: null, items }];\n}\n\n/**\n * IntentButton-адаптер. Рендерит кнопку намерения через Mantine.\n *\n * Две формы рендера:\n * - С текстовым label → Mantine Button (с leftSection-иконкой)\n * - Только иконка (длинные label или без label) → Mantine ActionIcon\n * (квадратная кнопка фиксированного размера, читабельная рядом)\n *\n * Variant выбирается по:\n * - spec.variant (явный hint: \"primary\" | \"secondary\" | \"danger\")\n * - spec.irreversibility (high → danger)\n * - иначе default (subtle)\n */\nfunction MantineIntentButton({ spec, onClick, disabled }) {\n const label = spec.label || spec.intentId;\n const icon = spec.icon;\n const LABEL_MAX = 14;\n const showLabel = label.length <= LABEL_MAX;\n\n const isDanger = spec.variant === \"danger\" || spec.irreversibility === \"high\";\n const isPrimary = spec.variant === \"primary\";\n\n // Default (не danger/primary): Mantine `variant=\"default\"` без color —\n // использует theme-adaptive border/background/foreground, корректно\n // переключается в dark. Явный `color=\"gray\"` — ломает это в dark mode.\n const color = isDanger ? \"red\" : isPrimary ? \"indigo\" : undefined;\n const variant = isDanger || isPrimary ? \"light\" : \"default\";\n\n // Только иконка → ActionIcon (квадратный, фиксированный размер)\n if (!showLabel || !label) {\n return (\n <ActionIcon\n onClick={onClick}\n disabled={disabled}\n title={label}\n size=\"lg\"\n variant={variant}\n color={color}\n >\n <Icon emoji={icon} size={18} />\n </ActionIcon>\n );\n }\n\n // С label → Button\n return (\n <Button\n onClick={onClick}\n disabled={disabled}\n title={label}\n size=\"sm\"\n variant={variant}\n color={color}\n leftSection={icon ? <Icon emoji={icon} size={16} /> : undefined}\n >\n {label}\n </Button>\n );\n}\n\n// ============================================================\n// Primitives: heading, text, badge, avatar, paper\n// ============================================================\n\n/**\n * Primitive-компоненты получают текст/значение и стилевые подсказки\n * напрямую (не через spec/ctx как parameter/button). Это самый низкий\n * слой — просто обёртки над Mantine типографикой.\n */\n\nfunction MantineHeading({ level = 2, children }) {\n // Mantine Title: order 1/2/3/4/5/6 — HTML h1-h6 + стиль по размеру.\n const order = Math.min(6, Math.max(1, level));\n return <Title order={order}>{children}</Title>;\n}\n\n// Presets используют Mantine color tokens, которые автоматически\n// адаптируются к темной теме (через CSS variables). Жёсткие оттенки\n// типа \"dark.9\" — запрещены, они не переключаются.\nconst TEXT_PRESETS = {\n body: { size: \"sm\" },\n secondary: { size: \"xs\", c: \"dimmed\" },\n muted: { size: \"xs\", c: \"dimmed\" },\n heading: { fw: 700, size: \"md\" },\n accent: { fw: 600, c: \"indigo\" },\n danger: { c: \"red\" },\n success: { c: \"green\" },\n};\n\nfunction MantineText({ children, preset, style }) {\n const props = (preset && TEXT_PRESETS[preset]) || {};\n return <Text {...props} style={style}>{children}</Text>;\n}\n\nfunction MantineBadge({ children, color }) {\n return (\n <Badge color={color || \"indigo\"} variant=\"light\" size=\"sm\" radius=\"sm\">\n {children}\n </Badge>\n );\n}\n\nfunction MantineAvatar({ src, name, size = 40 }) {\n // Mantine Avatar: если src пусто — показывает initials через name prop\n // (первые буквы). Если src — картинка. Mantine сам решает fallback.\n return (\n <Avatar\n src={src || undefined}\n name={name || \"?\"}\n color=\"initials\"\n size={size}\n radius=\"xl\"\n >\n {!src && name ? name[0]?.toUpperCase() : null}\n </Avatar>\n );\n}\n\nfunction MantinePaper({ children, padding, withBorder, style }) {\n return (\n <Paper\n p={padding ?? \"md\"}\n withBorder={withBorder !== false}\n radius=\"md\"\n style={style}\n >\n {children}\n </Paper>\n );\n}\n\n// ============================================================\n// Shell: Modal + Tabs\n// ============================================================\n\n/**\n * Обёртка Mantine Modal как ModalShell.\n *\n * Заменяет inline-стилизованную ModalShell в FormModal.jsx — через неё\n * автоматически улучшаются FormModal, ConfirmDialog, BulkWizard\n * (они все используют ModalShell).\n *\n * Props: { onClose, children, title? }\n */\nfunction MantineModalShell({ onClose, children, title }) {\n return (\n <Modal\n opened\n onClose={onClose}\n title={title}\n centered\n size=\"md\"\n padding=\"lg\"\n radius=\"md\"\n overlayProps={{ backgroundOpacity: 0.55, blur: 2 }}\n >\n {children}\n </Modal>\n );\n}\n\n/**\n * Mantine Tabs как shell.tabs.\n *\n * items: [{ value, label, active }]. onSelect(value) — клик по табу.\n * Кастом, потому что Mantine Tabs API немного отличается (controlled).\n */\nfunction MantineTabs({ items, active, onSelect, extra }) {\n return (\n <div style={{\n display: \"flex\",\n alignItems: \"center\",\n borderBottom: \"1px solid var(--mantine-color-default-border)\",\n background: \"var(--mantine-color-default)\",\n }}>\n <Tabs\n value={active || null}\n onChange={(v) => v && onSelect && onSelect(v)}\n variant=\"default\"\n style={{ flex: 1 }}\n >\n <Tabs.List style={{ border: \"none\" }}>\n {items.map(item => (\n <Tabs.Tab key={item.value} value={item.value}>\n {item.label}\n </Tabs.Tab>\n ))}\n </Tabs.List>\n </Tabs>\n {extra && <div style={{ marginRight: 8 }}>{extra}</div>}\n </div>\n );\n}\n\n// ============================================================\n// Adapter export\n// ============================================================\n\nexport const mantineAdapter = {\n name: \"mantine\",\n // §26.4 + §26.6: capability surface. Mantine-адаптер не реализует\n // chart/sparkline/statistic напрямую — primitive.jsx рендерит SVG-\n // fallback, капабилити явно документируют.\n capabilities: {\n primitive: {\n chart: { chartTypes: [\"line\", \"pie\"], fallback: \"svg\" },\n sparkline: { fallback: \"svg\" },\n statistic: false, // нет — используется chart-fallback или text-primitive\n heading: true, text: true, badge: true, avatar: true, paper: true,\n },\n shell: { modal: true, tabs: true },\n button: { primary: true, secondary: true, danger: true, intent: true, overflow: true },\n },\n parameter: {\n text: MantineTextInput,\n textarea: MantineTextarea,\n email: MantineEmail,\n url: MantineUrl,\n tel: MantineTel,\n number: MantineNumber,\n datetime: MantineDateTime,\n select: MantineSelect,\n // image и file оставляем на built-in — у них специфичная логика\n // FileReader→data URL (ImageControl.jsx). Адаптируем позже через\n // Mantine FileButton / Dropzone.\n },\n button: {\n primary: MantinePrimaryButton,\n secondary: MantineSecondaryButton,\n danger: MantineDangerButton,\n intent: MantineIntentButton,\n overflow: MantineOverflowMenu,\n },\n shell: {\n modal: MantineModalShell,\n tabs: MantineTabs,\n },\n primitive: {\n heading: MantineHeading,\n text: MantineText,\n badge: MantineBadge,\n avatar: MantineAvatar,\n paper: MantinePaper,\n },\n icon: {\n // resolve — функция (не компонент), используется <Icon> для lookup.\n // Принимает emoji-строку, возвращает React-компонент или null.\n resolve: resolveLucide,\n },\n};\n","import React from \"react\";\nimport {\n MantineProvider,\n ColorSchemeScript,\n localStorageColorSchemeManager,\n} from \"@mantine/core\";\nimport { DatesProvider } from \"@mantine/dates\";\nimport { registerUIAdapter } from \"@intent-driven/renderer\";\nimport { mantineAdapter } from \"./adapter.jsx\";\n\nimport \"@mantine/core/styles.css\";\nimport \"@mantine/dates/styles.css\";\n\n/**\n * Оборачивает приложение: регистрирует mantineAdapter в @intent-driven/renderer,\n * монтирует MantineProvider + DatesProvider с дефолтными настройками.\n */\nexport function MantineAdapterProvider({\n children,\n colorSchemeManager,\n theme = { primaryColor: \"indigo\" },\n datesSettings = { locale: \"ru\", firstDayOfWeek: 1, weekendDays: [0, 6] },\n defaultColorScheme = \"light\",\n}) {\n React.useEffect(() => {\n registerUIAdapter(mantineAdapter);\n }, []);\n\n return (\n <>\n <ColorSchemeScript defaultColorScheme={defaultColorScheme} />\n <MantineProvider\n defaultColorScheme={defaultColorScheme}\n colorSchemeManager={\n colorSchemeManager ?? localStorageColorSchemeManager({ key: \"idf_theme\" })\n }\n theme={theme}\n >\n <DatesProvider settings={datesSettings}>{children}</DatesProvider>\n </MantineProvider>\n </>\n );\n}\n"],"mappings":"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","names":["jsx","jsxs"]}