@snksergio/design-system 0.32.1 → 0.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-lib/chunks/{input-BjUSWce3.cjs → input-CizzMZ20.cjs} +3 -3
- package/dist-lib/chunks/{input-BjUSWce3.cjs.map → input-CizzMZ20.cjs.map} +1 -1
- package/dist-lib/chunks/{input-DCDU4i4S.mjs → input-Cym0k4ZI.mjs} +2 -2
- package/dist-lib/chunks/{input-DCDU4i4S.mjs.map → input-Cym0k4ZI.mjs.map} +1 -1
- package/dist-lib/chunks/{kpi-delta-C_3V6uG6.cjs → kpi-delta-DrSJPMCY.cjs} +8 -8
- package/dist-lib/chunks/{kpi-delta-C_3V6uG6.cjs.map → kpi-delta-DrSJPMCY.cjs.map} +1 -1
- package/dist-lib/chunks/{kpi-delta-DpYuDY4h.mjs → kpi-delta-FhfuIg27.mjs} +2 -2
- package/dist-lib/chunks/{kpi-delta-DpYuDY4h.mjs.map → kpi-delta-FhfuIg27.mjs.map} +1 -1
- package/dist-lib/chunks/{page-header-D0rpU0yn.cjs → page-header-BMzUloFi.cjs} +4 -4
- package/dist-lib/chunks/{page-header-D0rpU0yn.cjs.map → page-header-BMzUloFi.cjs.map} +1 -1
- package/dist-lib/chunks/{page-header-B6XJyIMz.mjs → page-header-Buh6YlQM.mjs} +2 -2
- package/dist-lib/chunks/{page-header-B6XJyIMz.mjs.map → page-header-Buh6YlQM.mjs.map} +1 -1
- package/dist-lib/chunks/{panel-8FiBxwcI.mjs → panel-Cdl0GPVE.mjs} +3 -3
- package/dist-lib/chunks/{panel-8FiBxwcI.mjs.map → panel-Cdl0GPVE.mjs.map} +1 -1
- package/dist-lib/chunks/{panel-BOrETqXz.cjs → panel-DlyaLunw.cjs} +401 -401
- package/dist-lib/chunks/{panel-BOrETqXz.cjs.map → panel-DlyaLunw.cjs.map} +1 -1
- package/dist-lib/chunks/{app-shell-Cyh8AUJT.cjs → useTheme-D4alxxGV.cjs} +70 -4
- package/dist-lib/chunks/useTheme-D4alxxGV.cjs.map +1 -0
- package/dist-lib/chunks/{app-shell-78w0pYdP.mjs → useTheme-DF2xbSdI.mjs} +107 -41
- package/dist-lib/chunks/useTheme-DF2xbSdI.mjs.map +1 -0
- package/dist-lib/index.cjs +224 -154
- package/dist-lib/index.cjs.map +1 -1
- package/dist-lib/index.mjs +110 -40
- package/dist-lib/index.mjs.map +1 -1
- package/dist-lib/preview/chat.cjs +54 -55
- package/dist-lib/preview/chat.cjs.map +1 -1
- package/dist-lib/preview/chat.mjs +2 -3
- package/dist-lib/preview/chat.mjs.map +1 -1
- package/dist-lib/preview/clientes.cjs +28 -29
- package/dist-lib/preview/clientes.cjs.map +1 -1
- package/dist-lib/preview/clientes.mjs +4 -5
- package/dist-lib/preview/clientes.mjs.map +1 -1
- package/dist-lib/preview/dashboard.cjs +24 -25
- package/dist-lib/preview/dashboard.cjs.map +1 -1
- package/dist-lib/preview/dashboard.mjs +3 -4
- package/dist-lib/preview/dashboard.mjs.map +1 -1
- package/dist-lib/src/components/index.d.ts +4 -0
- package/dist-lib/src/components/index.d.ts.map +1 -1
- package/dist-lib/src/components/ui/AppShell/app-shell.d.ts +3 -2
- package/dist-lib/src/components/ui/AppShell/app-shell.d.ts.map +1 -1
- package/dist-lib/src/components/ui/AppShell/app-shell.styles.d.ts +21 -4
- package/dist-lib/src/components/ui/AppShell/app-shell.styles.d.ts.map +1 -1
- package/dist-lib/src/components/ui/AppShell/app-shell.types.d.ts +13 -3
- package/dist-lib/src/components/ui/AppShell/app-shell.types.d.ts.map +1 -1
- package/dist-lib/src/hooks/useBrand.d.ts +49 -16
- package/dist-lib/src/hooks/useBrand.d.ts.map +1 -1
- package/dist-lib/theme/brand-blue.css +6 -3
- package/dist-lib/theme/brand-green.css +6 -3
- package/dist-lib/theme/brand-pay.css +6 -3
- package/dist-lib/theme/brand-vibrant.css +6 -3
- package/dist-lib/theme.css +5 -2
- package/package.json +4 -2
- package/dist-lib/chunks/app-shell-78w0pYdP.mjs.map +0 -1
- package/dist-lib/chunks/app-shell-Cyh8AUJT.cjs.map +0 -1
- package/dist-lib/chunks/useTheme-BUPLZBMs.mjs +0 -66
- package/dist-lib/chunks/useTheme-BUPLZBMs.mjs.map +0 -1
- package/dist-lib/chunks/useTheme-Dee4mo-A.cjs +0 -65
- package/dist-lib/chunks/useTheme-Dee4mo-A.cjs.map +0 -1
|
@@ -2,16 +2,15 @@
|
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
4
|
const React = require("react");
|
|
5
|
-
const useTheme = require("../chunks/useTheme-
|
|
5
|
+
const useTheme = require("../chunks/useTheme-D4alxxGV.cjs");
|
|
6
6
|
const lucideReact = require("lucide-react");
|
|
7
7
|
const clientesShowcaseMocks = require("../chunks/clientes-showcase-mocks-CwhluBTT.cjs");
|
|
8
|
-
const panel = require("../chunks/panel-
|
|
9
|
-
|
|
10
|
-
require("../chunks/
|
|
11
|
-
const pageHeader = require("../chunks/page-header-D0rpU0yn.cjs");
|
|
8
|
+
const panel = require("../chunks/panel-DlyaLunw.cjs");
|
|
9
|
+
require("../chunks/input-CizzMZ20.cjs");
|
|
10
|
+
const pageHeader = require("../chunks/page-header-BMzUloFi.cjs");
|
|
12
11
|
require("react-dom");
|
|
13
12
|
const appShellMocks = require("../chunks/app-shell-mocks-oO_IV3Gw.cjs");
|
|
14
|
-
const drawerFormStyles =
|
|
13
|
+
const drawerFormStyles = useTheme.tv({
|
|
15
14
|
slots: {
|
|
16
15
|
twoCols: "grid grid-cols-2 gap-form-gap",
|
|
17
16
|
statusDot: "inline-block size-[8px] rounded-radius-full mr-gp-xs shrink-0"
|
|
@@ -53,7 +52,7 @@ function NovoClienteDrawer({
|
|
|
53
52
|
size: "md",
|
|
54
53
|
footer: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
55
54
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
56
|
-
|
|
55
|
+
useTheme.Button,
|
|
57
56
|
{
|
|
58
57
|
variant: "outline",
|
|
59
58
|
color: "secondary",
|
|
@@ -63,7 +62,7 @@ function NovoClienteDrawer({
|
|
|
63
62
|
}
|
|
64
63
|
),
|
|
65
64
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
66
|
-
|
|
65
|
+
useTheme.Button,
|
|
67
66
|
{
|
|
68
67
|
variant: "filled",
|
|
69
68
|
color: "primary",
|
|
@@ -108,7 +107,7 @@ function NovoClienteDrawer({
|
|
|
108
107
|
)
|
|
109
108
|
] }),
|
|
110
109
|
/* @__PURE__ */ jsxRuntime.jsx(panel.FormField, { label: "Status", children: () => /* @__PURE__ */ jsxRuntime.jsx(
|
|
111
|
-
|
|
110
|
+
useTheme.ChipGroup,
|
|
112
111
|
{
|
|
113
112
|
type: "single",
|
|
114
113
|
value: form.statusId,
|
|
@@ -119,7 +118,7 @@ function NovoClienteDrawer({
|
|
|
119
118
|
size: "md",
|
|
120
119
|
shape: "pill",
|
|
121
120
|
ariaLabel: "Status do cliente",
|
|
122
|
-
children: Object.entries(clientesShowcaseMocks.STATUSES).map(([id, st]) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
121
|
+
children: Object.entries(clientesShowcaseMocks.STATUSES).map(([id, st]) => /* @__PURE__ */ jsxRuntime.jsxs(useTheme.ChipGroupItem, { value: id, children: [
|
|
123
122
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
124
123
|
"span",
|
|
125
124
|
{
|
|
@@ -133,7 +132,7 @@ function NovoClienteDrawer({
|
|
|
133
132
|
}
|
|
134
133
|
) }),
|
|
135
134
|
/* @__PURE__ */ jsxRuntime.jsx(panel.FormField, { label: "Categoria", children: () => /* @__PURE__ */ jsxRuntime.jsx(
|
|
136
|
-
|
|
135
|
+
useTheme.ChipGroup,
|
|
137
136
|
{
|
|
138
137
|
type: "single",
|
|
139
138
|
value: form.categoryId,
|
|
@@ -144,7 +143,7 @@ function NovoClienteDrawer({
|
|
|
144
143
|
size: "md",
|
|
145
144
|
shape: "pill",
|
|
146
145
|
ariaLabel: "Categoria do cliente",
|
|
147
|
-
children: Object.entries(clientesShowcaseMocks.CATEGORIES).map(([id, cat]) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
146
|
+
children: Object.entries(clientesShowcaseMocks.CATEGORIES).map(([id, cat]) => /* @__PURE__ */ jsxRuntime.jsx(useTheme.ChipGroupItem, { value: id, children: cat.label }, id))
|
|
148
147
|
}
|
|
149
148
|
) }),
|
|
150
149
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: s.twoCols(), children: [
|
|
@@ -185,7 +184,7 @@ function NovoClienteDrawer({
|
|
|
185
184
|
}
|
|
186
185
|
);
|
|
187
186
|
}
|
|
188
|
-
const detailDrawerStyles =
|
|
187
|
+
const detailDrawerStyles = useTheme.tv({
|
|
189
188
|
slots: {
|
|
190
189
|
section: "border-b border-border-default last:border-b-0",
|
|
191
190
|
sectionHead: [
|
|
@@ -289,11 +288,11 @@ function DetailDrawer({
|
|
|
289
288
|
resizableStorageKey: "clientes-showcase.detail-drawer.width",
|
|
290
289
|
titleSlot: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-gp-md min-w-0", children: [
|
|
291
290
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
292
|
-
|
|
291
|
+
useTheme.Avatar,
|
|
293
292
|
{
|
|
294
293
|
className: "size-[40px] shrink-0",
|
|
295
294
|
style: { background: row.avatarColor },
|
|
296
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
295
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(useTheme.AvatarFallback, { className: "bg-transparent text-white text-body-md font-bold", children: row.initials })
|
|
297
296
|
}
|
|
298
297
|
),
|
|
299
298
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col min-w-0 flex-1", children: [
|
|
@@ -317,7 +316,7 @@ function DetailDrawer({
|
|
|
317
316
|
] }),
|
|
318
317
|
headerActions: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
319
318
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
320
|
-
|
|
319
|
+
useTheme.Button,
|
|
321
320
|
{
|
|
322
321
|
variant: "soft",
|
|
323
322
|
color: "secondary",
|
|
@@ -328,7 +327,7 @@ function DetailDrawer({
|
|
|
328
327
|
}
|
|
329
328
|
),
|
|
330
329
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
331
|
-
|
|
330
|
+
useTheme.Button,
|
|
332
331
|
{
|
|
333
332
|
variant: "soft",
|
|
334
333
|
color: "critical",
|
|
@@ -340,9 +339,9 @@ function DetailDrawer({
|
|
|
340
339
|
)
|
|
341
340
|
] }),
|
|
342
341
|
footer: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
343
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
342
|
+
/* @__PURE__ */ jsxRuntime.jsx(useTheme.Button, { variant: "outline", color: "secondary", size: "sm", onClick: onClose, children: "Cancelar" }),
|
|
344
343
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
345
|
-
|
|
344
|
+
useTheme.Button,
|
|
346
345
|
{
|
|
347
346
|
variant: "filled",
|
|
348
347
|
color: "primary",
|
|
@@ -411,7 +410,7 @@ function DetailDrawer({
|
|
|
411
410
|
{
|
|
412
411
|
label: "Categoria",
|
|
413
412
|
value: cat ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
414
|
-
|
|
413
|
+
useTheme.Chip,
|
|
415
414
|
{
|
|
416
415
|
color: clientesShowcaseMocks.CATEGORY_KIND[row.categoryId] ?? "info",
|
|
417
416
|
variant: "soft",
|
|
@@ -429,11 +428,11 @@ function DetailDrawer({
|
|
|
429
428
|
label: "Atribuído a",
|
|
430
429
|
value: agent ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-gp-sm", children: [
|
|
431
430
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
432
|
-
|
|
431
|
+
useTheme.Avatar,
|
|
433
432
|
{
|
|
434
433
|
className: "size-[22px]",
|
|
435
434
|
style: { background: agent.color },
|
|
436
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
435
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(useTheme.AvatarFallback, { className: "bg-transparent text-white text-caption-xs font-bold", children: agentInitials })
|
|
437
436
|
}
|
|
438
437
|
),
|
|
439
438
|
agent.name
|
|
@@ -640,9 +639,9 @@ const KANBAN_CONFIG = {
|
|
|
640
639
|
return {
|
|
641
640
|
title: row.name,
|
|
642
641
|
subtitle: row.id,
|
|
643
|
-
avatar: /* @__PURE__ */ jsxRuntime.jsx(
|
|
642
|
+
avatar: /* @__PURE__ */ jsxRuntime.jsx(useTheme.Avatar, { className: "size-[28px]", style: { background: row.avatarColor }, children: /* @__PURE__ */ jsxRuntime.jsx(useTheme.AvatarFallback, { className: "bg-transparent text-white text-caption-sm font-bold", children: row.initials }) }),
|
|
644
643
|
chip: cat ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
645
|
-
|
|
644
|
+
useTheme.Chip,
|
|
646
645
|
{
|
|
647
646
|
color: clientesShowcaseMocks.CATEGORY_KIND[row.categoryId] ?? "info",
|
|
648
647
|
variant: "soft",
|
|
@@ -653,7 +652,7 @@ const KANBAN_CONFIG = {
|
|
|
653
652
|
) : null,
|
|
654
653
|
value: clientesShowcaseMocks.formatBRL(row.value),
|
|
655
654
|
footerLeft: agent ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-gp-sm min-w-0 flex-1", children: [
|
|
656
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
655
|
+
/* @__PURE__ */ jsxRuntime.jsx(useTheme.Avatar, { className: "size-[22px]", style: { background: agent.color }, children: /* @__PURE__ */ jsxRuntime.jsx(useTheme.AvatarFallback, { className: "bg-transparent text-white text-caption-xs font-bold", children: agentInitials }) }),
|
|
657
656
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-body-xs font-normal text-fg-muted whitespace-nowrap overflow-hidden text-ellipsis", children: agent.name })
|
|
658
657
|
] }) : null,
|
|
659
658
|
footerRight: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-[4px] text-caption-sm text-fg-muted [font-variant-numeric:tabular-nums] shrink-0", children: [
|
|
@@ -699,7 +698,7 @@ function ClientesShowcase() {
|
|
|
699
698
|
[askDelete]
|
|
700
699
|
);
|
|
701
700
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
702
|
-
|
|
701
|
+
useTheme.AppShell,
|
|
703
702
|
{
|
|
704
703
|
contexts: appShellMocks.APP_SHELL_CONTEXTS,
|
|
705
704
|
defaultActiveContextId: "inbox",
|
|
@@ -733,13 +732,13 @@ function ClientesShowcase() {
|
|
|
733
732
|
{
|
|
734
733
|
title: "Clientes",
|
|
735
734
|
description: "Gerencie sua base de clientes, acompanhe status de cadastro e abra atendimentos diretos pelo WhatsApp.",
|
|
736
|
-
badge: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
735
|
+
badge: /* @__PURE__ */ jsxRuntime.jsxs(useTheme.Chip, { color: "primary", variant: "soft", size: "sm", shape: "rounded", children: [
|
|
737
736
|
rows.length.toLocaleString("pt-BR"),
|
|
738
737
|
" registros"
|
|
739
738
|
] }),
|
|
740
739
|
actions: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
741
740
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
742
|
-
|
|
741
|
+
useTheme.Button,
|
|
743
742
|
{
|
|
744
743
|
variant: "outline",
|
|
745
744
|
color: "secondary",
|
|
@@ -750,7 +749,7 @@ function ClientesShowcase() {
|
|
|
750
749
|
}
|
|
751
750
|
),
|
|
752
751
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
753
|
-
|
|
752
|
+
useTheme.Button,
|
|
754
753
|
{
|
|
755
754
|
variant: "filled",
|
|
756
755
|
color: "primary",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clientes.cjs","sources":["../../src/preview/pages/ClientesShowcase/clientes-showcase.styles.ts","../../src/preview/pages/ClientesShowcase/components/NovoClienteDrawer/novo-cliente-drawer.tsx","../../src/preview/pages/ClientesShowcase/components/DetailDrawer/detail-drawer.styles.ts","../../src/preview/pages/ClientesShowcase/components/DetailDrawer/detail-drawer.tsx","../../src/preview/pages/ClientesShowcase/ClientesShowcase.tsx"],"sourcesContent":["import { tv } from \"@/utils/tv\";\r\n\r\n/**\r\n * Layout em grid de 2 colunas usado dentro do drawer pra pares de campos\r\n * (Email + WhatsApp, Cidade + Valor).\r\n * `gap-form-gap` (20px) = token DS pra spacing entre FormField units (L-024).\r\n */\r\nexport const drawerFormStyles = tv({\r\n slots: {\r\n twoCols: \"grid grid-cols-2 gap-form-gap\",\r\n statusDot: \"inline-block size-[8px] rounded-radius-full mr-gp-xs shrink-0\",\r\n },\r\n});\r\n","import { useEffect, useState } from \"react\";\r\nimport { Panel } from \"@/components/ui/Panel\";\r\nimport { Button } from \"@/components/ui/Button/button\";\r\nimport {\r\n FormField,\r\n FormFieldInput,\r\n FormFieldSelect,\r\n FormFieldTextarea,\r\n} from \"@/components/ui/FormField\";\r\nimport { ChipGroup, ChipGroupItem } from \"@/components/ui/Chip\";\r\nimport { STATUSES, CATEGORIES } from \"../../../_table-data\";\r\nimport { CITIES, STATUS_DOT } from \"../../clientes-showcase-mocks\";\r\nimport { drawerFormStyles } from \"../../clientes-showcase.styles\";\r\nimport type { NovoClienteFormData } from \"../../clientes-showcase.types\";\r\n\r\nconst INITIAL_FORM: NovoClienteFormData = {\r\n name: \"\",\r\n email: \"\",\r\n whatsapp: \"\",\r\n statusId: \"active\",\r\n categoryId: \"lead\",\r\n city: \"\",\r\n value: 0,\r\n notes: \"\",\r\n};\r\n\r\nexport type NovoClienteDrawerProps = {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n /** Disparado ao confirmar — drawer fecha automaticamente após o submit. */\r\n onSubmit?: (data: NovoClienteFormData) => void;\r\n};\r\n\r\n/**\r\n * Drawer \"Novo cliente\" — replica visual do TblClientFormDrawer\r\n * (sandbox /design-and-table-v2), recompilado em cima dos componentes do DS:\r\n * Panel + FormField (Input / Select / Textarea) + ChipGroup + Button.\r\n *\r\n * Layout (top → bottom):\r\n * 1. Nome* — full width\r\n * 2. Email + WhatsApp — 2 cols\r\n * 3. Status — ChipGroup com dot colorido\r\n * 4. Categoria — ChipGroup\r\n * 5. Cidade + Valor R$ — 2 cols\r\n * 6. Notas — textarea full width\r\n */\r\nexport function NovoClienteDrawer({\r\n open,\r\n onOpenChange,\r\n onSubmit,\r\n}: NovoClienteDrawerProps) {\r\n const s = drawerFormStyles();\r\n const [form, setForm] = useState<NovoClienteFormData>(INITIAL_FORM);\r\n\r\n // Reseta form sempre que abrir\r\n useEffect(() => {\r\n if (open) setForm(INITIAL_FORM);\r\n }, [open]);\r\n\r\n const canSubmit = form.name.trim().length > 0;\r\n\r\n const handleSubmit = () => {\r\n if (!canSubmit) return;\r\n onSubmit?.(form);\r\n onOpenChange(false);\r\n };\r\n\r\n return (\r\n <Panel\r\n open={open}\r\n onOpenChange={onOpenChange}\r\n title=\"Novo cliente\"\r\n side=\"right\"\r\n size=\"md\"\r\n footer={\r\n <>\r\n <Button\r\n variant=\"outline\"\r\n color=\"secondary\"\r\n size=\"md\"\r\n onClick={() => onOpenChange(false)}\r\n >\r\n Cancelar\r\n </Button>\r\n <Button\r\n variant=\"filled\"\r\n color=\"primary\"\r\n size=\"md\"\r\n disabled={!canSubmit}\r\n onClick={handleSubmit}\r\n >\r\n Criar cliente\r\n </Button>\r\n </>\r\n }\r\n >\r\n <FormFieldInput\r\n label=\"Nome\"\r\n required\r\n placeholder=\"Maria Silva\"\r\n value={form.name}\r\n onChange={(e) => setForm((f) => ({ ...f, name: e.target.value }))}\r\n />\r\n\r\n <div className={s.twoCols()}>\r\n <FormFieldInput\r\n label=\"Email\"\r\n type=\"email\"\r\n placeholder=\"cliente@exemplo.com\"\r\n value={form.email}\r\n onChange={(e) => setForm((f) => ({ ...f, email: e.target.value }))}\r\n />\r\n <FormFieldInput\r\n label=\"WhatsApp\"\r\n type=\"tel\"\r\n placeholder=\"55 11 99999-9999\"\r\n value={form.whatsapp}\r\n onChange={(e) => setForm((f) => ({ ...f, whatsapp: e.target.value }))}\r\n />\r\n </div>\r\n\r\n <FormField label=\"Status\">\r\n {() => (\r\n <ChipGroup\r\n type=\"single\"\r\n value={form.statusId}\r\n onValueChange={(v) =>\r\n v &&\r\n setForm((f) => ({\r\n ...f,\r\n statusId: v as keyof typeof STATUSES,\r\n }))\r\n }\r\n size=\"md\"\r\n shape=\"pill\"\r\n ariaLabel=\"Status do cliente\"\r\n >\r\n {Object.entries(STATUSES).map(([id, st]) => (\r\n <ChipGroupItem key={id} value={id}>\r\n <span\r\n className={s.statusDot()}\r\n style={{ background: STATUS_DOT[id] ?? st.color }}\r\n aria-hidden\r\n />\r\n {st.label}\r\n </ChipGroupItem>\r\n ))}\r\n </ChipGroup>\r\n )}\r\n </FormField>\r\n\r\n <FormField label=\"Categoria\">\r\n {() => (\r\n <ChipGroup\r\n type=\"single\"\r\n value={form.categoryId}\r\n onValueChange={(v) =>\r\n v &&\r\n setForm((f) => ({\r\n ...f,\r\n categoryId: v as keyof typeof CATEGORIES,\r\n }))\r\n }\r\n size=\"md\"\r\n shape=\"pill\"\r\n ariaLabel=\"Categoria do cliente\"\r\n >\r\n {Object.entries(CATEGORIES).map(([id, cat]) => (\r\n <ChipGroupItem key={id} value={id}>\r\n {cat.label}\r\n </ChipGroupItem>\r\n ))}\r\n </ChipGroup>\r\n )}\r\n </FormField>\r\n\r\n <div className={s.twoCols()}>\r\n <FormFieldSelect\r\n label=\"Cidade\"\r\n placeholder=\"Selecionar...\"\r\n value={form.city || undefined}\r\n onValueChange={(v) => setForm((f) => ({ ...f, city: v }))}\r\n options={CITIES.map((c) => ({ value: c, label: c }))}\r\n />\r\n <FormFieldInput\r\n label=\"Valor (R$)\"\r\n type=\"number\"\r\n startAddon=\"R$\"\r\n value={String(form.value)}\r\n onChange={(e) =>\r\n setForm((f) => ({ ...f, value: Number(e.target.value) }))\r\n }\r\n min={0}\r\n step={0.01}\r\n />\r\n </div>\r\n\r\n <FormFieldTextarea\r\n label=\"Notas\"\r\n placeholder=\"Observações sobre o cliente...\"\r\n rows={4}\r\n value={form.notes}\r\n onChange={(e) => setForm((f) => ({ ...f, notes: e.target.value }))}\r\n />\r\n </Panel>\r\n );\r\n}\r\n","import { tv } from \"@/utils/tv\";\r\n\r\n/**\r\n * Styles do DetailDrawer — apenas as partes internas (sections collapsibles\r\n * + DetailField). O shell flutuante (aside, header com avatar+meta, footer\r\n * com botões) é delegado ao `<FloatingPanel>` do DS.\r\n */\r\nexport const detailDrawerStyles = tv({\r\n slots: {\r\n section: \"border-b border-border-default last:border-b-0\",\r\n sectionHead: [\r\n \"flex items-center justify-between w-full\",\r\n \"px-[18px] py-[14px]\",\r\n \"bg-transparent border-0 cursor-pointer text-left\",\r\n \"text-body-sm font-semibold text-fg-default\",\r\n \"transition-colors duration-150\",\r\n \"hover:bg-bg-muted\",\r\n \"focus-visible:outline-none focus-visible:bg-bg-muted\",\r\n ],\r\n sectionChev: \"size-[14px] text-fg-muted transition-transform duration-200\",\r\n sectionChevOpen: \"rotate-180\",\r\n sectionBody: \"flex flex-col gap-gp-md px-[18px] pb-pad-2xl\",\r\n\r\n field: \"flex items-baseline justify-between gap-gp-md text-body-sm font-normal\",\r\n fieldLabel: \"text-body-xs font-normal text-fg-muted shrink-0\",\r\n fieldValue: \"text-fg-default text-right break-words min-w-0\",\r\n },\r\n});\r\n","import { useState, type ReactNode } from \"react\";\r\nimport { ChevronDown, Pencil, Trash2 } from \"lucide-react\";\r\nimport { Avatar, AvatarFallback } from \"@/components/shadcn/avatar\";\r\nimport { Button } from \"@/components/ui/Button/button\";\r\nimport { Chip } from \"@/components/ui/Chip\";\r\nimport { FloatingPanel } from \"@/components/ui/FloatingPanel\";\r\nimport { STATUSES, CATEGORIES, AGENTS } from \"../../../_table-data\";\r\nimport {\r\n CATEGORY_KIND,\r\n STATUS_DOT,\r\n formatBRL,\r\n formatShortDate,\r\n} from \"../../clientes-showcase-mocks\";\r\nimport { detailDrawerStyles } from \"./detail-drawer.styles\";\r\nimport type { DetailDrawerProps } from \"./detail-drawer.types\";\r\n\r\n/* ── Helpers internos ────────────────────────────────────────────── */\r\n\r\nfunction formatLongDate(ms: number): string {\r\n if (!ms) return \"—\";\r\n const d = new Date(ms);\r\n return d.toLocaleDateString(\"pt-BR\", {\r\n day: \"numeric\",\r\n month: \"long\",\r\n year: \"numeric\",\r\n });\r\n}\r\n\r\ntype SectionId = \"contact\" | \"meta\" | \"notes\";\r\n\r\n/* ── DetailField (label : value) ────────────────────────────────── */\r\n\r\ntype DetailFieldProps = {\r\n label: string;\r\n value: ReactNode;\r\n s: ReturnType<typeof detailDrawerStyles>;\r\n};\r\n\r\nfunction DetailField({ label, value, s }: DetailFieldProps) {\r\n return (\r\n <div className={s.field()}>\r\n <span className={s.fieldLabel()}>{label}</span>\r\n <span className={s.fieldValue()}>{value || \"—\"}</span>\r\n </div>\r\n );\r\n}\r\n\r\n/* ── DetailSection (collapsible) ─────────────────────────────────── */\r\n\r\ntype DetailSectionProps = {\r\n id: SectionId;\r\n title: string;\r\n open: boolean;\r\n onToggle: (id: SectionId) => void;\r\n children: ReactNode;\r\n s: ReturnType<typeof detailDrawerStyles>;\r\n};\r\n\r\nfunction DetailSection({\r\n id,\r\n title,\r\n open,\r\n onToggle,\r\n children,\r\n s,\r\n}: DetailSectionProps) {\r\n return (\r\n <section className={s.section()}>\r\n <button\r\n type=\"button\"\r\n className={s.sectionHead()}\r\n onClick={() => onToggle(id)}\r\n aria-expanded={open}\r\n >\r\n <span>{title}</span>\r\n <ChevronDown\r\n className={[s.sectionChev(), open ? s.sectionChevOpen() : \"\"].join(\" \")}\r\n />\r\n </button>\r\n {open && <div className={s.sectionBody()}>{children}</div>}\r\n </section>\r\n );\r\n}\r\n\r\n/* ── DetailDrawer ────────────────────────────────────────────────── */\r\n\r\n/**\r\n * Drawer \"Detalhes do cliente\" — usa `<FloatingPanel>` do DS (non-modal,\r\n * resizable, maximizable, responsive). Replica visual do `TblDetailsPanel`\r\n * do sandbox /design-and-table-v2.\r\n */\r\nexport function DetailDrawer({\r\n row,\r\n onClose,\r\n onEdit,\r\n onDelete,\r\n onSave,\r\n}: DetailDrawerProps) {\r\n const s = detailDrawerStyles();\r\n const [openSections, setOpenSections] = useState<Set<SectionId>>(\r\n () => new Set([\"contact\", \"meta\", \"notes\"]),\r\n );\r\n\r\n const toggle = (id: SectionId) => {\r\n setOpenSections((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(id)) next.delete(id);\r\n else next.add(id);\r\n return next;\r\n });\r\n };\r\n\r\n // Mantém ordem dos hooks estável independente de `row` — depois do toggle.\r\n if (!row) return null;\r\n\r\n const status = STATUSES[row.statusId];\r\n const cat = CATEGORIES[row.categoryId as keyof typeof CATEGORIES];\r\n const agent = AGENTS[row.agentId as keyof typeof AGENTS];\r\n const agentInitials =\r\n agent?.name.split(\" \").map((p) => p[0]).join(\"\").slice(0, 2) ?? \"?\";\r\n\r\n return (\r\n <FloatingPanel\r\n open={row !== null}\r\n onOpenChange={(open) => {\r\n if (!open) onClose();\r\n }}\r\n side=\"right\"\r\n size=\"md\"\r\n resizable\r\n maximizable\r\n // Sections internas (DetailSection) gerenciam o próprio padding edge-to-edge.\r\n bodyPadded={false}\r\n resizableStorageKey=\"clientes-showcase.detail-drawer.width\"\r\n titleSlot={\r\n <div className=\"flex items-center gap-gp-md min-w-0\">\r\n <Avatar\r\n className=\"size-[40px] shrink-0\"\r\n style={{ background: row.avatarColor }}\r\n >\r\n <AvatarFallback className=\"bg-transparent text-white text-body-md font-bold\">\r\n {row.initials}\r\n </AvatarFallback>\r\n </Avatar>\r\n <div className=\"flex flex-col min-w-0 flex-1\">\r\n <div className=\"text-body-md font-semibold text-fg-default whitespace-nowrap overflow-hidden text-ellipsis\">\r\n {row.name}\r\n </div>\r\n <div className=\"flex items-center gap-[6px] mt-[2px] text-body-xs font-normal text-fg-muted\">\r\n <span>{row.id}</span>\r\n <span className=\"opacity-50\">·</span>\r\n <span className=\"inline-flex items-center gap-[6px]\">\r\n <span\r\n className=\"inline-block size-[8px] rounded-radius-full shrink-0\"\r\n style={{ background: STATUS_DOT[row.statusId] ?? status?.color }}\r\n aria-hidden\r\n />\r\n {status?.label}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n headerActions={\r\n <>\r\n <Button\r\n variant=\"soft\"\r\n color=\"secondary\"\r\n size=\"icon-sm\"\r\n aria-label=\"Editar\"\r\n onClick={() => onEdit?.(row)}\r\n >\r\n <Pencil />\r\n </Button>\r\n <Button\r\n variant=\"soft\"\r\n color=\"critical\"\r\n size=\"icon-sm\"\r\n aria-label=\"Excluir\"\r\n onClick={() => onDelete?.(row)}\r\n >\r\n <Trash2 />\r\n </Button>\r\n </>\r\n }\r\n footer={\r\n <>\r\n <Button variant=\"outline\" color=\"secondary\" size=\"sm\" onClick={onClose}>\r\n Cancelar\r\n </Button>\r\n <Button\r\n variant=\"filled\"\r\n color=\"primary\"\r\n size=\"sm\"\r\n onClick={() => onSave?.(row)}\r\n >\r\n Salvar alterações\r\n </Button>\r\n </>\r\n }\r\n >\r\n <DetailSection\r\n id=\"contact\"\r\n title=\"Contato\"\r\n open={openSections.has(\"contact\")}\r\n onToggle={toggle}\r\n s={s}\r\n >\r\n <DetailField\r\n label=\"Email\"\r\n value={\r\n <a\r\n href={`mailto:${row.email}`}\r\n className=\"text-fg-brand hover:underline\"\r\n >\r\n {row.email}\r\n </a>\r\n }\r\n s={s}\r\n />\r\n <DetailField\r\n label=\"Telefone\"\r\n value={\r\n <a\r\n href={`tel:${row.phone.replace(/\\D/g, \"\")}`}\r\n className=\"text-fg-brand hover:underline\"\r\n >\r\n {row.phone}\r\n </a>\r\n }\r\n s={s}\r\n />\r\n <DetailField label=\"Localização\" value={row.location} s={s} />\r\n </DetailSection>\r\n\r\n <DetailSection\r\n id=\"meta\"\r\n title=\"Atendimento\"\r\n open={openSections.has(\"meta\")}\r\n onToggle={toggle}\r\n s={s}\r\n >\r\n <DetailField label=\"ID\" value={row.id} s={s} />\r\n <DetailField\r\n label=\"Categoria\"\r\n value={\r\n cat ? (\r\n <Chip\r\n color={CATEGORY_KIND[row.categoryId] ?? \"info\"}\r\n variant=\"soft\"\r\n size=\"sm\"\r\n shape=\"pill\"\r\n >\r\n {cat.label}\r\n </Chip>\r\n ) : (\r\n \"—\"\r\n )\r\n }\r\n s={s}\r\n />\r\n <DetailField\r\n label=\"Atribuído a\"\r\n value={\r\n agent ? (\r\n <span className=\"inline-flex items-center gap-gp-sm\">\r\n <Avatar\r\n className=\"size-[22px]\"\r\n style={{ background: agent.color }}\r\n >\r\n <AvatarFallback className=\"bg-transparent text-white text-caption-xs font-bold\">\r\n {agentInitials}\r\n </AvatarFallback>\r\n </Avatar>\r\n {agent.name}\r\n </span>\r\n ) : (\r\n \"—\"\r\n )\r\n }\r\n s={s}\r\n />\r\n <DetailField label=\"Valor\" value={formatBRL(row.value)} s={s} />\r\n <DetailField label=\"Criado em\" value={formatLongDate(row.createdAt)} s={s} />\r\n <DetailField\r\n label=\"Último contato\"\r\n value={formatShortDate(row.lastContact)}\r\n s={s}\r\n />\r\n </DetailSection>\r\n\r\n <DetailSection\r\n id=\"notes\"\r\n title=\"Anotações\"\r\n open={openSections.has(\"notes\")}\r\n onToggle={toggle}\r\n s={s}\r\n >\r\n <p className=\"text-body-xs font-normal text-fg-muted\">Sem anotações.</p>\r\n </DetailSection>\r\n </FloatingPanel>\r\n );\r\n}\r\n","import { useCallback, useMemo, useRef, useState } from \"react\";\r\nimport { useTheme, type Theme } from \"@/hooks/useTheme\";\r\nimport {\r\n Archive,\r\n Clock,\r\n Copy,\r\n Download,\r\n Maximize2,\r\n MessageSquare,\r\n MoreHorizontal,\r\n Pencil,\r\n Plus,\r\n RotateCcw,\r\n Trash2,\r\n Upload,\r\n} from \"lucide-react\";\r\nimport {\r\n CATEGORIES,\r\n AGENTS,\r\n type ClientRow,\r\n} from \"../_table-data\";\r\nimport {\r\n DataTable,\r\n presetView,\r\n type DataTableColumnDef,\r\n type DataTableKanbanConfig,\r\n type DataTablePresetView,\r\n type DataTableRef,\r\n type DataTableViewMode,\r\n type FilterModel,\r\n} from \"@/components/ui/DataTable\";\r\nimport { AppShell } from \"@/components/ui/AppShell\";\r\nimport { Button } from \"@/components/ui/Button/button\";\r\nimport { Chip } from \"@/components/ui/Chip\";\r\nimport { PageHeader } from \"@/components/ui/PageHeader\";\r\nimport { BulkActionButton } from \"@/components/ui/TableToolbar\";\r\nimport { Avatar, AvatarFallback } from \"@/components/shadcn/avatar\";\r\nimport {\r\n APP_SHELL_CONTEXTS,\r\n APP_SHELL_COMMANDS,\r\n APP_SHELL_NOTIFICATIONS,\r\n APP_SHELL_MESSAGES,\r\n APP_SHELL_THEME_OPTIONS,\r\n APP_SHELL_LAYOUT_OPTIONS,\r\n APP_SHELL_USER,\r\n} from \"../../mocks/app-shell-mocks\";\r\nimport {\r\n CLIENTS_87,\r\n STATUS_OPTIONS,\r\n CATEGORY_OPTIONS,\r\n AGENT_OPTIONS,\r\n AGENTS_LOOKUP,\r\n KANBAN_COLUMNS,\r\n CATEGORY_KIND,\r\n formatBRL,\r\n formatShortDate,\r\n} from \"./clientes-showcase-mocks\";\r\nimport { NovoClienteDrawer } from \"./components/NovoClienteDrawer\";\r\nimport { DetailDrawer } from \"./components/DetailDrawer\";\r\nimport { AlertModal } from \"@/components/ui/AlertModal\";\r\n\r\n/* ── Columns declarativas (type-based) ─────────────────────────── */\r\n\r\ntype ColumnHandlers = {\r\n /** Pede confirmação de exclusão (abre o AlertModal). */\r\n onAskDelete: (row: ClientRow) => void;\r\n};\r\n\r\nfunction buildColumns(handlers: ColumnHandlers): DataTableColumnDef<ClientRow>[] {\r\n return [\r\n { field: \"id\", headerName: \"ID\", type: \"text\", width: 130 },\r\n {\r\n field: \"name\",\r\n headerName: \"Nome\",\r\n type: \"user\",\r\n sortable: true,\r\n width: 220,\r\n typeOptions: {\r\n users: Object.fromEntries(\r\n CLIENTS_87.map((c) => [\r\n c.name,\r\n {\r\n name: c.name,\r\n initials: c.initials,\r\n color: c.avatarColor,\r\n },\r\n ]),\r\n ),\r\n },\r\n valueGetter: (row) => row.name,\r\n },\r\n {\r\n field: \"email\",\r\n headerName: \"Email\",\r\n type: \"email\",\r\n enableColumnFilter: true,\r\n filterType: \"text\",\r\n },\r\n {\r\n field: \"phone\",\r\n headerName: \"Telefone\",\r\n type: \"phone\",\r\n },\r\n {\r\n field: \"statusId\",\r\n headerName: \"Status\",\r\n type: \"status\",\r\n enableColumnFilter: true,\r\n filterType: \"multiSelect\",\r\n filterOptions: STATUS_OPTIONS,\r\n },\r\n {\r\n field: \"categoryId\",\r\n headerName: \"Categoria\",\r\n type: \"badge\",\r\n enableColumnFilter: true,\r\n filterType: \"multiSelect\",\r\n filterOptions: CATEGORY_OPTIONS,\r\n },\r\n {\r\n field: \"agentId\",\r\n headerName: \"Atribuído\",\r\n type: \"user\",\r\n enableColumnFilter: true,\r\n filterType: \"select\",\r\n filterOptions: AGENT_OPTIONS,\r\n typeOptions: { users: AGENTS_LOOKUP },\r\n },\r\n {\r\n field: \"value\",\r\n headerName: \"Valor\",\r\n type: \"currency\",\r\n sortable: true,\r\n enableColumnFilter: true,\r\n filterType: \"number\",\r\n aggregate: \"sum\",\r\n aggregateFormatter: (v) =>\r\n new Intl.NumberFormat(\"pt-BR\", { style: \"currency\", currency: \"BRL\" }).format(v),\r\n },\r\n {\r\n field: \"createdAt\",\r\n headerName: \"Criado em\",\r\n type: \"date\",\r\n sortable: true,\r\n enableColumnFilter: true,\r\n filterType: \"date\",\r\n width: 130,\r\n },\r\n {\r\n field: \"lastContact\",\r\n headerName: \"Último contato\",\r\n type: \"date\",\r\n sortable: true,\r\n width: 150,\r\n },\r\n {\r\n field: \"location\",\r\n headerName: \"Localização\",\r\n type: \"text\",\r\n minWidth: 150,\r\n },\r\n {\r\n field: \"_actions\",\r\n headerName: \"\",\r\n type: \"actions\",\r\n width: 64,\r\n pinned: \"right\",\r\n getActions: ({ row }) => [\r\n {\r\n id: \"edit\",\r\n label: \"Editar\",\r\n icon: <Pencil />,\r\n showInMenu: true,\r\n onClick: () => console.log(\"Editar\", row.id),\r\n },\r\n {\r\n id: \"whatsapp\",\r\n label: \"Abrir atendimento (WhatsApp)\",\r\n icon: <MessageSquare />,\r\n showInMenu: true,\r\n onClick: () => console.log(\"Atendimento\", row.id),\r\n },\r\n {\r\n id: \"archive\",\r\n label: \"Arquivar\",\r\n icon: <Archive />,\r\n showInMenu: true,\r\n onClick: () => console.log(\"Arquivar\", row.id),\r\n },\r\n {\r\n id: \"delete\",\r\n label: \"Excluir cliente\",\r\n icon: <Trash2 />,\r\n showInMenu: true,\r\n destructive: true,\r\n onClick: () => handlers.onAskDelete(row),\r\n },\r\n ],\r\n },\r\n ];\r\n}\r\n\r\n/* ── Saved views / Presets — tabs do toolbar ───────────────────── */\r\n\r\nconst DEFAULT_VIEWS: DataTablePresetView[] = [\r\n presetView({\r\n id: \"preset:meus\",\r\n name: \"Meus\",\r\n filters: [{ field: \"agentId\", value: \"you\" }],\r\n }),\r\n presetView({\r\n id: \"preset:ativos\",\r\n name: \"Ativos\",\r\n filters: [{ field: \"statusId\", value: \"active\" }],\r\n }),\r\n presetView({\r\n id: \"preset:royals\",\r\n name: \"Royals\",\r\n filters: [{ field: \"categoryId\", value: \"royal\" }],\r\n }),\r\n presetView({\r\n id: \"preset:ultimos-7-dias\",\r\n name: \"Últimos 7 dias\",\r\n sort: [{ field: \"createdAt\", direction: \"desc\" }],\r\n }),\r\n];\r\n\r\n/* ── Filtros iniciais (Status=Ativo + Categoria=Royal — print) ─── */\r\n\r\n// statusId e categoryId são filterType=\"multiSelect\" — operator correto é \"isAnyOf\"\r\n// (not \"equals\"). Sem isso, o popover Filtros mostrava o Select de operador VAZIO\r\n// porque \"equals\" não está nos operators de MultiSelectColumnType.\r\nconst INITIAL_FILTERS: FilterModel = {\r\n items: [\r\n { id: \"filter-status-ativo\", field: \"statusId\", operator: \"isAnyOf\", value: \"active\" },\r\n { id: \"filter-categoria-royal\", field: \"categoryId\", operator: \"isAnyOf\", value: \"royal\" },\r\n ],\r\n logicOperator: \"AND\",\r\n};\r\n\r\n/* ── Kanban config (renderCard com JSX) ────────────────────────── */\r\n\r\nconst KANBAN_CONFIG: DataTableKanbanConfig<ClientRow> = {\r\n groupByField: \"statusId\",\r\n columns: KANBAN_COLUMNS,\r\n renderCard: ({ row }) => {\r\n const cat = CATEGORIES[row.categoryId as keyof typeof CATEGORIES];\r\n const agent = AGENTS[row.agentId as keyof typeof AGENTS];\r\n const agentInitials = agent?.name.split(\" \").map((s) => s[0]).join(\"\").slice(0, 2) ?? \"?\";\r\n return {\r\n title: row.name,\r\n subtitle: row.id,\r\n avatar: (\r\n <Avatar className=\"size-[28px]\" style={{ background: row.avatarColor }}>\r\n <AvatarFallback className=\"bg-transparent text-white text-caption-sm font-bold\">\r\n {row.initials}\r\n </AvatarFallback>\r\n </Avatar>\r\n ),\r\n chip: cat ? (\r\n <Chip\r\n color={CATEGORY_KIND[row.categoryId] ?? \"info\"}\r\n variant=\"soft\"\r\n size=\"sm\"\r\n shape=\"pill\"\r\n >\r\n {cat.label}\r\n </Chip>\r\n ) : null,\r\n value: formatBRL(row.value),\r\n footerLeft: agent ? (\r\n <span className=\"inline-flex items-center gap-gp-sm min-w-0 flex-1\">\r\n <Avatar className=\"size-[22px]\" style={{ background: agent.color }}>\r\n <AvatarFallback className=\"bg-transparent text-white text-caption-xs font-bold\">\r\n {agentInitials}\r\n </AvatarFallback>\r\n </Avatar>\r\n <span className=\"text-body-xs font-normal text-fg-muted whitespace-nowrap overflow-hidden text-ellipsis\">\r\n {agent.name}\r\n </span>\r\n </span>\r\n ) : null,\r\n footerRight: (\r\n <span className=\"inline-flex items-center gap-[4px] text-caption-sm text-fg-muted [font-variant-numeric:tabular-nums] shrink-0\">\r\n <Clock size={11} strokeWidth={1.8} aria-hidden />\r\n {formatShortDate(row.lastContact)}\r\n </span>\r\n ),\r\n };\r\n },\r\n};\r\n\r\n/* ═══════════════════════════════════════════════════════════════════════════\r\n Page — Clientes (showcase usando AppShell + DataTable real)\r\n ═══════════════════════════════════════════════════════════════════════════ */\r\n\r\ntype ConfirmDeleteState = {\r\n ids: string[];\r\n label: string;\r\n /** Callback opcional após confirmar — usado pelo bulk pra limpar seleção. */\r\n onAfter?: () => void;\r\n} | null;\r\n\r\nexport default function ClientesShowcase() {\r\n const { theme, setTheme } = useTheme();\r\n const [rows, setRows] = useState<ClientRow[]>(() => CLIENTS_87);\r\n const [layout, setLayout] = useState<string>(\"fluid\");\r\n const [filterModel, setFilterModel] = useState<FilterModel>(INITIAL_FILTERS);\r\n const [viewMode, setViewMode] = useState<DataTableViewMode>(\"table\");\r\n const [novoClienteOpen, setNovoClienteOpen] = useState(false);\r\n const [detailRowId, setDetailRowId] = useState<string | null>(null);\r\n const [confirmDelete, setConfirmDelete] = useState<ConfirmDeleteState>(null);\r\n const detailRow = detailRowId ? rows.find((r) => r.id === detailRowId) ?? null : null;\r\n const tableRef = useRef<DataTableRef>(null);\r\n\r\n const askDelete = useCallback(\r\n (row: ClientRow) =>\r\n setConfirmDelete({ ids: [row.id], label: row.name }),\r\n [],\r\n );\r\n\r\n const askBulkDelete = useCallback(\r\n (ids: string[], onAfter: () => void) =>\r\n setConfirmDelete({\r\n ids,\r\n label: `${ids.length} cliente${ids.length === 1 ? \"\" : \"s\"}`,\r\n onAfter,\r\n }),\r\n [],\r\n );\r\n\r\n const handleConfirmDelete = useCallback(() => {\r\n if (!confirmDelete) return;\r\n const ids = new Set(confirmDelete.ids);\r\n setRows((prev) => prev.filter((r) => !ids.has(r.id)));\r\n if (detailRowId && ids.has(detailRowId)) setDetailRowId(null);\r\n confirmDelete.onAfter?.();\r\n setConfirmDelete(null);\r\n }, [confirmDelete, detailRowId]);\r\n\r\n const columns = useMemo(\r\n () => buildColumns({ onAskDelete: askDelete }),\r\n [askDelete],\r\n );\r\n\r\n return (\r\n <AppShell\r\n contexts={APP_SHELL_CONTEXTS}\r\n defaultActiveContextId=\"inbox\"\r\n defaultActiveItemHref=\"#atendimentos\"\r\n breadcrumb={[{ label: \"Atendimentos\" }]}\r\n commandGroups={APP_SHELL_COMMANDS}\r\n notifications={{\r\n items: APP_SHELL_NOTIFICATIONS,\r\n onMarkAllRead: () => alert(\"Marcar todas como lidas\"),\r\n onMoreActions: () => alert(\"Mais ações\"),\r\n onViewAll: () => alert(\"Ver todas\"),\r\n }}\r\n messages={{\r\n items: APP_SHELL_MESSAGES,\r\n onNewMessage: () => alert(\"Nova mensagem\"),\r\n onExpand: () => alert(\"Expandir\"),\r\n onViewAll: () => alert(\"Ver todas\"),\r\n }}\r\n theme={theme}\r\n onThemeChange={(id) => setTheme(id as Theme)}\r\n themeOptions={APP_SHELL_THEME_OPTIONS}\r\n user={APP_SHELL_USER}\r\n layout={layout}\r\n onLayoutChange={setLayout}\r\n layoutOptions={APP_SHELL_LAYOUT_OPTIONS}\r\n onSettings={() => alert(\"Abrir Configurações\")}\r\n onLogout={() => alert(\"Sair (mock)\")}\r\n >\r\n <PageHeader\r\n title=\"Clientes\"\r\n description=\"Gerencie sua base de clientes, acompanhe status de cadastro e abra atendimentos diretos pelo WhatsApp.\"\r\n badge={\r\n <Chip color=\"primary\" variant=\"soft\" size=\"sm\" shape=\"rounded\">\r\n {rows.length.toLocaleString(\"pt-BR\")} registros\r\n </Chip>\r\n }\r\n actions={\r\n <>\r\n <Button\r\n variant=\"outline\"\r\n color=\"secondary\"\r\n size=\"icon-md\"\r\n aria-label=\"Mais ações\"\r\n onClick={() => alert(\"Mais ações\")}\r\n >\r\n <MoreHorizontal />\r\n </Button>\r\n <Button\r\n variant=\"filled\"\r\n color=\"primary\"\r\n size=\"md\"\r\n iconLeft={<Plus />}\r\n onClick={() => setNovoClienteOpen(true)}\r\n >\r\n Novo cliente\r\n </Button>\r\n </>\r\n }\r\n />\r\n\r\n {/* DataTable — ocupa o resto do body ──────────────────────── */}\r\n <DataTable<ClientRow>\r\n ref={tableRef}\r\n rows={rows}\r\n columns={columns}\r\n getRowId={(r) => r.id}\r\n persistId=\"showcase-clientes-crud\"\r\n defaultViews={DEFAULT_VIEWS}\r\n /* Chips de filtro VAZIOS já visíveis no load (\"Atribuído\") — a afordância\r\n aparece sem abrir o menu; o usuário clica e preenche. Filtro é recurso\r\n da tabela (nativo), nunca form/select acima dela. */\r\n showEmptyFilterChips={[\"agentId\"]}\r\n filterModel={filterModel}\r\n onFilterModelChange={setFilterModel}\r\n viewMode={viewMode}\r\n onViewModeChange={setViewMode}\r\n kanbanConfig={KANBAN_CONFIG}\r\n toolbar={{\r\n enableSearch: true,\r\n enableFilters: true,\r\n enableColumns: true,\r\n enableDensity: true,\r\n enableExport: true,\r\n moreMenu: {\r\n items: [\r\n {\r\n id: \"fullscreen\",\r\n label: \"Tela cheia\",\r\n icon: <Maximize2 />,\r\n onSelect: () => alert(\"Tela cheia\"),\r\n },\r\n {\r\n id: \"duplicate\",\r\n label: \"Duplicar visualização\",\r\n icon: <Copy />,\r\n onSelect: () => alert(\"Duplicar visualização\"),\r\n },\r\n {\r\n id: \"import\",\r\n label: \"Importar CSV\",\r\n icon: <Upload />,\r\n onSelect: () => alert(\"Importar CSV\"),\r\n },\r\n {\r\n id: \"reset\",\r\n label: \"Resetar visualização\",\r\n icon: <RotateCcw />,\r\n destructive: true,\r\n onSelect: () => tableRef.current?.resetPersistedState(),\r\n },\r\n ],\r\n },\r\n }}\r\n paginationConfig={{\r\n enabled: true,\r\n initialPageSize: 10,\r\n pageSizeOptions: [10, 25, 50, 100],\r\n }}\r\n selectionConfig={{\r\n enabled: true,\r\n enableGlobal: true,\r\n actions: (selectedIds, clearSelection) => (\r\n <>\r\n <BulkActionButton\r\n icon={<Download />}\r\n onClick={() => tableRef.current?.exportCsv(\"selected\")}\r\n >\r\n Exportar\r\n </BulkActionButton>\r\n <BulkActionButton\r\n icon={<Trash2 />}\r\n variant=\"danger\"\r\n onClick={() => askBulkDelete(selectedIds.map(String), clearSelection)}\r\n >\r\n Excluir\r\n </BulkActionButton>\r\n </>\r\n ),\r\n }}\r\n onCellEditCommit={async ({ id, field, value }) => {\r\n await new Promise((res) => setTimeout(res, 400));\r\n setRows((prev) =>\r\n prev.map((r) => (r.id === id ? { ...r, [field]: value } : r)),\r\n );\r\n }}\r\n onRowClick={(row) => setDetailRowId(row.id)}\r\n className=\"flex-1 min-h-0\"\r\n />\r\n\r\n {/* Drawer \"Novo cliente\" — controlado pelo botão do header */}\r\n <NovoClienteDrawer\r\n open={novoClienteOpen}\r\n onOpenChange={setNovoClienteOpen}\r\n onSubmit={(data) => {\r\n console.log(\"Novo cliente:\", data);\r\n alert(`Cliente \"${data.name}\" criado (mock)`);\r\n }}\r\n />\r\n\r\n {/* DetailDrawer — abre ao clicar numa row, slide-in da direita SEM\r\n backdrop modal (tabela continua interativa atrás). */}\r\n <DetailDrawer\r\n row={detailRow}\r\n onClose={() => setDetailRowId(null)}\r\n onEdit={(r) => console.log(\"Editar\", r.id)}\r\n onDelete={(r) => askDelete(r)}\r\n onSave={(r) => alert(`Salvar alterações em ${r.name} (mock)`)}\r\n />\r\n\r\n {/* AlertModal de confirmação de exclusão — compartilhado entre\r\n row action menu, bulk action e DetailDrawer.onDelete. */}\r\n <AlertModal\r\n open={confirmDelete !== null}\r\n onOpenChange={(open) => {\r\n if (!open) setConfirmDelete(null);\r\n }}\r\n tone=\"danger\"\r\n title={\r\n confirmDelete && confirmDelete.ids.length > 1\r\n ? `Excluir ${confirmDelete.label}?`\r\n : \"Excluir cliente?\"\r\n }\r\n description={\r\n confirmDelete\r\n ? confirmDelete.ids.length > 1\r\n ? `Esta ação não pode ser desfeita. ${confirmDelete.label} serão removidos permanentemente.`\r\n : `Esta ação não pode ser desfeita. \"${confirmDelete.label}\" será removido permanentemente.`\r\n : null\r\n }\r\n confirmLabel=\"Excluir\"\r\n cancelLabel=\"Cancelar\"\r\n onConfirm={handleConfirmDelete}\r\n />\r\n </AppShell>\r\n );\r\n}\r\n"],"names":["tv","useState","useEffect","jsxs","Panel","Fragment","jsx","Button","FormFieldInput","FormField","ChipGroup","STATUSES","ChipGroupItem","STATUS_DOT","CATEGORIES","FormFieldSelect","CITIES","FormFieldTextarea","ChevronDown","AGENTS","FloatingPanel","Avatar","AvatarFallback","Pencil","Trash2","Chip","CATEGORY_KIND","formatBRL","formatShortDate","CLIENTS_87","STATUS_OPTIONS","CATEGORY_OPTIONS","AGENT_OPTIONS","AGENTS_LOOKUP","MessageSquare","Archive","presetView","KANBAN_COLUMNS","Clock","useTheme","useRef","useCallback","useMemo","AppShell","APP_SHELL_CONTEXTS","APP_SHELL_COMMANDS","APP_SHELL_NOTIFICATIONS","APP_SHELL_MESSAGES","APP_SHELL_THEME_OPTIONS","APP_SHELL_USER","APP_SHELL_LAYOUT_OPTIONS","PageHeader","MoreHorizontal","Plus","DataTable","Maximize2","Copy","Upload","RotateCcw","BulkActionButton","Download","AlertModal"],"mappings":";;;;;;;;;;;;;AAOO,MAAM,mBAAmBA,SAAAA,GAAG;AAAA,EACjC,OAAO;AAAA,IACL,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAEf,CAAC;ACGD,MAAM,eAAoC;AAAA,EACxC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AACT;AAsBO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,IAAI,iBAAA;AACV,QAAM,CAAC,MAAM,OAAO,IAAIC,MAAAA,SAA8B,YAAY;AAGlEC,QAAAA,UAAU,MAAM;AACd,QAAI,cAAc,YAAY;AAAA,EAChC,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,YAAY,KAAK,KAAK,KAAA,EAAO,SAAS;AAE5C,QAAM,eAAe,MAAM;AACzB,QAAI,CAAC,UAAW;AAChB,eAAW,IAAI;AACf,iBAAa,KAAK;AAAA,EACpB;AAEA,SACEC,2BAAAA;AAAAA,IAACC,MAAAA;AAAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,OAAM;AAAA,MACN,MAAK;AAAA,MACL,MAAK;AAAA,MACL,QACED,2BAAAA,KAAAE,qBAAA,EACE,UAAA;AAAA,QAAAC,2BAAAA;AAAAA,UAACC,SAAAA;AAAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,MAAK;AAAA,YACL,SAAS,MAAM,aAAa,KAAK;AAAA,YAClC,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGDD,2BAAAA;AAAAA,UAACC,SAAAA;AAAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,MAAK;AAAA,YACL,UAAU,CAAC;AAAA,YACX,SAAS;AAAA,YACV,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAED,GACF;AAAA,MAGF,UAAA;AAAA,QAAAD,2BAAAA;AAAAA,UAACE,MAAAA;AAAAA,UAAA;AAAA,YACC,OAAM;AAAA,YACN,UAAQ;AAAA,YACR,aAAY;AAAA,YACZ,OAAO,KAAK;AAAA,YACZ,UAAU,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,EAAE,OAAO,QAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,QAGlEL,2BAAAA,KAAC,OAAA,EAAI,WAAW,EAAE,WAChB,UAAA;AAAA,UAAAG,2BAAAA;AAAAA,YAACE,MAAAA;AAAAA,YAAA;AAAA,cACC,OAAM;AAAA,cACN,MAAK;AAAA,cACL,aAAY;AAAA,cACZ,OAAO,KAAK;AAAA,cACZ,UAAU,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,EAAE,OAAO,QAAQ;AAAA,YAAA;AAAA,UAAA;AAAA,UAEnEF,2BAAAA;AAAAA,YAACE,MAAAA;AAAAA,YAAA;AAAA,cACC,OAAM;AAAA,cACN,MAAK;AAAA,cACL,aAAY;AAAA,cACZ,OAAO,KAAK;AAAA,cACZ,UAAU,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,GAAG,GAAG,UAAU,EAAE,OAAO,QAAQ;AAAA,YAAA;AAAA,UAAA;AAAA,QACtE,GACF;AAAA,QAEAF,2BAAAA,IAACG,MAAAA,WAAA,EAAU,OAAM,UACd,UAAA,MACCH,2BAAAA;AAAAA,UAACI,SAAAA;AAAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO,KAAK;AAAA,YACZ,eAAe,CAAC,MACd,KACA,QAAQ,CAAC,OAAO;AAAA,cACd,GAAG;AAAA,cACH,UAAU;AAAA,YAAA,EACV;AAAA,YAEJ,MAAK;AAAA,YACL,OAAM;AAAA,YACN,WAAU;AAAA,YAET,UAAA,OAAO,QAAQC,sBAAAA,QAAQ,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,MACpCR,2BAAAA,KAACS,SAAAA,eAAA,EAAuB,OAAO,IAC7B,UAAA;AAAA,cAAAN,2BAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAW,EAAE,UAAA;AAAA,kBACb,OAAO,EAAE,YAAYO,sBAAAA,WAAW,EAAE,KAAK,GAAG,MAAA;AAAA,kBAC1C,eAAW;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEZ,GAAG;AAAA,YAAA,EAAA,GANc,EAOpB,CACD;AAAA,UAAA;AAAA,QAAA,GAGP;AAAA,QAEAP,2BAAAA,IAACG,MAAAA,WAAA,EAAU,OAAM,aACd,UAAA,MACCH,2BAAAA;AAAAA,UAACI,SAAAA;AAAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO,KAAK;AAAA,YACZ,eAAe,CAAC,MACd,KACA,QAAQ,CAAC,OAAO;AAAA,cACd,GAAG;AAAA,cACH,YAAY;AAAA,YAAA,EACZ;AAAA,YAEJ,MAAK;AAAA,YACL,OAAM;AAAA,YACN,WAAU;AAAA,YAET,iBAAO,QAAQI,sBAAAA,UAAU,EAAE,IAAI,CAAC,CAAC,IAAI,GAAG,qCACtCF,SAAAA,eAAA,EAAuB,OAAO,IAC5B,UAAA,IAAI,MAAA,GADa,EAEpB,CACD;AAAA,UAAA;AAAA,QAAA,GAGP;AAAA,QAEAT,2BAAAA,KAAC,OAAA,EAAI,WAAW,EAAE,WAChB,UAAA;AAAA,UAAAG,2BAAAA;AAAAA,YAACS,MAAAA;AAAAA,YAAA;AAAA,cACC,OAAM;AAAA,cACN,aAAY;AAAA,cACZ,OAAO,KAAK,QAAQ;AAAA,cACpB,eAAe,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,EAAA,EAAI;AAAA,cACxD,SAASC,sBAAAA,OAAO,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI;AAAA,YAAA;AAAA,UAAA;AAAA,UAErDV,2BAAAA;AAAAA,YAACE,MAAAA;AAAAA,YAAA;AAAA,cACC,OAAM;AAAA,cACN,MAAK;AAAA,cACL,YAAW;AAAA,cACX,OAAO,OAAO,KAAK,KAAK;AAAA,cACxB,UAAU,CAAC,MACT,QAAQ,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,OAAO,EAAE,OAAO,KAAK,IAAI;AAAA,cAE1D,KAAK;AAAA,cACL,MAAM;AAAA,YAAA;AAAA,UAAA;AAAA,QACR,GACF;AAAA,QAEAF,2BAAAA;AAAAA,UAACW,MAAAA;AAAAA,UAAA;AAAA,YACC,OAAM;AAAA,YACN,aAAY;AAAA,YACZ,MAAM;AAAA,YACN,OAAO,KAAK;AAAA,YACZ,UAAU,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,EAAE,OAAO,QAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,MACnE;AAAA,IAAA;AAAA,EAAA;AAGN;ACvMO,MAAM,qBAAqBjB,SAAAA,GAAG;AAAA,EACnC,OAAO;AAAA,IACL,SAAS;AAAA,IACT,aAAa;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,aAAa;AAAA,IAEb,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,YAAY;AAAA,EAAA;AAEhB,CAAC;ACTD,SAAS,eAAe,IAAoB;AAC1C,MAAI,CAAC,GAAI,QAAO;AAChB,QAAM,IAAI,IAAI,KAAK,EAAE;AACrB,SAAO,EAAE,mBAAmB,SAAS;AAAA,IACnC,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,EAAA,CACP;AACH;AAYA,SAAS,YAAY,EAAE,OAAO,OAAO,KAAuB;AAC1D,SACEG,2BAAAA,KAAC,OAAA,EAAI,WAAW,EAAE,SAChB,UAAA;AAAA,IAAAG,+BAAC,QAAA,EAAK,WAAW,EAAE,cAAe,UAAA,OAAM;AAAA,mCACvC,QAAA,EAAK,WAAW,EAAE,cAAe,mBAAS,IAAA,CAAI;AAAA,EAAA,GACjD;AAEJ;AAaA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuB;AACrB,SACEH,2BAAAA,KAAC,WAAA,EAAQ,WAAW,EAAE,WACpB,UAAA;AAAA,IAAAA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAW,EAAE,YAAA;AAAA,QACb,SAAS,MAAM,SAAS,EAAE;AAAA,QAC1B,iBAAe;AAAA,QAEf,UAAA;AAAA,UAAAG,2BAAAA,IAAC,UAAM,UAAA,MAAA,CAAM;AAAA,UACbA,2BAAAA;AAAAA,YAACY,YAAAA;AAAAA,YAAA;AAAA,cACC,WAAW,CAAC,EAAE,YAAA,GAAe,OAAO,EAAE,oBAAoB,EAAE,EAAE,KAAK,GAAG;AAAA,YAAA;AAAA,UAAA;AAAA,QACxE;AAAA,MAAA;AAAA,IAAA;AAAA,IAED,QAAQZ,2BAAAA,IAAC,OAAA,EAAI,WAAW,EAAE,YAAA,GAAgB,SAAA,CAAS;AAAA,EAAA,GACtD;AAEJ;AASO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAsB;AACpB,QAAM,IAAI,mBAAA;AACV,QAAM,CAAC,cAAc,eAAe,IAAIL,MAAAA;AAAAA,IACtC,MAAM,oBAAI,IAAI,CAAC,WAAW,QAAQ,OAAO,CAAC;AAAA,EAAA;AAG5C,QAAM,SAAS,CAAC,OAAkB;AAChC,oBAAgB,CAAC,SAAS;AACxB,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,UAAI,KAAK,IAAI,EAAE,EAAG,MAAK,OAAO,EAAE;AAAA,UAC3B,MAAK,IAAI,EAAE;AAChB,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAGA,MAAI,CAAC,IAAK,QAAO;AAEjB,QAAM,SAASU,sBAAAA,SAAS,IAAI,QAAQ;AACpC,QAAM,MAAMG,sBAAAA,WAAW,IAAI,UAAqC;AAChE,QAAM,QAAQK,sBAAAA,OAAO,IAAI,OAA8B;AACvD,QAAM,gBACJ,OAAO,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,GAAG,CAAC,KAAK;AAElE,SACEhB,2BAAAA;AAAAA,IAACiB,MAAAA;AAAAA,IAAA;AAAA,MACC,MAAM,QAAQ;AAAA,MACd,cAAc,CAAC,SAAS;AACtB,YAAI,CAAC,KAAM,SAAA;AAAA,MACb;AAAA,MACA,MAAK;AAAA,MACL,MAAK;AAAA,MACL,WAAS;AAAA,MACT,aAAW;AAAA,MAEX,YAAY;AAAA,MACZ,qBAAoB;AAAA,MACpB,WACEjB,2BAAAA,KAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,QAAAG,2BAAAA;AAAAA,UAACe,SAAAA;AAAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,YAAY,IAAI,YAAA;AAAA,YAEzB,UAAAf,2BAAAA,IAACgB,SAAAA,gBAAA,EAAe,WAAU,oDACvB,cAAI,SAAA,CACP;AAAA,UAAA;AAAA,QAAA;AAAA,QAEFnB,2BAAAA,KAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,UAAAG,2BAAAA,IAAC,OAAA,EAAI,WAAU,8FACZ,UAAA,IAAI,MACP;AAAA,UACAH,2BAAAA,KAAC,OAAA,EAAI,WAAU,+EACb,UAAA;AAAA,YAAAG,2BAAAA,IAAC,QAAA,EAAM,cAAI,GAAA,CAAG;AAAA,YACdA,2BAAAA,IAAC,QAAA,EAAK,WAAU,cAAa,UAAA,KAAC;AAAA,YAC9BH,2BAAAA,KAAC,QAAA,EAAK,WAAU,sCACd,UAAA;AAAA,cAAAG,2BAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAU;AAAA,kBACV,OAAO,EAAE,YAAYO,sBAAAA,WAAW,IAAI,QAAQ,KAAK,QAAQ,MAAA;AAAA,kBACzD,eAAW;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEZ,QAAQ;AAAA,YAAA,EAAA,CACX;AAAA,UAAA,EAAA,CACF;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MAEF,eACEV,2BAAAA,KAAAE,qBAAA,EACE,UAAA;AAAA,QAAAC,2BAAAA;AAAAA,UAACC,SAAAA;AAAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,MAAK;AAAA,YACL,cAAW;AAAA,YACX,SAAS,MAAM,SAAS,GAAG;AAAA,YAE3B,yCAACgB,YAAAA,QAAA,CAAA,CAAO;AAAA,UAAA;AAAA,QAAA;AAAA,QAEVjB,2BAAAA;AAAAA,UAACC,SAAAA;AAAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,MAAK;AAAA,YACL,cAAW;AAAA,YACX,SAAS,MAAM,WAAW,GAAG;AAAA,YAE7B,yCAACiB,YAAAA,QAAA,CAAA,CAAO;AAAA,UAAA;AAAA,QAAA;AAAA,MACV,GACF;AAAA,MAEF,QACErB,2BAAAA,KAAAE,qBAAA,EACE,UAAA;AAAA,QAAAC,2BAAAA,IAACC,SAAAA,QAAA,EAAO,SAAQ,WAAU,OAAM,aAAY,MAAK,MAAK,SAAS,SAAS,UAAA,WAAA,CAExE;AAAA,QACAD,2BAAAA;AAAAA,UAACC,SAAAA;AAAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,MAAK;AAAA,YACL,SAAS,MAAM,SAAS,GAAG;AAAA,YAC5B,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAED,GACF;AAAA,MAGF,UAAA;AAAA,QAAAJ,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,OAAM;AAAA,YACN,MAAM,aAAa,IAAI,SAAS;AAAA,YAChC,UAAU;AAAA,YACV;AAAA,YAEA,UAAA;AAAA,cAAAG,2BAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAM;AAAA,kBACN,OACEA,2BAAAA;AAAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAM,UAAU,IAAI,KAAK;AAAA,sBACzB,WAAU;AAAA,sBAET,UAAA,IAAI;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAGT;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEFA,2BAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAM;AAAA,kBACN,OACEA,2BAAAA;AAAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAM,OAAO,IAAI,MAAM,QAAQ,OAAO,EAAE,CAAC;AAAA,sBACzC,WAAU;AAAA,sBAET,UAAA,IAAI;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAGT;AAAA,gBAAA;AAAA,cAAA;AAAA,6CAED,aAAA,EAAY,OAAM,eAAc,OAAO,IAAI,UAAU,EAAA,CAAM;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAG9DH,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,OAAM;AAAA,YACN,MAAM,aAAa,IAAI,MAAM;AAAA,YAC7B,UAAU;AAAA,YACV;AAAA,YAEA,UAAA;AAAA,cAAAG,+BAAC,eAAY,OAAM,MAAK,OAAO,IAAI,IAAI,GAAM;AAAA,cAC7CA,2BAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAM;AAAA,kBACN,OACE,MACEA,2BAAAA;AAAAA,oBAACmB,SAAAA;AAAAA,oBAAA;AAAA,sBACC,OAAOC,sBAAAA,cAAc,IAAI,UAAU,KAAK;AAAA,sBACxC,SAAQ;AAAA,sBACR,MAAK;AAAA,sBACL,OAAM;AAAA,sBAEL,UAAA,IAAI;AAAA,oBAAA;AAAA,kBAAA,IAGP;AAAA,kBAGJ;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEFpB,2BAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAM;AAAA,kBACN,OACE,QACEH,gCAAC,QAAA,EAAK,WAAU,sCACd,UAAA;AAAA,oBAAAG,2BAAAA;AAAAA,sBAACe,SAAAA;AAAAA,sBAAA;AAAA,wBACC,WAAU;AAAA,wBACV,OAAO,EAAE,YAAY,MAAM,MAAA;AAAA,wBAE3B,UAAAf,2BAAAA,IAACgB,yBAAA,EAAe,WAAU,uDACvB,UAAA,cAAA,CACH;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBAED,MAAM;AAAA,kBAAA,EAAA,CACT,IAEA;AAAA,kBAGJ;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEFhB,2BAAAA,IAAC,eAAY,OAAM,SAAQ,OAAOqB,sBAAAA,UAAU,IAAI,KAAK,GAAG,GAAM;AAAA,cAC9DrB,2BAAAA,IAAC,eAAY,OAAM,aAAY,OAAO,eAAe,IAAI,SAAS,GAAG,GAAM;AAAA,cAC3EA,2BAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAM;AAAA,kBACN,OAAOsB,sBAAAA,gBAAgB,IAAI,WAAW;AAAA,kBACtC;AAAA,gBAAA;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,QAAA;AAAA,QAGFtB,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,OAAM;AAAA,YACN,MAAM,aAAa,IAAI,OAAO;AAAA,YAC9B,UAAU;AAAA,YACV;AAAA,YAEA,UAAAA,2BAAAA,IAAC,KAAA,EAAE,WAAU,0CAAyC,UAAA,iBAAA,CAAc;AAAA,UAAA;AAAA,QAAA;AAAA,MACtE;AAAA,IAAA;AAAA,EAAA;AAGN;AC1OA,SAAS,aAAa,UAA2D;AAC/E,SAAO;AAAA,IACP,EAAE,OAAO,MAAM,YAAY,MAAM,MAAM,QAAQ,OAAO,IAAA;AAAA,IACtD;AAAA,MACE,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,UAAU;AAAA,MACV,OAAO;AAAA,MACP,aAAa;AAAA,QACX,OAAO,OAAO;AAAA,UACZuB,iCAAW,IAAI,CAAC,MAAM;AAAA,YACpB,EAAE;AAAA,YACF;AAAA,cACE,MAAM,EAAE;AAAA,cACR,UAAU,EAAE;AAAA,cACZ,OAAO,EAAE;AAAA,YAAA;AAAA,UACX,CACD;AAAA,QAAA;AAAA,MACH;AAAA,MAEF,aAAa,CAAC,QAAQ,IAAI;AAAA,IAAA;AAAA,IAE5B;AAAA,MACE,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,oBAAoB;AAAA,MACpB,YAAY;AAAA,IAAA;AAAA,IAEd;AAAA,MACE,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,MAAM;AAAA,IAAA;AAAA,IAER;AAAA,MACE,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,oBAAoB;AAAA,MACpB,YAAY;AAAA,MACZ,eAAeC,sBAAAA;AAAAA,IAAA;AAAA,IAEjB;AAAA,MACE,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,oBAAoB;AAAA,MACpB,YAAY;AAAA,MACZ,eAAeC,sBAAAA;AAAAA,IAAA;AAAA,IAEjB;AAAA,MACE,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,oBAAoB;AAAA,MACpB,YAAY;AAAA,MACZ,eAAeC,sBAAAA;AAAAA,MACf,aAAa,EAAE,OAAOC,sBAAAA,cAAA;AAAA,IAAc;AAAA,IAEtC;AAAA,MACE,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,UAAU;AAAA,MACV,oBAAoB;AAAA,MACpB,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,oBAAoB,CAAC,MACnB,IAAI,KAAK,aAAa,SAAS,EAAE,OAAO,YAAY,UAAU,MAAA,CAAO,EAAE,OAAO,CAAC;AAAA,IAAA;AAAA,IAEnF;AAAA,MACE,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,UAAU;AAAA,MACV,oBAAoB;AAAA,MACpB,YAAY;AAAA,MACZ,OAAO;AAAA,IAAA;AAAA,IAET;AAAA,MACE,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,UAAU;AAAA,MACV,OAAO;AAAA,IAAA;AAAA,IAET;AAAA,MACE,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAAA,IAEZ;AAAA,MACE,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,YAAY,CAAC,EAAE,UAAU;AAAA,QACvB;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,qCAAOV,YAAAA,QAAA,EAAO;AAAA,UACd,YAAY;AAAA,UACZ,SAAS,MAAM,QAAQ,IAAI,UAAU,IAAI,EAAE;AAAA,QAAA;AAAA,QAE7C;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,qCAAOW,YAAAA,eAAA,EAAc;AAAA,UACrB,YAAY;AAAA,UACZ,SAAS,MAAM,QAAQ,IAAI,eAAe,IAAI,EAAE;AAAA,QAAA;AAAA,QAElD;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,qCAAOC,YAAAA,SAAA,EAAQ;AAAA,UACf,YAAY;AAAA,UACZ,SAAS,MAAM,QAAQ,IAAI,YAAY,IAAI,EAAE;AAAA,QAAA;AAAA,QAE/C;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,qCAAOX,YAAAA,QAAA,EAAO;AAAA,UACd,YAAY;AAAA,UACZ,aAAa;AAAA,UACb,SAAS,MAAM,SAAS,YAAY,GAAG;AAAA,QAAA;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAEF;AAIA,MAAM,gBAAuC;AAAA,EAC3CY,iBAAW;AAAA,IACT,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS,CAAC,EAAE,OAAO,WAAW,OAAO,OAAO;AAAA,EAAA,CAC7C;AAAA,EACDA,iBAAW;AAAA,IACT,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS,CAAC,EAAE,OAAO,YAAY,OAAO,UAAU;AAAA,EAAA,CACjD;AAAA,EACDA,iBAAW;AAAA,IACT,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS,CAAC,EAAE,OAAO,cAAc,OAAO,SAAS;AAAA,EAAA,CAClD;AAAA,EACDA,iBAAW;AAAA,IACT,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM,CAAC,EAAE,OAAO,aAAa,WAAW,QAAQ;AAAA,EAAA,CACjD;AACH;AAOA,MAAM,kBAA+B;AAAA,EACnC,OAAO;AAAA,IACL,EAAE,IAAI,uBAAuB,OAAO,YAAY,UAAU,WAAW,OAAO,SAAA;AAAA,IAC5E,EAAE,IAAI,0BAA0B,OAAO,cAAc,UAAU,WAAW,OAAO,QAAA;AAAA,EAAQ;AAAA,EAE3F,eAAe;AACjB;AAIA,MAAM,gBAAkD;AAAA,EACtD,cAAc;AAAA,EACd,SAASC,sBAAAA;AAAAA,EACT,YAAY,CAAC,EAAE,UAAU;AACvB,UAAM,MAAMvB,sBAAAA,WAAW,IAAI,UAAqC;AAChE,UAAM,QAAQK,sBAAAA,OAAO,IAAI,OAA8B;AACvD,UAAM,gBAAgB,OAAO,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,GAAG,CAAC,KAAK;AACtF,WAAO;AAAA,MACL,OAAO,IAAI;AAAA,MACX,UAAU,IAAI;AAAA,MACd,QACEb,2BAAAA,IAACe,SAAAA,QAAA,EAAO,WAAU,eAAc,OAAO,EAAE,YAAY,IAAI,YAAA,GACvD,UAAAf,2BAAAA,IAACgB,yBAAA,EAAe,WAAU,uDACvB,UAAA,IAAI,UACP,GACF;AAAA,MAEF,MAAM,MACJhB,2BAAAA;AAAAA,QAACmB,SAAAA;AAAAA,QAAA;AAAA,UACC,OAAOC,sBAAAA,cAAc,IAAI,UAAU,KAAK;AAAA,UACxC,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,OAAM;AAAA,UAEL,UAAA,IAAI;AAAA,QAAA;AAAA,MAAA,IAEL;AAAA,MACJ,OAAOC,sBAAAA,UAAU,IAAI,KAAK;AAAA,MAC1B,YAAY,QACVxB,gCAAC,QAAA,EAAK,WAAU,qDACd,UAAA;AAAA,QAAAG,+BAACe,SAAAA,QAAA,EAAO,WAAU,eAAc,OAAO,EAAE,YAAY,MAAM,MAAA,GACzD,UAAAf,2BAAAA,IAACgB,SAAAA,gBAAA,EAAe,WAAU,uDACvB,yBACH,GACF;AAAA,QACAhB,2BAAAA,IAAC,QAAA,EAAK,WAAU,0FACb,gBAAM,KAAA,CACT;AAAA,MAAA,EAAA,CACF,IACE;AAAA,MACJ,aACEH,2BAAAA,KAAC,QAAA,EAAK,WAAU,iHACd,UAAA;AAAA,QAAAG,+BAACgC,YAAAA,SAAM,MAAM,IAAI,aAAa,KAAK,eAAW,MAAC;AAAA,QAC9CV,sBAAAA,gBAAgB,IAAI,WAAW;AAAA,MAAA,EAAA,CAClC;AAAA,IAAA;AAAA,EAGN;AACF;AAaA,SAAwB,mBAAmB;AACzC,QAAM,EAAE,OAAO,SAAA,IAAaW,kBAAA;AAC5B,QAAM,CAAC,MAAM,OAAO,IAAItC,MAAAA,SAAsB,MAAM4B,sBAAAA,UAAU;AAC9D,QAAM,CAAC,QAAQ,SAAS,IAAI5B,MAAAA,SAAiB,OAAO;AACpD,QAAM,CAAC,aAAa,cAAc,IAAIA,MAAAA,SAAsB,eAAe;AAC3E,QAAM,CAAC,UAAU,WAAW,IAAIA,MAAAA,SAA4B,OAAO;AACnE,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,MAAAA,SAAS,KAAK;AAC5D,QAAM,CAAC,aAAa,cAAc,IAAIA,MAAAA,SAAwB,IAAI;AAClE,QAAM,CAAC,eAAe,gBAAgB,IAAIA,MAAAA,SAA6B,IAAI;AAC3E,QAAM,YAAY,cAAc,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,WAAW,KAAK,OAAO;AACjF,QAAM,WAAWuC,MAAAA,OAAqB,IAAI;AAE1C,QAAM,YAAYC,MAAAA;AAAAA,IAChB,CAAC,QACC,iBAAiB,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,OAAO,IAAI,MAAM;AAAA,IACrD,CAAA;AAAA,EAAC;AAGH,QAAM,gBAAgBA,MAAAA;AAAAA,IACpB,CAAC,KAAe,YACd,iBAAiB;AAAA,MACf;AAAA,MACA,OAAO,GAAG,IAAI,MAAM,WAAW,IAAI,WAAW,IAAI,KAAK,GAAG;AAAA,MAC1D;AAAA,IAAA,CACD;AAAA,IACH,CAAA;AAAA,EAAC;AAGH,QAAM,sBAAsBA,MAAAA,YAAY,MAAM;AAC5C,QAAI,CAAC,cAAe;AACpB,UAAM,MAAM,IAAI,IAAI,cAAc,GAAG;AACrC,YAAQ,CAAC,SAAS,KAAK,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;AACpD,QAAI,eAAe,IAAI,IAAI,WAAW,kBAAkB,IAAI;AAC5D,kBAAc,UAAA;AACd,qBAAiB,IAAI;AAAA,EACvB,GAAG,CAAC,eAAe,WAAW,CAAC;AAE/B,QAAM,UAAUC,MAAAA;AAAAA,IACd,MAAM,aAAa,EAAE,aAAa,WAAW;AAAA,IAC7C,CAAC,SAAS;AAAA,EAAA;AAGZ,SACEvC,2BAAAA;AAAAA,IAACwC,SAAAA;AAAAA,IAAA;AAAA,MACC,UAAUC,cAAAA;AAAAA,MACV,wBAAuB;AAAA,MACvB,uBAAsB;AAAA,MACtB,YAAY,CAAC,EAAE,OAAO,gBAAgB;AAAA,MACtC,eAAeC,cAAAA;AAAAA,MACf,eAAe;AAAA,QACb,OAAOC,cAAAA;AAAAA,QACP,eAAe,MAAM,MAAM,yBAAyB;AAAA,QACpD,eAAe,MAAM,MAAM,YAAY;AAAA,QACvC,WAAW,MAAM,MAAM,WAAW;AAAA,MAAA;AAAA,MAEpC,UAAU;AAAA,QACR,OAAOC,cAAAA;AAAAA,QACP,cAAc,MAAM,MAAM,eAAe;AAAA,QACzC,UAAU,MAAM,MAAM,UAAU;AAAA,QAChC,WAAW,MAAM,MAAM,WAAW;AAAA,MAAA;AAAA,MAEpC;AAAA,MACA,eAAe,CAAC,OAAO,SAAS,EAAW;AAAA,MAC3C,cAAcC,cAAAA;AAAAA,MACd,MAAMC,cAAAA;AAAAA,MACN;AAAA,MACA,gBAAgB;AAAA,MAChB,eAAeC,cAAAA;AAAAA,MACf,YAAY,MAAM,MAAM,qBAAqB;AAAA,MAC7C,UAAU,MAAM,MAAM,aAAa;AAAA,MAEnC,UAAA;AAAA,QAAA5C,2BAAAA;AAAAA,UAAC6C,WAAAA;AAAAA,UAAA;AAAA,YACC,OAAM;AAAA,YACN,aAAY;AAAA,YACZ,OACEhD,2BAAAA,KAACsB,SAAAA,MAAA,EAAK,OAAM,WAAU,SAAQ,QAAO,MAAK,MAAK,OAAM,WAClD,UAAA;AAAA,cAAA,KAAK,OAAO,eAAe,OAAO;AAAA,cAAE;AAAA,YAAA,GACvC;AAAA,YAEF,SACEtB,2BAAAA,KAAAE,qBAAA,EACE,UAAA;AAAA,cAAAC,2BAAAA;AAAAA,gBAACC,SAAAA;AAAAA,gBAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,OAAM;AAAA,kBACN,MAAK;AAAA,kBACL,cAAW;AAAA,kBACX,SAAS,MAAM,MAAM,YAAY;AAAA,kBAEjC,yCAAC6C,YAAAA,gBAAA,CAAA,CAAe;AAAA,gBAAA;AAAA,cAAA;AAAA,cAElB9C,2BAAAA;AAAAA,gBAACC,SAAAA;AAAAA,gBAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,OAAM;AAAA,kBACN,MAAK;AAAA,kBACL,yCAAW8C,YAAAA,MAAA,EAAK;AAAA,kBAChB,SAAS,MAAM,mBAAmB,IAAI;AAAA,kBACvC,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YAED,EAAA,CACF;AAAA,UAAA;AAAA,QAAA;AAAA,QAKJ/C,2BAAAA;AAAAA,UAACgD,MAAAA;AAAAA,UAAA;AAAA,YACC,KAAK;AAAA,YACL;AAAA,YACA;AAAA,YACA,UAAU,CAAC,MAAM,EAAE;AAAA,YACnB,WAAU;AAAA,YACV,cAAc;AAAA,YAId,sBAAsB,CAAC,SAAS;AAAA,YAChC;AAAA,YACA,qBAAqB;AAAA,YACrB;AAAA,YACA,kBAAkB;AAAA,YAClB,cAAc;AAAA,YACd,SAAS;AAAA,cACP,cAAc;AAAA,cACd,eAAe;AAAA,cACf,eAAe;AAAA,cACf,eAAe;AAAA,cACf,cAAc;AAAA,cACd,UAAU;AAAA,gBACR,OAAO;AAAA,kBACL;AAAA,oBACE,IAAI;AAAA,oBACJ,OAAO;AAAA,oBACP,qCAAOC,YAAAA,WAAA,EAAU;AAAA,oBACjB,UAAU,MAAM,MAAM,YAAY;AAAA,kBAAA;AAAA,kBAEpC;AAAA,oBACE,IAAI;AAAA,oBACJ,OAAO;AAAA,oBACP,qCAAOC,YAAAA,MAAA,EAAK;AAAA,oBACZ,UAAU,MAAM,MAAM,uBAAuB;AAAA,kBAAA;AAAA,kBAE/C;AAAA,oBACE,IAAI;AAAA,oBACJ,OAAO;AAAA,oBACP,qCAAOC,YAAAA,QAAA,EAAO;AAAA,oBACd,UAAU,MAAM,MAAM,cAAc;AAAA,kBAAA;AAAA,kBAEtC;AAAA,oBACE,IAAI;AAAA,oBACJ,OAAO;AAAA,oBACP,qCAAOC,YAAAA,WAAA,EAAU;AAAA,oBACjB,aAAa;AAAA,oBACb,UAAU,MAAM,SAAS,SAAS,oBAAA;AAAA,kBAAoB;AAAA,gBACxD;AAAA,cACF;AAAA,YACF;AAAA,YAEF,kBAAkB;AAAA,cAChB,SAAS;AAAA,cACT,iBAAiB;AAAA,cACjB,iBAAiB,CAAC,IAAI,IAAI,IAAI,GAAG;AAAA,YAAA;AAAA,YAEnC,iBAAiB;AAAA,cACf,SAAS;AAAA,cACT,cAAc;AAAA,cACd,SAAS,CAAC,aAAa,mBACrBvD,2BAAAA,KAAAE,WAAAA,UAAA,EACE,UAAA;AAAA,gBAAAC,2BAAAA;AAAAA,kBAACqD,MAAAA;AAAAA,kBAAA;AAAA,oBACC,qCAAOC,YAAAA,UAAA,EAAS;AAAA,oBAChB,SAAS,MAAM,SAAS,SAAS,UAAU,UAAU;AAAA,oBACtD,UAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAGDtD,2BAAAA;AAAAA,kBAACqD,MAAAA;AAAAA,kBAAA;AAAA,oBACC,qCAAOnC,YAAAA,QAAA,EAAO;AAAA,oBACd,SAAQ;AAAA,oBACR,SAAS,MAAM,cAAc,YAAY,IAAI,MAAM,GAAG,cAAc;AAAA,oBACrE,UAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAED,EAAA,CACF;AAAA,YAAA;AAAA,YAGJ,kBAAkB,OAAO,EAAE,IAAI,OAAO,YAAY;AAChD,oBAAM,IAAI,QAAQ,CAAC,QAAQ,WAAW,KAAK,GAAG,CAAC;AAC/C;AAAA,gBAAQ,CAAC,SACP,KAAK,IAAI,CAAC,MAAO,EAAE,OAAO,KAAK,EAAE,GAAG,GAAG,CAAC,KAAK,GAAG,MAAA,IAAU,CAAE;AAAA,cAAA;AAAA,YAEhE;AAAA,YACA,YAAY,CAAC,QAAQ,eAAe,IAAI,EAAE;AAAA,YAC1C,WAAU;AAAA,UAAA;AAAA,QAAA;AAAA,QAIZlB,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAM;AAAA,YACN,cAAc;AAAA,YACd,UAAU,CAAC,SAAS;AAClB,sBAAQ,IAAI,iBAAiB,IAAI;AACjC,oBAAM,YAAY,KAAK,IAAI,iBAAiB;AAAA,YAC9C;AAAA,UAAA;AAAA,QAAA;AAAA,QAKFA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAK;AAAA,YACL,SAAS,MAAM,eAAe,IAAI;AAAA,YAClC,QAAQ,CAAC,MAAM,QAAQ,IAAI,UAAU,EAAE,EAAE;AAAA,YACzC,UAAU,CAAC,MAAM,UAAU,CAAC;AAAA,YAC5B,QAAQ,CAAC,MAAM,MAAM,wBAAwB,EAAE,IAAI,SAAS;AAAA,UAAA;AAAA,QAAA;AAAA,QAK9DA,2BAAAA;AAAAA,UAACuD,MAAAA;AAAAA,UAAA;AAAA,YACC,MAAM,kBAAkB;AAAA,YACxB,cAAc,CAAC,SAAS;AACtB,kBAAI,CAAC,KAAM,kBAAiB,IAAI;AAAA,YAClC;AAAA,YACA,MAAK;AAAA,YACL,OACE,iBAAiB,cAAc,IAAI,SAAS,IACxC,WAAW,cAAc,KAAK,MAC9B;AAAA,YAEN,aACE,gBACI,cAAc,IAAI,SAAS,IACzB,oCAAoC,cAAc,KAAK,sCACvD,qCAAqC,cAAc,KAAK,qCAC1D;AAAA,YAEN,cAAa;AAAA,YACb,aAAY;AAAA,YACZ,WAAW;AAAA,UAAA;AAAA,QAAA;AAAA,MACb;AAAA,IAAA;AAAA,EAAA;AAGN;;;"}
|
|
1
|
+
{"version":3,"file":"clientes.cjs","sources":["../../src/preview/pages/ClientesShowcase/clientes-showcase.styles.ts","../../src/preview/pages/ClientesShowcase/components/NovoClienteDrawer/novo-cliente-drawer.tsx","../../src/preview/pages/ClientesShowcase/components/DetailDrawer/detail-drawer.styles.ts","../../src/preview/pages/ClientesShowcase/components/DetailDrawer/detail-drawer.tsx","../../src/preview/pages/ClientesShowcase/ClientesShowcase.tsx"],"sourcesContent":["import { tv } from \"@/utils/tv\";\r\n\r\n/**\r\n * Layout em grid de 2 colunas usado dentro do drawer pra pares de campos\r\n * (Email + WhatsApp, Cidade + Valor).\r\n * `gap-form-gap` (20px) = token DS pra spacing entre FormField units (L-024).\r\n */\r\nexport const drawerFormStyles = tv({\r\n slots: {\r\n twoCols: \"grid grid-cols-2 gap-form-gap\",\r\n statusDot: \"inline-block size-[8px] rounded-radius-full mr-gp-xs shrink-0\",\r\n },\r\n});\r\n","import { useEffect, useState } from \"react\";\r\nimport { Panel } from \"@/components/ui/Panel\";\r\nimport { Button } from \"@/components/ui/Button/button\";\r\nimport {\r\n FormField,\r\n FormFieldInput,\r\n FormFieldSelect,\r\n FormFieldTextarea,\r\n} from \"@/components/ui/FormField\";\r\nimport { ChipGroup, ChipGroupItem } from \"@/components/ui/Chip\";\r\nimport { STATUSES, CATEGORIES } from \"../../../_table-data\";\r\nimport { CITIES, STATUS_DOT } from \"../../clientes-showcase-mocks\";\r\nimport { drawerFormStyles } from \"../../clientes-showcase.styles\";\r\nimport type { NovoClienteFormData } from \"../../clientes-showcase.types\";\r\n\r\nconst INITIAL_FORM: NovoClienteFormData = {\r\n name: \"\",\r\n email: \"\",\r\n whatsapp: \"\",\r\n statusId: \"active\",\r\n categoryId: \"lead\",\r\n city: \"\",\r\n value: 0,\r\n notes: \"\",\r\n};\r\n\r\nexport type NovoClienteDrawerProps = {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n /** Disparado ao confirmar — drawer fecha automaticamente após o submit. */\r\n onSubmit?: (data: NovoClienteFormData) => void;\r\n};\r\n\r\n/**\r\n * Drawer \"Novo cliente\" — replica visual do TblClientFormDrawer\r\n * (sandbox /design-and-table-v2), recompilado em cima dos componentes do DS:\r\n * Panel + FormField (Input / Select / Textarea) + ChipGroup + Button.\r\n *\r\n * Layout (top → bottom):\r\n * 1. Nome* — full width\r\n * 2. Email + WhatsApp — 2 cols\r\n * 3. Status — ChipGroup com dot colorido\r\n * 4. Categoria — ChipGroup\r\n * 5. Cidade + Valor R$ — 2 cols\r\n * 6. Notas — textarea full width\r\n */\r\nexport function NovoClienteDrawer({\r\n open,\r\n onOpenChange,\r\n onSubmit,\r\n}: NovoClienteDrawerProps) {\r\n const s = drawerFormStyles();\r\n const [form, setForm] = useState<NovoClienteFormData>(INITIAL_FORM);\r\n\r\n // Reseta form sempre que abrir\r\n useEffect(() => {\r\n if (open) setForm(INITIAL_FORM);\r\n }, [open]);\r\n\r\n const canSubmit = form.name.trim().length > 0;\r\n\r\n const handleSubmit = () => {\r\n if (!canSubmit) return;\r\n onSubmit?.(form);\r\n onOpenChange(false);\r\n };\r\n\r\n return (\r\n <Panel\r\n open={open}\r\n onOpenChange={onOpenChange}\r\n title=\"Novo cliente\"\r\n side=\"right\"\r\n size=\"md\"\r\n footer={\r\n <>\r\n <Button\r\n variant=\"outline\"\r\n color=\"secondary\"\r\n size=\"md\"\r\n onClick={() => onOpenChange(false)}\r\n >\r\n Cancelar\r\n </Button>\r\n <Button\r\n variant=\"filled\"\r\n color=\"primary\"\r\n size=\"md\"\r\n disabled={!canSubmit}\r\n onClick={handleSubmit}\r\n >\r\n Criar cliente\r\n </Button>\r\n </>\r\n }\r\n >\r\n <FormFieldInput\r\n label=\"Nome\"\r\n required\r\n placeholder=\"Maria Silva\"\r\n value={form.name}\r\n onChange={(e) => setForm((f) => ({ ...f, name: e.target.value }))}\r\n />\r\n\r\n <div className={s.twoCols()}>\r\n <FormFieldInput\r\n label=\"Email\"\r\n type=\"email\"\r\n placeholder=\"cliente@exemplo.com\"\r\n value={form.email}\r\n onChange={(e) => setForm((f) => ({ ...f, email: e.target.value }))}\r\n />\r\n <FormFieldInput\r\n label=\"WhatsApp\"\r\n type=\"tel\"\r\n placeholder=\"55 11 99999-9999\"\r\n value={form.whatsapp}\r\n onChange={(e) => setForm((f) => ({ ...f, whatsapp: e.target.value }))}\r\n />\r\n </div>\r\n\r\n <FormField label=\"Status\">\r\n {() => (\r\n <ChipGroup\r\n type=\"single\"\r\n value={form.statusId}\r\n onValueChange={(v) =>\r\n v &&\r\n setForm((f) => ({\r\n ...f,\r\n statusId: v as keyof typeof STATUSES,\r\n }))\r\n }\r\n size=\"md\"\r\n shape=\"pill\"\r\n ariaLabel=\"Status do cliente\"\r\n >\r\n {Object.entries(STATUSES).map(([id, st]) => (\r\n <ChipGroupItem key={id} value={id}>\r\n <span\r\n className={s.statusDot()}\r\n style={{ background: STATUS_DOT[id] ?? st.color }}\r\n aria-hidden\r\n />\r\n {st.label}\r\n </ChipGroupItem>\r\n ))}\r\n </ChipGroup>\r\n )}\r\n </FormField>\r\n\r\n <FormField label=\"Categoria\">\r\n {() => (\r\n <ChipGroup\r\n type=\"single\"\r\n value={form.categoryId}\r\n onValueChange={(v) =>\r\n v &&\r\n setForm((f) => ({\r\n ...f,\r\n categoryId: v as keyof typeof CATEGORIES,\r\n }))\r\n }\r\n size=\"md\"\r\n shape=\"pill\"\r\n ariaLabel=\"Categoria do cliente\"\r\n >\r\n {Object.entries(CATEGORIES).map(([id, cat]) => (\r\n <ChipGroupItem key={id} value={id}>\r\n {cat.label}\r\n </ChipGroupItem>\r\n ))}\r\n </ChipGroup>\r\n )}\r\n </FormField>\r\n\r\n <div className={s.twoCols()}>\r\n <FormFieldSelect\r\n label=\"Cidade\"\r\n placeholder=\"Selecionar...\"\r\n value={form.city || undefined}\r\n onValueChange={(v) => setForm((f) => ({ ...f, city: v }))}\r\n options={CITIES.map((c) => ({ value: c, label: c }))}\r\n />\r\n <FormFieldInput\r\n label=\"Valor (R$)\"\r\n type=\"number\"\r\n startAddon=\"R$\"\r\n value={String(form.value)}\r\n onChange={(e) =>\r\n setForm((f) => ({ ...f, value: Number(e.target.value) }))\r\n }\r\n min={0}\r\n step={0.01}\r\n />\r\n </div>\r\n\r\n <FormFieldTextarea\r\n label=\"Notas\"\r\n placeholder=\"Observações sobre o cliente...\"\r\n rows={4}\r\n value={form.notes}\r\n onChange={(e) => setForm((f) => ({ ...f, notes: e.target.value }))}\r\n />\r\n </Panel>\r\n );\r\n}\r\n","import { tv } from \"@/utils/tv\";\r\n\r\n/**\r\n * Styles do DetailDrawer — apenas as partes internas (sections collapsibles\r\n * + DetailField). O shell flutuante (aside, header com avatar+meta, footer\r\n * com botões) é delegado ao `<FloatingPanel>` do DS.\r\n */\r\nexport const detailDrawerStyles = tv({\r\n slots: {\r\n section: \"border-b border-border-default last:border-b-0\",\r\n sectionHead: [\r\n \"flex items-center justify-between w-full\",\r\n \"px-[18px] py-[14px]\",\r\n \"bg-transparent border-0 cursor-pointer text-left\",\r\n \"text-body-sm font-semibold text-fg-default\",\r\n \"transition-colors duration-150\",\r\n \"hover:bg-bg-muted\",\r\n \"focus-visible:outline-none focus-visible:bg-bg-muted\",\r\n ],\r\n sectionChev: \"size-[14px] text-fg-muted transition-transform duration-200\",\r\n sectionChevOpen: \"rotate-180\",\r\n sectionBody: \"flex flex-col gap-gp-md px-[18px] pb-pad-2xl\",\r\n\r\n field: \"flex items-baseline justify-between gap-gp-md text-body-sm font-normal\",\r\n fieldLabel: \"text-body-xs font-normal text-fg-muted shrink-0\",\r\n fieldValue: \"text-fg-default text-right break-words min-w-0\",\r\n },\r\n});\r\n","import { useState, type ReactNode } from \"react\";\r\nimport { ChevronDown, Pencil, Trash2 } from \"lucide-react\";\r\nimport { Avatar, AvatarFallback } from \"@/components/shadcn/avatar\";\r\nimport { Button } from \"@/components/ui/Button/button\";\r\nimport { Chip } from \"@/components/ui/Chip\";\r\nimport { FloatingPanel } from \"@/components/ui/FloatingPanel\";\r\nimport { STATUSES, CATEGORIES, AGENTS } from \"../../../_table-data\";\r\nimport {\r\n CATEGORY_KIND,\r\n STATUS_DOT,\r\n formatBRL,\r\n formatShortDate,\r\n} from \"../../clientes-showcase-mocks\";\r\nimport { detailDrawerStyles } from \"./detail-drawer.styles\";\r\nimport type { DetailDrawerProps } from \"./detail-drawer.types\";\r\n\r\n/* ── Helpers internos ────────────────────────────────────────────── */\r\n\r\nfunction formatLongDate(ms: number): string {\r\n if (!ms) return \"—\";\r\n const d = new Date(ms);\r\n return d.toLocaleDateString(\"pt-BR\", {\r\n day: \"numeric\",\r\n month: \"long\",\r\n year: \"numeric\",\r\n });\r\n}\r\n\r\ntype SectionId = \"contact\" | \"meta\" | \"notes\";\r\n\r\n/* ── DetailField (label : value) ────────────────────────────────── */\r\n\r\ntype DetailFieldProps = {\r\n label: string;\r\n value: ReactNode;\r\n s: ReturnType<typeof detailDrawerStyles>;\r\n};\r\n\r\nfunction DetailField({ label, value, s }: DetailFieldProps) {\r\n return (\r\n <div className={s.field()}>\r\n <span className={s.fieldLabel()}>{label}</span>\r\n <span className={s.fieldValue()}>{value || \"—\"}</span>\r\n </div>\r\n );\r\n}\r\n\r\n/* ── DetailSection (collapsible) ─────────────────────────────────── */\r\n\r\ntype DetailSectionProps = {\r\n id: SectionId;\r\n title: string;\r\n open: boolean;\r\n onToggle: (id: SectionId) => void;\r\n children: ReactNode;\r\n s: ReturnType<typeof detailDrawerStyles>;\r\n};\r\n\r\nfunction DetailSection({\r\n id,\r\n title,\r\n open,\r\n onToggle,\r\n children,\r\n s,\r\n}: DetailSectionProps) {\r\n return (\r\n <section className={s.section()}>\r\n <button\r\n type=\"button\"\r\n className={s.sectionHead()}\r\n onClick={() => onToggle(id)}\r\n aria-expanded={open}\r\n >\r\n <span>{title}</span>\r\n <ChevronDown\r\n className={[s.sectionChev(), open ? s.sectionChevOpen() : \"\"].join(\" \")}\r\n />\r\n </button>\r\n {open && <div className={s.sectionBody()}>{children}</div>}\r\n </section>\r\n );\r\n}\r\n\r\n/* ── DetailDrawer ────────────────────────────────────────────────── */\r\n\r\n/**\r\n * Drawer \"Detalhes do cliente\" — usa `<FloatingPanel>` do DS (non-modal,\r\n * resizable, maximizable, responsive). Replica visual do `TblDetailsPanel`\r\n * do sandbox /design-and-table-v2.\r\n */\r\nexport function DetailDrawer({\r\n row,\r\n onClose,\r\n onEdit,\r\n onDelete,\r\n onSave,\r\n}: DetailDrawerProps) {\r\n const s = detailDrawerStyles();\r\n const [openSections, setOpenSections] = useState<Set<SectionId>>(\r\n () => new Set([\"contact\", \"meta\", \"notes\"]),\r\n );\r\n\r\n const toggle = (id: SectionId) => {\r\n setOpenSections((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(id)) next.delete(id);\r\n else next.add(id);\r\n return next;\r\n });\r\n };\r\n\r\n // Mantém ordem dos hooks estável independente de `row` — depois do toggle.\r\n if (!row) return null;\r\n\r\n const status = STATUSES[row.statusId];\r\n const cat = CATEGORIES[row.categoryId as keyof typeof CATEGORIES];\r\n const agent = AGENTS[row.agentId as keyof typeof AGENTS];\r\n const agentInitials =\r\n agent?.name.split(\" \").map((p) => p[0]).join(\"\").slice(0, 2) ?? \"?\";\r\n\r\n return (\r\n <FloatingPanel\r\n open={row !== null}\r\n onOpenChange={(open) => {\r\n if (!open) onClose();\r\n }}\r\n side=\"right\"\r\n size=\"md\"\r\n resizable\r\n maximizable\r\n // Sections internas (DetailSection) gerenciam o próprio padding edge-to-edge.\r\n bodyPadded={false}\r\n resizableStorageKey=\"clientes-showcase.detail-drawer.width\"\r\n titleSlot={\r\n <div className=\"flex items-center gap-gp-md min-w-0\">\r\n <Avatar\r\n className=\"size-[40px] shrink-0\"\r\n style={{ background: row.avatarColor }}\r\n >\r\n <AvatarFallback className=\"bg-transparent text-white text-body-md font-bold\">\r\n {row.initials}\r\n </AvatarFallback>\r\n </Avatar>\r\n <div className=\"flex flex-col min-w-0 flex-1\">\r\n <div className=\"text-body-md font-semibold text-fg-default whitespace-nowrap overflow-hidden text-ellipsis\">\r\n {row.name}\r\n </div>\r\n <div className=\"flex items-center gap-[6px] mt-[2px] text-body-xs font-normal text-fg-muted\">\r\n <span>{row.id}</span>\r\n <span className=\"opacity-50\">·</span>\r\n <span className=\"inline-flex items-center gap-[6px]\">\r\n <span\r\n className=\"inline-block size-[8px] rounded-radius-full shrink-0\"\r\n style={{ background: STATUS_DOT[row.statusId] ?? status?.color }}\r\n aria-hidden\r\n />\r\n {status?.label}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n headerActions={\r\n <>\r\n <Button\r\n variant=\"soft\"\r\n color=\"secondary\"\r\n size=\"icon-sm\"\r\n aria-label=\"Editar\"\r\n onClick={() => onEdit?.(row)}\r\n >\r\n <Pencil />\r\n </Button>\r\n <Button\r\n variant=\"soft\"\r\n color=\"critical\"\r\n size=\"icon-sm\"\r\n aria-label=\"Excluir\"\r\n onClick={() => onDelete?.(row)}\r\n >\r\n <Trash2 />\r\n </Button>\r\n </>\r\n }\r\n footer={\r\n <>\r\n <Button variant=\"outline\" color=\"secondary\" size=\"sm\" onClick={onClose}>\r\n Cancelar\r\n </Button>\r\n <Button\r\n variant=\"filled\"\r\n color=\"primary\"\r\n size=\"sm\"\r\n onClick={() => onSave?.(row)}\r\n >\r\n Salvar alterações\r\n </Button>\r\n </>\r\n }\r\n >\r\n <DetailSection\r\n id=\"contact\"\r\n title=\"Contato\"\r\n open={openSections.has(\"contact\")}\r\n onToggle={toggle}\r\n s={s}\r\n >\r\n <DetailField\r\n label=\"Email\"\r\n value={\r\n <a\r\n href={`mailto:${row.email}`}\r\n className=\"text-fg-brand hover:underline\"\r\n >\r\n {row.email}\r\n </a>\r\n }\r\n s={s}\r\n />\r\n <DetailField\r\n label=\"Telefone\"\r\n value={\r\n <a\r\n href={`tel:${row.phone.replace(/\\D/g, \"\")}`}\r\n className=\"text-fg-brand hover:underline\"\r\n >\r\n {row.phone}\r\n </a>\r\n }\r\n s={s}\r\n />\r\n <DetailField label=\"Localização\" value={row.location} s={s} />\r\n </DetailSection>\r\n\r\n <DetailSection\r\n id=\"meta\"\r\n title=\"Atendimento\"\r\n open={openSections.has(\"meta\")}\r\n onToggle={toggle}\r\n s={s}\r\n >\r\n <DetailField label=\"ID\" value={row.id} s={s} />\r\n <DetailField\r\n label=\"Categoria\"\r\n value={\r\n cat ? (\r\n <Chip\r\n color={CATEGORY_KIND[row.categoryId] ?? \"info\"}\r\n variant=\"soft\"\r\n size=\"sm\"\r\n shape=\"pill\"\r\n >\r\n {cat.label}\r\n </Chip>\r\n ) : (\r\n \"—\"\r\n )\r\n }\r\n s={s}\r\n />\r\n <DetailField\r\n label=\"Atribuído a\"\r\n value={\r\n agent ? (\r\n <span className=\"inline-flex items-center gap-gp-sm\">\r\n <Avatar\r\n className=\"size-[22px]\"\r\n style={{ background: agent.color }}\r\n >\r\n <AvatarFallback className=\"bg-transparent text-white text-caption-xs font-bold\">\r\n {agentInitials}\r\n </AvatarFallback>\r\n </Avatar>\r\n {agent.name}\r\n </span>\r\n ) : (\r\n \"—\"\r\n )\r\n }\r\n s={s}\r\n />\r\n <DetailField label=\"Valor\" value={formatBRL(row.value)} s={s} />\r\n <DetailField label=\"Criado em\" value={formatLongDate(row.createdAt)} s={s} />\r\n <DetailField\r\n label=\"Último contato\"\r\n value={formatShortDate(row.lastContact)}\r\n s={s}\r\n />\r\n </DetailSection>\r\n\r\n <DetailSection\r\n id=\"notes\"\r\n title=\"Anotações\"\r\n open={openSections.has(\"notes\")}\r\n onToggle={toggle}\r\n s={s}\r\n >\r\n <p className=\"text-body-xs font-normal text-fg-muted\">Sem anotações.</p>\r\n </DetailSection>\r\n </FloatingPanel>\r\n );\r\n}\r\n","import { useCallback, useMemo, useRef, useState } from \"react\";\r\nimport { useTheme, type Theme } from \"@/hooks/useTheme\";\r\nimport {\r\n Archive,\r\n Clock,\r\n Copy,\r\n Download,\r\n Maximize2,\r\n MessageSquare,\r\n MoreHorizontal,\r\n Pencil,\r\n Plus,\r\n RotateCcw,\r\n Trash2,\r\n Upload,\r\n} from \"lucide-react\";\r\nimport {\r\n CATEGORIES,\r\n AGENTS,\r\n type ClientRow,\r\n} from \"../_table-data\";\r\nimport {\r\n DataTable,\r\n presetView,\r\n type DataTableColumnDef,\r\n type DataTableKanbanConfig,\r\n type DataTablePresetView,\r\n type DataTableRef,\r\n type DataTableViewMode,\r\n type FilterModel,\r\n} from \"@/components/ui/DataTable\";\r\nimport { AppShell } from \"@/components/ui/AppShell\";\r\nimport { Button } from \"@/components/ui/Button/button\";\r\nimport { Chip } from \"@/components/ui/Chip\";\r\nimport { PageHeader } from \"@/components/ui/PageHeader\";\r\nimport { BulkActionButton } from \"@/components/ui/TableToolbar\";\r\nimport { Avatar, AvatarFallback } from \"@/components/shadcn/avatar\";\r\nimport {\r\n APP_SHELL_CONTEXTS,\r\n APP_SHELL_COMMANDS,\r\n APP_SHELL_NOTIFICATIONS,\r\n APP_SHELL_MESSAGES,\r\n APP_SHELL_THEME_OPTIONS,\r\n APP_SHELL_LAYOUT_OPTIONS,\r\n APP_SHELL_USER,\r\n} from \"../../mocks/app-shell-mocks\";\r\nimport {\r\n CLIENTS_87,\r\n STATUS_OPTIONS,\r\n CATEGORY_OPTIONS,\r\n AGENT_OPTIONS,\r\n AGENTS_LOOKUP,\r\n KANBAN_COLUMNS,\r\n CATEGORY_KIND,\r\n formatBRL,\r\n formatShortDate,\r\n} from \"./clientes-showcase-mocks\";\r\nimport { NovoClienteDrawer } from \"./components/NovoClienteDrawer\";\r\nimport { DetailDrawer } from \"./components/DetailDrawer\";\r\nimport { AlertModal } from \"@/components/ui/AlertModal\";\r\n\r\n/* ── Columns declarativas (type-based) ─────────────────────────── */\r\n\r\ntype ColumnHandlers = {\r\n /** Pede confirmação de exclusão (abre o AlertModal). */\r\n onAskDelete: (row: ClientRow) => void;\r\n};\r\n\r\nfunction buildColumns(handlers: ColumnHandlers): DataTableColumnDef<ClientRow>[] {\r\n return [\r\n { field: \"id\", headerName: \"ID\", type: \"text\", width: 130 },\r\n {\r\n field: \"name\",\r\n headerName: \"Nome\",\r\n type: \"user\",\r\n sortable: true,\r\n width: 220,\r\n typeOptions: {\r\n users: Object.fromEntries(\r\n CLIENTS_87.map((c) => [\r\n c.name,\r\n {\r\n name: c.name,\r\n initials: c.initials,\r\n color: c.avatarColor,\r\n },\r\n ]),\r\n ),\r\n },\r\n valueGetter: (row) => row.name,\r\n },\r\n {\r\n field: \"email\",\r\n headerName: \"Email\",\r\n type: \"email\",\r\n enableColumnFilter: true,\r\n filterType: \"text\",\r\n },\r\n {\r\n field: \"phone\",\r\n headerName: \"Telefone\",\r\n type: \"phone\",\r\n },\r\n {\r\n field: \"statusId\",\r\n headerName: \"Status\",\r\n type: \"status\",\r\n enableColumnFilter: true,\r\n filterType: \"multiSelect\",\r\n filterOptions: STATUS_OPTIONS,\r\n },\r\n {\r\n field: \"categoryId\",\r\n headerName: \"Categoria\",\r\n type: \"badge\",\r\n enableColumnFilter: true,\r\n filterType: \"multiSelect\",\r\n filterOptions: CATEGORY_OPTIONS,\r\n },\r\n {\r\n field: \"agentId\",\r\n headerName: \"Atribuído\",\r\n type: \"user\",\r\n enableColumnFilter: true,\r\n filterType: \"select\",\r\n filterOptions: AGENT_OPTIONS,\r\n typeOptions: { users: AGENTS_LOOKUP },\r\n },\r\n {\r\n field: \"value\",\r\n headerName: \"Valor\",\r\n type: \"currency\",\r\n sortable: true,\r\n enableColumnFilter: true,\r\n filterType: \"number\",\r\n aggregate: \"sum\",\r\n aggregateFormatter: (v) =>\r\n new Intl.NumberFormat(\"pt-BR\", { style: \"currency\", currency: \"BRL\" }).format(v),\r\n },\r\n {\r\n field: \"createdAt\",\r\n headerName: \"Criado em\",\r\n type: \"date\",\r\n sortable: true,\r\n enableColumnFilter: true,\r\n filterType: \"date\",\r\n width: 130,\r\n },\r\n {\r\n field: \"lastContact\",\r\n headerName: \"Último contato\",\r\n type: \"date\",\r\n sortable: true,\r\n width: 150,\r\n },\r\n {\r\n field: \"location\",\r\n headerName: \"Localização\",\r\n type: \"text\",\r\n minWidth: 150,\r\n },\r\n {\r\n field: \"_actions\",\r\n headerName: \"\",\r\n type: \"actions\",\r\n width: 64,\r\n pinned: \"right\",\r\n getActions: ({ row }) => [\r\n {\r\n id: \"edit\",\r\n label: \"Editar\",\r\n icon: <Pencil />,\r\n showInMenu: true,\r\n onClick: () => console.log(\"Editar\", row.id),\r\n },\r\n {\r\n id: \"whatsapp\",\r\n label: \"Abrir atendimento (WhatsApp)\",\r\n icon: <MessageSquare />,\r\n showInMenu: true,\r\n onClick: () => console.log(\"Atendimento\", row.id),\r\n },\r\n {\r\n id: \"archive\",\r\n label: \"Arquivar\",\r\n icon: <Archive />,\r\n showInMenu: true,\r\n onClick: () => console.log(\"Arquivar\", row.id),\r\n },\r\n {\r\n id: \"delete\",\r\n label: \"Excluir cliente\",\r\n icon: <Trash2 />,\r\n showInMenu: true,\r\n destructive: true,\r\n onClick: () => handlers.onAskDelete(row),\r\n },\r\n ],\r\n },\r\n ];\r\n}\r\n\r\n/* ── Saved views / Presets — tabs do toolbar ───────────────────── */\r\n\r\nconst DEFAULT_VIEWS: DataTablePresetView[] = [\r\n presetView({\r\n id: \"preset:meus\",\r\n name: \"Meus\",\r\n filters: [{ field: \"agentId\", value: \"you\" }],\r\n }),\r\n presetView({\r\n id: \"preset:ativos\",\r\n name: \"Ativos\",\r\n filters: [{ field: \"statusId\", value: \"active\" }],\r\n }),\r\n presetView({\r\n id: \"preset:royals\",\r\n name: \"Royals\",\r\n filters: [{ field: \"categoryId\", value: \"royal\" }],\r\n }),\r\n presetView({\r\n id: \"preset:ultimos-7-dias\",\r\n name: \"Últimos 7 dias\",\r\n sort: [{ field: \"createdAt\", direction: \"desc\" }],\r\n }),\r\n];\r\n\r\n/* ── Filtros iniciais (Status=Ativo + Categoria=Royal — print) ─── */\r\n\r\n// statusId e categoryId são filterType=\"multiSelect\" — operator correto é \"isAnyOf\"\r\n// (not \"equals\"). Sem isso, o popover Filtros mostrava o Select de operador VAZIO\r\n// porque \"equals\" não está nos operators de MultiSelectColumnType.\r\nconst INITIAL_FILTERS: FilterModel = {\r\n items: [\r\n { id: \"filter-status-ativo\", field: \"statusId\", operator: \"isAnyOf\", value: \"active\" },\r\n { id: \"filter-categoria-royal\", field: \"categoryId\", operator: \"isAnyOf\", value: \"royal\" },\r\n ],\r\n logicOperator: \"AND\",\r\n};\r\n\r\n/* ── Kanban config (renderCard com JSX) ────────────────────────── */\r\n\r\nconst KANBAN_CONFIG: DataTableKanbanConfig<ClientRow> = {\r\n groupByField: \"statusId\",\r\n columns: KANBAN_COLUMNS,\r\n renderCard: ({ row }) => {\r\n const cat = CATEGORIES[row.categoryId as keyof typeof CATEGORIES];\r\n const agent = AGENTS[row.agentId as keyof typeof AGENTS];\r\n const agentInitials = agent?.name.split(\" \").map((s) => s[0]).join(\"\").slice(0, 2) ?? \"?\";\r\n return {\r\n title: row.name,\r\n subtitle: row.id,\r\n avatar: (\r\n <Avatar className=\"size-[28px]\" style={{ background: row.avatarColor }}>\r\n <AvatarFallback className=\"bg-transparent text-white text-caption-sm font-bold\">\r\n {row.initials}\r\n </AvatarFallback>\r\n </Avatar>\r\n ),\r\n chip: cat ? (\r\n <Chip\r\n color={CATEGORY_KIND[row.categoryId] ?? \"info\"}\r\n variant=\"soft\"\r\n size=\"sm\"\r\n shape=\"pill\"\r\n >\r\n {cat.label}\r\n </Chip>\r\n ) : null,\r\n value: formatBRL(row.value),\r\n footerLeft: agent ? (\r\n <span className=\"inline-flex items-center gap-gp-sm min-w-0 flex-1\">\r\n <Avatar className=\"size-[22px]\" style={{ background: agent.color }}>\r\n <AvatarFallback className=\"bg-transparent text-white text-caption-xs font-bold\">\r\n {agentInitials}\r\n </AvatarFallback>\r\n </Avatar>\r\n <span className=\"text-body-xs font-normal text-fg-muted whitespace-nowrap overflow-hidden text-ellipsis\">\r\n {agent.name}\r\n </span>\r\n </span>\r\n ) : null,\r\n footerRight: (\r\n <span className=\"inline-flex items-center gap-[4px] text-caption-sm text-fg-muted [font-variant-numeric:tabular-nums] shrink-0\">\r\n <Clock size={11} strokeWidth={1.8} aria-hidden />\r\n {formatShortDate(row.lastContact)}\r\n </span>\r\n ),\r\n };\r\n },\r\n};\r\n\r\n/* ═══════════════════════════════════════════════════════════════════════════\r\n Page — Clientes (showcase usando AppShell + DataTable real)\r\n ═══════════════════════════════════════════════════════════════════════════ */\r\n\r\ntype ConfirmDeleteState = {\r\n ids: string[];\r\n label: string;\r\n /** Callback opcional após confirmar — usado pelo bulk pra limpar seleção. */\r\n onAfter?: () => void;\r\n} | null;\r\n\r\nexport default function ClientesShowcase() {\r\n const { theme, setTheme } = useTheme();\r\n const [rows, setRows] = useState<ClientRow[]>(() => CLIENTS_87);\r\n const [layout, setLayout] = useState<string>(\"fluid\");\r\n const [filterModel, setFilterModel] = useState<FilterModel>(INITIAL_FILTERS);\r\n const [viewMode, setViewMode] = useState<DataTableViewMode>(\"table\");\r\n const [novoClienteOpen, setNovoClienteOpen] = useState(false);\r\n const [detailRowId, setDetailRowId] = useState<string | null>(null);\r\n const [confirmDelete, setConfirmDelete] = useState<ConfirmDeleteState>(null);\r\n const detailRow = detailRowId ? rows.find((r) => r.id === detailRowId) ?? null : null;\r\n const tableRef = useRef<DataTableRef>(null);\r\n\r\n const askDelete = useCallback(\r\n (row: ClientRow) =>\r\n setConfirmDelete({ ids: [row.id], label: row.name }),\r\n [],\r\n );\r\n\r\n const askBulkDelete = useCallback(\r\n (ids: string[], onAfter: () => void) =>\r\n setConfirmDelete({\r\n ids,\r\n label: `${ids.length} cliente${ids.length === 1 ? \"\" : \"s\"}`,\r\n onAfter,\r\n }),\r\n [],\r\n );\r\n\r\n const handleConfirmDelete = useCallback(() => {\r\n if (!confirmDelete) return;\r\n const ids = new Set(confirmDelete.ids);\r\n setRows((prev) => prev.filter((r) => !ids.has(r.id)));\r\n if (detailRowId && ids.has(detailRowId)) setDetailRowId(null);\r\n confirmDelete.onAfter?.();\r\n setConfirmDelete(null);\r\n }, [confirmDelete, detailRowId]);\r\n\r\n const columns = useMemo(\r\n () => buildColumns({ onAskDelete: askDelete }),\r\n [askDelete],\r\n );\r\n\r\n return (\r\n <AppShell\r\n contexts={APP_SHELL_CONTEXTS}\r\n defaultActiveContextId=\"inbox\"\r\n defaultActiveItemHref=\"#atendimentos\"\r\n breadcrumb={[{ label: \"Atendimentos\" }]}\r\n commandGroups={APP_SHELL_COMMANDS}\r\n notifications={{\r\n items: APP_SHELL_NOTIFICATIONS,\r\n onMarkAllRead: () => alert(\"Marcar todas como lidas\"),\r\n onMoreActions: () => alert(\"Mais ações\"),\r\n onViewAll: () => alert(\"Ver todas\"),\r\n }}\r\n messages={{\r\n items: APP_SHELL_MESSAGES,\r\n onNewMessage: () => alert(\"Nova mensagem\"),\r\n onExpand: () => alert(\"Expandir\"),\r\n onViewAll: () => alert(\"Ver todas\"),\r\n }}\r\n theme={theme}\r\n onThemeChange={(id) => setTheme(id as Theme)}\r\n themeOptions={APP_SHELL_THEME_OPTIONS}\r\n user={APP_SHELL_USER}\r\n layout={layout}\r\n onLayoutChange={setLayout}\r\n layoutOptions={APP_SHELL_LAYOUT_OPTIONS}\r\n onSettings={() => alert(\"Abrir Configurações\")}\r\n onLogout={() => alert(\"Sair (mock)\")}\r\n >\r\n <PageHeader\r\n title=\"Clientes\"\r\n description=\"Gerencie sua base de clientes, acompanhe status de cadastro e abra atendimentos diretos pelo WhatsApp.\"\r\n badge={\r\n <Chip color=\"primary\" variant=\"soft\" size=\"sm\" shape=\"rounded\">\r\n {rows.length.toLocaleString(\"pt-BR\")} registros\r\n </Chip>\r\n }\r\n actions={\r\n <>\r\n <Button\r\n variant=\"outline\"\r\n color=\"secondary\"\r\n size=\"icon-md\"\r\n aria-label=\"Mais ações\"\r\n onClick={() => alert(\"Mais ações\")}\r\n >\r\n <MoreHorizontal />\r\n </Button>\r\n <Button\r\n variant=\"filled\"\r\n color=\"primary\"\r\n size=\"md\"\r\n iconLeft={<Plus />}\r\n onClick={() => setNovoClienteOpen(true)}\r\n >\r\n Novo cliente\r\n </Button>\r\n </>\r\n }\r\n />\r\n\r\n {/* DataTable — ocupa o resto do body ──────────────────────── */}\r\n <DataTable<ClientRow>\r\n ref={tableRef}\r\n rows={rows}\r\n columns={columns}\r\n getRowId={(r) => r.id}\r\n persistId=\"showcase-clientes-crud\"\r\n defaultViews={DEFAULT_VIEWS}\r\n /* Chips de filtro VAZIOS já visíveis no load (\"Atribuído\") — a afordância\r\n aparece sem abrir o menu; o usuário clica e preenche. Filtro é recurso\r\n da tabela (nativo), nunca form/select acima dela. */\r\n showEmptyFilterChips={[\"agentId\"]}\r\n filterModel={filterModel}\r\n onFilterModelChange={setFilterModel}\r\n viewMode={viewMode}\r\n onViewModeChange={setViewMode}\r\n kanbanConfig={KANBAN_CONFIG}\r\n toolbar={{\r\n enableSearch: true,\r\n enableFilters: true,\r\n enableColumns: true,\r\n enableDensity: true,\r\n enableExport: true,\r\n moreMenu: {\r\n items: [\r\n {\r\n id: \"fullscreen\",\r\n label: \"Tela cheia\",\r\n icon: <Maximize2 />,\r\n onSelect: () => alert(\"Tela cheia\"),\r\n },\r\n {\r\n id: \"duplicate\",\r\n label: \"Duplicar visualização\",\r\n icon: <Copy />,\r\n onSelect: () => alert(\"Duplicar visualização\"),\r\n },\r\n {\r\n id: \"import\",\r\n label: \"Importar CSV\",\r\n icon: <Upload />,\r\n onSelect: () => alert(\"Importar CSV\"),\r\n },\r\n {\r\n id: \"reset\",\r\n label: \"Resetar visualização\",\r\n icon: <RotateCcw />,\r\n destructive: true,\r\n onSelect: () => tableRef.current?.resetPersistedState(),\r\n },\r\n ],\r\n },\r\n }}\r\n paginationConfig={{\r\n enabled: true,\r\n initialPageSize: 10,\r\n pageSizeOptions: [10, 25, 50, 100],\r\n }}\r\n selectionConfig={{\r\n enabled: true,\r\n enableGlobal: true,\r\n actions: (selectedIds, clearSelection) => (\r\n <>\r\n <BulkActionButton\r\n icon={<Download />}\r\n onClick={() => tableRef.current?.exportCsv(\"selected\")}\r\n >\r\n Exportar\r\n </BulkActionButton>\r\n <BulkActionButton\r\n icon={<Trash2 />}\r\n variant=\"danger\"\r\n onClick={() => askBulkDelete(selectedIds.map(String), clearSelection)}\r\n >\r\n Excluir\r\n </BulkActionButton>\r\n </>\r\n ),\r\n }}\r\n onCellEditCommit={async ({ id, field, value }) => {\r\n await new Promise((res) => setTimeout(res, 400));\r\n setRows((prev) =>\r\n prev.map((r) => (r.id === id ? { ...r, [field]: value } : r)),\r\n );\r\n }}\r\n onRowClick={(row) => setDetailRowId(row.id)}\r\n className=\"flex-1 min-h-0\"\r\n />\r\n\r\n {/* Drawer \"Novo cliente\" — controlado pelo botão do header */}\r\n <NovoClienteDrawer\r\n open={novoClienteOpen}\r\n onOpenChange={setNovoClienteOpen}\r\n onSubmit={(data) => {\r\n console.log(\"Novo cliente:\", data);\r\n alert(`Cliente \"${data.name}\" criado (mock)`);\r\n }}\r\n />\r\n\r\n {/* DetailDrawer — abre ao clicar numa row, slide-in da direita SEM\r\n backdrop modal (tabela continua interativa atrás). */}\r\n <DetailDrawer\r\n row={detailRow}\r\n onClose={() => setDetailRowId(null)}\r\n onEdit={(r) => console.log(\"Editar\", r.id)}\r\n onDelete={(r) => askDelete(r)}\r\n onSave={(r) => alert(`Salvar alterações em ${r.name} (mock)`)}\r\n />\r\n\r\n {/* AlertModal de confirmação de exclusão — compartilhado entre\r\n row action menu, bulk action e DetailDrawer.onDelete. */}\r\n <AlertModal\r\n open={confirmDelete !== null}\r\n onOpenChange={(open) => {\r\n if (!open) setConfirmDelete(null);\r\n }}\r\n tone=\"danger\"\r\n title={\r\n confirmDelete && confirmDelete.ids.length > 1\r\n ? `Excluir ${confirmDelete.label}?`\r\n : \"Excluir cliente?\"\r\n }\r\n description={\r\n confirmDelete\r\n ? confirmDelete.ids.length > 1\r\n ? `Esta ação não pode ser desfeita. ${confirmDelete.label} serão removidos permanentemente.`\r\n : `Esta ação não pode ser desfeita. \"${confirmDelete.label}\" será removido permanentemente.`\r\n : null\r\n }\r\n confirmLabel=\"Excluir\"\r\n cancelLabel=\"Cancelar\"\r\n onConfirm={handleConfirmDelete}\r\n />\r\n </AppShell>\r\n );\r\n}\r\n"],"names":["tv","useState","useEffect","jsxs","Panel","Fragment","jsx","Button","FormFieldInput","FormField","ChipGroup","STATUSES","ChipGroupItem","STATUS_DOT","CATEGORIES","FormFieldSelect","CITIES","FormFieldTextarea","ChevronDown","AGENTS","FloatingPanel","Avatar","AvatarFallback","Pencil","Trash2","Chip","CATEGORY_KIND","formatBRL","formatShortDate","CLIENTS_87","STATUS_OPTIONS","CATEGORY_OPTIONS","AGENT_OPTIONS","AGENTS_LOOKUP","MessageSquare","Archive","presetView","KANBAN_COLUMNS","Clock","useTheme","useRef","useCallback","useMemo","AppShell","APP_SHELL_CONTEXTS","APP_SHELL_COMMANDS","APP_SHELL_NOTIFICATIONS","APP_SHELL_MESSAGES","APP_SHELL_THEME_OPTIONS","APP_SHELL_USER","APP_SHELL_LAYOUT_OPTIONS","PageHeader","MoreHorizontal","Plus","DataTable","Maximize2","Copy","Upload","RotateCcw","BulkActionButton","Download","AlertModal"],"mappings":"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"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { useState, useEffect, useRef, useCallback, useMemo } from "react";
|
|
3
|
-
import { u as useTheme } from "../chunks/useTheme-
|
|
3
|
+
import { t as tv, d as ChipGroup, e as ChipGroupItem, B as Button, C as Chip, a as Avatar, b as AvatarFallback, u as useTheme, A as AppShell } from "../chunks/useTheme-DF2xbSdI.mjs";
|
|
4
4
|
import { Pencil, Trash2, ChevronDown, MoreHorizontal, Plus, Download, Maximize2, Copy, Upload, RotateCcw, MessageSquare, Archive, Clock } from "lucide-react";
|
|
5
5
|
import { S as STATUSES, a as STATUS_DOT, C as CATEGORIES, b as CITIES, A as AGENTS, d as CATEGORY_KIND, f as formatBRL, e as formatShortDate, g as CLIENTS_87, K as KANBAN_COLUMNS, h as STATUS_OPTIONS, i as CATEGORY_OPTIONS, j as AGENTS_LOOKUP, k as AGENT_OPTIONS } from "../chunks/clientes-showcase-mocks-CwWGCCmf.mjs";
|
|
6
|
-
import { P as Panel, F as FormFieldInput, a as FormField, b as FormFieldSelect, c as FormFieldTextarea, d as FloatingPanel, p as presetView, D as DataTable, B as BulkActionButton, A as AlertModal } from "../chunks/panel-
|
|
7
|
-
import
|
|
8
|
-
import "../chunks/
|
|
9
|
-
import { P as PageHeader } from "../chunks/page-header-B6XJyIMz.mjs";
|
|
6
|
+
import { P as Panel, F as FormFieldInput, a as FormField, b as FormFieldSelect, c as FormFieldTextarea, d as FloatingPanel, p as presetView, D as DataTable, B as BulkActionButton, A as AlertModal } from "../chunks/panel-Cdl0GPVE.mjs";
|
|
7
|
+
import "../chunks/input-Cym0k4ZI.mjs";
|
|
8
|
+
import { P as PageHeader } from "../chunks/page-header-Buh6YlQM.mjs";
|
|
10
9
|
import "react-dom";
|
|
11
10
|
import { b as APP_SHELL_LAYOUT_OPTIONS, f as APP_SHELL_USER, e as APP_SHELL_THEME_OPTIONS, c as APP_SHELL_MESSAGES, d as APP_SHELL_NOTIFICATIONS, A as APP_SHELL_COMMANDS, a as APP_SHELL_CONTEXTS } from "../chunks/app-shell-mocks-kWIVSzLs.mjs";
|
|
12
11
|
const drawerFormStyles = tv({
|