@agroshine/ags-web-ui-kit 1.3.0 → 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.
package/README.md CHANGED
@@ -1,40 +1,85 @@
1
1
  # @agroshine/ags-web-ui-kit
2
2
 
3
- Librería de componentes React para AgroShine · Luna Nueva.
3
+ [![npm version](https://img.shields.io/npm/v/@agroshine/ags-web-ui-kit.svg?logo=npm&color=cb3837)](https://www.npmjs.com/package/@agroshine/ags-web-ui-kit)
4
+ [![license](https://img.shields.io/npm/l/@agroshine/ags-web-ui-kit.svg?color=blue)](./LICENSE)
5
+ [![React](https://img.shields.io/badge/React-18%20%7C%2019-61dafb?logo=react&logoColor=white)](https://react.dev)
6
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.6-3178c6?logo=typescript&logoColor=white)](https://www.typescriptlang.org)
7
+ [![Tailwind](https://img.shields.io/badge/Tailwind-v4-38bdf8?logo=tailwindcss&logoColor=white)](https://tailwindcss.com)
8
+ [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-fa6673?logo=conventionalcommits&logoColor=white)](https://www.conventionalcommits.org)
4
9
 
5
- Stack: React 18+ · TypeScript · Tailwind CSS v4 · shadcn/ui · Radix UI · class-variance-authority · lucide-react.
10
+ > Librería oficial de componentes React de **AgroShine**.
11
+ > Atomic Design, *design tokens* semánticos y primitives accesibles sobre Radix + shadcn/ui.
6
12
 
7
- ## Instalación
13
+ ---
8
14
 
9
- Desde el registro público de npm:
15
+ ## Características
16
+
17
+ - **Atomic Design** completo: `atoms`, `molecules`, `organisms`, `ui` (primitives), `hooks` y `lib`.
18
+ - **Tipado estricto** con TypeScript y `.d.ts` por subpath export.
19
+ - **Build dual** ESM + CJS generado con [`tsup`](https://tsup.egoist.dev), tree-shakeable.
20
+ - **Tailwind v4** *first-class*: preset compartido + tokens semánticos como `@theme` CSS.
21
+ - **Accesibilidad** apoyada en [Radix UI](https://www.radix-ui.com/) y patrones [shadcn/ui](https://ui.shadcn.com/).
22
+ - **Iconografía** con [`lucide-react`](https://lucide.dev) y soporte opcional de FontAwesome.
23
+ - **Storybook 8** para documentación viva y QA visual.
24
+ - **Semantic Release** + Conventional Commits → versionado y `CHANGELOG.md` automáticos.
25
+
26
+ ## 📦 Stack
27
+
28
+ React 18/19 · TypeScript 5.6 · Tailwind CSS v4 · shadcn/ui · Radix UI · `class-variance-authority` · `tailwind-merge` · `clsx` · `lucide-react` · `date-fns` / `dayjs` · `sonner`.
29
+
30
+ ## 📑 Tabla de contenido
31
+
32
+ - [Instalación](#-instalación)
33
+ - [Configuración de Tailwind](#-configuración-de-tailwind)
34
+ - [Uso](#-uso)
35
+ - [Estructura del proyecto](#-estructura-del-proyecto)
36
+ - [Componentes](#-componentes)
37
+ - [Scripts](#-scripts)
38
+ - [Storybook](#-storybook)
39
+ - [Convenciones de commits](#-convenciones-de-commits)
40
+ - [Release y publicación](#-release-y-publicación)
41
+ - [Compatibilidad](#-compatibilidad)
42
+ - [Licencia](#-licencia)
43
+
44
+ ---
45
+
46
+ ## 🚀 Instalación
47
+
48
+ ### Desde npm (público)
10
49
 
11
50
  ```bash
12
51
  pnpm add @agroshine/ags-web-ui-kit
13
52
  # o
14
- npm i @agroshine/ags-web-ui-kit
53
+ npm install @agroshine/ags-web-ui-kit
15
54
  # o
16
55
  yarn add @agroshine/ags-web-ui-kit
17
56
  ```
18
57
 
19
- ### Workspace pnpm (consumidores internos)
20
-
21
- Desde un consumidor del workspace (admin, client, website):
58
+ ### Como dependencia de workspace (admin · client · website)
22
59
 
23
60
  ```jsonc
24
- // package.json
25
- "dependencies": {
26
- "@agroshine/ags-web-ui-kit": "workspace:*"
61
+ // package.json del consumidor
62
+ {
63
+ "dependencies": {
64
+ "@agroshine/ags-web-ui-kit": "workspace:*"
65
+ }
27
66
  }
28
67
  ```
29
68
 
30
- Luego:
31
-
32
69
  ```bash
33
70
  pnpm install
34
71
  pnpm --filter @agroshine/ags-web-ui-kit build
35
72
  ```
36
73
 
37
- ## Uso del Tailwind preset
74
+ ### Peer dependencies
75
+
76
+ La librería declara como `peerDependencies` el ecosistema React + Radix + Tailwind. `pnpm` / `npm@7+` los instala automáticamente; revisa `package.json` si necesitas anclar versiones específicas. Algunos peers son **opcionales** (FontAwesome, `sonner`, `react-day-picker`, `date-fns`, `dayjs`) y solo son necesarios si usas el componente correspondiente.
77
+
78
+ ---
79
+
80
+ ## 🎨 Configuración de Tailwind
81
+
82
+ ### Tailwind v3 (preset clásico)
38
83
 
39
84
  ```js
40
85
  // tailwind.config.{js,ts}
@@ -47,7 +92,7 @@ module.exports = {
47
92
  };
48
93
  ```
49
94
 
50
- En Tailwind v4 (config CSS-first), importar también los tokens semánticos:
95
+ ### Tailwind v4 (CSS-first, **recomendado**)
51
96
 
52
97
  ```css
53
98
  /* src/index.css */
@@ -55,33 +100,169 @@ En Tailwind v4 (config CSS-first), importar también los tokens semánticos:
55
100
  @import '@agroshine/ags-web-ui-kit/styles/tokens.css';
56
101
  ```
57
102
 
58
- ## Imports
103
+ `tokens.css` expone los tokens semánticos AgroShine (`--color-brand-*`, `--color-surface-*`, `--radius-*`, etc.) como bloque `@theme`, listos para utilidades arbitrarias y `cn()`.
104
+
105
+ ---
106
+
107
+ ## 🧩 Uso
108
+
109
+ ### Import raíz (recomendado)
110
+
111
+ ```tsx
112
+ import { Button, Tag, Drawer, useModal } from '@agroshine/ags-web-ui-kit';
113
+
114
+ export function Demo() {
115
+ return (
116
+ <Button variant="primary" size="md">
117
+ Iniciar cosecha
118
+ </Button>
119
+ );
120
+ }
121
+ ```
122
+
123
+ ### Imports por categoría (para tree-shaking quirúrgico)
124
+
125
+ ```ts
126
+ import { Button, Input } from '@agroshine/ags-web-ui-kit/atoms';
127
+ import { Modal, Table } from '@agroshine/ags-web-ui-kit/molecules';
128
+ import { Layout, Sidebar } from '@agroshine/ags-web-ui-kit/organisms';
129
+ import { useDrawer } from '@agroshine/ags-web-ui-kit/hooks';
130
+ import { cn } from '@agroshine/ags-web-ui-kit/lib';
131
+ ```
132
+
133
+ ### Acceso a primitives shadcn/Radix
134
+
135
+ Los primitives **no** se reexportan desde el barrel raíz para evitar colisiones con sus wrappers AgroShine. Si los necesitas crudos:
59
136
 
60
137
  ```ts
61
- import { Button, Tag, Drawer } from '@agroshine/ags-web-ui-kit';
62
- // o por categoría:
63
- import { Button } from '@agroshine/ags-web-ui-kit/atoms';
64
- import { Sheet } from '@agroshine/ags-web-ui-kit/ui';
138
+ import { Avatar as AvatarRoot, Tabs as TabsRoot } from '@agroshine/ags-web-ui-kit/ui';
65
139
  ```
66
140
 
67
- ## Estructura
141
+ ---
142
+
143
+ ## 🗂 Estructura del proyecto
68
144
 
69
145
  ```
70
146
  src/
71
- ├── ui/ shadcn-style primitives (badge, button, dialog, sheet, …)
72
- ├── atoms/ Button, Input, Tag, Spinner, Checkbox, …
73
- ├── molecules/ Drawer, Modal, Table, Steps, …
74
- ├── organisms/ Layout, Sidebar, Header, FormCard, …
75
- ├── hooks/ useDrawer, useModal, usePagination,
76
- ├── lib/ cn helper
77
- └── styles/ tokens.css
147
+ ├── ui/ shadcn-style primitives (button, dialog, sheet, dropdown-menu, …)
148
+ ├── atoms/ Button, Input, Tag, Spinner, Checkbox, Radio, Select, Switch,
149
+ ├── molecules/ Drawer, Modal, Table, Steps, Tabs, Card, Alert, Tooltip,
150
+ ├── organisms/ Layout, Sidebar, Header, PageHeader, FormCard, SearchFilterBar,
151
+ ├── hooks/ useDrawer, useModal, usePagination, useResponsive, useSearch
152
+ ├── lib/ cn() y utilidades compartidas
153
+ ├── styles/ tokens.css (design tokens semánticos)
154
+ └── foundation/ Stories de tipografía, color y feedback (Storybook)
78
155
  ```
79
156
 
80
- ## Scripts
157
+ ---
158
+
159
+ ## 🧱 Componentes
160
+
161
+ <details>
162
+ <summary><b>Atoms</b></summary>
163
+
164
+ `Avatar` · `Button` · `Checkbox` · `Descriptions` · `Dropdown` · `FormItem` · `Input` · `InputNumber` · `Pagination` · `Progress` · `Radio` · `Rate` · `Select` · `Separator` · `Skeleton` · `Slider` · `Spinners` · `Switch` · `Tag` · `Textarea` · `Toggle` · `ToggleGroup`
165
+
166
+ </details>
167
+
168
+ <details>
169
+ <summary><b>Molecules</b></summary>
170
+
171
+ `Alert` · `Breadcrumb` · `Card` · `Drawer` · `Empty` · `HoverCard` · `List` · `Modal` · `Popconfirm` · `Popover` · `Segmented` · `Statistic` · `Steps` · `Table` · `Tabs` · `Timeline` · `Tooltip`
172
+
173
+ </details>
174
+
175
+ <details>
176
+ <summary><b>Organisms</b></summary>
177
+
178
+ `Accordion` · `Content` · `FormCard` · `Header` · `Layout` · `PageHeader` · `Picker` · `QueryState` · `Result` · `SearchFilterBar` · `Sidebar` · `Toaster` · `Tree`
179
+
180
+ </details>
181
+
182
+ <details>
183
+ <summary><b>Hooks</b></summary>
184
+
185
+ `useDrawer` · `useModal` · `usePagination` · `useResponsive` · `useSearch`
186
+
187
+ </details>
188
+
189
+ ---
190
+
191
+ ## 🛠 Scripts
81
192
 
82
193
  | Script | Descripción |
83
194
  |---|---|
84
- | `pnpm build` | Build dual ESM+CJS con `tsup` (genera `.d.ts`) |
85
- | `pnpm dev` | Watch mode |
86
- | `pnpm typecheck` | `tsc --noEmit` |
87
- | `pnpm clean` | Borra `dist/` |
195
+ | `pnpm build` | Build dual ESM + CJS con `tsup` (incluye `.d.ts` y `tokens.css`). |
196
+ | `pnpm dev` | Watch mode de `tsup` para desarrollo local. |
197
+ | `pnpm typecheck` | `tsc --noEmit` sobre todo el proyecto. |
198
+ | `pnpm lint` / `pnpm lint:fix` | Lint con ESLint 9 (flat config). |
199
+ | `pnpm format` / `pnpm format:check` | Prettier. |
200
+ | `pnpm storybook` | Levanta Storybook en `http://localhost:6006`. |
201
+ | `pnpm build-storybook` | Build estático de Storybook → `storybook-static/`. |
202
+ | `pnpm commit` | Asistente interactivo de Commitizen (cz-customizable). |
203
+ | `pnpm release` | Lanza `semantic-release` (uso reservado a CI). |
204
+ | `pnpm clean` | Elimina `dist/`. |
205
+
206
+ ---
207
+
208
+ ## 📖 Storybook
209
+
210
+ Storybook 8 cubre los tres niveles atómicos y stories de *foundation* (color, tipografía, feedback).
211
+
212
+ ```bash
213
+ pnpm storybook
214
+ ```
215
+
216
+ El build estático se publica desde CI a partir de `storybook-static/`.
217
+
218
+ ---
219
+
220
+ ## ✍️ Convenciones de commits
221
+
222
+ Este repo aplica **Conventional Commits** mediante `commitlint` + `husky`. Para evitar errores usa el asistente:
223
+
224
+ ```bash
225
+ pnpm commit
226
+ ```
227
+
228
+ Tipos habituales: `feat`, `fix`, `perf`, `refactor`, `docs`, `test`, `build`, `ci`, `chore`, `style`, `revert`.
229
+ Los *scopes* sugeridos están definidos en `.cz-config.js` (`atoms`, `molecules`, `organisms`, `ui`, `hooks`, `tokens`, `build`, `ci`, …).
230
+
231
+ > Los commits que no respeten el formato son rechazados por el hook `commit-msg`.
232
+
233
+ ---
234
+
235
+ ## 🚢 Release y publicación
236
+
237
+ El versionado lo maneja **`semantic-release`** desde GitHub Actions, en función del tipo de commits agregados a `main`:
238
+
239
+ - `feat:` → **minor**
240
+ - `fix:` / `perf:` → **patch**
241
+ - `BREAKING CHANGE:` (footer) → **major**
242
+
243
+ El pipeline:
244
+
245
+ 1. Calcula la próxima versión a partir del log.
246
+ 2. Actualiza `package.json`, `CHANGELOG.md` y `version`.
247
+ 3. Publica en npm (`@agroshine/ags-web-ui-kit`, `access: public`).
248
+ 4. Crea release y tag en GitHub.
249
+
250
+ **No publiques manualmente.** Mergea a `main` y deja correr el workflow.
251
+
252
+ ---
253
+
254
+ ## ✅ Compatibilidad
255
+
256
+ | Runtime | Versión |
257
+ |---|---|
258
+ | Node | `20.x` |
259
+ | pnpm | `10.x` |
260
+ | React | `18.x` o `19.x` |
261
+ | Tailwind CSS | `v4.x` (compatible con `v3` vía preset) |
262
+ | TypeScript | `~5.6` |
263
+
264
+ ---
265
+
266
+ ## 📄 Licencia
267
+
268
+ [MIT](./LICENSE) © AgroShine
@@ -90,8 +90,15 @@ var Content = React.forwardRef(function Content2({ children, padded = true, maxW
90
90
  "main",
91
91
  {
92
92
  ref,
93
- className: chunkA3A7PJWG_cjs.cn("min-h-0 flex-1 bg-default-50 text-foreground overflow-auto", className),
94
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { style: innerStyle, className: chunkA3A7PJWG_cjs.cn(padded && "px-6 py-6", !isFull && "mx-auto w-full"), children })
93
+ className: chunkA3A7PJWG_cjs.cn("min-h-0 flex-1 bg-background text-foreground overflow-auto", className),
94
+ children: /* @__PURE__ */ jsxRuntime.jsx(
95
+ "div",
96
+ {
97
+ style: innerStyle,
98
+ className: chunkA3A7PJWG_cjs.cn("h-full w-full", padded && "px-6 py-6", !isFull && "mx-auto"),
99
+ children
100
+ }
101
+ )
95
102
  }
96
103
  );
97
104
  });
@@ -331,7 +338,7 @@ var Layout = React.forwardRef(function Layout2({ header, sidebar, footer, childr
331
338
  !sidebarCollapsed && /* @__PURE__ */ jsxRuntime.jsx("aside", { className: "fixed inset-y-0 left-0 z-40 flex lg:hidden", "aria-hidden": "false", children: sidebar })
332
339
  ] }),
333
340
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [
334
- /* @__PURE__ */ jsxRuntime.jsx(Content, { padded: true, children }),
341
+ /* @__PURE__ */ jsxRuntime.jsx(Content, { padded: true, className: "bg-default-50", children }),
335
342
  footer && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "shrink-0", children: footer })
336
343
  ] })
337
344
  ] })
@@ -1324,5 +1331,5 @@ exports.Sidebar = Sidebar;
1324
1331
  exports.Toaster = Toaster;
1325
1332
  exports.Tree = Tree;
1326
1333
  exports.UserAvatar = UserAvatar;
1327
- //# sourceMappingURL=chunk-NDHF6M7F.cjs.map
1328
- //# sourceMappingURL=chunk-NDHF6M7F.cjs.map
1334
+ //# sourceMappingURL=chunk-MMDHPYXY.cjs.map
1335
+ //# sourceMappingURL=chunk-MMDHPYXY.cjs.map
@@ -0,0 +1 @@
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":["jsx","jsxs","AccordionItem","AccordionTrigger","AccordionContent","Accordion","forwardRef","cn","defaultValue","value","onChange","Content","clsx","cva","SearchBox","useState","useCallback","Search","Header","Fragment","Layout","Button","FontAwesomeIcon","faArrowLeft","dayjs","React","useMemo","FormItem","Popover","PopoverTrigger","CalendarIcon","PopoverContent","Calendar","POPUP_ALIGN_MAP","POPUP_SIDE_MAP","CheckCircle2","XCircle","AlertTriangle","Info","FileQuestion","ServerCrash","Result","QueryState","Spinner","SearchFilterBar","useRef","PopoverAnchor","ChevronDown","X","ArrowUpRight","Sidebar","Toaster","SonnerToaster","ChevronRight","Tree"],"mappings":"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","file":"chunk-MMDHPYXY.cjs","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-background text-foreground overflow-auto', className)}\n >\n <div\n style={innerStyle}\n className={cn('h-full w-full', padded && 'px-6 py-6', !isFull && 'mx-auto')}\n >\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 className=\"bg-default-50\">\n {children}\n </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"]}
@@ -83,8 +83,15 @@ var Content = forwardRef(function Content2({ children, padded = true, maxWidth =
83
83
  "main",
84
84
  {
85
85
  ref,
86
- className: cn("min-h-0 flex-1 bg-default-50 text-foreground overflow-auto", className),
87
- children: /* @__PURE__ */ jsx("div", { style: innerStyle, className: cn(padded && "px-6 py-6", !isFull && "mx-auto w-full"), children })
86
+ className: cn("min-h-0 flex-1 bg-background text-foreground overflow-auto", className),
87
+ children: /* @__PURE__ */ jsx(
88
+ "div",
89
+ {
90
+ style: innerStyle,
91
+ className: cn("h-full w-full", padded && "px-6 py-6", !isFull && "mx-auto"),
92
+ children
93
+ }
94
+ )
88
95
  }
89
96
  );
90
97
  });
@@ -324,7 +331,7 @@ var Layout = forwardRef(function Layout2({ header, sidebar, footer, children, ha
324
331
  !sidebarCollapsed && /* @__PURE__ */ jsx("aside", { className: "fixed inset-y-0 left-0 z-40 flex lg:hidden", "aria-hidden": "false", children: sidebar })
325
332
  ] }),
326
333
  /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [
327
- /* @__PURE__ */ jsx(Content, { padded: true, children }),
334
+ /* @__PURE__ */ jsx(Content, { padded: true, className: "bg-default-50", children }),
328
335
  footer && /* @__PURE__ */ jsx("div", { className: "shrink-0", children: footer })
329
336
  ] })
330
337
  ] })
@@ -1287,5 +1294,5 @@ var Tree = forwardRef(function Tree2({ data, defaultExpanded, expanded, onExpand
1287
1294
  Tree.displayName = "Tree";
1288
1295
 
1289
1296
  export { Accordion2 as Accordion, BrandLogo, Content, DEFAULT_FORMAT, DEFAULT_FORMATS, DatePicker, FarmChip, FormCard, Header, Layout, PageHeader, PickerPanel, QueryState, RangePicker, Result, SearchBox, SearchFilterBar, SearchSuggestEmpty, SearchSuggestFooter, SearchSuggestHeader, SearchSuggestItem, SearchSuggestQuery, SearchSuggestRow, Sidebar, Toaster, Tree, UserAvatar };
1290
- //# sourceMappingURL=chunk-BZATZ5U5.js.map
1291
- //# sourceMappingURL=chunk-BZATZ5U5.js.map
1297
+ //# sourceMappingURL=chunk-NFXSKILZ.js.map
1298
+ //# sourceMappingURL=chunk-NFXSKILZ.js.map