@agroshine/ags-web-ui-kit 1.2.1 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,11 +1,191 @@
1
1
  /**
2
- * AgroShine · Luna Nueva — tokens CSS (HSL semánticos shadcn-compatible).
3
- * Importar desde el CSS raíz de la app si NO se usa el Tailwind preset.
2
+ * AgroShine design tokens (Tailwind v4 + shadcn-compatible).
4
3
  *
5
- * @import 'ags-web-ui-kit/styles/tokens.css';
4
+ * Importar desde el CSS raíz de la app:
6
5
  *
7
- * Las escalas full 50-900 viven en `tailwind.preset.cjs`.
6
+ * @import 'tailwindcss';
7
+ * @import '@agroshine/ags-web-ui-kit/styles/tokens.css';
8
+ *
9
+ * Provee:
10
+ * 1. `@theme` con escalas de marca (default/primary/secondary/success/warning/
11
+ * danger/grey/content1-4/focus/overlay), fuentes, radius, tipografía,
12
+ * animaciones — para que Tailwind v4 genere `bg-primary-500`,
13
+ * `border-secondary-50`, `text-h2`, `font-roboto`, etc.
14
+ * 2. Variables HSL semánticas shadcn (`--background`, `--border`, etc.) en
15
+ * `:root` y `.dark`, vinculadas a los tokens semánticos del `@theme`.
16
+ *
17
+ * Las escalas full 50-900 también viven en `tailwind.preset.cjs` para apps
18
+ * que sigan en Tailwind v3.
8
19
  */
