@ethisyscore/plugin-ui 1.98.0 → 1.100.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/layout/fillGridClasses.ts","../../../src/components/layout/FillGrid.tsx","../../../src/icons/nexture/ni-cross.tsx","../../../src/icons/nexture/ni-search.tsx","../../../src/icons/nexture-icons.tsx","../../../src/components/ui/DebouncedSearchInput.tsx","../../../src/components/layout/PageHeader.tsx","../../../src/components/layout/pageHeaderContext.ts","../../../src/components/layout/sidebarAction.tsx","../../../src/components/layout/usePageHeader.ts","../../../src/components/layout/useDetailHeaderActions.ts","../../../src/components/layout/breadcrumbs.ts","../../../src/components/layout/PageHeaderProvider.tsx"],"names":["createContext","jsx","Box","useContext","jsxs","memo","DebouncedSearchInput","useState","useId","useRef","useEffect","useCallback","FormControl","InputLabel","FilledInput","Fragment","InputAdornment","IconButton","Stack","Breadcrumbs","Typography","Link","Button","Menu","MenuItem","useMemo","toDescriptor","useLocation"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Static Tailwind basis classes for {@link FillGridItem}.\n *\n * Tailwind's content scanner extracts class candidates from raw source text and\n * cannot follow string concatenation — `\"sm:\" + \"basis-[...]\"` is invisible to\n * it. So every fully-prefixed class is spelled out as a literal below, indexed\n * by breakpoint → gap → span. `fillItemClass` only ever *looks up* a literal; it\n * never builds one. This is what guarantees the responsive classes survive a\n * production purge (no fragile safelist comment to keep in sync).\n *\n * NOTE: because these literals live in the SDK, a CONSUMER's Tailwind build must\n * scan this package's dist (add it to `content`) or the classes won't generate.\n *\n * basis(n, g) = calc(n/12 * 100% - g * (1 - n/12)), g = gap in rem.\n * gap-5 => g = 1.25rem; gap-2.5 => g = 0.625rem. Span 12 => basis-full.\n */\nexport type Twelfths = 2.4 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 12;\nexport type FillGap = 2.5 | 5;\ntype Breakpoint = \"xs\" | \"sm\" | \"md\" | \"lg\";\nexport type FillSpan = Partial<Record<Breakpoint, Twelfths>>;\n\n/**\n * Full literal class per breakpoint × gap × span. `xs` is unprefixed; `sm`/`md`/\n * `lg` carry the Tailwind prefix. Every string here is a real, scannable literal.\n */\nconst CLASSES: Record<Breakpoint, Record<FillGap, Record<Twelfths, string>>> = {\n xs: {\n 5: {\n 2.4: \"basis-[calc(20%-1rem)]\",\n 3: \"basis-[calc(25%-0.9375rem)]\",\n 4: \"basis-[calc(33.333%-0.8333rem)]\",\n 5: \"basis-[calc(41.667%-0.7292rem)]\",\n 6: \"basis-[calc(50%-0.625rem)]\",\n 7: \"basis-[calc(58.333%-0.5208rem)]\",\n 8: \"basis-[calc(66.667%-0.4167rem)]\",\n 9: \"basis-[calc(75%-0.3125rem)]\",\n 12: \"basis-full\",\n },\n 2.5: {\n 2.4: \"basis-[calc(20%-0.5rem)]\",\n 3: \"basis-[calc(25%-0.46875rem)]\",\n 4: \"basis-[calc(33.333%-0.41667rem)]\",\n 5: \"basis-[calc(41.667%-0.36458rem)]\",\n 6: \"basis-[calc(50%-0.3125rem)]\",\n 7: \"basis-[calc(58.333%-0.26042rem)]\",\n 8: \"basis-[calc(66.667%-0.20833rem)]\",\n 9: \"basis-[calc(75%-0.15625rem)]\",\n 12: \"basis-full\",\n },\n },\n sm: {\n 5: {\n 2.4: \"sm:basis-[calc(20%-1rem)]\",\n 3: \"sm:basis-[calc(25%-0.9375rem)]\",\n 4: \"sm:basis-[calc(33.333%-0.8333rem)]\",\n 5: \"sm:basis-[calc(41.667%-0.7292rem)]\",\n 6: \"sm:basis-[calc(50%-0.625rem)]\",\n 7: \"sm:basis-[calc(58.333%-0.5208rem)]\",\n 8: \"sm:basis-[calc(66.667%-0.4167rem)]\",\n 9: \"sm:basis-[calc(75%-0.3125rem)]\",\n 12: \"sm:basis-full\",\n },\n 2.5: {\n 2.4: \"sm:basis-[calc(20%-0.5rem)]\",\n 3: \"sm:basis-[calc(25%-0.46875rem)]\",\n 4: \"sm:basis-[calc(33.333%-0.41667rem)]\",\n 5: \"sm:basis-[calc(41.667%-0.36458rem)]\",\n 6: \"sm:basis-[calc(50%-0.3125rem)]\",\n 7: \"sm:basis-[calc(58.333%-0.26042rem)]\",\n 8: \"sm:basis-[calc(66.667%-0.20833rem)]\",\n 9: \"sm:basis-[calc(75%-0.15625rem)]\",\n 12: \"sm:basis-full\",\n },\n },\n md: {\n 5: {\n 2.4: \"md:basis-[calc(20%-1rem)]\",\n 3: \"md:basis-[calc(25%-0.9375rem)]\",\n 4: \"md:basis-[calc(33.333%-0.8333rem)]\",\n 5: \"md:basis-[calc(41.667%-0.7292rem)]\",\n 6: \"md:basis-[calc(50%-0.625rem)]\",\n 7: \"md:basis-[calc(58.333%-0.5208rem)]\",\n 8: \"md:basis-[calc(66.667%-0.4167rem)]\",\n 9: \"md:basis-[calc(75%-0.3125rem)]\",\n 12: \"md:basis-full\",\n },\n 2.5: {\n 2.4: \"md:basis-[calc(20%-0.5rem)]\",\n 3: \"md:basis-[calc(25%-0.46875rem)]\",\n 4: \"md:basis-[calc(33.333%-0.41667rem)]\",\n 5: \"md:basis-[calc(41.667%-0.36458rem)]\",\n 6: \"md:basis-[calc(50%-0.3125rem)]\",\n 7: \"md:basis-[calc(58.333%-0.26042rem)]\",\n 8: \"md:basis-[calc(66.667%-0.20833rem)]\",\n 9: \"md:basis-[calc(75%-0.15625rem)]\",\n 12: \"md:basis-full\",\n },\n },\n lg: {\n 5: {\n 2.4: \"lg:basis-[calc(20%-1rem)]\",\n 3: \"lg:basis-[calc(25%-0.9375rem)]\",\n 4: \"lg:basis-[calc(33.333%-0.8333rem)]\",\n 5: \"lg:basis-[calc(41.667%-0.7292rem)]\",\n 6: \"lg:basis-[calc(50%-0.625rem)]\",\n 7: \"lg:basis-[calc(58.333%-0.5208rem)]\",\n 8: \"lg:basis-[calc(66.667%-0.4167rem)]\",\n 9: \"lg:basis-[calc(75%-0.3125rem)]\",\n 12: \"lg:basis-full\",\n },\n 2.5: {\n 2.4: \"lg:basis-[calc(20%-0.5rem)]\",\n 3: \"lg:basis-[calc(25%-0.46875rem)]\",\n 4: \"lg:basis-[calc(33.333%-0.41667rem)]\",\n 5: \"lg:basis-[calc(41.667%-0.36458rem)]\",\n 6: \"lg:basis-[calc(50%-0.3125rem)]\",\n 7: \"lg:basis-[calc(58.333%-0.26042rem)]\",\n 8: \"lg:basis-[calc(66.667%-0.20833rem)]\",\n 9: \"lg:basis-[calc(75%-0.15625rem)]\",\n 12: \"lg:basis-full\",\n },\n },\n};\n\nconst BREAKPOINTS: readonly Breakpoint[] = [\"xs\", \"sm\", \"md\", \"lg\"];\n\n/**\n * Full class string for one item: always `min-w-0 grow`, plus the literal basis\n * class for each supplied breakpoint (looked up, never concatenated).\n */\nexport function fillItemClass(span: FillSpan, gap: FillGap): string {\n const parts = [\"min-w-0\", \"grow\"];\n for (const bp of BREAKPOINTS) {\n const n = span[bp];\n if (n !== undefined) parts.push(CLASSES[bp][gap][n]);\n }\n return parts.join(\" \");\n}\n","import { createContext, useContext } from \"react\";\nimport { Box } from \"@mui/material\";\nimport { fillItemClass, type FillGap, type FillSpan } from \"./fillGridClasses\";\n\nconst FillGapContext = createContext<FillGap>(5);\n\ninterface FillGridProps {\n /** Gutter width. 5 = 20px (default), 2.5 = 10px. Matches MUI spacing values. */\n gap?: FillGap;\n className?: string;\n children: React.ReactNode;\n}\n\n/**\n * A flex-wrap row whose items `grow` to fill a partially-filled last row — the\n * dashboard/overview convention. NOT for forms, tables, or single full-width cards.\n *\n * Renders `w-full` so it always spans its container: a `FillGrid` is itself often\n * a flex item of a parent MUI `<Grid container>` / flex row, where without an\n * explicit width it would shrink-wrap to its content instead of filling the row\n * (the behaviour a `<Grid container size={12}>` used to give).\n */\nexport function FillGrid({ gap = 5, className, children }: FillGridProps) {\n const gapClass = gap === 2.5 ? \"gap-2.5\" : \"gap-5\";\n return (\n <FillGapContext.Provider value={gap}>\n <Box className={[\"flex w-full flex-wrap\", gapClass, className].filter(Boolean).join(\" \")}>\n {children}\n </Box>\n </FillGapContext.Provider>\n );\n}\n\ninterface FillGridItemProps {\n /** 12-column span per breakpoint, mirroring MUI Grid's `size`. Default { xs: 12 }. */\n span?: FillSpan;\n className?: string;\n children: React.ReactNode;\n}\n\nexport function FillGridItem({ span = { xs: 12 }, className, children }: FillGridItemProps) {\n const gap = useContext(FillGapContext);\n return (\n <Box className={[fillItemClass(span, gap), className].filter(Boolean).join(\" \")}>\n {children}\n </Box>\n );\n}\n","import { NextureIconsProps, sizeHelper, strokeSizeHelper } from \"../nexture-icons\";\n\nexport default function NiCross({ className, variant = \"outlined\", size = \"medium\" }: NextureIconsProps) {\n const iconSize = sizeHelper(size);\n const iconStrokeWidth = strokeSizeHelper(iconSize);\n\n if (variant === \"outlined\") {\n return (\n <svg\n width={iconSize}\n height={iconSize}\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8.00016 8L12.0001 12M12.0001 12L16 16.0002M12.0001 12L16 8.00015M12.0001 12L8 16.0002\"\n stroke=\"currentColor\"\n strokeWidth={iconStrokeWidth}\n strokeLinecap=\"round\"\n />\n </svg>\n );\n } else {\n return (\n <svg\n width={iconSize}\n height={iconSize}\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15.4698 7.46963C15.7626 7.17684 16.2374 7.17684 16.5303 7.46963C16.8232 7.7625 16.8231 8.23728 16.5303 8.53018L13.0606 11.9999L16.5303 15.4696C16.8232 15.7625 16.8231 16.2373 16.5303 16.5302C16.2557 16.8048 15.821 16.8223 15.5264 16.5819L15.4698 16.5302L12 13.0604L8.53032 16.5302C8.23743 16.8231 7.76267 16.8231 7.46977 16.5302C7.17697 16.2373 7.17691 15.7625 7.46977 15.4696L10.9395 11.9999L7.46977 8.53018L7.41801 8.47354C7.1778 8.17898 7.19527 7.74421 7.46977 7.46963C7.76264 7.17676 8.23742 7.17682 8.53032 7.46963L12 10.9394L15.4698 7.46963Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n","import { NextureIconsProps, sizeHelper, strokeSizeHelper } from \"../nexture-icons\";\n\nexport default function NiSearch({\n className,\n variant = \"outlined\",\n size = \"medium\",\n oneTone = false,\n}: NextureIconsProps) {\n const iconSize = sizeHelper(size);\n const iconStrokeWidth = strokeSizeHelper(iconSize);\n if (variant === \"outlined\") {\n return (\n <svg\n width={iconSize}\n height={iconSize}\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n opacity={oneTone ? 1 : 0.6}\n d=\"M22 22L18.5 18.5\"\n stroke=\"currentColor\"\n strokeWidth={iconStrokeWidth}\n strokeLinecap=\"round\"\n />\n <circle cx=\"11.5\" cy=\"11.5\" r=\"9.5\" stroke=\"currentColor\" strokeWidth={iconStrokeWidth} />\n </svg>\n );\n } else {\n return (\n <svg\n width={iconSize}\n height={iconSize}\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n opacity={oneTone ? 1 : 0.4}\n d=\"M19.0303 17.9697C18.7374 17.6768 18.2627 17.6768 17.9698 17.9697C17.6769 18.2626 17.6769 18.7373 17.9698 19.0302L21.4698 22.5302C21.7627 22.8231 22.2374 22.8231 22.5303 22.5302C22.8232 22.2373 22.8232 21.7626 22.5303 21.4697L19.0303 17.9697Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M11.5 1.25C17.1609 1.25 21.75 5.83908 21.75 11.5C21.75 17.1609 17.1609 21.75 11.5 21.75C5.83908 21.75 1.25 17.1609 1.25 11.5C1.25 5.83908 5.83908 1.25 11.5 1.25Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n","import NiAI from \"./nexture/ni-ai\";\nimport NiAirBalloon from \"./nexture/ni-air-balloon\";\nimport NiAnchor from \"./nexture/ni-anchor\";\nimport NiAnnouncement from \"./nexture/ni-announcement\";\nimport NiAntenna from \"./nexture/ni-antenna\";\nimport NiArchive from \"./nexture/ni-archive\";\nimport NiArchiveCheck from \"./nexture/ni-archive-check\";\nimport NiArrowCircleLeft from \"./nexture/ni-arrow-circle-left\";\nimport NiArrowCircleRight from \"./nexture/ni-arrow-circle-right\";\nimport NiArrowDown from \"./nexture/ni-arrow-down\";\nimport NiArrowDownLeft from \"./nexture/ni-arrow-down-left\";\nimport NiArrowDownLeftSquare from \"./nexture/ni-arrow-down-left-square\";\nimport NiArrowDownRight from \"./nexture/ni-arrow-down-right\";\nimport NiArrowDownRightSquare from \"./nexture/ni-arrow-down-right-square\";\nimport NiArrowDownSquare from \"./nexture/ni-arrow-down-square\";\nimport NiArrowHistory from \"./nexture/ni-arrow-history\";\nimport NiArrowInDown from \"./nexture/ni-arrow-in-down\";\nimport NiArrowInLeft from \"./nexture/ni-arrow-in-left\";\nimport NiArrowInRight from \"./nexture/ni-arrow-in-right\";\nimport NiArrowInUp from \"./nexture/ni-arrow-in-up\";\nimport NiArrowLeft from \"./nexture/ni-arrow-left\";\nimport NiArrowLeftRight from \"./nexture/ni-arrow-left-right\";\nimport NiArrowLeftSquare from \"./nexture/ni-arrow-left-square\";\nimport NiArrowOutDown from \"./nexture/ni-arrow-out-down\";\nimport NiArrowOutLeft from \"./nexture/ni-arrow-out-left\";\nimport NiArrowOutRight from \"./nexture/ni-arrow-out-right\";\nimport NiArrowOutUp from \"./nexture/ni-arrow-out-up\";\nimport NiArrowRight from \"./nexture/ni-arrow-right\";\nimport NiArrowRightSquare from \"./nexture/ni-arrow-right-square\";\nimport NiArrowUp from \"./nexture/ni-arrow-up\";\nimport NiArrowUpDown from \"./nexture/ni-arrow-up-down\";\nimport NiArrowUpLeft from \"./nexture/ni-arrow-up-left\";\nimport NiArrowUpLeftSquare from \"./nexture/ni-arrow-up-left-square\";\nimport NiArrowUpRight from \"./nexture/ni-arrow-up-right\";\nimport NiArrowUpRightSquare from \"./nexture/ni-arrow-up-right-square\";\nimport NiArrowUpSquare from \"./nexture/ni-arrow-up-square\";\nimport NiAt from \"./nexture/ni-at\";\nimport NiBadge from \"./nexture/ni-badge\";\nimport NiBadgeCheck from \"./nexture/ni-badge-check\";\nimport NiBag from \"./nexture/ni-bag\";\nimport NiBandAid from \"./nexture/ni-band-aid\";\nimport NiBarcode from \"./nexture/ni-barcode\";\nimport NiBasket from \"./nexture/ni-basket\";\nimport NiBatteryCharging from \"./nexture/ni-battery-charging\";\nimport NiBatteryEmpty from \"./nexture/ni-battery-empty\";\nimport NiBatteryFull from \"./nexture/ni-battery-full\";\nimport NiBell from \"./nexture/ni-bell\";\nimport NiBellInactive from \"./nexture/ni-bell-inactive\";\nimport NiBinEmpty from \"./nexture/ni-bin-empty\";\nimport NiBinFull from \"./nexture/ni-bin-full\";\nimport NiBloodCells from \"./nexture/ni-blood-cells\";\nimport NiBluetooth from \"./nexture/ni-bluetooth\";\nimport NiBook from \"./nexture/ni-book\";\nimport NiBookmark from \"./nexture/ni-bookmark\";\nimport NiBookmarkSingle from \"./nexture/ni-bookmark-single\";\nimport NiBraces from \"./nexture/ni-braces\";\nimport NiBrackets from \"./nexture/ni-brackets\";\nimport NiBrain from \"./nexture/ni-brain\";\nimport NiBrainCircuit from \"./nexture/ni-brain-circuit\";\nimport NiBriefcase from \"./nexture/ni-briefcase\";\nimport NiBrush from \"./nexture/ni-brush\";\nimport NiBrushArt from \"./nexture/ni-brush-art\";\nimport NiBrushArtSquare from \"./nexture/ni-brush-art-square\";\nimport NiBug from \"./nexture/ni-bug\";\nimport NiBuilding from \"./nexture/ni-building\";\nimport NiBulbOff from \"./nexture/ni-bulb-off\";\nimport NiBulbOn from \"./nexture/ni-bulb-on\";\nimport NiButton from \"./nexture/ni-button\";\nimport NiButtonGroup from \"./nexture/ni-button-group\";\nimport NiButtonLarge from \"./nexture/ni-button-large\";\nimport NiCake from \"./nexture/ni-cake\";\nimport NiCalendar from \"./nexture/ni-calendar\";\nimport NiCalendarClock from \"./nexture/ni-calendar-clock\";\nimport NiCamera from \"./nexture/ni-camera\";\nimport NiCar from \"./nexture/ni-car\";\nimport NiCartArrow from \"./nexture/ni-cart-arrow\";\nimport NiCartCross from \"./nexture/ni-cart-cross\";\nimport NiCartEmpty from \"./nexture/ni-cart-empty\";\nimport NiCartMinus from \"./nexture/ni-cart-minus\";\nimport NiCartPlus from \"./nexture/ni-cart-plus\";\nimport NiCatalog from \"./nexture/ni-catalog\";\nimport NiCells from \"./nexture/ni-cells\";\nimport NiCellsPlus from \"./nexture/ni-cells-plus\";\nimport NiChange from \"./nexture/ni-change\";\nimport NiChartBar from \"./nexture/ni-chart-bar\";\nimport NiChartCandleSticks from \"./nexture/ni-chart-candle-sticks\";\nimport NiChartFunnel from \"./nexture/ni-chart-funnel\";\nimport NiChartHeatmap from \"./nexture/ni-chart-heatmap\";\nimport NiChartLine from \"./nexture/ni-chart-line\";\nimport NiChartLineBar from \"./nexture/ni-chart-line-bar\";\nimport NiChartPie from \"./nexture/ni-chart-pie\";\nimport NiChartPolar from \"./nexture/ni-chart-polar\";\nimport NiChartRadar from \"./nexture/ni-chart-radar\";\nimport NiChartScatter from \"./nexture/ni-chart-scatter\";\nimport NiCheck from \"./nexture/ni-check\";\nimport NiCheckFull from \"./nexture/ni-check-full\";\nimport NiCheckSquare from \"./nexture/ni-check-square\";\nimport NiChef from \"./nexture/ni-chef\";\nimport NiChevronDown from \"./nexture/ni-chevron-down\";\nimport NiChevronDownSmall from \"./nexture/ni-chevron-down-small\";\nimport NiChevronLeft from \"./nexture/ni-chevron-left\";\nimport NiChevronLeftRightReverseSmall from \"./nexture/ni-chevron-left-right-reverse-small\";\nimport NiChevronLeftRightSmall from \"./nexture/ni-chevron-left-right-small\";\nimport NiChevronLeftSmall from \"./nexture/ni-chevron-left-small\";\nimport NiChevronRight from \"./nexture/ni-chevron-right\";\nimport NiChevronRightSmall from \"./nexture/ni-chevron-right-small\";\nimport NiChevronUp from \"./nexture/ni-chevron-up\";\nimport NiChevronUpDownReverseSmall from \"./nexture/ni-chevron-up-down-reverse-small\";\nimport NiChevronUpDownSmall from \"./nexture/ni-chevron-up-down-small\";\nimport NiChevronUpSmall from \"./nexture/ni-chevron-up-small\";\nimport NiCholesterol from \"./nexture/ni-cholesterol\";\nimport NiCircle from \"./nexture/ni-circle\";\nimport NiClipboard from \"./nexture/ni-clipboard\";\nimport NiClock from \"./nexture/ni-clock\";\nimport NiCloud from \"./nexture/ni-cloud\";\nimport NiCloudPartly from \"./nexture/ni-cloud-partly\";\nimport NiCloudRain from \"./nexture/ni-cloud-rain\";\nimport NiCloudSnow from \"./nexture/ni-cloud-snow\";\nimport NiCloudThunder from \"./nexture/ni-cloud-thunder\";\nimport NiCode from \"./nexture/ni-code\";\nimport NiCoffee from \"./nexture/ni-coffee\";\nimport NiCoin from \"./nexture/ni-coin\";\nimport NiCollapse from \"./nexture/ni-collapse\";\nimport NiCollapseIn from \"./nexture/ni-collapse-in\";\nimport NiCols from \"./nexture/ni-cols\";\nimport NiCompass from \"./nexture/ni-compass\";\nimport NiController from \"./nexture/ni-controller\";\nimport NiCopyright from \"./nexture/ni-copyright\";\nimport NiCpu from \"./nexture/ni-cpu\";\nimport NiCreditCard from \"./nexture/ni-credit-card\";\nimport NiCrop from \"./nexture/ni-crop\";\nimport NiCross from \"./nexture/ni-cross\";\nimport NiCrossFull from \"./nexture/ni-cross-full\";\nimport NiCrossHexagon from \"./nexture/ni-cross-hexagon\";\nimport NiCrossSquare from \"./nexture/ni-cross-square\";\nimport NiCrosshair from \"./nexture/ni-crosshair\";\nimport NiCrown from \"./nexture/ni-crown\";\nimport NiCursor from \"./nexture/ni-cursor\";\nimport NiDashboard from \"./nexture/ni-dashboard\";\nimport NiDatabase from \"./nexture/ni-database\";\nimport NiDevops from \"./nexture/ni-devops\";\nimport NiDiagram from \"./nexture/ni-diagram\";\nimport NiDice from \"./nexture/ni-dice\";\nimport NiDirectory from \"./nexture/ni-directory\";\nimport NiDocumentArchive from \"./nexture/ni-document-archive\";\nimport NiDocumentChart from \"./nexture/ni-document-chart\";\nimport NiDocumentCheck from \"./nexture/ni-document-check\";\nimport NiDocumentCode from \"./nexture/ni-document-code\";\nimport NiDocumentCross from \"./nexture/ni-document-cross\";\nimport NiDocumentFull from \"./nexture/ni-document-full\";\nimport NiDocumentImage from \"./nexture/ni-document-image\";\nimport NiDocumentMinus from \"./nexture/ni-document-minus\";\nimport NiDocumentNumber from \"./nexture/ni-document-number\";\nimport NiDocumentPlus from \"./nexture/ni-document-plus\";\nimport NiDocumentVideo from \"./nexture/ni-document-video\";\nimport NiDollar from \"./nexture/ni-dollar\";\nimport NiDollarSquare from \"./nexture/ni-dollar-square\";\nimport NiDotsSquare from \"./nexture/ni-dots-square\";\nimport NiDownloadCloud from \"./nexture/ni-download-cloud\";\nimport NiDragHorizontal from \"./nexture/ni-drag-horizontal\";\nimport NiDragVertical from \"./nexture/ni-drag-vertical\";\nimport NiDrink from \"./nexture/ni-drink\";\nimport NiDrop from \"./nexture/ni-drop\";\nimport NiDuplicate from \"./nexture/ni-duplicate\";\nimport NiEllipsisHorizontal from \"./nexture/ni-ellipsis-horizontal\";\nimport NiEllipsisVertical from \"./nexture/ni-ellipsis-vertical\";\nimport NiEmail from \"./nexture/ni-email\";\nimport NiEmailOpen from \"./nexture/ni-email-open\";\nimport NiEndDownSmall from \"./nexture/ni-end-down-small\";\nimport NiEndLeftSmall from \"./nexture/ni-end-left-small\";\nimport NiEndRightSmall from \"./nexture/ni-end-right-small\";\nimport NiEndUpSmall from \"./nexture/ni-end-up-small\";\nimport NiEnterDown from \"./nexture/ni-enter-down\";\nimport NiEnterLeft from \"./nexture/ni-enter-left\";\nimport NiEnterReverseDown from \"./nexture/ni-enter-reverse-down\";\nimport NiEnterReverseLeft from \"./nexture/ni-enter-reverse-left\";\nimport NiEnterReverseRight from \"./nexture/ni-enter-reverse-right\";\nimport NiEnterReverseUp from \"./nexture/ni-enter-reverse-up\";\nimport NiEnterRight from \"./nexture/ni-enter-right\";\nimport NiEnterUp from \"./nexture/ni-enter-up\";\nimport NiEquals from \"./nexture/ni-equals\";\nimport NiEqualsFull from \"./nexture/ni-equals-full\";\nimport NiEraser from \"./nexture/ni-eraser\";\nimport NiEuro from \"./nexture/ni-euro\";\nimport NiEuroSquare from \"./nexture/ni-euro-square\";\nimport NiExclamationHexagon from \"./nexture/ni-exclamation-hexagon\";\nimport NiExclamationSquare from \"./nexture/ni-exclamation-square\";\nimport NiExpand from \"./nexture/ni-expand\";\nimport NiExpandFull from \"./nexture/ni-expand-full\";\nimport NiExpandOut from \"./nexture/ni-expand-out\";\nimport NiExpandSquare from \"./nexture/ni-expand-square\";\nimport NiExternal from \"./nexture/ni-external\";\nimport NiEyeClose from \"./nexture/ni-eye-close\";\nimport NiEyeInactive from \"./nexture/ni-eye-inactive\";\nimport NiEyeOpen from \"./nexture/ni-eye-open\";\nimport NiFaceFrown from \"./nexture/ni-face-frown\";\nimport NiFaceFrownMore from \"./nexture/ni-face-frown-more\";\nimport NiFaceNeutral from \"./nexture/ni-face-neutral\";\nimport NiFaceSmile from \"./nexture/ni-face-smile\";\nimport NiFaceSmileMore from \"./nexture/ni-face-smile-more\";\nimport NiFemale from \"./nexture/ni-female\";\nimport NiFilter from \"./nexture/ni-filter\";\nimport NiFilterCross from \"./nexture/ni-filter-cross\";\nimport NiFilterMinus from \"./nexture/ni-filter-minus\";\nimport NiFilterPlus from \"./nexture/ni-filter-plus\";\nimport NiFingerprint from \"./nexture/ni-fingerprint\";\nimport NiFire from \"./nexture/ni-fire\";\nimport NiFirstAid from \"./nexture/ni-first-aid\";\nimport NiFitness from \"./nexture/ni-fitness\";\nimport NiFlag from \"./nexture/ni-flag\";\nimport NiFlash from \"./nexture/ni-flash\";\nimport NiFlask from \"./nexture/ni-flask\";\nimport NiFloppyDisk from \"./nexture/ni-floppy-disk\";\nimport NiFolder from \"./nexture/ni-folder\";\nimport NiFolderCheck from \"./nexture/ni-folder-check\";\nimport NiFolderCross from \"./nexture/ni-folder-cross\";\nimport NiFolderMinus from \"./nexture/ni-folder-minus\";\nimport NiFolderPlus from \"./nexture/ni-folder-plus\";\nimport NiForwardDownSmall from \"./nexture/ni-forward-down-small\";\nimport NiForwardLeftSmall from \"./nexture/ni-forward-left-small\";\nimport NiForwardRightSmall from \"./nexture/ni-forward-right-small\";\nimport NiForwardUpSmall from \"./nexture/ni-forward-up-small\";\nimport NiGay from \"./nexture/ni-gay\";\nimport NiGerm from \"./nexture/ni-germ\";\nimport NiGogo from \"./nexture/ni-gogo\";\nimport NiGold from \"./nexture/ni-gold\";\nimport NiGpu from \"./nexture/ni-gpu\";\nimport NiGraduation from \"./nexture/ni-graduation\";\nimport NiGroup from \"./nexture/ni-group\";\nimport NiHeadphones from \"./nexture/ni-headphones\";\nimport NiHeadset from \"./nexture/ni-headset\";\nimport NiHeadsetMic from \"./nexture/ni-headset-mic\";\nimport NiHealth from \"./nexture/ni-health\";\nimport NiHeart from \"./nexture/ni-heart\";\nimport NiHeartRate from \"./nexture/ni-heart-rate\";\nimport NiHearts from \"./nexture/ni-hearts\";\nimport NiHome from \"./nexture/ni-home\";\nimport NiInbox from \"./nexture/ni-inbox\";\nimport NiInfoSquare from \"./nexture/ni-info-square\";\nimport NiInjection from \"./nexture/ni-injection\";\nimport NiInput from \"./nexture/ni-input\";\nimport NiIntegration from \"./nexture/ni-integration\";\nimport NiInternal from \"./nexture/ni-internal\";\nimport NiIv from \"./nexture/ni-iv\";\nimport NiJoin from \"./nexture/ni-join\";\nimport NiKey from \"./nexture/ni-key\";\nimport NiKeyboard from \"./nexture/ni-keyboard\";\nimport NiKnobs from \"./nexture/ni-knobs\";\nimport NiLaptop from \"./nexture/ni-laptop\";\nimport NiLaw from \"./nexture/ni-law\";\nimport NiLayout from \"./nexture/ni-layout\";\nimport NiLike from \"./nexture/ni-like\";\nimport NiLink from \"./nexture/ni-link\";\nimport NiLinkBroken from \"./nexture/ni-link-broken\";\nimport NiList from \"./nexture/ni-list\";\nimport NiListCheck from \"./nexture/ni-list-check\";\nimport NiListChevronDown from \"./nexture/ni-list-chevron-down\";\nimport NiListCircle from \"./nexture/ni-list-circle\";\nimport NiListCross from \"./nexture/ni-list-cross\";\nimport NiListNumber from \"./nexture/ni-list-number\";\nimport NiListSquare from \"./nexture/ni-list-square\";\nimport NiLoader from \"./nexture/ni-loader\";\nimport NiLock from \"./nexture/ni-lock\";\nimport NiLuggage from \"./nexture/ni-luggage\";\nimport NiLungs from \"./nexture/ni-lungs\";\nimport NiMagicWand from \"./nexture/ni-magic-wand\";\nimport NiMale from \"./nexture/ni-male\";\nimport NiMap from \"./nexture/ni-map\";\nimport NiMasonary from \"./nexture/ni-masonary\";\nimport NiMedal from \"./nexture/ni-medal\";\nimport NiMenu from \"./nexture/ni-menu\";\nimport NiMenuLeft from \"./nexture/ni-menu-left\";\nimport NiMenuRight from \"./nexture/ni-menu-right\";\nimport NiMenuSplit from \"./nexture/ni-menu-split\";\nimport NiMenuSplitDot from \"./nexture/ni-menu-split-dot\";\nimport NiMenuSplitDotReverse from \"./nexture/ni-menu-split-dot-reverse\";\nimport NiMenuSplitReverse from \"./nexture/ni-menu-split-reverse\";\nimport NiMessage from \"./nexture/ni-message\";\nimport NiMessageCheck from \"./nexture/ni-message-check\";\nimport NiMessageCross from \"./nexture/ni-message-cross\";\nimport NiMessageDots from \"./nexture/ni-message-dots\";\nimport NiMessageFilled from \"./nexture/ni-message-filled\";\nimport NiMessageGrammar from \"./nexture/ni-message-grammar\";\nimport NiMessagePlus from \"./nexture/ni-message-plus\";\nimport NiMessages from \"./nexture/ni-messages\";\nimport NiMicrophone from \"./nexture/ni-microphone\";\nimport NiMinus from \"./nexture/ni-minus\";\nimport NiMinusFull from \"./nexture/ni-minus-full\";\nimport NiMinusSquare from \"./nexture/ni-minus-square\";\nimport NiMoney from \"./nexture/ni-money\";\nimport NiMoneyBag from \"./nexture/ni-money-bag\";\nimport NiMoon from \"./nexture/ni-moon\";\nimport NiMountain from \"./nexture/ni-mountain\";\nimport NiMouse from \"./nexture/ni-mouse\";\nimport NiMove from \"./nexture/ni-move\";\nimport NiMusic from \"./nexture/ni-music\";\nimport NiNetwork from \"./nexture/ni-network\";\nimport NiNext from \"./nexture/ni-next\";\nimport NiOxygen from \"./nexture/ni-oxygen\";\nimport NiPaintBucket from \"./nexture/ni-paint-bucket\";\nimport NiPaintRoller from \"./nexture/ni-paint-roller\";\nimport NiPalette from \"./nexture/ni-palette\";\nimport NiPaperclip from \"./nexture/ni-paperclip\";\nimport NiParentheses from \"./nexture/ni-parentheses\";\nimport NiPath from \"./nexture/ni-path\";\nimport NiPause from \"./nexture/ni-pause\";\nimport NiPen from \"./nexture/ni-pen\";\nimport NiPenSquare from \"./nexture/ni-pen-square\";\nimport NiPercent from \"./nexture/ni-percent\";\nimport NiPhone from \"./nexture/ni-phone\";\nimport NiPhoneHandset from \"./nexture/ni-phone-handset\";\nimport NiPhoneHandsetCheck from \"./nexture/ni-phone-handset-check\";\nimport NiPhoneHandsetOff from \"./nexture/ni-phone-handset-off\";\nimport NiPhoneHandsetOn from \"./nexture/ni-phone-handset-on\";\nimport NiPin from \"./nexture/ni-pin\";\nimport NiPinCheck from \"./nexture/ni-pin-check\";\nimport NiPinCross from \"./nexture/ni-pin-cross\";\nimport NiPinPlus from \"./nexture/ni-pin-plus\";\nimport NiPine from \"./nexture/ni-pine\";\nimport NiPivot from \"./nexture/ni-pivot\";\nimport NiPlane from \"./nexture/ni-plane\";\nimport NiPlay from \"./nexture/ni-play\";\nimport NiPlug from \"./nexture/ni-plug\";\nimport NiPlus from \"./nexture/ni-plus\";\nimport NiPlusFull from \"./nexture/ni-plus-full\";\nimport NiPlusSquare from \"./nexture/ni-plus-square\";\nimport NiPolitics from \"./nexture/ni-politics\";\nimport NiPound from \"./nexture/ni-pound\";\nimport NiPoundSquare from \"./nexture/ni-pound-square\";\nimport NiPower from \"./nexture/ni-power\";\nimport NiPresentation from \"./nexture/ni-presentation\";\nimport NiPrevious from \"./nexture/ni-previous\";\nimport NiPrinter from \"./nexture/ni-printer\";\nimport NiProgress from \"./nexture/ni-progress\";\nimport NiPullRequestClosed from \"./nexture/ni-pull-request-closed\";\nimport NiPullRequestDraft from \"./nexture/ni-pull-request-draft\";\nimport NiPullRequestMerged from \"./nexture/ni-pull-request-merged\";\nimport NiPullRequestOpen from \"./nexture/ni-pull-request-open\";\nimport NiPulse from \"./nexture/ni-pulse\";\nimport NiPushPin from \"./nexture/ni-push-pin\";\nimport NiPushPinLeft from \"./nexture/ni-push-pin-left\";\nimport NiPushPinRight from \"./nexture/ni-push-pin-right\";\nimport NiPuzzle from \"./nexture/ni-puzzle\";\nimport NiQuestionHexagon from \"./nexture/ni-question-hexagon\";\nimport NiRadio from \"./nexture/ni-radio\";\nimport NiRankFour from \"./nexture/ni-rank-four\";\nimport NiRankOne from \"./nexture/ni-rank-one\";\nimport NiRankThree from \"./nexture/ni-rank-three\";\nimport NiRankTwo from \"./nexture/ni-rank-two\";\nimport NiReceipt from \"./nexture/ni-receipt\";\nimport NiRecord from \"./nexture/ni-record\";\nimport NiRefresh from \"./nexture/ni-refresh\";\nimport NiReligion from \"./nexture/ni-religion\";\nimport NiResearch from \"./nexture/ni-research\";\nimport NiRevenue from \"./nexture/ni-revenue\";\nimport NiReverseLeft from \"./nexture/ni-reverse-left\";\nimport NiReverseRight from \"./nexture/ni-reverse-right\";\nimport NiRobot from \"./nexture/ni-robot\";\nimport NiRocket from \"./nexture/ni-rocket\";\nimport NiRouter from \"./nexture/ni-router\";\nimport NiRows from \"./nexture/ni-rows\";\nimport NiSafe from \"./nexture/ni-safe\";\nimport NiScale from \"./nexture/ni-scale\";\nimport NiScalpel from \"./nexture/ni-scalpel\";\nimport NiScissors from \"./nexture/ni-scissors\";\nimport NiScreen from \"./nexture/ni-screen\";\nimport NiScriptSub from \"./nexture/ni-script-sub\";\nimport NiScriptSuper from \"./nexture/ni-script-super\";\nimport NiSdCard from \"./nexture/ni-sd-card\";\nimport NiSearch from \"./nexture/ni-search\";\nimport NiSelect from \"./nexture/ni-select\";\nimport NiSendDown from \"./nexture/ni-send-down\";\nimport NiSendDownLeft from \"./nexture/ni-send-down-left\";\nimport NiSendDownRight from \"./nexture/ni-send-down-right\";\nimport NiSendLeft from \"./nexture/ni-send-left\";\nimport NiSendRight from \"./nexture/ni-send-right\";\nimport NiSendUp from \"./nexture/ni-send-up\";\nimport NiSendUpLeft from \"./nexture/ni-send-up-left\";\nimport NiSendUpRight from \"./nexture/ni-send-up-right\";\nimport NiServer from \"./nexture/ni-server\";\nimport NiSettings from \"./nexture/ni-settings\";\nimport NiShare from \"./nexture/ni-share\";\nimport NiShield from \"./nexture/ni-shield\";\nimport NiShieldCheck from \"./nexture/ni-shield-check\";\nimport NiShieldCross from \"./nexture/ni-shield-cross\";\nimport NiShrinkFull from \"./nexture/ni-shrink-full\";\nimport NiShrinkSquare from \"./nexture/ni-shrink-square\";\nimport NiShuffle from \"./nexture/ni-shuffle\";\nimport NiSign from \"./nexture/ni-sign\";\nimport NiSignalLeftRight from \"./nexture/ni-signal-left-right\";\nimport NiSignalRight from \"./nexture/ni-signal-right\";\nimport NiSignalUp from \"./nexture/ni-signal-up\";\nimport NiSigns from \"./nexture/ni-signs\";\nimport NiSlashHexagon from \"./nexture/ni-slash-hexagon\";\nimport NiSlider from \"./nexture/ni-slider\";\nimport NiSnow from \"./nexture/ni-snow\";\nimport NiSoundCross from \"./nexture/ni-sound-cross\";\nimport NiSoundOff from \"./nexture/ni-sound-off\";\nimport NiSoundOn from \"./nexture/ni-sound-on\";\nimport NiSoundPlus from \"./nexture/ni-sound-plus\";\nimport NiSparkle from \"./nexture/ni-sparkle\";\nimport NiSpinner from \"./nexture/ni-spinner\";\nimport NiSquare from \"./nexture/ni-square\";\nimport NiSquircle from \"./nexture/ni-squircle\";\nimport NiStar from \"./nexture/ni-star\";\nimport NiStars from \"./nexture/ni-stars\";\nimport NiStomach from \"./nexture/ni-stomach\";\nimport NiStopwatch from \"./nexture/ni-stopwatch\";\nimport NiStore from \"./nexture/ni-store\";\nimport NiStructure from \"./nexture/ni-structure\";\nimport NiSum from \"./nexture/ni-sum\";\nimport NiSun from \"./nexture/ni-sun\";\nimport NiSwap from \"./nexture/ni-swap\";\nimport NiSwitch from \"./nexture/ni-switch\";\nimport NiTablet from \"./nexture/ni-tablet\";\nimport NiTag from \"./nexture/ni-tag\";\nimport NiTelescope from \"./nexture/ni-telescope\";\nimport NiTemperature from \"./nexture/ni-temperature\";\nimport NiTent from \"./nexture/ni-tent\";\nimport NiTerminal from \"./nexture/ni-terminal\";\nimport NiTextBold from \"./nexture/ni-text-bold\";\nimport NiTextCenter from \"./nexture/ni-text-center\";\nimport NiTextFont from \"./nexture/ni-text-font\";\nimport NiTextItalic from \"./nexture/ni-text-italic\";\nimport NiTextJustify from \"./nexture/ni-text-justify\";\nimport NiTextLeft from \"./nexture/ni-text-left\";\nimport NiTextQuote from \"./nexture/ni-text-quote\";\nimport NiTextRight from \"./nexture/ni-text-right\";\nimport NiTextStrikethrough from \"./nexture/ni-text-strikethrough\";\nimport NiTextUnderline from \"./nexture/ni-text-underline\";\nimport NiTextarea from \"./nexture/ni-textarea\";\nimport NiTicket from \"./nexture/ni-ticket\";\nimport NiTimeline from \"./nexture/ni-timeline\";\nimport NiTooth from \"./nexture/ni-tooth\";\nimport NiToyBoat from \"./nexture/ni-toy-boat\";\nimport NiToySky from \"./nexture/ni-toy-sky\";\nimport NiToyStacking from \"./nexture/ni-toy-stacking\";\nimport NiTrade from \"./nexture/ni-trade\";\nimport NiTree from \"./nexture/ni-tree\";\nimport NiTrendDown from \"./nexture/ni-trend-down\";\nimport NiTrendUp from \"./nexture/ni-trend-up\";\nimport NiTriangleDown from \"./nexture/ni-triangle-down\";\nimport NiTriangleLeft from \"./nexture/ni-triangle-left\";\nimport NiTriangleRight from \"./nexture/ni-triangle-right\";\nimport NiTriangleUp from \"./nexture/ni-triangle-up\";\nimport NiTrophy from \"./nexture/ni-trophy\";\nimport NiTruck from \"./nexture/ni-truck\";\nimport NiTubes from \"./nexture/ni-tubes\";\nimport NiUngroup from \"./nexture/ni-ungroup\";\nimport NiUnlike from \"./nexture/ni-unlike\";\nimport NiUnlock from \"./nexture/ni-unlock\";\nimport NiUploadCloud from \"./nexture/ni-upload-cloud\";\nimport NiUser from \"./nexture/ni-user\";\nimport NiUserCheck from \"./nexture/ni-user-check\";\nimport NiUserCross from \"./nexture/ni-user-cross\";\nimport NiUserMinus from \"./nexture/ni-user-minus\";\nimport NiUserPlus from \"./nexture/ni-user-plus\";\nimport NiUsers from \"./nexture/ni-users\";\nimport NiVerified from \"./nexture/ni-verified\";\nimport NiWallet from \"./nexture/ni-wallet\";\nimport NiWalletCrypto from \"./nexture/ni-wallet-crypto\";\nimport NiWatch from \"./nexture/ni-watch\";\nimport NiWeightScale from \"./nexture/ni-weight-scale\";\nimport NiWind from \"./nexture/ni-wind\";\nimport NiWorld from \"./nexture/ni-world\";\nimport NiZoomIn from \"./nexture/ni-zoom-in\";\nimport NiZoomOut from \"./nexture/ni-zoom-out\";\n\nexport const IconMap = {\n NiAI,\n NiAirBalloon,\n NiAnchor,\n NiAnnouncement,\n NiAntenna,\n NiArchiveCheck,\n NiArchive,\n NiArrowCircleLeft,\n NiArrowCircleRight,\n NiArrowDownLeftSquare,\n NiArrowDownLeft,\n NiArrowDownRightSquare,\n NiArrowDownRight,\n NiArrowDownSquare,\n NiArrowDown,\n NiArrowHistory,\n NiArrowInDown,\n NiArrowInLeft,\n NiArrowInRight,\n NiArrowInUp,\n NiArrowLeftRight,\n NiArrowLeftSquare,\n NiArrowLeft,\n NiArrowOutDown,\n NiArrowOutLeft,\n NiArrowOutRight,\n NiArrowOutUp,\n NiArrowRightSquare,\n NiArrowRight,\n NiArrowUpDown,\n NiArrowUpLeftSquare,\n NiArrowUpLeft,\n NiArrowUpRightSquare,\n NiArrowUpRight,\n NiArrowUpSquare,\n NiArrowUp,\n NiAt,\n NiBadgeCheck,\n NiBadge,\n NiBag,\n NiBandAid,\n NiBarcode,\n NiBasket,\n NiBatteryCharging,\n NiBatteryEmpty,\n NiBatteryFull,\n NiBellInactive,\n NiBell,\n NiBinEmpty,\n NiBinFull,\n NiBloodCells,\n NiBluetooth,\n NiBook,\n NiBookmarkSingle,\n NiBookmark,\n NiBraces,\n NiBrackets,\n NiBrain,\n NiBrainCircuit,\n NiBriefcase,\n NiBrushArtSquare,\n NiBrushArt,\n NiBrush,\n NiBug,\n NiBuilding,\n NiBulbOff,\n NiBulbOn,\n NiButton,\n NiButtonGroup,\n NiButtonLarge,\n NiCake,\n NiCalendar,\n NiCalendarClock,\n NiCamera,\n NiCar,\n NiCartArrow,\n NiCartCross,\n NiCartEmpty,\n NiCartMinus,\n NiCartPlus,\n NiCatalog,\n NiCellsPlus,\n NiCells,\n NiChange,\n NiChartBar,\n NiChartCandleSticks,\n NiChartFunnel,\n NiChartHeatmap,\n NiChartLineBar,\n NiChartLine,\n NiChartPie,\n NiChartPolar,\n NiChartRadar,\n NiChartScatter,\n NiCheckSquare,\n NiCheck,\n NiCheckFull,\n NiChef,\n NiChevronDownSmall,\n NiChevronDown,\n NiChevronLeftRightReverseSmall,\n NiChevronLeftRightSmall,\n NiChevronLeftSmall,\n NiChevronLeft,\n NiChevronRightSmall,\n NiChevronRight,\n NiChevronUpDownReverseSmall,\n NiChevronUpDownSmall,\n NiChevronUpSmall,\n NiChevronUp,\n NiCholesterol,\n NiCircle,\n NiClipboard,\n NiClock,\n NiCloudPartly,\n NiCloudRain,\n NiCloudSnow,\n NiCloudThunder,\n NiCloud,\n NiCode,\n NiCoffee,\n NiCoin,\n NiCollapse,\n NiCollapseIn,\n NiCols,\n NiCompass,\n NiController,\n NiCopyright,\n NiCpu,\n NiCreditCard,\n NiCrop,\n NiCrossHexagon,\n NiCrossSquare,\n NiCross,\n NiCrossFull,\n NiCrosshair,\n NiCrown,\n NiCursor,\n NiDashboard,\n NiDatabase,\n NiDevops,\n NiDiagram,\n NiDice,\n NiDirectory,\n NiDocumentArchive,\n NiDocumentChart,\n NiDocumentCheck,\n NiDocumentCode,\n NiDocumentCross,\n NiDocumentFull,\n NiDocumentImage,\n NiDocumentMinus,\n NiDocumentNumber,\n NiDocumentPlus,\n NiDocumentVideo,\n NiDollarSquare,\n NiDollar,\n NiDotsSquare,\n NiDownloadCloud,\n NiDragHorizontal,\n NiDragVertical,\n NiDrink,\n NiDrop,\n NiDuplicate,\n NiEllipsisHorizontal,\n NiEllipsisVertical,\n NiEmailOpen,\n NiEmail,\n NiEndDownSmall,\n NiEndLeftSmall,\n NiEndRightSmall,\n NiEndUpSmall,\n NiEnterDown,\n NiEnterLeft,\n NiEnterReverseDown,\n NiEnterReverseLeft,\n NiEnterReverseRight,\n NiEnterReverseUp,\n NiEnterRight,\n NiEnterUp,\n NiEquals,\n NiEqualsFull,\n NiEraser,\n NiEuroSquare,\n NiEuro,\n NiExclamationHexagon,\n NiExclamationSquare,\n NiExpandOut,\n NiExpandSquare,\n NiExpandFull,\n NiExpand,\n NiExternal,\n NiEyeClose,\n NiEyeInactive,\n NiEyeOpen,\n NiFaceFrownMore,\n NiFaceFrown,\n NiFaceNeutral,\n NiFaceSmileMore,\n NiFaceSmile,\n NiFemale,\n NiFilterCross,\n NiFilterMinus,\n NiFilterPlus,\n NiFilter,\n NiFingerprint,\n NiFire,\n NiFirstAid,\n NiFitness,\n NiFlag,\n NiFlash,\n NiFlask,\n NiFloppyDisk,\n NiFolderCheck,\n NiFolderCross,\n NiFolderMinus,\n NiFolderPlus,\n NiFolder,\n NiForwardDownSmall,\n NiForwardLeftSmall,\n NiForwardRightSmall,\n NiForwardUpSmall,\n NiGay,\n NiGerm,\n NiGogo,\n NiGold,\n NiGpu,\n NiGroup,\n NiGraduation,\n NiHeadphones,\n NiHeadset,\n NiHeadsetMic,\n NiHealth,\n NiHeart,\n NiHeartRate,\n NiHearts,\n NiHome,\n NiInbox,\n NiInfoSquare,\n NiInjection,\n NiInput,\n NiIntegration,\n NiInternal,\n NiIv,\n NiJoin,\n NiKey,\n NiKeyboard,\n NiKnobs,\n NiLaptop,\n NiLayout,\n NiLaw,\n NiLike,\n NiLinkBroken,\n NiLink,\n NiListCheck,\n NiListChevronDown,\n NiListCircle,\n NiListCross,\n NiListNumber,\n NiListSquare,\n NiList,\n NiLungs,\n NiLoader,\n NiLock,\n NiLuggage,\n NiMagicWand,\n NiMale,\n NiMap,\n NiMasonary,\n NiMedal,\n NiMenu,\n NiMenuLeft,\n NiMenuRight,\n NiMenuSplitDotReverse,\n NiMenuSplitDot,\n NiMenuSplitReverse,\n NiMenuSplit,\n NiMessageCheck,\n NiMessageCross,\n NiMessageDots,\n NiMessageFilled,\n NiMessageGrammar,\n NiMessagePlus,\n NiMessage,\n NiMessages,\n NiMicrophone,\n NiMinus,\n NiMinusFull,\n NiMinusSquare,\n NiMoneyBag,\n NiMoney,\n NiMoon,\n NiMountain,\n NiMouse,\n NiMove,\n NiMusic,\n NiNetwork,\n NiNext,\n NiOxygen,\n NiPaintBucket,\n NiPaintRoller,\n NiPalette,\n NiPaperclip,\n NiParentheses,\n NiPath,\n NiPause,\n NiPenSquare,\n NiPen,\n NiPercent,\n NiPhoneHandsetCheck,\n NiPhoneHandsetOff,\n NiPhoneHandsetOn,\n NiPhoneHandset,\n NiPhone,\n NiPinCheck,\n NiPinCross,\n NiPinPlus,\n NiPin,\n NiPine,\n NiPivot,\n NiPlane,\n NiPlay,\n NiPlug,\n NiPlusSquare,\n NiPlus,\n NiPlusFull,\n NiPolitics,\n NiPoundSquare,\n NiPound,\n NiPower,\n NiPresentation,\n NiPrevious,\n NiPrinter,\n NiProgress,\n NiPullRequestClosed,\n NiPullRequestDraft,\n NiPullRequestMerged,\n NiPullRequestOpen,\n NiPulse,\n NiPushPin,\n NiPushPinLeft,\n NiPushPinRight,\n NiPuzzle,\n NiQuestionHexagon,\n NiRankOne,\n NiRankTwo,\n NiRankThree,\n NiRankFour,\n NiRadio,\n NiReceipt,\n NiRecord,\n NiRefresh,\n NiReligion,\n NiResearch,\n NiRevenue,\n NiReverseLeft,\n NiReverseRight,\n NiRobot,\n NiRocket,\n NiRouter,\n NiRows,\n NiSafe,\n NiScale,\n NiScalpel,\n NiScissors,\n NiScreen,\n NiScriptSub,\n NiScriptSuper,\n NiSdCard,\n NiSearch,\n NiSelect,\n NiSendDownLeft,\n NiSendDownRight,\n NiSendDown,\n NiSendLeft,\n NiSendRight,\n NiSendUpLeft,\n NiSendUpRight,\n NiSendUp,\n NiServer,\n NiSettings,\n NiShare,\n NiShieldCheck,\n NiShieldCross,\n NiShield,\n NiShrinkSquare,\n NiShrinkFull,\n NiShuffle,\n NiSign,\n NiSignalLeftRight,\n NiSignalRight,\n NiSignalUp,\n NiSigns,\n NiSlashHexagon,\n NiSlider,\n NiSnow,\n NiSoundCross,\n NiSoundOff,\n NiSoundOn,\n NiSoundPlus,\n NiSparkle,\n NiSpinner,\n NiSquare,\n NiSquircle,\n NiStar,\n NiStars,\n NiStopwatch,\n NiStore,\n NiStomach,\n NiStructure,\n NiSum,\n NiSun,\n NiSwap,\n NiSwitch,\n NiTablet,\n NiTag,\n NiTelescope,\n NiTemperature,\n NiTent,\n NiTerminal,\n NiTextBold,\n NiTextCenter,\n NiTextFont,\n NiTextItalic,\n NiTextJustify,\n NiTextLeft,\n NiTextQuote,\n NiTextRight,\n NiTextStrikethrough,\n NiTextUnderline,\n NiTextarea,\n NiTicket,\n NiTimeline,\n NiTooth,\n NiToyBoat,\n NiToySky,\n NiToyStacking,\n NiTrade,\n NiTree,\n NiTrendDown,\n NiTrendUp,\n NiTriangleDown,\n NiTriangleLeft,\n NiTriangleRight,\n NiTriangleUp,\n NiTrophy,\n NiTruck,\n NiTubes,\n NiUngroup,\n NiUnlike,\n NiUnlock,\n NiUploadCloud,\n NiUserCheck,\n NiUserCross,\n NiUserMinus,\n NiUserPlus,\n NiUser,\n NiUsers,\n NiVerified,\n NiWalletCrypto,\n NiWallet,\n NiWatch,\n NiWeightScale,\n NiWind,\n NiWorld,\n NiZoomIn,\n NiZoomOut,\n};\n\nexport type IconName = keyof typeof IconMap;\nexport type IconSize = \"large\" | \"medium\" | \"small\" | \"tiny\" | number;\nexport type IconVariant = \"outlined\" | \"contained\";\n\nexport type NextureIconsProps = {\n variant?: IconVariant;\n className?: string;\n size?: IconSize;\n strokeWidth?: number;\n oneTone?: boolean;\n};\n\nexport type NextureIconsPropsComponent = NextureIconsProps & {\n icon: IconName;\n};\n\nconst NextureIcons: React.FC<NextureIconsPropsComponent> = ({\n icon,\n size = 20,\n variant = \"outlined\",\n className,\n strokeWidth = 1.5,\n oneTone = false,\n}) => {\n const IconComponent = IconMap[icon];\n if (!IconComponent) {\n console.warn(`Icon \"${icon}\" not found in IconMap.`);\n return null;\n }\n return (\n <IconComponent variant={variant} size={size} className={className} strokeWidth={strokeWidth} oneTone={oneTone} />\n );\n};\n\nexport const sizeHelper = (size: NextureIconsProps[\"size\"]) => {\n if (typeof size === \"number\") {\n return size;\n } else if (size === \"large\") {\n return 24;\n } else if (size === \"small\" || size === \"tiny\") {\n return 16;\n } else {\n return 20;\n }\n};\n\nexport const strokeSizeHelper = (size: number) => {\n if (size === 32) {\n return 1.15;\n } else if (size >= 20) {\n return 1.5;\n } else {\n return 1.75;\n }\n};\n\nexport default NextureIcons;\n","import { memo, useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport { FilledInput, FormControl, IconButton, InputAdornment, InputLabel } from \"@mui/material\";\n\nimport { NiCross, NiSearch } from \"../../icons/nexture\";\n\ninterface DebouncedSearchInputProps {\n value?: string;\n onChange: (value: string) => void;\n label?: string;\n delay?: number;\n className?: string;\n}\n\n/**\n * Self-contained search input that manages its own typing state.\n * Only calls `onChange` after a debounce, preventing expensive parent re-renders\n * (e.g. DataGrid) on every keystroke.\n *\n * Promoted here from `sales` and `timesheets`, where the file was byte-identical in both and a\n * third search field had been hand-mirrored from it in a shared toolbar. \"Search bars don't look\n * the same\" is not a problem a lint rule can fix - only one implementation can - so this is the\n * implementation, and `coreconnect/no-local-search-input` is the backstop that stops the next\n * plugin writing a fourth.\n *\n * Class composition uses the package's existing join idiom rather than a `cn`/tailwind-merge\n * helper, which keeps `plugin-ui` free of new runtime dependencies. No caller passes a conflicting\n * utility class today, so tailwind-merge's conflict resolution is unexercised; a caller that needs\n * it should override via `sx` instead of racing class order.\n */\nexport const DebouncedSearchInput = memo(function DebouncedSearchInput({\n value = \"\",\n onChange,\n label = \"Search\",\n delay = 400,\n className,\n}: DebouncedSearchInputProps) {\n const [localValue, setLocalValue] = useState(value);\n // Associate the InputLabel with the FilledInput — a bare FormControl+InputLabel+Input\n // doesn't auto-link them (unlike TextField), leaving the label without a `for` target.\n const inputId = useId();\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const lastReportedRef = useRef(value);\n const isFirstRender = useRef(true);\n\n // Sync external value changes (e.g. clear from parent)\n useEffect(() => {\n setLocalValue(value);\n lastReportedRef.current = value;\n }, [value]);\n\n // Debounce: notify parent only after typing pauses (skip initial mount)\n useEffect(() => {\n if (isFirstRender.current) {\n isFirstRender.current = false;\n return;\n }\n if (localValue === lastReportedRef.current) return;\n const timer = setTimeout(() => {\n lastReportedRef.current = localValue;\n onChangeRef.current(localValue);\n }, delay);\n return () => clearTimeout(timer);\n }, [localValue, delay]);\n\n const handleClear = useCallback(() => {\n setLocalValue(\"\");\n lastReportedRef.current = \"\";\n onChangeRef.current(\"\");\n }, []);\n\n const classes = (...parts: (string | false | undefined)[]) => parts.filter(Boolean).join(\" \");\n\n return (\n <FormControl variant=\"filled\" size=\"medium\" className={classes(\"surface mb-0 w-full\", className)}>\n <InputLabel htmlFor={inputId}>{label}</InputLabel>\n <FilledInput\n id={inputId}\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n endAdornment={\n <>\n <InputAdornment position=\"end\" className={classes(localValue === \"\" && \"hidden\")}>\n <IconButton edge=\"end\" onClick={handleClear} aria-label=\"Clear search\">\n <NiCross size=\"medium\" className=\"text-text-disabled\" />\n </IconButton>\n </InputAdornment>\n <InputAdornment position=\"end\" className={classes(localValue !== \"\" && \"hidden\")} aria-hidden>\n <IconButton edge=\"end\" disabled tabIndex={-1}>\n <NiSearch size=\"medium\" className=\"text-text-disabled\" />\n </IconButton>\n </InputAdornment>\n </>\n }\n />\n </FormControl>\n );\n});\n","import { useState, useRef, type ReactNode } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport {\n Box,\n Breadcrumbs as MuiBreadcrumbs,\n Stack,\n Typography,\n Link as MuiLink,\n Button,\n IconButton,\n Menu,\n MenuItem,\n} from \"../ui\";\nimport type { ActionDescriptor, Breadcrumb } from \"./pageHeaderTypes\";\n\n/**\n * `@ethisyscore/plugin-ui/components/layout` — the page-header, promoted from the\n * monolith so plugins share one component instead of copying it. In a plugin this\n * IS the page header: the host suppresses its own chrome for platform-react\n * surfaces, so this renders the breadcrumb trail, the title, and the CTAs.\n *\n * `breadcrumbs` is the ROOT trail (e.g. `Home / Finance`); the current `title` is\n * appended as the non-link leaf crumb. MUI primitives come from the sibling\n * `../ui` barrel (host externals, never bundled); `Link` is react-router's so\n * links keep middle-click / open-in-new-tab / a11y.\n */\nexport interface PageHeaderProps {\n title: string;\n subtitle?: ReactNode;\n primaryAction?: ActionDescriptor;\n secondaryAction?: ActionDescriptor;\n overflowActions?: ActionDescriptor[];\n /** Root breadcrumb trail; the `title` is appended as the current-page leaf. */\n breadcrumbs?: Breadcrumb[];\n}\n\nexport function PageHeader({\n title,\n subtitle,\n primaryAction,\n secondaryAction,\n overflowActions,\n breadcrumbs,\n}: PageHeaderProps) {\n const hasActions =\n primaryAction != null ||\n secondaryAction != null ||\n (overflowActions != null && overflowActions.length > 0);\n\n return (\n <Stack direction=\"column\" spacing={0.5} className=\"mb-4\">\n {breadcrumbs != null && breadcrumbs.length > 0 && <Breadcrumbs trail={breadcrumbs} />}\n <Stack direction=\"row\" justifyContent=\"space-between\" alignItems=\"flex-start\" spacing={2}>\n <Box>\n {/* Title is optional: in a plugin the host renders the surface title,\n so list pages pass an empty title and only their CTA shows. Pages\n that want an in-body title (detail/create/edit) set it explicitly. */}\n {title !== \"\" && (\n <Typography variant=\"h4\" component=\"h1\">\n {title}\n </Typography>\n )}\n {subtitle != null && (\n <Typography variant=\"body2\" color=\"text.secondary\" className=\"mt-1\">\n {subtitle}\n </Typography>\n )}\n </Box>\n {hasActions && (\n <Stack\n direction=\"row\"\n spacing={1}\n alignItems=\"center\"\n data-testid=\"page-header-actions\"\n >\n {overflowActions != null && overflowActions.length > 0 && (\n <OverflowMenu actions={overflowActions} />\n )}\n {secondaryAction != null && <SecondaryDropdown action={secondaryAction} />}\n {primaryAction != null && <PrimaryButton action={primaryAction} />}\n </Stack>\n )}\n </Stack>\n </Stack>\n );\n}\n\n/**\n * Breadcrumb trail — mirrors the host's `gogo-ui` `PageBreadcrumbs` exactly (MUI\n * `Breadcrumbs` with the same markup/props) so the plugin surface looks identical\n * to host-rendered chrome: `text.secondary` links (`underline=\"hover\"`) up to the\n * current page, a `text.primary` leaf, `variant=\"body2\"`, `mb-2 px-1`.\n */\nfunction Breadcrumbs({ trail }: { trail: Breadcrumb[] }) {\n if (trail.length < 2) return null;\n return (\n <MuiBreadcrumbs aria-label=\"breadcrumb\" className=\"mb-2 px-1\">\n {trail.map((crumb, index) =>\n index < trail.length - 1 ? (\n <MuiLink\n key={crumb.href ?? crumb.label}\n component={Link}\n to={crumb.href ?? \"/\"}\n underline=\"hover\"\n color=\"text.secondary\"\n variant=\"body2\"\n >\n {crumb.label}\n </MuiLink>\n ) : (\n <Typography key={crumb.label} color=\"text.primary\" variant=\"body2\">\n {crumb.label}\n </Typography>\n ),\n )}\n </MuiBreadcrumbs>\n );\n}\n\nfunction PrimaryButton({ action }: { action: ActionDescriptor }) {\n const common = {\n \"data-danger\": action.danger ? \"true\" : undefined,\n disabled: action.disabled,\n } as const;\n if (action.href != null) {\n return (\n <Button\n component={Link}\n to={action.href}\n variant=\"contained\"\n color={action.danger ? \"error\" : \"primary\"}\n {...common}\n >\n {action.label}\n </Button>\n );\n }\n return (\n <Button\n onClick={action.onClick}\n variant=\"contained\"\n color={action.danger ? \"error\" : \"primary\"}\n {...common}\n >\n {action.label}\n </Button>\n );\n}\n\nfunction useMenuState() {\n const [open, setOpen] = useState(false);\n const anchorRef = useRef<HTMLButtonElement | null>(null);\n return {\n open,\n anchorRef,\n toggle: () => setOpen((v) => !v),\n close: () => setOpen(false),\n };\n}\n\nfunction SecondaryDropdown({ action }: { action: ActionDescriptor }) {\n const { open, anchorRef, toggle, close } = useMenuState();\n const children = action.children ?? [];\n\n return (\n <>\n <Button\n ref={anchorRef}\n variant=\"outlined\"\n onClick={toggle}\n disabled={action.disabled || children.length === 0}\n aria-haspopup=\"menu\"\n aria-expanded={open || undefined}\n aria-label={action.label}\n >\n {action.label} ▾\n </Button>\n <Menu anchorEl={anchorRef.current} open={open} onClose={close}>\n {children.map((child) => (\n // href children render as anchors (component={Link}) to keep\n // middle-click / open-in-new-tab / a11y. `href` and `onClick` are\n // mutually exclusive on ActionDescriptor, so one MenuItem covers both.\n <MenuItem\n key={child.id}\n {...(child.href != null ? { component: Link, to: child.href } : {})}\n onClick={() => {\n close();\n child.onClick?.();\n }}\n disabled={child.disabled}\n >\n {child.label}\n </MenuItem>\n ))}\n </Menu>\n </>\n );\n}\n\nfunction OverflowMenu({ actions }: { actions: ActionDescriptor[] }) {\n const { open, anchorRef, toggle, close } = useMenuState();\n return (\n <>\n <IconButton\n ref={anchorRef}\n size=\"small\"\n aria-label=\"More actions\"\n onClick={toggle}\n >\n {\"⋯\"}\n </IconButton>\n <Menu anchorEl={anchorRef.current} open={open} onClose={close}>\n {actions.map((a) => (\n // href items render as anchors (component={Link}) — like\n // PrimaryButton — to keep middle-click / open-in-new-tab / a11y.\n // `href` and `onClick` are mutually exclusive on ActionDescriptor,\n // so one MenuItem covers both.\n <MenuItem\n key={a.id}\n {...(a.href != null ? { component: Link, to: a.href } : {})}\n onClick={() => {\n close();\n a.onClick?.();\n }}\n disabled={a.disabled}\n sx={a.danger ? { color: \"error.main\" } : undefined}\n >\n {a.label}\n </MenuItem>\n ))}\n </Menu>\n </>\n );\n}\n","import { createContext, useContext } from \"react\";\nimport type { PageHeaderState } from \"./pageHeaderTypes\";\n\n/**\n * Carries the active menu item / detail context so `usePageHeader` can derive\n * header props. The plugin analogue of the monolith shell's\n * `SubMenuPropsContext`: mounted once by `PageHeaderProvider`, read per page.\n *\n * `null` when no provider is mounted (a page rendered standalone, e.g. a test) —\n * consumers treat `null` as \"no header context\" and derive empty props.\n */\nexport const PageHeaderContext = createContext<PageHeaderState | null>(null);\n\n/** Returns the provider-published header state, or `null` when none is mounted. */\nexport function usePageHeaderContext(): PageHeaderState | null {\n return useContext(PageHeaderContext);\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\n\n/**\n * Sidebar-action dispatch channel — promoted from the monolith's\n * `SidebarActionContext`. Header buttons carrying an `actionId` (rather than an\n * `href`) dispatch through here; a page registers a handler via\n * `useSidebarAction` to open its own dialog. This is what makes `actionId` CTAs\n * (\"New Supplier Invoice\", \"New Cost Code\", …) fire when clicked.\n */\n\nexport type ActionHandler = (actionId: string) => void;\n\nexport interface SidebarActionContextValue {\n /** Dispatch an action to all registered page handlers. */\n triggerAction: (actionId: string) => void;\n /** Register a handler that receives sidebar actions. Returns an unregister function. */\n registerHandler: (handler: ActionHandler) => () => void;\n /** Set of actionIds whose owning UI surface (e.g. a dialog) is currently open. */\n activeActions: ReadonlySet<string>;\n /** Reports whether the owning UI surface for `actionId` is currently open. */\n setActionActive: (actionId: string, isActive: boolean) => void;\n}\n\nexport const SidebarActionContext = createContext<SidebarActionContextValue>({\n triggerAction: () => {},\n registerHandler: () => () => {},\n activeActions: new Set(),\n setActionActive: () => {},\n});\n\nexport function SidebarActionProvider({ children }: { children: ReactNode }) {\n const handlersRef = useRef(new Set<ActionHandler>());\n const [activeActions, setActiveActions] = useState<ReadonlySet<string>>(() => new Set());\n\n const triggerAction = useCallback((actionId: string) => {\n for (const handler of handlersRef.current) {\n handler(actionId);\n }\n }, []);\n\n const registerHandler = useCallback((handler: ActionHandler) => {\n handlersRef.current.add(handler);\n return () => {\n handlersRef.current.delete(handler);\n };\n }, []);\n\n const setActionActive = useCallback((actionId: string, isActive: boolean) => {\n setActiveActions((prev) => {\n const has = prev.has(actionId);\n if (isActive === has) return prev;\n const next = new Set(prev);\n if (isActive) next.add(actionId);\n else next.delete(actionId);\n return next;\n });\n }, []);\n\n const value = useMemo(\n () => ({ triggerAction, registerHandler, activeActions, setActionActive }),\n [triggerAction, registerHandler, activeActions, setActionActive],\n );\n\n return <SidebarActionContext.Provider value={value}>{children}</SidebarActionContext.Provider>;\n}\n\n/** Used by the header to dispatch actions to pages. */\nexport function useTriggerSidebarAction(): (actionId: string) => void {\n return useContext(SidebarActionContext).triggerAction;\n}\n\n/** Used by pages to register a handler for sidebar actions. Auto-cleans up on unmount. */\nexport function useSidebarAction(handler: ActionHandler): void {\n const { registerHandler } = useContext(SidebarActionContext);\n useEffect(() => registerHandler(handler), [registerHandler, handler]);\n}\n\n/**\n * Registers a map of sidebar-action handlers keyed by action id, dispatching the\n * matching entry when an action fires (unknown ids are ignored). The handler map\n * may change every render — a ref keeps the dispatcher stable so the registration\n * doesn't churn.\n */\nexport function useSidebarActions(handlers: Record<string, (() => void) | undefined>): void {\n const handlersRef = useRef(handlers);\n handlersRef.current = handlers;\n useSidebarAction(\n useCallback((actionId: string) => {\n handlersRef.current[actionId]?.();\n }, []),\n );\n}\n\n/** Reads the set of dispatch-action ids whose owning UI surface is currently open. */\nexport function useActiveSidebarActions(): ReadonlySet<string> {\n return useContext(SidebarActionContext).activeActions;\n}\n\n/**\n * Reports to the channel whether the owning UI surface for `actionId` is open.\n * Pages call this from a hook scope, mirroring their dialog/drawer open state.\n */\nexport function useReportSidebarActionActive(actionId: string, isActive: boolean): void {\n const { setActionActive } = useContext(SidebarActionContext);\n useEffect(() => {\n setActionActive(actionId, isActive);\n return () => {\n setActionActive(actionId, false);\n };\n }, [actionId, isActive, setActionActive]);\n}\n","import { useMemo } from \"react\";\nimport { usePageHeaderContext } from \"./pageHeaderContext\";\nimport { useTriggerSidebarAction } from \"./sidebarAction\";\nimport type {\n ActionDescriptor,\n ActionSlot,\n HeaderAction,\n PageHeaderDerivedProps,\n} from \"./pageHeaderTypes\";\n\n/**\n * Derives `<PageHeader>` props from the active menu item or detail context —\n * promoted verbatim from the monolith's `usePageHeader`, reading the plugin's\n * `PageHeaderContext` instead of the shell's `SubMenuPropsContext`.\n *\n * Outside a mounted `PageHeaderProvider` (or in a test rendering a page\n * standalone) the context is `null` and the hook derives empty header props —\n * same shape, no work. Page hooks spread the result and may override\n * title/subtitle/actions.\n */\nexport function usePageHeader(): PageHeaderDerivedProps {\n const state = usePageHeaderContext();\n const { activeMenuItem, detailContext, title, subtitle, breadcrumbs } = state ?? {};\n // Dispatcher for actionId-only actions — the same channel a page registers\n // against via `useSidebarAction`. Threading it into `toDescriptor` is what\n // makes header buttons like `+ New Supplier Invoice` (which carry an\n // `actionId` and no `href`) open the page-owned dialog when clicked.\n const triggerAction = useTriggerSidebarAction();\n\n return useMemo(() => {\n const sourceActions: HeaderAction[] =\n detailContext?.actions ?? activeMenuItem?.actions ?? [];\n\n let primary: ActionDescriptor | undefined;\n let secondary: ActionDescriptor | undefined;\n const overflow: ActionDescriptor[] = [];\n\n for (const action of sourceActions) {\n const descriptor = toDescriptor(action, triggerAction);\n const slot: ActionSlot = action.slot ?? \"sidebar-only\";\n switch (slot) {\n case \"primary\":\n if (primary == null) {\n primary = descriptor;\n } else {\n console.warn(\n \"usePageHeader: multiple primary slots on this page; demoting later ones to overflow\",\n { keptId: primary.id, demotedId: descriptor.id },\n );\n overflow.push(descriptor);\n }\n break;\n case \"secondary\":\n if (secondary == null) {\n secondary = descriptor;\n } else {\n console.warn(\n \"usePageHeader: multiple secondary slots on this page; demoting later ones to overflow\",\n { keptId: secondary.id, demotedId: descriptor.id },\n );\n overflow.push(descriptor);\n }\n break;\n case \"overflow\":\n overflow.push(descriptor);\n break;\n case \"sidebar-only\":\n default:\n // Not header-visible.\n break;\n }\n }\n\n return {\n // The plugin's `PageHeader` is the sole header (the host suppresses its own\n // chrome for platform-react surfaces), so it owns the title: a list page\n // shows its menu label; detail/create/edit pages override with their own.\n title: title ?? detailContext?.title ?? activeMenuItem?.label ?? \"\",\n // Fall back to the detail context's subtitle so a wrapper-rendered header\n // (no page spreading its own `headerProps`) still surfaces the entity name.\n subtitle: subtitle ?? detailContext?.subtitle,\n primaryAction: primary,\n secondaryAction: secondary,\n overflowActions: overflow.length > 0 ? overflow : undefined,\n breadcrumbs,\n };\n }, [activeMenuItem, detailContext, title, subtitle, breadcrumbs, triggerAction]);\n}\n\n/**\n * Map a raw header source action to `PageHeader`'s `ActionDescriptor`.\n *\n * Resolution order for `onClick`:\n * 1. Explicit `raw.onClick` (detail-context actions can carry one directly).\n * 2. `raw.actionId` → dispatch via the sidebar-action channel. This is what\n * makes menu-config actions like `actionId: \"create-cost-code\"` (no `href`,\n * no `onClick`) fire when the header button is clicked — the page registers\n * a handler via `useSidebarAction`.\n * 3. Neither — the button still renders, but is a no-op (typically paired with\n * `href` so the primary button renders a Link instead).\n *\n * The trigger is threaded down explicitly rather than via a hook because this\n * runs inside `useMemo` and can recurse (for secondary-dropdown children).\n */\nfunction toDescriptor(\n raw: HeaderAction,\n triggerAction: (actionId: string) => void,\n): ActionDescriptor {\n const explicitOnClick = raw.onClick;\n const dispatchActionId = raw.actionId;\n // `href` and `onClick` are mutually exclusive on ActionDescriptor. A navigating\n // action (`href`) must NOT also carry an `onClick`, or the Link-rendering menu\n // items (SecondaryDropdown / OverflowMenu always call `child.onClick`) would fire\n // a sidebar dispatch IN ADDITION to navigating. If a raw action is misconfigured\n // with both `href` and `onClick`/`actionId`, `href` wins and `onClick` is dropped.\n const onClick =\n raw.href != null\n ? undefined\n : explicitOnClick ?? (dispatchActionId ? () => triggerAction(dispatchActionId) : undefined);\n return {\n id: raw.id,\n label: raw.label,\n icon: raw.icon,\n href: raw.href,\n onClick,\n disabled: raw.disabled,\n danger: raw.variant === \"danger\",\n children: raw.children ? raw.children.map((c) => toDescriptor(c, triggerAction)) : undefined,\n };\n}\n","import { useMemo } from \"react\";\nimport { useTriggerSidebarAction } from \"./sidebarAction\";\nimport type { ActionDescriptor, PageHeaderDerivedProps, PluginDetailContextItem } from \"./pageHeaderTypes\";\n\n/**\n * Merge a plugin detail-context's `actions` into the header props a SELF-RENDERING\n * detail page spreads onto `<PageHeader>`.\n *\n * Use this when a detail page renders its own `<PageHeader {...headerProps}/>` and\n * sources its CTAs from a `*DetailContext` hook (rather than from a `menuConfig`\n * entry, which detail routes can't have — their path is dynamic). Applies the same\n * slot split (`primary`/`secondary`/`overflow`; `sidebar-only` is not shown in the\n * header) and `actionId → useTriggerSidebarAction` dispatch the SDK applies to\n * menu-item actions, so a detail-context action fires the page's `useSidebarActions`\n * handler exactly like a list-page CTA. `href` actions navigate.\n *\n * The companion for the OTHER surface is `toHostSidebarInput` (host sidebar).\n */\nexport function useDetailHeaderActions(\n base: PageHeaderDerivedProps,\n actions: PluginDetailContextItem[],\n): PageHeaderDerivedProps {\n const triggerAction = useTriggerSidebarAction();\n return useMemo(() => {\n if (actions.length === 0) {\n return base;\n }\n let primary = base.primaryAction;\n let secondary = base.secondaryAction;\n const overflow: ActionDescriptor[] = [...(base.overflowActions ?? [])];\n for (const action of actions) {\n const descriptor = toDescriptor(action, triggerAction);\n switch (action.slot ?? \"sidebar-only\") {\n case \"primary\":\n if (primary == null) primary = descriptor;\n else overflow.push(descriptor);\n break;\n case \"secondary\":\n if (secondary == null) secondary = descriptor;\n else overflow.push(descriptor);\n break;\n case \"overflow\":\n overflow.push(descriptor);\n break;\n // \"sidebar-only\" is not surfaced in the header.\n }\n }\n return {\n ...base,\n primaryAction: primary,\n secondaryAction: secondary,\n overflowActions: overflow.length > 0 ? overflow : undefined,\n };\n }, [base, actions, triggerAction]);\n}\n\nfunction toDescriptor(\n raw: PluginDetailContextItem,\n triggerAction: (actionId: string) => void,\n): ActionDescriptor {\n const onClick =\n raw.href != null\n ? undefined\n : raw.onClick ?? (raw.actionId ? () => triggerAction(raw.actionId!) : undefined);\n return {\n id: raw.id,\n label: raw.label,\n icon: raw.icon,\n href: raw.href,\n onClick,\n disabled: raw.disabled,\n danger: raw.variant === \"danger\",\n children: raw.children?.map((child) => toDescriptor(child, triggerAction)),\n };\n}\n","import type { Breadcrumb, RouteMeta, RouteMetaEntry } from \"./pageHeaderTypes\";\n\n/** Synthesised root crumb — mirrors the monolith's virtual `{ pattern: \"/\", label: \"Home\" }`. */\nconst HOME_CRUMB: Breadcrumb = { label: \"Home\", href: \"/\" };\n\nfunction stripTrailingSlash(value: string): string {\n return value.length > 1 && value.endsWith(\"/\") ? value.slice(0, -1) : value;\n}\n\n/**\n * Orders routes most-specific first: more segments win, then at equal depth prefer\n * literal segments over `:param` ones — identical to the monolith's `SORTED_ROUTE_META`.\n */\nfunction sortBySpecificity(routeMeta: RouteMeta): RouteMetaEntry[] {\n return [...routeMeta].sort((a, b) => {\n const aDepth = a.pattern.split(\"/\").length;\n const bDepth = b.pattern.split(\"/\").length;\n if (bDepth !== aDepth) {\n return bDepth - aDepth;\n }\n const aDynamic = (a.pattern.match(/:/g) ?? []).length;\n const bDynamic = (b.pattern.match(/:/g) ?? []).length;\n return aDynamic - bDynamic;\n });\n}\n\n/**\n * Matches a pathname against the sorted routes segment-by-segment, capturing\n * `:param` values. Returns the first (most-specific) match, or `null`. Port of the\n * monolith's `matchRoute`.\n */\nfunction matchRoute(\n pathname: string,\n sorted: RouteMetaEntry[],\n): { entry: RouteMetaEntry; params: Record<string, string> } | null {\n const pathSegments = stripTrailingSlash(pathname).split(\"/\");\n for (const entry of sorted) {\n const patternSegments = entry.pattern.split(\"/\");\n if (patternSegments.length !== pathSegments.length) {\n continue;\n }\n const params: Record<string, string> = {};\n let matched = true;\n for (let i = 0; i < patternSegments.length; i++) {\n const pSeg = patternSegments[i];\n const vSeg = pathSegments[i];\n if (pSeg.startsWith(\":\")) {\n params[pSeg.slice(1)] = vSeg;\n } else if (pSeg !== vSeg) {\n matched = false;\n break;\n }\n }\n if (matched) {\n return { entry, params };\n }\n }\n return null;\n}\n\n/**\n * Replaces `:param` segments in a pattern with captured values. Port of\n * `resolvePattern`. The param-name class matches the identifiers `matchRoute`\n * captures (letters/digits/underscore, e.g. `:user_id`, `:id2`); when a value is\n * missing the original `:param` token is preserved rather than dropping the colon.\n */\nfunction resolvePattern(pattern: string, params: Record<string, string>): string {\n return pattern.replace(/:([A-Za-z0-9_]+)/g, (_, name: string) => params[name] ?? `:${name}`);\n}\n\n/**\n * Builds the `Home / … / <page>` breadcrumb trail — a faithful port of the\n * monolith's `buildBreadcrumbs`. Matches the current path against the `routeMeta`\n * patterns (most-specific wins), walks the `parent` chain, prepends Home, and maps\n * each ancestor to its resolved-pattern href (the current page gets no href). The\n * app/module crumb (e.g. \"Finance\") is just the top-level `routeMeta` entry — no\n * separate config, exactly like the monolith's `/finance` root entry.\n */\nexport function buildBreadcrumbs(pathname: string, routeMeta: RouteMeta): Breadcrumb[] {\n const match = matchRoute(pathname, sortBySpecificity(routeMeta));\n if (match == null) {\n return [HOME_CRUMB];\n }\n\n const { entry: current, params } = match;\n\n // Walk the parent chain (leaf → root), guarding against cycles.\n const chain: RouteMetaEntry[] = [current];\n const seen = new Set<string>([current.pattern]);\n let node = current;\n while (node.parent != null) {\n const parent = routeMeta.find((e) => e.pattern === node.parent);\n if (parent == null || seen.has(parent.pattern)) {\n break;\n }\n seen.add(parent.pattern);\n chain.unshift(parent);\n node = parent;\n }\n\n const crumbs: Breadcrumb[] = [HOME_CRUMB];\n chain.forEach((entry, index) => {\n const isLast = index === chain.length - 1;\n crumbs.push(isLast ? { label: entry.label } : { label: entry.label, href: resolvePattern(entry.pattern, params) });\n });\n return crumbs;\n}\n","import { useMemo, type ReactElement, type ReactNode } from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { PageHeaderContext } from \"./pageHeaderContext\";\nimport { SidebarActionProvider } from \"./sidebarAction\";\nimport { buildBreadcrumbs } from \"./breadcrumbs\";\nimport { PageHeader } from \"./PageHeader\";\nimport { usePageHeader } from \"./usePageHeader\";\nimport type {\n HeaderDetailContext,\n HeaderMenuItem,\n PageHeaderState,\n RouteMeta,\n} from \"./pageHeaderTypes\";\n\n/**\n * Default detail-context resolver: no detail context. Kept as a stable named hook\n * so `PageHeaderProvider` can call the resolver UNCONDITIONALLY (a hook can't be\n * called behind a runtime branch), whether or not a plugin supplied one.\n */\nfunction useNoDetailContext(): HeaderDetailContext | null {\n return null;\n}\n\n/**\n * The wrapper-rendered header. Mounted by `PageHeaderProvider` ONLY when the\n * plugin's `useDetailContext` resolver returns a context for the active route.\n *\n * This is the plugin equivalent of a monolith NESTED-LAYOUT ROUTE — a layout that\n * renders one shared `<PageHeader>` above the `<Outlet>` for a set of content-only\n * sub-pages (e.g. a project/ticket detail subtree). A PlatformReact plugin has no\n * router outlet (each page is its own bundle), so the page-definer wrapper is the\n * only shared seam: the resolver says \"these routes have no self-rendered header,\n * here's their shared header context\" and this renders it. Reads the same\n * `usePageHeader` a self-rendering page would, so title/subtitle/CTAs are derived\n * identically; the resolver's context is already folded into the provider state.\n */\nfunction ChromeHeader(): ReactElement {\n return <PageHeader {...usePageHeader()} />;\n}\n\nexport interface PageHeaderProviderProps {\n /**\n * The plugin's menu-item config — a faithful slice of the monolith's\n * `menuConfig.ts`. The provider matches the active route against each item's\n * `href` (pre-order, so a parent list item wins over its own overview child)\n * and publishes the match so `usePageHeader` can surface its `actions`.\n */\n config: HeaderMenuItem[];\n /**\n * The plugin's breadcrumb metadata — a faithful slice of the monolith's\n * `routeMeta.ts` (`{ pattern, label, parent }[]`, re-rooted). The provider derives\n * the full `Home / … / <Page>` trail per route via `buildBreadcrumbs`, exactly like\n * the monolith. The app/module crumb (e.g. \"Finance\") is just its top-level entry.\n * Omit for no breadcrumbs.\n */\n routeMeta?: RouteMeta;\n /** Optional detail-context override for detail/edit routes with no menu item. */\n detailContext?: HeaderDetailContext | null;\n /**\n * Optional per-route detail-context RESOLVER hook. Called every render; when it\n * returns a context, the provider (a) folds it into the header state AND (b)\n * renders the header ITSELF (`<ChromeHeader>`) above the page — for detail\n * routes whose migrated page renders no `<PageHeader>` of its own. Returns\n * `null` for routes the page already headers (list/create/edit self-render), so\n * chrome never double-renders. Takes precedence over the static `detailContext`.\n */\n useDetailContext?: () => HeaderDetailContext | null;\n children: ReactNode;\n}\n\n/**\n * Plugin analogue of the monolith shell's `SubMenuPropsContext` provider: mounted\n * once at the plugin's router root, it resolves the active menu item from the\n * current route (feeding `usePageHeader`'s title + CTAs) and derives the breadcrumb\n * trail from `routeMeta`. Also mounts the `SidebarActionProvider` so `actionId`\n * header CTAs can dispatch to page-registered handlers.\n *\n * In a plugin this feeds the in-body `PageHeader` that migrated pages render —\n * which IS the surface header (the host suppresses its own chrome for\n * platform-react surfaces).\n */\nexport function PageHeaderProvider({\n config,\n routeMeta,\n detailContext,\n useDetailContext = useNoDetailContext,\n children,\n}: PageHeaderProviderProps) {\n const { pathname } = useLocation();\n // Resolve the active detail context. The resolver hook is ALWAYS called (the\n // default is a stable no-op) so hook order stays stable. When a resolver was\n // actually supplied it is AUTHORITATIVE: its result wins — including `null`,\n // which means \"suppress chrome for this route\" and must NOT fall back to the\n // static prop. The static `detailContext` is only the fallback when no resolver\n // was passed (the legacy direct-provider API).\n const resolvedFromResolver = useDetailContext();\n const resolvedDetailContext =\n useDetailContext === useNoDetailContext ? detailContext ?? null : resolvedFromResolver;\n\n const state = useMemo<PageHeaderState>(() => {\n const activeMenuItem = findByHref(config, normalise(pathname));\n const breadcrumbs = routeMeta != null ? buildBreadcrumbs(pathname, routeMeta) : undefined;\n // Default the in-body title to the breadcrumb LEAF label (the current route's\n // `routeMeta` label) so EVERY routed page shows a title — not just the ones that\n // happen to carry a menu item (list pages with CTAs). Only a real trail (Home +\n // ≥1 crumb) yields a leaf; a bare `[Home]` (no route match) leaves title unset so\n // the header stays chrome-only. A page hook can still override via its own\n // headerProps (e.g. a detail page swapping in the entity name).\n const title =\n breadcrumbs != null && breadcrumbs.length >= 2\n ? breadcrumbs[breadcrumbs.length - 1].label\n : undefined;\n return { activeMenuItem, detailContext: resolvedDetailContext, breadcrumbs, title };\n }, [config, routeMeta, pathname, resolvedDetailContext]);\n\n return (\n <SidebarActionProvider>\n <PageHeaderContext.Provider value={state}>\n {resolvedDetailContext != null ? <ChromeHeader /> : null}\n {children}\n </PageHeaderContext.Provider>\n </SidebarActionProvider>\n );\n}\n\n/**\n * Ready-made page wrapper for the PlatformReact page-definer's `wrapPage` option:\n * `withPageHeader(config, routeMeta, useDetailContext?)` returns\n * `(page) => <PageHeaderProvider …>{page}</PageHeaderProvider>`.\n *\n * Pass the optional `useDetailContext` resolver to have the provider render a\n * shared header for detail routes whose page renders none of its own (see\n * {@link PageHeaderProviderProps.useDetailContext}); omit it for the original\n * behaviour (provider supplies context only, each page self-renders `<PageHeader>`).\n *\n * Kept here — the same module as `PageHeaderProvider` and `usePageHeader` — on\n * purpose: the provider and the hook must resolve to ONE `PageHeaderContext`\n * instance, which only holds when both come from this `components/layout` entry.\n * (A bundler inlines a separate context copy into each entry, so wrapping from the\n * `platform-react` entry would give the provider a different context than the\n * hook — the header would render empty.) A plugin passes\n * `wrapPage: withPageHeader(<feature>MenuConfig, <feature>RouteMeta)`\n * (optionally a third resolver arg) to `createPluginPageDefiner`.\n */\nexport function withPageHeader(\n config: HeaderMenuItem[],\n routeMeta?: RouteMeta,\n useDetailContext?: () => HeaderDetailContext | null,\n): (page: ReactElement) => ReactElement {\n return (page) => (\n <PageHeaderProvider config={config} routeMeta={routeMeta} useDetailContext={useDetailContext}>\n {page}\n </PageHeaderProvider>\n );\n}\n\n/** Strip a trailing slash (except root) so `/x/` and `/x` match the same item. */\nfunction normalise(pathname: string): string {\n return pathname.length > 1 && pathname.endsWith(\"/\") ? pathname.slice(0, -1) : pathname;\n}\n\n/**\n * Pre-order search for the item whose `href` exactly matches `pathname`. Pre-order\n * means a parent list item (which carries the `actions`) is returned before its\n * own same-href overview child, so the CTA surfaces on the list route.\n */\nfunction findByHref(items: HeaderMenuItem[], pathname: string): HeaderMenuItem | null {\n for (const item of items) {\n if (item.href != null && normalise(item.href) === pathname) {\n return item;\n }\n if (item.children) {\n const nested = findByHref(item.children, pathname);\n if (nested) {\n return nested;\n }\n }\n }\n return null;\n}\n"]}
1
+ {"version":3,"sources":["../../../src/components/layout/fillGridClasses.ts","../../../src/components/layout/FillGrid.tsx","../../../src/icons/nexture/ni-cross.tsx","../../../src/icons/nexture/ni-search.tsx","../../../src/icons/nexture-icons.tsx","../../../src/components/ui/DebouncedSearchInput.tsx","../../../src/components/layout/PageHeader.tsx","../../../src/components/layout/pageHeaderContext.ts","../../../src/components/layout/sidebarAction.tsx","../../../src/components/layout/usePageHeader.ts","../../../src/components/layout/useDetailHeaderActions.ts","../../../src/components/layout/breadcrumbs.ts","../../../src/components/layout/PageHeaderProvider.tsx"],"names":["createContext","jsx","Box","useContext","jsxs","memo","DebouncedSearchInput","useState","useId","useRef","useEffect","useCallback","FormControl","InputLabel","FilledInput","Fragment","InputAdornment","IconButton","Stack","Breadcrumbs","Typography","Link","Button","Menu","MenuItem","useMemo","toDescriptor","useLocation"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Static Tailwind basis classes for {@link FillGridItem}.\n *\n * Tailwind's content scanner extracts class candidates from raw source text and\n * cannot follow string concatenation — `\"sm:\" + \"basis-[...]\"` is invisible to\n * it. So every fully-prefixed class is spelled out as a literal below, indexed\n * by breakpoint → gap → span. `fillItemClass` only ever *looks up* a literal; it\n * never builds one. This is what guarantees the responsive classes survive a\n * production purge (no fragile safelist comment to keep in sync).\n *\n * NOTE: because these literals live in the SDK, a CONSUMER's Tailwind build must\n * scan this package's dist (add it to `content`) or the classes won't generate.\n *\n * basis(n, g) = calc(n/12 * 100% - g * (1 - n/12)), g = gap in rem.\n * gap-5 => g = 1.25rem; gap-2.5 => g = 0.625rem. Span 12 => basis-full.\n */\nexport type Twelfths = 2.4 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 12;\nexport type FillGap = 2.5 | 5;\ntype Breakpoint = \"xs\" | \"sm\" | \"md\" | \"lg\";\nexport type FillSpan = Partial<Record<Breakpoint, Twelfths>>;\n\n/**\n * Full literal class per breakpoint × gap × span. `xs` is unprefixed; `sm`/`md`/\n * `lg` carry the Tailwind prefix. Every string here is a real, scannable literal.\n */\nconst CLASSES: Record<Breakpoint, Record<FillGap, Record<Twelfths, string>>> = {\n xs: {\n 5: {\n 2.4: \"basis-[calc(20%-1rem)]\",\n 3: \"basis-[calc(25%-0.9375rem)]\",\n 4: \"basis-[calc(33.333%-0.8333rem)]\",\n 5: \"basis-[calc(41.667%-0.7292rem)]\",\n 6: \"basis-[calc(50%-0.625rem)]\",\n 7: \"basis-[calc(58.333%-0.5208rem)]\",\n 8: \"basis-[calc(66.667%-0.4167rem)]\",\n 9: \"basis-[calc(75%-0.3125rem)]\",\n 12: \"basis-full\",\n },\n 2.5: {\n 2.4: \"basis-[calc(20%-0.5rem)]\",\n 3: \"basis-[calc(25%-0.46875rem)]\",\n 4: \"basis-[calc(33.333%-0.41667rem)]\",\n 5: \"basis-[calc(41.667%-0.36458rem)]\",\n 6: \"basis-[calc(50%-0.3125rem)]\",\n 7: \"basis-[calc(58.333%-0.26042rem)]\",\n 8: \"basis-[calc(66.667%-0.20833rem)]\",\n 9: \"basis-[calc(75%-0.15625rem)]\",\n 12: \"basis-full\",\n },\n },\n sm: {\n 5: {\n 2.4: \"sm:basis-[calc(20%-1rem)]\",\n 3: \"sm:basis-[calc(25%-0.9375rem)]\",\n 4: \"sm:basis-[calc(33.333%-0.8333rem)]\",\n 5: \"sm:basis-[calc(41.667%-0.7292rem)]\",\n 6: \"sm:basis-[calc(50%-0.625rem)]\",\n 7: \"sm:basis-[calc(58.333%-0.5208rem)]\",\n 8: \"sm:basis-[calc(66.667%-0.4167rem)]\",\n 9: \"sm:basis-[calc(75%-0.3125rem)]\",\n 12: \"sm:basis-full\",\n },\n 2.5: {\n 2.4: \"sm:basis-[calc(20%-0.5rem)]\",\n 3: \"sm:basis-[calc(25%-0.46875rem)]\",\n 4: \"sm:basis-[calc(33.333%-0.41667rem)]\",\n 5: \"sm:basis-[calc(41.667%-0.36458rem)]\",\n 6: \"sm:basis-[calc(50%-0.3125rem)]\",\n 7: \"sm:basis-[calc(58.333%-0.26042rem)]\",\n 8: \"sm:basis-[calc(66.667%-0.20833rem)]\",\n 9: \"sm:basis-[calc(75%-0.15625rem)]\",\n 12: \"sm:basis-full\",\n },\n },\n md: {\n 5: {\n 2.4: \"md:basis-[calc(20%-1rem)]\",\n 3: \"md:basis-[calc(25%-0.9375rem)]\",\n 4: \"md:basis-[calc(33.333%-0.8333rem)]\",\n 5: \"md:basis-[calc(41.667%-0.7292rem)]\",\n 6: \"md:basis-[calc(50%-0.625rem)]\",\n 7: \"md:basis-[calc(58.333%-0.5208rem)]\",\n 8: \"md:basis-[calc(66.667%-0.4167rem)]\",\n 9: \"md:basis-[calc(75%-0.3125rem)]\",\n 12: \"md:basis-full\",\n },\n 2.5: {\n 2.4: \"md:basis-[calc(20%-0.5rem)]\",\n 3: \"md:basis-[calc(25%-0.46875rem)]\",\n 4: \"md:basis-[calc(33.333%-0.41667rem)]\",\n 5: \"md:basis-[calc(41.667%-0.36458rem)]\",\n 6: \"md:basis-[calc(50%-0.3125rem)]\",\n 7: \"md:basis-[calc(58.333%-0.26042rem)]\",\n 8: \"md:basis-[calc(66.667%-0.20833rem)]\",\n 9: \"md:basis-[calc(75%-0.15625rem)]\",\n 12: \"md:basis-full\",\n },\n },\n lg: {\n 5: {\n 2.4: \"lg:basis-[calc(20%-1rem)]\",\n 3: \"lg:basis-[calc(25%-0.9375rem)]\",\n 4: \"lg:basis-[calc(33.333%-0.8333rem)]\",\n 5: \"lg:basis-[calc(41.667%-0.7292rem)]\",\n 6: \"lg:basis-[calc(50%-0.625rem)]\",\n 7: \"lg:basis-[calc(58.333%-0.5208rem)]\",\n 8: \"lg:basis-[calc(66.667%-0.4167rem)]\",\n 9: \"lg:basis-[calc(75%-0.3125rem)]\",\n 12: \"lg:basis-full\",\n },\n 2.5: {\n 2.4: \"lg:basis-[calc(20%-0.5rem)]\",\n 3: \"lg:basis-[calc(25%-0.46875rem)]\",\n 4: \"lg:basis-[calc(33.333%-0.41667rem)]\",\n 5: \"lg:basis-[calc(41.667%-0.36458rem)]\",\n 6: \"lg:basis-[calc(50%-0.3125rem)]\",\n 7: \"lg:basis-[calc(58.333%-0.26042rem)]\",\n 8: \"lg:basis-[calc(66.667%-0.20833rem)]\",\n 9: \"lg:basis-[calc(75%-0.15625rem)]\",\n 12: \"lg:basis-full\",\n },\n },\n};\n\nconst BREAKPOINTS: readonly Breakpoint[] = [\"xs\", \"sm\", \"md\", \"lg\"];\n\n/**\n * Full class string for one item: always `min-w-0 grow`, plus the literal basis\n * class for each supplied breakpoint (looked up, never concatenated).\n */\nexport function fillItemClass(span: FillSpan, gap: FillGap): string {\n const parts = [\"min-w-0\", \"grow\"];\n for (const bp of BREAKPOINTS) {\n const n = span[bp];\n if (n !== undefined) parts.push(CLASSES[bp][gap][n]);\n }\n return parts.join(\" \");\n}\n","import { createContext, useContext } from \"react\";\nimport { Box } from \"@mui/material\";\nimport { fillItemClass, type FillGap, type FillSpan } from \"./fillGridClasses\";\n\nconst FillGapContext = createContext<FillGap>(5);\n\ninterface FillGridProps {\n /** Gutter width. 5 = 20px (default), 2.5 = 10px. Matches MUI spacing values. */\n gap?: FillGap;\n className?: string;\n children: React.ReactNode;\n}\n\n/**\n * A flex-wrap row whose items `grow` to fill a partially-filled last row — the\n * dashboard/overview convention. NOT for forms, tables, or single full-width cards.\n *\n * Renders `w-full` so it always spans its container: a `FillGrid` is itself often\n * a flex item of a parent MUI `<Grid container>` / flex row, where without an\n * explicit width it would shrink-wrap to its content instead of filling the row\n * (the behaviour a `<Grid container size={12}>` used to give).\n */\nexport function FillGrid({ gap = 5, className, children }: FillGridProps) {\n const gapClass = gap === 2.5 ? \"gap-2.5\" : \"gap-5\";\n return (\n <FillGapContext.Provider value={gap}>\n <Box className={[\"flex w-full flex-wrap\", gapClass, className].filter(Boolean).join(\" \")}>\n {children}\n </Box>\n </FillGapContext.Provider>\n );\n}\n\ninterface FillGridItemProps {\n /** 12-column span per breakpoint, mirroring MUI Grid's `size`. Default { xs: 12 }. */\n span?: FillSpan;\n className?: string;\n children: React.ReactNode;\n}\n\nexport function FillGridItem({ span = { xs: 12 }, className, children }: FillGridItemProps) {\n const gap = useContext(FillGapContext);\n return (\n <Box className={[fillItemClass(span, gap), className].filter(Boolean).join(\" \")}>\n {children}\n </Box>\n );\n}\n","import { NextureIconsProps, sizeHelper, strokeSizeHelper } from \"../nexture-icons\";\n\nexport default function NiCross({ className, variant = \"outlined\", size = \"medium\" }: NextureIconsProps) {\n const iconSize = sizeHelper(size);\n const iconStrokeWidth = strokeSizeHelper(iconSize);\n\n if (variant === \"outlined\") {\n return (\n <svg\n width={iconSize}\n height={iconSize}\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8.00016 8L12.0001 12M12.0001 12L16 16.0002M12.0001 12L16 8.00015M12.0001 12L8 16.0002\"\n stroke=\"currentColor\"\n strokeWidth={iconStrokeWidth}\n strokeLinecap=\"round\"\n />\n </svg>\n );\n } else {\n return (\n <svg\n width={iconSize}\n height={iconSize}\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15.4698 7.46963C15.7626 7.17684 16.2374 7.17684 16.5303 7.46963C16.8232 7.7625 16.8231 8.23728 16.5303 8.53018L13.0606 11.9999L16.5303 15.4696C16.8232 15.7625 16.8231 16.2373 16.5303 16.5302C16.2557 16.8048 15.821 16.8223 15.5264 16.5819L15.4698 16.5302L12 13.0604L8.53032 16.5302C8.23743 16.8231 7.76267 16.8231 7.46977 16.5302C7.17697 16.2373 7.17691 15.7625 7.46977 15.4696L10.9395 11.9999L7.46977 8.53018L7.41801 8.47354C7.1778 8.17898 7.19527 7.74421 7.46977 7.46963C7.76264 7.17676 8.23742 7.17682 8.53032 7.46963L12 10.9394L15.4698 7.46963Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n","import { NextureIconsProps, sizeHelper, strokeSizeHelper } from \"../nexture-icons\";\n\nexport default function NiSearch({\n className,\n variant = \"outlined\",\n size = \"medium\",\n oneTone = false,\n}: NextureIconsProps) {\n const iconSize = sizeHelper(size);\n const iconStrokeWidth = strokeSizeHelper(iconSize);\n if (variant === \"outlined\") {\n return (\n <svg\n width={iconSize}\n height={iconSize}\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n opacity={oneTone ? 1 : 0.6}\n d=\"M22 22L18.5 18.5\"\n stroke=\"currentColor\"\n strokeWidth={iconStrokeWidth}\n strokeLinecap=\"round\"\n />\n <circle cx=\"11.5\" cy=\"11.5\" r=\"9.5\" stroke=\"currentColor\" strokeWidth={iconStrokeWidth} />\n </svg>\n );\n } else {\n return (\n <svg\n width={iconSize}\n height={iconSize}\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n opacity={oneTone ? 1 : 0.4}\n d=\"M19.0303 17.9697C18.7374 17.6768 18.2627 17.6768 17.9698 17.9697C17.6769 18.2626 17.6769 18.7373 17.9698 19.0302L21.4698 22.5302C21.7627 22.8231 22.2374 22.8231 22.5303 22.5302C22.8232 22.2373 22.8232 21.7626 22.5303 21.4697L19.0303 17.9697Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M11.5 1.25C17.1609 1.25 21.75 5.83908 21.75 11.5C21.75 17.1609 17.1609 21.75 11.5 21.75C5.83908 21.75 1.25 17.1609 1.25 11.5C1.25 5.83908 5.83908 1.25 11.5 1.25Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n","import NiAI from \"./nexture/ni-ai\";\nimport NiAirBalloon from \"./nexture/ni-air-balloon\";\nimport NiAnchor from \"./nexture/ni-anchor\";\nimport NiAnnouncement from \"./nexture/ni-announcement\";\nimport NiAntenna from \"./nexture/ni-antenna\";\nimport NiArchive from \"./nexture/ni-archive\";\nimport NiArchiveCheck from \"./nexture/ni-archive-check\";\nimport NiArrowCircleLeft from \"./nexture/ni-arrow-circle-left\";\nimport NiArrowCircleRight from \"./nexture/ni-arrow-circle-right\";\nimport NiArrowDown from \"./nexture/ni-arrow-down\";\nimport NiArrowDownLeft from \"./nexture/ni-arrow-down-left\";\nimport NiArrowDownLeftSquare from \"./nexture/ni-arrow-down-left-square\";\nimport NiArrowDownRight from \"./nexture/ni-arrow-down-right\";\nimport NiArrowDownRightSquare from \"./nexture/ni-arrow-down-right-square\";\nimport NiArrowDownSquare from \"./nexture/ni-arrow-down-square\";\nimport NiArrowHistory from \"./nexture/ni-arrow-history\";\nimport NiArrowInDown from \"./nexture/ni-arrow-in-down\";\nimport NiArrowInLeft from \"./nexture/ni-arrow-in-left\";\nimport NiArrowInRight from \"./nexture/ni-arrow-in-right\";\nimport NiArrowInUp from \"./nexture/ni-arrow-in-up\";\nimport NiArrowLeft from \"./nexture/ni-arrow-left\";\nimport NiArrowLeftRight from \"./nexture/ni-arrow-left-right\";\nimport NiArrowLeftSquare from \"./nexture/ni-arrow-left-square\";\nimport NiArrowOutDown from \"./nexture/ni-arrow-out-down\";\nimport NiArrowOutLeft from \"./nexture/ni-arrow-out-left\";\nimport NiArrowOutRight from \"./nexture/ni-arrow-out-right\";\nimport NiArrowOutUp from \"./nexture/ni-arrow-out-up\";\nimport NiArrowRight from \"./nexture/ni-arrow-right\";\nimport NiArrowRightSquare from \"./nexture/ni-arrow-right-square\";\nimport NiArrowUp from \"./nexture/ni-arrow-up\";\nimport NiArrowUpDown from \"./nexture/ni-arrow-up-down\";\nimport NiArrowUpLeft from \"./nexture/ni-arrow-up-left\";\nimport NiArrowUpLeftSquare from \"./nexture/ni-arrow-up-left-square\";\nimport NiArrowUpRight from \"./nexture/ni-arrow-up-right\";\nimport NiArrowUpRightSquare from \"./nexture/ni-arrow-up-right-square\";\nimport NiArrowUpSquare from \"./nexture/ni-arrow-up-square\";\nimport NiAt from \"./nexture/ni-at\";\nimport NiBadge from \"./nexture/ni-badge\";\nimport NiBadgeCheck from \"./nexture/ni-badge-check\";\nimport NiBag from \"./nexture/ni-bag\";\nimport NiBandAid from \"./nexture/ni-band-aid\";\nimport NiBarcode from \"./nexture/ni-barcode\";\nimport NiBasket from \"./nexture/ni-basket\";\nimport NiBatteryCharging from \"./nexture/ni-battery-charging\";\nimport NiBatteryEmpty from \"./nexture/ni-battery-empty\";\nimport NiBatteryFull from \"./nexture/ni-battery-full\";\nimport NiBell from \"./nexture/ni-bell\";\nimport NiBellInactive from \"./nexture/ni-bell-inactive\";\nimport NiBinEmpty from \"./nexture/ni-bin-empty\";\nimport NiBinFull from \"./nexture/ni-bin-full\";\nimport NiBloodCells from \"./nexture/ni-blood-cells\";\nimport NiBluetooth from \"./nexture/ni-bluetooth\";\nimport NiBook from \"./nexture/ni-book\";\nimport NiBookmark from \"./nexture/ni-bookmark\";\nimport NiBookmarkSingle from \"./nexture/ni-bookmark-single\";\nimport NiBraces from \"./nexture/ni-braces\";\nimport NiBrackets from \"./nexture/ni-brackets\";\nimport NiBrain from \"./nexture/ni-brain\";\nimport NiBrainCircuit from \"./nexture/ni-brain-circuit\";\nimport NiBriefcase from \"./nexture/ni-briefcase\";\nimport NiBrush from \"./nexture/ni-brush\";\nimport NiBrushArt from \"./nexture/ni-brush-art\";\nimport NiBrushArtSquare from \"./nexture/ni-brush-art-square\";\nimport NiBug from \"./nexture/ni-bug\";\nimport NiBuilding from \"./nexture/ni-building\";\nimport NiBulbOff from \"./nexture/ni-bulb-off\";\nimport NiBulbOn from \"./nexture/ni-bulb-on\";\nimport NiButton from \"./nexture/ni-button\";\nimport NiButtonGroup from \"./nexture/ni-button-group\";\nimport NiButtonLarge from \"./nexture/ni-button-large\";\nimport NiCake from \"./nexture/ni-cake\";\nimport NiCalendar from \"./nexture/ni-calendar\";\nimport NiCalendarClock from \"./nexture/ni-calendar-clock\";\nimport NiCamera from \"./nexture/ni-camera\";\nimport NiCar from \"./nexture/ni-car\";\nimport NiCartArrow from \"./nexture/ni-cart-arrow\";\nimport NiCartCross from \"./nexture/ni-cart-cross\";\nimport NiCartEmpty from \"./nexture/ni-cart-empty\";\nimport NiCartMinus from \"./nexture/ni-cart-minus\";\nimport NiCartPlus from \"./nexture/ni-cart-plus\";\nimport NiCatalog from \"./nexture/ni-catalog\";\nimport NiCells from \"./nexture/ni-cells\";\nimport NiCellsPlus from \"./nexture/ni-cells-plus\";\nimport NiChange from \"./nexture/ni-change\";\nimport NiChartBar from \"./nexture/ni-chart-bar\";\nimport NiChartCandleSticks from \"./nexture/ni-chart-candle-sticks\";\nimport NiChartFunnel from \"./nexture/ni-chart-funnel\";\nimport NiChartHeatmap from \"./nexture/ni-chart-heatmap\";\nimport NiChartLine from \"./nexture/ni-chart-line\";\nimport NiChartLineBar from \"./nexture/ni-chart-line-bar\";\nimport NiChartPie from \"./nexture/ni-chart-pie\";\nimport NiChartPolar from \"./nexture/ni-chart-polar\";\nimport NiChartRadar from \"./nexture/ni-chart-radar\";\nimport NiChartScatter from \"./nexture/ni-chart-scatter\";\nimport NiCheck from \"./nexture/ni-check\";\nimport NiCheckFull from \"./nexture/ni-check-full\";\nimport NiCheckSquare from \"./nexture/ni-check-square\";\nimport NiChef from \"./nexture/ni-chef\";\nimport NiChevronDown from \"./nexture/ni-chevron-down\";\nimport NiChevronDownSmall from \"./nexture/ni-chevron-down-small\";\nimport NiChevronLeft from \"./nexture/ni-chevron-left\";\nimport NiChevronLeftRightReverseSmall from \"./nexture/ni-chevron-left-right-reverse-small\";\nimport NiChevronLeftRightSmall from \"./nexture/ni-chevron-left-right-small\";\nimport NiChevronLeftSmall from \"./nexture/ni-chevron-left-small\";\nimport NiChevronRight from \"./nexture/ni-chevron-right\";\nimport NiChevronRightSmall from \"./nexture/ni-chevron-right-small\";\nimport NiChevronUp from \"./nexture/ni-chevron-up\";\nimport NiChevronUpDownReverseSmall from \"./nexture/ni-chevron-up-down-reverse-small\";\nimport NiChevronUpDownSmall from \"./nexture/ni-chevron-up-down-small\";\nimport NiChevronUpSmall from \"./nexture/ni-chevron-up-small\";\nimport NiCholesterol from \"./nexture/ni-cholesterol\";\nimport NiCircle from \"./nexture/ni-circle\";\nimport NiClipboard from \"./nexture/ni-clipboard\";\nimport NiClock from \"./nexture/ni-clock\";\nimport NiCloud from \"./nexture/ni-cloud\";\nimport NiCloudPartly from \"./nexture/ni-cloud-partly\";\nimport NiCloudRain from \"./nexture/ni-cloud-rain\";\nimport NiCloudSnow from \"./nexture/ni-cloud-snow\";\nimport NiCloudThunder from \"./nexture/ni-cloud-thunder\";\nimport NiCode from \"./nexture/ni-code\";\nimport NiCoffee from \"./nexture/ni-coffee\";\nimport NiCoin from \"./nexture/ni-coin\";\nimport NiCollapse from \"./nexture/ni-collapse\";\nimport NiCollapseIn from \"./nexture/ni-collapse-in\";\nimport NiCols from \"./nexture/ni-cols\";\nimport NiCompass from \"./nexture/ni-compass\";\nimport NiController from \"./nexture/ni-controller\";\nimport NiCopyright from \"./nexture/ni-copyright\";\nimport NiCpu from \"./nexture/ni-cpu\";\nimport NiCreditCard from \"./nexture/ni-credit-card\";\nimport NiCrop from \"./nexture/ni-crop\";\nimport NiCross from \"./nexture/ni-cross\";\nimport NiCrossFull from \"./nexture/ni-cross-full\";\nimport NiCrossHexagon from \"./nexture/ni-cross-hexagon\";\nimport NiCrossSquare from \"./nexture/ni-cross-square\";\nimport NiCrosshair from \"./nexture/ni-crosshair\";\nimport NiCrown from \"./nexture/ni-crown\";\nimport NiCursor from \"./nexture/ni-cursor\";\nimport NiDashboard from \"./nexture/ni-dashboard\";\nimport NiDatabase from \"./nexture/ni-database\";\nimport NiDevops from \"./nexture/ni-devops\";\nimport NiDiagram from \"./nexture/ni-diagram\";\nimport NiDice from \"./nexture/ni-dice\";\nimport NiDirectory from \"./nexture/ni-directory\";\nimport NiDocumentArchive from \"./nexture/ni-document-archive\";\nimport NiDocumentChart from \"./nexture/ni-document-chart\";\nimport NiDocumentCheck from \"./nexture/ni-document-check\";\nimport NiDocumentCode from \"./nexture/ni-document-code\";\nimport NiDocumentCross from \"./nexture/ni-document-cross\";\nimport NiDocumentFull from \"./nexture/ni-document-full\";\nimport NiDocumentImage from \"./nexture/ni-document-image\";\nimport NiDocumentMinus from \"./nexture/ni-document-minus\";\nimport NiDocumentNumber from \"./nexture/ni-document-number\";\nimport NiDocumentPlus from \"./nexture/ni-document-plus\";\nimport NiDocumentVideo from \"./nexture/ni-document-video\";\nimport NiDollar from \"./nexture/ni-dollar\";\nimport NiDollarSquare from \"./nexture/ni-dollar-square\";\nimport NiDotsSquare from \"./nexture/ni-dots-square\";\nimport NiDownloadCloud from \"./nexture/ni-download-cloud\";\nimport NiDragHorizontal from \"./nexture/ni-drag-horizontal\";\nimport NiDragVertical from \"./nexture/ni-drag-vertical\";\nimport NiDrink from \"./nexture/ni-drink\";\nimport NiDrop from \"./nexture/ni-drop\";\nimport NiDuplicate from \"./nexture/ni-duplicate\";\nimport NiEllipsisHorizontal from \"./nexture/ni-ellipsis-horizontal\";\nimport NiEllipsisVertical from \"./nexture/ni-ellipsis-vertical\";\nimport NiEmail from \"./nexture/ni-email\";\nimport NiEmailOpen from \"./nexture/ni-email-open\";\nimport NiEndDownSmall from \"./nexture/ni-end-down-small\";\nimport NiEndLeftSmall from \"./nexture/ni-end-left-small\";\nimport NiEndRightSmall from \"./nexture/ni-end-right-small\";\nimport NiEndUpSmall from \"./nexture/ni-end-up-small\";\nimport NiEnterDown from \"./nexture/ni-enter-down\";\nimport NiEnterLeft from \"./nexture/ni-enter-left\";\nimport NiEnterReverseDown from \"./nexture/ni-enter-reverse-down\";\nimport NiEnterReverseLeft from \"./nexture/ni-enter-reverse-left\";\nimport NiEnterReverseRight from \"./nexture/ni-enter-reverse-right\";\nimport NiEnterReverseUp from \"./nexture/ni-enter-reverse-up\";\nimport NiEnterRight from \"./nexture/ni-enter-right\";\nimport NiEnterUp from \"./nexture/ni-enter-up\";\nimport NiEquals from \"./nexture/ni-equals\";\nimport NiEqualsFull from \"./nexture/ni-equals-full\";\nimport NiEraser from \"./nexture/ni-eraser\";\nimport NiEuro from \"./nexture/ni-euro\";\nimport NiEuroSquare from \"./nexture/ni-euro-square\";\nimport NiExclamationHexagon from \"./nexture/ni-exclamation-hexagon\";\nimport NiExclamationSquare from \"./nexture/ni-exclamation-square\";\nimport NiExpand from \"./nexture/ni-expand\";\nimport NiExpandFull from \"./nexture/ni-expand-full\";\nimport NiExpandOut from \"./nexture/ni-expand-out\";\nimport NiExpandSquare from \"./nexture/ni-expand-square\";\nimport NiExternal from \"./nexture/ni-external\";\nimport NiEyeClose from \"./nexture/ni-eye-close\";\nimport NiEyeInactive from \"./nexture/ni-eye-inactive\";\nimport NiEyeOpen from \"./nexture/ni-eye-open\";\nimport NiFaceFrown from \"./nexture/ni-face-frown\";\nimport NiFaceFrownMore from \"./nexture/ni-face-frown-more\";\nimport NiFaceNeutral from \"./nexture/ni-face-neutral\";\nimport NiFaceSmile from \"./nexture/ni-face-smile\";\nimport NiFaceSmileMore from \"./nexture/ni-face-smile-more\";\nimport NiFemale from \"./nexture/ni-female\";\nimport NiFilter from \"./nexture/ni-filter\";\nimport NiFilterCross from \"./nexture/ni-filter-cross\";\nimport NiFilterMinus from \"./nexture/ni-filter-minus\";\nimport NiFilterPlus from \"./nexture/ni-filter-plus\";\nimport NiFingerprint from \"./nexture/ni-fingerprint\";\nimport NiFire from \"./nexture/ni-fire\";\nimport NiFirstAid from \"./nexture/ni-first-aid\";\nimport NiFitness from \"./nexture/ni-fitness\";\nimport NiFlag from \"./nexture/ni-flag\";\nimport NiFlash from \"./nexture/ni-flash\";\nimport NiFlask from \"./nexture/ni-flask\";\nimport NiFloppyDisk from \"./nexture/ni-floppy-disk\";\nimport NiFolder from \"./nexture/ni-folder\";\nimport NiFolderCheck from \"./nexture/ni-folder-check\";\nimport NiFolderCross from \"./nexture/ni-folder-cross\";\nimport NiFolderMinus from \"./nexture/ni-folder-minus\";\nimport NiFolderPlus from \"./nexture/ni-folder-plus\";\nimport NiForwardDownSmall from \"./nexture/ni-forward-down-small\";\nimport NiForwardLeftSmall from \"./nexture/ni-forward-left-small\";\nimport NiForwardRightSmall from \"./nexture/ni-forward-right-small\";\nimport NiForwardUpSmall from \"./nexture/ni-forward-up-small\";\nimport NiGay from \"./nexture/ni-gay\";\nimport NiGerm from \"./nexture/ni-germ\";\nimport NiGogo from \"./nexture/ni-gogo\";\nimport NiGold from \"./nexture/ni-gold\";\nimport NiGpu from \"./nexture/ni-gpu\";\nimport NiGraduation from \"./nexture/ni-graduation\";\nimport NiGroup from \"./nexture/ni-group\";\nimport NiHeadphones from \"./nexture/ni-headphones\";\nimport NiHeadset from \"./nexture/ni-headset\";\nimport NiHeadsetMic from \"./nexture/ni-headset-mic\";\nimport NiHealth from \"./nexture/ni-health\";\nimport NiHeart from \"./nexture/ni-heart\";\nimport NiHeartRate from \"./nexture/ni-heart-rate\";\nimport NiHearts from \"./nexture/ni-hearts\";\nimport NiHome from \"./nexture/ni-home\";\nimport NiInbox from \"./nexture/ni-inbox\";\nimport NiInfoSquare from \"./nexture/ni-info-square\";\nimport NiInjection from \"./nexture/ni-injection\";\nimport NiInput from \"./nexture/ni-input\";\nimport NiIntegration from \"./nexture/ni-integration\";\nimport NiInternal from \"./nexture/ni-internal\";\nimport NiIv from \"./nexture/ni-iv\";\nimport NiJoin from \"./nexture/ni-join\";\nimport NiKey from \"./nexture/ni-key\";\nimport NiKeyboard from \"./nexture/ni-keyboard\";\nimport NiKnobs from \"./nexture/ni-knobs\";\nimport NiLaptop from \"./nexture/ni-laptop\";\nimport NiLaw from \"./nexture/ni-law\";\nimport NiLayout from \"./nexture/ni-layout\";\nimport NiLike from \"./nexture/ni-like\";\nimport NiLink from \"./nexture/ni-link\";\nimport NiLinkBroken from \"./nexture/ni-link-broken\";\nimport NiList from \"./nexture/ni-list\";\nimport NiListCheck from \"./nexture/ni-list-check\";\nimport NiListChevronDown from \"./nexture/ni-list-chevron-down\";\nimport NiListCircle from \"./nexture/ni-list-circle\";\nimport NiListCross from \"./nexture/ni-list-cross\";\nimport NiListNumber from \"./nexture/ni-list-number\";\nimport NiListSquare from \"./nexture/ni-list-square\";\nimport NiLoader from \"./nexture/ni-loader\";\nimport NiLock from \"./nexture/ni-lock\";\nimport NiLuggage from \"./nexture/ni-luggage\";\nimport NiLungs from \"./nexture/ni-lungs\";\nimport NiMagicWand from \"./nexture/ni-magic-wand\";\nimport NiMale from \"./nexture/ni-male\";\nimport NiMap from \"./nexture/ni-map\";\nimport NiMasonary from \"./nexture/ni-masonary\";\nimport NiMedal from \"./nexture/ni-medal\";\nimport NiMenu from \"./nexture/ni-menu\";\nimport NiMenuLeft from \"./nexture/ni-menu-left\";\nimport NiMenuRight from \"./nexture/ni-menu-right\";\nimport NiMenuSplit from \"./nexture/ni-menu-split\";\nimport NiMenuSplitDot from \"./nexture/ni-menu-split-dot\";\nimport NiMenuSplitDotReverse from \"./nexture/ni-menu-split-dot-reverse\";\nimport NiMenuSplitReverse from \"./nexture/ni-menu-split-reverse\";\nimport NiMessage from \"./nexture/ni-message\";\nimport NiMessageCheck from \"./nexture/ni-message-check\";\nimport NiMessageCross from \"./nexture/ni-message-cross\";\nimport NiMessageDots from \"./nexture/ni-message-dots\";\nimport NiMessageFilled from \"./nexture/ni-message-filled\";\nimport NiMessageGrammar from \"./nexture/ni-message-grammar\";\nimport NiMessagePlus from \"./nexture/ni-message-plus\";\nimport NiMessages from \"./nexture/ni-messages\";\nimport NiMicrophone from \"./nexture/ni-microphone\";\nimport NiMinus from \"./nexture/ni-minus\";\nimport NiMinusFull from \"./nexture/ni-minus-full\";\nimport NiMinusSquare from \"./nexture/ni-minus-square\";\nimport NiMoney from \"./nexture/ni-money\";\nimport NiMoneyBag from \"./nexture/ni-money-bag\";\nimport NiMoon from \"./nexture/ni-moon\";\nimport NiMountain from \"./nexture/ni-mountain\";\nimport NiMouse from \"./nexture/ni-mouse\";\nimport NiMove from \"./nexture/ni-move\";\nimport NiMusic from \"./nexture/ni-music\";\nimport NiNetwork from \"./nexture/ni-network\";\nimport NiNext from \"./nexture/ni-next\";\nimport NiOxygen from \"./nexture/ni-oxygen\";\nimport NiPaintBucket from \"./nexture/ni-paint-bucket\";\nimport NiPaintRoller from \"./nexture/ni-paint-roller\";\nimport NiPalette from \"./nexture/ni-palette\";\nimport NiPaperclip from \"./nexture/ni-paperclip\";\nimport NiParentheses from \"./nexture/ni-parentheses\";\nimport NiPath from \"./nexture/ni-path\";\nimport NiPause from \"./nexture/ni-pause\";\nimport NiPen from \"./nexture/ni-pen\";\nimport NiPenSquare from \"./nexture/ni-pen-square\";\nimport NiPercent from \"./nexture/ni-percent\";\nimport NiPhone from \"./nexture/ni-phone\";\nimport NiPhoneHandset from \"./nexture/ni-phone-handset\";\nimport NiPhoneHandsetCheck from \"./nexture/ni-phone-handset-check\";\nimport NiPhoneHandsetOff from \"./nexture/ni-phone-handset-off\";\nimport NiPhoneHandsetOn from \"./nexture/ni-phone-handset-on\";\nimport NiPin from \"./nexture/ni-pin\";\nimport NiPinCheck from \"./nexture/ni-pin-check\";\nimport NiPinCross from \"./nexture/ni-pin-cross\";\nimport NiPinPlus from \"./nexture/ni-pin-plus\";\nimport NiPine from \"./nexture/ni-pine\";\nimport NiPivot from \"./nexture/ni-pivot\";\nimport NiPlane from \"./nexture/ni-plane\";\nimport NiPlay from \"./nexture/ni-play\";\nimport NiPlug from \"./nexture/ni-plug\";\nimport NiPlus from \"./nexture/ni-plus\";\nimport NiPlusFull from \"./nexture/ni-plus-full\";\nimport NiPlusSquare from \"./nexture/ni-plus-square\";\nimport NiPolitics from \"./nexture/ni-politics\";\nimport NiPound from \"./nexture/ni-pound\";\nimport NiPoundSquare from \"./nexture/ni-pound-square\";\nimport NiPower from \"./nexture/ni-power\";\nimport NiPresentation from \"./nexture/ni-presentation\";\nimport NiPrevious from \"./nexture/ni-previous\";\nimport NiPrinter from \"./nexture/ni-printer\";\nimport NiProgress from \"./nexture/ni-progress\";\nimport NiPullRequestClosed from \"./nexture/ni-pull-request-closed\";\nimport NiPullRequestDraft from \"./nexture/ni-pull-request-draft\";\nimport NiPullRequestMerged from \"./nexture/ni-pull-request-merged\";\nimport NiPullRequestOpen from \"./nexture/ni-pull-request-open\";\nimport NiPulse from \"./nexture/ni-pulse\";\nimport NiPushPin from \"./nexture/ni-push-pin\";\nimport NiPushPinLeft from \"./nexture/ni-push-pin-left\";\nimport NiPushPinRight from \"./nexture/ni-push-pin-right\";\nimport NiPuzzle from \"./nexture/ni-puzzle\";\nimport NiQuestionHexagon from \"./nexture/ni-question-hexagon\";\nimport NiRadio from \"./nexture/ni-radio\";\nimport NiRankFour from \"./nexture/ni-rank-four\";\nimport NiRankOne from \"./nexture/ni-rank-one\";\nimport NiRankThree from \"./nexture/ni-rank-three\";\nimport NiRankTwo from \"./nexture/ni-rank-two\";\nimport NiReceipt from \"./nexture/ni-receipt\";\nimport NiRecord from \"./nexture/ni-record\";\nimport NiRefresh from \"./nexture/ni-refresh\";\nimport NiReligion from \"./nexture/ni-religion\";\nimport NiResearch from \"./nexture/ni-research\";\nimport NiRevenue from \"./nexture/ni-revenue\";\nimport NiReverseLeft from \"./nexture/ni-reverse-left\";\nimport NiReverseRight from \"./nexture/ni-reverse-right\";\nimport NiRobot from \"./nexture/ni-robot\";\nimport NiRocket from \"./nexture/ni-rocket\";\nimport NiRouter from \"./nexture/ni-router\";\nimport NiRows from \"./nexture/ni-rows\";\nimport NiSafe from \"./nexture/ni-safe\";\nimport NiScale from \"./nexture/ni-scale\";\nimport NiScalpel from \"./nexture/ni-scalpel\";\nimport NiScissors from \"./nexture/ni-scissors\";\nimport NiScreen from \"./nexture/ni-screen\";\nimport NiScriptSub from \"./nexture/ni-script-sub\";\nimport NiScriptSuper from \"./nexture/ni-script-super\";\nimport NiSdCard from \"./nexture/ni-sd-card\";\nimport NiSearch from \"./nexture/ni-search\";\nimport NiSelect from \"./nexture/ni-select\";\nimport NiSendDown from \"./nexture/ni-send-down\";\nimport NiSendDownLeft from \"./nexture/ni-send-down-left\";\nimport NiSendDownRight from \"./nexture/ni-send-down-right\";\nimport NiSendLeft from \"./nexture/ni-send-left\";\nimport NiSendRight from \"./nexture/ni-send-right\";\nimport NiSendUp from \"./nexture/ni-send-up\";\nimport NiSendUpLeft from \"./nexture/ni-send-up-left\";\nimport NiSendUpRight from \"./nexture/ni-send-up-right\";\nimport NiServer from \"./nexture/ni-server\";\nimport NiSettings from \"./nexture/ni-settings\";\nimport NiShare from \"./nexture/ni-share\";\nimport NiShield from \"./nexture/ni-shield\";\nimport NiShieldCheck from \"./nexture/ni-shield-check\";\nimport NiShieldCross from \"./nexture/ni-shield-cross\";\nimport NiShrinkFull from \"./nexture/ni-shrink-full\";\nimport NiShrinkSquare from \"./nexture/ni-shrink-square\";\nimport NiShuffle from \"./nexture/ni-shuffle\";\nimport NiSign from \"./nexture/ni-sign\";\nimport NiSignalLeftRight from \"./nexture/ni-signal-left-right\";\nimport NiSignalRight from \"./nexture/ni-signal-right\";\nimport NiSignalUp from \"./nexture/ni-signal-up\";\nimport NiSigns from \"./nexture/ni-signs\";\nimport NiSlashHexagon from \"./nexture/ni-slash-hexagon\";\nimport NiSlider from \"./nexture/ni-slider\";\nimport NiSnow from \"./nexture/ni-snow\";\nimport NiSoundCross from \"./nexture/ni-sound-cross\";\nimport NiSoundOff from \"./nexture/ni-sound-off\";\nimport NiSoundOn from \"./nexture/ni-sound-on\";\nimport NiSoundPlus from \"./nexture/ni-sound-plus\";\nimport NiSparkle from \"./nexture/ni-sparkle\";\nimport NiSpinner from \"./nexture/ni-spinner\";\nimport NiSquare from \"./nexture/ni-square\";\nimport NiSquircle from \"./nexture/ni-squircle\";\nimport NiStar from \"./nexture/ni-star\";\nimport NiStars from \"./nexture/ni-stars\";\nimport NiStomach from \"./nexture/ni-stomach\";\nimport NiStopwatch from \"./nexture/ni-stopwatch\";\nimport NiStore from \"./nexture/ni-store\";\nimport NiStructure from \"./nexture/ni-structure\";\nimport NiSum from \"./nexture/ni-sum\";\nimport NiSun from \"./nexture/ni-sun\";\nimport NiSwap from \"./nexture/ni-swap\";\nimport NiSwitch from \"./nexture/ni-switch\";\nimport NiTablet from \"./nexture/ni-tablet\";\nimport NiTag from \"./nexture/ni-tag\";\nimport NiTelescope from \"./nexture/ni-telescope\";\nimport NiTemperature from \"./nexture/ni-temperature\";\nimport NiTent from \"./nexture/ni-tent\";\nimport NiTerminal from \"./nexture/ni-terminal\";\nimport NiTextBold from \"./nexture/ni-text-bold\";\nimport NiTextCenter from \"./nexture/ni-text-center\";\nimport NiTextFont from \"./nexture/ni-text-font\";\nimport NiTextItalic from \"./nexture/ni-text-italic\";\nimport NiTextJustify from \"./nexture/ni-text-justify\";\nimport NiTextLeft from \"./nexture/ni-text-left\";\nimport NiTextQuote from \"./nexture/ni-text-quote\";\nimport NiTextRight from \"./nexture/ni-text-right\";\nimport NiTextStrikethrough from \"./nexture/ni-text-strikethrough\";\nimport NiTextUnderline from \"./nexture/ni-text-underline\";\nimport NiTextarea from \"./nexture/ni-textarea\";\nimport NiTicket from \"./nexture/ni-ticket\";\nimport NiTimeline from \"./nexture/ni-timeline\";\nimport NiTooth from \"./nexture/ni-tooth\";\nimport NiToyBoat from \"./nexture/ni-toy-boat\";\nimport NiToySky from \"./nexture/ni-toy-sky\";\nimport NiToyStacking from \"./nexture/ni-toy-stacking\";\nimport NiTrade from \"./nexture/ni-trade\";\nimport NiTree from \"./nexture/ni-tree\";\nimport NiTrendDown from \"./nexture/ni-trend-down\";\nimport NiTrendUp from \"./nexture/ni-trend-up\";\nimport NiTriangleDown from \"./nexture/ni-triangle-down\";\nimport NiTriangleLeft from \"./nexture/ni-triangle-left\";\nimport NiTriangleRight from \"./nexture/ni-triangle-right\";\nimport NiTriangleUp from \"./nexture/ni-triangle-up\";\nimport NiTrophy from \"./nexture/ni-trophy\";\nimport NiTruck from \"./nexture/ni-truck\";\nimport NiTubes from \"./nexture/ni-tubes\";\nimport NiUngroup from \"./nexture/ni-ungroup\";\nimport NiUnlike from \"./nexture/ni-unlike\";\nimport NiUnlock from \"./nexture/ni-unlock\";\nimport NiUploadCloud from \"./nexture/ni-upload-cloud\";\nimport NiUser from \"./nexture/ni-user\";\nimport NiUserCheck from \"./nexture/ni-user-check\";\nimport NiUserCross from \"./nexture/ni-user-cross\";\nimport NiUserMinus from \"./nexture/ni-user-minus\";\nimport NiUserPlus from \"./nexture/ni-user-plus\";\nimport NiUsers from \"./nexture/ni-users\";\nimport NiVerified from \"./nexture/ni-verified\";\nimport NiWallet from \"./nexture/ni-wallet\";\nimport NiWalletCrypto from \"./nexture/ni-wallet-crypto\";\nimport NiWatch from \"./nexture/ni-watch\";\nimport NiWeightScale from \"./nexture/ni-weight-scale\";\nimport NiWind from \"./nexture/ni-wind\";\nimport NiWorld from \"./nexture/ni-world\";\nimport NiZoomIn from \"./nexture/ni-zoom-in\";\nimport NiZoomOut from \"./nexture/ni-zoom-out\";\n\nexport const IconMap = {\n NiAI,\n NiAirBalloon,\n NiAnchor,\n NiAnnouncement,\n NiAntenna,\n NiArchiveCheck,\n NiArchive,\n NiArrowCircleLeft,\n NiArrowCircleRight,\n NiArrowDownLeftSquare,\n NiArrowDownLeft,\n NiArrowDownRightSquare,\n NiArrowDownRight,\n NiArrowDownSquare,\n NiArrowDown,\n NiArrowHistory,\n NiArrowInDown,\n NiArrowInLeft,\n NiArrowInRight,\n NiArrowInUp,\n NiArrowLeftRight,\n NiArrowLeftSquare,\n NiArrowLeft,\n NiArrowOutDown,\n NiArrowOutLeft,\n NiArrowOutRight,\n NiArrowOutUp,\n NiArrowRightSquare,\n NiArrowRight,\n NiArrowUpDown,\n NiArrowUpLeftSquare,\n NiArrowUpLeft,\n NiArrowUpRightSquare,\n NiArrowUpRight,\n NiArrowUpSquare,\n NiArrowUp,\n NiAt,\n NiBadgeCheck,\n NiBadge,\n NiBag,\n NiBandAid,\n NiBarcode,\n NiBasket,\n NiBatteryCharging,\n NiBatteryEmpty,\n NiBatteryFull,\n NiBellInactive,\n NiBell,\n NiBinEmpty,\n NiBinFull,\n NiBloodCells,\n NiBluetooth,\n NiBook,\n NiBookmarkSingle,\n NiBookmark,\n NiBraces,\n NiBrackets,\n NiBrain,\n NiBrainCircuit,\n NiBriefcase,\n NiBrushArtSquare,\n NiBrushArt,\n NiBrush,\n NiBug,\n NiBuilding,\n NiBulbOff,\n NiBulbOn,\n NiButton,\n NiButtonGroup,\n NiButtonLarge,\n NiCake,\n NiCalendar,\n NiCalendarClock,\n NiCamera,\n NiCar,\n NiCartArrow,\n NiCartCross,\n NiCartEmpty,\n NiCartMinus,\n NiCartPlus,\n NiCatalog,\n NiCellsPlus,\n NiCells,\n NiChange,\n NiChartBar,\n NiChartCandleSticks,\n NiChartFunnel,\n NiChartHeatmap,\n NiChartLineBar,\n NiChartLine,\n NiChartPie,\n NiChartPolar,\n NiChartRadar,\n NiChartScatter,\n NiCheckSquare,\n NiCheck,\n NiCheckFull,\n NiChef,\n NiChevronDownSmall,\n NiChevronDown,\n NiChevronLeftRightReverseSmall,\n NiChevronLeftRightSmall,\n NiChevronLeftSmall,\n NiChevronLeft,\n NiChevronRightSmall,\n NiChevronRight,\n NiChevronUpDownReverseSmall,\n NiChevronUpDownSmall,\n NiChevronUpSmall,\n NiChevronUp,\n NiCholesterol,\n NiCircle,\n NiClipboard,\n NiClock,\n NiCloudPartly,\n NiCloudRain,\n NiCloudSnow,\n NiCloudThunder,\n NiCloud,\n NiCode,\n NiCoffee,\n NiCoin,\n NiCollapse,\n NiCollapseIn,\n NiCols,\n NiCompass,\n NiController,\n NiCopyright,\n NiCpu,\n NiCreditCard,\n NiCrop,\n NiCrossHexagon,\n NiCrossSquare,\n NiCross,\n NiCrossFull,\n NiCrosshair,\n NiCrown,\n NiCursor,\n NiDashboard,\n NiDatabase,\n NiDevops,\n NiDiagram,\n NiDice,\n NiDirectory,\n NiDocumentArchive,\n NiDocumentChart,\n NiDocumentCheck,\n NiDocumentCode,\n NiDocumentCross,\n NiDocumentFull,\n NiDocumentImage,\n NiDocumentMinus,\n NiDocumentNumber,\n NiDocumentPlus,\n NiDocumentVideo,\n NiDollarSquare,\n NiDollar,\n NiDotsSquare,\n NiDownloadCloud,\n NiDragHorizontal,\n NiDragVertical,\n NiDrink,\n NiDrop,\n NiDuplicate,\n NiEllipsisHorizontal,\n NiEllipsisVertical,\n NiEmailOpen,\n NiEmail,\n NiEndDownSmall,\n NiEndLeftSmall,\n NiEndRightSmall,\n NiEndUpSmall,\n NiEnterDown,\n NiEnterLeft,\n NiEnterReverseDown,\n NiEnterReverseLeft,\n NiEnterReverseRight,\n NiEnterReverseUp,\n NiEnterRight,\n NiEnterUp,\n NiEquals,\n NiEqualsFull,\n NiEraser,\n NiEuroSquare,\n NiEuro,\n NiExclamationHexagon,\n NiExclamationSquare,\n NiExpandOut,\n NiExpandSquare,\n NiExpandFull,\n NiExpand,\n NiExternal,\n NiEyeClose,\n NiEyeInactive,\n NiEyeOpen,\n NiFaceFrownMore,\n NiFaceFrown,\n NiFaceNeutral,\n NiFaceSmileMore,\n NiFaceSmile,\n NiFemale,\n NiFilterCross,\n NiFilterMinus,\n NiFilterPlus,\n NiFilter,\n NiFingerprint,\n NiFire,\n NiFirstAid,\n NiFitness,\n NiFlag,\n NiFlash,\n NiFlask,\n NiFloppyDisk,\n NiFolderCheck,\n NiFolderCross,\n NiFolderMinus,\n NiFolderPlus,\n NiFolder,\n NiForwardDownSmall,\n NiForwardLeftSmall,\n NiForwardRightSmall,\n NiForwardUpSmall,\n NiGay,\n NiGerm,\n NiGogo,\n NiGold,\n NiGpu,\n NiGroup,\n NiGraduation,\n NiHeadphones,\n NiHeadset,\n NiHeadsetMic,\n NiHealth,\n NiHeart,\n NiHeartRate,\n NiHearts,\n NiHome,\n NiInbox,\n NiInfoSquare,\n NiInjection,\n NiInput,\n NiIntegration,\n NiInternal,\n NiIv,\n NiJoin,\n NiKey,\n NiKeyboard,\n NiKnobs,\n NiLaptop,\n NiLayout,\n NiLaw,\n NiLike,\n NiLinkBroken,\n NiLink,\n NiListCheck,\n NiListChevronDown,\n NiListCircle,\n NiListCross,\n NiListNumber,\n NiListSquare,\n NiList,\n NiLungs,\n NiLoader,\n NiLock,\n NiLuggage,\n NiMagicWand,\n NiMale,\n NiMap,\n NiMasonary,\n NiMedal,\n NiMenu,\n NiMenuLeft,\n NiMenuRight,\n NiMenuSplitDotReverse,\n NiMenuSplitDot,\n NiMenuSplitReverse,\n NiMenuSplit,\n NiMessageCheck,\n NiMessageCross,\n NiMessageDots,\n NiMessageFilled,\n NiMessageGrammar,\n NiMessagePlus,\n NiMessage,\n NiMessages,\n NiMicrophone,\n NiMinus,\n NiMinusFull,\n NiMinusSquare,\n NiMoneyBag,\n NiMoney,\n NiMoon,\n NiMountain,\n NiMouse,\n NiMove,\n NiMusic,\n NiNetwork,\n NiNext,\n NiOxygen,\n NiPaintBucket,\n NiPaintRoller,\n NiPalette,\n NiPaperclip,\n NiParentheses,\n NiPath,\n NiPause,\n NiPenSquare,\n NiPen,\n NiPercent,\n NiPhoneHandsetCheck,\n NiPhoneHandsetOff,\n NiPhoneHandsetOn,\n NiPhoneHandset,\n NiPhone,\n NiPinCheck,\n NiPinCross,\n NiPinPlus,\n NiPin,\n NiPine,\n NiPivot,\n NiPlane,\n NiPlay,\n NiPlug,\n NiPlusSquare,\n NiPlus,\n NiPlusFull,\n NiPolitics,\n NiPoundSquare,\n NiPound,\n NiPower,\n NiPresentation,\n NiPrevious,\n NiPrinter,\n NiProgress,\n NiPullRequestClosed,\n NiPullRequestDraft,\n NiPullRequestMerged,\n NiPullRequestOpen,\n NiPulse,\n NiPushPin,\n NiPushPinLeft,\n NiPushPinRight,\n NiPuzzle,\n NiQuestionHexagon,\n NiRankOne,\n NiRankTwo,\n NiRankThree,\n NiRankFour,\n NiRadio,\n NiReceipt,\n NiRecord,\n NiRefresh,\n NiReligion,\n NiResearch,\n NiRevenue,\n NiReverseLeft,\n NiReverseRight,\n NiRobot,\n NiRocket,\n NiRouter,\n NiRows,\n NiSafe,\n NiScale,\n NiScalpel,\n NiScissors,\n NiScreen,\n NiScriptSub,\n NiScriptSuper,\n NiSdCard,\n NiSearch,\n NiSelect,\n NiSendDownLeft,\n NiSendDownRight,\n NiSendDown,\n NiSendLeft,\n NiSendRight,\n NiSendUpLeft,\n NiSendUpRight,\n NiSendUp,\n NiServer,\n NiSettings,\n NiShare,\n NiShieldCheck,\n NiShieldCross,\n NiShield,\n NiShrinkSquare,\n NiShrinkFull,\n NiShuffle,\n NiSign,\n NiSignalLeftRight,\n NiSignalRight,\n NiSignalUp,\n NiSigns,\n NiSlashHexagon,\n NiSlider,\n NiSnow,\n NiSoundCross,\n NiSoundOff,\n NiSoundOn,\n NiSoundPlus,\n NiSparkle,\n NiSpinner,\n NiSquare,\n NiSquircle,\n NiStar,\n NiStars,\n NiStopwatch,\n NiStore,\n NiStomach,\n NiStructure,\n NiSum,\n NiSun,\n NiSwap,\n NiSwitch,\n NiTablet,\n NiTag,\n NiTelescope,\n NiTemperature,\n NiTent,\n NiTerminal,\n NiTextBold,\n NiTextCenter,\n NiTextFont,\n NiTextItalic,\n NiTextJustify,\n NiTextLeft,\n NiTextQuote,\n NiTextRight,\n NiTextStrikethrough,\n NiTextUnderline,\n NiTextarea,\n NiTicket,\n NiTimeline,\n NiTooth,\n NiToyBoat,\n NiToySky,\n NiToyStacking,\n NiTrade,\n NiTree,\n NiTrendDown,\n NiTrendUp,\n NiTriangleDown,\n NiTriangleLeft,\n NiTriangleRight,\n NiTriangleUp,\n NiTrophy,\n NiTruck,\n NiTubes,\n NiUngroup,\n NiUnlike,\n NiUnlock,\n NiUploadCloud,\n NiUserCheck,\n NiUserCross,\n NiUserMinus,\n NiUserPlus,\n NiUser,\n NiUsers,\n NiVerified,\n NiWalletCrypto,\n NiWallet,\n NiWatch,\n NiWeightScale,\n NiWind,\n NiWorld,\n NiZoomIn,\n NiZoomOut,\n};\n\nexport type IconName = keyof typeof IconMap;\nexport type IconSize = \"large\" | \"medium\" | \"small\" | \"tiny\" | number;\nexport type IconVariant = \"outlined\" | \"contained\";\n\nexport type NextureIconsProps = {\n variant?: IconVariant;\n className?: string;\n size?: IconSize;\n strokeWidth?: number;\n oneTone?: boolean;\n};\n\nexport type NextureIconsPropsComponent = NextureIconsProps & {\n icon: IconName;\n};\n\nconst NextureIcons: React.FC<NextureIconsPropsComponent> = ({\n icon,\n size = 20,\n variant = \"outlined\",\n className,\n strokeWidth = 1.5,\n oneTone = false,\n}) => {\n const IconComponent = IconMap[icon];\n if (!IconComponent) {\n console.warn(`Icon \"${icon}\" not found in IconMap.`);\n return null;\n }\n return (\n <IconComponent variant={variant} size={size} className={className} strokeWidth={strokeWidth} oneTone={oneTone} />\n );\n};\n\nexport const sizeHelper = (size: NextureIconsProps[\"size\"]) => {\n if (typeof size === \"number\") {\n return size;\n } else if (size === \"large\") {\n return 24;\n } else if (size === \"small\" || size === \"tiny\") {\n return 16;\n } else {\n return 20;\n }\n};\n\nexport const strokeSizeHelper = (size: number) => {\n if (size === 32) {\n return 1.15;\n } else if (size >= 20) {\n return 1.5;\n } else {\n return 1.75;\n }\n};\n\nexport default NextureIcons;\n","import { memo, useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport { FilledInput, FormControl, IconButton, InputAdornment, InputLabel } from \"@mui/material\";\n\nimport { NiCross, NiSearch } from \"../../icons/nexture\";\n\ninterface DebouncedSearchInputProps {\n value?: string;\n onChange: (value: string) => void;\n label?: string;\n delay?: number;\n className?: string;\n}\n\n/**\n * Self-contained search input that manages its own typing state.\n * Only calls `onChange` after a debounce, preventing expensive parent re-renders\n * (e.g. DataGrid) on every keystroke.\n *\n * Promoted here from `sales` and `timesheets`, where the file was byte-identical in both and a\n * third search field had been hand-mirrored from it in a shared toolbar. \"Search bars don't look\n * the same\" is not a problem a lint rule can fix - only one implementation can - so this is the\n * implementation, and `coreconnect/no-local-search-input` is the backstop that stops the next\n * plugin writing a fourth.\n *\n * Class composition uses the package's existing join idiom rather than a `cn`/tailwind-merge\n * helper, which keeps `plugin-ui` free of new runtime dependencies. No caller passes a conflicting\n * utility class today, so tailwind-merge's conflict resolution is unexercised; a caller that needs\n * it should override via `sx` instead of racing class order.\n */\nexport const DebouncedSearchInput = memo(function DebouncedSearchInput({\n value = \"\",\n onChange,\n label = \"Search\",\n delay = 400,\n className,\n}: DebouncedSearchInputProps) {\n const [localValue, setLocalValue] = useState(value);\n // Associate the InputLabel with the FilledInput — a bare FormControl+InputLabel+Input\n // doesn't auto-link them (unlike TextField), leaving the label without a `for` target.\n const inputId = useId();\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const lastReportedRef = useRef(value);\n const isFirstRender = useRef(true);\n\n // Sync external value changes (e.g. clear from parent)\n useEffect(() => {\n setLocalValue(value);\n lastReportedRef.current = value;\n }, [value]);\n\n // Debounce: notify parent only after typing pauses (skip initial mount)\n useEffect(() => {\n if (isFirstRender.current) {\n isFirstRender.current = false;\n return;\n }\n if (localValue === lastReportedRef.current) return;\n const timer = setTimeout(() => {\n lastReportedRef.current = localValue;\n onChangeRef.current(localValue);\n }, delay);\n return () => clearTimeout(timer);\n }, [localValue, delay]);\n\n const handleClear = useCallback(() => {\n setLocalValue(\"\");\n lastReportedRef.current = \"\";\n onChangeRef.current(\"\");\n }, []);\n\n const classes = (...parts: (string | false | undefined)[]) => parts.filter(Boolean).join(\" \");\n\n return (\n <FormControl variant=\"filled\" size=\"medium\" className={classes(\"surface mb-0 w-full\", className)}>\n <InputLabel htmlFor={inputId}>{label}</InputLabel>\n <FilledInput\n id={inputId}\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n endAdornment={\n <>\n <InputAdornment position=\"end\" className={classes(localValue === \"\" && \"hidden\")}>\n <IconButton edge=\"end\" onClick={handleClear} aria-label=\"Clear search\">\n <NiCross size=\"medium\" className=\"text-text-disabled\" />\n </IconButton>\n </InputAdornment>\n <InputAdornment position=\"end\" className={classes(localValue !== \"\" && \"hidden\")} aria-hidden>\n <IconButton edge=\"end\" disabled tabIndex={-1}>\n <NiSearch size=\"medium\" className=\"text-text-disabled\" />\n </IconButton>\n </InputAdornment>\n </>\n }\n />\n </FormControl>\n );\n});\n","import { useState, useRef, type ReactNode } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport {\n Box,\n Breadcrumbs as MuiBreadcrumbs,\n Stack,\n Typography,\n Link as MuiLink,\n Button,\n IconButton,\n Menu,\n MenuItem,\n} from \"../ui\";\nimport type { ActionDescriptor, Breadcrumb } from \"./pageHeaderTypes\";\n\n/**\n * `@ethisyscore/plugin-ui/components/layout` — the page-header, promoted from the\n * monolith so plugins share one component instead of copying it. In a plugin this\n * IS the page header: the host suppresses its own chrome for platform-react\n * surfaces, so this renders the breadcrumb trail, the title, and the CTAs.\n *\n * `breadcrumbs` is the ROOT trail (e.g. `Home / Finance`); the current `title` is\n * appended as the non-link leaf crumb. MUI primitives come from the sibling\n * `../ui` barrel (host externals, never bundled); `Link` is react-router's so\n * links keep middle-click / open-in-new-tab / a11y.\n */\nexport interface PageHeaderProps {\n title: string;\n subtitle?: ReactNode;\n primaryAction?: ActionDescriptor;\n secondaryAction?: ActionDescriptor;\n overflowActions?: ActionDescriptor[];\n /** Root breadcrumb trail; the `title` is appended as the current-page leaf. */\n breadcrumbs?: Breadcrumb[];\n}\n\nexport function PageHeader({\n title,\n subtitle,\n primaryAction,\n secondaryAction,\n overflowActions,\n breadcrumbs,\n}: PageHeaderProps) {\n const hasActions =\n primaryAction != null ||\n secondaryAction != null ||\n (overflowActions != null && overflowActions.length > 0);\n\n return (\n <Stack direction=\"column\" spacing={0.5} className=\"mb-4\">\n {breadcrumbs != null && breadcrumbs.length > 0 && <Breadcrumbs trail={breadcrumbs} />}\n <Stack direction=\"row\" justifyContent=\"space-between\" alignItems=\"flex-start\" spacing={2}>\n <Box>\n {/* Title is optional: in a plugin the host renders the surface title,\n so list pages pass an empty title and only their CTA shows. Pages\n that want an in-body title (detail/create/edit) set it explicitly. */}\n {title !== \"\" && (\n <Typography variant=\"h4\" component=\"h1\">\n {title}\n </Typography>\n )}\n {subtitle != null && (\n <Typography variant=\"body2\" color=\"text.secondary\" className=\"mt-1\">\n {subtitle}\n </Typography>\n )}\n </Box>\n {hasActions && (\n <Stack\n direction=\"row\"\n spacing={1}\n alignItems=\"center\"\n data-testid=\"page-header-actions\"\n >\n {overflowActions != null && overflowActions.length > 0 && (\n <OverflowMenu actions={overflowActions} />\n )}\n {secondaryAction != null && <SecondaryDropdown action={secondaryAction} />}\n {primaryAction != null && <PrimaryButton action={primaryAction} />}\n </Stack>\n )}\n </Stack>\n </Stack>\n );\n}\n\n/**\n * Breadcrumb trail — mirrors the host's `gogo-ui` `PageBreadcrumbs` exactly (MUI\n * `Breadcrumbs` with the same markup/props) so the plugin surface looks identical\n * to host-rendered chrome: `text.secondary` links (`underline=\"hover\"`) up to the\n * current page, a `text.primary` leaf, `variant=\"body2\"`, `mb-2 px-1`.\n */\nfunction Breadcrumbs({ trail }: { trail: Breadcrumb[] }) {\n if (trail.length < 2) return null;\n return (\n <MuiBreadcrumbs aria-label=\"breadcrumb\" className=\"mb-2 px-1\">\n {trail.map((crumb, index) =>\n index < trail.length - 1 ? (\n <MuiLink\n key={crumb.href ?? crumb.label}\n component={Link}\n to={crumb.href ?? \"/\"}\n underline=\"hover\"\n color=\"text.secondary\"\n variant=\"body2\"\n >\n {crumb.label}\n </MuiLink>\n ) : (\n <Typography key={crumb.label} color=\"text.primary\" variant=\"body2\">\n {crumb.label}\n </Typography>\n ),\n )}\n </MuiBreadcrumbs>\n );\n}\n\nfunction PrimaryButton({ action }: { action: ActionDescriptor }) {\n const common = {\n \"data-danger\": action.danger ? \"true\" : undefined,\n disabled: action.disabled,\n } as const;\n if (action.href != null) {\n return (\n <Button\n component={Link}\n to={action.href}\n variant=\"contained\"\n color={action.danger ? \"error\" : \"primary\"}\n {...common}\n >\n {action.label}\n </Button>\n );\n }\n return (\n <Button\n onClick={action.onClick}\n variant=\"contained\"\n color={action.danger ? \"error\" : \"primary\"}\n {...common}\n >\n {action.label}\n </Button>\n );\n}\n\nfunction useMenuState() {\n const [open, setOpen] = useState(false);\n const anchorRef = useRef<HTMLButtonElement | null>(null);\n return {\n open,\n anchorRef,\n toggle: () => setOpen((v) => !v),\n close: () => setOpen(false),\n };\n}\n\nfunction SecondaryDropdown({ action }: { action: ActionDescriptor }) {\n const { open, anchorRef, toggle, close } = useMenuState();\n const children = action.children ?? [];\n\n return (\n <>\n <Button\n ref={anchorRef}\n variant=\"outlined\"\n onClick={toggle}\n disabled={action.disabled || children.length === 0}\n aria-haspopup=\"menu\"\n aria-expanded={open || undefined}\n aria-label={action.label}\n >\n {action.label} ▾\n </Button>\n <Menu anchorEl={anchorRef.current} open={open} onClose={close}>\n {children.map((child) => (\n // href children render as anchors (component={Link}) to keep\n // middle-click / open-in-new-tab / a11y. `href` and `onClick` are\n // mutually exclusive on ActionDescriptor, so one MenuItem covers both.\n <MenuItem\n key={child.id}\n {...(child.href != null ? { component: Link, to: child.href } : {})}\n onClick={() => {\n close();\n child.onClick?.();\n }}\n disabled={child.disabled}\n >\n {child.label}\n </MenuItem>\n ))}\n </Menu>\n </>\n );\n}\n\nfunction OverflowMenu({ actions }: { actions: ActionDescriptor[] }) {\n const { open, anchorRef, toggle, close } = useMenuState();\n return (\n <>\n <IconButton\n ref={anchorRef}\n size=\"small\"\n aria-label=\"More actions\"\n onClick={toggle}\n >\n {\"⋯\"}\n </IconButton>\n <Menu anchorEl={anchorRef.current} open={open} onClose={close}>\n {actions.map((a) => (\n // href items render as anchors (component={Link}) — like\n // PrimaryButton — to keep middle-click / open-in-new-tab / a11y.\n // `href` and `onClick` are mutually exclusive on ActionDescriptor,\n // so one MenuItem covers both.\n <MenuItem\n key={a.id}\n {...(a.href != null ? { component: Link, to: a.href } : {})}\n onClick={() => {\n close();\n a.onClick?.();\n }}\n disabled={a.disabled}\n sx={a.danger ? { color: \"error.main\" } : undefined}\n >\n {a.label}\n </MenuItem>\n ))}\n </Menu>\n </>\n );\n}\n","import { createContext, useContext } from \"react\";\nimport type { PageHeaderState } from \"./pageHeaderTypes\";\n\n/**\n * Carries the active menu item / detail context so `usePageHeader` can derive\n * header props. The plugin analogue of the monolith shell's\n * `SubMenuPropsContext`: mounted once by `PageHeaderProvider`, read per page.\n *\n * `null` when no provider is mounted (a page rendered standalone, e.g. a test) —\n * consumers treat `null` as \"no header context\" and derive empty props.\n */\nexport const PageHeaderContext = createContext<PageHeaderState | null>(null);\n\n/** Returns the provider-published header state, or `null` when none is mounted. */\nexport function usePageHeaderContext(): PageHeaderState | null {\n return useContext(PageHeaderContext);\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\n\n/**\n * Sidebar-action dispatch channel — promoted from the monolith's\n * `SidebarActionContext`. Header buttons carrying an `actionId` (rather than an\n * `href`) dispatch through here; a page registers a handler via\n * `useSidebarAction` to open its own dialog. This is what makes `actionId` CTAs\n * (\"New Supplier Invoice\", \"New Cost Code\", …) fire when clicked.\n */\n\nexport type ActionHandler = (actionId: string) => void;\n\nexport interface SidebarActionContextValue {\n /** Dispatch an action to all registered page handlers. */\n triggerAction: (actionId: string) => void;\n /** Register a handler that receives sidebar actions. Returns an unregister function. */\n registerHandler: (handler: ActionHandler) => () => void;\n /** Set of actionIds whose owning UI surface (e.g. a dialog) is currently open. */\n activeActions: ReadonlySet<string>;\n /** Reports whether the owning UI surface for `actionId` is currently open. */\n setActionActive: (actionId: string, isActive: boolean) => void;\n}\n\nexport const SidebarActionContext = createContext<SidebarActionContextValue>({\n triggerAction: () => {},\n registerHandler: () => () => {},\n activeActions: new Set(),\n setActionActive: () => {},\n});\n\nexport function SidebarActionProvider({ children }: { children: ReactNode }) {\n const handlersRef = useRef(new Set<ActionHandler>());\n const [activeActions, setActiveActions] = useState<ReadonlySet<string>>(() => new Set());\n\n const triggerAction = useCallback((actionId: string) => {\n for (const handler of handlersRef.current) {\n handler(actionId);\n }\n }, []);\n\n const registerHandler = useCallback((handler: ActionHandler) => {\n handlersRef.current.add(handler);\n return () => {\n handlersRef.current.delete(handler);\n };\n }, []);\n\n const setActionActive = useCallback((actionId: string, isActive: boolean) => {\n setActiveActions((prev) => {\n const has = prev.has(actionId);\n if (isActive === has) return prev;\n const next = new Set(prev);\n if (isActive) next.add(actionId);\n else next.delete(actionId);\n return next;\n });\n }, []);\n\n const value = useMemo(\n () => ({ triggerAction, registerHandler, activeActions, setActionActive }),\n [triggerAction, registerHandler, activeActions, setActionActive],\n );\n\n return <SidebarActionContext.Provider value={value}>{children}</SidebarActionContext.Provider>;\n}\n\n/** Used by the header to dispatch actions to pages. */\nexport function useTriggerSidebarAction(): (actionId: string) => void {\n return useContext(SidebarActionContext).triggerAction;\n}\n\n/** Used by pages to register a handler for sidebar actions. Auto-cleans up on unmount. */\nexport function useSidebarAction(handler: ActionHandler): void {\n const { registerHandler } = useContext(SidebarActionContext);\n useEffect(() => registerHandler(handler), [registerHandler, handler]);\n}\n\n/**\n * Registers a map of sidebar-action handlers keyed by action id, dispatching the\n * matching entry when an action fires (unknown ids are ignored). The handler map\n * may change every render — a ref keeps the dispatcher stable so the registration\n * doesn't churn.\n */\nexport function useSidebarActions(handlers: Record<string, (() => void) | undefined>): void {\n const handlersRef = useRef(handlers);\n handlersRef.current = handlers;\n useSidebarAction(\n useCallback((actionId: string) => {\n handlersRef.current[actionId]?.();\n }, []),\n );\n}\n\n/** Reads the set of dispatch-action ids whose owning UI surface is currently open. */\nexport function useActiveSidebarActions(): ReadonlySet<string> {\n return useContext(SidebarActionContext).activeActions;\n}\n\n/**\n * Reports to the channel whether the owning UI surface for `actionId` is open.\n * Pages call this from a hook scope, mirroring their dialog/drawer open state.\n */\nexport function useReportSidebarActionActive(actionId: string, isActive: boolean): void {\n const { setActionActive } = useContext(SidebarActionContext);\n useEffect(() => {\n setActionActive(actionId, isActive);\n return () => {\n setActionActive(actionId, false);\n };\n }, [actionId, isActive, setActionActive]);\n}\n","import { useMemo } from \"react\";\nimport { usePageHeaderContext } from \"./pageHeaderContext\";\nimport { useTriggerSidebarAction } from \"./sidebarAction\";\nimport type {\n ActionDescriptor,\n ActionSlot,\n HeaderAction,\n PageHeaderDerivedProps,\n} from \"./pageHeaderTypes\";\n\n/**\n * Derives `<PageHeader>` props from the active menu item or detail context —\n * promoted verbatim from the monolith's `usePageHeader`, reading the plugin's\n * `PageHeaderContext` instead of the shell's `SubMenuPropsContext`.\n *\n * Outside a mounted `PageHeaderProvider` (or in a test rendering a page\n * standalone) the context is `null` and the hook derives empty header props —\n * same shape, no work. Page hooks spread the result and may override\n * title/subtitle/actions.\n */\nexport function usePageHeader(): PageHeaderDerivedProps {\n const state = usePageHeaderContext();\n const { activeMenuItem, detailContext, title, subtitle, breadcrumbs } = state ?? {};\n // Dispatcher for actionId-only actions — the same channel a page registers\n // against via `useSidebarAction`. Threading it into `toDescriptor` is what\n // makes header buttons like `+ New Supplier Invoice` (which carry an\n // `actionId` and no `href`) open the page-owned dialog when clicked.\n const triggerAction = useTriggerSidebarAction();\n\n return useMemo(() => {\n const sourceActions: HeaderAction[] =\n detailContext?.actions ?? activeMenuItem?.actions ?? [];\n\n let primary: ActionDescriptor | undefined;\n let secondary: ActionDescriptor | undefined;\n const overflow: ActionDescriptor[] = [];\n\n for (const action of sourceActions) {\n const descriptor = toDescriptor(action, triggerAction);\n const slot: ActionSlot = action.slot ?? \"sidebar-only\";\n switch (slot) {\n case \"primary\":\n if (primary == null) {\n primary = descriptor;\n } else {\n console.warn(\n \"usePageHeader: multiple primary slots on this page; demoting later ones to overflow\",\n { keptId: primary.id, demotedId: descriptor.id },\n );\n overflow.push(descriptor);\n }\n break;\n case \"secondary\":\n if (secondary == null) {\n secondary = descriptor;\n } else {\n console.warn(\n \"usePageHeader: multiple secondary slots on this page; demoting later ones to overflow\",\n { keptId: secondary.id, demotedId: descriptor.id },\n );\n overflow.push(descriptor);\n }\n break;\n case \"overflow\":\n overflow.push(descriptor);\n break;\n case \"sidebar-only\":\n default:\n // Not header-visible.\n break;\n }\n }\n\n return {\n // The plugin's `PageHeader` is the sole header (the host suppresses its own\n // chrome for platform-react surfaces), so it owns the title: a list page\n // shows its menu label; detail/create/edit pages override with their own.\n title: title ?? detailContext?.title ?? activeMenuItem?.label ?? \"\",\n // Fall back to the detail context's subtitle so a wrapper-rendered header\n // (no page spreading its own `headerProps`) still surfaces the entity name.\n subtitle: subtitle ?? detailContext?.subtitle,\n primaryAction: primary,\n secondaryAction: secondary,\n overflowActions: overflow.length > 0 ? overflow : undefined,\n breadcrumbs,\n };\n }, [activeMenuItem, detailContext, title, subtitle, breadcrumbs, triggerAction]);\n}\n\n/**\n * Map a raw header source action to `PageHeader`'s `ActionDescriptor`.\n *\n * Resolution order for `onClick`:\n * 1. Explicit `raw.onClick` (detail-context actions can carry one directly).\n * 2. `raw.actionId` → dispatch via the sidebar-action channel. This is what\n * makes menu-config actions like `actionId: \"create-cost-code\"` (no `href`,\n * no `onClick`) fire when the header button is clicked — the page registers\n * a handler via `useSidebarAction`.\n * 3. Neither — the button still renders, but is a no-op (typically paired with\n * `href` so the primary button renders a Link instead).\n *\n * The trigger is threaded down explicitly rather than via a hook because this\n * runs inside `useMemo` and can recurse (for secondary-dropdown children).\n */\nfunction toDescriptor(\n raw: HeaderAction,\n triggerAction: (actionId: string) => void,\n): ActionDescriptor {\n const explicitOnClick = raw.onClick;\n const dispatchActionId = raw.actionId;\n // `href` and `onClick` are mutually exclusive on ActionDescriptor. A navigating\n // action (`href`) must NOT also carry an `onClick`, or the Link-rendering menu\n // items (SecondaryDropdown / OverflowMenu always call `child.onClick`) would fire\n // a sidebar dispatch IN ADDITION to navigating. If a raw action is misconfigured\n // with both `href` and `onClick`/`actionId`, `href` wins and `onClick` is dropped.\n const onClick =\n raw.href != null\n ? undefined\n : explicitOnClick ?? (dispatchActionId ? () => triggerAction(dispatchActionId) : undefined);\n return {\n id: raw.id,\n label: raw.label,\n icon: raw.icon,\n href: raw.href,\n onClick,\n disabled: raw.disabled,\n danger: raw.variant === \"danger\",\n children: raw.children ? raw.children.map((c) => toDescriptor(c, triggerAction)) : undefined,\n };\n}\n","import { useMemo } from \"react\";\nimport { useTriggerSidebarAction } from \"./sidebarAction\";\nimport type { ActionDescriptor, PageHeaderDerivedProps, PluginDetailContextItem } from \"./pageHeaderTypes\";\n\n/**\n * Merge a plugin detail-context's `actions` into the header props a SELF-RENDERING\n * detail page spreads onto `<PageHeader>`.\n *\n * Use this when a detail page renders its own `<PageHeader {...headerProps}/>` and\n * sources its CTAs from a `*DetailContext` hook (rather than from a `menuConfig`\n * entry, which detail routes can't have — their path is dynamic). Applies the same\n * slot split (`primary`/`secondary`/`overflow`; `sidebar-only` is not shown in the\n * header) and `actionId → useTriggerSidebarAction` dispatch the SDK applies to\n * menu-item actions, so a detail-context action fires the page's `useSidebarActions`\n * handler exactly like a list-page CTA. `href` actions navigate.\n *\n * The companion for the OTHER surface is `toHostSidebarInput` (host sidebar).\n */\nexport function useDetailHeaderActions(\n base: PageHeaderDerivedProps,\n actions: PluginDetailContextItem[],\n): PageHeaderDerivedProps {\n const triggerAction = useTriggerSidebarAction();\n return useMemo(() => {\n if (actions.length === 0) {\n return base;\n }\n let primary = base.primaryAction;\n let secondary = base.secondaryAction;\n const overflow: ActionDescriptor[] = [...(base.overflowActions ?? [])];\n for (const action of actions) {\n const descriptor = toDescriptor(action, triggerAction);\n switch (action.slot ?? \"sidebar-only\") {\n case \"primary\":\n if (primary == null) primary = descriptor;\n else overflow.push(descriptor);\n break;\n case \"secondary\":\n if (secondary == null) secondary = descriptor;\n else overflow.push(descriptor);\n break;\n case \"overflow\":\n overflow.push(descriptor);\n break;\n // \"sidebar-only\" is not surfaced in the header.\n }\n }\n return {\n ...base,\n primaryAction: primary,\n secondaryAction: secondary,\n overflowActions: overflow.length > 0 ? overflow : undefined,\n };\n }, [base, actions, triggerAction]);\n}\n\nfunction toDescriptor(\n raw: PluginDetailContextItem,\n triggerAction: (actionId: string) => void,\n): ActionDescriptor {\n const onClick =\n raw.href != null\n ? undefined\n : raw.onClick ?? (raw.actionId ? () => triggerAction(raw.actionId!) : undefined);\n return {\n id: raw.id,\n label: raw.label,\n icon: raw.icon,\n href: raw.href,\n onClick,\n disabled: raw.disabled,\n danger: raw.variant === \"danger\",\n children: raw.children?.map((child) => toDescriptor(child, triggerAction)),\n };\n}\n","import type { Breadcrumb, RouteMeta, RouteMetaEntry } from \"./pageHeaderTypes\";\n\n/** Synthesised root crumb — mirrors the monolith's virtual `{ pattern: \"/\", label: \"Home\" }`. */\nconst HOME_CRUMB: Breadcrumb = { label: \"Home\", href: \"/\" };\n\nfunction stripTrailingSlash(value: string): string {\n return value.length > 1 && value.endsWith(\"/\") ? value.slice(0, -1) : value;\n}\n\n/**\n * Orders routes most-specific first: more segments win, then at equal depth prefer\n * literal segments over `:param` ones — identical to the monolith's `SORTED_ROUTE_META`.\n */\nexport function sortBySpecificity(routeMeta: RouteMeta): RouteMetaEntry[] {\n return [...routeMeta].sort((a, b) => {\n const aDepth = a.pattern.split(\"/\").length;\n const bDepth = b.pattern.split(\"/\").length;\n if (bDepth !== aDepth) {\n return bDepth - aDepth;\n }\n const aDynamic = (a.pattern.match(/:/g) ?? []).length;\n const bDynamic = (b.pattern.match(/:/g) ?? []).length;\n return aDynamic - bDynamic;\n });\n}\n\n/**\n * Matches a pathname against the sorted routes segment-by-segment, capturing\n * `:param` values. Returns the first (most-specific) match, or `null`. Port of the\n * monolith's `matchRoute`.\n */\nexport function matchRoute(\n pathname: string,\n sorted: RouteMetaEntry[],\n): { entry: RouteMetaEntry; params: Record<string, string> } | null {\n const pathSegments = stripTrailingSlash(pathname).split(\"/\");\n for (const entry of sorted) {\n const patternSegments = entry.pattern.split(\"/\");\n if (patternSegments.length !== pathSegments.length) {\n continue;\n }\n const params: Record<string, string> = {};\n let matched = true;\n for (let i = 0; i < patternSegments.length; i++) {\n const pSeg = patternSegments[i];\n const vSeg = pathSegments[i];\n if (pSeg.startsWith(\":\")) {\n params[pSeg.slice(1)] = vSeg;\n } else if (pSeg !== vSeg) {\n matched = false;\n break;\n }\n }\n if (matched) {\n return { entry, params };\n }\n }\n return null;\n}\n\n/**\n * Replaces `:param` segments in a pattern with captured values. Port of\n * `resolvePattern`. The param-name class matches the identifiers `matchRoute`\n * captures (letters/digits/underscore, e.g. `:user_id`, `:id2`); when a value is\n * missing the original `:param` token is preserved rather than dropping the colon.\n */\nfunction resolvePattern(pattern: string, params: Record<string, string>): string {\n return pattern.replace(/:([A-Za-z0-9_]+)/g, (_, name: string) => params[name] ?? `:${name}`);\n}\n\n/**\n * Builds the `Home / … / <page>` breadcrumb trail — a faithful port of the\n * monolith's `buildBreadcrumbs`. Matches the current path against the `routeMeta`\n * patterns (most-specific wins), walks the `parent` chain, prepends Home, and maps\n * each ancestor to its resolved-pattern href (the current page gets no href). The\n * app/module crumb (e.g. \"Finance\") is just the top-level `routeMeta` entry — no\n * separate config, exactly like the monolith's `/finance` root entry.\n */\nexport function buildBreadcrumbs(pathname: string, routeMeta: RouteMeta): Breadcrumb[] {\n const match = matchRoute(pathname, sortBySpecificity(routeMeta));\n if (match == null) {\n return [HOME_CRUMB];\n }\n\n const { entry: current, params } = match;\n\n // Walk the parent chain (leaf → root), guarding against cycles.\n const chain: RouteMetaEntry[] = [current];\n const seen = new Set<string>([current.pattern]);\n let node = current;\n while (node.parent != null) {\n const parent = routeMeta.find((e) => e.pattern === node.parent);\n if (parent == null || seen.has(parent.pattern)) {\n break;\n }\n seen.add(parent.pattern);\n chain.unshift(parent);\n node = parent;\n }\n\n const crumbs: Breadcrumb[] = [HOME_CRUMB];\n chain.forEach((entry, index) => {\n const isLast = index === chain.length - 1;\n crumbs.push(isLast ? { label: entry.label } : { label: entry.label, href: resolvePattern(entry.pattern, params) });\n });\n return crumbs;\n}\n","import { useMemo, type ReactElement, type ReactNode } from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { PageHeaderContext } from \"./pageHeaderContext\";\nimport { SidebarActionProvider } from \"./sidebarAction\";\nimport { buildBreadcrumbs } from \"./breadcrumbs\";\nimport { PageHeader } from \"./PageHeader\";\nimport { usePageHeader } from \"./usePageHeader\";\nimport type {\n HeaderDetailContext,\n HeaderMenuItem,\n PageHeaderState,\n RouteMeta,\n} from \"./pageHeaderTypes\";\n\n/**\n * Default detail-context resolver: no detail context. Kept as a stable named hook\n * so `PageHeaderProvider` can call the resolver UNCONDITIONALLY (a hook can't be\n * called behind a runtime branch), whether or not a plugin supplied one.\n */\nfunction useNoDetailContext(): HeaderDetailContext | null {\n return null;\n}\n\n/**\n * The wrapper-rendered header. Mounted by `PageHeaderProvider` ONLY when the\n * plugin's `useDetailContext` resolver returns a context for the active route.\n *\n * This is the plugin equivalent of a monolith NESTED-LAYOUT ROUTE — a layout that\n * renders one shared `<PageHeader>` above the `<Outlet>` for a set of content-only\n * sub-pages (e.g. a project/ticket detail subtree). A PlatformReact plugin has no\n * router outlet (each page is its own bundle), so the page-definer wrapper is the\n * only shared seam: the resolver says \"these routes have no self-rendered header,\n * here's their shared header context\" and this renders it. Reads the same\n * `usePageHeader` a self-rendering page would, so title/subtitle/CTAs are derived\n * identically; the resolver's context is already folded into the provider state.\n */\nfunction ChromeHeader(): ReactElement {\n return <PageHeader {...usePageHeader()} />;\n}\n\nexport interface PageHeaderProviderProps {\n /**\n * The plugin's menu-item config — a faithful slice of the monolith's\n * `menuConfig.ts`. The provider matches the active route against each item's\n * `href` (pre-order, so a parent list item wins over its own overview child)\n * and publishes the match so `usePageHeader` can surface its `actions`.\n */\n config: HeaderMenuItem[];\n /**\n * The plugin's breadcrumb metadata — a faithful slice of the monolith's\n * `routeMeta.ts` (`{ pattern, label, parent }[]`, re-rooted). The provider derives\n * the full `Home / … / <Page>` trail per route via `buildBreadcrumbs`, exactly like\n * the monolith. The app/module crumb (e.g. \"Finance\") is just its top-level entry.\n * Omit for no breadcrumbs.\n */\n routeMeta?: RouteMeta;\n /** Optional detail-context override for detail/edit routes with no menu item. */\n detailContext?: HeaderDetailContext | null;\n /**\n * Optional per-route detail-context RESOLVER hook. Called every render; when it\n * returns a context, the provider (a) folds it into the header state AND (b)\n * renders the header ITSELF (`<ChromeHeader>`) above the page — for detail\n * routes whose migrated page renders no `<PageHeader>` of its own. Returns\n * `null` for routes the page already headers (list/create/edit self-render), so\n * chrome never double-renders. Takes precedence over the static `detailContext`.\n */\n useDetailContext?: () => HeaderDetailContext | null;\n children: ReactNode;\n}\n\n/**\n * Plugin analogue of the monolith shell's `SubMenuPropsContext` provider: mounted\n * once at the plugin's router root, it resolves the active menu item from the\n * current route (feeding `usePageHeader`'s title + CTAs) and derives the breadcrumb\n * trail from `routeMeta`. Also mounts the `SidebarActionProvider` so `actionId`\n * header CTAs can dispatch to page-registered handlers.\n *\n * In a plugin this feeds the in-body `PageHeader` that migrated pages render —\n * which IS the surface header (the host suppresses its own chrome for\n * platform-react surfaces).\n */\nexport function PageHeaderProvider({\n config,\n routeMeta,\n detailContext,\n useDetailContext = useNoDetailContext,\n children,\n}: PageHeaderProviderProps) {\n const { pathname } = useLocation();\n // Resolve the active detail context. The resolver hook is ALWAYS called (the\n // default is a stable no-op) so hook order stays stable. When a resolver was\n // actually supplied it is AUTHORITATIVE: its result wins — including `null`,\n // which means \"suppress chrome for this route\" and must NOT fall back to the\n // static prop. The static `detailContext` is only the fallback when no resolver\n // was passed (the legacy direct-provider API).\n const resolvedFromResolver = useDetailContext();\n const resolvedDetailContext =\n useDetailContext === useNoDetailContext ? detailContext ?? null : resolvedFromResolver;\n\n const state = useMemo<PageHeaderState>(() => {\n const activeMenuItem = findByHref(config, normalise(pathname));\n const breadcrumbs = routeMeta != null ? buildBreadcrumbs(pathname, routeMeta) : undefined;\n // Default the in-body title to the breadcrumb LEAF label (the current route's\n // `routeMeta` label) so EVERY routed page shows a title — not just the ones that\n // happen to carry a menu item (list pages with CTAs). Only a real trail (Home +\n // ≥1 crumb) yields a leaf; a bare `[Home]` (no route match) leaves title unset so\n // the header stays chrome-only. A page hook can still override via its own\n // headerProps (e.g. a detail page swapping in the entity name).\n const title =\n breadcrumbs != null && breadcrumbs.length >= 2\n ? breadcrumbs[breadcrumbs.length - 1].label\n : undefined;\n return { activeMenuItem, detailContext: resolvedDetailContext, breadcrumbs, title };\n }, [config, routeMeta, pathname, resolvedDetailContext]);\n\n return (\n <SidebarActionProvider>\n <PageHeaderContext.Provider value={state}>\n {resolvedDetailContext != null ? <ChromeHeader /> : null}\n {children}\n </PageHeaderContext.Provider>\n </SidebarActionProvider>\n );\n}\n\n/**\n * Ready-made page wrapper for the PlatformReact page-definer's `wrapPage` option:\n * `withPageHeader(config, routeMeta, useDetailContext?)` returns\n * `(page) => <PageHeaderProvider …>{page}</PageHeaderProvider>`.\n *\n * Pass the optional `useDetailContext` resolver to have the provider render a\n * shared header for detail routes whose page renders none of its own (see\n * {@link PageHeaderProviderProps.useDetailContext}); omit it for the original\n * behaviour (provider supplies context only, each page self-renders `<PageHeader>`).\n *\n * Kept here — the same module as `PageHeaderProvider` and `usePageHeader` — on\n * purpose: the provider and the hook must resolve to ONE `PageHeaderContext`\n * instance, which only holds when both come from this `components/layout` entry.\n * (A bundler inlines a separate context copy into each entry, so wrapping from the\n * `platform-react` entry would give the provider a different context than the\n * hook — the header would render empty.) A plugin passes\n * `wrapPage: withPageHeader(<feature>MenuConfig, <feature>RouteMeta)`\n * (optionally a third resolver arg) to `createPluginPageDefiner`.\n */\nexport function withPageHeader(\n config: HeaderMenuItem[],\n routeMeta?: RouteMeta,\n useDetailContext?: () => HeaderDetailContext | null,\n): (page: ReactElement) => ReactElement {\n return (page) => (\n <PageHeaderProvider config={config} routeMeta={routeMeta} useDetailContext={useDetailContext}>\n {page}\n </PageHeaderProvider>\n );\n}\n\n/** Strip a trailing slash (except root) so `/x/` and `/x` match the same item. */\nfunction normalise(pathname: string): string {\n return pathname.length > 1 && pathname.endsWith(\"/\") ? pathname.slice(0, -1) : pathname;\n}\n\n/**\n * Pre-order search for the item whose `href` exactly matches `pathname`. Pre-order\n * means a parent list item (which carries the `actions`) is returned before its\n * own same-href overview child, so the CTA surfaces on the list route.\n */\nfunction findByHref(items: HeaderMenuItem[], pathname: string): HeaderMenuItem | null {\n for (const item of items) {\n if (item.href != null && normalise(item.href) === pathname) {\n return item;\n }\n if (item.children) {\n const nested = findByHref(item.children, pathname);\n if (nested) {\n return nested;\n }\n }\n }\n return null;\n}\n"]}