@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/CHANGELOG.md +16 -0
- package/LICENSE +21 -0
- package/README.md +79 -0
- package/dist/index.cjs +561 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +251 -0
- package/dist/index.d.ts +251 -0
- package/dist/index.mjs +605 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +67 -0
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"]}
|