neogestify-ui-components 2.1.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/README.md +46 -1
  2. package/dist/components/ElementLibraryBuilder/index.d.mts +5 -0
  3. package/dist/components/ElementLibraryBuilder/index.d.ts +5 -0
  4. package/dist/components/ElementLibraryBuilder/index.js +689 -0
  5. package/dist/components/ElementLibraryBuilder/index.js.map +1 -0
  6. package/dist/components/ElementLibraryBuilder/index.mjs +687 -0
  7. package/dist/components/ElementLibraryBuilder/index.mjs.map +1 -0
  8. package/dist/components/VenueMapEditor/index.d.mts +18 -2
  9. package/dist/components/VenueMapEditor/index.d.ts +18 -2
  10. package/dist/components/VenueMapEditor/index.js +75 -3
  11. package/dist/components/VenueMapEditor/index.js.map +1 -1
  12. package/dist/components/VenueMapEditor/index.mjs +75 -4
  13. package/dist/components/VenueMapEditor/index.mjs.map +1 -1
  14. package/dist/index.d.mts +2 -1
  15. package/dist/index.d.ts +2 -1
  16. package/dist/index.js +468 -3
  17. package/dist/index.js.map +1 -1
  18. package/dist/index.mjs +467 -4
  19. package/dist/index.mjs.map +1 -1
  20. package/package.json +1 -1
  21. package/src/components/ElementLibraryBuilder/builder.tsx +400 -0
  22. package/src/components/ElementLibraryBuilder/index.ts +1 -0
  23. package/src/components/VenueMapEditor/components/ElementNode.tsx +22 -0
  24. package/src/components/VenueMapEditor/components/PropertiesPanel.tsx +17 -4
  25. package/src/components/VenueMapEditor/components/Toolbar.tsx +14 -4
  26. package/src/components/VenueMapEditor/index.ts +2 -0
  27. package/src/components/VenueMapEditor/types.ts +11 -1
  28. package/src/components/VenueMapEditor/utils/svgParser.ts +33 -0
  29. package/src/index.ts +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/icons/icons.tsx","../../../src/components/html/Button.tsx","../../../src/components/html/Input.tsx","../../../src/components/html/TextArea.tsx","../../../src/components/html/Select.tsx","../../../src/components/html/Modal.tsx","../../../src/components/ElementLibraryBuilder/builder.tsx"],"names":["jsx","jsxs","useState"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { Props } from \"../../types/types\";\n\n// Spinner de carga animado\nexport function SpinnerIcon({ className = \"\" }: { className?: string }) {\n return (\n <svg className={`animate-spin h-8 w-8 text-indigo-600 mx-auto mb-4 ${className}`} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8v4a4 4 0 00-4 4H4z\"></path>\n </svg>\n );\n}\n\nexport function AnimateSpin({ className }: Props) {\n return (\n <svg\n className={`animate-spin ${className}`} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"\n >\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path className=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n )\n}\nexport function GearIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n )\n}\n\nexport function CheckIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )\n}\n\nexport function BackIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 19l-7-7m0 0l7-7m-7 7h18\" />\n </svg>\n )\n}\n\nexport function NotFoundIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\n </svg>\n )\n}\n\nexport function BoxIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4\" />\n </svg>\n )\n}\n\nexport function ChartIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z\"\n />\n </svg>\n )\n}\n\nexport function UsersIcon({ className }: Props) {\n return (\n <svg className={className} xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M12 2a5 5 0 1 0 5 5a5 5 0 0 0-5-5m0 8a3 3 0 1 1 3-3a3 3 0 0 1-3 3m9 11v-1a7 7 0 0 0-7-7h-4a7 7 0 0 0-7 7v1h2v-1a5 5 0 0 1 5-5h4a5 5 0 0 1 5 5v1z\" />\n </svg>\n )\n}\n\nexport function DocumentIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n )\n}\n\nexport function LogoutIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1\"\n />\n </svg>\n )\n}\n\nexport function HomeIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6\"\n />\n </svg>\n )\n}\n\nexport function BuildingIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4\"\n />\n </svg>\n )\n}\n\nexport function CashIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M17 9V7a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2m2 4h10a2 2 0 002-2v-6a2 2 0 00-2-2H9a2 2 0 00-2 2v6a2 2 0 002 2zm7-5a2 2 0 11-4 0 2 2 0 014 0z\"\n />\n </svg>\n )\n}\n\nexport function MenuIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 6h16M4 12h16M4 18h16\"\n />\n </svg>\n )\n}\n\nexport function CloseIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n )\n}\n\nexport function AddIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n </svg>\n )\n}\n\nexport function SearchIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"m21 21-6-6m2-5a7 7 0 1 1-14 0 7 7 0 0 1 14 0Z\"\n />\n </svg>\n )\n}\n\nexport function SaveIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 7H5a2 2 0 00-2 2v9a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-3m-1 4l-3 3m0 0l-3-3m3 3V4\"\n />\n </svg>\n )\n}\n\nexport function CancelIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n )\n}\n\nexport function DeleteIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n )\n}\n\nexport function EditIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\"\n />\n </svg>\n )\n}\n\nexport function CategorieIcon({ className }: Props) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={className} viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M11.15 3.4L7.43 9.48c-.41.66.07 1.52.85 1.52h7.43c.78 0 1.26-.86.85-1.52L12.85 3.4a.993.993 0 0 0-1.7 0\" /><circle cx=\"17.5\" cy=\"17.5\" r=\"4.5\" fill=\"currentColor\" /><path fill=\"currentColor\" d=\"M4 21.5h6c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1\" /></svg>\n )\n}\n\nexport function FolderIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z\"\n />\n </svg>\n )\n}\n\nexport function ArrowIcon({ className }: Props) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={className} viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M17.77 3.77L16 2L6 12l10 10l1.77-1.77L9.54 12z\" /></svg>\n )\n}\n\nexport function FilterIcon({ className }: Props) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={className} viewBox=\"0 0 24 24\"><path fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M11.36 20.213L9 21v-8.5L4.52 7.572A2 2 0 0 1 4 6.227V4h16v2.172a2 2 0 0 1-.586 1.414L15 12m0 6a3 3 0 1 0 6 0a3 3 0 1 0-6 0m5.2 2.2L22 22\" /></svg>\n )\n}\n\nexport function QuestionIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n}\n\nexport function LocationIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n )\n}\n\nexport function CalendarIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n )\n}\n\nexport function InfoIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n}\n\nexport function MoonIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z\" />\n </svg>\n )\n}\n\nexport function SunIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z\" />\n </svg>\n )\n}\n\nexport function CamaraIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 13a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n )\n}\n\nexport function ArrowLeftIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n )\n}\n\nexport function ArrowRightIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n )\n}\n\nexport function TrashIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n )\n}\n\nexport function MinusIcon({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M20 12H4\" />\n </svg>\n );\n}\n\nexport function MoneyIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n}\n\nexport function PercentIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 7h6m0 10v-3m-3 3h.01M9 17h.01M9 14h.01M12 14h.01M15 11h.01M12 11h.01M9 11h.01M7 21h10a2 2 0 002-2V5a2 2 0 00-2-2H7a2 2 0 00-2 2v14a2 2 0 002 2z\" />\n </svg>\n )\n}\n\nexport function StackIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 7h16M4 12h16M4 17h16\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 3v18M17 3v18\" />\n </svg>\n )\n}\n\nexport function ClockIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n}\n\nexport function CheckCircleIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n}\n\nexport function CajasIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z\" />\n </svg>\n )\n}\n\nexport function PrinterIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M17 17h2a2 2 0 002-2v-4a2 2 0 00-2-2H5a2 2 0 00-2 2v4a2 2 0 002 2h2m2 4h6a2 2 0 002-2v-4a2 2 0 00-2-2H9a2 2 0 00-2 2v4a2 2 0 002 2zm8-12V5a2 2 0 00-2-2H9a2 2 0 00-2 2v4h10z\" />\n </svg>\n )\n}\n\nexport function NetworkIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2m-2-4h.01M17 16h.01\" />\n </svg>\n )\n}\n\nexport function TestIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z\" />\n </svg>\n )\n}\n\nexport function FacturacionIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 6l4 4\" />\n <text x=\"12\" y=\"16\" fontSize=\"8\" fill=\"currentColor\" textAnchor=\"middle\">$</text>\n </svg>\n )\n}\n\nexport function WhatsAppIcon({ className }: Props) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"currentColor\" className={className} viewBox=\"0 0 24 24\"><path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52s.198-.298.298-.497c.099-.198.05-.371-.025-.52s-.669-1.612-.916-2.207c-.242-.579-.487-.5-.669-.51a13 13 0 0 0-.57-.01c-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074s2.096 3.2 5.077 4.487c.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413s.248-1.289.173-1.413c-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 0 1-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 0 1-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.82 9.82 0 0 1 2.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.82 11.82 0 0 0 12.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.9 11.9 0 0 0 5.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.82 11.82 0 0 0-3.478-8.413\" /></svg>\n )\n}\n\nexport function ArchiveIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4\" />\n </svg>\n )\n}\n\nexport function CopyIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" />\n </svg>\n )\n}\n\nexport function PasteIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\" />\n </svg>\n )\n}\n\nexport function RestaurantMenuIcon({ className }: Props) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={className} viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M6 22q-.825 0-1.412-.587T4 20v-2q-.425 0-.712-.288T3 17t.288-.712T4 16v-3q-.425 0-.712-.288T3 12t.288-.712T4 11V8q-.425 0-.712-.288T3 7t.288-.712T4 6V4q0-.825.588-1.412T6 2h12q.825 0 1.413.588T20 4v16q0 .825-.587 1.413T18 22zm0-2h12V4H6v2q.425 0 .713.288T7 7t-.288.713T6 8v3q.425 0 .713.288T7 12t-.288.713T6 13v3q.425 0 .713.288T7 17t-.288.713T6 18zm3.5-7v3.25q0 .325.213.538t.537.212.538-.213.212-.537V13q.65-.175 1.075-.712t.425-1.213V7.5q0-.2-.15-.35T12 7t-.35.15-.15.35v3.275h-.75V7.5q0-.2-.15-.35T10.25 7t-.35.15-.15.35v3.275H9V7.5q0-.2-.15-.35T8.5 7t-.35.15T8 7.5v3.575q0 .675.425 1.213T9.5 13m5.5 0v3.25q0 .325.213.538t.537.212.538-.213.212-.537V7.575q0-.275-.187-.425T15.825 7q-.325 0-.712.175t-.738.525q-.425.425-.65.963T13.5 9.825V12q0 .425.288.713T14.5 13zm-9 7V4z\" /></svg>\n )\n}\n\nexport function CloudIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 15a4 4 0 004 4h9a5 5 0 10-.1-9.999 5.002 5.002 0 10-9.78 2.096A4.001 4.001 0 003 15z\" />\n </svg>\n )\n}\n\nexport function ShieldIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z\" />\n </svg>\n )\n}\n\nexport function BarsChartsIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z\" />\n </svg>\n )\n}\n\nexport function LightingIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n </svg>\n )\n}\n\nexport function LifeGuardIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M18.364 5.636l-3.536 3.536m0 5.656l3.536 3.536M9.172 9.172L5.636 5.636m3.536 9.192l-3.536 3.536M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-5 0a4 4 0 11-8 0 4 4 0 018 0z\" />\n </svg>\n )\n}\n\nexport function MonitorIcon({ className }: Props) {\n return (\n <svg className={className} xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M4 18q-.825 0-1.412-.587T2 16V5q0-.825.588-1.412T4 3h16q.825 0 1.413.588T22 5v11q0 .825-.587 1.413T20 18h-3l.7.7q.15.15.225.338t.075.387V20q0 .425-.288.712T17 21H7q-.425 0-.712-.288T6 20v-.575q0-.2.075-.387T6.3 18.7L7 18zm0-2h16V5H4zm0 0V5z\" />\n </svg>\n )\n}\n\nexport function TruckIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M8.25 18.75a1.5 1.5 0 0 1-3 0m3 0a1.5 1.5 0 0 0-3 0m3 0h6m-9 0H3.375a1.125 1.125 0 0 1-1.125-1.125V14.25m17.25 4.5a1.5 1.5 0 0 1-3 0m3 0a1.5 1.5 0 0 0-3 0m3 0h1.125c.621 0 1.129-.504 1.09-1.124a17.902 17.902 0 0 0-3.213-9.193 2.056 2.056 0 0 0-1.58-.86H14.25M16.5 18.75h-2.25m0-11.177v-.958c0-.568-.422-1.048-.987-1.106a48.554 48.554 0 0 0-10.026 0 1.106 1.106 0 0 0-.987 1.106v7.635m12-6.677v6.677m0 4.5v-4.5m0 0h-12\" />\n </svg>\n )\n}\n\nexport function IconCursor({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path d=\"M2 1l12 5.5-5.5 1.5L7 13.5 2 1z\" />\n </svg>\n );\n}\n\nexport function IconHand({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path d=\"M8 1a1 1 0 011 1v4.586l1.293-1.293a1 1 0 111.414 1.414L8 10.414 4.293 6.707a1 1 0 111.414-1.414L7 6.586V2a1 1 0 011-1z\" />\n <path d=\"M3 8a1 1 0 011-1h.5V4.5a1 1 0 012 0V7h1V3.5a1 1 0 012 0V7h1V4.5a1 1 0 012 0V9a5 5 0 01-5 5H6A3 3 0 013 11V8z\" />\n </svg>\n );\n}\n\nexport function IconGrid({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path\n fillRule=\"evenodd\"\n d=\"M1 1h6v6H1V1zm8 0h6v6H9V1zM1 9h6v6H1V9zm8 0h6v6H9V9z\"\n clipRule=\"evenodd\"\n opacity={0.7}\n />\n </svg>\n );\n}\n\nexport function IconZoomIn({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path d=\"M6.5 1a5.5 5.5 0 104.39 8.803l3.154 3.153a.75.75 0 001.06-1.06l-3.153-3.154A5.5 5.5 0 006.5 1zM2.5 6.5a4 4 0 118 0 4 4 0 01-8 0zM6 4.75a.75.75 0 011.5 0V6h1.25a.75.75 0 010 1.5H7.5v1.25a.75.75 0 01-1.5 0V7.5H4.75a.75.75 0 010-1.5H6V4.75z\" />\n </svg>\n );\n}\n\nexport function IconZoomOut({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path d=\"M6.5 1a5.5 5.5 0 104.39 8.803l3.154 3.153a.75.75 0 001.06-1.06l-3.153-3.154A5.5 5.5 0 006.5 1zM2.5 6.5a4 4 0 118 0 4 4 0 01-8 0zM4.75 6a.75.75 0 000 1.5h3.5a.75.75 0 000-1.5h-3.5z\" />\n </svg>\n );\n}\n\nexport function IconReset({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path d=\"M8 1a7 7 0 100 14A7 7 0 008 1zm0 1.5a5.5 5.5 0 110 11 5.5 5.5 0 010-11zM8 4a.75.75 0 01.75.75v3.19l1.28 1.28a.75.75 0 01-1.06 1.06l-1.5-1.5A.75.75 0 017.25 8V4.75A.75.75 0 018 4z\" />\n </svg>\n );\n}\n\nexport function IconUndo({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path d=\"M2.5 5.5A.5.5 0 013 5h5a5 5 0 110 10H3a.5.5 0 010-1h5a4 4 0 100-8H3.707l1.647 1.646a.5.5 0 01-.708.708l-2.5-2.5a.5.5 0 010-.708l2.5-2.5a.5.5 0 01.708.708L3.207 5H3a.5.5 0 01-.5-.5z\" />\n </svg>\n );\n}\n\nexport function IconRedo({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path d=\"M13.5 5.5A.5.5 0 0113 5H8a4 4 0 100 8h5a.5.5 0 010 1H8A5 5 0 118 5h4.293l-1.647-1.646a.5.5 0 01.708-.708l2.5 2.5a.5.5 0 010 .708l-2.5 2.5a.5.5 0 01-.708-.708L12.793 6H13a.5.5 0 01.5.5z\" />\n </svg>\n );\n}\n\nexport function IconPlace({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path d=\"M2 2a.5.5 0 01.5-.5h2a.5.5 0 010 1H3v1.5a.5.5 0 01-1 0V2zm11 0a.5.5 0 00-.5-.5h-2a.5.5 0 000 1H12v1.5a.5.5 0 001 0V2zM2 14a.5.5 0 00.5.5h2a.5.5 0 000-1H3v-1.5a.5.5 0 00-1 0V14zm11 0a.5.5 0 01-.5.5h-2a.5.5 0 010-1H12v-1.5a.5.5 0 011 0V14zM8 4.5a.5.5 0 000 1V7H6.5a.5.5 0 000 1H8v1.5a.5.5 0 001 0V8h1.5a.5.5 0 000-1H9V5.5a.5.5 0 00-1 0z\" />\n </svg>\n );\n}\n\nexport function IconErase({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path d=\"M8.086 2.207a2 2 0 012.828 0l2.879 2.878a2 2 0 010 2.83l-7.513 7.51A2 2 0 014.872 16H2.4a1 1 0 01-.966-.741L.8 13.2a2 2 0 01.5-1.946l7.786-9.047zM7.586 5L5 7.586 8.414 11 11 8.414 7.586 5zM6 12L4 10l-1.5 1.5a1 1 0 000 1.414l.587.587A1 1 0 003.793 15H5l1-1-1-1 1-1z\" />\n </svg>\n );\n}\n\nexport function IconDuplicate({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path d=\"M4 2a2 2 0 00-2 2v8a2 2 0 002 2h8a2 2 0 002-2V4a2 2 0 00-2-2H4zm0 1h8a1 1 0 011 1v8a1 1 0 01-1 1H4a1 1 0 01-1-1V4a1 1 0 011-1z\" />\n <path d=\"M2 5H1a1 1 0 00-1 1v8a1 1 0 001 1h8a1 1 0 001-1v-1H9v1H1V6h1V5z\" />\n </svg>\n );\n}\n\nexport function IconWall({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {/* Two parallel lines forming a wall corner — represents wall cross-section */}\n <path strokeWidth=\"2\" d=\"M3 14 L3 2 L14 2\" />\n <path strokeWidth=\"2\" d=\"M6 14 L6 5 L14 5\" />\n </svg>\n );\n}\n\nexport function IconDownload({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path d=\"M.5 9.9a.5.5 0 01.5.5v2.5a1 1 0 001 1h12a1 1 0 001-1v-2.5a.5.5 0 011 0v2.5a2 2 0 01-2 2H2a2 2 0 01-2-2v-2.5a.5.5 0 01.5-.5z\"/>\n <path d=\"M7.646 11.854a.5.5 0 00.708 0l3-3a.5.5 0 00-.708-.708L8.5 10.293V1.5a.5.5 0 00-1 0v8.793L5.354 8.146a.5.5 0 10-.708.708l3 3z\"/>\n </svg>\n );\n}\n\nexport function IconUpload({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path d=\"M.5 9.9a.5.5 0 01.5.5v2.5a1 1 0 001 1h12a1 1 0 001-1v-2.5a.5.5 0 011 0v2.5a2 2 0 01-2 2H2a2 2 0 01-2-2v-2.5a.5.5 0 01.5-.5z\"/>\n <path d=\"M7.646 1.146a.5.5 0 01.708 0l3 3a.5.5 0 01-.708.708L8.5 2.707V11.5a.5.5 0 01-1 0V2.707L5.354 4.854a.5.5 0 11-.708-.708l3-3z\"/>\n </svg>\n );\n}\n\nexport function IconPolygon({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"none\" stroke=\"currentColor\" strokeLinejoin=\"round\">\n <path strokeWidth=\"1.5\" d=\"M8 2 L14 6 L12 13 L4 13 L2 6 Z\"/>\n <circle cx=\"8\" cy=\"2\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\"/>\n <circle cx=\"14\" cy=\"6\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\"/>\n <circle cx=\"12\" cy=\"13\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\"/>\n <circle cx=\"4\" cy=\"13\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\"/>\n <circle cx=\"2\" cy=\"6\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\"/>\n </svg>\n );\n}\n\nexport function IconLayers({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path d=\"M8.235 1.559a.5.5 0 0 0-.47 0l-7.5 4a.5.5 0 0 0 0 .882L3.188 8 .265 9.559a.5.5 0 0 0 0 .882l7.5 4a.5.5 0 0 0 .47 0l7.5-4a.5.5 0 0 0 0-.882L12.813 8l2.922-1.559a.5.5 0 0 0 0-.882l-7.5-4zm3.515 7.008L14.438 10 8 13.433 1.562 10 4.25 8.567l3.515 1.874a.5.5 0 0 0 .47 0l3.515-1.874zM8 9.433 1.562 6 8 2.567 14.438 6 8 9.433z\"/>\n </svg>\n );\n}","import { AnimateSpin } from '../icons/icons';\nimport { type ButtonHTMLAttributes, type FC, type ReactNode } from 'react';\n\ninterface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'primary' | 'secondary' | 'icon' | 'danger' | 'success' | 'outline' | 'nav' | 'custom' | 'link' | 'warning' | 'toggle';\n children: ReactNode;\n isLoading?: boolean;\n loadingText?: string;\n isActive?: boolean;\n}\n\nexport const Button: FC<ButtonProps> = ({\n variant = 'primary',\n children,\n isLoading = false,\n loadingText,\n isActive = false,\n className = '',\n disabled,\n ...props\n}) => {\n const baseClasses = 'transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed cursor-pointer';\n\n const variantClasses = {\n primary: 'py-2 px-2 border border-indigo-600/20 dark:border-indigo-500/20 text-sm font-medium rounded-md text-white bg-indigo-600 hover:bg-indigo-700 dark:bg-indigo-500 dark:hover:bg-indigo-600 focus:outline-none focus:ring-2 focus:ring-indigo-500 dark:focus:ring-indigo-400 focus:ring-offset-2 focus:ring-offset-gray-50 dark:focus:ring-offset-gray-900',\n secondary: 'p-2 text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white hover:bg-gray-200 dark:hover:bg-gray-800 rounded-md border border-gray-300 dark:border-gray-600 shadow-sm hover:shadow-md focus:outline-none focus:ring-2 focus:ring-indigo-500 dark:focus:ring-indigo-400 focus:ring-offset-2 focus:ring-offset-gray-50 dark:focus:ring-offset-gray-900',\n icon: 'p-2 text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white hover:bg-gray-200 dark:hover:bg-gray-800 rounded-full focus:outline-none focus:ring-2 focus:ring-indigo-500 dark:focus:ring-indigo-400 focus:ring-offset-2 focus:ring-offset-gray-50 dark:focus:ring-offset-gray-900',\n danger: 'py-2 px-2 border border-red-600/20 dark:border-red-500/20 text-sm font-medium rounded-md text-white bg-red-600 hover:bg-red-700 dark:bg-red-500 dark:hover:bg-red-600 focus:outline-none focus:ring-2 focus:ring-red-500 dark:focus:ring-red-400 focus:ring-offset-2 focus:ring-offset-gray-50 dark:focus:ring-offset-gray-900',\n success: 'py-2 px-2 border border-green-600/20 dark:border-green-500/20 text-sm font-medium rounded-md text-white bg-green-600 hover:bg-green-700 dark:bg-green-500 dark:hover:bg-green-600 focus:outline-none focus:ring-2 focus:ring-green-500 dark:focus:ring-green-400 focus:ring-offset-2 focus:ring-offset-gray-50 dark:focus:ring-offset-gray-900',\n outline: 'py-2 px-2 border border-gray-300 dark:border-gray-600 text-sm font-medium rounded-md text-gray-700 dark:text-gray-300 bg-transparent hover:bg-gray-100 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-indigo-500 dark:focus:ring-indigo-400 focus:ring-offset-2 focus:ring-offset-gray-50 dark:focus:ring-offset-gray-900',\n nav: 'w-full flex items-center px-4 py-2 text-sm font-medium rounded-md transition-all duration-200 hover:scale-105 text-gray-700 dark:text-gray-300 dark:hover:text-white hover:shadow-lg focus:outline-none focus:ring-2 focus:ring-indigo-500 dark:focus:ring-indigo-400 focus:ring-offset-2 focus:ring-offset-gray-50 dark:focus:ring-offset-gray-900',\n custom: \"\",\n link: 'text-sm text-indigo-600 dark:text-indigo-400 hover:text-indigo-700 dark:hover:text-indigo-300 transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-indigo-500 dark:focus:ring-indigo-400 focus:ring-offset-2 focus:ring-offset-gray-50 dark:focus:ring-offset-gray-900 rounded-lg px-2',\n warning: 'py-2 px-2 border border-yellow-600/20 dark:border-yellow-500/20 text-sm font-medium rounded-md text-white bg-yellow-600 hover:bg-yellow-700 dark:bg-yellow-500 dark:hover:bg-yellow-600 focus:outline-none focus:ring-2 focus:ring-yellow-500 dark:focus:ring-yellow-400 focus:ring-offset-2 focus:ring-offset-gray-50 dark:focus:ring-offset-gray-900',\n toggle: 'px-2 py-2 rounded-lg font-medium transition-all duration-200 disabled:cursor-not-allowed border-2 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 focus:ring-offset-gray-50 dark:focus:ring-offset-gray-900'\n };\n\n let classes = `${baseClasses} ${variantClasses[variant]} ${className}`;\n\n if (variant === 'nav' && isActive) {\n classes += ' bg-indigo-600 dark:bg-indigo-500 hover:bg-indigo-700 dark:hover:bg-indigo-600 text-white shadow-lg scale-105';\n }\n\n if (variant === 'nav' && !isActive) {\n classes += ' hover:bg-white dark:hover:bg-gray-700 hover:shadow-lg';\n }\n\n if (variant === 'toggle') {\n if (isActive) {\n classes += ' bg-indigo-600 text-white border-indigo-600/30 dark:border-indigo-500/30 hover:bg-indigo-700';\n } else {\n classes += ' bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300 border-gray-300 dark:border-gray-600 hover:bg-gray-300 dark:hover:bg-gray-600 hover:border-gray-400 dark:hover:border-gray-500';\n }\n }\n\n return (\n <button\n className={classes}\n disabled={disabled || isLoading}\n {...props}\n >\n {isLoading ? (\n <>\n <AnimateSpin className=\"h-5 w-5 mr-2 inline-block text-current\" />\n {loadingText || 'Cargando...'}\n </>\n ) : (\n children\n )}\n </button>\n );\n};","import { type InputHTMLAttributes, type FC, type ReactNode } from 'react';\n\ninterface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n label?: string | ReactNode;\n error?: string;\n helperText?: string;\n icon?: ReactNode;\n iconSide?: 'left' | 'right';\n}\n\nexport const Input: FC<InputProps> = ({\n label,\n error,\n helperText,\n icon,\n iconSide = 'left',\n className = '',\n id,\n type,\n ...props\n}) => {\n const inputId = id || `input-${Math.random().toString(36).substring(2, 9)}`;\n\n // ── Default text input ────────────────────────────────────────────────────\n const baseClasses = 'appearance-none relative block w-full px-3 py-2 border placeholder-gray-500 dark:placeholder-gray-400 text-gray-900 dark:text-white bg-white dark:bg-gray-800 rounded-md focus:outline-none focus:ring-2 focus:ring-indigo-500 dark:focus:ring-indigo-400 focus:border-indigo-500 focus:z-10 sm:text-sm disabled:opacity-50 disabled:cursor-not-allowed transition-colors duration-200';\n const errorClasses = error ? 'border-red-300 dark:border-red-600 focus:ring-red-500 dark:focus:ring-red-400 focus:border-red-500' : 'border-gray-300 dark:border-gray-600';\n const iconPaddingLeft = icon && iconSide === 'left' ? 'pl-9' : '';\n const iconPaddingRight = icon && iconSide === 'right' ? 'pr-9' : '';\n const classes = `${baseClasses} ${errorClasses} ${iconPaddingLeft} ${iconPaddingRight} ${className}`.trim();\n\n // ── Checkbox / Radio ──────────────────────────────────────────────────────\n const toggleShape = type === 'radio' ? 'rounded-full' : 'rounded';\n const toggleBaseClasses = `h-4 w-4 ${toggleShape} border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800 text-indigo-600 dark:text-indigo-400 focus:outline-none focus:ring-2 focus:ring-indigo-500 dark:focus:ring-indigo-400 focus:ring-offset-2 focus:ring-offset-white dark:focus:ring-offset-gray-900 disabled:opacity-50 disabled:cursor-not-allowed transition-colors duration-200 cursor-pointer`;\n const toggleErrorClasses = error ? 'border-red-300 dark:border-red-600 focus:ring-red-500 dark:focus:ring-red-400' : '';\n const toggleClasses = `${toggleBaseClasses} ${toggleErrorClasses}`.trim();\n\n // ── File input ────────────────────────────────────────────────────────────\n const fileBaseClasses = 'block w-full sm:text-sm text-gray-500 dark:text-gray-400 bg-white dark:bg-gray-800 border rounded-md focus:outline-none focus:ring-2 focus:ring-indigo-500 dark:focus:ring-indigo-400 focus:border-indigo-500 disabled:opacity-50 disabled:cursor-not-allowed transition-colors duration-200 file:mr-4 file:py-2 file:px-4 file:rounded-l-md file:border-0 file:text-sm file:font-medium file:bg-indigo-50 file:text-indigo-700 dark:file:bg-indigo-900/50 dark:file:text-indigo-300 hover:file:bg-indigo-100 dark:hover:file:bg-indigo-800/50 file:transition-colors file:duration-200 file:cursor-pointer';\n const fileErrorClasses = error ? 'border-red-300 dark:border-red-600 focus:ring-red-500 dark:focus:ring-red-400' : 'border-gray-300 dark:border-gray-600';\n const fileClasses = `${fileBaseClasses} ${fileErrorClasses} ${className}`.trim();\n\n const hasHidden = Boolean(className && /\\bhidden\\b/.test(className));\n const wrapperBase = 'space-y-1 w-full';\n const wrapperClasses = hasHidden ? `${wrapperBase} hidden` : wrapperBase;\n\n const labelNode = label && (\n typeof label === 'string' ? (\n <label htmlFor={inputId} className=\"block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {label}\n </label>\n ) : label\n );\n\n const errorNode = error && (\n <p className=\"text-sm text-red-600 dark:text-red-400\" role=\"alert\">{error}</p>\n );\n\n const helperNode = helperText && !error && (\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">{helperText}</p>\n );\n\n if (type === 'checkbox' || type === 'radio') {\n return (\n <div className={wrapperClasses}>\n <div className=\"flex items-center space-x-2\">\n <input id={inputId} type={type} className={toggleClasses} {...props} />\n {labelNode}\n </div>\n {errorNode}\n {helperNode}\n </div>\n );\n }\n\n if (type === 'file') {\n return (\n <div className={wrapperClasses}>\n {labelNode}\n <input id={inputId} type=\"file\" className={fileClasses} {...props} />\n {errorNode}\n {helperNode}\n </div>\n );\n }\n\n return (\n <div className={wrapperClasses}>\n {labelNode}\n <div className=\"relative\">\n {icon && iconSide === 'left' && (\n <div className=\"pointer-events-none absolute inset-y-0 left-0 z-10 flex items-center pl-3 text-gray-400 dark:text-gray-500\">\n {icon}\n </div>\n )}\n <input id={inputId} className={classes} type={type} {...props} />\n {icon && iconSide === 'right' && (\n <div className=\"pointer-events-none absolute inset-y-0 right-0 z-10 flex items-center pr-3 text-gray-400 dark:text-gray-500\">\n {icon}\n </div>\n )}\n </div>\n {errorNode}\n {helperNode}\n </div>\n );\n};\n","import { type TextareaHTMLAttributes, type FC, type ReactNode } from 'react';\n\ninterface TextAreaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n label?: string | ReactNode;\n error?: string;\n helperText?: string;\n variant?: 'default' | 'outline' | 'filled' | 'minimal';\n size?: 'small' | 'medium' | 'large';\n}\n\nexport const TextArea: FC<TextAreaProps> = ({\n label,\n error,\n helperText,\n variant = 'default',\n size = 'medium',\n className = '',\n id,\n ...props\n}) => {\n const textAreaId = id || `textarea-${Math.random().toString(36).substring(2, 9)}`;\n\n const sizeClasses = {\n small: 'px-2 py-1 text-xs',\n medium: 'px-3 py-2 text-sm',\n large: 'px-4 py-3 text-base'\n };\n\n const variantClasses = {\n default: 'border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800',\n outline: 'border-2 border-indigo-300 dark:border-indigo-600 bg-transparent',\n filled: 'border-gray-300 dark:border-gray-600 bg-gray-100 dark:bg-gray-700',\n minimal: 'border-0 bg-transparent focus:ring-0 focus:border-0'\n };\n\n const baseClasses = 'appearance-none relative block w-full placeholder-gray-500 dark:placeholder-gray-400 text-gray-900 dark:text-white rounded-md border focus:outline-none focus:ring-2 focus:ring-indigo-500 dark:focus:ring-indigo-400 focus:border-indigo-500 focus:z-10 disabled:opacity-50 disabled:cursor-not-allowed transition-colors duration-200 resize-y';\n\n const errorClasses = error ? 'border-red-300 dark:border-red-600 focus:ring-red-500 dark:focus:ring-red-400 focus:border-red-500' : '';\n\n const classes = `${baseClasses} ${sizeClasses[size]} ${variantClasses[variant]} ${errorClasses} ${className}`;\n\n return (\n <div className=\"space-y-1 w-full\">\n {label && typeof label === 'string' ? (\n <label\n htmlFor={textAreaId}\n className=\"block text-sm font-medium text-gray-700 dark:text-gray-300\"\n >\n {label}\n </label>\n ) : (\n label\n )}\n <textarea\n id={textAreaId}\n className={classes}\n {...props}\n />\n {error && (\n <p className=\"text-sm text-red-600 dark:text-red-400\" role=\"alert\">\n {error}\n </p>\n )}\n {helperText && !error && (\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {helperText}\n </p>\n )}\n </div>\n );\n};","import { type SelectHTMLAttributes, type FC, type ReactNode } from 'react';\n\ninterface Option {\n value: string | number;\n label: string;\n disabled?: boolean;\n selected?: boolean;\n}\n\ninterface SelectProps extends Omit<SelectHTMLAttributes<HTMLSelectElement>, 'size'> {\n options: Option[];\n placeholder?: string;\n variant?: 'default' | 'small';\n error?: boolean;\n helperText?: string;\n label?: string | ReactNode;\n}\n\nexport const Select: FC<SelectProps> = ({\n options,\n placeholder,\n variant = 'default',\n error = false,\n helperText,\n label,\n className = '',\n id,\n ...props\n}) => {\n const selectId = id || `select-${Math.random().toString(36).substring(2, 9)}`;\n\n const getVariantClasses = () => {\n const baseClasses = 'appearance-none relative block w-full px-3 py-2 border placeholder-gray-500 dark:placeholder-gray-400 text-gray-900 dark:text-white bg-white dark:bg-gray-800 rounded-md focus:outline-none focus:ring-2 focus:ring-indigo-500 dark:focus:ring-indigo-400 focus:border-indigo-500 focus:z-10 sm:text-sm disabled:opacity-50 disabled:cursor-not-allowed transition-colors duration-200';\n\n if (variant === 'small') {\n return `${baseClasses.replace('px-3 py-2', 'px-2.5 py-1.5 text-sm')} border-gray-300 dark:border-gray-600`;\n }\n\n return `${baseClasses} border-gray-300 dark:border-gray-600 ${error ? 'border-red-300 dark:border-red-600 focus:ring-red-500 dark:focus:ring-red-400 focus:border-red-500' : ''}`;\n };\n\n const getOptionClasses = (option: Option) => {\n return `bg-white dark:bg-gray-800 text-gray-900 dark:text-white py-2 ${option.disabled ? 'opacity-50 cursor-not-allowed' : ''}`;\n };\n\n const combinedClassName = `${getVariantClasses()} ${className}`.trim();\n\n return (\n <div className=\"space-y-1 w-full\">\n {label && typeof label === 'string' ? (\n <label htmlFor={selectId} className=\"block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {label}\n </label>\n ) : (\n label\n )}\n <select id={selectId} className={combinedClassName} {...props}>\n {placeholder && placeholder.trim() && (\n <option value=\"\" disabled selected className=\"bg-white dark:bg-gray-800 text-gray-500 dark:text-gray-400 py-2\">\n {placeholder}\n </option>\n )}\n {options.map((option) => (\n <option\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n selected={option.selected}\n className={getOptionClasses(option)}\n >\n {option.label}\n </option>\n ))}\n </select>\n {helperText && (\n <p className={`text-sm ${error ? 'text-red-600 dark:text-red-400' : 'text-gray-500 dark:text-gray-400'}`}>\n {helperText}\n </p>\n )}\n </div>\n );\n};","import { Button } from './Button';\nimport { CloseIcon } from '../icons/icons';\nimport React, { useEffect, useState, forwardRef, useImperativeHandle } from 'react';\n\ninterface ModalProps {\n onClose: () => void;\n title: string;\n children: React.ReactNode;\n footer?: React.ReactNode;\n maxWidth?: string;\n showCloseButton?: boolean;\n zIndex?: number;\n}\n\nexport interface ModalRef {\n handleClose: () => void;\n}\n\nexport const Modal = forwardRef<ModalRef, ModalProps>(({\n onClose,\n title,\n children,\n footer,\n maxWidth = 'max-w-2xl',\n showCloseButton = true,\n zIndex = 50\n}, ref) => {\n const [show, setShow] = useState(false);\n\n useEffect(() => {\n setShow(true);\n }, []);\n\n const handleClose = () => {\n setShow(false);\n setTimeout(() => {\n onClose();\n }, 300);\n };\n\n useImperativeHandle(ref, () => ({\n handleClose\n }));\n\n return (\n <dialog\n open={show}\n className={`fixed inset-0 w-full h-full flex items-center justify-center p-4 ${show && 'opacity-100'} transition-opacity opacity-0 duration-300 bg-gray-900/60 backdrop-blur-sm`}\n style={{ zIndex: zIndex - 10 }}\n >\n <article\n className={`relative bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-2xl w-full ${maxWidth} max-h-[90vh] flex flex-col overflow-hidden`}\n style={{ zIndex }}\n >\n <header className=\"shrink-0 bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700 px-6 py-4 flex items-center justify-between\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white\">{title}</h2>\n {showCloseButton && (\n <Button\n variant='icon'\n onClick={handleClose}\n className=\"text-gray-400 hover:text-gray-600 dark:hover:text-gray-300\"\n >\n <CloseIcon className=\"w-5 h-5\" />\n </Button>\n )}\n </header>\n <div className=\"flex-1 overflow-y-auto p-6\">\n {children}\n </div>\n {footer && (\n <footer className=\"shrink-0 bg-gray-50 dark:bg-gray-800 border-t border-gray-200 dark:border-gray-700 px-6 py-4 flex justify-end gap-3\">\n {footer}\n </footer>\n )}\n </article>\n </dialog>\n );\n});\n\nModal.displayName = 'Modal';","import React, { useState, useMemo } from 'react';\nimport { ElementShape, ElementTypeDef, ElementLibrary } from '../VenueMapEditor/types';\nimport { Button, Input, Select, TextArea } from '../html';\n\ntype InternalGroup = {\n internalId: string;\n name: string;\n objects: ElementTypeDef[];\n};\n\nconst DEFAULT_ELEMENT: ElementTypeDef = {\n id: '',\n label: '',\n shape: 'rect',\n defaultWidth: 100,\n defaultHeight: 100,\n color: '#cccccc',\n strokeColor: '#000000',\n};\n\nconst SHAPE_OPTIONS = [\n { value: 'rect', label: 'Rectangle' },\n { value: 'circle', label: 'Circle' },\n { value: 'arrow', label: 'Arrow' },\n { value: 'path', label: 'Path' },\n { value: 'svg', label: 'SVG Markup' },\n];\n\nexport const ElementLibraryBuilder: React.FC = () => {\n const [groups, setGroups] = useState<InternalGroup[]>([\n { internalId: crypto.randomUUID(), name: 'defaultGroup', objects: [] }\n ]);\n const [activeGroupId, setActiveGroupId] = useState<string>(groups[0].internalId);\n const [editingGroupId, setEditingGroupId] = useState<string | null>(null);\n\n const [activeElementIndex, setActiveElementIndex] = useState<number | null>(null);\n const [currentElement, setCurrentElement] = useState<ElementTypeDef>({ ...DEFAULT_ELEMENT, id: 'rect_1', label: 'New Rect' });\n const [downloadFileName, setDownloadFileName] = useState<string>(\"libraries\");\n\n // ─── Group management ────────────────────────────────────────────────────────\n\n const handleAddGroup = () => {\n const newGroupId = crypto.randomUUID();\n const newName = `group_${groups.length + 1}`;\n setGroups([...groups, { internalId: newGroupId, name: newName, objects: [] }]);\n setActiveGroupId(newGroupId);\n setActiveElementIndex(null);\n };\n\n const handleRemoveGroup = (id: string) => {\n const newGroups = groups.filter((g) => g.internalId !== id);\n setGroups(newGroups);\n if (activeGroupId === id) {\n if (newGroups.length > 0) {\n setActiveGroupId(newGroups[0].internalId);\n } else {\n setActiveGroupId('');\n }\n setActiveElementIndex(null);\n }\n };\n\n const activeGroup = groups.find((g) => g.internalId === activeGroupId);\n\n // ─── Element management ──────────────────────────────────────────────────────\n\n const handleSelectGroup = (gId: string) => {\n setActiveGroupId(gId);\n setActiveElementIndex(null);\n }\n\n const handleAddElement = () => {\n if (!activeGroup) return;\n\n const newEl = { ...DEFAULT_ELEMENT, id: `shape_${activeGroup.objects.length + 1}`, label: `Shape ${activeGroup.objects.length + 1}` };\n const updatedGroups = groups.map((g) => {\n if (g.internalId === activeGroupId) {\n return { ...g, objects: [...g.objects, newEl] };\n }\n return g;\n });\n setGroups(updatedGroups);\n setActiveElementIndex(activeGroup.objects.length);\n setCurrentElement(newEl);\n };\n\n const handleSelectElement = (idx: number) => {\n if (!activeGroup) return;\n setActiveElementIndex(idx);\n setCurrentElement(activeGroup.objects[idx]);\n };\n\n const handleRemoveElement = (idx: number) => {\n if (!activeGroup) return;\n const updatedGroups = groups.map((g) => {\n if (g.internalId === activeGroupId) {\n const newObjs = [...g.objects];\n newObjs.splice(idx, 1);\n return { ...g, objects: newObjs };\n }\n return g;\n });\n setGroups(updatedGroups);\n if (activeElementIndex === idx) {\n setActiveElementIndex(null);\n } else if (activeElementIndex !== null && activeElementIndex > idx) {\n setActiveElementIndex(activeElementIndex - 1);\n }\n };\n\n const handleSaveElement = () => {\n if (!activeGroup || activeElementIndex === null) return;\n const updatedGroups = groups.map((g) => {\n if (g.internalId === activeGroupId) {\n const newObjs = [...g.objects];\n newObjs[activeElementIndex] = { ...currentElement };\n return { ...g, objects: newObjs };\n }\n return g;\n });\n setGroups(updatedGroups);\n };\n\n // ─── Helpers ─────────────────────────────────────────────────────────────────\n\n const handleFieldChange = (field: keyof ElementTypeDef, value: any) => {\n setCurrentElement((prev) => ({ ...prev, [field]: value }));\n };\n\n const handleSvgMarkupChange = (value: string) => {\n // No manual sanitization needed — JSON.stringify() will automatically escape\n // double quotes and special characters when serializing the output object.\n // Modifying the string here (e.g. collapsing whitespace or replacing quotes)\n // would corrupt the SVG structure (paths, attributes, colors, etc.).\n handleFieldChange('svgMarkup', value);\n };\n\n const generatedLib = useMemo(() => {\n const lib: ElementLibrary = {};\n groups.forEach((g) => {\n lib[g.name] = {\n name: g.name,\n objects: g.objects,\n };\n });\n return JSON.stringify(lib, null, 2);\n }, [groups]);\n\n const handleDownload = () => {\n const blob = new Blob([generatedLib], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${downloadFileName}.json`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n };\n\n // ─── Render ──────────────────────────────────────────────────────────────────\n\n return (\n <div className=\"flex gap-4 p-4 h-full min-h-[600px] text-sm text-gray-900 dark:text-gray-100 bg-white dark:bg-gray-900\">\n {/* Sidebar columns for Groups and Elements */}\n <div className=\"w-1/4 flex flex-col gap-4 border-r dark:border-gray-700 pr-4\">\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"font-bold\">Libraries (Groups)</h3>\n <Button variant='primary' onClick={handleAddGroup}>+ Group</Button>\n </div>\n <div className=\"flex flex-col gap-1 max-h-48 overflow-y-auto pr-1\">\n {groups.map((group) => (\n <div\n key={group.internalId}\n className={`flex items-center justify-between p-2 rounded cursor-pointer ${activeGroupId === group.internalId ? 'bg-indigo-100 text-indigo-900 dark:bg-indigo-900/50 dark:text-indigo-100 font-semibold' : 'hover:bg-gray-100 dark:hover:bg-gray-800'}`}\n onClick={() => handleSelectGroup(group.internalId)}\n >\n {editingGroupId === group.internalId ? (\n <Input\n autoFocus\n value={group.name}\n onChange={(e) => {\n setGroups(groups.map(g => g.internalId === group.internalId ? { ...g, name: e.target.value } : g));\n }}\n onBlur={() => setEditingGroupId(null)}\n onKeyDown={(e) => e.key === 'Enter' && setEditingGroupId(null)}\n />\n ) : (\n <span onDoubleClick={() => setEditingGroupId(group.internalId)}>{group.name}</span>\n )}\n\n {groups.length > 1 && (\n <button onClick={(e) => { e.stopPropagation(); handleRemoveGroup(group.internalId); }} className=\"text-red-500 text-xs\">x</button>\n )}\n </div>\n ))}\n </div>\n </div>\n\n <hr className=\"dark:border-gray-700\" />\n\n <div className=\"flex flex-col gap-2 flex-grow overflow-hidden\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"font-bold\">Elements in {activeGroup?.name || '?'}</h3>\n <Button variant='secondary' onClick={handleAddElement} disabled={!activeGroup}>+ Element</Button>\n </div>\n <div className=\"flex flex-col gap-1 overflow-y-auto flex-grow pr-1\">\n {activeGroup?.objects.map((el, i) => (\n <div\n key={i}\n className={`flex items-center justify-between p-2 rounded cursor-pointer ${activeElementIndex === i ? 'bg-indigo-100 text-indigo-900 dark:bg-indigo-900/50 dark:text-indigo-100 font-semibold' : 'hover:bg-gray-100 dark:hover:bg-gray-800'}`}\n onClick={() => handleSelectElement(i)}\n >\n <span>{el.id} ({el.shape})</span>\n <button onClick={(e) => { e.stopPropagation(); handleRemoveElement(i); }} className=\"text-red-500 text-xs\">x</button>\n </div>\n ))}\n {(!activeGroup || activeGroup.objects.length === 0) && (\n <span className=\"text-gray-400 dark:text-gray-500 italic text-xs\">No elements yet</span>\n )}\n </div>\n </div>\n </div>\n\n {/* Editor Section */}\n <div className=\"flex-1 flex flex-col gap-4 px-2 overflow-y-auto\">\n <h3 className=\"font-bold text-lg\">Element Editor</h3>\n {activeElementIndex !== null ? (\n <div className=\"flex flex-col gap-4 w-full max-w-2xl\">\n <div className=\"grid grid-cols-2 gap-4\">\n <Input\n label=\"Element ID (unique)\"\n value={currentElement.id}\n onChange={(e) => handleFieldChange('id', e.target.value)}\n />\n <Input\n label=\"Label (display name)\"\n value={currentElement.label}\n onChange={(e) => handleFieldChange('label', e.target.value)}\n />\n </div>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <Select\n label=\"Shape\"\n options={SHAPE_OPTIONS}\n value={currentElement.shape}\n onChange={(e) => handleFieldChange('shape', e.target.value as ElementShape)}\n />\n <Input\n label=\"Icon (emoji or class)\"\n value={currentElement.icon || ''}\n onChange={(e) => handleFieldChange('icon', e.target.value)}\n />\n </div>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <Input\n type=\"number\"\n label=\"Default Width\"\n value={currentElement.defaultWidth}\n onChange={(e) => handleFieldChange('defaultWidth', parseFloat(e.target.value) || 0)}\n />\n <Input\n type=\"number\"\n label=\"Default Height\"\n value={currentElement.defaultHeight}\n onChange={(e) => handleFieldChange('defaultHeight', parseFloat(e.target.value) || 0)}\n />\n </div>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"flex flex-col gap-1\">\n <label className=\"text-xs font-semibold text-gray-700\">Fill Color</label>\n <div className=\"flex gap-2\">\n <input\n type=\"color\"\n className=\"w-8 h-8 cursor-pointer rounded\"\n value={currentElement.color}\n onChange={(e) => handleFieldChange('color', e.target.value)}\n />\n <Input\n value={currentElement.color}\n onChange={(e) => handleFieldChange('color', e.target.value)}\n />\n </div>\n </div>\n <div className=\"flex flex-col gap-1\">\n <label className=\"text-xs font-semibold text-gray-700\">Stroke Color</label>\n <div className=\"flex gap-2\">\n <input\n type=\"color\"\n className=\"w-8 h-8 cursor-pointer rounded\"\n value={currentElement.strokeColor}\n onChange={(e) => handleFieldChange('strokeColor', e.target.value)}\n />\n <Input\n value={currentElement.strokeColor}\n onChange={(e) => handleFieldChange('strokeColor', e.target.value)}\n />\n </div>\n </div>\n </div>\n\n {currentElement.shape === 'path' && (\n <div className=\"flex flex-col gap-4 border dark:border-gray-700 p-4 rounded bg-gray-50 dark:bg-gray-800/50\">\n <h4 className=\"font-semibold text-sm\">Path Config</h4>\n <div className=\"grid grid-cols-2 gap-4\">\n <Input\n label=\"ViewBox\"\n placeholder=\"0 0 100 100\"\n value={currentElement.viewBox || ''}\n onChange={(e) => handleFieldChange('viewBox', e.target.value)}\n />\n <Select\n label=\"Fill Rule\"\n options={[\n { value: 'nonzero', label: 'nonzero' },\n { value: 'evenodd', label: 'evenodd' }\n ]}\n value={currentElement.fillRule || 'nonzero'}\n onChange={(e) => handleFieldChange('fillRule', e.target.value)}\n />\n </div>\n <TextArea\n label=\"SVG Path (d attribute)\"\n placeholder=\"M10 10 H 90 V 90 H 10 Z\"\n value={currentElement.svgPath || ''}\n onChange={(e) => handleFieldChange('svgPath', e.target.value)}\n rows={4}\n />\n </div>\n )}\n\n {currentElement.shape === 'svg' && (\n <div className=\"flex flex-col gap-4 border dark:border-amber-700/50 p-4 rounded bg-amber-50 dark:bg-amber-900/10\">\n <h4 className=\"font-semibold text-sm\">SVG Markup (Autosanitized)</h4>\n <p className=\"text-xs text-amber-800 dark:text-amber-400\">\n Paste your raw SVG here. Double quotes will be converted to single quotes automatically to safely embed the string in JSON.\n </p>\n <TextArea\n label=\"raw <svg>...</svg>\"\n value={currentElement.svgMarkup || ''}\n onChange={(e) => handleSvgMarkupChange(e.target.value)}\n rows={6}\n placeholder={\"<svg viewBox='0 0 100 100'><circle cx='50' cy='50' r='50'/></svg>\"}\n />\n </div>\n )}\n\n <div className=\"flex justify-end gap-2 mt-4 pt-4 border-t dark:border-gray-700\">\n <Button onClick={handleSaveElement}>Save Changes to Element</Button>\n </div>\n </div>\n ) : (\n <div className=\"flex items-center justify-center h-full text-gray-400\">\n Select an element to edit or add a new one.\n </div>\n )}\n </div>\n\n {/* output section */}\n <div className=\"w-1/3 flex flex-col gap-2 border-l dark:border-gray-700 pl-4 h-full max-h-full\">\n <div className=\"flex items-center justify-between shrink-0\">\n <h3 className=\"font-bold\">Output JSON</h3>\n <div className=\"flex items-center gap-2\">\n <Input\n value={downloadFileName}\n onChange={(e) => setDownloadFileName(e.target.value)}\n placeholder=\"filename\"\n title=\"Filename without extension\"\n />\n <span className=\"text-xs text-gray-500\">.json</span>\n <Button\n variant=\"secondary\"\n onClick={handleDownload}\n title=\"Download JSON file\"\n >\n Descargar\n </Button>\n <Button\n variant=\"secondary\"\n onClick={() => navigator.clipboard.writeText(generatedLib)}\n >\n Copy\n </Button>\n </div>\n </div>\n <div className=\"flex-1 overflow-hidden h-full pb-4\">\n <TextArea\n readOnly\n className=\"h-full resize-none font-mono text-xs text-green-600 dark:text-green-400 bg-gray-50 dark:bg-gray-900 border-gray-200 dark:border-gray-800\"\n value={generatedLib}\n />\n </div>\n </div>\n </div>\n );\n};\n"]}
