@open-mercato/core 0.6.3-develop.3894.1.352abf4240 → 0.6.3

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.
Files changed (101) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/global.d.js +1 -0
  3. package/dist/global.d.js.map +7 -0
  4. package/dist/modules/catalog/commands/variants.js +11 -5
  5. package/dist/modules/catalog/commands/variants.js.map +2 -2
  6. package/dist/modules/customers/backend/customers/deals/create/page.js +3 -61
  7. package/dist/modules/customers/backend/customers/deals/create/page.js.map +2 -2
  8. package/dist/modules/customers/components/detail/DealForm.js +2 -0
  9. package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
  10. package/dist/modules/customers/components/detail/create/CreateDealForm.js +233 -0
  11. package/dist/modules/customers/components/detail/create/CreateDealForm.js.map +7 -0
  12. package/dist/modules/customers/components/detail/create/DealAssociationsField.js +209 -0
  13. package/dist/modules/customers/components/detail/create/DealAssociationsField.js.map +7 -0
  14. package/dist/modules/customers/components/detail/create/DealAssociationsSection.js +67 -0
  15. package/dist/modules/customers/components/detail/create/DealAssociationsSection.js.map +7 -0
  16. package/dist/modules/customers/components/detail/create/DealCreateSidebar.js +73 -0
  17. package/dist/modules/customers/components/detail/create/DealCreateSidebar.js.map +7 -0
  18. package/dist/modules/customers/components/detail/create/DealCurrencyField.js +92 -0
  19. package/dist/modules/customers/components/detail/create/DealCurrencyField.js.map +7 -0
  20. package/dist/modules/customers/components/detail/create/DealCustomAttributes.js +81 -0
  21. package/dist/modules/customers/components/detail/create/DealCustomAttributes.js.map +7 -0
  22. package/dist/modules/customers/components/detail/create/DealDetailsFields.js +171 -0
  23. package/dist/modules/customers/components/detail/create/DealDetailsFields.js.map +7 -0
  24. package/dist/modules/customers/components/detail/create/DealFormField.js +24 -0
  25. package/dist/modules/customers/components/detail/create/DealFormField.js.map +7 -0
  26. package/dist/modules/customers/components/detail/create/DealSectionCard.js +29 -0
  27. package/dist/modules/customers/components/detail/create/DealSectionCard.js.map +7 -0
  28. package/dist/modules/customers/components/detail/create/DealTipsCard.js +19 -0
  29. package/dist/modules/customers/components/detail/create/DealTipsCard.js.map +7 -0
  30. package/dist/modules/customers/components/detail/create/PipelineSelect.js +41 -0
  31. package/dist/modules/customers/components/detail/create/PipelineSelect.js.map +7 -0
  32. package/dist/modules/customers/components/detail/create/PipelineStageSelect.js +49 -0
  33. package/dist/modules/customers/components/detail/create/PipelineStageSelect.js.map +7 -0
  34. package/dist/modules/customers/components/detail/create/SuffixInput.js +21 -0
  35. package/dist/modules/customers/components/detail/create/SuffixInput.js.map +7 -0
  36. package/dist/modules/customers/components/detail/create/dealCustomFieldControl.js +270 -0
  37. package/dist/modules/customers/components/detail/create/dealCustomFieldControl.js.map +7 -0
  38. package/dist/modules/customers/components/detail/create/dealFormTypes.js +17 -0
  39. package/dist/modules/customers/components/detail/create/dealFormTypes.js.map +7 -0
  40. package/dist/modules/customers/components/detail/create/dealNumericInput.js +16 -0
  41. package/dist/modules/customers/components/detail/create/dealNumericInput.js.map +7 -0
  42. package/dist/modules/customers/components/detail/create/useDealCustomFields.js +93 -0
  43. package/dist/modules/customers/components/detail/create/useDealCustomFields.js.map +7 -0
  44. package/dist/modules/customers/components/detail/create/useDealPipelines.js +59 -0
  45. package/dist/modules/customers/components/detail/create/useDealPipelines.js.map +7 -0
  46. package/dist/modules/customers/components/formConfig.js +4 -2
  47. package/dist/modules/customers/components/formConfig.js.map +2 -2
  48. package/dist/modules/dictionaries/components/DictionaryEntrySelect.js +5 -2
  49. package/dist/modules/dictionaries/components/DictionaryEntrySelect.js.map +2 -2
  50. package/dist/modules/feature_toggles/lib/feature-flag-check.js +13 -5
  51. package/dist/modules/feature_toggles/lib/feature-flag-check.js.map +2 -2
  52. package/dist/modules/query_index/subscribers/coverage_refresh.js +6 -1
  53. package/dist/modules/query_index/subscribers/coverage_refresh.js.map +2 -2
  54. package/dist/modules/sync_excel/widgets/injection/upload-config/target-options.js +33 -5
  55. package/dist/modules/sync_excel/widgets/injection/upload-config/target-options.js.map +2 -2
  56. package/dist/modules/workflows/components/WorkflowGraph.js +29 -186
  57. package/dist/modules/workflows/components/WorkflowGraph.js.map +2 -2
  58. package/dist/modules/workflows/components/WorkflowGraphImpl.js +196 -0
  59. package/dist/modules/workflows/components/WorkflowGraphImpl.js.map +7 -0
  60. package/package.json +8 -9
  61. package/src/global.d.ts +9 -0
  62. package/src/modules/catalog/commands/variants.ts +14 -5
  63. package/src/modules/customers/backend/customers/deals/create/page.tsx +3 -64
  64. package/src/modules/customers/components/detail/DealForm.tsx +2 -0
  65. package/src/modules/customers/components/detail/create/CreateDealForm.tsx +254 -0
  66. package/src/modules/customers/components/detail/create/DealAssociationsField.tsx +253 -0
  67. package/src/modules/customers/components/detail/create/DealAssociationsSection.tsx +72 -0
  68. package/src/modules/customers/components/detail/create/DealCreateSidebar.tsx +79 -0
  69. package/src/modules/customers/components/detail/create/DealCurrencyField.tsx +108 -0
  70. package/src/modules/customers/components/detail/create/DealCustomAttributes.tsx +118 -0
  71. package/src/modules/customers/components/detail/create/DealDetailsFields.tsx +171 -0
  72. package/src/modules/customers/components/detail/create/DealFormField.tsx +39 -0
  73. package/src/modules/customers/components/detail/create/DealSectionCard.tsx +40 -0
  74. package/src/modules/customers/components/detail/create/DealTipsCard.tsx +26 -0
  75. package/src/modules/customers/components/detail/create/PipelineSelect.tsx +55 -0
  76. package/src/modules/customers/components/detail/create/PipelineStageSelect.tsx +70 -0
  77. package/src/modules/customers/components/detail/create/SuffixInput.tsx +20 -0
  78. package/src/modules/customers/components/detail/create/dealCustomFieldControl.tsx +310 -0
  79. package/src/modules/customers/components/detail/create/dealFormTypes.ts +29 -0
  80. package/src/modules/customers/components/detail/create/dealNumericInput.ts +20 -0
  81. package/src/modules/customers/components/detail/create/useDealCustomFields.ts +118 -0
  82. package/src/modules/customers/components/detail/create/useDealPipelines.ts +80 -0
  83. package/src/modules/customers/components/formConfig.tsx +3 -0
  84. package/src/modules/customers/i18n/de.json +26 -0
  85. package/src/modules/customers/i18n/en.json +26 -0
  86. package/src/modules/customers/i18n/es.json +26 -0
  87. package/src/modules/customers/i18n/pl.json +26 -0
  88. package/src/modules/dictionaries/components/DictionaryEntrySelect.tsx +12 -1
  89. package/src/modules/feature_toggles/lib/feature-flag-check.ts +14 -4
  90. package/src/modules/query_index/subscribers/coverage_refresh.ts +7 -1
  91. package/src/modules/resources/i18n/de.json +1 -0
  92. package/src/modules/resources/i18n/en.json +1 -0
  93. package/src/modules/resources/i18n/es.json +1 -0
  94. package/src/modules/resources/i18n/pl.json +1 -0
  95. package/src/modules/sales/i18n/de.json +2 -0
  96. package/src/modules/sales/i18n/en.json +2 -0
  97. package/src/modules/sales/i18n/es.json +2 -0
  98. package/src/modules/sales/i18n/pl.json +2 -0
  99. package/src/modules/sync_excel/widgets/injection/upload-config/target-options.ts +40 -5
  100. package/src/modules/workflows/components/WorkflowGraph.tsx +39 -235
  101. package/src/modules/workflows/components/WorkflowGraphImpl.tsx +233 -0
