@iclips/ui 2.0.3 → 3.0.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/MIGRATION-v3.md +244 -0
- package/dist/alert-theme.css +20 -79
- package/dist/components/ui/charts/donut-chart.cjs +1 -1
- package/dist/components/ui/charts/donut-chart.cjs.map +1 -1
- package/dist/components/ui/charts/donut-chart.js +39 -60
- package/dist/components/ui/charts/donut-chart.js.map +1 -1
- package/dist/components/ui/charts/kpi-card.cjs +1 -1
- package/dist/components/ui/charts/kpi-card.cjs.map +1 -1
- package/dist/components/ui/charts/kpi-card.js +19 -19
- package/dist/components/ui/charts/kpi-card.js.map +1 -1
- package/dist/components/ui/data/comment-system.cjs +1 -1
- package/dist/components/ui/data/comment-system.cjs.map +1 -1
- package/dist/components/ui/data/comment-system.js +67 -67
- package/dist/components/ui/data/comment-system.js.map +1 -1
- package/dist/components/ui/data/data-table.cjs +1 -1
- package/dist/components/ui/data/data-table.cjs.map +1 -1
- package/dist/components/ui/data/data-table.js +112 -101
- package/dist/components/ui/data/data-table.js.map +1 -1
- package/dist/components/ui/data/editorial-calendar.cjs +1 -1
- package/dist/components/ui/data/editorial-calendar.cjs.map +1 -1
- package/dist/components/ui/data/editorial-calendar.js +291 -291
- package/dist/components/ui/data/editorial-calendar.js.map +1 -1
- package/dist/components/ui/data/filter-builder.cjs +1 -1
- package/dist/components/ui/data/filter-builder.cjs.map +1 -1
- package/dist/components/ui/data/filter-builder.js +1 -1
- package/dist/components/ui/data/filter-builder.js.map +1 -1
- package/dist/components/ui/feedback/empty-state.cjs +1 -1
- package/dist/components/ui/feedback/empty-state.cjs.map +1 -1
- package/dist/components/ui/feedback/empty-state.js +14 -14
- package/dist/components/ui/feedback/empty-state.js.map +1 -1
- package/dist/components/ui/feedback/toast.cjs +1 -1
- package/dist/components/ui/feedback/toast.cjs.map +1 -1
- package/dist/components/ui/feedback/toast.js +53 -22
- package/dist/components/ui/feedback/toast.js.map +1 -1
- package/dist/components/ui/forms/calendar.cjs +1 -1
- package/dist/components/ui/forms/calendar.cjs.map +1 -1
- package/dist/components/ui/forms/calendar.js +16 -16
- package/dist/components/ui/forms/calendar.js.map +1 -1
- package/dist/components/ui/forms/combobox.cjs +1 -1
- package/dist/components/ui/forms/combobox.cjs.map +1 -1
- package/dist/components/ui/forms/combobox.js +78 -76
- package/dist/components/ui/forms/combobox.js.map +1 -1
- package/dist/components/ui/forms/file-attachment-list.cjs +1 -1
- package/dist/components/ui/forms/file-attachment-list.cjs.map +1 -1
- package/dist/components/ui/forms/file-attachment-list.js +4 -4
- package/dist/components/ui/forms/file-attachment-list.js.map +1 -1
- package/dist/components/ui/forms/file-upload-zone.cjs +2 -2
- package/dist/components/ui/forms/file-upload-zone.cjs.map +1 -1
- package/dist/components/ui/forms/file-upload-zone.js +55 -49
- package/dist/components/ui/forms/file-upload-zone.js.map +1 -1
- package/dist/components/ui/forms/form.cjs +1 -1
- package/dist/components/ui/forms/form.cjs.map +1 -1
- package/dist/components/ui/forms/form.js +11 -11
- package/dist/components/ui/forms/form.js.map +1 -1
- package/dist/components/ui/forms/input-validation.cjs +1 -1
- package/dist/components/ui/forms/input-validation.cjs.map +1 -1
- package/dist/components/ui/forms/input-validation.js +20 -20
- package/dist/components/ui/forms/input-validation.js.map +1 -1
- package/dist/components/ui/forms/multi-select.cjs +1 -1
- package/dist/components/ui/forms/multi-select.cjs.map +1 -1
- package/dist/components/ui/forms/multi-select.js +69 -67
- package/dist/components/ui/forms/multi-select.js.map +1 -1
- package/dist/components/ui/forms/radio-group.cjs +1 -1
- package/dist/components/ui/forms/radio-group.cjs.map +1 -1
- package/dist/components/ui/forms/radio-group.js +19 -19
- package/dist/components/ui/forms/radio-group.js.map +1 -1
- package/dist/components/ui/forms/social-button.cjs +1 -1
- package/dist/components/ui/forms/social-button.cjs.map +1 -1
- package/dist/components/ui/forms/social-button.js +6 -6
- package/dist/components/ui/forms/social-button.js.map +1 -1
- package/dist/components/ui/forms/toggle.cjs +1 -1
- package/dist/components/ui/forms/toggle.cjs.map +1 -1
- package/dist/components/ui/forms/toggle.js +7 -7
- package/dist/components/ui/forms/toggle.js.map +1 -1
- package/dist/components/ui/navigation/navigation-menu.cjs +1 -1
- package/dist/components/ui/navigation/navigation-menu.cjs.map +1 -1
- package/dist/components/ui/navigation/navigation-menu.js +14 -14
- package/dist/components/ui/navigation/navigation-menu.js.map +1 -1
- package/dist/components/ui/navigation/sidebar.cjs +1 -1
- package/dist/components/ui/navigation/sidebar.cjs.map +1 -1
- package/dist/components/ui/navigation/sidebar.js +44 -44
- package/dist/components/ui/navigation/sidebar.js.map +1 -1
- package/dist/components/ui/overlays/context-menu.cjs +1 -1
- package/dist/components/ui/overlays/context-menu.cjs.map +1 -1
- package/dist/components/ui/overlays/context-menu.js +1 -1
- package/dist/components/ui/overlays/context-menu.js.map +1 -1
- package/dist/components/ui/overlays/dropdown-menu.cjs +1 -1
- package/dist/components/ui/overlays/dropdown-menu.cjs.map +1 -1
- package/dist/components/ui/overlays/dropdown-menu.js +5 -5
- package/dist/components/ui/overlays/dropdown-menu.js.map +1 -1
- package/dist/components/ui/overlays/menubar.cjs +1 -1
- package/dist/components/ui/overlays/menubar.cjs.map +1 -1
- package/dist/components/ui/overlays/menubar.js +29 -29
- package/dist/components/ui/overlays/menubar.js.map +1 -1
- package/dist/components/ui/overlays/tooltip.cjs +1 -1
- package/dist/components/ui/overlays/tooltip.cjs.map +1 -1
- package/dist/components/ui/overlays/tooltip.js +12 -12
- package/dist/components/ui/overlays/tooltip.js.map +1 -1
- package/dist/components/ui/primitives/avatar.cjs +1 -1
- package/dist/components/ui/primitives/avatar.cjs.map +1 -1
- package/dist/components/ui/primitives/avatar.js +20 -27
- package/dist/components/ui/primitives/avatar.js.map +1 -1
- package/dist/components/ui/primitives/badge.cjs +1 -1
- package/dist/components/ui/primitives/badge.cjs.map +1 -1
- package/dist/components/ui/primitives/badge.js +13 -13
- package/dist/components/ui/primitives/badge.js.map +1 -1
- package/dist/components/ui/primitives/button.cjs +1 -1
- package/dist/components/ui/primitives/button.cjs.map +1 -1
- package/dist/components/ui/primitives/button.js +11 -8
- package/dist/components/ui/primitives/button.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +34 -35
- package/dist/index.js.map +1 -1
- package/dist/preset.css +1 -2
- package/dist/toast-theme.css +100 -64
- package/dist/tokens.css +59 -159
- package/package.json +5 -3
- package/scripts/check-colors.mjs +208 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-builder.js","sources":["../../../../src/components/ui/data/filter-builder.tsx"],"sourcesContent":["import React from \"react\";\nimport { cn } from \"../utils\";\nimport { Button } from \"../primitives/button\";\nimport { Plus, X, Search } from \"lucide-react\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../overlays/popover\";\nimport { Badge } from \"../primitives/badge\";\nimport { Input } from \"../forms/input\";\nimport { Checkbox } from \"../forms/checkbox\";\nimport { Label } from \"../primitives/label\";\nimport { DatePicker } from \"../forms/date-picker\";\n\nexport interface FilterCondition {\n id: string;\n field: string;\n operator: string;\n value: string | string[]; // Suporta multi-seleção\n}\n\n/** Item já achatado da lista de valores, com a marcação de hierarquia preservada */\ninterface ListItem {\n value: string;\n label: string;\n isHeader: boolean;\n selecionavel: boolean;\n isFilho?: boolean;\n}\n\nexport interface FilterOptionGroup {\n label: string;\n /** Quando presente, o cabeçalho do grupo também é selecionável */\n value?: string;\n options: { value: string; label: string }[];\n}\n\nexport interface FilterField {\n value: string;\n label: string;\n type?: \"text\" | \"number\" | \"select\" | \"date\";\n options?: { value: string; label: string }[]; // Para campos select\n /**\n * Opções agrupadas hierarquicamente — mesma forma usada por Combobox e MultiSelect.\n * Use `options` OU `groups`. O cabeçalho só é selecionável quando tem `value`.\n */\n groups?: FilterOptionGroup[];\n multiSelect?: boolean; // Habilitar multi-seleção para este campo\n}\n\nexport interface FilterBuilderProps {\n conditions: FilterCondition[];\n onConditionsChange: (conditions: FilterCondition[]) => void;\n fields: FilterField[];\n className?: string;\n}\n\n// Definições de operadores com suporte a multi-seleção\nconst OPERATORS = [\n { value: \"is\", label: \"é\", multiSelect: false },\n { value: \"is_not\", label: \"não é\", multiSelect: false },\n { value: \"is_any_of\", label: \"é qualquer um de\", multiSelect: true },\n { value: \"is_none_of\", label: \"não é nenhum de\", multiSelect: true },\n { value: \"contains\", label: \"contém\", multiSelect: false },\n { value: \"does_not_contain\", label: \"não contém\", multiSelect: false },\n { value: \"greater_than\", label: \"maior que\", multiSelect: false },\n { value: \"greater_than_or_equal\", label: \"maior ou igual a\", multiSelect: false },\n { value: \"less_than\", label: \"menor que\", multiSelect: false },\n { value: \"less_than_or_equal\", label: \"menor ou igual a\", multiSelect: false },\n { value: \"is_empty\", label: \"está vazio\", multiSelect: false },\n { value: \"is_not_empty\", label: \"não está vazio\", multiSelect: false },\n];\n\nexport function FilterBuilder({\n conditions,\n onConditionsChange,\n fields,\n className,\n}: FilterBuilderProps) {\n const addCondition = () => {\n const newCondition: FilterCondition = {\n id: Math.random().toString(36).substr(2, 9),\n field: fields[0]?.value || \"\",\n operator: \"is\",\n value: \"\",\n };\n onConditionsChange([...conditions, newCondition]);\n };\n\n const removeCondition = (id: string) => {\n onConditionsChange(conditions.filter((c) => c.id !== id));\n };\n\n const updateCondition = (id: string, updates: Partial<FilterCondition>) => {\n onConditionsChange(\n conditions.map((c) => (c.id === id ? { ...c, ...updates } : c))\n );\n };\n\n return (\n <div className={cn(\"space-y-3\", className)}>\n {/* Conditions */}\n {conditions.length === 0 ? (\n <div className=\"text-center py-8 text-muted-foreground text-sm\">\n Nenhuma condição de filtro. Clique em \"Adicionar condição\" para começar.\n </div>\n ) : (\n conditions.map((condition, index) => (\n <ConditionRow\n key={condition.id}\n condition={condition}\n fields={fields}\n index={index}\n onUpdate={(updates) => updateCondition(condition.id, updates)}\n onRemove={() => removeCondition(condition.id)}\n />\n ))\n )}\n\n {/* Add Condition Button */}\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={addCondition}\n className=\"gap-2\"\n >\n <Plus className=\"h-4 w-4\" />\n Adicionar condição\n </Button>\n </div>\n );\n}\n\ninterface ConditionRowProps {\n condition: FilterCondition;\n fields: FilterField[];\n index: number;\n onUpdate: (updates: Partial<FilterCondition>) => void;\n onRemove: () => void;\n}\n\nfunction ConditionRow({\n condition,\n fields,\n index,\n onUpdate,\n onRemove,\n}: ConditionRowProps) {\n const selectedField = fields.find((f) => f.value === condition.field);\n const selectedOperator = OPERATORS.find((op) => op.value === condition.operator);\n \n // Multi-select enabled if field has multiSelect: true OR operator requires it\n const isMultiSelect = selectedField?.multiSelect || selectedOperator?.multiSelect || false;\n const needsValue = ![\"is_empty\", \"is_not_empty\"].includes(condition.operator);\n\n // Search state for filtering options\n const [searchTerm, setSearchTerm] = React.useState(\"\");\n\n // Lista achatada com metadados de hierarquia — unifica `options` e `groups` num único\n // fluxo de renderização, preservando a marcação de cabeçalho e de filho.\n const itensLista = React.useMemo<ListItem[]>(() => {\n if (selectedField?.groups) {\n return selectedField.groups.flatMap((group) => [\n {\n value: group.value ?? `__label__${group.label}`,\n label: group.label,\n isHeader: true,\n selecionavel: Boolean(group.value),\n },\n ...group.options.map((o) => ({\n value: o.value,\n label: o.label,\n isHeader: false,\n selecionavel: true,\n isFilho: true,\n })),\n ]);\n }\n return (selectedField?.options ?? []).map((o) => ({\n value: o.value,\n label: o.label,\n isHeader: false,\n selecionavel: true,\n }));\n }, [selectedField?.options, selectedField?.groups]);\n\n // Busca preservando a hierarquia: casar o cabeçalho mantém todos os seus filhos;\n // casar um filho mantém o cabeçalho como contexto.\n const itensFiltrados = React.useMemo(() => {\n if (!searchTerm) return itensLista;\n\n const termo = searchTerm.toLowerCase();\n const casa = (i: ListItem) =>\n i.label.toLowerCase().includes(termo) || i.value.toLowerCase().includes(termo);\n\n if (!selectedField?.groups) return itensLista.filter(casa);\n\n const resultado: ListItem[] = [];\n let header: ListItem | null = null;\n let headerCasou = false;\n let headerIncluido = false;\n\n for (const item of itensLista) {\n if (item.isHeader) {\n header = item;\n headerCasou = casa(item);\n headerIncluido = false;\n if (headerCasou) {\n resultado.push(item);\n headerIncluido = true;\n }\n continue;\n }\n if (headerCasou || casa(item)) {\n if (!headerIncluido && header) {\n resultado.push(header);\n headerIncluido = true;\n }\n resultado.push(item);\n }\n }\n return resultado;\n }, [itensLista, searchTerm, selectedField?.groups]);\n\n // Convert value to array for multi-select\n const valueAsArray = Array.isArray(condition.value)\n ? condition.value\n : condition.value\n ? [condition.value]\n : [];\n\n const toggleValue = (val: string) => {\n if (!isMultiSelect) {\n onUpdate({ value: val });\n return;\n }\n\n const currentValues = Array.isArray(condition.value) ? condition.value : [];\n const newValues = currentValues.includes(val)\n ? currentValues.filter((v) => v !== val)\n : [...currentValues, val];\n onUpdate({ value: newValues });\n };\n\n const removeValue = (val: string) => {\n if (!isMultiSelect) return;\n const currentValues = Array.isArray(condition.value) ? condition.value : [];\n onUpdate({ value: currentValues.filter((v) => v !== val) });\n };\n\n return (\n <div className=\"flex items-start gap-2 group\">\n {/* Index */}\n <div className=\"flex items-center h-9 px-2 text-sm text-muted-foreground\">\n {index === 0 ? \"Onde\" : \"E\"}\n </div>\n\n {/* Condition Display */}\n <div className=\"flex-1 flex items-center gap-2 flex-wrap p-2 border rounded-lg bg-background\">\n {/* Field Selector */}\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 font-normal hover:bg-muted\"\n >\n {selectedField?.label || \"Selecionar campo\"}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[200px] p-2\" align=\"start\">\n <div className=\"space-y-1\">\n {fields.map((field) => (\n <Button\n key={field.value}\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n \"w-full justify-start\",\n condition.field === field.value && \"bg-muted\"\n )}\n onClick={() => \n onUpdate({ \n field: field.value, \n value: field.multiSelect ? [] : \"\" \n })\n }\n >\n {field.label}\n </Button>\n ))}\n </div>\n </PopoverContent>\n </Popover>\n\n {/* Operator Selector */}\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 font-normal hover:bg-muted text-muted-foreground\"\n >\n {selectedOperator?.label || \"is\"}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[200px] p-2\" align=\"start\">\n <div className=\"space-y-1\">\n {OPERATORS.map((op) => (\n <Button\n key={op.value}\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n \"w-full justify-start\",\n condition.operator === op.value && \"bg-muted\"\n )}\n onClick={() =>\n onUpdate({\n operator: op.value,\n value: op.multiSelect ? [] : \"\",\n })\n }\n >\n {op.label}\n </Button>\n ))}\n </div>\n </PopoverContent>\n </Popover>\n\n {/* Value Selector/Input */}\n {needsValue && (\n <>\n {selectedField?.options || selectedField?.groups ? (\n // Select field with options\n <Popover onOpenChange={(open) => !open && setSearchTerm(\"\")}>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 font-normal hover:bg-muted\"\n >\n {isMultiSelect && valueAsArray.length > 0 ? (\n <span className=\"flex items-center gap-1\">\n {valueAsArray.length} selecionado{valueAsArray.length > 1 ? 's' : ''}\n </span>\n ) : !isMultiSelect && condition.value ? (\n itensLista.find((opt) => opt.value === condition.value)?.label ||\n \"Selecionar valor\"\n ) : (\n \"Selecionar valor\"\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-80 max-w-[calc(100vw-2rem)] p-3\"\n align=\"start\"\n collisionPadding={8}\n >\n <div className=\"space-y-2\">\n <Label className=\"text-xs text-muted-foreground\">\n {isMultiSelect ? \"Selecionar valores\" : \"Selecionar valor\"}\n </Label>\n \n {/* Search Input */}\n <div className=\"relative\">\n <Search className=\"absolute left-2 top-2.5 h-4 w-4 text-muted-foreground\" />\n <Input\n type=\"text\"\n placeholder=\"Buscar...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n className=\"h-9 pl-8\"\n autoFocus\n />\n </div>\n \n {/* Filtered Options */}\n <div className=\"space-y-2 max-h-[320px] overflow-y-auto overflow-x-hidden\">\n {(() => {\n if (itensFiltrados.length === 0) {\n return (\n <div className=\"text-sm text-muted-foreground text-center py-4\">\n Nenhum resultado encontrado\n </div>\n );\n }\n\n return itensFiltrados.map((option) => {\n // Cabeçalho de grupo sem `value` — apenas rótulo visual\n if (option.isHeader && !option.selecionavel) {\n return (\n <div\n key={option.value}\n title={option.label}\n className=\"truncate pt-1 text-xs font-semibold uppercase tracking-wide text-muted-foreground\"\n >\n {option.label}\n </div>\n );\n }\n\n const isSelected = isMultiSelect\n ? valueAsArray.includes(option.value)\n : condition.value === option.value;\n\n return (\n <div\n key={option.value}\n className={cn(\n \"flex min-w-0 items-center space-x-2\",\n option.isFilho && \"pl-4\"\n )}\n >\n {isMultiSelect ? (\n <>\n <Checkbox\n id={`${condition.id}-${option.value}`}\n checked={isSelected}\n onCheckedChange={() =>\n toggleValue(option.value)\n }\n />\n <label\n htmlFor={`${condition.id}-${option.value}`}\n title={option.label}\n className={cn(\n \"min-w-0 flex-1 cursor-pointer truncate text-sm\",\n option.isHeader && \"font-semibold uppercase tracking-wide\"\n )}\n >\n {option.label}\n </label>\n </>\n ) : (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n title={option.label}\n className={cn(\n \"w-full min-w-0 justify-start\",\n option.isHeader && \"font-semibold uppercase tracking-wide\",\n isSelected && \"bg-muted\"\n )}\n onClick={() => onUpdate({ value: option.value })}\n >\n <span className=\"truncate\">{option.label}</span>\n </Button>\n )}\n </div>\n );\n });\n })()}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n ) : selectedField?.type === \"date\" ? (\n // Date picker\n <DatePicker\n value={condition.value ? new Date(condition.value + 'T00:00:00') : undefined}\n onChange={(date) => {\n if (date) {\n // Formato ISO (YYYY-MM-DD)\n const isoDate = date.toISOString().split('T')[0];\n onUpdate({ value: isoDate });\n } else {\n onUpdate({ value: '' });\n }\n }}\n placeholder=\"Selecionar data\"\n className=\"h-7 text-sm\"\n />\n ) : (\n // Text/Number input\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 font-normal hover:bg-muted max-w-[200px] truncate\"\n >\n {condition.value || \"Inserir valor\"}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[240px] p-3\" align=\"start\">\n <div className=\"space-y-2\">\n <Label className=\"text-xs text-muted-foreground\">\n Inserir valor\n </Label>\n <Input\n type={selectedField?.type === \"number\" ? \"number\" : \"text\"}\n value={\n Array.isArray(condition.value) ? \"\" : condition.value\n }\n onChange={(e) => onUpdate({ value: e.target.value })}\n placeholder=\"Digite o valor...\"\n autoFocus\n />\n </div>\n </PopoverContent>\n </Popover>\n )}\n\n {/* Multi-select chips */}\n {isMultiSelect && valueAsArray.length > 0 && (\n <div className=\"flex items-center gap-1 flex-wrap\">\n {valueAsArray.map((val) => {\n // itensLista ja cobre `options` e `groups` (inclusive o cabecalho\n // selecionavel do grupo). Buscar so em `options` fazia o badge de um campo\n // hierarquico exibir o value cru — \"g-2\" no lugar do nome do grupo.\n const optionLabel =\n itensLista.find((item) => item.value === val)?.label || val;\n return (\n <Badge\n key={val}\n variant=\"secondary\"\n className=\"gap-1 h-6 text-xs\"\n >\n {optionLabel}\n <button\n type=\"button\"\n onClick={() => removeValue(val)}\n className=\"ml-1 rounded-sm hover:bg-muted p-0.5 transition-colors\"\n aria-label={`Remover ${optionLabel}`}\n >\n <X className=\"h-3 w-3\" />\n </button>\n </Badge>\n );\n })}\n </div>\n )}\n </>\n )}\n </div>\n\n {/* Remove Button */}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={onRemove}\n className=\"h-9 w-9 p-0 opacity-0 group-hover:opacity-100 transition-opacity\"\n aria-label=\"Remover condição\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n );\n}"],"names":["OPERATORS","FilterBuilder","conditions","onConditionsChange","fields","className","addCondition","newCondition","_a","removeCondition","id","c","updateCondition","updates","cn","jsx","condition","index","ConditionRow","jsxs","Button","Plus","onUpdate","onRemove","selectedField","f","selectedOperator","op","isMultiSelect","needsValue","searchTerm","setSearchTerm","React","itensLista","group","o","itensFiltrados","termo","casa","i","resultado","header","headerCasou","headerIncluido","item","valueAsArray","toggleValue","val","currentValues","newValues","v","removeValue","Popover","PopoverTrigger","PopoverContent","field","Fragment","open","opt","Label","Search","Input","option","isSelected","Checkbox","DatePicker","date","isoDate","optionLabel","Badge","X"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"filter-builder.js","sources":["../../../../src/components/ui/data/filter-builder.tsx"],"sourcesContent":["import React from \"react\";\nimport { cn } from \"../utils\";\nimport { Button } from \"../primitives/button\";\nimport { Plus, X, Search } from \"lucide-react\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../overlays/popover\";\nimport { Badge } from \"../primitives/badge\";\nimport { Input } from \"../forms/input\";\nimport { Checkbox } from \"../forms/checkbox\";\nimport { Label } from \"../primitives/label\";\nimport { DatePicker } from \"../forms/date-picker\";\n\nexport interface FilterCondition {\n id: string;\n field: string;\n operator: string;\n value: string | string[]; // Suporta multi-seleção\n}\n\n/** Item já achatado da lista de valores, com a marcação de hierarquia preservada */\ninterface ListItem {\n value: string;\n label: string;\n isHeader: boolean;\n selecionavel: boolean;\n isFilho?: boolean;\n}\n\nexport interface FilterOptionGroup {\n label: string;\n /** Quando presente, o cabeçalho do grupo também é selecionável */\n value?: string;\n options: { value: string; label: string }[];\n}\n\nexport interface FilterField {\n value: string;\n label: string;\n type?: \"text\" | \"number\" | \"select\" | \"date\";\n options?: { value: string; label: string }[]; // Para campos select\n /**\n * Opções agrupadas hierarquicamente — mesma forma usada por Combobox e MultiSelect.\n * Use `options` OU `groups`. O cabeçalho só é selecionável quando tem `value`.\n */\n groups?: FilterOptionGroup[];\n multiSelect?: boolean; // Habilitar multi-seleção para este campo\n}\n\nexport interface FilterBuilderProps {\n conditions: FilterCondition[];\n onConditionsChange: (conditions: FilterCondition[]) => void;\n fields: FilterField[];\n className?: string;\n}\n\n// Definições de operadores com suporte a multi-seleção\nconst OPERATORS = [\n { value: \"is\", label: \"é\", multiSelect: false },\n { value: \"is_not\", label: \"não é\", multiSelect: false },\n { value: \"is_any_of\", label: \"é qualquer um de\", multiSelect: true },\n { value: \"is_none_of\", label: \"não é nenhum de\", multiSelect: true },\n { value: \"contains\", label: \"contém\", multiSelect: false },\n { value: \"does_not_contain\", label: \"não contém\", multiSelect: false },\n { value: \"greater_than\", label: \"maior que\", multiSelect: false },\n { value: \"greater_than_or_equal\", label: \"maior ou igual a\", multiSelect: false },\n { value: \"less_than\", label: \"menor que\", multiSelect: false },\n { value: \"less_than_or_equal\", label: \"menor ou igual a\", multiSelect: false },\n { value: \"is_empty\", label: \"está vazio\", multiSelect: false },\n { value: \"is_not_empty\", label: \"não está vazio\", multiSelect: false },\n];\n\nexport function FilterBuilder({\n conditions,\n onConditionsChange,\n fields,\n className,\n}: FilterBuilderProps) {\n const addCondition = () => {\n const newCondition: FilterCondition = {\n id: Math.random().toString(36).substr(2, 9),\n field: fields[0]?.value || \"\",\n operator: \"is\",\n value: \"\",\n };\n onConditionsChange([...conditions, newCondition]);\n };\n\n const removeCondition = (id: string) => {\n onConditionsChange(conditions.filter((c) => c.id !== id));\n };\n\n const updateCondition = (id: string, updates: Partial<FilterCondition>) => {\n onConditionsChange(\n conditions.map((c) => (c.id === id ? { ...c, ...updates } : c))\n );\n };\n\n return (\n <div className={cn(\"space-y-3\", className)}>\n {/* Conditions */}\n {conditions.length === 0 ? (\n <div className=\"text-center py-8 text-muted-foreground text-sm\">\n Nenhuma condição de filtro. Clique em \"Adicionar condição\" para começar.\n </div>\n ) : (\n conditions.map((condition, index) => (\n <ConditionRow\n key={condition.id}\n condition={condition}\n fields={fields}\n index={index}\n onUpdate={(updates) => updateCondition(condition.id, updates)}\n onRemove={() => removeCondition(condition.id)}\n />\n ))\n )}\n\n {/* Add Condition Button */}\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={addCondition}\n className=\"gap-2\"\n >\n <Plus className=\"h-4 w-4\" />\n Adicionar condição\n </Button>\n </div>\n );\n}\n\ninterface ConditionRowProps {\n condition: FilterCondition;\n fields: FilterField[];\n index: number;\n onUpdate: (updates: Partial<FilterCondition>) => void;\n onRemove: () => void;\n}\n\nfunction ConditionRow({\n condition,\n fields,\n index,\n onUpdate,\n onRemove,\n}: ConditionRowProps) {\n const selectedField = fields.find((f) => f.value === condition.field);\n const selectedOperator = OPERATORS.find((op) => op.value === condition.operator);\n \n // Multi-select enabled if field has multiSelect: true OR operator requires it\n const isMultiSelect = selectedField?.multiSelect || selectedOperator?.multiSelect || false;\n const needsValue = ![\"is_empty\", \"is_not_empty\"].includes(condition.operator);\n\n // Search state for filtering options\n const [searchTerm, setSearchTerm] = React.useState(\"\");\n\n // Lista achatada com metadados de hierarquia — unifica `options` e `groups` num único\n // fluxo de renderização, preservando a marcação de cabeçalho e de filho.\n const itensLista = React.useMemo<ListItem[]>(() => {\n if (selectedField?.groups) {\n return selectedField.groups.flatMap((group) => [\n {\n value: group.value ?? `__label__${group.label}`,\n label: group.label,\n isHeader: true,\n selecionavel: Boolean(group.value),\n },\n ...group.options.map((o) => ({\n value: o.value,\n label: o.label,\n isHeader: false,\n selecionavel: true,\n isFilho: true,\n })),\n ]);\n }\n return (selectedField?.options ?? []).map((o) => ({\n value: o.value,\n label: o.label,\n isHeader: false,\n selecionavel: true,\n }));\n }, [selectedField?.options, selectedField?.groups]);\n\n // Busca preservando a hierarquia: casar o cabeçalho mantém todos os seus filhos;\n // casar um filho mantém o cabeçalho como contexto.\n const itensFiltrados = React.useMemo(() => {\n if (!searchTerm) return itensLista;\n\n const termo = searchTerm.toLowerCase();\n const casa = (i: ListItem) =>\n i.label.toLowerCase().includes(termo) || i.value.toLowerCase().includes(termo);\n\n if (!selectedField?.groups) return itensLista.filter(casa);\n\n const resultado: ListItem[] = [];\n let header: ListItem | null = null;\n let headerCasou = false;\n let headerIncluido = false;\n\n for (const item of itensLista) {\n if (item.isHeader) {\n header = item;\n headerCasou = casa(item);\n headerIncluido = false;\n if (headerCasou) {\n resultado.push(item);\n headerIncluido = true;\n }\n continue;\n }\n if (headerCasou || casa(item)) {\n if (!headerIncluido && header) {\n resultado.push(header);\n headerIncluido = true;\n }\n resultado.push(item);\n }\n }\n return resultado;\n }, [itensLista, searchTerm, selectedField?.groups]);\n\n // Convert value to array for multi-select\n const valueAsArray = Array.isArray(condition.value)\n ? condition.value\n : condition.value\n ? [condition.value]\n : [];\n\n const toggleValue = (val: string) => {\n if (!isMultiSelect) {\n onUpdate({ value: val });\n return;\n }\n\n const currentValues = Array.isArray(condition.value) ? condition.value : [];\n const newValues = currentValues.includes(val)\n ? currentValues.filter((v) => v !== val)\n : [...currentValues, val];\n onUpdate({ value: newValues });\n };\n\n const removeValue = (val: string) => {\n if (!isMultiSelect) return;\n const currentValues = Array.isArray(condition.value) ? condition.value : [];\n onUpdate({ value: currentValues.filter((v) => v !== val) });\n };\n\n return (\n <div className=\"flex items-start gap-2 group\">\n {/* Index */}\n <div className=\"flex items-center h-9 px-2 text-sm text-muted-foreground\">\n {index === 0 ? \"Onde\" : \"E\"}\n </div>\n\n {/* Condition Display */}\n <div className=\"flex-1 flex items-center gap-2 flex-wrap p-2 border rounded-lg bg-background\">\n {/* Field Selector */}\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 font-normal hover:bg-muted\"\n >\n {selectedField?.label || \"Selecionar campo\"}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[200px] p-2\" align=\"start\">\n <div className=\"space-y-1\">\n {fields.map((field) => (\n <Button\n key={field.value}\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n \"w-full justify-start\",\n condition.field === field.value && \"bg-muted\"\n )}\n onClick={() => \n onUpdate({ \n field: field.value, \n value: field.multiSelect ? [] : \"\" \n })\n }\n >\n {field.label}\n </Button>\n ))}\n </div>\n </PopoverContent>\n </Popover>\n\n {/* Operator Selector */}\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 font-normal hover:bg-muted text-muted-foreground\"\n >\n {selectedOperator?.label || \"is\"}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[200px] p-2\" align=\"start\">\n <div className=\"space-y-1\">\n {OPERATORS.map((op) => (\n <Button\n key={op.value}\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n \"w-full justify-start\",\n condition.operator === op.value && \"bg-muted\"\n )}\n onClick={() =>\n onUpdate({\n operator: op.value,\n value: op.multiSelect ? [] : \"\",\n })\n }\n >\n {op.label}\n </Button>\n ))}\n </div>\n </PopoverContent>\n </Popover>\n\n {/* Value Selector/Input */}\n {needsValue && (\n <>\n {selectedField?.options || selectedField?.groups ? (\n // Select field with options\n <Popover onOpenChange={(open) => !open && setSearchTerm(\"\")}>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 font-normal hover:bg-muted\"\n >\n {isMultiSelect && valueAsArray.length > 0 ? (\n <span className=\"flex items-center gap-1\">\n {valueAsArray.length} selecionado{valueAsArray.length > 1 ? 's' : ''}\n </span>\n ) : !isMultiSelect && condition.value ? (\n itensLista.find((opt) => opt.value === condition.value)?.label ||\n \"Selecionar valor\"\n ) : (\n \"Selecionar valor\"\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-80 max-w-[calc(100vw-2rem)] p-3\"\n align=\"start\"\n collisionPadding={8}\n >\n <div className=\"space-y-2\">\n <Label className=\"text-xs text-muted-foreground\">\n {isMultiSelect ? \"Selecionar valores\" : \"Selecionar valor\"}\n </Label>\n \n {/* Search Input */}\n <div className=\"relative\">\n <Search className=\"absolute left-2 top-2.5 h-4 w-4 text-muted-foreground\" />\n <Input\n type=\"text\"\n placeholder=\"Buscar...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n className=\"h-9 pl-8\"\n autoFocus\n />\n </div>\n \n {/* Filtered Options */}\n <div className=\"space-y-2 max-h-[320px] overflow-y-auto overflow-x-hidden\">\n {(() => {\n if (itensFiltrados.length === 0) {\n return (\n <div className=\"text-sm text-muted-foreground text-center py-4\">\n Nenhum resultado encontrado\n </div>\n );\n }\n\n return itensFiltrados.map((option) => {\n // Cabeçalho de grupo sem `value` — apenas rótulo visual\n if (option.isHeader && !option.selecionavel) {\n return (\n <div\n key={option.value}\n title={option.label}\n className=\"truncate pt-1 text-xs font-semibold uppercase tracking-wide text-muted-foreground\"\n >\n {option.label}\n </div>\n );\n }\n\n const isSelected = isMultiSelect\n ? valueAsArray.includes(option.value)\n : condition.value === option.value;\n\n return (\n <div\n key={option.value}\n className={cn(\n \"flex min-w-0 items-center space-x-2\",\n option.isFilho && \"pl-4\"\n )}\n >\n {isMultiSelect ? (\n <>\n <Checkbox\n id={`${condition.id}-${option.value}`}\n checked={isSelected}\n onCheckedChange={() =>\n toggleValue(option.value)\n }\n />\n <label\n htmlFor={`${condition.id}-${option.value}`}\n title={option.label}\n className={cn(\n \"min-w-0 flex-1 cursor-pointer truncate text-sm\",\n option.isHeader && \"font-semibold uppercase tracking-wide\"\n )}\n >\n {option.label}\n </label>\n </>\n ) : (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n title={option.label}\n className={cn(\n \"w-full min-w-0 justify-start\",\n option.isHeader && \"font-semibold uppercase tracking-wide\",\n isSelected && \"bg-muted\"\n )}\n onClick={() => onUpdate({ value: option.value })}\n >\n <span className=\"truncate\">{option.label}</span>\n </Button>\n )}\n </div>\n );\n });\n })()}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n ) : selectedField?.type === \"date\" ? (\n // Date picker\n <DatePicker\n value={condition.value ? new Date(condition.value + 'T00:00:00') : undefined}\n onChange={(date) => {\n if (date) {\n // Formato ISO (YYYY-MM-DD)\n const isoDate = date.toISOString().split('T')[0];\n onUpdate({ value: isoDate });\n } else {\n onUpdate({ value: '' });\n }\n }}\n placeholder=\"Selecionar data\"\n className=\"h-7 text-sm\"\n />\n ) : (\n // Text/Number input\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 font-normal hover:bg-muted max-w-[200px] truncate\"\n >\n {condition.value || \"Inserir valor\"}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[240px] p-3\" align=\"start\">\n <div className=\"space-y-2\">\n <Label className=\"text-xs text-muted-foreground\">\n Inserir valor\n </Label>\n <Input\n type={selectedField?.type === \"number\" ? \"number\" : \"text\"}\n value={\n Array.isArray(condition.value) ? \"\" : condition.value\n }\n onChange={(e) => onUpdate({ value: e.target.value })}\n placeholder=\"Digite o valor...\"\n autoFocus\n />\n </div>\n </PopoverContent>\n </Popover>\n )}\n\n {/* Multi-select chips */}\n {isMultiSelect && valueAsArray.length > 0 && (\n <div className=\"flex items-center gap-1 flex-wrap\">\n {valueAsArray.map((val) => {\n // itensLista ja cobre `options` e `groups` (inclusive o cabecalho\n // selecionavel do grupo). Buscar so em `options` fazia o badge de um campo\n // hierarquico exibir o value cru — \"g-2\" no lugar do nome do grupo.\n const optionLabel =\n itensLista.find((item) => item.value === val)?.label || val;\n return (\n <Badge\n key={val}\n variant=\"secondary\"\n className=\"gap-1 h-6 text-xs\"\n >\n {optionLabel}\n <button\n type=\"button\"\n onClick={() => removeValue(val)}\n className=\"ml-1 rounded-sm hover:bg-muted p-0.5 transition-colors\"\n aria-label={`Remover ${optionLabel}`}\n >\n <X className=\"h-3 w-3\" />\n </button>\n </Badge>\n );\n })}\n </div>\n )}\n </>\n )}\n </div>\n\n {/* Remove Button */}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={onRemove}\n className=\"h-9 w-9 p-0 opacity-100 md:opacity-0 md:group-hover:opacity-100 md:group-focus-within:opacity-100 transition-opacity\"\n aria-label=\"Remover condição\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n );\n}"],"names":["OPERATORS","FilterBuilder","conditions","onConditionsChange","fields","className","addCondition","newCondition","_a","removeCondition","id","c","updateCondition","updates","cn","jsx","condition","index","ConditionRow","jsxs","Button","Plus","onUpdate","onRemove","selectedField","f","selectedOperator","op","isMultiSelect","needsValue","searchTerm","setSearchTerm","React","itensLista","group","o","itensFiltrados","termo","casa","i","resultado","header","headerCasou","headerIncluido","item","valueAsArray","toggleValue","val","currentValues","newValues","v","removeValue","Popover","PopoverTrigger","PopoverContent","field","Fragment","open","opt","Label","Search","Input","option","isSelected","Checkbox","DatePicker","date","isoDate","optionLabel","Badge","X"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),i=require("../primitives/button.cjs"),l=require("../utils.cjs"),x={"first-use":"bg-primary/8 text-primary",cleared:"bg-success/10 text-success-emphasis","no-results":"bg-muted text-muted-foreground",error:"bg-destructive/10 text-destructive-emphasis"};function m({icon:r,illustration:a,title:n,description:c,variant:u="first-use",primaryAction:t,secondaryAction:s,className:d}){return e.jsxs("div",{className:l.cn("flex flex-col items-center justify-center gap-4 py-12 px-6 text-center",d),role:"status","aria-live":"polite",children:[a?e.jsx("img",{src:a,alt:"",className:"w-32 h-32 object-contain","aria-hidden":"true"}):r?e.jsx("div",{className:l.cn("flex size-16 items-center justify-center rounded-2xl",x[u]),"aria-hidden":"true",children:e.jsx(r,{className:"size-8"})}):null,e.jsxs("div",{className:"max-w-sm space-y-1.5",children:[e.jsx("h3",{className:"text-base font-semibold leading-snug text-foreground",children:n}),e.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:c})]}),(t||s)&&e.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-3 pt-1",children:[t&&e.jsx(i.Button,{variant:t.variant??"default",onClick:t.onClick,children:t.label}),s&&e.jsx(i.Button,{variant:s.variant??"outline",onClick:s.onClick,children:s.label})]})]})}exports.EmptyState=m;
|
|
2
2
|
//# sourceMappingURL=empty-state.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"empty-state.cjs","sources":["../../../../src/components/ui/feedback/empty-state.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { type LucideIcon } from \"lucide-react\";\n\nimport { Button } from \"../primitives/button\";\nimport { cn } from \"../utils\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Tipos\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type EmptyStateVariant =\n | \"first-use\" // Usuário nunca usou — convide à primeira ação\n | \"cleared\" // Usuário esvaziou / completou tudo — celebre\n | \"no-results\" // Busca ou filtro sem resultados — oriente a ajustar\n | \"error\"; // Falha ao carregar dados — explique e dê saída\n\nexport interface EmptyStateAction {\n label: string;\n onClick: () => void;\n /** @default \"default\" */\n variant?: React.ComponentProps<typeof Button>[\"variant\"];\n}\n\nexport interface EmptyStateProps {\n /** Ícone principal. Prefira ícones do lucide-react com semântica relacionada ao contexto. */\n icon?: LucideIcon;\n /** Ilustração PNG do design system (alternativa ao icon). Precede o icon se ambos forem fornecidos. */\n illustration?: string;\n /** Título curto e orientado à situação do usuário. */\n title: string;\n /** Descrição que explica o valor da funcionalidade e o próximo passo. */\n description: string;\n /** Variante semântica do empty state. Controla o estilo do ícone. */\n variant?: EmptyStateVariant;\n /** Ação primária — botão principal de CTA. */\n primaryAction?: EmptyStateAction;\n /** Ação secundária — alternativa ou link de ajuda. */\n secondaryAction?: EmptyStateAction;\n className?: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Estilos por variante\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst iconContainerVariants: Record<EmptyStateVariant, string> = {\n \"first-use\": \"bg-primary/8 text-primary\",\n \"cleared\": \"bg-success/10 text-success\",\n \"no-results\": \"bg-muted text-muted-foreground\",\n \"error\": \"bg-destructive/10 text-destructive\",\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Componente\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * EmptyState — Estado vazio padronizado do iClips.\n *\n * Age como \"mentor\" (arquétipo Herói): nunca exibe uma tela em branco nem\n * culpa o usuário. Em vez disso, explica o contexto e convida à ação.\n *\n * Variantes:\n * - **first-use**: Primeira visita ao módulo. Foco em benefício + CTA.\n * - **cleared**: Usuário concluiu ou limpou tudo. Tom celebratório.\n * - **no-results**: Busca/filtro sem retorno. Oriente a ajustar a busca.\n * - **error**: Falha de carregamento. Explique e dê uma saída clara.\n *\n * @example Com ícone Lucide\n * <EmptyState\n * variant=\"first-use\"\n * icon={FolderOpen}\n * title=\"Seu primeiro projeto está esperando por você\"\n * description=\"Centralize jobs, prazos e equipe em um único lugar.\"\n * primaryAction={{ label: \"Criar Primeiro Projeto\", onClick: handleCreate }}\n * />\n * \n * @example Com ilustração PNG\n * <EmptyState\n * variant=\"first-use\"\n * illustration=\"/illustrations/contract-agreement.png\"\n * title=\"Nenhum contrato cadastrado\"\n * description=\"Crie contratos para gerenciar seus empenhos.\"\n * primaryAction={{ label: \"Criar Contrato\", onClick: handleCreate }}\n * />\n */\nexport function EmptyState({\n icon: Icon,\n illustration,\n title,\n description,\n variant = \"first-use\",\n primaryAction,\n secondaryAction,\n className,\n}: EmptyStateProps) {\n return (\n <div\n className={cn(\n \"flex flex-col items-center justify-center gap-4 py-12 px-6 text-center\",\n className,\n )}\n role=\"status\"\n aria-live=\"polite\"\n >\n {/* Ilustração PNG ou Ícone */}\n {illustration ? (\n <img\n src={illustration}\n alt=\"\"\n className=\"w-32 h-32 object-contain\"\n aria-hidden=\"true\"\n />\n ) : Icon ? (\n <div\n className={cn(\n \"flex size-16 items-center justify-center rounded-2xl\",\n iconContainerVariants[variant],\n )}\n aria-hidden=\"true\"\n >\n <Icon className=\"size-8\" />\n </div>\n ) : null}\n\n {/* Texto */}\n <div className=\"max-w-sm space-y-1.5\">\n <h3 className=\"text-base font-semibold leading-snug text-foreground\">\n {title}\n </h3>\n <p className=\"text-sm text-muted-foreground leading-relaxed\">\n {description}\n </p>\n </div>\n\n {/* Ações */}\n {(primaryAction || secondaryAction) && (\n <div className=\"flex flex-wrap items-center justify-center gap-3 pt-1\">\n {primaryAction && (\n <Button\n variant={primaryAction.variant ?? \"default\"}\n onClick={primaryAction.onClick}\n >\n {primaryAction.label}\n </Button>\n )}\n {secondaryAction && (\n <Button\n variant={secondaryAction.variant ?? \"outline\"}\n onClick={secondaryAction.onClick}\n >\n {secondaryAction.label}\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"names":["iconContainerVariants","EmptyState","Icon","illustration","title","description","variant","primaryAction","secondaryAction","className","jsxs","cn","jsx","Button"],"mappings":"qLA6CMA,EAA2D,CAC/D,YAAc,4BACd,QAAc,
|
|
1
|
+
{"version":3,"file":"empty-state.cjs","sources":["../../../../src/components/ui/feedback/empty-state.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { type LucideIcon } from \"lucide-react\";\n\nimport { Button } from \"../primitives/button\";\nimport { cn } from \"../utils\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Tipos\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type EmptyStateVariant =\n | \"first-use\" // Usuário nunca usou — convide à primeira ação\n | \"cleared\" // Usuário esvaziou / completou tudo — celebre\n | \"no-results\" // Busca ou filtro sem resultados — oriente a ajustar\n | \"error\"; // Falha ao carregar dados — explique e dê saída\n\nexport interface EmptyStateAction {\n label: string;\n onClick: () => void;\n /** @default \"default\" */\n variant?: React.ComponentProps<typeof Button>[\"variant\"];\n}\n\nexport interface EmptyStateProps {\n /** Ícone principal. Prefira ícones do lucide-react com semântica relacionada ao contexto. */\n icon?: LucideIcon;\n /** Ilustração PNG do design system (alternativa ao icon). Precede o icon se ambos forem fornecidos. */\n illustration?: string;\n /** Título curto e orientado à situação do usuário. */\n title: string;\n /** Descrição que explica o valor da funcionalidade e o próximo passo. */\n description: string;\n /** Variante semântica do empty state. Controla o estilo do ícone. */\n variant?: EmptyStateVariant;\n /** Ação primária — botão principal de CTA. */\n primaryAction?: EmptyStateAction;\n /** Ação secundária — alternativa ou link de ajuda. */\n secondaryAction?: EmptyStateAction;\n className?: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Estilos por variante\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst iconContainerVariants: Record<EmptyStateVariant, string> = {\n \"first-use\": \"bg-primary/8 text-primary\",\n \"cleared\": \"bg-success/10 text-success-emphasis\",\n \"no-results\": \"bg-muted text-muted-foreground\",\n \"error\": \"bg-destructive/10 text-destructive-emphasis\",\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Componente\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * EmptyState — Estado vazio padronizado do iClips.\n *\n * Age como \"mentor\" (arquétipo Herói): nunca exibe uma tela em branco nem\n * culpa o usuário. Em vez disso, explica o contexto e convida à ação.\n *\n * Variantes:\n * - **first-use**: Primeira visita ao módulo. Foco em benefício + CTA.\n * - **cleared**: Usuário concluiu ou limpou tudo. Tom celebratório.\n * - **no-results**: Busca/filtro sem retorno. Oriente a ajustar a busca.\n * - **error**: Falha de carregamento. Explique e dê uma saída clara.\n *\n * @example Com ícone Lucide\n * <EmptyState\n * variant=\"first-use\"\n * icon={FolderOpen}\n * title=\"Seu primeiro projeto está esperando por você\"\n * description=\"Centralize jobs, prazos e equipe em um único lugar.\"\n * primaryAction={{ label: \"Criar Primeiro Projeto\", onClick: handleCreate }}\n * />\n * \n * @example Com ilustração PNG\n * <EmptyState\n * variant=\"first-use\"\n * illustration=\"/illustrations/contract-agreement.png\"\n * title=\"Nenhum contrato cadastrado\"\n * description=\"Crie contratos para gerenciar seus empenhos.\"\n * primaryAction={{ label: \"Criar Contrato\", onClick: handleCreate }}\n * />\n */\nexport function EmptyState({\n icon: Icon,\n illustration,\n title,\n description,\n variant = \"first-use\",\n primaryAction,\n secondaryAction,\n className,\n}: EmptyStateProps) {\n return (\n <div\n className={cn(\n \"flex flex-col items-center justify-center gap-4 py-12 px-6 text-center\",\n className,\n )}\n role=\"status\"\n aria-live=\"polite\"\n >\n {/* Ilustração PNG ou Ícone */}\n {illustration ? (\n <img\n src={illustration}\n alt=\"\"\n className=\"w-32 h-32 object-contain\"\n aria-hidden=\"true\"\n />\n ) : Icon ? (\n <div\n className={cn(\n \"flex size-16 items-center justify-center rounded-2xl\",\n iconContainerVariants[variant],\n )}\n aria-hidden=\"true\"\n >\n <Icon className=\"size-8\" />\n </div>\n ) : null}\n\n {/* Texto */}\n <div className=\"max-w-sm space-y-1.5\">\n <h3 className=\"text-base font-semibold leading-snug text-foreground\">\n {title}\n </h3>\n <p className=\"text-sm text-muted-foreground leading-relaxed\">\n {description}\n </p>\n </div>\n\n {/* Ações */}\n {(primaryAction || secondaryAction) && (\n <div className=\"flex flex-wrap items-center justify-center gap-3 pt-1\">\n {primaryAction && (\n <Button\n variant={primaryAction.variant ?? \"default\"}\n onClick={primaryAction.onClick}\n >\n {primaryAction.label}\n </Button>\n )}\n {secondaryAction && (\n <Button\n variant={secondaryAction.variant ?? \"outline\"}\n onClick={secondaryAction.onClick}\n >\n {secondaryAction.label}\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"names":["iconContainerVariants","EmptyState","Icon","illustration","title","description","variant","primaryAction","secondaryAction","className","jsxs","cn","jsx","Button"],"mappings":"qLA6CMA,EAA2D,CAC/D,YAAc,4BACd,QAAc,sCACd,aAAc,iCACd,MAAc,6CAChB,EAoCO,SAASC,EAAW,CACzB,KAAMC,EACN,aAAAC,EACA,MAAAC,EACA,YAAAC,EACA,QAAAC,EAAU,YACV,cAAAC,EACA,gBAAAC,EACA,UAAAC,CACF,EAAoB,CAClB,OACEC,EAAAA,KAAC,MAAA,CACC,UAAWC,EAAAA,GACT,yEACAF,CAAA,EAEF,KAAK,SACL,YAAU,SAGT,SAAA,CAAAN,EACCS,EAAAA,IAAC,MAAA,CACC,IAAKT,EACL,IAAI,GACJ,UAAU,2BACV,cAAY,MAAA,CAAA,EAEZD,EACFU,EAAAA,IAAC,MAAA,CACC,UAAWD,EAAAA,GACT,uDACAX,EAAsBM,CAAO,CAAA,EAE/B,cAAY,OAEZ,SAAAM,EAAAA,IAACV,EAAA,CAAK,UAAU,QAAA,CAAS,CAAA,CAAA,EAEzB,KAGJQ,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACb,SAAA,CAAAE,EAAAA,IAAC,KAAA,CAAG,UAAU,uDACX,SAAAR,EACH,EACAQ,EAAAA,IAAC,IAAA,CAAE,UAAU,gDACV,SAAAP,CAAA,CACH,CAAA,EACF,GAGEE,GAAiBC,IACjBE,EAAAA,KAAC,MAAA,CAAI,UAAU,wDACZ,SAAA,CAAAH,GACCK,EAAAA,IAACC,EAAAA,OAAA,CACC,QAASN,EAAc,SAAW,UAClC,QAASA,EAAc,QAEtB,SAAAA,EAAc,KAAA,CAAA,EAGlBC,GACCI,EAAAA,IAACC,EAAAA,OAAA,CACC,QAASL,EAAgB,SAAW,UACpC,QAASA,EAAgB,QAExB,SAAAA,EAAgB,KAAA,CAAA,CACnB,CAAA,CAEJ,CAAA,CAAA,CAAA,CAIR"}
|
|
@@ -1,36 +1,36 @@
|
|
|
1
1
|
import { jsxs as r, jsx as e } from "react/jsx-runtime";
|
|
2
|
-
import { Button as
|
|
2
|
+
import { Button as l } from "../primitives/button.js";
|
|
3
3
|
import { cn as n } from "../utils.js";
|
|
4
4
|
const x = {
|
|
5
5
|
"first-use": "bg-primary/8 text-primary",
|
|
6
|
-
cleared: "bg-success/10 text-success",
|
|
6
|
+
cleared: "bg-success/10 text-success-emphasis",
|
|
7
7
|
"no-results": "bg-muted text-muted-foreground",
|
|
8
|
-
error: "bg-destructive/10 text-destructive"
|
|
8
|
+
error: "bg-destructive/10 text-destructive-emphasis"
|
|
9
9
|
};
|
|
10
|
-
function
|
|
10
|
+
function p({
|
|
11
11
|
icon: a,
|
|
12
|
-
illustration:
|
|
12
|
+
illustration: i,
|
|
13
13
|
title: c,
|
|
14
14
|
description: d,
|
|
15
|
-
variant:
|
|
15
|
+
variant: m = "first-use",
|
|
16
16
|
primaryAction: t,
|
|
17
17
|
secondaryAction: s,
|
|
18
|
-
className:
|
|
18
|
+
className: u
|
|
19
19
|
}) {
|
|
20
20
|
return /* @__PURE__ */ r(
|
|
21
21
|
"div",
|
|
22
22
|
{
|
|
23
23
|
className: n(
|
|
24
24
|
"flex flex-col items-center justify-center gap-4 py-12 px-6 text-center",
|
|
25
|
-
|
|
25
|
+
u
|
|
26
26
|
),
|
|
27
27
|
role: "status",
|
|
28
28
|
"aria-live": "polite",
|
|
29
29
|
children: [
|
|
30
|
-
|
|
30
|
+
i ? /* @__PURE__ */ e(
|
|
31
31
|
"img",
|
|
32
32
|
{
|
|
33
|
-
src:
|
|
33
|
+
src: i,
|
|
34
34
|
alt: "",
|
|
35
35
|
className: "w-32 h-32 object-contain",
|
|
36
36
|
"aria-hidden": "true"
|
|
@@ -40,7 +40,7 @@ function h({
|
|
|
40
40
|
{
|
|
41
41
|
className: n(
|
|
42
42
|
"flex size-16 items-center justify-center rounded-2xl",
|
|
43
|
-
x[
|
|
43
|
+
x[m]
|
|
44
44
|
),
|
|
45
45
|
"aria-hidden": "true",
|
|
46
46
|
children: /* @__PURE__ */ e(a, { className: "size-8" })
|
|
@@ -52,7 +52,7 @@ function h({
|
|
|
52
52
|
] }),
|
|
53
53
|
(t || s) && /* @__PURE__ */ r("div", { className: "flex flex-wrap items-center justify-center gap-3 pt-1", children: [
|
|
54
54
|
t && /* @__PURE__ */ e(
|
|
55
|
-
|
|
55
|
+
l,
|
|
56
56
|
{
|
|
57
57
|
variant: t.variant ?? "default",
|
|
58
58
|
onClick: t.onClick,
|
|
@@ -60,7 +60,7 @@ function h({
|
|
|
60
60
|
}
|
|
61
61
|
),
|
|
62
62
|
s && /* @__PURE__ */ e(
|
|
63
|
-
|
|
63
|
+
l,
|
|
64
64
|
{
|
|
65
65
|
variant: s.variant ?? "outline",
|
|
66
66
|
onClick: s.onClick,
|
|
@@ -73,6 +73,6 @@ function h({
|
|
|
73
73
|
);
|
|
74
74
|
}
|
|
75
75
|
export {
|
|
76
|
-
|
|
76
|
+
p as EmptyState
|
|
77
77
|
};
|
|
78
78
|
//# sourceMappingURL=empty-state.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"empty-state.js","sources":["../../../../src/components/ui/feedback/empty-state.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { type LucideIcon } from \"lucide-react\";\n\nimport { Button } from \"../primitives/button\";\nimport { cn } from \"../utils\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Tipos\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type EmptyStateVariant =\n | \"first-use\" // Usuário nunca usou — convide à primeira ação\n | \"cleared\" // Usuário esvaziou / completou tudo — celebre\n | \"no-results\" // Busca ou filtro sem resultados — oriente a ajustar\n | \"error\"; // Falha ao carregar dados — explique e dê saída\n\nexport interface EmptyStateAction {\n label: string;\n onClick: () => void;\n /** @default \"default\" */\n variant?: React.ComponentProps<typeof Button>[\"variant\"];\n}\n\nexport interface EmptyStateProps {\n /** Ícone principal. Prefira ícones do lucide-react com semântica relacionada ao contexto. */\n icon?: LucideIcon;\n /** Ilustração PNG do design system (alternativa ao icon). Precede o icon se ambos forem fornecidos. */\n illustration?: string;\n /** Título curto e orientado à situação do usuário. */\n title: string;\n /** Descrição que explica o valor da funcionalidade e o próximo passo. */\n description: string;\n /** Variante semântica do empty state. Controla o estilo do ícone. */\n variant?: EmptyStateVariant;\n /** Ação primária — botão principal de CTA. */\n primaryAction?: EmptyStateAction;\n /** Ação secundária — alternativa ou link de ajuda. */\n secondaryAction?: EmptyStateAction;\n className?: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Estilos por variante\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst iconContainerVariants: Record<EmptyStateVariant, string> = {\n \"first-use\": \"bg-primary/8 text-primary\",\n \"cleared\": \"bg-success/10 text-success\",\n \"no-results\": \"bg-muted text-muted-foreground\",\n \"error\": \"bg-destructive/10 text-destructive\",\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Componente\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * EmptyState — Estado vazio padronizado do iClips.\n *\n * Age como \"mentor\" (arquétipo Herói): nunca exibe uma tela em branco nem\n * culpa o usuário. Em vez disso, explica o contexto e convida à ação.\n *\n * Variantes:\n * - **first-use**: Primeira visita ao módulo. Foco em benefício + CTA.\n * - **cleared**: Usuário concluiu ou limpou tudo. Tom celebratório.\n * - **no-results**: Busca/filtro sem retorno. Oriente a ajustar a busca.\n * - **error**: Falha de carregamento. Explique e dê uma saída clara.\n *\n * @example Com ícone Lucide\n * <EmptyState\n * variant=\"first-use\"\n * icon={FolderOpen}\n * title=\"Seu primeiro projeto está esperando por você\"\n * description=\"Centralize jobs, prazos e equipe em um único lugar.\"\n * primaryAction={{ label: \"Criar Primeiro Projeto\", onClick: handleCreate }}\n * />\n * \n * @example Com ilustração PNG\n * <EmptyState\n * variant=\"first-use\"\n * illustration=\"/illustrations/contract-agreement.png\"\n * title=\"Nenhum contrato cadastrado\"\n * description=\"Crie contratos para gerenciar seus empenhos.\"\n * primaryAction={{ label: \"Criar Contrato\", onClick: handleCreate }}\n * />\n */\nexport function EmptyState({\n icon: Icon,\n illustration,\n title,\n description,\n variant = \"first-use\",\n primaryAction,\n secondaryAction,\n className,\n}: EmptyStateProps) {\n return (\n <div\n className={cn(\n \"flex flex-col items-center justify-center gap-4 py-12 px-6 text-center\",\n className,\n )}\n role=\"status\"\n aria-live=\"polite\"\n >\n {/* Ilustração PNG ou Ícone */}\n {illustration ? (\n <img\n src={illustration}\n alt=\"\"\n className=\"w-32 h-32 object-contain\"\n aria-hidden=\"true\"\n />\n ) : Icon ? (\n <div\n className={cn(\n \"flex size-16 items-center justify-center rounded-2xl\",\n iconContainerVariants[variant],\n )}\n aria-hidden=\"true\"\n >\n <Icon className=\"size-8\" />\n </div>\n ) : null}\n\n {/* Texto */}\n <div className=\"max-w-sm space-y-1.5\">\n <h3 className=\"text-base font-semibold leading-snug text-foreground\">\n {title}\n </h3>\n <p className=\"text-sm text-muted-foreground leading-relaxed\">\n {description}\n </p>\n </div>\n\n {/* Ações */}\n {(primaryAction || secondaryAction) && (\n <div className=\"flex flex-wrap items-center justify-center gap-3 pt-1\">\n {primaryAction && (\n <Button\n variant={primaryAction.variant ?? \"default\"}\n onClick={primaryAction.onClick}\n >\n {primaryAction.label}\n </Button>\n )}\n {secondaryAction && (\n <Button\n variant={secondaryAction.variant ?? \"outline\"}\n onClick={secondaryAction.onClick}\n >\n {secondaryAction.label}\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"names":["iconContainerVariants","EmptyState","Icon","illustration","title","description","variant","primaryAction","secondaryAction","className","jsxs","cn","jsx","Button"],"mappings":";;;AA6CA,MAAMA,IAA2D;AAAA,EAC/D,aAAc;AAAA,EACd,SAAc;AAAA,EACd,cAAc;AAAA,EACd,OAAc;AAChB;AAoCO,SAASC,EAAW;AAAA,EACzB,MAAMC;AAAA,EACN,cAAAC;AAAA,EACA,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,eAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,WAAAC;AACF,GAAoB;AAClB,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC;AAAA,QACT;AAAA,QACAF;AAAA,MAAA;AAAA,MAEF,MAAK;AAAA,MACL,aAAU;AAAA,MAGT,UAAA;AAAA,QAAAN,IACC,gBAAAS;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAKT;AAAA,YACL,KAAI;AAAA,YACJ,WAAU;AAAA,YACV,eAAY;AAAA,UAAA;AAAA,QAAA,IAEZD,IACF,gBAAAU;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWD;AAAA,cACT;AAAA,cACAX,EAAsBM,CAAO;AAAA,YAAA;AAAA,YAE/B,eAAY;AAAA,YAEZ,UAAA,gBAAAM,EAACV,GAAA,EAAK,WAAU,SAAA,CAAS;AAAA,UAAA;AAAA,QAAA,IAEzB;AAAA,QAGJ,gBAAAQ,EAAC,OAAA,EAAI,WAAU,wBACb,UAAA;AAAA,UAAA,gBAAAE,EAAC,MAAA,EAAG,WAAU,wDACX,UAAAR,GACH;AAAA,UACA,gBAAAQ,EAAC,KAAA,EAAE,WAAU,iDACV,UAAAP,EAAA,CACH;AAAA,QAAA,GACF;AAAA,SAGEE,KAAiBC,MACjB,gBAAAE,EAAC,OAAA,EAAI,WAAU,yDACZ,UAAA;AAAA,UAAAH,KACC,gBAAAK;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,SAASN,EAAc,WAAW;AAAA,cAClC,SAASA,EAAc;AAAA,cAEtB,UAAAA,EAAc;AAAA,YAAA;AAAA,UAAA;AAAA,UAGlBC,KACC,gBAAAI;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,SAASL,EAAgB,WAAW;AAAA,cACpC,SAASA,EAAgB;AAAA,cAExB,UAAAA,EAAgB;AAAA,YAAA;AAAA,UAAA;AAAA,QACnB,EAAA,CAEJ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;"}
|
|
1
|
+
{"version":3,"file":"empty-state.js","sources":["../../../../src/components/ui/feedback/empty-state.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { type LucideIcon } from \"lucide-react\";\n\nimport { Button } from \"../primitives/button\";\nimport { cn } from \"../utils\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Tipos\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type EmptyStateVariant =\n | \"first-use\" // Usuário nunca usou — convide à primeira ação\n | \"cleared\" // Usuário esvaziou / completou tudo — celebre\n | \"no-results\" // Busca ou filtro sem resultados — oriente a ajustar\n | \"error\"; // Falha ao carregar dados — explique e dê saída\n\nexport interface EmptyStateAction {\n label: string;\n onClick: () => void;\n /** @default \"default\" */\n variant?: React.ComponentProps<typeof Button>[\"variant\"];\n}\n\nexport interface EmptyStateProps {\n /** Ícone principal. Prefira ícones do lucide-react com semântica relacionada ao contexto. */\n icon?: LucideIcon;\n /** Ilustração PNG do design system (alternativa ao icon). Precede o icon se ambos forem fornecidos. */\n illustration?: string;\n /** Título curto e orientado à situação do usuário. */\n title: string;\n /** Descrição que explica o valor da funcionalidade e o próximo passo. */\n description: string;\n /** Variante semântica do empty state. Controla o estilo do ícone. */\n variant?: EmptyStateVariant;\n /** Ação primária — botão principal de CTA. */\n primaryAction?: EmptyStateAction;\n /** Ação secundária — alternativa ou link de ajuda. */\n secondaryAction?: EmptyStateAction;\n className?: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Estilos por variante\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst iconContainerVariants: Record<EmptyStateVariant, string> = {\n \"first-use\": \"bg-primary/8 text-primary\",\n \"cleared\": \"bg-success/10 text-success-emphasis\",\n \"no-results\": \"bg-muted text-muted-foreground\",\n \"error\": \"bg-destructive/10 text-destructive-emphasis\",\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Componente\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * EmptyState — Estado vazio padronizado do iClips.\n *\n * Age como \"mentor\" (arquétipo Herói): nunca exibe uma tela em branco nem\n * culpa o usuário. Em vez disso, explica o contexto e convida à ação.\n *\n * Variantes:\n * - **first-use**: Primeira visita ao módulo. Foco em benefício + CTA.\n * - **cleared**: Usuário concluiu ou limpou tudo. Tom celebratório.\n * - **no-results**: Busca/filtro sem retorno. Oriente a ajustar a busca.\n * - **error**: Falha de carregamento. Explique e dê uma saída clara.\n *\n * @example Com ícone Lucide\n * <EmptyState\n * variant=\"first-use\"\n * icon={FolderOpen}\n * title=\"Seu primeiro projeto está esperando por você\"\n * description=\"Centralize jobs, prazos e equipe em um único lugar.\"\n * primaryAction={{ label: \"Criar Primeiro Projeto\", onClick: handleCreate }}\n * />\n * \n * @example Com ilustração PNG\n * <EmptyState\n * variant=\"first-use\"\n * illustration=\"/illustrations/contract-agreement.png\"\n * title=\"Nenhum contrato cadastrado\"\n * description=\"Crie contratos para gerenciar seus empenhos.\"\n * primaryAction={{ label: \"Criar Contrato\", onClick: handleCreate }}\n * />\n */\nexport function EmptyState({\n icon: Icon,\n illustration,\n title,\n description,\n variant = \"first-use\",\n primaryAction,\n secondaryAction,\n className,\n}: EmptyStateProps) {\n return (\n <div\n className={cn(\n \"flex flex-col items-center justify-center gap-4 py-12 px-6 text-center\",\n className,\n )}\n role=\"status\"\n aria-live=\"polite\"\n >\n {/* Ilustração PNG ou Ícone */}\n {illustration ? (\n <img\n src={illustration}\n alt=\"\"\n className=\"w-32 h-32 object-contain\"\n aria-hidden=\"true\"\n />\n ) : Icon ? (\n <div\n className={cn(\n \"flex size-16 items-center justify-center rounded-2xl\",\n iconContainerVariants[variant],\n )}\n aria-hidden=\"true\"\n >\n <Icon className=\"size-8\" />\n </div>\n ) : null}\n\n {/* Texto */}\n <div className=\"max-w-sm space-y-1.5\">\n <h3 className=\"text-base font-semibold leading-snug text-foreground\">\n {title}\n </h3>\n <p className=\"text-sm text-muted-foreground leading-relaxed\">\n {description}\n </p>\n </div>\n\n {/* Ações */}\n {(primaryAction || secondaryAction) && (\n <div className=\"flex flex-wrap items-center justify-center gap-3 pt-1\">\n {primaryAction && (\n <Button\n variant={primaryAction.variant ?? \"default\"}\n onClick={primaryAction.onClick}\n >\n {primaryAction.label}\n </Button>\n )}\n {secondaryAction && (\n <Button\n variant={secondaryAction.variant ?? \"outline\"}\n onClick={secondaryAction.onClick}\n >\n {secondaryAction.label}\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"names":["iconContainerVariants","EmptyState","Icon","illustration","title","description","variant","primaryAction","secondaryAction","className","jsxs","cn","jsx","Button"],"mappings":";;;AA6CA,MAAMA,IAA2D;AAAA,EAC/D,aAAc;AAAA,EACd,SAAc;AAAA,EACd,cAAc;AAAA,EACd,OAAc;AAChB;AAoCO,SAASC,EAAW;AAAA,EACzB,MAAMC;AAAA,EACN,cAAAC;AAAA,EACA,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,eAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,WAAAC;AACF,GAAoB;AAClB,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC;AAAA,QACT;AAAA,QACAF;AAAA,MAAA;AAAA,MAEF,MAAK;AAAA,MACL,aAAU;AAAA,MAGT,UAAA;AAAA,QAAAN,IACC,gBAAAS;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAKT;AAAA,YACL,KAAI;AAAA,YACJ,WAAU;AAAA,YACV,eAAY;AAAA,UAAA;AAAA,QAAA,IAEZD,IACF,gBAAAU;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWD;AAAA,cACT;AAAA,cACAX,EAAsBM,CAAO;AAAA,YAAA;AAAA,YAE/B,eAAY;AAAA,YAEZ,UAAA,gBAAAM,EAACV,GAAA,EAAK,WAAU,SAAA,CAAS;AAAA,UAAA;AAAA,QAAA,IAEzB;AAAA,QAGJ,gBAAAQ,EAAC,OAAA,EAAI,WAAU,wBACb,UAAA;AAAA,UAAA,gBAAAE,EAAC,MAAA,EAAG,WAAU,wDACX,UAAAR,GACH;AAAA,UACA,gBAAAQ,EAAC,KAAA,EAAE,WAAU,iDACV,UAAAP,EAAA,CACH;AAAA,QAAA,GACF;AAAA,SAGEE,KAAiBC,MACjB,gBAAAE,EAAC,OAAA,EAAI,WAAU,yDACZ,UAAA;AAAA,UAAAH,KACC,gBAAAK;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,SAASN,EAAc,WAAW;AAAA,cAClC,SAASA,EAAc;AAAA,cAEtB,UAAAA,EAAc;AAAA,YAAA;AAAA,UAAA;AAAA,UAGlBC,KACC,gBAAAI;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,SAASL,EAAgB,WAAW;AAAA,cACpC,SAASA,EAAgB;AAAA,cAExB,UAAAA,EAAgB;AAAA,YAAA;AAAA,UAAA;AAAA,QACnB,EAAA,CAEJ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),n=require("lucide-react"),i=require("next-themes"),o=require("sonner"),a=Object.assign((e,t)=>o.toast(e,t!=null&&t.action?{duration:8e3,...t,className:["toast-undo",t.className].filter(Boolean).join(" ")}:t),o.toast,{success:(e,t)=>o.toast.success(e,{duration:4e3,...t}),error:(e,t)=>o.toast.error(e,{duration:1/0,closeButton:!0,...t}),warning:(e,t)=>o.toast.warning(e,{duration:6e3,...t}),info:(e,t)=>o.toast.info(e,{duration:5e3,...t})}),r=e=>s.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2.5,strokeLinecap:"round","aria-hidden":"true",children:s.jsx("path",{d:e})});function u(e){const{resolvedTheme:t="light"}=i.useTheme();return s.jsx(o.Toaster,{theme:t,className:"toaster group",icons:{success:s.jsx(n.Check,{strokeWidth:2.5}),error:s.jsx(n.X,{strokeWidth:2.5}),warning:r("M12 6v8M12 18h.01"),info:r("M12 11v7M12 6h.01"),loading:s.jsx(n.LoaderCircle,{strokeWidth:2.5,className:"animate-spin"})},toastOptions:{unstyled:!0,closeButtonAriaLabel:"Fechar notificação",classNames:{toast:"toast w-full rounded-lg border px-4 py-3 shadow-lg flex items-start gap-3",title:"font-semibold text-sm leading-[1.2]",description:"text-sm mt-1 leading-relaxed",actionButton:"rounded-sm text-sm font-semibold outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",cancelButton:"ml-auto shrink-0 self-center rounded-sm text-sm font-medium text-muted-foreground",closeButton:"absolute right-2 top-2 rounded-md p-1 text-foreground/50 hover:text-foreground"}},...e})}exports.Toaster=u;exports.toast=a;
|
|
2
2
|
//# sourceMappingURL=toast.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toast.cjs","sources":["../../../../src/components/ui/feedback/toast.tsx"],"sourcesContent":["\"use client\";\n\nimport { useTheme } from \"next-themes\";\nimport {
|
|
1
|
+
{"version":3,"file":"toast.cjs","sources":["../../../../src/components/ui/feedback/toast.tsx"],"sourcesContent":["\"use client\";\n\nimport { Check, LoaderCircle, X } from \"lucide-react\";\nimport { useTheme } from \"next-themes\";\nimport {\n toast as sonner,\n Toaster as ToasterProvider,\n type ExternalToast,\n type ToasterProps,\n} from \"sonner\";\n\nexport type { ToasterProps } from \"sonner\";\n\ntype Mensagem = Parameters<typeof sonner>[0];\n\n// Padrões por tipo (documento Paleta iClips): o erro fica até ser fechado; o\n// neutro com ação (\"Desfazer\") dura 8s e vem em superfície invertida. O que o\n// chamador passar vence.\nconst toast: typeof sonner = Object.assign(\n (m: Mensagem, o?: ExternalToast) =>\n sonner(\n m,\n o?.action\n ? {\n duration: 8000,\n ...o,\n className: [\"toast-undo\", o.className].filter(Boolean).join(\" \"),\n }\n : o,\n ),\n sonner,\n {\n success: (m: Mensagem, o?: ExternalToast) =>\n sonner.success(m, { duration: 4000, ...o }),\n error: (m: Mensagem, o?: ExternalToast) =>\n sonner.error(m, { duration: Infinity, closeButton: true, ...o }),\n warning: (m: Mensagem, o?: ExternalToast) =>\n sonner.warning(m, { duration: 6000, ...o }),\n info: (m: Mensagem, o?: ExternalToast) =>\n sonner.info(m, { duration: 5000, ...o }),\n },\n);\n\nconst glifo = (d: string) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n aria-hidden=\"true\"\n >\n <path d={d} />\n </svg>\n);\n\nfunction Toaster(props: ToasterProps) {\n const { resolvedTheme = \"light\" } = useTheme();\n\n return (\n <ToasterProvider\n theme={resolvedTheme as ToasterProps[\"theme\"]}\n className=\"toaster group\"\n icons={{\n success: <Check strokeWidth={2.5} />,\n error: <X strokeWidth={2.5} />,\n warning: glifo(\"M12 6v8M12 18h.01\"),\n info: glifo(\"M12 11v7M12 6h.01\"),\n loading: <LoaderCircle strokeWidth={2.5} className=\"animate-spin\" />,\n }}\n toastOptions={{\n unstyled: true,\n closeButtonAriaLabel: \"Fechar notificação\",\n classNames: {\n // Superfície, borda e cor do ícone por tipo ficam em toast-theme.css.\n toast:\n \"toast w-full rounded-lg border px-4 py-3 shadow-lg flex items-start gap-3\",\n title: \"font-semibold text-sm leading-[1.2]\",\n description: \"text-sm mt-1 leading-relaxed\",\n actionButton:\n \"rounded-sm text-sm font-semibold outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n cancelButton:\n \"ml-auto shrink-0 self-center rounded-sm text-sm font-medium text-muted-foreground\",\n closeButton:\n \"absolute right-2 top-2 rounded-md p-1 text-foreground/50 hover:text-foreground\",\n },\n }}\n {...props}\n />\n );\n}\n\nexport { toast, Toaster };\n"],"names":["toast","m","o","sonner","glifo","d","jsx","Toaster","props","resolvedTheme","useTheme","ToasterProvider","Check","X","LoaderCircle"],"mappings":"yMAkBMA,EAAuB,OAAO,OAClC,CAACC,EAAaC,IACZC,EAAAA,MACEF,EACAC,GAAA,MAAAA,EAAG,OACC,CACE,SAAU,IACV,GAAGA,EACH,UAAW,CAAC,aAAcA,EAAE,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,CAAA,EAEjEA,CAAA,EAERC,EAAAA,MACA,CACE,QAAS,CAACF,EAAaC,IACrBC,QAAO,QAAQF,EAAG,CAAE,SAAU,IAAM,GAAGC,CAAA,CAAG,EAC5C,MAAO,CAACD,EAAaC,IACnBC,EAAAA,MAAO,MAAMF,EAAG,CAAE,SAAU,IAAU,YAAa,GAAM,GAAGC,EAAG,EACjE,QAAS,CAACD,EAAaC,IACrBC,QAAO,QAAQF,EAAG,CAAE,SAAU,IAAM,GAAGC,CAAA,CAAG,EAC5C,KAAM,CAACD,EAAaC,IAClBC,QAAO,KAAKF,EAAG,CAAE,SAAU,IAAM,GAAGC,CAAA,CAAG,CAAA,CAE7C,EAEME,EAASC,GACbC,EAAAA,IAAC,MAAA,CACC,QAAQ,YACR,KAAK,OACL,OAAO,eACP,YAAa,IACb,cAAc,QACd,cAAY,OAEZ,SAAAA,EAAAA,IAAC,QAAK,EAAAD,CAAA,CAAM,CAAA,CACd,EAGF,SAASE,EAAQC,EAAqB,CACpC,KAAM,CAAE,cAAAC,EAAgB,OAAA,EAAYC,WAAA,EAEpC,OACEJ,EAAAA,IAACK,EAAAA,QAAA,CACC,MAAOF,EACP,UAAU,gBACV,MAAO,CACL,QAASH,EAAAA,IAACM,EAAAA,MAAA,CAAM,YAAa,GAAA,CAAK,EAClC,MAAON,EAAAA,IAACO,EAAAA,EAAA,CAAE,YAAa,GAAA,CAAK,EAC5B,QAAST,EAAM,mBAAmB,EAClC,KAAMA,EAAM,mBAAmB,EAC/B,QAASE,EAAAA,IAACQ,eAAA,CAAa,YAAa,IAAK,UAAU,cAAA,CAAe,CAAA,EAEpE,aAAc,CACZ,SAAU,GACV,qBAAsB,qBACtB,WAAY,CAEV,MACE,4EACF,MAAO,sCACP,YAAa,+BACb,aACE,yHACF,aACE,oFACF,YACE,gFAAA,CACJ,EAED,GAAGN,CAAA,CAAA,CAGV"}
|
|
@@ -1,38 +1,69 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsx as
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { toast as
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
import { jsx as s } from "react/jsx-runtime";
|
|
3
|
+
import { LoaderCircle as n, X as i, Check as a } from "lucide-react";
|
|
4
|
+
import { useTheme as l } from "next-themes";
|
|
5
|
+
import { Toaster as u, toast as o } from "sonner";
|
|
6
|
+
const g = Object.assign(
|
|
7
|
+
(e, t) => o(
|
|
8
|
+
e,
|
|
9
|
+
t != null && t.action ? {
|
|
10
|
+
duration: 8e3,
|
|
11
|
+
...t,
|
|
12
|
+
className: ["toast-undo", t.className].filter(Boolean).join(" ")
|
|
13
|
+
} : t
|
|
14
|
+
),
|
|
15
|
+
o,
|
|
16
|
+
{
|
|
17
|
+
success: (e, t) => o.success(e, { duration: 4e3, ...t }),
|
|
18
|
+
error: (e, t) => o.error(e, { duration: 1 / 0, closeButton: !0, ...t }),
|
|
19
|
+
warning: (e, t) => o.warning(e, { duration: 6e3, ...t }),
|
|
20
|
+
info: (e, t) => o.info(e, { duration: 5e3, ...t })
|
|
21
|
+
}
|
|
22
|
+
), r = (e) => /* @__PURE__ */ s(
|
|
23
|
+
"svg",
|
|
24
|
+
{
|
|
25
|
+
viewBox: "0 0 24 24",
|
|
26
|
+
fill: "none",
|
|
27
|
+
stroke: "currentColor",
|
|
28
|
+
strokeWidth: 2.5,
|
|
29
|
+
strokeLinecap: "round",
|
|
30
|
+
"aria-hidden": "true",
|
|
31
|
+
children: /* @__PURE__ */ s("path", { d: e })
|
|
32
|
+
}
|
|
33
|
+
);
|
|
34
|
+
function h(e) {
|
|
35
|
+
const { resolvedTheme: t = "light" } = l();
|
|
36
|
+
return /* @__PURE__ */ s(
|
|
37
|
+
u,
|
|
10
38
|
{
|
|
11
|
-
theme:
|
|
39
|
+
theme: t,
|
|
12
40
|
className: "toaster group",
|
|
41
|
+
icons: {
|
|
42
|
+
success: /* @__PURE__ */ s(a, { strokeWidth: 2.5 }),
|
|
43
|
+
error: /* @__PURE__ */ s(i, { strokeWidth: 2.5 }),
|
|
44
|
+
warning: r("M12 6v8M12 18h.01"),
|
|
45
|
+
info: r("M12 11v7M12 6h.01"),
|
|
46
|
+
loading: /* @__PURE__ */ s(n, { strokeWidth: 2.5, className: "animate-spin" })
|
|
47
|
+
},
|
|
13
48
|
toastOptions: {
|
|
14
49
|
unstyled: !0,
|
|
50
|
+
closeButtonAriaLabel: "Fechar notificação",
|
|
15
51
|
classNames: {
|
|
16
|
-
|
|
52
|
+
// Superfície, borda e cor do ícone por tipo ficam em toast-theme.css.
|
|
53
|
+
toast: "toast w-full rounded-lg border px-4 py-3 shadow-lg flex items-start gap-3",
|
|
17
54
|
title: "font-semibold text-sm leading-[1.2]",
|
|
18
55
|
description: "text-sm mt-1 leading-relaxed",
|
|
19
|
-
actionButton: "
|
|
20
|
-
cancelButton: "
|
|
21
|
-
closeButton: "absolute right-2 top-2 rounded-md p-1 text-foreground/50 hover:text-foreground"
|
|
22
|
-
// Variantes de status derivam a cor dos tokens semânticos via
|
|
23
|
-
// color-mix (toast-theme.css) — adaptam sozinhas em dark/light.
|
|
24
|
-
error: "toast-variant-error",
|
|
25
|
-
success: "toast-variant-success",
|
|
26
|
-
warning: "toast-variant-warning",
|
|
27
|
-
info: "toast-variant-info"
|
|
56
|
+
actionButton: "rounded-sm text-sm font-semibold outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
|
|
57
|
+
cancelButton: "ml-auto shrink-0 self-center rounded-sm text-sm font-medium text-muted-foreground",
|
|
58
|
+
closeButton: "absolute right-2 top-2 rounded-md p-1 text-foreground/50 hover:text-foreground"
|
|
28
59
|
}
|
|
29
60
|
},
|
|
30
|
-
...
|
|
61
|
+
...e
|
|
31
62
|
}
|
|
32
63
|
);
|
|
33
64
|
}
|
|
34
65
|
export {
|
|
35
|
-
|
|
36
|
-
|
|
66
|
+
h as Toaster,
|
|
67
|
+
g as toast
|
|
37
68
|
};
|
|
38
69
|
//# sourceMappingURL=toast.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toast.js","sources":["../../../../src/components/ui/feedback/toast.tsx"],"sourcesContent":["\"use client\";\n\nimport { useTheme } from \"next-themes\";\nimport {
|
|
1
|
+
{"version":3,"file":"toast.js","sources":["../../../../src/components/ui/feedback/toast.tsx"],"sourcesContent":["\"use client\";\n\nimport { Check, LoaderCircle, X } from \"lucide-react\";\nimport { useTheme } from \"next-themes\";\nimport {\n toast as sonner,\n Toaster as ToasterProvider,\n type ExternalToast,\n type ToasterProps,\n} from \"sonner\";\n\nexport type { ToasterProps } from \"sonner\";\n\ntype Mensagem = Parameters<typeof sonner>[0];\n\n// Padrões por tipo (documento Paleta iClips): o erro fica até ser fechado; o\n// neutro com ação (\"Desfazer\") dura 8s e vem em superfície invertida. O que o\n// chamador passar vence.\nconst toast: typeof sonner = Object.assign(\n (m: Mensagem, o?: ExternalToast) =>\n sonner(\n m,\n o?.action\n ? {\n duration: 8000,\n ...o,\n className: [\"toast-undo\", o.className].filter(Boolean).join(\" \"),\n }\n : o,\n ),\n sonner,\n {\n success: (m: Mensagem, o?: ExternalToast) =>\n sonner.success(m, { duration: 4000, ...o }),\n error: (m: Mensagem, o?: ExternalToast) =>\n sonner.error(m, { duration: Infinity, closeButton: true, ...o }),\n warning: (m: Mensagem, o?: ExternalToast) =>\n sonner.warning(m, { duration: 6000, ...o }),\n info: (m: Mensagem, o?: ExternalToast) =>\n sonner.info(m, { duration: 5000, ...o }),\n },\n);\n\nconst glifo = (d: string) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n aria-hidden=\"true\"\n >\n <path d={d} />\n </svg>\n);\n\nfunction Toaster(props: ToasterProps) {\n const { resolvedTheme = \"light\" } = useTheme();\n\n return (\n <ToasterProvider\n theme={resolvedTheme as ToasterProps[\"theme\"]}\n className=\"toaster group\"\n icons={{\n success: <Check strokeWidth={2.5} />,\n error: <X strokeWidth={2.5} />,\n warning: glifo(\"M12 6v8M12 18h.01\"),\n info: glifo(\"M12 11v7M12 6h.01\"),\n loading: <LoaderCircle strokeWidth={2.5} className=\"animate-spin\" />,\n }}\n toastOptions={{\n unstyled: true,\n closeButtonAriaLabel: \"Fechar notificação\",\n classNames: {\n // Superfície, borda e cor do ícone por tipo ficam em toast-theme.css.\n toast:\n \"toast w-full rounded-lg border px-4 py-3 shadow-lg flex items-start gap-3\",\n title: \"font-semibold text-sm leading-[1.2]\",\n description: \"text-sm mt-1 leading-relaxed\",\n actionButton:\n \"rounded-sm text-sm font-semibold outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n cancelButton:\n \"ml-auto shrink-0 self-center rounded-sm text-sm font-medium text-muted-foreground\",\n closeButton:\n \"absolute right-2 top-2 rounded-md p-1 text-foreground/50 hover:text-foreground\",\n },\n }}\n {...props}\n />\n );\n}\n\nexport { toast, Toaster };\n"],"names":["toast","m","o","sonner","glifo","d","jsx","Toaster","props","resolvedTheme","useTheme","ToasterProvider","Check","X","LoaderCircle"],"mappings":";;;;;AAkBA,MAAMA,IAAuB,OAAO;AAAA,EAClC,CAACC,GAAaC,MACZC;AAAAA,IACEF;AAAA,IACAC,KAAA,QAAAA,EAAG,SACC;AAAA,MACE,UAAU;AAAA,MACV,GAAGA;AAAA,MACH,WAAW,CAAC,cAAcA,EAAE,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IAAA,IAEjEA;AAAA,EAAA;AAAA,EAERC;AAAAA,EACA;AAAA,IACE,SAAS,CAACF,GAAaC,MACrBC,EAAO,QAAQF,GAAG,EAAE,UAAU,KAAM,GAAGC,EAAA,CAAG;AAAA,IAC5C,OAAO,CAACD,GAAaC,MACnBC,EAAO,MAAMF,GAAG,EAAE,UAAU,OAAU,aAAa,IAAM,GAAGC,GAAG;AAAA,IACjE,SAAS,CAACD,GAAaC,MACrBC,EAAO,QAAQF,GAAG,EAAE,UAAU,KAAM,GAAGC,EAAA,CAAG;AAAA,IAC5C,MAAM,CAACD,GAAaC,MAClBC,EAAO,KAAKF,GAAG,EAAE,UAAU,KAAM,GAAGC,EAAA,CAAG;AAAA,EAAA;AAE7C,GAEME,IAAQ,CAACC,MACb,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,QAAO;AAAA,IACP,aAAa;AAAA,IACb,eAAc;AAAA,IACd,eAAY;AAAA,IAEZ,UAAA,gBAAAA,EAAC,UAAK,GAAAD,EAAA,CAAM;AAAA,EAAA;AACd;AAGF,SAASE,EAAQC,GAAqB;AACpC,QAAM,EAAE,eAAAC,IAAgB,QAAA,IAAYC,EAAA;AAEpC,SACE,gBAAAJ;AAAA,IAACK;AAAAA,IAAA;AAAA,MACC,OAAOF;AAAA,MACP,WAAU;AAAA,MACV,OAAO;AAAA,QACL,SAAS,gBAAAH,EAACM,GAAA,EAAM,aAAa,IAAA,CAAK;AAAA,QAClC,OAAO,gBAAAN,EAACO,GAAA,EAAE,aAAa,IAAA,CAAK;AAAA,QAC5B,SAAST,EAAM,mBAAmB;AAAA,QAClC,MAAMA,EAAM,mBAAmB;AAAA,QAC/B,SAAS,gBAAAE,EAACQ,GAAA,EAAa,aAAa,KAAK,WAAU,eAAA,CAAe;AAAA,MAAA;AAAA,MAEpE,cAAc;AAAA,QACZ,UAAU;AAAA,QACV,sBAAsB;AAAA,QACtB,YAAY;AAAA;AAAA,UAEV,OACE;AAAA,UACF,OAAO;AAAA,UACP,aAAa;AAAA,UACb,cACE;AAAA,UACF,cACE;AAAA,UACF,aACE;AAAA,QAAA;AAAA,MACJ;AAAA,MAED,GAAGN;AAAA,IAAA;AAAA,EAAA;AAGV;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),m=require("react-day-picker"),g=require("date-fns/locale"),
|
|
1
|
+
"use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),m=require("react-day-picker"),g=require("date-fns/locale"),o=require("lucide-react"),e=require("../utils.cjs"),r=require("../primitives/button.cjs");function n({className:d,classNames:s,showOutsideDays:i=!0,locale:c=g.ptBR,...u}){return t.jsx(m.DayPicker,{showOutsideDays:i,locale:c,className:e.cn("p-3 relative",d),classNames:{months:"flex flex-col sm:flex-row gap-4",month:"flex flex-col gap-4",month_caption:"flex justify-center pt-1 relative items-center",caption_label:"text-sm font-medium",nav:"absolute top-3 inset-x-3 flex items-center justify-between z-10",button_previous:e.cn(r.buttonVariants({variant:"outline"}),"size-7 bg-background p-1.5 hover:bg-accent hover:text-accent-foreground rounded-md border-border"),button_next:e.cn(r.buttonVariants({variant:"outline"}),"size-7 bg-background p-1.5 hover:bg-accent hover:text-accent-foreground rounded-md border-border"),month_grid:"w-full border-collapse space-y-1",weekdays:"flex",weekday:"text-muted-foreground rounded-md w-9 font-normal text-[0.8rem]",week:"flex w-full mt-2",day:"h-9 w-9 text-center text-sm p-0 relative [&:has([aria-selected].outside)]:bg-secondary/50 [&:has([aria-selected])]:bg-secondary first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md focus-within:relative focus-within:z-20 rounded-md",day_button:e.cn(r.buttonVariants({variant:"ghost"}),"h-9 w-9 p-0 font-normal aria-selected:opacity-100 rounded-md"),range_end:"range-end",range_start:"range-start",selected:"bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground rounded-md",today:"bg-accent text-accent-foreground rounded-md",outside:"outside text-muted-foreground aria-selected:bg-secondary/50 aria-selected:text-muted-foreground",disabled:"text-muted-foreground opacity-50",range_middle:"aria-selected:bg-secondary aria-selected:text-secondary-foreground",hidden:"invisible",...s},components:{Chevron:({orientation:l,...a})=>l==="left"?t.jsx(o.ChevronLeft,{className:"h-4 w-4",...a}):t.jsx(o.ChevronRight,{className:"h-4 w-4",...a})},...u})}n.displayName="Calendar";exports.Calendar=n;
|
|
2
2
|
//# sourceMappingURL=calendar.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calendar.cjs","sources":["../../../../src/components/ui/forms/calendar.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { DayPicker } from \"react-day-picker\";\nimport { ptBR } from \"date-fns/locale\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\n\nimport { cn } from \"../utils\";\nimport { buttonVariants } from \"../primitives/button\";\n\nexport type CalendarProps = React.ComponentProps<typeof DayPicker>;\n\n/**\n * Calendar - Componente base de calendário\n *\n * Grid de dias para seleção de datas. Usado internamente pelo DatePicker\n * e DateRangePicker, mas também pode ser usado standalone.\n *\n * @example\n * // Seleção única\n * <Calendar\n * mode=\"single\"\n * selected={date}\n * onSelect={setDate}\n * />\n *\n * @example\n * // Seleção de intervalo\n * <Calendar\n * mode=\"range\"\n * selected={dateRange}\n * onSelect={setDateRange}\n * />\n */\n// react-day-picker's DayPicker is a plain function with no ref support -- cannot be forwardRef'd.\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n locale = ptBR,\n ...props\n}: CalendarProps) {\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n locale={locale}\n className={cn(\"p-3 relative\", className)}\n classNames={{\n months: \"flex flex-col sm:flex-row gap-4\",\n month: \"flex flex-col gap-4\",\n month_caption: \"flex justify-center pt-1 relative items-center\",\n caption_label: \"text-sm font-medium\",\n nav: \"absolute top-3 inset-x-3 flex items-center justify-between z-10\",\n button_previous: cn(\n buttonVariants({ variant: \"outline\" }),\n \"size-7 bg-background p-1.5 hover:bg-accent hover:text-accent-foreground rounded-md border-border\"\n ),\n button_next: cn(\n buttonVariants({ variant: \"outline\" }),\n \"size-7 bg-background p-1.5 hover:bg-accent hover:text-accent-foreground rounded-md border-border\"\n ),\n month_grid: \"w-full border-collapse space-y-1\",\n weekdays: \"flex\",\n weekday: \"text-muted-foreground rounded-md w-9 font-normal text-[0.8rem]\",\n week: \"flex w-full mt-2\",\n day: \"h-9 w-9 text-center text-sm p-0 relative [&:has([aria-selected].outside)]:bg-
|
|
1
|
+
{"version":3,"file":"calendar.cjs","sources":["../../../../src/components/ui/forms/calendar.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { DayPicker } from \"react-day-picker\";\nimport { ptBR } from \"date-fns/locale\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\n\nimport { cn } from \"../utils\";\nimport { buttonVariants } from \"../primitives/button\";\n\nexport type CalendarProps = React.ComponentProps<typeof DayPicker>;\n\n/**\n * Calendar - Componente base de calendário\n *\n * Grid de dias para seleção de datas. Usado internamente pelo DatePicker\n * e DateRangePicker, mas também pode ser usado standalone.\n *\n * @example\n * // Seleção única\n * <Calendar\n * mode=\"single\"\n * selected={date}\n * onSelect={setDate}\n * />\n *\n * @example\n * // Seleção de intervalo\n * <Calendar\n * mode=\"range\"\n * selected={dateRange}\n * onSelect={setDateRange}\n * />\n */\n// react-day-picker's DayPicker is a plain function with no ref support -- cannot be forwardRef'd.\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n locale = ptBR,\n ...props\n}: CalendarProps) {\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n locale={locale}\n className={cn(\"p-3 relative\", className)}\n classNames={{\n months: \"flex flex-col sm:flex-row gap-4\",\n month: \"flex flex-col gap-4\",\n month_caption: \"flex justify-center pt-1 relative items-center\",\n caption_label: \"text-sm font-medium\",\n nav: \"absolute top-3 inset-x-3 flex items-center justify-between z-10\",\n button_previous: cn(\n buttonVariants({ variant: \"outline\" }),\n \"size-7 bg-background p-1.5 hover:bg-accent hover:text-accent-foreground rounded-md border-border\"\n ),\n button_next: cn(\n buttonVariants({ variant: \"outline\" }),\n \"size-7 bg-background p-1.5 hover:bg-accent hover:text-accent-foreground rounded-md border-border\"\n ),\n month_grid: \"w-full border-collapse space-y-1\",\n weekdays: \"flex\",\n weekday: \"text-muted-foreground rounded-md w-9 font-normal text-[0.8rem]\",\n week: \"flex w-full mt-2\",\n day: \"h-9 w-9 text-center text-sm p-0 relative [&:has([aria-selected].outside)]:bg-secondary/50 [&:has([aria-selected])]:bg-secondary first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md focus-within:relative focus-within:z-20 rounded-md\",\n day_button: cn(\n buttonVariants({ variant: \"ghost\" }),\n \"h-9 w-9 p-0 font-normal aria-selected:opacity-100 rounded-md\"\n ),\n range_end: \"range-end\",\n range_start: \"range-start\",\n selected:\n \"bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground rounded-md\",\n today: \"bg-accent text-accent-foreground rounded-md\",\n outside:\n \"outside text-muted-foreground aria-selected:bg-secondary/50 aria-selected:text-muted-foreground\",\n disabled: \"text-muted-foreground opacity-50\",\n range_middle:\n \"aria-selected:bg-secondary aria-selected:text-secondary-foreground\",\n hidden: \"invisible\",\n ...classNames,\n }}\n components={{\n Chevron: ({ orientation, ...rest }) =>\n orientation === \"left\" ? (\n <ChevronLeft className=\"h-4 w-4\" {...rest} />\n ) : (\n <ChevronRight className=\"h-4 w-4\" {...rest} />\n ),\n }}\n {...props}\n />\n );\n}\n\nCalendar.displayName = \"Calendar\";\n\nexport { Calendar };\n"],"names":["Calendar","className","classNames","showOutsideDays","locale","ptBR","props","jsx","DayPicker","cn","buttonVariants","orientation","rest","ChevronLeft","ChevronRight"],"mappings":"uRAmCA,SAASA,EAAS,CAChB,UAAAC,EACA,WAAAC,EACA,gBAAAC,EAAkB,GAAA,OAClBC,EAASC,EAAAA,KACT,GAAGC,CACL,EAAkB,CAChB,OACEC,EAAAA,IAACC,EAAAA,UAAA,CACC,gBAAAL,EAAA,OACAC,EACA,UAAWK,EAAAA,GAAG,eAAgBR,CAAS,EACvC,WAAY,CACV,OAAQ,kCACR,MAAO,sBACP,cAAe,iDACf,cAAe,sBACf,IAAK,kEACL,gBAAiBQ,EAAAA,GACfC,iBAAe,CAAE,QAAS,UAAW,EACrC,kGAAA,EAEF,YAAaD,EAAAA,GACXC,iBAAe,CAAE,QAAS,UAAW,EACrC,kGAAA,EAEF,WAAY,mCACZ,SAAU,OACV,QAAS,iEACT,KAAM,mBACN,IAAK,4QACL,WAAYD,EAAAA,GACVC,iBAAe,CAAE,QAAS,QAAS,EACnC,8DAAA,EAEF,UAAW,YACX,YAAa,cACb,SACE,8IACF,MAAO,8CACP,QACE,kGACF,SAAU,mCACV,aACE,qEACF,OAAQ,YACR,GAAGR,CAAA,EAEL,WAAY,CACV,QAAS,CAAC,CAAE,YAAAS,EAAa,GAAGC,CAAA,IAC1BD,IAAgB,OACdJ,EAAAA,IAACM,eAAY,UAAU,UAAW,GAAGD,CAAA,CAAM,QAE1CE,EAAAA,aAAA,CAAa,UAAU,UAAW,GAAGF,CAAA,CAAM,CAAA,EAGjD,GAAGN,CAAA,CAAA,CAGV,CAEAN,EAAS,YAAc"}
|