20
+
21
+ @theme {
22
+ /* ---------- Fonts ---------- */
23
+ --font-roboto: 'Roboto', sans-serif;
24
+ --font-mono: 'JetBrains Mono', ui-monospace, monospace;
25
+
26
+ /* ---------- Type scale ---------- */
27
+ --text-h2: 20px;
28
+ --text-h2--font-weight: 700;
29
+ --text-subtitleLarge: 16px;
30
+ --text-subtitleLarge--font-weight: 600;
31
+ --text-subtitleMedium: 14px;
32
+ --text-subtitleMedium--font-weight: 600;
33
+ --text-bodyMedium: 14px;
34
+ --text-bodyMedium--font-weight: 500;
35
+ --text-caption: 12px;
36
+ --text-caption--font-weight: 600;
37
+ --text-buttons: 14px;
38
+ --text-buttons--font-weight: 600;
39
+
40
+ /* ---------- Radius ---------- */
41
+ --radius-lg: var(--radius);
42
+ --radius-md: calc(var(--radius) - 2px);
43
+ --radius-sm: calc(var(--radius) - 4px);
44
+
45
+ /* ---------- Brand color scales ---------- */
46
+ --color-default-50: #f6f8f7;
47
+ --color-default-100: #eaefec;
48
+ --color-default-200: #dee5e0;
49
+ --color-default-300: #d2dcd5;
50
+ --color-default-400: #c5d2c9;
51
+ --color-default-500: #b9c9be;
52
+ --color-default-600: #99a69d;
53
+ --color-default-700: #78837c;
54
+ --color-default-800: #585f5a;
55
+ --color-default-900: #383c39;
56
+ --color-default: #d4d4d8;
57
+ --color-default-foreground: #000;
58
+
59
+ --color-primary-50: #e3e7e6;
60
+ --color-primary-100: #bbc6c3;
61
+ --color-primary-200: #94a5a0;
62
+ --color-primary-300: #6c847c;
63
+ --color-primary-400: #456359;
64
+ --color-primary-500: #1d4236;
65
+ --color-primary-600: #18362d;
66
+ --color-primary-700: #132b23;
67
+ --color-primary-800: #0e1f1a;
68
+ --color-primary-900: #091410;
69
+ --color-primary: #1d4236;
70
+ --color-primary-foreground: #fff;
71
+
72
+ --color-secondary-50: #fbf1e8;
73
+ --color-secondary-100: #f4dcc4;
74
+ --color-secondary-200: #e9c19a;
75
+ --color-secondary-300: #dea670;
76
+ --color-secondary-400: #d38d4f;
77
+ --color-secondary-500: #c87a3c;
78
+ --color-secondary-600: #a86430;
79
+ --color-secondary-700: #834d25;
80
+ --color-secondary-800: #5e371a;
81
+ --color-secondary-900: #3a210f;
82
+ --color-secondary: #c87a3c;
83
+ --color-secondary-foreground: #fff;
84
+
85
+ --color-success-50: #e8faf0;
86
+ --color-success-100: #d1f4e0;
87
+ --color-success-200: #a2e9c1;
88
+ --color-success-300: #74dfa2;
89
+ --color-success-400: #45d483;
90
+ --color-success-500: #17c964;
91
+ --color-success-600: #12a150;
92
+ --color-success-700: #0e793c;
93
+ --color-success-800: #095028;
94
+ --color-success-900: #052814;
95
+ --color-success: #405f54;
96
+ --color-success-foreground: #fff;
97
+
98
+ --color-warning-50: #fefce8;
99
+ --color-warning-100: #fdedd3;
100
+ --color-warning-200: #fbdba7;
101
+ --color-warning-300: #f9c97c;
102
+ --color-warning-400: #f7b750;
103
+ --color-warning-500: #f5a524;
104
+ --color-warning-600: #f5a524;
105
+ --color-warning-700: #936316;
106
+ --color-warning-800: #62420e;
107
+ --color-warning-900: #312107;
108
+ --color-warning: #ebc40e;
109
+ --color-warning-foreground: #000;
110
+
111
+ --color-danger-50: #fee7ef;
112
+ --color-danger-100: #fdd0df;
113
+ --color-danger-200: #faa0bf;
114
+ --color-danger-300: #f871a0;
115
+ --color-danger-400: #f54180;
116
+ --color-danger-500: #f31260;
117
+ --color-danger-600: #c20e4d;
118
+ --color-danger-700: #920b3a;
119
+ --color-danger-800: #610726;
120
+ --color-danger-900: #310413;
121
+ --color-danger: #ed8688;
122
+ --color-danger-foreground: #000;
123
+
124
+ --color-grey-50: #ffffff;
125
+ --color-grey-100: #fefefe;
126
+ --color-grey-200: #f4f4f5;
127
+ --color-grey-300: #eaeaec;
128
+ --color-grey-400: #dfdfe2;
129
+ --color-grey-500: #d5d5d9;
130
+ --color-grey-600: #cbcbd0;
131
+ --color-grey-700: #c1c1c6;
132
+ --color-grey-800: #b6b6bd;
133
+ --color-grey-900: #acacb4;
134
+ --color-grey: #acacb4;
135
+ --color-grey-foreground: #000;
136
+
137
+ --color-content1: #ffffff;
138
+ --color-content1-foreground: #000;
139
+ --color-content2: #f4f4f5;
140
+ --color-content2-foreground: #000;
141
+ --color-content3: #e4e4e7;
142
+ --color-content3-foreground: #000;
143
+ --color-content4: #d4d4d8;
144
+ --color-content4-foreground: #000;
145
+
146
+ --color-focus: #456359;
147
+ --color-overlay: #000000;
148
+
149
+ /* ---------- shadcn semantic tokens (resuelven HSL via :root) ---------- */
150
+ --color-background: hsl(var(--background));
151
+ --color-foreground: hsl(var(--foreground));
152
+ --color-card: hsl(var(--card));
153
+ --color-card-foreground: hsl(var(--card-foreground));
154
+ --color-popover: hsl(var(--popover));
155
+ --color-popover-foreground: hsl(var(--popover-foreground));
156
+ --color-muted: hsl(var(--muted));
157
+ --color-muted-foreground: hsl(var(--muted-foreground));
158
+ --color-accent: hsl(var(--accent));
159
+ --color-accent-foreground: hsl(var(--accent-foreground));
160
+ --color-destructive: hsl(var(--destructive));
161
+ --color-destructive-foreground: hsl(var(--destructive-foreground));
162
+ --color-border: hsl(var(--border));
163
+ --color-input: hsl(var(--input));
164
+ --color-ring: hsl(var(--ring));
165
+
166
+ /* ---------- Animations ---------- */
167
+ --animate-accordion-down: accordion-down 0.2s ease-out;
168
+ --animate-accordion-up: accordion-up 0.2s ease-out;
169
+ }
170
+
171
+ @keyframes accordion-down {
172
+ from {
173
+ height: 0;
174
+ }
175
+ to {
176
+ height: var(--radix-accordion-content-height);
177
+ }
178
+ }
179
+
180
+ @keyframes accordion-up {
181
+ from {
182
+ height: var(--radix-accordion-content-height);
183
+ }
184
+ to {
185
+ height: 0;
186
+ }
187
+ }
188
+
9
189
  :root {
10
190
  --background: 0 0% 100%;
11
191
  --foreground: 0 0% 3.9%;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@agroshine/ags-web-ui-kit",
3
- "version": "1.2.1",
4
- "description": "AgroShine · Luna Nueva · librería de componentes React reutilizables",
3
+ "version": "1.3.1",
4
+ "description": "AgroShine · librería de componentes React reutilizables",
5
5
  "license": "MIT",
6
6
  "author": "AgroShine",
7
7
  "packageManager": "pnpm@10.28.1",
@@ -1,5 +1,5 @@
1
1
  /**
2
- * AgroShine · Luna Nueva — Tailwind preset
2
+ * AgroShine — Tailwind preset
3
3
  *
4
4
  * Consumo desde una app:
5
5
  *
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/organisms/Accordion/Accordion.tsx","../src/organisms/Content/Content.tsx","../src/organisms/FormCard/FormCard.tsx","../src/organisms/Header/BrandLogo.tsx","../src/organisms/Header/FarmChip.tsx","../src/organisms/Header/Header.variants.ts","../src/organisms/Header/SearchBox.tsx","../src/organisms/Header/Header.tsx","../src/organisms/Header/UserAvatar.tsx","../src/organisms/Layout/Layout.tsx","../src/organisms/PageHeader/PageHeader.tsx","../src/organisms/Picker/utils.ts","../src/organisms/Picker/DatePicker.tsx","../src/organisms/Picker/PickerPanel.tsx","../src/organisms/Picker/RangePicker.tsx","../src/organisms/Result/Result.tsx","../src/organisms/QueryState/QueryState.tsx","../src/organisms/SearchFilterBar/SearchCategoryMenu.tsx","../src/organisms/SearchFilterBar/SearchFilterBar.tsx","../src/organisms/SearchFilterBar/SearchSuggestions.tsx","../src/organisms/Sidebar/Sidebar.variants.ts","../src/organisms/Sidebar/Sidebar.tsx","../src/organisms/Toaster/Toaster.tsx","../src/organisms/Tree/Tree.tsx"],"names":["Accordion","defaultValue","value","onChange","forwardRef","Content","jsx","jsxs","SearchBox","Header","useCallback","Layout","Fragment","useState","CalendarIcon","Calendar","POPUP_ALIGN_MAP","POPUP_SIDE_MAP","React","useMemo","Result","QueryState","SearchFilterBar","Search","cva","Sidebar","Toaster","SonnerToaster","Tree"],"mappings":"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","file":"chunk-BZATZ5U5.js","sourcesContent":["import { forwardRef } from 'react';\n\nimport { cn } from '../../lib/cn';\nimport {\n Accordion as AccordionRoot,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from '../../ui/accordion';\n\nimport type { AccordionItemData, AccordionProps, AccordionVariant } from './Accordion.types';\n\n/**\n * Canon Components.html § \"Accordion\" L1254:\n *\n * variant=\"default\" (canon): line dividers — `border-bottom` por item + `border-top` en el primero.\n * variant=\"card\" : cada item es una tarjeta independiente con borde completo,\n * radius 6px, `mb-2`, trigger pad 14/16, hover `bg-muted/50`.\n *\n * `AccordionItemData.number` se renderiza como `acc-num` (chip circular `bg-primary-50 text-primary`)\n * sólo en variant card.\n */\n\nfunction ItemNumber({ value }: { value: React.ReactNode }) {\n return (\n <span className=\"grid h-6 w-6 shrink-0 place-items-center rounded-full bg-primary-50 text-xs font-bold text-primary\">\n {value}\n </span>\n );\n}\n\nfunction renderItems(items: AccordionItemData[], variant: AccordionVariant) {\n const isCard = variant === 'card';\n\n // Default variant (canon HTML L321-329): border-b + first:border-t\n const defaultItemClass = 'border-b border-border first:border-t';\n\n // Card variant (canon HTML L332-340): border full, rounded-md, mb-2, overflow-hidden\n const cardItemClass = 'mb-2 overflow-hidden rounded-md border border-border last:mb-0';\n\n // Trigger override en card: padding 14/16, hover bg-muted/50 + text-foreground,\n // data-[state=open] bg-muted/50, chevron también muted-foreground en hover (no primary).\n const cardTriggerClass =\n 'px-4 py-3.5 hover:bg-muted/50 hover:text-foreground data-[state=open]:bg-muted/50 [&:hover>svg]:text-muted-foreground';\n\n // Content override en card: padding canon, border-top cuando open\n const cardContentClass = 'border-t border-border px-4 pb-4 pt-3.5';\n\n return items.map((item) => (\n <AccordionItem\n key={item.key}\n value={item.key}\n disabled={item.disabled}\n className={isCard ? cardItemClass : defaultItemClass}\n >\n <AccordionTrigger className={isCard ? cardTriggerClass : undefined}>\n <span className=\"flex flex-1 items-center gap-3 text-left\">\n {item.number !== undefined && isCard && <ItemNumber value={item.number} />}\n {item.icon ? <span className=\"shrink-0 text-muted-foreground\">{item.icon}</span> : null}\n <span className=\"flex-1\">{item.title}</span>\n </span>\n </AccordionTrigger>\n <AccordionContent className={isCard ? cardContentClass : undefined}>\n {item.content}\n </AccordionContent>\n </AccordionItem>\n ));\n}\n\nexport const Accordion = forwardRef<HTMLDivElement, AccordionProps>(function Accordion(props, ref) {\n const { items, className, variant = 'default' } = props;\n const children = renderItems(items, variant);\n\n // Variante card NO usa border en el Root (canon `.accordion-card { border:0 }`).\n const rootClass = cn('w-full', className);\n\n if (props.type === 'multiple') {\n const { defaultValue, value, onChange } = props;\n return (\n <AccordionRoot\n ref={ref}\n type=\"multiple\"\n defaultValue={defaultValue}\n value={value}\n onValueChange={onChange}\n className={rootClass}\n >\n {children}\n </AccordionRoot>\n );\n }\n\n const { defaultValue, value, onChange, collapsible } = props;\n return (\n <AccordionRoot\n ref={ref}\n type=\"single\"\n collapsible={collapsible ?? true}\n defaultValue={defaultValue}\n value={value}\n onValueChange={onChange}\n className={rootClass}\n >\n {children}\n </AccordionRoot>\n );\n});\n\nAccordion.displayName = 'Accordion';\n","import { type CSSProperties, forwardRef } from 'react';\n\nimport { cn } from '../../lib/cn';\n\nimport type { ContentProps } from './Content.types';\n\nexport const Content = forwardRef<HTMLElement, ContentProps>(function Content(\n { children, padded = true, maxWidth = 'full', className },\n ref,\n) {\n const isFull = maxWidth === 'full';\n const innerStyle: CSSProperties | undefined = isFull\n ? undefined\n : { maxWidth: typeof maxWidth === 'number' ? `${maxWidth}px` : undefined };\n\n return (\n <main\n ref={ref}\n className={cn('min-h-0 flex-1 bg-default-50 text-foreground overflow-auto', className)}\n >\n <div style={innerStyle} className={cn(padded && 'px-6 py-6', !isFull && 'mx-auto w-full')}>\n {children}\n </div>\n </main>\n );\n});\n\nContent.displayName = 'Content';\n","import React from 'react';\nimport clsx from 'clsx';\n\ninterface FormCardProps {\n title?: string;\n description?: string;\n disabled?: boolean;\n children?: React.ReactNode;\n}\n\nexport const FormCard: React.FC<FormCardProps> = ({\n title,\n description,\n disabled = false,\n children,\n}) => {\n return (\n <article\n className={clsx(\n 'w-auto border box-border border-primary-100/ px-10 py-5 mb-5',\n 'rounded-lg bg-white ',\n disabled && 'pointer-events-none bg-gray-200 cursor-not-allowed rounded-md',\n )}\n >\n {title && <h2 className=\"text-black-900 font-semibold text-[18px] mb-[10px]\">{title}</h2>}\n {description && <p className=\"text-grey-900 text-[14px]\">{description}</p>}\n <div className=\"flex flex-col gap-4\">{children}</div>\n </article>\n );\n};\n","import { cn } from '../../lib/cn';\n\nexport interface BrandLogoProps {\n /** Letra/iniciales mostradas dentro del cuadrado naranja-tierra. */\n mark?: string;\n /** Texto al lado del cuadrado. */\n name?: string;\n className?: string;\n}\n\n/**\n * Brand AgroShine del top nav (canon `.lh-brand` + `.brand-mark`):\n * cuadrado `bg-secondary-500` con la letra \"A\" y el texto \"AgroShine\" al lado.\n * Padding `0 22px 0 18px` + ancho mínimo 240 px para alinear con el sidebar.\n */\nexport function BrandLogo({ mark = 'A', name = 'AgroShine', className }: BrandLogoProps) {\n return (\n <div\n className={cn(\n 'flex h-full min-w-[240px] shrink-0 items-center gap-2.5',\n 'border-r border-white/10 pl-[18px] pr-[22px]',\n className,\n )}\n >\n <span\n aria-hidden\n className={cn(\n 'grid h-7 w-7 place-items-center rounded-md',\n 'bg-secondary-500 text-primary-700 text-sm font-bold leading-none',\n )}\n >\n {mark}\n </span>\n <span className=\"text-[15px] font-semibold text-white\">{name}</span>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nimport { cn } from '../../lib/cn';\n\nexport interface FarmChipProps {\n /** Contenido del chip: ej. \"La Esperanza · Tenjo\". */\n children: ReactNode;\n /** Renderiza un dot ámbar a la izquierda (canon `.lh-farm-dot`). */\n withDot?: boolean;\n className?: string;\n}\n\n/**\n * Pill que muestra la finca/contexto del usuario (canon `.lh-farm`):\n * borde `border-white/20`, padding `4px 12px`, texto pequeño blanco.\n */\nexport function FarmChip({ children, withDot = true, className }: FarmChipProps) {\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full',\n 'border border-white/20 px-3 py-1 text-xs font-medium text-white',\n className,\n )}\n >\n {withDot && <span aria-hidden className=\"h-1.5 w-1.5 rounded-full bg-secondary-500\" />}\n {children}\n </span>\n );\n}\n","import { cva } from 'class-variance-authority';\n\n/**\n * Header AgroShine (canon Components.html · sección \"Header (Top Nav)\" ~L1847):\n *\n * - Bar verde bosque `bg-primary-500` con texto blanco.\n * - Items horizontales con `padding 0 18px`, `font-size 12.5px`, tracking ligero,\n * color `white/80` por defecto.\n * - Item activo: subrayado inferior ámbar (`border-b-2 border-secondary-500`),\n * texto blanco pleno. No usa pill ni background.\n * - Hover en items inactivos: texto blanco pleno (sin background relleno).\n */\nexport const headerItemVariants = cva(\n [\n 'inline-flex h-full items-center gap-2 px-[18px]',\n 'text-[12.5px] font-medium tracking-[0.06em] uppercase',\n 'cursor-pointer select-none outline-none no-underline',\n 'border-b-2 border-transparent transition-colors',\n 'focus-visible:ring-2 focus-visible:ring-secondary-500 focus-visible:ring-inset',\n ],\n {\n variants: {\n active: {\n true: 'text-primary-foreground border-b-secondary-500',\n false: 'text-primary-foreground/80 hover:text-primary-foreground',\n },\n },\n defaultVariants: { active: false },\n },\n);\n","import { type ChangeEvent, type FormEvent, forwardRef, useCallback, useState } from 'react';\nimport { Search } from 'lucide-react';\n\nimport { cn } from '../../lib/cn';\n\nimport type { HeaderSearch } from './Header.types';\n\nexport interface SearchBoxProps extends HeaderSearch {\n className?: string;\n}\n\n/**\n * Search integrado del top nav (canon `.lh-search`):\n * input transparente sobre el verde con `bg-white/10`, borde `border-white/15`,\n * texto blanco, placeholder `white/50`. Ancho ~260 px. Lupa absoluta a la izquierda.\n *\n * Soporta uso controlado (`value` + `onChange`) y no controlado (estado interno).\n */\nexport const SearchBox = forwardRef<HTMLInputElement, SearchBoxProps>(function SearchBox(\n { placeholder = 'Buscar bloque, producto, blanco…', value, onChange, onSubmit, className },\n ref,\n) {\n const [internal, setInternal] = useState(value ?? '');\n const isControlled = value !== undefined;\n const current = isControlled ? value : internal;\n\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const next = event.target.value;\n if (!isControlled) setInternal(next);\n onChange?.(next);\n },\n [isControlled, onChange],\n );\n\n const handleSubmit = useCallback(\n (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n onSubmit?.(current ?? '');\n },\n [current, onSubmit],\n );\n\n return (\n <form role=\"search\" onSubmit={handleSubmit} className={cn('relative w-[260px]', className)}>\n <Search\n aria-hidden\n className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-white/60\"\n />\n <input\n ref={ref}\n type=\"search\"\n value={current}\n onChange={handleChange}\n placeholder={placeholder}\n className={cn(\n 'h-8 w-full rounded-md pl-9 pr-3 text-sm text-white',\n 'bg-white/10 border border-white/15 placeholder:text-white/50',\n 'outline-none focus-visible:ring-2 focus-visible:ring-secondary-500 focus-visible:ring-offset-0',\n '[&::-webkit-search-cancel-button]:hidden',\n )}\n />\n </form>\n );\n});\n","import { type CSSProperties, forwardRef, useCallback } from 'react';\n\nimport { cn } from '../../lib/cn';\n\nimport { BrandLogo } from './BrandLogo';\nimport { FarmChip } from './FarmChip';\nimport type { HeaderItem, HeaderProps, HeaderSearch } from './Header.types';\nimport { headerItemVariants } from './Header.variants';\nimport { SearchBox } from './SearchBox';\n\n/**\n * Header (Top Nav) AgroShine — canon `Components.html` § \"Header (Top Nav)\" L1847.\n *\n * Layout horizontal sobre `bg-primary-500` con borde inferior `border-primary-700`:\n * `[brand] [nav items] [search] [farm chip] [actions] [user]`\n *\n * Compatibilidad: las props originales (`brand`, `items`, `onItemClick`, `actions`,\n * `user`, `className`, `sticky`, `height`) conservan su firma. Se añaden `search` y\n * `farmChip` como slots opcionales. Si no se pasa `brand` se renderiza el brand\n * AgroShine por defecto (cuadrado naranja + \"AgroShine\") para que el componente\n * cumpla con el canon out-of-the-box.\n */\nexport const Header = forwardRef<HTMLElement, HeaderProps>(function Header(\n {\n brand,\n items,\n onItemClick,\n search,\n farmChip,\n actions,\n user,\n className,\n sticky = false,\n height = 60,\n },\n ref,\n) {\n const style: CSSProperties = { height };\n\n const handleClick = useCallback(\n (item: HeaderItem) => {\n item.onClick?.();\n onItemClick?.(item);\n },\n [onItemClick],\n );\n\n const renderItem = (item: HeaderItem) => {\n const itemClassName = headerItemVariants({ active: !!item.active });\n const content = (\n <>\n {item.icon && <span className=\"shrink-0\">{item.icon}</span>}\n <span>{item.label}</span>\n </>\n );\n\n if (item.href) {\n return (\n <a\n key={item.key}\n href={item.href}\n className={itemClassName}\n aria-current={item.active ? 'page' : undefined}\n onClick={() => handleClick(item)}\n >\n {content}\n </a>\n );\n }\n\n return (\n <button\n key={item.key}\n type=\"button\"\n className={cn(itemClassName, 'bg-transparent')}\n aria-current={item.active ? 'page' : undefined}\n onClick={() => handleClick(item)}\n >\n {content}\n </button>\n );\n };\n\n // search === undefined ⇒ oculto; search === false ⇒ oculto; objeto ⇒ visible.\n const searchProps: HeaderSearch | null = search ? search : null;\n\n const hasItems = !!items && items.length > 0;\n\n return (\n <header\n ref={ref}\n style={style}\n className={cn(\n 'flex items-stretch bg-primary-500 text-primary-foreground',\n 'border-b border-primary-700',\n sticky && 'sticky top-0 z-30',\n className,\n )}\n >\n {brand ? <div className=\"flex shrink-0 items-center\">{brand}</div> : <BrandLogo />}\n\n {hasItems && (\n <nav aria-label=\"Navegación principal\" className=\"hidden flex-1 items-stretch pl-2 md:flex\">\n {items!.map(renderItem)}\n </nav>\n )}\n\n {!hasItems && <div className=\"flex-1\" />}\n\n <div className=\"ml-auto flex items-center gap-3.5 px-5\">\n {searchProps && (\n <div className=\"hidden lg:block\">\n <SearchBox {...searchProps} />\n </div>\n )}\n\n {farmChip !== undefined && farmChip !== null && (\n <div className=\"hidden md:flex\">\n {typeof farmChip === 'string' ? <FarmChip>{farmChip}</FarmChip> : farmChip}\n </div>\n )}\n\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\n\n {user && <div className=\"flex shrink-0 items-center\">{user}</div>}\n </div>\n </header>\n );\n});\n\nHeader.displayName = 'Header';\n","import { cn } from '../../lib/cn';\n\nexport interface UserAvatarProps {\n /** Iniciales mostradas dentro del círculo (ej. \"MR\"). */\n initials: string;\n /** Etiqueta accesible (nombre completo). */\n label?: string;\n className?: string;\n onClick?: () => void;\n}\n\n/**\n * Avatar circular del top nav (canon `.avatar.avatar-sm` sobre `.lh-dark`):\n * círculo de 32 px con iniciales sobre `bg-white/15`, border sutil `border-white/20`.\n */\nexport function UserAvatar({ initials, label, className, onClick }: UserAvatarProps) {\n const classes = cn(\n 'inline-flex h-8 w-8 items-center justify-center rounded-full',\n 'bg-white/15 border border-white/20 text-xs font-semibold text-white',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-secondary-500',\n onClick && 'cursor-pointer transition-colors hover:bg-white/25',\n className,\n );\n\n if (onClick) {\n return (\n <button type=\"button\" aria-label={label ?? initials} className={classes} onClick={onClick}>\n {initials}\n </button>\n );\n }\n\n return (\n <span role=\"img\" aria-label={label ?? initials} className={classes}>\n {initials}\n </span>\n );\n}\n","import { forwardRef } from 'react';\n\nimport { cn } from '../../lib/cn';\n\nimport { Content } from '../Content';\n\nimport type { LayoutProps } from './Layout.types';\n\nexport const Layout = forwardRef<HTMLDivElement, LayoutProps>(function Layout(\n { header, sidebar, footer, children, hasHeader, hasSidebar, sidebarCollapsed = false, className },\n ref,\n) {\n const renderHeader = hasHeader ?? !!header;\n const renderSidebar = hasSidebar ?? !!sidebar;\n\n return (\n <div\n ref={ref}\n className={cn('flex h-screen w-full flex-col bg-default-50 text-foreground', className)}\n >\n {renderHeader && header && <div className=\"shrink-0\">{header}</div>}\n\n <div className=\"flex min-h-0 flex-1\">\n {renderSidebar && sidebar && (\n <>\n <aside className=\"hidden shrink-0 lg:flex\">{sidebar}</aside>\n {!sidebarCollapsed && (\n <aside className=\"fixed inset-y-0 left-0 z-40 flex lg:hidden\" aria-hidden=\"false\">\n {sidebar}\n </aside>\n )}\n </>\n )}\n\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <Content padded>{children}</Content>\n {footer && <div className=\"shrink-0\">{footer}</div>}\n </div>\n </div>\n </div>\n );\n});\n\nLayout.displayName = 'Layout';\n","import { FC } from 'react';\nimport { faArrowLeft } from '@fortawesome/free-solid-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\n\nimport { Button } from '../../atoms/Button';\n\ninterface PageHeaderProps {\n title: string;\n subtitle?: string;\n onBack?: () => void;\n headerLeft?: React.ReactNode;\n extra?: React.ReactNode | React.ReactNode[];\n children?: React.ReactNode;\n}\n\nexport const PageHeader: FC<PageHeaderProps> = ({\n title,\n subtitle,\n onBack,\n headerLeft,\n extra,\n children,\n}: PageHeaderProps) => {\n return (\n <div className=\"p-7 flex flex-col gap-5\">\n <div className=\"flex items-start gap-4\">\n {onBack && (\n <Button onPress={onBack} isIconOnly aria-label=\"Back\" color=\"primary\" variant=\"bordered\">\n <FontAwesomeIcon icon={faArrowLeft} />\n </Button>\n )}\n\n <div>\n <h1 className=\"text-2xl font-semibold\">{title}</h1>\n {subtitle && <p className=\"text-sm text-gray-500 mt-1\">{subtitle}</p>}\n </div>\n </div>\n <div className=\"px-2 rounded-md py-3 flex items-center justify-between gap-4\">\n <div className=\"flex items-start gap-4\">{headerLeft}</div>\n {extra && Array.isArray(extra) ? (\n <div className=\"shrink-0\">\n {extra.map((item, index) => (\n <div key={index}>{item}</div>\n ))}\n </div>\n ) : (\n <div className=\"shrink-0\">{extra}</div>\n )}\n </div>\n {children && <div className=\"mt-2\">{children}</div>}\n </div>\n );\n};\n","import dayjs, { type Dayjs } from 'dayjs';\n\nexport const DEFAULT_FORMAT = 'DD/MM/YYYY';\nexport const DEFAULT_FORMATS = ['DD/MM/YYYY', 'DD-MM-YYYY', 'YYYY-MM-DD'];\nexport const INTERNAL_ISO_FORMAT = 'YYYY-MM-DD';\n\nexport function normalizeFormat(format?: string | string[]): string {\n if (!format) return DEFAULT_FORMAT;\n return Array.isArray(format) ? format[0] : format;\n}\n\nexport function dayjsToDate(value?: Dayjs | null): Date | undefined {\n if (!value || !value.isValid()) return undefined;\n return value.toDate();\n}\n\nexport function dateToDayjs(value?: Date | null): Dayjs | null {\n if (!value) return null;\n const parsed = dayjs(value);\n return parsed.isValid() ? parsed : null;\n}\n\nexport function formatDateValue(\n value: Date | null | undefined,\n format?: string | string[],\n): string {\n const parsed = dateToDayjs(value ?? null);\n if (!parsed) return '';\n return parsed.format(normalizeFormat(format));\n}\n\nexport function formatRangeDateValue(\n value: { from?: Date; to?: Date } | null | undefined,\n format?: string | string[],\n): [string, string] {\n if (!value) return ['', ''];\n return [formatDateValue(value.from, format), formatDateValue(value.to, format)];\n}\n\nexport function dayjsRangeToDateRange(\n value?: [Dayjs | null, Dayjs | null] | null,\n): { from?: Date; to?: Date } | undefined {\n if (!value?.[0] || !value?.[1]) return undefined;\n const from = dayjsToDate(value[0]);\n const to = dayjsToDate(value[1]);\n if (!from || !to) return undefined;\n return { from, to };\n}\n\nexport function dateRangeToDayjsRange(\n value?: { from?: Date; to?: Date } | null,\n): [Dayjs | null, Dayjs | null] | null {\n if (!value || !value.from || !value.to) return null;\n return [dateToDayjs(value.from), dateToDayjs(value.to)];\n}\n\n// Backwards-compatible aliases (kept so external callers using the old names still work)\nexport const dayjsToCalendarDate = dayjsToDate;\nexport const calendarDateToDayjs = dateToDayjs;\nexport const dayjsRangeToCalendarRange = dayjsRangeToDateRange;\nexport const calendarRangeToDayjsRange = dateRangeToDayjsRange;\n","import React, { useMemo, useState } from 'react';\nimport { Calendar as CalendarIcon } from 'lucide-react';\n\nimport { FormItem } from '../../atoms/FormItem';\nimport { cn } from '../../lib/cn';\nimport { Calendar } from '../../ui/calendar';\nimport { Popover, PopoverContent, PopoverTrigger } from '../../ui/popover';\n\nimport type { DatePickerProps } from './types';\nimport { dateToDayjs, dayjsToDate, normalizeFormat } from './utils';\n\nconst POPUP_ALIGN_MAP: Record<NonNullable<DatePickerProps['placement']>, 'start' | 'end'> = {\n bottomLeft: 'start',\n bottomRight: 'end',\n topLeft: 'start',\n topRight: 'end',\n};\n\nconst POPUP_SIDE_MAP: Record<NonNullable<DatePickerProps['placement']>, 'top' | 'bottom'> = {\n bottomLeft: 'bottom',\n bottomRight: 'bottom',\n topLeft: 'top',\n topRight: 'top',\n};\n\nexport const DatePicker = React.forwardRef<HTMLDivElement, DatePickerProps>(\n (\n {\n className,\n defaultValue,\n value,\n disabled = false,\n format = 'DD/MM/YYYY',\n open,\n defaultOpen = false,\n onOpenChange,\n placement = 'bottomLeft',\n size = 'medium',\n status,\n minDate,\n maxDate,\n isDateUnavailable,\n onChange,\n externalLabel,\n help,\n errorMessage,\n },\n ref,\n ) => {\n const mergedFormat = useMemo(() => normalizeFormat(format), [format]);\n const hasError = status === 'error' || Boolean(errorMessage);\n const sizeClass = size === 'large' ? 'h-10' : size === 'small' ? 'h-8' : 'h-9';\n\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const isOpen = open !== undefined ? open : internalOpen;\n const setOpen = (next: boolean) => {\n if (open === undefined) setInternalOpen(next);\n onOpenChange?.(next);\n };\n\n const selected = dayjsToDate(value) ?? dayjsToDate(defaultValue);\n const display = selected ? dateToDayjs(selected)?.format(mergedFormat) : '';\n\n return (\n <FormItem label={externalLabel} help={help} validateStatus={hasError ? 'error' : 'default'}>\n <div ref={ref}>\n <Popover open={isOpen} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={externalLabel ?? 'Fecha'}\n aria-invalid={hasError || undefined}\n className={cn(\n // Mismas clases que ui/input · canon Components.html\n 'flex w-full items-center justify-between gap-2 rounded-md border border-input bg-background px-3 py-1 text-sm text-foreground transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-0',\n 'aria-invalid:border-destructive aria-invalid:focus-visible:ring-destructive',\n 'disabled:cursor-not-allowed disabled:bg-muted disabled:opacity-60',\n sizeClass,\n className,\n )}\n >\n <span className={cn(!display && 'text-muted-foreground')}>\n {display || mergedFormat}\n </span>\n <CalendarIcon\n className=\"h-4 w-4 shrink-0 text-muted-foreground\"\n aria-hidden=\"true\"\n />\n </button>\n </PopoverTrigger>\n <PopoverContent\n align={POPUP_ALIGN_MAP[placement]}\n side={POPUP_SIDE_MAP[placement]}\n className=\"w-auto p-0 z-[9999]\"\n >\n <Calendar\n mode=\"single\"\n selected={selected}\n fromDate={dayjsToDate(minDate)}\n toDate={dayjsToDate(maxDate)}\n disabled={\n isDateUnavailable ? (date: Date) => Boolean(isDateUnavailable(date)) : undefined\n }\n onSelect={(d) => {\n const parsed = dateToDayjs(d ?? null);\n onChange?.(parsed, parsed ? parsed.format(mergedFormat) : '');\n setOpen(false);\n }}\n />\n </PopoverContent>\n </Popover>\n </div>\n </FormItem>\n );\n },\n);\n\nDatePicker.displayName = 'DatePicker';\n","import React from 'react';\n\nimport { Calendar } from '../../ui/calendar';\n\nimport type { PickerPanelProps } from './types';\nimport { dateToDayjs, dayjsToDate } from './utils';\n\nexport const PickerPanel: React.FC<PickerPanelProps> = ({\n value,\n defaultValue,\n minDate,\n maxDate,\n onChange,\n isDateUnavailable,\n className,\n}) => {\n const selected = dayjsToDate(value) ?? dayjsToDate(defaultValue);\n\n return (\n <Calendar\n mode=\"single\"\n className={className}\n selected={selected}\n fromDate={dayjsToDate(minDate)}\n toDate={dayjsToDate(maxDate)}\n disabled={isDateUnavailable ? (date: Date) => Boolean(isDateUnavailable(date)) : undefined}\n onSelect={(d) => onChange?.(dateToDayjs(d ?? null))}\n />\n );\n};\n","import React, { useMemo, useState } from 'react';\nimport type { DateRange } from 'react-day-picker';\nimport { Calendar as CalendarIcon } from 'lucide-react';\n\nimport { FormItem } from '../../atoms/FormItem';\nimport { cn } from '../../lib/cn';\nimport { Calendar } from '../../ui/calendar';\nimport { Popover, PopoverContent, PopoverTrigger } from '../../ui/popover';\n\nimport type { RangePickerProps } from './types';\nimport {\n dateRangeToDayjsRange,\n dayjsRangeToDateRange,\n dayjsToDate,\n formatRangeDateValue,\n normalizeFormat,\n} from './utils';\n\nconst POPUP_ALIGN_MAP: Record<NonNullable<RangePickerProps['placement']>, 'start' | 'end'> = {\n bottomLeft: 'start',\n bottomRight: 'end',\n topLeft: 'start',\n topRight: 'end',\n};\n\nconst POPUP_SIDE_MAP: Record<NonNullable<RangePickerProps['placement']>, 'top' | 'bottom'> = {\n bottomLeft: 'bottom',\n bottomRight: 'bottom',\n topLeft: 'top',\n topRight: 'top',\n};\n\nexport const RangePicker = React.forwardRef<HTMLDivElement, RangePickerProps>(\n (\n {\n className,\n defaultValue,\n value,\n disabled = false,\n format = 'DD/MM/YYYY',\n open,\n defaultOpen = false,\n onOpenChange,\n placement = 'bottomLeft',\n size = 'medium',\n status,\n minDate,\n maxDate,\n isDateUnavailable,\n visibleMonths = 1,\n onChange,\n onCalendarChange,\n externalLabel,\n help,\n errorMessage,\n },\n ref,\n ) => {\n const mergedFormat = useMemo(() => normalizeFormat(format), [format]);\n const hasError = status === 'error' || Boolean(errorMessage);\n const sizeClass = size === 'large' ? 'h-10' : size === 'small' ? 'h-8' : 'h-9';\n\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const isOpen = open !== undefined ? open : internalOpen;\n const setOpen = (next: boolean) => {\n if (open === undefined) setInternalOpen(next);\n onOpenChange?.(next);\n };\n\n const range = dayjsRangeToDateRange(value) ?? dayjsRangeToDateRange(defaultValue);\n const formatted = formatRangeDateValue(range, mergedFormat);\n const display = range ? `${formatted[0]} – ${formatted[1]}` : '';\n\n return (\n <FormItem label={externalLabel} help={help} validateStatus={hasError ? 'error' : 'default'}>\n <div ref={ref}>\n <Popover open={isOpen} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={externalLabel ?? 'Rango de fechas'}\n aria-invalid={hasError || undefined}\n className={cn(\n // Mismas clases que ui/input · canon Components.html\n 'flex w-full items-center justify-between gap-2 rounded-md border border-input bg-background px-3 py-1 text-sm text-foreground transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-0',\n 'aria-invalid:border-destructive aria-invalid:focus-visible:ring-destructive',\n 'disabled:cursor-not-allowed disabled:bg-muted disabled:opacity-60',\n sizeClass,\n className,\n )}\n >\n <span className={cn(!display && 'text-muted-foreground')}>\n {display || `${mergedFormat} – ${mergedFormat}`}\n </span>\n <CalendarIcon\n className=\"h-4 w-4 shrink-0 text-muted-foreground\"\n aria-hidden=\"true\"\n />\n </button>\n </PopoverTrigger>\n <PopoverContent\n align={POPUP_ALIGN_MAP[placement]}\n side={POPUP_SIDE_MAP[placement]}\n className=\"w-auto p-0 z-[9999]\"\n >\n <Calendar\n mode=\"range\"\n numberOfMonths={visibleMonths}\n selected={range as DateRange | undefined}\n fromDate={dayjsToDate(minDate)}\n toDate={dayjsToDate(maxDate)}\n disabled={\n isDateUnavailable ? (date: Date) => Boolean(isDateUnavailable(date)) : undefined\n }\n onSelect={(next: DateRange | undefined) => {\n const dayjsRange = dateRangeToDayjsRange(next ?? null);\n const dateStrings = formatRangeDateValue(next ?? null, mergedFormat);\n onChange?.(dayjsRange, dateStrings);\n if (dayjsRange) onCalendarChange?.(dayjsRange, dateStrings, {});\n }}\n />\n </PopoverContent>\n </Popover>\n </div>\n </FormItem>\n );\n },\n);\n\nRangePicker.displayName = 'RangePicker';\n","import { forwardRef, type ReactNode } from 'react';\nimport {\n AlertTriangle,\n CheckCircle2,\n FileQuestion,\n Info,\n ServerCrash,\n XCircle,\n} from 'lucide-react';\n\nimport { cn } from '../../lib/cn';\n\nimport type { ResultProps, ResultStatus } from './Result.types';\n\n/**\n * Canon Components.html § \"Result\" L1762 / CSS L547-555:\n * .result { padding:40px 24px; text-align:center; }\n * .result .ic { font-size:56px; margin-bottom:12px; line-height:1; }\n * .result.success .ic { color:success-500; }\n * .result.warning .ic { color:warning-500; }\n * .result.error .ic { color:destructive; }\n * .result.info .ic { color:primary; }\n * .result .ttl { font-size:22px; font-weight:600; margin:0 0 8px; }\n * .result .desc{ font-size:14px; color:muted-foreground; max-width:400px; line-height:1.5; }\n * .result .acts{ margin-top:20px; gap:8px; justify-content:center; }\n */\n\nconst ICON_MAP: Record<ResultStatus, ReactNode> = {\n success: <CheckCircle2 className=\"h-14 w-14\" />,\n error: <XCircle className=\"h-14 w-14\" />,\n warning: <AlertTriangle className=\"h-14 w-14\" />,\n info: <Info className=\"h-14 w-14\" />,\n '404': <FileQuestion className=\"h-14 w-14\" />,\n '500': <ServerCrash className=\"h-14 w-14\" />,\n};\n\nconst COLOR_MAP: Record<ResultStatus, string> = {\n success: 'text-success-500',\n error: 'text-destructive',\n warning: 'text-warning-500',\n info: 'text-primary',\n '404': 'text-muted-foreground',\n '500': 'text-destructive',\n};\n\nexport const Result = forwardRef<HTMLDivElement, ResultProps>(function Result(\n { status, title, description, icon, extra, className },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={cn('flex flex-col items-center justify-center px-6 py-10 text-center', className)}\n >\n <div\n className={cn(\n 'mb-3 inline-flex items-center justify-center leading-none',\n COLOR_MAP[status],\n )}\n >\n {icon ?? ICON_MAP[status]}\n </div>\n <h3 className=\"mb-2 text-[22px] font-semibold leading-tight text-foreground\">{title}</h3>\n {description && (\n <p className=\"mx-auto max-w-[400px] text-sm leading-normal text-muted-foreground\">\n {description}\n </p>\n )}\n {extra && (\n <div className=\"mt-5 flex flex-wrap items-center justify-center gap-2\">{extra}</div>\n )}\n </div>\n );\n});\n\nResult.displayName = 'Result';\n","import { forwardRef } from 'react';\n\nimport { Button } from '../../atoms/Button';\nimport { Spinner } from '../../atoms/Spinners';\nimport { cn } from '../../lib/cn';\n\nimport { Result } from '../Result';\n\nimport type { QueryStateProps } from './QueryState.types';\n\nfunction getErrorMessage(error: unknown): string | undefined {\n if (!error) return undefined;\n if (typeof error === 'string') return error;\n if (error instanceof Error) return error.message;\n if (typeof error === 'object' && 'message' in error) {\n const msg = (error as { message?: unknown }).message;\n return typeof msg === 'string' ? msg : undefined;\n }\n return undefined;\n}\n\nexport const QueryState = forwardRef<HTMLDivElement, QueryStateProps>(function QueryState(\n {\n loading,\n error,\n empty,\n emptyTitle = 'Sin resultados',\n emptyDescription,\n emptyAction,\n errorTitle = 'Algo salió mal',\n errorDescription,\n onRetry,\n loadingFallback,\n children,\n className,\n },\n ref,\n) {\n if (loading) {\n return (\n <div ref={ref} className={cn('flex w-full items-center justify-center', className)}>\n {loadingFallback ?? <Spinner />}\n </div>\n );\n }\n\n if (error) {\n const description = errorDescription ?? getErrorMessage(error);\n return (\n <div ref={ref} className={className}>\n <Result\n status=\"error\"\n title={errorTitle}\n description={description}\n extra={\n onRetry && (\n <Button color=\"primary\" variant=\"bordered\" onPress={onRetry}>\n Reintentar\n </Button>\n )\n }\n />\n </div>\n );\n }\n\n if (empty) {\n return (\n <div ref={ref} className={className}>\n <Result\n status=\"info\"\n title={emptyTitle}\n description={emptyDescription}\n extra={emptyAction}\n />\n </div>\n );\n }\n\n return <>{children}</>;\n});\n\nQueryState.displayName = 'QueryState';\n","import type { Option } from '../../atoms/Select/interface';\nimport { cn } from '../../lib/cn';\n\ninterface SearchCategoryMenuProps {\n options: Option[];\n isActive: (value: string) => boolean;\n onSelect: (value: string) => void;\n multi?: boolean;\n}\n\n/**\n * Canon Components.html § \"Search Bar > Categoría abierta\":\n * item flex gap-12, padding 10/12, radius-6; hover + active bg-primary-50 con text-primary.\n * icono 18×18 a la izquierda; en modo multi se antepone un checkbox.\n */\nexport const SearchCategoryMenu = ({\n options,\n isActive,\n onSelect,\n multi,\n}: SearchCategoryMenuProps) => (\n <>\n {options.map((opt) => {\n const v = String(opt.value);\n const active = isActive(v);\n return (\n <button\n key={v}\n type=\"button\"\n onClick={() => onSelect(v)}\n disabled={opt.disabled}\n className={cn(\n 'flex w-full items-center gap-3 rounded-md px-3 py-2.5 text-left text-sm transition-colors',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n active\n ? 'bg-primary-50 text-primary'\n : 'text-foreground hover:bg-primary-50 hover:text-primary',\n )}\n >\n {multi && (\n <input\n type=\"checkbox\"\n readOnly\n checked={active}\n tabIndex={-1}\n className=\"h-4 w-4 shrink-0 accent-primary\"\n />\n )}\n {opt.leadingIcon && (\n <span className=\"shrink-0 text-primary [&_svg]:h-[18px] [&_svg]:w-[18px]\">\n {opt.leadingIcon}\n </span>\n )}\n <span className=\"flex-1 truncate\">{opt.label}</span>\n </button>\n );\n })}\n </>\n);\n","import type { ReactNode } from 'react';\nimport { forwardRef, useCallback, useMemo, useRef, useState } from 'react';\nimport { ChevronDown, Search, X } from 'lucide-react';\n\nimport type { Option } from '../../atoms/Select/interface';\nimport { cn } from '../../lib/cn';\nimport { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } from '../../ui/popover';\n\nimport { SearchCategoryMenu } from './SearchCategoryMenu';\n\n/**\n * Canon Components.html § \"Search Bar\" L380-1597:\n * `.search-bar` h-48, border 1.5px primary-200, rounded-8px.\n * states: hover→primary-400, focus-within→primary.\n * `.sb-cat` w-190, gap-12, font-semibold, primary; chevron rota 180° on open.\n * `.sb-sep` 1×24, primary-200.\n * `.sb-input` flex-1, transparent, sin borde.\n * `.sb-actions` gap-12, pr-16. `.sb-icon-btn` 24×24 con SVG 20×20.\n * `.sb-clear` muted-foreground; `.sb-search` primary; hover primary-600.\n * dropdown categoría `.sb-cat-menu` 280px; item activo bg-primary-50.\n */\n\ntype BaseProps = {\n options: Option[];\n searchValue: string;\n onSearchChange: (value: string) => void;\n searchPlaceholder?: string;\n onSearch?: (value: string) => void;\n onClear?: () => void;\n /** Render del clear button. Default: visible cuando hay texto. */\n showClear?: boolean;\n /** Panel de sugerencias bajo la barra. */\n suggestions?: ReactNode;\n /** Control externo del panel de sugerencias. Si se omite: abierto cuando input está enfocado, hay texto y existen `suggestions`. */\n suggestionsOpen?: boolean;\n /** Ancho del dropdown de categoría. Default 280px (canon). */\n categoryMenuWidth?: number;\n className?: string;\n};\n\ntype SingleProps = BaseProps & {\n categoryMultiSelect?: false;\n selectedOption: string;\n onOptionChange: (value: string) => void;\n};\n\ntype MultiProps = BaseProps & {\n categoryMultiSelect: true;\n selectedOptions: string[];\n onOptionsChange: (values: string[]) => void;\n /** Label del trigger cuando hay selección múltiple. Default: `\"${count} elementos...\"`. */\n categoryMultiLabel?: (count: number) => string;\n /** Label cuando no hay selección. Default: 'Categorías'. */\n categoryEmptyLabel?: string;\n};\n\nexport type SearchFilterBarProps = SingleProps | MultiProps;\n\nexport const SearchFilterBar = forwardRef<HTMLDivElement, SearchFilterBarProps>(\n function SearchFilterBar(props, ref) {\n const {\n options,\n searchValue,\n onSearchChange,\n searchPlaceholder = 'Busca en la categoría seleccionada',\n onSearch,\n onClear,\n showClear = true,\n suggestions,\n suggestionsOpen,\n categoryMenuWidth = 280,\n className,\n } = props;\n\n const [catOpen, setCatOpen] = useState(false);\n const [focused, setFocused] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const isMulti = props.categoryMultiSelect === true;\n\n const categoryLabel = useMemo(() => {\n if (isMulti) {\n const selected = (props as MultiProps).selectedOptions;\n if (selected.length === 0) {\n return (props as MultiProps).categoryEmptyLabel ?? 'Categorías';\n }\n const labelFn = (props as MultiProps).categoryMultiLabel;\n return labelFn?.(selected.length) ?? `${selected.length} elementos...`;\n }\n const v = (props as SingleProps).selectedOption;\n return options.find((o) => String(o.value) === v)?.label ?? v;\n }, [isMulti, props, options]);\n\n const isOptionActive = useCallback(\n (v: string) => {\n if (isMulti) return (props as MultiProps).selectedOptions.includes(v);\n return (props as SingleProps).selectedOption === v;\n },\n [isMulti, props],\n );\n\n const handleSelect = useCallback(\n (v: string) => {\n if (isMulti) {\n const selected = (props as MultiProps).selectedOptions;\n const next = selected.includes(v) ? selected.filter((x) => x !== v) : [...selected, v];\n (props as MultiProps).onOptionsChange(next);\n } else {\n (props as SingleProps).onOptionChange(v);\n setCatOpen(false);\n }\n },\n [isMulti, props],\n );\n\n const showSuggestions =\n suggestionsOpen ?? (focused && searchValue.length > 0 && suggestions !== undefined);\n\n return (\n <div ref={ref} className={cn('relative', className)}>\n <Popover open={catOpen} onOpenChange={setCatOpen}>\n <PopoverAnchor asChild>\n <div\n className={cn(\n 'flex h-12 items-center rounded-lg border-[1.5px] bg-background transition-colors',\n catOpen || focused\n ? 'border-primary'\n : 'border-primary-200 hover:border-primary-400',\n )}\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"flex h-full w-[190px] shrink-0 cursor-pointer items-center gap-3 border-0 bg-transparent px-4 text-left text-sm font-semibold text-primary focus:outline-none\"\n aria-haspopup=\"listbox\"\n aria-expanded={catOpen}\n >\n <span className=\"flex-1 truncate\">{categoryLabel}</span>\n <ChevronDown\n aria-hidden=\"true\"\n className={cn(\n 'h-3 w-3 shrink-0 transition-transform duration-200',\n catOpen && 'rotate-180',\n )}\n />\n </button>\n </PopoverTrigger>\n\n <div aria-hidden=\"true\" className=\"h-6 w-px shrink-0 bg-primary-200\" />\n\n <input\n ref={inputRef}\n type=\"text\"\n value={searchValue}\n onChange={(e) => onSearchChange(e.target.value)}\n onFocus={() => setFocused(true)}\n onBlur={() => {\n // Canon usa setTimeout 120ms para permitir click en sugerencias antes de cerrar.\n window.setTimeout(() => setFocused(false), 120);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') onSearch?.(searchValue);\n }}\n placeholder={searchPlaceholder}\n className=\"h-full min-w-0 flex-1 border-0 bg-transparent pl-4 pr-3 text-sm text-foreground outline-none placeholder:text-muted-foreground\"\n />\n\n <div className=\"flex shrink-0 items-center gap-3 pr-4\">\n {showClear && searchValue && (\n <button\n type=\"button\"\n aria-label=\"Limpiar\"\n onClick={() => {\n onSearchChange('');\n onClear?.();\n inputRef.current?.focus();\n }}\n className=\"grid h-6 w-6 cursor-pointer place-items-center border-0 bg-transparent p-0 text-muted-foreground hover:text-foreground\"\n >\n <X aria-hidden=\"true\" className=\"h-5 w-5\" />\n </button>\n )}\n <button\n type=\"button\"\n aria-label=\"Buscar\"\n onClick={() => onSearch?.(searchValue)}\n className=\"grid h-6 w-6 cursor-pointer place-items-center border-0 bg-transparent p-0 text-primary hover:text-primary-600\"\n >\n <Search aria-hidden=\"true\" className=\"h-5 w-5\" />\n </button>\n </div>\n </div>\n </PopoverAnchor>\n\n <PopoverContent\n align=\"start\"\n sideOffset={6}\n style={{ width: categoryMenuWidth }}\n className=\"p-1.5\"\n >\n <SearchCategoryMenu\n options={options}\n isActive={isOptionActive}\n onSelect={handleSelect}\n multi={isMulti}\n />\n </PopoverContent>\n </Popover>\n\n {showSuggestions && (\n <div\n className=\"absolute inset-x-0 top-full z-20 mt-1.5 overflow-hidden rounded-lg border border-border bg-popover shadow-md\"\n onMouseDown={(e) => e.preventDefault()}\n >\n {suggestions}\n </div>\n )}\n </div>\n );\n },\n);\n\nSearchFilterBar.displayName = 'SearchFilterBar';\n","import type { ReactNode } from 'react';\nimport { ArrowUpRight } from 'lucide-react';\n\nimport { cn } from '../../lib/cn';\n\n/**\n * Helpers para el panel `.sb-pop.sb-suggest` del canon.\n * `.sb-row` padding 12/18, border-bottom border.\n * `.sb-row.query` foreground, weight 500.\n * `.sb-row.head` flex justify-between, weight 600; link en primary.\n * `.sb-suggest-item` clickable, hover bg-primary-50; active bg-primary-50.\n * `.sb-suggest-footer` separa el total seleccionado.\n * `.sb-suggest-empty` empty state.\n */\n\nexport const SearchSuggestRow = ({\n children,\n className,\n}: {\n children: ReactNode;\n className?: string;\n}) => (\n <div className={cn('border-b border-border px-[18px] py-3 text-sm last:border-0', className)}>\n {children}\n </div>\n);\n\nexport const SearchSuggestQuery = ({ children }: { children: ReactNode }) => (\n <SearchSuggestRow className=\"font-medium text-foreground\">{children}</SearchSuggestRow>\n);\n\nexport const SearchSuggestHeader = ({\n title,\n action,\n}: {\n title: ReactNode;\n action?: ReactNode;\n}) => (\n <SearchSuggestRow className=\"flex items-center justify-between font-semibold text-foreground\">\n <span>{title}</span>\n {action && (\n <span className=\"cursor-pointer text-[13.5px] font-medium text-primary underline underline-offset-[3px]\">\n {action}\n </span>\n )}\n </SearchSuggestRow>\n);\n\nexport const SearchSuggestItem = ({\n active,\n withLinkIcon,\n onClick,\n children,\n className,\n}: {\n active?: boolean;\n withLinkIcon?: boolean;\n onClick?: () => void;\n children: ReactNode;\n className?: string;\n}) => (\n <div\n role=\"option\"\n aria-selected={active}\n onClick={onClick}\n className={cn(\n 'flex cursor-pointer items-center gap-3 border-b border-border px-[18px] py-3 text-sm text-foreground transition-colors last:border-0 hover:bg-primary-50',\n active && 'bg-primary-50',\n className,\n )}\n >\n <span className=\"flex-1\">{children}</span>\n {withLinkIcon && (\n <ArrowUpRight aria-hidden=\"true\" className=\"h-4 w-4 shrink-0 text-foreground\" />\n )}\n </div>\n);\n\nexport const SearchSuggestFooter = ({ children }: { children: ReactNode }) => (\n <div className=\"border-t border-border px-[18px] py-3 text-xs text-muted-foreground\">\n {children}\n </div>\n);\n\nexport const SearchSuggestEmpty = ({\n title,\n description,\n}: {\n title: string;\n description?: string;\n}) => (\n <div className=\"px-[18px] py-7 text-center\">\n <p className=\"text-sm font-semibold text-foreground\">{title}</p>\n {description && (\n <p className=\"mx-auto mt-1.5 max-w-[36ch] text-xs text-muted-foreground\">{description}</p>\n )}\n </div>\n);\n","import { cva } from 'class-variance-authority';\n\n/**\n * Canon Components.html § \"Sidebar\" L1861 / CSS L601-615 (`ls-light` variant):\n *\n * .ls-light { bg: hsl(0 0% 98%); border-right: 1px solid border; padding: 14px 0 24px; }\n * .ls-item { padding: 8px 18px 8px 32px; gap: 10px; font-size: 13px;\n * color: muted-foreground; border-left: 2px solid transparent; }\n * .ls-item:hover { bg: muted; color: foreground; }\n * .ls-item.active { bg: primary-50; color: primary-500; font-weight: 600;\n * border-left-color: primary-500; }\n * .ls-item .dot { 5px circle, bg muted-foreground opacity 0.4 }\n * .ls-item.active .dot { bg: primary-500; opacity 1 }\n * .ls-badge { font-size 10.5px bg muted text-muted-foreground rounded-full px-[7px] py-px }\n * .ls-item.active .ls-badge { bg: white text: primary-500 border: primary-100 }\n */\nexport const sidebarItemVariants = cva(\n [\n 'group/sb-item relative flex items-center gap-2.5 text-[13px] cursor-pointer select-none outline-none',\n 'pl-8 pr-[18px] py-2',\n 'border-l-2 border-l-transparent',\n 'transition-colors',\n ],\n {\n variants: {\n active: {\n true: 'bg-primary-50 text-primary-500 font-semibold border-l-primary-500',\n false: 'text-muted-foreground hover:bg-muted hover:text-foreground',\n },\n disabled: {\n true: 'opacity-40 pointer-events-none',\n false: '',\n },\n },\n defaultVariants: { active: false, disabled: false },\n },\n);\n\n/** Group label (canon `.ls-glabel`). */\nexport const sidebarGroupLabelVariants = cva(\n 'flex items-center justify-between gap-2 px-[18px] pt-3.5 pb-1.5 text-[10.5px] font-semibold uppercase tracking-[0.1em] text-muted-foreground cursor-pointer select-none',\n);\n\n/** Dot del item (`.ls-item .dot`). */\nexport const sidebarDotVariants = cva('h-[5px] w-[5px] shrink-0 rounded-full transition-colors', {\n variants: {\n active: {\n true: 'bg-primary-500 opacity-100',\n false: 'bg-muted-foreground opacity-40 group-hover/sb-item:opacity-60',\n },\n },\n defaultVariants: { active: false },\n});\n\n/** Badge del item (`.ls-badge`). */\nexport const sidebarBadgeVariants = cva(\n 'ml-auto rounded-full px-[7px] py-px text-[10.5px] font-semibold leading-tight',\n {\n variants: {\n active: {\n true: 'bg-background text-primary-500 border border-primary-100',\n false: 'bg-muted text-muted-foreground',\n },\n },\n defaultVariants: { active: false },\n },\n);\n","import { type CSSProperties, forwardRef, type ReactNode, useCallback, useState } from 'react';\n\nimport { cn } from '../../lib/cn';\n\nimport type { SidebarGroup, SidebarItem, SidebarProps } from './Sidebar.types';\nimport {\n sidebarBadgeVariants,\n sidebarDotVariants,\n sidebarGroupLabelVariants,\n sidebarItemVariants,\n} from './Sidebar.variants';\n\n/**\n * Sidebar AgroShine (canon Components.html § \"Sidebar\" L1861).\n *\n * Patrón \"ls-light\" exacto del HTML:\n * - Aside light (`bg-default-50`) con border-right.\n * - Header de **contexto** (label + title + sub) opcional.\n * - Grupos **colapsables** con chevron rotando + items dentro.\n * - Items con **dot** a la izquierda, label, badge a la derecha (opcional).\n * - Active item: `bg-primary-50 + text-primary-500 + font-semibold +\n * border-LEFT primary-500`; dot pasa a primary; badge `bg-white text-primary\n * border-primary-100`.\n *\n * API compat: `groups`, `brand`, `footer`, `onItemClick`, `width`, `collapsed*`\n * se mantienen. Se añaden `context` y `groups[].collapsible/defaultOpen`.\n */\n\nfunction Chevron({ open, className }: { open: boolean; className?: string }) {\n return (\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n className={cn(\n 'h-2.5 w-2.5 shrink-0 transition-transform duration-200',\n open ? 'rotate-180' : '',\n className,\n )}\n >\n <path\n d=\"M4 6l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\ninterface ItemRowProps {\n item: SidebarItem;\n onClick?: (item: SidebarItem) => void;\n}\n\nfunction ItemRow({ item, onClick }: ItemRowProps) {\n const isActive = !!item.active;\n const itemClass = sidebarItemVariants({ active: isActive, disabled: !!item.disabled });\n\n const inner: ReactNode = (\n <>\n {item.icon ?? (\n <span className={sidebarDotVariants({ active: isActive })} aria-hidden=\"true\" />\n )}\n <span className=\"flex-1 truncate\">{item.label}</span>\n {item.badge != null && (\n <span className={sidebarBadgeVariants({ active: isActive })}>{item.badge}</span>\n )}\n </>\n );\n\n if (item.href) {\n return (\n <a\n href={item.href}\n aria-current={isActive ? 'page' : undefined}\n aria-disabled={item.disabled || undefined}\n onClick={(e) => {\n if (item.disabled) e.preventDefault();\n onClick?.(item);\n }}\n className={cn(itemClass, 'no-underline')}\n >\n {inner}\n </a>\n );\n }\n\n return (\n <button\n type=\"button\"\n disabled={item.disabled}\n aria-current={isActive ? 'page' : undefined}\n onClick={() => onClick?.(item)}\n className={cn(itemClass, 'w-full bg-transparent text-left')}\n >\n {inner}\n </button>\n );\n}\n\ninterface GroupBlockProps {\n group: SidebarGroup;\n onItemClick?: (item: SidebarItem) => void;\n}\n\nfunction GroupBlock({ group, onItemClick }: GroupBlockProps) {\n const isCollapsible = group.collapsible ?? true;\n const [open, setOpen] = useState(group.defaultOpen ?? true);\n\n return (\n <div className=\"py-1\">\n {group.label && (\n <div\n className={sidebarGroupLabelVariants()}\n onClick={isCollapsible ? () => setOpen((v) => !v) : undefined}\n role={isCollapsible ? 'button' : undefined}\n aria-expanded={isCollapsible ? open : undefined}\n >\n <span>{group.label}</span>\n {isCollapsible && <Chevron open={open} />}\n </div>\n )}\n\n {(open || !isCollapsible) && (\n <div className=\"flex flex-col\">\n {group.items.map((item) => (\n <ItemRow key={item.key} item={item} onClick={onItemClick} />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nexport const Sidebar = forwardRef<HTMLElement, SidebarProps>(function Sidebar(\n {\n groups,\n context,\n brand,\n footer,\n onItemClick,\n onCollapsedChange,\n collapsed = false,\n width = 260,\n className,\n },\n ref,\n) {\n const style: CSSProperties = { width };\n\n const handleItemClick = useCallback(\n (item: SidebarItem) => {\n if (item.disabled) return;\n onItemClick?.(item);\n },\n [onItemClick],\n );\n\n // Versión colapsada: mostramos solo icons/dots, sin labels (variante reducida).\n if (collapsed) {\n return (\n <aside\n ref={ref}\n style={{ width: 64 }}\n className={cn(\n 'flex h-full flex-col overflow-y-auto border-r border-border bg-default-50 py-3.5',\n className,\n )}\n >\n {brand && <div className=\"flex items-center justify-center pb-3\">{brand}</div>}\n {onCollapsedChange && (\n <button\n type=\"button\"\n onClick={() => onCollapsedChange(false)}\n aria-label=\"Expandir sidebar\"\n className=\"mx-auto mb-2 rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n <Chevron open className=\"-rotate-90\" />\n </button>\n )}\n </aside>\n );\n }\n\n return (\n <aside\n ref={ref}\n style={style}\n className={cn(\n // Canon `.ls-light`: bg, border-right, padding 14 0 24\n 'flex h-full flex-col overflow-y-auto border-r border-border bg-default-50 pt-3.5 pb-6',\n className,\n )}\n >\n {brand && <div className=\"px-[18px] pb-3\">{brand}</div>}\n\n {context && (\n <div className=\"px-[18px] pb-3.5 pt-2\">\n {context.label && (\n <div className=\"text-[10.5px] font-semibold uppercase tracking-[0.1em] text-muted-foreground\">\n {context.label}\n </div>\n )}\n <div className=\"mt-1 text-[18px] font-bold leading-tight text-foreground\">\n {context.title}\n </div>\n {context.sub && <div className=\"mt-0.5 text-xs text-muted-foreground\">{context.sub}</div>}\n </div>\n )}\n\n <nav className=\"flex-1\">\n {groups.map((group) => (\n <GroupBlock key={group.key} group={group} onItemClick={handleItemClick} />\n ))}\n </nav>\n\n {footer && (\n <div className=\"mt-2 border-t border-border px-[18px] pt-3 text-xs text-muted-foreground\">\n {footer}\n </div>\n )}\n </aside>\n );\n});\n\nSidebar.displayName = 'Sidebar';\n","import { forwardRef } from 'react';\nimport { Toaster as SonnerToaster, type ToasterProps as SonnerToasterProps } from 'sonner';\n\nimport { cn } from '../../lib/cn';\n\nexport interface ToasterProps extends SonnerToasterProps {\n className?: string;\n}\n\n/**\n * Toaster AgroShine — wrapper sobre `sonner` alineado al canon HTML\n * (`Components.html` § Toast · Sonner).\n *\n * - `position` default: `top-right` (canon: stack arriba-derecha).\n * - `theme` default: `light` (la lib aún no soporta dark-mode global).\n * - `richColors` desactivado: las variantes (`success`, `error`,\n * `warning`, `info`) reciben classNames manuales basados en\n * tokens semánticos AgroShine (paletas `success-*`, `warning-*`,\n * `danger-*`, `primary-*`).\n * - `closeButton: true` — botón de dismiss visible (canon § Toast).\n *\n * Estructura visual: `grid 18px 1fr auto` (icon · texto · acción/dismiss).\n */\nexport const Toaster = forwardRef<HTMLElement, ToasterProps>(function Toaster(\n { className, position = 'top-right', theme = 'light', ...rest },\n _ref,\n) {\n return (\n <SonnerToaster\n position={position}\n theme={theme}\n richColors={false}\n closeButton\n toastOptions={{\n classNames: {\n toast: cn(\n // Canon `.toast`: grid icon · texto · acción, bg-background,\n // border, radius-md, padding 14/16, shadow-lg, items-start.\n 'group toast',\n 'group-[.toaster]:grid group-[.toaster]:grid-cols-[18px_1fr_auto] group-[.toaster]:gap-3 group-[.toaster]:items-start',\n 'group-[.toaster]:bg-background group-[.toaster]:text-foreground',\n 'group-[.toaster]:border group-[.toaster]:border-border',\n 'group-[.toaster]:rounded-md group-[.toaster]:px-4 group-[.toaster]:py-3.5',\n 'group-[.toaster]:shadow-lg',\n className,\n ),\n title: 'text-sm font-semibold text-foreground',\n description: 'group-[.toast]:text-sm group-[.toast]:text-muted-foreground',\n actionButton:\n 'group-[.toast]:bg-primary group-[.toast]:text-primary-foreground group-[.toast]:rounded-sm group-[.toast]:px-2.5 group-[.toast]:py-1 group-[.toast]:text-[13px] group-[.toast]:font-semibold',\n cancelButton:\n 'group-[.toast]:bg-muted group-[.toast]:text-foreground group-[.toast]:rounded-sm group-[.toast]:px-2.5 group-[.toast]:py-1 group-[.toast]:text-[13px]',\n closeButton:\n 'group-[.toast]:border-border group-[.toast]:bg-background group-[.toast]:text-muted-foreground hover:group-[.toast]:text-foreground',\n // Variantes — paletas semánticas AgroShine (no `richColors`)\n success:\n 'group-[.toaster]:bg-success-50 group-[.toaster]:text-success-700 group-[.toaster]:border-success-200',\n error:\n 'group-[.toaster]:bg-danger-50 group-[.toaster]:text-danger-700 group-[.toaster]:border-danger-200',\n warning:\n 'group-[.toaster]:bg-warning-50 group-[.toaster]:text-warning-800 group-[.toaster]:border-warning-200',\n info: 'group-[.toaster]:bg-primary-50 group-[.toaster]:text-primary-700 group-[.toaster]:border-primary-200',\n },\n }}\n {...rest}\n />\n );\n});\n\nToaster.displayName = 'Toaster';\n","import { forwardRef, useCallback, useMemo, useState } from 'react';\nimport { ChevronRight } from 'lucide-react';\n\nimport { cn } from '../../lib/cn';\n\nimport type { TreeNode, TreeProps } from './Tree.types';\n\n/**\n * Canon Components.html § \"Tree\" L1673:\n * .tree-node .chev → un solo chevron `›` que rota 90° on open.\n * .tree-node.leaf .chev → visibility:hidden (espacio reservado).\n * .tree-node .children → padding-left:20px por nivel.\n * .tree-node .nh → padding 5px 6px, gap 6px, rounded-sm, hover bg-muted.\n */\n\ninterface TreeNodeRowProps {\n node: TreeNode;\n level: number;\n expandedSet: Set<string>;\n selectedKey?: string;\n showLine?: boolean;\n onToggle: (key: string) => void;\n onSelect?: (key: string, node: TreeNode) => void;\n}\n\nconst TreeNodeRow = ({\n node,\n level,\n expandedSet,\n selectedKey,\n showLine,\n onToggle,\n onSelect,\n}: TreeNodeRowProps) => {\n const hasChildren = !!node.children && node.children.length > 0;\n const isExpanded = expandedSet.has(node.key);\n const isSelected = selectedKey === node.key;\n const selectable = node.selectable !== false && !node.disabled;\n\n return (\n <div className={cn(showLine && level > 0 && 'ml-3 border-l border-border pl-1')}>\n <div\n role={selectable ? 'button' : undefined}\n tabIndex={selectable ? 0 : -1}\n onClick={() => {\n if (hasChildren) onToggle(node.key);\n if (selectable) onSelect?.(node.key, node);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n if (hasChildren) onToggle(node.key);\n if (selectable) onSelect?.(node.key, node);\n }\n }}\n // Canon: padding-left por nivel = 20px (siguiendo `.children { padding-left:20px }`).\n style={{ paddingLeft: `${level * 20 + 6}px` }}\n className={cn(\n 'flex items-center gap-1.5 rounded-sm px-1.5 py-1.5 text-sm transition-colors',\n selectable && 'cursor-pointer hover:bg-muted',\n isSelected && 'bg-primary-50 font-medium text-primary-700',\n node.disabled && 'cursor-not-allowed opacity-50',\n )}\n >\n {/* Chevron: 1 SVG rotando 90° on open. En leaf: invisible (reserva espacio). */}\n <ChevronRight\n aria-hidden=\"true\"\n className={cn(\n 'h-3.5 w-3.5 shrink-0 text-muted-foreground transition-transform duration-150',\n isExpanded && 'rotate-90',\n !hasChildren && 'invisible',\n )}\n />\n {node.icon && <span className=\"shrink-0 text-sm\">{node.icon}</span>}\n <span className=\"flex-1 truncate\">{node.title}</span>\n </div>\n {hasChildren && isExpanded && (\n <div className=\"flex flex-col\">\n {node.children!.map((child) => (\n <TreeNodeRow\n key={child.key}\n node={child}\n level={level + 1}\n expandedSet={expandedSet}\n selectedKey={selectedKey}\n showLine={showLine}\n onToggle={onToggle}\n onSelect={onSelect}\n />\n ))}\n </div>\n )}\n </div>\n );\n};\n\nexport const Tree = forwardRef<HTMLDivElement, TreeProps>(function Tree(\n { data, defaultExpanded, expanded, onExpandedChange, selectedKey, onSelect, showLine, className },\n ref,\n) {\n const [internal, setInternal] = useState<string[]>(defaultExpanded ?? []);\n const current = expanded ?? internal;\n const set = useMemo(() => new Set(current), [current]);\n\n const handleToggle = useCallback(\n (key: string) => {\n const next = set.has(key) ? current.filter((k) => k !== key) : [...current, key];\n if (expanded === undefined) setInternal(next);\n onExpandedChange?.(next);\n },\n [current, expanded, onExpandedChange, set],\n );\n\n return (\n <div ref={ref} className={cn('flex flex-col text-sm text-foreground', className)}>\n {data.map((node) => (\n <TreeNodeRow\n key={node.key}\n node={node}\n level={0}\n expandedSet={set}\n selectedKey={selectedKey}\n showLine={showLine}\n onToggle={handleToggle}\n onSelect={onSelect}\n />\n ))}\n </div>\n );\n});\n\nTree.displayName = 'Tree';\n"]}