@@ -0,0 +1,171 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { format } from "date-fns/format";
4
+ import { parseISO } from "date-fns/parseISO";
5
+ import { Input } from "@open-mercato/ui/primitives/input";
6
+ import { Textarea } from "@open-mercato/ui/primitives/textarea";
7
+ import { DatePicker } from "@open-mercato/ui/primitives/date-picker";
8
+ import { DictionarySelectField } from "../../formConfig.js";
9
+ import { DealFormField } from "./DealFormField.js";
10
+ import { PipelineSelect } from "./PipelineSelect.js";
11
+ import { PipelineStageSelect } from "./PipelineStageSelect.js";
12
+ import { SuffixInput } from "./SuffixInput.js";
13
+ import { DealCurrencyField } from "./DealCurrencyField.js";
14
+ import { sanitizeAmount, sanitizeProbability } from "./dealNumericInput.js";
15
+ function toDate(value) {
16
+ if (!value) return null;
17
+ const parsed = parseISO(value);
18
+ return Number.isNaN(parsed.getTime()) ? null : parsed;
19
+ }
20
+ function DealDetailsFields({
21
+ values,
22
+ errors,
23
+ isSubmitting,
24
+ patch,
25
+ onPipelineChange,
26
+ pipelines,
27
+ stages,
28
+ statusLabels,
29
+ tr
30
+ }) {
31
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
32
+ /* @__PURE__ */ jsx(
33
+ DealFormField,
34
+ {
35
+ fieldId: "title",
36
+ label: tr("customers.deals.create.fields.title", "Deal title"),
37
+ required: true,
38
+ hint: tr("customers.deals.create.hints.title", "Short, descriptive name shown on pipeline cards"),
39
+ error: errors.title,
40
+ children: /* @__PURE__ */ jsx(
41
+ Input,
42
+ {
43
+ value: values.title,
44
+ onChange: (event) => patch({ title: event.target.value }),
45
+ "aria-invalid": errors.title ? true : void 0,
46
+ disabled: isSubmitting
47
+ }
48
+ )
49
+ }
50
+ ),
51
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-2", children: [
52
+ /* @__PURE__ */ jsx(DealFormField, { fieldId: "status", label: tr("customers.people.detail.deals.fields.status", "Status"), children: /* @__PURE__ */ jsx(
53
+ DictionarySelectField,
54
+ {
55
+ kind: "deal-statuses",
56
+ value: values.status || void 0,
57
+ onChange: (next) => patch({ status: next ?? "" }),
58
+ labels: statusLabels,
59
+ selectClassName: "w-full",
60
+ showActiveAppearance: false
61
+ }
62
+ ) }),
63
+ /* @__PURE__ */ jsx(DealFormField, { fieldId: "pipelineId", label: tr("customers.people.detail.deals.fields.pipeline", "Pipeline"), children: /* @__PURE__ */ jsx(
64
+ PipelineSelect,
65
+ {
66
+ pipelines,
67
+ value: values.pipelineId,
68
+ onChange: onPipelineChange,
69
+ disabled: isSubmitting,
70
+ placeholder: tr("customers.deals.form.pipeline.placeholder", "Select pipeline\u2026")
71
+ }
72
+ ) })
73
+ ] }),
74
+ /* @__PURE__ */ jsx(
75
+ DealFormField,
76
+ {
77
+ fieldId: "pipelineStageId",
78
+ label: tr("customers.people.detail.deals.fields.pipelineStage", "Pipeline stage"),
79
+ hint: tr("customers.deals.create.hints.pipelineStage", "Stages depend on the selected pipeline"),
80
+ children: /* @__PURE__ */ jsx(
81
+ PipelineStageSelect,
82
+ {
83
+ stages,
84
+ value: values.pipelineStageId,
85
+ onChange: (id) => patch({ pipelineStageId: id }),
86
+ disabled: isSubmitting || !values.pipelineId,
87
+ placeholder: tr("customers.deals.form.pipelineStage.placeholder", "Select stage\u2026"),
88
+ formatCount: (position, total) => tr("customers.deals.create.fields.stageOf", "\xB7 stage {position} of {total}", { position, total })
89
+ }
90
+ )
91
+ }
92
+ ),
93
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-2", children: [
94
+ /* @__PURE__ */ jsx(
95
+ DealFormField,
96
+ {
97
+ fieldId: "valueAmount",
98
+ label: tr("customers.deals.create.fields.valueAmount", "Deal value"),
99
+ hint: tr("customers.deals.create.hints.valueAmount", "Potential revenue from this opportunity"),
100
+ error: errors.valueAmount,
101
+ children: /* @__PURE__ */ jsx(
102
+ SuffixInput,
103
+ {
104
+ suffix: values.valueCurrency,
105
+ inputMode: "decimal",
106
+ value: values.valueAmount,
107
+ onChange: (event) => patch({ valueAmount: sanitizeAmount(event.target.value) }),
108
+ placeholder: "0",
109
+ "aria-invalid": errors.valueAmount ? true : void 0,
110
+ disabled: isSubmitting
111
+ }
112
+ )
113
+ }
114
+ ),
115
+ /* @__PURE__ */ jsx(DealFormField, { fieldId: "valueCurrency", label: tr("customers.people.detail.deals.fields.valueCurrency", "Currency"), children: /* @__PURE__ */ jsx(
116
+ DealCurrencyField,
117
+ {
118
+ value: values.valueCurrency,
119
+ onChange: (code) => patch({ valueCurrency: code }),
120
+ disabled: isSubmitting
121
+ }
122
+ ) })
123
+ ] }),
124
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-2", children: [
125
+ /* @__PURE__ */ jsx(
126
+ DealFormField,
127
+ {
128
+ fieldId: "probability",
129
+ label: tr("customers.deals.create.fields.probability", "Probability"),
130
+ hint: tr("customers.deals.create.hints.probability", "0 \u2013 100%, used for weighted pipeline value"),
131
+ error: errors.probability,
132
+ children: /* @__PURE__ */ jsx(
133
+ SuffixInput,
134
+ {
135
+ suffix: "%",
136
+ inputMode: "numeric",
137
+ value: values.probability,
138
+ onChange: (event) => patch({ probability: sanitizeProbability(event.target.value) }),
139
+ placeholder: "0",
140
+ "aria-invalid": errors.probability ? true : void 0,
141
+ disabled: isSubmitting
142
+ }
143
+ )
144
+ }
145
+ ),
146
+ /* @__PURE__ */ jsx(DealFormField, { fieldId: "expectedCloseAt", label: tr("customers.deals.create.fields.expectedCloseAt", "Expected close date"), children: /* @__PURE__ */ jsx(
147
+ DatePicker,
148
+ {
149
+ value: toDate(values.expectedCloseAt),
150
+ onChange: (date) => patch({ expectedCloseAt: date ? format(date, "yyyy-MM-dd") : "" }),
151
+ disabled: isSubmitting,
152
+ placeholder: tr("customers.deals.create.fields.datePlaceholder", "Pick a date")
153
+ }
154
+ ) })
155
+ ] }),
156
+ /* @__PURE__ */ jsx(DealFormField, { fieldId: "description", label: tr("customers.people.detail.deals.fields.description", "Description"), children: /* @__PURE__ */ jsx(
157
+ Textarea,
158
+ {
159
+ value: values.description,
160
+ onChange: (event) => patch({ description: event.target.value }),
161
+ disabled: isSubmitting
162
+ }
163
+ ) })
164
+ ] });
165
+ }
166
+ var DealDetailsFields_default = DealDetailsFields;
167
+ export {
168
+ DealDetailsFields,
169
+ DealDetailsFields_default as default
170
+ };
171
+ //# sourceMappingURL=DealDetailsFields.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/customers/components/detail/create/DealDetailsFields.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { format } from 'date-fns/format'\nimport { parseISO } from 'date-fns/parseISO'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { DatePicker } from '@open-mercato/ui/primitives/date-picker'\nimport { DictionarySelectField } from '../../formConfig'\nimport { createDictionarySelectLabels } from '../utils'\nimport { DealFormField } from './DealFormField'\nimport { PipelineSelect } from './PipelineSelect'\nimport { PipelineStageSelect } from './PipelineStageSelect'\nimport { SuffixInput } from './SuffixInput'\nimport { DealCurrencyField } from './DealCurrencyField'\nimport { sanitizeAmount, sanitizeProbability } from './dealNumericInput'\nimport type { BaseValues } from './dealFormTypes'\nimport type { PipelineOption, PipelineStageOption } from './useDealPipelines'\n\ntype Translate = (key: string, fallback: string, params?: Record<string, string | number>) => string\n\nexport type DealDetailsFieldsProps = {\n values: BaseValues\n errors: Record<string, string>\n isSubmitting: boolean\n patch: (partial: Partial<BaseValues>) => void\n onPipelineChange: (id: string) => void\n pipelines: PipelineOption[]\n stages: PipelineStageOption[]\n statusLabels: ReturnType<typeof createDictionarySelectLabels>\n tr: Translate\n}\n\nfunction toDate(value: string): Date | null {\n if (!value) return null\n const parsed = parseISO(value)\n return Number.isNaN(parsed.getTime()) ? null : parsed\n}\n\nexport function DealDetailsFields({\n values,\n errors,\n isSubmitting,\n patch,\n onPipelineChange,\n pipelines,\n stages,\n statusLabels,\n tr,\n}: DealDetailsFieldsProps) {\n return (\n <>\n <DealFormField\n fieldId=\"title\"\n label={tr('customers.deals.create.fields.title', 'Deal title')}\n required\n hint={tr('customers.deals.create.hints.title', 'Short, descriptive name shown on pipeline cards')}\n error={errors.title}\n >\n <Input\n value={values.title}\n onChange={(event) => patch({ title: event.target.value })}\n aria-invalid={errors.title ? true : undefined}\n disabled={isSubmitting}\n />\n </DealFormField>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n <DealFormField fieldId=\"status\" label={tr('customers.people.detail.deals.fields.status', 'Status')}>\n <DictionarySelectField\n kind=\"deal-statuses\"\n value={values.status || undefined}\n onChange={(next) => patch({ status: next ?? '' })}\n labels={statusLabels}\n selectClassName=\"w-full\"\n showActiveAppearance={false}\n />\n </DealFormField>\n <DealFormField fieldId=\"pipelineId\" label={tr('customers.people.detail.deals.fields.pipeline', 'Pipeline')}>\n <PipelineSelect\n pipelines={pipelines}\n value={values.pipelineId}\n onChange={onPipelineChange}\n disabled={isSubmitting}\n placeholder={tr('customers.deals.form.pipeline.placeholder', 'Select pipeline\u2026')}\n />\n </DealFormField>\n </div>\n\n <DealFormField\n fieldId=\"pipelineStageId\"\n label={tr('customers.people.detail.deals.fields.pipelineStage', 'Pipeline stage')}\n hint={tr('customers.deals.create.hints.pipelineStage', 'Stages depend on the selected pipeline')}\n >\n <PipelineStageSelect\n stages={stages}\n value={values.pipelineStageId}\n onChange={(id) => patch({ pipelineStageId: id })}\n disabled={isSubmitting || !values.pipelineId}\n placeholder={tr('customers.deals.form.pipelineStage.placeholder', 'Select stage\u2026')}\n formatCount={(position, total) =>\n tr('customers.deals.create.fields.stageOf', '\u00B7 stage {position} of {total}', { position, total })\n }\n />\n </DealFormField>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n <DealFormField\n fieldId=\"valueAmount\"\n label={tr('customers.deals.create.fields.valueAmount', 'Deal value')}\n hint={tr('customers.deals.create.hints.valueAmount', 'Potential revenue from this opportunity')}\n error={errors.valueAmount}\n >\n <SuffixInput\n suffix={values.valueCurrency}\n inputMode=\"decimal\"\n value={values.valueAmount}\n onChange={(event) => patch({ valueAmount: sanitizeAmount(event.target.value) })}\n placeholder=\"0\"\n aria-invalid={errors.valueAmount ? true : undefined}\n disabled={isSubmitting}\n />\n </DealFormField>\n <DealFormField fieldId=\"valueCurrency\" label={tr('customers.people.detail.deals.fields.valueCurrency', 'Currency')}>\n <DealCurrencyField\n value={values.valueCurrency}\n onChange={(code) => patch({ valueCurrency: code })}\n disabled={isSubmitting}\n />\n </DealFormField>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n <DealFormField\n fieldId=\"probability\"\n label={tr('customers.deals.create.fields.probability', 'Probability')}\n hint={tr('customers.deals.create.hints.probability', '0 \u2013 100%, used for weighted pipeline value')}\n error={errors.probability}\n >\n <SuffixInput\n suffix=\"%\"\n inputMode=\"numeric\"\n value={values.probability}\n onChange={(event) => patch({ probability: sanitizeProbability(event.target.value) })}\n placeholder=\"0\"\n aria-invalid={errors.probability ? true : undefined}\n disabled={isSubmitting}\n />\n </DealFormField>\n <DealFormField fieldId=\"expectedCloseAt\" label={tr('customers.deals.create.fields.expectedCloseAt', 'Expected close date')}>\n <DatePicker\n value={toDate(values.expectedCloseAt)}\n onChange={(date) => patch({ expectedCloseAt: date ? format(date, 'yyyy-MM-dd') : '' })}\n disabled={isSubmitting}\n placeholder={tr('customers.deals.create.fields.datePlaceholder', 'Pick a date')}\n />\n </DealFormField>\n </div>\n\n <DealFormField fieldId=\"description\" label={tr('customers.people.detail.deals.fields.description', 'Description')}>\n <Textarea\n value={values.description}\n onChange={(event) => patch({ description: event.target.value })}\n disabled={isSubmitting}\n />\n </DealFormField>\n </>\n )\n}\n\nexport default DealDetailsFields\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,24 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { Label } from "@open-mercato/ui/primitives/label";
5
+ function DealFormField({ label, fieldId, required, hint, error, children }) {
6
+ const generatedId = React.useId();
7
+ const controlId = fieldId ?? generatedId;
8
+ const control = React.isValidElement(children) ? React.cloneElement(children, { id: controlId }) : children;
9
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-2", "data-crud-field-id": fieldId, children: [
10
+ /* @__PURE__ */ jsxs(Label, { htmlFor: controlId, children: [
11
+ label,
12
+ required ? /* @__PURE__ */ jsx("span", { className: "text-destructive", children: " *" }) : null
13
+ ] }),
14
+ control,
15
+ hint ? /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: hint }) : null,
16
+ error ? /* @__PURE__ */ jsx("p", { className: "text-xs text-status-error-text", children: error }) : null
17
+ ] });
18
+ }
19
+ var DealFormField_default = DealFormField;
20
+ export {
21
+ DealFormField,
22
+ DealFormField_default as default
23
+ };
24
+ //# sourceMappingURL=DealFormField.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/customers/components/detail/create/DealFormField.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Label } from '@open-mercato/ui/primitives/label'\n\nexport type DealFormFieldProps = {\n label: string\n /**\n * Stable field key exposed as `data-crud-field-id` and used as the control's `id`.\n * Lets Playwright target the control via the project's `data-crud-field-id` convention\n * (see .ai/lessons.md). Falls back to a generated id for label/control association only.\n */\n fieldId?: string\n required?: boolean\n hint?: string\n error?: string\n children: React.ReactNode\n}\n\nexport function DealFormField({ label, fieldId, required, hint, error, children }: DealFormFieldProps) {\n const generatedId = React.useId()\n const controlId = fieldId ?? generatedId\n const control = React.isValidElement(children)\n ? React.cloneElement(children as React.ReactElement<{ id?: string }>, { id: controlId })\n : children\n return (\n <div className=\"space-y-2\" data-crud-field-id={fieldId}>\n <Label htmlFor={controlId}>\n {label}\n {required ? <span className=\"text-destructive\"> *</span> : null}\n </Label>\n {control}\n {hint ? <p className=\"text-xs text-muted-foreground\">{hint}</p> : null}\n {error ? <p className=\"text-xs text-status-error-text\">{error}</p> : null}\n </div>\n )\n}\n\nexport default DealFormField\n"],
5
+ "mappings": ";AA2BM,SAEc,KAFd;AAzBN,YAAY,WAAW;AACvB,SAAS,aAAa;AAgBf,SAAS,cAAc,EAAE,OAAO,SAAS,UAAU,MAAM,OAAO,SAAS,GAAuB;AACrG,QAAM,cAAc,MAAM,MAAM;AAChC,QAAM,YAAY,WAAW;AAC7B,QAAM,UAAU,MAAM,eAAe,QAAQ,IACzC,MAAM,aAAa,UAAiD,EAAE,IAAI,UAAU,CAAC,IACrF;AACJ,SACE,qBAAC,SAAI,WAAU,aAAY,sBAAoB,SAC7C;AAAA,yBAAC,SAAM,SAAS,WACb;AAAA;AAAA,MACA,WAAW,oBAAC,UAAK,WAAU,oBAAmB,gBAAE,IAAU;AAAA,OAC7D;AAAA,IACC;AAAA,IACA,OAAO,oBAAC,OAAE,WAAU,iCAAiC,gBAAK,IAAO;AAAA,IACjE,QAAQ,oBAAC,OAAE,WAAU,kCAAkC,iBAAM,IAAO;AAAA,KACvE;AAEJ;AAEA,IAAO,wBAAQ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,29 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { cn } from "@open-mercato/shared/lib/utils";
4
+ function DealSectionCard({
5
+ icon: Icon,
6
+ title,
7
+ subtitle,
8
+ actions,
9
+ children,
10
+ className
11
+ }) {
12
+ return /* @__PURE__ */ jsxs("section", { className: cn("rounded-lg border border-border bg-card shadow-sm p-6 space-y-6", className), children: [
13
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3", children: [
14
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-3", children: [
15
+ /* @__PURE__ */ jsx("div", { className: "flex size-8 shrink-0 items-center justify-center rounded-md bg-brand-violet/10", children: /* @__PURE__ */ jsx(Icon, { className: "size-4 text-brand-violet" }) }),
16
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-col gap-0.5", children: [
17
+ /* @__PURE__ */ jsx("p", { className: "text-base font-semibold text-foreground", children: title }),
18
+ subtitle ? /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: subtitle }) : null
19
+ ] })
20
+ ] }),
21
+ actions ? /* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center gap-2", children: actions }) : null
22
+ ] }),
23
+ /* @__PURE__ */ jsx("div", { className: "space-y-4", children })
24
+ ] });
25
+ }
26
+ export {
27
+ DealSectionCard
28
+ };
29
+ //# sourceMappingURL=DealSectionCard.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/customers/components/detail/create/DealSectionCard.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { cn } from '@open-mercato/shared/lib/utils'\n\nexport type DealSectionCardProps = {\n icon: React.ComponentType<{ className?: string }>\n title: string\n subtitle?: React.ReactNode\n actions?: React.ReactNode\n children: React.ReactNode\n className?: string\n}\n\nexport function DealSectionCard({\n icon: Icon,\n title,\n subtitle,\n actions,\n children,\n className,\n}: DealSectionCardProps) {\n return (\n <section className={cn('rounded-lg border border-border bg-card shadow-sm p-6 space-y-6', className)}>\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <div className=\"flex size-8 shrink-0 items-center justify-center rounded-md bg-brand-violet/10\">\n <Icon className=\"size-4 text-brand-violet\" />\n </div>\n <div className=\"flex min-w-0 flex-col gap-0.5\">\n <p className=\"text-base font-semibold text-foreground\">{title}</p>\n {subtitle ? <p className=\"text-xs text-muted-foreground\">{subtitle}</p> : null}\n </div>\n </div>\n {actions ? <div className=\"flex shrink-0 items-center gap-2\">{actions}</div> : null}\n </div>\n <div className=\"space-y-4\">{children}</div>\n </section>\n )\n}\n"],
5
+ "mappings": ";AA2BY,cAEF,YAFE;AAxBZ,SAAS,UAAU;AAWZ,SAAS,gBAAgB;AAAA,EAC9B,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,SACE,qBAAC,aAAQ,WAAW,GAAG,mEAAmE,SAAS,GACjG;AAAA,yBAAC,SAAI,WAAU,2CACb;AAAA,2BAAC,SAAI,WAAU,mCACb;AAAA,4BAAC,SAAI,WAAU,kFACb,8BAAC,QAAK,WAAU,4BAA2B,GAC7C;AAAA,QACA,qBAAC,SAAI,WAAU,iCACb;AAAA,8BAAC,OAAE,WAAU,2CAA2C,iBAAM;AAAA,UAC7D,WAAW,oBAAC,OAAE,WAAU,iCAAiC,oBAAS,IAAO;AAAA,WAC5E;AAAA,SACF;AAAA,MACC,UAAU,oBAAC,SAAI,WAAU,oCAAoC,mBAAQ,IAAS;AAAA,OACjF;AAAA,IACA,oBAAC,SAAI,WAAU,aAAa,UAAS;AAAA,KACvC;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { Wand2 } from "lucide-react";
4
+ function DealTipsCard({ title, tips }) {
5
+ return /* @__PURE__ */ jsxs("div", { className: "rounded-lg border-l-4 border-status-info-border bg-status-info-bg px-5 py-4 space-y-3", children: [
6
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
7
+ /* @__PURE__ */ jsx(Wand2, { className: "size-4 text-status-info-icon" }),
8
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-semibold text-status-info-text", children: title })
9
+ ] }),
10
+ tips.map((tip, index) => /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-2", children: [
11
+ /* @__PURE__ */ jsx("span", { className: "mt-1.5 size-1.5 shrink-0 rounded-full bg-status-info-icon" }),
12
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: tip })
13
+ ] }, `${tip}-${index}`))
14
+ ] });
15
+ }
16
+ export {
17
+ DealTipsCard
18
+ };
19
+ //# sourceMappingURL=DealTipsCard.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/customers/components/detail/create/DealTipsCard.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Wand2 } from 'lucide-react'\n\nexport type DealTipsCardProps = {\n title: string\n tips: string[]\n}\n\nexport function DealTipsCard({ title, tips }: DealTipsCardProps) {\n return (\n <div className=\"rounded-lg border-l-4 border-status-info-border bg-status-info-bg px-5 py-4 space-y-3\">\n <div className=\"flex items-center gap-2\">\n <Wand2 className=\"size-4 text-status-info-icon\" />\n <p className=\"text-sm font-semibold text-status-info-text\">{title}</p>\n </div>\n {tips.map((tip, index) => (\n <div key={`${tip}-${index}`} className=\"flex items-start gap-2\">\n <span className=\"mt-1.5 size-1.5 shrink-0 rounded-full bg-status-info-icon\" />\n <p className=\"text-xs text-muted-foreground\">{tip}</p>\n </div>\n ))}\n </div>\n )\n}\n"],
5
+ "mappings": ";AAaM,SACE,KADF;AAVN,SAAS,aAAa;AAOf,SAAS,aAAa,EAAE,OAAO,KAAK,GAAsB;AAC/D,SACE,qBAAC,SAAI,WAAU,yFACb;AAAA,yBAAC,SAAI,WAAU,2BACb;AAAA,0BAAC,SAAM,WAAU,gCAA+B;AAAA,MAChD,oBAAC,OAAE,WAAU,+CAA+C,iBAAM;AAAA,OACpE;AAAA,IACC,KAAK,IAAI,CAAC,KAAK,UACd,qBAAC,SAA4B,WAAU,0BACrC;AAAA,0BAAC,UAAK,WAAU,6DAA4D;AAAA,MAC5E,oBAAC,OAAE,WAAU,iCAAiC,eAAI;AAAA,SAF1C,GAAG,GAAG,IAAI,KAAK,EAGzB,CACD;AAAA,KACH;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,41 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { Flag } from "lucide-react";
4
+ import {
5
+ Select,
6
+ SelectContent,
7
+ SelectItem,
8
+ SelectTrigger,
9
+ SelectTriggerLeading,
10
+ SelectValue
11
+ } from "@open-mercato/ui/primitives/select";
12
+ function PipelineSelect({
13
+ id,
14
+ pipelines,
15
+ value,
16
+ onChange,
17
+ disabled = false,
18
+ placeholder
19
+ }) {
20
+ return /* @__PURE__ */ jsxs(
21
+ Select,
22
+ {
23
+ value: typeof value === "string" && value ? value : void 0,
24
+ onValueChange: (next) => onChange(next ?? ""),
25
+ disabled,
26
+ children: [
27
+ /* @__PURE__ */ jsxs(SelectTrigger, { id, size: "default", children: [
28
+ /* @__PURE__ */ jsx(SelectTriggerLeading, { children: /* @__PURE__ */ jsx(Flag, { className: "size-4 text-muted-foreground", "aria-hidden": "true" }) }),
29
+ /* @__PURE__ */ jsx(SelectValue, { placeholder })
30
+ ] }),
31
+ /* @__PURE__ */ jsx(SelectContent, { children: pipelines.map((pipeline) => /* @__PURE__ */ jsx(SelectItem, { value: pipeline.id, children: pipeline.name }, pipeline.id)) })
32
+ ]
33
+ }
34
+ );
35
+ }
36
+ var PipelineSelect_default = PipelineSelect;
37
+ export {
38
+ PipelineSelect,
39
+ PipelineSelect_default as default
40
+ };
41
+ //# sourceMappingURL=PipelineSelect.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/customers/components/detail/create/PipelineSelect.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Flag } from 'lucide-react'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectTriggerLeading,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport type { PipelineOption } from './useDealPipelines'\n\nexport type PipelineSelectProps = {\n id?: string\n pipelines: PipelineOption[]\n value?: string | null\n onChange: (id: string) => void\n disabled?: boolean\n placeholder: string\n}\n\nexport function PipelineSelect({\n id,\n pipelines,\n value,\n onChange,\n disabled = false,\n placeholder,\n}: PipelineSelectProps) {\n return (\n <Select\n value={typeof value === 'string' && value ? value : undefined}\n onValueChange={(next) => onChange(next ?? '')}\n disabled={disabled}\n >\n <SelectTrigger id={id} size=\"default\">\n <SelectTriggerLeading>\n <Flag className=\"size-4 text-muted-foreground\" aria-hidden=\"true\" />\n </SelectTriggerLeading>\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {pipelines.map((pipeline) => (\n <SelectItem key={pipeline.id} value={pipeline.id}>\n {pipeline.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n}\n\nexport default PipelineSelect\n"],
5
+ "mappings": ";AAqCM,SAEI,KAFJ;AAlCN,SAAS,YAAY;AACrB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAYA,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AACF,GAAwB;AACtB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,OAAO,UAAU,YAAY,QAAQ,QAAQ;AAAA,MACpD,eAAe,CAAC,SAAS,SAAS,QAAQ,EAAE;AAAA,MAC5C;AAAA,MAEA;AAAA,6BAAC,iBAAc,IAAQ,MAAK,WAC1B;AAAA,8BAAC,wBACC,8BAAC,QAAK,WAAU,gCAA+B,eAAY,QAAO,GACpE;AAAA,UACA,oBAAC,eAAY,aAA0B;AAAA,WACzC;AAAA,QACA,oBAAC,iBACE,oBAAU,IAAI,CAAC,aACd,oBAAC,cAA6B,OAAO,SAAS,IAC3C,mBAAS,QADK,SAAS,EAE1B,CACD,GACH;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,yBAAQ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,49 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import {
5
+ Select,
6
+ SelectContent,
7
+ SelectItem,
8
+ SelectTrigger,
9
+ SelectValue
10
+ } from "@open-mercato/ui/primitives/select";
11
+ function PipelineStageSelect({
12
+ id,
13
+ stages,
14
+ value,
15
+ onChange,
16
+ disabled = false,
17
+ placeholder,
18
+ formatCount
19
+ }) {
20
+ const selectedIndex = React.useMemo(
21
+ () => value ? stages.findIndex((stage) => stage.id === value) : -1,
22
+ [stages, value]
23
+ );
24
+ const selectedStage = selectedIndex >= 0 ? stages[selectedIndex] : null;
25
+ return /* @__PURE__ */ jsxs(
26
+ Select,
27
+ {
28
+ value: typeof value === "string" && value ? value : void 0,
29
+ onValueChange: (next) => onChange(next ?? ""),
30
+ disabled: disabled || !stages.length,
31
+ children: [
32
+ /* @__PURE__ */ jsx(SelectTrigger, { id, size: "default", children: /* @__PURE__ */ jsx(SelectValue, { placeholder, children: selectedStage ? /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 items-center gap-2 truncate", children: [
33
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: selectedStage.label }),
34
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: formatCount(selectedIndex + 1, stages.length) })
35
+ ] }) : null }) }),
36
+ /* @__PURE__ */ jsx(SelectContent, { children: stages.map((stage, index) => /* @__PURE__ */ jsxs(SelectItem, { value: stage.id, children: [
37
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: stage.label }),
38
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: formatCount(index + 1, stages.length) })
39
+ ] }, stage.id)) })
40
+ ]
41
+ }
42
+ );
43
+ }
44
+ var PipelineStageSelect_default = PipelineStageSelect;
45
+ export {
46
+ PipelineStageSelect,
47
+ PipelineStageSelect_default as default
48
+ };
49
+ //# sourceMappingURL=PipelineStageSelect.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/customers/components/detail/create/PipelineStageSelect.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport type { PipelineStageOption } from './useDealPipelines'\n\nexport type PipelineStageSelectProps = {\n id?: string\n stages: PipelineStageOption[]\n value?: string | null\n onChange: (id: string) => void\n disabled?: boolean\n placeholder: string\n formatCount: (position: number, total: number) => string\n}\n\nexport function PipelineStageSelect({\n id,\n stages,\n value,\n onChange,\n disabled = false,\n placeholder,\n formatCount,\n}: PipelineStageSelectProps) {\n const selectedIndex = React.useMemo(\n () => (value ? stages.findIndex((stage) => stage.id === value) : -1),\n [stages, value],\n )\n const selectedStage = selectedIndex >= 0 ? stages[selectedIndex] : null\n\n return (\n <Select\n value={typeof value === 'string' && value ? value : undefined}\n onValueChange={(next) => onChange(next ?? '')}\n disabled={disabled || !stages.length}\n >\n <SelectTrigger id={id} size=\"default\">\n <SelectValue placeholder={placeholder}>\n {selectedStage ? (\n <span className=\"flex min-w-0 items-center gap-2 truncate\">\n <span className=\"truncate\">{selectedStage.label}</span>\n <span className=\"text-muted-foreground\">\n {formatCount(selectedIndex + 1, stages.length)}\n </span>\n </span>\n ) : null}\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {stages.map((stage, index) => (\n <SelectItem key={stage.id} value={stage.id}>\n <span className=\"truncate\">{stage.label}</span>\n <span className=\"text-muted-foreground\">\n {formatCount(index + 1, stages.length)}\n </span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n}\n\nexport default PipelineStageSelect\n"],
5
+ "mappings": ";AA8CY,SACE,KADF;AA5CZ,YAAY,WAAW;AACvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAaA,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAA6B;AAC3B,QAAM,gBAAgB,MAAM;AAAA,IAC1B,MAAO,QAAQ,OAAO,UAAU,CAAC,UAAU,MAAM,OAAO,KAAK,IAAI;AAAA,IACjE,CAAC,QAAQ,KAAK;AAAA,EAChB;AACA,QAAM,gBAAgB,iBAAiB,IAAI,OAAO,aAAa,IAAI;AAEnE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,OAAO,UAAU,YAAY,QAAQ,QAAQ;AAAA,MACpD,eAAe,CAAC,SAAS,SAAS,QAAQ,EAAE;AAAA,MAC5C,UAAU,YAAY,CAAC,OAAO;AAAA,MAE9B;AAAA,4BAAC,iBAAc,IAAQ,MAAK,WAC1B,8BAAC,eAAY,aACV,0BACC,qBAAC,UAAK,WAAU,4CACd;AAAA,8BAAC,UAAK,WAAU,YAAY,wBAAc,OAAM;AAAA,UAChD,oBAAC,UAAK,WAAU,yBACb,sBAAY,gBAAgB,GAAG,OAAO,MAAM,GAC/C;AAAA,WACF,IACE,MACN,GACF;AAAA,QACA,oBAAC,iBACE,iBAAO,IAAI,CAAC,OAAO,UAClB,qBAAC,cAA0B,OAAO,MAAM,IACtC;AAAA,8BAAC,UAAK,WAAU,YAAY,gBAAM,OAAM;AAAA,UACxC,oBAAC,UAAK,WAAU,yBACb,sBAAY,QAAQ,GAAG,OAAO,MAAM,GACvC;AAAA,aAJe,MAAM,EAKvB,CACD,GACH;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,8BAAQ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,21 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { Input } from "@open-mercato/ui/primitives/input";
5
+ const SuffixInput = React.forwardRef(
6
+ ({ suffix, ...props }, ref) => {
7
+ return /* @__PURE__ */ jsx(
8
+ Input,
9
+ {
10
+ ref,
11
+ rightIcon: /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-muted-foreground", children: suffix }),
12
+ ...props
13
+ }
14
+ );
15
+ }
16
+ );
17
+ SuffixInput.displayName = "SuffixInput";
18
+ export {
19
+ SuffixInput
20
+ };
21
+ //# sourceMappingURL=SuffixInput.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/customers/components/detail/create/SuffixInput.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Input } from '@open-mercato/ui/primitives/input'\n\nexport type SuffixInputProps = React.ComponentPropsWithoutRef<typeof Input> & { suffix: string }\n\nexport const SuffixInput = React.forwardRef<HTMLInputElement, SuffixInputProps>(\n ({ suffix, ...props }, ref) => {\n return (\n <Input\n ref={ref}\n rightIcon={<span className=\"text-sm font-medium text-muted-foreground\">{suffix}</span>}\n {...props}\n />\n )\n }\n)\n\nSuffixInput.displayName = 'SuffixInput'\n"],
5
+ "mappings": ";AAYmB;AAVnB,YAAY,WAAW;AACvB,SAAS,aAAa;AAIf,MAAM,cAAc,MAAM;AAAA,EAC/B,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ;AAC7B,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW,oBAAC,UAAK,WAAU,6CAA6C,kBAAO;AAAA,QAC9E,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AAEA,YAAY,cAAc;",
6
+ "names": []
7
+ }