@@ -4,7 +4,7 @@ import { WheelEvent, MouseEvent } from 'react';
4
4
 
5
5
  type WallMaterial = 'concrete' | 'brick' | 'glass' | 'drywall' | 'wood';
6
6
  type AreaShape = 'rect' | 'polygon';
7
- type ElementShape = 'rect' | 'circle' | 'arrow' | 'path';
7
+ type ElementShape = 'rect' | 'circle' | 'arrow' | 'path' | 'svg';
8
8
  type ToolMode = 'SELECT' | 'WALL' | 'PLACE' | 'PAN' | 'ERASE';
9
9
  interface WallNode {
10
10
  id: string;
@@ -89,6 +89,16 @@ interface ElementTypeDef {
89
89
  * Defaults to `'nonzero'`.
90
90
  */
91
91
  fillRule?: 'nonzero' | 'evenodd';
92
+ /**
93
+ * Complete SVG markup for `shape === 'svg'`.
94
+ * Must be a valid `<svg>` element with a `viewBox` attribute.
95
+ * The inner content is extracted and rendered inside the element's bounding box,
96
+ * automatically scaled from the viewBox to `width × height`.
97
+ *
98
+ * @example
99
+ * svgMarkup: '<svg viewBox="0 0 100 100"><circle cx="50" cy="50" r="45" fill="none" stroke="currentColor" stroke-width="5"/><path d="M50 10 L90 90 L10 90 Z"/></svg>'
100
+ */
101
+ svgMarkup?: string;
92
102
  }
93
103
  interface DomainConfig {
94
104
  id: string;
@@ -244,4 +254,10 @@ declare const findNearestNode: (x: number, y: number, nodes: Array<{
244
254
  y: number;
245
255
  } | null;
246
256
 
247
- export { type AreaShape, type DomainConfig, type ElementGroup, type ElementLibrary, type ElementShape, type ElementStatus, type ElementTypeDef, type Floor, type FloorArea, type MapElement, type PaletteGroup, type PanZoomState, type ToolMode, type VenueMap, VenueMapEditor, type VenueMapEditorProps, VenueMapViewer, type VenueMapViewerProps, type Wall, type WallMaterial, type WallNode, findNearestNode, genId, snapPoint, snapToGrid, useLibraryStorage, usePanZoom };
257
+ interface ParsedSvgMarkup {
258
+ viewBox: string;
259
+ innerHtml: string;
260
+ }
261
+ declare function parseSvgMarkup(markup: string): ParsedSvgMarkup;
262
+
263
+ export { type AreaShape, type DomainConfig, type ElementGroup, type ElementLibrary, type ElementShape, type ElementStatus, type ElementTypeDef, type Floor, type FloorArea, type MapElement, type PaletteGroup, type PanZoomState, type ParsedSvgMarkup, type ToolMode, type VenueMap, VenueMapEditor, type VenueMapEditorProps, VenueMapViewer, type VenueMapViewerProps, type Wall, type WallMaterial, type WallNode, findNearestNode, genId, parseSvgMarkup, snapPoint, snapToGrid, useLibraryStorage, usePanZoom };
@@ -4,7 +4,7 @@ import { WheelEvent, MouseEvent } from 'react';
4
4
 
5
5
  type WallMaterial = 'concrete' | 'brick' | 'glass' | 'drywall' | 'wood';
6
6
  type AreaShape = 'rect' | 'polygon';
7
- type ElementShape = 'rect' | 'circle' | 'arrow' | 'path';
7
+ type ElementShape = 'rect' | 'circle' | 'arrow' | 'path' | 'svg';
8
8
  type ToolMode = 'SELECT' | 'WALL' | 'PLACE' | 'PAN' | 'ERASE';
9
9
  interface WallNode {
10
10
  id: string;
@@ -89,6 +89,16 @@ interface ElementTypeDef {
89
89
  * Defaults to `'nonzero'`.
90
90
  */
91
91
  fillRule?: 'nonzero' | 'evenodd';
92
+ /**
93
+ * Complete SVG markup for `shape === 'svg'`.
94
+ * Must be a valid `<svg>` element with a `viewBox` attribute.
95
+ * The inner content is extracted and rendered inside the element's bounding box,
96
+ * automatically scaled from the viewBox to `width × height`.
97
+ *
98
+ * @example
99
+ * svgMarkup: '<svg viewBox="0 0 100 100"><circle cx="50" cy="50" r="45" fill="none" stroke="currentColor" stroke-width="5"/><path d="M50 10 L90 90 L10 90 Z"/></svg>'
100
+ */
101
+ svgMarkup?: string;
92
102
  }
93
103
  interface DomainConfig {
94
104
  id: string;
@@ -244,4 +254,10 @@ declare const findNearestNode: (x: number, y: number, nodes: Array<{
244
254
  y: number;
245
255
  } | null;
246
256
 
247
- export { type AreaShape, type DomainConfig, type ElementGroup, type ElementLibrary, type ElementShape, type ElementStatus, type ElementTypeDef, type Floor, type FloorArea, type MapElement, type PaletteGroup, type PanZoomState, type ToolMode, type VenueMap, VenueMapEditor, type VenueMapEditorProps, VenueMapViewer, type VenueMapViewerProps, type Wall, type WallMaterial, type WallNode, findNearestNode, genId, snapPoint, snapToGrid, useLibraryStorage, usePanZoom };
257
+ interface ParsedSvgMarkup {
258
+ viewBox: string;
259
+ innerHtml: string;
260
+ }
261
+ declare function parseSvgMarkup(markup: string): ParsedSvgMarkup;
262
+
263
+ export { type AreaShape, type DomainConfig, type ElementGroup, type ElementLibrary, type ElementShape, type ElementStatus, type ElementTypeDef, type Floor, type FloorArea, type MapElement, type PaletteGroup, type PanZoomState, type ParsedSvgMarkup, type ToolMode, type VenueMap, VenueMapEditor, type VenueMapEditorProps, VenueMapViewer, type VenueMapViewerProps, type Wall, type WallMaterial, type WallNode, findNearestNode, genId, parseSvgMarkup, snapPoint, snapToGrid, useLibraryStorage, usePanZoom };
@@ -93,6 +93,26 @@ function IconUpload({ className }) {
93
93
  function IconLayers({ className }) {
94
94
  return /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 16 16", className, fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M8.235 1.559a.5.5 0 0 0-.47 0l-7.5 4a.5.5 0 0 0 0 .882L3.188 8 .265 9.559a.5.5 0 0 0 0 .882l7.5 4a.5.5 0 0 0 .47 0l7.5-4a.5.5 0 0 0 0-.882L12.813 8l2.922-1.559a.5.5 0 0 0 0-.882l-7.5-4zm3.515 7.008L14.438 10 8 13.433 1.562 10 4.25 8.567l3.515 1.874a.5.5 0 0 0 .47 0l3.515-1.874zM8 9.433 1.562 6 8 2.567 14.438 6 8 9.433z" }) });
95
95
  }
96
+
97
+ // src/components/VenueMapEditor/utils/svgParser.ts
98
+ var DANGEROUS_TAGS = /\b(script|iframe|object|embed|link|style|meta)\b/gi;
99
+ var DANGEROUS_ATTRS = /\bon\w+\s*=/gi;
100
+ var DANGEROUS_HREF = /\bhref\s*=\s*["']?\s*javascript:/gi;
101
+ var DANGEROUS_XLINK = /\bxlink:href\s*=\s*["']?\s*javascript:/gi;
102
+ function sanitize(html) {
103
+ return html.replace(DANGEROUS_TAGS, "").replace(DANGEROUS_ATTRS, "").replace(DANGEROUS_HREF, "").replace(DANGEROUS_XLINK, "");
104
+ }
105
+ var VIEWBOX_RE = /viewBox\s*=\s*"([^"]+)"/i;
106
+ var SVG_OPEN_END_RE = /<svg[^>]*>/i;
107
+ function parseSvgMarkup(markup) {
108
+ const viewBoxMatch = markup.match(VIEWBOX_RE);
109
+ const viewBox = viewBoxMatch?.[1] ?? "0 0 100 100";
110
+ const svgOpenMatch = markup.match(SVG_OPEN_END_RE);
111
+ const afterOpen = svgOpenMatch ? markup.slice(svgOpenMatch.index + svgOpenMatch[0].length) : markup;
112
+ const closeIdx = afterOpen.lastIndexOf("</svg>");
113
+ const inner = closeIdx >= 0 ? afterOpen.slice(0, closeIdx) : afterOpen;
114
+ return { viewBox, innerHtml: sanitize(inner) };
115
+ }
96
116
  function ToolButton({ active, disabled, title, onClick, children }) {
97
117
  return /* @__PURE__ */ jsxRuntime.jsx(
98
118
  "button",
@@ -122,7 +142,15 @@ function TypeChip({ typeDef, active, onClick }) {
122
142
  active ? "border-blue-400 bg-blue-50 text-blue-700 font-medium" : "border-slate-200 bg-white text-slate-600 hover:border-slate-300 hover:bg-slate-50"
123
143
  ].join(" "),
124
144
  children: [
125
- /* @__PURE__ */ jsxRuntime.jsx(
145
+ typeDef.shape === "svg" && typeDef.svgMarkup ? /* @__PURE__ */ jsxRuntime.jsx(
146
+ "svg",
147
+ {
148
+ viewBox: parseSvgMarkup(typeDef.svgMarkup).viewBox,
149
+ className: "w-2.5 h-2.5 shrink-0",
150
+ style: { color: typeDef.strokeColor },
151
+ dangerouslySetInnerHTML: { __html: parseSvgMarkup(typeDef.svgMarkup).innerHtml }
152
+ }
153
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
126
154
  "span",
127
155
  {
128
156
  className: "w-2.5 h-2.5 rounded-sm shrink-0",
@@ -1191,6 +1219,28 @@ function ElementNode({
1191
1219
  onClick: handleBodyClick
1192
1220
  }
1193
1221
  ) }),
1222
+ typeDef.shape === "svg" && typeDef.svgMarkup && (() => {
1223
+ const parsed = parseSvgMarkup(typeDef.svgMarkup);
1224
+ const parts = parsed.viewBox.split(/[\s,]+/).map(Number);
1225
+ const vw = parts[2] ?? 100;
1226
+ const vh = parts[3] ?? 100;
1227
+ const sx = vw > 0 ? w / vw : 1;
1228
+ const sy = vh > 0 ? h / vh : 1;
1229
+ const avgScale = Math.sqrt(Math.abs(sx * sy)) || 1;
1230
+ return /* @__PURE__ */ jsxRuntime.jsx(
1231
+ "g",
1232
+ {
1233
+ transform: `translate(${x}, ${y}) scale(${sx}, ${sy})`,
1234
+ fill: fillColor,
1235
+ stroke: isSelected ? "#3b82f6" : typeDef.strokeColor,
1236
+ strokeWidth: isSelected ? sw / avgScale * 1.5 : sw / avgScale,
1237
+ style: { cursor: bodyCursor },
1238
+ onMouseDown: tool === "SELECT" && !onViewerClick ? handleBodyDown : void 0,
1239
+ onClick: handleBodyClick,
1240
+ dangerouslySetInnerHTML: { __html: parsed.innerHtml }
1241
+ }
1242
+ );
1243
+ })(),
1194
1244
  (element.label ?? typeDef.label) && /* @__PURE__ */ jsxRuntime.jsx(
1195
1245
  "text",
1196
1246
  {
@@ -1689,14 +1739,35 @@ function PropertiesPanel({
1689
1739
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-3 py-2 border-b border-slate-100 text-xs font-semibold text-slate-500 uppercase tracking-wide", children: "Propiedades" }),
1690
1740
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 flex flex-col gap-4 p-3", children: [
1691
1741
  typeDef && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
1692
- /* @__PURE__ */ jsxRuntime.jsx(
1742
+ typeDef.shape === "svg" ? /* @__PURE__ */ jsxRuntime.jsx(
1743
+ "svg",
1744
+ {
1745
+ viewBox: (() => {
1746
+ try {
1747
+ return typeDef.svgMarkup ? parseSvgMarkup(typeDef.svgMarkup).viewBox : "0 0 100 100";
1748
+ } catch {
1749
+ return "0 0 100 100";
1750
+ }
1751
+ })(),
1752
+ className: "w-3.5 h-3.5 shrink-0 border border-slate-300 rounded-sm",
1753
+ style: { color: typeDef.strokeColor },
1754
+ dangerouslySetInnerHTML: { __html: (() => {
1755
+ try {
1756
+ return typeDef.svgMarkup ? parseSvgMarkup(typeDef.svgMarkup).innerHtml : "";
1757
+ } catch {
1758
+ return "";
1759
+ }
1760
+ })() }
1761
+ }
1762
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
1693
1763
  "span",
1694
1764
  {
1695
1765
  className: "w-3.5 h-3.5 rounded-sm shrink-0 border",
1696
1766
  style: { background: typeDef.color, borderColor: typeDef.strokeColor }
1697
1767
  }
1698
1768
  ),
1699
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-medium text-slate-700 truncate", children: typeDef.label })
1769
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-medium text-slate-700 truncate", children: typeDef.label }),
1770
+ typeDef.shape === "svg" && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[9px] uppercase tracking-wide text-slate-400 font-medium ml-auto", children: "SVG" })
1700
1771
  ] }),
1701
1772
  /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex flex-col gap-0.5", children: [
1702
1773
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] font-medium text-slate-400 uppercase tracking-wide", children: "Etiqueta" }),
@@ -2769,6 +2840,7 @@ exports.VenueMapEditor = VenueMapEditor;
2769
2840
  exports.VenueMapViewer = VenueMapViewer;
2770
2841
  exports.findNearestNode = findNearestNode;
2771
2842
  exports.genId = genId;
2843
+ exports.parseSvgMarkup = parseSvgMarkup;
2772
2844
  exports.snapPoint = snapPoint;
2773
2845
  exports.snapToGrid = snapToGrid;
2774
2846
  exports.useLibraryStorage = useLibraryStorage;