{
  "schemaVersion": "1.0.0",
  "package": "@imj_media/ui",
  "version": "1.11.1",
  "indexedAt": "2026-06-04T22:33:42.184Z",
  "orbitTokensVersion": "1.3.1",
  "modules": [
    {
      "id": "Accordion",
      "path": "src/modules/Accordion",
      "legacy": false,
      "compositionType": 2,
      "exports": [
        {
          "name": "Accordion",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Accordion permite mostrar contenido colapsable con un encabezado. Útil para organizar información de forma compacta.",
            "jsdoc": "Accordion - Componente de acordeón expandible\nComponente que permite mostrar/ocultar contenido de forma expandible.\nSoporta múltiples items, estados controlados y no controlados.",
            "confidence": "high"
          },
          "examples": [
            "import { Accordion } from '@imj_media/ui';\n\nexport default function Example() {\n  return (\n    <Accordion\n      id=\"accordion-1\"\n      title=\"Título del Accordion\"\n      subtitle=\"Subtítulo opcional\"\n    >\n      <div className=\"ui-p-4\">\n        <p>Contenido del accordion</p>\n      </div>\n    </Accordion>\n  );\n}",
            "import { Accordion } from '@imj_media/ui';\n\nexport default function Example() {\n  return (\n    <Accordion\n      id=\"accordion-2\"\n      title=\"Accordion Abierto\"\n      defaultOpen={true}\n    >\n      <div className=\"ui-p-4\">\n        <p>Contenido visible desde el inicio</p>\n      </div>\n    </Accordion>\n  );\n}",
            "import { Accordion } from '@imj_media/ui';\n\nexport default function Example() {\n  return (\n    <Accordion\n      id=\"accordion-3\"\n      title=\"Accordion Deshabilitado\"\n      disabled={true}\n    >\n      <div className=\"ui-p-4\">\n        <p>Contenido no accesible</p>\n      </div>\n    </Accordion>\n  );\n}",
            "import { Accordion } from '@imj_media/ui';\n\nexport default function Example() {\n  return (\n    <Accordion\n      id=\"accordion-4\"\n      title=\"Accordion sin Subtítulo\"\n    >\n      <div className=\"ui-p-4\">\n        <p>Contenido del accordion</p>\n      </div>\n    </Accordion>\n  );\n}",
            "import { Accordion } from '@imj_media/ui';\n\nexport default function Example() {\n  return (\n    <div className=\"ui-space-y-4\">\n      <Accordion id=\"accordion-5\" title=\"Primera Sección\">\n        <div className=\"ui-p-4\">\n          <p>Contenido de la primera sección</p>\n        </div>\n      </Accordion>\n      \n      <Accordion \n        id=\"accordion-6\" \n        title=\"Segunda Sección\"\n        defaultOpen={true}\n      >\n        <div className=\"ui-p-4\">\n          <p>Contenido de la segunda sección</p>\n        </div>\n      </Accordion>\n      \n      <Accordion id=\"accordion-7\" title=\"Tercera Sección\">\n        <div className=\"ui-p-4\">\n          <p>Contenido de la tercera sección</p>\n        </div>\n      </Accordion>\n    </div>\n  );\n}"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "title": {
                "name": "title",
                "type": "string",
                "required": true
              },
              "subtitle": {
                "name": "subtitle",
                "type": "string",
                "required": false
              },
              "children": {
                "name": "children",
                "type": "React.ReactNode",
                "required": false
              },
              "id": {
                "name": "id",
                "type": "string",
                "required": true
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "defaultOpen": {
                "name": "defaultOpen",
                "type": "boolean",
                "required": false
              },
              "headerClassName": {
                "name": "headerClassName",
                "type": "string",
                "required": false
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false
              }
            }
          }
        }
      ],
      "compositionRecipe": {
        "pieces": [
          "Accordion",
          "AccordionHeader",
          "AccordionContent"
        ],
        "steps": [
          "Pasa id y title obligatorios en Accordion (API de contenedor).",
          "El children del accordion es el contenido visible al expandir.",
          "Para múltiples secciones, repite Accordion o usa items según la story del módulo."
        ],
        "storyRefs": [
          "Accordion.stories.tsx:Default"
        ],
        "snippet": "<Accordion\n  id=\"section-1\"\n  title=\"Sección\"\n  subtitle=\"Opcional\"\n  defaultOpen={false}\n>\n  Contenido colapsable\n</Accordion>"
      },
      "standaloneSnippet": "import React, { useState } from 'react';\n\nexport function Accordion({\n  items,\n  defaultOpen,\n}: {\n  items: { id: string; title: string; content: React.ReactNode }[];\n  defaultOpen?: string;\n}) {\n  const [openId, setOpenId] = useState<string | undefined>(defaultOpen);\n\n  const toggle = (id: string) => {\n    setOpenId((prev) => (prev === id ? undefined : id));\n  };\n\n  return (\n    <div\n      style={{\n        border: '1px solid rgb(199, 199, 204)',\n        borderRadius: '8px',\n        overflow: 'hidden',\n      }}\n    >\n      {items.map((item, index) => {\n        const isOpen = openId === item.id;\n        return (\n          <div key={item.id}>\n            {index > 0 && (\n              <div style={{ height: '1px', backgroundColor: 'rgb(199, 199, 204)' }} />\n            )}\n            <button\n              onClick={() => toggle(item.id)}\n              style={{\n                width: '100%',\n                display: 'flex',\n                alignItems: 'center',\n                justifyContent: 'space-between',\n                padding: '12px 4px',\n                backgroundColor: 'rgb(255, 255, 255)',\n                border: 'none',\n                cursor: 'pointer',\n                fontSize: '16px',\n                fontWeight: '500',\n                color: 'rgb(48, 51, 54)',\n                fontFamily: 'inherit',\n                textAlign: 'left',\n              }}\n            >\n              <span>{item.title}</span>\n              <span\n                style={{\n                  transform: isOpen ? 'rotate(180deg)' : 'rotate(0deg)',\n                  transition: 'transform 200ms',\n                  fontSize: '12px',\n                  color: 'rgb(89, 89, 94)',\n                }}\n              >\n                ▼\n              </span>\n            </button>\n            <div\n              style={{\n                display: isOpen ? 'block' : 'none',\n                padding: '12px 4px',\n                backgroundColor: 'rgb(247, 247, 250)',\n                color: 'rgb(48, 51, 54)',\n                fontSize: '14px',\n                lineHeight: '1.5',\n              }}\n            >\n              {item.content}\n            </div>\n          </div>\n        );\n      })}\n    </div>\n  );\n}\n"
    },
    {
      "id": "Alert",
      "path": "src/modules/Alert",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Alert",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Alert permite mostrar mensajes informativos, de éxito, advertencia o error con diferentes variantes visuales.",
            "jsdoc": "Alert - Componente de alerta\nTokens semánticos de Figma:\n- Padding: 16px (space_16) para md, reducido para sm\n- Gap: 16px (space_16) entre secciones\n- Border radius: control-sm (8px)\n- Border width: 1px",
            "confidence": "high"
          },
          "examples": [
            "import { Alert } from '@/modules/Alert';\n\n  export default function Example() {\n    return (\n      <Alert \n        color=\"success\" \n        message=\"Operación completada exitosamente\" \n        title=\"Éxito\" \n        open={true} \n      />\n    )\n  }",
            "<Alert color=\"success\" variant=\"contained\" message=\"Variante contained (por defecto)\" title=\"Contained\" open={true} />\n    <Alert color=\"info\" variant=\"contained\" message=\"Variante contained (por defecto)\" title=\"Contained\" open={true} />\n    <Alert color=\"warning\" variant=\"contained\" message=\"Variante contained (por defecto)\" title=\"Contained\" open={true} />\n    <Alert color=\"danger\" variant=\"contained\" message=\"Variante contained (por defecto)\" title=\"Contained\" open={true} />\n    <Alert color=\"success\" variant=\"outlined\" message=\"Variante outlined con borde\" title=\"Outlined\" open={true} />\n    <Alert color=\"info\" variant=\"outlined\" message=\"Variante outlined con borde\" title=\"Outlined\" open={true} />\n    <Alert color=\"warning\" variant=\"outlined\" message=\"Variante outlined con borde\" title=\"Outlined\" open={true} />\n    <Alert color=\"danger\" variant=\"outlined\" message=\"Variante outlined con borde\" title=\"Outlined\" open={true} />",
            "<Alert\n    color=\"success\"\n    message=\"Operación completada exitosamente\"\n    title=\"Éxito\"\n    description=\"Los cambios se han guardado correctamente en la base de datos.\"\n    open={true}\n  />\n  <Alert\n    color=\"danger\"\n    message=\"Ha ocurrido un error inesperado\"\n    title=\"Error\"\n    description=\"Por favor, intenta nuevamente o contacta al soporte técnico si el problema persiste.\"\n    open={true}\n  />\n  <Alert\n    color=\"info\"\n    message=\"Información importante para el usuario\"\n    title=\"Información\"\n    description=\"Esta acción puede tardar unos minutos en completarse. Por favor, espera hasta que finalice.\"\n    open={true}\n  />\n  <Alert\n    color=\"warning\"\n    message=\"Advertencia antes de continuar\"\n    title=\"Advertencia\"\n    description=\"Esta acción no se puede deshacer. Asegúrate de que realmente deseas continuar.\"\n    open={true}\n  />\n  <Alert\n    color=\"neutral\"\n    message=\"Mensaje neutral sin color específico\"\n    title=\"Notificación\"\n    description=\"Este es un mensaje informativo que no requiere acción inmediata por parte del usuario.\"\n    open={true}\n  />",
            "import { Alert } from '@/modules/Alert';\n\n  export default function Example() {\n    return (\n      <Alert \n        color=\"success\" \n        message=\"Operación completada exitosamente\" \n        title=\"Éxito\" \n        open={true} \n      />\n    )\n  }",
            "<Alert color=\"success\" variant=\"contained\" message=\"Variante contained (por defecto)\" title=\"Contained\" open={true} />\n    <Alert color=\"info\" variant=\"contained\" message=\"Variante contained (por defecto)\" title=\"Contained\" open={true} />\n    <Alert color=\"warning\" variant=\"contained\" message=\"Variante contained (por defecto)\" title=\"Contained\" open={true} />\n    <Alert color=\"danger\" variant=\"contained\" message=\"Variante contained (por defecto)\" title=\"Contained\" open={true} />\n    <Alert color=\"success\" variant=\"outlined\" message=\"Variante outlined con borde\" title=\"Outlined\" open={true} />\n    <Alert color=\"info\" variant=\"outlined\" message=\"Variante outlined con borde\" title=\"Outlined\" open={true} />\n    <Alert color=\"warning\" variant=\"outlined\" message=\"Variante outlined con borde\" title=\"Outlined\" open={true} />\n    <Alert color=\"danger\" variant=\"outlined\" message=\"Variante outlined con borde\" title=\"Outlined\" open={true} />"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "open": {
                "name": "open",
                "type": "boolean",
                "required": true
              },
              "message": {
                "name": "message",
                "type": "string",
                "required": false
              },
              "description": {
                "name": "description",
                "type": "string",
                "required": false
              },
              "color": {
                "name": "color",
                "type": "AlertColor",
                "required": false
              },
              "isLeaving": {
                "name": "isLeaving",
                "type": "boolean",
                "required": false
              },
              "title": {
                "name": "title",
                "type": "string",
                "required": false
              },
              "showCloseButton": {
                "name": "showCloseButton",
                "type": "boolean",
                "required": false
              },
              "variant": {
                "name": "variant",
                "type": "VariantAlert",
                "required": false
              },
              "onClick": {
                "name": "onClick",
                "type": "() => void",
                "required": false
              },
              "onClose": {
                "name": "onClose",
                "type": "(e: React.MouseEvent<HTMLButtonElement>) => void",
                "required": false
              },
              "onPrimaryClick": {
                "name": "onPrimaryClick",
                "type": "() => void",
                "required": false
              },
              "onSecondaryClick": {
                "name": "onSecondaryClick",
                "type": "() => void",
                "required": false
              },
              "primaryButtonText": {
                "name": "primaryButtonText",
                "type": "string",
                "required": false
              },
              "secondaryButtonText": {
                "name": "secondaryButtonText",
                "type": "string",
                "required": false
              },
              "animation": {
                "name": "animation",
                "type": "AnimationAlert",
                "required": false
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "size": {
                "name": "size",
                "type": "SizeAlert",
                "required": false
              },
              "duration": {
                "name": "duration",
                "type": "number",
                "required": false,
                "description": "Duración en milisegundos antes del auto-cierre vía barra de progreso.\n    - `undefined`: sin barra ni cierre automático por tiempo.\n    - `0`: sin barra ni cierre automático (equivalente práctico a omitir; útil con APIs que envían `0` explícito).\n    - Valor > 0: barra de cuenta atrás y cierre al completar."
              },
              "progressBarClassName": {
                "name": "progressBarClassName",
                "type": "string",
                "required": false,
                "description": "Clases en el contenedor de la barra de progreso (p. ej. `ui-hidden`) para ocultarla sin desmontarla.\n    Útil si un temporizador externo sigue activo y no debe reiniciarse la cuenta atrás visual."
              },
              "children": {
                "name": "children",
                "type": "React.ReactNode",
                "required": false,
                "description": "Contenido adicional que se renderiza antes de la barra de progreso.\n    Útil para mostrar contadores u otros elementos personalizados."
              },
              "avatar": {
                "name": "avatar",
                "type": "string",
                "required": false,
                "description": "URL de una imagen de avatar para mostrar en lugar del icono por defecto.\n    Cuando se proporciona, muestra un avatar circular con la imagen."
              },
              "endAdornment": {
                "name": "endAdornment",
                "type": "React.ReactNode",
                "required": false,
                "description": "Contenido al final de la fila de cabecera (p. ej. hora y estado leído).\n    Solo tiene efecto si {"
              },
              "avatarIntentBadge": {
                "name": "avatarIntentBadge",
                "type": "boolean",
                "required": false,
                "description": "Con `avatar`, muestra un badge circular con el icono de intención superpuesto\n    (esquina inferior derecha), como en Notification (Figma)."
              },
              "truncateHeaderText": {
                "name": "truncateHeaderText",
                "type": "boolean",
                "required": false,
                "description": "Si es true, el título y el mensaje (p. ej. subtítulo) muestran elipsis en una sola línea\n    cuando no caben en el ancho disponible (requiere `min-w-0` en ancestros flex)."
              },
              "headerAddon": {
                "name": "headerAddon",
                "type": "React.ReactNode",
                "required": false,
                "description": "Bloque bajo título/mensaje/descripción en la columna derecha de la cabecera\n    (p. ej. CTA o panel de {"
              }
            }
          }
        }
      ],
      "standaloneSnippet": "import React, { useState } from 'react';\n\nconst variantMap = {\n  info: { border: 'rgb(5, 181, 212)', bg: 'rgba(0, 0, 0, 0.08)', text: 'rgb(5, 181, 212)' },\n  success: { border: 'rgb(33, 196, 94)', bg: 'rgba(0, 0, 0, 0.08)', text: 'rgb(33, 196, 94)' },\n  warning: { border: 'rgb(235, 179, 8)', bg: 'rgba(0, 0, 0, 0.08)', text: 'rgb(235, 179, 8)' },\n  error: { border: 'rgb(240, 69, 69)', bg: 'rgba(0, 0, 0, 0.08)', text: 'rgb(240, 69, 69)' },\n};\n\nexport function Alert({\n  children,\n  variant = 'info',\n  title,\n  closable = false,\n  onClose,\n}: {\n  children: React.ReactNode;\n  variant?: keyof typeof variantMap;\n  title?: string;\n  closable?: boolean;\n  onClose?: () => void;\n}) {\n  const [visible, setVisible] = useState(true);\n  if (!visible) return null;\n\n  const v = variantMap[variant];\n\n  const handleClose = () => {\n    setVisible(false);\n    onClose?.();\n  };\n\n  return (\n    <div\n      role=\"alert\"\n      style={{\n        position: 'relative',\n        padding: '12px 4px',\n        borderLeft: `4px solid ${v.border}`,\n        backgroundColor: v.bg,\n        borderRadius: '8px',\n        color: 'rgb(48, 51, 54)',\n        fontSize: '14px',\n        lineHeight: '1.5',\n      }}\n    >\n      {closable && (\n        <button\n          onClick={handleClose}\n          aria-label=\"Close\"\n          style={{\n            position: 'absolute',\n            top: '2px',\n            right: '2px',\n            background: 'none',\n            border: 'none',\n            cursor: 'pointer',\n            fontSize: '16px',\n            color: 'rgb(89, 89, 94)',\n            padding: '4px',\n            lineHeight: '1',\n          }}\n        >\n          ×\n        </button>\n      )}\n      {title && (\n        <div style={{ fontWeight: '700', marginBottom: '4px', color: v.text }}>\n          {title}\n        </div>\n      )}\n      <div>{children}</div>\n    </div>\n  );\n}\n"
    },
    {
      "id": "AlertDialog",
      "path": "src/modules/AlertDialog",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "AlertDialog",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente AlertDialog permite a los usuarios realizar acciones y tomar decisiones con un solo toque.",
            "jsdoc": "AlertDialog - Componente de diálogo de confirmación/alert\nComponente de diálogo modal especializado para confirmaciones y alertas.\nSoporta texto de confirmación requerido, iconos personalizados y múltiples tamaños.",
            "confidence": "high"
          },
          "examples": [
            "import { AlertDialog } from '@imj_media/ui';\n  const [isOpen, setIsOpen] = useState(false);\n\n  export default function Example() {\n    return <AlertDialog\n        title='Eliminar borrador'\n        iconContent={faHardDrive}\n        heading='¿Estás seguro?'\n        subheading='Si eliminas este borrador, también se borrarán todas sus tareas y conexiones con otros borradores.'\n        icon={faBan}\n        label=\"Confirmar eliminación\"\n        confirmationText=\"EliminarBorrador\"\n        isOpen={isOpen} onClose={() => setIsOpen(false)}\n        onConfirm={() => { console.log('onConfirm') }}\n        placeholder='Escribe la palabra de confirmación'\n    />\n  }",
            "import { AlertDialog } from '@imj_media/ui';\nimport { useState } from 'react';\n\nexport default function SizesExample() {\n  const [isOpen, setIsOpen] = useState(false);\n  \n  return (\n    <AlertDialog\n      size=\"lg\" // 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full'\n      title='Confirmar acción'\n      iconContent={faInfoCircle}\n      heading='¿Confirmar?'\n      subheading='Este AlertDialog usa un tamaño grande.'\n      isOpen={isOpen}\n      onClose={() => setIsOpen(false)}\n      onConfirm={() => console.log('Confirmado')}\n      successButtonText=\"Aceptar\"\n      successButtonColor=\"primary\"\n    />\n  );\n}",
            "import { AlertDialog } from '@/modules/AlertDialog';\nimport { faTrash, faBan } from '@fortawesome/pro-duotone-svg-icons';\nimport { useState } from 'react';\n\nexport default function DuotoneExample() {\n  const [isOpen, setIsOpen] = useState(false);\n  \n  return (\n    <AlertDialog\n      title='Eliminar borrador'\n      iconContent={faBan}\n      iconContentDuotonePrimary=\"danger\"\n      iconContentDuotoneSecondary=\"red\"\n      iconContentDuotoneOpacityPrimary={1}\n      iconContentDuotoneOpacitySecondary={0.4}\n      icon={faTrash}\n      iconDuotonePrimary=\"danger\"\n      iconDuotoneSecondary=\"red\"\n      iconDuotoneOpacityPrimary={1}\n      iconDuotoneOpacitySecondary={0.4}\n      isOpen={isOpen}\n      onClose={() => setIsOpen(false)}\n      onConfirm={() => console.log('Confirmado')}\n    />\n  );\n}",
            "import { AlertDialog } from '@imj_media/ui';\n  const [isOpen, setIsOpen] = useState(false);\n\n  export default function Example() {\n    return <AlertDialog\n        title='Eliminar borrador'\n        iconContent={faHardDrive}\n        heading='¿Estás seguro?'\n        subheading='Si eliminas este borrador, también se borrarán todas sus tareas y conexiones con otros borradores.'\n        icon={faBan}\n        label=\"Confirmar eliminación\"\n        confirmationText=\"EliminarBorrador\"\n        isOpen={isOpen} onClose={() => setIsOpen(false)}\n        onConfirm={() => { console.log('onConfirm') }}\n        placeholder='Escribe la palabra de confirmación'\n    />\n  }",
            "import { AlertDialog } from '@imj_media/ui';\nimport { useState } from 'react';\n\nexport default function SizesExample() {\n  const [isOpen, setIsOpen] = useState(false);\n  \n  return (\n    <AlertDialog\n      size=\"lg\" // 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full'\n      title='Confirmar acción'\n      iconContent={faInfoCircle}\n      heading='¿Confirmar?'\n      subheading='Este AlertDialog usa un tamaño grande.'\n      isOpen={isOpen}\n      onClose={() => setIsOpen(false)}\n      onConfirm={() => console.log('Confirmado')}\n      successButtonText=\"Aceptar\"\n      successButtonColor=\"primary\"\n    />\n  );\n}"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "isOpen": {
                "name": "isOpen",
                "type": "boolean",
                "required": true
              },
              "onClose": {
                "name": "onClose",
                "type": "() => void",
                "required": true
              },
              "label": {
                "name": "label",
                "type": "string",
                "required": false
              },
              "confirmationText": {
                "name": "confirmationText",
                "type": "string",
                "required": false
              },
              "onConfirm": {
                "name": "onConfirm",
                "type": "() => void",
                "required": true
              },
              "icon": {
                "name": "icon",
                "type": "IconType | AnyIconDefinition",
                "required": false
              },
              "iconDuotonePrimary": {
                "name": "iconDuotonePrimary",
                "type": "IconFontColor",
                "required": false
              },
              "iconDuotoneSecondary": {
                "name": "iconDuotoneSecondary",
                "type": "IconFontColor",
                "required": false
              },
              "iconDuotoneOpacityPrimary": {
                "name": "iconDuotoneOpacityPrimary",
                "type": "number",
                "required": false
              },
              "iconDuotoneOpacitySecondary": {
                "name": "iconDuotoneOpacitySecondary",
                "type": "number",
                "required": false
              },
              "iconContent": {
                "name": "iconContent",
                "type": "IconType | AnyIconDefinition",
                "required": false
              },
              "iconContentDuotonePrimary": {
                "name": "iconContentDuotonePrimary",
                "type": "IconFontColor",
                "required": false
              },
              "iconContentDuotoneSecondary": {
                "name": "iconContentDuotoneSecondary",
                "type": "IconFontColor",
                "required": false
              },
              "iconContentDuotoneOpacityPrimary": {
                "name": "iconContentDuotoneOpacityPrimary",
                "type": "number",
                "required": false
              },
              "iconContentDuotoneOpacitySecondary": {
                "name": "iconContentDuotoneOpacitySecondary",
                "type": "number",
                "required": false
              },
              "heading": {
                "name": "heading",
                "type": "string",
                "required": false
              },
              "subheading": {
                "name": "subheading",
                "type": "string",
                "required": false
              },
              "placeholder": {
                "name": "placeholder",
                "type": "string",
                "required": false
              },
              "title": {
                "name": "title",
                "type": "string",
                "required": false
              },
              "successButtonColor": {
                "name": "successButtonColor",
                "type": "ButtonColors",
                "required": false
              },
              "successButtonText": {
                "name": "successButtonText",
                "type": "string",
                "required": false
              }
            }
          }
        }
      ]
    },
    {
      "id": "Avatar",
      "path": "src/modules/Avatar",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Avatar",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "jsdoc": "============================================\nAVATAR COMPONENT - ATOMIC DESIGN\n============================================\nComponente Avatar versátil que sigue principios de Atomic Design.\nActúa como un wrapper que delega la renderización a subcomponentes\nespecializados según el tipo de avatar.\n## Tipos de Avatar\n### 1. People Avatar (type: 'people')\nMuestra una imagen de persona con manejo de errores y fallback automático al icono por defecto\n### 2. Icon Avatar (type: 'icon')\nMuestra un icono del sistema de iconos con temas de color\n### 3. Letter Avatar (type: 'letter')\nMuestra texto (iniciales, números, símbolos) con truncado automático\n## Personalización\nPara modificar colores, tamaños, o agregar nuevos temas:\n@see /constants/index.ts - Tokens de diseño centralizados\n@see /types/index.t",
            "readme": "# Avatar Component\n\nComponente Avatar versátil construido con **Atomic Design** que soporta múltiples tipos: imágenes de personas, iconos y letras/números.\n\n## 📋 Tabla de Contenidos\n\n- [Características](#características)\n- [Tipos de Avatar](#tipos-de-avatar)\n- [Props](#props)\n- [Ejemplos de Uso](#ejemplos-de-uso)\n- [Personalización](#personalización)\n- [Estructura del Componente](#estructura-del-componente)\n\n## ✨ Características\n\n- ✅ **3 tipos de avatar**: People (imagen), Icon (icono), Letter (texto/números)\n- ✅ **Atomic Design**: Estructura modular y mantenible\n- ✅ **6 tamaños**: xxs, xs, sm, md, lg, xl\n- ✅ **11 colores**: blue, red, orange, yellow, lime, green, cyan, azure, violet, magenta, rose\n- ✅ **2 temas**: solid y soft\n- ✅ **Personalización**: Border (stroke) y forma (pill/rounded)\n- ✅ **Performance**: Lazy loading y preload de imágenes\n- ✅ **TypeScript**: Completamente tipado\n- ✅ **Documentación**: Stories completas en Storybook\n\n## 🎯 Tipos de Avatar\n\n### 1. People Avatar (type: 'people')\n\nMuestra una imagen de persona con manejo de errores y fallback automático al icono por defecto.\n\n```tsx\n<Avatar type=\"people\" src=\"https://example.com/avatar.jpg\" alt=\"John Doe\" size=\"md\" />\n```\n\n### 2. Icon Avatar (type: 'icon')\n\nMuestra un icono fijo (UserOutlined).\n\n```tsx\n<Avatar\n  type=\"icon\"\n  theme=\"solid\" // 'solid' | 'soft'\n  color=\"blue\" // 11 colores disponibles\n  size=\"md\"\n/>\n```\n\n### 3. Letter Avatar (type: 'letter')\n\nMuestra texto, ideal para iniciales, contadores o indicadores.\n\n```tsx\n// Iniciales\n<Avatar\n  type=\"letter\"\n  text=\"AB\"\n  theme=\"solid\"\n  color=\"blue\"\n  size=\"md\"\n/>\n\n// Contador estilo Teams\n<Avatar\n  type=\"letter\"\n  text=\"99+\"\n  theme=\"solid\"\n  color=\"red\"\n  size=\"sm\"\n/>\n\n// Indicador\n<Avatar\n  type=\"letter\"\n  text=\"+5\"\n  theme=\"soft\"\n  color=\"green\"\n  size=\"md\"\n/>\n```\n\n## 📝 Props\n\n### Props Comunes (todas los tipos)\n\n| Prop                    | Tipo         | Default | Descripción                                        |\n| ---------------",
            "confidence": "medium"
          },
          "examples": [],
          "props": {
            "groups": {
              "status": {
                "props": {
                  "type": {
                    "name": "type",
                    "type": "AvatarStatusType",
                    "required": false,
                    "description": "Tipo de status: 'color' muestra un punto de color, 'icon' muestra un icono"
                  },
                  "color": {
                    "name": "color",
                    "type": "AvatarStatusColor",
                    "required": false,
                    "description": "Color del status"
                  },
                  "size": {
                    "name": "size",
                    "type": "AvatarStatusSize",
                    "required": false,
                    "description": "Tamaño del status"
                  },
                  "icon": {
                    "name": "icon",
                    "type": "IconType | AnyIconDefinition",
                    "required": false,
                    "description": "Icono personalizado (solo para type='icon')"
                  }
                }
              },
              "withStack": {
                "props": {
                  "stack": {
                    "name": "stack",
                    "type": "AvatarStackItem[]",
                    "required": true,
                    "description": "Array de avatares para mostrar en stack. Si tiene `src`, se usa type='people' automáticamente"
                  },
                  "size": {
                    "name": "size",
                    "type": "AvatarSize",
                    "required": false,
                    "description": "Tamaño del avatar (default: 'md') - se aplica a todos los avatares del stack"
                  },
                  "className": {
                    "name": "className",
                    "type": "string",
                    "required": false,
                    "description": "Clases CSS adicionales para el contenedor del stack"
                  },
                  "maxVisible": {
                    "name": "maxVisible",
                    "type": "number",
                    "required": false,
                    "description": "Número máximo de avatares a mostrar. Si hay más, se muestra un contador con el número restante (ej: \"+5\")"
                  },
                  "counterColor": {
                    "name": "counterColor",
                    "type": "AvatarColor",
                    "required": false,
                    "description": "Color del avatar contador cuando se excede maxVisible (default: 'blue')"
                  },
                  "counterTheme": {
                    "name": "counterTheme",
                    "type": "AvatarTheme",
                    "required": false,
                    "description": "Tema del avatar contador cuando se excede maxVisible (default: 'solid')"
                  },
                  "stroke": {
                    "name": "stroke",
                    "type": "boolean",
                    "required": false,
                    "description": "Agrega borde de 2px a todos los avatares del stack (default: false)"
                  }
                }
              }
            },
            "deprecatedRoot": []
          }
        }
      ],
      "standaloneSnippet": "import React, { useState } from 'react';\n\nconst sizeMap = {\n  sm: { dimension: '32px', fontSize: '12px' },\n  md: { dimension: '40px', fontSize: '14px' },\n  lg: { dimension: '56px', fontSize: '18px' },\n  xl: { dimension: '80px', fontSize: '20px' },\n};\n\nexport function Avatar({\n  src,\n  alt = '',\n  size = 'md',\n  fallback,\n}: {\n  src?: string;\n  alt?: string;\n  size?: keyof typeof sizeMap;\n  fallback?: string;\n}) {\n  const [imgError, setImgError] = useState(false);\n  const s = sizeMap[size];\n  const showImage = src && !imgError;\n\n  const baseStyle: React.CSSProperties = {\n    width: s.dimension,\n    height: s.dimension,\n    borderRadius: '9999px',\n    display: 'inline-flex',\n    alignItems: 'center',\n    justifyContent: 'center',\n    overflow: 'hidden',\n    flexShrink: 0,\n  };\n\n  if (showImage) {\n    return (\n      <img\n        src={src}\n        alt={alt}\n        onError={() => setImgError(true)}\n        style={{\n          ...baseStyle,\n          objectFit: 'cover',\n        }}\n      />\n    );\n  }\n\n  return (\n    <div\n      style={{\n        ...baseStyle,\n        backgroundColor: 'rgb(247, 247, 250)',\n        color: 'rgb(48, 51, 54)',\n        fontSize: s.fontSize,\n        fontWeight: '500',\n        userSelect: 'none',\n      }}\n    >\n      {fallback || '?'}\n    </div>\n  );\n}\n"
    },
    {
      "id": "Badge",
      "path": "src/modules/Badge",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Badge",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Badge permite mostrar pequeñas notificaciones y contadores. **API preferida:** bloques",
            "jsdoc": "Módulo Badge — insignia contador/estado del design system.\nExporta {@link Badge} para uso desde `@imj_media/ui` o `@/modules/Badge`.\nLas props públicas (`BadgeProps` y sub-interfaces) viven en `@/shared/types/badge`.",
            "readme": "# Badge Component\n\nComponente de insignia/badge versátil y configurable con soporte para diferentes tamaños, colores, temas, iconos, estados de carga y personalización avanzada.\n\n## Uso Básico\n\n```tsx\nimport { Badge } from '@imj_media/ui';\n\n// Badge simple con label\n<Badge label=\"3\" color=\"danger\" />\n\n// Badge tipo dot (sin label)\n<Badge size=\"dot\" color=\"accent\" />\n\n// Badge con icono\n<Badge label=\"Nuevo\" icon=\"StarOutlined\" color=\"success\" />\n```\n\n## Props Principales\n\n### Contenido\n\n- `label?: string | number` - Texto o número del badge (default: `''`)\n- `icon?: IconType | AnyIconDefinition` - Icono del badge (no se muestra en tamaño `dot`)\n\n### Tamaño y Estilo\n\n- `size?: 'dot' | 'sm' | 'md' | 'lg'` - Tamaño del badge (default: `'dot'`)\n- `color?: 'accent' | 'gray' | 'success' | 'warning' | 'danger' | 'info'` - Color del badge (default: `'accent'`)\n- `theme?: 'solid' | 'soft'` - Tema del badge (default: `'solid'`)\n- `stroke?: boolean` - Mostrar borde (default: `false`)\n\n### Estados\n\n- `disabled?: boolean` - Si el badge está deshabilitado (default: `false`)\n- `loading?: boolean` - Mostrar spinner de carga (default: `false`)\n\n### Personalización\n\n- `customColor?: string` - Color personalizado (hex, rgb, etc.)\n- `className?: string` - Clases CSS adicionales\n\n### Iconos Duotone\n\n- `iconDuotonePrimary?: IconFontColor` - Color primario del icono duotone\n- `iconDuotoneSecondary?: IconFontColor` - Color secundario del icono duotone\n- `iconDuotoneOpacityPrimary?: number` - Opacidad primaria (0-1)\n- `iconDuotoneOpacitySecondary?: number` - Opacidad secundaria (0-1)\n\n## Ejemplos\n\n### Badge tipo dot\n\n```tsx\n// Dot simple\n<Badge size=\"dot\" color=\"accent\" />\n\n// Dot con color personalizado\n<Badge size=\"dot\" customColor=\"#ff0000\" />\n```\n\n### Badge con diferentes tamaños\n\n```tsx\n<Badge label=\"1\" size=\"sm\" color=\"danger\" />\n<Badge label=\"12\" size=\"md\" color=\"success\" />\n<Badge label=\"999+\" size=\"lg\" color=\"warning\" />\n```\n\n### Badge con icono\n\n```tsx\n<Badge label=\"Nuevo\" icon=\"St",
            "confidence": "high"
          },
          "examples": [
            "import { Badge } from '@/modules/Badge';\n\nexport default function Example() {\n  return (\n    <>\n      <Badge appearance={{ size: 'dot', color: 'accent' }} />\n      <Badge appearance={{ size: 'dot', color: 'gray' }} />\n      <Badge appearance={{ size: 'dot', color: 'success' }} />\n      <Badge appearance={{ size: 'dot', color: 'warning' }} />\n      <Badge appearance={{ size: 'dot', color: 'danger' }} />\n      <Badge appearance={{ size: 'dot', color: 'info' }} />\n      <Badge appearance={{ size: 'dot' }} state={{ disabled: true }} />\n    </>\n  )\n}",
            "import { Badge } from '@/modules/Badge';\n\nexport default function Example() {\n  return (\n    <>\n      <Badge appearance={{ size: 'dot', color: 'accent', stroke: true }} />\n      <Badge appearance={{ size: 'dot', color: 'gray', stroke: true }} />\n      <Badge appearance={{ size: 'dot', color: 'success', stroke: true }} />\n      <Badge appearance={{ size: 'dot', color: 'warning', stroke: true }} />\n      <Badge appearance={{ size: 'dot', color: 'danger', stroke: true }} />\n      <Badge appearance={{ size: 'dot', color: 'info', stroke: true }} />\n      <Badge appearance={{ size: 'dot', stroke: true }} state={{ disabled: true }} />\n    </>\n  )\n}",
            "import { Badge } from '@/modules/Badge';\n\nexport default function Example() {\n  return (\n    <>\n      <Badge appearance={{ size: 'dot', color: 'accent', theme: 'soft' }} />\n      <Badge appearance={{ size: 'dot', color: 'gray', theme: 'soft' }} />\n      <Badge appearance={{ size: 'dot', color: 'success', theme: 'soft' }} />\n      <Badge appearance={{ size: 'dot', color: 'warning', theme: 'soft' }} />\n      <Badge appearance={{ size: 'dot', color: 'danger', theme: 'soft' }} />\n      <Badge appearance={{ size: 'dot', color: 'info', theme: 'soft' }} />\n      <Badge appearance={{ size: 'dot' }} state={{ disabled: true }} />\n    </>\n  )\n}",
            "import { Badge } from '@/modules/Badge';\n\nexport default function Example() {\n  return (\n    <>\n      <Badge appearance={{ size: 'dot', color: 'accent', theme: 'soft', stroke: true }} />\n      <Badge appearance={{ size: 'dot', color: 'gray', theme: 'soft', stroke: true }} />\n      <Badge appearance={{ size: 'dot', color: 'success', theme: 'soft', stroke: true }} />\n      <Badge appearance={{ size: 'dot', color: 'warning', theme: 'soft', stroke: true }} />\n      <Badge appearance={{ size: 'dot', color: 'danger', theme: 'soft', stroke: true }} />\n      <Badge appearance={{ size: 'dot', color: 'info', theme: 'soft', stroke: true }} />\n      <Badge appearance={{ size: 'dot', stroke: true }} state={{ disabled: true }} />\n    </>\n  )\n}",
            "import { Badge } from '@/modules/Badge';\n\nexport default function Example() {\n  return (\n    <>\n      <Badge appearance={{ size: 'sm', color: 'accent' }} text={{ label: '5' }} />\n      <Badge appearance={{ size: 'sm', color: 'gray' }} text={{ label: '5' }} />\n      <Badge appearance={{ size: 'sm', color: 'success' }} text={{ label: '5' }} />\n      <Badge appearance={{ size: 'sm', color: 'warning' }} text={{ label: '5' }} />\n      <Badge appearance={{ size: 'sm', color: 'danger' }} text={{ label: '5' }} />\n      <Badge appearance={{ size: 'sm', color: 'info' }} text={{ label: '5' }} />\n      <Badge appearance={{ size: 'sm' }} text={{ label: '5' }} state={{ disabled: true }} />\n    </>\n  )\n}"
          ],
          "props": {
            "groups": {
              "shared": {
                "props": {
                  "className": {
                    "name": "className",
                    "type": "string",
                    "required": false
                  }
                }
              },
              "appearance": {
                "props": {
                  "color": {
                    "name": "color",
                    "type": "BadgeColor",
                    "required": false
                  },
                  "theme": {
                    "name": "theme",
                    "type": "BadgeTheme",
                    "required": false
                  },
                  "size": {
                    "name": "size",
                    "type": "BadgeSize",
                    "required": false
                  },
                  "customColor": {
                    "name": "customColor",
                    "type": "string",
                    "required": false
                  },
                  "stroke": {
                    "name": "stroke",
                    "type": "boolean",
                    "required": false
                  }
                }
              },
              "glyph": {
                "props": {
                  "icon": {
                    "name": "icon",
                    "type": "IconType | AnyIconDefinition",
                    "required": false
                  },
                  "iconSlot": {
                    "name": "iconSlot",
                    "type": "ReactNode",
                    "required": false,
                    "description": "Si se define, sustituye el render del icono Font Awesome (p. ej. LegacyIcon)."
                  },
                  "iconDuotonePrimary": {
                    "name": "iconDuotonePrimary",
                    "type": "IconFontColor",
                    "required": false
                  },
                  "iconDuotoneSecondary": {
                    "name": "iconDuotoneSecondary",
                    "type": "IconFontColor",
                    "required": false
                  },
                  "iconDuotoneOpacityPrimary": {
                    "name": "iconDuotoneOpacityPrimary",
                    "type": "number",
                    "required": false
                  },
                  "iconDuotoneOpacitySecondary": {
                    "name": "iconDuotoneOpacitySecondary",
                    "type": "number",
                    "required": false
                  }
                }
              },
              "text": {
                "props": {
                  "label": {
                    "name": "label",
                    "type": "string",
                    "required": false
                  },
                  "truncateLabel": {
                    "name": "truncateLabel",
                    "type": "boolean",
                    "required": false
                  },
                  "truncateTooltip": {
                    "name": "truncateTooltip",
                    "type": "boolean",
                    "required": false,
                    "description": "Si es true y truncateLabel es true, muestra tooltip con el texto completo al hacer hover cuando está truncado. Por defecto false."
                  }
                }
              },
              "state": {
                "props": {
                  "hover": {
                    "name": "hover",
                    "type": "boolean",
                    "required": false,
                    "description": "Si es `false`, el badge no participa como objetivo de puntero (`pointer-events: none`): útil en chips donde el\n    remarcado lo define el padre (p. ej. tarjeta con `group-hover`) y no el hover sobre el propio badge.\n    Por defecto `true`."
                  },
                  "disabled": {
                    "name": "disabled",
                    "type": "boolean",
                    "required": false
                  },
                  "loading": {
                    "name": "loading",
                    "type": "boolean",
                    "required": false,
                    "description": "Si es true, muestra un spinner de carga en lugar del contenido del badge"
                  }
                }
              }
            },
            "deprecatedRoot": [],
            "flat": {
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              }
            }
          }
        }
      ],
      "standaloneSnippet": "import React from 'react';\n\nconst colorMap = {\n  primary: { solid: 'rgb(54, 89, 194)', text: 'rgb(54, 89, 194)' },\n  secondary: { solid: 'rgb(240, 69, 69)', text: 'rgb(240, 69, 69)' },\n  tertiary: { solid: 'rgb(33, 196, 94)', text: 'rgb(33, 196, 94)' },\n  destructive: { solid: 'rgb(235, 179, 8)', text: 'rgb(235, 179, 8)' },\n  neutral: { solid: 'rgb(89, 89, 94)', text: 'rgb(89, 89, 94)' },\n};\n\nconst sizeMap = {\n  sm: { padding: '2px 6px', fontSize: '12px' },\n  md: { padding: '4px 2px', fontSize: '12px' },\n  lg: { padding: '4px 12px', fontSize: '14px' },\n};\n\nfunction hexToRgba(hex: string, alpha: number): string {\n  const h = hex.replace('#', '');\n  const n = parseInt(h, 16);\n  return `rgba(${(n >> 16) & 255}, ${(n >> 8) & 255}, ${n & 255}, ${alpha})`;\n}\n\nexport function Badge({\n  children,\n  color = 'primary',\n  size = 'md',\n  theme = 'soft',\n}: {\n  children: React.ReactNode;\n  color?: keyof typeof colorMap;\n  size?: keyof typeof sizeMap;\n  theme?: 'soft' | 'solid' | 'outlined';\n}) {\n  const c = colorMap[color];\n  const s = sizeMap[size];\n\n  const styles: Record<string, string | number> = {\n    display: 'inline-flex',\n    alignItems: 'center',\n    justifyContent: 'center',\n    padding: s.padding,\n    fontSize: s.fontSize,\n    fontWeight: '500',\n    lineHeight: '1.25',\n    borderRadius: '9999px',\n    whiteSpace: 'nowrap',\n  };\n\n  if (theme === 'solid') {\n    styles.backgroundColor = c.solid;\n    styles.color = 'rgb(255, 255, 255)';\n    styles.border = 'none';\n  } else if (theme === 'outlined') {\n    styles.backgroundColor = 'transparent';\n    styles.color = c.text;\n    styles.border = `1px solid ${c.solid}`;\n  } else {\n    styles.backgroundColor = hexToRgba(c.solid, 0.1);\n    styles.color = c.text;\n    styles.border = 'none';\n  }\n\n  return <span style={styles}>{children}</span>;\n}\n"
    },
    {
      "id": "Badges",
      "path": "src/modules/Badges",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Badges",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Badges permite crear una lista de badges dinámicos escribiendo texto y presionando Enter. Cada badge puede ser eliminado individualmente.",
            "confidence": "medium"
          },
          "examples": [
            "import { Badges, BadgeItem } from '@imj_media/ui';\nimport { useState } from 'react';\n\nexport default function Example() {\n  const [badges, setBadges] = useState<BadgeItem[]>([]);\n\n  return (\n    <Badges\n      label=\"Tags\"\n      placeholder=\"Escribe y presiona Enter...\"\n      onChange={(event) => setBadges(event.items)}\n    />\n  );\n}",
            "import { Badges, BadgeItem, BadgesChangeEvent } from '@imj_media/ui';\nimport { useState } from 'react';\n\nconst initialBadges: BadgeItem[] = [\n  { id: '1', label: 'React', color: 'accent' },\n  { id: '2', label: 'TypeScript', color: 'info' },\n  { id: '3', label: 'Tailwind', color: 'success' },\n];\n\nexport default function Example() {\n  const [badges, setBadges] = useState<BadgeItem[]>(initialBadges);\n\n  const handleChange = (event: BadgesChangeEvent) => {\n    setBadges(event.items);\n  };\n\n  return (\n    <Badges\n      label=\"Tecnologías\"\n      value={initialBadges}\n      placeholder=\"Agregar tecnología...\"\n      onChange={handleChange}\n    />\n  );\n}",
            "import { Badges, BadgesChangeEvent } from '@imj_media/ui';\n\n// Simplemente pasa un array de strings\nconst initialTags = ['React', 'TypeScript', 'Tailwind', 'Node.js'];\n\nexport default function Example() {\n  return (\n    <Badges\n      label=\"Tecnologías\"\n      value={initialTags}\n      placeholder=\"Agregar tecnología...\"\n      colorCycle={['accent', 'success', 'info', 'warning']}\n    />\n  );\n}",
            "import { Badges } from '@imj_media/ui';\n\nexport default function Example() {\n  return (\n    <Badges\n      label=\"Categorías\"\n      placeholder=\"Agregar categoría...\"\n      colorCycle={['accent', 'success', 'warning', 'danger', 'info', 'gray']}\n    />\n  );\n}",
            "import { Badges } from '@imj_media/ui';\n\nexport default function Example() {\n  return (\n    <>\n      <Badges label=\"Success\" defaultColor=\"success\" />\n      <Badges label=\"Warning\" defaultColor=\"warning\" />\n      <Badges label=\"Danger\" defaultColor=\"danger\" />\n      <Badges label=\"Info\" defaultColor=\"info\" />\n    </>\n  );\n}"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "value": {
                "name": "value",
                "type": "BadgesInputValue",
                "required": false,
                "description": "Lista inicial de badges (puede ser array de BadgeItem o array de strings)"
              },
              "placeholder": {
                "name": "placeholder",
                "type": "string",
                "required": false,
                "description": "Placeholder del input"
              },
              "label": {
                "name": "label",
                "type": "string",
                "required": false,
                "description": "Label del componente"
              },
              "helperText": {
                "name": "helperText",
                "type": "string",
                "required": false,
                "description": "Texto de ayuda"
              },
              "error": {
                "name": "error",
                "type": "string",
                "required": false,
                "description": "Mensaje de error"
              },
              "defaultColor": {
                "name": "defaultColor",
                "type": "TagColor",
                "required": false,
                "description": "Color por defecto para nuevos badges"
              },
              "colorCycle": {
                "name": "colorCycle",
                "type": "TagColor[]",
                "required": false,
                "description": "Colores cíclicos para badges (si se define, se ignora defaultColor)"
              },
              "size": {
                "name": "size",
                "type": "InputSize",
                "required": false,
                "description": "Tamaño del componente"
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false,
                "description": "Si está deshabilitado"
              },
              "fullWidth": {
                "name": "fullWidth",
                "type": "boolean",
                "required": false,
                "description": "Si ocupa todo el ancho"
              },
              "maxBadges": {
                "name": "maxBadges",
                "type": "number",
                "required": false,
                "description": "Máximo número de badges permitidos"
              },
              "onChange": {
                "name": "onChange",
                "type": "(event: BadgesChangeEvent) => void",
                "required": false,
                "description": "Evento cuando cambia la lista de badges (add o remove)"
              },
              "onAdd": {
                "name": "onAdd",
                "type": "(item: BadgeItem) => void",
                "required": false,
                "description": "Evento cuando se agrega un badge"
              },
              "onRemove": {
                "name": "onRemove",
                "type": "(item: BadgeItem) => void",
                "required": false,
                "description": "Evento cuando se elimina un badge"
              },
              "onFocus": {
                "name": "onFocus",
                "type": "(event?: React.FocusEvent<HTMLInputElement>) => void",
                "required": false,
                "description": "Evento de focus"
              },
              "onBlur": {
                "name": "onBlur",
                "type": "(event?: React.FocusEvent<HTMLInputElement>) => void",
                "required": false,
                "description": "Evento de blur"
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clases adicionales para el contenedor"
              }
            }
          }
        }
      ]
    },
    {
      "id": "Breadcrumbs",
      "path": "src/modules/Breadcrumbs",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Breadcrumbs",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Breadcrumbs permite mostrar una lista de enlaces que representan la navegación del usuario.",
            "jsdoc": "Breadcrumbs - Componente de migas de pan\nComponente de navegación que muestra la ruta jerárquica actual.\nSoporta truncamiento automático cuando hay muchos items y componente de enlace personalizable.",
            "confidence": "high"
          },
          "examples": [
            "import { Breadcrumbs } from '@imj_media/ui/Breadcrumbs';\n\n  const items = [\n      { label: 'Home', to: '/' },\n      { label: 'About', to: '/about' },\n      { label: 'Contact', to: '/contact' },\n      { label: 'Gallery', to: '/gallery' },\n      { label: 'Blog', to: '/blog' },\n      { label: 'History', to: '/history' },\n  ];\n\n  export default function Example() {\n    return (\n      <>\n        <Breadcrumbs items={items} />\n      </>\n    )\n  }",
            "import { Breadcrumbs } from '@imj_media/ui/Breadcrumbs';\n  import { Link } from '@react-router';\n  \n  const items = [\n      { label: 'Home', to: '/' },\n      { label: 'About', to: '/about' },\n      { label: 'Contact', to: '/contact' },\n      { label: 'Gallery', to: '/gallery' },\n      { label: 'Blog', to: '/blog' },\n      { label: 'History', to: '/history' },\n  ];\n\n  export default function Example() {\n    return (\n      <>\n        <Breadcrumbs items={items} LinkComponent={Link} />\n      </>\n    )\n  }",
            "import { Breadcrumbs } from '@imj_media/ui/Breadcrumbs';\n\n  const items = [\n      { label: 'Home', to: '/' },\n      { label: 'About', to: '/about' },\n      { label: 'Contact', to: '/contact' },\n      { label: 'Gallery', to: '/gallery' },\n      { label: 'Blog', to: '/blog' },\n      { label: 'History', to: '/history' },\n  ];\n\n  export default function Example() {\n    return (\n      <>\n        <Breadcrumbs items={items} />\n      </>\n    )\n  }",
            "import { Breadcrumbs } from '@imj_media/ui/Breadcrumbs';\n  import { Link } from '@react-router';\n  \n  const items = [\n      { label: 'Home', to: '/' },\n      { label: 'About', to: '/about' },\n      { label: 'Contact', to: '/contact' },\n      { label: 'Gallery', to: '/gallery' },\n      { label: 'Blog', to: '/blog' },\n      { label: 'History', to: '/history' },\n  ];\n\n  export default function Example() {\n    return (\n      <>\n        <Breadcrumbs items={items} LinkComponent={Link} />\n      </>\n    )\n  }"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "items": {
                "name": "items",
                "type": "BreadcrumbItem[]",
                "required": true
              },
              "LinkComponent": {
                "name": "LinkComponent",
                "type": "React.ElementType",
                "required": false
              }
            }
          }
        }
      ]
    },
    {
      "id": "Button",
      "path": "src/modules/Button",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Button",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Button permite a los usuarios realizar acciones y tomar decisiones con un solo toque.",
            "jsdoc": "Button - Componente de botón versátil y configurable\nComponente wrapper que proporciona una API simplificada sobre InnerButton.\nSoporta múltiples temas, colores, tamaños, iconos, badges y tooltips.",
            "readme": "# Button Component\n\nComponente de botón versátil y configurable con múltiples variantes, tamaños, colores y funcionalidades adicionales.\n\n## Estructura\n\n```\nButton/\n├── components/\n│   └── organisms/\n│       └── Button.tsx      # Componente principal\n├── stories/\n│   └── Button.stories.tsx # Storybook stories\n└── index.tsx              # Export del módulo\n```\n\n## Uso Básico\n\n```tsx\nimport { Button } from '@imj_media/ui';\n\n// Botón simple\n<Button onClick={() => console.log('clicked')}>\n  Hacer clic\n</Button>\n\n// Botón con icono\n<Button icon=\"ImageOutlined\" onClick={handleClick}>\n  Subir imagen\n</Button>\n\n// Botón deshabilitado\n<Button disabled onClick={handleClick}>\n  No disponible\n</Button>\n```\n\n## Props Principales\n\n### Tamaño y Estilo\n\n- `size?: 'xs' | 'sm' | 'md' | 'lg'` - Tamaño del botón (default: `'sm'`)\n- `theme?: 'solid' | 'outlined' | 'text' | 'ghost'` - Tema del botón (default: `'solid'`)\n- `color?: ButtonColors` - Color del botón (default: `'primary'`)\n- `fullWidth?: boolean` - Si es true, ocupa todo el ancho disponible (default: `false`)\n- `rounded?: boolean` - Si es true, bordes redondeados (default: `false`)\n\n### Contenido\n\n- `children?: React.ReactNode` - Contenido del botón\n- `icon?: IconType | AnyIconDefinition` - Icono principal del botón\n- `leftSlot?: React.ReactNode` - Slot izquierdo personalizado\n- `rightSlot?: React.ReactNode` - Slot derecho personalizado\n\n### Funcionalidad\n\n- `onClick?: (e: React.MouseEvent) => void` - Callback al hacer clic\n- `disabled?: boolean` - Si es true, el botón está deshabilitado\n- `clickable?: boolean` - Si es true, el botón es clickeable (default: `true`)\n- `link?: string` - URL para convertir el botón en enlace\n- `target?: '_self' | '_blank' | '_parent' | '_top'` - Target para enlaces (default: `'_self'`)\n\n### Badge\n\n- `badgeColor?: BadgeColor` - Color del badge\n- `badgeLabel?: string` - Texto del badge\n- `badgeTheme?: BadgeTheme` - Tema del badge\n- `badgeSize?: BadgeSize` - Tamaño del badge\n- `badgeIcon?: IconType",
            "confidence": "high"
          },
          "examples": [
            "import { Button } from '@imj_media/ui';\n\n  export default function Example() {\n    return (\n      <>\n        <Button color=\"primary\">Blue</Button>\n        <Button color=\"secondary\">Red</Button>\n        <Button color=\"tertiary\">Green</Button>\n        <Button color=\"destructive\">Orange</Button>\n        <Button color=\"primary\">White</Button>\n      </>\n    )\n  }",
            "import { Button } from '@imj_media/ui';\n\n  export default function Example() {\n    return (\n      <>\n        <Button color=\"primary\">Blue</Button>\n        <Button color=\"secondary\">Red</Button>\n        <Button color=\"tertiary\">Green</Button>\n        <Button color=\"destructive\">Orange</Button>\n        <Button color=\"primary\">White</Button>\n      </>\n    )\n  }",
            "import { Button } from '@imj_media/ui';\nimport { faUser, faImage } from '@fortawesome/pro-solid-svg-icons';\n\nexport default function FullWidthSlotsExample() {\n  return (\n    <div className=\"ui-flex ui-max-w-2xl ui-flex-col ui-gap-3\">\n      <Button\n        color=\"primary\"\n        size=\"lg\"\n        fullWidth\n        slotLayout={{ var: 'spread', textAlign: 'center' }}\n        leftSlot={faUser}\n        rightSlot={faImage}\n      >\n        Continuar\n      </Button>\n    </div>\n  );\n}",
            "import { Button } from '@imj_media/ui';\n\n  export default function Example() {\n    return (\n      <>\n        <Button color=\"primary\" tooltip=\"Tooltip\">Blue</Button>\n        <Button color=\"secondary\" tooltip=\"Tooltip\">Red</Button>\n        <Button color=\"tertiary\" tooltip=\"Tooltip\">Green</Button>\n        <Button color=\"destructive\" tooltip=\"Tooltip\">Orange</Button>\n      </>\n    )\n  }",
            "import { Button } from '@imj_media/ui';\n\n  export default function Example() {\n    return (\n      <>\n        <Button color=\"primary\" tooltip=\"Tooltip\">Blue</Button>\n        <Button color=\"secondary\" tooltip=\"Tooltip\">Red</Button>\n        <Button color=\"tertiary\" tooltip=\"Tooltip\">Green</Button>\n        <Button color=\"destructive\" tooltip=\"Tooltip\">Orange</Button>\n      </>\n    )\n  }"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "variant": {
                "name": "variant",
                "type": "'button' | 'text' | 'outlined'",
                "required": false
              }
            }
          }
        }
      ],
      "standaloneSnippet": "import React from 'react';\n\nconst colorMap = {\n  primary: {\n    solid: { bg: 'rgb(54, 89, 194)', text: 'rgb(255, 255, 255)', hover: 'rgb(51, 82, 176)', pressed: 'rgb(46, 74, 161)', border: 'transparent' },\n    outlined: { bg: 'transparent', text: 'rgb(54, 89, 194)', hover: 'rgb(51, 82, 176)', pressed: 'rgb(46, 74, 161)', border: 'rgb(54, 89, 194)' },\n    text: { bg: 'transparent', text: 'rgb(54, 89, 194)', hover: 'rgb(51, 82, 176)', pressed: 'rgb(46, 74, 161)', border: 'transparent' },\n    ghost: { bg: 'transparent', text: 'rgb(54, 89, 194)', hover: 'rgba(0,0,0,0.04)', pressed: 'rgba(0,0,0,0.08)', border: 'transparent' },\n  },\n  secondary: {\n    solid: { bg: 'rgb(240, 69, 69)', text: 'rgb(255, 255, 255)', hover: 'rgb(212, 61, 61)', pressed: 'rgb(184, 51, 51)', border: 'transparent' },\n    outlined: { bg: 'transparent', text: 'rgb(240, 69, 69)', hover: 'rgb(212, 61, 61)', pressed: 'rgb(184, 51, 51)', border: 'rgb(240, 69, 69)' },\n    text: { bg: 'transparent', text: 'rgb(240, 69, 69)', hover: 'rgb(212, 61, 61)', pressed: 'rgb(184, 51, 51)', border: 'transparent' },\n    ghost: { bg: 'transparent', text: 'rgb(240, 69, 69)', hover: 'rgba(0,0,0,0.04)', pressed: 'rgba(0,0,0,0.08)', border: 'transparent' },\n  },\n  tertiary: {\n    solid: { bg: 'rgb(33, 196, 94)', text: 'rgb(255, 255, 255)', hover: 'rgb(31, 181, 87)', pressed: 'rgb(28, 163, 79)', border: 'transparent' },\n    outlined: { bg: 'transparent', text: 'rgb(33, 196, 94)', hover: 'rgb(31, 181, 87)', pressed: 'rgb(28, 163, 79)', border: 'rgb(33, 196, 94)' },\n    text: { bg: 'transparent', text: 'rgb(33, 196, 94)', hover: 'rgb(31, 181, 87)', pressed: 'rgb(28, 163, 79)', border: 'transparent' },\n    ghost: { bg: 'transparent', text: 'rgb(33, 196, 94)', hover: 'rgba(0,0,0,0.04)', pressed: 'rgba(0,0,0,0.08)', border: 'transparent' },\n  },\n  destructive: {\n    solid: { bg: 'rgb(235, 179, 8)', text: 'rgb(255, 255, 255)', hover: 'rgb(209, 158, 8)', pressed: 'rgb(181, 140, 5)', border: 'transparent' },\n    outlined: { bg: 'transparent', text: 'rgb(235, 179, 8)', hover: 'rgb(209, 158, 8)', pressed: 'rgb(181, 140, 5)', border: 'rgb(235, 179, 8)' },\n    text: { bg: 'transparent', text: 'rgb(235, 179, 8)', hover: 'rgb(209, 158, 8)', pressed: 'rgb(181, 140, 5)', border: 'transparent' },\n    ghost: { bg: 'transparent', text: 'rgb(235, 179, 8)', hover: 'rgba(0,0,0,0.04)', pressed: 'rgba(0,0,0,0.08)', border: 'transparent' },\n  },\n};\n\nconst sizeMap = {\n  xs: { padding: '4px 2px', fontSize: '12px' },\n  sm: { padding: '2px 12px', fontSize: '14px' },\n  md: { padding: '10px 4px', fontSize: '16px' },\n  lg: { padding: '12px 6px', fontSize: '18px' },\n};\n\nexport function Button({\n  children,\n  color = 'primary',\n  size = 'sm',\n  theme = 'solid',\n  disabled = false,\n  fullWidth = false,\n  rounded = false,\n  onClick,\n}: {\n  children: React.ReactNode;\n  color?: keyof typeof colorMap;\n  size?: keyof typeof sizeMap;\n  theme?: 'solid' | 'outlined' | 'text' | 'ghost';\n  disabled?: boolean;\n  fullWidth?: boolean;\n  rounded?: boolean;\n  onClick?: () => void;\n}) {\n  const c = colorMap[color][theme];\n  const s = sizeMap[size];\n  const [hovered, setHovered] = React.useState(false);\n  const [pressed, setPressed] = React.useState(false);\n\n  const bgColor = disabled ? c.bg : pressed ? (theme === 'solid' ? c.pressed : 'rgba(0,0,0,0.06)') : hovered ? (theme === 'solid' ? c.hover : 'rgba(0,0,0,0.03)') : c.bg;\n  const textColor = disabled ? c.text : hovered && theme !== 'solid' ? c.hover : c.text;\n\n  return (\n    <button\n      onClick={disabled ? undefined : onClick}\n      disabled={disabled}\n      onMouseEnter={() => setHovered(true)}\n      onMouseLeave={() => { setHovered(false); setPressed(false); }}\n      onMouseDown={() => setPressed(true)}\n      onMouseUp={() => setPressed(false)}\n      style={{\n        display: 'inline-flex',\n        alignItems: 'center',\n        justifyContent: 'center',\n        padding: s.padding,\n        fontSize: s.fontSize,\n        fontWeight: '600',\n        fontFamily: 'inherit',\n        lineHeight: '1.25',\n        borderRadius: rounded ? '9999px' : '8px',\n        border: theme === 'outlined' ? `1px solid ${c.border}` : 'none',\n        backgroundColor: bgColor,\n        color: textColor,\n        cursor: disabled ? 'not-allowed' : 'pointer',\n        opacity: disabled ? 0.5 : 1,\n        width: fullWidth ? '100%' : 'auto',\n        transition: 'background-color 150ms, color 150ms',\n        boxSizing: 'border-box',\n      }}\n    >\n      {children}\n    </button>\n  );\n}\n"
    },
    {
      "id": "ButtonGroup",
      "path": "src/modules/ButtonGroup",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "ButtonGroup",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente ButtonGroup permite agrupar múltiples botones con bordes redondeados en los extremos y botones unidos en el centro.",
            "confidence": "medium"
          },
          "examples": [
            "import { ButtonGroup } from '@/modules/ButtonGroup';\n  import { Button } from '@/modules/Button';\n\n  export default function Example() {\n    return (\n      <>\n        <ButtonGroup>\n          <Button tooltip=\"Zoom out\" icon=\"Minus2Outlined\" />\n          <Button tooltip=\"100%\" clickable={false}>100%</Button>\n          <Button tooltip=\"Zoom in\" icon=\"Plus1Outlined\" />\n        </ButtonGroup>\n        <ButtonGroup>\n          <Button color=\"primary\">Primero</Button>\n          <Button color=\"primary\">Segundo</Button>\n          <Button color=\"primary\">Tercero</Button>\n        </ButtonGroup>\n        \n        <ButtonGroup>\n          <Button variant=\"outlined\" color=\"destructive\">Cancelar</Button>\n          <Button variant=\"outlined\" color=\"destructive\">Guardar</Button>\n        </ButtonGroup>\n        \n        <ButtonGroup>\n          <Button variant=\"outlined\" color=\"secondary\">Aceptar</Button>\n          <Button variant=\"outlined\" color=\"secondary\">Rechazar</Button>\n          <Button variant=\"outlined\" color=\"secondary\">Pendiente</Button>\n        </ButtonGroup>\n      </>\n    )\n  }",
            "<ButtonGroup>\n    <Button size=\"sm\" color=\"primary\">Pequeño</Button>\n    <Button size=\"sm\" color=\"primary\">Pequeño</Button>\n    <Button size=\"sm\" color=\"primary\">Pequeño</Button>\n  </ButtonGroup>\n  \n  <ButtonGroup>\n    <Button size=\"lg\" color=\"secondary\">Grande</Button>\n    <Button size=\"lg\" color=\"secondary\">Grande</Button>\n    <Button size=\"lg\" color=\"secondary\">Grande</Button>\n  </ButtonGroup>",
            "<ButtonGroup>\n    <Button variant=\"outlined\" color=\"destructive\">Outlined</Button>\n    <Button variant=\"outlined\" color=\"destructive\">Outlined</Button>\n    <Button variant=\"outlined\" color=\"destructive\">Outlined</Button>\n  </ButtonGroup>\n  \n  <ButtonGroup>\n    <Button variant=\"soft\" color=\"secondary\">Soft</Button>\n    <Button variant=\"soft\" color=\"secondary\">Soft</Button>\n    <Button variant=\"soft\" color=\"secondary\">Soft</Button>\n  </ButtonGroup>",
            "<ButtonGroup>\n    <Button color=\"primary\" leftSlot=\"TaskOutlined\">Tareas</Button>\n    <Button color=\"primary\" leftSlot=\"CalendarOutlined\">Calendario</Button>\n    <Button color=\"primary\" leftSlot=\"UserOutlined\">Usuario</Button>\n  </ButtonGroup>\n  \n  <ButtonGroup>\n    <Button variant=\"outlined\" color=\"destructive\" leftSlot=\"DeleteOutlined\">Eliminar</Button>\n    <Button variant=\"outlined\" color=\"destructive\" leftSlot=\"EditOutlined\">Editar</Button>\n  </ButtonGroup>",
            "<ButtonGroup className=\"ui-shadow-04 ui-p-2 ui-bg-gray-50 ui-rounded-lg\">\n    <Button color=\"primary\">Con Sombra</Button>\n    <Button color=\"primary\">Con Sombra</Button>\n    <Button color=\"primary\">Con Sombra</Button>\n  </ButtonGroup>\n  \n  <ButtonGroup className=\"ui-border-2 ui-border-dashed ui-border-blue-300 ui-p-3 ui-rounded-xl\">\n    <Button variant=\"outlined\" color=\"primary\">Borde Punteado</Button>\n    <Button variant=\"outlined\" color=\"primary\">Borde Punteado</Button>\n  </ButtonGroup>"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "children": {
                "name": "children",
                "type": "React.ReactNode",
                "required": true
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "theme": {
                "name": "theme",
                "type": "ButtonTheme",
                "required": false
              },
              "color": {
                "name": "color",
                "type": "ButtonColors",
                "required": false
              },
              "size": {
                "name": "size",
                "type": "'xxs' | 'xs' | 'sm' | 'md' | 'lg'",
                "required": false
              }
            }
          }
        }
      ]
    },
    {
      "id": "Cards",
      "path": "src/modules/Cards",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Cards",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "confidence": "low"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "full": {
                "name": "full",
                "type": "boolean",
                "required": false
              },
              "fullWidth": {
                "name": "fullWidth",
                "type": "boolean",
                "required": false
              },
              "fullHeight": {
                "name": "fullHeight",
                "type": "boolean",
                "required": false
              },
              "rounded": {
                "name": "rounded",
                "type": "boolean",
                "required": false
              },
              "padding": {
                "name": "padding",
                "type": "boolean",
                "required": false
              },
              "gap": {
                "name": "gap",
                "type": "boolean",
                "required": false
              },
              "bordered": {
                "name": "bordered",
                "type": "boolean",
                "required": false,
                "description": "Si es `false`, no se aplican borde por defecto ni `hover:ui-border-brand` en tarjetas clicables.\n    Útil en contenedores flush (p. ej. `Drawer` con `surface=\"brand\"`)."
              },
              "active": {
                "name": "active",
                "type": "boolean",
                "required": false
              },
              "onClick": {
                "name": "onClick",
                "type": "() => void",
                "required": false
              }
            }
          }
        }
      ]
    },
    {
      "id": "CardsGenericas",
      "path": "src/modules/CardsGenericas",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "CardsGenericas",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "jsdoc": "Chevron Font Awesome (pro-regular), centrado por el propio glifo y el flex del botón. */\nconst ChevronFa = styled(FontAwesomeIcon)<{ $open: boolean }>`\n  width: 22px;\n  height: 22px;\n  flex-shrink: 0;\n  display: block;\n  margin: 0;\n  padding: 0;\n  color: #fff;\n  transform-origin: 50% 50%;\n  transition:\n    transform 0.5s ease-in-out,\n    color 0.3s ease;\n  transform: rotate(${({ $open }) => ($open ? '180deg' : '0deg')});\n\n  ${({ $open }) => css`\n    @media (max-aspect-ratio: 7/10) {\n      transform: rotate(${$open ? '270deg' : '90deg'});\n    }\n  `}\n`;\n\nconst ToggleButton = styled.button<{ $detail: string; $detailColor: string; $bg: string }>`\n  position: absolute;\n  right: -25px;\n  width: 50px;\n  height: 50px;\n  background: ${({ $detail }) => $detail};\n  top: 50%;\n  transform: translateY(-",
            "confidence": "medium"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "initialView": {
                "name": "initialView",
                "type": "ReactNode",
                "required": false,
                "description": "Contenido de la cara visible (imagen o vista previa)."
              },
              "menus": {
                "name": "menus",
                "type": "CardsGenericasMenuItem[]",
                "required": false,
                "description": "Pestañas opcionales en la zona expandida."
              },
              "activeIndex": {
                "name": "activeIndex",
                "type": "number",
                "required": false,
                "description": "Índice de pestaña activa."
              },
              "setActiveIndex": {
                "name": "setActiveIndex",
                "type": "(index: number) => void",
                "required": false,
                "description": "Callback al cambiar de pestaña."
              },
              "children": {
                "name": "children",
                "type": "ReactNode",
                "required": false,
                "description": "Contenido del panel expandido."
              },
              "openCard": {
                "name": "openCard",
                "type": "boolean",
                "required": false,
                "description": "Estado abierto/cerrado (controlado)."
              },
              "setOpenCard": {
                "name": "setOpenCard",
                "type": "(open: boolean) => void",
                "required": false,
                "description": "Alterna apertura (controlado)."
              },
              "colors": {
                "name": "colors",
                "type": "Partial<CardsGenericasColors>",
                "required": false,
                "description": "Sustituye los colores por defecto del `colorMode` activo."
              },
              "colorMode": {
                "name": "colorMode",
                "type": "'light' | 'dark'",
                "required": false,
                "description": "Tema de la tarjeta: paleta por defecto (`COLORS`) en claro u oscuro."
              }
            }
          }
        }
      ]
    },
    {
      "id": "CardsWithAside",
      "path": "src/modules/CardsWithAside",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "CardsWithAside",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Componente CardsWithAside que muestra contenido inicial con un panel lateral deslizable que contiene tabs con iconos. Permite mostrar contenido adicional al hacer click en los iconos del panel lateral.",
            "confidence": "medium"
          },
          "examples": [
            "<CardsWithAside activeCard={activeCard}>\n  <CardsWithAside.TabContent\n    id=\"user\"\n    icon={faUser}\n    tooltip=\"Ver información del usuario\"  // Tooltip descriptivo\n  >\n    <UserContent />\n  </CardsWithAside.TabContent>\n  \n  <CardsWithAside.TabContent\n    id=\"settings\"\n    icon={faCog}\n    tooltip=\"Configuración general\"  // Tooltip descriptivo\n  >\n    <SettingsContent />\n  </CardsWithAside.TabContent>\n  \n  <CardsWithAside.TabContent\n    id=\"notifications\"\n    icon={faBell}\n    tooltip=\"Centro de notificaciones\"  // Tooltip descriptivo\n  >\n    <NotificationsContent />\n  </CardsWithAside.TabContent>\n</CardsWithAside>",
            "// Posición global de tooltips (afecta a todos los tabs)\n<CardsWithAside tooltipPosition=\"right\">  // default\n<CardsWithAside tooltipPosition=\"left\">\n<CardsWithAside tooltipPosition=\"top\">\n<CardsWithAside tooltipPosition=\"bottom\">",
            "// La posición global es \"right\" (default), pero cada tab puede sobrescribirla\n<CardsWithAside tooltipPosition=\"right\">\n  <CardsWithAside.TabContent\n    id=\"user\"\n    icon={faUser}\n    tooltip=\"Usuario\"\n    // Sin tooltipPosition, usa la global \"right\"\n  >\n    ...\n  </CardsWithAside.TabContent>\n  \n  <CardsWithAside.TabContent\n    id=\"settings\"\n    icon={faCog}\n    tooltip=\"Configuración\"\n    tooltipPosition=\"top\"  // Sobrescribe la global\n  >\n    ...\n  </CardsWithAside.TabContent>\n  \n  <CardsWithAside.TabContent\n    id=\"notifications\"\n    icon={faBell}\n    tooltip=\"Notificaciones\"\n    tooltipPosition=\"bottom\"  // Sobrescribe la global\n  >\n    ...\n  </CardsWithAside.TabContent>\n</CardsWithAside>",
            "// Mostrar tooltips (default)\n<CardsWithAside showTooltips={true}>\n  ...\n</CardsWithAside>\n\n// Ocultar tooltips\n<CardsWithAside showTooltips={false}>\n  ...\n</CardsWithAside>",
            "<CardsWithAside activeCard={activeCard}>\n  <CardsWithAside.TabContent\n    id=\"user\"\n    icon={faUser}\n    tooltip=\"Ver información del usuario\"  // Tooltip descriptivo\n  >\n    <UserContent />\n  </CardsWithAside.TabContent>\n  \n  <CardsWithAside.TabContent\n    id=\"settings\"\n    icon={faCog}\n    tooltip=\"Configuración general\"  // Tooltip descriptivo\n  >\n    <SettingsContent />\n  </CardsWithAside.TabContent>\n  \n  <CardsWithAside.TabContent\n    id=\"notifications\"\n    icon={faBell}\n    tooltip=\"Centro de notificaciones\"  // Tooltip descriptivo\n  >\n    <NotificationsContent />\n  </CardsWithAside.TabContent>\n</CardsWithAside>"
          ],
          "props": {
            "groups": {
              "tabContent": {
                "props": {
                  "children": {
                    "name": "children",
                    "type": "ReactNode",
                    "required": false,
                    "description": "Contenido del tab"
                  },
                  "id": {
                    "name": "id",
                    "type": "string",
                    "required": true,
                    "description": "ID único del tab"
                  },
                  "icon": {
                    "name": "icon",
                    "type": "string | AnyIconDefinition",
                    "required": false,
                    "description": "Icono del tab (puede ser string o icono FontAwesome)"
                  },
                  "tooltip": {
                    "name": "tooltip",
                    "type": "string",
                    "required": false,
                    "description": "Tooltip que se muestra al hacer hover sobre el botón del tab"
                  },
                  "tooltipPosition": {
                    "name": "tooltipPosition",
                    "type": "TooltipPosition",
                    "required": false,
                    "description": "Posición del tooltip para este tab específico (sobrescribe la posición global)"
                  },
                  "Component": {
                    "name": "Component",
                    "type": "ReactNode",
                    "required": false,
                    "description": "Componente personalizado a renderizar en lugar del contenido del children"
                  },
                  "popup": {
                    "name": "popup",
                    "type": "ReactNode",
                    "required": false,
                    "description": "Contenido del popup. Si se proporciona, el botón del tab abre un popup con este contenido en lugar de mostrar el tab"
                  },
                  "className": {
                    "name": "className",
                    "type": "string",
                    "required": false,
                    "description": "Clases CSS adicionales"
                  },
                  "style": {
                    "name": "style",
                    "type": "React.CSSProperties",
                    "required": false,
                    "description": "Estilos inline adicionales"
                  },
                  "key": {
                    "name": "key",
                    "type": "string]: unknown",
                    "required": true
                  }
                }
              }
            },
            "deprecatedRoot": [],
            "flat": {
              "children": {
                "name": "children",
                "type": "ReactElement<CardsWithAsideTabContentProps>[]",
                "required": true,
                "description": "Array de elementos TabContent que representan los tabs disponibles"
              },
              "activeCard": {
                "name": "activeCard",
                "type": "string | null",
                "required": false,
                "description": "ID del tab activo actualmente. Si es null, no hay tab activo"
              },
              "InitialContent": {
                "name": "InitialContent",
                "type": "ReactElement<",
                "required": false,
                "description": "Contenido inicial que se muestra cuando no hay tab activo"
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clases CSS adicionales para el contenedor principal"
              },
              "moreOptions": {
                "name": "moreOptions",
                "type": "boolean",
                "required": false,
                "description": "Si es true, muestra un botón de opciones adicionales en la parte superior"
              },
              "onClickMoreOptions": {
                "name": "onClickMoreOptions",
                "type": "(e: React.MouseEvent<HTMLButtonElement>) => void",
                "required": false,
                "description": "Handler que se ejecuta al hacer click en el botón de opciones adicionales"
              },
              "popup": {
                "name": "popup",
                "type": "ReactNode",
                "required": false,
                "description": "Contenido del popup. Si se proporciona, el botón de opciones adicionales abre un popup con este contenido en lugar de ejecutar onClickMoreOptions"
              },
              "width": {
                "name": "width",
                "type": "string | number",
                "required": false,
                "description": "Ancho del componente (por defecto: 377px)"
              },
              "height": {
                "name": "height",
                "type": "string | number",
                "required": false,
                "description": "Alto del componente (por defecto: 218px)"
              },
              "showTooltips": {
                "name": "showTooltips",
                "type": "boolean",
                "required": false,
                "description": "Si es true, muestra los tooltips en los botones de tabs. Por defecto: true"
              },
              "tooltipPosition": {
                "name": "tooltipPosition",
                "type": "TooltipPosition",
                "required": false,
                "description": "Posición global de los tooltips para todos los tabs (puede ser sobrescrita por cada tab). Por defecto: 'right'"
              }
            }
          }
        },
        {
          "name": "TabContent",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Componente CardsWithAside que muestra contenido inicial con un panel lateral deslizable que contiene tabs con iconos. Permite mostrar contenido adicional al hacer click en los iconos del panel lateral.",
            "jsdoc": "Componente TabContent para usar dentro de CardsWithAside",
            "confidence": "high"
          },
          "examples": [
            "<CardsWithAside activeCard={activeCard}>\n  <CardsWithAside.TabContent\n    id=\"user\"\n    icon={faUser}\n    tooltip=\"Ver información del usuario\"  // Tooltip descriptivo\n  >\n    <UserContent />\n  </CardsWithAside.TabContent>\n  \n  <CardsWithAside.TabContent\n    id=\"settings\"\n    icon={faCog}\n    tooltip=\"Configuración general\"  // Tooltip descriptivo\n  >\n    <SettingsContent />\n  </CardsWithAside.TabContent>\n  \n  <CardsWithAside.TabContent\n    id=\"notifications\"\n    icon={faBell}\n    tooltip=\"Centro de notificaciones\"  // Tooltip descriptivo\n  >\n    <NotificationsContent />\n  </CardsWithAside.TabContent>\n</CardsWithAside>",
            "// Posición global de tooltips (afecta a todos los tabs)\n<CardsWithAside tooltipPosition=\"right\">  // default\n<CardsWithAside tooltipPosition=\"left\">\n<CardsWithAside tooltipPosition=\"top\">\n<CardsWithAside tooltipPosition=\"bottom\">",
            "// La posición global es \"right\" (default), pero cada tab puede sobrescribirla\n<CardsWithAside tooltipPosition=\"right\">\n  <CardsWithAside.TabContent\n    id=\"user\"\n    icon={faUser}\n    tooltip=\"Usuario\"\n    // Sin tooltipPosition, usa la global \"right\"\n  >\n    ...\n  </CardsWithAside.TabContent>\n  \n  <CardsWithAside.TabContent\n    id=\"settings\"\n    icon={faCog}\n    tooltip=\"Configuración\"\n    tooltipPosition=\"top\"  // Sobrescribe la global\n  >\n    ...\n  </CardsWithAside.TabContent>\n  \n  <CardsWithAside.TabContent\n    id=\"notifications\"\n    icon={faBell}\n    tooltip=\"Notificaciones\"\n    tooltipPosition=\"bottom\"  // Sobrescribe la global\n  >\n    ...\n  </CardsWithAside.TabContent>\n</CardsWithAside>",
            "// Mostrar tooltips (default)\n<CardsWithAside showTooltips={true}>\n  ...\n</CardsWithAside>\n\n// Ocultar tooltips\n<CardsWithAside showTooltips={false}>\n  ...\n</CardsWithAside>",
            "<CardsWithAside activeCard={activeCard}>\n  <CardsWithAside.TabContent\n    id=\"user\"\n    icon={faUser}\n    tooltip=\"Ver información del usuario\"  // Tooltip descriptivo\n  >\n    <UserContent />\n  </CardsWithAside.TabContent>\n  \n  <CardsWithAside.TabContent\n    id=\"settings\"\n    icon={faCog}\n    tooltip=\"Configuración general\"  // Tooltip descriptivo\n  >\n    <SettingsContent />\n  </CardsWithAside.TabContent>\n  \n  <CardsWithAside.TabContent\n    id=\"notifications\"\n    icon={faBell}\n    tooltip=\"Centro de notificaciones\"  // Tooltip descriptivo\n  >\n    <NotificationsContent />\n  </CardsWithAside.TabContent>\n</CardsWithAside>"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "children": {
                "name": "children",
                "type": "ReactElement<CardsWithAsideTabContentProps>[]",
                "required": true,
                "description": "Array de elementos TabContent que representan los tabs disponibles"
              },
              "activeCard": {
                "name": "activeCard",
                "type": "string | null",
                "required": false,
                "description": "ID del tab activo actualmente. Si es null, no hay tab activo"
              },
              "InitialContent": {
                "name": "InitialContent",
                "type": "ReactElement<",
                "required": false,
                "description": "Contenido inicial que se muestra cuando no hay tab activo"
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clases CSS adicionales para el contenedor principal"
              },
              "moreOptions": {
                "name": "moreOptions",
                "type": "boolean",
                "required": false,
                "description": "Si es true, muestra un botón de opciones adicionales en la parte superior"
              },
              "onClickMoreOptions": {
                "name": "onClickMoreOptions",
                "type": "(e: React.MouseEvent<HTMLButtonElement>) => void",
                "required": false,
                "description": "Handler que se ejecuta al hacer click en el botón de opciones adicionales"
              },
              "popup": {
                "name": "popup",
                "type": "ReactNode",
                "required": false,
                "description": "Contenido del popup. Si se proporciona, el botón de opciones adicionales abre un popup con este contenido en lugar de ejecutar onClickMoreOptions"
              },
              "width": {
                "name": "width",
                "type": "string | number",
                "required": false,
                "description": "Ancho del componente (por defecto: 377px)"
              },
              "height": {
                "name": "height",
                "type": "string | number",
                "required": false,
                "description": "Alto del componente (por defecto: 218px)"
              },
              "showTooltips": {
                "name": "showTooltips",
                "type": "boolean",
                "required": false,
                "description": "Si es true, muestra los tooltips en los botones de tabs. Por defecto: true"
              },
              "tooltipPosition": {
                "name": "tooltipPosition",
                "type": "TooltipPosition",
                "required": false,
                "description": "Posición global de los tooltips para todos los tabs (puede ser sobrescrita por cada tab). Por defecto: 'right'"
              }
            }
          }
        }
      ]
    },
    {
      "id": "CatalogCard",
      "path": "src/modules/CatalogCard",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "CatalogCard",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "jsdoc": "**CatalogCard** — tarjeta de catálogo / proveedor / usuario (API **cerrada** por props) alineada al archivo Figma\n[Cards](https://www.figma.com/design/3w0SWvV7C5tDKUybsOcgA4/Cards).\nImplementación partida en {@link CatalogCatalogCard}, {@link CatalogSupplierCard} y paneles de menú\n(`catalogCardMenuPanels`) para mantener archivos acotados.\nNo expone slots `media` / `details` / `cta` con ReactNode arbitrario: el organismo compone `Picture`,\n`Icon`, `Tooltip`, `Button`, `Badge`, `Picture`, `Popup` y `List` según props. El menú **…** es lista de acciones\n({@link CatalogCardMenuItem}); los checkboxes de `tags` van en el panel del **CTA principal** (`onPrimaryTagsSelectionChange`).\nFamilia **`user`**: mismo layout que proveedor (~270px), **sin** rating; opcional **`profile.avatarImageSrc`** (o p",
            "confidence": "medium"
          },
          "examples": [],
          "props": {
            "groups": {
              "catalogMedia": {
                "props": {
                  "imageSrc": {
                    "name": "imageSrc",
                    "type": "string",
                    "required": false
                  },
                  "imageAlt": {
                    "name": "imageAlt",
                    "type": "string",
                    "required": false
                  },
                  "showExclusiveBadge": {
                    "name": "showExclusiveBadge",
                    "type": "boolean",
                    "required": false
                  },
                  "indicators": {
                    "name": "indicators",
                    "type": "CatalogCardMediaIndicator[]",
                    "required": false
                  },
                  "hideImage": {
                    "name": "hideImage",
                    "type": "boolean",
                    "required": false,
                    "description": "Si es `true`, no se renderiza el bloque de imagen (miniatura / banda media). Útil para listados solo texto en cualquier `layout`.\n    Los indicadores y el badge exclusivo asociados a la zona media no se muestran (no hay contenedor).\n    Sin `optionsMenu.hidden` / `hideOptionsMenu` explícitos, el botón ⋯ del pie queda oculto por defecto; pasa `hidden: false` en `optionsMenu` para mostrarlo."
                  },
                  "showAvailabilityIndicators": {
                    "name": "showAvailabilityIndicators",
                    "type": "boolean",
                    "required": false
                  }
                }
              },
              "catalogContent": {
                "props": {
                  "categoryLabel": {
                    "name": "categoryLabel",
                    "type": "string",
                    "required": false
                  },
                  "ratingValue": {
                    "name": "ratingValue",
                    "type": "string",
                    "required": false
                  },
                  "ratingTooltip": {
                    "name": "ratingTooltip",
                    "type": "string",
                    "required": false,
                    "description": "Texto del tooltip del bloque calificación (estrella + valor).\n    Omite la prop para usar el texto por defecto del diseño.\n    Pasa cadena vacía para desactivar el tooltip."
                  },
                  "title": {
                    "name": "title",
                    "type": "string",
                    "required": true
                  },
                  "locationLabel": {
                    "name": "locationLabel",
                    "type": "string",
                    "required": false
                  },
                  "locationHref": {
                    "name": "locationHref",
                    "type": "string",
                    "required": false
                  }
                }
              },
              "catalogTagRow": {
                "props": {
                  "tags": {
                    "name": "tags",
                    "type": "(string | CatalogCardTag)[]",
                    "required": false
                  },
                  "primarySelectedTags": {
                    "name": "primarySelectedTags",
                    "type": "string[]",
                    "required": false
                  },
                  "defaultPrimarySelectedTags": {
                    "name": "defaultPrimarySelectedTags",
                    "type": "string[]",
                    "required": false
                  },
                  "onPrimaryTagsSelectionChange": {
                    "name": "onPrimaryTagsSelectionChange",
                    "type": "(",
                    "required": false
                  },
                  "selectedTags": {
                    "name": "selectedTags",
                    "type": "string[],",
                    "required": true
                  },
                  "context": {
                    "name": "context",
                    "type": "CatalogCardInteractionContext",
                    "required": false
                  },
                  "primaryTagsSelectAllLabel": {
                    "name": "primaryTagsSelectAllLabel",
                    "type": "string",
                    "required": false
                  },
                  "primaryTagsShowSelectAll": {
                    "name": "primaryTagsShowSelectAll",
                    "type": "boolean",
                    "required": false
                  }
                }
              },
              "catalogPrimaryCta": {
                "props": {
                  "hidden": {
                    "name": "hidden",
                    "type": "boolean",
                    "required": false,
                    "description": "Si es `true`, no se renderiza el CTA principal del pie (ni el ícono horizontal en layouts que lo usan).\n    Útil cuando la acción principal es solo el clic en la tarjeta (`onClick`) o un enlace en el cuerpo (p. ej. lista indoor padre en wizard).\n    El menú ⋯ sigue las reglas de `optionsMenu.hidden` / `media.hideImage`.\n    Equivalente explícito en API agrupada: {"
                  },
                  "primaryLinkHref": {
                    "name": "primaryLinkHref",
                    "type": "string",
                    "required": false
                  },
                  "primaryLinkTo": {
                    "name": "primaryLinkTo",
                    "type": "string",
                    "required": false
                  },
                  "primaryLinkLabel": {
                    "name": "primaryLinkLabel",
                    "type": "string",
                    "required": false
                  },
                  "primaryLinkTarget": {
                    "name": "primaryLinkTarget",
                    "type": "'_self' | '_blank'",
                    "required": false
                  },
                  "primaryVariant": {
                    "name": "primaryVariant",
                    "type": "CatalogCardPrimaryVariant",
                    "required": false
                  },
                  "primaryLabel": {
                    "name": "primaryLabel",
                    "type": "string",
                    "required": false
                  },
                  "primaryIcon": {
                    "name": "primaryIcon",
                    "type": "AnyIconDefinition",
                    "required": false,
                    "description": "Icono en el slot izquierdo del CTA (`Button` / `Popup`).\n    Si se omite: enlace «Ver más» usa el icono por defecto del diseño; el resto usa el icono asociado a {"
                  },
                  "onPrimaryClick": {
                    "name": "onPrimaryClick",
                    "type": "(context?: CatalogCardInteractionContext) => void",
                    "required": false
                  }
                }
              },
              "catalogOptionsMenu": {
                "props": {
                  "hidden": {
                    "name": "hidden",
                    "type": "boolean",
                    "required": false,
                    "description": "Si es `true`, no se renderiza el control ⋯ del pie (solo el CTA principal a ancho completo).\n    Útil en listados de solo lectura (p. ej. mapa / wizard) sin editar.\n    Si se omite y la tarjeta usa `media.hideImage`, el valor efectivo por defecto es `true` (sin ⋯); con imagen, por defecto se muestra el ⋯ cuando hay ítems o `onOptionsClick`."
                  },
                  "optionsPressed": {
                    "name": "optionsPressed",
                    "type": "boolean",
                    "required": false
                  },
                  "onOptionsClick": {
                    "name": "onOptionsClick",
                    "type": "(context?: CatalogCardInteractionContext) => void",
                    "required": false
                  },
                  "optionsTooltip": {
                    "name": "optionsTooltip",
                    "type": "string",
                    "required": false,
                    "description": "Texto del tooltip del control ⋯ del pie (menú o callback).\n    Omite la prop para usar el texto por defecto del diseño.\n    Pasa cadena vacía para desactivar el tooltip."
                  },
                  "optionsMenuItems": {
                    "name": "optionsMenuItems",
                    "type": "CatalogCardMenuItem[]",
                    "required": false
                  }
                }
              },
              "catalogPrimaryPanel": {
                "props": {
                  "primaryMenuItems": {
                    "name": "primaryMenuItems",
                    "type": "CatalogCardMenuItem[]",
                    "required": false
                  },
                  "primaryMenuFooter": {
                    "name": "primaryMenuFooter",
                    "type": "{",
                    "required": false
                  },
                  "label": {
                    "name": "label",
                    "type": "string",
                    "required": true
                  },
                  "onClick": {
                    "name": "onClick",
                    "type": "(footer?: { label: string }) => void",
                    "required": false
                  },
                  "primaryMenuMaxHeightClass": {
                    "name": "primaryMenuMaxHeightClass",
                    "type": "string",
                    "required": false
                  }
                }
              },
              "catalogFooter": {
                "props": {
                  "showPrimaryCta": {
                    "name": "showPrimaryCta",
                    "type": "boolean",
                    "required": false,
                    "description": "When `false`, the primary CTA is not rendered (footer button / horizontal icon slot), same as\n    {"
                  }
                }
              },
              "supplierProfile": {
                "props": {
                  "ratingValue": {
                    "name": "ratingValue",
                    "type": "string",
                    "required": false
                  },
                  "statusLabel": {
                    "name": "statusLabel",
                    "type": "string",
                    "required": false
                  },
                  "avatarInitials": {
                    "name": "avatarInitials",
                    "type": "string",
                    "required": true
                  },
                  "name": {
                    "name": "name",
                    "type": "string",
                    "required": true
                  },
                  "subtitle": {
                    "name": "subtitle",
                    "type": "string",
                    "required": true
                  }
                }
              },
              "supplierContact": {
                "props": {
                  "phone": {
                    "name": "phone",
                    "type": "CatalogSupplierContactRow | string",
                    "required": false
                  },
                  "email": {
                    "name": "email",
                    "type": "CatalogSupplierContactRow | string",
                    "required": false
                  }
                }
              },
              "supplierCta": {
                "props": {
                  "primaryButtonLabel": {
                    "name": "primaryButtonLabel",
                    "type": "string",
                    "required": false
                  },
                  "onPrimaryClick": {
                    "name": "onPrimaryClick",
                    "type": "(context?: CatalogCardInteractionContext) => void",
                    "required": false
                  }
                }
              },
              "supplierOptionsMenu": {
                "props": {
                  "onOptionsClick": {
                    "name": "onOptionsClick",
                    "type": "(context?: CatalogCardInteractionContext) => void",
                    "required": false
                  },
                  "optionsMenuItems": {
                    "name": "optionsMenuItems",
                    "type": "CatalogCardMenuItem[]",
                    "required": false
                  }
                }
              }
            },
            "deprecatedRoot": []
          }
        }
      ]
    },
    {
      "id": "Checkbox",
      "path": "src/modules/Checkbox",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Checkbox",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Componente base de checkbox basado en los tokens semánticos de Figma.\n\n### Tokens de Figma usados:\n| Token | Valor | Clase Tailwind |\n|---|---|---|\n| \\",
            "jsdoc": "Estado del checkbox (marcado o no) */\n  checked: boolean;\n  /** Estado indeterminado (parcialmente seleccionado) */\n  indeterminate?: boolean;\n  /** Handler cuando cambia el estado */\n  onChange: (checked: boolean) => void;\n  /** Si el checkbox está deshabilitado */\n  disabled?: boolean;\n  /** Si el checkbox tiene estado de error */\n  error?: boolean;\n  /** Clases CSS adicionales para el input */\n  className?: string;\n  /** Hace el checkbox redondo en lugar de cuadrado */\n  round?: boolean;\n  /** Tamaño del checkbox */\n  size?: 'sm' | 'md';\n  /** Nombre del input para formularios */\n  name?: string;\n  /** ID del input */\n  id?: string;\n  /** Texto del label asociado al checkbox */\n  label?: string;\n  /** Texto de soporte debajo del label */\n  supportingText?: string;\n  /** Clases CSS adici",
            "readme": "# Checkbox Component\n\nComponente de checkbox con soporte para estados indeterminados, labels y texto de soporte.\n\n## Uso Básico\n\n```tsx\nimport { Checkbox } from '@imj_media/ui';\n\n// Checkbox simple\n<Checkbox\n  checked={isChecked}\n  onChange={(checked) => setIsChecked(checked)}\n/>\n\n// Checkbox con label\n<Checkbox\n  checked={isChecked}\n  onChange={(checked) => setIsChecked(checked)}\n  label=\"Acepto los términos y condiciones\"\n/>\n\n// Checkbox con texto de soporte\n<Checkbox\n  checked={isChecked}\n  onChange={(checked) => setIsChecked(checked)}\n  label=\"Suscribirse al newsletter\"\n  supportingText=\"Recibirás actualizaciones por correo\"\n/>\n```\n\n## Props\n\n### Props Requeridos\n\n- `checked: boolean` - Estado del checkbox (marcado o no)\n- `onChange: (checked: boolean) => void` - Handler cuando cambia el estado\n\n### Props Opcionales\n\n- `indeterminate?: boolean` - Estado indeterminado (parcialmente seleccionado) (default: `false`)\n- `disabled?: boolean` - Si el checkbox está deshabilitado (default: `false`)\n- `error?: boolean` - Si el checkbox tiene estado de error (default: `false`)\n- `round?: boolean` - Hace el checkbox redondo en lugar de cuadrado (default: `false`)\n- `size?: 'sm' | 'md'` - Tamaño del checkbox (default: `'md'`)\n- `name?: string` - Nombre del input para formularios\n- `id?: string` - ID del input\n- `label?: string` - Texto del label asociado al checkbox\n- `supportingText?: string` - Texto de soporte debajo del label\n- `className?: string` - Clases CSS adicionales para el input\n- `classNameLabel?: string` - Clases CSS adicionales para el contenedor del label\n\n## Ejemplos\n\n### Checkbox con estado indeterminado\n\n```tsx\n<Checkbox\n  checked={false}\n  indeterminate={true}\n  onChange={(checked) => console.log(checked)}\n  label=\"Seleccionar todos\"\n/>\n```\n\n### Checkbox deshabilitado\n\n```tsx\n<Checkbox checked={true} disabled={true} onChange={(checked) => {}} label=\"Opción deshabilitada\" />\n```\n\n### Checkbox con error\n\n```tsx\n<Checkbox\n  checked={false}\n  error={true}\n  on",
            "confidence": "high"
          },
          "examples": [
            "import { Checkbox } from '@imj_media/ui'\n\n// Default (unchecked): bg-fill + border-default\n<Checkbox checked={false} onChange={setChecked} />\n\n// Checked: bg-fill-brand + border-transparent (sin borde visible)\n<Checkbox checked={true} onChange={setChecked} />\n\n// Indeterminate: bg-fill-brand + minus SVG\n<Checkbox checked={false} indeterminate onChange={() => {}} />\n\n// Disabled: bg-fill-disabled + border-disabled / bg-fill-brand-disabled\n<Checkbox checked={false} onChange={() => {}} disabled />\n<Checkbox checked={true} onChange={() => {}} disabled />",
            "// Error unchecked: bg-fill + border-danger\n<Checkbox checked={false} onChange={setChecked} error />\n\n// Error checked: bg-fill-brand + border-danger\n<Checkbox checked={true} onChange={setChecked} error />\n\n// Error indeterminate: bg-fill-brand + border-danger\n<Checkbox checked={false} indeterminate onChange={() => {}} error />",
            "// Cuadrado: radius/surface/forms = 2px\n<Checkbox checked={checked} onChange={setChecked} />\n\n// Redondo: rounded-full\n<Checkbox checked={checked} onChange={setChecked} round />",
            "<Checkbox checked={checked} onChange={setChecked} size=\"sm\" />\n<Checkbox checked={checked} onChange={setChecked} size=\"md\" />",
            "// Con label y supporting text\n<Checkbox\n  checked={checked}\n  onChange={setChecked}\n  id=\"terms\"\n  label=\"Label\"\n  supportingText=\"Supporting text\"\n/>\n\n// Con error\n<Checkbox\n  checked={false}\n  onChange={setChecked}\n  id=\"error-field\"\n  label=\"Label\"\n  supportingText=\"Supporting text\"\n  error\n/>\n\n// Disabled\n<Checkbox\n  checked={true}\n  onChange={setChecked}\n  id=\"disabled-field\"\n  label=\"Label\"\n  supportingText=\"Supporting text\"\n  disabled\n/>"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "checked": {
                "name": "checked",
                "type": "boolean",
                "required": true,
                "description": "Estado del checkbox (marcado o no)"
              },
              "indeterminate": {
                "name": "indeterminate",
                "type": "boolean",
                "required": false,
                "description": "Estado indeterminado (parcialmente seleccionado)"
              },
              "onChange": {
                "name": "onChange",
                "type": "(checked: boolean) => void",
                "required": true,
                "description": "Handler cuando cambia el estado"
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false,
                "description": "Si el checkbox está deshabilitado"
              },
              "error": {
                "name": "error",
                "type": "boolean",
                "required": false,
                "description": "Si el checkbox tiene estado de error"
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clases CSS adicionales para el input"
              },
              "round": {
                "name": "round",
                "type": "boolean",
                "required": false,
                "description": "Hace el checkbox redondo en lugar de cuadrado"
              },
              "size": {
                "name": "size",
                "type": "'sm' | 'md'",
                "required": false,
                "description": "Tamaño del checkbox"
              },
              "name": {
                "name": "name",
                "type": "string",
                "required": false,
                "description": "Nombre del input para formularios"
              },
              "id": {
                "name": "id",
                "type": "string",
                "required": false,
                "description": "ID del input"
              },
              "label": {
                "name": "label",
                "type": "string",
                "required": false,
                "description": "Texto del label asociado al checkbox"
              },
              "supportingText": {
                "name": "supportingText",
                "type": "string",
                "required": false,
                "description": "Texto de soporte debajo del label"
              },
              "classNameLabel": {
                "name": "classNameLabel",
                "type": "string",
                "required": false,
                "description": "Clases CSS adicionales para el contenedor del label"
              }
            }
          }
        }
      ]
    },
    {
      "id": "DatePicker",
      "path": "src/modules/DatePicker",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "DatePicker",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "## DatePicker - Selector de Fechas\n\nUn componente completo y flexible para seleccionar fechas individuales o rangos de fechas.\n\n### Características principales:\n- **Modo único**: Selección de una fecha específica\n- **Modo rango**: Selección de un rango de fechas (inicio y fin)\n- **Vistas múltiples**: Días, meses y años\n- **Internacionalización**: Soporte para diferentes idiomas\n- **Personalización**: Estilos y comportamientos configurables\n- **Validación**: Fechas mínimas y máximas\n- **Modos de control**: Controlado y no controlado\n\n### Casos de uso comunes:\n- Formularios de reservas\n- Filtros de fechas\n- Calendarios de eventos\n- Selectores de período",
            "readme": "# DatePicker - Estructura Modular\n\nEste módulo contiene una implementación modular del DatePicker con componentes atómicos, moleculares y orgánicos, junto con hooks personalizados y tipos TypeScript.\n\n## Estructura de Carpetas\n\n```\nDatePicker/\n├── atoms/           # Componentes atómicos (más básicos)\n├── molecules/       # Componentes moleculares (combinan átomos)\n├── organisms/       # Componentes orgánicos (combinan moléculas)\n├── types/           # Definiciones de tipos TypeScript\n├── hooks/           # Hooks personalizados\n├── stories/         # Storybook stories\n└── index.tsx        # Componente principal (legacy)\n```\n\n## Componentes Atómicos (`atoms/`)\n\nComponentes más básicos y reutilizables:\n\n- **Day**: Representa un día individual en el calendario\n- **Month**: Representa un mes en la vista de meses\n- **Year**: Representa un año en la vista de años\n- **WeekDay**: Representa los días de la semana\n- **NavigationButton**: Botón de navegación (anterior/siguiente)\n\n## Componentes Moleculares (`molecules/`)\n\nCombinan componentes atómicos para crear funcionalidades más complejas:\n\n- **CalendarHeader**: Header del calendario con navegación\n- **CalendarGrid**: Cuadrícula de días del calendario\n- **MonthGrid**: Cuadrícula de meses\n- **YearGrid**: Cuadrícula de años\n- **DateInput**: Input para la fecha\n\n## Componentes Orgánicos (`organisms/`)\n\nCombinan componentes moleculares para crear funcionalidades completas:\n\n- **Calendar**: Calendario completo con todas las vistas\n- **DatePickerPortal**: Portal del DatePicker con manejo de posicionamiento\n\n## Hooks (`hooks/`)\n\nHooks personalizados para la lógica del DatePicker:\n\n- **useDatePicker**: Hook principal que maneja el estado del DatePicker\n- **useDateRange**: Hook para manejar rangos de fechas\n- **useCalendar**: Hook para la lógica del calendario\n- **useDateInput**: Hook para el manejo del input\n- **usePortal**: Hook para el manejo del portal\n\n## Tipos (`types/`)\n\nDefiniciones de tipos TypeScript organizadas por funcion",
            "confidence": "high"
          },
          "examples": [
            "import { DatePicker } from '@imj_media/ui';\n\n  export default function Example() {\n    return <DatePicker />\n  }",
            "import { DatePicker } from '@imj_media/ui';\n  import { useState } from 'react';\n\n  export default function Example() {\n    const [selectedDate, setSelectedDate] = useState<Date | null>(new Date('2024-07-15'));\n\n    return (\n      <DatePicker\n        selectedDate={selectedDate}\n        onDateChange={setSelectedDate}\n      />\n    );\n  }",
            "import { DatePicker } from '@imj_media/ui';\n\n  export default function Example() {\n    return (\n      <DatePicker \n        mode=\"range\"\n        selectedRange={{\n          start: new Date('2024-07-10'),\n          end: new Date('2024-07-20'),\n        }}\n      />\n    )\n  }",
            "// Caso que antes fallaba (desfase 1 día en zonas UTC−N):\n// selectedRange={{ start: new Date(\"2026-02-01T00:00:00.000Z\"), end: new Date(\"2026-02-28T00:00:00.000Z\") }}\n// Sin normalización: en México (UTC-6) se veía 31/01 - 27/02.\n// Con normalización interna (toLocalDateOnly): se muestra 01/02 - 28/02.",
            "import { DatePicker } from '@imj_media/ui';\n\nexport default function Example() {\n  return (\n    <DatePicker \n      minDate={minDate ?? undefined}\n      maxDate={maxDate ?? undefined}\n      selectedRange={range}\n      onRangeChange={setRange}\n    />\n  )\n}"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "size": {
                "name": "size",
                "type": "InputSize",
                "required": false
              },
              "mode": {
                "name": "mode",
                "type": "'single' | 'range'",
                "required": false
              },
              "selectedDate": {
                "name": "selectedDate",
                "type": "Date | null",
                "required": false
              },
              "selectedRange": {
                "name": "selectedRange",
                "type": "DateRange",
                "required": false
              },
              "onDateChange": {
                "name": "onDateChange",
                "type": "(date: Date | null) => void",
                "required": false
              },
              "onRangeChange": {
                "name": "onRangeChange",
                "type": "(range: DateRange) => void",
                "required": false
              },
              "minDate": {
                "name": "minDate",
                "type": "Date",
                "required": false
              },
              "maxDate": {
                "name": "maxDate",
                "type": "Date",
                "required": false
              },
              "locale": {
                "name": "locale",
                "type": "string",
                "required": false
              },
              "weekDays": {
                "name": "weekDays",
                "type": "string[]",
                "required": false
              },
              "monthNames": {
                "name": "monthNames",
                "type": "string[]",
                "required": false
              },
              "startOfWeek": {
                "name": "startOfWeek",
                "type": "0 | 1 | 2 | 3 | 4 | 5 | 6",
                "required": false
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "inputClassName": {
                "name": "inputClassName",
                "type": "string",
                "required": false
              },
              "headerClassName": {
                "name": "headerClassName",
                "type": "string",
                "required": false
              },
              "dayClassName": {
                "name": "dayClassName",
                "type": "| string",
                "required": false
              },
              "day": {
                "name": "day",
                "type": "number",
                "required": true
              },
              "state": {
                "name": "state",
                "type": "{",
                "required": true
              },
              "isSelected": {
                "name": "isSelected",
                "type": "boolean",
                "required": true
              },
              "isInRange": {
                "name": "isInRange",
                "type": "boolean",
                "required": true
              },
              "isStart": {
                "name": "isStart",
                "type": "boolean",
                "required": true
              },
              "isEnd": {
                "name": "isEnd",
                "type": "boolean",
                "required": true
              },
              "isDisabled": {
                "name": "isDisabled",
                "type": "boolean",
                "required": true
              },
              "isToday": {
                "name": "isToday",
                "type": "boolean",
                "required": true
              },
              "monthClassName": {
                "name": "monthClassName",
                "type": "string | ((month: number) => string)",
                "required": false
              },
              "yearClassName": {
                "name": "yearClassName",
                "type": "string | ((year: number) => string)",
                "required": false
              },
              "disabledDayClassName": {
                "name": "disabledDayClassName",
                "type": "string",
                "required": false
              },
              "rangeClassName": {
                "name": "rangeClassName",
                "type": "string",
                "required": false
              },
              "rangeStartClassName": {
                "name": "rangeStartClassName",
                "type": "string",
                "required": false
              },
              "rangeEndClassName": {
                "name": "rangeEndClassName",
                "type": "string",
                "required": false
              },
              "todayClassName": {
                "name": "todayClassName",
                "type": "string",
                "required": false
              },
              "showWeekNumbers": {
                "name": "showWeekNumbers",
                "type": "boolean",
                "required": false
              },
              "yearRange": {
                "name": "yearRange",
                "type": "number",
                "required": false
              },
              "initialViewMode": {
                "name": "initialViewMode",
                "type": "ViewMode",
                "required": false
              },
              "closeOnSelect": {
                "name": "closeOnSelect",
                "type": "boolean",
                "required": false
              },
              "autoCloseRange": {
                "name": "autoCloseRange",
                "type": "boolean",
                "required": false
              },
              "placeholder": {
                "name": "placeholder",
                "type": "string",
                "required": false
              },
              "format": {
                "name": "format",
                "type": "string",
                "required": false
              },
              "calendarsCount": {
                "name": "calendarsCount",
                "type": "number",
                "required": false
              },
              "label": {
                "name": "label",
                "type": "string",
                "required": false
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false,
                "description": "Si es true, el control no es interactivo: no abre el calendario al pulsar el campo ni el icono."
              },
              "renderHeader": {
                "name": "renderHeader",
                "type": "(props: {",
                "required": false
              },
              "currentDate": {
                "name": "currentDate",
                "type": "Date",
                "required": true
              },
              "viewMode": {
                "name": "viewMode",
                "type": "ViewMode",
                "required": true
              },
              "toggleViewMode": {
                "name": "toggleViewMode",
                "type": "() => void",
                "required": true
              },
              "navigate": {
                "name": "navigate",
                "type": "(direction: 'prev' | 'next') => void",
                "required": true
              },
              "renderDay": {
                "name": "renderDay",
                "type": "(props: {",
                "required": false
              },
              "date": {
                "name": "date",
                "type": "Date",
                "required": true
              }
            }
          }
        }
      ]
    },
    {
      "id": "Drawer",
      "path": "src/modules/Drawer",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Drawer",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Drawer permite mostrar contenido en un panel lateral deslizable con diferentes tamaños, posiciones y configuraciones de botones.",
            "jsdoc": "DrawerFooter - Subcomponente de footer para Drawer\n@internal\n/\nconst DrawerFooter = ({ children, className }: DrawerFooterProps) => {\n  return (\n    <Card.Footer\n      className={cn('ui-flex ui-items-center ui-justify-end ui-gap-x-16 ui-p-16', className)}\n    >\n      {children}\n    </Card.Footer>\n  );\n};\n\n// Nombre para identificar el componente\nDrawerFooter.displayName = 'DrawerFooter';\n\n// Función auxiliar para extraer el footer de los children\nconst extractFooterFromChildren = (\n  children: ReactNode\n): { content: ReactNode[]; footer: ReactElement | null } => {\n  const content: ReactNode[] = [];\n  let footer: ReactElement | null = null;\n\n  Children.forEach(children, (child) => {\n    if (\n      isValidElement(child) &&\n      (child.type as { displayName?: string })?.displayName === 'Draw",
            "confidence": "high"
          },
          "examples": [
            "import { Drawer } from '@/modules/Drawer';\nimport { useState } from 'react';\n\nexport default function Example() {\n  const [isOpen, setIsOpen] = useState(false);\n\n  return (\n    <Drawer\n      isOpen={isOpen}\n      onClose={() => setIsOpen(false)}\n      title=\"Drawer Básico\"\n      size=\"md\"\n      position=\"right\"\n    >\n      <p>Contenido del drawer aquí</p>\n    </Drawer>\n  )\n}",
            "<Drawer\n  isOpen={isOpen}\n  onClose={handleClose}\n  title=\"…\"\n  closeButton={{ tooltip: true }}\n>\n  …\n</Drawer>",
            "<Drawer size=\"sm\">...</Drawer>  // 280px\n<Drawer size=\"md\">...</Drawer>  // 400px (default)\n<Drawer size=\"lg\">...</Drawer>  // 560px",
            "<Drawer position=\"left\">...</Drawer>\n<Drawer position=\"right\">...</Drawer>  // default",
            "// Max-width personalizado\n<Drawer maxWidth=\"600px\">...</Drawer>\n<Drawer maxWidth=\"50%\">...</Drawer>\n\n// Sin max-width (full width)\n<Drawer fullWidth>...</Drawer>\n\n// Adaptar al contenido interno ✨\n<Drawer fitContent>\n  <div style={{ width: '350px' }}>\n    Contenido con ancho definido\n  </div>\n</Drawer>\n\n// Max-width por defecto basado en size\n<Drawer size=\"md\">...</Drawer>  // max-width: 400px"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "isOpen": {
                "name": "isOpen",
                "type": "boolean",
                "required": true
              },
              "onClose": {
                "name": "onClose",
                "type": "() => void",
                "required": true
              },
              "title": {
                "name": "title",
                "type": "string",
                "required": false
              },
              "titleIcon": {
                "name": "titleIcon",
                "type": "IconType",
                "required": false
              },
              "titleIconDuotonePrimary": {
                "name": "titleIconDuotonePrimary",
                "type": "IconFontColor",
                "required": false
              },
              "titleIconDuotoneSecondary": {
                "name": "titleIconDuotoneSecondary",
                "type": "IconFontColor",
                "required": false
              },
              "titleIconDuotoneOpacityPrimary": {
                "name": "titleIconDuotoneOpacityPrimary",
                "type": "number",
                "required": false
              },
              "titleIconDuotoneOpacitySecondary": {
                "name": "titleIconDuotoneOpacitySecondary",
                "type": "number",
                "required": false
              },
              "size": {
                "name": "size",
                "type": "'sm' | 'md' | 'lg' | 'xl'",
                "required": false,
                "description": "`xl` (800px) alineado a layouts anchos (p. ej. implementación campaña)."
              },
              "children": {
                "name": "children",
                "type": "React.ReactNode",
                "required": true
              },
              "closeButton": {
                "name": "closeButton",
                "type": "ModalCloseButtonConfig",
                "required": false,
                "description": "Botón de cerrar (X): tooltip opcional. Misma forma que `Modal` (`ModalCloseButtonConfig`).\n    Si `tooltip` es `true` y no pasas `tooltipPosition`, el tooltip se muestra a la izquierda del botón."
              },
              "showCloseButton": {
                "name": "showCloseButton",
                "type": "boolean",
                "required": false
              },
              "disableEscapeClose": {
                "name": "disableEscapeClose",
                "type": "boolean",
                "required": false
              },
              "disableOutsideTab": {
                "name": "disableOutsideTab",
                "type": "boolean",
                "required": false
              },
              "position": {
                "name": "position",
                "type": "'left' | 'right'",
                "required": false
              },
              "surface": {
                "name": "surface",
                "type": "'default' | 'brand'",
                "required": false,
                "description": "Superficie del panel: `default` (gris secundario) o `brand` (relleno brand en panel y Card).\n    En `brand`: sin borde bajo el header, sin `Card.Separator` antes del footer y `Card` interna con `bordered={false}`."
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "scrollable": {
                "name": "scrollable",
                "type": "boolean",
                "required": false
              },
              "cancelButtonText": {
                "name": "cancelButtonText",
                "type": "string",
                "required": false
              },
              "successButtonText": {
                "name": "successButtonText",
                "type": "string",
                "required": false
              },
              "onCancel": {
                "name": "onCancel",
                "type": "() => void",
                "required": false
              },
              "onSuccess": {
                "name": "onSuccess",
                "type": "() => void",
                "required": false
              },
              "showCancelButton": {
                "name": "showCancelButton",
                "type": "boolean",
                "required": false
              },
              "showSuccessButton": {
                "name": "showSuccessButton",
                "type": "boolean",
                "required": false
              },
              "closeAtSuccess": {
                "name": "closeAtSuccess",
                "type": "boolean",
                "required": false
              },
              "closeAtCancel": {
                "name": "closeAtCancel",
                "type": "boolean",
                "required": false
              },
              "disabledSuccessButton": {
                "name": "disabledSuccessButton",
                "type": "boolean",
                "required": false
              },
              "disabledCancelButton": {
                "name": "disabledCancelButton",
                "type": "boolean",
                "required": false
              },
              "maxWidth": {
                "name": "maxWidth",
                "type": "string",
                "required": false,
                "description": "Ancho máximo personalizado del drawer (ej: '500px', '50%', '30rem'). Por defecto usa el size."
              },
              "fullWidth": {
                "name": "fullWidth",
                "type": "boolean",
                "required": false,
                "description": "Si es true, el drawer ocupará todo el ancho disponible sin max-width"
              },
              "fitContent": {
                "name": "fitContent",
                "type": "boolean",
                "required": false,
                "description": "Si es true, el drawer se adaptará al ancho de su contenido interno"
              },
              "tabs": {
                "name": "tabs",
                "type": "SwitchOption[]",
                "required": false,
                "description": "Opciones de tabs para mostrar en el header del drawer"
              },
              "defaultValueTab": {
                "name": "defaultValueTab",
                "type": "string",
                "required": false,
                "description": "Valor por defecto del tab seleccionado"
              },
              "onChangeTab": {
                "name": "onChangeTab",
                "type": "(value: string) => void",
                "required": false,
                "description": "Callback cuando cambia el tab seleccionado"
              },
              "currentTab": {
                "name": "currentTab",
                "type": "string",
                "required": false,
                "description": "Tab actualmente seleccionado (controlado)"
              },
              "tabsOverHeader": {
                "name": "tabsOverHeader",
                "type": "boolean",
                "required": false,
                "description": "Si es true, los tabs se muestran centrados entre el título y el botón de cerrar. Si es false, se muestran debajo del título en una fila completa. Default: false"
              }
            }
          }
        }
      ]
    },
    {
      "id": "Dropdown",
      "path": "src/modules/Dropdown",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Dropdown",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "**API agrupada:**",
            "jsdoc": "Dropdown - Componente de dropdown/select versátil y configurable\nComponente de dropdown que soporta búsqueda, selección múltiple, diferentes variantes de lista,\nestados controlados/no controlados, y múltiples tipos de opciones (default, checkbox, radio, toggle, user).\n**Ancho del menú:** el panel de la lista usa por defecto el ancho del trigger como `width` y\n`maxWidth` (no supera el campo). `popover.fullWidth` por defecto es `true` (campo a ancho completo\ndel contenedor).\n**Orden en lista:** por defecto (`list.pinSelectedFirst`), la opción seleccionada aparece arriba\nen el panel (salvo listas con `isGroupTitle`). Desactivar con `list={{ pinSelectedFirst: false }}`.",
            "confidence": "high"
          },
          "examples": [
            "import { Dropdown } from '@/modules/Dropdown';\n  import { useState } from 'react';\n\n  export default function Example() {\n    const [value, setValue] = useState('1');\n\n    return (\n      <Dropdown\n        field={{\n          label: 'Selecciona una opción',\n          placeholder: 'Elige una opción',\n        }}\n        items={{\n          options: [\n            { label: 'Opción 1', value: '1' },\n            { label: 'Opción 2', value: '2' },\n            { label: 'Opción 3', value: '3' },\n          ],\n        }}\n        values={{ value }}\n        events={{ onValueChange: setValue }}\n      />\n    )\n  }",
            "const [value, setValue] = useState('1');\n\n  <Dropdown\n    field={{ label: 'Dropdown con búsqueda', placeholder: 'Busca y selecciona' }}\n    menuSearch={{ searchable: true, searchPlaceholder: 'Buscar...' }}\n    items={{ options: manyOptions }}\n    values={{ value }}\n    events={{ onValueChange: setValue }}\n  />",
            "const [value, setValue] = useState(-1);\n\n  <Dropdown\n    field={{ label: 'Dropdown con Opción por Defecto', placeholder: 'Selecciona una opción' }}\n    items={{\n      options: [\n        { label: 'Opción 1', value: '1' },\n        { label: 'Opción 2', value: '2' },\n        { label: 'Opción 3', value: '3' },\n      ],\n      defaultOptionSelected: true,\n    }}\n    values={{ value }}\n    events={{ onValueChange: setValue }}\n  />",
            "const [value1, setValue1] = useState('');\n  const [value2, setValue2] = useState('');\n  const [value3, setValue3] = useState('');\n\n  const handleValue1Change = createSingleValueHandler(setValue1);\n  const handleValue2Change = createSingleValueHandler(setValue2);\n  const handleValue3Change = createSingleValueHandler(setValue3);\n\n  <div className=\"space-y-4\">\n    <Dropdown\n      field={{ label: 'Primer dropdown', placeholder: 'Selecciona opción 1' }}\n      items={{ options: sampleOptions }}\n      values={{ value: value1 }}\n      events={{ onValueChange: handleValue1Change }}\n      menuSearch={{ searchable: true }}\n    />\n    <Dropdown\n      field={{ label: 'Segundo dropdown', placeholder: 'Selecciona opción 2' }}\n      items={{ options: sampleOptions }}\n      values={{ value: value2 }}\n      events={{ onValueChange: handleValue2Change }}\n    />\n    <Dropdown\n      field={{ label: 'Tercer dropdown', placeholder: 'Selecciona opción 3' }}\n      items={{ options: sampleOptions }}\n      values={{ value: value3 }}\n      events={{ onValueChange: handleValue3Change }}\n      slots={{ leftSlot: faSearch }}\n    />\n  </div>",
            "const [selectedUser, setSelectedUser] = useState('USR001');\n  const [selectedProduct, setSelectedProduct] = useState('PROD-A-001');\n\n  const handleUserChange = createSingleValueHandler(setSelectedUser);\n  const handleProductChange = createSingleValueHandler(setSelectedProduct);\n\n  <Dropdown\n    field={{ label: 'Seleccionar Usuario', placeholder: 'Elige un usuario' }}\n    items={{ options: customOptions, valueName: 'code', idName: 'identifier' }}\n    values={{ value: selectedUser }}\n    events={{ onValueChange: handleUserChange }}\n    menuSearch={{ searchable: true }}\n  />\n\n  <Dropdown\n    field={{ label: 'Seleccionar Producto', placeholder: 'Elige un producto' }}\n    items={{ options: productOptions, valueName: 'sku', idName: 'productId' }}\n    values={{ value: selectedProduct }}\n    events={{ onValueChange: handleProductChange }}\n    menuSearch={{ searchable: true }}\n  />",
            "<Dropdown\n  field={{ label: 'Menú de opciones', placeholder: 'Selecciona una opción' }}\n  items={{ options: [/* … */] }}\n  values={{ value }}\n  events={{ onValueChange: setValue }}\n  list={{ listVariant: 'default' }}\n  menuSearch={{ searchable: true }}\n/>",
            "<Dropdown\n  field={{ label: 'Configuración', placeholder: 'Selecciona una opción' }}\n  items={{ options: [/* … */] }}\n  values={{ value }}\n  events={{ onValueChange: setValue }}\n  list={{ listVariant: 'list-default' }}\n  menuSearch={{ searchable: true }}\n/>",
            "<Dropdown\n  field={{ label: 'Opciones simples', placeholder: 'Selecciona...' }}\n  items={{ options: [/* … */] }}\n  values={{ value }}\n  events={{ onValueChange: setValue }}\n  list={{ listVariant: 'list-default' }}\n/>",
            "<Dropdown\n  field={{ label: 'Idioma', placeholder: 'Selecciona un idioma' }}\n  items={{ options: [/* … */] }}\n  values={{ value }}\n  events={{ onValueChange: setValue }}\n  list={{ listVariant: 'radio' }}\n/>",
            "const [toggles, setToggles] = useState({\n  darkMode: false,\n  notifications: true,\n  sounds: false,\n  autoSave: true,\n});\n\nconst toggleOptions = [\n  {\n    label: 'Modo oscuro',\n    value: 'darkMode',\n    description: 'Activar el tema oscuro',\n    checked: toggles.darkMode,\n  },\n  {\n    label: 'Notificaciones',\n    value: 'notifications',\n    description: 'Recibir notificaciones push',\n    checked: toggles.notifications,\n  },\n];\n\n<Dropdown\n  field={{ label: 'Preferencias', placeholder: 'Configurar preferencias' }}\n  items={{ options: toggleOptions }}\n  list={{ listVariant: 'toggle' }}\n  events={{\n    onToggleChange: (option, checked) => {\n      setToggles((prev) => ({ ...prev, [option.value as string]: checked }));\n    },\n  }}\n/>",
            "import { useState } from 'react';\n\n  export default function BasicMultipleSelection() {\n    const [selectedValues, setSelectedValues] = useState([]);\n    \n    const handleValueChange = (value) => {\n      if (Array.isArray(value)) {\n        setSelectedValues(value);\n      }\n    };\n\n    return (\n      <Dropdown\n        field={{ label: 'Selección Múltiple', placeholder: 'Selecciona múltiples opciones' }}\n        items={{ options: sampleOptions }}\n        values={{ value: selectedValues }}\n        events={{ onValueChange: handleValueChange }}\n        multi={{ multiple: true, selectionSummary: 'tags' }}\n        menuSearch={{ searchable: true }}\n      />\n    );\n  }",
            "<Dropdown\n    field={{ label: 'Filtros', placeholder: 'Selecciona…' }}\n    items={{ options }}\n    values={{ value: selectedValues }}\n    events={{ onValueChange: setSelectedValues }}\n    multi={{\n      multiple: true,\n      selectionSummary: 'tags',\n      tagsOverflow: 'single-line',\n      tagsOverflowPopoverTitle: 'Tipos de medio',\n    }}\n    menuSearch={{ searchable: true }}\n  />",
            "import { faShapes } from '@fortawesome/pro-regular-svg-icons';\n  import { Dropdown } from '@/modules/Dropdown';\n\n  <Dropdown\n    field={{ label: 'Tipo de Indoor padre', placeholder: 'Selecciona uno...' }}\n    slots={{ leftSlot: faShapes }}\n    popover={{ fullWidth: true, popoverZIndex: 1300 }}\n    menuSearch={{ searchable: true, searchPlaceholder: 'Buscar...' }}\n    items={{ options: opciones }}\n    multi={{\n      multiple: true,\n      selectionSummary: 'tags',\n      tagsOverflow: 'single-line',\n      tagsOverflowPopoverTitle: 'Tipos InDoor padre',\n      tagsOverflowPopoverZIndex: 1300,\n    }}\n    checkbox={{\n      withCheckbox: true,\n      checkboxSelectionTone: 'subtle',\n      checkboxPosition: 'end',\n      checkboxListDensity: 'compact',\n    }}\n    values={{ value: tiposPadreSeleccionIds }}\n    events={{ onValueChange: (v) => { /* ... */ } }}\n  />",
            "import { useState } from 'react';\n  import { Dropdown } from '@/modules/Dropdown';\n\n  const options = [\n    { label: 'Bonnie Green', value: '1', avatarUrl: 'https://i.pravatar.cc/32?img=5' },\n    // …\n  ];\n\n  export default function Example() {\n    const [selectedValues, setSelectedValues] = useState(['1', '2', '3', '4', '5', '6']);\n\n    return (\n      <Dropdown\n        field={{ label: 'Usuarios', placeholder: 'Buscar...' }}\n        items={{ options }}\n        values={{ value: selectedValues }}\n        events={{ onValueChange: (v) => Array.isArray(v) && setSelectedValues(v) }}\n        multi={{\n          multiple: true,\n          selectionSummary: 'tags',\n          tagsOverflow: 'single-line',\n          tagsOverflowPopoverTitle: 'Tipos de medio',\n        }}\n        checkbox={{\n          withCheckbox: true,\n          checkboxSelectionTone: 'subtle',\n          checkboxPosition: 'end',\n          checkboxListDensity: 'compact',\n        }}\n        menuSearch={{ searchable: true, searchPlaceholder: 'Buscar...' }}\n      />\n    );\n  }",
            "<Dropdown\n    field={{ label: 'Plazas', placeholder: 'Seleccionar…' }}\n    items={{ options }}\n    values={{ value: selectedValues }}\n    events={{ onValueChange: (v) => Array.isArray(v) && setSelectedValues(v) }}\n    multi={{\n      multiple: true,\n      selectionSummary: 'tags',\n      tagsOverflow: 'single-line',\n      tagsOverflowPopoverTitle: 'Plazas seleccionadas',\n    }}\n    list={{\n      listVariant: 'search-multi-checkbox',\n      searchMultiCheckbox: {\n        search: { placeholder: 'Buscar plaza…', show: true },\n        header: { id: 'all-plazas', label: 'Todas las plazas' },\n        showClearSelection: true,\n      },\n    }}\n    menuSearch={{ searchable: false }}\n  />\n  {/* Sin buscador en lista: searchMultiCheckbox.search.show: false */}\n  {/* Sin botón «Limpiar selección»: searchMultiCheckbox.showClearSelection: false */}"
          ],
          "props": {
            "groups": {
              "searchMultiCheckboxSearch": {
                "props": {
                  "show": {
                    "name": "show",
                    "type": "boolean",
                    "required": false,
                    "description": "Muestra el buscador dentro de la lista."
                  },
                  "placeholder": {
                    "name": "placeholder",
                    "type": "string",
                    "required": false,
                    "description": "Placeholder del campo en la lista; si no se define, se usa `menuSearch.searchPlaceholder` o la raíz."
                  }
                }
              },
              "searchMultiCheckboxHeader": {
                "props": {
                  "id": {
                    "name": "id",
                    "type": "string",
                    "required": true
                  },
                  "label": {
                    "name": "label",
                    "type": "string",
                    "required": true
                  }
                }
              },
              "field": {
                "props": {
                  "label": {
                    "name": "label",
                    "type": "string",
                    "required": false
                  },
                  "error": {
                    "name": "error",
                    "type": "string",
                    "required": false
                  },
                  "helperText": {
                    "name": "helperText",
                    "type": "string",
                    "required": false
                  },
                  "placeholder": {
                    "name": "placeholder",
                    "type": "string",
                    "required": false
                  },
                  "disabled": {
                    "name": "disabled",
                    "type": "boolean",
                    "required": false
                  },
                  "size": {
                    "name": "size",
                    "type": "InputSize",
                    "required": false
                  },
                  "color": {
                    "name": "color",
                    "type": "Colors",
                    "required": false
                  },
                  "caret": {
                    "name": "caret",
                    "type": "boolean",
                    "required": false
                  }
                }
              },
              "hint": {
                "props": {
                  "infoTooltip": {
                    "name": "infoTooltip",
                    "type": "string",
                    "required": false
                  },
                  "tooltipProps": {
                    "name": "tooltipProps",
                    "type": "ButtonTooltipConfig",
                    "required": false
                  }
                }
              },
              "slots": {
                "props": {
                  "leftSlot": {
                    "name": "leftSlot",
                    "type": "VisualSlotType",
                    "required": false
                  },
                  "rightSlot": {
                    "name": "rightSlot",
                    "type": "VisualSlotType",
                    "required": false
                  },
                  "pill": {
                    "name": "pill",
                    "type": "PillSize",
                    "required": false
                  }
                }
              },
              "items": {
                "props": {
                  "options": {
                    "name": "options",
                    "type": "DropdownOption[]",
                    "required": false
                  },
                  "valueName": {
                    "name": "valueName",
                    "type": "string",
                    "required": false
                  },
                  "idName": {
                    "name": "idName",
                    "type": "string",
                    "required": false
                  },
                  "defaultOptionSelected": {
                    "name": "defaultOptionSelected",
                    "type": "boolean",
                    "required": false
                  }
                }
              },
              "values": {
                "props": {
                  "value": {
                    "name": "value",
                    "type": "string | number | (string | number)[]",
                    "required": false
                  },
                  "defaultValue": {
                    "name": "defaultValue",
                    "type": "string | number | (string | number)[]",
                    "required": false
                  },
                  "hasCurrent": {
                    "name": "hasCurrent",
                    "type": "boolean",
                    "required": false
                  }
                }
              },
              "menuSearch": {
                "props": {
                  "searchable": {
                    "name": "searchable",
                    "type": "boolean",
                    "required": false
                  },
                  "searchPlaceholder": {
                    "name": "searchPlaceholder",
                    "type": "string",
                    "required": false
                  },
                  "noResultsText": {
                    "name": "noResultsText",
                    "type": "string",
                    "required": false
                  },
                  "noResultsDescription": {
                    "name": "noResultsDescription",
                    "type": "string",
                    "required": false
                  }
                }
              },
              "multi": {
                "props": {
                  "multiple": {
                    "name": "multiple",
                    "type": "boolean",
                    "required": false
                  },
                  "maxSelectedItems": {
                    "name": "maxSelectedItems",
                    "type": "number",
                    "required": false
                  },
                  "selectionSummary": {
                    "name": "selectionSummary",
                    "type": "DropdownSelectionSummary",
                    "required": false,
                    "description": "Cómo se muestra la selección múltiple en el campo (`tags` = chips en el trigger; `count` / `text` = solo resumen en el input)."
                  },
                  "selectedItemsDisplay": {
                    "name": "selectedItemsDisplay",
                    "type": "DropdownSelectionSummary",
                    "required": false
                  },
                  "tagsOverflow": {
                    "name": "tagsOverflow",
                    "type": "DropdownTagsOverflow",
                    "required": false
                  },
                  "tagsOverflowPopoverPlacement": {
                    "name": "tagsOverflowPopoverPlacement",
                    "type": "'top' | 'bottom'",
                    "required": false
                  },
                  "tagsOverflowPopoverZIndex": {
                    "name": "tagsOverflowPopoverZIndex",
                    "type": "number",
                    "required": false
                  },
                  "tagsOverflowPopoverTitle": {
                    "name": "tagsOverflowPopoverTitle",
                    "type": "string",
                    "required": false
                  },
                  "preventDeselectFromOptionsList": {
                    "name": "preventDeselectFromOptionsList",
                    "type": "boolean",
                    "required": false
                  },
                  "showTriggerClearButton": {
                    "name": "showTriggerClearButton",
                    "type": "boolean",
                    "required": false
                  }
                }
              },
              "popover": {
                "props": {
                  "maxHeight": {
                    "name": "maxHeight",
                    "type": "string",
                    "required": false
                  },
                  "closeOnClickOutside": {
                    "name": "closeOnClickOutside",
                    "type": "boolean",
                    "required": false
                  },
                  "dropdownId": {
                    "name": "dropdownId",
                    "type": "string",
                    "required": false
                  },
                  "fullWidth": {
                    "name": "fullWidth",
                    "type": "boolean",
                    "required": false,
                    "description": "Ancho del campo respecto al contenedor: `true` (por defecto) = `ui-w-full` en el trigger;\n    `false` = ancho según contenido (`ui-w-fit` en el `Input`), útil en layouts en línea.\n    El panel de la lista sigue midiéndose sobre el trigger y no lo supera en ancho."
                  },
                  "auto": {
                    "name": "auto",
                    "type": "boolean",
                    "required": false
                  },
                  "absolute": {
                    "name": "absolute",
                    "type": "boolean",
                    "required": false
                  },
                  "popoverZIndex": {
                    "name": "popoverZIndex",
                    "type": "number",
                    "required": false
                  },
                  "footer": {
                    "name": "footer",
                    "type": "boolean",
                    "required": false
                  }
                }
              },
              "checkbox": {
                "props": {
                  "withCheckbox": {
                    "name": "withCheckbox",
                    "type": "boolean",
                    "required": false
                  },
                  "checkboxSelectionTone": {
                    "name": "checkboxSelectionTone",
                    "type": "ListItemCheckboxSelectionTone",
                    "required": false
                  },
                  "checkboxPosition": {
                    "name": "checkboxPosition",
                    "type": "'start' | 'end'",
                    "required": false
                  },
                  "checkboxListDensity": {
                    "name": "checkboxListDensity",
                    "type": "'default' | 'compact'",
                    "required": false
                  }
                }
              },
              "listBlock": {
                "props": {
                  "listVariant": {
                    "name": "listVariant",
                    "type": "DropdownListVariant",
                    "required": false
                  },
                  "filtersTitle": {
                    "name": "filtersTitle",
                    "type": "string",
                    "required": false
                  },
                  "searchMultiCheckbox": {
                    "name": "searchMultiCheckbox",
                    "type": "DropdownSearchMultiCheckboxConfig",
                    "required": false
                  },
                  "pinSelectedFirst": {
                    "name": "pinSelectedFirst",
                    "type": "boolean",
                    "required": false,
                    "description": "En el panel del menú, muestra primero la fila (o filas) seleccionada(s). No reordena listas\n    que incluyen filas `isGroupTitle`. Variantes `toggle` / `checkbox-item` ordenan por `checked`."
                  },
                  "userHideAvatars": {
                    "name": "userHideAvatars",
                    "type": "boolean",
                    "required": false,
                    "description": "Solo con `listVariant: 'user'`. Si es `true`, ninguna fila muestra columna de imagen por\n    defecto; usa `options[].showAvatar` para excepciones. Alternativa por fila: `options[].hideAvatar`."
                  }
                }
              },
              "events": {
                "props": {
                  "onValueChange": {
                    "name": "onValueChange",
                    "type": "(value: string | number | (string | number)[]) => void",
                    "required": false
                  },
                  "onOptionSelect": {
                    "name": "onOptionSelect",
                    "type": "(option: DropdownOption) => void",
                    "required": false
                  },
                  "onCheckboxChange": {
                    "name": "onCheckboxChange",
                    "type": "(option: DropdownOption, checked: boolean) => void",
                    "required": false
                  },
                  "onToggleChange": {
                    "name": "onToggleChange",
                    "type": "(option: DropdownOption, checked: boolean) => void",
                    "required": false
                  },
                  "onHandleAccept": {
                    "name": "onHandleAccept",
                    "type": "(selectedOptions: DropdownOption[]) => void",
                    "required": false
                  }
                }
              },
              "status": {
                "props": {
                  "loading": {
                    "name": "loading",
                    "type": "boolean",
                    "required": false
                  }
                }
              }
            },
            "deprecatedRoot": [
              {
                "name": "label",
                "migrateTo": "`field",
                "type": "string"
              },
              {
                "name": "error",
                "migrateTo": "`field",
                "type": "string"
              },
              {
                "name": "helperText",
                "migrateTo": "`field",
                "type": "string"
              },
              {
                "name": "infoTooltip",
                "migrateTo": "`tooltip",
                "type": "string"
              },
              {
                "name": "size",
                "migrateTo": "`field",
                "type": "InputSize"
              },
              {
                "name": "color",
                "migrateTo": "`field",
                "type": "Colors"
              },
              {
                "name": "leftSlot",
                "migrateTo": "`slots",
                "type": "VisualSlotType"
              },
              {
                "name": "rightSlot",
                "migrateTo": "`slots",
                "type": "VisualSlotType"
              },
              {
                "name": "searchPlaceholder",
                "migrateTo": "`menuSearch",
                "type": "string"
              },
              {
                "name": "noResultsText",
                "migrateTo": "`menuSearch",
                "type": "string"
              },
              {
                "name": "noResultsDescription",
                "migrateTo": "`menuSearch",
                "type": "string"
              },
              {
                "name": "caret",
                "migrateTo": "`field",
                "type": "boolean"
              },
              {
                "name": "defaultValue",
                "migrateTo": "`values",
                "type": "string | number | (string | number)[]"
              },
              {
                "name": "placeholder",
                "migrateTo": "`field",
                "type": "string"
              },
              {
                "name": "options",
                "migrateTo": "`items",
                "type": "DropdownOption[]"
              },
              {
                "name": "value",
                "migrateTo": "`values",
                "type": "string | number | (string | number)[]"
              },
              {
                "name": "valueName",
                "migrateTo": "`items",
                "type": "string"
              },
              {
                "name": "idName",
                "migrateTo": "`items",
                "type": "string"
              },
              {
                "name": "onValueChange",
                "migrateTo": "`events",
                "type": "(value: string | number | (string | number)[]) => void"
              },
              {
                "name": "onOptionSelect",
                "migrateTo": "`events",
                "type": "(option: DropdownOption) => void"
              },
              {
                "name": "onCheckboxChange",
                "migrateTo": "`events",
                "type": "(option: DropdownOption, checked: boolean) => void"
              },
              {
                "name": "searchable",
                "migrateTo": "`menuSearch",
                "type": "boolean"
              },
              {
                "name": "maxHeight",
                "migrateTo": "`popover",
                "type": "string"
              },
              {
                "name": "closeOnClickOutside",
                "migrateTo": "`popover",
                "type": "boolean"
              },
              {
                "name": "dropdownId",
                "migrateTo": "`popover",
                "type": "string"
              },
              {
                "name": "fullWidth",
                "migrateTo": "`popover",
                "type": "boolean"
              },
              {
                "name": "auto",
                "migrateTo": "`popover",
                "type": "boolean"
              },
              {
                "name": "multiple",
                "migrateTo": "`multi",
                "type": "boolean"
              },
              {
                "name": "maxSelectedItems",
                "migrateTo": "`multi",
                "type": "number"
              },
              {
                "name": "selectionSummary",
                "migrateTo": "`multi",
                "type": "DropdownSelectionSummary"
              },
              {
                "name": "selectedItemsDisplay",
                "migrateTo": "`multi",
                "type": "DropdownSelectionSummary"
              },
              {
                "name": "tagsOverflow",
                "migrateTo": "`multi",
                "type": "DropdownTagsOverflow"
              },
              {
                "name": "tagsOverflowPopoverPlacement",
                "migrateTo": "`multi",
                "type": "'top' | 'bottom'"
              },
              {
                "name": "tagsOverflowPopoverZIndex",
                "migrateTo": "`multi",
                "type": "number"
              },
              {
                "name": "tagsOverflowPopoverTitle",
                "migrateTo": "`multi",
                "type": "string"
              },
              {
                "name": "preventDeselectFromOptionsList",
                "migrateTo": "`multi",
                "type": "boolean"
              },
              {
                "name": "showTriggerClearButton",
                "migrateTo": "`multi",
                "type": "boolean"
              },
              {
                "name": "absolute",
                "migrateTo": "`popover",
                "type": "boolean"
              },
              {
                "name": "popoverZIndex",
                "migrateTo": "`popover",
                "type": "number"
              },
              {
                "name": "footer",
                "migrateTo": "`popover",
                "type": "boolean"
              },
              {
                "name": "defaultOptionSelected",
                "migrateTo": "`items",
                "type": "boolean"
              },
              {
                "name": "withCheckbox",
                "migrateTo": "`checkbox",
                "type": "boolean"
              },
              {
                "name": "checkboxSelectionTone",
                "migrateTo": "`checkbox",
                "type": "ListItemCheckboxSelectionTone"
              },
              {
                "name": "checkboxPosition",
                "migrateTo": "`checkbox",
                "type": "'start' | 'end'"
              },
              {
                "name": "checkboxListDensity",
                "migrateTo": "`checkbox",
                "type": "'default' | 'compact'"
              },
              {
                "name": "hasCurrent",
                "migrateTo": "`values",
                "type": "boolean"
              },
              {
                "name": "onHandleAccept",
                "migrateTo": "`events",
                "type": "(selectedOptions: DropdownOption[]) => void"
              },
              {
                "name": "pill",
                "migrateTo": "`slots",
                "type": "PillSize"
              },
              {
                "name": "listVariant",
                "migrateTo": "`list",
                "type": "DropdownListVariant"
              },
              {
                "name": "searchMultiCheckbox",
                "migrateTo": "`list",
                "jsdoc": "```tsx\n    <Dropdown\n      list={{\n        listVariant: 'search-multi-checkbox',\n        searchMultiCheckbox: {\n          search: { placeholder: 'Buscar plaza…' },\n          header: { id: 'all-plazas', label: 'Todas las plazas' },\n          showClearSelection: true,\n        },\n      }}\n      multi={{ multiple: true }}\n      items={{ options }}\n      menuSearch={{ searchable: false }}\n    />\n    ```",
                "type": "DropdownSearchMultiCheckboxConfig"
              },
              {
                "name": "searchMultiCheckboxHeader",
                "migrateTo": "`list",
                "type": "{ id: string"
              },
              {
                "name": "searchMultiCheckboxShowSearch",
                "type": "boolean"
              },
              {
                "name": "searchMultiCheckboxShowClearSelection",
                "type": "boolean"
              },
              {
                "name": "onToggleChange",
                "migrateTo": "`events",
                "type": "(option: DropdownOption, checked: boolean) => void"
              },
              {
                "name": "filtersTitle",
                "migrateTo": "`list",
                "type": "string"
              },
              {
                "name": "tooltipProps",
                "migrateTo": "`tooltip",
                "type": "ButtonTooltipConfig"
              },
              {
                "name": "loading",
                "migrateTo": "`status",
                "type": "boolean"
              }
            ],
            "flat": {
              "field": {
                "name": "field",
                "type": "Partial<DropdownFieldProps>",
                "required": false
              },
              "tooltip": {
                "name": "tooltip",
                "type": "Partial<DropdownHintProps>",
                "required": false
              },
              "slots": {
                "name": "slots",
                "type": "Partial<DropdownSlotsProps>",
                "required": false
              },
              "items": {
                "name": "items",
                "type": "Partial<DropdownItemsProps>",
                "required": false
              },
              "values": {
                "name": "values",
                "type": "Partial<DropdownValuesProps>",
                "required": false
              },
              "menuSearch": {
                "name": "menuSearch",
                "type": "Partial<DropdownMenuSearchProps>",
                "required": false
              },
              "multi": {
                "name": "multi",
                "type": "Partial<DropdownMultiProps>",
                "required": false
              },
              "popover": {
                "name": "popover",
                "type": "Partial<DropdownPopoverProps>",
                "required": false
              },
              "checkbox": {
                "name": "checkbox",
                "type": "Partial<DropdownCheckboxProps>",
                "required": false
              },
              "list": {
                "name": "list",
                "type": "Partial<DropdownListBlockProps>",
                "required": false
              },
              "events": {
                "name": "events",
                "type": "Partial<DropdownEventsProps>",
                "required": false
              },
              "status": {
                "name": "status",
                "type": "Partial<DropdownStatusProps>",
                "required": false
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false
              },
              "label": {
                "name": "label",
                "type": "string }",
                "required": true
              }
            }
          }
        }
      ]
    },
    {
      "id": "Emoji",
      "path": "src/modules/Emoji",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Emoji",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Emoji permite mostrar emojis del sistema con diferentes tamaños y nombres en español.",
            "confidence": "medium"
          },
          "examples": [
            "import { Emoji } from '@/modules/Emoji';\n\n  export default function Example() {\n    return <Emoji name=\"abeja\" />\n  }",
            "// Ejemplo de uso de emojis\n<Emoji name=\"feliz\" size=\"md\" />\n<Emoji name=\"corazon\" size=\"lg\" />\n<Emoji name=\"pizza\" size=\"xl\" />\n\n// Buscar emojis disponibles\nconst emojiName = \"feliz\"; // Usar el nombre exacto del emoji\n\n// Categorías disponibles\nconst categories = {\n  emociones: ['feliz', 'triste', 'enojado', ...],\n  animales: ['perro', 'gato', 'abeja', ...],\n  comida: ['pizza', 'cafe', 'manzana', ...],\n  // ... más categorías\n};",
            "import { Emoji } from '@/modules/Emoji';\n\n  export default function Example() {\n    return <Emoji name=\"abeja\" />\n  }",
            "// Ejemplo de uso de emojis\n<Emoji name=\"feliz\" size=\"md\" />\n<Emoji name=\"corazon\" size=\"lg\" />\n<Emoji name=\"pizza\" size=\"xl\" />\n\n// Buscar emojis disponibles\nconst emojiName = \"feliz\"; // Usar el nombre exacto del emoji\n\n// Categorías disponibles\nconst categories = {\n  emociones: ['feliz', 'triste', 'enojado', ...],\n  animales: ['perro', 'gato', 'abeja', ...],\n  comida: ['pizza', 'cafe', 'manzana', ...],\n  // ... más categorías\n};"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "name": {
                "name": "name",
                "type": "EmojiName",
                "required": true
              },
              "size": {
                "name": "size",
                "type": "VisualSize",
                "required": false
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              }
            }
          }
        }
      ]
    },
    {
      "id": "EmojiPicker",
      "path": "src/modules/EmojiPicker",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "EmojiPicker",
          "kind": "component",
          "description": {
            "primary": "readme",
            "readme": "# EmojiPicker\n\nComponente selector de emojis con categorías, búsqueda y gestión de emojis recientes.\n\n## Características\n\n- ✅ 8 categorías predefinidas de emojis\n- 🔍 Búsqueda de emojis en tiempo real\n- 🕐 Gestión automática de emojis recientes (localStorage)\n- 📱 Diseño responsive y adaptable\n- 🎨 Totalmente personalizable (ancho, alto, etc.)\n- ♿ Accesible (ARIA labels)\n- 🎯 TypeScript completamente tipado\n\n## Categorías\n\nEl componente incluye las siguientes categorías de emojis:\n\n1. **Recientes** - Emojis usados recientemente\n2. **Sonrisas y personas** - Emojis de emociones y expresiones\n3. **Animales** - Emojis de animales y naturaleza\n4. **Comida** - Emojis de comida y bebida\n5. **Deportes** - Emojis de actividades deportivas\n6. **Viajes** - Emojis de viajes y lugares\n7. **Objetos** - Emojis de objetos diversos\n8. **Símbolos** - Emojis de símbolos y formas\n9. **Banderas** - Emojis de banderas de países\n\n## Uso básico\n\n```tsx\nimport { EmojiPicker } from '@imjmedia/ui';\n\nfunction MyComponent() {\n  const handleEmojiSelect = (emoji: string) => {\n    console.log('Emoji seleccionado:', emoji);\n  };\n\n  return <EmojiPicker onEmojiSelect={handleEmojiSelect} />;\n}\n```\n\n## Uso con Popup\n\nEl EmojiPicker funciona perfectamente dentro de un Popup:\n\n```tsx\nimport { EmojiPicker, Popup } from '@imjmedia/ui';\nimport { useState } from 'react';\n\nfunction MyComponent() {\n  const [selectedEmoji, setSelectedEmoji] = useState('😊');\n\n  return (\n    <Popup\n      label={selectedEmoji}\n      position=\"bottom-left\"\n      variant=\"outlined\"\n      color=\"white\"\n      size=\"md\"\n      borderRadius=\"md\"\n      closeOnClick={true}\n    >\n      <EmojiPicker onEmojiSelect={setSelectedEmoji} />\n    </Popup>\n  );\n}\n```\n\n## Props\n\n### EmojiPickerProps\n\n| Prop                  | Tipo                      | Default       | Descripción                                 |\n| --------------------- | ------------------------- | ------------- | ------------------------------------------- |\n| `onEmojiSelect`",
            "confidence": "low"
          },
          "examples": [
            "const [selectedEmoji, setSelectedEmoji] = useState('')\n\n<EmojiPicker onEmojiSelect={setSelectedEmoji} />",
            "const [selectedEmoji, setSelectedEmoji] = useState('🎉')\n\n<EmojiPicker \n  label={selectedEmoji}\n  onEmojiSelect={setSelectedEmoji} \n/>",
            "<EmojiPicker \n  width={320} \n  height={400}\n  onEmojiSelect={(emoji) => console.log(emoji)} \n/>",
            "<EmojiPicker \n  showSearch={false}\n  onEmojiSelect={(emoji) => console.log(emoji)} \n/>",
            "<EmojiPicker \n  position=\"bottom-left\"\n  onEmojiSelect={(emoji) => console.log(emoji)} \n/>\n\n<EmojiPicker \n  position=\"top\"\n  onEmojiSelect={(emoji) => console.log(emoji)} \n/>"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "onEmojiSelect": {
                "name": "onEmojiSelect",
                "type": "(emoji: string) => void",
                "required": false,
                "description": "Callback when an emoji is selected"
              },
              "maxRecentEmojis": {
                "name": "maxRecentEmojis",
                "type": "number",
                "required": false,
                "description": "Maximum number of recent emojis to display"
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Custom class name for the picker container"
              },
              "width": {
                "name": "width",
                "type": "number",
                "required": false,
                "description": "Width of the emoji picker"
              },
              "height": {
                "name": "height",
                "type": "number",
                "required": false,
                "description": "Height of the scrollable area"
              },
              "initialRecentEmojis": {
                "name": "initialRecentEmojis",
                "type": "string[]",
                "required": false,
                "description": "Initial recent emojis"
              },
              "showSearch": {
                "name": "showSearch",
                "type": "boolean",
                "required": false,
                "description": "Whether to show the search input"
              },
              "searchPlaceholder": {
                "name": "searchPlaceholder",
                "type": "string",
                "required": false,
                "description": "Placeholder text for search input"
              },
              "closeOnSelect": {
                "name": "closeOnSelect",
                "type": "boolean",
                "required": false,
                "description": "Close popup when emoji is selected"
              },
              "label": {
                "name": "label",
                "type": "string",
                "required": false,
                "description": "Label for the trigger button"
              },
              "position": {
                "name": "position",
                "type": "'top' | 'bottom' | 'left' | 'right' | 'bottom-right' | 'bottom-center' | 'bottom-left'",
                "required": false,
                "description": "Position of the popup relative to trigger"
              },
              "variant": {
                "name": "variant",
                "type": "'button' | 'text' | 'outlined' | 'icon' | 'emoji'",
                "required": false,
                "description": "Popup button variant"
              },
              "color": {
                "name": "color",
                "type": "ButtonColors",
                "required": false,
                "description": "Popup button color"
              },
              "size": {
                "name": "size",
                "type": "'xxs' | 'xs' | 'sm' | 'md' | 'lg'",
                "required": false,
                "description": "Popup button size"
              },
              "icon": {
                "name": "icon",
                "type": "IconType | React.ReactElement",
                "required": false,
                "description": "Icon for the trigger button"
              },
              "leftSlot": {
                "name": "leftSlot",
                "type": "VisualSlotType",
                "required": false,
                "description": "Left slot for the trigger button"
              },
              "rightSlot": {
                "name": "rightSlot",
                "type": "VisualSlotType",
                "required": false,
                "description": "Right slot for the trigger button"
              },
              "borderRadius": {
                "name": "borderRadius",
                "type": "'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl'",
                "required": false,
                "description": "Border radius of the popup"
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false,
                "description": "Disable the trigger button"
              },
              "buttonClassName": {
                "name": "buttonClassName",
                "type": "string",
                "required": false,
                "description": "Custom class for the trigger button"
              },
              "tooltip": {
                "name": "tooltip",
                "type": "string",
                "required": false,
                "description": "Tooltip for the trigger button"
              }
            }
          }
        }
      ]
    },
    {
      "id": "FileUploader",
      "path": "src/modules/FileUploader",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "FileUploader",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Zona de carga con restricciones, lista de archivos y eventos. Props agrupadas:",
            "jsdoc": "50 MiB — mismo criterio que el texto por defecto de `dropZone.hint`. */\nconst DEFAULT_MAX_FILE_SIZE_BYTES = 50 * 1024 * 1024;\n\nconst DEFAULT_CONSTRAINTS = {\n  multiple: true,\n  /** Alineado con el hint por defecto (PNG, JPG, CSV, PDF). */\n  accept: '.png,.jpg,.jpeg,.csv,.pdf',\n  maxFileSizeBytes: DEFAULT_MAX_FILE_SIZE_BYTES,\n} as const;\n\nconst DEFAULT_LIST = {\n  rowSize: 'lg' as FileUploadListRowSize,\n};\n\n/**\nCapas de un icono Font Awesome duotone (mapea a `Icon` / `IconFont`).\n/\nexport interface FileUploaderDropZoneIconDuotoneProps {\n  primary?: IconFontColor;\n  secondary?: IconFontColor;\n  opacityPrimary?: number;\n  opacitySecondary?: number;\n}\n\n/**\nIcono de la zona discontinua (misma superficie que `Icon`: tamaño, color y duotono).\nSe fusiona con valores por defecto (`faFile`, `xl`, `di",
            "confidence": "high"
          },
          "examples": [
            "<FileUploader\n    events={{\n      onFilesAccepted: (files) => { /* ... */ },\n      onValidationError: (message, file) => { /* ... */ },\n    }}\n  />\n  // Por defecto: accept '.png,.jpg,.jpeg,.csv,.pdf' y maxFileSizeBytes 50 MiB",
            "<div className=\"ui-h-[360px]\">\n    <FileUploader fullHeight />\n  </div>",
            "<FileUploader\n    dropZone={{\n      error: 'El archivo no tiene un tipo permitido o supera el límite.',\n    }}\n  />\n  // Restricciones por defecto (tipos + 50 MiB) salvo que pases constraints",
            "<FileUploader\n    list={{\n      items: [\n        {\n          id: '1',\n          fileName: 'informe.png',\n          format: 'png',\n          status: 'uploading',\n          progress: 35,\n          secondsRemaining: 5,\n          detailLine: '3.4 Mb | 35%',\n        },\n      ],\n      onRemoveItem: (id) => { /* ... */ },\n    }}\n  />",
            "<FileUploader\n    list={{\n      items: [\n        {\n          id: '1',\n          fileName: 'informe.png',\n          format: 'png',\n          status: 'error',\n          errorMessage: 'Error al cargar el archivo.',\n        },\n      ],\n      onRemoveItem: (id) => { /* ... */ },\n      onRetryItem: (id) => { /* ... */ },\n    }}\n  />"
          ],
          "props": {
            "groups": {
              "dropZoneIconDuotone": {
                "props": {
                  "primary": {
                    "name": "primary",
                    "type": "IconFontColor",
                    "required": false
                  },
                  "secondary": {
                    "name": "secondary",
                    "type": "IconFontColor",
                    "required": false
                  },
                  "opacityPrimary": {
                    "name": "opacityPrimary",
                    "type": "number",
                    "required": false
                  },
                  "opacitySecondary": {
                    "name": "opacitySecondary",
                    "type": "number",
                    "required": false
                  }
                }
              },
              "dropZoneIcon": {
                "props": {
                  "name": {
                    "name": "name",
                    "type": "AnyIconDefinition",
                    "required": false,
                    "description": "Definición Font Awesome del glifo."
                  },
                  "size": {
                    "name": "size",
                    "type": "IconFontSize",
                    "required": false
                  },
                  "color": {
                    "name": "color",
                    "type": "IconFontColor",
                    "required": false,
                    "description": "Color cuando la zona no está resaltada por arrastre."
                  },
                  "colorActive": {
                    "name": "colorActive",
                    "type": "IconFontColor",
                    "required": false,
                    "description": "Color cuando hay highlight de arrastre (drag over)."
                  },
                  "className": {
                    "name": "className",
                    "type": "string",
                    "required": false,
                    "description": "Clases en el contenedor del icono (`Icon`)."
                  },
                  "duotone": {
                    "name": "duotone",
                    "type": "FileUploaderDropZoneIconDuotoneProps",
                    "required": false,
                    "description": "Duotono: colores y opacidades por capa."
                  }
                }
              },
              "dropZone": {
                "props": {
                  "title": {
                    "name": "title",
                    "type": "string",
                    "required": false,
                    "description": "Título principal (Figma: «Arrastra y suelta tus archivos»)."
                  },
                  "hint": {
                    "name": "hint",
                    "type": "string",
                    "required": false,
                    "description": "Ayuda bajo el título (tipos y peso)."
                  },
                  "selectLabel": {
                    "name": "selectLabel",
                    "type": "string",
                    "required": false,
                    "description": "Etiqueta del botón que abre el selector del sistema."
                  },
                  "error": {
                    "name": "error",
                    "type": "string | null",
                    "required": false,
                    "description": "Mensaje bajo el botón (borde en error).\n    Sustituye el antiguo `dropZoneError` plano."
                  },
                  "icon": {
                    "name": "icon",
                    "type": "FileUploaderDropZoneIconProps",
                    "required": false,
                    "description": "Icono, tamaño, colores base/highlight y duotono (agrupado)."
                  }
                }
              },
              "constraints": {
                "props": {
                  "accept": {
                    "name": "accept",
                    "type": "string",
                    "required": false,
                    "description": "Valor nativo `accept` (extensiones o MIME, separados por coma).\n    Por defecto: `.png,.jpg,.jpeg,.csv,.pdf` (coherente con `dropZone.hint`).\n    Pasa `undefined` explícitamente en el objeto `constraints` si no quieres filtrar por tipo."
                  },
                  "maxFileSizeBytes": {
                    "name": "maxFileSizeBytes",
                    "type": "number",
                    "required": false,
                    "description": "Tamaño máximo por archivo en bytes.\n    Por defecto: 50 MiB (mismo mensaje que el hint)."
                  },
                  "maxFiles": {
                    "name": "maxFiles",
                    "type": "number",
                    "required": false,
                    "description": "Máximo de archivos en total en la cola (`list.items` + nuevos aceptados).\n    Si ya hay tantos ítems como este límite, no se añaden más y se llama `onValidationError`.\n    Si un lote supera el hueco restante, solo se emiten los que caben y se notifica el resto."
                  },
                  "maxFilesPerBatch": {
                    "name": "maxFilesPerBatch",
                    "type": "number",
                    "required": false,
                    "description": "Máximo de archivos por selección o soltar (un solo lote). Independiente de `maxFiles`."
                  },
                  "multiple": {
                    "name": "multiple",
                    "type": "boolean",
                    "required": false,
                    "description": "Selección múltiple en el diálogo del sistema."
                  }
                }
              },
              "list": {
                "props": {
                  "items": {
                    "name": "items",
                    "type": "FileUploadListItemData[]",
                    "required": false
                  },
                  "rowSize": {
                    "name": "rowSize",
                    "type": "FileUploadListRowSize",
                    "required": false
                  },
                  "onRemoveItem": {
                    "name": "onRemoveItem",
                    "type": "(id: string) => void",
                    "required": false
                  },
                  "onRetryItem": {
                    "name": "onRetryItem",
                    "type": "(id: string) => void",
                    "required": false,
                    "description": "Reintento cuando `status === 'error'` (red, 5xx, validación del servidor, etc.).\n    Muestra el botón con icono `arrows-rotate` junto al de quitar (X)."
                  },
                  "onDeleteItem": {
                    "name": "onDeleteItem",
                    "type": "(id: string) => void",
                    "required": false
                  }
                }
              },
              "events": {
                "props": {
                  "onFilesAccepted": {
                    "name": "onFilesAccepted",
                    "type": "(files: File[]) => void",
                    "required": false
                  },
                  "onValidationError": {
                    "name": "onValidationError",
                    "type": "(message: string, files: File[]) => void",
                    "required": false
                  }
                }
              }
            },
            "deprecatedRoot": [],
            "flat": {
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false
              },
              "fullHeight": {
                "name": "fullHeight",
                "type": "boolean",
                "required": false,
                "description": "Si es `true`, el organismo ocupa todo el alto del contenedor padre y la zona discontinua\n    crece para llenar el espacio disponible (la lista de archivos queda debajo con su alto natural).\n    El padre debe tener altura definida (p. ej. `h-full`, `flex-1` o `min-h-`)."
              },
              "dropZone": {
                "name": "dropZone",
                "type": "FileUploaderDropZoneProps",
                "required": false,
                "description": "Zona discontinua: copy visible y `error` de la zona."
              },
              "constraints": {
                "name": "constraints",
                "type": "FileUploaderConstraintsProps",
                "required": false,
                "description": "Input nativo y reglas (`accept`, peso, cupo por lote)."
              },
              "list": {
                "name": "list",
                "type": "FileUploaderListProps",
                "required": false,
                "description": "Lista controlada y callbacks por fila (quitar, reintentar, borrar completado)."
              },
              "events": {
                "name": "events",
                "type": "FileUploaderEventsProps",
                "required": false,
                "description": "Emisión tras validación local; no sustituye el estado de cada fila."
              }
            }
          }
        },
        {
          "name": "FileUploadListItem",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Zona de carga con restricciones, lista de archivos y eventos. Props agrupadas:",
            "jsdoc": "Datos de la fila (nombre, estado, progreso, etc.). */\n  item: FileUploadListItemData;\n  /** `lg` como fila ancha en Figma; `sm` compacta (sin barra al completar). */\n  rowSize?: FileUploadListRowSize;\n  /** Eliminar esta entrada (siempre; en error va antes del reintento). */\n  onRemove?: (id: string) => void;\n  /**\nReintentar subida tras error (red, 5xx, validación remota, etc.).\nSolo en `status === 'error'`: botón con `faArrowsRotate` junto al cierre (X).\n/\n  onRetry?: (id: string) => void;\n  /** Eliminar archivo completado (papelera). */\n  onDelete?: (id: string) => void;\n  className?: string;\n}\n\n/**\nFila de estado de carga: icono de tipo, título, detalle, barra solo mientras `uploading`,\ny acciones (cerrar, reintentar, papelera, check en completo) según Figma *Loader*.",
            "confidence": "high"
          },
          "examples": [
            "<FileUploader\n    events={{\n      onFilesAccepted: (files) => { /* ... */ },\n      onValidationError: (message, file) => { /* ... */ },\n    }}\n  />\n  // Por defecto: accept '.png,.jpg,.jpeg,.csv,.pdf' y maxFileSizeBytes 50 MiB",
            "<div className=\"ui-h-[360px]\">\n    <FileUploader fullHeight />\n  </div>",
            "<FileUploader\n    dropZone={{\n      error: 'El archivo no tiene un tipo permitido o supera el límite.',\n    }}\n  />\n  // Restricciones por defecto (tipos + 50 MiB) salvo que pases constraints",
            "<FileUploader\n    list={{\n      items: [\n        {\n          id: '1',\n          fileName: 'informe.png',\n          format: 'png',\n          status: 'uploading',\n          progress: 35,\n          secondsRemaining: 5,\n          detailLine: '3.4 Mb | 35%',\n        },\n      ],\n      onRemoveItem: (id) => { /* ... */ },\n    }}\n  />",
            "<FileUploader\n    list={{\n      items: [\n        {\n          id: '1',\n          fileName: 'informe.png',\n          format: 'png',\n          status: 'error',\n          errorMessage: 'Error al cargar el archivo.',\n        },\n      ],\n      onRemoveItem: (id) => { /* ... */ },\n      onRetryItem: (id) => { /* ... */ },\n    }}\n  />"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "item": {
                "name": "item",
                "type": "FileUploadListItemData",
                "required": true,
                "description": "Datos de la fila (nombre, estado, progreso, etc.)."
              },
              "rowSize": {
                "name": "rowSize",
                "type": "FileUploadListRowSize",
                "required": false,
                "description": "`lg` como fila ancha en Figma; `sm` compacta (sin barra al completar)."
              },
              "onRemove": {
                "name": "onRemove",
                "type": "(id: string) => void",
                "required": false,
                "description": "Eliminar esta entrada (siempre; en error va antes del reintento)."
              },
              "onRetry": {
                "name": "onRetry",
                "type": "(id: string) => void",
                "required": false,
                "description": "Reintentar subida tras error (red, 5xx, validación remota, etc.).\n    Solo en `status === 'error'`: botón con `faArrowsRotate` junto al cierre (X)."
              },
              "onDelete": {
                "name": "onDelete",
                "type": "(id: string) => void",
                "required": false,
                "description": "Eliminar archivo completado (papelera)."
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              }
            }
          }
        },
        {
          "name": "FileTypeIcon",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Zona de carga con restricciones, lista de archivos y eventos. Props agrupadas:",
            "jsdoc": "Tipo de archivo (artwork en `assets/icons/<format>.svg`). */\n  format: FileUploaderFileFormat;\n  /** Tamaño del bloque (Figma: 18 / 24 / 32). Los SVG de origen son 32×32. */\n  size?: FileTypeIconSize;\n  className?: string;\n}\n\n/**\nIcono de tipo de archivo según Figma `_file types`.\nUsa los vectores en `modules/FileUploader/assets/icons/*.svg` (documento + badge + etiqueta).",
            "confidence": "high"
          },
          "examples": [
            "<FileUploader\n    events={{\n      onFilesAccepted: (files) => { /* ... */ },\n      onValidationError: (message, file) => { /* ... */ },\n    }}\n  />\n  // Por defecto: accept '.png,.jpg,.jpeg,.csv,.pdf' y maxFileSizeBytes 50 MiB",
            "<div className=\"ui-h-[360px]\">\n    <FileUploader fullHeight />\n  </div>",
            "<FileUploader\n    dropZone={{\n      error: 'El archivo no tiene un tipo permitido o supera el límite.',\n    }}\n  />\n  // Restricciones por defecto (tipos + 50 MiB) salvo que pases constraints",
            "<FileUploader\n    list={{\n      items: [\n        {\n          id: '1',\n          fileName: 'informe.png',\n          format: 'png',\n          status: 'uploading',\n          progress: 35,\n          secondsRemaining: 5,\n          detailLine: '3.4 Mb | 35%',\n        },\n      ],\n      onRemoveItem: (id) => { /* ... */ },\n    }}\n  />",
            "<FileUploader\n    list={{\n      items: [\n        {\n          id: '1',\n          fileName: 'informe.png',\n          format: 'png',\n          status: 'error',\n          errorMessage: 'Error al cargar el archivo.',\n        },\n      ],\n      onRemoveItem: (id) => { /* ... */ },\n      onRetryItem: (id) => { /* ... */ },\n    }}\n  />"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "format": {
                "name": "format",
                "type": "FileUploaderFileFormat",
                "required": true,
                "description": "Tipo de archivo (artwork en `assets/icons/<format>.svg`)."
              },
              "size": {
                "name": "size",
                "type": "FileTypeIconSize",
                "required": false,
                "description": "Tamaño del bloque (Figma: 18 / 24 / 32). Los SVG de origen son 32×32."
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              }
            }
          }
        }
      ]
    },
    {
      "id": "Filters",
      "path": "src/modules/Filters",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Filters",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "confidence": "low"
          },
          "examples": [
            "import { useState } from 'react';\n  import { Filters } from '@imj_media/ui';\n  import { faFilter } from '@fortawesome/pro-regular-svg-icons';\n\n  const filters = [\n    {\n      type: 'dropdown',\n      label: 'Estado',\n      keyName: 'estado',\n      placeholder: 'Seleccionar',\n      options: [\n        { label: 'Activo', value: 'activo' },\n        { label: 'Pendiente', value: 'pendiente' },\n      ],\n    },\n    {\n      type: 'input',\n      label: 'Buscar',\n      keyName: 'buscar',\n      placeholder: 'Texto…',\n    },\n  ];\n\n  export function Example() {\n    const [applied, setApplied] = useState<Record<string, unknown> | null>(null);\n\n    return (\n      <Filters\n        size=\"xs\"\n        color=\"secondary\"\n        label=\"Filtros\"\n        title=\"Refinar resultados\"\n        icon={faFilter}\n        clearText=\"Borrar filtros\"\n        filters={filters}\n        onApply={(states) => setApplied(states)}\n        onClear={() => setApplied(null)}\n      />\n    );\n  }",
            "import { useState } from 'react';\n  import { Filters } from '@imj_media/ui';\n  import { faFilter } from '@fortawesome/pro-regular-svg-icons';\n\n  const filters = [\n    {\n      type: 'dropdown',\n      label: 'Estado',\n      keyName: 'estado',\n      placeholder: 'Seleccionar',\n      options: [\n        { label: 'Activo', value: 'activo' },\n        { label: 'Pendiente', value: 'pendiente' },\n      ],\n    },\n    {\n      type: 'input',\n      label: 'Buscar',\n      keyName: 'buscar',\n      placeholder: 'Texto…',\n    },\n  ];\n\n  export function Example() {\n    const [applied, setApplied] = useState<Record<string, unknown> | null>(null);\n\n    return (\n      <Filters\n        size=\"xs\"\n        color=\"secondary\"\n        label=\"Filtros\"\n        title=\"Refinar resultados\"\n        icon={faFilter}\n        clearText=\"Borrar filtros\"\n        filters={filters}\n        onApply={(states) => setApplied(states)}\n        onClear={() => setApplied(null)}\n      />\n    );\n  }"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "filters": {
                "name": "filters",
                "type": "Filter[]",
                "required": false
              },
              "clearText": {
                "name": "clearText",
                "type": "string",
                "required": false
              },
              "title": {
                "name": "title",
                "type": "string",
                "required": false
              },
              "icon": {
                "name": "icon",
                "type": "IconType",
                "required": false
              },
              "label": {
                "name": "label",
                "type": "string",
                "required": false
              },
              "onClear": {
                "name": "onClear",
                "type": "() => void",
                "required": false
              },
              "onApply": {
                "name": "onApply",
                "type": "(filterStates: Record<string, FilterValue>) => void",
                "required": false
              },
              "closeOnApply": {
                "name": "closeOnApply",
                "type": "boolean",
                "required": false
              },
              "size": {
                "name": "size",
                "type": "InputSize",
                "required": false
              },
              "theme": {
                "name": "theme",
                "type": "ButtonTheme",
                "required": false
              },
              "color": {
                "name": "color",
                "type": "ButtonColors",
                "required": false
              }
            }
          }
        }
      ]
    },
    {
      "id": "Ghantt",
      "path": "src/modules/Ghantt",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Ghantt",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Tabla estándar con una columna Gantt. La API voluminosa va en el objeto",
            "jsdoc": "X del puntero respecto al borde izquierdo del **mismo** elemento cuyo `scrollLeft` define el desplazamiento\n(viewport de cabecera). Si se mide con el padre del track del cuerpo, thead/tbody pueden desalinearse\n(p. ej. scrollbar vertical solo en el cuerpo) y `scrollLeft + x` cae en el inicio del contenido → anclas en ~2015.\n/\nfunction ghanttWheelTimelineViewportClientX(\n  scrollViewportEl: HTMLElement | null,\n  clientX: number\n): number {\n  const el = scrollViewportEl;\n  if (!el) return 0;\n  const r = el.getBoundingClientRect();\n  const w = el.clientWidth > 0 ? el.clientWidth : r.width;\n  return Math.max(0, Math.min(w, clientX - r.left));\n}\n\nconst DEFAULT_APPEARANCE = {\n  trackMinHeightPx: 44,\n} as const;\n\nconst DEFAULT_EVENTS = {} as const;\n\n/**\nTabla estándar {@link Table} con **una colum",
            "confidence": "high"
          },
          "examples": [
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>",
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>"
          ],
          "props": {
            "groups": {
              "gantt": {
                "props": {
                  "column": {
                    "name": "column",
                    "type": "GhanttColumnPresentationProps",
                    "required": true
                  },
                  "data": {
                    "name": "data",
                    "type": "GhanttDataProps<T>",
                    "required": true
                  },
                  "timeline": {
                    "name": "timeline",
                    "type": "GhanttTimelineProps",
                    "required": true
                  },
                  "appearance": {
                    "name": "appearance",
                    "type": "GhanttAppearanceProps",
                    "required": false
                  },
                  "events": {
                    "name": "events",
                    "type": "GhanttEventsProps<T>",
                    "required": false
                  }
                }
              },
              "column": {
                "props": {
                  "id": {
                    "name": "id",
                    "type": "string",
                    "required": false
                  },
                  "header": {
                    "name": "header",
                    "type": "ReactNode",
                    "required": true
                  },
                  "width": {
                    "name": "width",
                    "type": "number | string",
                    "required": false
                  },
                  "minWidth": {
                    "name": "minWidth",
                    "type": "number",
                    "required": false
                  },
                  "maxWidth": {
                    "name": "maxWidth",
                    "type": "number | 'auto'",
                    "required": false
                  },
                  "lockable": {
                    "name": "lockable",
                    "type": "boolean",
                    "required": false
                  },
                  "locked": {
                    "name": "locked",
                    "type": "boolean",
                    "required": false
                  },
                  "placement": {
                    "name": "placement",
                    "type": "'start' | 'end'",
                    "required": false
                  },
                  "headerClassName": {
                    "name": "headerClassName",
                    "type": "string",
                    "required": false,
                    "description": "Clases extra en `<th>` (se combinan con el borde izquierdo que separa esta columna de la anterior)."
                  },
                  "cellClassName": {
                    "name": "cellClassName",
                    "type": "string",
                    "required": false,
                    "description": "Clases extra en `<td>` del cuerpo (se combinan con el mismo borde izquierdo que en cabecera)."
                  }
                }
              },
              "data": {
                "props": {
                  "accessor": {
                    "name": "accessor",
                    "type": "keyof T | string | ((row: T) => GhanttRowValue | undefined)",
                    "required": true,
                    "description": "Campo de la fila (`keyof T`) o función. Con filas genéricas, la función es la forma más explícita."
                  }
                }
              },
              "timeline": {
                "props": {
                  "viewStart": {
                    "name": "viewStart",
                    "type": "Date | string",
                    "required": true
                  },
                  "viewEnd": {
                    "name": "viewEnd",
                    "type": "Date | string",
                    "required": true
                  },
                  "scale": {
                    "name": "scale",
                    "type": "GhanttTimelineScale",
                    "required": false
                  },
                  "includeLeadingFullMonth": {
                    "name": "includeLeadingFullMonth",
                    "type": "boolean",
                    "required": false,
                    "description": "Solo con `scale: 'day'` (o por defecto). Si es `true` (por defecto), la rejilla abarca el mes\n    calendario completo anterior al de `viewStart` y hasta el fin del mes que contiene `viewEnd`,\n    de modo que p. ej. al centrar abril sigan existiendo todas las columnas de marzo a la izquierda\n    y se vean con scroll horizontal solo dentro de la columna Gantt (cabecera + filas sincronizadas)."
                  },
                  "columnWidthPx": {
                    "name": "columnWidthPx",
                    "type": "number",
                    "required": false,
                    "description": "Ancho mínimo en px por slot (día/semana/mes según `scale`). El contenido temporal puede ser\n    más ancho que la columna: el scroll es interno a la columna. Si se omite, en vista `day`\n    se usa 44; en `week`/`month`/`hour`/`year` se aplican anchos por defecto del paquete o reparto flex."
                  },
                  "modifierWheelZoom": {
                    "name": "modifierWheelZoom",
                    "type": "boolean",
                    "required": false,
                    "description": "Si es `true`, Cmd (macOS) o Ctrl + rueda hace zoom dentro de la escala (ancho de columna)\n    y solo al llegar al límite cambia la vista (hora → día → semana → mes; sin vista solo-año), sin recortar la\n    línea de tiempo global 2015-01-01 → 1 enero del año siguiente; el puntero ancla el scroll.\n    En hora la cinta sigue siendo ventana local. Opcional {"
                  },
                  "columnMaxWidthPx": {
                    "name": "columnMaxWidthPx",
                    "type": "number",
                    "required": false,
                    "description": "Ancho máximo en px de la columna Gantt si no defines `gantt.column.maxWidth`."
                  },
                  "modifierZoomGlobalStart": {
                    "name": "modifierZoomGlobalStart",
                    "type": "Date | string",
                    "required": false,
                    "description": "Inicio del rango global para zoom con modificador (sobrescribe 2015-01-01)."
                  },
                  "modifierZoomGlobalEnd": {
                    "name": "modifierZoomGlobalEnd",
                    "type": "Date | string",
                    "required": false,
                    "description": "Fin del rango global para zoom con modificador (sobrescribe el fin del año próximo)."
                  }
                }
              },
              "appearance": {
                "props": {
                  "trackMinHeightPx": {
                    "name": "trackMinHeightPx",
                    "type": "number",
                    "required": false
                  },
                  "trackClassName": {
                    "name": "trackClassName",
                    "type": "string",
                    "required": false
                  }
                }
              },
              "events": {
                "props": {
                  "onBarClick": {
                    "name": "onBarClick",
                    "type": "(payload: { row: RowConfig<T>",
                    "required": false
                  },
                  "bar": {
                    "name": "bar",
                    "type": "GhanttBarSegment }) => void",
                    "required": true
                  },
                  "onTimelineChange": {
                    "name": "onTimelineChange",
                    "type": "(timeline: GhanttTimelineProps) => void",
                    "required": false,
                    "description": "Notifica cambios de ventana/escala al usar zoom con modificador (p. ej. para persistir estado)."
                  }
                }
              }
            },
            "deprecatedRoot": [],
            "flat": {
              "columns": {
                "name": "columns",
                "type": "ColumnConfig<T>[]",
                "required": true
              },
              "rows": {
                "name": "rows",
                "type": "RowConfig<T>[]",
                "required": true
              },
              "loading": {
                "name": "loading",
                "type": "boolean",
                "required": false
              },
              "empty": {
                "name": "empty",
                "type": "EmptyState",
                "required": false
              },
              "selection": {
                "name": "selection",
                "type": "SelectionConfig",
                "required": false
              },
              "excludedRows": {
                "name": "excludedRows",
                "type": "ExcludedRowsConfig<T>",
                "required": false,
                "description": "Excluye filas de la selección por valor de un campo (ej. estado `archived`).\n    Solo aplica si `selection.enabled` es true."
              },
              "pagination": {
                "name": "pagination",
                "type": "PaginationConfig",
                "required": false
              },
              "toolbar": {
                "name": "toolbar",
                "type": "TableToolbarConfig",
                "required": false
              },
              "sort": {
                "name": "sort",
                "type": "SortConfig",
                "required": false
              },
              "filters": {
                "name": "filters",
                "type": "FilterConfig[]",
                "required": false
              },
              "expandable": {
                "name": "expandable",
                "type": "boolean",
                "required": false
              },
              "resizable": {
                "name": "resizable",
                "type": "boolean",
                "required": false
              },
              "columnsLockable": {
                "name": "columnsLockable",
                "type": "boolean",
                "required": false,
                "description": "Permite fijar/bloquear columnas desde la cabecera por defecto.\n    Si es `false`, ninguna columna es bloqueable salvo que definas `lockable: true` en esa `ColumnConfig`.\n    Si se omite, el comportamiento es el mismo que `true`."
              },
              "striped": {
                "name": "striped",
                "type": "boolean",
                "required": false
              },
              "bordered": {
                "name": "bordered",
                "type": "boolean",
                "required": false
              },
              "borderable": {
                "name": "borderable",
                "type": "boolean",
                "required": false,
                "description": "Muestra el borde exterior del contenedor de la tabla (borde, sombra y border-radius)."
              },
              "hoverable": {
                "name": "hoverable",
                "type": "boolean",
                "required": false
              },
              "dense": {
                "name": "dense",
                "type": "boolean",
                "required": false
              },
              "stickyHeader": {
                "name": "stickyHeader",
                "type": "boolean",
                "required": false
              },
              "defecto": {
                "name": "defecto",
                "type": "true si hay columnas editables)",
                "required": true
              },
              "stickyCheckbox": {
                "name": "stickyCheckbox",
                "type": "boolean",
                "required": false
              },
              "stickyActions": {
                "name": "stickyActions",
                "type": "boolean",
                "required": false
              },
              "showEditActions": {
                "name": "showEditActions",
                "type": "boolean",
                "required": false
              },
              "configKey": {
                "name": "configKey",
                "type": "string",
                "required": false,
                "description": "Clave única para guardar la configuración de la tabla en localStorage.\n    Si se proporciona, la configuración se persistirá automáticamente."
              },
              "persistConfig": {
                "name": "persistConfig",
                "type": "boolean",
                "required": false,
                "description": "Habilitar persistencia de configuración en localStorage.\n    Requiere que se proporcione `configKey`."
              },
              "queryPersist": {
                "name": "queryPersist",
                "type": "boolean",
                "required": false,
                "description": "Persistir también filtros activos y búsqueda en la misma configKey.\n    Solo aplica si `persistConfig` es true. Si es false, no se guardan ni cargan filtros ni búsqueda."
              },
              "onConfigChange": {
                "name": "onConfigChange",
                "type": "(config: TableConfigState, changeType: TableConfigChangeType) => void",
                "required": false,
                "description": "Callback cuando cambia la configuración de la tabla.\n    Se llama con la configuración completa y el tipo de cambio."
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "onSort": {
                "name": "onSort",
                "type": "(sort: SortConfig | undefined) => void",
                "required": false
              },
              "onFilter": {
                "name": "onFilter",
                "type": "(filters: FilterConfig[]) => void",
                "required": false
              },
              "onColumnResize": {
                "name": "onColumnResize",
                "type": "(columnId: string, width: number) => void",
                "required": false
              },
              "onColumnReorder": {
                "name": "onColumnReorder",
                "type": "(columns: ColumnConfig<T>[]) => void",
                "required": false
              },
              "onColumnVisibilityChange": {
                "name": "onColumnVisibilityChange",
                "type": "(columnId: string, visible: boolean) => void",
                "required": false
              },
              "onRowClick": {
                "name": "onRowClick",
                "type": "(row: RowConfig<T>) => void",
                "required": false
              },
              "onRowExpand": {
                "name": "onRowExpand",
                "type": "(row: RowConfig<T>) => void",
                "required": false
              },
              "onHandleChange": {
                "name": "onHandleChange",
                "type": "(rowId: string | number, columnId: string, value: unknown, row?: T) => void",
                "required": false
              },
              "editingRowIds": {
                "name": "editingRowIds",
                "type": "(string | number)[]",
                "required": false,
                "description": "IDs de filas que deben estar en modo edición.\n    Permite controlar desde fuera qué filas están editando.\n    Útil para activar múltiples filas en modo edición simultáneamente."
              },
              "onEditingRowIdsChange": {
                "name": "onEditingRowIdsChange",
                "type": "(editingRowIds: (string | number)[]) => void",
                "required": false,
                "description": "Callback cuando cambian los IDs de filas en modo edición.\n    Se llama cuando el usuario hace clic en el botón de editar/guardar de una fila.\n    Permite sincronizar el estado externo con las acciones internas de la tabla."
              },
              "onEditModeChange": {
                "name": "onEditModeChange",
                "type": "(rowId: string | number, isEditing: boolean) => void",
                "required": false,
                "description": "Callback cuando se habilita o se cierra el modo de edición de una fila.\n    Se ejecuta tanto cuando se habilita como cuando se cierra el modo de edición."
              },
              "onSuccessComplete": {
                "name": "onSuccessComplete",
                "type": "(editedRowIds: (string | number)[]) => void",
                "required": false,
                "description": "Callback cuando se cierra una o múltiples filas que fueron editadas.\n    Se ejecuta un solo evento al cerrar, mostrando un array con los IDs de todas las filas editadas que se están cerrando.\n    Solo se ejecuta si las filas fueron realmente editadas (se modificó alguna celda)."
              }
            }
          }
        },
        {
          "name": "GhanttTimelineHeader",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Tabla estándar con una columna Gantt. La API voluminosa va en el objeto",
            "jsdoc": "Nombre accesible del bloque de cabecera (no dibuja una tercera franja: la cabecera son **dos pisos**\nalineados al ancho de la columna).\n/\n  title?: string;\n  className?: string;\n}\n\n/**\nCabecera de la columna Gantt en **dos pisos** a ancho completo de la columna, alineados con el cuerpo:\n- **Piso 1:** agrupación temporal (meses en vista diaria/semanal, años en vista mensual). En vista **año** no hay piso superior (solo años en el piso inferior).\n- **Piso 2:** etiquetas de cada slot (días, semanas o meses según `timeline.scale`).\nPensado para usarse como `column.header` de la columna `gantt` (el `HeaderCell` la renderiza a ancho\ncompleto sin la fila de acciones de ordenar/filtrar).",
            "confidence": "high"
          },
          "examples": [
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>",
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "title": {
                "name": "title",
                "type": "string",
                "required": false,
                "description": "Nombre accesible del bloque de cabecera (no dibuja una tercera franja: la cabecera son dos pisos\n    alineados al ancho de la columna)."
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              }
            }
          }
        },
        {
          "name": "GhanttConfigProvider",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Tabla estándar con una columna Gantt. La API voluminosa va en el objeto",
            "confidence": "medium"
          },
          "examples": [
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>",
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "value": {
                "name": "value",
                "type": "GhanttConfigContextValue<T>",
                "required": true
              },
              "children": {
                "name": "children",
                "type": "ReactNode",
                "required": true
              }
            }
          }
        },
        {
          "name": "GHANTT_MODIFIER_ZOOM_MIN_SPAN_MS",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Tabla estándar con una columna Gantt. La API voluminosa va en el objeto",
            "jsdoc": "Inicio del rango global al hacer zoom con modificador (Cmd/Ctrl + rueda). */\nexport const GHANTT_MODIFIER_ZOOM_GLOBAL_START = '2015-01-01';\n\nconst MS_DAY = 86400000;\nconst MS_HOUR = 3600000;\n\n/**\nMitad de la ventana en escala `hour` (zoom por modificador / línea local): total ≈ 2× ms.\nAntes 24 h por lado (48 h); se sube a **100 h** por lado (**200 h** mínimo en cinta) para scroll + virtualización.\n/\nexport const GHANTT_MODIFIER_ZOOM_HOUR_HALF_MS = 100 * MS_HOUR;\n\n/** Fin exclusivo del rango global: hasta el fin de 2030. */\nexport function ghanttModifierZoomGlobalEndExclusive(): string {\n  return '2031-01-01';\n}\n\n/**\nOrden de escala con zoom por modificador: de más detalle (índice 0) a más agregada (índice 3).\nNo incluye `year` (solo años en la rejilla): el tope es `month` (mes + año en cad",
            "confidence": "high"
          },
          "examples": [
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>",
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>"
          ],
          "props": {
            "groups": {
              "ghanttAppearance": {
                "props": {
                  "trackMinHeightPx": {
                    "name": "trackMinHeightPx",
                    "type": "number",
                    "required": false
                  },
                  "trackClassName": {
                    "name": "trackClassName",
                    "type": "string",
                    "required": false
                  }
                }
              }
            },
            "deprecatedRoot": []
          }
        },
        {
          "name": "GHANTT_MODIFIER_ZOOM_GLOBAL_START",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Tabla estándar con una columna Gantt. La API voluminosa va en el objeto",
            "jsdoc": "Inicio del rango global al hacer zoom con modificador (Cmd/Ctrl + rueda).",
            "confidence": "high"
          },
          "examples": [
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>",
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>"
          ],
          "props": {
            "groups": {
              "ghanttAppearance": {
                "props": {
                  "trackMinHeightPx": {
                    "name": "trackMinHeightPx",
                    "type": "number",
                    "required": false
                  },
                  "trackClassName": {
                    "name": "trackClassName",
                    "type": "string",
                    "required": false
                  }
                }
              }
            },
            "deprecatedRoot": []
          }
        },
        {
          "name": "GHANTT_MODIFIER_ZOOM_HOUR_HALF_MS",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Tabla estándar con una columna Gantt. La API voluminosa va en el objeto",
            "jsdoc": "Inicio del rango global al hacer zoom con modificador (Cmd/Ctrl + rueda). */\nexport const GHANTT_MODIFIER_ZOOM_GLOBAL_START = '2015-01-01';\n\nconst MS_DAY = 86400000;\nconst MS_HOUR = 3600000;\n\n/**\nMitad de la ventana en escala `hour` (zoom por modificador / línea local): total ≈ 2× ms.\nAntes 24 h por lado (48 h); se sube a **100 h** por lado (**200 h** mínimo en cinta) para scroll + virtualización.",
            "confidence": "high"
          },
          "examples": [
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>",
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>"
          ],
          "props": {
            "groups": {
              "ghanttAppearance": {
                "props": {
                  "trackMinHeightPx": {
                    "name": "trackMinHeightPx",
                    "type": "number",
                    "required": false
                  },
                  "trackClassName": {
                    "name": "trackClassName",
                    "type": "string",
                    "required": false
                  }
                }
              }
            },
            "deprecatedRoot": []
          }
        },
        {
          "name": "GHANTT_MODIFIER_ZOOM_ORDER",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Tabla estándar con una columna Gantt. La API voluminosa va en el objeto",
            "jsdoc": "Inicio del rango global al hacer zoom con modificador (Cmd/Ctrl + rueda). */\nexport const GHANTT_MODIFIER_ZOOM_GLOBAL_START = '2015-01-01';\n\nconst MS_DAY = 86400000;\nconst MS_HOUR = 3600000;\n\n/**\nMitad de la ventana en escala `hour` (zoom por modificador / línea local): total ≈ 2× ms.\nAntes 24 h por lado (48 h); se sube a **100 h** por lado (**200 h** mínimo en cinta) para scroll + virtualización.\n/\nexport const GHANTT_MODIFIER_ZOOM_HOUR_HALF_MS = 100 * MS_HOUR;\n\n/** Fin exclusivo del rango global: hasta el fin de 2030. */\nexport function ghanttModifierZoomGlobalEndExclusive(): string {\n  return '2031-01-01';\n}\n\n/**\nOrden de escala con zoom por modificador: de más detalle (índice 0) a más agregada (índice 3).\nNo incluye `year` (solo años en la rejilla): el tope es `month` (mes + año en cad",
            "confidence": "high"
          },
          "examples": [
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>",
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>"
          ],
          "props": {
            "groups": {
              "ghanttAppearance": {
                "props": {
                  "trackMinHeightPx": {
                    "name": "trackMinHeightPx",
                    "type": "number",
                    "required": false
                  },
                  "trackClassName": {
                    "name": "trackClassName",
                    "type": "string",
                    "required": false
                  }
                }
              }
            },
            "deprecatedRoot": []
          }
        },
        {
          "name": "GhanttSlotStrip",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Tabla estándar con una columna Gantt. La API voluminosa va en el objeto",
            "confidence": "medium"
          },
          "examples": [
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>",
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "slots": {
                "name": "slots",
                "type": "readonly GhanttTimelineSlot[]",
                "required": true
              },
              "upperSegments": {
                "name": "upperSegments",
                "type": "readonly GhanttUpperSegment[]",
                "required": false,
                "description": "Segmentos mayores (meses, años) para dibujar la rejilla principal. Si se pasan, se ocultan las líneas de los slots individuales."
              },
              "variant": {
                "name": "variant",
                "type": "'header' | 'body'",
                "required": true,
                "description": "`header`: fondo de cabecera; `body`: transparente para heredar fila (selección, hijos, zebra)."
              },
              "renderSlot": {
                "name": "renderSlot",
                "type": "(slot: GhanttTimelineSlot) => ReactNode",
                "required": false,
                "description": "Contenido por celda de slot (cabecera con etiquetas). En cuerpo suele omitirse."
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "slotMinWidthPx": {
                "name": "slotMinWidthPx",
                "type": "number",
                "required": false,
                "description": "Ancho fijo por slot (px). Suele ir dentro de un contenedor con `overflow-x-auto` en la columna Gantt."
              },
              "densePatternMinSlots": {
                "name": "densePatternMinSlots",
                "type": "number",
                "required": false,
                "description": "Umbral para rejilla densa solo en cuerpo (gradiente repetido). La cabecera siempre usa una celda por slot."
              }
            }
          }
        },
        {
          "name": "GHANTT_DENSE_HEADER_MAX_LABELS",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Tabla estándar con una columna Gantt. La API voluminosa va en el objeto",
            "jsdoc": "A partir de este número de slots se usa una rejilla CSS (una sola capa) en lugar de un nodo por columna. */\nexport const GHANTT_DENSE_SLOT_GRID_MIN_SLOTS = 96;\n\n/**\nCon escala `hour` / `day` / `week` y al menos tantos slots, la **cabecera** (etiquetas por slot)\nvirtualiza celdas con {@link ghanttScrollVirtualIndexRange}. El **cuerpo** con ancho fijo usa una\nsola capa CSS (gradiente) para todos los días/semanas; no duplica esa lógica por fila.\n/\nexport const GHANTT_SCROLL_VIRTUAL_MIN_SLOTS = 120;\n\n/** @deprecated Usar {@link GHANTT_SCROLL_VIRTUAL_MIN_SLOTS}. */\nexport const GHANTT_HOUR_VIRTUAL_MIN_SLOTS = GHANTT_SCROLL_VIRTUAL_MIN_SLOTS;\n\nconst GHANTT_SCROLL_VIRTUAL_ACTIVE_MIN = 200;\nconst GHANTT_SCROLL_VIRTUAL_ACTIVE_MAX = 300;\n\n/**\nRango de índices de slots (misma anchura en px) a renderi",
            "confidence": "high"
          },
          "examples": [
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>",
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>"
          ],
          "props": {
            "groups": {
              "ghanttAppearance": {
                "props": {
                  "trackMinHeightPx": {
                    "name": "trackMinHeightPx",
                    "type": "number",
                    "required": false
                  },
                  "trackClassName": {
                    "name": "trackClassName",
                    "type": "string",
                    "required": false
                  }
                }
              }
            },
            "deprecatedRoot": []
          }
        },
        {
          "name": "GHANTT_DENSE_SLOT_GRID_MIN_SLOTS",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Tabla estándar con una columna Gantt. La API voluminosa va en el objeto",
            "jsdoc": "A partir de este número de slots se usa una rejilla CSS (una sola capa) en lugar de un nodo por columna.",
            "confidence": "high"
          },
          "examples": [
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>",
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>"
          ],
          "props": {
            "groups": {
              "ghanttAppearance": {
                "props": {
                  "trackMinHeightPx": {
                    "name": "trackMinHeightPx",
                    "type": "number",
                    "required": false
                  },
                  "trackClassName": {
                    "name": "trackClassName",
                    "type": "string",
                    "required": false
                  }
                }
              }
            },
            "deprecatedRoot": []
          }
        },
        {
          "name": "GHANTT_HOUR_VIRTUAL_MIN_SLOTS",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Tabla estándar con una columna Gantt. La API voluminosa va en el objeto",
            "jsdoc": "A partir de este número de slots se usa una rejilla CSS (una sola capa) en lugar de un nodo por columna. */\nexport const GHANTT_DENSE_SLOT_GRID_MIN_SLOTS = 96;\n\n/**\nCon escala `hour` / `day` / `week` y al menos tantos slots, la **cabecera** (etiquetas por slot)\nvirtualiza celdas con {@link ghanttScrollVirtualIndexRange}. El **cuerpo** con ancho fijo usa una\nsola capa CSS (gradiente) para todos los días/semanas; no duplica esa lógica por fila.\n/\nexport const GHANTT_SCROLL_VIRTUAL_MIN_SLOTS = 120;\n\n/** @deprecated Usar {@link GHANTT_SCROLL_VIRTUAL_MIN_SLOTS}.",
            "confidence": "high"
          },
          "examples": [
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>",
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>"
          ],
          "props": {
            "groups": {
              "ghanttAppearance": {
                "props": {
                  "trackMinHeightPx": {
                    "name": "trackMinHeightPx",
                    "type": "number",
                    "required": false
                  },
                  "trackClassName": {
                    "name": "trackClassName",
                    "type": "string",
                    "required": false
                  }
                }
              }
            },
            "deprecatedRoot": []
          }
        },
        {
          "name": "GHANTT_SCROLL_VIRTUAL_MIN_SLOTS",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Tabla estándar con una columna Gantt. La API voluminosa va en el objeto",
            "jsdoc": "A partir de este número de slots se usa una rejilla CSS (una sola capa) en lugar de un nodo por columna. */\nexport const GHANTT_DENSE_SLOT_GRID_MIN_SLOTS = 96;\n\n/**\nCon escala `hour` / `day` / `week` y al menos tantos slots, la **cabecera** (etiquetas por slot)\nvirtualiza celdas con {@link ghanttScrollVirtualIndexRange}. El **cuerpo** con ancho fijo usa una\nsola capa CSS (gradiente) para todos los días/semanas; no duplica esa lógica por fila.",
            "confidence": "high"
          },
          "examples": [
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>",
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>"
          ],
          "props": {
            "groups": {
              "ghanttAppearance": {
                "props": {
                  "trackMinHeightPx": {
                    "name": "trackMinHeightPx",
                    "type": "number",
                    "required": false
                  },
                  "trackClassName": {
                    "name": "trackClassName",
                    "type": "string",
                    "required": false
                  }
                }
              }
            },
            "deprecatedRoot": []
          }
        },
        {
          "name": "GHANTT_TIMELINE_HEADER_STACK_HEIGHT_PX",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Tabla estándar con una columna Gantt. La API voluminosa va en el objeto",
            "jsdoc": "Altura total (px) del bloque de **dos filas** de la cabecera temporal del Gantt (alineado con cabecera\nde tabla en Figma, ~49px). Cada fila ocupa la mitad (`1fr` / `1fr`).",
            "confidence": "high"
          },
          "examples": [
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>",
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>"
          ],
          "props": {
            "groups": {
              "ghanttAppearance": {
                "props": {
                  "trackMinHeightPx": {
                    "name": "trackMinHeightPx",
                    "type": "number",
                    "required": false
                  },
                  "trackClassName": {
                    "name": "trackClassName",
                    "type": "string",
                    "required": false
                  }
                }
              }
            },
            "deprecatedRoot": []
          }
        },
        {
          "name": "GHANTT_DEFAULT_COLUMN_ID",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Tabla estándar con una columna Gantt. La API voluminosa va en el objeto",
            "confidence": "medium"
          },
          "examples": [
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>",
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>"
          ],
          "props": {
            "groups": {
              "ghanttAppearance": {
                "props": {
                  "trackMinHeightPx": {
                    "name": "trackMinHeightPx",
                    "type": "number",
                    "required": false
                  },
                  "trackClassName": {
                    "name": "trackClassName",
                    "type": "string",
                    "required": false
                  }
                }
              }
            },
            "deprecatedRoot": []
          }
        },
        {
          "name": "DEFAULT_GHANTT_COLUMN_MAX_WIDTH_PX",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Tabla estándar con una columna Gantt. La API voluminosa va en el objeto",
            "jsdoc": "Ancho máximo por defecto de la columna Gantt (px). Sustituible con `gantt.column.maxWidth` o `timeline.columnMaxWidthPx`.",
            "confidence": "high"
          },
          "examples": [
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>",
            "import { Ghantt, GhanttTimelineHeader } from '@/modules/Ghantt';\n\n<Ghantt\n  columns={columns}\n  rows={rows}\n  borderable\n  gantt={{\n    column: {\n      header: <GhanttTimelineHeader title=\"Plan\" />,\n      width: 480,\n    },\n    data: { accessor: (row) => row.plan },\n    timeline: { viewStart: '2026-04-01', viewEnd: '2026-04-22', scale: 'day' },\n    events: {\n      onBarClick: ({ bar, row }) => console.log(bar.id, row.id),\n    },\n  }}\n/>"
          ],
          "props": {
            "groups": {
              "ghanttAppearance": {
                "props": {
                  "trackMinHeightPx": {
                    "name": "trackMinHeightPx",
                    "type": "number",
                    "required": false
                  },
                  "trackClassName": {
                    "name": "trackClassName",
                    "type": "string",
                    "required": false
                  }
                }
              }
            },
            "deprecatedRoot": []
          }
        }
      ]
    },
    {
      "id": "Header",
      "path": "src/modules/Header",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Header",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "confidence": "low"
          },
          "examples": [
            "import { Header } from \"@imj_me/ui\";\n\nconst sampleFilters = [\n  {\n    label: 'Estado',\n    value: 'estado',\n    options: [\n      { label: 'Activo', value: 'activo', icon: faCheck },\n      { label: 'Inactivo', value: 'inactivo', icon: faMinus },\n    ],\n    icon: faFilter,\n    placeholder: 'Estado',\n    type: 'dropdown',\n  },\n  {\n    label: 'Tipo',\n    value: 'tipo',\n    options: [\n      { label: 'Plantilla', value: 'plantilla', icon: faList },\n      { label: 'Tarea', value: 'tarea', icon: faTasks },\n    ],\n    icon: faFilter,\n    placeholder: 'Tipo',\n    type: 'dropdown',\n  },\n  {\n    label: 'Tareas',\n    value: 'tareas',\n    options: [\n      { label: 'Todas', value: 'todas', icon: faList },\n      { label: 'Completadas', value: 'completadas', icon: faTasks },\n      { label: 'Pendientes', value: 'pendientes', icon: faTasks },\n      { label: 'Canceladas', value: 'canceladas', icon: faTasks },\n    ],\n    icon: faFilter,\n    placeholder: 'Tareas',\n    type: 'multiple',\n  },\n  {\n    label: 'Fecha',\n    value: 'fecha',\n    type: 'date',\n  },\n  {\n    label: 'Buscar',\n    type: 'input',\n    placeholder: 'Buscar',\n  },\n  {\n    label: 'Descripción',\n    type: 'textarea',\n    placeholder: 'Descripción',\n  },\n];\n\nfunction Example() {\n    return (\n        <Header\n            title=\"Plantillas\"\n            filters={sampleFilters}\n            onClear={() => console.log('Filtros limpiados')}\n            onApply={(filters) => console.log('Filtros aplicados:', filters)}\n        />\n    );\n}",
            "import { Header } from \"@imj_me/ui\";\n\n// Sin filtros - array vacío\nconst noFilters = [];\n\nfunction Example() {\n    return (\n        <Header\n            title=\"Dashboard\"\n            icon={faHome}\n            showFilters={false}\n            filters={noFilters}\n        />\n    );\n}",
            "import { Header } from \"@imj_me/ui\";\n\nconst simpleFilters = [\n  {\n    label: 'Estado',\n    type: 'dropdown',\n    options: [\n      { label: 'Activo', value: 'activo' },\n      { label: 'Inactivo', value: 'inactivo' },\n    ],\n  },\n  {\n    label: 'Buscar',\n    type: 'input',\n    placeholder: 'Buscar...',\n  },\n];\n\nfunction Example() {\n    return (\n        <Header\n            title=\"Usuarios\"\n            icon={faUser}\n            showViewMode={false}\n            filters={simpleFilters}\n            onClear={() => console.log('Filtros limpiados')}\n            onApply={(filters) => console.log('Filtros aplicados:', filters)}\n        />\n    );\n}",
            "import { Header } from \"@imj_me/ui\";\n\nconst simpleFilters = [\n  {\n    label: 'Estado',\n    type: 'dropdown',\n    options: [\n      { label: 'Activo', value: 'activo' },\n      { label: 'Inactivo', value: 'inactivo' },\n    ],\n  },\n  {\n    label: 'Buscar',\n    type: 'input',\n    placeholder: 'Buscar...',\n  },\n];\n\nfunction Example() {\n    return (\n        <Header\n            title=\"Galería\"\n            icon={faGrid}\n            viewMode=\"grid\"\n            filters={simpleFilters}\n            onClear={() => console.log('Filtros limpiados')}\n            onApply={(filters) => console.log('Filtros aplicados:', filters)}\n        />\n    );\n}",
            "import { Header } from \"@imj_me/ui\";\n\nconst simpleFilters = [\n  {\n    label: 'Estado',\n    type: 'dropdown',\n    options: [\n      { label: 'Activo', value: 'activo' },\n      { label: 'Inactivo', value: 'inactivo' },\n    ],\n  },\n  {\n    label: 'Buscar',\n    type: 'input',\n    placeholder: 'Buscar...',\n  },\n];\n\nfunction Example() {\n    return (\n        <Header\n            title=\"Configuración\"\n            icon={faSliders}\n            filters={simpleFilters}\n            onClear={() => console.log('Filtros limpiados')}\n            onApply={(filters) => console.log('Filtros aplicados:', filters)}\n        />\n    );\n}"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "title": {
                "name": "title",
                "type": "string",
                "required": true
              },
              "icon": {
                "name": "icon",
                "type": "IconType",
                "required": false
              },
              "viewMode": {
                "name": "viewMode",
                "type": "'list' | 'grid'",
                "required": false
              },
              "showViewMode": {
                "name": "showViewMode",
                "type": "boolean",
                "required": false
              },
              "showFilters": {
                "name": "showFilters",
                "type": "boolean",
                "required": false
              },
              "onViewModeChange": {
                "name": "onViewModeChange",
                "type": "(viewMode: 'list' | 'grid') => void",
                "required": false
              },
              "filters": {
                "name": "filters",
                "type": "Filter[]",
                "required": false
              },
              "onApply": {
                "name": "onApply",
                "type": "(filterStates: Record<string, FilterValue>) => void",
                "required": false
              },
              "onClear": {
                "name": "onClear",
                "type": "() => void",
                "required": false
              },
              "size": {
                "name": "size",
                "type": "InputSize",
                "required": false
              }
            }
          }
        }
      ]
    },
    {
      "id": "Icon",
      "path": "src/modules/Icon",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Icon",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Icon permite mostrar iconos del sistema de diseño con diferentes tamaños y colores.",
            "readme": "# Icon Component\n\nEl componente `Icon` permite mostrar iconos SVG con diferentes tamaños, colores y variantes.\n\n## Características\n\n- ✅ Soporte para iconos outline y fill\n- ✅ Múltiples tamaños predefinidos\n- ✅ Sistema de colores consistente\n- ✅ Tipado completo con TypeScript\n- ✅ Compatible con Storybook\n\n## Uso Básico\n\n```tsx\nimport { Icon } from '@your-org/ui';\n\nfunction MyComponent() {\n  return <Icon name=\"OutlineEyeIcon\" variant=\"outline\" size=\"md\" color=\"primary\" />;\n}\n```\n\n## Props\n\n| Prop        | Tipo                                            | Por defecto | Descripción                            |\n| ----------- | ----------------------------------------------- | ----------- | -------------------------------------- |\n| `name`      | `IconType`                                      | -           | Nombre del icono a mostrar (requerido) |\n| `variant`   | `'outline' \\| 'fill'`                           | `'outline'` | Variante del icono                     |\n| `size`      | `'xs' \\| 'sm' \\| 'md' \\| 'lg' \\| 'xl' \\| '2xl'` | `'md'`      | Tamaño del icono                       |\n| `color`     | `IconColor`                                     | `'primary'` | Color del icono                        |\n| `className` | `string`                                        | -           | Clases CSS adicionales                 |\n| `svgProps`  | `React.SVGProps<SVGSVGElement>`                 | `{}`        | Propiedades adicionales del SVG        |\n\n## Tamaños\n\n| Tamaño | Píxeles |\n| ------ | ------- |\n| `xs`   | 12px    |\n| `sm`   | 16px    |\n| `md`   | 20px    |\n| `lg`   | 24px    |\n| `xl`   | 32px    |\n| `2xl`  | 48px    |\n\n## Colores Disponibles\n\n- `primary` - Color primario\n- `secondary` - Color secundario\n- `danger` - Color de peligro/error\n- `success` - Color de éxito\n- `warning` - Color de advertencia\n- `info` - Color informativo\n- `alert` - Color de alerta\n\n## Ejemplos\n\n### Iconos Outline\n\n```tsx\n<div className=\"flex gap-4\">\n  <Icon name=\"OutlineEyeIcon\" variant=\"outli",
            "confidence": "high"
          },
          "examples": [
            "import { Icon } from '@/modules/Icon';\n  import { faEye } from '@fortawesome/pro-regular-svg-icons';\n\n  export default function Example() {\n    return <Icon name={faEye} />\n  }",
            "import { Icon } from '@/modules/Icon';\nimport { faHeart, faStar } from '@fortawesome/pro-duotone-svg-icons';\n\nexport default function DuotoneExample() {\n  return (\n    <>\n      {/* Colores semánticos */}\n      <Icon\n        name={faCheckCircle}\n        size=\"xl\"\n        colorDuotonePrimary=\"success\"\n        colorDuotoneSecondary=\"green\"\n        opacityDuotonePrimary={1}\n        opacityDuotoneSecondary={0.4}\n      />\n\n      {/* Combinaciones creativas */}\n      <Icon\n        name={faTrash}\n        size=\"xl\"\n        colorDuotonePrimary=\"rose\"\n        colorDuotoneSecondary=\"magenta\"\n        opacityDuotonePrimary={1}\n        opacityDuotoneSecondary={0.3}\n      />\n\n      {/* Diferentes opacidades */}\n      <Icon\n        name={faPalette}\n        size=\"xl\"\n        colorDuotonePrimary=\"blue\"\n        colorDuotoneSecondary=\"cyan\"\n        opacityDuotonePrimary={1}\n        opacityDuotoneSecondary={0.6}\n      />\n    </>\n  );\n}",
            "import { faEye } from '@fortawesome/pro-regular-svg-icons';\n\n<Icon name={faEye} size=\"xs\" color=\"blue\" />\n<Icon name={faEye} size=\"sm\" color=\"blue\" />\n<Icon name={faEye} size=\"md\" color=\"blue\" />\n<Icon name={faEye} size=\"lg\" color=\"blue\" />",
            "import { faEye } from '@fortawesome/pro-regular-svg-icons';\n\n<Icon name={faEye} size=\"lg\" color=\"blue\" />\n<Icon name={faEye} size=\"lg\" color=\"default\" />\n<Icon name={faEye} size=\"lg\" color=\"red\" />\n<Icon name={faEye} size=\"lg\" color=\"green\" />\n<Icon name={faEye} size=\"lg\" color=\"yellow\" />\n<Icon name={faEye} size=\"lg\" color=\"current\" />\n<Icon name={faEye} size=\"lg\" color=\"brand\" />",
            "import { faHome, faSearch, faBell, faUser, faCog, faStar } from '@fortawesome/pro-regular-svg-icons';\n\n<Icon name={faHome} size=\"md\" color=\"blue\" />\n<Icon name={faSearch} size=\"md\" color=\"default\" />\n<Icon name={faBell} size=\"md\" color=\"red\" />\n<Icon name={faUser} size=\"md\" color=\"green\" />\n<Icon name={faCog} size=\"md\" color=\"yellow\" />\n<Icon name={faStar} size=\"md\" color=\"blue\" />"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "name": {
                "name": "name",
                "type": "AnyIconDefinition",
                "required": true,
                "description": "Nombre del icono a mostrar"
              },
              "size": {
                "name": "size",
                "type": "IconFontSize",
                "required": false,
                "description": "Tamaño del icono"
              },
              "color": {
                "name": "color",
                "type": "IconFontColor",
                "required": false,
                "description": "Color del icono"
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clases CSS adicionales"
              },
              "onClick": {
                "name": "onClick",
                "type": "(e: React.MouseEvent<HTMLDivElement>) => void",
                "required": false
              },
              "background": {
                "name": "background",
                "type": "boolean",
                "required": false,
                "description": "Si el icono tiene un fondo"
              },
              "backgroundColor": {
                "name": "backgroundColor",
                "type": "IconBackgroundColor",
                "required": false,
                "description": "Color del fondo: semánticos (`success`, `danger`, `white`, `blue`, …) o clase `ui-bg-`."
              },
              "backgroundSize": {
                "name": "backgroundSize",
                "type": "VisualSize",
                "required": false,
                "description": "Tamaño del fondo del icono"
              },
              "padding": {
                "name": "padding",
                "type": "'none' | 'xxs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'",
                "required": false
              },
              "style": {
                "name": "style",
                "type": "React.CSSProperties & Record<string, unknown>",
                "required": false
              },
              "colorDuotonePrimary": {
                "name": "colorDuotonePrimary",
                "type": "IconFontColor",
                "required": false
              },
              "colorDuotoneSecondary": {
                "name": "colorDuotoneSecondary",
                "type": "IconFontColor",
                "required": false
              },
              "opacityDuotonePrimary": {
                "name": "opacityDuotonePrimary",
                "type": "number",
                "required": false
              },
              "opacityDuotoneSecondary": {
                "name": "opacityDuotoneSecondary",
                "type": "number",
                "required": false
              }
            }
          }
        }
      ]
    },
    {
      "id": "IconFont",
      "path": "src/modules/IconFont",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "IconFont",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "confidence": "low"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "icon": {
                "name": "icon",
                "type": "AnyIconDefinition",
                "required": true
              },
              "size": {
                "name": "size",
                "type": "IconFontSize",
                "required": false
              },
              "style": {
                "name": "style",
                "type": "React.CSSProperties & Record<string, unknown>",
                "required": false
              },
              "color": {
                "name": "color",
                "type": "IconFontColor",
                "required": false
              },
              "onClick": {
                "name": "onClick",
                "type": "(e: React.MouseEvent<HTMLDivElement>) => void",
                "required": false
              },
              "colorDuotonePrimary": {
                "name": "colorDuotonePrimary",
                "type": "IconFontColor",
                "required": false
              },
              "colorDuotoneSecondary": {
                "name": "colorDuotoneSecondary",
                "type": "IconFontColor",
                "required": false
              },
              "opacityDuotonePrimary": {
                "name": "opacityDuotonePrimary",
                "type": "number",
                "required": false
              },
              "opacityDuotoneSecondary": {
                "name": "opacityDuotoneSecondary",
                "type": "number",
                "required": false
              },
              "background": {
                "name": "background",
                "type": "boolean",
                "required": false
              },
              "backgroundColor": {
                "name": "backgroundColor",
                "type": "IconBackgroundColor",
                "required": false
              },
              "backgroundSize": {
                "name": "backgroundSize",
                "type": "VisualSize",
                "required": false
              },
              "padding": {
                "name": "padding",
                "type": "'none' | 'xxs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'",
                "required": false
              }
            }
          }
        }
      ]
    },
    {
      "id": "InnerButton",
      "path": "src/modules/InnerButton",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "InnerButton",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Button permite a los usuarios realizar acciones y tomar decisiones con un solo toque.",
            "confidence": "medium"
          },
          "examples": [
            "import { InnerButton } from '@imj_media/ui';\n\n  export default function Example() {\n    return (\n      <>\n        <InnerButton color=\"primary\">Blue</InnerButton>\n        <InnerButton color=\"secondary\">Red</InnerButton>\n        <InnerButton color=\"tertiary\">Green</InnerButton>\n        <InnerButton color=\"destructive\">Orange</InnerButton>\n        <InnerButton color=\"primary\">White</InnerButton>\n      </>\n    )\n  }",
            "import { InnerButton } from '@imj_media/ui';\n\n  export default function Example() {\n    return (\n      <>\n        <InnerButton color=\"primary\">Blue</InnerButton>\n        <InnerButton color=\"secondary\">Red</InnerButton>\n        <InnerButton color=\"tertiary\">Green</InnerButton>\n        <InnerButton color=\"destructive\">Orange</InnerButton>\n        <InnerButton color=\"primary\">White</InnerButton>\n      </>\n    )\n  }",
            "import { InnerButton } from '@imj_media/ui';\n\n  export default function Example() {\n    return (\n      <>\n        <div className=\"ui-flex ui-flex-wrap ui-gap-8\">\n          <InnerButton color=\"primary\" icon={faImage} />\n          <InnerButton color=\"secondary\" icon={faImage} />\n          <InnerButton color=\"tertiary\" icon={faImage} />\n          <InnerButton color=\"destructive\" icon={faImage} />\n        </div>\n        <div className=\"ui-flex ui-flex-wrap ui-gap-8\">\n          <InnerButton color=\"primary\" icon={faImage} pill=\"xs\" />\n          <InnerButton color=\"secondary\" icon={faImage} pill=\"xs\" />\n          <InnerButton color=\"tertiary\" icon={faImage} pill=\"xs\" />\n          <InnerButton color=\"destructive\" icon={faImage} pill=\"xs\" />\n        </div>\n        <div className=\"ui-flex ui-flex-wrap ui-gap-8\">\n          <InnerButton color=\"primary\" icon={faImage} pill=\"sm\" />\n          <InnerButton color=\"secondary\" icon={faImage} pill=\"sm\" />\n          <InnerButton color=\"tertiary\" icon={faImage} pill=\"sm\" />\n          <InnerButton color=\"destructive\" icon={faImage} pill=\"sm\" />\n        </div>\n        <div className=\"ui-flex ui-flex-wrap ui-gap-8\">\n          <InnerButton color=\"primary\" icon={faImage} pill=\"md\" />\n          <InnerButton color=\"secondary\" icon={faImage} pill=\"md\" />\n          <InnerButton color=\"tertiary\" icon={faImage} pill=\"md\" />\n          <InnerButton color=\"destructive\" icon={faImage} pill=\"md\" />\n        </div>\n        <div className=\"ui-flex ui-flex-wrap ui-gap-8\">\n          <InnerButton color=\"primary\" icon={faImage} pill=\"lg\" />\n          <InnerButton color=\"secondary\" icon={faImage} pill=\"lg\" />\n          <InnerButton color=\"tertiary\" icon={faImage} pill=\"lg\" />\n          <InnerButton color=\"destructive\" icon={faImage} pill=\"lg\" />\n        </div>\n        <div className=\"ui-flex ui-flex-wrap ui-gap-8\">\n          <InnerButton color=\"primary\" icon={faImage} pill=\"pill\" />\n          <InnerButton color=\"secondary\" icon={faImage} pill=\"pill\" />\n          <InnerButton color=\"tertiary\" icon={faImage} pill=\"pill\" />\n          <InnerButton color=\"destructive\" icon={faImage} pill=\"pill\" />\n        </div>\n      </>\n    )\n  }",
            "import { InnerButton } from '@imj_media/ui';\n\n  export default function Example() {\n    return (\n      <>\n        <InnerButton color=\"primary\" tooltip=\"Tooltip\">Blue</InnerButton>\n        <InnerButton color=\"secondary\" tooltip=\"Tooltip\">Red</InnerButton>\n        <InnerButton color=\"tertiary\" tooltip=\"Tooltip\">Green</InnerButton>\n        <InnerButton color=\"destructive\" tooltip=\"Tooltip\">Orange</InnerButton>\n        <InnerButton color=\"primary\" tooltip=\"Tooltip\">White</InnerButton>\n      </>\n    )\n  }",
            "<InnerButton color=\"primary\" theme='solid'>\n            Primary\n          </InnerButton>"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [
              {
                "name": "badgeColor",
                "migrateTo": "`badge",
                "type": "BadgeColor"
              },
              {
                "name": "badgeLabel",
                "migrateTo": "`badge",
                "type": "string"
              },
              {
                "name": "badgeIcon",
                "migrateTo": "`badge",
                "type": "IconType | AnyIconDefinition"
              },
              {
                "name": "badgeLoading",
                "migrateTo": "`badge",
                "jsdoc": "Si es true, muestra un spinner de carga en el badge.",
                "type": "boolean"
              },
              {
                "name": "colorIcon",
                "migrateTo": "`iconProps",
                "type": "IconFontColor"
              },
              {
                "name": "iconDuotonePrimary",
                "migrateTo": "iconProps",
                "type": "IconFontColor"
              },
              {
                "name": "iconDuotoneSecondary",
                "migrateTo": "iconProps",
                "type": "IconFontColor"
              },
              {
                "name": "iconDuotoneOpacityPrimary",
                "migrateTo": "iconProps",
                "type": "number"
              },
              {
                "name": "iconDuotoneOpacitySecondary",
                "migrateTo": "iconProps",
                "type": "number"
              },
              {
                "name": "leftSlotDuotonePrimary",
                "migrateTo": "leftSlotProps",
                "type": "IconFontColor"
              },
              {
                "name": "leftSlotDuotoneSecondary",
                "migrateTo": "leftSlotProps",
                "type": "IconFontColor"
              },
              {
                "name": "leftSlotDuotoneOpacityPrimary",
                "migrateTo": "leftSlotProps",
                "type": "number"
              },
              {
                "name": "leftSlotDuotoneOpacitySecondary",
                "migrateTo": "leftSlotProps",
                "type": "number"
              },
              {
                "name": "rightSlotDuotonePrimary",
                "migrateTo": "rightSlotProps",
                "type": "IconFontColor"
              },
              {
                "name": "rightSlotDuotoneSecondary",
                "migrateTo": "rightSlotProps",
                "type": "IconFontColor"
              },
              {
                "name": "rightSlotDuotoneOpacityPrimary",
                "migrateTo": "rightSlotProps",
                "type": "number"
              },
              {
                "name": "rightSlotDuotoneOpacitySecondary",
                "migrateTo": "rightSlotProps",
                "type": "number"
              },
              {
                "name": "onClickIcon",
                "migrateTo": "`iconProps",
                "type": "(e: React.MouseEvent<HTMLDivElement>) => void"
              },
              {
                "name": "onClickLeftSlot",
                "migrateTo": "`leftSlotProps",
                "type": "(e: React.MouseEvent<HTMLDivElement>) => void"
              },
              {
                "name": "onClickRightSlot",
                "migrateTo": "`rightSlotProps",
                "type": "(e: React.MouseEvent<HTMLDivElement>) => void"
              },
              {
                "name": "tooltipPosition",
                "migrateTo": "tooltip como objeto o tooltipProps",
                "type": "TooltipPosition"
              },
              {
                "name": "tooltipAlignment",
                "migrateTo": "tooltip como objeto o tooltipProps",
                "type": "TooltipAlignment"
              },
              {
                "name": "tooltipColor",
                "migrateTo": "tooltip como objeto o tooltipProps",
                "type": "TooltipColors"
              },
              {
                "name": "tooltipDelay",
                "migrateTo": "tooltip como objeto o tooltipProps",
                "type": "number"
              },
              {
                "name": "tooltipAbsolute",
                "migrateTo": "tooltip como objeto o tooltipProps",
                "type": "boolean"
              },
              {
                "name": "defaultTooltipColor",
                "migrateTo": "tooltip como objeto o tooltipProps",
                "type": "boolean"
              },
              {
                "name": "classNameTooltip",
                "migrateTo": "tooltip como objeto o tooltipProps",
                "type": "string"
              },
              {
                "name": "classNameIcon",
                "migrateTo": "`iconProps",
                "type": "string"
              }
            ],
            "flat": {
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false
              },
              "classNameLabel": {
                "name": "classNameLabel",
                "type": "string",
                "required": false
              },
              "theme": {
                "name": "theme",
                "type": "ButtonTheme",
                "required": false,
                "description": "Tema visual del botón (`solid` o variante `icon` deprecada).\n    Preferir `solid` y botón solo icono vía `icon` + sin `children`."
              },
              "rounded": {
                "name": "rounded",
                "type": "boolean",
                "required": false
              },
              "clickable": {
                "name": "clickable",
                "type": "boolean",
                "required": false
              },
              "square": {
                "name": "square",
                "type": "boolean",
                "required": false
              },
              "badgeTheme": {
                "name": "badgeTheme",
                "type": "BadgeTheme",
                "required": false
              },
              "badgeSize": {
                "name": "badgeSize",
                "type": "BadgeSize",
                "required": false
              },
              "badgeStroke": {
                "name": "badgeStroke",
                "type": "boolean",
                "required": false
              },
              "badgeIconDuotonePrimary": {
                "name": "badgeIconDuotonePrimary",
                "type": "IconFontColor",
                "required": false
              },
              "badgeIconDuotoneSecondary": {
                "name": "badgeIconDuotoneSecondary",
                "type": "IconFontColor",
                "required": false
              },
              "badgeIconDuotoneOpacityPrimary": {
                "name": "badgeIconDuotoneOpacityPrimary",
                "type": "number",
                "required": false
              },
              "badgeIconDuotoneOpacitySecondary": {
                "name": "badgeIconDuotoneOpacitySecondary",
                "type": "number",
                "required": false
              },
              "color": {
                "name": "color",
                "type": "ButtonColors",
                "required": false
              },
              "icon": {
                "name": "icon",
                "type": "VisualSlotType | React.ReactElement | ButtonIconConfig",
                "required": false,
                "description": "Icono principal del botón.\n    Puede ser un string simple (ej: \"ImageOutlined\"), un ReactElement, o un objeto de configuración completo.\n    Si se usa como string simple (sin estilos personalizados), funciona sin deprecación.\n    Si se usa como objeto de configuración, tiene la misma funcionalidad que iconProps.\n    Para estilos personalizados con props separadas, usar iconProps."
              },
              "DEPRECADAS": {
                "name": "DEPRECADAS",
                "type": "usar tooltip como objeto o tooltipProps en su lugar",
                "required": true
              },
              "leftSlot": {
                "name": "leftSlot",
                "type": "VisualSlotType | ButtonSlotConfig",
                "required": false,
                "description": "Slot izquierdo del botón.\n    Puede ser un string simple (ej: \"EditOutlined\"), un ReactElement, o un objeto de configuración completo.\n    Si se usa como string simple (sin estilos personalizados), funciona sin deprecación.\n    Si se usa como objeto de configuración, tiene la misma funcionalidad que leftSlotProps.\n    Para estilos personalizados con props separadas, usar leftSlotProps."
              },
              "rightSlot": {
                "name": "rightSlot",
                "type": "VisualSlotType | ButtonSlotConfig",
                "required": false,
                "description": "Slot derecho del botón.\n    Puede ser un string simple (ej: \"ArrowRightOutlined\"), un ReactElement, o un objeto de configuración completo.\n    Si se usa como string simple (sin estilos personalizados), funciona sin deprecación.\n    Si se usa como objeto de configuración, tiene la misma funcionalidad que rightSlotProps.\n    Para estilos personalizados con props separadas, usar rightSlotProps."
              },
              "fullWidth": {
                "name": "fullWidth",
                "type": "boolean",
                "required": false
              },
              "size": {
                "name": "size",
                "type": "'xxs' | 'xs' | 'sm' | 'md' | 'lg'",
                "required": false
              },
              "iconSizeExtended": {
                "name": "iconSizeExtended",
                "type": "'none' | VisualSize",
                "required": false
              },
              "link": {
                "name": "link",
                "type": "string",
                "required": false
              },
              "borderable": {
                "name": "borderable",
                "type": "boolean | undefined",
                "required": false
              },
              "target": {
                "name": "target",
                "type": "string",
                "required": false
              },
              "type": {
                "name": "type",
                "type": "React.ButtonHTMLAttributes<HTMLButtonElement>['type']",
                "required": false,
                "description": "Atributo nativo `type` del `<button>` (`button`, `submit`, `reset`).\n    Solo aplica cuando el componente se renderiza como `<button>` (sin `link`, y `as` distinto de `div`)."
              },
              "defaultSizeIcon": {
                "name": "defaultSizeIcon",
                "type": "boolean",
                "required": false
              },
              "as": {
                "name": "as",
                "type": "'button' | 'div'",
                "required": false
              },
              "classNameId": {
                "name": "classNameId",
                "type": "string",
                "required": false
              },
              "showShadow": {
                "name": "showShadow",
                "type": "boolean",
                "required": false
              },
              "tooltip": {
                "name": "tooltip",
                "type": "string | ButtonTooltipConfig",
                "required": false,
                "description": "Tooltip del botón.\n    Puede ser un string simple o un objeto de configuración completo.\n    Si se usa como string simple (sin estilos personalizados), funciona sin deprecación.\n    Si se usa como objeto de configuración, tiene la misma funcionalidad que tooltipProps.\n    Para estilos personalizados con props separadas, usar tooltipProps."
              },
              "stopPropagation": {
                "name": "stopPropagation",
                "type": "boolean",
                "required": false
              },
              "pointer": {
                "name": "pointer",
                "type": "boolean",
                "required": false
              },
              "textColor": {
                "name": "textColor",
                "type": "ButtonColors",
                "required": false
              },
              "textAlign": {
                "name": "textAlign",
                "type": "'left' | 'center' | 'right'",
                "required": false
              },
              "slotLayout": {
                "name": "slotLayout",
                "type": "ButtonSlotLayout",
                "required": false,
                "description": "Distribución de `leftSlot` / `rightSlot` respecto al texto.\n    - `inline` (por defecto): iconos y texto forman un grupo centrado (comportamiento histórico).\n    - `{ var: 'spread', textAlign? }`: iconos en extremos; el bloque de texto usa `textAlign` (`left` | `center` | `right`).\n      Si omites `textAlign` en el objeto, se usa heurística: ambos slots → `center`; solo izquierda → `right`; solo derecha → `left`.\n    La prop raíz `textAlign` del botón, si se define, tiene prioridad sobre `slotLayout.textAlign`."
              },
              "whiteBackground": {
                "name": "whiteBackground",
                "type": "boolean",
                "required": false
              },
              "strokeWidth": {
                "name": "strokeWidth",
                "type": "number",
                "required": false
              },
              "transition": {
                "name": "transition",
                "type": "boolean",
                "required": false
              },
              "pill": {
                "name": "pill",
                "type": "PillSize",
                "required": false
              },
              "active": {
                "name": "active",
                "type": "boolean",
                "required": false
              },
              "hoverText": {
                "name": "hoverText",
                "type": "string",
                "required": false,
                "description": "Texto que se muestra al hacer hover sobre el botón. Solo funciona cuando el badge termina de cargar (badgeLoading cambia de true a false)"
              },
              "iconProps": {
                "name": "iconProps",
                "type": "ButtonIconConfig",
                "required": false,
                "description": "Sistema nuevo: Configuración del icono principal del botón (objeto)\n    Permite configurar el icono principal de forma más flexible\n    Si se proporciona, tiene prioridad sobre las props legacy (icon, iconDuotonePrimary, etc.)"
              },
              "badge": {
                "name": "badge",
                "type": "ButtonBadgeConfig",
                "required": false,
                "description": "Sistema nuevo: Configuración del badge del botón (objeto)\n    Permite configurar el badge de forma más flexible\n    Si se proporciona, tiene prioridad sobre las props legacy (badgeColor, badgeLabel, etc.)"
              },
              "leftSlotProps": {
                "name": "leftSlotProps",
                "type": "ButtonSlotConfig",
                "required": false,
                "description": "Sistema nuevo: Configuración del slot izquierdo (objeto)\n    Permite configurar el slot izquierdo de forma más flexible\n    Si se proporciona, tiene prioridad sobre las props legacy (leftSlot, leftSlotDuotonePrimary, etc.)"
              },
              "rightSlotProps": {
                "name": "rightSlotProps",
                "type": "ButtonSlotConfig",
                "required": false,
                "description": "Sistema nuevo: Configuración del slot derecho (objeto)\n    Permite configurar el slot derecho de forma más flexible\n    Si se proporciona, tiene prioridad sobre las props legacy (rightSlot, rightSlotDuotonePrimary, etc.)"
              },
              "tooltipProps": {
                "name": "tooltipProps",
                "type": "ButtonTooltipConfig",
                "required": false,
                "description": "Sistema nuevo: Configuración del tooltip del botón (objeto)\n    Permite configurar el tooltip de forma más flexible\n    Si se proporciona, tiene prioridad sobre las props legacy (tooltip, tooltipPosition, etc.)"
              }
            }
          }
        }
      ]
    },
    {
      "id": "Input",
      "path": "src/modules/Input",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Input",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Un componente Input personalizable con soporte para slots, estados de error, y estados controlado y no controlado.",
            "jsdoc": "Input - Componente de campo de entrada versátil y configurable\nComponente de input que soporta estados controlados y no controlados, labels, mensajes de error,\niconos, slots personalizados, tooltips informativos y múltiples tamaños.",
            "readme": "# Input Component\n\nComponente de campo de entrada versátil y configurable con soporte para labels, mensajes de error, iconos, slots personalizados y tooltips informativos.\n\n## Estructura\n\n```\nInput/\n├── components/\n│   └── Input.tsx          # Componente principal\n├── hooks/                 # Hooks personalizados\n├── stories/\n│   └── input.stories.tsx # Storybook stories\n└── index.ts              # Export del módulo\n```\n\n## Uso Básico\n\n```tsx\nimport { Input } from '@imj_media/ui';\n\n// Input simple\n<Input\n  label=\"Nombre\"\n  value={name}\n  onValueChange={(value) => setName(value)}\n/>\n\n// Input con placeholder\n<Input\n  label=\"Email\"\n  placeholder=\"ejemplo@correo.com\"\n  value={email}\n  onValueChange={(value) => setEmail(value)}\n/>\n```\n\n## Props Principales\n\n### Contenido y Estado\n\n- `value?: string` - Valor del input (controlado)\n- `defaultValue?: string` - Valor por defecto (no controlado)\n- `onValueChange?: (value: string) => void` - Callback cuando cambia el valor\n- `onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void` - Callback nativo del input\n- `placeholder?: string` - Texto de placeholder\n\n### Labels y Mensajes\n\n- `label?: string` - Label del input\n- `error?: string` - Mensaje de error\n- `helperText?: string` - Texto de ayuda adicional\n- `infoTooltip?: string` - Texto del tooltip informativo\n\n### Slots e Iconos\n\n- `leftSlot?: VisualSlotType` - Slot izquierdo (icono, imagen, avatar)\n- `rightSlot?: VisualSlotType` - Slot derecho (icono, imagen, avatar)\n- `extraSlot?: VisualSlotType` - Slot extra (icono, imagen, avatar)\n- `onClickExtraSlot?: () => void` - Callback al hacer clic en el slot extra\n\n### Estilo y Tamaño\n\n- `size?: 'xs' | 'sm' | 'md' | 'lg'` - Tamaño del input (default: `'sm'`)\n- `color?: InputColor` - Color del input\n- `fullWidth?: boolean` - Si es true, ocupa todo el ancho disponible (default: `false`)\n- `pill?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'` - Radio de borde (default: `'sm'`)\n\n### Funcionalidad\n\n- `disabled?: boolea",
            "confidence": "high"
          },
          "examples": [
            "import { Input } from '@/modules/Input';\n\n  export default function Example() {\n    return (\n      <Input \n        label=\"Input Básico\"\n        placeholder=\"Escribe algo aquí...\"\n      />\n    )\n  }",
            "import { Input } from '@/modules/Input';\n\n  export default function Example() {\n    return (\n      <Input \n        label=\"Input Básico\"\n        placeholder=\"Escribe algo aquí...\"\n      />\n    )\n  }",
            "<Input \n    label=\"Input con Error\"\n    error=\"Este campo es requerido\"\n    placeholder=\"Campo requerido\"\n  />",
            "<Input \n    label=\"Input con Ayuda\"\n    helperText=\"Este texto te ayudará a entender qué información ingresar\"\n    placeholder=\"Ingresa tu información\"\n  />",
            "<Input \n    label=\"Input Deshabilitado\"\n    disabled={true}\n    value=\"Valor no editable\"\n  />"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "label": {
                "name": "label",
                "type": "string",
                "required": false
              },
              "error": {
                "name": "error",
                "type": "string",
                "required": false
              },
              "helperText": {
                "name": "helperText",
                "type": "string",
                "required": false
              },
              "size": {
                "name": "size",
                "type": "InputSize",
                "required": false
              },
              "color": {
                "name": "color",
                "type": "Colors",
                "required": false
              },
              "leftSlot": {
                "name": "leftSlot",
                "type": "VisualSlotType | null",
                "required": false
              },
              "rightSlot": {
                "name": "rightSlot",
                "type": "VisualSlotType | null",
                "required": false
              },
              "extraSlot": {
                "name": "extraSlot",
                "type": "VisualSlotType | null",
                "required": false
              },
              "leftSlotClassName": {
                "name": "leftSlotClassName",
                "type": "string",
                "required": false,
                "description": "Clase CSS aplicada al contenedor del leftSlot (p. ej. ui-animate-spin para icono de carga)"
              },
              "caret": {
                "name": "caret",
                "type": "boolean",
                "required": false
              },
              "errorCursor": {
                "name": "errorCursor",
                "type": "boolean",
                "required": false
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false
              },
              "defaultValue": {
                "name": "defaultValue",
                "type": "string",
                "required": false
              },
              "fullWidth": {
                "name": "fullWidth",
                "type": "boolean",
                "required": false
              },
              "minWidthEnabled": {
                "name": "minWidthEnabled",
                "type": "boolean",
                "required": false,
                "description": "Si es `true` (por defecto) y `fullWidth` es `false`, el control del input aplica un ancho mínimo de diseño (`ui-min-w-72`).\n    Ponlo en `false` para que el campo no imponga ese mínimo (p. ej. contenedores estrechos o `ui-w-fit`)."
              },
              "autosize": {
                "name": "autosize",
                "type": "boolean",
                "required": false
              },
              "infoTooltip": {
                "name": "infoTooltip",
                "type": "string",
                "required": false
              },
              "onValueChange": {
                "name": "onValueChange",
                "type": "(value: string) => void",
                "required": false
              },
              "onClickExtraSlot": {
                "name": "onClickExtraSlot",
                "type": "() => void",
                "required": false
              },
              "clearable": {
                "name": "clearable",
                "type": "boolean",
                "required": false,
                "description": "Muestra una X para vaciar el valor cuando hay contenido (no con `disabled`)."
              },
              "onClear": {
                "name": "onClear",
                "type": "(e: React.MouseEvent<HTMLButtonElement>) => void",
                "required": false
              },
              "colorLeftIcon": {
                "name": "colorLeftIcon",
                "type": "IconFontColor",
                "required": false
              },
              "colorRightIcon": {
                "name": "colorRightIcon",
                "type": "IconFontColor",
                "required": false
              },
              "colorExtraIcon": {
                "name": "colorExtraIcon",
                "type": "IconFontColor",
                "required": false
              },
              "leftSlotDuotonePrimary": {
                "name": "leftSlotDuotonePrimary",
                "type": "IconFontColor",
                "required": false
              },
              "leftSlotDuotoneSecondary": {
                "name": "leftSlotDuotoneSecondary",
                "type": "IconFontColor",
                "required": false
              },
              "leftSlotDuotoneOpacityPrimary": {
                "name": "leftSlotDuotoneOpacityPrimary",
                "type": "number",
                "required": false
              },
              "leftSlotDuotoneOpacitySecondary": {
                "name": "leftSlotDuotoneOpacitySecondary",
                "type": "number",
                "required": false
              },
              "rightSlotDuotonePrimary": {
                "name": "rightSlotDuotonePrimary",
                "type": "IconFontColor",
                "required": false
              },
              "rightSlotDuotoneSecondary": {
                "name": "rightSlotDuotoneSecondary",
                "type": "IconFontColor",
                "required": false
              },
              "rightSlotDuotoneOpacityPrimary": {
                "name": "rightSlotDuotoneOpacityPrimary",
                "type": "number",
                "required": false
              },
              "rightSlotDuotoneOpacitySecondary": {
                "name": "rightSlotDuotoneOpacitySecondary",
                "type": "number",
                "required": false
              },
              "extraSlotDuotonePrimary": {
                "name": "extraSlotDuotonePrimary",
                "type": "IconFontColor",
                "required": false
              },
              "extraSlotDuotoneSecondary": {
                "name": "extraSlotDuotoneSecondary",
                "type": "IconFontColor",
                "required": false
              },
              "extraSlotDuotoneOpacityPrimary": {
                "name": "extraSlotDuotoneOpacityPrimary",
                "type": "number",
                "required": false
              },
              "extraSlotDuotoneOpacitySecondary": {
                "name": "extraSlotDuotoneOpacitySecondary",
                "type": "number",
                "required": false
              },
              "pill": {
                "name": "pill",
                "type": "PillSize",
                "required": false
              }
            }
          }
        }
      ],
      "standaloneSnippet": "import React from 'react';\n\nconst sizeMap = {\n  sm: { padding: '6px 2px', fontSize: '14px' },\n  md: { padding: '2px 12px', fontSize: '16px' },\n  lg: { padding: '12px 4px', fontSize: '18px' },\n};\n\nexport function Input({\n  value,\n  onChange,\n  placeholder,\n  disabled = false,\n  size = 'md',\n  error,\n  type = 'text',\n}: {\n  value?: string;\n  onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n  placeholder?: string;\n  disabled?: boolean;\n  size?: keyof typeof sizeMap;\n  error?: string;\n  type?: 'text' | 'password' | 'email' | 'number';\n}) {\n  const s = sizeMap[size];\n  const [focused, setFocused] = React.useState(false);\n\n  const borderColor = error\n    ? 'rgb(240, 69, 69)'\n    : focused\n      ? 'rgb(54, 89, 194)'\n      : 'rgb(199, 199, 204)';\n\n  const input = (\n    <input\n      type={type}\n      value={value}\n      onChange={onChange}\n      placeholder={placeholder}\n      disabled={disabled}\n      onFocus={() => setFocused(true)}\n      onBlur={() => setFocused(false)}\n      style={{\n        width: '100%',\n        padding: s.padding,\n        fontSize: s.fontSize,\n        fontFamily: 'inherit',\n        lineHeight: '1.5',\n        color: 'rgb(48, 51, 54)',\n        backgroundColor: 'rgb(255, 255, 255)',\n        border: `1px solid ${borderColor}`,\n        borderRadius: '8px',\n        outline: 'none',\n        opacity: disabled ? 0.5 : 1,\n        cursor: disabled ? 'not-allowed' : 'text',\n        transition: 'border-color 150ms',\n        boxSizing: 'border-box',\n      }}\n    />\n  );\n\n  if (error) {\n    return (\n      <div>\n        {input}\n        <div\n          style={{\n            marginTop: '4px',\n            fontSize: '12px',\n            color: 'rgb(240, 69, 69)',\n          }}\n        >\n          {error}\n        </div>\n      </div>\n    );\n  }\n\n  return input;\n}\n"
    },
    {
      "id": "LegacyButton",
      "path": "src/modules/LegacyButton",
      "legacy": true,
      "legacyReason": "Usa iconos SVG legacy; preferir Button + Icon.",
      "compositionType": 1,
      "exports": [
        {
          "name": "LegacyButton",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "jsdoc": "Botón equivalente a `Button`, pero los slots e iconos usan nombres tipados de `LegacyIcon` (SVG legacy).",
            "confidence": "medium"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "variant": {
                "name": "variant",
                "type": "ButtonProps['variant']",
                "required": false
              }
            }
          }
        },
        {
          "name": "InnerLegacyButton",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "confidence": "low"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "variant": {
                "name": "variant",
                "type": "ButtonProps['variant']",
                "required": false
              }
            }
          }
        }
      ]
    },
    {
      "id": "LegacyIcon",
      "path": "src/modules/LegacyIcon",
      "legacy": true,
      "legacyReason": "Set de iconos SVG legacy; preferir Icon / IconFont.",
      "compositionType": 1,
      "exports": [
        {
          "name": "LegacyIcon",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Iconos SVG legacy (",
            "confidence": "medium"
          },
          "examples": [
            "import { LegacyIcon } from '@/modules/LegacyIcon';\n\n<LegacyIcon name=\"HomeOutlined\" size=\"lg\" color=\"brand\" />\n<LegacyIcon name=\"LogoFill\" size=\"md\" color=\"current\" />",
            "import { LegacyIcon } from '@/modules/LegacyIcon';\n\n<LegacyIcon name=\"HomeOutlined\" size=\"lg\" color=\"brand\" />\n<LegacyIcon name=\"LogoFill\" size=\"md\" color=\"current\" />"
          ]
        }
      ]
    },
    {
      "id": "Lightbox",
      "path": "src/modules/Lightbox",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Lightbox",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Lightbox permite visualizar imágenes en pantalla completa con navegación, indicadores y controles.",
            "confidence": "medium"
          },
          "examples": [
            "import { useState } from 'react'\nimport { Lightbox, ILightboxImage } from '@/modules/Lightbox'\n\nconst images: ILightboxImage[] = [\n  {\n    id: 1,\n    src: 'https://example.com/image1.jpg',\n    title: 'Paisaje de Montaña',\n  },\n  {\n    id: 2,\n    src: 'https://example.com/image2.jpg',\n    title: 'Naturaleza Salvaje',\n  },\n]\n\nexport default function Example() {\n  const [isOpen, setIsOpen] = useState(false)\n\n  return (\n    <>\n      <button onClick={() => setIsOpen(true)}>\n        Abrir Galería\n      </button>\n\n      <Lightbox\n        images={images}\n        isOpen={isOpen}\n        onClose={() => setIsOpen(false)}\n      />\n    </>\n  )\n}",
            "<Lightbox\n  images={images}\n  isOpen={isOpen}\n  onClose={() => setIsOpen(false)}\n  displayMode=\"square\"\n/>",
            "const images: ILightboxImage[] = [\n  {\n    id: 1,\n    src: 'https://example.com/image1.jpg',\n    // Sin título\n  },\n  {\n    id: 2,\n    src: 'https://example.com/image2.jpg',\n  },\n]\n\n<Lightbox\n  images={images}\n  isOpen={isOpen}\n  onClose={() => setIsOpen(false)}\n/>",
            "<Lightbox\n  images={images}\n  isOpen={isOpen}\n  onClose={() => setIsOpen(false)}\n  showIndicators={false}\n/>",
            "<Lightbox\n  images={images}\n  isOpen={isOpen}\n  onClose={() => setIsOpen(false)}\n  showNavigation={false}\n/>"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "images": {
                "name": "images",
                "type": "ILightboxImage[]",
                "required": true
              },
              "initialIndex": {
                "name": "initialIndex",
                "type": "number",
                "required": false
              },
              "isOpen": {
                "name": "isOpen",
                "type": "boolean",
                "required": true
              },
              "onClose": {
                "name": "onClose",
                "type": "() => void",
                "required": true
              },
              "displayMode": {
                "name": "displayMode",
                "type": "ImageDisplayMode",
                "required": false
              },
              "showTitle": {
                "name": "showTitle",
                "type": "boolean",
                "required": false
              },
              "showIndicators": {
                "name": "showIndicators",
                "type": "boolean",
                "required": false
              },
              "showNavigation": {
                "name": "showNavigation",
                "type": "boolean",
                "required": false
              },
              "showCounter": {
                "name": "showCounter",
                "type": "boolean",
                "required": false
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "overlayClassName": {
                "name": "overlayClassName",
                "type": "string",
                "required": false
              },
              "size": {
                "name": "size",
                "type": "'sm' | 'md' | 'lg' | 'full'",
                "required": false
              }
            }
          }
        }
      ]
    },
    {
      "id": "LinearGraphic",
      "path": "src/modules/LinearGraphic",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "LinearGraphic",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente LinearGraphic muestra una barra de progreso con múltiples segmentos, cada uno con su propio color y porcentaje. Soporta tooltips en hover para mostrar información detallada.",
            "jsdoc": "LinearGraphic - Gráfica lineal de barras de progreso múltiples\nMuestra una barra de progreso con múltiples segmentos, cada uno con su propio\ncolor y porcentaje. Soporta tooltips en hover para mostrar información detallada.",
            "confidence": "high"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "data": {
                "name": "data",
                "type": "LinearGraphicData[]",
                "required": true,
                "description": "Array de datos para cada segmento"
              },
              "colors": {
                "name": "colors",
                "type": "LinearGraphicColor[]",
                "required": true,
                "description": "Array de colores semánticos para cada segmento"
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clase CSS adicional"
              },
              "height": {
                "name": "height",
                "type": "number",
                "required": false,
                "description": "Altura de la barra en píxeles (por defecto: 8px)"
              },
              "showTooltips": {
                "name": "showTooltips",
                "type": "boolean",
                "required": false,
                "description": "Si mostrar tooltips en hover (por defecto: true)"
              },
              "showLegend": {
                "name": "showLegend",
                "type": "boolean",
                "required": false,
                "description": "Si mostrar la leyenda debajo de la gráfica (por defecto: false)"
              },
              "showLegendPercent": {
                "name": "showLegendPercent",
                "type": "boolean",
                "required": false,
                "description": "Si mostrar el porcentaje en la leyenda (por defecto: false)"
              },
              "legendGap": {
                "name": "legendGap",
                "type": "number",
                "required": false,
                "description": "Espacio entre leyendas en píxeles (por defecto: 8)"
              },
              "transitionDuration": {
                "name": "transitionDuration",
                "type": "number",
                "required": false,
                "description": "Duración de la transición en ms (por defecto: 500)"
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false,
                "description": "Si deshabilitar la gráfica"
              },
              "onSegmentHover": {
                "name": "onSegmentHover",
                "type": "(data: LinearGraphicData, index: number) => void",
                "required": false,
                "description": "Callback cuando se hace hover sobre un segmento"
              },
              "onSegmentLeave": {
                "name": "onSegmentLeave",
                "type": "(data: LinearGraphicData, index: number) => void",
                "required": false,
                "description": "Callback cuando se sale del hover de un segmento"
              }
            }
          }
        },
        {
          "name": "LinearGraphicSegment",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente LinearGraphic muestra una barra de progreso con múltiples segmentos, cada uno con su propio color y porcentaje. Soporta tooltips en hover para mostrar información detallada.",
            "jsdoc": "Datos del segmento */\n  data: LinearGraphicData;\n  /** Índice del segmento */\n  index: number;\n  /** Ancho del segmento en porcentaje */\n  width: number;\n  /** Color semántico del segmento */\n  color: LinearGraphicColor;\n  /** Si es el primer segmento */\n  isFirst: boolean;\n  /** Si es el último segmento */\n  isLast: boolean;\n  /** Altura de la barra */\n  height: number;\n  /** Duración de la transición */\n  transitionDuration: number;\n  /** Si mostrar tooltip */\n  showTooltip: boolean;\n  /** Callback cuando se hace hover */\n  onHover?: (data: LinearGraphicData, index: number) => void;\n  /** Callback cuando se sale del hover */\n  onLeave?: (data: LinearGraphicData, index: number) => void;\n}\n\n/**\nSegmento individual de la gráfica lineal\nÁtomo que representa una porción de la barra de progres",
            "confidence": "high"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "data": {
                "name": "data",
                "type": "LinearGraphicData",
                "required": true,
                "description": "Datos del segmento"
              },
              "index": {
                "name": "index",
                "type": "number",
                "required": true,
                "description": "Índice del segmento"
              },
              "width": {
                "name": "width",
                "type": "number",
                "required": true,
                "description": "Ancho del segmento en porcentaje"
              },
              "color": {
                "name": "color",
                "type": "LinearGraphicColor",
                "required": true,
                "description": "Color semántico del segmento"
              },
              "isFirst": {
                "name": "isFirst",
                "type": "boolean",
                "required": true,
                "description": "Si es el primer segmento"
              },
              "isLast": {
                "name": "isLast",
                "type": "boolean",
                "required": true,
                "description": "Si es el último segmento"
              },
              "height": {
                "name": "height",
                "type": "number",
                "required": true,
                "description": "Altura de la barra"
              },
              "transitionDuration": {
                "name": "transitionDuration",
                "type": "number",
                "required": true,
                "description": "Duración de la transición"
              },
              "showTooltip": {
                "name": "showTooltip",
                "type": "boolean",
                "required": true,
                "description": "Si mostrar tooltip"
              },
              "onHover": {
                "name": "onHover",
                "type": "(data: LinearGraphicData, index: number) => void",
                "required": false,
                "description": "Callback cuando se hace hover"
              },
              "onLeave": {
                "name": "onLeave",
                "type": "(data: LinearGraphicData, index: number) => void",
                "required": false,
                "description": "Callback cuando se sale del hover"
              }
            }
          }
        }
      ]
    },
    {
      "id": "ListWithDataInHover",
      "path": "src/modules/ListWithDataInHover",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "ListWithDataInHover",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente ListWithDataInHover muestra una lista de elementos, cada uno con un indicador de color y un nombre. Al hacer hover sobre un elemento, se muestra un tooltip con el porcentaje asociado.",
            "jsdoc": "ListWithDataInHover - Lista de elementos con tooltips que muestran datos\nMuestra una lista de elementos, cada uno con un indicador de color y un nombre.\nAl hacer hover sobre un elemento, se muestra un tooltip con el porcentaje asociado.",
            "confidence": "high"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "data": {
                "name": "data",
                "type": "ListWithDataInHoverItem[]",
                "required": true,
                "description": "Array de datos para cada elemento"
              },
              "colors": {
                "name": "colors",
                "type": "ListWithDataInHoverColor[]",
                "required": true,
                "description": "Array de colores semánticos para cada elemento"
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clase CSS adicional"
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false,
                "description": "Si deshabilitar la lista"
              },
              "indicatorSize": {
                "name": "indicatorSize",
                "type": "number",
                "required": false,
                "description": "Tamaño del indicador circular en píxeles (por defecto: 8px)"
              },
              "gap": {
                "name": "gap",
                "type": "number",
                "required": false,
                "description": "Gap entre elementos en píxeles (por defecto: 4px)"
              },
              "showTooltips": {
                "name": "showTooltips",
                "type": "boolean",
                "required": false,
                "description": "Si mostrar tooltips (por defecto: true)"
              },
              "showPercent": {
                "name": "showPercent",
                "type": "boolean",
                "required": false,
                "description": "Si mostrar el porcentaje junto al nombre (por defecto: true)"
              },
              "tooltipPosition": {
                "name": "tooltipPosition",
                "type": "InlineTooltipPosition",
                "required": false,
                "description": "Posición del tooltip (por defecto: 'over')"
              },
              "onItemHover": {
                "name": "onItemHover",
                "type": "(item: ListWithDataInHoverItem, index: number) => void",
                "required": false,
                "description": "Callback cuando se hace hover sobre un elemento"
              },
              "onItemLeave": {
                "name": "onItemLeave",
                "type": "(item: ListWithDataInHoverItem, index: number) => void",
                "required": false,
                "description": "Callback cuando se sale del hover de un elemento"
              }
            }
          }
        }
      ]
    },
    {
      "id": "Lists",
      "path": "src/modules/Lists",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Lists",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Organismos de lista por variante (",
            "readme": "# Componentes de Listas\n\nSistema completo de componentes de listas con **13 variantes** (`variant` en `ListBase`), con **DRY**, **SOC**, **Atomic Design** y **TypeScript Discriminated Unions**.\n\n## API agrupada en `ListBase` (recomendada)\n\nLa API organiza datos y callbacks en **bloques** en la medida de lo posible. Si un valor existe en un bloque y también en la raíz del componente, **gana el bloque**.\n\n### Bloques por responsabilidad\n\n| Bloque                     | Uso                                                                                                            |\n| -------------------------- | -------------------------------------------------------------------------------------------------------------- |\n| **`list`**                 | Datos: `items`, `groups`, `users`, etc. (depende de `variant`)                                                 |\n| **`selection`**            | Estado de selección: `currentValue`, `selectedValue`, `selectedUserId`, `selectedItem`, `darkMode` (perfil), … |\n| **`events`**               | Callbacks (`onItemClick`, `onSelectionChange`, …)                                                              |\n| **`labels`**               | Textos: `title`, `searchPlaceholder` (users-select), `clearLabel` / `applyLabel`, …                            |\n| **`profile`** + **`menu`** | Solo `user-profile`: `profile.user` y `menu.items`                                                             |\n| **`options`**              | Solo `toggle`: p. ej. `enableReordering`                                                                       |\n| **`content`**              | Solo `empty`: p. ej. `icon`                                                                                    |\n| **`search`**               | Solo `search-multi-checkbox`: `show`, `placeholder`                                                            |\n\n### Ejemplo mínimo (`variant=\"default\"`)\n\n```tsx\nimport { ListBase } from '@/modules/Lists';\n\n<ListBase\n  variant=\"defa",
            "confidence": "high"
          },
          "examples": [],
          "props": {
            "groups": {
              "list": {
                "props": {
                  "className": {
                    "name": "className",
                    "type": "string",
                    "required": false
                  },
                  "currentValue": {
                    "name": "currentValue",
                    "type": "string",
                    "required": false
                  },
                  "items": {
                    "name": "items",
                    "type": "ListItemData[]",
                    "required": false
                  },
                  "onClick": {
                    "name": "onClick",
                    "type": "(item: ListItemData, e: React.MouseEvent) => void",
                    "required": false
                  },
                  "icon": {
                    "name": "icon",
                    "type": "VisualSlotType",
                    "required": false
                  },
                  "iconDuotonePrimary": {
                    "name": "iconDuotonePrimary",
                    "type": "IconFontColor",
                    "required": false
                  },
                  "iconDuotoneSecondary": {
                    "name": "iconDuotoneSecondary",
                    "type": "IconFontColor",
                    "required": false
                  },
                  "iconDuotoneOpacityPrimary": {
                    "name": "iconDuotoneOpacityPrimary",
                    "type": "number",
                    "required": false
                  },
                  "iconDuotoneOpacitySecondary": {
                    "name": "iconDuotoneOpacitySecondary",
                    "type": "number",
                    "required": false
                  },
                  "valueName": {
                    "name": "valueName",
                    "type": "string",
                    "required": false
                  },
                  "titleName": {
                    "name": "titleName",
                    "type": "string",
                    "required": false
                  },
                  "children": {
                    "name": "children",
                    "type": "React.ReactNode",
                    "required": false
                  },
                  "hasCurrent": {
                    "name": "hasCurrent",
                    "type": "boolean",
                    "required": false
                  },
                  "padding": {
                    "name": "padding",
                    "type": "'none' | 'sm' | 'md' | 'lg'",
                    "required": false
                  }
                }
              }
            },
            "deprecatedRoot": [],
            "flat": {
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "currentValue": {
                "name": "currentValue",
                "type": "string",
                "required": false
              },
              "items": {
                "name": "items",
                "type": "ListItemData[]",
                "required": false
              },
              "onClick": {
                "name": "onClick",
                "type": "(item: ListItemData, e: React.MouseEvent) => void",
                "required": false
              },
              "icon": {
                "name": "icon",
                "type": "VisualSlotType",
                "required": false
              },
              "iconDuotonePrimary": {
                "name": "iconDuotonePrimary",
                "type": "IconFontColor",
                "required": false
              },
              "iconDuotoneSecondary": {
                "name": "iconDuotoneSecondary",
                "type": "IconFontColor",
                "required": false
              },
              "iconDuotoneOpacityPrimary": {
                "name": "iconDuotoneOpacityPrimary",
                "type": "number",
                "required": false
              },
              "iconDuotoneOpacitySecondary": {
                "name": "iconDuotoneOpacitySecondary",
                "type": "number",
                "required": false
              },
              "valueName": {
                "name": "valueName",
                "type": "string",
                "required": false
              },
              "titleName": {
                "name": "titleName",
                "type": "string",
                "required": false
              },
              "children": {
                "name": "children",
                "type": "React.ReactNode",
                "required": false
              },
              "hasCurrent": {
                "name": "hasCurrent",
                "type": "boolean",
                "required": false
              },
              "padding": {
                "name": "padding",
                "type": "'none' | 'sm' | 'md' | 'lg'",
                "required": false
              }
            }
          }
        }
      ]
    },
    {
      "id": "Logo",
      "path": "src/modules/Logo",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Logo",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Logo permite mostrar el logo del sistema de diseño en diferentes tamaños.",
            "jsdoc": "Logo - Componente de logo de la aplicación\nRenderiza el logotipo de marca como SVG (`FillLogoIcon`).\nSoporta diferentes tamaños predefinidos.",
            "confidence": "high"
          },
          "examples": [
            "import { Logo } from '@/modules/Logo';\n\n  export default function Example() {\n    return <Logo />\n  }",
            "<Logo size=\"sm\" />\n  <Logo size=\"md\" />\n  <Logo size=\"lg\" />",
            "<div className=\"flex items-center justify-between\">\n    <div className=\"flex items-center gap-4\">\n      <Logo size=\"md\" />\n      <nav className=\"flex gap-4\">\n        <a href=\"#\" className=\"text-gray-600 hover:text-gray-900\">Inicio</a>\n        <a href=\"#\" className=\"text-gray-600 hover:text-gray-900\">Productos</a>\n        <a href=\"#\" className=\"text-gray-600 hover:text-gray-900\">Servicios</a>\n        <a href=\"#\" className=\"text-gray-600 hover:text-gray-900\">Contacto</a>\n      </nav>\n    </div>\n    <div className=\"flex items-center gap-2\">\n      <button className=\"px-4 py-2 text-sm bg-blue-500 text-white rounded hover:bg-blue-600\">\n        Iniciar Sesión\n      </button>\n    </div>\n  </div>",
            "<div className=\"flex items-center justify-between\">\n    <div className=\"flex items-center gap-4\">\n      <Logo size=\"sm\" />\n      <p className=\"text-sm text-gray-600\">© 2024 Tu Empresa. Todos los derechos reservados.</p>\n    </div>\n    <div className=\"flex gap-4\">\n      <a href=\"#\" className=\"text-sm text-gray-600 hover:text-gray-900\">Política de Privacidad</a>\n      <a href=\"#\" className=\"text-sm text-gray-600 hover:text-gray-900\">Términos de Servicio</a>\n    </div>\n  </div>",
            "import { Logo } from '@/modules/Logo';\n\n  export default function Example() {\n    return <Logo />\n  }"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "size": {
                "name": "size",
                "type": "LogoSize",
                "required": false
              }
            }
          }
        }
      ]
    },
    {
      "id": "Message",
      "path": "src/modules/Message",
      "legacy": true,
      "legacyReason": "API legada de mensajes; preferir Notification.",
      "compositionType": 1,
      "exports": [
        {
          "name": "Toaster",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "jsdoc": "Componente que renderiza todos los toasts en un portal",
            "readme": "# Módulo Message (`@imj_media/ui`)\n\nSuperficie del design system para **mensajes efímeros en pantalla**: toasts (mensajes cortos apilables) y **notificaciones** (tarjetas agrupables por posición y “mazos” `primary` / `secondary` / `auto`). Todo se pinta vía **portal** en `document.body` para no romper el flujo del layout de la app.\n\n## Qué resuelve y cómo se reparte la API\n\n| Concepto | Rol | API imperativa típica | Host React |\n|----------|-----|----------------------|------------|\n| **Toast** | Mensaje temporal apilable (éxito, error, info, warning, genérico). | `toast.*` delega en `messageService` (véase `Message.services.ts`). | `<Toaster />` solo toasts. |\n| **Notificación** | Tarjeta agrupada (`notification.message`, stacks, dismiss por grupo/mazo). | `notification.*` delega en `notificationService`. | `<Notifier />` solo notificaciones. |\n| **`notify`** | **Fachada unificada**: expone métodos de toast **y** de notificación (`notify.message`, `notify.dismissNotificationStack`, etc.) para un solo import en consumidores. | `notify` en `Message.services.ts`. | Cualquiera de los hosts; suele usarse con `<Messaging />` si la app necesita ambos. |\n| **`Messaging`** | Un único portal que monta **toasts y notificaciones** (combina `MessagePositions` + `NotificationPositions`). | Igual que arriba (`toast`, `notification`, `notify`). | `<Messaging />` |\n\n**`Toaster` + `Notifier` vs `Messaging`:** son equivalentes en datos (mismos hooks/servicios); la diferencia es **qué montas en el árbol**. Si solo usas toasts, basta `<Toaster />`. Si solo notificaciones, `<Notifier />`. Si la aplicación mezcla ambos, `<Messaging />` evita duplicar portales. Sin al menos uno de estos componentes en la app, las llamadas imperativas no tienen dónde renderizarse.\n\nPara exports desde el paquete: el barrel del módulo reexporta componentes y la API vía `Message.api.ts` (consumo desde `@imj_media/ui` según el `index` del paquete).\n\n## Estructura de carpetas\n\n```\nMessage/\n├── components/",
            "confidence": "medium"
          },
          "examples": [
            "import { notify, Messaging, Button } from '@imj_media';\n\n    export const App = () => (\n      <div>\n        <Messaging />\n        <Button onClick={() => notify.success(\"Operación exitosa!\")}>\n          Mostrar mensaje\n        </Button>\n      </div>\n    )",
            "import { notify } from '@imj_media';\n\n    // Mensajes básicos\n    notify.success(\"Operación completada exitosamente\")\n    notify.error(\"Ha ocurrido un error\")\n    notify.info(\"Información importante\")\n    notify.warning(\"Advertencia: acción requerida\")\n    \n    // Notificaciones agrupadas (mazos)\n    notify.message({ stackGroup: 'secondary', title: 'Mensaje informativo neutro' })\n    notify.message({ title: '¡Nueva funcionalidad disponible!' })",
            "// ✅ Código existente sigue funcionando sin cambios\n    import { toast, Toaster, Button } from '@imj_media';\n\n    export const App = () => (\n      <div>\n        <Toaster />\n        <Button onClick={() => toast.success(\"Hello, world!\")}>\n          Mostrar toast\n        </Button>\n      </div>\n    )",
            "import { toast } from '@imj_media';\n\n    toast.success('Toast con API legacy');\n    toast.error('Error con toast legacy');\n    toast.info('Info con toast legacy');",
            "// ============================================\n    // FORMA ANTIGUA (toast)\n    // ============================================\n    import { toast, Toaster } from '@imj_media';\n    \n    toast.success(\"Mensaje\")\n    toast.error(\"Error\")\n    toast.info(\"Info\")\n    toast.warning(\"Warning\")\n\n    // ============================================\n    // FORMA NUEVA (notify) - Recomendada\n    // ============================================\n    import { notify, Messaging } from '@imj_media';\n    \n    notify.success(\"Mensaje\")\n    notify.error(\"Error\")\n    notify.info(\"Info\")\n    notify.warning(\"Warning\")\n    \n    // ✨ Métodos adicionales\n    notify.message({ stackGroup: 'secondary', title: 'Mensaje neutro' })\n    notify.message({ title: 'Mensaje de marca' })",
            "// 1) App\n    import { notify, Messaging } from '@imj_media';\n\n    export const App = () => (\n      <>\n        <Messaging />\n        {/* … */}\n      </>\n    );\n\n    // 2) Defaults del servicio (opcional)\n    notify.configureNotification({ duration: 8000, stackMax: 3, showTimer: true });\n\n    // 3) Encolar: campos de tarjeta en la raíz (equivalente a anidarlos en \\",
            "import { notify } from '@imj_media';\n\n    notify.message({\n      title: 'Cola única',\n      message: 'Todas las intenciones comparten el mazo auto.',\n      duration: 8000,\n      appearance: { intent: 'informativa' },\n    });",
            "import { notify } from '@imj_media';\n\n    notify.message({\n      stackGroup: 'primary',\n      title: 'Brand',\n      message: 'Mazo primary',\n      duration: 8000,\n    });\n\n    notify.message({\n      stackGroup: 'secondary',\n      title: 'Neutral',\n      message: 'Mazo secondary',\n      duration: 8000,\n    });",
            "import { notification } from '@imj_media';\n\n    notification.message({ title: 'Encola en auto' });\n    notification.dismissStack('auto');\n    notification.dismissStack('primary');\n    notification.dismissStack('secondary');",
            "// 1) App\n    import { notify, Messaging } from '@imj_media';\n\n    export const App = () => (\n      <>\n        <Messaging />\n        {/* … */}\n      </>\n    );\n\n    // 2) Defaults del servicio (opcional)\n    notify.configureNotification({ duration: 8000, stackMax: 3, showTimer: true });\n\n    // 3) Encolar: campos de tarjeta en la raíz (equivalente a anidarlos en \\`notification\\`)\n    notify.message({\n      title: 'Título corto',\n      message: 'Cuerpo por defecto',\n      duration: 10000,\n      stackGroup: 'secondary', // u omitir → mazo \\`auto\\`\n      appearance: { intent: 'preventiva', variant: 'outlined' },\n      content: { title: 'Título corto', kind: 'default', description: 'Texto largo…' },\n      meta: { presentation: 'popup' },\n      events: { onClose: () => {} },\n    });",
            "import { notify, Messaging } from '@imj_media';\n\n    // En la app: <Messaging />\n    notify.message({\n      title: 'Aviso',\n      message: 'Texto breve con la apariencia por defecto del sistema.',\n      duration: 8000,\n      // Equivale a appearance: { intent: 'informativa' } (valor por defecto del componente Notification)\n    });",
            "import { notify } from '@imj_media';\n\n    // Mismo tipo: stack compartido (máx. stackMax, por defecto 3)\n    notify.message({ stackGroup: 'primary',  title: 'Mensaje 1' })\n    notify.message({ stackGroup: 'primary',  title: 'Mensaje 2' })\n    notify.message({ stackGroup: 'primary',  title: 'Mensaje 3' }) // Contador en la frontal\n\n    // Configurar tamaño del stack (opcional)\n    notify.configureNotification({ stackMax: 5 })\n\n    // stackGroup 'secondary' usa otro mazo\n    notify.message({ stackGroup: 'secondary',  title: 'Recordatorio' })\n    notify.message({ stackGroup: 'secondary',  title: 'Otro recordatorio' })",
            "import { notify } from '@imj_media';\n\n    // Mismo mazo primary: cada encolado con título y mensaje distintos\n    notify.message({\n      stackGroup: 'primary',\n      title: 'Actualización · #1',\n      subtitle: 'Hora 14:05:12',\n      message: 'Revisa el panel principal. (seq 1)',\n    });\n\n    // En la app: setInterval o scheduler que encole copy nuevo cada N ms\n    // notify.message({ stackGroup: 'primary', title: '…', message: '…' });",
            "import { notify } from '@imj_media';\n\n    // Una notificación en el mazo (sin pie de apilado)\n    notify.message({\n      stackGroup: 'primary',\n      title: 'Actualización · #1',\n      message: 'Revisa el panel principal. (seq 1)',\n    });\n\n    // Dos en el mismo mazo: la frontal muestra leyenda personalizada\n    notify.message({\n      stackGroup: 'primary',\n      title: 'Aviso · #2',\n      message: 'Hay cambios pendientes. (seq 2)',\n    });\n    notify.message({\n      stackGroup: 'primary',\n      title: 'Alerta · #3',\n      message: 'La cola se ha actualizado. (seq 3)',\n      stackSummaryLegend: 'Tienes 8 mensajes sin leer',\n    });",
            "// Cada nueva notificación reinicia el timer\n    notify.message({ stackGroup: 'primary',  title: 'Mensaje 1' }) // Timer: 5s\n    // Después de 2s...\n    notify.message({ stackGroup: 'primary',  title: 'Mensaje 2' }) // Timer: 5s (reiniciado)"
          ]
        },
        {
          "name": "Notifier",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "jsdoc": "Componente que renderiza todas las notificaciones en un portal",
            "readme": "# Módulo Message (`@imj_media/ui`)\n\nSuperficie del design system para **mensajes efímeros en pantalla**: toasts (mensajes cortos apilables) y **notificaciones** (tarjetas agrupables por posición y “mazos” `primary` / `secondary` / `auto`). Todo se pinta vía **portal** en `document.body` para no romper el flujo del layout de la app.\n\n## Qué resuelve y cómo se reparte la API\n\n| Concepto | Rol | API imperativa típica | Host React |\n|----------|-----|----------------------|------------|\n| **Toast** | Mensaje temporal apilable (éxito, error, info, warning, genérico). | `toast.*` delega en `messageService` (véase `Message.services.ts`). | `<Toaster />` solo toasts. |\n| **Notificación** | Tarjeta agrupada (`notification.message`, stacks, dismiss por grupo/mazo). | `notification.*` delega en `notificationService`. | `<Notifier />` solo notificaciones. |\n| **`notify`** | **Fachada unificada**: expone métodos de toast **y** de notificación (`notify.message`, `notify.dismissNotificationStack`, etc.) para un solo import en consumidores. | `notify` en `Message.services.ts`. | Cualquiera de los hosts; suele usarse con `<Messaging />` si la app necesita ambos. |\n| **`Messaging`** | Un único portal que monta **toasts y notificaciones** (combina `MessagePositions` + `NotificationPositions`). | Igual que arriba (`toast`, `notification`, `notify`). | `<Messaging />` |\n\n**`Toaster` + `Notifier` vs `Messaging`:** son equivalentes en datos (mismos hooks/servicios); la diferencia es **qué montas en el árbol**. Si solo usas toasts, basta `<Toaster />`. Si solo notificaciones, `<Notifier />`. Si la aplicación mezcla ambos, `<Messaging />` evita duplicar portales. Sin al menos uno de estos componentes en la app, las llamadas imperativas no tienen dónde renderizarse.\n\nPara exports desde el paquete: el barrel del módulo reexporta componentes y la API vía `Message.api.ts` (consumo desde `@imj_media/ui` según el `index` del paquete).\n\n## Estructura de carpetas\n\n```\nMessage/\n├── components/",
            "confidence": "medium"
          },
          "examples": [
            "import { notify, Messaging, Button } from '@imj_media';\n\n    export const App = () => (\n      <div>\n        <Messaging />\n        <Button onClick={() => notify.success(\"Operación exitosa!\")}>\n          Mostrar mensaje\n        </Button>\n      </div>\n    )",
            "import { notify } from '@imj_media';\n\n    // Mensajes básicos\n    notify.success(\"Operación completada exitosamente\")\n    notify.error(\"Ha ocurrido un error\")\n    notify.info(\"Información importante\")\n    notify.warning(\"Advertencia: acción requerida\")\n    \n    // Notificaciones agrupadas (mazos)\n    notify.message({ stackGroup: 'secondary', title: 'Mensaje informativo neutro' })\n    notify.message({ title: '¡Nueva funcionalidad disponible!' })",
            "// ✅ Código existente sigue funcionando sin cambios\n    import { toast, Toaster, Button } from '@imj_media';\n\n    export const App = () => (\n      <div>\n        <Toaster />\n        <Button onClick={() => toast.success(\"Hello, world!\")}>\n          Mostrar toast\n        </Button>\n      </div>\n    )",
            "import { toast } from '@imj_media';\n\n    toast.success('Toast con API legacy');\n    toast.error('Error con toast legacy');\n    toast.info('Info con toast legacy');",
            "// ============================================\n    // FORMA ANTIGUA (toast)\n    // ============================================\n    import { toast, Toaster } from '@imj_media';\n    \n    toast.success(\"Mensaje\")\n    toast.error(\"Error\")\n    toast.info(\"Info\")\n    toast.warning(\"Warning\")\n\n    // ============================================\n    // FORMA NUEVA (notify) - Recomendada\n    // ============================================\n    import { notify, Messaging } from '@imj_media';\n    \n    notify.success(\"Mensaje\")\n    notify.error(\"Error\")\n    notify.info(\"Info\")\n    notify.warning(\"Warning\")\n    \n    // ✨ Métodos adicionales\n    notify.message({ stackGroup: 'secondary', title: 'Mensaje neutro' })\n    notify.message({ title: 'Mensaje de marca' })",
            "// 1) App\n    import { notify, Messaging } from '@imj_media';\n\n    export const App = () => (\n      <>\n        <Messaging />\n        {/* … */}\n      </>\n    );\n\n    // 2) Defaults del servicio (opcional)\n    notify.configureNotification({ duration: 8000, stackMax: 3, showTimer: true });\n\n    // 3) Encolar: campos de tarjeta en la raíz (equivalente a anidarlos en \\",
            "import { notify } from '@imj_media';\n\n    notify.message({\n      title: 'Cola única',\n      message: 'Todas las intenciones comparten el mazo auto.',\n      duration: 8000,\n      appearance: { intent: 'informativa' },\n    });",
            "import { notify } from '@imj_media';\n\n    notify.message({\n      stackGroup: 'primary',\n      title: 'Brand',\n      message: 'Mazo primary',\n      duration: 8000,\n    });\n\n    notify.message({\n      stackGroup: 'secondary',\n      title: 'Neutral',\n      message: 'Mazo secondary',\n      duration: 8000,\n    });",
            "import { notification } from '@imj_media';\n\n    notification.message({ title: 'Encola en auto' });\n    notification.dismissStack('auto');\n    notification.dismissStack('primary');\n    notification.dismissStack('secondary');",
            "// 1) App\n    import { notify, Messaging } from '@imj_media';\n\n    export const App = () => (\n      <>\n        <Messaging />\n        {/* … */}\n      </>\n    );\n\n    // 2) Defaults del servicio (opcional)\n    notify.configureNotification({ duration: 8000, stackMax: 3, showTimer: true });\n\n    // 3) Encolar: campos de tarjeta en la raíz (equivalente a anidarlos en \\`notification\\`)\n    notify.message({\n      title: 'Título corto',\n      message: 'Cuerpo por defecto',\n      duration: 10000,\n      stackGroup: 'secondary', // u omitir → mazo \\`auto\\`\n      appearance: { intent: 'preventiva', variant: 'outlined' },\n      content: { title: 'Título corto', kind: 'default', description: 'Texto largo…' },\n      meta: { presentation: 'popup' },\n      events: { onClose: () => {} },\n    });",
            "import { notify, Messaging } from '@imj_media';\n\n    // En la app: <Messaging />\n    notify.message({\n      title: 'Aviso',\n      message: 'Texto breve con la apariencia por defecto del sistema.',\n      duration: 8000,\n      // Equivale a appearance: { intent: 'informativa' } (valor por defecto del componente Notification)\n    });",
            "import { notify } from '@imj_media';\n\n    // Mismo tipo: stack compartido (máx. stackMax, por defecto 3)\n    notify.message({ stackGroup: 'primary',  title: 'Mensaje 1' })\n    notify.message({ stackGroup: 'primary',  title: 'Mensaje 2' })\n    notify.message({ stackGroup: 'primary',  title: 'Mensaje 3' }) // Contador en la frontal\n\n    // Configurar tamaño del stack (opcional)\n    notify.configureNotification({ stackMax: 5 })\n\n    // stackGroup 'secondary' usa otro mazo\n    notify.message({ stackGroup: 'secondary',  title: 'Recordatorio' })\n    notify.message({ stackGroup: 'secondary',  title: 'Otro recordatorio' })",
            "import { notify } from '@imj_media';\n\n    // Mismo mazo primary: cada encolado con título y mensaje distintos\n    notify.message({\n      stackGroup: 'primary',\n      title: 'Actualización · #1',\n      subtitle: 'Hora 14:05:12',\n      message: 'Revisa el panel principal. (seq 1)',\n    });\n\n    // En la app: setInterval o scheduler que encole copy nuevo cada N ms\n    // notify.message({ stackGroup: 'primary', title: '…', message: '…' });",
            "import { notify } from '@imj_media';\n\n    // Una notificación en el mazo (sin pie de apilado)\n    notify.message({\n      stackGroup: 'primary',\n      title: 'Actualización · #1',\n      message: 'Revisa el panel principal. (seq 1)',\n    });\n\n    // Dos en el mismo mazo: la frontal muestra leyenda personalizada\n    notify.message({\n      stackGroup: 'primary',\n      title: 'Aviso · #2',\n      message: 'Hay cambios pendientes. (seq 2)',\n    });\n    notify.message({\n      stackGroup: 'primary',\n      title: 'Alerta · #3',\n      message: 'La cola se ha actualizado. (seq 3)',\n      stackSummaryLegend: 'Tienes 8 mensajes sin leer',\n    });",
            "// Cada nueva notificación reinicia el timer\n    notify.message({ stackGroup: 'primary',  title: 'Mensaje 1' }) // Timer: 5s\n    // Después de 2s...\n    notify.message({ stackGroup: 'primary',  title: 'Mensaje 2' }) // Timer: 5s (reiniciado)"
          ]
        },
        {
          "name": "Messaging",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "jsdoc": "Componente unificado que renderiza tanto toasts como notificaciones",
            "readme": "# Módulo Message (`@imj_media/ui`)\n\nSuperficie del design system para **mensajes efímeros en pantalla**: toasts (mensajes cortos apilables) y **notificaciones** (tarjetas agrupables por posición y “mazos” `primary` / `secondary` / `auto`). Todo se pinta vía **portal** en `document.body` para no romper el flujo del layout de la app.\n\n## Qué resuelve y cómo se reparte la API\n\n| Concepto | Rol | API imperativa típica | Host React |\n|----------|-----|----------------------|------------|\n| **Toast** | Mensaje temporal apilable (éxito, error, info, warning, genérico). | `toast.*` delega en `messageService` (véase `Message.services.ts`). | `<Toaster />` solo toasts. |\n| **Notificación** | Tarjeta agrupada (`notification.message`, stacks, dismiss por grupo/mazo). | `notification.*` delega en `notificationService`. | `<Notifier />` solo notificaciones. |\n| **`notify`** | **Fachada unificada**: expone métodos de toast **y** de notificación (`notify.message`, `notify.dismissNotificationStack`, etc.) para un solo import en consumidores. | `notify` en `Message.services.ts`. | Cualquiera de los hosts; suele usarse con `<Messaging />` si la app necesita ambos. |\n| **`Messaging`** | Un único portal que monta **toasts y notificaciones** (combina `MessagePositions` + `NotificationPositions`). | Igual que arriba (`toast`, `notification`, `notify`). | `<Messaging />` |\n\n**`Toaster` + `Notifier` vs `Messaging`:** son equivalentes en datos (mismos hooks/servicios); la diferencia es **qué montas en el árbol**. Si solo usas toasts, basta `<Toaster />`. Si solo notificaciones, `<Notifier />`. Si la aplicación mezcla ambos, `<Messaging />` evita duplicar portales. Sin al menos uno de estos componentes en la app, las llamadas imperativas no tienen dónde renderizarse.\n\nPara exports desde el paquete: el barrel del módulo reexporta componentes y la API vía `Message.api.ts` (consumo desde `@imj_media/ui` según el `index` del paquete).\n\n## Estructura de carpetas\n\n```\nMessage/\n├── components/",
            "confidence": "medium"
          },
          "examples": [
            "import { notify, Messaging, Button } from '@imj_media';\n\n    export const App = () => (\n      <div>\n        <Messaging />\n        <Button onClick={() => notify.success(\"Operación exitosa!\")}>\n          Mostrar mensaje\n        </Button>\n      </div>\n    )",
            "import { notify } from '@imj_media';\n\n    // Mensajes básicos\n    notify.success(\"Operación completada exitosamente\")\n    notify.error(\"Ha ocurrido un error\")\n    notify.info(\"Información importante\")\n    notify.warning(\"Advertencia: acción requerida\")\n    \n    // Notificaciones agrupadas (mazos)\n    notify.message({ stackGroup: 'secondary', title: 'Mensaje informativo neutro' })\n    notify.message({ title: '¡Nueva funcionalidad disponible!' })",
            "// ✅ Código existente sigue funcionando sin cambios\n    import { toast, Toaster, Button } from '@imj_media';\n\n    export const App = () => (\n      <div>\n        <Toaster />\n        <Button onClick={() => toast.success(\"Hello, world!\")}>\n          Mostrar toast\n        </Button>\n      </div>\n    )",
            "import { toast } from '@imj_media';\n\n    toast.success('Toast con API legacy');\n    toast.error('Error con toast legacy');\n    toast.info('Info con toast legacy');",
            "// ============================================\n    // FORMA ANTIGUA (toast)\n    // ============================================\n    import { toast, Toaster } from '@imj_media';\n    \n    toast.success(\"Mensaje\")\n    toast.error(\"Error\")\n    toast.info(\"Info\")\n    toast.warning(\"Warning\")\n\n    // ============================================\n    // FORMA NUEVA (notify) - Recomendada\n    // ============================================\n    import { notify, Messaging } from '@imj_media';\n    \n    notify.success(\"Mensaje\")\n    notify.error(\"Error\")\n    notify.info(\"Info\")\n    notify.warning(\"Warning\")\n    \n    // ✨ Métodos adicionales\n    notify.message({ stackGroup: 'secondary', title: 'Mensaje neutro' })\n    notify.message({ title: 'Mensaje de marca' })",
            "// 1) App\n    import { notify, Messaging } from '@imj_media';\n\n    export const App = () => (\n      <>\n        <Messaging />\n        {/* … */}\n      </>\n    );\n\n    // 2) Defaults del servicio (opcional)\n    notify.configureNotification({ duration: 8000, stackMax: 3, showTimer: true });\n\n    // 3) Encolar: campos de tarjeta en la raíz (equivalente a anidarlos en \\",
            "import { notify } from '@imj_media';\n\n    notify.message({\n      title: 'Cola única',\n      message: 'Todas las intenciones comparten el mazo auto.',\n      duration: 8000,\n      appearance: { intent: 'informativa' },\n    });",
            "import { notify } from '@imj_media';\n\n    notify.message({\n      stackGroup: 'primary',\n      title: 'Brand',\n      message: 'Mazo primary',\n      duration: 8000,\n    });\n\n    notify.message({\n      stackGroup: 'secondary',\n      title: 'Neutral',\n      message: 'Mazo secondary',\n      duration: 8000,\n    });",
            "import { notification } from '@imj_media';\n\n    notification.message({ title: 'Encola en auto' });\n    notification.dismissStack('auto');\n    notification.dismissStack('primary');\n    notification.dismissStack('secondary');",
            "// 1) App\n    import { notify, Messaging } from '@imj_media';\n\n    export const App = () => (\n      <>\n        <Messaging />\n        {/* … */}\n      </>\n    );\n\n    // 2) Defaults del servicio (opcional)\n    notify.configureNotification({ duration: 8000, stackMax: 3, showTimer: true });\n\n    // 3) Encolar: campos de tarjeta en la raíz (equivalente a anidarlos en \\`notification\\`)\n    notify.message({\n      title: 'Título corto',\n      message: 'Cuerpo por defecto',\n      duration: 10000,\n      stackGroup: 'secondary', // u omitir → mazo \\`auto\\`\n      appearance: { intent: 'preventiva', variant: 'outlined' },\n      content: { title: 'Título corto', kind: 'default', description: 'Texto largo…' },\n      meta: { presentation: 'popup' },\n      events: { onClose: () => {} },\n    });",
            "import { notify, Messaging } from '@imj_media';\n\n    // En la app: <Messaging />\n    notify.message({\n      title: 'Aviso',\n      message: 'Texto breve con la apariencia por defecto del sistema.',\n      duration: 8000,\n      // Equivale a appearance: { intent: 'informativa' } (valor por defecto del componente Notification)\n    });",
            "import { notify } from '@imj_media';\n\n    // Mismo tipo: stack compartido (máx. stackMax, por defecto 3)\n    notify.message({ stackGroup: 'primary',  title: 'Mensaje 1' })\n    notify.message({ stackGroup: 'primary',  title: 'Mensaje 2' })\n    notify.message({ stackGroup: 'primary',  title: 'Mensaje 3' }) // Contador en la frontal\n\n    // Configurar tamaño del stack (opcional)\n    notify.configureNotification({ stackMax: 5 })\n\n    // stackGroup 'secondary' usa otro mazo\n    notify.message({ stackGroup: 'secondary',  title: 'Recordatorio' })\n    notify.message({ stackGroup: 'secondary',  title: 'Otro recordatorio' })",
            "import { notify } from '@imj_media';\n\n    // Mismo mazo primary: cada encolado con título y mensaje distintos\n    notify.message({\n      stackGroup: 'primary',\n      title: 'Actualización · #1',\n      subtitle: 'Hora 14:05:12',\n      message: 'Revisa el panel principal. (seq 1)',\n    });\n\n    // En la app: setInterval o scheduler que encole copy nuevo cada N ms\n    // notify.message({ stackGroup: 'primary', title: '…', message: '…' });",
            "import { notify } from '@imj_media';\n\n    // Una notificación en el mazo (sin pie de apilado)\n    notify.message({\n      stackGroup: 'primary',\n      title: 'Actualización · #1',\n      message: 'Revisa el panel principal. (seq 1)',\n    });\n\n    // Dos en el mismo mazo: la frontal muestra leyenda personalizada\n    notify.message({\n      stackGroup: 'primary',\n      title: 'Aviso · #2',\n      message: 'Hay cambios pendientes. (seq 2)',\n    });\n    notify.message({\n      stackGroup: 'primary',\n      title: 'Alerta · #3',\n      message: 'La cola se ha actualizado. (seq 3)',\n      stackSummaryLegend: 'Tienes 8 mensajes sin leer',\n    });",
            "// Cada nueva notificación reinicia el timer\n    notify.message({ stackGroup: 'primary',  title: 'Mensaje 1' }) // Timer: 5s\n    // Después de 2s...\n    notify.message({ stackGroup: 'primary',  title: 'Mensaje 2' }) // Timer: 5s (reiniciado)"
          ]
        }
      ]
    },
    {
      "id": "Modal",
      "path": "src/modules/Modal",
      "legacy": false,
      "compositionType": 2,
      "exports": [
        {
          "name": "Modal",
          "kind": "compound-root",
          "description": {
            "primary": "storybook",
            "storybook": "El componente ModalImage permite mostrar una imagen dentro de un modal. Soporta modo thumbnail que se expande al hacer clic, opcionalmente otra URL (",
            "readme": "# Modal Component\n\nComponente de modal/diálogo versátil y configurable con soporte para múltiples tamaños, botones personalizados, tabs, iconos, badges y un sistema de compound components.\n\n## Estructura\n\n```\nModal/\n├── Modal.tsx              # Componente principal\n├── components/            # Subcomponentes (Header, Body, Footer)\n├── hooks/                 # Hooks personalizados\n├── context/               # Context para estado del modal\n├── stories/\n│   └── Modal.stories.tsx  # Storybook stories\n└── index.ts              # Export del módulo\n```\n\n## Uso Básico\n\n```tsx\nimport { Modal } from '@imj_media/ui';\n\n// Modal simple\n<Modal\n  isOpen={isOpen}\n  onClose={() => setIsOpen(false)}\n  title=\"Título del Modal\"\n>\n  <Modal.Body>Contenido del modal</Modal.Body>\n</Modal>\n\n// Modal con footer\n<Modal\n  isOpen={isOpen}\n  onClose={() => setIsOpen(false)}\n  title=\"Confirmar acción\"\n>\n  <Modal.Body>¿Estás seguro de que deseas continuar?</Modal.Body>\n  <Modal.Footer>\n    <Button onClick={() => setIsOpen(false)}>Cancelar</Button>\n    <Button onClick={handleConfirm}>Confirmar</Button>\n  </Modal.Footer>\n</Modal>\n```\n\n## Props Principales\n\n### Control del Modal\n\n- `isOpen: boolean` - Si el modal está abierto\n- `onClose: () => void` - Callback para cerrar el modal\n- `title?: string` - Título del modal\n- `size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'` - Tamaño del modal (default: `'md'`)\n- `zIndex?: number` - Z-index del modal (default: `52`, por encima de capas sticky de la tabla)\n\n### Comportamiento\n\n- `showCloseButton?: boolean` - Mostrar botón de cerrar (default: `true`)\n- `disableEscapeClose?: boolean` - Deshabilitar cierre con Escape (default: `false`)\n- `disableOutsideClick?: boolean` - Deshabilitar cierre al hacer clic fuera (default: `false`)\n- `disableOutsideTab?: boolean` - Deshabilitar navegación fuera del modal (default: `true`)\n\n### Iconos y Badges\n\n- `icon?: IconType | AnyIconDefinition` - Icono principal del modal\n- `iconConfig?: ButtonIconConfig` - Configuración com",
            "confidence": "high"
          },
          "examples": [
            "import { useState } from 'react';\n  import { Modal } from '@/modules/Modal';\n  import { Button } from '@/modules/Button';\n\n  export default function Example() {\n    const [isOpen, setIsOpen] = useState(false);\n\n    const handleClose = () => {\n      setIsOpen(false);\n    };\n\n    return (\n      <div>\n        <Button onClick={() => setIsOpen(true)}>\n          Abrir Modal\n        </Button>\n        <Modal\n          isOpen={isOpen}\n          onClose={handleClose}\n          title=\"Modal Básico\"\n        >\n          <Modal.Body>\n            <p>Este es un modal básico con configuración por defecto.</p>\n            <p>Incluye título, botón de cerrar y footer automático.</p>\n          </Modal.Body>\n        </Modal>\n      </div>\n    )\n  }",
            "<Modal\n  isOpen={isOpen}\n  onClose={handleClose}\n  title=\"Título\"\n  closeButton={{ tooltip: true }}\n>\n  <Modal.Body>…</Modal.Body>\n</Modal>\n\n<Modal\n  …\n  closeButton={{ tooltip: true, tooltipLabel: 'Close' }}\n/>",
            "import { useState } from 'react';\n  import { Modal } from '@/modules/Modal';\n  import { Button } from '@/modules/Button';\n\n  export default function Example() {\n    const [isOpen, setIsOpen] = useState(false);\n\n    const handleClose = () => {\n      setIsOpen(false);\n    };\n\n    return (\n      <div>\n        <Button onClick={() => setIsOpen(true)}>\n          Abrir Modal\n        </Button>\n        <Modal\n          isOpen={isOpen}\n          onClose={handleClose}\n          title=\"Modal\"\n          cancelButtonSlotLeft={faMinusCircle}\n          successButtonSlotRight={faPlusCircle}\n        >\n          <Modal.Body>\n            <p>Este es un modal con iconos en los botones.</p>\n          </Modal.Body>\n        </Modal>\n      </div>\n    )\n  }",
            "<Modal\n  isOpen={isOpen}\n  onClose={handleClose}\n  title=\"Confirmar cambios\"\n  footerSlotLayout=\"spread\"\n  cancelButtonSlotLeft={faTimes}\n  successButtonSlotRight={faCheck}\n  onCancel={handleClose}\n  onSuccess={handleSave}\n  closeAtSuccess\n>\n  <Modal.Body>…</Modal.Body>\n</Modal>",
            "import { useState } from 'react';\n  import { Modal } from '@/modules/Modal';\n  import { Button } from '@/modules/Button';\n\n  export default function Example() {\n    const [isOpen, setIsOpen] = useState(false);\n\n    const handleClose = () => {\n      setIsOpen(false);\n    };\n\n    return (\n      <div>\n        <Button onClick={() => setIsOpen(true)}>\n          Abrir Modal\n        </Button>\n        <Modal\n          isOpen={isOpen}\n          onClose={handleClose}\n          title=\"Modal Básico\"\n          headerButtonIcon={faStar}\n          headerButtonOnClick={() => {\n            console.log('clicked');\n          }}\n        >\n          <Modal.Body>\n            <p>Este es un modal básico con configuración por defecto.</p>\n            <p>Incluye título, botón de cerrar y footer automático.</p>\n          </Modal.Body>\n        </Modal>\n      </div>\n    )\n  }",
            "import { useState } from 'react';\nimport { Modal } from '@/modules/Modal';\n\nexport default function DifferentThumbnailSizes() {\n  const [isOpen, setIsOpen] = useState(false);\n  const [thumbnailSize, setThumbnailSize] = useState<'sm' | 'md' | 'lg' | 'xl' | 'auto'>('md');\n\n  return (\n    <Modal isOpen={isOpen} onClose={() => setIsOpen(false)} title=\"Imagen\" size=\"lg\">\n      <Modal.Body>\n        <div className=\"flex flex-col gap-4\">\n          <p>Lorem ipsum dolor sit amet...</p>\n          <div className=\"flex justify-center\">\n            <Modal.Image\n              src={imageSrc}\n              alt={imageAlt}\n              thumbnailMode={true}\n              thumbnailSize={thumbnailSize}\n            />\n          </div>\n          <p>Duis aute irure dolor...</p>\n        </div>\n      </Modal.Body>\n    </Modal>\n  );\n}",
            "import { useState } from 'react';\nimport { Modal } from '@/modules/Modal';\n\nexport default function DifferentPadding() {\n  const [isOpen, setIsOpen] = useState(false);\n  const [padding, setPadding] = useState<'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'>('md');\n\n  return (\n    <Modal isOpen={isOpen} onClose={() => setIsOpen(false)} title=\"Imagen\" size=\"lg\">\n      <Modal.Body>\n        <Modal.Image\n          src={imageSrc}\n          alt={imageAlt}\n          thumbnailMode={true}\n          thumbnailSize=\"md\"\n          padding={padding}\n        />\n      </Modal.Body>\n    </Modal>\n  );\n}",
            "import { useState } from 'react';\nimport { Modal } from '@/modules/Modal';\n\nexport default function DifferentObjectFit() {\n  const [isOpen, setIsOpen] = useState(false);\n  const [objectFit, setObjectFit] = useState<'cover' | 'contain' | 'fill' | 'none' | 'scale-down'>('cover');\n\n  return (\n    <Modal isOpen={isOpen} onClose={() => setIsOpen(false)} title=\"Imagen\" size=\"lg\">\n      <Modal.Body>\n        <Modal.Image\n          src={imageSrc}\n          alt={imageAlt}\n          thumbnailMode={true}\n          thumbnailSize=\"md\"\n          objectFit={objectFit}\n        />\n      </Modal.Body>\n    </Modal>\n  );\n}",
            "import { useState } from 'react';\nimport { Modal } from '@/modules/Modal';\n\nexport default function CombinedProps() {\n  const [isOpen, setIsOpen] = useState(false);\n\n  return (\n    <Modal isOpen={isOpen} onClose={() => setIsOpen(false)} title=\"Imagen Completa\" size=\"xl\">\n      <Modal.Body>\n        <Modal.Image\n          src={imageSrc}\n          alt={imageAlt}\n          thumbnailMode={true}\n          thumbnailSize=\"lg\"\n          padding=\"lg\"\n          objectFit=\"cover\"\n          expandButtonIcon={faImage}\n        />\n      </Modal.Body>\n    </Modal>\n  );\n}",
            "import { useState } from 'react';\nimport { Modal } from '@/modules/Modal';\n\nexport default function DifferentModalSizes() {\n  const [isOpen, setIsOpen] = useState(false);\n  const [modalSize, setModalSize] = useState<'sm' | 'md' | 'lg' | 'xl'>('lg');\n\n  return (\n    <Modal isOpen={isOpen} onClose={() => setIsOpen(false)} title=\"Modal\" size={modalSize}>\n      <Modal.Body>\n        <Modal.Image\n          src={imageSrc}\n          alt={imageAlt}\n          thumbnailMode={true}\n          thumbnailSize=\"md\"\n        />\n      </Modal.Body>\n    </Modal>\n  );\n}",
            "import { useState, useMemo } from 'react';\nimport { Modal } from '@/modules/Modal';\nimport { Table } from '@/modules/Table';\n\n// Definir columnas y datos...\nconst columnasModal = [/* ... */];\nconst datosEjemplo = [/* ... */];\n\nexport function TablaEnModal() {\n  const [isOpen, setIsOpen] = useState(false);\n  const rows = useMemo(() => datosEjemplo, []);\n\n  return (\n    <>\n      <button onClick={() => setIsOpen(true)}>Abrir modal con tabla</button>\n\n      <Modal\n        isOpen={isOpen}\n        onClose={() => setIsOpen(false)}\n        title=\"Listado de usuarios\"\n        size=\"xl\"\n      >\n        <Modal.Body>\n          <div className=\"ui-h-[400px] ui-min-h-0\">\n            <Table\n              columns={columnasModal}\n              rows={rows}\n              empty={{ title: 'Sin datos', description: 'No hay registros para mostrar.' }}\n            />\n          </div>\n        </Modal.Body>\n      </Modal>\n    </>\n  );\n}",
            "import { useState, useMemo } from 'react';\nimport { Modal } from '@/modules/Modal';\nimport { Table } from '@/modules/Table';\n\n// Definir columnas y datos...\nconst columnasModal = [/* ... */];\nconst datosEjemplo = [/* ... */];\n\nexport function TablaEnModal() {\n  const [isOpen, setIsOpen] = useState(false);\n  const rows = useMemo(() => datosEjemplo, []);\n\n  return (\n    <>\n      <button onClick={() => setIsOpen(true)}>Abrir modal con tabla</button>\n\n      <Modal\n        isOpen={isOpen}\n        onClose={() => setIsOpen(false)}\n        title=\"Listado de usuarios\"\n        size=\"xl\"\n      >\n        <Modal.Body>\n          <div className=\"ui-h-[400px] ui-min-h-0\">\n            <Table\n              columns={columnasModal}\n              rows={rows}\n              empty={{ title: 'Sin datos', description: 'No hay registros para mostrar.' }}\n            />\n          </div>\n        </Modal.Body>\n      </Modal>\n    </>\n  );\n}"
          ],
          "props": {
            "groups": {
              "body": {
                "props": {
                  "children": {
                    "name": "children",
                    "type": "React.ReactNode",
                    "required": true
                  },
                  "withPadding": {
                    "name": "withPadding",
                    "type": "boolean",
                    "required": false
                  }
                }
              }
            },
            "deprecatedRoot": [
              {
                "name": "icon",
                "migrateTo": "iconConfig en su lugar\n   */",
                "type": "IconType | AnyIconDefinition"
              },
              {
                "name": "headerButtonIcon",
                "migrateTo": "headerButton en su lugar\n   */",
                "type": "IconType | AnyIconDefinition"
              },
              {
                "name": "badgeIcon",
                "migrateTo": "badge en su lugar\n   */",
                "type": "IconType | AnyIconDefinition"
              },
              {
                "name": "footerButtonIcon",
                "migrateTo": "footerAuxButton en su lugar\n   */",
                "type": "IconType | AnyIconDefinition"
              },
              {
                "name": "cancelButtonText",
                "migrateTo": "footerPrimaryButton (success) y footerSecondaryButton (cancel) en su lugar\n   */",
                "type": "string"
              },
              {
                "name": "tabs",
                "migrateTo": "`tabsConfig",
                "type": "SwitchOption[]"
              },
              {
                "name": "defaultValueTab",
                "migrateTo": "`tabsConfig",
                "type": "string"
              },
              {
                "name": "onChangeTab",
                "migrateTo": "`tabsConfig",
                "type": "(value: string) => void"
              }
            ],
            "flat": {
              "isOpen": {
                "name": "isOpen",
                "type": "boolean",
                "required": true
              },
              "onClose": {
                "name": "onClose",
                "type": "() => void",
                "required": true
              },
              "size": {
                "name": "size",
                "type": "'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full'",
                "required": false
              },
              "children": {
                "name": "children",
                "type": "React.ReactNode",
                "required": true
              },
              "disableEscapeClose": {
                "name": "disableEscapeClose",
                "type": "boolean",
                "required": false
              },
              "disableOutsideTab": {
                "name": "disableOutsideTab",
                "type": "boolean",
                "required": false
              },
              "disableOutsideClick": {
                "name": "disableOutsideClick",
                "type": "boolean",
                "required": false
              },
              "closeAtCorner": {
                "name": "closeAtCorner",
                "type": "boolean",
                "required": false
              },
              "showCloseButton": {
                "name": "showCloseButton",
                "type": "boolean",
                "required": false
              },
              "title": {
                "name": "title",
                "type": "string",
                "required": false
              },
              "zIndex": {
                "name": "zIndex",
                "type": "number",
                "required": false,
                "description": "z-index del overlay raíz. Por defecto `52` (por encima de headers/celdas sticky de `Table`, hasta 51).\n    `50` y `60` (p. ej. AlertDialog anidado) usan tokens; cualquier otro número se aplica vía `style`\n    (p. ej. `1200` para quedar por encima de popovers en portal ~1000)."
              },
              "hideFooter": {
                "name": "hideFooter",
                "type": "boolean",
                "required": false
              },
              "scrollMode": {
                "name": "scrollMode",
                "type": "'scroll' | 'paper'",
                "required": false,
                "description": "Modo de scroll del modal.\n    - `paper` (por defecto): el panel se fija a `100svh - 32px` (16 px top + 16 px bottom), centrado verticalmente; el scroll es interno en `Modal.Body`.\n    - `scroll`: scroll externo en el overlay; el panel crece sin límite y la página scrollea para mostrarlo."
              },
              "sectionPadding": {
                "name": "sectionPadding",
                "type": "'md' | 'sm'",
                "required": false,
                "description": "Padding uniforme de cabecera, cuerpo y pie (`Modal.Header` / `Modal.Body` / `Modal.Footer`).\n    - `md` (por defecto): 16px — diálogo modal.\n    - `sm`: 8px — p. ej. `Popup` con `popoverStructured`."
              },
              "iconConfig": {
                "name": "iconConfig",
                "type": "ModalIcon",
                "required": false,
                "description": "Sistema nuevo: Icono principal del Modal\n    Permite configurar el icono principal de forma más flexible\n    Si se proporciona, tiene prioridad sobre las props legacy (icon, iconDuotonePrimary, etc.)"
              },
              "closeButton": {
                "name": "closeButton",
                "type": "ModalCloseButtonConfig",
                "required": false,
                "description": "Botón de cerrar (cabecera): tooltip opcional. Preferir este bloque frente a extender props sueltas en raíz."
              },
              "headerButton": {
                "name": "headerButton",
                "type": "ModalButton",
                "required": false,
                "description": "Sistema nuevo: Botón del header (modelo cerrado)\n    Solo existe un botón en el header actualmente\n    Si se proporciona, tiene prioridad sobre las props legacy (headerButtonIcon, headerButtonOnClick, etc.)\n    Para casos especiales con múltiples botones, usar headerButtons (array)"
              },
              "headerButtons": {
                "name": "headerButtons",
                "type": "ModalButton[]",
                "required": false,
                "description": "Sistema nuevo: Array de botones del header (para casos especiales)\n    Permite definir múltiples botones cuando se necesite más flexibilidad"
              },
              "badge": {
                "name": "badge",
                "type": "ModalBadge",
                "required": false,
                "description": "Sistema nuevo: Badge del header (modelo cerrado)\n    Solo existe un badge en el header actualmente\n    Si se proporciona, tiene prioridad sobre las props legacy (badgeIcon, badgeLabel, etc.)\n    Para casos especiales con múltiples badges, usar badges (array)"
              },
              "badges": {
                "name": "badges",
                "type": "ModalBadge[]",
                "required": false,
                "description": "Sistema nuevo: Array de badges del header (para casos especiales)\n    Permite definir múltiples badges cuando se necesite más flexibilidad"
              },
              "footerAuxButton": {
                "name": "footerAuxButton",
                "type": "ModalButton",
                "required": false,
                "description": "Sistema nuevo: Botón auxiliar del footer (a la izquierda)\n    Solo existe un botón auxiliar en el footer actualmente\n    Si se proporciona, tiene prioridad sobre las props legacy (footerButtonIcon, footerButtonOnClick, etc.)"
              },
              "footerPrimaryButton": {
                "name": "footerPrimaryButton",
                "type": "ModalButton",
                "required": false,
                "description": "Sistema nuevo: Botones del footer (modelo cerrado)\n    Define específicamente los botones principales del footer (primary = success, secondary = cancel)\n    Si se proporciona, tiene prioridad sobre las props legacy (cancelButtonText, successButtonText, etc.)\n    Para casos especiales con más botones, usar footerButtons (array)"
              },
              "footerSecondaryButton": {
                "name": "footerSecondaryButton",
                "type": "ModalButton",
                "required": false
              },
              "footerButtons": {
                "name": "footerButtons",
                "type": "ModalButton[]",
                "required": false,
                "description": "Sistema nuevo: Array de botones del footer (para casos especiales)\n    Permite definir múltiples botones cuando se necesite más flexibilidad"
              },
              "iconDuotonePrimary": {
                "name": "iconDuotonePrimary",
                "type": "IconFontColor",
                "required": false
              },
              "iconDuotoneSecondary": {
                "name": "iconDuotoneSecondary",
                "type": "IconFontColor",
                "required": false
              },
              "iconDuotoneOpacityPrimary": {
                "name": "iconDuotoneOpacityPrimary",
                "type": "number",
                "required": false
              },
              "iconDuotoneOpacitySecondary": {
                "name": "iconDuotoneOpacitySecondary",
                "type": "number",
                "required": false
              },
              "headerButtonIconDuotonePrimary": {
                "name": "headerButtonIconDuotonePrimary",
                "type": "IconFontColor",
                "required": false
              },
              "headerButtonIconDuotoneSecondary": {
                "name": "headerButtonIconDuotoneSecondary",
                "type": "IconFontColor",
                "required": false
              },
              "headerButtonIconDuotoneOpacityPrimary": {
                "name": "headerButtonIconDuotoneOpacityPrimary",
                "type": "number",
                "required": false
              },
              "headerButtonIconDuotoneOpacitySecondary": {
                "name": "headerButtonIconDuotoneOpacitySecondary",
                "type": "number",
                "required": false
              },
              "headerButtonOnClick": {
                "name": "headerButtonOnClick",
                "type": "() => void",
                "required": false
              },
              "badgeIconDuotonePrimary": {
                "name": "badgeIconDuotonePrimary",
                "type": "IconFontColor",
                "required": false
              },
              "badgeIconDuotoneSecondary": {
                "name": "badgeIconDuotoneSecondary",
                "type": "IconFontColor",
                "required": false
              },
              "badgeIconDuotoneOpacityPrimary": {
                "name": "badgeIconDuotoneOpacityPrimary",
                "type": "number",
                "required": false
              },
              "badgeIconDuotoneOpacitySecondary": {
                "name": "badgeIconDuotoneOpacitySecondary",
                "type": "number",
                "required": false
              },
              "badgeLabel": {
                "name": "badgeLabel",
                "type": "string",
                "required": false
              },
              "footerButtonIconDuotonePrimary": {
                "name": "footerButtonIconDuotonePrimary",
                "type": "IconFontColor",
                "required": false
              },
              "footerButtonIconDuotoneSecondary": {
                "name": "footerButtonIconDuotoneSecondary",
                "type": "IconFontColor",
                "required": false
              },
              "footerButtonIconDuotoneOpacityPrimary": {
                "name": "footerButtonIconDuotoneOpacityPrimary",
                "type": "number",
                "required": false
              },
              "footerButtonIconDuotoneOpacitySecondary": {
                "name": "footerButtonIconDuotoneOpacitySecondary",
                "type": "number",
                "required": false
              },
              "footerButtonOnClick": {
                "name": "footerButtonOnClick",
                "type": "() => void",
                "required": false
              },
              "successButtonText": {
                "name": "successButtonText",
                "type": "string",
                "required": false
              },
              "onCancel": {
                "name": "onCancel",
                "type": "(event?: React.MouseEvent<HTMLButtonElement>) => void",
                "required": false
              },
              "onSuccess": {
                "name": "onSuccess",
                "type": "(event?: React.MouseEvent<HTMLButtonElement>) => void",
                "required": false
              },
              "showCancelButton": {
                "name": "showCancelButton",
                "type": "boolean",
                "required": false
              },
              "showSuccessButton": {
                "name": "showSuccessButton",
                "type": "boolean",
                "required": false
              },
              "closeAtSuccess": {
                "name": "closeAtSuccess",
                "type": "boolean",
                "required": false
              },
              "closeAtCancel": {
                "name": "closeAtCancel",
                "type": "boolean",
                "required": false
              },
              "cancelButtonSlotLeft": {
                "name": "cancelButtonSlotLeft",
                "type": "VisualSlotType",
                "required": false
              },
              "successButtonSlotRight": {
                "name": "successButtonSlotRight",
                "type": "VisualSlotType",
                "required": false
              },
              "disableCancelButton": {
                "name": "disableCancelButton",
                "type": "boolean",
                "required": false
              },
              "disableSuccessButton": {
                "name": "disableSuccessButton",
                "type": "boolean",
                "required": false
              },
              "successButtonColor": {
                "name": "successButtonColor",
                "type": "ButtonColors",
                "required": false
              },
              "footerSlotLayout": {
                "name": "footerSlotLayout",
                "type": "'inline' | 'spread'",
                "required": false,
                "description": "Reparto de iconos en los botones legacy del footer (`cancelButtonSlotLeft` / `successButtonSlotRight`).\n    `spread` aplica `slotLayout={{ var: 'spread', textAlign: 'center' }}` en ambos y reparte el ancho en la fila del footer."
              },
              "tabsConfig": {
                "name": "tabsConfig",
                "type": "ModalTabsConfig",
                "required": false,
                "description": "Pestañas del header: opciones, callbacks y props del Switch en un solo objeto (API recomendada)."
              }
            }
          }
        }
      ],
      "compositionRecipe": {
        "pieces": [
          "Modal",
          "Modal.Header",
          "Modal.Body",
          "Modal.Footer",
          "Modal.Image"
        ],
        "steps": [
          "Controla visibilidad con isOpen y onClose en Modal (raíz).",
          "Compón Header opcional, Body con el contenido y Footer con acciones.",
          "Para tabs, usa tabsConfig en la raíz en lugar de props tabs planas deprecadas."
        ],
        "storyRefs": [
          "Modal.stories.tsx:Default",
          "Modal.stories.tsx:WithTabs"
        ],
        "snippet": "<Modal isOpen={open} onClose={() => setOpen(false)} title=\"Título\">\n  <Modal.Body>Contenido</Modal.Body>\n  <Modal.Footer>\n    <Button onClick={() => setOpen(false)}>Cerrar</Button>\n  </Modal.Footer>\n</Modal>"
      },
      "standaloneSnippet": "import React from 'react';\n\nconst sizeMap = {\n  sm: '400px',\n  md: '560px',\n  lg: '720px',\n};\n\nexport function Modal({\n  isOpen,\n  onClose,\n  title,\n  children,\n  size = 'md',\n}: {\n  isOpen: boolean;\n  onClose: () => void;\n  title?: string;\n  children: React.ReactNode;\n  size?: keyof typeof sizeMap;\n}) {\n  if (!isOpen) return null;\n\n  const handleOverlayClick = (e: React.MouseEvent<HTMLDivElement>) => {\n    if (e.target === e.currentTarget) onClose();\n  };\n\n  return (\n    <div\n      onClick={handleOverlayClick}\n      style={{\n        position: 'fixed',\n        inset: 0,\n        backgroundColor: 'rgba(0, 0, 0, 0.5)',\n        display: 'flex',\n        alignItems: 'center',\n        justifyContent: 'center',\n        zIndex: 1000,\n      }}\n    >\n      <div\n        style={{\n          backgroundColor: 'rgb(255, 255, 255)',\n          borderRadius: '10px',\n          boxShadow: '0 16px 24px -8px rgba(0, 0, 0, 0.3)',\n          width: '100%',\n          maxWidth: sizeMap[size],\n          maxHeight: '85vh',\n          display: 'flex',\n          flexDirection: 'column',\n          overflow: 'hidden',\n        }}\n      >\n        <div\n          style={{\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'space-between',\n            padding: '4px 6px',\n            borderBottom: `1px solid ${'rgb(199, 199, 204)'}`,\n          }}\n        >\n          {title && (\n            <h2\n              style={{\n                margin: 0,\n                fontSize: '18px',\n                fontWeight: '600',\n                color: 'rgb(48, 51, 54)',\n              }}\n            >\n              {title}\n            </h2>\n          )}\n          <button\n            onClick={onClose}\n            aria-label=\"Close\"\n            style={{\n              background: 'none',\n              border: 'none',\n              cursor: 'pointer',\n              fontSize: '20px',\n              color: 'rgb(89, 89, 94)',\n              padding: '4px',\n              lineHeight: '1',\n              marginLeft: 'auto',\n            }}\n          >\n            ×\n          </button>\n        </div>\n        <div\n          style={{\n            padding: '6px',\n            overflowY: 'auto',\n            color: 'rgb(48, 51, 54)',\n            fontSize: '16px',\n            lineHeight: '1.5',\n          }}\n        >\n          {children}\n        </div>\n      </div>\n    </div>\n  );\n}\n"
    },
    {
      "id": "Notification",
      "path": "src/modules/Notification",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Notification",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Notificación (Figma Notification): compone",
            "jsdoc": "Notificación de producto según Figma ([Notification](https://www.figma.com/design/aWDHIXKjf82m6udooBUeZG/Notification)): compone {@link Alert}\ncon API agrupada (`content`, `leading`, `appearance`, `meta`, `events`).",
            "confidence": "high"
          },
          "examples": [
            "import { Notification } from '@imj_media/ui';\n\nexport default function Example() {\n  return (\n    <Notification\n      open\n      content={{\n        title: 'Notification Title',\n        subtitle: 'Subtitle',\n        description:\n          'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet.',\n      }}\n      leading={{ source: 'general' }}\n      appearance={{ intent: 'informativa', showCloseButton: true }}\n      meta={{\n        presentation: 'popup',\n        stackSummary: '5 notificaciones más',\n      }}\n      events={{}}\n    />\n  );\n}",
            "import { Notification } from '@imj_media/ui';\n\nexport default function Example() {\n  return (\n    <div className=\"ui-w-[260px] ui-max-w-full\">\n      <Notification\n        open\n        content={{\n          title:\n            'Título de notificación deliberadamente largo que debe truncarse con puntos suspensivos',\n          subtitle:\n            'Subtítulo extenso en una sola línea cuando el espacio horizontal es limitado en el panel',\n          description:\n            'Cuerpo del mensaje también largo: una sola línea con ellipsis para mantener la altura de la tarjeta predecible.',\n        }}\n        leading={{ source: 'general' }}\n        appearance={{ intent: 'informativa', showCloseButton: true }}\n        meta={{ presentation: 'popup' }}\n        events={{}}\n      />\n    </div>\n  );\n}",
            "import { Notification } from '@imj_media/ui';\n\nexport default function Example() {\n  return (\n    <div className=\"ui-w-[260px] ui-max-w-full\">\n      <Notification\n        open\n        content={{\n          kind: 'message',\n          title: 'Título largo que se corta en una sola línea con ellipsis en panel estrecho',\n          subtitle:\n            'Subtítulo igualmente extenso para validar truncado junto al icono y al cerrar',\n          messageText:\n            'Alex Manrique: mensaje citado muy largo que debe mostrarse en una sola línea dentro del panel con fondo y puntos suspensivos al final.',\n        }}\n        leading={{ source: 'general' }}\n        appearance={{ intent: 'informativa', showCloseButton: true }}\n        meta={{ presentation: 'popup' }}\n        events={{}}\n      />\n    </div>\n  );\n}",
            "import { Notification } from '@imj_media/ui';\n\nexport default function Example() {\n  return (\n    <Notification\n      open\n      content={{\n        title: 'Notification Title',\n        subtitle: 'Subtitle',\n        description:\n          'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet.',\n      }}\n      leading={{ source: 'general' }}\n      appearance={{ intent: 'confirmacion', showCloseButton: true }}\n      meta={{ presentation: 'popup', stackSummary: '5 notificaciones más' }}\n      events={{}}\n    />\n  );\n}",
            "import { Notification } from '@imj_media/ui';\n\nexport default function Example() {\n  return (\n    <Notification\n      open\n      content={{\n        title: 'Notification Title',\n        subtitle: 'Subtitle',\n        description:\n          'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet.',\n      }}\n      leading={{ source: 'general' }}\n      appearance={{ intent: 'preventiva', showCloseButton: true }}\n      meta={{ presentation: 'popup', stackSummary: '5 notificaciones más' }}\n      events={{}}\n    />\n  );\n}"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "type": {
                "name": "type",
                "type": "'notification'",
                "required": false
              },
              "color": {
                "name": "color",
                "type": "NotificationColor",
                "required": true
              },
              "avatar": {
                "name": "avatar",
                "type": "string",
                "required": false
              },
              "icon": {
                "name": "icon",
                "type": "IconType | AnyIconDefinition",
                "required": false
              },
              "subtitle": {
                "name": "subtitle",
                "type": "string",
                "required": false
              },
              "count": {
                "name": "count",
                "type": "number",
                "required": false,
                "description": "Total de notificaciones en el grupo (cola); la UI puede mostrarlo en la tarjeta frontal"
              },
              "timerProgress": {
                "name": "timerProgress",
                "type": "number",
                "required": false
              },
              "showTimer": {
                "name": "showTimer",
                "type": "boolean",
                "required": false
              },
              "notificationCard": {
                "name": "notificationCard",
                "type": "Partial<Omit<NotificationCardProps, 'open'>>",
                "required": false,
                "description": "Overrides del componente Notification (Figma); los rellena `notify.message({ notification })`\n    y se fusionan al renderizar la tarjeta."
              }
            }
          }
        }
      ],
      "standaloneSnippet": "import React, { useState } from 'react';\n\nconst variantMap: Record<string, { color: string; icon: string }> = {\n  info: { color: 'rgb(5, 181, 212)', icon: 'ℹ' },\n  success: { color: 'rgb(33, 196, 94)', icon: '✓' },\n  warning: { color: 'rgb(235, 179, 8)', icon: '⚠' },\n  error: { color: 'rgb(240, 69, 69)', icon: '✕' },\n};\n\ninterface NotificationProps {\n  title: string;\n  message?: string;\n  variant?: 'info' | 'success' | 'warning' | 'error';\n  closable?: boolean;\n  onClose?: () => void;\n}\n\nexport function Notification({\n  title,\n  message,\n  variant = 'info',\n  closable = false,\n  onClose,\n}: NotificationProps) {\n  const [visible, setVisible] = useState(true);\n  const v = variantMap[variant];\n\n  if (!visible) return null;\n\n  const handleClose = () => {\n    setVisible(false);\n    onClose?.();\n  };\n\n  return (\n    <div\n      role=\"alert\"\n      style={{\n        display: 'flex',\n        alignItems: 'flex-start',\n        gap: '12px',\n        padding: '4px',\n        backgroundColor: 'rgb(255, 255, 255)',\n        borderRadius: '8px',\n        borderLeft: `4px solid ${v.color}`,\n        boxShadow: '0 4px 8px -2px rgba(0, 0, 0, 0.2)',\n      }}\n    >\n      <span\n        style={{\n          flexShrink: 0,\n          width: 24,\n          height: 24,\n          display: 'flex',\n          alignItems: 'center',\n          justifyContent: 'center',\n          fontSize: '16px',\n          color: v.color,\n        }}\n      >\n        {v.icon}\n      </span>\n      <div style={{ flex: 1, minWidth: 0 }}>\n        <div\n          style={{\n            fontWeight: '600',\n            fontSize: '14px',\n            color: 'rgb(48, 51, 54)',\n            marginBottom: message ? '4px' : 0,\n          }}\n        >\n          {title}\n        </div>\n        {message && (\n          <div\n            style={{\n              fontSize: '14px',\n              color: 'rgb(89, 89, 94)',\n            }}\n          >\n            {message}\n          </div>\n        )}\n      </div>\n      {closable && (\n        <button\n          type=\"button\"\n          onClick={handleClose}\n          aria-label=\"Close notification\"\n          style={{\n            flexShrink: 0,\n            border: 'none',\n            background: 'none',\n            cursor: 'pointer',\n            color: 'rgb(89, 89, 94)',\n            fontSize: '16px',\n            padding: '4px',\n            lineHeight: 1,\n          }}\n        >\n          \\u00d7\n        </button>\n      )}\n    </div>\n  );\n}\n"
    },
    {
      "id": "Pagination",
      "path": "src/modules/Pagination",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Pagination",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Pagination permite navegar entre páginas de contenido.",
            "jsdoc": "Pagination - Componente de paginación\nComponente de paginación que permite navegar entre páginas de datos.\nSoporta selector de tamaño de página, contador de páginas visibles y navegación con botones.",
            "confidence": "high"
          },
          "examples": [
            "import { Pagination } from '@/modules/Pagination';\n  import { useState } from 'react';\n\n  export default function Example() {\n    const [currentPage, setCurrentPage] = useState(1);\n\n    return (\n      <Pagination \n        currentPage={currentPage} \n        pageCount={10} \n        onPageChange={setCurrentPage} \n      />\n    )\n  }",
            "import { Pagination } from '@/modules/Pagination';\n  import { useState } from 'react';\n\n  export default function Example() {\n    const [currentPage, setCurrentPage] = useState(1);\n\n    return (\n      <Pagination \n        currentPage={currentPage} \n        pageCount={10} \n        onPageChange={setCurrentPage} \n      />\n    )\n  }",
            "import { Pagination } from '@/modules/Pagination';\n  import { useState } from 'react';\n\n  export default function Example() {\n    const [currentPage, setCurrentPage] = useState(1);\n\n    return (\n      <Pagination \n        currentPage={currentPage} \n        pageCount={10} \n        onPageChange={setCurrentPage} \n      />\n    )\n  }",
            "import { Pagination } from '@/modules/Pagination';\n  import { useState } from 'react';\n\n  export default function Example() {\n    const [currentPage, setCurrentPage] = useState(1);\n\n    return (\n      <Pagination \n        currentPage={currentPage} \n        pageCount={10} \n        onPageChange={setCurrentPage} \n      />\n    )\n  }",
            "import { Pagination } from '@/modules/Pagination';\n  import { useState } from 'react';\n\n  export default function Example() {\n    const [currentPage, setCurrentPage] = useState(1);\n\n    return (\n      <Pagination \n        currentPage={currentPage} \n        pageCount={10} \n        onPageChange={setCurrentPage} \n      />\n    )\n  }"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "currentPage": {
                "name": "currentPage",
                "type": "number",
                "required": true
              },
              "pageCount": {
                "name": "pageCount",
                "type": "number",
                "required": true
              },
              "showingPagesText": {
                "name": "showingPagesText",
                "type": "string",
                "required": false
              },
              "pageSize": {
                "name": "pageSize",
                "type": "number",
                "required": false
              },
              "pageSizeText": {
                "name": "pageSizeText",
                "type": "string",
                "required": false
              },
              "total": {
                "name": "total",
                "type": "number",
                "required": false
              },
              "optionsSize": {
                "name": "optionsSize",
                "type": "DropdownOption[]",
                "required": false
              },
              "onPageChange": {
                "name": "onPageChange",
                "type": "(page: number) => void",
                "required": true
              },
              "handlePageSize": {
                "name": "handlePageSize",
                "type": "(pageSize: number) => void",
                "required": false
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "maxVisiblePages": {
                "name": "maxVisiblePages",
                "type": "number",
                "required": false
              },
              "showVisiblePages": {
                "name": "showVisiblePages",
                "type": "boolean",
                "required": false
              },
              "showPagesSelector": {
                "name": "showPagesSelector",
                "type": "boolean",
                "required": false
              },
              "showPagesCount": {
                "name": "showPagesCount",
                "type": "boolean",
                "required": false
              }
            }
          }
        }
      ]
    },
    {
      "id": "PickerColor",
      "path": "src/modules/PickerColor",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "PickerColor",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Un componente para seleccionar colores en formato hexadecimal. Incluye un selector visual con colores recientes y recomendados, y persistencia en localStorage.",
            "confidence": "medium"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "value": {
                "name": "value",
                "type": "string",
                "required": false,
                "description": "Valor del color en formato hexadecimal"
              },
              "defaultValue": {
                "name": "defaultValue",
                "type": "string",
                "required": false,
                "description": "Valor por defecto del color"
              },
              "onColorChange": {
                "name": "onColorChange",
                "type": "(color: string) => void",
                "required": false,
                "description": "Callback cuando se selecciona un color"
              },
              "maxRecentColors": {
                "name": "maxRecentColors",
                "type": "number",
                "required": false,
                "description": "Número máximo de colores recientes a guardar"
              },
              "initialRecentColors": {
                "name": "initialRecentColors",
                "type": "string[]",
                "required": false,
                "description": "Colores recientes iniciales"
              },
              "closeOnSelect": {
                "name": "closeOnSelect",
                "type": "boolean",
                "required": false,
                "description": "Si se debe cerrar el popup al seleccionar un color"
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clase personalizada para el contenedor"
              },
              "inputProps": {
                "name": "inputProps",
                "type": "Partial<InputProps>",
                "required": false,
                "description": "Props adicionales para el Input"
              },
              "popupProps": {
                "name": "popupProps",
                "type": "Partial<PopupProps>",
                "required": false,
                "description": "Props adicionales para el Popup"
              },
              "label": {
                "name": "label",
                "type": "string",
                "required": false,
                "description": "Label para el Input"
              },
              "error": {
                "name": "error",
                "type": "string",
                "required": false,
                "description": "Mensaje de error"
              },
              "helperText": {
                "name": "helperText",
                "type": "string",
                "required": false,
                "description": "Texto de ayuda"
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false,
                "description": "Si el componente está deshabilitado"
              },
              "position": {
                "name": "position",
                "type": "PopupProps['position']",
                "required": false,
                "description": "Posición del popup"
              },
              "showHexInput": {
                "name": "showHexInput",
                "type": "boolean",
                "required": false,
                "description": "Si mostrar el selector hexadecimal directamente"
              }
            }
          }
        }
      ]
    },
    {
      "id": "Picture",
      "path": "src/modules/Picture",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Picture",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Picture permite mostrar imágenes con diferentes formatos y tamaños.",
            "jsdoc": "Inactivo alineado a Figma **Cards** [233:11229](https://www.figma.com/design/3w0SWvV7C5tDKUybsOcgA4/Cards?node-id=233-11229):\ncapa `bg-fill-tertiary` (#f0f1f2) como en Figma; contenedor con `mix-blend-luminosity`; imagen con brillo/contraste suaves.\nSi un consumidor fuerza `img { filter: none !important }` o anula `mix-blend-mode`, el resultado puede no coincidir.\nSin `src` válido o tras error de carga de imagen se muestra el icono Font Awesome **Image** (regular) en superficie terciaria, en lugar de un SVG raster externo.\n/\nconst PICTURE_DISABLED_IMG_STYLE: CSSProperties = {\n  WebkitFilter: 'brightness(1.06) contrast(0.88)',\n  filter: 'brightness(1.06) contrast(0.88)',\n};\n\n/**\nImagen con variantes de tamaño, radio y estado *disabled* alineado a Figma.\nLos `<img>` usan **`draggable={false}",
            "confidence": "high"
          },
          "examples": [
            "import { Picture } from '@imj_media/ui';\n\n  export default function Example() {\n    const IMAGE = 'https://devobp.imjmedia.com.mx/uploads/small_IMJ-MTY-PAN-O-6458A.jpg'\n    return <Picture src={IMAGE} alt=\"Imagen de ejemplo\" />\n  }",
            "import { Picture } from '@/modules/Picture';\n\n  export default function Example() {\n    const IMAGE = 'https://devobp.imjmedia.com.mx/uploads/small_IMJ-MTY-PAN-O-6458A.jpg'\n    return <StoryBox.Content>\n        <Picture size=\"xs\" src={IMAGE} alt=\"Imagen de ejemplo\" />\n        <Picture size=\"sm\" src={IMAGE} alt=\"Imagen de ejemplo\" />\n        <Picture size=\"md\" src={IMAGE} alt=\"Imagen de ejemplo\" />\n        <Picture size=\"lg\" src={IMAGE} alt=\"Imagen de ejemplo\" />\n        <Picture size=\"xl\" src={IMAGE} alt=\"Imagen de ejemplo\" />\n    </StoryBox.Content>\n  }",
            "import { Picture } from '@/modules/Picture';\n\n  export default function Example() {\n    const IMAGE = 'https://devobp.imjmedia.com.mx/uploads/small_IMJ-MTY-PAN-O-6458A.jpg'\n    return <StoryBox.Content>\n        <Picture src={IMAGE} alt=\"Imagen de ejemplo\" radius=\"none\" />\n        <Picture src={IMAGE} alt=\"Imagen de ejemplo\" radius=\"sm\" />\n        <Picture src={IMAGE} alt=\"Imagen de ejemplo\" radius=\"md\" />\n        <Picture src={IMAGE} alt=\"Imagen de ejemplo\" radius=\"pill\" />\n    </StoryBox.Content>\n  }",
            "import { Picture } from '@/modules/Picture';\n\n  export default function Example() {\n    const IMAGE = 'https://devobp.imjmedia.com.mx/uploads/small_IMJ-MTY-PAN-O-6458A.jpg'\n    return <StoryBox.Content>\n        <Picture src={IMAGE} alt=\"Imagen de ejemplo\" radius=\"none\" square />\n        <Picture src={IMAGE} alt=\"Imagen de ejemplo\" radius=\"sm\" square />\n        <Picture src={IMAGE} alt=\"Imagen de ejemplo\" radius=\"md\" square />\n        <Picture src={IMAGE} alt=\"Imagen de ejemplo\" radius=\"pill\" square />\n    </StoryBox.Content>\n  }",
            "import { Picture } from '@/modules/Picture';\n\n  export default function Example() {\n    const IMAGE = 'https://devobp.imjmedia.com.mx/uploads/small_IMJ-MTY-PAN-O-6458A.jpg'\n    return <StoryBox.Content>\n        <Picture src={IMAGE} alt=\"Imagen de ejemplo\" shadow />\n    </StoryBox.Content>\n  }"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "src": {
                "name": "src",
                "type": "string",
                "required": true
              },
              "alt": {
                "name": "alt",
                "type": "string",
                "required": true
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "loading": {
                "name": "loading",
                "type": "'lazy' | 'eager'",
                "required": false
              },
              "size": {
                "name": "size",
                "type": "'auto' | 'xs' | 'sm' | 'md' | 'lg' | 'xl'",
                "required": false
              },
              "radius": {
                "name": "radius",
                "type": "PillSize",
                "required": false
              },
              "square": {
                "name": "square",
                "type": "boolean",
                "required": false
              },
              "shadow": {
                "name": "shadow",
                "type": "boolean",
                "required": false
              },
              "border": {
                "name": "border",
                "type": "boolean",
                "required": false
              },
              "fillParent": {
                "name": "fillParent",
                "type": "boolean",
                "required": false,
                "description": "Rellena un contenedor posicionado (padre con `position: relative`, p. ej. `aspect-video` + `overflow-hidden`).\n    El `<picture>` usa posición absoluta; la imagen hace cover a todo el caja. Úsalo en cards / héroes de Figma.\n    Con `true` se ignoran `size` y `square` para el layout del `<img>` (solo aplican borde, sombra y radio)."
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false,
                "description": "Inactivo como Figma Cards (Picture): capa `ui-bg-fill-tertiary`, envoltorio `mix-blend-luminosity` y\n    `brightness` / `contrast` suaves en el `<img>`. Ver\n    [233:11229](https://www.figma.com/design/3w0SWvV7C5tDKUybsOcgA4/Cards?node-id=233-11229)."
              }
            }
          }
        }
      ]
    },
    {
      "id": "Popup",
      "path": "src/modules/Popup",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Popup",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "jsdoc": "Popup - Componente de popup/dropdown posicionable y configurable\nComponente de popup que se posiciona relativamente a un trigger, con soporte para múltiples\nposiciones, cierre automático, tooltips, iconos y slots personalizados.",
            "readme": "# Popup Component\n\nComponente de popup/dropdown posicionable y configurable que se posiciona relativamente a un trigger, con soporte para múltiples posiciones, cierre automático, tooltips e iconos.\n\n## Estructura\n\n```\nPopup/\n├── components/\n│   └── organisms/\n│       └── Popup.tsx      # Componente principal\n├── hooks/                  # Hooks personalizados\n├── stories/\n│   └── Popup.stories.tsx   # Storybook stories\n└── index.ts               # Export del módulo\n```\n\n## Uso Básico\n\n```tsx\nimport { Popup } from '@imj_media/ui';\nimport { useRef } from 'react';\n\n// Popup simple\nconst popupRef = useRef<PopupRef>(null);\n\n<Popup ref={popupRef} label=\"Abrir popup\" position=\"bottom-right\">\n  <div>Contenido del popup</div>\n</Popup>;\n```\n\n## Props Principales\n\n### Control del Popup\n\n- `label?: string` - Texto del botón trigger\n- `position?: PopupPosition` - Posición del popup relativa al trigger (default: `'bottom-right'`)\n- `offset?: number` - Distancia en píxeles entre el trigger y el popup (default: `6`)\n- `popupId?: string` - ID único del popup (auto-generado si no se proporciona)\n\n### Comportamiento\n\n- `closeOnClickOutside?: boolean` - Cerrar al hacer clic fuera (default: `true`)\n- `closeOnEscape?: boolean` - Cerrar con tecla Escape (default: `true`)\n- `closeOnClick?: boolean` - Cerrar al hacer clic en el trigger (default: `true`)\n- `disabled?: boolean` - Deshabilitar el popup (default: `false`)\n\n### Estilo del Trigger\n\n- `theme?: 'solid' | 'outlined' | 'text' | 'ghost'` - Tema del botón trigger (default: `'solid'`)\n- `color?: ButtonColors` - Color del botón trigger (default: `'tertiary'`)\n- `size?: 'xs' | 'sm' | 'md' | 'lg'` - Tamaño del botón trigger (default: `'xs'`)\n- `rounded?: boolean` - Bordes redondeados (default: `false`)\n- `pill?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'` - Radio de borde (default: `'xs'`)\n- `borderRadius?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl'` - Radio de borde del popup (default: `'sm'`)\n\n### Slots e Iconos\n\n- `icon?: I",
            "confidence": "medium"
          },
          "examples": [
            "<Popup\n    label=\"Solo texto · inline\"\n    fullWidth\n    position=\"bottom-center\"\n    /* sin leftSlot / rightSlot — slotLayout inline por defecto */\n  >\n    {children}\n  </Popup>",
            "import { BUTTON_SLOT_SPREAD_CENTER } from '@imj_media/ui'; // o tu path de tipos/botón\n\n  <Popup\n    label=\"Centro\"\n    fullWidth\n    slotLayout={BUTTON_SLOT_SPREAD_CENTER}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  >\n    {children}\n  </Popup>\n\n  <Popup\n    label=\"Izquierda\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'left' }}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  />\n\n  <Popup\n    label=\"Derecha\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'right' }}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  />",
            "<Popup\n    label=\"Menú · icono izq.\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'right' }}\n    leftSlot={faBell}\n  >\n    {children}\n  </Popup>",
            "<Popup\n    label=\"Acción · icono dcha.\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'left' }}\n    rightSlot={faAngleDown}\n  >\n    {children}\n  </Popup>",
            "<Popup\n    label=\"Solo texto · inline\"\n    fullWidth\n    position=\"bottom-center\"\n    /* sin leftSlot / rightSlot — slotLayout inline por defecto */\n  >\n    {children}\n  </Popup>"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "children": {
                "name": "children",
                "type": "React.ReactNode",
                "required": true
              },
              "triggerRef": {
                "name": "triggerRef",
                "type": "RefObject<HTMLElement | null>",
                "required": false,
                "description": "Ref al elemento DOM que abre el panel y sirve de ancla (puede vivir fuera del `Popup`).\n    Si se define, no se renderiza el `InnerButton` interno: enlazamos clic (toggle) y, si aplica,\n    `openOnHover` en ese nodo. El panel sigue renderizándose en portal o `absolute` según props.\n    Con `absolute={true}`, el ancla externa debería estar en el mismo subárbol posicionado que el\n    portal del panel para que `offsetTop`/`offsetLeft` sean coherentes; si no, usa `absolute={false}`."
              },
              "label": {
                "name": "label",
                "type": "ReactNode",
                "required": false,
                "description": "Texto o nodo del botón disparador (p. ej. JSX con hover personalizado)."
              },
              "position": {
                "name": "position",
                "type": "| 'top'",
                "required": false
              },
              "offset": {
                "name": "offset",
                "type": "number",
                "required": false,
                "description": "Separación en px entre el trigger y el borde del panel. Con `popoverArrow` activo, el valor\n    se interpreta como separación deseada entre trigger y punta de la flecha (mínimo 6px)."
              },
              "closeOnClickOutside": {
                "name": "closeOnClickOutside",
                "type": "boolean",
                "required": false
              },
              "closeOnEscape": {
                "name": "closeOnEscape",
                "type": "boolean",
                "required": false
              },
              "popupId": {
                "name": "popupId",
                "type": "string",
                "required": false
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "showPanelBorder": {
                "name": "showPanelBorder",
                "type": "boolean",
                "required": false,
                "description": "Borde del panel flotante (`ui-border ui-border-default`). Por defecto `true`.\n    Con `false`: sin contorno, sombra más marcada (`ui-shadow-xl`) y flecha sin trazo con sombra acorde."
              },
              "onOpen": {
                "name": "onOpen",
                "type": "() => void",
                "required": false
              },
              "onClose": {
                "name": "onClose",
                "type": "() => void",
                "required": false
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false
              },
              "absolute": {
                "name": "absolute",
                "type": "boolean",
                "required": false
              },
              "allowOverflow": {
                "name": "allowOverflow",
                "type": "boolean",
                "required": false,
                "description": "Si es `true`, el panel no fuerza `overflow: hidden`, de modo que descendientes posicionados en\n    absoluto (p. ej. `Dropdown` con `popover.absolute: true`) puedan pintarse fuera del rectángulo\n    del popup. Por defecto `false` (mejor recorte con bordes redondeados y scroll interno)."
              },
              "openOnHover": {
                "name": "openOnHover",
                "type": "boolean | number",
                "required": false,
                "description": "Abrir el panel al pasar el ratón por el trigger, tras un retardo.\n    - `false` / omitido: desactivado (por defecto).\n    - `true`: retardo por defecto (200 ms).\n    - número ≥ 0: retardo en ms (`0` = al instante).\n    El clic en el trigger sigue alternando el panel. Para ir al panel sin cerrar, hay un margen al salir del trigger."
              },
              "hoverAnchorFollowPointer": {
                "name": "hoverAnchorFollowPointer",
                "type": "boolean",
                "required": false,
                "description": "Con `openOnHover` activo: el panel se ancla al puntero dentro del trigger (rectángulo 1×1\n    que sigue el ratón), actualizado en cada frame vía `requestAnimationFrame` para un movimiento fluido.\n    Sin efecto si `openOnHover` está desactivado. Aplica al botón interno y a `triggerRef`."
              },
              "openOnHoverAllowPanelPointer": {
                "name": "openOnHoverAllowPanelPointer",
                "type": "boolean",
                "required": false,
                "description": "Con `openOnHover` activo: si es `true` (por defecto), pasar el puntero del trigger al panel\n    cancela el cierre programado (comportamiento “puente”). Si es `false`, el panel no cuenta como\n    zona hover: al salir del trigger el popup se cierra aunque el puntero quede sobre el panel."
              },
              "closeOnClick": {
                "name": "closeOnClick",
                "type": "boolean",
                "required": false
              },
              "buttonClassName": {
                "name": "buttonClassName",
                "type": "string",
                "required": false
              },
              "containerClassName": {
                "name": "containerClassName",
                "type": "string",
                "required": false
              },
              "buttonTransition": {
                "name": "buttonTransition",
                "type": "boolean",
                "required": false
              },
              "buttonStyle": {
                "name": "buttonStyle",
                "type": "React.CSSProperties",
                "required": false
              },
              "borderRadius": {
                "name": "borderRadius",
                "type": "'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl'",
                "required": false
              },
              "stopPropagationList": {
                "name": "stopPropagationList",
                "type": "boolean",
                "required": false
              },
              "popoverArrow": {
                "name": "popoverArrow",
                "type": "PopupArrowMode",
                "required": false,
                "description": "Flecha tipo “beak” hacia el trigger. Por defecto `'auto'` (lado según `position`, punta al centro del trigger).\n    Con `absolute={true}`, `'auto'` no dibuja flecha; usa un objeto `{ edge, align }` o `false` para desactivarla."
              },
              "popoverStructured": {
                "name": "popoverStructured",
                "type": "boolean",
                "required": false,
                "description": "Layout tipo modal (header / cuerpo / footer) reutilizando `ModalProvider` y `Modal.Header|Body|Footer` sin modificar el Modal.\n    El contenido de `children` se renderiza en el cuerpo."
              },
              "popoverTitle": {
                "name": "popoverTitle",
                "type": "string",
                "required": false,
                "description": "Título del encabezado (tipografía H6 del sistema)."
              },
              "popoverDescription": {
                "name": "popoverDescription",
                "type": "string",
                "required": false,
                "description": "Subtítulo / descripción bajo el título."
              },
              "popoverShowHeader": {
                "name": "popoverShowHeader",
                "type": "boolean",
                "required": false,
                "description": "Mostrar bloque de cabecera cuando `popoverStructured` es true."
              },
              "popoverShowCloseButton": {
                "name": "popoverShowCloseButton",
                "type": "boolean",
                "required": false,
                "description": "Mostrar botón cerrar en cabecera (contexto Modal)."
              },
              "popoverIconConfig": {
                "name": "popoverIconConfig",
                "type": "ModalIcon",
                "required": false,
                "description": "Icono principal del header (mismo modelo que Modal)."
              },
              "popoverBadge": {
                "name": "popoverBadge",
                "type": "ModalBadge",
                "required": false
              },
              "popoverBadges": {
                "name": "popoverBadges",
                "type": "ModalBadge[]",
                "required": false
              },
              "popoverHeaderButton": {
                "name": "popoverHeaderButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverHeaderButtons": {
                "name": "popoverHeaderButtons",
                "type": "ModalButton[]",
                "required": false
              },
              "popoverShowFooter": {
                "name": "popoverShowFooter",
                "type": "boolean",
                "required": false,
                "description": "Incluir footer con botones del modelo Modal."
              },
              "popoverFooterPrimaryButton": {
                "name": "popoverFooterPrimaryButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterSecondaryButton": {
                "name": "popoverFooterSecondaryButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterButtons": {
                "name": "popoverFooterButtons",
                "type": "ModalButton[]",
                "required": false
              },
              "popoverFooterAuxButton": {
                "name": "popoverFooterAuxButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterSlotLayout": {
                "name": "popoverFooterSlotLayout",
                "type": "'inline' | 'spread'",
                "required": false,
                "description": "Reparto de iconos en los botones del footer del popover estructurado (`popoverFooterPrimaryButton` /\n    `popoverFooterSecondaryButton` / `popoverFooterButtons`). `spread` equivale a `slotLayout={{ var: 'spread', textAlign: 'center' }}` en cada\n    botón y reparto de ancho en la fila del footer (misma idea que `footerSlotLayout` en `Modal` para botones legacy)."
              },
              "popoverBodyWithPadding": {
                "name": "popoverBodyWithPadding",
                "type": "boolean",
                "required": false,
                "description": "Padding del cuerpo (`Modal.Body withPadding`). Por defecto true."
              }
            }
          }
        },
        {
          "name": "Popover",
          "kind": "component",
          "description": {
            "primary": "readme",
            "readme": "# Popup Component\n\nComponente de popup/dropdown posicionable y configurable que se posiciona relativamente a un trigger, con soporte para múltiples posiciones, cierre automático, tooltips e iconos.\n\n## Estructura\n\n```\nPopup/\n├── components/\n│   └── organisms/\n│       └── Popup.tsx      # Componente principal\n├── hooks/                  # Hooks personalizados\n├── stories/\n│   └── Popup.stories.tsx   # Storybook stories\n└── index.ts               # Export del módulo\n```\n\n## Uso Básico\n\n```tsx\nimport { Popup } from '@imj_media/ui';\nimport { useRef } from 'react';\n\n// Popup simple\nconst popupRef = useRef<PopupRef>(null);\n\n<Popup ref={popupRef} label=\"Abrir popup\" position=\"bottom-right\">\n  <div>Contenido del popup</div>\n</Popup>;\n```\n\n## Props Principales\n\n### Control del Popup\n\n- `label?: string` - Texto del botón trigger\n- `position?: PopupPosition` - Posición del popup relativa al trigger (default: `'bottom-right'`)\n- `offset?: number` - Distancia en píxeles entre el trigger y el popup (default: `6`)\n- `popupId?: string` - ID único del popup (auto-generado si no se proporciona)\n\n### Comportamiento\n\n- `closeOnClickOutside?: boolean` - Cerrar al hacer clic fuera (default: `true`)\n- `closeOnEscape?: boolean` - Cerrar con tecla Escape (default: `true`)\n- `closeOnClick?: boolean` - Cerrar al hacer clic en el trigger (default: `true`)\n- `disabled?: boolean` - Deshabilitar el popup (default: `false`)\n\n### Estilo del Trigger\n\n- `theme?: 'solid' | 'outlined' | 'text' | 'ghost'` - Tema del botón trigger (default: `'solid'`)\n- `color?: ButtonColors` - Color del botón trigger (default: `'tertiary'`)\n- `size?: 'xs' | 'sm' | 'md' | 'lg'` - Tamaño del botón trigger (default: `'xs'`)\n- `rounded?: boolean` - Bordes redondeados (default: `false`)\n- `pill?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'` - Radio de borde (default: `'xs'`)\n- `borderRadius?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl'` - Radio de borde del popup (default: `'sm'`)\n\n### Slots e Iconos\n\n- `icon?: I",
            "confidence": "low"
          },
          "examples": [
            "<Popup\n    label=\"Solo texto · inline\"\n    fullWidth\n    position=\"bottom-center\"\n    /* sin leftSlot / rightSlot — slotLayout inline por defecto */\n  >\n    {children}\n  </Popup>",
            "import { BUTTON_SLOT_SPREAD_CENTER } from '@imj_media/ui'; // o tu path de tipos/botón\n\n  <Popup\n    label=\"Centro\"\n    fullWidth\n    slotLayout={BUTTON_SLOT_SPREAD_CENTER}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  >\n    {children}\n  </Popup>\n\n  <Popup\n    label=\"Izquierda\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'left' }}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  />\n\n  <Popup\n    label=\"Derecha\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'right' }}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  />",
            "<Popup\n    label=\"Menú · icono izq.\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'right' }}\n    leftSlot={faBell}\n  >\n    {children}\n  </Popup>",
            "<Popup\n    label=\"Acción · icono dcha.\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'left' }}\n    rightSlot={faAngleDown}\n  >\n    {children}\n  </Popup>",
            "<Popup\n    label=\"Solo texto · inline\"\n    fullWidth\n    position=\"bottom-center\"\n    /* sin leftSlot / rightSlot — slotLayout inline por defecto */\n  >\n    {children}\n  </Popup>"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "children": {
                "name": "children",
                "type": "React.ReactNode",
                "required": true
              },
              "triggerRef": {
                "name": "triggerRef",
                "type": "RefObject<HTMLElement | null>",
                "required": false,
                "description": "Ref al elemento DOM que abre el panel y sirve de ancla (puede vivir fuera del `Popup`).\n    Si se define, no se renderiza el `InnerButton` interno: enlazamos clic (toggle) y, si aplica,\n    `openOnHover` en ese nodo. El panel sigue renderizándose en portal o `absolute` según props.\n    Con `absolute={true}`, el ancla externa debería estar en el mismo subárbol posicionado que el\n    portal del panel para que `offsetTop`/`offsetLeft` sean coherentes; si no, usa `absolute={false}`."
              },
              "label": {
                "name": "label",
                "type": "ReactNode",
                "required": false,
                "description": "Texto o nodo del botón disparador (p. ej. JSX con hover personalizado)."
              },
              "position": {
                "name": "position",
                "type": "| 'top'",
                "required": false
              },
              "offset": {
                "name": "offset",
                "type": "number",
                "required": false,
                "description": "Separación en px entre el trigger y el borde del panel. Con `popoverArrow` activo, el valor\n    se interpreta como separación deseada entre trigger y punta de la flecha (mínimo 6px)."
              },
              "closeOnClickOutside": {
                "name": "closeOnClickOutside",
                "type": "boolean",
                "required": false
              },
              "closeOnEscape": {
                "name": "closeOnEscape",
                "type": "boolean",
                "required": false
              },
              "popupId": {
                "name": "popupId",
                "type": "string",
                "required": false
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "showPanelBorder": {
                "name": "showPanelBorder",
                "type": "boolean",
                "required": false,
                "description": "Borde del panel flotante (`ui-border ui-border-default`). Por defecto `true`.\n    Con `false`: sin contorno, sombra más marcada (`ui-shadow-xl`) y flecha sin trazo con sombra acorde."
              },
              "onOpen": {
                "name": "onOpen",
                "type": "() => void",
                "required": false
              },
              "onClose": {
                "name": "onClose",
                "type": "() => void",
                "required": false
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false
              },
              "absolute": {
                "name": "absolute",
                "type": "boolean",
                "required": false
              },
              "allowOverflow": {
                "name": "allowOverflow",
                "type": "boolean",
                "required": false,
                "description": "Si es `true`, el panel no fuerza `overflow: hidden`, de modo que descendientes posicionados en\n    absoluto (p. ej. `Dropdown` con `popover.absolute: true`) puedan pintarse fuera del rectángulo\n    del popup. Por defecto `false` (mejor recorte con bordes redondeados y scroll interno)."
              },
              "openOnHover": {
                "name": "openOnHover",
                "type": "boolean | number",
                "required": false,
                "description": "Abrir el panel al pasar el ratón por el trigger, tras un retardo.\n    - `false` / omitido: desactivado (por defecto).\n    - `true`: retardo por defecto (200 ms).\n    - número ≥ 0: retardo en ms (`0` = al instante).\n    El clic en el trigger sigue alternando el panel. Para ir al panel sin cerrar, hay un margen al salir del trigger."
              },
              "hoverAnchorFollowPointer": {
                "name": "hoverAnchorFollowPointer",
                "type": "boolean",
                "required": false,
                "description": "Con `openOnHover` activo: el panel se ancla al puntero dentro del trigger (rectángulo 1×1\n    que sigue el ratón), actualizado en cada frame vía `requestAnimationFrame` para un movimiento fluido.\n    Sin efecto si `openOnHover` está desactivado. Aplica al botón interno y a `triggerRef`."
              },
              "openOnHoverAllowPanelPointer": {
                "name": "openOnHoverAllowPanelPointer",
                "type": "boolean",
                "required": false,
                "description": "Con `openOnHover` activo: si es `true` (por defecto), pasar el puntero del trigger al panel\n    cancela el cierre programado (comportamiento “puente”). Si es `false`, el panel no cuenta como\n    zona hover: al salir del trigger el popup se cierra aunque el puntero quede sobre el panel."
              },
              "closeOnClick": {
                "name": "closeOnClick",
                "type": "boolean",
                "required": false
              },
              "buttonClassName": {
                "name": "buttonClassName",
                "type": "string",
                "required": false
              },
              "containerClassName": {
                "name": "containerClassName",
                "type": "string",
                "required": false
              },
              "buttonTransition": {
                "name": "buttonTransition",
                "type": "boolean",
                "required": false
              },
              "buttonStyle": {
                "name": "buttonStyle",
                "type": "React.CSSProperties",
                "required": false
              },
              "borderRadius": {
                "name": "borderRadius",
                "type": "'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl'",
                "required": false
              },
              "stopPropagationList": {
                "name": "stopPropagationList",
                "type": "boolean",
                "required": false
              },
              "popoverArrow": {
                "name": "popoverArrow",
                "type": "PopupArrowMode",
                "required": false,
                "description": "Flecha tipo “beak” hacia el trigger. Por defecto `'auto'` (lado según `position`, punta al centro del trigger).\n    Con `absolute={true}`, `'auto'` no dibuja flecha; usa un objeto `{ edge, align }` o `false` para desactivarla."
              },
              "popoverStructured": {
                "name": "popoverStructured",
                "type": "boolean",
                "required": false,
                "description": "Layout tipo modal (header / cuerpo / footer) reutilizando `ModalProvider` y `Modal.Header|Body|Footer` sin modificar el Modal.\n    El contenido de `children` se renderiza en el cuerpo."
              },
              "popoverTitle": {
                "name": "popoverTitle",
                "type": "string",
                "required": false,
                "description": "Título del encabezado (tipografía H6 del sistema)."
              },
              "popoverDescription": {
                "name": "popoverDescription",
                "type": "string",
                "required": false,
                "description": "Subtítulo / descripción bajo el título."
              },
              "popoverShowHeader": {
                "name": "popoverShowHeader",
                "type": "boolean",
                "required": false,
                "description": "Mostrar bloque de cabecera cuando `popoverStructured` es true."
              },
              "popoverShowCloseButton": {
                "name": "popoverShowCloseButton",
                "type": "boolean",
                "required": false,
                "description": "Mostrar botón cerrar en cabecera (contexto Modal)."
              },
              "popoverIconConfig": {
                "name": "popoverIconConfig",
                "type": "ModalIcon",
                "required": false,
                "description": "Icono principal del header (mismo modelo que Modal)."
              },
              "popoverBadge": {
                "name": "popoverBadge",
                "type": "ModalBadge",
                "required": false
              },
              "popoverBadges": {
                "name": "popoverBadges",
                "type": "ModalBadge[]",
                "required": false
              },
              "popoverHeaderButton": {
                "name": "popoverHeaderButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverHeaderButtons": {
                "name": "popoverHeaderButtons",
                "type": "ModalButton[]",
                "required": false
              },
              "popoverShowFooter": {
                "name": "popoverShowFooter",
                "type": "boolean",
                "required": false,
                "description": "Incluir footer con botones del modelo Modal."
              },
              "popoverFooterPrimaryButton": {
                "name": "popoverFooterPrimaryButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterSecondaryButton": {
                "name": "popoverFooterSecondaryButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterButtons": {
                "name": "popoverFooterButtons",
                "type": "ModalButton[]",
                "required": false
              },
              "popoverFooterAuxButton": {
                "name": "popoverFooterAuxButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterSlotLayout": {
                "name": "popoverFooterSlotLayout",
                "type": "'inline' | 'spread'",
                "required": false,
                "description": "Reparto de iconos en los botones del footer del popover estructurado (`popoverFooterPrimaryButton` /\n    `popoverFooterSecondaryButton` / `popoverFooterButtons`). `spread` equivale a `slotLayout={{ var: 'spread', textAlign: 'center' }}` en cada\n    botón y reparto de ancho en la fila del footer (misma idea que `footerSlotLayout` en `Modal` para botones legacy)."
              },
              "popoverBodyWithPadding": {
                "name": "popoverBodyWithPadding",
                "type": "boolean",
                "required": false,
                "description": "Padding del cuerpo (`Modal.Body withPadding`). Por defecto true."
              }
            }
          }
        },
        {
          "name": "POPUP_OPEN_ON_HOVER_CLOSE_DELAY_MS",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "jsdoc": "Retardo por defecto al abrir con `openOnHover={true}` (ms). */\nexport const POPUP_OPEN_ON_HOVER_DEFAULT_MS = 200;\n/** Margen al salir del trigger o del panel antes de cerrar (ms).",
            "readme": "# Popup Component\n\nComponente de popup/dropdown posicionable y configurable que se posiciona relativamente a un trigger, con soporte para múltiples posiciones, cierre automático, tooltips e iconos.\n\n## Estructura\n\n```\nPopup/\n├── components/\n│   └── organisms/\n│       └── Popup.tsx      # Componente principal\n├── hooks/                  # Hooks personalizados\n├── stories/\n│   └── Popup.stories.tsx   # Storybook stories\n└── index.ts               # Export del módulo\n```\n\n## Uso Básico\n\n```tsx\nimport { Popup } from '@imj_media/ui';\nimport { useRef } from 'react';\n\n// Popup simple\nconst popupRef = useRef<PopupRef>(null);\n\n<Popup ref={popupRef} label=\"Abrir popup\" position=\"bottom-right\">\n  <div>Contenido del popup</div>\n</Popup>;\n```\n\n## Props Principales\n\n### Control del Popup\n\n- `label?: string` - Texto del botón trigger\n- `position?: PopupPosition` - Posición del popup relativa al trigger (default: `'bottom-right'`)\n- `offset?: number` - Distancia en píxeles entre el trigger y el popup (default: `6`)\n- `popupId?: string` - ID único del popup (auto-generado si no se proporciona)\n\n### Comportamiento\n\n- `closeOnClickOutside?: boolean` - Cerrar al hacer clic fuera (default: `true`)\n- `closeOnEscape?: boolean` - Cerrar con tecla Escape (default: `true`)\n- `closeOnClick?: boolean` - Cerrar al hacer clic en el trigger (default: `true`)\n- `disabled?: boolean` - Deshabilitar el popup (default: `false`)\n\n### Estilo del Trigger\n\n- `theme?: 'solid' | 'outlined' | 'text' | 'ghost'` - Tema del botón trigger (default: `'solid'`)\n- `color?: ButtonColors` - Color del botón trigger (default: `'tertiary'`)\n- `size?: 'xs' | 'sm' | 'md' | 'lg'` - Tamaño del botón trigger (default: `'xs'`)\n- `rounded?: boolean` - Bordes redondeados (default: `false`)\n- `pill?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'` - Radio de borde (default: `'xs'`)\n- `borderRadius?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl'` - Radio de borde del popup (default: `'sm'`)\n\n### Slots e Iconos\n\n- `icon?: I",
            "confidence": "medium"
          },
          "examples": [
            "<Popup\n    label=\"Solo texto · inline\"\n    fullWidth\n    position=\"bottom-center\"\n    /* sin leftSlot / rightSlot — slotLayout inline por defecto */\n  >\n    {children}\n  </Popup>",
            "import { BUTTON_SLOT_SPREAD_CENTER } from '@imj_media/ui'; // o tu path de tipos/botón\n\n  <Popup\n    label=\"Centro\"\n    fullWidth\n    slotLayout={BUTTON_SLOT_SPREAD_CENTER}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  >\n    {children}\n  </Popup>\n\n  <Popup\n    label=\"Izquierda\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'left' }}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  />\n\n  <Popup\n    label=\"Derecha\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'right' }}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  />",
            "<Popup\n    label=\"Menú · icono izq.\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'right' }}\n    leftSlot={faBell}\n  >\n    {children}\n  </Popup>",
            "<Popup\n    label=\"Acción · icono dcha.\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'left' }}\n    rightSlot={faAngleDown}\n  >\n    {children}\n  </Popup>",
            "<Popup\n    label=\"Solo texto · inline\"\n    fullWidth\n    position=\"bottom-center\"\n    /* sin leftSlot / rightSlot — slotLayout inline por defecto */\n  >\n    {children}\n  </Popup>"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "children": {
                "name": "children",
                "type": "React.ReactNode",
                "required": true
              },
              "triggerRef": {
                "name": "triggerRef",
                "type": "RefObject<HTMLElement | null>",
                "required": false,
                "description": "Ref al elemento DOM que abre el panel y sirve de ancla (puede vivir fuera del `Popup`).\n    Si se define, no se renderiza el `InnerButton` interno: enlazamos clic (toggle) y, si aplica,\n    `openOnHover` en ese nodo. El panel sigue renderizándose en portal o `absolute` según props.\n    Con `absolute={true}`, el ancla externa debería estar en el mismo subárbol posicionado que el\n    portal del panel para que `offsetTop`/`offsetLeft` sean coherentes; si no, usa `absolute={false}`."
              },
              "label": {
                "name": "label",
                "type": "ReactNode",
                "required": false,
                "description": "Texto o nodo del botón disparador (p. ej. JSX con hover personalizado)."
              },
              "position": {
                "name": "position",
                "type": "| 'top'",
                "required": false
              },
              "offset": {
                "name": "offset",
                "type": "number",
                "required": false,
                "description": "Separación en px entre el trigger y el borde del panel. Con `popoverArrow` activo, el valor\n    se interpreta como separación deseada entre trigger y punta de la flecha (mínimo 6px)."
              },
              "closeOnClickOutside": {
                "name": "closeOnClickOutside",
                "type": "boolean",
                "required": false
              },
              "closeOnEscape": {
                "name": "closeOnEscape",
                "type": "boolean",
                "required": false
              },
              "popupId": {
                "name": "popupId",
                "type": "string",
                "required": false
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "showPanelBorder": {
                "name": "showPanelBorder",
                "type": "boolean",
                "required": false,
                "description": "Borde del panel flotante (`ui-border ui-border-default`). Por defecto `true`.\n    Con `false`: sin contorno, sombra más marcada (`ui-shadow-xl`) y flecha sin trazo con sombra acorde."
              },
              "onOpen": {
                "name": "onOpen",
                "type": "() => void",
                "required": false
              },
              "onClose": {
                "name": "onClose",
                "type": "() => void",
                "required": false
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false
              },
              "absolute": {
                "name": "absolute",
                "type": "boolean",
                "required": false
              },
              "allowOverflow": {
                "name": "allowOverflow",
                "type": "boolean",
                "required": false,
                "description": "Si es `true`, el panel no fuerza `overflow: hidden`, de modo que descendientes posicionados en\n    absoluto (p. ej. `Dropdown` con `popover.absolute: true`) puedan pintarse fuera del rectángulo\n    del popup. Por defecto `false` (mejor recorte con bordes redondeados y scroll interno)."
              },
              "openOnHover": {
                "name": "openOnHover",
                "type": "boolean | number",
                "required": false,
                "description": "Abrir el panel al pasar el ratón por el trigger, tras un retardo.\n    - `false` / omitido: desactivado (por defecto).\n    - `true`: retardo por defecto (200 ms).\n    - número ≥ 0: retardo en ms (`0` = al instante).\n    El clic en el trigger sigue alternando el panel. Para ir al panel sin cerrar, hay un margen al salir del trigger."
              },
              "hoverAnchorFollowPointer": {
                "name": "hoverAnchorFollowPointer",
                "type": "boolean",
                "required": false,
                "description": "Con `openOnHover` activo: el panel se ancla al puntero dentro del trigger (rectángulo 1×1\n    que sigue el ratón), actualizado en cada frame vía `requestAnimationFrame` para un movimiento fluido.\n    Sin efecto si `openOnHover` está desactivado. Aplica al botón interno y a `triggerRef`."
              },
              "openOnHoverAllowPanelPointer": {
                "name": "openOnHoverAllowPanelPointer",
                "type": "boolean",
                "required": false,
                "description": "Con `openOnHover` activo: si es `true` (por defecto), pasar el puntero del trigger al panel\n    cancela el cierre programado (comportamiento “puente”). Si es `false`, el panel no cuenta como\n    zona hover: al salir del trigger el popup se cierra aunque el puntero quede sobre el panel."
              },
              "closeOnClick": {
                "name": "closeOnClick",
                "type": "boolean",
                "required": false
              },
              "buttonClassName": {
                "name": "buttonClassName",
                "type": "string",
                "required": false
              },
              "containerClassName": {
                "name": "containerClassName",
                "type": "string",
                "required": false
              },
              "buttonTransition": {
                "name": "buttonTransition",
                "type": "boolean",
                "required": false
              },
              "buttonStyle": {
                "name": "buttonStyle",
                "type": "React.CSSProperties",
                "required": false
              },
              "borderRadius": {
                "name": "borderRadius",
                "type": "'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl'",
                "required": false
              },
              "stopPropagationList": {
                "name": "stopPropagationList",
                "type": "boolean",
                "required": false
              },
              "popoverArrow": {
                "name": "popoverArrow",
                "type": "PopupArrowMode",
                "required": false,
                "description": "Flecha tipo “beak” hacia el trigger. Por defecto `'auto'` (lado según `position`, punta al centro del trigger).\n    Con `absolute={true}`, `'auto'` no dibuja flecha; usa un objeto `{ edge, align }` o `false` para desactivarla."
              },
              "popoverStructured": {
                "name": "popoverStructured",
                "type": "boolean",
                "required": false,
                "description": "Layout tipo modal (header / cuerpo / footer) reutilizando `ModalProvider` y `Modal.Header|Body|Footer` sin modificar el Modal.\n    El contenido de `children` se renderiza en el cuerpo."
              },
              "popoverTitle": {
                "name": "popoverTitle",
                "type": "string",
                "required": false,
                "description": "Título del encabezado (tipografía H6 del sistema)."
              },
              "popoverDescription": {
                "name": "popoverDescription",
                "type": "string",
                "required": false,
                "description": "Subtítulo / descripción bajo el título."
              },
              "popoverShowHeader": {
                "name": "popoverShowHeader",
                "type": "boolean",
                "required": false,
                "description": "Mostrar bloque de cabecera cuando `popoverStructured` es true."
              },
              "popoverShowCloseButton": {
                "name": "popoverShowCloseButton",
                "type": "boolean",
                "required": false,
                "description": "Mostrar botón cerrar en cabecera (contexto Modal)."
              },
              "popoverIconConfig": {
                "name": "popoverIconConfig",
                "type": "ModalIcon",
                "required": false,
                "description": "Icono principal del header (mismo modelo que Modal)."
              },
              "popoverBadge": {
                "name": "popoverBadge",
                "type": "ModalBadge",
                "required": false
              },
              "popoverBadges": {
                "name": "popoverBadges",
                "type": "ModalBadge[]",
                "required": false
              },
              "popoverHeaderButton": {
                "name": "popoverHeaderButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverHeaderButtons": {
                "name": "popoverHeaderButtons",
                "type": "ModalButton[]",
                "required": false
              },
              "popoverShowFooter": {
                "name": "popoverShowFooter",
                "type": "boolean",
                "required": false,
                "description": "Incluir footer con botones del modelo Modal."
              },
              "popoverFooterPrimaryButton": {
                "name": "popoverFooterPrimaryButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterSecondaryButton": {
                "name": "popoverFooterSecondaryButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterButtons": {
                "name": "popoverFooterButtons",
                "type": "ModalButton[]",
                "required": false
              },
              "popoverFooterAuxButton": {
                "name": "popoverFooterAuxButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterSlotLayout": {
                "name": "popoverFooterSlotLayout",
                "type": "'inline' | 'spread'",
                "required": false,
                "description": "Reparto de iconos en los botones del footer del popover estructurado (`popoverFooterPrimaryButton` /\n    `popoverFooterSecondaryButton` / `popoverFooterButtons`). `spread` equivale a `slotLayout={{ var: 'spread', textAlign: 'center' }}` en cada\n    botón y reparto de ancho en la fila del footer (misma idea que `footerSlotLayout` en `Modal` para botones legacy)."
              },
              "popoverBodyWithPadding": {
                "name": "popoverBodyWithPadding",
                "type": "boolean",
                "required": false,
                "description": "Padding del cuerpo (`Modal.Body withPadding`). Por defecto true."
              }
            }
          }
        },
        {
          "name": "POPUP_OPEN_ON_HOVER_DEFAULT_MS",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "jsdoc": "Retardo por defecto al abrir con `openOnHover={true}` (ms).",
            "readme": "# Popup Component\n\nComponente de popup/dropdown posicionable y configurable que se posiciona relativamente a un trigger, con soporte para múltiples posiciones, cierre automático, tooltips e iconos.\n\n## Estructura\n\n```\nPopup/\n├── components/\n│   └── organisms/\n│       └── Popup.tsx      # Componente principal\n├── hooks/                  # Hooks personalizados\n├── stories/\n│   └── Popup.stories.tsx   # Storybook stories\n└── index.ts               # Export del módulo\n```\n\n## Uso Básico\n\n```tsx\nimport { Popup } from '@imj_media/ui';\nimport { useRef } from 'react';\n\n// Popup simple\nconst popupRef = useRef<PopupRef>(null);\n\n<Popup ref={popupRef} label=\"Abrir popup\" position=\"bottom-right\">\n  <div>Contenido del popup</div>\n</Popup>;\n```\n\n## Props Principales\n\n### Control del Popup\n\n- `label?: string` - Texto del botón trigger\n- `position?: PopupPosition` - Posición del popup relativa al trigger (default: `'bottom-right'`)\n- `offset?: number` - Distancia en píxeles entre el trigger y el popup (default: `6`)\n- `popupId?: string` - ID único del popup (auto-generado si no se proporciona)\n\n### Comportamiento\n\n- `closeOnClickOutside?: boolean` - Cerrar al hacer clic fuera (default: `true`)\n- `closeOnEscape?: boolean` - Cerrar con tecla Escape (default: `true`)\n- `closeOnClick?: boolean` - Cerrar al hacer clic en el trigger (default: `true`)\n- `disabled?: boolean` - Deshabilitar el popup (default: `false`)\n\n### Estilo del Trigger\n\n- `theme?: 'solid' | 'outlined' | 'text' | 'ghost'` - Tema del botón trigger (default: `'solid'`)\n- `color?: ButtonColors` - Color del botón trigger (default: `'tertiary'`)\n- `size?: 'xs' | 'sm' | 'md' | 'lg'` - Tamaño del botón trigger (default: `'xs'`)\n- `rounded?: boolean` - Bordes redondeados (default: `false`)\n- `pill?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'` - Radio de borde (default: `'xs'`)\n- `borderRadius?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl'` - Radio de borde del popup (default: `'sm'`)\n\n### Slots e Iconos\n\n- `icon?: I",
            "confidence": "medium"
          },
          "examples": [
            "<Popup\n    label=\"Solo texto · inline\"\n    fullWidth\n    position=\"bottom-center\"\n    /* sin leftSlot / rightSlot — slotLayout inline por defecto */\n  >\n    {children}\n  </Popup>",
            "import { BUTTON_SLOT_SPREAD_CENTER } from '@imj_media/ui'; // o tu path de tipos/botón\n\n  <Popup\n    label=\"Centro\"\n    fullWidth\n    slotLayout={BUTTON_SLOT_SPREAD_CENTER}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  >\n    {children}\n  </Popup>\n\n  <Popup\n    label=\"Izquierda\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'left' }}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  />\n\n  <Popup\n    label=\"Derecha\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'right' }}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  />",
            "<Popup\n    label=\"Menú · icono izq.\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'right' }}\n    leftSlot={faBell}\n  >\n    {children}\n  </Popup>",
            "<Popup\n    label=\"Acción · icono dcha.\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'left' }}\n    rightSlot={faAngleDown}\n  >\n    {children}\n  </Popup>",
            "<Popup\n    label=\"Solo texto · inline\"\n    fullWidth\n    position=\"bottom-center\"\n    /* sin leftSlot / rightSlot — slotLayout inline por defecto */\n  >\n    {children}\n  </Popup>"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "children": {
                "name": "children",
                "type": "React.ReactNode",
                "required": true
              },
              "triggerRef": {
                "name": "triggerRef",
                "type": "RefObject<HTMLElement | null>",
                "required": false,
                "description": "Ref al elemento DOM que abre el panel y sirve de ancla (puede vivir fuera del `Popup`).\n    Si se define, no se renderiza el `InnerButton` interno: enlazamos clic (toggle) y, si aplica,\n    `openOnHover` en ese nodo. El panel sigue renderizándose en portal o `absolute` según props.\n    Con `absolute={true}`, el ancla externa debería estar en el mismo subárbol posicionado que el\n    portal del panel para que `offsetTop`/`offsetLeft` sean coherentes; si no, usa `absolute={false}`."
              },
              "label": {
                "name": "label",
                "type": "ReactNode",
                "required": false,
                "description": "Texto o nodo del botón disparador (p. ej. JSX con hover personalizado)."
              },
              "position": {
                "name": "position",
                "type": "| 'top'",
                "required": false
              },
              "offset": {
                "name": "offset",
                "type": "number",
                "required": false,
                "description": "Separación en px entre el trigger y el borde del panel. Con `popoverArrow` activo, el valor\n    se interpreta como separación deseada entre trigger y punta de la flecha (mínimo 6px)."
              },
              "closeOnClickOutside": {
                "name": "closeOnClickOutside",
                "type": "boolean",
                "required": false
              },
              "closeOnEscape": {
                "name": "closeOnEscape",
                "type": "boolean",
                "required": false
              },
              "popupId": {
                "name": "popupId",
                "type": "string",
                "required": false
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "showPanelBorder": {
                "name": "showPanelBorder",
                "type": "boolean",
                "required": false,
                "description": "Borde del panel flotante (`ui-border ui-border-default`). Por defecto `true`.\n    Con `false`: sin contorno, sombra más marcada (`ui-shadow-xl`) y flecha sin trazo con sombra acorde."
              },
              "onOpen": {
                "name": "onOpen",
                "type": "() => void",
                "required": false
              },
              "onClose": {
                "name": "onClose",
                "type": "() => void",
                "required": false
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false
              },
              "absolute": {
                "name": "absolute",
                "type": "boolean",
                "required": false
              },
              "allowOverflow": {
                "name": "allowOverflow",
                "type": "boolean",
                "required": false,
                "description": "Si es `true`, el panel no fuerza `overflow: hidden`, de modo que descendientes posicionados en\n    absoluto (p. ej. `Dropdown` con `popover.absolute: true`) puedan pintarse fuera del rectángulo\n    del popup. Por defecto `false` (mejor recorte con bordes redondeados y scroll interno)."
              },
              "openOnHover": {
                "name": "openOnHover",
                "type": "boolean | number",
                "required": false,
                "description": "Abrir el panel al pasar el ratón por el trigger, tras un retardo.\n    - `false` / omitido: desactivado (por defecto).\n    - `true`: retardo por defecto (200 ms).\n    - número ≥ 0: retardo en ms (`0` = al instante).\n    El clic en el trigger sigue alternando el panel. Para ir al panel sin cerrar, hay un margen al salir del trigger."
              },
              "hoverAnchorFollowPointer": {
                "name": "hoverAnchorFollowPointer",
                "type": "boolean",
                "required": false,
                "description": "Con `openOnHover` activo: el panel se ancla al puntero dentro del trigger (rectángulo 1×1\n    que sigue el ratón), actualizado en cada frame vía `requestAnimationFrame` para un movimiento fluido.\n    Sin efecto si `openOnHover` está desactivado. Aplica al botón interno y a `triggerRef`."
              },
              "openOnHoverAllowPanelPointer": {
                "name": "openOnHoverAllowPanelPointer",
                "type": "boolean",
                "required": false,
                "description": "Con `openOnHover` activo: si es `true` (por defecto), pasar el puntero del trigger al panel\n    cancela el cierre programado (comportamiento “puente”). Si es `false`, el panel no cuenta como\n    zona hover: al salir del trigger el popup se cierra aunque el puntero quede sobre el panel."
              },
              "closeOnClick": {
                "name": "closeOnClick",
                "type": "boolean",
                "required": false
              },
              "buttonClassName": {
                "name": "buttonClassName",
                "type": "string",
                "required": false
              },
              "containerClassName": {
                "name": "containerClassName",
                "type": "string",
                "required": false
              },
              "buttonTransition": {
                "name": "buttonTransition",
                "type": "boolean",
                "required": false
              },
              "buttonStyle": {
                "name": "buttonStyle",
                "type": "React.CSSProperties",
                "required": false
              },
              "borderRadius": {
                "name": "borderRadius",
                "type": "'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl'",
                "required": false
              },
              "stopPropagationList": {
                "name": "stopPropagationList",
                "type": "boolean",
                "required": false
              },
              "popoverArrow": {
                "name": "popoverArrow",
                "type": "PopupArrowMode",
                "required": false,
                "description": "Flecha tipo “beak” hacia el trigger. Por defecto `'auto'` (lado según `position`, punta al centro del trigger).\n    Con `absolute={true}`, `'auto'` no dibuja flecha; usa un objeto `{ edge, align }` o `false` para desactivarla."
              },
              "popoverStructured": {
                "name": "popoverStructured",
                "type": "boolean",
                "required": false,
                "description": "Layout tipo modal (header / cuerpo / footer) reutilizando `ModalProvider` y `Modal.Header|Body|Footer` sin modificar el Modal.\n    El contenido de `children` se renderiza en el cuerpo."
              },
              "popoverTitle": {
                "name": "popoverTitle",
                "type": "string",
                "required": false,
                "description": "Título del encabezado (tipografía H6 del sistema)."
              },
              "popoverDescription": {
                "name": "popoverDescription",
                "type": "string",
                "required": false,
                "description": "Subtítulo / descripción bajo el título."
              },
              "popoverShowHeader": {
                "name": "popoverShowHeader",
                "type": "boolean",
                "required": false,
                "description": "Mostrar bloque de cabecera cuando `popoverStructured` es true."
              },
              "popoverShowCloseButton": {
                "name": "popoverShowCloseButton",
                "type": "boolean",
                "required": false,
                "description": "Mostrar botón cerrar en cabecera (contexto Modal)."
              },
              "popoverIconConfig": {
                "name": "popoverIconConfig",
                "type": "ModalIcon",
                "required": false,
                "description": "Icono principal del header (mismo modelo que Modal)."
              },
              "popoverBadge": {
                "name": "popoverBadge",
                "type": "ModalBadge",
                "required": false
              },
              "popoverBadges": {
                "name": "popoverBadges",
                "type": "ModalBadge[]",
                "required": false
              },
              "popoverHeaderButton": {
                "name": "popoverHeaderButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverHeaderButtons": {
                "name": "popoverHeaderButtons",
                "type": "ModalButton[]",
                "required": false
              },
              "popoverShowFooter": {
                "name": "popoverShowFooter",
                "type": "boolean",
                "required": false,
                "description": "Incluir footer con botones del modelo Modal."
              },
              "popoverFooterPrimaryButton": {
                "name": "popoverFooterPrimaryButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterSecondaryButton": {
                "name": "popoverFooterSecondaryButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterButtons": {
                "name": "popoverFooterButtons",
                "type": "ModalButton[]",
                "required": false
              },
              "popoverFooterAuxButton": {
                "name": "popoverFooterAuxButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterSlotLayout": {
                "name": "popoverFooterSlotLayout",
                "type": "'inline' | 'spread'",
                "required": false,
                "description": "Reparto de iconos en los botones del footer del popover estructurado (`popoverFooterPrimaryButton` /\n    `popoverFooterSecondaryButton` / `popoverFooterButtons`). `spread` equivale a `slotLayout={{ var: 'spread', textAlign: 'center' }}` en cada\n    botón y reparto de ancho en la fila del footer (misma idea que `footerSlotLayout` en `Modal` para botones legacy)."
              },
              "popoverBodyWithPadding": {
                "name": "popoverBodyWithPadding",
                "type": "boolean",
                "required": false,
                "description": "Padding del cuerpo (`Modal.Body withPadding`). Por defecto true."
              }
            }
          }
        },
        {
          "name": "POPUP_ARROW_TILT_LEFT_DEG",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "jsdoc": "Sin contorno en el trazo + sombra (mismo criterio que el panel con `showPanelBorder={false}`).\nEl relleno sigue usando el token de fondo del panel.\n/\n  elevated?: boolean;\n}\n\n/**\nAncho horizontal del beak respecto al path base (`1` = ancho de diseño; menor = más estrecho).\nSe aplica con `scale` en torno a x=14 (centro del viewBox).\n/\nexport const POPUP_ARROW_WIDTH_SCALE = 0.7;\n\n/**\nInclinación fina del beak solo en bordes laterales (deg); 0 = perpendicular a `-90°` / `90°`.\nValores separados por si en diseño hace falta asimetría.",
            "readme": "# Popup Component\n\nComponente de popup/dropdown posicionable y configurable que se posiciona relativamente a un trigger, con soporte para múltiples posiciones, cierre automático, tooltips e iconos.\n\n## Estructura\n\n```\nPopup/\n├── components/\n│   └── organisms/\n│       └── Popup.tsx      # Componente principal\n├── hooks/                  # Hooks personalizados\n├── stories/\n│   └── Popup.stories.tsx   # Storybook stories\n└── index.ts               # Export del módulo\n```\n\n## Uso Básico\n\n```tsx\nimport { Popup } from '@imj_media/ui';\nimport { useRef } from 'react';\n\n// Popup simple\nconst popupRef = useRef<PopupRef>(null);\n\n<Popup ref={popupRef} label=\"Abrir popup\" position=\"bottom-right\">\n  <div>Contenido del popup</div>\n</Popup>;\n```\n\n## Props Principales\n\n### Control del Popup\n\n- `label?: string` - Texto del botón trigger\n- `position?: PopupPosition` - Posición del popup relativa al trigger (default: `'bottom-right'`)\n- `offset?: number` - Distancia en píxeles entre el trigger y el popup (default: `6`)\n- `popupId?: string` - ID único del popup (auto-generado si no se proporciona)\n\n### Comportamiento\n\n- `closeOnClickOutside?: boolean` - Cerrar al hacer clic fuera (default: `true`)\n- `closeOnEscape?: boolean` - Cerrar con tecla Escape (default: `true`)\n- `closeOnClick?: boolean` - Cerrar al hacer clic en el trigger (default: `true`)\n- `disabled?: boolean` - Deshabilitar el popup (default: `false`)\n\n### Estilo del Trigger\n\n- `theme?: 'solid' | 'outlined' | 'text' | 'ghost'` - Tema del botón trigger (default: `'solid'`)\n- `color?: ButtonColors` - Color del botón trigger (default: `'tertiary'`)\n- `size?: 'xs' | 'sm' | 'md' | 'lg'` - Tamaño del botón trigger (default: `'xs'`)\n- `rounded?: boolean` - Bordes redondeados (default: `false`)\n- `pill?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'` - Radio de borde (default: `'xs'`)\n- `borderRadius?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl'` - Radio de borde del popup (default: `'sm'`)\n\n### Slots e Iconos\n\n- `icon?: I",
            "confidence": "medium"
          },
          "examples": [
            "<Popup\n    label=\"Solo texto · inline\"\n    fullWidth\n    position=\"bottom-center\"\n    /* sin leftSlot / rightSlot — slotLayout inline por defecto */\n  >\n    {children}\n  </Popup>",
            "import { BUTTON_SLOT_SPREAD_CENTER } from '@imj_media/ui'; // o tu path de tipos/botón\n\n  <Popup\n    label=\"Centro\"\n    fullWidth\n    slotLayout={BUTTON_SLOT_SPREAD_CENTER}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  >\n    {children}\n  </Popup>\n\n  <Popup\n    label=\"Izquierda\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'left' }}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  />\n\n  <Popup\n    label=\"Derecha\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'right' }}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  />",
            "<Popup\n    label=\"Menú · icono izq.\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'right' }}\n    leftSlot={faBell}\n  >\n    {children}\n  </Popup>",
            "<Popup\n    label=\"Acción · icono dcha.\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'left' }}\n    rightSlot={faAngleDown}\n  >\n    {children}\n  </Popup>",
            "<Popup\n    label=\"Solo texto · inline\"\n    fullWidth\n    position=\"bottom-center\"\n    /* sin leftSlot / rightSlot — slotLayout inline por defecto */\n  >\n    {children}\n  </Popup>"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "children": {
                "name": "children",
                "type": "React.ReactNode",
                "required": true
              },
              "triggerRef": {
                "name": "triggerRef",
                "type": "RefObject<HTMLElement | null>",
                "required": false,
                "description": "Ref al elemento DOM que abre el panel y sirve de ancla (puede vivir fuera del `Popup`).\n    Si se define, no se renderiza el `InnerButton` interno: enlazamos clic (toggle) y, si aplica,\n    `openOnHover` en ese nodo. El panel sigue renderizándose en portal o `absolute` según props.\n    Con `absolute={true}`, el ancla externa debería estar en el mismo subárbol posicionado que el\n    portal del panel para que `offsetTop`/`offsetLeft` sean coherentes; si no, usa `absolute={false}`."
              },
              "label": {
                "name": "label",
                "type": "ReactNode",
                "required": false,
                "description": "Texto o nodo del botón disparador (p. ej. JSX con hover personalizado)."
              },
              "position": {
                "name": "position",
                "type": "| 'top'",
                "required": false
              },
              "offset": {
                "name": "offset",
                "type": "number",
                "required": false,
                "description": "Separación en px entre el trigger y el borde del panel. Con `popoverArrow` activo, el valor\n    se interpreta como separación deseada entre trigger y punta de la flecha (mínimo 6px)."
              },
              "closeOnClickOutside": {
                "name": "closeOnClickOutside",
                "type": "boolean",
                "required": false
              },
              "closeOnEscape": {
                "name": "closeOnEscape",
                "type": "boolean",
                "required": false
              },
              "popupId": {
                "name": "popupId",
                "type": "string",
                "required": false
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "showPanelBorder": {
                "name": "showPanelBorder",
                "type": "boolean",
                "required": false,
                "description": "Borde del panel flotante (`ui-border ui-border-default`). Por defecto `true`.\n    Con `false`: sin contorno, sombra más marcada (`ui-shadow-xl`) y flecha sin trazo con sombra acorde."
              },
              "onOpen": {
                "name": "onOpen",
                "type": "() => void",
                "required": false
              },
              "onClose": {
                "name": "onClose",
                "type": "() => void",
                "required": false
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false
              },
              "absolute": {
                "name": "absolute",
                "type": "boolean",
                "required": false
              },
              "allowOverflow": {
                "name": "allowOverflow",
                "type": "boolean",
                "required": false,
                "description": "Si es `true`, el panel no fuerza `overflow: hidden`, de modo que descendientes posicionados en\n    absoluto (p. ej. `Dropdown` con `popover.absolute: true`) puedan pintarse fuera del rectángulo\n    del popup. Por defecto `false` (mejor recorte con bordes redondeados y scroll interno)."
              },
              "openOnHover": {
                "name": "openOnHover",
                "type": "boolean | number",
                "required": false,
                "description": "Abrir el panel al pasar el ratón por el trigger, tras un retardo.\n    - `false` / omitido: desactivado (por defecto).\n    - `true`: retardo por defecto (200 ms).\n    - número ≥ 0: retardo en ms (`0` = al instante).\n    El clic en el trigger sigue alternando el panel. Para ir al panel sin cerrar, hay un margen al salir del trigger."
              },
              "hoverAnchorFollowPointer": {
                "name": "hoverAnchorFollowPointer",
                "type": "boolean",
                "required": false,
                "description": "Con `openOnHover` activo: el panel se ancla al puntero dentro del trigger (rectángulo 1×1\n    que sigue el ratón), actualizado en cada frame vía `requestAnimationFrame` para un movimiento fluido.\n    Sin efecto si `openOnHover` está desactivado. Aplica al botón interno y a `triggerRef`."
              },
              "openOnHoverAllowPanelPointer": {
                "name": "openOnHoverAllowPanelPointer",
                "type": "boolean",
                "required": false,
                "description": "Con `openOnHover` activo: si es `true` (por defecto), pasar el puntero del trigger al panel\n    cancela el cierre programado (comportamiento “puente”). Si es `false`, el panel no cuenta como\n    zona hover: al salir del trigger el popup se cierra aunque el puntero quede sobre el panel."
              },
              "closeOnClick": {
                "name": "closeOnClick",
                "type": "boolean",
                "required": false
              },
              "buttonClassName": {
                "name": "buttonClassName",
                "type": "string",
                "required": false
              },
              "containerClassName": {
                "name": "containerClassName",
                "type": "string",
                "required": false
              },
              "buttonTransition": {
                "name": "buttonTransition",
                "type": "boolean",
                "required": false
              },
              "buttonStyle": {
                "name": "buttonStyle",
                "type": "React.CSSProperties",
                "required": false
              },
              "borderRadius": {
                "name": "borderRadius",
                "type": "'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl'",
                "required": false
              },
              "stopPropagationList": {
                "name": "stopPropagationList",
                "type": "boolean",
                "required": false
              },
              "popoverArrow": {
                "name": "popoverArrow",
                "type": "PopupArrowMode",
                "required": false,
                "description": "Flecha tipo “beak” hacia el trigger. Por defecto `'auto'` (lado según `position`, punta al centro del trigger).\n    Con `absolute={true}`, `'auto'` no dibuja flecha; usa un objeto `{ edge, align }` o `false` para desactivarla."
              },
              "popoverStructured": {
                "name": "popoverStructured",
                "type": "boolean",
                "required": false,
                "description": "Layout tipo modal (header / cuerpo / footer) reutilizando `ModalProvider` y `Modal.Header|Body|Footer` sin modificar el Modal.\n    El contenido de `children` se renderiza en el cuerpo."
              },
              "popoverTitle": {
                "name": "popoverTitle",
                "type": "string",
                "required": false,
                "description": "Título del encabezado (tipografía H6 del sistema)."
              },
              "popoverDescription": {
                "name": "popoverDescription",
                "type": "string",
                "required": false,
                "description": "Subtítulo / descripción bajo el título."
              },
              "popoverShowHeader": {
                "name": "popoverShowHeader",
                "type": "boolean",
                "required": false,
                "description": "Mostrar bloque de cabecera cuando `popoverStructured` es true."
              },
              "popoverShowCloseButton": {
                "name": "popoverShowCloseButton",
                "type": "boolean",
                "required": false,
                "description": "Mostrar botón cerrar en cabecera (contexto Modal)."
              },
              "popoverIconConfig": {
                "name": "popoverIconConfig",
                "type": "ModalIcon",
                "required": false,
                "description": "Icono principal del header (mismo modelo que Modal)."
              },
              "popoverBadge": {
                "name": "popoverBadge",
                "type": "ModalBadge",
                "required": false
              },
              "popoverBadges": {
                "name": "popoverBadges",
                "type": "ModalBadge[]",
                "required": false
              },
              "popoverHeaderButton": {
                "name": "popoverHeaderButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverHeaderButtons": {
                "name": "popoverHeaderButtons",
                "type": "ModalButton[]",
                "required": false
              },
              "popoverShowFooter": {
                "name": "popoverShowFooter",
                "type": "boolean",
                "required": false,
                "description": "Incluir footer con botones del modelo Modal."
              },
              "popoverFooterPrimaryButton": {
                "name": "popoverFooterPrimaryButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterSecondaryButton": {
                "name": "popoverFooterSecondaryButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterButtons": {
                "name": "popoverFooterButtons",
                "type": "ModalButton[]",
                "required": false
              },
              "popoverFooterAuxButton": {
                "name": "popoverFooterAuxButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterSlotLayout": {
                "name": "popoverFooterSlotLayout",
                "type": "'inline' | 'spread'",
                "required": false,
                "description": "Reparto de iconos en los botones del footer del popover estructurado (`popoverFooterPrimaryButton` /\n    `popoverFooterSecondaryButton` / `popoverFooterButtons`). `spread` equivale a `slotLayout={{ var: 'spread', textAlign: 'center' }}` en cada\n    botón y reparto de ancho en la fila del footer (misma idea que `footerSlotLayout` en `Modal` para botones legacy)."
              },
              "popoverBodyWithPadding": {
                "name": "popoverBodyWithPadding",
                "type": "boolean",
                "required": false,
                "description": "Padding del cuerpo (`Modal.Body withPadding`). Por defecto true."
              }
            }
          }
        },
        {
          "name": "POPUP_ARROW_TILT_RIGHT_DEG",
          "kind": "component",
          "description": {
            "primary": "readme",
            "readme": "# Popup Component\n\nComponente de popup/dropdown posicionable y configurable que se posiciona relativamente a un trigger, con soporte para múltiples posiciones, cierre automático, tooltips e iconos.\n\n## Estructura\n\n```\nPopup/\n├── components/\n│   └── organisms/\n│       └── Popup.tsx      # Componente principal\n├── hooks/                  # Hooks personalizados\n├── stories/\n│   └── Popup.stories.tsx   # Storybook stories\n└── index.ts               # Export del módulo\n```\n\n## Uso Básico\n\n```tsx\nimport { Popup } from '@imj_media/ui';\nimport { useRef } from 'react';\n\n// Popup simple\nconst popupRef = useRef<PopupRef>(null);\n\n<Popup ref={popupRef} label=\"Abrir popup\" position=\"bottom-right\">\n  <div>Contenido del popup</div>\n</Popup>;\n```\n\n## Props Principales\n\n### Control del Popup\n\n- `label?: string` - Texto del botón trigger\n- `position?: PopupPosition` - Posición del popup relativa al trigger (default: `'bottom-right'`)\n- `offset?: number` - Distancia en píxeles entre el trigger y el popup (default: `6`)\n- `popupId?: string` - ID único del popup (auto-generado si no se proporciona)\n\n### Comportamiento\n\n- `closeOnClickOutside?: boolean` - Cerrar al hacer clic fuera (default: `true`)\n- `closeOnEscape?: boolean` - Cerrar con tecla Escape (default: `true`)\n- `closeOnClick?: boolean` - Cerrar al hacer clic en el trigger (default: `true`)\n- `disabled?: boolean` - Deshabilitar el popup (default: `false`)\n\n### Estilo del Trigger\n\n- `theme?: 'solid' | 'outlined' | 'text' | 'ghost'` - Tema del botón trigger (default: `'solid'`)\n- `color?: ButtonColors` - Color del botón trigger (default: `'tertiary'`)\n- `size?: 'xs' | 'sm' | 'md' | 'lg'` - Tamaño del botón trigger (default: `'xs'`)\n- `rounded?: boolean` - Bordes redondeados (default: `false`)\n- `pill?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'` - Radio de borde (default: `'xs'`)\n- `borderRadius?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl'` - Radio de borde del popup (default: `'sm'`)\n\n### Slots e Iconos\n\n- `icon?: I",
            "confidence": "low"
          },
          "examples": [
            "<Popup\n    label=\"Solo texto · inline\"\n    fullWidth\n    position=\"bottom-center\"\n    /* sin leftSlot / rightSlot — slotLayout inline por defecto */\n  >\n    {children}\n  </Popup>",
            "import { BUTTON_SLOT_SPREAD_CENTER } from '@imj_media/ui'; // o tu path de tipos/botón\n\n  <Popup\n    label=\"Centro\"\n    fullWidth\n    slotLayout={BUTTON_SLOT_SPREAD_CENTER}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  >\n    {children}\n  </Popup>\n\n  <Popup\n    label=\"Izquierda\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'left' }}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  />\n\n  <Popup\n    label=\"Derecha\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'right' }}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  />",
            "<Popup\n    label=\"Menú · icono izq.\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'right' }}\n    leftSlot={faBell}\n  >\n    {children}\n  </Popup>",
            "<Popup\n    label=\"Acción · icono dcha.\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'left' }}\n    rightSlot={faAngleDown}\n  >\n    {children}\n  </Popup>",
            "<Popup\n    label=\"Solo texto · inline\"\n    fullWidth\n    position=\"bottom-center\"\n    /* sin leftSlot / rightSlot — slotLayout inline por defecto */\n  >\n    {children}\n  </Popup>"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "children": {
                "name": "children",
                "type": "React.ReactNode",
                "required": true
              },
              "triggerRef": {
                "name": "triggerRef",
                "type": "RefObject<HTMLElement | null>",
                "required": false,
                "description": "Ref al elemento DOM que abre el panel y sirve de ancla (puede vivir fuera del `Popup`).\n    Si se define, no se renderiza el `InnerButton` interno: enlazamos clic (toggle) y, si aplica,\n    `openOnHover` en ese nodo. El panel sigue renderizándose en portal o `absolute` según props.\n    Con `absolute={true}`, el ancla externa debería estar en el mismo subárbol posicionado que el\n    portal del panel para que `offsetTop`/`offsetLeft` sean coherentes; si no, usa `absolute={false}`."
              },
              "label": {
                "name": "label",
                "type": "ReactNode",
                "required": false,
                "description": "Texto o nodo del botón disparador (p. ej. JSX con hover personalizado)."
              },
              "position": {
                "name": "position",
                "type": "| 'top'",
                "required": false
              },
              "offset": {
                "name": "offset",
                "type": "number",
                "required": false,
                "description": "Separación en px entre el trigger y el borde del panel. Con `popoverArrow` activo, el valor\n    se interpreta como separación deseada entre trigger y punta de la flecha (mínimo 6px)."
              },
              "closeOnClickOutside": {
                "name": "closeOnClickOutside",
                "type": "boolean",
                "required": false
              },
              "closeOnEscape": {
                "name": "closeOnEscape",
                "type": "boolean",
                "required": false
              },
              "popupId": {
                "name": "popupId",
                "type": "string",
                "required": false
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "showPanelBorder": {
                "name": "showPanelBorder",
                "type": "boolean",
                "required": false,
                "description": "Borde del panel flotante (`ui-border ui-border-default`). Por defecto `true`.\n    Con `false`: sin contorno, sombra más marcada (`ui-shadow-xl`) y flecha sin trazo con sombra acorde."
              },
              "onOpen": {
                "name": "onOpen",
                "type": "() => void",
                "required": false
              },
              "onClose": {
                "name": "onClose",
                "type": "() => void",
                "required": false
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false
              },
              "absolute": {
                "name": "absolute",
                "type": "boolean",
                "required": false
              },
              "allowOverflow": {
                "name": "allowOverflow",
                "type": "boolean",
                "required": false,
                "description": "Si es `true`, el panel no fuerza `overflow: hidden`, de modo que descendientes posicionados en\n    absoluto (p. ej. `Dropdown` con `popover.absolute: true`) puedan pintarse fuera del rectángulo\n    del popup. Por defecto `false` (mejor recorte con bordes redondeados y scroll interno)."
              },
              "openOnHover": {
                "name": "openOnHover",
                "type": "boolean | number",
                "required": false,
                "description": "Abrir el panel al pasar el ratón por el trigger, tras un retardo.\n    - `false` / omitido: desactivado (por defecto).\n    - `true`: retardo por defecto (200 ms).\n    - número ≥ 0: retardo en ms (`0` = al instante).\n    El clic en el trigger sigue alternando el panel. Para ir al panel sin cerrar, hay un margen al salir del trigger."
              },
              "hoverAnchorFollowPointer": {
                "name": "hoverAnchorFollowPointer",
                "type": "boolean",
                "required": false,
                "description": "Con `openOnHover` activo: el panel se ancla al puntero dentro del trigger (rectángulo 1×1\n    que sigue el ratón), actualizado en cada frame vía `requestAnimationFrame` para un movimiento fluido.\n    Sin efecto si `openOnHover` está desactivado. Aplica al botón interno y a `triggerRef`."
              },
              "openOnHoverAllowPanelPointer": {
                "name": "openOnHoverAllowPanelPointer",
                "type": "boolean",
                "required": false,
                "description": "Con `openOnHover` activo: si es `true` (por defecto), pasar el puntero del trigger al panel\n    cancela el cierre programado (comportamiento “puente”). Si es `false`, el panel no cuenta como\n    zona hover: al salir del trigger el popup se cierra aunque el puntero quede sobre el panel."
              },
              "closeOnClick": {
                "name": "closeOnClick",
                "type": "boolean",
                "required": false
              },
              "buttonClassName": {
                "name": "buttonClassName",
                "type": "string",
                "required": false
              },
              "containerClassName": {
                "name": "containerClassName",
                "type": "string",
                "required": false
              },
              "buttonTransition": {
                "name": "buttonTransition",
                "type": "boolean",
                "required": false
              },
              "buttonStyle": {
                "name": "buttonStyle",
                "type": "React.CSSProperties",
                "required": false
              },
              "borderRadius": {
                "name": "borderRadius",
                "type": "'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl'",
                "required": false
              },
              "stopPropagationList": {
                "name": "stopPropagationList",
                "type": "boolean",
                "required": false
              },
              "popoverArrow": {
                "name": "popoverArrow",
                "type": "PopupArrowMode",
                "required": false,
                "description": "Flecha tipo “beak” hacia el trigger. Por defecto `'auto'` (lado según `position`, punta al centro del trigger).\n    Con `absolute={true}`, `'auto'` no dibuja flecha; usa un objeto `{ edge, align }` o `false` para desactivarla."
              },
              "popoverStructured": {
                "name": "popoverStructured",
                "type": "boolean",
                "required": false,
                "description": "Layout tipo modal (header / cuerpo / footer) reutilizando `ModalProvider` y `Modal.Header|Body|Footer` sin modificar el Modal.\n    El contenido de `children` se renderiza en el cuerpo."
              },
              "popoverTitle": {
                "name": "popoverTitle",
                "type": "string",
                "required": false,
                "description": "Título del encabezado (tipografía H6 del sistema)."
              },
              "popoverDescription": {
                "name": "popoverDescription",
                "type": "string",
                "required": false,
                "description": "Subtítulo / descripción bajo el título."
              },
              "popoverShowHeader": {
                "name": "popoverShowHeader",
                "type": "boolean",
                "required": false,
                "description": "Mostrar bloque de cabecera cuando `popoverStructured` es true."
              },
              "popoverShowCloseButton": {
                "name": "popoverShowCloseButton",
                "type": "boolean",
                "required": false,
                "description": "Mostrar botón cerrar en cabecera (contexto Modal)."
              },
              "popoverIconConfig": {
                "name": "popoverIconConfig",
                "type": "ModalIcon",
                "required": false,
                "description": "Icono principal del header (mismo modelo que Modal)."
              },
              "popoverBadge": {
                "name": "popoverBadge",
                "type": "ModalBadge",
                "required": false
              },
              "popoverBadges": {
                "name": "popoverBadges",
                "type": "ModalBadge[]",
                "required": false
              },
              "popoverHeaderButton": {
                "name": "popoverHeaderButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverHeaderButtons": {
                "name": "popoverHeaderButtons",
                "type": "ModalButton[]",
                "required": false
              },
              "popoverShowFooter": {
                "name": "popoverShowFooter",
                "type": "boolean",
                "required": false,
                "description": "Incluir footer con botones del modelo Modal."
              },
              "popoverFooterPrimaryButton": {
                "name": "popoverFooterPrimaryButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterSecondaryButton": {
                "name": "popoverFooterSecondaryButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterButtons": {
                "name": "popoverFooterButtons",
                "type": "ModalButton[]",
                "required": false
              },
              "popoverFooterAuxButton": {
                "name": "popoverFooterAuxButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterSlotLayout": {
                "name": "popoverFooterSlotLayout",
                "type": "'inline' | 'spread'",
                "required": false,
                "description": "Reparto de iconos en los botones del footer del popover estructurado (`popoverFooterPrimaryButton` /\n    `popoverFooterSecondaryButton` / `popoverFooterButtons`). `spread` equivale a `slotLayout={{ var: 'spread', textAlign: 'center' }}` en cada\n    botón y reparto de ancho en la fila del footer (misma idea que `footerSlotLayout` en `Modal` para botones legacy)."
              },
              "popoverBodyWithPadding": {
                "name": "popoverBodyWithPadding",
                "type": "boolean",
                "required": false,
                "description": "Padding del cuerpo (`Modal.Body withPadding`). Por defecto true."
              }
            }
          }
        },
        {
          "name": "POPUP_ARROW_WIDTH_SCALE",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "jsdoc": "Sin contorno en el trazo + sombra (mismo criterio que el panel con `showPanelBorder={false}`).\nEl relleno sigue usando el token de fondo del panel.\n/\n  elevated?: boolean;\n}\n\n/**\nAncho horizontal del beak respecto al path base (`1` = ancho de diseño; menor = más estrecho).\nSe aplica con `scale` en torno a x=14 (centro del viewBox).",
            "readme": "# Popup Component\n\nComponente de popup/dropdown posicionable y configurable que se posiciona relativamente a un trigger, con soporte para múltiples posiciones, cierre automático, tooltips e iconos.\n\n## Estructura\n\n```\nPopup/\n├── components/\n│   └── organisms/\n│       └── Popup.tsx      # Componente principal\n├── hooks/                  # Hooks personalizados\n├── stories/\n│   └── Popup.stories.tsx   # Storybook stories\n└── index.ts               # Export del módulo\n```\n\n## Uso Básico\n\n```tsx\nimport { Popup } from '@imj_media/ui';\nimport { useRef } from 'react';\n\n// Popup simple\nconst popupRef = useRef<PopupRef>(null);\n\n<Popup ref={popupRef} label=\"Abrir popup\" position=\"bottom-right\">\n  <div>Contenido del popup</div>\n</Popup>;\n```\n\n## Props Principales\n\n### Control del Popup\n\n- `label?: string` - Texto del botón trigger\n- `position?: PopupPosition` - Posición del popup relativa al trigger (default: `'bottom-right'`)\n- `offset?: number` - Distancia en píxeles entre el trigger y el popup (default: `6`)\n- `popupId?: string` - ID único del popup (auto-generado si no se proporciona)\n\n### Comportamiento\n\n- `closeOnClickOutside?: boolean` - Cerrar al hacer clic fuera (default: `true`)\n- `closeOnEscape?: boolean` - Cerrar con tecla Escape (default: `true`)\n- `closeOnClick?: boolean` - Cerrar al hacer clic en el trigger (default: `true`)\n- `disabled?: boolean` - Deshabilitar el popup (default: `false`)\n\n### Estilo del Trigger\n\n- `theme?: 'solid' | 'outlined' | 'text' | 'ghost'` - Tema del botón trigger (default: `'solid'`)\n- `color?: ButtonColors` - Color del botón trigger (default: `'tertiary'`)\n- `size?: 'xs' | 'sm' | 'md' | 'lg'` - Tamaño del botón trigger (default: `'xs'`)\n- `rounded?: boolean` - Bordes redondeados (default: `false`)\n- `pill?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'` - Radio de borde (default: `'xs'`)\n- `borderRadius?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl'` - Radio de borde del popup (default: `'sm'`)\n\n### Slots e Iconos\n\n- `icon?: I",
            "confidence": "medium"
          },
          "examples": [
            "<Popup\n    label=\"Solo texto · inline\"\n    fullWidth\n    position=\"bottom-center\"\n    /* sin leftSlot / rightSlot — slotLayout inline por defecto */\n  >\n    {children}\n  </Popup>",
            "import { BUTTON_SLOT_SPREAD_CENTER } from '@imj_media/ui'; // o tu path de tipos/botón\n\n  <Popup\n    label=\"Centro\"\n    fullWidth\n    slotLayout={BUTTON_SLOT_SPREAD_CENTER}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  >\n    {children}\n  </Popup>\n\n  <Popup\n    label=\"Izquierda\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'left' }}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  />\n\n  <Popup\n    label=\"Derecha\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'right' }}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  />",
            "<Popup\n    label=\"Menú · icono izq.\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'right' }}\n    leftSlot={faBell}\n  >\n    {children}\n  </Popup>",
            "<Popup\n    label=\"Acción · icono dcha.\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'left' }}\n    rightSlot={faAngleDown}\n  >\n    {children}\n  </Popup>",
            "<Popup\n    label=\"Solo texto · inline\"\n    fullWidth\n    position=\"bottom-center\"\n    /* sin leftSlot / rightSlot — slotLayout inline por defecto */\n  >\n    {children}\n  </Popup>"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "children": {
                "name": "children",
                "type": "React.ReactNode",
                "required": true
              },
              "triggerRef": {
                "name": "triggerRef",
                "type": "RefObject<HTMLElement | null>",
                "required": false,
                "description": "Ref al elemento DOM que abre el panel y sirve de ancla (puede vivir fuera del `Popup`).\n    Si se define, no se renderiza el `InnerButton` interno: enlazamos clic (toggle) y, si aplica,\n    `openOnHover` en ese nodo. El panel sigue renderizándose en portal o `absolute` según props.\n    Con `absolute={true}`, el ancla externa debería estar en el mismo subárbol posicionado que el\n    portal del panel para que `offsetTop`/`offsetLeft` sean coherentes; si no, usa `absolute={false}`."
              },
              "label": {
                "name": "label",
                "type": "ReactNode",
                "required": false,
                "description": "Texto o nodo del botón disparador (p. ej. JSX con hover personalizado)."
              },
              "position": {
                "name": "position",
                "type": "| 'top'",
                "required": false
              },
              "offset": {
                "name": "offset",
                "type": "number",
                "required": false,
                "description": "Separación en px entre el trigger y el borde del panel. Con `popoverArrow` activo, el valor\n    se interpreta como separación deseada entre trigger y punta de la flecha (mínimo 6px)."
              },
              "closeOnClickOutside": {
                "name": "closeOnClickOutside",
                "type": "boolean",
                "required": false
              },
              "closeOnEscape": {
                "name": "closeOnEscape",
                "type": "boolean",
                "required": false
              },
              "popupId": {
                "name": "popupId",
                "type": "string",
                "required": false
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "showPanelBorder": {
                "name": "showPanelBorder",
                "type": "boolean",
                "required": false,
                "description": "Borde del panel flotante (`ui-border ui-border-default`). Por defecto `true`.\n    Con `false`: sin contorno, sombra más marcada (`ui-shadow-xl`) y flecha sin trazo con sombra acorde."
              },
              "onOpen": {
                "name": "onOpen",
                "type": "() => void",
                "required": false
              },
              "onClose": {
                "name": "onClose",
                "type": "() => void",
                "required": false
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false
              },
              "absolute": {
                "name": "absolute",
                "type": "boolean",
                "required": false
              },
              "allowOverflow": {
                "name": "allowOverflow",
                "type": "boolean",
                "required": false,
                "description": "Si es `true`, el panel no fuerza `overflow: hidden`, de modo que descendientes posicionados en\n    absoluto (p. ej. `Dropdown` con `popover.absolute: true`) puedan pintarse fuera del rectángulo\n    del popup. Por defecto `false` (mejor recorte con bordes redondeados y scroll interno)."
              },
              "openOnHover": {
                "name": "openOnHover",
                "type": "boolean | number",
                "required": false,
                "description": "Abrir el panel al pasar el ratón por el trigger, tras un retardo.\n    - `false` / omitido: desactivado (por defecto).\n    - `true`: retardo por defecto (200 ms).\n    - número ≥ 0: retardo en ms (`0` = al instante).\n    El clic en el trigger sigue alternando el panel. Para ir al panel sin cerrar, hay un margen al salir del trigger."
              },
              "hoverAnchorFollowPointer": {
                "name": "hoverAnchorFollowPointer",
                "type": "boolean",
                "required": false,
                "description": "Con `openOnHover` activo: el panel se ancla al puntero dentro del trigger (rectángulo 1×1\n    que sigue el ratón), actualizado en cada frame vía `requestAnimationFrame` para un movimiento fluido.\n    Sin efecto si `openOnHover` está desactivado. Aplica al botón interno y a `triggerRef`."
              },
              "openOnHoverAllowPanelPointer": {
                "name": "openOnHoverAllowPanelPointer",
                "type": "boolean",
                "required": false,
                "description": "Con `openOnHover` activo: si es `true` (por defecto), pasar el puntero del trigger al panel\n    cancela el cierre programado (comportamiento “puente”). Si es `false`, el panel no cuenta como\n    zona hover: al salir del trigger el popup se cierra aunque el puntero quede sobre el panel."
              },
              "closeOnClick": {
                "name": "closeOnClick",
                "type": "boolean",
                "required": false
              },
              "buttonClassName": {
                "name": "buttonClassName",
                "type": "string",
                "required": false
              },
              "containerClassName": {
                "name": "containerClassName",
                "type": "string",
                "required": false
              },
              "buttonTransition": {
                "name": "buttonTransition",
                "type": "boolean",
                "required": false
              },
              "buttonStyle": {
                "name": "buttonStyle",
                "type": "React.CSSProperties",
                "required": false
              },
              "borderRadius": {
                "name": "borderRadius",
                "type": "'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl'",
                "required": false
              },
              "stopPropagationList": {
                "name": "stopPropagationList",
                "type": "boolean",
                "required": false
              },
              "popoverArrow": {
                "name": "popoverArrow",
                "type": "PopupArrowMode",
                "required": false,
                "description": "Flecha tipo “beak” hacia el trigger. Por defecto `'auto'` (lado según `position`, punta al centro del trigger).\n    Con `absolute={true}`, `'auto'` no dibuja flecha; usa un objeto `{ edge, align }` o `false` para desactivarla."
              },
              "popoverStructured": {
                "name": "popoverStructured",
                "type": "boolean",
                "required": false,
                "description": "Layout tipo modal (header / cuerpo / footer) reutilizando `ModalProvider` y `Modal.Header|Body|Footer` sin modificar el Modal.\n    El contenido de `children` se renderiza en el cuerpo."
              },
              "popoverTitle": {
                "name": "popoverTitle",
                "type": "string",
                "required": false,
                "description": "Título del encabezado (tipografía H6 del sistema)."
              },
              "popoverDescription": {
                "name": "popoverDescription",
                "type": "string",
                "required": false,
                "description": "Subtítulo / descripción bajo el título."
              },
              "popoverShowHeader": {
                "name": "popoverShowHeader",
                "type": "boolean",
                "required": false,
                "description": "Mostrar bloque de cabecera cuando `popoverStructured` es true."
              },
              "popoverShowCloseButton": {
                "name": "popoverShowCloseButton",
                "type": "boolean",
                "required": false,
                "description": "Mostrar botón cerrar en cabecera (contexto Modal)."
              },
              "popoverIconConfig": {
                "name": "popoverIconConfig",
                "type": "ModalIcon",
                "required": false,
                "description": "Icono principal del header (mismo modelo que Modal)."
              },
              "popoverBadge": {
                "name": "popoverBadge",
                "type": "ModalBadge",
                "required": false
              },
              "popoverBadges": {
                "name": "popoverBadges",
                "type": "ModalBadge[]",
                "required": false
              },
              "popoverHeaderButton": {
                "name": "popoverHeaderButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverHeaderButtons": {
                "name": "popoverHeaderButtons",
                "type": "ModalButton[]",
                "required": false
              },
              "popoverShowFooter": {
                "name": "popoverShowFooter",
                "type": "boolean",
                "required": false,
                "description": "Incluir footer con botones del modelo Modal."
              },
              "popoverFooterPrimaryButton": {
                "name": "popoverFooterPrimaryButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterSecondaryButton": {
                "name": "popoverFooterSecondaryButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterButtons": {
                "name": "popoverFooterButtons",
                "type": "ModalButton[]",
                "required": false
              },
              "popoverFooterAuxButton": {
                "name": "popoverFooterAuxButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterSlotLayout": {
                "name": "popoverFooterSlotLayout",
                "type": "'inline' | 'spread'",
                "required": false,
                "description": "Reparto de iconos en los botones del footer del popover estructurado (`popoverFooterPrimaryButton` /\n    `popoverFooterSecondaryButton` / `popoverFooterButtons`). `spread` equivale a `slotLayout={{ var: 'spread', textAlign: 'center' }}` en cada\n    botón y reparto de ancho en la fila del footer (misma idea que `footerSlotLayout` en `Modal` para botones legacy)."
              },
              "popoverBodyWithPadding": {
                "name": "popoverBodyWithPadding",
                "type": "boolean",
                "required": false,
                "description": "Padding del cuerpo (`Modal.Body withPadding`). Por defecto true."
              }
            }
          }
        },
        {
          "name": "POPUP_PANEL_Z_INDEX_BASE",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "jsdoc": "Acota el puntero al rectángulo del trigger en coordenadas de viewport.\nDevuelve la esquina superior izquierda de un ancla 1×1 lógica dentro del trigger\n(recorrido píxel a píxel cuando el trigger tiene tamaño entero en CSS px).\n/\nexport function clampClientPointForPopupAnchor(\n  triggerRect: DOMRectReadOnly,\n  clientX: number,\n  clientY: number\n): { x: number; y: number } {\n  const rw = Math.max(triggerRect.width, 0);\n  const rh = Math.max(triggerRect.height, 0);\n  const insetX = rw > 0 ? Math.min(1, rw) : 0;\n  const insetY = rh > 0 ? Math.min(1, rh) : 0;\n  const maxX = rw > 0 ? triggerRect.right - insetX : triggerRect.left;\n  const maxY = rh > 0 ? triggerRect.bottom - insetY : triggerRect.top;\n  const x = Math.min(Math.max(clientX, triggerRect.left), maxX);\n  const y = Math.min(Math.max(cl",
            "readme": "# Popup Component\n\nComponente de popup/dropdown posicionable y configurable que se posiciona relativamente a un trigger, con soporte para múltiples posiciones, cierre automático, tooltips e iconos.\n\n## Estructura\n\n```\nPopup/\n├── components/\n│   └── organisms/\n│       └── Popup.tsx      # Componente principal\n├── hooks/                  # Hooks personalizados\n├── stories/\n│   └── Popup.stories.tsx   # Storybook stories\n└── index.ts               # Export del módulo\n```\n\n## Uso Básico\n\n```tsx\nimport { Popup } from '@imj_media/ui';\nimport { useRef } from 'react';\n\n// Popup simple\nconst popupRef = useRef<PopupRef>(null);\n\n<Popup ref={popupRef} label=\"Abrir popup\" position=\"bottom-right\">\n  <div>Contenido del popup</div>\n</Popup>;\n```\n\n## Props Principales\n\n### Control del Popup\n\n- `label?: string` - Texto del botón trigger\n- `position?: PopupPosition` - Posición del popup relativa al trigger (default: `'bottom-right'`)\n- `offset?: number` - Distancia en píxeles entre el trigger y el popup (default: `6`)\n- `popupId?: string` - ID único del popup (auto-generado si no se proporciona)\n\n### Comportamiento\n\n- `closeOnClickOutside?: boolean` - Cerrar al hacer clic fuera (default: `true`)\n- `closeOnEscape?: boolean` - Cerrar con tecla Escape (default: `true`)\n- `closeOnClick?: boolean` - Cerrar al hacer clic en el trigger (default: `true`)\n- `disabled?: boolean` - Deshabilitar el popup (default: `false`)\n\n### Estilo del Trigger\n\n- `theme?: 'solid' | 'outlined' | 'text' | 'ghost'` - Tema del botón trigger (default: `'solid'`)\n- `color?: ButtonColors` - Color del botón trigger (default: `'tertiary'`)\n- `size?: 'xs' | 'sm' | 'md' | 'lg'` - Tamaño del botón trigger (default: `'xs'`)\n- `rounded?: boolean` - Bordes redondeados (default: `false`)\n- `pill?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'` - Radio de borde (default: `'xs'`)\n- `borderRadius?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl'` - Radio de borde del popup (default: `'sm'`)\n\n### Slots e Iconos\n\n- `icon?: I",
            "confidence": "medium"
          },
          "examples": [
            "<Popup\n    label=\"Solo texto · inline\"\n    fullWidth\n    position=\"bottom-center\"\n    /* sin leftSlot / rightSlot — slotLayout inline por defecto */\n  >\n    {children}\n  </Popup>",
            "import { BUTTON_SLOT_SPREAD_CENTER } from '@imj_media/ui'; // o tu path de tipos/botón\n\n  <Popup\n    label=\"Centro\"\n    fullWidth\n    slotLayout={BUTTON_SLOT_SPREAD_CENTER}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  >\n    {children}\n  </Popup>\n\n  <Popup\n    label=\"Izquierda\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'left' }}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  />\n\n  <Popup\n    label=\"Derecha\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'right' }}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  />",
            "<Popup\n    label=\"Menú · icono izq.\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'right' }}\n    leftSlot={faBell}\n  >\n    {children}\n  </Popup>",
            "<Popup\n    label=\"Acción · icono dcha.\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'left' }}\n    rightSlot={faAngleDown}\n  >\n    {children}\n  </Popup>",
            "<Popup\n    label=\"Solo texto · inline\"\n    fullWidth\n    position=\"bottom-center\"\n    /* sin leftSlot / rightSlot — slotLayout inline por defecto */\n  >\n    {children}\n  </Popup>"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "children": {
                "name": "children",
                "type": "React.ReactNode",
                "required": true
              },
              "triggerRef": {
                "name": "triggerRef",
                "type": "RefObject<HTMLElement | null>",
                "required": false,
                "description": "Ref al elemento DOM que abre el panel y sirve de ancla (puede vivir fuera del `Popup`).\n    Si se define, no se renderiza el `InnerButton` interno: enlazamos clic (toggle) y, si aplica,\n    `openOnHover` en ese nodo. El panel sigue renderizándose en portal o `absolute` según props.\n    Con `absolute={true}`, el ancla externa debería estar en el mismo subárbol posicionado que el\n    portal del panel para que `offsetTop`/`offsetLeft` sean coherentes; si no, usa `absolute={false}`."
              },
              "label": {
                "name": "label",
                "type": "ReactNode",
                "required": false,
                "description": "Texto o nodo del botón disparador (p. ej. JSX con hover personalizado)."
              },
              "position": {
                "name": "position",
                "type": "| 'top'",
                "required": false
              },
              "offset": {
                "name": "offset",
                "type": "number",
                "required": false,
                "description": "Separación en px entre el trigger y el borde del panel. Con `popoverArrow` activo, el valor\n    se interpreta como separación deseada entre trigger y punta de la flecha (mínimo 6px)."
              },
              "closeOnClickOutside": {
                "name": "closeOnClickOutside",
                "type": "boolean",
                "required": false
              },
              "closeOnEscape": {
                "name": "closeOnEscape",
                "type": "boolean",
                "required": false
              },
              "popupId": {
                "name": "popupId",
                "type": "string",
                "required": false
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "showPanelBorder": {
                "name": "showPanelBorder",
                "type": "boolean",
                "required": false,
                "description": "Borde del panel flotante (`ui-border ui-border-default`). Por defecto `true`.\n    Con `false`: sin contorno, sombra más marcada (`ui-shadow-xl`) y flecha sin trazo con sombra acorde."
              },
              "onOpen": {
                "name": "onOpen",
                "type": "() => void",
                "required": false
              },
              "onClose": {
                "name": "onClose",
                "type": "() => void",
                "required": false
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false
              },
              "absolute": {
                "name": "absolute",
                "type": "boolean",
                "required": false
              },
              "allowOverflow": {
                "name": "allowOverflow",
                "type": "boolean",
                "required": false,
                "description": "Si es `true`, el panel no fuerza `overflow: hidden`, de modo que descendientes posicionados en\n    absoluto (p. ej. `Dropdown` con `popover.absolute: true`) puedan pintarse fuera del rectángulo\n    del popup. Por defecto `false` (mejor recorte con bordes redondeados y scroll interno)."
              },
              "openOnHover": {
                "name": "openOnHover",
                "type": "boolean | number",
                "required": false,
                "description": "Abrir el panel al pasar el ratón por el trigger, tras un retardo.\n    - `false` / omitido: desactivado (por defecto).\n    - `true`: retardo por defecto (200 ms).\n    - número ≥ 0: retardo en ms (`0` = al instante).\n    El clic en el trigger sigue alternando el panel. Para ir al panel sin cerrar, hay un margen al salir del trigger."
              },
              "hoverAnchorFollowPointer": {
                "name": "hoverAnchorFollowPointer",
                "type": "boolean",
                "required": false,
                "description": "Con `openOnHover` activo: el panel se ancla al puntero dentro del trigger (rectángulo 1×1\n    que sigue el ratón), actualizado en cada frame vía `requestAnimationFrame` para un movimiento fluido.\n    Sin efecto si `openOnHover` está desactivado. Aplica al botón interno y a `triggerRef`."
              },
              "openOnHoverAllowPanelPointer": {
                "name": "openOnHoverAllowPanelPointer",
                "type": "boolean",
                "required": false,
                "description": "Con `openOnHover` activo: si es `true` (por defecto), pasar el puntero del trigger al panel\n    cancela el cierre programado (comportamiento “puente”). Si es `false`, el panel no cuenta como\n    zona hover: al salir del trigger el popup se cierra aunque el puntero quede sobre el panel."
              },
              "closeOnClick": {
                "name": "closeOnClick",
                "type": "boolean",
                "required": false
              },
              "buttonClassName": {
                "name": "buttonClassName",
                "type": "string",
                "required": false
              },
              "containerClassName": {
                "name": "containerClassName",
                "type": "string",
                "required": false
              },
              "buttonTransition": {
                "name": "buttonTransition",
                "type": "boolean",
                "required": false
              },
              "buttonStyle": {
                "name": "buttonStyle",
                "type": "React.CSSProperties",
                "required": false
              },
              "borderRadius": {
                "name": "borderRadius",
                "type": "'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl'",
                "required": false
              },
              "stopPropagationList": {
                "name": "stopPropagationList",
                "type": "boolean",
                "required": false
              },
              "popoverArrow": {
                "name": "popoverArrow",
                "type": "PopupArrowMode",
                "required": false,
                "description": "Flecha tipo “beak” hacia el trigger. Por defecto `'auto'` (lado según `position`, punta al centro del trigger).\n    Con `absolute={true}`, `'auto'` no dibuja flecha; usa un objeto `{ edge, align }` o `false` para desactivarla."
              },
              "popoverStructured": {
                "name": "popoverStructured",
                "type": "boolean",
                "required": false,
                "description": "Layout tipo modal (header / cuerpo / footer) reutilizando `ModalProvider` y `Modal.Header|Body|Footer` sin modificar el Modal.\n    El contenido de `children` se renderiza en el cuerpo."
              },
              "popoverTitle": {
                "name": "popoverTitle",
                "type": "string",
                "required": false,
                "description": "Título del encabezado (tipografía H6 del sistema)."
              },
              "popoverDescription": {
                "name": "popoverDescription",
                "type": "string",
                "required": false,
                "description": "Subtítulo / descripción bajo el título."
              },
              "popoverShowHeader": {
                "name": "popoverShowHeader",
                "type": "boolean",
                "required": false,
                "description": "Mostrar bloque de cabecera cuando `popoverStructured` es true."
              },
              "popoverShowCloseButton": {
                "name": "popoverShowCloseButton",
                "type": "boolean",
                "required": false,
                "description": "Mostrar botón cerrar en cabecera (contexto Modal)."
              },
              "popoverIconConfig": {
                "name": "popoverIconConfig",
                "type": "ModalIcon",
                "required": false,
                "description": "Icono principal del header (mismo modelo que Modal)."
              },
              "popoverBadge": {
                "name": "popoverBadge",
                "type": "ModalBadge",
                "required": false
              },
              "popoverBadges": {
                "name": "popoverBadges",
                "type": "ModalBadge[]",
                "required": false
              },
              "popoverHeaderButton": {
                "name": "popoverHeaderButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverHeaderButtons": {
                "name": "popoverHeaderButtons",
                "type": "ModalButton[]",
                "required": false
              },
              "popoverShowFooter": {
                "name": "popoverShowFooter",
                "type": "boolean",
                "required": false,
                "description": "Incluir footer con botones del modelo Modal."
              },
              "popoverFooterPrimaryButton": {
                "name": "popoverFooterPrimaryButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterSecondaryButton": {
                "name": "popoverFooterSecondaryButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterButtons": {
                "name": "popoverFooterButtons",
                "type": "ModalButton[]",
                "required": false
              },
              "popoverFooterAuxButton": {
                "name": "popoverFooterAuxButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterSlotLayout": {
                "name": "popoverFooterSlotLayout",
                "type": "'inline' | 'spread'",
                "required": false,
                "description": "Reparto de iconos en los botones del footer del popover estructurado (`popoverFooterPrimaryButton` /\n    `popoverFooterSecondaryButton` / `popoverFooterButtons`). `spread` equivale a `slotLayout={{ var: 'spread', textAlign: 'center' }}` en cada\n    botón y reparto de ancho en la fila del footer (misma idea que `footerSlotLayout` en `Modal` para botones legacy)."
              },
              "popoverBodyWithPadding": {
                "name": "popoverBodyWithPadding",
                "type": "boolean",
                "required": false,
                "description": "Padding del cuerpo (`Modal.Body withPadding`). Por defecto true."
              }
            }
          }
        },
        {
          "name": "Z_INDEX_MODAL_ABOVE_POPUP",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "jsdoc": "Acota el puntero al rectángulo del trigger en coordenadas de viewport.\nDevuelve la esquina superior izquierda de un ancla 1×1 lógica dentro del trigger\n(recorrido píxel a píxel cuando el trigger tiene tamaño entero en CSS px).\n/\nexport function clampClientPointForPopupAnchor(\n  triggerRect: DOMRectReadOnly,\n  clientX: number,\n  clientY: number\n): { x: number; y: number } {\n  const rw = Math.max(triggerRect.width, 0);\n  const rh = Math.max(triggerRect.height, 0);\n  const insetX = rw > 0 ? Math.min(1, rw) : 0;\n  const insetY = rh > 0 ? Math.min(1, rh) : 0;\n  const maxX = rw > 0 ? triggerRect.right - insetX : triggerRect.left;\n  const maxY = rh > 0 ? triggerRect.bottom - insetY : triggerRect.top;\n  const x = Math.min(Math.max(clientX, triggerRect.left), maxX);\n  const y = Math.min(Math.max(cl",
            "readme": "# Popup Component\n\nComponente de popup/dropdown posicionable y configurable que se posiciona relativamente a un trigger, con soporte para múltiples posiciones, cierre automático, tooltips e iconos.\n\n## Estructura\n\n```\nPopup/\n├── components/\n│   └── organisms/\n│       └── Popup.tsx      # Componente principal\n├── hooks/                  # Hooks personalizados\n├── stories/\n│   └── Popup.stories.tsx   # Storybook stories\n└── index.ts               # Export del módulo\n```\n\n## Uso Básico\n\n```tsx\nimport { Popup } from '@imj_media/ui';\nimport { useRef } from 'react';\n\n// Popup simple\nconst popupRef = useRef<PopupRef>(null);\n\n<Popup ref={popupRef} label=\"Abrir popup\" position=\"bottom-right\">\n  <div>Contenido del popup</div>\n</Popup>;\n```\n\n## Props Principales\n\n### Control del Popup\n\n- `label?: string` - Texto del botón trigger\n- `position?: PopupPosition` - Posición del popup relativa al trigger (default: `'bottom-right'`)\n- `offset?: number` - Distancia en píxeles entre el trigger y el popup (default: `6`)\n- `popupId?: string` - ID único del popup (auto-generado si no se proporciona)\n\n### Comportamiento\n\n- `closeOnClickOutside?: boolean` - Cerrar al hacer clic fuera (default: `true`)\n- `closeOnEscape?: boolean` - Cerrar con tecla Escape (default: `true`)\n- `closeOnClick?: boolean` - Cerrar al hacer clic en el trigger (default: `true`)\n- `disabled?: boolean` - Deshabilitar el popup (default: `false`)\n\n### Estilo del Trigger\n\n- `theme?: 'solid' | 'outlined' | 'text' | 'ghost'` - Tema del botón trigger (default: `'solid'`)\n- `color?: ButtonColors` - Color del botón trigger (default: `'tertiary'`)\n- `size?: 'xs' | 'sm' | 'md' | 'lg'` - Tamaño del botón trigger (default: `'xs'`)\n- `rounded?: boolean` - Bordes redondeados (default: `false`)\n- `pill?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'` - Radio de borde (default: `'xs'`)\n- `borderRadius?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl'` - Radio de borde del popup (default: `'sm'`)\n\n### Slots e Iconos\n\n- `icon?: I",
            "confidence": "medium"
          },
          "examples": [
            "<Popup\n    label=\"Solo texto · inline\"\n    fullWidth\n    position=\"bottom-center\"\n    /* sin leftSlot / rightSlot — slotLayout inline por defecto */\n  >\n    {children}\n  </Popup>",
            "import { BUTTON_SLOT_SPREAD_CENTER } from '@imj_media/ui'; // o tu path de tipos/botón\n\n  <Popup\n    label=\"Centro\"\n    fullWidth\n    slotLayout={BUTTON_SLOT_SPREAD_CENTER}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  >\n    {children}\n  </Popup>\n\n  <Popup\n    label=\"Izquierda\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'left' }}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  />\n\n  <Popup\n    label=\"Derecha\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'right' }}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  />",
            "<Popup\n    label=\"Menú · icono izq.\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'right' }}\n    leftSlot={faBell}\n  >\n    {children}\n  </Popup>",
            "<Popup\n    label=\"Acción · icono dcha.\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'left' }}\n    rightSlot={faAngleDown}\n  >\n    {children}\n  </Popup>",
            "<Popup\n    label=\"Solo texto · inline\"\n    fullWidth\n    position=\"bottom-center\"\n    /* sin leftSlot / rightSlot — slotLayout inline por defecto */\n  >\n    {children}\n  </Popup>"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "children": {
                "name": "children",
                "type": "React.ReactNode",
                "required": true
              },
              "triggerRef": {
                "name": "triggerRef",
                "type": "RefObject<HTMLElement | null>",
                "required": false,
                "description": "Ref al elemento DOM que abre el panel y sirve de ancla (puede vivir fuera del `Popup`).\n    Si se define, no se renderiza el `InnerButton` interno: enlazamos clic (toggle) y, si aplica,\n    `openOnHover` en ese nodo. El panel sigue renderizándose en portal o `absolute` según props.\n    Con `absolute={true}`, el ancla externa debería estar en el mismo subárbol posicionado que el\n    portal del panel para que `offsetTop`/`offsetLeft` sean coherentes; si no, usa `absolute={false}`."
              },
              "label": {
                "name": "label",
                "type": "ReactNode",
                "required": false,
                "description": "Texto o nodo del botón disparador (p. ej. JSX con hover personalizado)."
              },
              "position": {
                "name": "position",
                "type": "| 'top'",
                "required": false
              },
              "offset": {
                "name": "offset",
                "type": "number",
                "required": false,
                "description": "Separación en px entre el trigger y el borde del panel. Con `popoverArrow` activo, el valor\n    se interpreta como separación deseada entre trigger y punta de la flecha (mínimo 6px)."
              },
              "closeOnClickOutside": {
                "name": "closeOnClickOutside",
                "type": "boolean",
                "required": false
              },
              "closeOnEscape": {
                "name": "closeOnEscape",
                "type": "boolean",
                "required": false
              },
              "popupId": {
                "name": "popupId",
                "type": "string",
                "required": false
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "showPanelBorder": {
                "name": "showPanelBorder",
                "type": "boolean",
                "required": false,
                "description": "Borde del panel flotante (`ui-border ui-border-default`). Por defecto `true`.\n    Con `false`: sin contorno, sombra más marcada (`ui-shadow-xl`) y flecha sin trazo con sombra acorde."
              },
              "onOpen": {
                "name": "onOpen",
                "type": "() => void",
                "required": false
              },
              "onClose": {
                "name": "onClose",
                "type": "() => void",
                "required": false
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false
              },
              "absolute": {
                "name": "absolute",
                "type": "boolean",
                "required": false
              },
              "allowOverflow": {
                "name": "allowOverflow",
                "type": "boolean",
                "required": false,
                "description": "Si es `true`, el panel no fuerza `overflow: hidden`, de modo que descendientes posicionados en\n    absoluto (p. ej. `Dropdown` con `popover.absolute: true`) puedan pintarse fuera del rectángulo\n    del popup. Por defecto `false` (mejor recorte con bordes redondeados y scroll interno)."
              },
              "openOnHover": {
                "name": "openOnHover",
                "type": "boolean | number",
                "required": false,
                "description": "Abrir el panel al pasar el ratón por el trigger, tras un retardo.\n    - `false` / omitido: desactivado (por defecto).\n    - `true`: retardo por defecto (200 ms).\n    - número ≥ 0: retardo en ms (`0` = al instante).\n    El clic en el trigger sigue alternando el panel. Para ir al panel sin cerrar, hay un margen al salir del trigger."
              },
              "hoverAnchorFollowPointer": {
                "name": "hoverAnchorFollowPointer",
                "type": "boolean",
                "required": false,
                "description": "Con `openOnHover` activo: el panel se ancla al puntero dentro del trigger (rectángulo 1×1\n    que sigue el ratón), actualizado en cada frame vía `requestAnimationFrame` para un movimiento fluido.\n    Sin efecto si `openOnHover` está desactivado. Aplica al botón interno y a `triggerRef`."
              },
              "openOnHoverAllowPanelPointer": {
                "name": "openOnHoverAllowPanelPointer",
                "type": "boolean",
                "required": false,
                "description": "Con `openOnHover` activo: si es `true` (por defecto), pasar el puntero del trigger al panel\n    cancela el cierre programado (comportamiento “puente”). Si es `false`, el panel no cuenta como\n    zona hover: al salir del trigger el popup se cierra aunque el puntero quede sobre el panel."
              },
              "closeOnClick": {
                "name": "closeOnClick",
                "type": "boolean",
                "required": false
              },
              "buttonClassName": {
                "name": "buttonClassName",
                "type": "string",
                "required": false
              },
              "containerClassName": {
                "name": "containerClassName",
                "type": "string",
                "required": false
              },
              "buttonTransition": {
                "name": "buttonTransition",
                "type": "boolean",
                "required": false
              },
              "buttonStyle": {
                "name": "buttonStyle",
                "type": "React.CSSProperties",
                "required": false
              },
              "borderRadius": {
                "name": "borderRadius",
                "type": "'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl'",
                "required": false
              },
              "stopPropagationList": {
                "name": "stopPropagationList",
                "type": "boolean",
                "required": false
              },
              "popoverArrow": {
                "name": "popoverArrow",
                "type": "PopupArrowMode",
                "required": false,
                "description": "Flecha tipo “beak” hacia el trigger. Por defecto `'auto'` (lado según `position`, punta al centro del trigger).\n    Con `absolute={true}`, `'auto'` no dibuja flecha; usa un objeto `{ edge, align }` o `false` para desactivarla."
              },
              "popoverStructured": {
                "name": "popoverStructured",
                "type": "boolean",
                "required": false,
                "description": "Layout tipo modal (header / cuerpo / footer) reutilizando `ModalProvider` y `Modal.Header|Body|Footer` sin modificar el Modal.\n    El contenido de `children` se renderiza en el cuerpo."
              },
              "popoverTitle": {
                "name": "popoverTitle",
                "type": "string",
                "required": false,
                "description": "Título del encabezado (tipografía H6 del sistema)."
              },
              "popoverDescription": {
                "name": "popoverDescription",
                "type": "string",
                "required": false,
                "description": "Subtítulo / descripción bajo el título."
              },
              "popoverShowHeader": {
                "name": "popoverShowHeader",
                "type": "boolean",
                "required": false,
                "description": "Mostrar bloque de cabecera cuando `popoverStructured` es true."
              },
              "popoverShowCloseButton": {
                "name": "popoverShowCloseButton",
                "type": "boolean",
                "required": false,
                "description": "Mostrar botón cerrar en cabecera (contexto Modal)."
              },
              "popoverIconConfig": {
                "name": "popoverIconConfig",
                "type": "ModalIcon",
                "required": false,
                "description": "Icono principal del header (mismo modelo que Modal)."
              },
              "popoverBadge": {
                "name": "popoverBadge",
                "type": "ModalBadge",
                "required": false
              },
              "popoverBadges": {
                "name": "popoverBadges",
                "type": "ModalBadge[]",
                "required": false
              },
              "popoverHeaderButton": {
                "name": "popoverHeaderButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverHeaderButtons": {
                "name": "popoverHeaderButtons",
                "type": "ModalButton[]",
                "required": false
              },
              "popoverShowFooter": {
                "name": "popoverShowFooter",
                "type": "boolean",
                "required": false,
                "description": "Incluir footer con botones del modelo Modal."
              },
              "popoverFooterPrimaryButton": {
                "name": "popoverFooterPrimaryButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterSecondaryButton": {
                "name": "popoverFooterSecondaryButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterButtons": {
                "name": "popoverFooterButtons",
                "type": "ModalButton[]",
                "required": false
              },
              "popoverFooterAuxButton": {
                "name": "popoverFooterAuxButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterSlotLayout": {
                "name": "popoverFooterSlotLayout",
                "type": "'inline' | 'spread'",
                "required": false,
                "description": "Reparto de iconos en los botones del footer del popover estructurado (`popoverFooterPrimaryButton` /\n    `popoverFooterSecondaryButton` / `popoverFooterButtons`). `spread` equivale a `slotLayout={{ var: 'spread', textAlign: 'center' }}` en cada\n    botón y reparto de ancho en la fila del footer (misma idea que `footerSlotLayout` en `Modal` para botones legacy)."
              },
              "popoverBodyWithPadding": {
                "name": "popoverBodyWithPadding",
                "type": "boolean",
                "required": false,
                "description": "Padding del cuerpo (`Modal.Body withPadding`). Por defecto true."
              }
            }
          }
        },
        {
          "name": "Z_INDEX_TOOLTIP",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "jsdoc": "Acota el puntero al rectángulo del trigger en coordenadas de viewport.\nDevuelve la esquina superior izquierda de un ancla 1×1 lógica dentro del trigger\n(recorrido píxel a píxel cuando el trigger tiene tamaño entero en CSS px).\n/\nexport function clampClientPointForPopupAnchor(\n  triggerRect: DOMRectReadOnly,\n  clientX: number,\n  clientY: number\n): { x: number; y: number } {\n  const rw = Math.max(triggerRect.width, 0);\n  const rh = Math.max(triggerRect.height, 0);\n  const insetX = rw > 0 ? Math.min(1, rw) : 0;\n  const insetY = rh > 0 ? Math.min(1, rh) : 0;\n  const maxX = rw > 0 ? triggerRect.right - insetX : triggerRect.left;\n  const maxY = rh > 0 ? triggerRect.bottom - insetY : triggerRect.top;\n  const x = Math.min(Math.max(clientX, triggerRect.left), maxX);\n  const y = Math.min(Math.max(cl",
            "readme": "# Popup Component\n\nComponente de popup/dropdown posicionable y configurable que se posiciona relativamente a un trigger, con soporte para múltiples posiciones, cierre automático, tooltips e iconos.\n\n## Estructura\n\n```\nPopup/\n├── components/\n│   └── organisms/\n│       └── Popup.tsx      # Componente principal\n├── hooks/                  # Hooks personalizados\n├── stories/\n│   └── Popup.stories.tsx   # Storybook stories\n└── index.ts               # Export del módulo\n```\n\n## Uso Básico\n\n```tsx\nimport { Popup } from '@imj_media/ui';\nimport { useRef } from 'react';\n\n// Popup simple\nconst popupRef = useRef<PopupRef>(null);\n\n<Popup ref={popupRef} label=\"Abrir popup\" position=\"bottom-right\">\n  <div>Contenido del popup</div>\n</Popup>;\n```\n\n## Props Principales\n\n### Control del Popup\n\n- `label?: string` - Texto del botón trigger\n- `position?: PopupPosition` - Posición del popup relativa al trigger (default: `'bottom-right'`)\n- `offset?: number` - Distancia en píxeles entre el trigger y el popup (default: `6`)\n- `popupId?: string` - ID único del popup (auto-generado si no se proporciona)\n\n### Comportamiento\n\n- `closeOnClickOutside?: boolean` - Cerrar al hacer clic fuera (default: `true`)\n- `closeOnEscape?: boolean` - Cerrar con tecla Escape (default: `true`)\n- `closeOnClick?: boolean` - Cerrar al hacer clic en el trigger (default: `true`)\n- `disabled?: boolean` - Deshabilitar el popup (default: `false`)\n\n### Estilo del Trigger\n\n- `theme?: 'solid' | 'outlined' | 'text' | 'ghost'` - Tema del botón trigger (default: `'solid'`)\n- `color?: ButtonColors` - Color del botón trigger (default: `'tertiary'`)\n- `size?: 'xs' | 'sm' | 'md' | 'lg'` - Tamaño del botón trigger (default: `'xs'`)\n- `rounded?: boolean` - Bordes redondeados (default: `false`)\n- `pill?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'` - Radio de borde (default: `'xs'`)\n- `borderRadius?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl'` - Radio de borde del popup (default: `'sm'`)\n\n### Slots e Iconos\n\n- `icon?: I",
            "confidence": "medium"
          },
          "examples": [
            "<Popup\n    label=\"Solo texto · inline\"\n    fullWidth\n    position=\"bottom-center\"\n    /* sin leftSlot / rightSlot — slotLayout inline por defecto */\n  >\n    {children}\n  </Popup>",
            "import { BUTTON_SLOT_SPREAD_CENTER } from '@imj_media/ui'; // o tu path de tipos/botón\n\n  <Popup\n    label=\"Centro\"\n    fullWidth\n    slotLayout={BUTTON_SLOT_SPREAD_CENTER}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  >\n    {children}\n  </Popup>\n\n  <Popup\n    label=\"Izquierda\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'left' }}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  />\n\n  <Popup\n    label=\"Derecha\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'right' }}\n    leftSlot={faBell}\n    rightSlot={faAngleDown}\n  />",
            "<Popup\n    label=\"Menú · icono izq.\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'right' }}\n    leftSlot={faBell}\n  >\n    {children}\n  </Popup>",
            "<Popup\n    label=\"Acción · icono dcha.\"\n    fullWidth\n    slotLayout={{ var: 'spread', textAlign: 'left' }}\n    rightSlot={faAngleDown}\n  >\n    {children}\n  </Popup>",
            "<Popup\n    label=\"Solo texto · inline\"\n    fullWidth\n    position=\"bottom-center\"\n    /* sin leftSlot / rightSlot — slotLayout inline por defecto */\n  >\n    {children}\n  </Popup>"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "children": {
                "name": "children",
                "type": "React.ReactNode",
                "required": true
              },
              "triggerRef": {
                "name": "triggerRef",
                "type": "RefObject<HTMLElement | null>",
                "required": false,
                "description": "Ref al elemento DOM que abre el panel y sirve de ancla (puede vivir fuera del `Popup`).\n    Si se define, no se renderiza el `InnerButton` interno: enlazamos clic (toggle) y, si aplica,\n    `openOnHover` en ese nodo. El panel sigue renderizándose en portal o `absolute` según props.\n    Con `absolute={true}`, el ancla externa debería estar en el mismo subárbol posicionado que el\n    portal del panel para que `offsetTop`/`offsetLeft` sean coherentes; si no, usa `absolute={false}`."
              },
              "label": {
                "name": "label",
                "type": "ReactNode",
                "required": false,
                "description": "Texto o nodo del botón disparador (p. ej. JSX con hover personalizado)."
              },
              "position": {
                "name": "position",
                "type": "| 'top'",
                "required": false
              },
              "offset": {
                "name": "offset",
                "type": "number",
                "required": false,
                "description": "Separación en px entre el trigger y el borde del panel. Con `popoverArrow` activo, el valor\n    se interpreta como separación deseada entre trigger y punta de la flecha (mínimo 6px)."
              },
              "closeOnClickOutside": {
                "name": "closeOnClickOutside",
                "type": "boolean",
                "required": false
              },
              "closeOnEscape": {
                "name": "closeOnEscape",
                "type": "boolean",
                "required": false
              },
              "popupId": {
                "name": "popupId",
                "type": "string",
                "required": false
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "showPanelBorder": {
                "name": "showPanelBorder",
                "type": "boolean",
                "required": false,
                "description": "Borde del panel flotante (`ui-border ui-border-default`). Por defecto `true`.\n    Con `false`: sin contorno, sombra más marcada (`ui-shadow-xl`) y flecha sin trazo con sombra acorde."
              },
              "onOpen": {
                "name": "onOpen",
                "type": "() => void",
                "required": false
              },
              "onClose": {
                "name": "onClose",
                "type": "() => void",
                "required": false
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false
              },
              "absolute": {
                "name": "absolute",
                "type": "boolean",
                "required": false
              },
              "allowOverflow": {
                "name": "allowOverflow",
                "type": "boolean",
                "required": false,
                "description": "Si es `true`, el panel no fuerza `overflow: hidden`, de modo que descendientes posicionados en\n    absoluto (p. ej. `Dropdown` con `popover.absolute: true`) puedan pintarse fuera del rectángulo\n    del popup. Por defecto `false` (mejor recorte con bordes redondeados y scroll interno)."
              },
              "openOnHover": {
                "name": "openOnHover",
                "type": "boolean | number",
                "required": false,
                "description": "Abrir el panel al pasar el ratón por el trigger, tras un retardo.\n    - `false` / omitido: desactivado (por defecto).\n    - `true`: retardo por defecto (200 ms).\n    - número ≥ 0: retardo en ms (`0` = al instante).\n    El clic en el trigger sigue alternando el panel. Para ir al panel sin cerrar, hay un margen al salir del trigger."
              },
              "hoverAnchorFollowPointer": {
                "name": "hoverAnchorFollowPointer",
                "type": "boolean",
                "required": false,
                "description": "Con `openOnHover` activo: el panel se ancla al puntero dentro del trigger (rectángulo 1×1\n    que sigue el ratón), actualizado en cada frame vía `requestAnimationFrame` para un movimiento fluido.\n    Sin efecto si `openOnHover` está desactivado. Aplica al botón interno y a `triggerRef`."
              },
              "openOnHoverAllowPanelPointer": {
                "name": "openOnHoverAllowPanelPointer",
                "type": "boolean",
                "required": false,
                "description": "Con `openOnHover` activo: si es `true` (por defecto), pasar el puntero del trigger al panel\n    cancela el cierre programado (comportamiento “puente”). Si es `false`, el panel no cuenta como\n    zona hover: al salir del trigger el popup se cierra aunque el puntero quede sobre el panel."
              },
              "closeOnClick": {
                "name": "closeOnClick",
                "type": "boolean",
                "required": false
              },
              "buttonClassName": {
                "name": "buttonClassName",
                "type": "string",
                "required": false
              },
              "containerClassName": {
                "name": "containerClassName",
                "type": "string",
                "required": false
              },
              "buttonTransition": {
                "name": "buttonTransition",
                "type": "boolean",
                "required": false
              },
              "buttonStyle": {
                "name": "buttonStyle",
                "type": "React.CSSProperties",
                "required": false
              },
              "borderRadius": {
                "name": "borderRadius",
                "type": "'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl'",
                "required": false
              },
              "stopPropagationList": {
                "name": "stopPropagationList",
                "type": "boolean",
                "required": false
              },
              "popoverArrow": {
                "name": "popoverArrow",
                "type": "PopupArrowMode",
                "required": false,
                "description": "Flecha tipo “beak” hacia el trigger. Por defecto `'auto'` (lado según `position`, punta al centro del trigger).\n    Con `absolute={true}`, `'auto'` no dibuja flecha; usa un objeto `{ edge, align }` o `false` para desactivarla."
              },
              "popoverStructured": {
                "name": "popoverStructured",
                "type": "boolean",
                "required": false,
                "description": "Layout tipo modal (header / cuerpo / footer) reutilizando `ModalProvider` y `Modal.Header|Body|Footer` sin modificar el Modal.\n    El contenido de `children` se renderiza en el cuerpo."
              },
              "popoverTitle": {
                "name": "popoverTitle",
                "type": "string",
                "required": false,
                "description": "Título del encabezado (tipografía H6 del sistema)."
              },
              "popoverDescription": {
                "name": "popoverDescription",
                "type": "string",
                "required": false,
                "description": "Subtítulo / descripción bajo el título."
              },
              "popoverShowHeader": {
                "name": "popoverShowHeader",
                "type": "boolean",
                "required": false,
                "description": "Mostrar bloque de cabecera cuando `popoverStructured` es true."
              },
              "popoverShowCloseButton": {
                "name": "popoverShowCloseButton",
                "type": "boolean",
                "required": false,
                "description": "Mostrar botón cerrar en cabecera (contexto Modal)."
              },
              "popoverIconConfig": {
                "name": "popoverIconConfig",
                "type": "ModalIcon",
                "required": false,
                "description": "Icono principal del header (mismo modelo que Modal)."
              },
              "popoverBadge": {
                "name": "popoverBadge",
                "type": "ModalBadge",
                "required": false
              },
              "popoverBadges": {
                "name": "popoverBadges",
                "type": "ModalBadge[]",
                "required": false
              },
              "popoverHeaderButton": {
                "name": "popoverHeaderButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverHeaderButtons": {
                "name": "popoverHeaderButtons",
                "type": "ModalButton[]",
                "required": false
              },
              "popoverShowFooter": {
                "name": "popoverShowFooter",
                "type": "boolean",
                "required": false,
                "description": "Incluir footer con botones del modelo Modal."
              },
              "popoverFooterPrimaryButton": {
                "name": "popoverFooterPrimaryButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterSecondaryButton": {
                "name": "popoverFooterSecondaryButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterButtons": {
                "name": "popoverFooterButtons",
                "type": "ModalButton[]",
                "required": false
              },
              "popoverFooterAuxButton": {
                "name": "popoverFooterAuxButton",
                "type": "ModalButton",
                "required": false
              },
              "popoverFooterSlotLayout": {
                "name": "popoverFooterSlotLayout",
                "type": "'inline' | 'spread'",
                "required": false,
                "description": "Reparto de iconos en los botones del footer del popover estructurado (`popoverFooterPrimaryButton` /\n    `popoverFooterSecondaryButton` / `popoverFooterButtons`). `spread` equivale a `slotLayout={{ var: 'spread', textAlign: 'center' }}` en cada\n    botón y reparto de ancho en la fila del footer (misma idea que `footerSlotLayout` en `Modal` para botones legacy)."
              },
              "popoverBodyWithPadding": {
                "name": "popoverBodyWithPadding",
                "type": "boolean",
                "required": false,
                "description": "Padding del cuerpo (`Modal.Body withPadding`). Por defecto true."
              }
            }
          }
        }
      ]
    },
    {
      "id": "ProgressBar",
      "path": "src/modules/ProgressBar",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "ProgressBar",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "jsdoc": "Tamaños válidos para ProgressBar */\nconst VALID_SIZES: ProgressBarSize[] = ['xxs', 'xs', 'sm', 'md', 'lg'];\n\n/**\nHook interno para manejar la cuenta regresiva del ProgressBar.\nAnima el progreso desde un valor inicial hasta 0 en un tiempo determinado.\n/\nconst useCountdown = (\n  initialProgress: number,\n  countdownSeconds: number | undefined,\n  onComplete?: () => void\n) => {\n  const [currentProgress, setCurrentProgress] = useState(initialProgress);\n  const intervalRef = useRef<NodeJS.Timeout | null>(null);\n  const startTimeRef = useRef<number>(0);\n  const hasCompletedRef = useRef(false);\n  // Guardar el callback en una ref para evitar que esté en las dependencias del useEffect\n  const onCompleteRef = useRef(onComplete);\n\n  const INTERVAL_MS = 16; // ~60fps\n\n  // Mantener la ref actualizada",
            "confidence": "medium"
          },
          "examples": [
            "// Modo normal\n<ProgressBar \n  progress={75} \n  label=\"archivo.zip\"\n  eta=\"1m restante\"\n  helperText=\"200MB de 512MB\"\n/>\n\n// Modo compacto - barra en línea con el label\n<ProgressBar \n  progress={75} \n  label=\"archivo.zip\"\n  eta=\"1m restante\"\n  helperText=\"200MB de 512MB\"\n  compact\n/>",
            "<ProgressBar\n  progress={75}\n  label=\"archivo.zip\"\n  eta=\"1m restante\"\n  size=\"sm\"\n  color=\"brand\"\n  helperText=\"200MB de 512MB\"\n  helperTextType=\"size\"\n  showCloseButton\n  onClose={() => {}}\n  withBackground\n/>",
            "// Uso simple - la barra anima automáticamente de 75% a 0% en 5 segundos\n<ProgressBar \n  progress={75}\n  countdown={5}\n  label=\"Descargando...\"\n  onCountdownComplete={() => console.log('¡Completado!')}\n/>\n\n// Con diferentes colores y duraciones\n<ProgressBar \n  progress={100}\n  countdown={10}\n  color=\"warning\"\n  label=\"Tiempo restante\"\n  onCountdownComplete={() => alert('¡Se acabó el tiempo!')}\n/>",
            "// Modo normal\n<ProgressBar \n  progress={75} \n  label=\"archivo.zip\"\n  eta=\"1m restante\"\n  helperText=\"200MB de 512MB\"\n/>\n\n// Modo compacto - barra en línea con el label\n<ProgressBar \n  progress={75} \n  label=\"archivo.zip\"\n  eta=\"1m restante\"\n  helperText=\"200MB de 512MB\"\n  compact\n/>",
            "<ProgressBar\n  progress={75}\n  label=\"archivo.zip\"\n  eta=\"1m restante\"\n  size=\"sm\"\n  color=\"brand\"\n  helperText=\"200MB de 512MB\"\n  helperTextType=\"size\"\n  showCloseButton\n  onClose={() => {}}\n  withBackground\n/>"
          ],
          "props": {
            "groups": {
              "progressHeader": {
                "props": {
                  "label": {
                    "name": "label",
                    "type": "string",
                    "required": false,
                    "description": "Texto del label"
                  },
                  "progress": {
                    "name": "progress",
                    "type": "number",
                    "required": false,
                    "description": "Valor de progreso"
                  },
                  "progressSuffix": {
                    "name": "progressSuffix",
                    "type": "string",
                    "required": false,
                    "description": "Sufijo del progreso"
                  },
                  "eta": {
                    "name": "eta",
                    "type": "string",
                    "required": false,
                    "description": "Texto adicional (ej: \"1m restante\")"
                  },
                  "showCloseButton": {
                    "name": "showCloseButton",
                    "type": "boolean",
                    "required": false,
                    "description": "Mostrar botón de cerrar"
                  },
                  "onClose": {
                    "name": "onClose",
                    "type": "() => void",
                    "required": false,
                    "description": "Callback al cerrar"
                  },
                  "className": {
                    "name": "className",
                    "type": "string",
                    "required": false,
                    "description": "Clases adicionales"
                  }
                }
              }
            },
            "deprecatedRoot": [
              {
                "name": "description",
                "migrateTo": "helperText */",
                "type": "string"
              },
              {
                "name": "progressChar",
                "migrateTo": "progressSuffix */",
                "type": "string"
              },
              {
                "name": "status",
                "type": "'neutral' | 'blue' | 'red'"
              },
              {
                "name": "borderStyle",
                "type": "'dashed' | 'solid' | 'small-solid'"
              }
            ],
            "flat": {
              "color": {
                "name": "color",
                "type": "ProgressBarColor",
                "required": false,
                "description": "Color de la barra"
              },
              "progress": {
                "name": "progress",
                "type": "number",
                "required": false,
                "description": "Porcentaje de progreso (0-100)"
              },
              "label": {
                "name": "label",
                "type": "string",
                "required": false,
                "description": "Texto del label"
              },
              "showLabel": {
                "name": "showLabel",
                "type": "boolean",
                "required": false,
                "description": "Mostrar label"
              },
              "showProgress": {
                "name": "showProgress",
                "type": "boolean",
                "required": false,
                "description": "Mostrar porcentaje de progreso"
              },
              "progressSuffix": {
                "name": "progressSuffix",
                "type": "string",
                "required": false,
                "description": "Sufijo del progreso (por defecto \"%\")"
              },
              "eta": {
                "name": "eta",
                "type": "string",
                "required": false,
                "description": "Texto ETA (ej: \"1m restante\")"
              },
              "size": {
                "name": "size",
                "type": "ProgressBarSize",
                "required": false,
                "description": "Tamaño de la barra"
              },
              "icon": {
                "name": "icon",
                "type": "IconType | IconProp",
                "required": false,
                "description": "Ícono a mostrar (deprecado - usar showCloseButton)"
              },
              "iconDuotonePrimary": {
                "name": "iconDuotonePrimary",
                "type": "IconFontColor",
                "required": false
              },
              "iconDuotoneSecondary": {
                "name": "iconDuotoneSecondary",
                "type": "IconFontColor",
                "required": false
              },
              "iconDuotoneOpacityPrimary": {
                "name": "iconDuotoneOpacityPrimary",
                "type": "number",
                "required": false
              },
              "iconDuotoneOpacitySecondary": {
                "name": "iconDuotoneOpacitySecondary",
                "type": "number",
                "required": false
              },
              "showIcon": {
                "name": "showIcon",
                "type": "boolean",
                "required": false,
                "description": "Mostrar ícono (deprecado - usar showCloseButton)"
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clases adicionales"
              },
              "duration": {
                "name": "duration",
                "type": "number",
                "required": false,
                "description": "Duración de la animación"
              },
              "withBackground": {
                "name": "withBackground",
                "type": "boolean",
                "required": false,
                "description": "Mostrar fondo de la barra"
              },
              "helperText": {
                "name": "helperText",
                "type": "string",
                "required": false,
                "description": "Texto de ayuda inferior"
              },
              "helperTextType": {
                "name": "helperTextType",
                "type": "HelperTextType",
                "required": false,
                "description": "Tipo de texto de ayuda"
              },
              "compact": {
                "name": "compact",
                "type": "boolean",
                "required": false,
                "description": "Modo compacto (sin texto de ayuda)"
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false,
                "description": "Estado deshabilitado"
              },
              "showCloseButton": {
                "name": "showCloseButton",
                "type": "boolean",
                "required": false,
                "description": "Mostrar botón de cerrar"
              },
              "onClose": {
                "name": "onClose",
                "type": "() => void",
                "required": false,
                "description": "Callback al cerrar"
              },
              "countdown": {
                "name": "countdown",
                "type": "number",
                "required": false,
                "description": "Duración de la cuenta regresiva en segundos.\n    Si se proporciona, la barra animará automáticamente desde el valor de `progress` hasta 0."
              },
              "onCountdownComplete": {
                "name": "onCountdownComplete",
                "type": "() => void",
                "required": false,
                "description": "Callback que se ejecuta cuando la cuenta regresiva llega a 0.\n    Solo se ejecuta si `countdown` está definido."
              }
            }
          }
        }
      ]
    },
    {
      "id": "RadioButton",
      "path": "src/modules/RadioButton",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "RadioButton",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Un componente RadioButton personalizado y simple para selecciones únicas. Soporta estados controlado y no controlado.",
            "jsdoc": "Componente RadioButton - Átomo\nUn radio button personalizable con múltiples estados y variantes de color.\nImplementa tokens semánticos de Figma para consistencia visual.",
            "confidence": "high"
          },
          "examples": [
            "import { RadioButton } from '@/modules/RadioButton';\n  import { useState } from 'react';\n\n  export default function Example() {\n    const [isChecked, setIsChecked] = useState(false);\n\n    return (\n      <RadioButton\n        label=\"Opción básica\"\n        name=\"basic-radio\"\n        checked={isChecked}\n        onChange={() => setIsChecked(!isChecked)}\n        color=\"blue\"\n        size=\"md\"\n      />\n    )\n  }",
            "const [selectedSize, setSelectedSize] = useState('md');\n\n  <RadioButton\n    label=\"Opción pequeña\"\n    name=\"size-radio\"\n    checked={selectedSize === 'sm'}\n    onChange={() => setSelectedSize('sm')}\n    size=\"sm\"\n    color=\"blue\"\n  />\n  <RadioButton\n    label=\"Opción mediana\"\n    name=\"size-radio\"\n    checked={selectedSize === 'md'}\n    onChange={() => setSelectedSize('md')}\n    size=\"md\"\n    color=\"blue\"\n  />\n  <RadioButton\n    label=\"Opción grande\"\n    name=\"size-radio\"\n    checked={selectedSize === 'lg'}\n    onChange={() => setSelectedSize('lg')}\n    size=\"lg\"\n    color=\"blue\"\n  />",
            "const [selectedColor, setSelectedColor] = useState('blue');\n\n  <RadioButton\n    label=\"Opción azul\"\n    name=\"color-radio\"\n    checked={selectedColor === 'blue'}\n    onChange={() => setSelectedColor('blue')}\n    color=\"blue\"\n  />\n  <RadioButton\n    label=\"Opción verde\"\n    name=\"color-radio\"\n    checked={selectedColor === 'green'}\n    onChange={() => setSelectedColor('green')}\n    color=\"green\"\n  />\n  <RadioButton\n    label=\"Opción roja\"\n    name=\"color-radio\"\n    checked={selectedColor === 'red'}\n    onChange={() => setSelectedColor('red')}\n    color=\"red\"\n  />\n  <RadioButton\n    label=\"Opción amarilla\"\n    name=\"color-radio\"\n    checked={selectedColor === 'yellow'}\n    onChange={() => setSelectedColor('yellow')}\n    color=\"yellow\"\n  />\n  <RadioButton\n    label=\"Opción neutral\"\n    name=\"color-radio\"\n    checked={selectedColor === 'neutral'}\n    onChange={() => setSelectedColor('neutral')}\n    color=\"neutral\"\n  />",
            "const [isChecked, setIsChecked] = useState(false);\n\n  <RadioButton\n    label=\"Opción deshabilitada\"\n    name=\"disabled-radio\"\n    checked={isChecked}\n    onChange={() => setIsChecked(!isChecked)}\n    disabled={true}\n    color=\"blue\"\n  />\n  <RadioButton\n    label=\"Opción habilitada\"\n    name=\"enabled-radio\"\n    checked={isChecked}\n    onChange={() => setIsChecked(!isChecked)}\n    disabled={false}\n    color=\"blue\"\n  />",
            "const [isChecked, setIsChecked] = useState(false);\n\n  <RadioButton\n    label=\"Opción controlada\"\n    name=\"controlled-radio\"\n    checked={isChecked}\n    onChange={() => setIsChecked(!isChecked)}\n    color=\"blue\"\n    size=\"md\"\n  />",
            "import { RadioButtonGroup } from '@/modules/RadioButton';\n  import { useState } from 'react';\n\n  export default function Example() {\n    const [selectedValue, setSelectedValue] = useState('option1');\n\n    return (\n      <RadioButtonGroup\n        options={[\n          { value: 'option1', label: 'Opción 1' },\n          { value: 'option2', label: 'Opción 2' },\n          { value: 'option3', label: 'Opción 3' },\n          { value: 'option4', label: 'Opción 4 (Deshabilitada)', disabled: true },\n        ]}\n        value={selectedValue}\n        onChange={setSelectedValue}\n        name=\"basic-group\"\n        color=\"blue\"\n        size=\"md\"\n      />\n    )\n  }",
            "const [selectedValue, setSelectedValue] = useState('option1');\n\n  <RadioButtonGroup\n    options={defaultOptions}\n    value={selectedValue}\n    onChange={setSelectedValue}\n    name=\"controlled-group\"\n    color=\"blue\"\n  />",
            "const [selectedValue, setSelectedValue] = useState('option1');\n\n  <RadioButtonGroup\n    options={defaultOptions}\n    value={selectedValue}\n    onChange={setSelectedValue}\n    name=\"uncontrolled-group\"\n    color=\"green\"\n  />",
            "const [selectedSize, setSelectedSize] = useState('md');\n\n  <RadioButtonGroup\n    options={defaultOptions}\n    value={selectedSize}\n    onChange={setSelectedSize}\n    name=\"size-sm\"\n    color=\"blue\"\n  />\n  <RadioButtonGroup\n    options={defaultOptions}\n    value={selectedSize}\n    onChange={setSelectedSize}\n    name=\"size-md\"\n    color=\"blue\"\n  />\n  <RadioButtonGroup\n    options={defaultOptions}\n    value={selectedSize}\n    onChange={setSelectedSize}\n    name=\"size-lg\"\n    color=\"blue\"\n  />",
            "const [selectedColor, setSelectedColor] = useState('blue');\n\n  <RadioButtonGroup\n    options={colorOptions}\n    value={selectedColor}\n    onChange={setSelectedColor}\n    name=\"color-blue\"\n    color=\"blue\"\n  />\n  <RadioButtonGroup\n    options={colorOptions}\n    value={selectedColor}\n    onChange={setSelectedColor}\n    name=\"color-green\"\n    color=\"green\"\n  />\n  <RadioButtonGroup\n    options={colorOptions}\n    value={selectedColor}\n    onChange={setSelectedColor}\n    name=\"color-red\"\n    color=\"red\"\n  />"
          ],
          "props": {
            "groups": {
              "base": {
                "props": {
                  "label": {
                    "name": "label",
                    "type": "string",
                    "required": false,
                    "description": "Texto del label del radio button"
                  },
                  "size": {
                    "name": "size",
                    "type": "RadioButtonSize",
                    "required": false,
                    "description": "Tamaño del radio button"
                  },
                  "color": {
                    "name": "color",
                    "type": "RadioButtonColor",
                    "required": false,
                    "description": "Color del radio button"
                  },
                  "disabled": {
                    "name": "disabled",
                    "type": "boolean",
                    "required": false,
                    "description": "Si el radio button está deshabilitado"
                  },
                  "className": {
                    "name": "className",
                    "type": "string",
                    "required": false,
                    "description": "Clases CSS adicionales para el contenedor"
                  },
                  "labelClassName": {
                    "name": "labelClassName",
                    "type": "string",
                    "required": false,
                    "description": "Clases CSS adicionales para el label"
                  },
                  "id": {
                    "name": "id",
                    "type": "string",
                    "required": false,
                    "description": "ID único del radio button"
                  },
                  "checked": {
                    "name": "checked",
                    "type": "boolean",
                    "required": false,
                    "description": "Si el radio button está seleccionado"
                  },
                  "onChange": {
                    "name": "onChange",
                    "type": "(event: React.ChangeEvent<HTMLInputElement>) => void",
                    "required": false,
                    "description": "Callback cuando cambia el estado"
                  },
                  "name": {
                    "name": "name",
                    "type": "string",
                    "required": false,
                    "description": "Nombre del grupo de radio buttons"
                  }
                }
              },
              "group": {
                "props": {
                  "options": {
                    "name": "options",
                    "type": "RadioButtonOption[]",
                    "required": true,
                    "description": "Array de opciones para el grupo de radio buttons"
                  },
                  "value": {
                    "name": "value",
                    "type": "string",
                    "required": false,
                    "description": "Valor seleccionado actualmente"
                  },
                  "onChange": {
                    "name": "onChange",
                    "type": "(value: string) => void",
                    "required": false,
                    "description": "Callback cuando cambia la selección"
                  },
                  "size": {
                    "name": "size",
                    "type": "RadioButtonSize",
                    "required": false,
                    "description": "Tamaño de todos los radio buttons"
                  },
                  "color": {
                    "name": "color",
                    "type": "RadioButtonColor",
                    "required": false,
                    "description": "Color de todos los radio buttons"
                  },
                  "disabled": {
                    "name": "disabled",
                    "type": "boolean",
                    "required": false,
                    "description": "Si todos los radio buttons están deshabilitados"
                  },
                  "orientation": {
                    "name": "orientation",
                    "type": "'horizontal' | 'vertical'",
                    "required": false,
                    "description": "Orientación del grupo"
                  },
                  "className": {
                    "name": "className",
                    "type": "string",
                    "required": false,
                    "description": "Clases CSS adicionales"
                  },
                  "name": {
                    "name": "name",
                    "type": "string",
                    "required": false,
                    "description": "Nombre del grupo"
                  }
                }
              }
            },
            "deprecatedRoot": [],
            "flat": {
              "options": {
                "name": "options",
                "type": "RadioButtonOption[]",
                "required": true,
                "description": "Array de opciones para el grupo de radio buttons"
              },
              "value": {
                "name": "value",
                "type": "string",
                "required": false,
                "description": "Valor seleccionado actualmente"
              },
              "onChange": {
                "name": "onChange",
                "type": "(value: string) => void",
                "required": false,
                "description": "Callback cuando cambia la selección"
              },
              "size": {
                "name": "size",
                "type": "RadioButtonSize",
                "required": false,
                "description": "Tamaño de todos los radio buttons"
              },
              "color": {
                "name": "color",
                "type": "RadioButtonColor",
                "required": false,
                "description": "Color de todos los radio buttons"
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false,
                "description": "Si todos los radio buttons están deshabilitados"
              },
              "orientation": {
                "name": "orientation",
                "type": "'horizontal' | 'vertical'",
                "required": false,
                "description": "Orientación del grupo"
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clases CSS adicionales"
              },
              "name": {
                "name": "name",
                "type": "string",
                "required": false,
                "description": "Nombre del grupo"
              }
            }
          }
        }
      ]
    },
    {
      "id": "RangeBar",
      "path": "src/modules/RangeBar",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "RANGE_BAR_TRACK_BLEED_X",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Control de rango con dos extremos. API agrupada:",
            "jsdoc": "Padding horizontal del carril: deja sitio para el thumb (20px) centrado en 0% y 100%\nsin recortarse. Debe aplicarse igual en `RangeBar` y en filas de `RangeSelector` alineadas a la pista.",
            "confidence": "high"
          },
          "examples": [
            "<RangeSelector\n  labels={{ title: 'Costo' }}\n  range={{ min: 0, max: 100000, step: 1000, value }}\n  events={{ onChange: setValue }}\n  appearance={{ compact: true }}\n/>",
            "<RangeSelector\n  labels={{ title: 'Costo' }}\n  range={{ min: 0, max: 100000, step: 1000, value }}\n  events={{ onChange: setValue }}\n  appearance={{ compact: true }}\n/>"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "range": {
                "name": "range",
                "type": "RangeBarRangeProps",
                "required": true,
                "description": "Dominio y valor del intervalo."
              },
              "events": {
                "name": "events",
                "type": "RangeBarEventsProps",
                "required": true,
                "description": "Emisión de cambios de valor."
              },
              "appearance": {
                "name": "appearance",
                "type": "RangeBarAppearanceProps",
                "required": false,
                "description": "Variante cromática del relleno y punto interior."
              },
              "accessibility": {
                "name": "accessibility",
                "type": "RangeBarAccessibilityProps",
                "required": false,
                "description": "Etiquetas de grupo y por thumb."
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false,
                "description": "Deshabilita interacción y atenua la pista."
              },
              "trackBleed": {
                "name": "trackBleed",
                "type": "boolean",
                "required": false,
                "description": "Sangrado horizontal (`RANGE_BAR_TRACK_BLEED_X`, 10px) para que los thumbs de 20px no se recorten\n    en 0% / 100%. En layouts muy estrechos (p. ej. `RangeSelector` compacto) se puede desactivar."
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clases en el contenedor externo (ref)."
              }
            }
          }
        }
      ]
    },
    {
      "id": "Rating",
      "path": "src/modules/Rating",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Rating",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "jsdoc": "Rating - Componente de calificación con estrellas\nComponente que muestra un sistema de calificación con estrellas.\nSoporta modo lectura y edición, hover interactivo y diferentes tamaños.",
            "confidence": "medium"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "value": {
                "name": "value",
                "type": "number",
                "required": false
              },
              "max": {
                "name": "max",
                "type": "number",
                "required": false
              },
              "size": {
                "name": "size",
                "type": "'sm' | 'md' | 'lg'",
                "required": false
              },
              "readonly": {
                "name": "readonly",
                "type": "boolean",
                "required": false
              },
              "onChange": {
                "name": "onChange",
                "type": "(value: number) => void",
                "required": false
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              }
            }
          }
        }
      ]
    },
    {
      "id": "Separator",
      "path": "src/modules/Separator",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Separator",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Separador visual horizontal o vertical. Con",
            "jsdoc": "Separator - Componente de separador visual\nComponente que muestra una línea separadora horizontal o vertical.\nÚtil para dividir secciones de contenido visualmente.",
            "confidence": "high"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "vertical": {
                "name": "vertical",
                "type": "boolean",
                "required": false
              },
              "padding": {
                "name": "padding",
                "type": "boolean",
                "required": false
              },
              "label": {
                "name": "label",
                "type": "string",
                "required": false,
                "description": "Texto centrado entre dos tramos de línea. Solo tiene efecto en orientación horizontal;\n    con `vertical` se ignora."
              }
            }
          }
        }
      ]
    },
    {
      "id": "Sidebar",
      "path": "src/modules/Sidebar",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Sidebar",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Sidebar sigue el marco Sidebar-Menu (Figma): 240px / 56px, padding 12px, cabecera con slot, lista scroll, tarjeta workspace (borde dashed), perfil y pie. Incluye secciones colapsables, drilldown y avatar compacto al colapsar.",
            "jsdoc": "Application sidebar aligned with the Sidebar-Menu Figma spec: 240px expanded, 56px collapsed,\n12px rail padding, header row (logo + optional trailing), collapse control with shadow-03,\nscrollable menu region, workspace card below the menu (or sheet over profile when `workspace.workspaceSheet`),\nthen profile and optional footer.",
            "confidence": "high"
          },
          "examples": [],
          "props": {
            "groups": {
              "menuItem": {
                "props": {
                  "id": {
                    "name": "id",
                    "type": "string",
                    "required": true,
                    "description": "Identificador único del item"
                  },
                  "label": {
                    "name": "label",
                    "type": "string",
                    "required": true,
                    "description": "Texto a mostrar"
                  },
                  "icon": {
                    "name": "icon",
                    "type": "SidebarIcon",
                    "required": false,
                    "description": "Icono del item (FontAwesome)"
                  },
                  "badge": {
                    "name": "badge",
                    "type": "SidebarBadge",
                    "required": false,
                    "description": "Badge opcional"
                  },
                  "active": {
                    "name": "active",
                    "type": "boolean",
                    "required": false,
                    "description": "Indica si el item está activo/seleccionado"
                  },
                  "disabled": {
                    "name": "disabled",
                    "type": "boolean",
                    "required": false,
                    "description": "Indica si el item está deshabilitado"
                  },
                  "hasSubmenu": {
                    "name": "hasSubmenu",
                    "type": "boolean",
                    "required": false,
                    "description": "Indica si el item tiene submenú"
                  },
                  "onClick": {
                    "name": "onClick",
                    "type": "(id: string) => void",
                    "required": false,
                    "description": "Handler de click"
                  },
                  "className": {
                    "name": "className",
                    "type": "string",
                    "required": false,
                    "description": "Clases CSS adicionales"
                  },
                  "href": {
                    "name": "href",
                    "type": "string",
                    "required": false,
                    "description": "Ruta de navegación (opcional)"
                  }
                }
              },
              "sectionTitle": {
                "props": {
                  "title": {
                    "name": "title",
                    "type": "string",
                    "required": true,
                    "description": "Texto del título"
                  },
                  "className": {
                    "name": "className",
                    "type": "string",
                    "required": false,
                    "description": "Clases CSS adicionales"
                  }
                }
              },
              "divider": {
                "props": {
                  "className": {
                    "name": "className",
                    "type": "string",
                    "required": false,
                    "description": "Clases CSS adicionales"
                  },
                  "withText": {
                    "name": "withText",
                    "type": "boolean",
                    "required": false,
                    "description": "Muestra divider con texto"
                  },
                  "text": {
                    "name": "text",
                    "type": "string",
                    "required": false,
                    "description": "Texto del divider"
                  }
                }
              },
              "menuGroup": {
                "props": {
                  "title": {
                    "name": "title",
                    "type": "string",
                    "required": false,
                    "description": "Título de la sección (opcional)"
                  },
                  "items": {
                    "name": "items",
                    "type": "SidebarMenuItemProps[]",
                    "required": true,
                    "description": "Items del menú"
                  },
                  "collapsible": {
                    "name": "collapsible",
                    "type": "boolean",
                    "required": false,
                    "description": "When true with `title`, section header toggles visibility (Figma collapsible blocks).\n    When false, title uses a static divider row."
                  },
                  "defaultExpanded": {
                    "name": "defaultExpanded",
                    "type": "boolean",
                    "required": false,
                    "description": "Initial open state when `collapsible` is true."
                  },
                  "collapsed": {
                    "name": "collapsed",
                    "type": "boolean",
                    "required": false,
                    "description": "When true (narrow rail), section titles and collapsible headers are hidden; titled groups\n    show a plain divider line only, then items."
                  },
                  "skipLeadingPlainDivider": {
                    "name": "skipLeadingPlainDivider",
                    "type": "boolean",
                    "required": false,
                    "description": "When the group has a `title`, omit the leading plain `SidebarDivider` when it would\n    duplicate the rail divider below the header: collapsed rail (before items), or expanded\n    collapsible section (before the chevron header)."
                  },
                  "className": {
                    "name": "className",
                    "type": "string",
                    "required": false,
                    "description": "Clases CSS adicionales"
                  }
                }
              },
              "workspaceCard": {
                "props": {
                  "icon": {
                    "name": "icon",
                    "type": "SidebarIcon",
                    "required": false,
                    "description": "Leading icon (Figma: pen-to-square on brand)."
                  },
                  "sectionLabel": {
                    "name": "sectionLabel",
                    "type": "string",
                    "required": false,
                    "description": "Small label above the campaign row (Figma Sidebar-Menu “Mesa de trabajo”, Body XS / tertiary)."
                  },
                  "title": {
                    "name": "title",
                    "type": "string",
                    "required": false,
                    "description": "Primary campaign/project line (Body LG / brand). If `projectId` is set, it wins for display."
                  },
                  "badge": {
                    "name": "badge",
                    "type": "SidebarBadge",
                    "required": false,
                    "description": "Badge with counter (Figma: brand pill on the right)."
                  },
                  "projectId": {
                    "name": "projectId",
                    "type": "string",
                    "required": false,
                    "description": "Preferred source for the primary line when both `title` and `projectId` are used."
                  },
                  "showActions": {
                    "name": "showActions",
                    "type": "boolean",
                    "required": false,
                    "description": "When false, hides the footer text actions even if `onOpen` / `onClose` are set."
                  },
                  "onClose": {
                    "name": "onClose",
                    "type": "() => void",
                    "required": false,
                    "description": "Left CTA (Figma: “Cerrar”, danger text)."
                  },
                  "onOpen": {
                    "name": "onOpen",
                    "type": "() => void",
                    "required": false,
                    "description": "Right CTA (Figma: “Ver pauta”)."
                  },
                  "closeLabel": {
                    "name": "closeLabel",
                    "type": "string",
                    "required": false,
                    "description": "Copy for the close action."
                  },
                  "primaryActionLabel": {
                    "name": "primaryActionLabel",
                    "type": "string",
                    "required": false,
                    "description": "Copy for the primary action (e.g. open schedule)."
                  },
                  "cardBorderStyle": {
                    "name": "cardBorderStyle",
                    "type": "'solid' | 'dashed'",
                    "required": false,
                    "description": "Border style for the card surface (Figma “Mesa de trabajo” uses dashed)."
                  },
                  "className": {
                    "name": "className",
                    "type": "string",
                    "required": false,
                    "description": "Clases CSS adicionales"
                  }
                }
              },
              "userProfileSummary": {
                "props": {
                  "name": {
                    "name": "name",
                    "type": "string",
                    "required": true,
                    "description": "Display name (rail primary line + popover header)."
                  },
                  "subtitle": {
                    "name": "subtitle",
                    "type": "string",
                    "required": false,
                    "description": "Secondary line on the rail (e.g. role)."
                  },
                  "email": {
                    "name": "email",
                    "type": "string",
                    "required": false,
                    "description": "Secondary line in the popover header (e.g. email).\n    Falls back to `subtitle` when omitted."
                  },
                  "avatarProps": {
                    "name": "avatarProps",
                    "type": "Omit<AvatarProps, 'type'> & { type?: AvatarProps['type']",
                    "required": false
                  },
                  "src": {
                    "name": "src",
                    "type": "string }",
                    "required": false
                  },
                  "presence": {
                    "name": "presence",
                    "type": "{",
                    "required": false,
                    "description": "Optional presence chip in the popover header (e.g. “En linea”)."
                  },
                  "label": {
                    "name": "label",
                    "type": "string",
                    "required": true
                  }
                }
              },
              "userProfileMenu": {
                "props": {
                  "onSettings": {
                    "name": "onSettings",
                    "type": "() => void",
                    "required": false
                  },
                  "settingsLabel": {
                    "name": "settingsLabel",
                    "type": "string",
                    "required": false
                  },
                  "darkMode": {
                    "name": "darkMode",
                    "type": "{",
                    "required": false
                  },
                  "checked": {
                    "name": "checked",
                    "type": "boolean",
                    "required": true
                  },
                  "onChange": {
                    "name": "onChange",
                    "type": "(checked: boolean) => void",
                    "required": true
                  },
                  "label": {
                    "name": "label",
                    "type": "string",
                    "required": false
                  },
                  "onLogout": {
                    "name": "onLogout",
                    "type": "() => void",
                    "required": false
                  },
                  "logoutLabel": {
                    "name": "logoutLabel",
                    "type": "string",
                    "required": false
                  }
                }
              },
              "userProfile": {
                "props": {
                  "summary": {
                    "name": "summary",
                    "type": "SidebarUserProfileSummaryProps",
                    "required": true
                  },
                  "menu": {
                    "name": "menu",
                    "type": "SidebarUserProfileMenuProps",
                    "required": false
                  },
                  "menuPosition": {
                    "name": "menuPosition",
                    "type": "| 'top'",
                    "required": false,
                    "description": "Popover anchor position relative to the menu trigger.\n    Default `top-left`: panel above the trigger, left edges aligned (extends to the right)."
                  },
                  "className": {
                    "name": "className",
                    "type": "string",
                    "required": false
                  }
                }
              },
              "drilldownPanel": {
                "props": {
                  "expanded": {
                    "name": "expanded",
                    "type": "boolean",
                    "required": true,
                    "description": "When true, shows breadcrumb header and full-width rows.\n    When false, shows icon-only actions with tooltips."
                  },
                  "parentItem": {
                    "name": "parentItem",
                    "type": "SidebarDrilldownParentItem",
                    "required": true
                  },
                  "breadcrumbRootLabel": {
                    "name": "breadcrumbRootLabel",
                    "type": "string",
                    "required": true,
                    "description": "First breadcrumb segment (e.g. product area)."
                  },
                  "isSubmenuActive": {
                    "name": "isSubmenuActive",
                    "type": "(item: SidebarDrilldownSubmenuItem) => boolean",
                    "required": false,
                    "description": "Returns whether a submenu row should render as active/selected."
                  },
                  "showBreadcrumbRoot": {
                    "name": "showBreadcrumbRoot",
                    "type": "boolean",
                    "required": false,
                    "description": "When false, hides the root breadcrumb label and chevron before the parent title."
                  },
                  "onActivateSubmenu": {
                    "name": "onActivateSubmenu",
                    "type": "(item: SidebarDrilldownSubmenuItem) => void",
                    "required": false,
                    "description": "Invoked after optional `onClick` on the row; host handles `href` / routing."
                  },
                  "onBack": {
                    "name": "onBack",
                    "type": "() => void",
                    "required": true,
                    "description": "Navigates back to the parent menu level."
                  },
                  "backButtonTooltip": {
                    "name": "backButtonTooltip",
                    "type": "string",
                    "required": false,
                    "description": "Accessible label for the collapsed back control tooltip."
                  },
                  "className": {
                    "name": "className",
                    "type": "string",
                    "required": false
                  }
                }
              }
            },
            "deprecatedRoot": [],
            "flat": {
              "logo": {
                "name": "logo",
                "type": "ReactNode | string",
                "required": false,
                "description": "Logo del sistema (URL o componente)"
              },
              "onLogoClick": {
                "name": "onLogoClick",
                "type": "() => void",
                "required": false,
                "description": "Handler de click en logo"
              },
              "headerTrailing": {
                "name": "headerTrailing",
                "type": "ReactNode",
                "required": false,
                "description": "Trailing header slot (e.g. notifications icon + badge). Hidden when collapsed if you omit it."
              },
              "workspace": {
                "name": "workspace",
                "type": "SidebarWorkspaceConfig",
                "required": false,
                "description": "Workspace card (`SidebarWorkspaceCard`). Use `workspaceSheet` on the object for slide-over profile mode."
              },
              "menuGroups": {
                "name": "menuGroups",
                "type": "SidebarMenuGroupProps[]",
                "required": false,
                "description": "Grupos de menú"
              },
              "userProfile": {
                "name": "userProfile",
                "type": "SidebarUserProfileProps",
                "required": false,
                "description": "Perfil del usuario"
              },
              "footer": {
                "name": "footer",
                "type": "ReactNode",
                "required": false,
                "description": "Pie del rail (e.g. legales + versión)."
              },
              "collapsed": {
                "name": "collapsed",
                "type": "boolean",
                "required": false,
                "description": "Estado colapsado"
              },
              "onToggleCollapse": {
                "name": "onToggleCollapse",
                "type": "() => void",
                "required": false,
                "description": "Handler para toggle de collapse"
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clases CSS adicionales"
              },
              "width": {
                "name": "width",
                "type": "number",
                "required": false,
                "description": "Expanded width in px (Figma: 240)."
              },
              "collapsedWidth": {
                "name": "collapsedWidth",
                "type": "number",
                "required": false,
                "description": "Collapsed width in px (Figma: 56)."
              },
              "drilldown": {
                "name": "drilldown",
                "type": "SidebarDrilldownConfig",
                "required": false,
                "description": "Second-level navigation: when `active`, renders `SidebarDrilldownPanel` instead of `menuGroups`.\n    Logo, workspace (if not collapsed) and user profile behavior are unchanged."
              }
            }
          }
        },
        {
          "name": "SidebarMenuItem",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Sidebar sigue el marco Sidebar-Menu (Figma): 240px / 56px, padding 12px, cabecera con slot, lista scroll, tarjeta workspace (borde dashed), perfil y pie. Incluye secciones colapsables, drilldown y avatar compacto al colapsar.",
            "jsdoc": "============================================\nSIDEBAR MENU ITEM - ATOM\n============================================\nComponente atómico para items individuales del menú lateral.\nReutiliza el componente ListItemDefault del paquete UI.\nSoporta iconos, badges, estados activo/deshabilitado y submenús.",
            "confidence": "high"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "id": {
                "name": "id",
                "type": "string",
                "required": true,
                "description": "Identificador único del item"
              },
              "label": {
                "name": "label",
                "type": "string",
                "required": true,
                "description": "Texto a mostrar"
              },
              "icon": {
                "name": "icon",
                "type": "SidebarIcon",
                "required": false,
                "description": "Icono del item (FontAwesome)"
              },
              "badge": {
                "name": "badge",
                "type": "SidebarBadge",
                "required": false,
                "description": "Badge opcional"
              },
              "active": {
                "name": "active",
                "type": "boolean",
                "required": false,
                "description": "Indica si el item está activo/seleccionado"
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false,
                "description": "Indica si el item está deshabilitado"
              },
              "hasSubmenu": {
                "name": "hasSubmenu",
                "type": "boolean",
                "required": false,
                "description": "Indica si el item tiene submenú"
              },
              "onClick": {
                "name": "onClick",
                "type": "(id: string) => void",
                "required": false,
                "description": "Handler de click"
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clases CSS adicionales"
              },
              "href": {
                "name": "href",
                "type": "string",
                "required": false,
                "description": "Ruta de navegación (opcional)"
              }
            }
          }
        },
        {
          "name": "SidebarDivider",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Sidebar sigue el marco Sidebar-Menu (Figma): 240px / 56px, padding 12px, cabecera con slot, lista scroll, tarjeta workspace (borde dashed), perfil y pie. Incluye secciones colapsables, drilldown y avatar compacto al colapsar.",
            "jsdoc": "============================================\nSIDEBAR DIVIDER - ATOM\n============================================\nSeparador para el sidebar. Puede ser una línea simple\no incluir un texto descriptivo.",
            "confidence": "high"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clases CSS adicionales"
              },
              "withText": {
                "name": "withText",
                "type": "boolean",
                "required": false,
                "description": "Muestra divider con texto"
              },
              "text": {
                "name": "text",
                "type": "string",
                "required": false,
                "description": "Texto del divider"
              }
            }
          }
        },
        {
          "name": "SidebarSectionTitle",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Sidebar sigue el marco Sidebar-Menu (Figma): 240px / 56px, padding 12px, cabecera con slot, lista scroll, tarjeta workspace (borde dashed), perfil y pie. Incluye secciones colapsables, drilldown y avatar compacto al colapsar.",
            "jsdoc": "============================================\nSIDEBAR SECTION TITLE - ATOM\n============================================\nSection label for the sidebar; groups menu blocks.\nBody XS Regular, tertiary, sentence case (no uppercase transform).",
            "confidence": "high"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "title": {
                "name": "title",
                "type": "string",
                "required": true,
                "description": "Texto del título"
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clases CSS adicionales"
              }
            }
          }
        },
        {
          "name": "SidebarMenuGroup",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Sidebar sigue el marco Sidebar-Menu (Figma): 240px / 56px, padding 12px, cabecera con slot, lista scroll, tarjeta workspace (borde dashed), perfil y pie. Incluye secciones colapsables, drilldown y avatar compacto al colapsar.",
            "jsdoc": "Groups menu rows under an optional section title (Figma section headers).\nWith `collapsible`, the header toggles the item list (chevron up/down).\nWhen `collapsed`, titled groups render a plain divider (unless skipped) and items only.",
            "confidence": "high"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "title": {
                "name": "title",
                "type": "string",
                "required": false,
                "description": "Título de la sección (opcional)"
              },
              "items": {
                "name": "items",
                "type": "SidebarMenuItemProps[]",
                "required": true,
                "description": "Items del menú"
              },
              "collapsible": {
                "name": "collapsible",
                "type": "boolean",
                "required": false,
                "description": "When true with `title`, section header toggles visibility (Figma collapsible blocks).\n    When false, title uses a static divider row."
              },
              "defaultExpanded": {
                "name": "defaultExpanded",
                "type": "boolean",
                "required": false,
                "description": "Initial open state when `collapsible` is true."
              },
              "collapsed": {
                "name": "collapsed",
                "type": "boolean",
                "required": false,
                "description": "When true (narrow rail), section titles and collapsible headers are hidden; titled groups\n    show a plain divider line only, then items."
              },
              "skipLeadingPlainDivider": {
                "name": "skipLeadingPlainDivider",
                "type": "boolean",
                "required": false,
                "description": "When the group has a `title`, omit the leading plain `SidebarDivider` when it would\n    duplicate the rail divider below the header: collapsed rail (before items), or expanded\n    collapsible section (before the chevron header)."
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clases CSS adicionales"
              }
            }
          }
        },
        {
          "name": "SidebarUserProfile",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Sidebar sigue el marco Sidebar-Menu (Figma): 240px / 56px, padding 12px, cabecera con slot, lista scroll, tarjeta workspace (borde dashed), perfil y pie. Incluye secciones colapsables, drilldown y avatar compacto al colapsar.",
            "jsdoc": "Sidebar user rail (avatar, name, subtitle) with an optional account menu in a border popover\nwithout arrow (`popoverArrow={false}`), aligned with Sidebar-Menu Figma `290:52422`.",
            "confidence": "high"
          },
          "examples": [],
          "props": {
            "groups": {
              "summary": {
                "props": {
                  "name": {
                    "name": "name",
                    "type": "string",
                    "required": true,
                    "description": "Display name (rail primary line + popover header)."
                  },
                  "subtitle": {
                    "name": "subtitle",
                    "type": "string",
                    "required": false,
                    "description": "Secondary line on the rail (e.g. role)."
                  },
                  "email": {
                    "name": "email",
                    "type": "string",
                    "required": false,
                    "description": "Secondary line in the popover header (e.g. email).\n    Falls back to `subtitle` when omitted."
                  },
                  "avatarProps": {
                    "name": "avatarProps",
                    "type": "Omit<AvatarProps, 'type'> & { type?: AvatarProps['type']",
                    "required": false
                  },
                  "src": {
                    "name": "src",
                    "type": "string }",
                    "required": false
                  },
                  "presence": {
                    "name": "presence",
                    "type": "{",
                    "required": false,
                    "description": "Optional presence chip in the popover header (e.g. “En linea”)."
                  },
                  "label": {
                    "name": "label",
                    "type": "string",
                    "required": true
                  }
                }
              },
              "menu": {
                "props": {
                  "onSettings": {
                    "name": "onSettings",
                    "type": "() => void",
                    "required": false
                  },
                  "settingsLabel": {
                    "name": "settingsLabel",
                    "type": "string",
                    "required": false
                  },
                  "darkMode": {
                    "name": "darkMode",
                    "type": "{",
                    "required": false
                  },
                  "checked": {
                    "name": "checked",
                    "type": "boolean",
                    "required": true
                  },
                  "onChange": {
                    "name": "onChange",
                    "type": "(checked: boolean) => void",
                    "required": true
                  },
                  "label": {
                    "name": "label",
                    "type": "string",
                    "required": false
                  },
                  "onLogout": {
                    "name": "onLogout",
                    "type": "() => void",
                    "required": false
                  },
                  "logoutLabel": {
                    "name": "logoutLabel",
                    "type": "string",
                    "required": false
                  }
                }
              }
            },
            "deprecatedRoot": [],
            "flat": {
              "summary": {
                "name": "summary",
                "type": "SidebarUserProfileSummaryProps",
                "required": true
              },
              "menu": {
                "name": "menu",
                "type": "SidebarUserProfileMenuProps",
                "required": false
              },
              "menuPosition": {
                "name": "menuPosition",
                "type": "| 'top'",
                "required": false,
                "description": "Popover anchor position relative to the menu trigger.\n    Default `top-left`: panel above the trigger, left edges aligned (extends to the right)."
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              }
            }
          }
        },
        {
          "name": "SidebarWorkspaceCard",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Sidebar sigue el marco Sidebar-Menu (Figma): 240px / 56px, padding 12px, cabecera con slot, lista scroll, tarjeta workspace (borde dashed), perfil y pie. Incluye secciones colapsables, drilldown y avatar compacto al colapsar.",
            "jsdoc": "“Mesa de trabajo” surface for the sidebar rail (Figma Sidebar-Menu `_Storage Usage Widget`):\ngradient fill, dashed border, section label, icon + primary line + badge, divider, text CTAs.\nIcon + headline sit on one marquee track (vertically centered vs. badge); hover scrolls icon + title together (see `ui-sidebar-workspace-marquee-*` in shared styles).",
            "confidence": "high"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "icon": {
                "name": "icon",
                "type": "SidebarIcon",
                "required": false,
                "description": "Leading icon (Figma: pen-to-square on brand)."
              },
              "sectionLabel": {
                "name": "sectionLabel",
                "type": "string",
                "required": false,
                "description": "Small label above the campaign row (Figma Sidebar-Menu “Mesa de trabajo”, Body XS / tertiary)."
              },
              "title": {
                "name": "title",
                "type": "string",
                "required": false,
                "description": "Primary campaign/project line (Body LG / brand). If `projectId` is set, it wins for display."
              },
              "badge": {
                "name": "badge",
                "type": "SidebarBadge",
                "required": false,
                "description": "Badge with counter (Figma: brand pill on the right)."
              },
              "projectId": {
                "name": "projectId",
                "type": "string",
                "required": false,
                "description": "Preferred source for the primary line when both `title` and `projectId` are used."
              },
              "showActions": {
                "name": "showActions",
                "type": "boolean",
                "required": false,
                "description": "When false, hides the footer text actions even if `onOpen` / `onClose` are set."
              },
              "onClose": {
                "name": "onClose",
                "type": "() => void",
                "required": false,
                "description": "Left CTA (Figma: “Cerrar”, danger text)."
              },
              "onOpen": {
                "name": "onOpen",
                "type": "() => void",
                "required": false,
                "description": "Right CTA (Figma: “Ver pauta”)."
              },
              "closeLabel": {
                "name": "closeLabel",
                "type": "string",
                "required": false,
                "description": "Copy for the close action."
              },
              "primaryActionLabel": {
                "name": "primaryActionLabel",
                "type": "string",
                "required": false,
                "description": "Copy for the primary action (e.g. open schedule)."
              },
              "cardBorderStyle": {
                "name": "cardBorderStyle",
                "type": "'solid' | 'dashed'",
                "required": false,
                "description": "Border style for the card surface (Figma “Mesa de trabajo” uses dashed)."
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clases CSS adicionales"
              }
            }
          }
        },
        {
          "name": "SidebarDrilldownPanel",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Sidebar sigue el marco Sidebar-Menu (Figma): 240px / 56px, padding 12px, cabecera con slot, lista scroll, tarjeta workspace (borde dashed), perfil y pie. Incluye secciones colapsables, drilldown y avatar compacto al colapsar.",
            "jsdoc": "Second-level sidebar region: back control, optional breadcrumb, and submenu rows.\nPresentation-only: routing and `href` handling belong to the host via `onActivateSubmenu`.",
            "confidence": "high"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "expanded": {
                "name": "expanded",
                "type": "boolean",
                "required": true,
                "description": "When true, shows breadcrumb header and full-width rows.\n    When false, shows icon-only actions with tooltips."
              },
              "parentItem": {
                "name": "parentItem",
                "type": "SidebarDrilldownParentItem",
                "required": true
              },
              "breadcrumbRootLabel": {
                "name": "breadcrumbRootLabel",
                "type": "string",
                "required": true,
                "description": "First breadcrumb segment (e.g. product area)."
              },
              "isSubmenuActive": {
                "name": "isSubmenuActive",
                "type": "(item: SidebarDrilldownSubmenuItem) => boolean",
                "required": false,
                "description": "Returns whether a submenu row should render as active/selected."
              },
              "showBreadcrumbRoot": {
                "name": "showBreadcrumbRoot",
                "type": "boolean",
                "required": false,
                "description": "When false, hides the root breadcrumb label and chevron before the parent title."
              },
              "onActivateSubmenu": {
                "name": "onActivateSubmenu",
                "type": "(item: SidebarDrilldownSubmenuItem) => void",
                "required": false,
                "description": "Invoked after optional `onClick` on the row; host handles `href` / routing."
              },
              "onBack": {
                "name": "onBack",
                "type": "() => void",
                "required": true,
                "description": "Navigates back to the parent menu level."
              },
              "backButtonTooltip": {
                "name": "backButtonTooltip",
                "type": "string",
                "required": false,
                "description": "Accessible label for the collapsed back control tooltip."
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              }
            }
          }
        }
      ]
    },
    {
      "id": "Skeleton",
      "path": "src/modules/Skeleton",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Skeleton",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "jsdoc": "Skeleton - Componente de placeholder de carga\nComponente que muestra un placeholder animado mientras se carga el contenido.\nÚtil para mejorar la experiencia de usuario durante la carga de datos.",
            "confidence": "medium"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "width": {
                "name": "width",
                "type": "string | number",
                "required": false
              },
              "height": {
                "name": "height",
                "type": "string | number",
                "required": false
              },
              "circle": {
                "name": "circle",
                "type": "boolean",
                "required": false
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              }
            }
          }
        }
      ]
    },
    {
      "id": "Spinner",
      "path": "src/modules/Spinner",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Spinner",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Spinner permite mostrar un spinner de carga.",
            "jsdoc": "Spinner - Componente de spinner de carga animado\nComponente que muestra una animación de carga usando Lottie.\nÚtil para indicar que una operación está en progreso.",
            "confidence": "high"
          },
          "examples": [
            "import { Spinner } from '@imj_media/ui';\n\n  export default function Example() {\n    return <Spinner />\n  }",
            "import { Spinner } from '@imj_media/ui';\n\n  export default function Example() {\n    return <Spinner />\n  }"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "size": {
                "name": "size",
                "type": "number",
                "required": false
              },
              "loop": {
                "name": "loop",
                "type": "boolean",
                "required": false
              },
              "style": {
                "name": "style",
                "type": "React.CSSProperties",
                "required": false
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              }
            }
          }
        }
      ],
      "standaloneSnippet": "import React from 'react';\n\nconst sizeMap: Record<string, number> = {\n  sm: 16,\n  md: 24,\n  lg: 40,\n};\n\nconst colorMap: Record<string, string> = {\n  primary: 'rgb(54, 89, 194)',\n  secondary: 'rgb(240, 69, 69)',\n  tertiary: 'rgb(33, 196, 94)',\n  destructive: 'rgb(235, 179, 8)',\n};\n\ninterface SpinnerProps {\n  size?: 'sm' | 'md' | 'lg';\n  color?: 'primary' | 'secondary' | 'tertiary' | 'destructive';\n}\n\nexport function Spinner({ size = 'md', color = 'primary' }: SpinnerProps) {\n  const px = sizeMap[size];\n  const borderWidth = Math.max(2, Math.round(px / 8));\n  const c = colorMap[color];\n\n  return (\n    <>\n      <style>{`@keyframes ui-spin { to { transform: rotate(360deg) } }`}</style>\n      <div\n        role=\"status\"\n        aria-label=\"Loading\"\n        style={{\n          width: px,\n          height: px,\n          border: `${borderWidth}px solid ${c}33`,\n          borderTopColor: c,\n          borderRadius: '50%',\n          animation: 'ui-spin 0.6s linear infinite',\n          display: 'inline-block',\n        }}\n      />\n    </>\n  );\n}\n"
    },
    {
      "id": "Stepper",
      "path": "src/modules/Stepper",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Stepper",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "jsdoc": "Variantes del Stepper usando tokens semánticos\n/\nconst stepperVariants = cva('', {\n  variants: {\n    color: {\n      blue: '',\n      red: '',\n      green: '',\n      orange: '',\n      yellow: '',\n      'blue-dark': '',\n      'blue-light': '',\n      neutral: '',\n      white: '',\n      black: '',\n      transparent: '',\n    },\n    size: {\n      xs: '',\n      sm: '',\n      md: '',\n      lg: '',\n    },\n  },\n  defaultVariants: {\n    color: 'blue',\n    size: 'md',\n  },\n});\n\n/**\nStepper - Componente de pasos/progreso de pasos\nComponente que muestra un conjunto de pasos con indicadores de estado (completado, activo, pendiente).\nSoporta orientación horizontal y vertical, múltiples colores y tamaños.",
            "confidence": "medium"
          },
          "examples": [
            "import { Stepper } from \"@imj_me/ui\";\n    import { useState } from \"react\";\n\n    const [currentStep, setCurrentStep] = useState(0);\n\n    function Example() {\n        return (\n            <Stepper\n                steps={steps}\n                currentStep={currentStep}\n                onStepChange={setCurrentStep}\n            />\n        );\n    }",
            "import { Stepper } from \"@imj_me/ui\";\n\n    const steps = [{}, {}, {}, {}];\n\n    <Stepper steps={steps} currentStep={currentStep} onStepChange={setCurrentStep} className=\"ui-w-full\" />",
            "// El conector horizontal escala con el ancho de cada celda (flex-1 + min-width del paso).\n    // Envuelve el Stepper en un contenedor con ancho conocido o responsive.\n\n    <div className=\"ui-w-full ui-max-w-3xl\">\n      <Stepper\n        steps={steps}\n        currentStep={currentStep}\n        onStepChange={setCurrentStep}\n        withScroll={false}\n        className=\"ui-w-full\"\n      />\n    </div>",
            "<Stepper\n        steps={steps}\n        currentStep={currentStep}\n        onStepChange={setCurrentStep}\n        stepClickable\n    />",
            "<Stepper\n        steps={steps}\n        currentStep={currentStep}\n        onStepChange={setCurrentStep}\n        vertical\n    />"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "steps": {
                "name": "steps",
                "type": "StepperStep[]",
                "required": true
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "classNameStep": {
                "name": "classNameStep",
                "type": "string",
                "required": false
              },
              "classNameStepLabel": {
                "name": "classNameStepLabel",
                "type": "string",
                "required": false
              },
              "classNameStepIcon": {
                "name": "classNameStepIcon",
                "type": "string",
                "required": false
              },
              "classNameStepNumber": {
                "name": "classNameStepNumber",
                "type": "string",
                "required": false
              },
              "currentStep": {
                "name": "currentStep",
                "type": "number",
                "required": false
              },
              "color": {
                "name": "color",
                "type": "Colors",
                "required": false
              },
              "size": {
                "name": "size",
                "type": "SmallSize",
                "required": false
              },
              "onClickStep": {
                "name": "onClickStep",
                "type": "(step: number) => void",
                "required": false
              },
              "onStepChange": {
                "name": "onStepChange",
                "type": "(step: number) => void",
                "required": false
              },
              "withScroll": {
                "name": "withScroll",
                "type": "boolean",
                "required": false
              },
              "vertical": {
                "name": "vertical",
                "type": "boolean",
                "required": false
              },
              "stepClickable": {
                "name": "stepClickable",
                "type": "boolean",
                "required": false
              },
              "white": {
                "name": "white",
                "type": "boolean",
                "required": false,
                "description": "Si es true, título y descripción usan color blanco (p. ej. sobre fondo oscuro). Los números de paso pendiente conservan el color del tema."
              }
            }
          }
        }
      ]
    },
    {
      "id": "StoryBox",
      "path": "src/modules/StoryBox",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "StoryBox",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "jsdoc": "Tema Orbit efectivo para hijos (`auto` en código): forzado por `StoryBox` o el `data-theme` de `documentElement`. */\ntype StoryBoxOrbitAppearance = 'light' | 'dark';\n\nconst StoryBoxForcedAppearanceContext = createContext<StoryBoxOrbitAppearance | null>(null);\n\nfunction getDocumentThemeSnapshot(): StoryBoxOrbitAppearance {\n  if (typeof document === 'undefined') return 'light';\n  return document.documentElement.getAttribute('data-theme') === 'dark' ? 'dark' : 'light';\n}\n\nfunction subscribeDocumentTheme(onStoreChange: () => void): () => void {\n  if (typeof document === 'undefined') return () => {};\n  const el = document.documentElement;\n  const mo = new MutationObserver(onStoreChange);\n  mo.observe(el, { attributes: true, attributeFilter: ['data-theme'] });\n  return () => mo.disconnect();\n}",
            "confidence": "medium"
          },
          "examples": [
            "import { StoryBox, Button } from '@imj_media/ui';\n\nexport function Ejemplo() {\n  return (\n    <StoryBox appearance=\"dark\">\n      <StoryBox.Title>Título</StoryBox.Title>\n      <StoryBox.Content>\n        <Button variant=\"button\">Acción</Button>\n      </StoryBox.Content>\n    </StoryBox>\n  );\n}",
            "import { StoryBox } from '@/modules/StoryBox';\n  import { Button } from '@/modules/Button';\n\n  export default function Example() {\n    return (\n      <StoryBox>\n        <StoryBox.Title>StoryBox Básico</StoryBox.Title>\n        <StoryBox.Description>StoryBox simple con configuración por defecto</StoryBox.Description>\n        <StoryBox.Content>\n          <Button variant=\"button\">Click me</Button>\n        </StoryBox.Content>\n        <StoryBox.Code language=\"tsx\">\n          <Button variant=\"button\">Click me</Button>\n        </StoryBox.Code>\n      </StoryBox>\n    )\n  }",
            "import { StoryBox, Button } from '@imj_media/ui';\n\nexport function Ejemplo() {\n  return (\n    <StoryBox appearance=\"dark\">\n      <StoryBox.Title>Título</StoryBox.Title>\n      <StoryBox.Content>\n        <Button variant=\"button\">Acción</Button>\n      </StoryBox.Content>\n    </StoryBox>\n  );\n}",
            "import { StoryBox } from '@/modules/StoryBox';\n  import { Button } from '@/modules/Button';\n\n  export default function Example() {\n    return (\n      <StoryBox>\n        <StoryBox.Title>StoryBox Básico</StoryBox.Title>\n        <StoryBox.Description>StoryBox simple con configuración por defecto</StoryBox.Description>\n        <StoryBox.Content>\n          <Button variant=\"button\">Click me</Button>\n        </StoryBox.Content>\n        <StoryBox.Code language=\"tsx\">\n          <Button variant=\"button\">Click me</Button>\n        </StoryBox.Code>\n      </StoryBox>\n    )\n  }"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "children": {
                "name": "children",
                "type": "React.ReactNode",
                "required": true
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "fullHeight": {
                "name": "fullHeight",
                "type": "boolean",
                "required": false
              },
              "appearance": {
                "name": "appearance",
                "type": "'inherit' | StoryBoxOrbitAppearance",
                "required": false,
                "description": "Alinea tokens Orbit (`ui-text-`, `ui-bg-`) y el modo `auto` de `StoryBox.Code` con claro u oscuro.\n    - `inherit`: no fija `data-theme` en el contenedor (sigue el ancestro, p. ej. `<html>` en Storybook).\n    - `light` | `dark`: aplica `data-theme` en la raíz del StoryBox (útil en canvas o docs sin cambiar el tema global)."
              }
            }
          }
        }
      ]
    },
    {
      "id": "Switch",
      "path": "src/modules/Switch",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Switch",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "jsdoc": "Tipografía del label en control `md`: tamaño/interlineado/tracking Regular + peso Bold (spec Type/Body/SM). */\nconst SWITCH_MD_LABEL_TYPOGRAPHY =\n  'ui-text-body-sm-regular ui-font-body-sm-bold ui-leading-body-sm-regular ui-tracking-body-sm';\n\nfunction optionSlotToButtonSlotConfig(\n  icon: SwitchOption['leftSlot'],\n  colorIcon: IconFontColor | undefined,\n  duotone: Pick<\n    ButtonSlotConfig,\n    | 'iconDuotonePrimary'\n    | 'iconDuotoneSecondary'\n    | 'iconDuotoneOpacityPrimary'\n    | 'iconDuotoneOpacitySecondary'\n  >,\n  defaultIconFontSize: IconFontSize,\n  optionIconFontSize?: IconFontSize\n): ButtonSlotConfig | undefined {\n  if (icon === null || icon === undefined) {\n    return undefined;\n  }\n  return {\n    icon,\n    ...(colorIcon !== undefined ? { colorIcon } : {}),\n    ...duotone,",
            "confidence": "medium"
          },
          "examples": [
            "import { Switch, SwitchOption } from '@/modules/Switch';\n\n    const options: SwitchOption[] = [\n        { label: \"Acordeón 1\", value: \"accordion-1\", leftSlot: faSlash, rightSlot: faFolder },\n        { label: \"Acordeón 2\", value: \"accordion-2\", leftSlot: faSlash, rightSlot: faCalendar },\n        { label: \"Acordeón 3\", value: \"accordion-3\", leftSlot: faSlash, rightSlot: faCarrot },\n    ]\n  \n    export default function Example() {\n      return <Switch options={options} defaultValue=\"accordion-1\" onChange={(value) => {\n        console.log(value);\n      }} />\n    }",
            "import { Switch, SwitchOption } from '@/modules/Switch';\n\n    const options: SwitchOption[] = [\n      { label: \"Disponible A\", value: \"a\", leftSlot: faList, rightSlot: faSquare },\n      { label: \"No disponible\", value: \"b\", leftSlot: faClock, rightSlot: faXmark, disabled: true },\n      { label: \"Disponible C\", value: \"c\", leftSlot: faCheck, rightSlot: faEdit },\n    ];\n\n    export default function Example() {\n      return (\n        <Switch\n          options={options}\n          defaultValue=\"a\"\n          onChange={(value) => console.log(value)}\n        />\n      );\n    }",
            "import { Switch, SwitchOption } from '@/modules/Switch';\n\n    const options: SwitchOption[] = [\n        { label: \"Acordeón 1\", value: \"accordion-1\", leftSlot: faSlash, rightSlot: faFolder },\n        { label: \"Acordeón 2\", value: \"accordion-2\", leftSlot: faSlash, rightSlot: faCalendar },\n        { label: \"Acordeón 3\", value: \"accordion-3\", leftSlot: faSlash, rightSlot: faCarrot }\n    ]\n  \n    export default function Example() {\n        return <div className=\"ui-flex ui-flex-col ui-gap-2\">\n            <Switch options={options} defaultValue=\"accordion-1\" size=\"xs\" onChange={(value) => {\n                console.log(value);\n            }} />\n            <Switch options={options} defaultValue=\"accordion-2\" size=\"sm\" onChange={(value) => {\n                console.log(value);\n            }} />\n            <Switch options={options} defaultValue=\"accordion-3\" size=\"md\" onChange={(value) => {\n                console.log(value);\n            }} />\n        </div>\n    }",
            "import { Switch, SwitchOption } from '@/modules/Switch';\n\n    const options: SwitchOption[] = [\n        { label: \"Vista Lista\", value: \"list\", leftSlot: faList },\n        { label: \"Vista Grid\", value: \"grid\", leftSlot: faSquare },\n        { label: \"Vista Calendario\", value: \"calendar\", leftSlot: faCalendar }\n    ]\n  \n    export default function Example() {\n      return <Switch options={options} defaultValue=\"list\" onChange={(value) => {\n        console.log(value);\n      }} />\n    }",
            "import { Switch, SwitchOption } from '@/modules/Switch';\n\n    const options: SwitchOption[] = [\n        { label: \"Activo\", value: \"active\", rightSlot: faCheck },\n        { label: \"Inactivo\", value: \"inactive\", rightSlot: faXmark },\n        { label: \"Pendiente\", value: \"pending\", rightSlot: faClock }\n    ]\n  \n    export default function Example() {\n      return <Switch options={options} defaultValue=\"active\" onChange={(value) => {\n        console.log(value);\n      }} />\n    }"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "fullWidth": {
                "name": "fullWidth",
                "type": "boolean",
                "required": false
              },
              "colorIcon": {
                "name": "colorIcon",
                "type": "IconFontColor",
                "required": false,
                "description": "Color de iconos regular/sólidos en slots; por defecto `primary` (texto primario del sistema)."
              },
              "size": {
                "name": "size",
                "type": "'xs' | 'sm' | 'md'",
                "required": false,
                "description": "Tamaño del control. Por defecto `sm`.\n    - `md`: padding del track 8px, botones internos `xs`, etiqueta con cuerpo SM (métricas Regular + peso Bold)."
              },
              "slotIconSize": {
                "name": "slotIconSize",
                "type": "IconFontSize",
                "required": false,
                "description": "Tamaño de fuente de los iconos en slots cuando no se define por opción (`leftSlotIconSize` / `rightSlotIconSize`).\n    Si se omite: con `size=\"sm\"` el default es `xs`; con `size=\"xs\"`, `xs`; con `size=\"md\"`, `sm`."
              },
              "options": {
                "name": "options",
                "type": "SwitchOption[]",
                "required": true
              },
              "defaultValue": {
                "name": "defaultValue",
                "type": "string",
                "required": false
              },
              "onChange": {
                "name": "onChange",
                "type": "(value: string) => void",
                "required": false
              }
            }
          }
        }
      ]
    },
    {
      "id": "Table",
      "path": "src/modules/Table",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Table",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Prop",
            "readme": "# Table Component\n\nComponente de tabla completo y altamente configurable con soporte para múltiples funcionalidades empresariales.\n\n## 📚 Documentación\n\n- **[Ver Ejemplo de Uso Completo](./EJEMPLO_USO.md)** - Guía detallada con todos los casos de uso\n- **[Celda `imagePreview`](./IMAGE_PREVIEW_CELL.md)** - Columna con miniatura y popup al hover\n- **[Personalización `imagePreview`](./IMAGE_PREVIEW_CUSTOMIZATION.md)** - Qué se puede ajustar y qué es fijo (aspecto, padding, bordes)\n- **[Ver Stories en Storybook](./stories/Table.stories.tsx)** - Ejemplos interactivos\n\n## ✨ Características\n\n- ✅ **Tipos de celdas múltiples**: Default, Primary, Status, Actions, Link, Avatars, TextField, Dropdown, Button, Progress Bar, Skeleton, Tags, Checkbox, Icon, Stars\n- ✅ **Ordenamiento**: Sorting por columnas con indicadores visuales\n- ✅ **Filtrado**: Múltiples filtros por columna\n- ✅ **Búsqueda global**: Búsqueda en tiempo real en todas las columnas\n- ✅ **Selección**: Selección simple o múltiple de filas con callbacks\n- ✅ **Paginación**: Paginación completa con tamaños configurables\n- ✅ **Toolbar**: Barra de herramientas con búsqueda, filtros, exportación y configuración de columnas\n- ✅ **Estados de carga**: Skeleton loading states\n- ✅ **Estados vacíos**: Personalización de vistas vacías y sin resultados\n- ✅ **Filas expandibles**: Parent/child rows con animaciones\n- ✅ **Columnas bloqueables**: Sticky columns\n- ✅ **Columnas redimensionables**: Resize columns por arrastre o doble click para auto-ajustar\n- ✅ **Responsive**: Diseño adaptable\n- ✅ **Accesibilidad**: Soporte completo ARIA y navegación por teclado\n- ✅ **TypeScript**: Totalmente tipado\n\n## Estructura del Módulo\n\n```\nTable/\n├── components/\n│   ├── atoms/              # Componentes atómicos (celdas)\n│   ├── molecules/          # HeaderCell, TableRow, CellRenderer\n│   └── organisms/          # TableToolbar, TableHeader, TableBody, TableContent\n├── hooks/\n│   ├── useTableSort.ts\n│   ├── useTableFilter.ts\n│   ├── useTableSelection.",
            "confidence": "high"
          },
          "examples": [
            "<Table\n  columns={columns}\n  rows={rows}\n  selection={{ enabled: true, multiple: true }}\n  excludedRows={{\n    excludeKey: 'estado',\n    rows: ['archivado', 'bloqueado'],\n  }}\n/>",
            "<Table\n  columns={columns}\n  rows={rows}\n  selection={{ enabled: true, multiple: true }}\n  excludedRows={{\n    excludeKey: 'estado',\n    rows: ['archivado', 'bloqueado'],\n  }}\n/>",
            "import { SelectionCheckbox } from '@/modules/Table/components/molecules/SelectionCheckbox';\nimport { useState } from 'react';\n\nexport default function Example() {\n  const [checked, setChecked] = useState(false);\n  \n  return (\n    <>\n      <SelectionCheckbox\n        checked={checked}\n        onChange={setChecked}\n      />\n      <SelectionCheckbox\n        checked={true}\n        onChange={() => {}}\n      />\n      <SelectionCheckbox\n        checked={false}\n        indeterminate={true}\n        onChange={() => {}}\n      />\n    </>\n  );\n}",
            "import { SelectionCheckbox } from '@/modules/Table/components/molecules/SelectionCheckbox';\nimport { useState } from 'react';\n\nexport default function Example() {\n  const [checked, setChecked] = useState(false);\n  \n  return (\n    <>\n      <SelectionCheckbox\n        checked={checked}\n        onChange={setChecked}\n        round={true}\n      />\n      <SelectionCheckbox\n        checked={true}\n        onChange={() => {}}\n        round={true}\n      />\n      <SelectionCheckbox\n        checked={false}\n        indeterminate={true}\n        onChange={() => {}}\n        round={true}\n      />\n    </>\n  );\n}",
            "import { SelectionCheckbox } from '@/modules/Table/components/molecules/SelectionCheckbox';\nimport { useState } from 'react';\n\nexport default function Example() {\n  const [checked1, setChecked1] = useState(false);\n  const [checked2, setChecked2] = useState(false);\n  \n  return (\n    <>\n      {/* Cuadrado (por defecto) */}\n      <SelectionCheckbox\n        checked={checked1}\n        onChange={setChecked1}\n        round={false}\n      />\n      \n      {/* Redondo */}\n      <SelectionCheckbox\n        checked={checked2}\n        onChange={setChecked2}\n        round={true}\n      />\n    </>\n  );\n}",
            "import { SelectionCheckbox } from '@/modules/Table/components/molecules/SelectionCheckbox';\n\nexport default function Example() {\n  return (\n    <>\n      {/* Cuadrado - No marcado */}\n      <SelectionCheckbox\n        checked={false}\n        onChange={() => {}}\n        round={false}\n      />\n      \n      {/* Cuadrado - Marcado */}\n      <SelectionCheckbox\n        checked={true}\n        onChange={() => {}}\n        round={false}\n      />\n      \n      {/* Redondo - No marcado */}\n      <SelectionCheckbox\n        checked={false}\n        onChange={() => {}}\n        round={true}\n      />\n      \n      {/* Redondo - Marcado */}\n      <SelectionCheckbox\n        checked={true}\n        onChange={() => {}}\n        round={true}\n      />\n    </>\n  );\n}",
            "import { SelectionCheckbox } from '@/modules/Table/components/molecules/SelectionCheckbox';\nimport { useState } from 'react';\n\nexport default function Example() {\n  const [checked, setChecked] = useState(false);\n  \n  return (\n    <>\n      <SelectionCheckbox\n        checked={checked}\n        onChange={setChecked}\n      />\n      <SelectionCheckbox\n        checked={true}\n        onChange={() => {}}\n      />\n      <SelectionCheckbox\n        checked={false}\n        indeterminate={true}\n        onChange={() => {}}\n      />\n    </>\n  );\n}",
            "const columnasConAcciones = [\n  {\n    id: 'actions',\n    header: 'Acciones',\n    type: 'actions',\n    render: (_: unknown, row: User): TableActionConfig<User>[] => [\n      {\n        icon: faPen,\n        tooltip: 'Editar',\n        onClick: (r: User) => console.log('Editar', r),\n      },\n      {\n        icon: faTrash,\n        tooltip: 'Eliminar',\n        onClick: (r: User) => console.log('Eliminar', r),\n      },\n      {\n        icon: faEye,\n        tooltip: 'Ver',\n        onClick: (r: User) => console.log('Ver', r),\n      },\n    ],\n  },\n]\n\n<Table\n  columns={columnasConAcciones}\n  rows={rows}\n  hoverable={true}\n/>",
            "import { Table } from '@imj_media/ui';\nimport { ColumnConfig } from '@/shared/types/table';\n\ninterface AlignmentData {\n  id: number;\n  name: string;\n  amount: number;\n  status: string;\n  progress: number;\n  date: Date;\n  tags: string[];\n}\n\nconst columns: ColumnConfig<AlignmentData>[] = [\n  {\n    id: 'id',\n    header: 'ID',\n    accessor: 'id',\n    contentAlign: 'left', // Por defecto\n  },\n  {\n    id: 'name',\n    header: 'Nombre',\n    accessor: 'name',\n    contentAlign: 'left', // Texto alineado a la izquierda\n  },\n  {\n    id: 'amount',\n    header: 'Monto',\n    accessor: 'amount',\n    contentAlign: 'right', // Números alineados a la derecha\n    render: (value: number) => \\",
            "<Table\n  columns={columns}\n  rows={rows}\n  hoverable={true}\n/>",
            "<Table\n  columns={columns}\n  rows={rows}\n  bordered={true}\n  hoverable={true}\n/>",
            "<Table\n  columns={columns}\n  rows={rows}\n  toolbar={{\n    showSearch: true,\n    searchPlaceholder: 'Buscar por nombre, correo, rol, estado...',\n    searchWidth: 360,\n  }}\n/>",
            "const columns: ColumnConfig<MisDatos>[] = [\n  { id: 'nombre', header: 'Nombre', accessor: 'nombre', sortable: true },\n  // …sin repetir lockable en cada una\n];\n\n<Table\n  columns={columns}\n  rows={rows}\n  columnsLockable={false}\n  toolbar={{ showColumnConfig: true }}\n  resizable\n/>",
            "<Table\n  columns={[\n    { id: 'id', header: 'ID', accessor: 'id', lockable: true },\n    { id: 'nombre', header: 'Nombre', accessor: 'nombre' },\n  ]}\n  columnsLockable={false}\n  rows={rows}\n/>",
            "const columns: ColumnConfig<MisDatos>[] = [\n  { id: 'nombre', header: 'Nombre', accessor: 'nombre', sortable: true },\n  // …sin repetir lockable en cada una\n];\n\n<Table\n  columns={columns}\n  rows={rows}\n  columnsLockable={false}\n  toolbar={{ showColumnConfig: true }}\n  resizable\n/>",
            "<Table\n  columns={[\n    { id: 'id', header: 'ID', accessor: 'id', lockable: true },\n    { id: 'nombre', header: 'Nombre', accessor: 'nombre' },\n  ]}\n  columnsLockable={false}\n  rows={rows}\n/>",
            "import { Table } from '@/modules/Table';\n\n// Persistir columnas, orden, filtros y búsqueda en la misma key de localStorage\n<Table<Persona>\n  columns={columnas}\n  rows={filas}\n  configKey=\"mi-tabla\"\n  persistConfig={true}\n  queryPersist={true}\n  toolbar={{\n    showSearch: true,\n    searchPlaceholder: 'Buscar...',\n    internalSearch: true,\n    showFilters: true,\n    internalFilters: true,\n    showColumnConfig: true,\n  }}\n  onConfigChange={(config, changeType) => console.log(changeType, config)}\n  striped\n  hoverable\n  resizable\n/>\n\n// queryPersist={false} → no se guardan ni restauran búsqueda ni filtros (solo columnas/orden)",
            "import { Table } from '@/modules/Table';\n\n// Persistir columnas, orden, filtros y búsqueda en la misma key de localStorage\n<Table<Persona>\n  columns={columnas}\n  rows={filas}\n  configKey=\"mi-tabla\"\n  persistConfig={true}\n  queryPersist={true}\n  toolbar={{\n    showSearch: true,\n    searchPlaceholder: 'Buscar...',\n    internalSearch: true,\n    showFilters: true,\n    internalFilters: true,\n    showColumnConfig: true,\n  }}\n  onConfigChange={(config, changeType) => console.log(changeType, config)}\n  striped\n  hoverable\n  resizable\n/>\n\n// queryPersist={false} → no se guardan ni restauran búsqueda ni filtros (solo columnas/orden)",
            "<Table\n  columns={columns}\n  rows={pageRows}\n  selection={{\n    enabled: true,\n    multiple: true,\n    showSelectionBar: true,\n    actions: [{ label: 'Eliminar', onClick: (ids) => { ... } }],\n  }}\n  pagination={{\n    enabled: true,\n    currentPage: page,\n    pageSize,\n    total: totalRowCount,\n    onPageChange: setPage,\n    onPageSizeChange: setPageSize,\n  }}\n/>",
            "<Table\n  columns={columns}\n  rows={pageRows}\n  selection={{\n    enabled: true,\n    multiple: true,\n    showSelectionBar: true,\n    actions: [{ label: 'Eliminar', onClick: (ids) => { ... } }],\n  }}\n  pagination={{\n    enabled: true,\n    currentPage: page,\n    pageSize,\n    total: totalRowCount,\n    onPageChange: setPage,\n    onPageSizeChange: setPageSize,\n  }}\n/>"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "columns": {
                "name": "columns",
                "type": "ColumnConfig<T>[]",
                "required": true
              },
              "rows": {
                "name": "rows",
                "type": "RowConfig<T>[]",
                "required": true
              },
              "loading": {
                "name": "loading",
                "type": "boolean",
                "required": false
              },
              "empty": {
                "name": "empty",
                "type": "EmptyState",
                "required": false
              },
              "selection": {
                "name": "selection",
                "type": "SelectionConfig",
                "required": false
              },
              "excludedRows": {
                "name": "excludedRows",
                "type": "ExcludedRowsConfig<T>",
                "required": false,
                "description": "Excluye filas de la selección por valor de un campo (ej. estado `archived`).\n    Solo aplica si `selection.enabled` es true."
              },
              "pagination": {
                "name": "pagination",
                "type": "PaginationConfig",
                "required": false
              },
              "toolbar": {
                "name": "toolbar",
                "type": "TableToolbarConfig",
                "required": false
              },
              "sort": {
                "name": "sort",
                "type": "SortConfig",
                "required": false
              },
              "filters": {
                "name": "filters",
                "type": "FilterConfig[]",
                "required": false
              },
              "expandable": {
                "name": "expandable",
                "type": "boolean",
                "required": false
              },
              "resizable": {
                "name": "resizable",
                "type": "boolean",
                "required": false
              },
              "columnsLockable": {
                "name": "columnsLockable",
                "type": "boolean",
                "required": false,
                "description": "Permite fijar/bloquear columnas desde la cabecera por defecto.\n    Si es `false`, ninguna columna es bloqueable salvo que definas `lockable: true` en esa `ColumnConfig`.\n    Si se omite, el comportamiento es el mismo que `true`."
              },
              "striped": {
                "name": "striped",
                "type": "boolean",
                "required": false
              },
              "bordered": {
                "name": "bordered",
                "type": "boolean",
                "required": false
              },
              "borderable": {
                "name": "borderable",
                "type": "boolean",
                "required": false,
                "description": "Muestra el borde exterior del contenedor de la tabla (borde, sombra y border-radius)."
              },
              "hoverable": {
                "name": "hoverable",
                "type": "boolean",
                "required": false
              },
              "dense": {
                "name": "dense",
                "type": "boolean",
                "required": false
              },
              "stickyHeader": {
                "name": "stickyHeader",
                "type": "boolean",
                "required": false
              },
              "defecto": {
                "name": "defecto",
                "type": "true si hay columnas editables)",
                "required": true
              },
              "stickyCheckbox": {
                "name": "stickyCheckbox",
                "type": "boolean",
                "required": false
              },
              "stickyActions": {
                "name": "stickyActions",
                "type": "boolean",
                "required": false
              },
              "showEditActions": {
                "name": "showEditActions",
                "type": "boolean",
                "required": false
              },
              "configKey": {
                "name": "configKey",
                "type": "string",
                "required": false,
                "description": "Clave única para guardar la configuración de la tabla en localStorage.\n    Si se proporciona, la configuración se persistirá automáticamente."
              },
              "persistConfig": {
                "name": "persistConfig",
                "type": "boolean",
                "required": false,
                "description": "Habilitar persistencia de configuración en localStorage.\n    Requiere que se proporcione `configKey`."
              },
              "queryPersist": {
                "name": "queryPersist",
                "type": "boolean",
                "required": false,
                "description": "Persistir también filtros activos y búsqueda en la misma configKey.\n    Solo aplica si `persistConfig` es true. Si es false, no se guardan ni cargan filtros ni búsqueda."
              },
              "onConfigChange": {
                "name": "onConfigChange",
                "type": "(config: TableConfigState, changeType: TableConfigChangeType) => void",
                "required": false,
                "description": "Callback cuando cambia la configuración de la tabla.\n    Se llama con la configuración completa y el tipo de cambio."
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "onSort": {
                "name": "onSort",
                "type": "(sort: SortConfig | undefined) => void",
                "required": false
              },
              "onFilter": {
                "name": "onFilter",
                "type": "(filters: FilterConfig[]) => void",
                "required": false
              },
              "onColumnResize": {
                "name": "onColumnResize",
                "type": "(columnId: string, width: number) => void",
                "required": false
              },
              "onColumnReorder": {
                "name": "onColumnReorder",
                "type": "(columns: ColumnConfig<T>[]) => void",
                "required": false
              },
              "onColumnVisibilityChange": {
                "name": "onColumnVisibilityChange",
                "type": "(columnId: string, visible: boolean) => void",
                "required": false
              },
              "onRowClick": {
                "name": "onRowClick",
                "type": "(row: RowConfig<T>) => void",
                "required": false
              },
              "onRowExpand": {
                "name": "onRowExpand",
                "type": "(row: RowConfig<T>) => void",
                "required": false
              },
              "onHandleChange": {
                "name": "onHandleChange",
                "type": "(rowId: string | number, columnId: string, value: unknown, row?: T) => void",
                "required": false
              },
              "editingRowIds": {
                "name": "editingRowIds",
                "type": "(string | number)[]",
                "required": false,
                "description": "IDs de filas que deben estar en modo edición.\n    Permite controlar desde fuera qué filas están editando.\n    Útil para activar múltiples filas en modo edición simultáneamente."
              },
              "onEditingRowIdsChange": {
                "name": "onEditingRowIdsChange",
                "type": "(editingRowIds: (string | number)[]) => void",
                "required": false,
                "description": "Callback cuando cambian los IDs de filas en modo edición.\n    Se llama cuando el usuario hace clic en el botón de editar/guardar de una fila.\n    Permite sincronizar el estado externo con las acciones internas de la tabla."
              },
              "onEditModeChange": {
                "name": "onEditModeChange",
                "type": "(rowId: string | number, isEditing: boolean) => void",
                "required": false,
                "description": "Callback cuando se habilita o se cierra el modo de edición de una fila.\n    Se ejecuta tanto cuando se habilita como cuando se cierra el modo de edición."
              },
              "onSuccessComplete": {
                "name": "onSuccessComplete",
                "type": "(editedRowIds: (string | number)[]) => void",
                "required": false,
                "description": "Callback cuando se cierra una o múltiples filas que fueron editadas.\n    Se ejecuta un solo evento al cerrar, mostrando un array con los IDs de todas las filas editadas que se están cerrando.\n    Solo se ejecuta si las filas fueron realmente editadas (se modificó alguna celda)."
              }
            }
          }
        }
      ]
    },
    {
      "id": "Tabs",
      "path": "src/modules/Tabs",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Tabs",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "Componente de navegación con pestañas. Soporta modos controlado (",
            "jsdoc": "Tabs — navigation component with size and pill variants.\nRenders a tablist with selectable tabs, optional icons, optional add button,\nand accessible keyboard navigation (ArrowLeft/Right, Home, End).",
            "confidence": "high"
          },
          "examples": [
            "import { Tabs } from '@imj_media/ui';\nimport { useState } from 'react';\nimport { faShapes, faCode, faEye, faGear } from '@fortawesome/pro-regular-svg-icons';\n\nconst items = [\n  { id: 'design', label: 'Design', icon: faShapes },\n  { id: 'code', label: 'Code', icon: faCode },\n  { id: 'preview', label: 'Preview', icon: faEye },\n  { id: 'settings', label: 'Settings', icon: faGear },\n];\n\nexport default function EditorTabs() {\n  const [active, setActive] = useState('design');\n\n  return (\n    <Tabs\n      items={items}\n      appearance={{ size: 'md', pill: true }}\n      selection={{ activeTab: active, onTabChange: setActive }}\n      addButton={{ show: true, onClick: () => addNewTab() }}\n    />\n  );\n}",
            "<Tabs\n  items={items}\n  appearance={{ size: 'lg', pill: true }}\n  selection={{ defaultActiveTab: 'code' }}\n  addButton={{ show: true }}\n/>",
            "<Tabs\n  items={items}\n  appearance={{ size: 'md', pill: true }}\n  selection={{ defaultActiveTab: 'design' }}\n  addButton={{ show: true }}\n/>",
            "<Tabs\n  items={items}\n  appearance={{ size: 'sm', pill: true }}\n  selection={{ defaultActiveTab: 'design' }}\n  addButton={{ show: true }}\n/>",
            "<Tabs\n  items={items}\n  appearance={{ size: 'xs', pill: true }}\n  selection={{ defaultActiveTab: 'design' }}\n  addButton={{ show: true }}\n/>"
          ],
          "props": {
            "groups": {
              "appearance": {
                "props": {
                  "size": {
                    "name": "size",
                    "type": "TabSize",
                    "required": false,
                    "description": "Size variant controlling height, padding, and font size."
                  },
                  "pill": {
                    "name": "pill",
                    "type": "boolean",
                    "required": false,
                    "description": "When true, top corners of tabs are rounded (6px radius)."
                  }
                }
              },
              "selection": {
                "props": {
                  "activeTab": {
                    "name": "activeTab",
                    "type": "string",
                    "required": false,
                    "description": "Active tab id (controlled mode)."
                  },
                  "defaultActiveTab": {
                    "name": "defaultActiveTab",
                    "type": "string",
                    "required": false,
                    "description": "Default active tab id (uncontrolled mode). Uses first item if omitted."
                  },
                  "onTabChange": {
                    "name": "onTabChange",
                    "type": "(tabId: string) => void",
                    "required": false,
                    "description": "Callback fired when the active tab changes."
                  }
                }
              },
              "addButton": {
                "props": {
                  "show": {
                    "name": "show",
                    "type": "boolean",
                    "required": false,
                    "description": "Whether to show the \"+\" add button after the last tab."
                  },
                  "onClick": {
                    "name": "onClick",
                    "type": "() => void",
                    "required": false,
                    "description": "Callback fired when the add button is clicked."
                  }
                }
              }
            },
            "deprecatedRoot": [],
            "flat": {
              "items": {
                "name": "items",
                "type": "TabItem[]",
                "required": true,
                "description": "Array of tab items to render."
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Additional CSS classes for the root container."
              },
              "appearance": {
                "name": "appearance",
                "type": "TabsAppearanceProps",
                "required": false,
                "description": "Appearance configuration (size and pill shape)."
              },
              "selection": {
                "name": "selection",
                "type": "TabsSelectionProps",
                "required": false,
                "description": "Selection/state control."
              },
              "addButton": {
                "name": "addButton",
                "type": "TabsAddButtonProps",
                "required": false,
                "description": "Add button configuration."
              }
            }
          }
        }
      ],
      "standaloneSnippet": "import React from 'react';\n\ninterface TabItem {\n  id: string;\n  label: string;\n  content: React.ReactNode;\n}\n\ninterface TabsProps {\n  items: TabItem[];\n  activeTab: string;\n  onChange: (id: string) => void;\n}\n\nexport function Tabs({ items, activeTab, onChange }: TabsProps) {\n  const activeItem = items.find((item) => item.id === activeTab);\n\n  return (\n    <div>\n      <div\n        style={{\n          display: 'flex',\n          borderBottom: '1px solid rgb(199, 199, 204)',\n          gap: '4px',\n        }}\n      >\n        {items.map((item) => {\n          const isActive = item.id === activeTab;\n          return (\n            <button\n              key={item.id}\n              type=\"button\"\n              onClick={() => onChange(item.id)}\n              style={{\n                padding: '2px 4px',\n                border: 'none',\n                borderBottom: isActive\n                  ? '2px solid rgb(54, 89, 194)'\n                  : '2px solid transparent',\n                background: 'none',\n                cursor: 'pointer',\n                fontSize: '14px',\n                fontWeight: isActive\n                  ? '600'\n                  : '400',\n                color: isActive\n                  ? 'rgb(54, 89, 194)'\n                  : 'rgb(89, 89, 94)',\n                transition: 'color 0.15s, border-color 0.15s',\n              }}\n              onMouseEnter={(e) => {\n                if (!isActive) e.currentTarget.style.color = 'rgb(48, 51, 54)';\n              }}\n              onMouseLeave={(e) => {\n                if (!isActive) e.currentTarget.style.color = 'rgb(89, 89, 94)';\n              }}\n            >\n              {item.label}\n            </button>\n          );\n        })}\n      </div>\n      <div style={{ padding: '4px 0' }}>\n        {activeItem ? activeItem.content : null}\n      </div>\n    </div>\n  );\n}\n"
    },
    {
      "id": "Tag",
      "path": "src/modules/Tag",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Tag",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Tag permite mostrar etiquetas, filtros o categorías con diferentes colores. Icono a la izquierda opcional vía",
            "jsdoc": "Tag - Componente de etiqueta/tag versátil y configurable\nComponente de tag que soporta múltiples colores, estados (selected, disabled),\navatares, iconos de cierre e información, y diferentes estilos visuales.",
            "confidence": "high"
          },
          "examples": [
            "import { Tag } from '@imj_media/ui';\n\n  export default function Example() {\n    return (\n      <>\n        <Tag label=\"Etiqueta\" color=\"accent\" />\n        <Tag label=\"Categoría\" color=\"accent\" />\n        <Tag label=\"Filtro\" color=\"accent\" />\n      </>\n    )\n  }",
            "<Tag label=\"Accent\" color=\"accent\" />\n  <Tag label=\"Gray\" color=\"gray\" />\n  <Tag label=\"Success\" color=\"success\" />\n  <Tag label=\"Warning\" color=\"warning\" />\n  <Tag label=\"Danger\" color=\"danger\" />\n  <Tag label=\"Info\" color=\"info\" />\n  <Tag label=\"Disabled\" color=\"disabled\" />",
            "<Tag label=\"Accent\" color=\"accent\" stroke={true} />\n  <Tag label=\"Success\" color=\"success\" stroke={false} />",
            "import { faCircleInfo } from '@fortawesome/pro-regular-svg-icons';\n\n  <Tag label=\"Info\" color=\"info\" infoIcon={{ name: faCircleInfo }} />\n  <Tag label=\"Success\" color=\"success\" infoIcon={{ name: faCircleInfo }} />",
            "import {\n    faCircleInfo,\n    faFilter,\n    faSearch,\n  } from '@fortawesome/pro-regular-svg-icons';\n\n  <Tag\n    label='\"query\"'\n    color=\"success\"\n    infoIcon={{ name: faSearch }}\n    onClose={() => {}}\n  />\n  <Tag\n    label=\"Custom\"\n    color=\"info\"\n    infoIcon={{ name: faCircleInfo, size: 'sm', color: 'warning' }}\n  />"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "label": {
                "name": "label",
                "type": "string",
                "required": false,
                "description": "Texto del tag"
              },
              "avatar": {
                "name": "avatar",
                "type": "string",
                "required": false,
                "description": "Avatar a la izquierda (URL de imagen)"
              },
              "color": {
                "name": "color",
                "type": "TagColor",
                "required": false,
                "description": "Color del tag"
              },
              "onClose": {
                "name": "onClose",
                "type": "(e: React.MouseEvent<HTMLDivElement>) => void",
                "required": false,
                "description": "Función a ejecutar cuando se hace clic en el X (si se proporciona, se muestra el X)"
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clases CSS adicionales"
              },
              "stroke": {
                "name": "stroke",
                "type": "boolean",
                "required": false,
                "description": "Si es true, el tag tiene borde"
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false,
                "description": "Si es true, el tag está deshabilitado"
              },
              "selected": {
                "name": "selected",
                "type": "boolean",
                "required": false,
                "description": "Si es true, el tag está seleccionado"
              },
              "infoIcon": {
                "name": "infoIcon",
                "type": "TagInfoIconConfig",
                "required": false,
                "description": "Icono de información (configuración del componente `Icon`)."
              },
              "truncateLabel": {
                "name": "truncateLabel",
                "type": "boolean",
                "required": false,
                "description": "Si true, el tag se adapta al ancho del contenedor y el label se trunca con \"...\" si no cabe"
              },
              "truncateTooltip": {
                "name": "truncateTooltip",
                "type": "boolean",
                "required": false,
                "description": "Si true y truncateLabel es true, muestra tooltip con el texto completo al hacer hover cuando el texto está truncado. Por defecto false."
              }
            }
          }
        }
      ],
      "standaloneSnippet": "import React from 'react';\n\nconst colorMap: Record<string, { bg: string; text: string }> = {\n  primary: { bg: 'rgb(54, 89, 194)1a', text: 'rgb(54, 89, 194)' },\n  secondary: { bg: 'rgb(240, 69, 69)1a', text: 'rgb(240, 69, 69)' },\n  tertiary: { bg: 'rgb(33, 196, 94)1a', text: 'rgb(33, 196, 94)' },\n  destructive: { bg: 'rgb(235, 179, 8)1a', text: 'rgb(235, 179, 8)' },\n  neutral: { bg: 'rgb(247, 247, 250)', text: 'rgb(89, 89, 94)' },\n};\n\nconst sizeMap: Record<string, { fontSize: string; padding: string }> = {\n  sm: { fontSize: '12px', padding: '2px 6px' },\n  md: { fontSize: '14px', padding: '4px 2px' },\n};\n\ninterface TagProps {\n  children: React.ReactNode;\n  color?: 'primary' | 'secondary' | 'tertiary' | 'destructive' | 'neutral';\n  size?: 'sm' | 'md';\n  closable?: boolean;\n  onClose?: () => void;\n}\n\nexport function Tag({\n  children,\n  color = 'primary',\n  size = 'md',\n  closable = false,\n  onClose,\n}: TagProps) {\n  const c = colorMap[color];\n  const s = sizeMap[size];\n\n  return (\n    <span\n      style={{\n        display: 'inline-flex',\n        alignItems: 'center',\n        gap: '4px',\n        backgroundColor: c.bg,\n        color: c.text,\n        borderRadius: '8px',\n        padding: s.padding,\n        fontSize: s.fontSize,\n        fontWeight: '500',\n        lineHeight: 1.4,\n      }}\n    >\n      {children}\n      {closable && (\n        <button\n          type=\"button\"\n          onClick={onClose}\n          aria-label=\"Remove\"\n          style={{\n            display: 'inline-flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n            border: 'none',\n            background: 'none',\n            cursor: 'pointer',\n            color: 'inherit',\n            padding: 0,\n            fontSize: 'inherit',\n            lineHeight: 1,\n            opacity: 0.7,\n          }}\n        >\n          \\u00d7\n        </button>\n      )}\n    </span>\n  );\n}\n"
    },
    {
      "id": "Text",
      "path": "src/modules/Text",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Text",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Text permite aplicar estilos tipográficos consistentes usando los tokens de Figma. Soporta tipos (title, body, caption, code), tamaños, pesos de fuente, y valores base.",
            "jsdoc": "Text - Componente de texto versátil con múltiples variantes tipográficas\nComponente que renderiza texto con diferentes tipos tipográficos (body, title, caption, code)\ny tamaños. Soporta pesos de fuente personalizados y colores.",
            "confidence": "high"
          },
          "examples": [
            "import { Text } from '@/modules/Text';\n\n  export default function Example() {\n    return <Text>Este es un texto básico</Text>\n  }",
            "import { Text } from '@/modules/Text';\n\n  const copy = 'Texto largo repetido o cargado desde CMS…';\n\n  export default function Example() {\n    return (\n      <div style={{ width: 300, maxWidth: '100%' }} className=\"ui-space-y-4 ui-p-3\">\n        <Text type=\"title\" size=\"h5\" textColor=\"primary\" as=\"p\">\n          {copy}\n        </Text>\n        <Text type=\"body\" size=\"md\" textColor=\"primary\" as=\"p\">\n          {copy}\n        </Text>\n        <Text type=\"body\" size=\"sm\" weight=\"medium\" textColor=\"secondary\" as=\"p\">\n          {copy}\n        </Text>\n        <Text type=\"caption\" size=\"xs\" textColor=\"tertiary\" as=\"p\">\n          {copy}\n        </Text>\n        <Text type=\"code\" size=\"md\" as=\"p\" className=\"ui-break-words\">\n          const linea = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';\n        </Text>\n      </div>\n    );\n  }",
            "import { Text } from '@/modules/Text';\n\n  export default function Example() {\n    return (\n      <>\n        <Text type=\"body\" size=\"xs\" weight=\"regular\">Body XS Regular</Text>\n        <Text type=\"body\" size=\"sm\" weight=\"medium\">Body SM Medium</Text>\n        <Text type=\"body\" size=\"md\" weight=\"semibold\">Body MD Semibold</Text>\n        <Text type=\"body\" size=\"lg\" weight=\"bold\">Body LG Bold</Text>\n      </>\n    )\n  }",
            "<Text type=\"title\" size=\"h1\">Heading H1</Text>\n  <Text type=\"title\" size=\"h2\">Heading H2</Text>\n  <Text type=\"title\" size=\"h3\">Heading H3</Text>",
            "import { Text } from '@/modules/Text';\n\n  export default function Example() {\n    return (\n      <>\n        <Text type=\"caption\" size=\"xs\">Caption XS</Text>\n        <Text type=\"caption\" size=\"md\">Caption MD</Text>\n      </>\n    )\n  }"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [
              {
                "name": "textColor",
                "type": "TextColor"
              }
            ],
            "flat": {
              "type": {
                "name": "type",
                "type": "T",
                "required": false,
                "description": "Tipo de texto: title, body, caption, code"
              },
              "size": {
                "name": "size",
                "type": "TextSize<T>",
                "required": false,
                "description": "Tamaño del texto según el tipo"
              },
              "weight": {
                "name": "weight",
                "type": "TextWeight",
                "required": false,
                "description": "Peso de la fuente"
              },
              "children": {
                "name": "children",
                "type": "ReactNode",
                "required": true,
                "description": "Contenido del texto"
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clase CSS adicional"
              },
              "as": {
                "name": "as",
                "type": "keyof JSX.IntrinsicElements",
                "required": false,
                "description": "Elemento HTML a renderizar (por defecto: span para body/caption/code, h1-h6 para title)"
              },
              "color": {
                "name": "color",
                "type": "TextColor | (string & {})",
                "required": false,
                "description": "Color del texto: puede ser un color del sistema de diseño o un color CSS personalizado"
              },
              "truncateLabel": {
                "name": "truncateLabel",
                "type": "boolean",
                "required": false,
                "description": "Si es true, el texto se trunca con ellipsis y, si `truncateTooltip` es true, muestra un tooltip\n    con el contenido completo al pasar el cursor cuando el texto está efectivamente truncado."
              },
              "truncateTooltip": {
                "name": "truncateTooltip",
                "type": "boolean",
                "required": false,
                "description": "Si es true (por defecto) y `truncateLabel` es true, muestra el tooltip al truncar.\n    Si es false, solo se aplica truncado sin tooltip."
              },
              "tooltipTitle": {
                "name": "tooltipTitle",
                "type": "ReactNode",
                "required": false,
                "description": "Texto mostrado en el tooltip cuando hace falta (p. ej. `children` no es un string o se quiere\n    un texto distinto al visible)."
              }
            }
          }
        },
        {
          "name": "Body",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Text permite aplicar estilos tipográficos consistentes usando los tokens de Figma. Soporta tipos (title, body, caption, code), tamaños, pesos de fuente, y valores base.",
            "confidence": "medium"
          },
          "examples": [
            "import { Text } from '@/modules/Text';\n\n  export default function Example() {\n    return <Text>Este es un texto básico</Text>\n  }",
            "import { Text } from '@/modules/Text';\n\n  const copy = 'Texto largo repetido o cargado desde CMS…';\n\n  export default function Example() {\n    return (\n      <div style={{ width: 300, maxWidth: '100%' }} className=\"ui-space-y-4 ui-p-3\">\n        <Text type=\"title\" size=\"h5\" textColor=\"primary\" as=\"p\">\n          {copy}\n        </Text>\n        <Text type=\"body\" size=\"md\" textColor=\"primary\" as=\"p\">\n          {copy}\n        </Text>\n        <Text type=\"body\" size=\"sm\" weight=\"medium\" textColor=\"secondary\" as=\"p\">\n          {copy}\n        </Text>\n        <Text type=\"caption\" size=\"xs\" textColor=\"tertiary\" as=\"p\">\n          {copy}\n        </Text>\n        <Text type=\"code\" size=\"md\" as=\"p\" className=\"ui-break-words\">\n          const linea = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';\n        </Text>\n      </div>\n    );\n  }",
            "import { Text } from '@/modules/Text';\n\n  export default function Example() {\n    return (\n      <>\n        <Text type=\"body\" size=\"xs\" weight=\"regular\">Body XS Regular</Text>\n        <Text type=\"body\" size=\"sm\" weight=\"medium\">Body SM Medium</Text>\n        <Text type=\"body\" size=\"md\" weight=\"semibold\">Body MD Semibold</Text>\n        <Text type=\"body\" size=\"lg\" weight=\"bold\">Body LG Bold</Text>\n      </>\n    )\n  }",
            "<Text type=\"title\" size=\"h1\">Heading H1</Text>\n  <Text type=\"title\" size=\"h2\">Heading H2</Text>\n  <Text type=\"title\" size=\"h3\">Heading H3</Text>",
            "import { Text } from '@/modules/Text';\n\n  export default function Example() {\n    return (\n      <>\n        <Text type=\"caption\" size=\"xs\">Caption XS</Text>\n        <Text type=\"caption\" size=\"md\">Caption MD</Text>\n      </>\n    )\n  }"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [
              {
                "name": "textColor",
                "type": "TextColor"
              }
            ],
            "flat": {
              "size": {
                "name": "size",
                "type": "BodySize | BaseSize",
                "required": false,
                "description": "Tamaño del body: xs, sm, md, lg o tamaños base"
              },
              "weight": {
                "name": "weight",
                "type": "TextWeight",
                "required": false,
                "description": "Peso de la fuente"
              },
              "children": {
                "name": "children",
                "type": "React.ReactNode",
                "required": true,
                "description": "Contenido del texto"
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clase CSS adicional"
              },
              "as": {
                "name": "as",
                "type": "keyof JSX.IntrinsicElements",
                "required": false,
                "description": "Elemento HTML a renderizar (por defecto: span)"
              },
              "color": {
                "name": "color",
                "type": "TextColor | (string & {})",
                "required": false,
                "description": "Color del texto: puede ser un color del sistema de diseño o un color CSS personalizado"
              }
            }
          }
        },
        {
          "name": "Caption",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Text permite aplicar estilos tipográficos consistentes usando los tokens de Figma. Soporta tipos (title, body, caption, code), tamaños, pesos de fuente, y valores base.",
            "confidence": "medium"
          },
          "examples": [
            "import { Text } from '@/modules/Text';\n\n  export default function Example() {\n    return <Text>Este es un texto básico</Text>\n  }",
            "import { Text } from '@/modules/Text';\n\n  const copy = 'Texto largo repetido o cargado desde CMS…';\n\n  export default function Example() {\n    return (\n      <div style={{ width: 300, maxWidth: '100%' }} className=\"ui-space-y-4 ui-p-3\">\n        <Text type=\"title\" size=\"h5\" textColor=\"primary\" as=\"p\">\n          {copy}\n        </Text>\n        <Text type=\"body\" size=\"md\" textColor=\"primary\" as=\"p\">\n          {copy}\n        </Text>\n        <Text type=\"body\" size=\"sm\" weight=\"medium\" textColor=\"secondary\" as=\"p\">\n          {copy}\n        </Text>\n        <Text type=\"caption\" size=\"xs\" textColor=\"tertiary\" as=\"p\">\n          {copy}\n        </Text>\n        <Text type=\"code\" size=\"md\" as=\"p\" className=\"ui-break-words\">\n          const linea = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';\n        </Text>\n      </div>\n    );\n  }",
            "import { Text } from '@/modules/Text';\n\n  export default function Example() {\n    return (\n      <>\n        <Text type=\"body\" size=\"xs\" weight=\"regular\">Body XS Regular</Text>\n        <Text type=\"body\" size=\"sm\" weight=\"medium\">Body SM Medium</Text>\n        <Text type=\"body\" size=\"md\" weight=\"semibold\">Body MD Semibold</Text>\n        <Text type=\"body\" size=\"lg\" weight=\"bold\">Body LG Bold</Text>\n      </>\n    )\n  }",
            "<Text type=\"title\" size=\"h1\">Heading H1</Text>\n  <Text type=\"title\" size=\"h2\">Heading H2</Text>\n  <Text type=\"title\" size=\"h3\">Heading H3</Text>",
            "import { Text } from '@/modules/Text';\n\n  export default function Example() {\n    return (\n      <>\n        <Text type=\"caption\" size=\"xs\">Caption XS</Text>\n        <Text type=\"caption\" size=\"md\">Caption MD</Text>\n      </>\n    )\n  }"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [
              {
                "name": "textColor",
                "type": "TextColor"
              }
            ],
            "flat": {
              "size": {
                "name": "size",
                "type": "CaptionSize | BaseSize",
                "required": false,
                "description": "Tamaño del caption: xs, md o tamaños base"
              },
              "weight": {
                "name": "weight",
                "type": "TextWeight",
                "required": false,
                "description": "Peso de la fuente (solo aplica si se usa tamaño base)"
              },
              "children": {
                "name": "children",
                "type": "React.ReactNode",
                "required": true,
                "description": "Contenido del texto"
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clase CSS adicional"
              },
              "as": {
                "name": "as",
                "type": "keyof JSX.IntrinsicElements",
                "required": false,
                "description": "Elemento HTML a renderizar (por defecto: span)"
              },
              "color": {
                "name": "color",
                "type": "TextColor | (string & {})",
                "required": false,
                "description": "Color del texto: puede ser un color del sistema de diseño o un color CSS personalizado"
              }
            }
          }
        },
        {
          "name": "TitleText",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Text permite aplicar estilos tipográficos consistentes usando los tokens de Figma. Soporta tipos (title, body, caption, code), tamaños, pesos de fuente, y valores base.",
            "confidence": "medium"
          },
          "examples": [
            "import { Text } from '@/modules/Text';\n\n  export default function Example() {\n    return <Text>Este es un texto básico</Text>\n  }",
            "import { Text } from '@/modules/Text';\n\n  const copy = 'Texto largo repetido o cargado desde CMS…';\n\n  export default function Example() {\n    return (\n      <div style={{ width: 300, maxWidth: '100%' }} className=\"ui-space-y-4 ui-p-3\">\n        <Text type=\"title\" size=\"h5\" textColor=\"primary\" as=\"p\">\n          {copy}\n        </Text>\n        <Text type=\"body\" size=\"md\" textColor=\"primary\" as=\"p\">\n          {copy}\n        </Text>\n        <Text type=\"body\" size=\"sm\" weight=\"medium\" textColor=\"secondary\" as=\"p\">\n          {copy}\n        </Text>\n        <Text type=\"caption\" size=\"xs\" textColor=\"tertiary\" as=\"p\">\n          {copy}\n        </Text>\n        <Text type=\"code\" size=\"md\" as=\"p\" className=\"ui-break-words\">\n          const linea = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';\n        </Text>\n      </div>\n    );\n  }",
            "import { Text } from '@/modules/Text';\n\n  export default function Example() {\n    return (\n      <>\n        <Text type=\"body\" size=\"xs\" weight=\"regular\">Body XS Regular</Text>\n        <Text type=\"body\" size=\"sm\" weight=\"medium\">Body SM Medium</Text>\n        <Text type=\"body\" size=\"md\" weight=\"semibold\">Body MD Semibold</Text>\n        <Text type=\"body\" size=\"lg\" weight=\"bold\">Body LG Bold</Text>\n      </>\n    )\n  }",
            "<Text type=\"title\" size=\"h1\">Heading H1</Text>\n  <Text type=\"title\" size=\"h2\">Heading H2</Text>\n  <Text type=\"title\" size=\"h3\">Heading H3</Text>",
            "import { Text } from '@/modules/Text';\n\n  export default function Example() {\n    return (\n      <>\n        <Text type=\"caption\" size=\"xs\">Caption XS</Text>\n        <Text type=\"caption\" size=\"md\">Caption MD</Text>\n      </>\n    )\n  }"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [
              {
                "name": "textColor",
                "type": "TextColor"
              }
            ],
            "flat": {
              "type": {
                "name": "type",
                "type": "T",
                "required": false,
                "description": "Tipo de texto: title, body, caption, code"
              },
              "size": {
                "name": "size",
                "type": "TextSize<T>",
                "required": false,
                "description": "Tamaño del texto según el tipo"
              },
              "weight": {
                "name": "weight",
                "type": "TextWeight",
                "required": false,
                "description": "Peso de la fuente"
              },
              "children": {
                "name": "children",
                "type": "ReactNode",
                "required": true,
                "description": "Contenido del texto"
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clase CSS adicional"
              },
              "as": {
                "name": "as",
                "type": "keyof JSX.IntrinsicElements",
                "required": false,
                "description": "Elemento HTML a renderizar (por defecto: span para body/caption/code, h1-h6 para title)"
              },
              "color": {
                "name": "color",
                "type": "TextColor | (string & {})",
                "required": false,
                "description": "Color del texto: puede ser un color del sistema de diseño o un color CSS personalizado"
              },
              "truncateLabel": {
                "name": "truncateLabel",
                "type": "boolean",
                "required": false,
                "description": "Si es true, el texto se trunca con ellipsis y, si `truncateTooltip` es true, muestra un tooltip\n    con el contenido completo al pasar el cursor cuando el texto está efectivamente truncado."
              },
              "truncateTooltip": {
                "name": "truncateTooltip",
                "type": "boolean",
                "required": false,
                "description": "Si es true (por defecto) y `truncateLabel` es true, muestra el tooltip al truncar.\n    Si es false, solo se aplica truncado sin tooltip."
              },
              "tooltipTitle": {
                "name": "tooltipTitle",
                "type": "ReactNode",
                "required": false,
                "description": "Texto mostrado en el tooltip cuando hace falta (p. ej. `children` no es un string o se quiere\n    un texto distinto al visible)."
              }
            }
          }
        },
        {
          "name": "Code",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Text permite aplicar estilos tipográficos consistentes usando los tokens de Figma. Soporta tipos (title, body, caption, code), tamaños, pesos de fuente, y valores base.",
            "confidence": "medium"
          },
          "examples": [
            "import { Text } from '@/modules/Text';\n\n  export default function Example() {\n    return <Text>Este es un texto básico</Text>\n  }",
            "import { Text } from '@/modules/Text';\n\n  const copy = 'Texto largo repetido o cargado desde CMS…';\n\n  export default function Example() {\n    return (\n      <div style={{ width: 300, maxWidth: '100%' }} className=\"ui-space-y-4 ui-p-3\">\n        <Text type=\"title\" size=\"h5\" textColor=\"primary\" as=\"p\">\n          {copy}\n        </Text>\n        <Text type=\"body\" size=\"md\" textColor=\"primary\" as=\"p\">\n          {copy}\n        </Text>\n        <Text type=\"body\" size=\"sm\" weight=\"medium\" textColor=\"secondary\" as=\"p\">\n          {copy}\n        </Text>\n        <Text type=\"caption\" size=\"xs\" textColor=\"tertiary\" as=\"p\">\n          {copy}\n        </Text>\n        <Text type=\"code\" size=\"md\" as=\"p\" className=\"ui-break-words\">\n          const linea = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';\n        </Text>\n      </div>\n    );\n  }",
            "import { Text } from '@/modules/Text';\n\n  export default function Example() {\n    return (\n      <>\n        <Text type=\"body\" size=\"xs\" weight=\"regular\">Body XS Regular</Text>\n        <Text type=\"body\" size=\"sm\" weight=\"medium\">Body SM Medium</Text>\n        <Text type=\"body\" size=\"md\" weight=\"semibold\">Body MD Semibold</Text>\n        <Text type=\"body\" size=\"lg\" weight=\"bold\">Body LG Bold</Text>\n      </>\n    )\n  }",
            "<Text type=\"title\" size=\"h1\">Heading H1</Text>\n  <Text type=\"title\" size=\"h2\">Heading H2</Text>\n  <Text type=\"title\" size=\"h3\">Heading H3</Text>",
            "import { Text } from '@/modules/Text';\n\n  export default function Example() {\n    return (\n      <>\n        <Text type=\"caption\" size=\"xs\">Caption XS</Text>\n        <Text type=\"caption\" size=\"md\">Caption MD</Text>\n      </>\n    )\n  }"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [
              {
                "name": "textColor",
                "type": "TextColor"
              }
            ],
            "flat": {
              "size": {
                "name": "size",
                "type": "CodeSize | BaseSize",
                "required": false,
                "description": "Tamaño del code: md o tamaños base"
              },
              "weight": {
                "name": "weight",
                "type": "TextWeight",
                "required": false,
                "description": "Peso de la fuente (solo aplica si se usa tamaño base)"
              },
              "children": {
                "name": "children",
                "type": "React.ReactNode",
                "required": true,
                "description": "Contenido del código"
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clase CSS adicional"
              },
              "as": {
                "name": "as",
                "type": "keyof JSX.IntrinsicElements",
                "required": false,
                "description": "Elemento HTML a renderizar (por defecto: code)"
              },
              "color": {
                "name": "color",
                "type": "TextColor | (string & {})",
                "required": false,
                "description": "Color del texto: puede ser un color del sistema de diseño o un color CSS personalizado"
              }
            }
          }
        },
        {
          "name": "CustomText",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Text permite aplicar estilos tipográficos consistentes usando los tokens de Figma. Soporta tipos (title, body, caption, code), tamaños, pesos de fuente, y valores base.",
            "confidence": "medium"
          },
          "examples": [
            "import { Text } from '@/modules/Text';\n\n  export default function Example() {\n    return <Text>Este es un texto básico</Text>\n  }",
            "import { Text } from '@/modules/Text';\n\n  const copy = 'Texto largo repetido o cargado desde CMS…';\n\n  export default function Example() {\n    return (\n      <div style={{ width: 300, maxWidth: '100%' }} className=\"ui-space-y-4 ui-p-3\">\n        <Text type=\"title\" size=\"h5\" textColor=\"primary\" as=\"p\">\n          {copy}\n        </Text>\n        <Text type=\"body\" size=\"md\" textColor=\"primary\" as=\"p\">\n          {copy}\n        </Text>\n        <Text type=\"body\" size=\"sm\" weight=\"medium\" textColor=\"secondary\" as=\"p\">\n          {copy}\n        </Text>\n        <Text type=\"caption\" size=\"xs\" textColor=\"tertiary\" as=\"p\">\n          {copy}\n        </Text>\n        <Text type=\"code\" size=\"md\" as=\"p\" className=\"ui-break-words\">\n          const linea = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';\n        </Text>\n      </div>\n    );\n  }",
            "import { Text } from '@/modules/Text';\n\n  export default function Example() {\n    return (\n      <>\n        <Text type=\"body\" size=\"xs\" weight=\"regular\">Body XS Regular</Text>\n        <Text type=\"body\" size=\"sm\" weight=\"medium\">Body SM Medium</Text>\n        <Text type=\"body\" size=\"md\" weight=\"semibold\">Body MD Semibold</Text>\n        <Text type=\"body\" size=\"lg\" weight=\"bold\">Body LG Bold</Text>\n      </>\n    )\n  }",
            "<Text type=\"title\" size=\"h1\">Heading H1</Text>\n  <Text type=\"title\" size=\"h2\">Heading H2</Text>\n  <Text type=\"title\" size=\"h3\">Heading H3</Text>",
            "import { Text } from '@/modules/Text';\n\n  export default function Example() {\n    return (\n      <>\n        <Text type=\"caption\" size=\"xs\">Caption XS</Text>\n        <Text type=\"caption\" size=\"md\">Caption MD</Text>\n      </>\n    )\n  }"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [
              {
                "name": "textColor",
                "type": "TextColor"
              }
            ],
            "flat": {
              "size": {
                "name": "size",
                "type": "BaseSize",
                "required": true,
                "description": "Tamaño base del texto: 2xs, xs, sm, md, lg, xl, 2xl, 3xl, 4xl, 5xl"
              },
              "weight": {
                "name": "weight",
                "type": "TextWeight",
                "required": false,
                "description": "Peso de la fuente"
              },
              "children": {
                "name": "children",
                "type": "React.ReactNode",
                "required": true,
                "description": "Contenido del texto"
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clase CSS adicional"
              },
              "as": {
                "name": "as",
                "type": "keyof JSX.IntrinsicElements",
                "required": false,
                "description": "Elemento HTML a renderizar (por defecto: span)"
              },
              "color": {
                "name": "color",
                "type": "TextColor | (string & {})",
                "required": false,
                "description": "Color del texto: puede ser un color del sistema de diseño o un color CSS personalizado"
              }
            }
          }
        }
      ]
    },
    {
      "id": "TextListWithData",
      "path": "src/modules/TextListWithData",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "TextListWithData",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente TextListWithData muestra un texto con un indicador circular de color y un valor asociado. Útil para mostrar etiquetas con datos numéricos o textuales.",
            "jsdoc": "TextListWithData - Texto con indicador de color y valor\nMuestra un texto con un indicador circular de color y un valor asociado.\nÚtil para mostrar etiquetas con datos numéricos o textuales.",
            "confidence": "high"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "title": {
                "name": "title",
                "type": "string",
                "required": true,
                "description": "Título o etiqueta del texto"
              },
              "color": {
                "name": "color",
                "type": "TextListWithDataColor",
                "required": true,
                "description": "Color semántico del indicador circular"
              },
              "data": {
                "name": "data",
                "type": "string | number",
                "required": true,
                "description": "Valor o dato a mostrar"
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clase CSS adicional"
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false,
                "description": "Si deshabilitar el componente"
              },
              "indicatorSize": {
                "name": "indicatorSize",
                "type": "number",
                "required": false,
                "description": "Tamaño del indicador circular en píxeles (por defecto: 8px)"
              },
              "showIndicator": {
                "name": "showIndicator",
                "type": "boolean",
                "required": false,
                "description": "Si mostrar el indicador circular (por defecto: true)"
              }
            }
          }
        },
        {
          "name": "TextListIndicator",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente TextListWithData muestra un texto con un indicador circular de color y un valor asociado. Útil para mostrar etiquetas con datos numéricos o textuales.",
            "jsdoc": "Color del indicador (valor CSS) */\n  color: string;\n  /** Tamaño del indicador en píxeles */\n  size: number;\n  /** Clase CSS adicional */\n  className?: string;\n}\n\n/**\nIndicador circular de color\nÁtomo que representa un punto de color para identificar categorías",
            "confidence": "high"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "color": {
                "name": "color",
                "type": "string",
                "required": true,
                "description": "Color del indicador (valor CSS)"
              },
              "size": {
                "name": "size",
                "type": "number",
                "required": true,
                "description": "Tamaño del indicador en píxeles"
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clase CSS adicional"
              }
            }
          }
        }
      ]
    },
    {
      "id": "Textarea",
      "path": "src/modules/Textarea",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Textarea",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "jsdoc": "Textarea - Componente de área de texto versátil y configurable\nComponente de textarea que soporta labels, mensajes de error, slots personalizados,\ncontador de caracteres, límite de longitud y estados controlados/no controlados.",
            "confidence": "medium"
          },
          "examples": [
            "import { Textarea } from '@/modules/Textarea';\n\n    export default function Example() {\n        const [value, setValue] = useState('');\n        return <Textarea value={value} onChange={setValue} />;\n    }",
            "<Textarea \n        value={value} \n        onChange={setValue} \n        placeholder=\"Escribe tu mensaje aquí...\"\n    />",
            "<Textarea \n        value={value} \n        onChange={setValue} \n        leftSlot={faAlignCenter}\n        rightSlot={faList}\n    />",
            "<Textarea \n        value={value} \n        onChange={setValue} \n        leftSlot={faSearch}\n    />",
            "<Textarea \n        value={value} \n        onChange={setValue} \n        rightSlot={faPaperPlane}\n    />"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "value": {
                "name": "value",
                "type": "string",
                "required": false
              },
              "onChange": {
                "name": "onChange",
                "type": "(value: string) => void",
                "required": false
              },
              "onFocus": {
                "name": "onFocus",
                "type": "(event?: React.FocusEvent<HTMLTextAreaElement>) => void",
                "required": false
              },
              "onBlur": {
                "name": "onBlur",
                "type": "(event?: React.FocusEvent<HTMLTextAreaElement>) => void",
                "required": false
              },
              "placeholder": {
                "name": "placeholder",
                "type": "string",
                "required": false
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "containerClassName": {
                "name": "containerClassName",
                "type": "string",
                "required": false
              },
              "leftSlot": {
                "name": "leftSlot",
                "type": "AnyIconDefinition | null",
                "required": false
              },
              "rightSlot": {
                "name": "rightSlot",
                "type": "AnyIconDefinition | null",
                "required": false
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false
              },
              "error": {
                "name": "error",
                "type": "string",
                "required": false
              },
              "helperText": {
                "name": "helperText",
                "type": "string",
                "required": false
              },
              "maxLength": {
                "name": "maxLength",
                "type": "number",
                "required": false
              },
              "label": {
                "name": "label",
                "type": "string",
                "required": false
              },
              "fullWidth": {
                "name": "fullWidth",
                "type": "boolean",
                "required": false
              }
            }
          }
        }
      ]
    },
    {
      "id": "Title",
      "path": "src/modules/Title",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Title",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Title proporciona un título con soporte para:\n- Título de texto personalizable (mediante prop \\",
            "jsdoc": "Title - Componente de título con soporte para iconos\nComponente que renderiza un título (h1) con opción de mostrar un icono.\nSoporta iconos duotone y centrado del contenido.",
            "confidence": "high"
          },
          "examples": [
            "import { Title } from '@/modules/Title';\n\nexport default function Example() {\n  return (\n    <>\n      {/* Usando prop title */}\n      <Title title=\"Mi Título Principal\" />\n      \n      {/* Usando children */}\n      <Title>Mi Título Principal</Title>\n    </>\n  );\n}",
            "import { Title } from '@/modules/Title';\nimport { faFolder, faCheckCircle } from '@fortawesome/pro-duotone-svg-icons';\n\nexport default function Example() {\n  return (\n    <>\n      {/* Texto simple */}\n      <Title>Mi Título con Children</Title>\n      \n      {/* Con formato */}\n      <Title>\n        Título con <span className=\"ui-text-brand\">texto destacado</span>\n      </Title>\n      \n      {/* Con icono */}\n      <Title icon={faFolder}>\n        Carpeta de Documentos\n      </Title>\n      \n      {/* Centrado */}\n      <Title center icon={faCheckCircle}>\n        Operación Completada\n      </Title>\n      \n      {/* Múltiples elementos */}\n      <Title>\n        Título con <span className=\"ui-text-success\">éxito</span> y <span className=\"ui-text-danger\">error</span>\n      </Title>\n    </>\n  );\n}",
            "import { Title } from '@/modules/Title';\nimport { faFolder, faCalendar } from '@fortawesome/pro-duotone-svg-icons';\n\nexport default function Example() {\n  return (\n    <>\n      <Title title=\"Carpetas\" icon={faFolder} />\n      <Title title=\"Calendario\" icon={faCalendar} />\n    </>\n  );\n}",
            "import { Title } from '@/modules/Title';\nimport { faCheckCircle, faExclamationTriangle } from '@fortawesome/pro-duotone-svg-icons';\n\nexport default function Example() {\n  return (\n    <>\n      <Title\n        title=\"Operación Exitosa\"\n        icon={faCheckCircle}\n        iconDuotonePrimary=\"success\"\n        iconDuotoneSecondary=\"green\"\n        iconDuotoneOpacityPrimary={1}\n        iconDuotoneOpacitySecondary={0.4}\n      />\n      <Title\n        title=\"Advertencia Importante\"\n        icon={faExclamationTriangle}\n        iconDuotonePrimary=\"warning\"\n        iconDuotoneSecondary=\"yellow\"\n        iconDuotoneOpacityPrimary={1}\n        iconDuotoneOpacitySecondary={0.4}\n      />\n    </>\n  );\n}",
            "import { Title } from '@/modules/Title';\nimport { faFolder, faCalendar } from '@fortawesome/pro-duotone-svg-icons';\n\nexport default function Example() {\n  return (\n    <>\n      <Title\n        title=\"Carpetas Organizadas\"\n        icon={faFolder}\n        iconDuotonePrimary=\"azure\"\n        iconDuotoneSecondary=\"blue\"\n        iconDuotoneOpacityPrimary={1}\n        iconDuotoneOpacitySecondary={0.4}\n      />\n      <Title\n        title=\"Eventos del Mes\"\n        icon={faCalendar}\n        iconDuotonePrimary=\"violet\"\n        iconDuotoneSecondary=\"magenta\"\n        iconDuotoneOpacityPrimary={1}\n        iconDuotoneOpacitySecondary={0.4}\n      />\n    </>\n  );\n}"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "title": {
                "name": "title",
                "type": "string",
                "required": false
              },
              "children": {
                "name": "children",
                "type": "ReactNode",
                "required": false
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "icon": {
                "name": "icon",
                "type": "IconType | IconProp",
                "required": false
              },
              "iconDuotonePrimary": {
                "name": "iconDuotonePrimary",
                "type": "IconFontColor",
                "required": false
              },
              "iconDuotoneSecondary": {
                "name": "iconDuotoneSecondary",
                "type": "IconFontColor",
                "required": false
              },
              "iconDuotoneOpacityPrimary": {
                "name": "iconDuotoneOpacityPrimary",
                "type": "number",
                "required": false
              },
              "iconDuotoneOpacitySecondary": {
                "name": "iconDuotoneOpacitySecondary",
                "type": "number",
                "required": false
              },
              "center": {
                "name": "center",
                "type": "boolean",
                "required": false
              }
            }
          }
        }
      ]
    },
    {
      "id": "Toast",
      "path": "src/modules/Toast",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Toaster",
          "kind": "component",
          "description": {
            "primary": "readme",
            "readme": "# Toast Component\n\nComponente de notificaciones toast modular y configurable con múltiples variantes y posiciones.\n\n## Estructura\n\n```\nToast/\n├── config/\n│   ├── index.ts\n│   └── toast.config.ts          # Configuración del toast\n├── hooks/\n│   ├── index.ts\n│   ├── useToast.ts              # Hook principal para manejar toasts\n│   ├── useToastService.ts       # Servicio de toast\n│   └── useToastStyles.ts        # Hook para estilos y utilidades\n├── components/\n│   ├── atoms/\n│   │   ├── ToastHeader.tsx      # Encabezado del toast\n│   │   └── ToastFooter.tsx      # Pie del toast\n│   └── molecules/\n│       ├── ToastItem.tsx        # Item individual del toast\n│       └── ToastPositions.tsx   # Contenedor de posiciones\n├── stories/\n│   └── toast.stories.tsx        # Storybook stories\n├── index.tsx                    # Componente principal\n└── README.md                    # Este archivo\n```\n\n## Uso\n\n### Básico\n\n```tsx\nimport { toast, Toaster } from '@/modules/Toast';\n\n// Mostrar un toast\ntoast.success('Operación exitosa');\ntoast.error('Algo salió mal');\ntoast.info('Información importante');\ntoast.warning('Advertencia');\n\n// En tu componente\nfunction App() {\n  return (\n    <div>\n      <Toaster />\n      {/* resto de tu app */}\n    </div>\n  );\n}\n```\n\n### Con título\n\n```tsx\n// Toast con título\ntoast.success('Usuario creado correctamente', {\n  title: 'Éxito',\n});\n\ntoast.error('No se pudo conectar al servidor', {\n  title: 'Error de conexión',\n});\n\ntoast.info('Tu sesión expirará en 5 minutos', {\n  title: 'Sesión',\n});\n\ntoast.warning('Los cambios no se han guardado', {\n  title: 'Advertencia',\n});\n```\n\n### Sin botón de cerrar\n\n```tsx\n// Toast sin botón de cerrar (se cerrará automáticamente)\ntoast.success('Mensaje temporal', {\n  showCloseButton: false,\n});\n\n// Toast con título pero sin botón de cerrar\ntoast.info('Procesando...', {\n  title: 'Carga',\n  showCloseButton: false,\n  duration: 3000,\n});\n```\n\n### Variantes de estilo\n\n```tsx\n// Variante contained (por defecto)\ntoast.success('",
            "confidence": "low"
          },
          "examples": [
            "// ✅ Nueva forma (recomendada)\n    import { notify, Messaging, Button } from '@imj_media';\n\n    export const App = () => (\n      <div>\n        <Messaging />\n        <Button onClick={() => notify.success(\"Hello, world!\")}>Success</Button>\n      </div>\n    )\n\n    // ✅ Forma legacy (sigue funcionando)\n    import { toast, Toaster, Button } from '@imj_media';\n\n    export const App = () => (\n      <div>\n        <Toaster />\n        <Button onClick={() => toast.success(\"Hello, world!\")}>Success</Button>\n      </div>\n    )",
            "import { notify } from '@imj_media'; // o import { toast } para compatibilidad\n\n    notify.success(\"Hello, world!\")\n    notify.error(\"Hello, world!\")\n    notify.info(\"Hello, world!\")\n    notify.warning(\"Hello, world!\")\n    \n    // ✨ Nuevos métodos disponibles con notify\n    notify.message({ stackGroup: 'secondary', title: 'Mensaje neutro' })\n    notify.message({ title: 'Mensaje de marca' })\n\n    notify.success({\n      message: \"Hello, world!\",\n      title: \"Success\",\n      position: 'top-center',\n      variant: 'outlined'\n    })\n\n    notify.success(\"Hello, world!\", {\n      title: \"Success\",\n      position: 'top-center',\n      variant: 'outlined'\n    })",
            "import { toast, Toaster, Button } from '@imj_media';\n\n    export const App = () => {\n\n      toast.configure({ \n        duration: 5000,\n        maxMessages: 5,\n        position: 'bottom-right',\n        variant: 'contained',\n        primaryButtonText: 'Aceptar',\n        secondaryButtonText: 'Cancelar'\n      }) \n\n      return (\n        <div>\n          <Toaster />\n          <Button variant=\"contained\" color=\"success\" onClick={() => toast.success(\"Hello, world!\")}>Success</Button>\n        </div>\n      )\n    }",
            "import { toast, Toaster } from '@/modules/Toast';\n  import { Button } from '@/modules/Button';\n\n  import { faCheck, faExclamationTriangle, faInfoCircle } from '@fortawesome/pro-regular-svg-icons';\n  export default function Example() {\n    return (\n      <>\n        <Toaster />\n        <Button size=\"sm\" theme=\"solid\" color=\"primary\" onClick={() => toast.success(\"Hello, world!\")}>Success</Button>\n        <Button size=\"sm\" theme=\"solid\" color=\"danger\" onClick={() => toast.error(\"Hello, world!\", { position: 'top-left' })}>Error</Button>\n        <Button size=\"sm\" theme=\"solid\" color=\"primary\" onClick={() => toast.info(\"Hello, world!\")}>Info</Button>\n        <Button size=\"sm\" theme=\"solid\" color=\"primary\" onClick={() => toast.warning(\"Hello, world!\")}>Warning</Button>\n      </>\n    )\n  }",
            "// Tamaño pequeño (por defecto)\n    toast.success({\n      message: \"Toast con tamaño pequeño\",\n      title: \"Tamaño SM\",\n      size: 'sm'\n    })\n\n    // Tamaño mediano\n    toast.info({\n      message: \"Toast con tamaño mediano\", \n      title: \"Tamaño MD\",\n      size: 'md'\n    })"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "type": {
                "name": "type",
                "type": "'toast'",
                "required": false
              }
            }
          }
        },
        {
          "name": "Messaging",
          "kind": "component",
          "description": {
            "primary": "readme",
            "readme": "# Toast Component\n\nComponente de notificaciones toast modular y configurable con múltiples variantes y posiciones.\n\n## Estructura\n\n```\nToast/\n├── config/\n│   ├── index.ts\n│   └── toast.config.ts          # Configuración del toast\n├── hooks/\n│   ├── index.ts\n│   ├── useToast.ts              # Hook principal para manejar toasts\n│   ├── useToastService.ts       # Servicio de toast\n│   └── useToastStyles.ts        # Hook para estilos y utilidades\n├── components/\n│   ├── atoms/\n│   │   ├── ToastHeader.tsx      # Encabezado del toast\n│   │   └── ToastFooter.tsx      # Pie del toast\n│   └── molecules/\n│       ├── ToastItem.tsx        # Item individual del toast\n│       └── ToastPositions.tsx   # Contenedor de posiciones\n├── stories/\n│   └── toast.stories.tsx        # Storybook stories\n├── index.tsx                    # Componente principal\n└── README.md                    # Este archivo\n```\n\n## Uso\n\n### Básico\n\n```tsx\nimport { toast, Toaster } from '@/modules/Toast';\n\n// Mostrar un toast\ntoast.success('Operación exitosa');\ntoast.error('Algo salió mal');\ntoast.info('Información importante');\ntoast.warning('Advertencia');\n\n// En tu componente\nfunction App() {\n  return (\n    <div>\n      <Toaster />\n      {/* resto de tu app */}\n    </div>\n  );\n}\n```\n\n### Con título\n\n```tsx\n// Toast con título\ntoast.success('Usuario creado correctamente', {\n  title: 'Éxito',\n});\n\ntoast.error('No se pudo conectar al servidor', {\n  title: 'Error de conexión',\n});\n\ntoast.info('Tu sesión expirará en 5 minutos', {\n  title: 'Sesión',\n});\n\ntoast.warning('Los cambios no se han guardado', {\n  title: 'Advertencia',\n});\n```\n\n### Sin botón de cerrar\n\n```tsx\n// Toast sin botón de cerrar (se cerrará automáticamente)\ntoast.success('Mensaje temporal', {\n  showCloseButton: false,\n});\n\n// Toast con título pero sin botón de cerrar\ntoast.info('Procesando...', {\n  title: 'Carga',\n  showCloseButton: false,\n  duration: 3000,\n});\n```\n\n### Variantes de estilo\n\n```tsx\n// Variante contained (por defecto)\ntoast.success('",
            "confidence": "low"
          },
          "examples": [
            "// ✅ Nueva forma (recomendada)\n    import { notify, Messaging, Button } from '@imj_media';\n\n    export const App = () => (\n      <div>\n        <Messaging />\n        <Button onClick={() => notify.success(\"Hello, world!\")}>Success</Button>\n      </div>\n    )\n\n    // ✅ Forma legacy (sigue funcionando)\n    import { toast, Toaster, Button } from '@imj_media';\n\n    export const App = () => (\n      <div>\n        <Toaster />\n        <Button onClick={() => toast.success(\"Hello, world!\")}>Success</Button>\n      </div>\n    )",
            "import { notify } from '@imj_media'; // o import { toast } para compatibilidad\n\n    notify.success(\"Hello, world!\")\n    notify.error(\"Hello, world!\")\n    notify.info(\"Hello, world!\")\n    notify.warning(\"Hello, world!\")\n    \n    // ✨ Nuevos métodos disponibles con notify\n    notify.message({ stackGroup: 'secondary', title: 'Mensaje neutro' })\n    notify.message({ title: 'Mensaje de marca' })\n\n    notify.success({\n      message: \"Hello, world!\",\n      title: \"Success\",\n      position: 'top-center',\n      variant: 'outlined'\n    })\n\n    notify.success(\"Hello, world!\", {\n      title: \"Success\",\n      position: 'top-center',\n      variant: 'outlined'\n    })",
            "import { toast, Toaster, Button } from '@imj_media';\n\n    export const App = () => {\n\n      toast.configure({ \n        duration: 5000,\n        maxMessages: 5,\n        position: 'bottom-right',\n        variant: 'contained',\n        primaryButtonText: 'Aceptar',\n        secondaryButtonText: 'Cancelar'\n      }) \n\n      return (\n        <div>\n          <Toaster />\n          <Button variant=\"contained\" color=\"success\" onClick={() => toast.success(\"Hello, world!\")}>Success</Button>\n        </div>\n      )\n    }",
            "import { toast, Toaster } from '@/modules/Toast';\n  import { Button } from '@/modules/Button';\n\n  import { faCheck, faExclamationTriangle, faInfoCircle } from '@fortawesome/pro-regular-svg-icons';\n  export default function Example() {\n    return (\n      <>\n        <Toaster />\n        <Button size=\"sm\" theme=\"solid\" color=\"primary\" onClick={() => toast.success(\"Hello, world!\")}>Success</Button>\n        <Button size=\"sm\" theme=\"solid\" color=\"danger\" onClick={() => toast.error(\"Hello, world!\", { position: 'top-left' })}>Error</Button>\n        <Button size=\"sm\" theme=\"solid\" color=\"primary\" onClick={() => toast.info(\"Hello, world!\")}>Info</Button>\n        <Button size=\"sm\" theme=\"solid\" color=\"primary\" onClick={() => toast.warning(\"Hello, world!\")}>Warning</Button>\n      </>\n    )\n  }",
            "// Tamaño pequeño (por defecto)\n    toast.success({\n      message: \"Toast con tamaño pequeño\",\n      title: \"Tamaño SM\",\n      size: 'sm'\n    })\n\n    // Tamaño mediano\n    toast.info({\n      message: \"Toast con tamaño mediano\", \n      title: \"Tamaño MD\",\n      size: 'md'\n    })"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "type": {
                "name": "type",
                "type": "'toast'",
                "required": false
              }
            }
          }
        }
      ]
    },
    {
      "id": "Toggle",
      "path": "src/modules/Toggle",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "TOGGLE_DESIGN_TOKENS",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "jsdoc": "Tokens semánticos del Toggle según diseño de Figma\nEl componente usa clases semánticas de Tailwind configuradas con variables CSS de Figma:\nCOLORES (tokens semánticos):\n- Activo: ui-bg-fill-brand → var(--ui-color-bg-fill-brand-default) = #3658c1\n- Inactivo: ui-bg-fill-brand-disabled → var(--ui-color-bg-fill-brand-disabled) = #b8c5ee\n- Disabled: ui-bg-fill-hover → var(--ui-color-bg-fill-hover) = #f0f1f2\n- Border: ui-border-DEFAULT → var(--ui-color-border-default) = #c6c8cc\n- Thumb: ui-bg-fill = #ffffff\n- Text: ui-text-primary → var(--ui-color-text-primary) = #313336\nDIMENSIONES (clases de Tailwind con Positive Space):\n- Container width: ui-w-32 → var(--ui-Positive-space_32) = 32px\n- Container height: ui-h-20 → var(--ui-Positive-space_20) = 20px\n- Thumb: ui-w-16 ui-h-16 → var(--ui-Positive-s",
            "readme": "# Toggle Component\n\nComponente Toggle (interruptor) altamente configurable y accesible para React, construido fielmente siguiendo el diseño de Figma.\n\n## Características\n\n- ✅ **Diseño fiel a Figma** (32x20px, colores exactos)\n- ✅ Soporta modo controlado y no controlado\n- ✅ Label opcional con icono y posición configurable\n- ✅ Variante con stroke (borde)\n- ✅ Estados: activo, inactivo, disabled\n- ✅ Animaciones suaves\n- ✅ Totalmente accesible (ARIA)\n- ✅ Clases semánticas con prefijo `ui-`\n- ✅ TypeScript completo\n- ✅ Hook personalizado reutilizable\n\n## Especificaciones de Diseño (Figma)\n\n### Dimensiones (usando clases de Tailwind con Positive Space)\n\n- **Container width**: `ui-w-32` → `var(--ui-Positive-space_32)` = 32px\n- **Container height**: `ui-h-20` → `var(--ui-Positive-space_20)` = 20px\n- **Thumb**: `ui-w-16 ui-h-16` → `var(--ui-Positive-space_16)` = 16px\n- **Border radius**: `ui-rounded-2xl` = 16px\n- **Padding**: `ui-px-2` → `var(--ui-Positive-space_2)` = 2px\n- **Gap**: `ui-gap-8` → `var(--ui-Positive-space_8)` = 8px\n\n### Colores (usando tokens semánticos)\n\n- **Activo**: `ui-bg-fill-brand` → `var(--ui-color-bg-fill-brand-default)` = `#3658c1`\n- **Inactivo**: `ui-bg-fill-brand-disabled` → `var(--ui-color-bg-fill-brand-disabled)` = `#b8c5ee`\n- **Disabled**: `ui-bg-fill-hover` → `var(--ui-color-bg-fill-hover)` = `#f0f1f2`\n- **Border**: `ui-border-DEFAULT` → `var(--ui-color-border-default)` = `#c6c8cc`\n- **Thumb**: `ui-bg-fill` = `#ffffff`\n- **Text**: `ui-text-primary` → `var(--ui-color-text-primary)` = `#313336`\n\n### Tipografía (según Type/Body/SM/Bold de Figma)\n\n- **Weight**: `ui-font-body-sm-bold` (700)\n- **Size**: `ui-text-body-sm-bold` (14px)\n- **Line Height**: `20.5px`\n- **Tracking**: `0.5px`\n\n## Uso Básico\n\n```tsx\nimport { Toggle } from '@/modules/Toggle'\n\n// Sin label\n<Toggle ariaLabel=\"Activar función\" />\n\n// Con label\n<Toggle label=\"Notificaciones\" />\n\n// Controlado\nconst [enabled, setEnabled] = useState(false)\n<Toggle\n  checked={enabled}\n  onChange={setEnab",
            "confidence": "medium"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "checked": {
                "name": "checked",
                "type": "boolean",
                "required": false,
                "description": "Estado checked del toggle (controlado)"
              },
              "defaultChecked": {
                "name": "defaultChecked",
                "type": "boolean",
                "required": false,
                "description": "Valor por defecto para modo no controlado"
              },
              "onChange": {
                "name": "onChange",
                "type": "(checked: boolean) => void",
                "required": false,
                "description": "Callback cuando cambia el estado"
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false,
                "description": "Deshabilita el toggle"
              },
              "label": {
                "name": "label",
                "type": "string",
                "required": false,
                "description": "Label del toggle"
              },
              "labelPosition": {
                "name": "labelPosition",
                "type": "'left' | 'right'",
                "required": false,
                "description": "Posición del label"
              },
              "icon": {
                "name": "icon",
                "type": "IconType | AnyIconDefinition",
                "required": false,
                "description": "Icono opcional para el label"
              },
              "iconColor": {
                "name": "iconColor",
                "type": "IconFontColor",
                "required": false,
                "description": "Color del icono"
              },
              "iconDuotonePrimary": {
                "name": "iconDuotonePrimary",
                "type": "IconFontColor",
                "required": false
              },
              "iconDuotoneSecondary": {
                "name": "iconDuotoneSecondary",
                "type": "IconFontColor",
                "required": false
              },
              "iconDuotoneOpacityPrimary": {
                "name": "iconDuotoneOpacityPrimary",
                "type": "number",
                "required": false
              },
              "iconDuotoneOpacitySecondary": {
                "name": "iconDuotoneOpacitySecondary",
                "type": "number",
                "required": false
              },
              "stroke": {
                "name": "stroke",
                "type": "boolean",
                "required": false,
                "description": "Mostrar borde (stroke)"
              },
              "name": {
                "name": "name",
                "type": "string",
                "required": false,
                "description": "Nombre del campo (para forms)"
              },
              "id": {
                "name": "id",
                "type": "string",
                "required": false,
                "description": "ID del elemento"
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clases CSS adicionales"
              },
              "ariaLabel": {
                "name": "ariaLabel",
                "type": "string",
                "required": false,
                "description": "Texto accesible"
              },
              "tooltip": {
                "name": "tooltip",
                "type": "Partial<ToggleTooltipLabels> | false",
                "required": false,
                "description": "Tooltips según estado: activado (`enable`) / desactivado (`disabled`, sinónimo de “unchecked”).\n    Por defecto `{ enable: 'Activo', disabled: 'Inactivo' }` si omites la prop.\n    Objeto parcial: se fusiona con esos valores. `false` desactiva el tooltip."
              }
            }
          }
        }
      ],
      "standaloneSnippet": "import React from 'react';\n\nconst sizeDims: Record<string, { track: [number, number]; knob: number; offset: number }> = {\n  sm: { track: [28, 16], knob: 12, offset: 2 },\n  md: { track: [36, 20], knob: 16, offset: 2 },\n  lg: { track: [44, 24], knob: 20, offset: 2 },\n};\n\ninterface ToggleProps {\n  checked: boolean;\n  onChange: (checked: boolean) => void;\n  disabled?: boolean;\n  size?: 'sm' | 'md' | 'lg';\n}\n\nexport function Toggle({\n  checked,\n  onChange,\n  disabled = false,\n  size = 'md',\n}: ToggleProps) {\n  const d = sizeDims[size];\n  const [w, h] = d.track;\n\n  return (\n    <button\n      type=\"button\"\n      role=\"switch\"\n      aria-checked={checked}\n      disabled={disabled}\n      onClick={() => onChange(!checked)}\n      style={{\n        position: 'relative',\n        display: 'inline-flex',\n        alignItems: 'center',\n        width: w,\n        height: h,\n        borderRadius: h,\n        border: 'none',\n        padding: 0,\n        cursor: disabled ? 'not-allowed' : 'pointer',\n        backgroundColor: checked ? 'rgb(54, 89, 194)' : 'rgb(247, 247, 250)',\n        opacity: disabled ? 0.5 : 1,\n        transition: 'background-color 0.2s',\n      }}\n    >\n      <span\n        style={{\n          position: 'absolute',\n          top: d.offset,\n          left: checked ? w - d.knob - d.offset : d.offset,\n          width: d.knob,\n          height: d.knob,\n          borderRadius: '50%',\n          backgroundColor: 'rgb(255, 255, 255)',\n          transition: 'left 0.2s',\n          boxShadow: '0 1px 2px 0 rgba(0, 0, 0, 0.1)',\n        }}\n      />\n    </button>\n  );\n}\n"
    },
    {
      "id": "Toolbar",
      "path": "src/modules/Toolbar",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Toolbar",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "## Toolbar - Barra de herramientas flexible\n\nUn componente flexible que muestra botones en una barra flotante. Cada botón puede tener sus propios addons (inputs/date pickers) asociados.\n\n### Características principales:\n- **Vista de botones**: Siempre se muestra primero\n- **Addons por botón**: Cada botón puede tener sus propios addons\n- **Navegación**: Al hacer click en un botón con addons, se muestra la vista de addons\n- **Botón de volver**: Permite regresar a la vista de botones\n- **Botón de cerrar**: Oculta el toolbar completamente\n- **Contador**: Muestra",
            "jsdoc": "Toolbar - Barra de herramientas flexible con botones y addons\nSegún diseño de Figma:\n- Fondo: bg-fill-brand (azul)\n- Border radius: radius-surface-modal (16px)\n- Padding: 16px horizontal, 8px vertical\n- Gap: 16px entre elementos\n- Texto blanco para el contador\n- Divisor vertical entre secciones\nFuncionamiento:\n1. Siempre se muestra primero la vista de botones\n2. Cada botón puede tener sus propios addons asociados\n3. Al hacer click en un botón:\n   - Se ejecuta onClick (siempre)\n   - Si tiene addons, se muestra la vista de addons de ese botón\n4. En la vista de addons se muestra (por defecto):\n   - Botón de volver (opcional con `showBackButton={false}`)\n   - Texto con contador \"(count) text\"\n   - Los addons del botón seleccionado\n   - Botón de cerrar (si `onClose` está definido y `showCloseBu",
            "confidence": "high"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "text": {
                "name": "text",
                "type": "string",
                "required": false,
                "description": "Texto a mostrar en la barra de addons (ej: \"Seleccionados\")"
              },
              "count": {
                "name": "count",
                "type": "number",
                "required": false,
                "description": "Número de elementos seleccionados (se muestra como \"(count) text\" en la vista de addons)"
              },
              "buttons": {
                "name": "buttons",
                "type": "ToolbarButton[]",
                "required": false,
                "description": "Botones a mostrar (cada botón puede tener sus propios addons)"
              },
              "onClose": {
                "name": "onClose",
                "type": "() => void",
                "required": false,
                "description": "Handler cuando se hace click en el botón de cerrar"
              },
              "showCloseButton": {
                "name": "showCloseButton",
                "type": "boolean",
                "required": false,
                "description": "Si es `false`, no se renderiza el botón de cierre (X) aunque exista `onClose` (útil p. ej. en un paso de confirmación solo con acciones en addons).\n    Por defecto `true`: misma regla que antes (hay X solo cuando `onClose` está definido)."
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clase CSS adicional"
              },
              "visible": {
                "name": "visible",
                "type": "boolean",
                "required": false,
                "description": "Si el toolbar debe mostrarse (controla la visibilidad)"
              },
              "activeButtonId": {
                "name": "activeButtonId",
                "type": "string | null",
                "required": false,
                "description": "ID del botón activo (modo controlado). Si se proporciona, el componente está en modo controlado"
              },
              "onActiveButtonIdChange": {
                "name": "onActiveButtonIdChange",
                "type": "(id: string | null) => void",
                "required": false,
                "description": "Callback cuando cambia el botón activo. Se llama con el id del botón o null si se vuelve a la vista de botones"
              },
              "onBackClick": {
                "name": "onBackClick",
                "type": "() => void",
                "required": false,
                "description": "Callback opcional al hacer click en el botón \"atrás\" en la vista de addons (se ejecuta además de volver a la vista principal)"
              },
              "showCounterInButtonsView": {
                "name": "showCounterInButtonsView",
                "type": "boolean",
                "required": false,
                "description": "Opt-in: muestra `text` / `(count)` en la vista de botones (antes del bloque de botones), con el mismo estilo que en la vista de addons.\n    Por defecto `false` para conservar el comportamiento anterior (solo botones + cierre)."
              },
              "showBackButton": {
                "name": "showBackButton",
                "type": "boolean",
                "required": false,
                "description": "Si es `false`, oculta el botón «atrás» en la vista de addons (p. ej. confirmación solo con contador + acciones).\n    Por defecto `true` (comportamiento anterior)."
              }
            }
          }
        }
      ]
    },
    {
      "id": "Tooltip",
      "path": "src/modules/Tooltip",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Tooltip",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Tooltip permite mostrar información contextual cuando el usuario hace hover sobre un elemento. Soporta múltiples posiciones, colores y configuraciones.",
            "jsdoc": "TooltipComponent - Componente interno de tooltip con posicionamiento avanzado\nComponente que renderiza el tooltip con posicionamiento dinámico, flecha ajustable\ny soporte para múltiples posiciones y alineaciones.\nEl copy usa {@link Body} (equivalente a `Text` con `type=\"body\"`) para tokens de\ntipografía y color en tema claro/oscuro; no se importa `Text` aquí para evitar\ndependencia circular con el truncado que envuelve `Text`.\n@internal\n/\nconst TooltipComponent = ({\n  children,\n  label,\n  position = 'top',\n  alignment = 'center',\n  id = `tooltip-${Math.random().toString(36).substring(2, 9)}`,\n  delay = 0,\n  disabled = false,\n  className = '',\n  fullWidth = false,\n  style,\n  arrowClassName,\n  absolute = false,\n  preserveLayout = false,\n  ...props\n}: TooltipProps) => {\n  const {\n    isVisibl",
            "confidence": "high"
          },
          "examples": [
            "import { Tooltip } from '@/modules/Tooltip';\n\n  export default function Example() {\n    return (\n      <Tooltip label=\"Este es un tooltip básico\">\n        <InnerButton color=\"primary\">Hover me</InnerButton>\n      </Tooltip>\n    )\n  }",
            "import { Tooltip } from '@/modules/Tooltip';\n\nexport default function Example() {\n  return (\n    <Tooltip label=\"Este es un tooltip básico\">\n      <InnerButton color=\"primary\">Hover me</InnerButton>\n    </Tooltip>\n  )\n}",
            "<Tooltip label=\"Este tooltip aparece después de 500ms\" delay={500}>\n    <InnerButton color=\"secondary\">Hover me (delay 500ms)</InnerButton>\n  </Tooltip>",
            "<Tooltip label=\"No deberías ver este tooltip\" disabled={true}>\n    <InnerButton color=\"neutral\">Este tooltip está deshabilitado</InnerButton>\n  </Tooltip>",
            "<Tooltip label=\"Tooltip arriba\" position=\"top\">\n    <InnerButton color=\"primary\">Top</InnerButton>\n  </Tooltip>\n  <Tooltip label=\"Tooltip abajo\" position=\"bottom\">\n    <InnerButton color=\"secondary\">Bottom</InnerButton>\n  </Tooltip>\n  <Tooltip label=\"Tooltip izquierda\" position=\"left\">\n    <InnerButton color=\"destructive\">Left</InnerButton>\n  </Tooltip>\n  <Tooltip label=\"Tooltip derecha\" position=\"right\">\n    <InnerButton color=\"tertiary\">Right</InnerButton>\n  </Tooltip>"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "children": {
                "name": "children",
                "type": "React.ReactNode",
                "required": true
              },
              "label": {
                "name": "label",
                "type": "React.ReactNode",
                "required": true
              },
              "position": {
                "name": "position",
                "type": "fixed).",
                "required": true
              },
              "alignment": {
                "name": "alignment",
                "type": "TooltipAlignment",
                "required": false
              },
              "id": {
                "name": "id",
                "type": "string",
                "required": false
              },
              "delay": {
                "name": "delay",
                "type": "number",
                "required": false
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "style": {
                "name": "style",
                "type": "React.CSSProperties",
                "required": false
              },
              "arrowClassName": {
                "name": "arrowClassName",
                "type": "string",
                "required": false
              },
              "fullWidth": {
                "name": "fullWidth",
                "type": "boolean",
                "required": false
              },
              "absolute": {
                "name": "absolute",
                "type": "boolean",
                "required": false
              },
              "autoClose": {
                "name": "autoClose",
                "type": "boolean",
                "required": false
              },
              "preserveLayout": {
                "name": "preserveLayout",
                "type": "boolean",
                "required": false
              }
            }
          }
        },
        {
          "name": "InlineTooltip",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Tooltip permite mostrar información contextual cuando el usuario hace hover sobre un elemento. Soporta múltiples posiciones, colores y configuraciones.",
            "jsdoc": "Contenido del tooltip */\n  label: React.ReactNode;\n  /** Si el tooltip está visible */\n  isVisible: boolean;\n  /** Posición del tooltip */\n  position?: InlineTooltipPosition;\n  /** Clase adicional para el tooltip */\n  className?: string;\n}\n\n/**\nInlineTooltip - Tooltip CSS puro para usar dentro de elementos flex\nEste componente es útil cuando el Tooltip normal interfiere con layouts flex.\nSe posiciona absolutamente dentro del elemento padre que debe tener `position: relative`.",
            "confidence": "high"
          },
          "examples": [
            "import { Tooltip } from '@/modules/Tooltip';\n\n  export default function Example() {\n    return (\n      <Tooltip label=\"Este es un tooltip básico\">\n        <InnerButton color=\"primary\">Hover me</InnerButton>\n      </Tooltip>\n    )\n  }",
            "import { Tooltip } from '@/modules/Tooltip';\n\nexport default function Example() {\n  return (\n    <Tooltip label=\"Este es un tooltip básico\">\n      <InnerButton color=\"primary\">Hover me</InnerButton>\n    </Tooltip>\n  )\n}",
            "<Tooltip label=\"Este tooltip aparece después de 500ms\" delay={500}>\n    <InnerButton color=\"secondary\">Hover me (delay 500ms)</InnerButton>\n  </Tooltip>",
            "<Tooltip label=\"No deberías ver este tooltip\" disabled={true}>\n    <InnerButton color=\"neutral\">Este tooltip está deshabilitado</InnerButton>\n  </Tooltip>",
            "<Tooltip label=\"Tooltip arriba\" position=\"top\">\n    <InnerButton color=\"primary\">Top</InnerButton>\n  </Tooltip>\n  <Tooltip label=\"Tooltip abajo\" position=\"bottom\">\n    <InnerButton color=\"secondary\">Bottom</InnerButton>\n  </Tooltip>\n  <Tooltip label=\"Tooltip izquierda\" position=\"left\">\n    <InnerButton color=\"destructive\">Left</InnerButton>\n  </Tooltip>\n  <Tooltip label=\"Tooltip derecha\" position=\"right\">\n    <InnerButton color=\"tertiary\">Right</InnerButton>\n  </Tooltip>"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "label": {
                "name": "label",
                "type": "React.ReactNode",
                "required": true,
                "description": "Contenido del tooltip"
              },
              "isVisible": {
                "name": "isVisible",
                "type": "boolean",
                "required": true,
                "description": "Si el tooltip está visible"
              },
              "position": {
                "name": "position",
                "type": "InlineTooltipPosition",
                "required": false,
                "description": "Posición del tooltip"
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clase adicional para el tooltip"
              }
            }
          }
        },
        {
          "name": "TruncatedWithTooltip",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "El componente Tooltip permite mostrar información contextual cuando el usuario hace hover sobre un elemento. Soporta múltiples posiciones, colores y configuraciones.",
            "jsdoc": "Con `text-overflow: ellipsis`, en Chromium/WebKit suele cumplirse `scrollWidth === clientWidth`\naunque el texto esté recortado; el tooltip quedaría deshabilitado si solo usáramos esa comparación.\n/\nfunction isTextTruncatedInElement(el: HTMLElement): boolean {\n  if (el.scrollWidth > el.clientWidth) {\n    return true;\n  }\n  const text = el.textContent ?? '';\n  if (!text.trim()) {\n    return false;\n  }\n  const containerWidth = el.getBoundingClientRect().width;\n  if (containerWidth < 1) {\n    return false;\n  }\n  const style = window.getComputedStyle(el);\n  const clone = document.createElement('span');\n  clone.setAttribute('aria-hidden', 'true');\n  clone.style.position = 'absolute';\n  clone.style.visibility = 'hidden';\n  clone.style.whiteSpace = 'nowrap';\n  clone.style.top = '0';\n  clone.style.",
            "confidence": "high"
          },
          "examples": [
            "import { Tooltip } from '@/modules/Tooltip';\n\n  export default function Example() {\n    return (\n      <Tooltip label=\"Este es un tooltip básico\">\n        <InnerButton color=\"primary\">Hover me</InnerButton>\n      </Tooltip>\n    )\n  }",
            "import { Tooltip } from '@/modules/Tooltip';\n\nexport default function Example() {\n  return (\n    <Tooltip label=\"Este es un tooltip básico\">\n      <InnerButton color=\"primary\">Hover me</InnerButton>\n    </Tooltip>\n  )\n}",
            "<Tooltip label=\"Este tooltip aparece después de 500ms\" delay={500}>\n    <InnerButton color=\"secondary\">Hover me (delay 500ms)</InnerButton>\n  </Tooltip>",
            "<Tooltip label=\"No deberías ver este tooltip\" disabled={true}>\n    <InnerButton color=\"neutral\">Este tooltip está deshabilitado</InnerButton>\n  </Tooltip>",
            "<Tooltip label=\"Tooltip arriba\" position=\"top\">\n    <InnerButton color=\"primary\">Top</InnerButton>\n  </Tooltip>\n  <Tooltip label=\"Tooltip abajo\" position=\"bottom\">\n    <InnerButton color=\"secondary\">Bottom</InnerButton>\n  </Tooltip>\n  <Tooltip label=\"Tooltip izquierda\" position=\"left\">\n    <InnerButton color=\"destructive\">Left</InnerButton>\n  </Tooltip>\n  <Tooltip label=\"Tooltip derecha\" position=\"right\">\n    <InnerButton color=\"tertiary\">Right</InnerButton>\n  </Tooltip>"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "children": {
                "name": "children",
                "type": "React.ReactNode",
                "required": true,
                "description": "Contenido a mostrar (se trunca con ellipsis si no cabe)."
              },
              "title": {
                "name": "title",
                "type": "React.ReactNode",
                "required": false,
                "description": "Texto completo para el tooltip. Si no se pasa, se usa `children` solo cuando es string."
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clases CSS del span que contiene el texto truncado."
              },
              "maxVisibleChars": {
                "name": "maxVisibleChars",
                "type": "number",
                "required": false,
                "description": "Límite estricto de caracteres visibles (p. ej. ratings): se muestran como máximo `N`\n    caracteres y, si el texto es más largo, se añade `…` y el tooltip lleva el valor completo.\n    Requiere `title` o `children` en forma de `string`. Si es &gt; 0, anula el truncado por CSS\n    de esta instancia."
              },
              "textColor": {
                "name": "textColor",
                "type": "TextColor | (string & {})",
                "required": false,
                "description": "Color del texto visible (tokens `ui-text-` o color CSS arbitrario). Útil cuando el contenedor\n    no hereda el color del contenido (p. ej. celdas de tabla con truncado)."
              },
              "position": {
                "name": "position",
                "type": "'top' | 'bottom' | 'left' | 'right'",
                "required": false,
                "description": "Posición del tooltip (por defecto `top`)."
              },
              "truncate": {
                "name": "truncate",
                "type": "boolean",
                "required": false,
                "description": "Si es false, no se aplica truncado ni tooltip (solo se renderiza children con className)."
              },
              "showTooltipWhenTruncated": {
                "name": "showTooltipWhenTruncated",
                "type": "boolean",
                "required": false,
                "description": "Si es false, no se muestra tooltip al truncar (solo truncado). Por defecto true."
              }
            }
          }
        }
      ],
      "standaloneSnippet": "import React, { useState } from 'react';\n\nconst positionStyles: Record<string, React.CSSProperties> = {\n  top: {\n    bottom: '100%',\n    left: '50%',\n    transform: 'translateX(-50%)',\n    marginBottom: '4px',\n  },\n  bottom: {\n    top: '100%',\n    left: '50%',\n    transform: 'translateX(-50%)',\n    marginTop: '4px',\n  },\n  left: {\n    right: '100%',\n    top: '50%',\n    transform: 'translateY(-50%)',\n    marginRight: '4px',\n  },\n  right: {\n    left: '100%',\n    top: '50%',\n    transform: 'translateY(-50%)',\n    marginLeft: '4px',\n  },\n};\n\ninterface TooltipProps {\n  children: React.ReactNode;\n  content: React.ReactNode;\n  position?: 'top' | 'bottom' | 'left' | 'right';\n}\n\nexport function Tooltip({ children, content, position = 'top' }: TooltipProps) {\n  const [show, setShow] = useState(false);\n\n  return (\n    <div\n      style={{ position: 'relative', display: 'inline-block' }}\n      onMouseEnter={() => setShow(true)}\n      onMouseLeave={() => setShow(false)}\n    >\n      {children}\n      {show && (\n        <span\n          style={{\n            position: 'absolute',\n            whiteSpace: 'nowrap',\n            backgroundColor: 'rgb(48, 51, 54)',\n            color: 'rgb(255, 255, 255)',\n            borderRadius: '8px',\n            padding: '4px 2px',\n            fontSize: '12px',\n            pointerEvents: 'none',\n            zIndex: 9999,\n            ...positionStyles[position],\n          }}\n        >\n          {content}\n        </span>\n      )}\n    </div>\n  );\n}\n"
    },
    {
      "id": "Visual",
      "path": "src/modules/Visual",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Visual",
          "kind": "component",
          "description": {
            "primary": "jsdoc",
            "jsdoc": "Visual - Componente visual versátil (icono, imagen o avatar)\nComponente que renderiza diferentes tipos de contenido visual según el slot proporcionado:\niconos, imágenes (URL o base64), avatares o contenido personalizado.\nSoporta tooltips, estados de hover y fallbacks.",
            "confidence": "medium"
          },
          "examples": [
            "import { Visual } from '@/modules/Visual';\n\n  export default function Example() {\n    return <Visual tooltip=\"Editor\" slot=\"https://pc.net/img/terms/avatar.svg\" size='6xl' defaultSizeIcon={false} />\n  }",
            "import { Visual } from '@/modules/Visual';\nimport { faFolder, faCalendar, faEnvelope } from '@fortawesome/pro-duotone-svg-icons';\n\nexport default function DuotoneExample() {\n  return (\n    <>\n      <Visual\n        slot={faFolder}\n        size=\"xl\"\n        colorIconDuotonePrimary=\"brand\"\n        colorIconDuotoneSecondary=\"azure\"\n        opacityIconDuotonePrimary={1}\n        opacityIconDuotoneSecondary={0.4}\n      />\n      <Visual\n        slot={faCalendar}\n        size=\"xl\"\n        colorIconDuotonePrimary=\"success\"\n        colorIconDuotoneSecondary=\"green\"\n        opacityIconDuotonePrimary={1}\n        opacityIconDuotoneSecondary={0.4}\n      />\n    </>\n  );\n}",
            "import { Visual } from '@/modules/Visual';\n\n  export default function Example() {\n    return <Visual tooltip=\"Editor\" slot=\"https://pc.net/img/terms/avatar.svg\" size='6xl' defaultSizeIcon={false} />\n  }",
            "import { Visual } from '@/modules/Visual';\nimport { faFolder, faCalendar, faEnvelope } from '@fortawesome/pro-duotone-svg-icons';\n\nexport default function DuotoneExample() {\n  return (\n    <>\n      <Visual\n        slot={faFolder}\n        size=\"xl\"\n        colorIconDuotonePrimary=\"brand\"\n        colorIconDuotoneSecondary=\"azure\"\n        opacityIconDuotonePrimary={1}\n        opacityIconDuotoneSecondary={0.4}\n      />\n      <Visual\n        slot={faCalendar}\n        size=\"xl\"\n        colorIconDuotonePrimary=\"success\"\n        colorIconDuotoneSecondary=\"green\"\n        opacityIconDuotonePrimary={1}\n        opacityIconDuotoneSecondary={0.4}\n      />\n    </>\n  );\n}"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "slot": {
                "name": "slot",
                "type": "VisualSlotType",
                "required": false
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "colorIcon": {
                "name": "colorIcon",
                "type": "IconFontColor",
                "required": false
              },
              "size": {
                "name": "size",
                "type": "VisualSize | IconFontSize",
                "required": false,
                "description": "En iconos admite también tamaños tipográficos (`xl`). En avatar/imagen se usan tamaños visuales."
              },
              "defaultSizeIcon": {
                "name": "defaultSizeIcon",
                "type": "boolean",
                "required": false
              },
              "strokeWidth": {
                "name": "strokeWidth",
                "type": "number",
                "required": false
              },
              "onClick": {
                "name": "onClick",
                "type": "(e: React.MouseEvent<HTMLDivElement>) => void",
                "required": false
              },
              "fallback": {
                "name": "fallback",
                "type": "string",
                "required": false
              },
              "colorIconDuotonePrimary": {
                "name": "colorIconDuotonePrimary",
                "type": "IconFontColor",
                "required": false
              },
              "colorIconDuotoneSecondary": {
                "name": "colorIconDuotoneSecondary",
                "type": "IconFontColor",
                "required": false
              },
              "opacityIconDuotonePrimary": {
                "name": "opacityIconDuotonePrimary",
                "type": "number",
                "required": false
              },
              "opacityIconDuotoneSecondary": {
                "name": "opacityIconDuotoneSecondary",
                "type": "number",
                "required": false
              },
              "tooltip": {
                "name": "tooltip",
                "type": "string",
                "required": false
              },
              "tooltipPosition": {
                "name": "tooltipPosition",
                "type": "TooltipPosition",
                "required": false
              },
              "tooltipAlignment": {
                "name": "tooltipAlignment",
                "type": "TooltipAlignment",
                "required": false
              },
              "tooltipColor": {
                "name": "tooltipColor",
                "type": "Colors | 'transparent'",
                "required": false
              },
              "tooltipDelay": {
                "name": "tooltipDelay",
                "type": "number",
                "required": false
              },
              "tooltipDisabled": {
                "name": "tooltipDisabled",
                "type": "boolean",
                "required": false
              }
            }
          }
        }
      ]
    },
    {
      "id": "Wysiwyg",
      "path": "src/modules/Wysiwyg",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "Wysiwyg",
          "kind": "component",
          "description": {
            "primary": "readme",
            "readme": "# Wysiwyg\n\nEditor de texto enriquecido (What You See Is What You Get) con soporte para formato de texto, listas, enlaces, emojis y adjuntos.\n\n## Características\n\n- ✏️ **Formato de texto**: Negrita, cursiva, subrayado, tachado\n- 📝 **Listas**: Ordenadas y sin orden\n- 🔗 **Enlaces**: Inserción de enlaces\n- 😊 **Emojis**: Integración completa con EmojiPicker\n- 📎 **Adjuntos**: Carga de archivos\n- 👤 **Menciones**: Sistema de menciones con @\n- 📏 **Altura personalizable**: Control de min/max height\n- 🎯 **Auto focus**: Opción de enfoque automático\n- ♿ **Accesible**: Totalmente accesible con teclado\n\n## Uso Básico\n\n```tsx\nimport { Wysiwyg } from '@/modules/Wysiwyg';\n\nfunction MiComponente() {\n  const [content, setContent] = useState('');\n\n  return (\n    <Wysiwyg\n      onChange={(html) => setContent(html)}\n      onSubmit={() => console.log('Enviando:', content)}\n    />\n  );\n}\n```\n\n## Props\n\n### WysiwygProps\n\n| Prop               | Tipo                        | Default                      | Descripción                           |\n| ------------------ | --------------------------- | ---------------------------- | ------------------------------------- |\n| `value`            | `string`                    | `undefined`                  | Valor controlado del contenido HTML   |\n| `defaultValue`     | `string`                    | `''`                         | Valor por defecto del contenido HTML  |\n| `onChange`         | `(html: string) => void`    | `undefined`                  | Callback cuando el contenido cambia   |\n| `placeholder`      | `string`                    | `'Escribe un mensaje nuevo'` | Placeholder del editor                |\n| `disabled`         | `boolean`                   | `false`                      | Deshabilitar el editor                |\n| `showToolbar`      | `boolean`                   | `true`                       | Mostrar toolbar de formato            |\n| `allowAttachments` | `boolean`                   | `true`                       | Permitir",
            "confidence": "low"
          },
          "examples": [
            "const [content, setContent] = useState('')\n\n<Wysiwyg\n  onChange={(html) => setContent(html)}\n  onSubmit={() => console.log('Enviando:', content)}\n/>",
            "<Wysiwyg\n  defaultValue=\"<p>Este es un <strong>mensaje inicial</strong> con <em>formato</em>.</p>\"\n  onSubmit={() => alert('Mensaje enviado!')}\n/>",
            "<Wysiwyg\n  defaultValue=\"<p>Contenido no editable</p>\"\n  disabled={true}\n/>",
            "<Wysiwyg\n  showToolbar={false}\n  placeholder=\"Escribe un mensaje simple...\"\n  onSubmit={() => alert('Enviado!')}\n/>",
            "// Editor pequeño\n<Wysiwyg\n  minHeight={40}\n  maxHeight={150}\n/>\n\n// Editor grande\n<Wysiwyg\n  minHeight={150}\n  maxHeight={500}\n/>"
          ],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "value": {
                "name": "value",
                "type": "string",
                "required": false,
                "description": "Valor del contenido HTML"
              },
              "defaultValue": {
                "name": "defaultValue",
                "type": "string",
                "required": false,
                "description": "Valor por defecto"
              },
              "onChange": {
                "name": "onChange",
                "type": "(html: string) => void",
                "required": false,
                "description": "Callback cuando el contenido cambia"
              },
              "placeholder": {
                "name": "placeholder",
                "type": "string",
                "required": false,
                "description": "Placeholder del editor"
              },
              "disabled": {
                "name": "disabled",
                "type": "boolean",
                "required": false,
                "description": "Deshabilitar el editor"
              },
              "showToolbar": {
                "name": "showToolbar",
                "type": "boolean",
                "required": false,
                "description": "Mostrar toolbar de formato"
              },
              "allowAttachments": {
                "name": "allowAttachments",
                "type": "boolean",
                "required": false,
                "description": "Permitir adjuntar archivos"
              },
              "onAttachment": {
                "name": "onAttachment",
                "type": "(file: File) => void",
                "required": false,
                "description": "Callback cuando se adjunta un archivo"
              },
              "allowMentions": {
                "name": "allowMentions",
                "type": "boolean",
                "required": false,
                "description": "Permitir menciones"
              },
              "onMention": {
                "name": "onMention",
                "type": "(mention: string) => void",
                "required": false,
                "description": "Callback cuando se menciona a alguien"
              },
              "showSubmitButton": {
                "name": "showSubmitButton",
                "type": "boolean",
                "required": false,
                "description": "Mostrar botón de enviar"
              },
              "onSubmit": {
                "name": "onSubmit",
                "type": "() => void",
                "required": false,
                "description": "Callback al enviar"
              },
              "submitButtonText": {
                "name": "submitButtonText",
                "type": "string",
                "required": false,
                "description": "Texto del botón de enviar"
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false,
                "description": "Clase CSS personalizada"
              },
              "autoFocus": {
                "name": "autoFocus",
                "type": "boolean",
                "required": false,
                "description": "Auto focus"
              },
              "minHeight": {
                "name": "minHeight",
                "type": "number",
                "required": false,
                "description": "Altura mínima del editor"
              },
              "maxHeight": {
                "name": "maxHeight",
                "type": "number",
                "required": false,
                "description": "Altura máxima del editor"
              }
            }
          }
        }
      ]
    },
    {
      "id": "imj-calendar-timeline",
      "path": "src/modules/imj-calendar-timeline",
      "legacy": false,
      "compositionType": 1,
      "exports": [
        {
          "name": "TimelineMarkers",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "## Timeline (Calendar Timeline)\n\nLínea de tiempo tipo calendario con grupos, ítems arrastrables y redimensionables, marcadores y cabeceras personalizables.\n\n### Props principales\n- **groups** / **items**: datos de filas e ítems (cada ítem tiene \\",
            "confidence": "medium"
          },
          "examples": []
        },
        {
          "name": "TodayMarker",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "## Timeline (Calendar Timeline)\n\nLínea de tiempo tipo calendario con grupos, ítems arrastrables y redimensionables, marcadores y cabeceras personalizables.\n\n### Props principales\n- **groups** / **items**: datos de filas e ítems (cada ítem tiene \\",
            "jsdoc": "Marker that is placed based on current date.  This component updates itself on\na set interval, dictated by the 'interval' prop.",
            "confidence": "high"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "getLeftOffsetFromDate": {
                "name": "getLeftOffsetFromDate",
                "type": "(date: number) => number",
                "required": true
              },
              "renderer": {
                "name": "renderer",
                "type": "MarkerRendererType",
                "required": true
              },
              "interval": {
                "name": "interval",
                "type": "number",
                "required": true
              }
            }
          }
        },
        {
          "name": "CustomMarker",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "## Timeline (Calendar Timeline)\n\nLínea de tiempo tipo calendario con grupos, ítems arrastrables y redimensionables, marcadores y cabeceras personalizables.\n\n### Props principales\n- **groups** / **items**: datos de filas e ítems (cada ítem tiene \\",
            "jsdoc": "CustomMarker that is placed based on passed in date prop",
            "confidence": "high"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "date": {
                "name": "date",
                "type": "number",
                "required": true
              },
              "getLeftOffsetFromDate": {
                "name": "getLeftOffsetFromDate",
                "type": "(date: number) => number",
                "required": true
              },
              "renderer": {
                "name": "renderer",
                "type": "MarkerRendererType",
                "required": true
              }
            }
          }
        },
        {
          "name": "CursorMarker",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "## Timeline (Calendar Timeline)\n\nLínea de tiempo tipo calendario con grupos, ítems arrastrables y redimensionables, marcadores y cabeceras personalizables.\n\n### Props principales\n- **groups** / **items**: datos de filas e ítems (cada ítem tiene \\",
            "jsdoc": "CursorMarker implementation subscribes to 'subscribeToCanvasMouseOver' on mount.\nThis subscription is passed in via MarkerCanvasConsumer, which is wired up to\nMarkerCanvasProvider in the MarkerCanvas component. When the user mouses over MarkerCanvas,\nthe callback registered in CursorMarker (this component) is passed:\n leftOffset - pixels from left edge of canvas, used to position this element\n date - the date the cursor pertains to\n isCursorOverCanvas - whether the user cursor is over the canvas. This is set to 'false'\n when the user mouseleaves the element",
            "confidence": "high"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "subscribeMarker": {
                "name": "subscribeMarker",
                "type": "(m: MarkerType) => SubscribeReturn",
                "required": true
              },
              "children": {
                "name": "children",
                "type": "MarkerRendererType",
                "required": true
              }
            }
          }
        },
        {
          "name": "TimelineHeaders",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "## Timeline (Calendar Timeline)\n\nLínea de tiempo tipo calendario con grupos, ítems arrastrables y redimensionables, marcadores y cabeceras personalizables.\n\n### Props principales\n- **groups** / **items**: datos de filas e ítems (cada ítem tiene \\",
            "confidence": "medium"
          },
          "examples": [],
          "props": {
            "groups": {
              "wrapper": {
                "props": {
                  "children": {
                    "name": "children",
                    "type": "ReactNode",
                    "required": false
                  },
                  "style": {
                    "name": "style",
                    "type": "CSSProperties",
                    "required": false
                  },
                  "className": {
                    "name": "className",
                    "type": "string",
                    "required": false
                  },
                  "calendarHeaderStyle": {
                    "name": "calendarHeaderStyle",
                    "type": "CSSProperties",
                    "required": false
                  },
                  "calendarHeaderClassName": {
                    "name": "calendarHeaderClassName",
                    "type": "string",
                    "required": false
                  }
                }
              }
            },
            "deprecatedRoot": [],
            "flat": {
              "registerScroll": {
                "name": "registerScroll",
                "type": "LegacyRef<HTMLDivElement>",
                "required": true
              },
              "leftSidebarWidth": {
                "name": "leftSidebarWidth",
                "type": "number",
                "required": true
              },
              "rightSidebarWidth": {
                "name": "rightSidebarWidth",
                "type": "number",
                "required": true
              },
              "style": {
                "name": "style",
                "type": "React.CSSProperties",
                "required": false
              },
              "children": {
                "name": "children",
                "type": "ReactNode",
                "required": false
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "calendarHeaderStyle": {
                "name": "calendarHeaderStyle",
                "type": "React.CSSProperties",
                "required": false
              },
              "calendarHeaderClassName": {
                "name": "calendarHeaderClassName",
                "type": "string",
                "required": false
              }
            }
          }
        },
        {
          "name": "SidebarHeader",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "## Timeline (Calendar Timeline)\n\nLínea de tiempo tipo calendario con grupos, ítems arrastrables y redimensionables, marcadores y cabeceras personalizables.\n\n### Props principales\n- **groups** / **items**: datos de filas e ítems (cada ítem tiene \\",
            "confidence": "medium"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "children": {
                "name": "children",
                "type": "React.ComponentType<{ getRootProps: GetRootProps",
                "required": true
              },
              "data": {
                "name": "data",
                "type": "unknown }>",
                "required": false
              },
              "rightSidebarWidth": {
                "name": "rightSidebarWidth",
                "type": "number",
                "required": false
              },
              "leftSidebarWidth": {
                "name": "leftSidebarWidth",
                "type": "number",
                "required": true
              },
              "variant": {
                "name": "variant",
                "type": "typeof LEFT_VARIANT | typeof RIGHT_VARIANT",
                "required": true
              },
              "headerData": {
                "name": "headerData",
                "type": "unknown",
                "required": false
              }
            }
          }
        },
        {
          "name": "CustomHeader",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "## Timeline (Calendar Timeline)\n\nLínea de tiempo tipo calendario con grupos, ítems arrastrables y redimensionables, marcadores y cabeceras personalizables.\n\n### Props principales\n- **groups** / **items**: datos de filas e ítems (cada ítem tiene \\",
            "confidence": "medium"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "children": {
                "name": "children",
                "type": "(p: CustomDateHeaderProps<Data>) => ReactNode",
                "required": true
              },
              "unit": {
                "name": "unit",
                "type": "keyof TimelineTimeSteps",
                "required": true
              },
              "timeSteps": {
                "name": "timeSteps",
                "type": "TimelineTimeSteps",
                "required": true
              },
              "visibleTimeStart": {
                "name": "visibleTimeStart",
                "type": "number",
                "required": true
              },
              "visibleTimeEnd": {
                "name": "visibleTimeEnd",
                "type": "number",
                "required": true
              },
              "canvasTimeStart": {
                "name": "canvasTimeStart",
                "type": "number",
                "required": true
              },
              "canvasTimeEnd": {
                "name": "canvasTimeEnd",
                "type": "number",
                "required": true
              },
              "canvasWidth": {
                "name": "canvasWidth",
                "type": "number",
                "required": true
              },
              "showPeriod": {
                "name": "showPeriod",
                "type": "(start: Dayjs, end: Dayjs) => void",
                "required": true
              },
              "headerData": {
                "name": "headerData",
                "type": "Data",
                "required": false
              },
              "getLeftOffsetFromDate": {
                "name": "getLeftOffsetFromDate",
                "type": "(date: number) => number",
                "required": true
              },
              "height": {
                "name": "height",
                "type": "number",
                "required": true
              },
              "timelineWidth": {
                "name": "timelineWidth",
                "type": "number",
                "required": true
              }
            }
          }
        },
        {
          "name": "DateHeader",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "## Timeline (Calendar Timeline)\n\nLínea de tiempo tipo calendario con grupos, ítems arrastrables y redimensionables, marcadores y cabeceras personalizables.\n\n### Props principales\n- **groups** / **items**: datos de filas e ítems (cada ítem tiene \\",
            "confidence": "medium"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "style": {
                "name": "style",
                "type": "CSSProperties",
                "required": false
              },
              "className": {
                "name": "className",
                "type": "string",
                "required": false
              },
              "unit": {
                "name": "unit",
                "type": "keyof TimelineTimeSteps | 'primaryHeader'",
                "required": false
              },
              "timelineUnit": {
                "name": "timelineUnit",
                "type": "SelectUnits",
                "required": true
              },
              "labelFormat": {
                "name": "labelFormat",
                "type": "| string",
                "required": false
              },
              "interval": {
                "name": "interval",
                "type": "[Dayjs, Dayjs], unit: UnitType | 'primaryHeader', labelWidth: number) => string)",
                "required": true
              },
              "intervalRenderer": {
                "name": "intervalRenderer",
                "type": "(props: IntervalRenderer<Data>) => ReactNode",
                "required": false
              },
              "headerData": {
                "name": "headerData",
                "type": "Data",
                "required": false
              },
              "children": {
                "name": "children",
                "type": "(props: SidebarHeaderChildrenFnProps<Data>) => ReactNode",
                "required": false
              },
              "height": {
                "name": "height",
                "type": "number",
                "required": false
              }
            }
          }
        },
        {
          "name": "GroupRow",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "## Timeline (Calendar Timeline)\n\nLínea de tiempo tipo calendario con grupos, ítems arrastrables y redimensionables, marcadores y cabeceras personalizables.\n\n### Props principales\n- **groups** / **items**: datos de filas e ítems (cada ítem tiene \\",
            "confidence": "medium"
          },
          "examples": [],
          "props": {
            "groups": {},
            "deprecatedRoot": [],
            "flat": {
              "onClick": {
                "name": "onClick",
                "type": "MouseEventHandler<HTMLDivElement>",
                "required": true
              },
              "onDoubleClick": {
                "name": "onDoubleClick",
                "type": "MouseEventHandler<HTMLDivElement>",
                "required": false
              },
              "onContextMenu": {
                "name": "onContextMenu",
                "type": "MouseEventHandler<HTMLDivElement>",
                "required": false
              },
              "isEvenRow": {
                "name": "isEvenRow",
                "type": "boolean",
                "required": false
              },
              "style": {
                "name": "style",
                "type": "React.CSSProperties",
                "required": false
              },
              "clickTolerance": {
                "name": "clickTolerance",
                "type": "number",
                "required": false
              },
              "group": {
                "name": "group",
                "type": "T",
                "required": true
              },
              "horizontalLineClassNamesForGroup": {
                "name": "horizontalLineClassNamesForGroup",
                "type": "(group: T) => string[]",
                "required": false
              }
            }
          }
        },
        {
          "name": "RowItems",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "## Timeline (Calendar Timeline)\n\nLínea de tiempo tipo calendario con grupos, ítems arrastrables y redimensionables, marcadores y cabeceras personalizables.\n\n### Props principales\n- **groups** / **items**: datos de filas e ítems (cada ítem tiene \\",
            "confidence": "medium"
          },
          "examples": []
        },
        {
          "name": "Timeline",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "## Timeline (Calendar Timeline)\n\nLínea de tiempo tipo calendario con grupos, ítems arrastrables y redimensionables, marcadores y cabeceras personalizables.\n\n### Props principales\n- **groups** / **items**: datos de filas e ítems (cada ítem tiene \\",
            "confidence": "medium"
          },
          "examples": []
        },
        {
          "name": "ReactCalendarTimeline",
          "kind": "component",
          "description": {
            "primary": "storybook",
            "storybook": "## Timeline (Calendar Timeline)\n\nLínea de tiempo tipo calendario con grupos, ítems arrastrables y redimensionables, marcadores y cabeceras personalizables.\n\n### Props principales\n- **groups** / **items**: datos de filas e ítems (cada ítem tiene \\",
            "confidence": "medium"
          },
          "examples": []
        }
      ]
    }
  ],
  "styleIndex": {
    "rules": [
      "ui-prefix",
      "typography-pairs",
      "cn-helper",
      "no-ui-typography-star",
      "orbit-tokens-ssot"
    ],
    "tailwindClasses": [
      {
        "class": "ui-bg-fill-brand",
        "cssVar": "--ui-color-bg-fill-brand-default",
        "category": "color"
      },
      {
        "class": "ui-text-primary",
        "cssVar": "--ui-color-text-primary-default",
        "category": "color"
      },
      {
        "class": "ui-p-16",
        "cssVar": "--ui-spacing-16",
        "category": "spacing"
      },
      {
        "class": "ui-rounded-md",
        "cssVar": "--ui-radius-md",
        "category": "radius"
      }
    ]
  },
  "changelogRetirements": [],
  "consumerChecklist": [
    {
      "id": "tailwind-prefix",
      "title": "Prefijo ui- en Tailwind",
      "body": "Usa clases con prefijo ui- (p. ej. ui-bg-fill-brand, ui-p-16). No utilidades sin prefijo del DS."
    },
    {
      "id": "typography-pairs",
      "title": "Pares tipografía",
      "body": "Combina ui-text-body-*-regular con ui-font-body-*-regular. No uses ui-typography-*."
    },
    {
      "id": "cn-helper",
      "title": "Composición de clases",
      "body": "Usa cn() desde el paquete para variantes; evita concatenación ad hoc."
    },
    {
      "id": "orbit-tokens",
      "title": "Tokens Orbit",
      "body": "No declares --ui-* ni theme.extend duplicado; consume @imj_media/orbit-tokens."
    },
    {
      "id": "grouped-props",
      "title": "Props agrupadas",
      "body": "En organismos extensos, agrupa por dominio (dropZone, constraints, list, events) y migra raíz deprecada gradualmente."
    },
    {
      "id": "composition-type-2",
      "title": "Composición (Modal, Accordion)",
      "body": "Módulos Tipo 2 se usan por piezas; consulta get_composition_recipe antes de aplanar la API."
    },
    {
      "id": "legacy-modules",
      "title": "Módulos legacy",
      "body": "LegacyButton, LegacyIcon y Message siguen exportados con legacy:true; evita en código nuevo."
    },
    {
      "id": "jsdoc-imports",
      "title": "Imports del paquete",
      "body": "Importa desde @imj_media/ui; usa import type para tipos. Revisa deprecations en get_deprecations."
    }
  ],
  "tokenPalette": {
    "colors": {
      "brand": {
        "default": "rgb(54, 89, 194)",
        "hover": "rgb(51, 82, 176)",
        "pressed": "rgb(46, 74, 161)"
      },
      "secondary": {
        "default": "rgb(240, 69, 69)",
        "hover": "rgb(212, 61, 61)",
        "pressed": "rgb(184, 51, 51)"
      },
      "tertiary": {
        "default": "rgb(33, 196, 94)",
        "hover": "rgb(31, 181, 87)",
        "pressed": "rgb(28, 163, 79)"
      },
      "destructive": {
        "default": "rgb(235, 179, 8)",
        "hover": "rgb(209, 158, 8)",
        "pressed": "rgb(181, 140, 5)"
      },
      "text": {
        "primary": "rgb(48, 51, 54)",
        "secondary": "rgb(89, 89, 94)",
        "disabled": "rgb(186, 189, 191)",
        "onFill": "rgb(255, 255, 255)"
      },
      "bg": {
        "canvas": "rgb(247, 247, 250)",
        "surface": "rgb(255, 255, 255)",
        "muted": "rgb(247, 247, 250)"
      },
      "border": {
        "default": "rgb(199, 199, 204)",
        "strong": "rgb(77, 79, 84)"
      },
      "status": {
        "success": "rgb(33, 196, 94)",
        "warning": "rgb(235, 179, 8)",
        "error": "rgb(240, 69, 69)",
        "info": "rgb(5, 181, 212)"
      }
    },
    "spacing": {
      "0": "0",
      "2": "2px",
      "4": "4px",
      "6": "6px",
      "8": "8px",
      "12": "12px",
      "16": "16px",
      "20": "20px",
      "24": "24px",
      "32": "32px",
      "40": "40px",
      "48": "48px",
      "64": "64px",
      "96": "96px"
    },
    "radius": {
      "sm": "8px",
      "md": "8px",
      "lg": "10px",
      "full": "9999px"
    },
    "fontSize": {
      "xs": "12px",
      "sm": "14px",
      "md": "16px",
      "lg": "18px",
      "xl": "20px"
    },
    "fontWeight": {
      "normal": "400",
      "medium": "500",
      "semibold": "600",
      "bold": "700"
    },
    "shadow": {
      "sm": "0 1px 2px 0 rgba(0, 0, 0, 0.1)",
      "md": "0 4px 8px -2px rgba(0, 0, 0, 0.2)",
      "lg": "0 16px 24px -8px rgba(0, 0, 0, 0.3)"
    }
  },
  "themeCssVars": {
    "light": {
      "--ui-color-white": "rgb(255, 255, 255)",
      "--ui-color-black": "rgb(0, 0, 0)",
      "--ui-color-red-50": "rgb(255, 242, 242)",
      "--ui-color-red-100": "rgb(252, 227, 227)",
      "--ui-color-red-200": "rgb(250, 189, 189)",
      "--ui-color-red-300": "rgb(245, 148, 148)",
      "--ui-color-red-400": "rgb(242, 107, 107)",
      "--ui-color-red-500": "rgb(240, 69, 69)",
      "--ui-color-red-600": "rgb(212, 61, 61)",
      "--ui-color-red-700": "rgb(184, 51, 51)",
      "--ui-color-red-800": "rgb(156, 43, 43)",
      "--ui-color-red-900": "rgb(128, 36, 36)",
      "--ui-color-orange-50": "rgb(255, 247, 242)",
      "--ui-color-orange-100": "rgb(252, 237, 227)",
      "--ui-color-orange-200": "rgb(252, 209, 176)",
      "--ui-color-orange-300": "rgb(250, 176, 125)",
      "--ui-color-orange-400": "rgb(250, 145, 74)",
      "--ui-color-orange-500": "rgb(250, 115, 23)",
      "--ui-color-orange-600": "rgb(219, 102, 20)",
      "--ui-color-orange-700": "rgb(189, 87, 18)",
      "--ui-color-orange-800": "rgb(158, 74, 13)",
      "--ui-color-orange-900": "rgb(128, 59, 10)",
      "--ui-color-yellow-50": "rgb(255, 250, 242)",
      "--ui-color-yellow-100": "rgb(252, 245, 227)",
      "--ui-color-yellow-200": "rgb(247, 230, 173)",
      "--ui-color-yellow-300": "rgb(242, 214, 117)",
      "--ui-color-yellow-400": "rgb(240, 196, 64)",
      "--ui-color-yellow-500": "rgb(235, 179, 8)",
      "--ui-color-yellow-600": "rgb(209, 158, 8)",
      "--ui-color-yellow-700": "rgb(181, 140, 5)",
      "--ui-color-yellow-800": "rgb(156, 120, 5)",
      "--ui-color-yellow-900": "rgb(128, 97, 5)",
      "--ui-color-lime-50": "rgb(250, 255, 242)",
      "--ui-color-lime-100": "rgb(242, 252, 227)",
      "--ui-color-lime-200": "rgb(214, 240, 176)",
      "--ui-color-lime-300": "rgb(186, 227, 125)",
      "--ui-color-lime-400": "rgb(161, 217, 74)",
      "--ui-color-lime-500": "rgb(133, 204, 23)",
      "--ui-color-lime-600": "rgb(120, 186, 20)",
      "--ui-color-lime-700": "rgb(107, 166, 18)",
      "--ui-color-lime-800": "rgb(97, 148, 15)",
      "--ui-color-lime-900": "rgb(84, 128, 13)",
      "--ui-color-green-50": "rgb(242, 255, 245)",
      "--ui-color-green-100": "rgb(227, 252, 237)",
      "--ui-color-green-200": "rgb(179, 240, 201)",
      "--ui-color-green-300": "rgb(130, 224, 166)",
      "--ui-color-green-400": "rgb(84, 212, 130)",
      "--ui-color-green-500": "rgb(33, 196, 94)",
      "--ui-color-green-600": "rgb(31, 181, 87)",
      "--ui-color-green-700": "rgb(28, 163, 79)",
      "--ui-color-green-800": "rgb(26, 145, 69)",
      "--ui-color-green-900": "rgb(23, 128, 61)",
      "--ui-color-cyan-50": "rgb(242, 252, 255)",
      "--ui-color-cyan-100": "rgb(227, 250, 252)",
      "--ui-color-cyan-200": "rgb(171, 232, 242)",
      "--ui-color-cyan-300": "rgb(117, 217, 232)",
      "--ui-color-cyan-400": "rgb(61, 199, 222)",
      "--ui-color-cyan-500": "rgb(5, 181, 212)",
      "--ui-color-cyan-600": "rgb(5, 163, 191)",
      "--ui-color-cyan-700": "rgb(5, 145, 171)",
      "--ui-color-cyan-800": "rgb(5, 128, 148)",
      "--ui-color-cyan-900": "rgb(5, 110, 128)",
      "--ui-color-azure-50": "rgb(242, 250, 255)",
      "--ui-color-azure-100": "rgb(227, 245, 252)",
      "--ui-color-azure-200": "rgb(173, 224, 247)",
      "--ui-color-azure-300": "rgb(120, 204, 242)",
      "--ui-color-azure-400": "rgb(69, 186, 237)",
      "--ui-color-azure-500": "rgb(13, 166, 232)",
      "--ui-color-azure-600": "rgb(13, 148, 207)",
      "--ui-color-azure-700": "rgb(10, 128, 181)",
      "--ui-color-azure-800": "rgb(10, 110, 156)",
      "--ui-color-azure-900": "rgb(8, 89, 128)",
      "--ui-color-blue-50": "rgb(242, 245, 255)",
      "--ui-color-blue-100": "rgb(227, 232, 252)",
      "--ui-color-blue-200": "rgb(184, 196, 237)",
      "--ui-color-blue-300": "rgb(140, 161, 222)",
      "--ui-color-blue-400": "rgb(97, 125, 209)",
      "--ui-color-blue-500": "rgb(54, 89, 194)",
      "--ui-color-blue-600": "rgb(51, 82, 176)",
      "--ui-color-blue-700": "rgb(46, 74, 161)",
      "--ui-color-blue-800": "rgb(41, 66, 145)",
      "--ui-color-blue-900": "rgb(36, 59, 128)",
      "--ui-color-violet-50": "rgb(245, 242, 255)",
      "--ui-color-violet-100": "rgb(237, 227, 252)",
      "--ui-color-violet-200": "rgb(209, 186, 250)",
      "--ui-color-violet-300": "rgb(181, 143, 245)",
      "--ui-color-violet-400": "rgb(153, 102, 242)",
      "--ui-color-violet-500": "rgb(125, 59, 237)",
      "--ui-color-violet-600": "rgb(110, 51, 209)",
      "--ui-color-violet-700": "rgb(97, 46, 184)",
      "--ui-color-violet-800": "rgb(82, 38, 156)",
      "--ui-color-violet-900": "rgb(66, 31, 128)",
      "--ui-color-magenta-50": "rgb(255, 242, 247)",
      "--ui-color-magenta-100": "rgb(252, 227, 240)",
      "--ui-color-magenta-200": "rgb(247, 184, 214)",
      "--ui-color-magenta-300": "rgb(245, 140, 186)",
      "--ui-color-magenta-400": "rgb(240, 94, 161)",
      "--ui-color-magenta-500": "rgb(235, 51, 135)",
      "--ui-color-magenta-600": "rgb(209, 46, 120)",
      "--ui-color-magenta-700": "rgb(181, 41, 105)",
      "--ui-color-magenta-800": "rgb(156, 33, 89)",
      "--ui-color-magenta-900": "rgb(128, 28, 74)",
      "--ui-color-rose-50": "rgb(255, 242, 245)",
      "--ui-color-rose-100": "rgb(252, 227, 232)",
      "--ui-color-rose-200": "rgb(245, 179, 194)",
      "--ui-color-rose-300": "rgb(240, 128, 153)",
      "--ui-color-rose-400": "rgb(232, 79, 112)",
      "--ui-color-rose-500": "rgb(224, 28, 71)",
      "--ui-color-rose-600": "rgb(201, 26, 64)",
      "--ui-color-rose-700": "rgb(176, 23, 56)",
      "--ui-color-rose-800": "rgb(153, 20, 48)",
      "--ui-color-rose-900": "rgb(128, 15, 41)",
      "--ui-color-light-gray-50": "rgb(247, 247, 250)",
      "--ui-color-light-gray-100": "rgb(240, 242, 242)",
      "--ui-color-light-gray-200": "rgb(224, 227, 230)",
      "--ui-color-light-gray-300": "rgb(212, 214, 217)",
      "--ui-color-light-gray-400": "rgb(199, 199, 204)",
      "--ui-color-light-gray-500": "rgb(186, 189, 191)",
      "--ui-color-light-gray-600": "rgb(171, 173, 179)",
      "--ui-color-light-gray-700": "rgb(158, 163, 166)",
      "--ui-color-light-gray-800": "rgb(145, 148, 153)",
      "--ui-color-light-gray-900": "rgb(133, 135, 140)",
      "--ui-color-dark-gray-50": "rgb(120, 122, 128)",
      "--ui-color-dark-gray-100": "rgb(107, 110, 115)",
      "--ui-color-dark-gray-200": "rgb(97, 99, 105)",
      "--ui-color-dark-gray-300": "rgb(89, 89, 94)",
      "--ui-color-dark-gray-400": "rgb(77, 79, 84)",
      "--ui-color-dark-gray-500": "rgb(69, 69, 74)",
      "--ui-color-dark-gray-600": "rgb(59, 61, 64)",
      "--ui-color-dark-gray-700": "rgb(48, 51, 54)",
      "--ui-color-dark-gray-800": "rgb(38, 41, 43)",
      "--ui-color-dark-gray-900": "rgb(31, 31, 33)",
      "--ui-color-black-alpha-transparent": "rgba(0, 0, 0, 0)",
      "--ui-color-black-alpha-5": "rgba(0, 0, 0, 0.05)",
      "--ui-color-black-alpha-10": "rgba(0, 0, 0, 0.1)",
      "--ui-color-black-alpha-20": "rgba(0, 0, 0, 0.2)",
      "--ui-color-black-alpha-30": "rgba(0, 0, 0, 0.3)",
      "--ui-color-black-alpha-40": "rgba(0, 0, 0, 0.4)",
      "--ui-color-black-alpha-50": "rgba(0, 0, 0, 0.5)",
      "--ui-color-black-alpha-60": "rgba(0, 0, 0, 0.6)",
      "--ui-color-black-alpha-70": "rgba(0, 0, 0, 0.7)",
      "--ui-color-black-alpha-80": "rgba(0, 0, 0, 0.8)",
      "--ui-color-black-alpha-90": "rgba(0, 0, 0, 0.9)",
      "--ui-positive-Value_0": "0",
      "--ui-positive-Value_12": "0.66px",
      "--ui-positive-Value_25": "1px",
      "--ui-positive-Value_50": "2px",
      "--ui-positive-Value_100": "4px",
      "--ui-positive-Value_150": "6px",
      "--ui-positive-Value_200": "8px",
      "--ui-positive-Value_250": "10px",
      "--ui-positive-Value_275": "11px",
      "--ui-positive-Value_300": "12px",
      "--ui-positive-Value_325": "13px",
      "--ui-positive-Value_350": "14px",
      "--ui-positive-Value_400": "16px",
      "--ui-positive-Value_450": "18px",
      "--ui-positive-Value_500": "20px",
      "--ui-positive-Value_600": "24px",
      "--ui-positive-Value_700": "28px",
      "--ui-positive-Value_750": "30px",
      "--ui-positive-Value_800": "32px",
      "--ui-positive-Value_900": "36px",
      "--ui-positive-Value_1000": "40px",
      "--ui-positive-Value_1200": "48px",
      "--ui-positive-Value_1400": "56px",
      "--ui-positive-Value_1600": "64px",
      "--ui-positive-Value_2000": "80px",
      "--ui-positive-Value_2400": "96px",
      "--ui-positive-Value_2800": "112px",
      "--ui-positive-Value_3200": "128px",
      "--ui-positive-Value_full": "9999px",
      "--ui-negative-Value_0": "0",
      "--ui-negative-Value_12": "-0.66px",
      "--ui-negative-Value_25": "-1px",
      "--ui-negative-Value_50": "-2px",
      "--ui-negative-Value_100": "-4px",
      "--ui-negative-Value_150": "-6px",
      "--ui-negative-Value_200": "-8px",
      "--ui-negative-Value_250": "-10px",
      "--ui-negative-Value_275": "-11px",
      "--ui-negative-Value_300": "-12px",
      "--ui-negative-Value_325": "-13px",
      "--ui-negative-Value_350": "-14px",
      "--ui-negative-Value_400": "-16px",
      "--ui-negative-Value_450": "-18px",
      "--ui-negative-Value_500": "-20px",
      "--ui-negative-Value_600": "-24px",
      "--ui-negative-Value_700": "-28px",
      "--ui-negative-Value_750": "-30px",
      "--ui-negative-Value_800": "-32px",
      "--ui-negative-Value_900": "-36px",
      "--ui-negative-Value_1000": "-40px",
      "--ui-negative-Value_1200": "-48px",
      "--ui-negative-Value_1400": "-56px",
      "--ui-negative-Value_1600": "-64px",
      "--ui-negative-Value_2000": "-80px",
      "--ui-negative-Value_2400": "-96px",
      "--ui-negative-Value_2800": "-112px",
      "--ui-negative-Value_3200": "-128px",
      "--ui-negative-Value_full": "-9999px",
      "--ui-font-family-ui": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-font-family-mono": "'IBM Plex Mono'",
      "--ui-font-lh-10-tight": "12px",
      "--ui-font-lh-10-snug": "12.5px",
      "--ui-font-lh-10-normal": "14.5px",
      "--ui-font-lh-10-relaxed": "16px",
      "--ui-font-track-tight": "0.5px",
      "--ui-font-track-normal": "0",
      "--ui-font-track-wide": "2px",
      "--ui-font-weight-regular": "400",
      "--ui-font-weight-medium": "500",
      "--ui-font-weight-semibold": "600",
      "--ui-font-weight-bold": "700",
      "--ui-font-lh-12-tight": "14.5px",
      "--ui-font-lh-12-snug": "15px",
      "--ui-font-lh-12-normal": "17.5px",
      "--ui-font-lh-12-relaxed": "19px",
      "--ui-font-lh-14-tight": "17px",
      "--ui-font-lh-14-snug": "17.5px",
      "--ui-font-lh-14-normal": "20.5px",
      "--ui-font-lh-14-relaxed": "22.5px",
      "--ui-font-lh-16-tight": "19.5px",
      "--ui-font-lh-16-snug": "20px",
      "--ui-font-lh-16-normal": "23px",
      "--ui-font-lh-16-relaxed": "25.5px",
      "--ui-font-lh-18-tight": "22px",
      "--ui-font-lh-18-snug": "22.5px",
      "--ui-font-lh-18-normal": "26px",
      "--ui-font-lh-18-relaxed": "29px",
      "--ui-font-lh-20-tight": "24px",
      "--ui-font-lh-20-snug": "25px",
      "--ui-font-lh-20-normal": "29px",
      "--ui-font-lh-20-relaxed": "32px",
      "--ui-font-lh-24-tight": "29px",
      "--ui-font-lh-24-snug": "30px",
      "--ui-font-lh-24-normal": "35px",
      "--ui-font-lh-24-relaxed": "38.5px",
      "--ui-font-lh-30-tight": "36.5px",
      "--ui-font-lh-30-snug": "37.5px",
      "--ui-font-lh-30-normal": "43.5px",
      "--ui-font-lh-30-relaxed": "48px",
      "--ui-font-lh-36-tight": "43.5px",
      "--ui-font-lh-36-snug": "45px",
      "--ui-font-lh-36-normal": "52px",
      "--ui-font-lh-36-relaxed": "57.5px",
      "--ui-font-lh-48-tight": "58px",
      "--ui-font-lh-48-snug": "60px",
      "--ui-font-lh-48-normal": "69.5px",
      "--ui-font-lh-48-relaxed": "77px",
      "--ui-style-solid": "'solid'",
      "--ui-style-dashed": "'dashed'",
      "--ui-shadow-none-x": "0",
      "--ui-shadow-none-y": "0",
      "--ui-shadow-none-blur": "0",
      "--ui-shadow-none-Spread": "0",
      "--ui-shadow-none-Color": "rgba(0, 0, 0, 0)",
      "--ui-shadow-01-x": "0",
      "--ui-shadow-01-y": "1px",
      "--ui-shadow-01-blur": "2px",
      "--ui-shadow-01-Spread": "0",
      "--ui-shadow-02-x": "0",
      "--ui-shadow-02-y": "2px",
      "--ui-shadow-02-blur": "4px",
      "--ui-shadow-02-Spread": "-1px",
      "--ui-shadow-03-x": "0",
      "--ui-shadow-03-y": "4px",
      "--ui-shadow-03-blur": "8px",
      "--ui-shadow-03-Spread": "-2px",
      "--ui-shadow-04-x": "0",
      "--ui-shadow-04-y": "8px",
      "--ui-shadow-04-blur": "16px",
      "--ui-shadow-04-Spread": "-4px",
      "--ui-shadow-05-x": "0",
      "--ui-shadow-05-y": "16px",
      "--ui-shadow-05-blur": "24px",
      "--ui-shadow-05-Spread": "-8px",
      "--ui-shadow-x": "0",
      "--ui-z-hide": "-1px",
      "--ui-z-base": "0",
      "--ui-z-raised": "100px",
      "--ui-z-sticky": "200px",
      "--ui-z-shell": "300px",
      "--ui-z-dropdown": "400px",
      "--ui-z-popover": "500px",
      "--ui-z-tooltip": "600px",
      "--ui-z-modalBackdrop": "690px",
      "--ui-z-modal": "700px",
      "--ui-z-toast": "800px",
      "--ui-z-overlay": "900px",
      "--ui-z-max": "99999",
      "--ui-font-size-2xs": "10px",
      "--ui-font-size-xs": "12px",
      "--ui-font-size-sm": "14px",
      "--ui-font-size-md": "16px",
      "--ui-font-size-lg": "18px",
      "--ui-font-size-xl": "20px",
      "--ui-font-size-2xl": "24px",
      "--ui-font-size-3xl": "30px",
      "--ui-font-size-4xl": "36px",
      "--ui-font-size-5xl": "48px",
      "--ui-type-heading-h1-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-heading-h1-size": "36px",
      "--ui-type-heading-h1-weight": "600",
      "--ui-type-heading-h1-ih": "45px",
      "--ui-type-heading-h1-tracking": "0.5px",
      "--ui-type-heading-h2-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-heading-h2-size": "30px",
      "--ui-type-heading-h2-weight": "600",
      "--ui-type-heading-h2-ih": "37.5px",
      "--ui-type-heading-h2-tracking": "0.5px",
      "--ui-type-heading-h3-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-heading-h3-size": "20px",
      "--ui-type-heading-h3-weight": "600",
      "--ui-type-heading-h3-ih": "25px",
      "--ui-type-heading-h3-tracking": "0",
      "--ui-type-body-lg-Regular-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-caption-xs-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-caption-xs-size": "10px",
      "--ui-type-caption-xs-weight": "400",
      "--ui-type-caption-xs-ih": "14.5px",
      "--ui-type-caption-xs-tracking": "2px",
      "--ui-type-caption-md-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-caption-md-size": "12px",
      "--ui-type-caption-md-weight": "400",
      "--ui-type-caption-md-ih": "17.5px",
      "--ui-type-caption-md-tracking": "2px",
      "--ui-type-body-lg-Regular-size": "18px",
      "--ui-type-body-lg-Regular-weight": "400",
      "--ui-type-body-lg-Regular-ih": "26px",
      "--ui-type-body-lg-Regular-tracking": "0.5px",
      "--ui-type-body-md-Regular-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-md-Regular-size": "16px",
      "--ui-type-body-md-Regular-weight": "400",
      "--ui-type-body-md-Regular-ih": "23px",
      "--ui-type-body-md-Regular-tracking": "0.5px",
      "--ui-type-body-sm-Regular-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-sm-Regular-size": "14px",
      "--ui-type-body-sm-Regular-weight": "400",
      "--ui-type-body-sm-Regular-ih": "20.5px",
      "--ui-type-body-sm-Regular-tracking": "0.5px",
      "--ui-type-label-md-Regular-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-label-md-Regular-size": "14px",
      "--ui-type-label-md-Regular-weight": "400",
      "--ui-type-label-md-Regular-ih": "20.5px",
      "--ui-type-label-md-Regular-tracking": "0.5px",
      "--ui-type-code-md-family": "'IBM Plex Mono'",
      "--ui-type-code-md-size": "14px",
      "--ui-type-code-md-weight": "400",
      "--ui-type-code-md-ih": "14.5px",
      "--ui-type-code-md-tracking": "0",
      "--ui-type-heading-h4-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-heading-h4-size": "18px",
      "--ui-type-heading-h4-weight": "600",
      "--ui-type-heading-h4-ih": "25px",
      "--ui-type-heading-h4-tracking": "0",
      "--ui-type-heading-h5-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-heading-h5-size": "16px",
      "--ui-type-heading-h5-weight": "600",
      "--ui-type-heading-h5-ih": "25px",
      "--ui-type-heading-h5-tracking": "0",
      "--ui-type-heading-h6-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-heading-h6-size": "14px",
      "--ui-type-heading-h6-weight": "600",
      "--ui-type-heading-h6-ih": "25px",
      "--ui-type-heading-h6-tracking": "0",
      "--ui-type-body-lg-Medium-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-lg-Medium-size": "18px",
      "--ui-type-body-lg-Medium-weight": "500",
      "--ui-type-body-lg-Medium-ih": "26px",
      "--ui-type-body-lg-Medium-tracking": "0.5px",
      "--ui-type-body-lg-Semibold-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-lg-Semibold-size": "18px",
      "--ui-type-body-lg-Semibold-weight": "600",
      "--ui-type-body-lg-Semibold-ih": "26px",
      "--ui-type-body-lg-Semibold-tracking": "0.5px",
      "--ui-type-body-lg-Bold-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-lg-Bold-size": "18px",
      "--ui-type-body-lg-Bold-weight": "700",
      "--ui-type-body-lg-Bold-ih": "26px",
      "--ui-type-body-lg-Bold-tracking": "0.5px",
      "--ui-type-body-md-Medium-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-md-Medium-size": "16px",
      "--ui-type-body-md-Medium-weight": "500",
      "--ui-type-body-md-Medium-ih": "23px",
      "--ui-type-body-md-Medium-tracking": "0.5px",
      "--ui-type-body-md-Semibold-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-md-Semibold-size": "16px",
      "--ui-type-body-md-Semibold-weight": "600",
      "--ui-type-body-md-Semibold-ih": "23px",
      "--ui-type-body-md-Semibold-tracking": "0.5px",
      "--ui-type-body-sm-Medium-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-sm-Medium-size": "14px",
      "--ui-type-body-sm-Medium-weight": "500",
      "--ui-type-body-sm-Medium-ih": "20.5px",
      "--ui-type-body-sm-Medium-tracking": "0.5px",
      "--ui-type-body-sm-Semibold-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-sm-Semibold-size": "14px",
      "--ui-type-body-sm-Semibold-weight": "600",
      "--ui-type-body-sm-Semibold-ih": "20.5px",
      "--ui-type-body-sm-Semibold-tracking": "0.5px",
      "--ui-type-body-sm-Bold-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-sm-Bold-size": "14px",
      "--ui-type-body-sm-Bold-weight": "700",
      "--ui-type-body-sm-Bold-ih": "20.5px",
      "--ui-type-body-sm-Bold-tracking": "0.5px",
      "--ui-type-label-md-Medium-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-label-md-Medium-size": "14px",
      "--ui-type-label-md-Medium-weight": "500",
      "--ui-type-label-md-Medium-ih": "20.5px",
      "--ui-type-label-md-Medium-tracking": "0.5px",
      "--ui-type-label-md-Semibold-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-label-md-Semibold-size": "14px",
      "--ui-type-label-md-Semibold-weight": "600",
      "--ui-type-label-md-Semibold-ih": "20.5px",
      "--ui-type-label-md-Semibold-tracking": "0.5px",
      "--ui-type-label-md-Bold-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-label-md-Bold-size": "14px",
      "--ui-type-label-md-Bold-weight": "700",
      "--ui-type-label-md-Bold-ih": "20.5px",
      "--ui-type-label-md-Bold-tracking": "0.5px",
      "--ui-type-body-md-Bold-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-md-Bold-size": "16px",
      "--ui-type-body-md-Bold-weight": "700",
      "--ui-type-body-md-Bold-ih": "23px",
      "--ui-type-body-md-Bold-tracking": "0.5px",
      "--ui-type-body-xs-Regular-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-xs-Regular-size": "12px",
      "--ui-type-body-xs-Regular-weight": "400",
      "--ui-type-body-xs-Regular-ih": "17.5px",
      "--ui-type-body-xs-Regular-tracking": "0.5px",
      "--ui-type-body-xs-Medium-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-xs-Medium-size": "12px",
      "--ui-type-body-xs-Medium-weight": "500",
      "--ui-type-body-xs-Medium-ih": "17.5px",
      "--ui-type-body-xs-Medium-tracking": "0.5px",
      "--ui-type-body-xs-Semibold-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-xs-Semibold-size": "12px",
      "--ui-type-body-xs-Semibold-weight": "600",
      "--ui-type-body-xs-Semibold-ih": "17.5px",
      "--ui-type-body-xs-Semibold-tracking": "0.5px",
      "--ui-type-body-xs-Bold-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-xs-Bold-size": "12px",
      "--ui-type-body-xs-Bold-weight": "700",
      "--ui-type-body-xs-Bold-ih": "17.5px",
      "--ui-type-body-xs-Bold-tracking": "0.5px",
      "--ui-color-bg-canvas-default": "rgb(247, 247, 250)",
      "--ui-color-bg-canvas-inverse": "rgb(31, 31, 33)",
      "--ui-color-bg-overlay-default": "rgba(0, 0, 0, 0.4)",
      "--ui-color-bg-overlay-darker": "rgba(0, 0, 0, 0.7)",
      "--ui-color-text-primary": "rgb(48, 51, 54)",
      "--ui-color-text-secondary": "rgb(89, 89, 94)",
      "--ui-color-icon-default": "rgb(77, 79, 84)",
      "--ui-color-text-tertiary": "rgb(107, 110, 115)",
      "--ui-color-icon-hover": "rgb(59, 61, 64)",
      "--ui-color-icon-pressed": "rgb(38, 41, 43)",
      "--ui-color-text-disabled": "rgb(186, 189, 191)",
      "--ui-color-icon-selected": "rgb(51, 82, 176)",
      "--ui-color-icon-secondary-default": "rgb(97, 99, 105)",
      "--ui-color-icon-secondary-hover": "rgb(89, 89, 94)",
      "--ui-color-icon-secondary-pressed": "rgb(69, 69, 74)",
      "--ui-color-icon-secondary-selected": "rgb(77, 79, 84)",
      "--ui-color-icon-tertiary-default": "rgb(145, 148, 153)",
      "--ui-color-icon-tertiary-hover": "rgb(133, 135, 140)",
      "--ui-color-icon-tertiary-pressed": "rgb(107, 110, 115)",
      "--ui-color-icon-tertiary-selected": "rgb(120, 122, 128)",
      "--ui-color-icon-brand-default": "rgb(97, 125, 209)",
      "--ui-color-icon-brand-hover": "rgb(54, 89, 194)",
      "--ui-color-icon-brand-pressed": "rgb(51, 82, 176)",
      "--ui-color-icon-brand-selected": "rgb(51, 82, 176)",
      "--ui-color-icon-success-default": "rgb(28, 163, 79)",
      "--ui-color-icon-success-hover": "rgb(26, 145, 69)",
      "--ui-color-icon-success-pressed": "rgb(23, 128, 61)",
      "--ui-color-icon-success-selected": "rgb(23, 128, 61)",
      "--ui-color-icon-warning-default": "rgb(181, 140, 5)",
      "--ui-color-icon-warning-hover": "rgb(156, 120, 5)",
      "--ui-color-icon-warning-pressed": "rgb(128, 97, 5)",
      "--ui-color-icon-warning-selected": "rgb(128, 97, 5)",
      "--ui-color-icon-danger-default": "rgb(184, 51, 51)",
      "--ui-color-icon-danger-hover": "rgb(156, 43, 43)",
      "--ui-color-icon-danger-pressed": "rgb(128, 36, 36)",
      "--ui-color-icon-danger-selected": "rgb(128, 36, 36)",
      "--ui-color-icon-info-default": "rgb(5, 145, 171)",
      "--ui-color-icon-all-colors-red": "rgb(240, 69, 69)",
      "--ui-color-icon-all-colors-orange": "rgb(250, 115, 23)",
      "--ui-color-icon-all-colors-yellow": "rgb(235, 179, 8)",
      "--ui-color-icon-all-colors-lime": "rgb(133, 204, 23)",
      "--ui-color-icon-all-colors-green": "rgb(33, 196, 94)",
      "--ui-color-icon-all-colors-cyan": "rgb(5, 181, 212)",
      "--ui-color-icon-all-colors-azure": "rgb(13, 166, 232)",
      "--ui-color-icon-all-colors-blue": "rgb(54, 89, 194)",
      "--ui-color-icon-all-colors-violet": "rgb(125, 59, 237)",
      "--ui-color-icon-all-colors-magenta": "rgb(235, 51, 135)",
      "--ui-color-icon-all-colors-rose": "rgb(224, 28, 71)",
      "--ui-color-icon-info-hover": "rgb(5, 128, 148)",
      "--ui-color-icon-info-pressed": "rgb(5, 110, 128)",
      "--ui-color-icon-info-selected": "rgb(5, 110, 128)",
      "--ui-color-icon-disabled": "rgb(186, 189, 191)",
      "--ui-color-icon-on-color": "rgb(255, 255, 255)",
      "--ui-color-border-default": "rgb(199, 199, 204)",
      "--ui-color-border-hover": "rgb(133, 135, 140)",
      "--ui-color-border-pressed": "rgb(69, 69, 74)",
      "--ui-color-border-focus": "rgb(97, 125, 209)",
      "--ui-color-border-disabled": "rgb(212, 214, 217)",
      "--ui-color-border-subtle": "rgb(212, 214, 217)",
      "--ui-color-border-on-color": "rgb(255, 255, 255)",
      "--ui-color-border-strong": "rgb(77, 79, 84)",
      "--ui-color-border-brand": "rgb(54, 89, 194)",
      "--ui-color-border-success": "rgb(33, 196, 94)",
      "--ui-color-border-warning": "rgb(235, 179, 8)",
      "--ui-color-border-danger": "rgb(240, 69, 69)",
      "--ui-color-border-info": "rgb(5, 181, 212)",
      "--ui-color-text-text-on-color": "rgb(255, 255, 255)",
      "--ui-color-bg-surface-default": "rgb(255, 255, 255)",
      "--ui-color-bg-surface-hover": "rgb(247, 247, 250)",
      "--ui-color-bg-surface-pressed": "rgb(224, 227, 230)",
      "--ui-color-bg-surface-selected": "rgb(240, 242, 242)",
      "--ui-color-bg-surface-dissabled": "rgb(247, 247, 250)",
      "--ui-color-bg-surface-secondary-default": "rgb(247, 247, 250)",
      "--ui-color-bg-surface-secondary-hover": "rgb(240, 242, 242)",
      "--ui-color-bg-surface-secondary-pressed": "rgb(199, 199, 204)",
      "--ui-color-bg-surface-secondary-selected": "rgb(212, 214, 217)",
      "--ui-color-bg-surface-tertiary-default": "rgb(224, 227, 230)",
      "--ui-color-bg-surface-tertiary-hover": "rgb(212, 214, 217)",
      "--ui-color-bg-surface-tertiary-pressed": "rgb(186, 189, 191)",
      "--ui-color-bg-surface-tertiary-selected": "rgb(199, 199, 204)",
      "--ui-color-bg-surface-brand-default": "rgb(242, 245, 255)",
      "--ui-color-bg-surface-brand-hover": "rgb(227, 232, 252)",
      "--ui-color-bg-surface-brand-pressed": "rgb(140, 161, 222)",
      "--ui-color-bg-surface-brand-selected": "rgb(184, 196, 237)",
      "--ui-color-bg-surface-brand-disabled": "rgb(242, 245, 255)",
      "--ui-color-bg-surface-success-default": "rgb(242, 255, 245)",
      "--ui-color-bg-surface-success-hover": "rgb(227, 252, 237)",
      "--ui-color-bg-surface-success-pressed": "rgb(130, 224, 166)",
      "--ui-color-bg-surface-success-selected": "rgb(179, 240, 201)",
      "--ui-color-bg-surface-success-disabled": "rgb(242, 255, 245)",
      "--ui-color-bg-surface-warning-default": "rgb(255, 250, 242)",
      "--ui-color-bg-surface-warning-hover": "rgb(252, 245, 227)",
      "--ui-color-bg-surface-warning-pressed": "rgb(242, 214, 117)",
      "--ui-color-bg-surface-warning-selected": "rgb(247, 230, 173)",
      "--ui-color-bg-surface-warning-disabled": "rgb(255, 250, 242)",
      "--ui-color-bg-surface-danger-default": "rgb(255, 242, 242)",
      "--ui-color-bg-surface-danger-hover": "rgb(252, 227, 227)",
      "--ui-color-bg-surface-danger-pressed": "rgb(245, 148, 148)",
      "--ui-color-bg-surface-danger-selected": "rgb(250, 189, 189)",
      "--ui-color-bg-surface-danger-disabled": "rgb(255, 242, 242)",
      "--ui-color-bg-fill-default": "rgb(255, 255, 255)",
      "--ui-color-bg-fill-hover": "rgb(240, 242, 242)",
      "--ui-color-bg-fill-pressed": "rgb(199, 199, 204)",
      "--ui-color-bg-fill-selected": "rgb(224, 227, 230)",
      "--ui-color-bg-fill-dissabled": "rgb(247, 247, 250)",
      "--ui-color-bg-fill-secondary-default": "rgb(247, 247, 250)",
      "--ui-color-bg-fill-secondary-hover": "rgb(224, 227, 230)",
      "--ui-color-bg-fill-secondary-pressed": "rgb(186, 189, 191)",
      "--ui-color-bg-fill-secondary-selected": "rgb(212, 214, 217)",
      "--ui-color-bg-fill-tertiary-default": "rgb(240, 242, 242)",
      "--ui-color-bg-fill-tertiary-hover": "rgb(212, 214, 217)",
      "--ui-color-bg-fill-tertiary-pressed": "rgb(171, 173, 179)",
      "--ui-color-bg-fill-tertiary-selected": "rgb(199, 199, 204)",
      "--ui-color-bg-fill-brand-default": "rgb(54, 89, 194)",
      "--ui-color-bg-fill-brand-hover": "rgb(51, 82, 176)",
      "--ui-color-bg-fill-brand-pressed": "rgb(46, 74, 161)",
      "--ui-color-bg-fill-brand-selected": "rgb(97, 125, 209)",
      "--ui-color-bg-fill-brand-disabled": "rgb(184, 196, 237)",
      "--ui-color-bg-fill-success-default": "rgb(33, 196, 94)",
      "--ui-color-bg-fill-success-hover": "rgb(31, 181, 87)",
      "--ui-color-bg-fill-success-pressed": "rgb(28, 163, 79)",
      "--ui-color-bg-fill-success-selected": "rgb(84, 212, 130)",
      "--ui-color-bg-fill-success-disabled": "rgb(179, 240, 201)",
      "--ui-color-bg-fill-warning-default": "rgb(235, 179, 8)",
      "--ui-color-bg-fill-warning-hover": "rgb(209, 158, 8)",
      "--ui-color-bg-fill-warning-pressed": "rgb(181, 140, 5)",
      "--ui-color-bg-fill-warning-selected": "rgb(240, 196, 64)",
      "--ui-color-bg-fill-warning-disabled": "rgb(247, 230, 173)",
      "--ui-color-bg-fill-danger-default": "rgb(240, 69, 69)",
      "--ui-color-bg-fill-danger-hover": "rgb(212, 61, 61)",
      "--ui-color-bg-fill-danger-pressed": "rgb(184, 51, 51)",
      "--ui-color-bg-fill-danger-selected": "rgb(242, 107, 107)",
      "--ui-color-bg-fill-danger-pressed-2": "rgb(250, 189, 189)",
      "--ui-color-bg-fill-info-default": "rgb(5, 181, 212)",
      "--ui-color-bg-fill-info-hover": "rgb(5, 163, 191)",
      "--ui-color-bg-fill-info-pressed": "rgb(5, 145, 171)",
      "--ui-color-bg-fill-info-selected": "rgb(61, 199, 222)",
      "--ui-color-bg-fill-info-pressed-2": "rgb(171, 232, 242)",
      "--ui-color-text-on-canvas-Inverse": "rgb(255, 255, 255)",
      "--ui-color-text-brand-default": "rgb(46, 74, 161)",
      "--ui-color-text-brand-hover": "rgb(41, 66, 145)",
      "--ui-color-text-brand-pressed": "rgb(36, 59, 128)",
      "--ui-color-text-brand-selected": "rgb(36, 59, 128)",
      "--ui-color-bg-surface-info-default": "rgb(242, 252, 255)",
      "--ui-color-bg-surface-info-hover": "rgb(227, 250, 252)",
      "--ui-color-bg-surface-info-pressed": "rgb(117, 217, 232)",
      "--ui-color-bg-surface-info-selected": "rgb(171, 232, 242)",
      "--ui-color-bg-surface-info-disabled": "rgb(242, 252, 255)",
      "--ui-color-text-success-default": "rgb(28, 163, 79)",
      "--ui-color-text-success-hover": "rgb(26, 145, 69)",
      "--ui-color-text-success-pressed": "rgb(23, 128, 61)",
      "--ui-color-text-success-selected": "rgb(23, 128, 61)",
      "--ui-color-text-warning-default": "rgb(181, 140, 5)",
      "--ui-color-text-warning-hover": "rgb(156, 120, 5)",
      "--ui-color-text-warning-pressed": "rgb(128, 97, 5)",
      "--ui-color-text-warning-selected": "rgb(128, 97, 5)",
      "--ui-color-text-danger-default": "rgb(184, 51, 51)",
      "--ui-color-text-danger-hover": "rgb(156, 43, 43)",
      "--ui-color-text-danger-pressed": "rgb(128, 36, 36)",
      "--ui-color-text-danger-selected": "rgb(128, 36, 36)",
      "--ui-color-text-info-default": "rgb(5, 145, 171)",
      "--ui-color-text-link-default": "rgb(51, 82, 176)",
      "--ui-color-text-all-colors-red": "rgb(184, 51, 51)",
      "--ui-color-text-all-colors-orange": "rgb(189, 87, 18)",
      "--ui-color-text-all-colors-yellow": "rgb(181, 140, 5)",
      "--ui-color-text-all-colors-lime": "rgb(107, 166, 18)",
      "--ui-color-text-all-colors-green": "rgb(28, 163, 79)",
      "--ui-color-text-all-colors-cyan": "rgb(5, 145, 171)",
      "--ui-color-text-all-colors-azure": "rgb(10, 128, 181)",
      "--ui-color-text-all-colors-blue": "rgb(46, 74, 161)",
      "--ui-color-text-all-colors-violet": "rgb(97, 46, 184)",
      "--ui-color-text-all-colors-magenta": "rgb(181, 41, 105)",
      "--ui-color-text-all-colors-rose": "rgb(176, 23, 56)",
      "--ui-color-text-link-hover": "rgb(46, 74, 161)",
      "--ui-color-text-link-pressed": "rgb(41, 66, 145)",
      "--ui-color-text-link-visited": "rgb(97, 46, 184)",
      "--ui-color-text-info-hover": "rgb(5, 128, 148)",
      "--ui-color-text-info-pressed": "rgb(5, 110, 128)",
      "--ui-color-text-info-selected": "rgb(5, 110, 128)",
      "--ui-color-bg-fill-all-colors-red": "rgb(240, 69, 69)",
      "--ui-color-bg-fill-all-colors-orange": "rgb(250, 115, 23)",
      "--ui-color-bg-fill-all-colors-yellow": "rgb(235, 179, 8)",
      "--ui-color-bg-fill-all-colors-lime": "rgb(133, 204, 23)",
      "--ui-color-bg-surface-all-colors-red": "rgb(252, 227, 227)",
      "--ui-color-bg-surface-all-colors-orange": "rgb(252, 237, 227)",
      "--ui-color-bg-fill-all-colors-green": "rgb(33, 196, 94)",
      "--ui-color-bg-surface-all-colors-yellow": "rgb(252, 245, 227)",
      "--ui-color-bg-fill-all-colors-cyan": "rgb(5, 181, 212)",
      "--ui-color-bg-surface-all-colors-lime": "rgb(242, 252, 227)",
      "--ui-color-bg-fill-all-colors-azure": "rgb(13, 166, 232)",
      "--ui-color-bg-surface-all-colors-green": "rgb(227, 252, 237)",
      "--ui-color-bg-fill-all-colors-blue": "rgb(54, 89, 194)",
      "--ui-color-bg-fill-all-colors-violet": "rgb(125, 59, 237)",
      "--ui-color-bg-surface-all-colors-cyan": "rgb(227, 250, 252)",
      "--ui-color-bg-fill-all-colors-magenta": "rgb(235, 51, 135)",
      "--ui-color-bg-fill-all-colors-rose": "rgb(224, 28, 71)",
      "--ui-color-bg-surface-all-colors-azure": "rgb(227, 245, 252)",
      "--ui-color-bg-surface-all-colors-blue": "rgb(227, 232, 252)",
      "--ui-color-bg-surface-all-colors-violet": "rgb(237, 227, 252)",
      "--ui-color-bg-surface-all-colors-magenta": "rgb(252, 227, 240)",
      "--ui-color-bg-surface-all-colors-rose": "rgb(252, 227, 232)",
      "--ui-color-border-all-colors-red": "rgb(242, 107, 107)",
      "--ui-color-border-all-colors-orange": "rgb(250, 145, 74)",
      "--ui-color-border-all-colors-yellow": "rgb(240, 196, 64)",
      "--ui-color-border-all-colors-lime": "rgb(161, 217, 74)",
      "--ui-color-border-all-colors-green": "rgb(84, 212, 130)",
      "--ui-color-border-all-colors-cyan": "rgb(61, 199, 222)",
      "--ui-color-border-all-colors-azure": "rgb(69, 186, 237)",
      "--ui-color-border-all-colors-blue": "rgb(97, 125, 209)",
      "--ui-color-border-all-colors-violet": "rgb(153, 102, 242)",
      "--ui-color-border-all-colors-magenta": "rgb(240, 94, 161)",
      "--ui-color-border-all-colors-rose": "rgb(232, 79, 112)",
      "--ui-Positive-space_0": "0",
      "--ui-Positive-space_2": "2px",
      "--ui-Positive-space_4": "4px",
      "--ui-Positive-space_6": "6px",
      "--ui-Positive-space_8": "8px",
      "--ui-Positive-space_10": "10px",
      "--ui-Positive-space_12": "12px",
      "--ui-Positive-space_16": "16px",
      "--ui-Positive-space_20": "20px",
      "--ui-Positive-space_24": "24px",
      "--ui-Positive-space_28": "28px",
      "--ui-Positive-space_32": "32px",
      "--ui-Positive-space_40": "40px",
      "--ui-Positive-space_48": "48px",
      "--ui-Positive-space_56": "56px",
      "--ui-Positive-space_64": "64px",
      "--ui-Positive-space_80": "80px",
      "--ui-Positive-space_96": "96px",
      "--ui-Negative-space_0": "0",
      "--ui-Negative-space_2": "-2px",
      "--ui-Negative-space_4": "-4px",
      "--ui-Negative-space_6": "-6px",
      "--ui-Negative-space_8": "-8px",
      "--ui-Negative-space_10": "-10px",
      "--ui-Negative-space_12": "-12px",
      "--ui-Negative-space_16": "-16px",
      "--ui-Negative-space_20": "-20px",
      "--ui-Negative-space_24": "-24px",
      "--ui-Negative-space_28": "-28px",
      "--ui-Negative-space_32": "-32px",
      "--ui-Negative-space_40": "-40px",
      "--ui-Negative-space_48": "-48px",
      "--ui-Negative-space_56": "-56px",
      "--ui-Negative-space_64": "-64px",
      "--ui-Negative-space_80": "-80px",
      "--ui-Negative-space_96": "-96px",
      "--ui-size-control-xxs": "20px",
      "--ui-size-control-xs": "32px",
      "--ui-size-control-sm": "36px",
      "--ui-size-control-md": "40px",
      "--ui-size-control-lg": "48px",
      "--ui-size-Icon-xs": "10px",
      "--ui-size-Icon-sm": "16px",
      "--ui-size-Icon-md": "20px",
      "--ui-size-Icon-lg": "24px",
      "--ui-size-Icon-xl": "32px",
      "--ui-size-avatar-xxs": "16px",
      "--ui-size-avatar-xs": "24px",
      "--ui-size-row-regular": "32px",
      "--ui-size-row-compact": "40px",
      "--ui-size-avatar-sm": "32px",
      "--ui-size-avatar-md": "40px",
      "--ui-size-avatar-lg": "48px",
      "--ui-size-avatar-xl": "64px",
      "--ui-size-Image-xs": "24px",
      "--ui-size-Image-sm": "40px",
      "--ui-size-Image-md": "64px",
      "--ui-size-Image-lg": "128px",
      "--ui-size-Image-full": "9999px",
      "--ui-width-0": "0",
      "--ui-width-1": "1px",
      "--ui-width-2": "2px",
      "--ui-radius_0": "0",
      "--ui-radius_2": "2px",
      "--ui-radius_4": "4px",
      "--ui-radius_6": "6px",
      "--ui-radius_8": "8px",
      "--ui-radius_10": "10px",
      "--ui-radius_12": "12px",
      "--ui-radius_16": "16px",
      "--ui-radius_24": "24px",
      "--ui-radius_full": "9999px",
      "--ui-radius-control-na": "0",
      "--ui-radius-control-xs": "6px",
      "--ui-radius-control-sm": "8px",
      "--ui-radius-control-md": "8px",
      "--ui-radius-control-lg": "10px",
      "--ui-radius-control-pill": "9999px",
      "--ui-radius-surface-cuadrado": "0",
      "--ui-radius-surface-forms": "2px",
      "--ui-radius-surface-card": "12px",
      "--ui-radius-surface-modal": "16px",
      "--ui-radius-surface-sheet": "16px",
      "--ui-radius-surface-popover": "8px",
      "--ui-radius-surface-tooltip": "6px",
      "--ui-radius-image-na": "0",
      "--ui-radius-image-sm": "8px",
      "--ui-radius-image-md": "16px",
      "--ui-radius-image-pill": "9999px",
      "--ui-shadow-01-Color": "rgba(0, 0, 0, 0.1)",
      "--ui-shadow-02-Color": "rgba(0, 0, 0, 0.2)",
      "--ui-shadow-03-Color": "rgba(0, 0, 0, 0.2)",
      "--ui-shadow-04-Color": "rgba(0, 0, 0, 0.3)",
      "--ui-shadow-05-Color": "rgba(0, 0, 0, 0.3)",
      "--ui-Layer-App-header": "300px",
      "--ui-Layer-nav-dropdown": "400px",
      "--ui-Layer-surface-popover": "500px",
      "--ui-Layer-surface-tooltip": "600px",
      "--ui-Layer-dialog-backdrop": "690px",
      "--ui-Layer-dialog-modal": "700px",
      "--ui-Layer-feedback-toast": "800px",
      "--ui-Layer-system-overlay": "900px",
      "--ui-color-blue-50-legacy": "#ebeef9",
      "--ui-color-blue-100-legacy": "#c1cbec",
      "--ui-color-blue-200-legacy": "#a3b2e2",
      "--ui-color-blue-300-legacy": "#788fd5",
      "--ui-color-blue-400-legacy": "#5e79cd",
      "--ui-color-blue-500-legacy": "#3658c1",
      "--ui-color-blue-600-legacy": "#3150b0",
      "--ui-color-blue-700-legacy": "#263e89",
      "--ui-color-blue-800-legacy": "#1e306a",
      "--ui-color-blue-900-legacy": "#172551",
      "--ui-color-green-50-legacy": "#f0f9f0",
      "--ui-color-green-100-legacy": "#b1e0cc",
      "--ui-color-green-200-legacy": "#8bd1b3",
      "--ui-color-green-300-legacy": "#56bc90",
      "--ui-color-green-400-legacy": "#35af7a",
      "--ui-color-green-500-legacy": "#039b59",
      "--ui-color-green-600-legacy": "#038d51",
      "--ui-color-green-700-legacy": "#026e3f",
      "--ui-color-green-800-legacy": "#025531",
      "--ui-color-green-900-legacy": "#014125",
      "--ui-color-neutral-50-legacy": "#f0f0f0",
      "--ui-color-neutral-100-legacy": "#d1d1d1",
      "--ui-color-neutral-200-legacy": "#bbbbbb",
      "--ui-color-neutral-300-legacy": "#9c9c9c",
      "--ui-color-neutral-400-legacy": "#898989",
      "--ui-color-neutral-500-legacy": "#6b6b6b",
      "--ui-color-neutral-600-legacy": "#616161",
      "--ui-color-neutral-700-legacy": "#4c4c4c",
      "--ui-color-neutral-800-legacy": "#3b3b3b",
      "--ui-color-neutral-900-legacy": "#2d2d2d",
      "--ui-color-red-50-legacy": "#f9eae9",
      "--ui-color-red-100-legacy": "#edbeba",
      "--ui-color-red-200-legacy": "#e59f98",
      "--ui-color-red-300-legacy": "#d97369",
      "--ui-color-red-400-legacy": "#d1584c",
      "--ui-color-red-500-legacy": "#c62e1f",
      "--ui-color-red-600-legacy": "#b42a1c",
      "--ui-color-red-700-legacy": "#8d2116",
      "--ui-color-red-800-legacy": "#6d1911",
      "--ui-color-red-900-legacy": "#53130d",
      "--ui-color-orange-50-legacy": "#fcf3e9",
      "--ui-color-orange-100-legacy": "#f4daba",
      "--ui-color-orange-200-legacy": "#efc999",
      "--ui-color-orange-300-legacy": "#e8b06a",
      "--ui-color-orange-400-legacy": "#e3a14d",
      "--ui-color-orange-500-legacy": "#dc8921",
      "--ui-color-orange-600-legacy": "#c87d1e",
      "--ui-color-orange-700-legacy": "#9c6117",
      "--ui-color-orange-800-legacy": "#794b12",
      "--ui-color-orange-900-legacy": "#5c3a0e",
      "--ui-color-yellow-50-legacy": "#fcfbec",
      "--ui-color-yellow-100-legacy": "#f6f2c3",
      "--ui-color-yellow-200-legacy": "#f1eca6",
      "--ui-color-yellow-300-legacy": "#ebe47d",
      "--ui-color-yellow-400-legacy": "#e7de64",
      "--ui-color-yellow-500-legacy": "#e1d63d",
      "--ui-color-yellow-600-legacy": "#cdc338",
      "--ui-color-yellow-700-legacy": "#a0982b",
      "--ui-color-yellow-800-legacy": "#7c7622",
      "--ui-color-yellow-900-legacy": "#5f5a1a",
      "--ui-color-blue-dark-50-legacy": "#e8f0f5",
      "--ui-color-blue-dark-100-legacy": "#b8d0df",
      "--ui-color-blue-dark-200-legacy": "#96b9d0",
      "--ui-color-blue-dark-300-legacy": "#6698ba",
      "--ui-color-blue-dark-400-legacy": "#4985ad",
      "--ui-color-blue-dark-500-legacy": "#1b6698",
      "--ui-color-blue-dark-600-legacy": "#195d8a",
      "--ui-color-blue-dark-700-legacy": "#13486c",
      "--ui-color-blue-dark-800-legacy": "#0f3854",
      "--ui-color-blue-dark-900-legacy": "#0b2b40",
      "--ui-color-blue-light-50-legacy": "#e7f6fd",
      "--ui-color-blue-light-100-legacy": "#b4e3f8",
      "--ui-color-blue-light-200-legacy": "#90d6f5",
      "--ui-color-blue-light-300-legacy": "#5ec3f0",
      "--ui-color-blue-light-400-legacy": "#3eb7ed",
      "--ui-color-blue-light-500-legacy": "#0ea5e9",
      "--ui-color-blue-light-600-legacy": "#0d96d4",
      "--ui-color-blue-light-700-legacy": "#0a75a5",
      "--ui-color-blue-light-800-legacy": "#085b80",
      "--ui-color-blue-light-900-legacy": "#064562",
      "--ui-color-gray-50-legacy": "#f9fafb",
      "--ui-color-gray-100-legacy": "#f3f4f6",
      "--ui-color-gray-200-legacy": "#e5e7eb",
      "--ui-color-gray-300-legacy": "#d1d5db",
      "--ui-color-gray-400-legacy": "#9ca3af",
      "--ui-color-gray-500-legacy": "#6b7280",
      "--ui-color-gray-600-legacy": "#4b5563",
      "--ui-color-gray-700-legacy": "#374151",
      "--ui-color-gray-800-legacy": "#1f2937",
      "--ui-color-gray-900-legacy": "#111827",
      "--ui-color-alert-info-bg": "#f1f4fe",
      "--ui-color-alert-info-border": "#627dd0",
      "--ui-color-alert-info-text": "#2d49a1",
      "--ui-color-alert-info-icon": "#2d49a1",
      "--ui-color-alert-success-bg": "#f1fef6",
      "--ui-color-alert-success-border": "#53d382",
      "--ui-color-alert-success-text": "#1ca34e",
      "--ui-color-alert-success-icon": "#1ca34e",
      "--ui-color-alert-danger-bg": "#fff3f1",
      "--ui-color-alert-danger-border": "#fc3d38",
      "--ui-color-alert-danger-text": "#da3430",
      "--ui-color-alert-danger-icon": "#da3430",
      "--ui-color-alert-warning-bg": "#fefbf1",
      "--ui-color-alert-warning-border": "#efc43f",
      "--ui-color-alert-warning-text": "#b58b06",
      "--ui-color-alert-warning-icon": "#b58b06",
      "--ui-bg-base": "rgb(247, 247, 250)",
      "--ui-text-primary": "rgb(48, 51, 54)",
      "--ui-text-secondary": "rgb(89, 89, 94)",
      "--ui-border-default": "rgb(199, 199, 204)"
    },
    "dark": {
      "--ui-color-white": "rgb(255, 255, 255)",
      "--ui-color-black": "rgb(0, 0, 0)",
      "--ui-color-red-50": "rgb(255, 242, 242)",
      "--ui-color-red-100": "rgb(252, 227, 227)",
      "--ui-color-red-200": "rgb(250, 189, 189)",
      "--ui-color-red-300": "rgb(245, 148, 148)",
      "--ui-color-red-400": "rgb(242, 107, 107)",
      "--ui-color-red-500": "rgb(240, 69, 69)",
      "--ui-color-red-600": "rgb(212, 61, 61)",
      "--ui-color-red-700": "rgb(184, 51, 51)",
      "--ui-color-red-800": "rgb(156, 43, 43)",
      "--ui-color-red-900": "rgb(128, 36, 36)",
      "--ui-color-orange-50": "rgb(255, 247, 242)",
      "--ui-color-orange-100": "rgb(252, 237, 227)",
      "--ui-color-orange-200": "rgb(252, 209, 176)",
      "--ui-color-orange-300": "rgb(250, 176, 125)",
      "--ui-color-orange-400": "rgb(250, 145, 74)",
      "--ui-color-orange-500": "rgb(250, 115, 23)",
      "--ui-color-orange-600": "rgb(219, 102, 20)",
      "--ui-color-orange-700": "rgb(189, 87, 18)",
      "--ui-color-orange-800": "rgb(158, 74, 13)",
      "--ui-color-orange-900": "rgb(128, 59, 10)",
      "--ui-color-yellow-50": "rgb(255, 250, 242)",
      "--ui-color-yellow-100": "rgb(252, 245, 227)",
      "--ui-color-yellow-200": "rgb(247, 230, 173)",
      "--ui-color-yellow-300": "rgb(242, 214, 117)",
      "--ui-color-yellow-400": "rgb(240, 196, 64)",
      "--ui-color-yellow-500": "rgb(235, 179, 8)",
      "--ui-color-yellow-600": "rgb(209, 158, 8)",
      "--ui-color-yellow-700": "rgb(181, 140, 5)",
      "--ui-color-yellow-800": "rgb(156, 120, 5)",
      "--ui-color-yellow-900": "rgb(128, 97, 5)",
      "--ui-color-lime-50": "rgb(250, 255, 242)",
      "--ui-color-lime-100": "rgb(242, 252, 227)",
      "--ui-color-lime-200": "rgb(214, 240, 176)",
      "--ui-color-lime-300": "rgb(186, 227, 125)",
      "--ui-color-lime-400": "rgb(161, 217, 74)",
      "--ui-color-lime-500": "rgb(133, 204, 23)",
      "--ui-color-lime-600": "rgb(120, 186, 20)",
      "--ui-color-lime-700": "rgb(107, 166, 18)",
      "--ui-color-lime-800": "rgb(97, 148, 15)",
      "--ui-color-lime-900": "rgb(84, 128, 13)",
      "--ui-color-green-50": "rgb(242, 255, 245)",
      "--ui-color-green-100": "rgb(227, 252, 237)",
      "--ui-color-green-200": "rgb(179, 240, 201)",
      "--ui-color-green-300": "rgb(130, 224, 166)",
      "--ui-color-green-400": "rgb(84, 212, 130)",
      "--ui-color-green-500": "rgb(33, 196, 94)",
      "--ui-color-green-600": "rgb(31, 181, 87)",
      "--ui-color-green-700": "rgb(28, 163, 79)",
      "--ui-color-green-800": "rgb(26, 145, 69)",
      "--ui-color-green-900": "rgb(23, 128, 61)",
      "--ui-color-cyan-50": "rgb(242, 252, 255)",
      "--ui-color-cyan-100": "rgb(227, 250, 252)",
      "--ui-color-cyan-200": "rgb(171, 232, 242)",
      "--ui-color-cyan-300": "rgb(117, 217, 232)",
      "--ui-color-cyan-400": "rgb(61, 199, 222)",
      "--ui-color-cyan-500": "rgb(5, 181, 212)",
      "--ui-color-cyan-600": "rgb(5, 163, 191)",
      "--ui-color-cyan-700": "rgb(5, 145, 171)",
      "--ui-color-cyan-800": "rgb(5, 128, 148)",
      "--ui-color-cyan-900": "rgb(5, 110, 128)",
      "--ui-color-azure-50": "rgb(242, 250, 255)",
      "--ui-color-azure-100": "rgb(227, 245, 252)",
      "--ui-color-azure-200": "rgb(173, 224, 247)",
      "--ui-color-azure-300": "rgb(120, 204, 242)",
      "--ui-color-azure-400": "rgb(69, 186, 237)",
      "--ui-color-azure-500": "rgb(13, 166, 232)",
      "--ui-color-azure-600": "rgb(13, 148, 207)",
      "--ui-color-azure-700": "rgb(10, 128, 181)",
      "--ui-color-azure-800": "rgb(10, 110, 156)",
      "--ui-color-azure-900": "rgb(8, 89, 128)",
      "--ui-color-blue-50": "rgb(242, 245, 255)",
      "--ui-color-blue-100": "rgb(227, 232, 252)",
      "--ui-color-blue-200": "rgb(184, 196, 237)",
      "--ui-color-blue-300": "rgb(140, 161, 222)",
      "--ui-color-blue-400": "rgb(97, 125, 209)",
      "--ui-color-blue-500": "rgb(54, 89, 194)",
      "--ui-color-blue-600": "rgb(51, 82, 176)",
      "--ui-color-blue-700": "rgb(46, 74, 161)",
      "--ui-color-blue-800": "rgb(41, 66, 145)",
      "--ui-color-blue-900": "rgb(36, 59, 128)",
      "--ui-color-violet-50": "rgb(245, 242, 255)",
      "--ui-color-violet-100": "rgb(237, 227, 252)",
      "--ui-color-violet-200": "rgb(209, 186, 250)",
      "--ui-color-violet-300": "rgb(181, 143, 245)",
      "--ui-color-violet-400": "rgb(153, 102, 242)",
      "--ui-color-violet-500": "rgb(125, 59, 237)",
      "--ui-color-violet-600": "rgb(110, 51, 209)",
      "--ui-color-violet-700": "rgb(97, 46, 184)",
      "--ui-color-violet-800": "rgb(82, 38, 156)",
      "--ui-color-violet-900": "rgb(66, 31, 128)",
      "--ui-color-magenta-50": "rgb(255, 242, 247)",
      "--ui-color-magenta-100": "rgb(252, 227, 240)",
      "--ui-color-magenta-200": "rgb(247, 184, 214)",
      "--ui-color-magenta-300": "rgb(245, 140, 186)",
      "--ui-color-magenta-400": "rgb(240, 94, 161)",
      "--ui-color-magenta-500": "rgb(235, 51, 135)",
      "--ui-color-magenta-600": "rgb(209, 46, 120)",
      "--ui-color-magenta-700": "rgb(181, 41, 105)",
      "--ui-color-magenta-800": "rgb(156, 33, 89)",
      "--ui-color-magenta-900": "rgb(128, 28, 74)",
      "--ui-color-rose-50": "rgb(255, 242, 245)",
      "--ui-color-rose-100": "rgb(252, 227, 232)",
      "--ui-color-rose-200": "rgb(245, 179, 194)",
      "--ui-color-rose-300": "rgb(240, 128, 153)",
      "--ui-color-rose-400": "rgb(232, 79, 112)",
      "--ui-color-rose-500": "rgb(224, 28, 71)",
      "--ui-color-rose-600": "rgb(201, 26, 64)",
      "--ui-color-rose-700": "rgb(176, 23, 56)",
      "--ui-color-rose-800": "rgb(153, 20, 48)",
      "--ui-color-rose-900": "rgb(128, 15, 41)",
      "--ui-color-light-gray-50": "rgb(247, 247, 250)",
      "--ui-color-light-gray-100": "rgb(240, 242, 242)",
      "--ui-color-light-gray-200": "rgb(224, 227, 230)",
      "--ui-color-light-gray-300": "rgb(212, 214, 217)",
      "--ui-color-light-gray-400": "rgb(199, 199, 204)",
      "--ui-color-light-gray-500": "rgb(186, 189, 191)",
      "--ui-color-light-gray-600": "rgb(171, 173, 179)",
      "--ui-color-light-gray-700": "rgb(158, 163, 166)",
      "--ui-color-light-gray-800": "rgb(145, 148, 153)",
      "--ui-color-light-gray-900": "rgb(133, 135, 140)",
      "--ui-color-dark-gray-50": "rgb(120, 122, 128)",
      "--ui-color-dark-gray-100": "rgb(107, 110, 115)",
      "--ui-color-dark-gray-200": "rgb(97, 99, 105)",
      "--ui-color-dark-gray-300": "rgb(89, 89, 94)",
      "--ui-color-dark-gray-400": "rgb(77, 79, 84)",
      "--ui-color-dark-gray-500": "rgb(69, 69, 74)",
      "--ui-color-dark-gray-600": "rgb(59, 61, 64)",
      "--ui-color-dark-gray-700": "rgb(48, 51, 54)",
      "--ui-color-dark-gray-800": "rgb(38, 41, 43)",
      "--ui-color-dark-gray-900": "rgb(31, 31, 33)",
      "--ui-color-black-alpha-transparent": "rgba(0, 0, 0, 0)",
      "--ui-color-black-alpha-5": "rgba(0, 0, 0, 0.05)",
      "--ui-color-black-alpha-10": "rgba(0, 0, 0, 0.1)",
      "--ui-color-black-alpha-20": "rgba(0, 0, 0, 0.2)",
      "--ui-color-black-alpha-30": "rgba(0, 0, 0, 0.3)",
      "--ui-color-black-alpha-40": "rgba(0, 0, 0, 0.4)",
      "--ui-color-black-alpha-50": "rgba(0, 0, 0, 0.5)",
      "--ui-color-black-alpha-60": "rgba(0, 0, 0, 0.6)",
      "--ui-color-black-alpha-70": "rgba(0, 0, 0, 0.7)",
      "--ui-color-black-alpha-80": "rgba(0, 0, 0, 0.8)",
      "--ui-color-black-alpha-90": "rgba(0, 0, 0, 0.9)",
      "--ui-positive-Value_0": "0",
      "--ui-positive-Value_12": "0.66px",
      "--ui-positive-Value_25": "1px",
      "--ui-positive-Value_50": "2px",
      "--ui-positive-Value_100": "4px",
      "--ui-positive-Value_150": "6px",
      "--ui-positive-Value_200": "8px",
      "--ui-positive-Value_250": "10px",
      "--ui-positive-Value_275": "11px",
      "--ui-positive-Value_300": "12px",
      "--ui-positive-Value_325": "13px",
      "--ui-positive-Value_350": "14px",
      "--ui-positive-Value_400": "16px",
      "--ui-positive-Value_450": "18px",
      "--ui-positive-Value_500": "20px",
      "--ui-positive-Value_600": "24px",
      "--ui-positive-Value_700": "28px",
      "--ui-positive-Value_750": "30px",
      "--ui-positive-Value_800": "32px",
      "--ui-positive-Value_900": "36px",
      "--ui-positive-Value_1000": "40px",
      "--ui-positive-Value_1200": "48px",
      "--ui-positive-Value_1400": "56px",
      "--ui-positive-Value_1600": "64px",
      "--ui-positive-Value_2000": "80px",
      "--ui-positive-Value_2400": "96px",
      "--ui-positive-Value_2800": "112px",
      "--ui-positive-Value_3200": "128px",
      "--ui-positive-Value_full": "9999px",
      "--ui-negative-Value_0": "0",
      "--ui-negative-Value_12": "-0.66px",
      "--ui-negative-Value_25": "-1px",
      "--ui-negative-Value_50": "-2px",
      "--ui-negative-Value_100": "-4px",
      "--ui-negative-Value_150": "-6px",
      "--ui-negative-Value_200": "-8px",
      "--ui-negative-Value_250": "-10px",
      "--ui-negative-Value_275": "-11px",
      "--ui-negative-Value_300": "-12px",
      "--ui-negative-Value_325": "-13px",
      "--ui-negative-Value_350": "-14px",
      "--ui-negative-Value_400": "-16px",
      "--ui-negative-Value_450": "-18px",
      "--ui-negative-Value_500": "-20px",
      "--ui-negative-Value_600": "-24px",
      "--ui-negative-Value_700": "-28px",
      "--ui-negative-Value_750": "-30px",
      "--ui-negative-Value_800": "-32px",
      "--ui-negative-Value_900": "-36px",
      "--ui-negative-Value_1000": "-40px",
      "--ui-negative-Value_1200": "-48px",
      "--ui-negative-Value_1400": "-56px",
      "--ui-negative-Value_1600": "-64px",
      "--ui-negative-Value_2000": "-80px",
      "--ui-negative-Value_2400": "-96px",
      "--ui-negative-Value_2800": "-112px",
      "--ui-negative-Value_3200": "-128px",
      "--ui-negative-Value_full": "-9999px",
      "--ui-font-family-ui": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-font-family-mono": "'IBM Plex Mono'",
      "--ui-font-lh-10-tight": "12px",
      "--ui-font-lh-10-snug": "12.5px",
      "--ui-font-lh-10-normal": "14.5px",
      "--ui-font-lh-10-relaxed": "16px",
      "--ui-font-track-tight": "0.5px",
      "--ui-font-track-normal": "0",
      "--ui-font-track-wide": "2px",
      "--ui-font-weight-regular": "400",
      "--ui-font-weight-medium": "500",
      "--ui-font-weight-semibold": "600",
      "--ui-font-weight-bold": "700",
      "--ui-font-lh-12-tight": "14.5px",
      "--ui-font-lh-12-snug": "15px",
      "--ui-font-lh-12-normal": "17.5px",
      "--ui-font-lh-12-relaxed": "19px",
      "--ui-font-lh-14-tight": "17px",
      "--ui-font-lh-14-snug": "17.5px",
      "--ui-font-lh-14-normal": "20.5px",
      "--ui-font-lh-14-relaxed": "22.5px",
      "--ui-font-lh-16-tight": "19.5px",
      "--ui-font-lh-16-snug": "20px",
      "--ui-font-lh-16-normal": "23px",
      "--ui-font-lh-16-relaxed": "25.5px",
      "--ui-font-lh-18-tight": "22px",
      "--ui-font-lh-18-snug": "22.5px",
      "--ui-font-lh-18-normal": "26px",
      "--ui-font-lh-18-relaxed": "29px",
      "--ui-font-lh-20-tight": "24px",
      "--ui-font-lh-20-snug": "25px",
      "--ui-font-lh-20-normal": "29px",
      "--ui-font-lh-20-relaxed": "32px",
      "--ui-font-lh-24-tight": "29px",
      "--ui-font-lh-24-snug": "30px",
      "--ui-font-lh-24-normal": "35px",
      "--ui-font-lh-24-relaxed": "38.5px",
      "--ui-font-lh-30-tight": "36.5px",
      "--ui-font-lh-30-snug": "37.5px",
      "--ui-font-lh-30-normal": "43.5px",
      "--ui-font-lh-30-relaxed": "48px",
      "--ui-font-lh-36-tight": "43.5px",
      "--ui-font-lh-36-snug": "45px",
      "--ui-font-lh-36-normal": "52px",
      "--ui-font-lh-36-relaxed": "57.5px",
      "--ui-font-lh-48-tight": "58px",
      "--ui-font-lh-48-snug": "60px",
      "--ui-font-lh-48-normal": "69.5px",
      "--ui-font-lh-48-relaxed": "77px",
      "--ui-style-solid": "'solid'",
      "--ui-style-dashed": "'dashed'",
      "--ui-shadow-none-x": "0",
      "--ui-shadow-none-y": "0",
      "--ui-shadow-none-blur": "0",
      "--ui-shadow-none-Spread": "0",
      "--ui-shadow-none-Color": "rgba(0, 0, 0, 0)",
      "--ui-shadow-01-x": "0",
      "--ui-shadow-01-y": "1px",
      "--ui-shadow-01-blur": "2px",
      "--ui-shadow-01-Spread": "0",
      "--ui-shadow-02-x": "0",
      "--ui-shadow-02-y": "2px",
      "--ui-shadow-02-blur": "4px",
      "--ui-shadow-02-Spread": "-1px",
      "--ui-shadow-03-x": "0",
      "--ui-shadow-03-y": "4px",
      "--ui-shadow-03-blur": "8px",
      "--ui-shadow-03-Spread": "-2px",
      "--ui-shadow-04-x": "0",
      "--ui-shadow-04-y": "8px",
      "--ui-shadow-04-blur": "16px",
      "--ui-shadow-04-Spread": "-4px",
      "--ui-shadow-05-x": "0",
      "--ui-shadow-05-y": "16px",
      "--ui-shadow-05-blur": "24px",
      "--ui-shadow-05-Spread": "-8px",
      "--ui-shadow-x": "0",
      "--ui-z-hide": "-1px",
      "--ui-z-base": "0",
      "--ui-z-raised": "100px",
      "--ui-z-sticky": "200px",
      "--ui-z-shell": "300px",
      "--ui-z-dropdown": "400px",
      "--ui-z-popover": "500px",
      "--ui-z-tooltip": "600px",
      "--ui-z-modalBackdrop": "690px",
      "--ui-z-modal": "700px",
      "--ui-z-toast": "800px",
      "--ui-z-overlay": "900px",
      "--ui-z-max": "99999",
      "--ui-font-size-2xs": "10px",
      "--ui-font-size-xs": "12px",
      "--ui-font-size-sm": "14px",
      "--ui-font-size-md": "16px",
      "--ui-font-size-lg": "18px",
      "--ui-font-size-xl": "20px",
      "--ui-font-size-2xl": "24px",
      "--ui-font-size-3xl": "30px",
      "--ui-font-size-4xl": "36px",
      "--ui-font-size-5xl": "48px",
      "--ui-type-heading-h1-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-heading-h1-size": "36px",
      "--ui-type-heading-h1-weight": "600",
      "--ui-type-heading-h1-ih": "45px",
      "--ui-type-heading-h1-tracking": "0.5px",
      "--ui-type-heading-h2-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-heading-h2-size": "30px",
      "--ui-type-heading-h2-weight": "600",
      "--ui-type-heading-h2-ih": "37.5px",
      "--ui-type-heading-h2-tracking": "0.5px",
      "--ui-type-heading-h3-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-heading-h3-size": "20px",
      "--ui-type-heading-h3-weight": "600",
      "--ui-type-heading-h3-ih": "25px",
      "--ui-type-heading-h3-tracking": "0",
      "--ui-type-body-lg-Regular-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-caption-xs-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-caption-xs-size": "10px",
      "--ui-type-caption-xs-weight": "400",
      "--ui-type-caption-xs-ih": "14.5px",
      "--ui-type-caption-xs-tracking": "2px",
      "--ui-type-caption-md-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-caption-md-size": "12px",
      "--ui-type-caption-md-weight": "400",
      "--ui-type-caption-md-ih": "17.5px",
      "--ui-type-caption-md-tracking": "2px",
      "--ui-type-body-lg-Regular-size": "18px",
      "--ui-type-body-lg-Regular-weight": "400",
      "--ui-type-body-lg-Regular-ih": "26px",
      "--ui-type-body-lg-Regular-tracking": "0.5px",
      "--ui-type-body-md-Regular-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-md-Regular-size": "16px",
      "--ui-type-body-md-Regular-weight": "400",
      "--ui-type-body-md-Regular-ih": "23px",
      "--ui-type-body-md-Regular-tracking": "0.5px",
      "--ui-type-body-sm-Regular-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-sm-Regular-size": "14px",
      "--ui-type-body-sm-Regular-weight": "400",
      "--ui-type-body-sm-Regular-ih": "20.5px",
      "--ui-type-body-sm-Regular-tracking": "0.5px",
      "--ui-type-label-md-Regular-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-label-md-Regular-size": "14px",
      "--ui-type-label-md-Regular-weight": "400",
      "--ui-type-label-md-Regular-ih": "20.5px",
      "--ui-type-label-md-Regular-tracking": "0.5px",
      "--ui-type-code-md-family": "'IBM Plex Mono'",
      "--ui-type-code-md-size": "14px",
      "--ui-type-code-md-weight": "400",
      "--ui-type-code-md-ih": "14.5px",
      "--ui-type-code-md-tracking": "0",
      "--ui-type-heading-h4-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-heading-h4-size": "18px",
      "--ui-type-heading-h4-weight": "600",
      "--ui-type-heading-h4-ih": "25px",
      "--ui-type-heading-h4-tracking": "0",
      "--ui-type-heading-h5-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-heading-h5-size": "16px",
      "--ui-type-heading-h5-weight": "600",
      "--ui-type-heading-h5-ih": "25px",
      "--ui-type-heading-h5-tracking": "0",
      "--ui-type-heading-h6-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-heading-h6-size": "14px",
      "--ui-type-heading-h6-weight": "600",
      "--ui-type-heading-h6-ih": "25px",
      "--ui-type-heading-h6-tracking": "0",
      "--ui-type-body-lg-Medium-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-lg-Medium-size": "18px",
      "--ui-type-body-lg-Medium-weight": "500",
      "--ui-type-body-lg-Medium-ih": "26px",
      "--ui-type-body-lg-Medium-tracking": "0.5px",
      "--ui-type-body-lg-Semibold-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-lg-Semibold-size": "18px",
      "--ui-type-body-lg-Semibold-weight": "600",
      "--ui-type-body-lg-Semibold-ih": "26px",
      "--ui-type-body-lg-Semibold-tracking": "0.5px",
      "--ui-type-body-lg-Bold-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-lg-Bold-size": "18px",
      "--ui-type-body-lg-Bold-weight": "700",
      "--ui-type-body-lg-Bold-ih": "26px",
      "--ui-type-body-lg-Bold-tracking": "0.5px",
      "--ui-type-body-md-Medium-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-md-Medium-size": "16px",
      "--ui-type-body-md-Medium-weight": "500",
      "--ui-type-body-md-Medium-ih": "23px",
      "--ui-type-body-md-Medium-tracking": "0.5px",
      "--ui-type-body-md-Semibold-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-md-Semibold-size": "16px",
      "--ui-type-body-md-Semibold-weight": "600",
      "--ui-type-body-md-Semibold-ih": "23px",
      "--ui-type-body-md-Semibold-tracking": "0.5px",
      "--ui-type-body-sm-Medium-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-sm-Medium-size": "14px",
      "--ui-type-body-sm-Medium-weight": "500",
      "--ui-type-body-sm-Medium-ih": "20.5px",
      "--ui-type-body-sm-Medium-tracking": "0.5px",
      "--ui-type-body-sm-Semibold-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-sm-Semibold-size": "14px",
      "--ui-type-body-sm-Semibold-weight": "600",
      "--ui-type-body-sm-Semibold-ih": "20.5px",
      "--ui-type-body-sm-Semibold-tracking": "0.5px",
      "--ui-type-body-sm-Bold-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-sm-Bold-size": "14px",
      "--ui-type-body-sm-Bold-weight": "700",
      "--ui-type-body-sm-Bold-ih": "20.5px",
      "--ui-type-body-sm-Bold-tracking": "0.5px",
      "--ui-type-label-md-Medium-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-label-md-Medium-size": "14px",
      "--ui-type-label-md-Medium-weight": "500",
      "--ui-type-label-md-Medium-ih": "20.5px",
      "--ui-type-label-md-Medium-tracking": "0.5px",
      "--ui-type-label-md-Semibold-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-label-md-Semibold-size": "14px",
      "--ui-type-label-md-Semibold-weight": "600",
      "--ui-type-label-md-Semibold-ih": "20.5px",
      "--ui-type-label-md-Semibold-tracking": "0.5px",
      "--ui-type-label-md-Bold-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-label-md-Bold-size": "14px",
      "--ui-type-label-md-Bold-weight": "700",
      "--ui-type-label-md-Bold-ih": "20.5px",
      "--ui-type-label-md-Bold-tracking": "0.5px",
      "--ui-type-body-md-Bold-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-md-Bold-size": "16px",
      "--ui-type-body-md-Bold-weight": "700",
      "--ui-type-body-md-Bold-ih": "23px",
      "--ui-type-body-md-Bold-tracking": "0.5px",
      "--ui-type-body-xs-Regular-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-xs-Regular-size": "12px",
      "--ui-type-body-xs-Regular-weight": "400",
      "--ui-type-body-xs-Regular-ih": "17.5px",
      "--ui-type-body-xs-Regular-tracking": "0.5px",
      "--ui-type-body-xs-Medium-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-xs-Medium-size": "12px",
      "--ui-type-body-xs-Medium-weight": "500",
      "--ui-type-body-xs-Medium-ih": "17.5px",
      "--ui-type-body-xs-Medium-tracking": "0.5px",
      "--ui-type-body-xs-Semibold-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-xs-Semibold-size": "12px",
      "--ui-type-body-xs-Semibold-weight": "600",
      "--ui-type-body-xs-Semibold-ih": "17.5px",
      "--ui-type-body-xs-Semibold-tracking": "0.5px",
      "--ui-type-body-xs-Bold-family": "var(--app-font-family, 'Inter'), -apple-system, BlinkMacSystemFont, 'Segoe UI',\n    sans-serif",
      "--ui-type-body-xs-Bold-size": "12px",
      "--ui-type-body-xs-Bold-weight": "700",
      "--ui-type-body-xs-Bold-ih": "17.5px",
      "--ui-type-body-xs-Bold-tracking": "0.5px",
      "--ui-color-bg-canvas-default": "rgb(31, 31, 33)",
      "--ui-color-bg-canvas-inverse": "rgb(247, 247, 250)",
      "--ui-color-bg-overlay-default": "rgba(0, 0, 0, 0.6)",
      "--ui-color-bg-overlay-darker": "rgba(0, 0, 0, 0.8)",
      "--ui-color-text-primary": "rgb(240, 242, 242)",
      "--ui-color-text-secondary": "rgb(199, 199, 204)",
      "--ui-color-icon-default": "rgb(212, 214, 217)",
      "--ui-color-text-tertiary": "rgb(158, 163, 166)",
      "--ui-color-icon-hover": "rgb(240, 242, 242)",
      "--ui-color-icon-pressed": "rgb(255, 255, 255)",
      "--ui-color-text-disabled": "rgb(97, 99, 105)",
      "--ui-color-icon-selected": "rgb(97, 125, 209)",
      "--ui-color-icon-secondary-default": "rgb(186, 189, 191)",
      "--ui-color-icon-secondary-hover": "rgb(212, 214, 217)",
      "--ui-color-icon-secondary-pressed": "rgb(240, 242, 242)",
      "--ui-color-icon-secondary-selected": "rgb(212, 214, 217)",
      "--ui-color-icon-tertiary-default": "rgb(133, 135, 140)",
      "--ui-color-icon-tertiary-hover": "rgb(158, 163, 166)",
      "--ui-color-icon-tertiary-pressed": "rgb(186, 189, 191)",
      "--ui-color-icon-tertiary-selected": "rgb(158, 163, 166)",
      "--ui-color-icon-brand-default": "rgb(184, 196, 237)",
      "--ui-color-icon-brand-hover": "rgb(227, 232, 252)",
      "--ui-color-icon-brand-pressed": "rgb(242, 245, 255)",
      "--ui-color-icon-brand-selected": "rgb(255, 255, 255)",
      "--ui-color-icon-success-default": "rgb(179, 240, 201)",
      "--ui-color-icon-success-hover": "rgb(227, 252, 237)",
      "--ui-color-icon-success-pressed": "rgb(242, 255, 245)",
      "--ui-color-icon-success-selected": "rgb(255, 255, 255)",
      "--ui-color-icon-warning-default": "rgb(247, 230, 173)",
      "--ui-color-icon-warning-hover": "rgb(252, 245, 227)",
      "--ui-color-icon-warning-pressed": "rgb(255, 250, 242)",
      "--ui-color-icon-warning-selected": "rgb(255, 255, 255)",
      "--ui-color-icon-danger-default": "rgb(250, 189, 189)",
      "--ui-color-icon-danger-hover": "rgb(252, 227, 227)",
      "--ui-color-icon-danger-pressed": "rgb(255, 242, 242)",
      "--ui-color-icon-danger-selected": "rgb(255, 255, 255)",
      "--ui-color-icon-info-default": "rgb(171, 232, 242)",
      "--ui-color-icon-all-colors-red": "rgb(242, 107, 107)",
      "--ui-color-icon-all-colors-orange": "rgb(250, 145, 74)",
      "--ui-color-icon-all-colors-yellow": "rgb(240, 196, 64)",
      "--ui-color-icon-all-colors-lime": "rgb(161, 217, 74)",
      "--ui-color-icon-all-colors-green": "rgb(84, 212, 130)",
      "--ui-color-icon-all-colors-cyan": "rgb(61, 199, 222)",
      "--ui-color-icon-all-colors-azure": "rgb(69, 186, 237)",
      "--ui-color-icon-all-colors-blue": "rgb(97, 125, 209)",
      "--ui-color-icon-all-colors-violet": "rgb(153, 102, 242)",
      "--ui-color-icon-all-colors-magenta": "rgb(240, 94, 161)",
      "--ui-color-icon-all-colors-rose": "rgb(232, 79, 112)",
      "--ui-color-icon-info-hover": "rgb(227, 250, 252)",
      "--ui-color-icon-info-pressed": "rgb(242, 252, 255)",
      "--ui-color-icon-info-selected": "rgb(255, 255, 255)",
      "--ui-color-icon-disabled": "rgb(97, 99, 105)",
      "--ui-color-icon-on-color": "rgb(255, 255, 255)",
      "--ui-color-border-default": "rgb(77, 79, 84)",
      "--ui-color-border-hover": "rgb(158, 163, 166)",
      "--ui-color-border-pressed": "rgb(186, 189, 191)",
      "--ui-color-border-focus": "rgb(97, 125, 209)",
      "--ui-color-border-disabled": "rgb(69, 69, 74)",
      "--ui-color-border-subtle": "rgb(69, 69, 74)",
      "--ui-color-border-on-color": "rgb(255, 255, 255)",
      "--ui-color-border-strong": "rgb(171, 173, 179)",
      "--ui-color-border-brand": "rgb(97, 125, 209)",
      "--ui-color-border-success": "rgb(84, 212, 130)",
      "--ui-color-border-warning": "rgb(240, 196, 64)",
      "--ui-color-border-danger": "rgb(242, 107, 107)",
      "--ui-color-border-info": "rgb(61, 199, 222)",
      "--ui-color-text-text-on-color": "rgb(255, 255, 255)",
      "--ui-color-bg-surface-default": "rgb(38, 41, 43)",
      "--ui-color-bg-surface-hover": "rgb(48, 51, 54)",
      "--ui-color-bg-surface-pressed": "rgb(69, 69, 74)",
      "--ui-color-bg-surface-selected": "rgb(59, 61, 64)",
      "--ui-color-bg-surface-dissabled": "rgb(48, 51, 54)",
      "--ui-color-bg-surface-secondary-default": "rgb(48, 51, 54)",
      "--ui-color-bg-surface-secondary-hover": "rgb(59, 61, 64)",
      "--ui-color-bg-surface-secondary-pressed": "rgb(89, 89, 94)",
      "--ui-color-bg-surface-secondary-selected": "rgb(77, 79, 84)",
      "--ui-color-bg-surface-tertiary-default": "rgb(69, 69, 74)",
      "--ui-color-bg-surface-tertiary-hover": "rgb(77, 79, 84)",
      "--ui-color-bg-surface-tertiary-pressed": "rgb(97, 99, 105)",
      "--ui-color-bg-surface-tertiary-selected": "rgb(89, 89, 94)",
      "--ui-color-bg-surface-brand-default": "rgb(36, 59, 128)",
      "--ui-color-bg-surface-brand-hover": "rgb(41, 66, 145)",
      "--ui-color-bg-surface-brand-pressed": "rgb(51, 82, 176)",
      "--ui-color-bg-surface-brand-selected": "rgb(46, 74, 161)",
      "--ui-color-bg-surface-brand-disabled": "rgb(36, 59, 128)",
      "--ui-color-bg-surface-success-default": "rgb(23, 128, 61)",
      "--ui-color-bg-surface-success-hover": "rgb(26, 145, 69)",
      "--ui-color-bg-surface-success-pressed": "rgb(31, 181, 87)",
      "--ui-color-bg-surface-success-selected": "rgb(28, 163, 79)",
      "--ui-color-bg-surface-success-disabled": "rgb(23, 128, 61)",
      "--ui-color-bg-surface-warning-default": "rgb(128, 97, 5)",
      "--ui-color-bg-surface-warning-hover": "rgb(156, 120, 5)",
      "--ui-color-bg-surface-warning-pressed": "rgb(209, 158, 8)",
      "--ui-color-bg-surface-warning-selected": "rgb(181, 140, 5)",
      "--ui-color-bg-surface-warning-disabled": "rgb(128, 97, 5)",
      "--ui-color-bg-surface-danger-default": "rgb(128, 36, 36)",
      "--ui-color-bg-surface-danger-hover": "rgb(156, 43, 43)",
      "--ui-color-bg-surface-danger-pressed": "rgb(212, 61, 61)",
      "--ui-color-bg-surface-danger-selected": "rgb(184, 51, 51)",
      "--ui-color-bg-surface-danger-disabled": "rgb(128, 36, 36)",
      "--ui-color-bg-fill-default": "rgb(38, 41, 43)",
      "--ui-color-bg-fill-hover": "rgb(59, 61, 64)",
      "--ui-color-bg-fill-pressed": "rgb(89, 89, 94)",
      "--ui-color-bg-fill-selected": "rgb(69, 69, 74)",
      "--ui-color-bg-fill-dissabled": "rgb(48, 51, 54)",
      "--ui-color-bg-fill-secondary-default": "rgb(48, 51, 54)",
      "--ui-color-bg-fill-secondary-hover": "rgb(69, 69, 74)",
      "--ui-color-bg-fill-secondary-pressed": "rgb(97, 99, 105)",
      "--ui-color-bg-fill-secondary-selected": "rgb(77, 79, 84)",
      "--ui-color-bg-fill-tertiary-default": "rgb(59, 61, 64)",
      "--ui-color-bg-fill-tertiary-hover": "rgb(77, 79, 84)",
      "--ui-color-bg-fill-tertiary-pressed": "rgb(107, 110, 115)",
      "--ui-color-bg-fill-tertiary-selected": "rgb(89, 89, 94)",
      "--ui-color-bg-fill-brand-default": "rgb(51, 82, 176)",
      "--ui-color-bg-fill-brand-hover": "rgb(54, 89, 194)",
      "--ui-color-bg-fill-brand-pressed": "rgb(97, 125, 209)",
      "--ui-color-bg-fill-brand-selected": "rgb(46, 74, 161)",
      "--ui-color-bg-fill-brand-disabled": "rgb(36, 59, 128)",
      "--ui-color-bg-fill-success-default": "rgb(31, 181, 87)",
      "--ui-color-bg-fill-success-hover": "rgb(33, 196, 94)",
      "--ui-color-bg-fill-success-pressed": "rgb(84, 212, 130)",
      "--ui-color-bg-fill-success-selected": "rgb(28, 163, 79)",
      "--ui-color-bg-fill-success-disabled": "rgb(23, 128, 61)",
      "--ui-color-bg-fill-warning-default": "rgb(209, 158, 8)",
      "--ui-color-bg-fill-warning-hover": "rgb(235, 179, 8)",
      "--ui-color-bg-fill-warning-pressed": "rgb(240, 196, 64)",
      "--ui-color-bg-fill-warning-selected": "rgb(181, 140, 5)",
      "--ui-color-bg-fill-warning-disabled": "rgb(128, 97, 5)",
      "--ui-color-bg-fill-danger-default": "rgb(212, 61, 61)",
      "--ui-color-bg-fill-danger-hover": "rgb(240, 69, 69)",
      "--ui-color-bg-fill-danger-pressed": "rgb(242, 107, 107)",
      "--ui-color-bg-fill-danger-selected": "rgb(184, 51, 51)",
      "--ui-color-bg-fill-danger-pressed-2": "rgb(128, 36, 36)",
      "--ui-color-bg-fill-info-default": "rgb(5, 163, 191)",
      "--ui-color-bg-fill-info-hover": "rgb(5, 181, 212)",
      "--ui-color-bg-fill-info-pressed": "rgb(61, 199, 222)",
      "--ui-color-bg-fill-info-selected": "rgb(5, 145, 171)",
      "--ui-color-bg-fill-info-pressed-2": "rgb(5, 110, 128)",
      "--ui-color-text-on-canvas-Inverse": "rgb(48, 51, 54)",
      "--ui-color-text-brand-default": "rgb(227, 232, 252)",
      "--ui-color-text-brand-hover": "rgb(242, 245, 255)",
      "--ui-color-text-brand-pressed": "rgb(255, 255, 255)",
      "--ui-color-text-brand-selected": "rgb(242, 245, 255)",
      "--ui-color-bg-surface-info-default": "rgb(5, 110, 128)",
      "--ui-color-bg-surface-info-hover": "rgb(5, 128, 148)",
      "--ui-color-bg-surface-info-pressed": "rgb(5, 163, 191)",
      "--ui-color-bg-surface-info-selected": "rgb(5, 145, 171)",
      "--ui-color-bg-surface-info-disabled": "rgb(5, 110, 128)",
      "--ui-color-text-success-default": "rgb(227, 252, 237)",
      "--ui-color-text-success-hover": "rgb(242, 255, 245)",
      "--ui-color-text-success-pressed": "rgb(255, 255, 255)",
      "--ui-color-text-success-selected": "rgb(242, 255, 245)",
      "--ui-color-text-warning-default": "rgb(252, 245, 227)",
      "--ui-color-text-warning-hover": "rgb(255, 250, 242)",
      "--ui-color-text-warning-pressed": "rgb(255, 255, 255)",
      "--ui-color-text-warning-selected": "rgb(255, 250, 242)",
      "--ui-color-text-danger-default": "rgb(252, 227, 227)",
      "--ui-color-text-danger-hover": "rgb(255, 242, 242)",
      "--ui-color-text-danger-pressed": "rgb(255, 255, 255)",
      "--ui-color-text-danger-selected": "rgb(255, 242, 242)",
      "--ui-color-text-info-default": "rgb(227, 250, 252)",
      "--ui-color-text-link-default": "rgb(97, 125, 209)",
      "--ui-color-text-all-colors-red": "rgb(245, 148, 148)",
      "--ui-color-text-all-colors-orange": "rgb(250, 176, 125)",
      "--ui-color-text-all-colors-yellow": "rgb(242, 214, 117)",
      "--ui-color-text-all-colors-lime": "rgb(186, 227, 125)",
      "--ui-color-text-all-colors-green": "rgb(130, 224, 166)",
      "--ui-color-text-all-colors-cyan": "rgb(117, 217, 232)",
      "--ui-color-text-all-colors-azure": "rgb(120, 204, 242)",
      "--ui-color-text-all-colors-blue": "rgb(140, 161, 222)",
      "--ui-color-text-all-colors-violet": "rgb(181, 143, 245)",
      "--ui-color-text-all-colors-magenta": "rgb(245, 140, 186)",
      "--ui-color-text-all-colors-rose": "rgb(240, 128, 153)",
      "--ui-color-text-link-hover": "rgb(140, 161, 222)",
      "--ui-color-text-link-pressed": "rgb(184, 196, 237)",
      "--ui-color-text-link-visited": "rgb(181, 143, 245)",
      "--ui-color-text-info-hover": "rgb(242, 252, 255)",
      "--ui-color-text-info-pressed": "rgb(255, 255, 255)",
      "--ui-color-text-info-selected": "rgb(242, 252, 255)",
      "--ui-color-bg-fill-all-colors-red": "rgb(212, 61, 61)",
      "--ui-color-bg-fill-all-colors-orange": "rgb(219, 102, 20)",
      "--ui-color-bg-fill-all-colors-yellow": "rgb(209, 158, 8)",
      "--ui-color-bg-fill-all-colors-lime": "rgb(120, 186, 20)",
      "--ui-color-bg-surface-all-colors-red": "rgb(128, 36, 36)",
      "--ui-color-bg-surface-all-colors-orange": "rgb(128, 59, 10)",
      "--ui-color-bg-fill-all-colors-green": "rgb(31, 181, 87)",
      "--ui-color-bg-surface-all-colors-yellow": "rgb(128, 97, 5)",
      "--ui-color-bg-fill-all-colors-cyan": "rgb(5, 163, 191)",
      "--ui-color-bg-surface-all-colors-lime": "rgb(84, 128, 13)",
      "--ui-color-bg-fill-all-colors-azure": "rgb(13, 148, 207)",
      "--ui-color-bg-surface-all-colors-green": "rgb(23, 128, 61)",
      "--ui-color-bg-fill-all-colors-blue": "rgb(51, 82, 176)",
      "--ui-color-bg-fill-all-colors-violet": "rgb(110, 51, 209)",
      "--ui-color-bg-surface-all-colors-cyan": "rgb(5, 110, 128)",
      "--ui-color-bg-fill-all-colors-magenta": "rgb(209, 46, 120)",
      "--ui-color-bg-fill-all-colors-rose": "rgb(201, 26, 64)",
      "--ui-color-bg-surface-all-colors-azure": "rgb(8, 89, 128)",
      "--ui-color-bg-surface-all-colors-blue": "rgb(36, 59, 128)",
      "--ui-color-bg-surface-all-colors-violet": "rgb(66, 31, 128)",
      "--ui-color-bg-surface-all-colors-magenta": "rgb(128, 28, 74)",
      "--ui-color-bg-surface-all-colors-rose": "rgb(128, 15, 41)",
      "--ui-color-border-all-colors-red": "rgb(240, 69, 69)",
      "--ui-color-border-all-colors-orange": "rgb(250, 115, 23)",
      "--ui-color-border-all-colors-yellow": "rgb(235, 179, 8)",
      "--ui-color-border-all-colors-lime": "rgb(133, 204, 23)",
      "--ui-color-border-all-colors-green": "rgb(33, 196, 94)",
      "--ui-color-border-all-colors-cyan": "rgb(5, 181, 212)",
      "--ui-color-border-all-colors-azure": "rgb(13, 166, 232)",
      "--ui-color-border-all-colors-blue": "rgb(54, 89, 194)",
      "--ui-color-border-all-colors-violet": "rgb(125, 59, 237)",
      "--ui-color-border-all-colors-magenta": "rgb(235, 51, 135)",
      "--ui-color-border-all-colors-rose": "rgb(224, 28, 71)",
      "--ui-Positive-space_0": "0",
      "--ui-Positive-space_2": "2px",
      "--ui-Positive-space_4": "4px",
      "--ui-Positive-space_6": "6px",
      "--ui-Positive-space_8": "8px",
      "--ui-Positive-space_10": "10px",
      "--ui-Positive-space_12": "12px",
      "--ui-Positive-space_16": "16px",
      "--ui-Positive-space_20": "20px",
      "--ui-Positive-space_24": "24px",
      "--ui-Positive-space_28": "28px",
      "--ui-Positive-space_32": "32px",
      "--ui-Positive-space_40": "40px",
      "--ui-Positive-space_48": "48px",
      "--ui-Positive-space_56": "56px",
      "--ui-Positive-space_64": "64px",
      "--ui-Positive-space_80": "80px",
      "--ui-Positive-space_96": "96px",
      "--ui-Negative-space_0": "0",
      "--ui-Negative-space_2": "-2px",
      "--ui-Negative-space_4": "-4px",
      "--ui-Negative-space_6": "-6px",
      "--ui-Negative-space_8": "-8px",
      "--ui-Negative-space_10": "-10px",
      "--ui-Negative-space_12": "-12px",
      "--ui-Negative-space_16": "-16px",
      "--ui-Negative-space_20": "-20px",
      "--ui-Negative-space_24": "-24px",
      "--ui-Negative-space_28": "-28px",
      "--ui-Negative-space_32": "-32px",
      "--ui-Negative-space_40": "-40px",
      "--ui-Negative-space_48": "-48px",
      "--ui-Negative-space_56": "-56px",
      "--ui-Negative-space_64": "-64px",
      "--ui-Negative-space_80": "-80px",
      "--ui-Negative-space_96": "-96px",
      "--ui-size-control-xxs": "20px",
      "--ui-size-control-xs": "32px",
      "--ui-size-control-sm": "36px",
      "--ui-size-control-md": "40px",
      "--ui-size-control-lg": "48px",
      "--ui-size-Icon-xs": "10px",
      "--ui-size-Icon-sm": "16px",
      "--ui-size-Icon-md": "20px",
      "--ui-size-Icon-lg": "24px",
      "--ui-size-Icon-xl": "32px",
      "--ui-size-avatar-xxs": "16px",
      "--ui-size-avatar-xs": "24px",
      "--ui-size-row-regular": "32px",
      "--ui-size-row-compact": "40px",
      "--ui-size-avatar-sm": "32px",
      "--ui-size-avatar-md": "40px",
      "--ui-size-avatar-lg": "48px",
      "--ui-size-avatar-xl": "64px",
      "--ui-size-Image-xs": "24px",
      "--ui-size-Image-sm": "40px",
      "--ui-size-Image-md": "64px",
      "--ui-size-Image-lg": "128px",
      "--ui-size-Image-full": "9999px",
      "--ui-width-0": "0",
      "--ui-width-1": "1px",
      "--ui-width-2": "2px",
      "--ui-radius_0": "0",
      "--ui-radius_2": "2px",
      "--ui-radius_4": "4px",
      "--ui-radius_6": "6px",
      "--ui-radius_8": "8px",
      "--ui-radius_10": "10px",
      "--ui-radius_12": "12px",
      "--ui-radius_16": "16px",
      "--ui-radius_24": "24px",
      "--ui-radius_full": "9999px",
      "--ui-radius-control-na": "0",
      "--ui-radius-control-xs": "6px",
      "--ui-radius-control-sm": "8px",
      "--ui-radius-control-md": "8px",
      "--ui-radius-control-lg": "10px",
      "--ui-radius-control-pill": "9999px",
      "--ui-radius-surface-cuadrado": "0",
      "--ui-radius-surface-forms": "2px",
      "--ui-radius-surface-card": "12px",
      "--ui-radius-surface-modal": "16px",
      "--ui-radius-surface-sheet": "16px",
      "--ui-radius-surface-popover": "8px",
      "--ui-radius-surface-tooltip": "6px",
      "--ui-radius-image-na": "0",
      "--ui-radius-image-sm": "8px",
      "--ui-radius-image-md": "16px",
      "--ui-radius-image-pill": "9999px",
      "--ui-shadow-01-Color": "rgba(0, 0, 0, 0.4)",
      "--ui-shadow-02-Color": "rgba(0, 0, 0, 0.5)",
      "--ui-shadow-03-Color": "rgba(0, 0, 0, 0.5)",
      "--ui-shadow-04-Color": "rgba(0, 0, 0, 0.6)",
      "--ui-shadow-05-Color": "rgba(0, 0, 0, 0.6)",
      "--ui-Layer-App-header": "300px",
      "--ui-Layer-nav-dropdown": "400px",
      "--ui-Layer-surface-popover": "500px",
      "--ui-Layer-surface-tooltip": "600px",
      "--ui-Layer-dialog-backdrop": "690px",
      "--ui-Layer-dialog-modal": "700px",
      "--ui-Layer-feedback-toast": "800px",
      "--ui-Layer-system-overlay": "900px",
      "--ui-color-blue-50-legacy": "#ebeef9",
      "--ui-color-blue-100-legacy": "#c1cbec",
      "--ui-color-blue-200-legacy": "#a3b2e2",
      "--ui-color-blue-300-legacy": "#788fd5",
      "--ui-color-blue-400-legacy": "#5e79cd",
      "--ui-color-blue-500-legacy": "#3658c1",
      "--ui-color-blue-600-legacy": "#3150b0",
      "--ui-color-blue-700-legacy": "#263e89",
      "--ui-color-blue-800-legacy": "#1e306a",
      "--ui-color-blue-900-legacy": "#172551",
      "--ui-color-green-50-legacy": "#f0f9f0",
      "--ui-color-green-100-legacy": "#b1e0cc",
      "--ui-color-green-200-legacy": "#8bd1b3",
      "--ui-color-green-300-legacy": "#56bc90",
      "--ui-color-green-400-legacy": "#35af7a",
      "--ui-color-green-500-legacy": "#039b59",
      "--ui-color-green-600-legacy": "#038d51",
      "--ui-color-green-700-legacy": "#026e3f",
      "--ui-color-green-800-legacy": "#025531",
      "--ui-color-green-900-legacy": "#014125",
      "--ui-color-neutral-50-legacy": "#f0f0f0",
      "--ui-color-neutral-100-legacy": "#d1d1d1",
      "--ui-color-neutral-200-legacy": "#bbbbbb",
      "--ui-color-neutral-300-legacy": "#9c9c9c",
      "--ui-color-neutral-400-legacy": "#898989",
      "--ui-color-neutral-500-legacy": "#6b6b6b",
      "--ui-color-neutral-600-legacy": "#616161",
      "--ui-color-neutral-700-legacy": "#4c4c4c",
      "--ui-color-neutral-800-legacy": "#3b3b3b",
      "--ui-color-neutral-900-legacy": "#2d2d2d",
      "--ui-color-red-50-legacy": "#f9eae9",
      "--ui-color-red-100-legacy": "#edbeba",
      "--ui-color-red-200-legacy": "#e59f98",
      "--ui-color-red-300-legacy": "#d97369",
      "--ui-color-red-400-legacy": "#d1584c",
      "--ui-color-red-500-legacy": "#c62e1f",
      "--ui-color-red-600-legacy": "#b42a1c",
      "--ui-color-red-700-legacy": "#8d2116",
      "--ui-color-red-800-legacy": "#6d1911",
      "--ui-color-red-900-legacy": "#53130d",
      "--ui-color-orange-50-legacy": "#fcf3e9",
      "--ui-color-orange-100-legacy": "#f4daba",
      "--ui-color-orange-200-legacy": "#efc999",
      "--ui-color-orange-300-legacy": "#e8b06a",
      "--ui-color-orange-400-legacy": "#e3a14d",
      "--ui-color-orange-500-legacy": "#dc8921",
      "--ui-color-orange-600-legacy": "#c87d1e",
      "--ui-color-orange-700-legacy": "#9c6117",
      "--ui-color-orange-800-legacy": "#794b12",
      "--ui-color-orange-900-legacy": "#5c3a0e",
      "--ui-color-yellow-50-legacy": "#fcfbec",
      "--ui-color-yellow-100-legacy": "#f6f2c3",
      "--ui-color-yellow-200-legacy": "#f1eca6",
      "--ui-color-yellow-300-legacy": "#ebe47d",
      "--ui-color-yellow-400-legacy": "#e7de64",
      "--ui-color-yellow-500-legacy": "#e1d63d",
      "--ui-color-yellow-600-legacy": "#cdc338",
      "--ui-color-yellow-700-legacy": "#a0982b",
      "--ui-color-yellow-800-legacy": "#7c7622",
      "--ui-color-yellow-900-legacy": "#5f5a1a",
      "--ui-color-blue-dark-50-legacy": "#e8f0f5",
      "--ui-color-blue-dark-100-legacy": "#b8d0df",
      "--ui-color-blue-dark-200-legacy": "#96b9d0",
      "--ui-color-blue-dark-300-legacy": "#6698ba",
      "--ui-color-blue-dark-400-legacy": "#4985ad",
      "--ui-color-blue-dark-500-legacy": "#1b6698",
      "--ui-color-blue-dark-600-legacy": "#195d8a",
      "--ui-color-blue-dark-700-legacy": "#13486c",
      "--ui-color-blue-dark-800-legacy": "#0f3854",
      "--ui-color-blue-dark-900-legacy": "#0b2b40",
      "--ui-color-blue-light-50-legacy": "#e7f6fd",
      "--ui-color-blue-light-100-legacy": "#b4e3f8",
      "--ui-color-blue-light-200-legacy": "#90d6f5",
      "--ui-color-blue-light-300-legacy": "#5ec3f0",
      "--ui-color-blue-light-400-legacy": "#3eb7ed",
      "--ui-color-blue-light-500-legacy": "#0ea5e9",
      "--ui-color-blue-light-600-legacy": "#0d96d4",
      "--ui-color-blue-light-700-legacy": "#0a75a5",
      "--ui-color-blue-light-800-legacy": "#085b80",
      "--ui-color-blue-light-900-legacy": "#064562",
      "--ui-color-gray-50-legacy": "#f9fafb",
      "--ui-color-gray-100-legacy": "#f3f4f6",
      "--ui-color-gray-200-legacy": "#e5e7eb",
      "--ui-color-gray-300-legacy": "#d1d5db",
      "--ui-color-gray-400-legacy": "#9ca3af",
      "--ui-color-gray-500-legacy": "#6b7280",
      "--ui-color-gray-600-legacy": "#4b5563",
      "--ui-color-gray-700-legacy": "#374151",
      "--ui-color-gray-800-legacy": "#1f2937",
      "--ui-color-gray-900-legacy": "#111827",
      "--ui-color-alert-info-bg": "#1a2338",
      "--ui-color-alert-info-border": "rgb(54, 89, 194)",
      "--ui-color-alert-info-text": "rgb(184, 196, 237)",
      "--ui-color-alert-info-icon": "rgb(140, 161, 222)",
      "--ui-color-alert-success-bg": "#14261c",
      "--ui-color-alert-success-border": "rgb(33, 196, 94)",
      "--ui-color-alert-success-text": "rgb(130, 224, 166)",
      "--ui-color-alert-success-icon": "rgb(84, 212, 130)",
      "--ui-color-alert-danger-bg": "#2a1818",
      "--ui-color-alert-danger-border": "rgb(240, 69, 69)",
      "--ui-color-alert-danger-text": "rgb(245, 148, 148)",
      "--ui-color-alert-danger-icon": "rgb(242, 107, 107)",
      "--ui-color-alert-warning-bg": "#2a2414",
      "--ui-color-alert-warning-border": "rgb(235, 179, 8)",
      "--ui-color-alert-warning-text": "rgb(242, 214, 117)",
      "--ui-color-alert-warning-icon": "rgb(240, 196, 64)",
      "--ui-color-icon-on-canvas-inverse": "rgb(77, 79, 84)",
      "--ui-bg-base": "rgb(31, 31, 33)",
      "--ui-text-primary": "rgb(240, 242, 242)",
      "--ui-text-secondary": "rgb(199, 199, 204)",
      "--ui-border-default": "rgb(77, 79, 84)"
    }
  }
}
