@agroshine/ags-web-ui-kit 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -292,16 +292,85 @@ interface ResultProps {
292
292
 
293
293
  declare const Result: React$1.ForwardRefExoticComponent<ResultProps & React$1.RefAttributes<HTMLDivElement>>;
294
294
 
295
- interface SearchFilterBarProps {
295
+ /**
296
+ * Canon Components.html § "Search Bar" L380-1597:
297
+ * `.search-bar` h-48, border 1.5px primary-200, rounded-8px.
298
+ * states: hover→primary-400, focus-within→primary.
299
+ * `.sb-cat` w-190, gap-12, font-semibold, primary; chevron rota 180° on open.
300
+ * `.sb-sep` 1×24, primary-200.
301
+ * `.sb-input` flex-1, transparent, sin borde.
302
+ * `.sb-actions` gap-12, pr-16. `.sb-icon-btn` 24×24 con SVG 20×20.
303
+ * `.sb-clear` muted-foreground; `.sb-search` primary; hover primary-600.
304
+ * dropdown categoría `.sb-cat-menu` 280px; item activo bg-primary-50.
305
+ */
306
+ type BaseProps = {
296
307
  options: Option[];
297
- selectedOption: string;
298
- onOptionChange: (value: string) => void;
299
308
  searchValue: string;
300
309
  onSearchChange: (value: string) => void;
301
310
  searchPlaceholder?: string;
311
+ onSearch?: (value: string) => void;
312
+ onClear?: () => void;
313
+ /** Render del clear button. Default: visible cuando hay texto. */
314
+ showClear?: boolean;
315
+ /** Panel de sugerencias bajo la barra. */
316
+ suggestions?: ReactNode;
317
+ /** Control externo del panel de sugerencias. Si se omite: abierto cuando input está enfocado, hay texto y existen `suggestions`. */
318
+ suggestionsOpen?: boolean;
319
+ /** Ancho del dropdown de categoría. Default 280px (canon). */
320
+ categoryMenuWidth?: number;
302
321
  className?: string;
303
- }
304
- declare function SearchFilterBar({ options, selectedOption, onOptionChange, searchValue, onSearchChange, searchPlaceholder, className, }: SearchFilterBarProps): react_jsx_runtime.JSX.Element;
322
+ };
323
+ type SingleProps = BaseProps & {
324
+ categoryMultiSelect?: false;
325
+ selectedOption: string;
326
+ onOptionChange: (value: string) => void;
327
+ };
328
+ type MultiProps = BaseProps & {
329
+ categoryMultiSelect: true;
330
+ selectedOptions: string[];
331
+ onOptionsChange: (values: string[]) => void;
332
+ /** Label del trigger cuando hay selección múltiple. Default: `"${count} elementos..."`. */
333
+ categoryMultiLabel?: (count: number) => string;
334
+ /** Label cuando no hay selección. Default: 'Categorías'. */
335
+ categoryEmptyLabel?: string;
336
+ };
337
+ type SearchFilterBarProps = SingleProps | MultiProps;
338
+ declare const SearchFilterBar: React$1.ForwardRefExoticComponent<SearchFilterBarProps & React$1.RefAttributes<HTMLDivElement>>;
339
+
340
+ /**
341
+ * Helpers para el panel `.sb-pop.sb-suggest` del canon.
342
+ * `.sb-row` padding 12/18, border-bottom border.
343
+ * `.sb-row.query` foreground, weight 500.
344
+ * `.sb-row.head` flex justify-between, weight 600; link en primary.
345
+ * `.sb-suggest-item` clickable, hover bg-primary-50; active bg-primary-50.
346
+ * `.sb-suggest-footer` separa el total seleccionado.
347
+ * `.sb-suggest-empty` empty state.
348
+ */
349
+ declare const SearchSuggestRow: ({ children, className, }: {
350
+ children: ReactNode;
351
+ className?: string;
352
+ }) => react_jsx_runtime.JSX.Element;
353
+ declare const SearchSuggestQuery: ({ children }: {
354
+ children: ReactNode;
355
+ }) => react_jsx_runtime.JSX.Element;
356
+ declare const SearchSuggestHeader: ({ title, action, }: {
357
+ title: ReactNode;
358
+ action?: ReactNode;
359
+ }) => react_jsx_runtime.JSX.Element;
360
+ declare const SearchSuggestItem: ({ active, withLinkIcon, onClick, children, className, }: {
361
+ active?: boolean;
362
+ withLinkIcon?: boolean;
363
+ onClick?: () => void;
364
+ children: ReactNode;
365
+ className?: string;
366
+ }) => react_jsx_runtime.JSX.Element;
367
+ declare const SearchSuggestFooter: ({ children }: {
368
+ children: ReactNode;
369
+ }) => react_jsx_runtime.JSX.Element;
370
+ declare const SearchSuggestEmpty: ({ title, description, }: {
371
+ title: string;
372
+ description?: string;
373
+ }) => react_jsx_runtime.JSX.Element;
305
374
 
306
375
  interface SidebarItem {
307
376
  key: string;
@@ -393,4 +462,4 @@ interface TreeProps {
393
462
 
394
463
  declare const Tree: React$1.ForwardRefExoticComponent<TreeProps & React$1.RefAttributes<HTMLDivElement>>;
395
464
 
396
- export { Accordion, type AccordionItemData, type AccordionMultipleProps, type AccordionProps, type AccordionSingleProps, type AccordionType, BrandLogo, type BrandLogoProps, Content, type ContentProps, DEFAULT_FORMAT, DEFAULT_FORMATS, DatePicker, type DatePickerProps, FarmChip, type FarmChipProps, FormCard, Header, type HeaderItem, type HeaderProps, type HeaderSearch, Layout, type LayoutProps, PageHeader, type PickerBaseProps, PickerPanel, type PickerPlacement, type PickerSize, type PickerStatus, QueryState, type QueryStateProps, RangePicker, type RangePickerProps, Result, type ResultProps, type ResultStatus, SearchBox, type SearchBoxProps, SearchFilterBar, Sidebar, type SidebarGroup, type SidebarItem, type SidebarProps, Toaster, type ToasterProps, Tree, type TreeNode, type TreeProps, UserAvatar, type UserAvatarProps };
465
+ export { Accordion, type AccordionItemData, type AccordionMultipleProps, type AccordionProps, type AccordionSingleProps, type AccordionType, BrandLogo, type BrandLogoProps, Content, type ContentProps, DEFAULT_FORMAT, DEFAULT_FORMATS, DatePicker, type DatePickerProps, FarmChip, type FarmChipProps, FormCard, Header, type HeaderItem, type HeaderProps, type HeaderSearch, Layout, type LayoutProps, PageHeader, type PickerBaseProps, PickerPanel, type PickerPlacement, type PickerSize, type PickerStatus, QueryState, type QueryStateProps, RangePicker, type RangePickerProps, Result, type ResultProps, type ResultStatus, SearchBox, type SearchBoxProps, SearchFilterBar, type SearchFilterBarProps, SearchSuggestEmpty, SearchSuggestFooter, SearchSuggestHeader, SearchSuggestItem, SearchSuggestQuery, SearchSuggestRow, Sidebar, type SidebarGroup, type SidebarItem, type SidebarProps, Toaster, type ToasterProps, Tree, type TreeNode, type TreeProps, UserAvatar, type UserAvatarProps };
@@ -292,16 +292,85 @@ interface ResultProps {
292
292
 
293
293
  declare const Result: React$1.ForwardRefExoticComponent<ResultProps & React$1.RefAttributes<HTMLDivElement>>;
294
294
 
295
- interface SearchFilterBarProps {
295
+ /**
296
+ * Canon Components.html § "Search Bar" L380-1597:
297
+ * `.search-bar` h-48, border 1.5px primary-200, rounded-8px.
298
+ * states: hover→primary-400, focus-within→primary.
299
+ * `.sb-cat` w-190, gap-12, font-semibold, primary; chevron rota 180° on open.
300
+ * `.sb-sep` 1×24, primary-200.
301
+ * `.sb-input` flex-1, transparent, sin borde.
302
+ * `.sb-actions` gap-12, pr-16. `.sb-icon-btn` 24×24 con SVG 20×20.
303
+ * `.sb-clear` muted-foreground; `.sb-search` primary; hover primary-600.
304
+ * dropdown categoría `.sb-cat-menu` 280px; item activo bg-primary-50.
305
+ */
306
+ type BaseProps = {
296
307
  options: Option[];
297
- selectedOption: string;
298
- onOptionChange: (value: string) => void;
299
308
  searchValue: string;
300
309
  onSearchChange: (value: string) => void;
301
310
  searchPlaceholder?: string;
311
+ onSearch?: (value: string) => void;
312
+ onClear?: () => void;
313
+ /** Render del clear button. Default: visible cuando hay texto. */
314
+ showClear?: boolean;
315
+ /** Panel de sugerencias bajo la barra. */
316
+ suggestions?: ReactNode;
317
+ /** Control externo del panel de sugerencias. Si se omite: abierto cuando input está enfocado, hay texto y existen `suggestions`. */
318
+ suggestionsOpen?: boolean;
319
+ /** Ancho del dropdown de categoría. Default 280px (canon). */
320
+ categoryMenuWidth?: number;
302
321
  className?: string;
303
- }
304
- declare function SearchFilterBar({ options, selectedOption, onOptionChange, searchValue, onSearchChange, searchPlaceholder, className, }: SearchFilterBarProps): react_jsx_runtime.JSX.Element;
322
+ };
323
+ type SingleProps = BaseProps & {
324
+ categoryMultiSelect?: false;
325
+ selectedOption: string;
326
+ onOptionChange: (value: string) => void;
327
+ };
328
+ type MultiProps = BaseProps & {
329
+ categoryMultiSelect: true;
330
+ selectedOptions: string[];
331
+ onOptionsChange: (values: string[]) => void;
332
+ /** Label del trigger cuando hay selección múltiple. Default: `"${count} elementos..."`. */
333
+ categoryMultiLabel?: (count: number) => string;
334
+ /** Label cuando no hay selección. Default: 'Categorías'. */
335
+ categoryEmptyLabel?: string;
336
+ };
337
+ type SearchFilterBarProps = SingleProps | MultiProps;
338
+ declare const SearchFilterBar: React$1.ForwardRefExoticComponent<SearchFilterBarProps & React$1.RefAttributes<HTMLDivElement>>;
339
+
340
+ /**
341
+ * Helpers para el panel `.sb-pop.sb-suggest` del canon.
342
+ * `.sb-row` padding 12/18, border-bottom border.
343
+ * `.sb-row.query` foreground, weight 500.
344
+ * `.sb-row.head` flex justify-between, weight 600; link en primary.
345
+ * `.sb-suggest-item` clickable, hover bg-primary-50; active bg-primary-50.
346
+ * `.sb-suggest-footer` separa el total seleccionado.
347
+ * `.sb-suggest-empty` empty state.
348
+ */
349
+ declare const SearchSuggestRow: ({ children, className, }: {
350
+ children: ReactNode;
351
+ className?: string;
352
+ }) => react_jsx_runtime.JSX.Element;
353
+ declare const SearchSuggestQuery: ({ children }: {
354
+ children: ReactNode;
355
+ }) => react_jsx_runtime.JSX.Element;
356
+ declare const SearchSuggestHeader: ({ title, action, }: {
357
+ title: ReactNode;
358
+ action?: ReactNode;
359
+ }) => react_jsx_runtime.JSX.Element;
360
+ declare const SearchSuggestItem: ({ active, withLinkIcon, onClick, children, className, }: {
361
+ active?: boolean;
362
+ withLinkIcon?: boolean;
363
+ onClick?: () => void;
364
+ children: ReactNode;
365
+ className?: string;
366
+ }) => react_jsx_runtime.JSX.Element;
367
+ declare const SearchSuggestFooter: ({ children }: {
368
+ children: ReactNode;
369
+ }) => react_jsx_runtime.JSX.Element;
370
+ declare const SearchSuggestEmpty: ({ title, description, }: {
371
+ title: string;
372
+ description?: string;
373
+ }) => react_jsx_runtime.JSX.Element;
305
374
 
306
375
  interface SidebarItem {
307
376
  key: string;
@@ -393,4 +462,4 @@ interface TreeProps {
393
462
 
394
463
  declare const Tree: React$1.ForwardRefExoticComponent<TreeProps & React$1.RefAttributes<HTMLDivElement>>;
395
464
 
396
- export { Accordion, type AccordionItemData, type AccordionMultipleProps, type AccordionProps, type AccordionSingleProps, type AccordionType, BrandLogo, type BrandLogoProps, Content, type ContentProps, DEFAULT_FORMAT, DEFAULT_FORMATS, DatePicker, type DatePickerProps, FarmChip, type FarmChipProps, FormCard, Header, type HeaderItem, type HeaderProps, type HeaderSearch, Layout, type LayoutProps, PageHeader, type PickerBaseProps, PickerPanel, type PickerPlacement, type PickerSize, type PickerStatus, QueryState, type QueryStateProps, RangePicker, type RangePickerProps, Result, type ResultProps, type ResultStatus, SearchBox, type SearchBoxProps, SearchFilterBar, Sidebar, type SidebarGroup, type SidebarItem, type SidebarProps, Toaster, type ToasterProps, Tree, type TreeNode, type TreeProps, UserAvatar, type UserAvatarProps };
465
+ export { Accordion, type AccordionItemData, type AccordionMultipleProps, type AccordionProps, type AccordionSingleProps, type AccordionType, BrandLogo, type BrandLogoProps, Content, type ContentProps, DEFAULT_FORMAT, DEFAULT_FORMATS, DatePicker, type DatePickerProps, FarmChip, type FarmChipProps, FormCard, Header, type HeaderItem, type HeaderProps, type HeaderSearch, Layout, type LayoutProps, PageHeader, type PickerBaseProps, PickerPanel, type PickerPlacement, type PickerSize, type PickerStatus, QueryState, type QueryStateProps, RangePicker, type RangePickerProps, Result, type ResultProps, type ResultStatus, SearchBox, type SearchBoxProps, SearchFilterBar, type SearchFilterBarProps, SearchSuggestEmpty, SearchSuggestFooter, SearchSuggestHeader, SearchSuggestItem, SearchSuggestQuery, SearchSuggestRow, Sidebar, type SidebarGroup, type SidebarItem, type SidebarProps, Toaster, type ToasterProps, Tree, type TreeNode, type TreeProps, UserAvatar, type UserAvatarProps };
@@ -1,4 +1,4 @@
1
- export { Accordion, BrandLogo, Content, DEFAULT_FORMAT, DEFAULT_FORMATS, DatePicker, FarmChip, FormCard, Header, Layout, PageHeader, PickerPanel, QueryState, RangePicker, Result, SearchBox, SearchFilterBar, Sidebar, Toaster, Tree, UserAvatar, toast } from '../chunk-JTFCE6RA.js';
1
+ export { 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, toast } from '../chunk-BZATZ5U5.js';
2
2
  import '../chunk-QEG27NX6.js';
3
3
  import '../chunk-QAZMI5VH.js';
4
4
  import '../chunk-6O2IDBTX.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agroshine/ags-web-ui-kit",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "AgroShine · Luna Nueva · librería de componentes React reutilizables",
5
5
  "license": "MIT",
6
6
  "author": "AgroShine",
@@ -197,4 +197,4 @@
197
197
  "typescript-eslint": "^8.18.2",
198
198
  "vite": "^6.0.5"
199
199
  }
200
- }
200
+ }
@@ -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/SearchFilterBar.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","useRef","useEffect","faSearch","Sidebar","Toaster","SonnerToaster","ChevronRight","Tree"],"mappings":"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","file":"chunk-C4LX3XTN.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-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 { useEffect, useMemo, useRef, useState } from 'react';\nimport { faSearch } from '@fortawesome/free-solid-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\n\nimport { Option } from '../../atoms/Select/interface';\n\ninterface SearchFilterBarProps {\n options: Option[];\n selectedOption: string;\n onOptionChange: (value: string) => void;\n searchValue: string;\n onSearchChange: (value: string) => void;\n searchPlaceholder?: string;\n className?: string;\n}\n\nexport function SearchFilterBar({\n options,\n selectedOption,\n onOptionChange,\n searchValue,\n onSearchChange,\n searchPlaceholder = 'Buscar...',\n className = '',\n}: SearchFilterBarProps) {\n const [isOpen, setIsOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const selectedLabel = useMemo(\n () =>\n options.find((option) => String(option.value) === selectedOption)?.label ?? selectedOption,\n [options, selectedOption],\n );\n\n useEffect(() => {\n const onClickOutside = (event: MouseEvent) => {\n if (!dropdownRef.current) return;\n if (!dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', onClickOutside);\n return () => document.removeEventListener('mousedown', onClickOutside);\n }, []);\n\n return (\n <div\n className={`flex w-full flex-col gap-3 sm:flex-row sm:items-stretch sm:gap-0 ${className}`}\n >\n <div className=\"relative w-full sm:w-[180px] sm:min-w-[180px]\" ref={dropdownRef}>\n <button\n type=\"button\"\n onClick={() => setIsOpen((prev) => !prev)}\n className=\"flex h-10 w-full items-center justify-between rounded-md border border-primary-500 bg-white px-4 text-left text-sm font-semibold text-primary-500 sm:rounded-r-none sm:border-r-0\"\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n >\n <span className=\"text-sm leading-tight\">{selectedLabel}</span>\n <svg\n className=\"h-4 w-4 flex-shrink-0 text-primary-500\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M5.23 7.21a.75.75 0 0 1 1.06.02L10 11.168l3.71-3.938a.75.75 0 1 1 1.08 1.04l-4.25 4.5a.75.75 0 0 1-1.08 0l-4.25-4.5a.75.75 0 0 1 .02-1.06Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n\n {isOpen && (\n <ul\n role=\"listbox\"\n className=\"absolute z-20 mt-1 max-h-60 w-full overflow-y-auto rounded-md border border-[#d1d5db] bg-white py-1 shadow-lg\"\n >\n {options.map((option) => {\n const value = String(option.value);\n const isSelected = value === selectedOption;\n\n return (\n <li key={value}>\n <button\n type=\"button\"\n onClick={() => {\n onOptionChange(value);\n setIsOpen(false);\n }}\n className={`w-full px-4 py-2 text-left text-sm hover:bg-blue-50 ${\n isSelected ? 'bg-blue-50 font-medium text-primary-500' : 'text-[#374151]'\n }`}\n >\n {option.label}\n </button>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n\n <div className=\"w-full sm:max-w-[360px] sm:flex-1\">\n <div className=\"relative flex h-10 w-full items-center rounded-md border border-[#d1d5db] bg-white px-4 sm:rounded-l-none\">\n <input\n type=\"text\"\n value={searchValue}\n onChange={(event) => onSearchChange(event.target.value)}\n placeholder={searchPlaceholder}\n className=\"w-full bg-transparent pr-8 text-sm text-gray-500-500 placeholder:text-[#9ca3af] focus:outline-none\"\n />\n <FontAwesomeIcon\n icon={faSearch}\n className=\"pointer-events-none absolute right-3 text-[#c4c8d0]\"\n />\n </div>\n </div>\n </div>\n );\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"]}