@snksergio/design-system 0.1.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/README.md +260 -0
- package/dist-lib/chunks/app-shell-BNTvOETJ.mjs +2681 -0
- package/dist-lib/chunks/app-shell-BNTvOETJ.mjs.map +1 -0
- package/dist-lib/chunks/app-shell-CDy42aNI.mjs +2663 -0
- package/dist-lib/chunks/app-shell-CDy42aNI.mjs.map +1 -0
- package/dist-lib/chunks/app-shell-mocks-kWIVSzLs.mjs +208 -0
- package/dist-lib/chunks/app-shell-mocks-kWIVSzLs.mjs.map +1 -0
- package/dist-lib/chunks/app-shell-mocks-oO_IV3Gw.mjs +207 -0
- package/dist-lib/chunks/app-shell-mocks-oO_IV3Gw.mjs.map +1 -0
- package/dist-lib/chunks/badge-B_2Zt52o.mjs +797 -0
- package/dist-lib/chunks/badge-B_2Zt52o.mjs.map +1 -0
- package/dist-lib/chunks/badge-DKpXURa1.mjs +813 -0
- package/dist-lib/chunks/badge-DKpXURa1.mjs.map +1 -0
- package/dist-lib/chunks/chat-v2-mocks-BV9Wha_Z.mjs +192 -0
- package/dist-lib/chunks/chat-v2-mocks-BV9Wha_Z.mjs.map +1 -0
- package/dist-lib/chunks/chat-v2-mocks-DvZRkhmz.mjs +193 -0
- package/dist-lib/chunks/chat-v2-mocks-DvZRkhmz.mjs.map +1 -0
- package/dist-lib/chunks/chip-group-CsKBBHW2.mjs +796 -0
- package/dist-lib/chunks/chip-group-CsKBBHW2.mjs.map +1 -0
- package/dist-lib/chunks/chip-group-D3D0i72q.mjs +780 -0
- package/dist-lib/chunks/chip-group-D3D0i72q.mjs.map +1 -0
- package/dist-lib/chunks/clientes-showcase-mocks-BMfbNNJh.mjs +185 -0
- package/dist-lib/chunks/clientes-showcase-mocks-BMfbNNJh.mjs.map +1 -0
- package/dist-lib/chunks/clientes-showcase-mocks-Cq9u3nGZ.mjs +169 -0
- package/dist-lib/chunks/clientes-showcase-mocks-Cq9u3nGZ.mjs.map +1 -0
- package/dist-lib/chunks/input-374MpdBL.mjs +72 -0
- package/dist-lib/chunks/input-374MpdBL.mjs.map +1 -0
- package/dist-lib/chunks/input-DF4XAWmr.mjs +56 -0
- package/dist-lib/chunks/input-DF4XAWmr.mjs.map +1 -0
- package/dist-lib/chunks/page-header-Dw-3wqAG.mjs +75 -0
- package/dist-lib/chunks/page-header-Dw-3wqAG.mjs.map +1 -0
- package/dist-lib/chunks/page-header-mC1gGtOI.mjs +76 -0
- package/dist-lib/chunks/page-header-mC1gGtOI.mjs.map +1 -0
- package/dist-lib/chunks/panel-Ds15whqp.mjs +9717 -0
- package/dist-lib/chunks/panel-Ds15whqp.mjs.map +1 -0
- package/dist-lib/chunks/panel-bzNmFlEZ.mjs +9737 -0
- package/dist-lib/chunks/panel-bzNmFlEZ.mjs.map +1 -0
- package/dist-lib/chunks/useTheme-BUPLZBMs.mjs +66 -0
- package/dist-lib/chunks/useTheme-BUPLZBMs.mjs.map +1 -0
- package/dist-lib/chunks/useTheme-Dee4mo-A.mjs +65 -0
- package/dist-lib/chunks/useTheme-Dee4mo-A.mjs.map +1 -0
- package/dist-lib/index.cjs +1207 -0
- package/dist-lib/index.cjs.map +1 -0
- package/dist-lib/index.d.ts +2 -0
- package/dist-lib/index.mjs +1209 -0
- package/dist-lib/index.mjs.map +1 -0
- package/dist-lib/preview/chat.cjs +1120 -0
- package/dist-lib/preview/chat.cjs.map +1 -0
- package/dist-lib/preview/chat.d.ts +6 -0
- package/dist-lib/preview/chat.mjs +1120 -0
- package/dist-lib/preview/chat.mjs.map +1 -0
- package/dist-lib/preview/clientes.cjs +897 -0
- package/dist-lib/preview/clientes.cjs.map +1 -0
- package/dist-lib/preview/clientes.d.ts +6 -0
- package/dist-lib/preview/clientes.mjs +897 -0
- package/dist-lib/preview/clientes.mjs.map +1 -0
- package/dist-lib/preview/dashboard.cjs +733 -0
- package/dist-lib/preview/dashboard.cjs.map +1 -0
- package/dist-lib/preview/dashboard.d.ts +4 -0
- package/dist-lib/preview/dashboard.mjs +733 -0
- package/dist-lib/preview/dashboard.mjs.map +1 -0
- package/dist-lib/preview/mocks.cjs +15 -0
- package/dist-lib/preview/mocks.cjs.map +1 -0
- package/dist-lib/preview/mocks.d.ts +2 -0
- package/dist-lib/preview/mocks.mjs +15 -0
- package/dist-lib/preview/mocks.mjs.map +1 -0
- package/dist-lib/theme.css +668 -0
- package/dist-lib/tokens.cjs +915 -0
- package/dist-lib/tokens.cjs.map +1 -0
- package/dist-lib/tokens.d.ts +2 -0
- package/dist-lib/tokens.mjs +915 -0
- package/dist-lib/tokens.mjs.map +1 -0
- package/package.json +142 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clientes.mjs","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\";\n\n/**\n * Layout em grid de 2 colunas usado dentro do drawer pra pares de campos\n * (Email + WhatsApp, Cidade + Valor).\n */\nexport const drawerFormStyles = tv({\n slots: {\n twoCols: \"grid grid-cols-2 gap-gp-xl\",\n fieldLabel:\n \"text-[12.5px] font-semibold tracking-[0.01em] leading-none text-fg-default dark:text-fg-muted select-none\",\n statusDot: \"inline-block size-[8px] rounded-radius-full mr-gp-xs shrink-0\",\n },\n});\n","import { useEffect, useState } from \"react\";\nimport { Panel } from \"@/components/ui/Panel\";\nimport { Button } from \"@/components/ui/Button/button\";\nimport {\n FormField,\n FormFieldInput,\n FormFieldSelect,\n FormFieldTextarea,\n} from \"@/components/ui/FormField\";\nimport { ChipGroup, ChipGroupItem } from \"@/components/ui/Chip\";\nimport { STATUSES, CATEGORIES } from \"../../../TableDoc\";\nimport { CITIES, STATUS_DOT } from \"../../clientes-showcase-mocks\";\nimport { drawerFormStyles } from \"../../clientes-showcase.styles\";\nimport type { NovoClienteFormData } from \"../../clientes-showcase.types\";\n\nconst INITIAL_FORM: NovoClienteFormData = {\n name: \"\",\n email: \"\",\n whatsapp: \"\",\n statusId: \"active\",\n categoryId: \"lead\",\n city: \"\",\n value: 0,\n notes: \"\",\n};\n\nexport type NovoClienteDrawerProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Disparado ao confirmar — drawer fecha automaticamente após o submit. */\n onSubmit?: (data: NovoClienteFormData) => void;\n};\n\n/**\n * Drawer \"Novo cliente\" — replica visual do TblClientFormDrawer\n * (sandbox /design-and-table-v2), recompilado em cima dos componentes do DS:\n * Panel + FormField (Input / Select / Textarea) + ChipGroup + Button.\n *\n * Layout (top → bottom):\n * 1. Nome* — full width\n * 2. Email + WhatsApp — 2 cols\n * 3. Status — ChipGroup com dot colorido\n * 4. Categoria — ChipGroup\n * 5. Cidade + Valor R$ — 2 cols\n * 6. Notas — textarea full width\n */\nexport function NovoClienteDrawer({\n open,\n onOpenChange,\n onSubmit,\n}: NovoClienteDrawerProps) {\n const s = drawerFormStyles();\n const [form, setForm] = useState<NovoClienteFormData>(INITIAL_FORM);\n\n // Reseta form sempre que abrir\n useEffect(() => {\n if (open) setForm(INITIAL_FORM);\n }, [open]);\n\n const canSubmit = form.name.trim().length > 0;\n\n const handleSubmit = () => {\n if (!canSubmit) return;\n onSubmit?.(form);\n onOpenChange(false);\n };\n\n return (\n <Panel\n open={open}\n onOpenChange={onOpenChange}\n title=\"Novo cliente\"\n side=\"right\"\n size=\"md\"\n footer={\n <>\n <Button\n variant=\"outline\"\n color=\"secondary\"\n size=\"md\"\n onClick={() => onOpenChange(false)}\n >\n Cancelar\n </Button>\n <Button\n variant=\"filled\"\n color=\"primary\"\n size=\"md\"\n disabled={!canSubmit}\n onClick={handleSubmit}\n >\n Criar cliente\n </Button>\n </>\n }\n >\n <FormFieldInput\n label=\"Nome\"\n required\n placeholder=\"Maria Silva\"\n value={form.name}\n onChange={(e) => setForm((f) => ({ ...f, name: e.target.value }))}\n />\n\n <div className={s.twoCols()}>\n <FormFieldInput\n label=\"Email\"\n type=\"email\"\n placeholder=\"cliente@exemplo.com\"\n value={form.email}\n onChange={(e) => setForm((f) => ({ ...f, email: e.target.value }))}\n />\n <FormFieldInput\n label=\"WhatsApp\"\n type=\"tel\"\n placeholder=\"55 11 99999-9999\"\n value={form.whatsapp}\n onChange={(e) => setForm((f) => ({ ...f, whatsapp: e.target.value }))}\n />\n </div>\n\n <FormField label=\"Status\">\n {() => (\n <ChipGroup\n type=\"single\"\n value={form.statusId}\n onValueChange={(v) =>\n v &&\n setForm((f) => ({\n ...f,\n statusId: v as keyof typeof STATUSES,\n }))\n }\n size=\"md\"\n shape=\"pill\"\n ariaLabel=\"Status do cliente\"\n >\n {Object.entries(STATUSES).map(([id, st]) => (\n <ChipGroupItem key={id} value={id}>\n <span\n className={s.statusDot()}\n style={{ background: STATUS_DOT[id] ?? st.color }}\n aria-hidden\n />\n {st.label}\n </ChipGroupItem>\n ))}\n </ChipGroup>\n )}\n </FormField>\n\n <FormField label=\"Categoria\">\n {() => (\n <ChipGroup\n type=\"single\"\n value={form.categoryId}\n onValueChange={(v) =>\n v &&\n setForm((f) => ({\n ...f,\n categoryId: v as keyof typeof CATEGORIES,\n }))\n }\n size=\"md\"\n shape=\"pill\"\n ariaLabel=\"Categoria do cliente\"\n >\n {Object.entries(CATEGORIES).map(([id, cat]) => (\n <ChipGroupItem key={id} value={id}>\n {cat.label}\n </ChipGroupItem>\n ))}\n </ChipGroup>\n )}\n </FormField>\n\n <div className={s.twoCols()}>\n <FormFieldSelect\n label=\"Cidade\"\n placeholder=\"Selecionar...\"\n value={form.city || undefined}\n onValueChange={(v) => setForm((f) => ({ ...f, city: v }))}\n options={CITIES.map((c) => ({ value: c, label: c }))}\n />\n <FormFieldInput\n label=\"Valor (R$)\"\n type=\"number\"\n startAddon=\"R$\"\n value={String(form.value)}\n onChange={(e) =>\n setForm((f) => ({ ...f, value: Number(e.target.value) }))\n }\n min={0}\n step={0.01}\n />\n </div>\n\n <FormFieldTextarea\n label=\"Notas\"\n placeholder=\"Observações sobre o cliente...\"\n rows={4}\n value={form.notes}\n onChange={(e) => setForm((f) => ({ ...f, notes: e.target.value }))}\n />\n </Panel>\n );\n}\n","import { tv } from \"@/utils/tv\";\n\n/**\n * Styles do DetailDrawer — apenas as partes internas (sections collapsibles\n * + DetailField). O shell flutuante (aside, header com avatar+meta, footer\n * com botões) é delegado ao `<FloatingPanel>` do DS.\n */\nexport const detailDrawerStyles = tv({\n slots: {\n section: \"border-b border-border-default last:border-b-0\",\n sectionHead: [\n \"flex items-center justify-between w-full\",\n \"px-[18px] py-[14px]\",\n \"bg-transparent border-0 cursor-pointer text-left\",\n \"text-[13px] font-semibold text-fg-default\",\n \"transition-colors duration-150\",\n \"hover:bg-bg-muted\",\n \"focus-visible:outline-none focus-visible:bg-bg-muted\",\n ],\n sectionChev: \"size-[14px] text-fg-muted transition-transform duration-200\",\n sectionChevOpen: \"rotate-180\",\n sectionBody: \"flex flex-col gap-gp-md px-[18px] pb-pad-2xl\",\n\n field: \"flex items-baseline justify-between gap-gp-md text-[13px]\",\n fieldLabel: \"text-[12px] text-fg-muted shrink-0\",\n fieldValue: \"text-fg-default text-right break-words min-w-0\",\n },\n});\n","import { useState, type ReactNode } from \"react\";\nimport { ChevronDown, Pencil, Trash2 } from \"lucide-react\";\nimport { Avatar, AvatarFallback } from \"@/components/shadcn/avatar\";\nimport { Button } from \"@/components/ui/Button/button\";\nimport { Chip } from \"@/components/ui/Chip\";\nimport { FloatingPanel } from \"@/components/ui/FloatingPanel\";\nimport { STATUSES, CATEGORIES, AGENTS } from \"../../../TableDoc\";\nimport {\n CATEGORY_KIND,\n STATUS_DOT,\n formatBRL,\n formatShortDate,\n} from \"../../clientes-showcase-mocks\";\nimport { detailDrawerStyles } from \"./detail-drawer.styles\";\nimport type { DetailDrawerProps } from \"./detail-drawer.types\";\n\n/* ── Helpers internos ────────────────────────────────────────────── */\n\nfunction formatLongDate(ms: number): string {\n if (!ms) return \"—\";\n const d = new Date(ms);\n return d.toLocaleDateString(\"pt-BR\", {\n day: \"numeric\",\n month: \"long\",\n year: \"numeric\",\n });\n}\n\ntype SectionId = \"contact\" | \"meta\" | \"notes\";\n\n/* ── DetailField (label : value) ────────────────────────────────── */\n\ntype DetailFieldProps = {\n label: string;\n value: ReactNode;\n s: ReturnType<typeof detailDrawerStyles>;\n};\n\nfunction DetailField({ label, value, s }: DetailFieldProps) {\n return (\n <div className={s.field()}>\n <span className={s.fieldLabel()}>{label}</span>\n <span className={s.fieldValue()}>{value || \"—\"}</span>\n </div>\n );\n}\n\n/* ── DetailSection (collapsible) ─────────────────────────────────── */\n\ntype DetailSectionProps = {\n id: SectionId;\n title: string;\n open: boolean;\n onToggle: (id: SectionId) => void;\n children: ReactNode;\n s: ReturnType<typeof detailDrawerStyles>;\n};\n\nfunction DetailSection({\n id,\n title,\n open,\n onToggle,\n children,\n s,\n}: DetailSectionProps) {\n return (\n <section className={s.section()}>\n <button\n type=\"button\"\n className={s.sectionHead()}\n onClick={() => onToggle(id)}\n aria-expanded={open}\n >\n <span>{title}</span>\n <ChevronDown\n className={[s.sectionChev(), open ? s.sectionChevOpen() : \"\"].join(\" \")}\n />\n </button>\n {open && <div className={s.sectionBody()}>{children}</div>}\n </section>\n );\n}\n\n/* ── DetailDrawer ────────────────────────────────────────────────── */\n\n/**\n * Drawer \"Detalhes do cliente\" — usa `<FloatingPanel>` do DS (non-modal,\n * resizable, maximizable, responsive). Replica visual do `TblDetailsPanel`\n * do sandbox /design-and-table-v2.\n */\nexport function DetailDrawer({\n row,\n onClose,\n onEdit,\n onDelete,\n onSave,\n}: DetailDrawerProps) {\n const s = detailDrawerStyles();\n const [openSections, setOpenSections] = useState<Set<SectionId>>(\n () => new Set([\"contact\", \"meta\", \"notes\"]),\n );\n\n const toggle = (id: SectionId) => {\n setOpenSections((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n // Mantém ordem dos hooks estável independente de `row` — depois do toggle.\n if (!row) return null;\n\n const status = STATUSES[row.statusId];\n const cat = CATEGORIES[row.categoryId as keyof typeof CATEGORIES];\n const agent = AGENTS[row.agentId as keyof typeof AGENTS];\n const agentInitials =\n agent?.name.split(\" \").map((p) => p[0]).join(\"\").slice(0, 2) ?? \"?\";\n\n return (\n <FloatingPanel\n open={row !== null}\n onOpenChange={(open) => {\n if (!open) onClose();\n }}\n side=\"right\"\n size=\"md\"\n resizable\n maximizable\n resizableStorageKey=\"clientes-showcase.detail-drawer.width\"\n titleSlot={\n <div className=\"flex items-center gap-gp-md min-w-0\">\n <Avatar\n className=\"size-[40px] shrink-0\"\n style={{ background: row.avatarColor }}\n >\n <AvatarFallback className=\"bg-transparent text-white text-[14px] font-bold\">\n {row.initials}\n </AvatarFallback>\n </Avatar>\n <div className=\"flex flex-col min-w-0 flex-1\">\n <div className=\"text-[15px] font-semibold text-fg-default whitespace-nowrap overflow-hidden text-ellipsis\">\n {row.name}\n </div>\n <div className=\"flex items-center gap-[6px] mt-[2px] text-[12px] text-fg-muted\">\n <span>{row.id}</span>\n <span className=\"opacity-50\">·</span>\n <span className=\"inline-flex items-center gap-[6px]\">\n <span\n className=\"inline-block size-[8px] rounded-radius-full shrink-0\"\n style={{ background: STATUS_DOT[row.statusId] ?? status?.color }}\n aria-hidden\n />\n {status?.label}\n </span>\n </div>\n </div>\n </div>\n }\n headerActions={\n <>\n <Button\n variant=\"soft\"\n color=\"secondary\"\n size=\"icon-sm\"\n aria-label=\"Editar\"\n onClick={() => onEdit?.(row)}\n >\n <Pencil />\n </Button>\n <Button\n variant=\"soft\"\n color=\"critical\"\n size=\"icon-sm\"\n aria-label=\"Excluir\"\n onClick={() => onDelete?.(row)}\n >\n <Trash2 />\n </Button>\n </>\n }\n footer={\n <>\n <Button variant=\"outline\" color=\"secondary\" size=\"sm\" onClick={onClose}>\n Cancelar\n </Button>\n <Button\n variant=\"filled\"\n color=\"primary\"\n size=\"sm\"\n onClick={() => onSave?.(row)}\n >\n Salvar alterações\n </Button>\n </>\n }\n >\n <DetailSection\n id=\"contact\"\n title=\"Contato\"\n open={openSections.has(\"contact\")}\n onToggle={toggle}\n s={s}\n >\n <DetailField\n label=\"Email\"\n value={\n <a\n href={`mailto:${row.email}`}\n className=\"text-fg-brand hover:underline\"\n >\n {row.email}\n </a>\n }\n s={s}\n />\n <DetailField\n label=\"Telefone\"\n value={\n <a\n href={`tel:${row.phone.replace(/\\D/g, \"\")}`}\n className=\"text-fg-brand hover:underline\"\n >\n {row.phone}\n </a>\n }\n s={s}\n />\n <DetailField label=\"Localização\" value={row.location} s={s} />\n </DetailSection>\n\n <DetailSection\n id=\"meta\"\n title=\"Atendimento\"\n open={openSections.has(\"meta\")}\n onToggle={toggle}\n s={s}\n >\n <DetailField label=\"ID\" value={row.id} s={s} />\n <DetailField\n label=\"Categoria\"\n value={\n cat ? (\n <Chip\n color={CATEGORY_KIND[row.categoryId] ?? \"info\"}\n variant=\"soft\"\n size=\"sm\"\n shape=\"pill\"\n >\n {cat.label}\n </Chip>\n ) : (\n \"—\"\n )\n }\n s={s}\n />\n <DetailField\n label=\"Atribuído a\"\n value={\n agent ? (\n <span className=\"inline-flex items-center gap-gp-sm\">\n <Avatar\n className=\"size-[22px]\"\n style={{ background: agent.color }}\n >\n <AvatarFallback className=\"bg-transparent text-white text-[10px] font-bold\">\n {agentInitials}\n </AvatarFallback>\n </Avatar>\n {agent.name}\n </span>\n ) : (\n \"—\"\n )\n }\n s={s}\n />\n <DetailField label=\"Valor\" value={formatBRL(row.value)} s={s} />\n <DetailField label=\"Criado em\" value={formatLongDate(row.createdAt)} s={s} />\n <DetailField\n label=\"Último contato\"\n value={formatShortDate(row.lastContact)}\n s={s}\n />\n </DetailSection>\n\n <DetailSection\n id=\"notes\"\n title=\"Anotações\"\n open={openSections.has(\"notes\")}\n onToggle={toggle}\n s={s}\n >\n <p className=\"text-[12.5px] text-fg-muted\">Sem anotações.</p>\n </DetailSection>\n </FloatingPanel>\n );\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { useTheme, type Theme } from \"@/hooks/useTheme\";\nimport {\n Archive,\n Clock,\n Copy,\n Download,\n Maximize2,\n MessageSquare,\n MoreHorizontal,\n Pencil,\n Plus,\n RotateCcw,\n Trash2,\n Upload,\n} from \"lucide-react\";\nimport {\n CATEGORIES,\n AGENTS,\n type ClientRow,\n} from \"../TableDoc\";\nimport {\n DataTable,\n presetView,\n type DataTableColumnDef,\n type DataTableKanbanConfig,\n type DataTablePresetView,\n type DataTableRef,\n type DataTableViewMode,\n type FilterModel,\n} from \"@/components/ui/DataTable\";\nimport { AppShell } from \"@/components/ui/AppShell\";\nimport { Button } from \"@/components/ui/Button/button\";\nimport { Chip } from \"@/components/ui/Chip\";\nimport { PageHeader } from \"@/components/ui/PageHeader\";\nimport { BulkActionButton } from \"@/components/ui/TableToolbar\";\nimport { Avatar, AvatarFallback } from \"@/components/shadcn/avatar\";\nimport {\n APP_SHELL_CONTEXTS,\n APP_SHELL_COMMANDS,\n APP_SHELL_NOTIFICATIONS,\n APP_SHELL_MESSAGES,\n APP_SHELL_THEME_OPTIONS,\n APP_SHELL_LAYOUT_OPTIONS,\n APP_SHELL_USER,\n} from \"../../mocks/app-shell-mocks\";\nimport {\n CLIENTS_87,\n STATUS_OPTIONS,\n CATEGORY_OPTIONS,\n AGENT_OPTIONS,\n AGENTS_LOOKUP,\n KANBAN_COLUMNS,\n CATEGORY_KIND,\n formatBRL,\n formatShortDate,\n} from \"./clientes-showcase-mocks\";\nimport { NovoClienteDrawer } from \"./components/NovoClienteDrawer\";\nimport { DetailDrawer } from \"./components/DetailDrawer\";\nimport { AlertModal } from \"@/components/ui/AlertModal\";\n\n/* ── Columns declarativas (type-based) ─────────────────────────── */\n\ntype ColumnHandlers = {\n /** Pede confirmação de exclusão (abre o AlertModal). */\n onAskDelete: (row: ClientRow) => void;\n};\n\nfunction buildColumns(handlers: ColumnHandlers): DataTableColumnDef<ClientRow>[] {\n return [\n { field: \"id\", headerName: \"ID\", type: \"text\", width: 130 },\n {\n field: \"name\",\n headerName: \"Nome\",\n type: \"user\",\n sortable: true,\n width: 220,\n typeOptions: {\n users: Object.fromEntries(\n CLIENTS_87.map((c) => [\n c.name,\n {\n name: c.name,\n initials: c.initials,\n color: c.avatarColor,\n },\n ]),\n ),\n },\n valueGetter: (row) => row.name,\n },\n {\n field: \"email\",\n headerName: \"Email\",\n type: \"email\",\n enableColumnFilter: true,\n filterType: \"text\",\n },\n {\n field: \"phone\",\n headerName: \"Telefone\",\n type: \"phone\",\n },\n {\n field: \"statusId\",\n headerName: \"Status\",\n type: \"status\",\n enableColumnFilter: true,\n filterType: \"multiSelect\",\n filterOptions: STATUS_OPTIONS,\n },\n {\n field: \"categoryId\",\n headerName: \"Categoria\",\n type: \"badge\",\n enableColumnFilter: true,\n filterType: \"multiSelect\",\n filterOptions: CATEGORY_OPTIONS,\n },\n {\n field: \"agentId\",\n headerName: \"Atribuído\",\n type: \"user\",\n enableColumnFilter: true,\n filterType: \"select\",\n filterOptions: AGENT_OPTIONS,\n typeOptions: { users: AGENTS_LOOKUP },\n },\n {\n field: \"value\",\n headerName: \"Valor\",\n type: \"currency\",\n sortable: true,\n enableColumnFilter: true,\n filterType: \"number\",\n aggregate: \"sum\",\n aggregateFormatter: (v) =>\n new Intl.NumberFormat(\"pt-BR\", { style: \"currency\", currency: \"BRL\" }).format(v),\n },\n {\n field: \"createdAt\",\n headerName: \"Criado em\",\n type: \"date\",\n sortable: true,\n enableColumnFilter: true,\n filterType: \"date\",\n width: 130,\n },\n {\n field: \"lastContact\",\n headerName: \"Último contato\",\n type: \"date\",\n sortable: true,\n width: 150,\n },\n {\n field: \"location\",\n headerName: \"Localização\",\n type: \"text\",\n minWidth: 150,\n },\n {\n field: \"_actions\",\n headerName: \"\",\n type: \"actions\",\n width: 64,\n pinned: \"right\",\n getActions: ({ row }) => [\n {\n id: \"edit\",\n label: \"Editar\",\n icon: <Pencil />,\n showInMenu: true,\n onClick: () => console.log(\"Editar\", row.id),\n },\n {\n id: \"whatsapp\",\n label: \"Abrir atendimento (WhatsApp)\",\n icon: <MessageSquare />,\n showInMenu: true,\n onClick: () => console.log(\"Atendimento\", row.id),\n },\n {\n id: \"archive\",\n label: \"Arquivar\",\n icon: <Archive />,\n showInMenu: true,\n onClick: () => console.log(\"Arquivar\", row.id),\n },\n {\n id: \"delete\",\n label: \"Excluir cliente\",\n icon: <Trash2 />,\n showInMenu: true,\n destructive: true,\n onClick: () => handlers.onAskDelete(row),\n },\n ],\n },\n ];\n}\n\n/* ── Saved views / Presets — tabs do toolbar ───────────────────── */\n\nconst DEFAULT_VIEWS: DataTablePresetView[] = [\n presetView({\n id: \"preset:meus\",\n name: \"Meus\",\n filters: [{ field: \"agentId\", value: \"you\" }],\n }),\n presetView({\n id: \"preset:ativos\",\n name: \"Ativos\",\n filters: [{ field: \"statusId\", value: \"active\" }],\n }),\n presetView({\n id: \"preset:royals\",\n name: \"Royals\",\n filters: [{ field: \"categoryId\", value: \"royal\" }],\n }),\n presetView({\n id: \"preset:ultimos-7-dias\",\n name: \"Últimos 7 dias\",\n sort: [{ field: \"createdAt\", direction: \"desc\" }],\n }),\n];\n\n/* ── Filtros iniciais (Status=Ativo + Categoria=Royal — print) ─── */\n\nconst INITIAL_FILTERS: FilterModel = {\n items: [\n { id: \"filter-status-ativo\", field: \"statusId\", operator: \"equals\", value: \"active\" },\n { id: \"filter-categoria-royal\", field: \"categoryId\", operator: \"equals\", value: \"royal\" },\n ],\n logicOperator: \"AND\",\n};\n\n/* ── Kanban config (renderCard com JSX) ────────────────────────── */\n\nconst KANBAN_CONFIG: DataTableKanbanConfig<ClientRow> = {\n groupByField: \"statusId\",\n columns: KANBAN_COLUMNS,\n renderCard: ({ row }) => {\n const cat = CATEGORIES[row.categoryId as keyof typeof CATEGORIES];\n const agent = AGENTS[row.agentId as keyof typeof AGENTS];\n const agentInitials = agent?.name.split(\" \").map((s) => s[0]).join(\"\").slice(0, 2) ?? \"?\";\n return {\n title: row.name,\n subtitle: row.id,\n avatar: (\n <Avatar className=\"size-[28px]\" style={{ background: row.avatarColor }}>\n <AvatarFallback className=\"bg-transparent text-white text-[11px] font-bold\">\n {row.initials}\n </AvatarFallback>\n </Avatar>\n ),\n chip: cat ? (\n <Chip\n color={CATEGORY_KIND[row.categoryId] ?? \"info\"}\n variant=\"soft\"\n size=\"sm\"\n shape=\"pill\"\n >\n {cat.label}\n </Chip>\n ) : null,\n value: formatBRL(row.value),\n footerLeft: agent ? (\n <span className=\"inline-flex items-center gap-gp-sm min-w-0 flex-1\">\n <Avatar className=\"size-[22px]\" style={{ background: agent.color }}>\n <AvatarFallback className=\"bg-transparent text-white text-[10px] font-bold\">\n {agentInitials}\n </AvatarFallback>\n </Avatar>\n <span className=\"text-[12px] text-fg-muted whitespace-nowrap overflow-hidden text-ellipsis\">\n {agent.name}\n </span>\n </span>\n ) : null,\n footerRight: (\n <span className=\"inline-flex items-center gap-[4px] text-[11.5px] text-fg-muted [font-variant-numeric:tabular-nums] shrink-0\">\n <Clock size={11} strokeWidth={1.8} aria-hidden />\n {formatShortDate(row.lastContact)}\n </span>\n ),\n };\n },\n};\n\n/* ═══════════════════════════════════════════════════════════════════════════\n Page — Clientes (showcase usando AppShell + DataTable real)\n ═══════════════════════════════════════════════════════════════════════════ */\n\ntype ConfirmDeleteState = {\n ids: string[];\n label: string;\n /** Callback opcional após confirmar — usado pelo bulk pra limpar seleção. */\n onAfter?: () => void;\n} | null;\n\nexport default function ClientesShowcase() {\n const { theme, setTheme } = useTheme();\n const [rows, setRows] = useState<ClientRow[]>(() => CLIENTS_87);\n const [layout, setLayout] = useState<string>(\"fluid\");\n const [filterModel, setFilterModel] = useState<FilterModel>(INITIAL_FILTERS);\n const [viewMode, setViewMode] = useState<DataTableViewMode>(\"table\");\n const [novoClienteOpen, setNovoClienteOpen] = useState(false);\n const [detailRowId, setDetailRowId] = useState<string | null>(null);\n const [confirmDelete, setConfirmDelete] = useState<ConfirmDeleteState>(null);\n const detailRow = detailRowId ? rows.find((r) => r.id === detailRowId) ?? null : null;\n const tableRef = useRef<DataTableRef>(null);\n\n const askDelete = useCallback(\n (row: ClientRow) =>\n setConfirmDelete({ ids: [row.id], label: row.name }),\n [],\n );\n\n const askBulkDelete = useCallback(\n (ids: string[], onAfter: () => void) =>\n setConfirmDelete({\n ids,\n label: `${ids.length} cliente${ids.length === 1 ? \"\" : \"s\"}`,\n onAfter,\n }),\n [],\n );\n\n const handleConfirmDelete = useCallback(() => {\n if (!confirmDelete) return;\n const ids = new Set(confirmDelete.ids);\n setRows((prev) => prev.filter((r) => !ids.has(r.id)));\n if (detailRowId && ids.has(detailRowId)) setDetailRowId(null);\n confirmDelete.onAfter?.();\n setConfirmDelete(null);\n }, [confirmDelete, detailRowId]);\n\n const columns = useMemo(\n () => buildColumns({ onAskDelete: askDelete }),\n [askDelete],\n );\n\n return (\n <AppShell\n contexts={APP_SHELL_CONTEXTS}\n defaultActiveContextId=\"inbox\"\n defaultActiveItemHref=\"#atendimentos\"\n breadcrumb={[{ label: \"Atendimentos\" }]}\n commandGroups={APP_SHELL_COMMANDS}\n notifications={{\n items: APP_SHELL_NOTIFICATIONS,\n onMarkAllRead: () => alert(\"Marcar todas como lidas\"),\n onMoreActions: () => alert(\"Mais ações\"),\n onViewAll: () => alert(\"Ver todas\"),\n }}\n messages={{\n items: APP_SHELL_MESSAGES,\n onNewMessage: () => alert(\"Nova mensagem\"),\n onExpand: () => alert(\"Expandir\"),\n onViewAll: () => alert(\"Ver todas\"),\n }}\n theme={theme}\n onThemeChange={(id) => setTheme(id as Theme)}\n themeOptions={APP_SHELL_THEME_OPTIONS}\n user={APP_SHELL_USER}\n layout={layout}\n onLayoutChange={setLayout}\n layoutOptions={APP_SHELL_LAYOUT_OPTIONS}\n onSettings={() => alert(\"Abrir Configurações\")}\n onLogout={() => alert(\"Sair (mock)\")}\n >\n <PageHeader\n title=\"Clientes\"\n description=\"Gerencie sua base de clientes, acompanhe status de cadastro e abra atendimentos diretos pelo WhatsApp.\"\n badge={\n <Chip color=\"primary\" variant=\"soft\" size=\"sm\" shape=\"rounded\">\n {rows.length.toLocaleString(\"pt-BR\")} registros\n </Chip>\n }\n actions={\n <>\n <Button\n variant=\"outline\"\n color=\"secondary\"\n size=\"icon-md\"\n aria-label=\"Mais ações\"\n onClick={() => alert(\"Mais ações\")}\n >\n <MoreHorizontal />\n </Button>\n <Button\n variant=\"filled\"\n color=\"primary\"\n size=\"md\"\n iconLeft={<Plus />}\n onClick={() => setNovoClienteOpen(true)}\n >\n Novo cliente\n </Button>\n </>\n }\n />\n\n {/* DataTable — ocupa o resto do body ──────────────────────── */}\n <DataTable<ClientRow>\n ref={tableRef}\n rows={rows}\n columns={columns}\n getRowId={(r) => r.id}\n persistId=\"showcase-clientes-crud\"\n defaultViews={DEFAULT_VIEWS}\n filterModel={filterModel}\n onFilterModelChange={setFilterModel}\n viewMode={viewMode}\n onViewModeChange={setViewMode}\n kanbanConfig={KANBAN_CONFIG}\n toolbar={{\n enableSearch: true,\n enableFilters: true,\n enableColumns: true,\n enableDensity: true,\n enableExport: true,\n moreMenu: {\n items: [\n {\n id: \"fullscreen\",\n label: \"Tela cheia\",\n icon: <Maximize2 />,\n onSelect: () => alert(\"Tela cheia\"),\n },\n {\n id: \"duplicate\",\n label: \"Duplicar visualização\",\n icon: <Copy />,\n onSelect: () => alert(\"Duplicar visualização\"),\n },\n {\n id: \"import\",\n label: \"Importar CSV\",\n icon: <Upload />,\n onSelect: () => alert(\"Importar CSV\"),\n },\n {\n id: \"reset\",\n label: \"Resetar visualização\",\n icon: <RotateCcw />,\n destructive: true,\n onSelect: () => tableRef.current?.resetPersistedState(),\n },\n ],\n },\n }}\n paginationConfig={{\n enabled: true,\n initialPageSize: 10,\n pageSizeOptions: [10, 25, 50, 100],\n }}\n selectionConfig={{\n enabled: true,\n enableGlobal: true,\n actions: (selectedIds, clearSelection) => (\n <>\n <BulkActionButton\n icon={<Download />}\n onClick={() => tableRef.current?.exportCsv(\"selected\")}\n >\n Exportar\n </BulkActionButton>\n <BulkActionButton\n icon={<Trash2 />}\n variant=\"danger\"\n onClick={() => askBulkDelete(selectedIds.map(String), clearSelection)}\n >\n Excluir\n </BulkActionButton>\n </>\n ),\n }}\n onCellEditCommit={async ({ id, field, value }) => {\n await new Promise((res) => setTimeout(res, 400));\n setRows((prev) =>\n prev.map((r) => (r.id === id ? { ...r, [field]: value } : r)),\n );\n }}\n onRowClick={(row) => setDetailRowId(row.id)}\n className=\"flex-1 min-h-0\"\n />\n\n {/* Drawer \"Novo cliente\" — controlado pelo botão do header */}\n <NovoClienteDrawer\n open={novoClienteOpen}\n onOpenChange={setNovoClienteOpen}\n onSubmit={(data) => {\n console.log(\"Novo cliente:\", data);\n alert(`Cliente \"${data.name}\" criado (mock)`);\n }}\n />\n\n {/* DetailDrawer — abre ao clicar numa row, slide-in da direita SEM\n backdrop modal (tabela continua interativa atrás). */}\n <DetailDrawer\n row={detailRow}\n onClose={() => setDetailRowId(null)}\n onEdit={(r) => console.log(\"Editar\", r.id)}\n onDelete={(r) => askDelete(r)}\n onSave={(r) => alert(`Salvar alterações em ${r.name} (mock)`)}\n />\n\n {/* AlertModal de confirmação de exclusão — compartilhado entre\n row action menu, bulk action e DetailDrawer.onDelete. */}\n <AlertModal\n open={confirmDelete !== null}\n onOpenChange={(open) => {\n if (!open) setConfirmDelete(null);\n }}\n tone=\"danger\"\n title={\n confirmDelete && confirmDelete.ids.length > 1\n ? `Excluir ${confirmDelete.label}?`\n : \"Excluir cliente?\"\n }\n description={\n confirmDelete\n ? confirmDelete.ids.length > 1\n ? `Esta ação não pode ser desfeita. ${confirmDelete.label} serão removidos permanentemente.`\n : `Esta ação não pode ser desfeita. \"${confirmDelete.label}\" será removido permanentemente.`\n : null\n }\n confirmLabel=\"Excluir\"\n cancelLabel=\"Cancelar\"\n onConfirm={handleConfirmDelete}\n />\n </AppShell>\n );\n}\n"],"names":[],"mappings":"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"}
|