@omnitron-dev/prism 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +68 -2
- package/THIRD-PARTY-NOTICES.txt +26 -0
- package/dist/accessibility/index.js +2 -0
- package/dist/accessibility/index.js.map +1 -1
- package/dist/auth/index.d.ts +4 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +4 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/blocks/auth-block/guards.d.ts +3 -2
- package/dist/blocks/auth-block/guards.d.ts.map +1 -1
- package/dist/blocks/dashboard-block/dashboard-block.d.ts.map +1 -1
- package/dist/blocks/dashboard-block/types.d.ts +4 -2
- package/dist/blocks/dashboard-block/types.d.ts.map +1 -1
- package/dist/blocks/dashboard-block/use-dashboard-block.d.ts +2 -2
- package/dist/blocks/dashboard-block/use-dashboard-block.d.ts.map +1 -1
- package/dist/blocks/data-grid-block/data-grid-block.d.ts.map +1 -1
- package/dist/blocks/data-grid-block/types.d.ts +3 -0
- package/dist/blocks/data-grid-block/types.d.ts.map +1 -1
- package/dist/blocks/index.js +80 -255
- package/dist/blocks/index.js.map +1 -1
- package/dist/chunk-2AB7VGPW.js +447 -0
- package/dist/chunk-2AB7VGPW.js.map +1 -0
- package/dist/{chunk-LOY2NPCO.js → chunk-2E67PQ4T.js} +3 -3
- package/dist/{chunk-LOY2NPCO.js.map → chunk-2E67PQ4T.js.map} +1 -1
- package/dist/chunk-2KG2NI73.js +84 -0
- package/dist/chunk-2KG2NI73.js.map +1 -0
- package/dist/chunk-2UYRW6X3.js +44 -0
- package/dist/chunk-2UYRW6X3.js.map +1 -0
- package/dist/chunk-36C5H56C.js +208 -0
- package/dist/chunk-36C5H56C.js.map +1 -0
- package/dist/chunk-36FOXX25.js +73 -0
- package/dist/chunk-36FOXX25.js.map +1 -0
- package/dist/{chunk-52PQL67Q.js → chunk-3VSM7NZG.js} +18 -15
- package/dist/chunk-3VSM7NZG.js.map +1 -0
- package/dist/{chunk-GUGTDURV.js → chunk-4B2LTPK2.js} +2 -2
- package/dist/{chunk-GUGTDURV.js.map → chunk-4B2LTPK2.js.map} +1 -1
- package/dist/chunk-4HUGZJKU.js +108 -0
- package/dist/chunk-4HUGZJKU.js.map +1 -0
- package/dist/{chunk-PXXPLHIY.js → chunk-4Q5L7LDG.js} +3 -3
- package/dist/{chunk-PXXPLHIY.js.map → chunk-4Q5L7LDG.js.map} +1 -1
- package/dist/{chunk-BRDWQVRT.js → chunk-4R7EZ7GQ.js} +3 -2
- package/dist/chunk-4R7EZ7GQ.js.map +1 -0
- package/dist/chunk-6IANOSMD.js +185 -0
- package/dist/chunk-6IANOSMD.js.map +1 -0
- package/dist/{chunk-YHE7HXSG.js → chunk-7ATBURW2.js} +3 -3
- package/dist/{chunk-YHE7HXSG.js.map → chunk-7ATBURW2.js.map} +1 -1
- package/dist/{chunk-7G5D5PTC.js → chunk-AATAOOSF.js} +4 -4
- package/dist/{chunk-7G5D5PTC.js.map → chunk-AATAOOSF.js.map} +1 -1
- package/dist/chunk-AKLRKCYH.js +128 -0
- package/dist/chunk-AKLRKCYH.js.map +1 -0
- package/dist/chunk-CT46KJOR.js +133 -0
- package/dist/chunk-CT46KJOR.js.map +1 -0
- package/dist/{chunk-LSPFFEJT.js → chunk-D4GFAJAZ.js} +298 -3900
- package/dist/chunk-D4GFAJAZ.js.map +1 -0
- package/dist/{chunk-BJE2AKD4.js → chunk-D5J3KW6Q.js} +3 -2
- package/dist/chunk-D5J3KW6Q.js.map +1 -0
- package/dist/chunk-DEPJRTVT.js +3 -0
- package/dist/{chunk-FU52GL2E.js.map → chunk-DEPJRTVT.js.map} +1 -1
- package/dist/{chunk-472SOF76.js → chunk-DHTYHUYI.js} +85 -107
- package/dist/chunk-DHTYHUYI.js.map +1 -0
- package/dist/{chunk-FF5RF32O.js → chunk-E7WM2RXA.js} +3 -2
- package/dist/chunk-E7WM2RXA.js.map +1 -0
- package/dist/chunk-F6RZ7LW6.js +1271 -0
- package/dist/chunk-F6RZ7LW6.js.map +1 -0
- package/dist/chunk-FOGY3HA4.js +217 -0
- package/dist/chunk-FOGY3HA4.js.map +1 -0
- package/dist/chunk-G2GANYMW.js +139 -0
- package/dist/chunk-G2GANYMW.js.map +1 -0
- package/dist/chunk-I6DILPFE.js +293 -0
- package/dist/chunk-I6DILPFE.js.map +1 -0
- package/dist/{chunk-HOXFSQUV.js → chunk-IRYU3NTG.js} +2 -2
- package/dist/{chunk-HOXFSQUV.js.map → chunk-IRYU3NTG.js.map} +1 -1
- package/dist/chunk-JTIUGPW5.js +284 -0
- package/dist/chunk-JTIUGPW5.js.map +1 -0
- package/dist/{chunk-GUFHFEPZ.js → chunk-JZBSPDED.js} +2 -2
- package/dist/{chunk-GUFHFEPZ.js.map → chunk-JZBSPDED.js.map} +1 -1
- package/dist/{chunk-PFT2BNYO.js → chunk-KPY7TA4D.js} +5 -5
- package/dist/{chunk-PFT2BNYO.js.map → chunk-KPY7TA4D.js.map} +1 -1
- package/dist/{chunk-GMIE6III.js → chunk-LFWKGNCX.js} +50 -623
- package/dist/chunk-LFWKGNCX.js.map +1 -0
- package/dist/chunk-LH4ZZZYB.js +37 -0
- package/dist/chunk-LH4ZZZYB.js.map +1 -0
- package/dist/chunk-NFJ7CPG3.js +13 -0
- package/dist/chunk-NFJ7CPG3.js.map +1 -0
- package/dist/chunk-NFPOIHD4.js +3 -0
- package/dist/{chunk-JSQTYDPG.js.map → chunk-NFPOIHD4.js.map} +1 -1
- package/dist/{chunk-XIXSSI3B.js → chunk-NJM5AVBM.js} +3 -2
- package/dist/chunk-NJM5AVBM.js.map +1 -0
- package/dist/{chunk-4Z5DE5GK.js → chunk-NSNM53WI.js} +133 -115
- package/dist/chunk-NSNM53WI.js.map +1 -0
- package/dist/chunk-NTREGTG7.js +31 -0
- package/dist/chunk-NTREGTG7.js.map +1 -0
- package/dist/{chunk-ADG4HZEP.js → chunk-OKJA6SJM.js} +4 -4
- package/dist/chunk-OKJA6SJM.js.map +1 -0
- package/dist/{chunk-SU3LVQ7N.js → chunk-Q6JDNFSG.js} +11 -226
- package/dist/chunk-Q6JDNFSG.js.map +1 -0
- package/dist/chunk-RPOGINR5.js +115 -0
- package/dist/chunk-RPOGINR5.js.map +1 -0
- package/dist/{chunk-KQ67XB6T.js → chunk-RSWVYIXK.js} +151 -114
- package/dist/chunk-RSWVYIXK.js.map +1 -0
- package/dist/chunk-SSEHL5VP.js +110 -0
- package/dist/chunk-SSEHL5VP.js.map +1 -0
- package/dist/chunk-TEIGUOWN.js +523 -0
- package/dist/chunk-TEIGUOWN.js.map +1 -0
- package/dist/{chunk-AYYFMTMI.js → chunk-TJ7DHXUX.js} +2 -2
- package/dist/{chunk-AYYFMTMI.js.map → chunk-TJ7DHXUX.js.map} +1 -1
- package/dist/{chunk-75FQ5IW3.js → chunk-TZHWYT34.js} +3 -3
- package/dist/{chunk-75FQ5IW3.js.map → chunk-TZHWYT34.js.map} +1 -1
- package/dist/chunk-TZWHELY4.js +45 -0
- package/dist/chunk-TZWHELY4.js.map +1 -0
- package/dist/{chunk-OKTLA23Q.js → chunk-UEINJFLS.js} +6 -6
- package/dist/chunk-UEINJFLS.js.map +1 -0
- package/dist/chunk-URFQX3I6.js +129 -0
- package/dist/chunk-URFQX3I6.js.map +1 -0
- package/dist/chunk-VG6FOMOH.js +187 -0
- package/dist/chunk-VG6FOMOH.js.map +1 -0
- package/dist/{chunk-PGHEP4JD.js → chunk-VQVVHMPG.js} +3 -3
- package/dist/{chunk-PGHEP4JD.js.map → chunk-VQVVHMPG.js.map} +1 -1
- package/dist/{chunk-DRFNMZLG.js → chunk-VUKOT432.js} +3 -2
- package/dist/chunk-VUKOT432.js.map +1 -0
- package/dist/chunk-WD4N72DL.js +315 -0
- package/dist/chunk-WD4N72DL.js.map +1 -0
- package/dist/chunk-XBYMG4QK.js +119 -0
- package/dist/chunk-XBYMG4QK.js.map +1 -0
- package/dist/chunk-YHM6GIHV.js +3 -0
- package/dist/chunk-YHM6GIHV.js.map +1 -0
- package/dist/{chunk-SNZK5X6F.js → chunk-Z2AN43YU.js} +4 -2
- package/dist/chunk-Z2AN43YU.js.map +1 -0
- package/dist/chunk-ZNWHMQRM.js +171 -0
- package/dist/chunk-ZNWHMQRM.js.map +1 -0
- package/dist/{chunk-YSIG2XYH.js → chunk-ZRJYQN6Y.js} +2 -2
- package/dist/{chunk-YSIG2XYH.js.map → chunk-ZRJYQN6Y.js.map} +1 -1
- package/dist/{chunk-AD4W7HYC.js → chunk-ZYI3MHLE.js} +3 -2
- package/dist/chunk-ZYI3MHLE.js.map +1 -0
- package/dist/cli/index.js +59 -421
- package/dist/cli/index.js.map +1 -1
- package/dist/components/admin-filters/admin-data-table.d.ts +7 -1
- package/dist/components/admin-filters/admin-data-table.d.ts.map +1 -1
- package/dist/components/admin-filters/filter-toolbar.d.ts.map +1 -1
- package/dist/components/admin-filters/index.js +8 -0
- package/dist/components/admin-filters/index.js.map +1 -0
- package/dist/components/alert/alert.d.ts.map +1 -1
- package/dist/components/alert/index.js +5 -0
- package/dist/components/alert/index.js.map +1 -0
- package/dist/components/animate/index.js +5 -0
- package/dist/components/animate/index.js.map +1 -0
- package/dist/components/breadcrumbs/breadcrumbs.d.ts.map +1 -1
- package/dist/components/breadcrumbs/index.js +4 -0
- package/dist/components/breadcrumbs/index.js.map +1 -0
- package/dist/components/card/index.js +4 -0
- package/dist/components/card/index.js.map +1 -0
- package/dist/components/chart/chart.d.ts.map +1 -1
- package/dist/components/chart/index.css +52 -0
- package/dist/components/chart/index.css.map +1 -0
- package/dist/components/chart/index.js +5 -0
- package/dist/components/chart/index.js.map +1 -0
- package/dist/components/chart/types.d.ts +3 -1
- package/dist/components/chart/types.d.ts.map +1 -1
- package/dist/components/chart/use-chart.d.ts.map +1 -1
- package/dist/components/command-palette/command-palette.d.ts +3 -1
- package/dist/components/command-palette/command-palette.d.ts.map +1 -1
- package/dist/components/command-palette/index.js +4 -0
- package/dist/components/command-palette/index.js.map +1 -0
- package/dist/components/confirm-dialog/index.js +4 -0
- package/dist/components/confirm-dialog/index.js.map +1 -0
- package/dist/components/date-input/date-input.d.ts +1 -0
- package/dist/components/date-input/date-input.d.ts.map +1 -1
- package/dist/components/date-input/index.d.ts +0 -1
- package/dist/components/date-input/index.d.ts.map +1 -1
- package/dist/components/doc-layout/index.js +5 -4
- package/dist/components/doc-layout/index.js.map +1 -1
- package/dist/components/editor/index.js +4 -3
- package/dist/components/editor/index.js.map +1 -1
- package/dist/components/emoji-picker/index.js +2 -1
- package/dist/components/emoji-picker/index.js.map +1 -1
- package/dist/components/empty-content/empty-content.d.ts.map +1 -1
- package/dist/components/empty-content/index.js +4 -0
- package/dist/components/empty-content/index.js.map +1 -0
- package/dist/components/error-boundary/index.js +6 -0
- package/dist/components/error-boundary/index.js.map +1 -0
- package/dist/components/index.css +13 -10
- package/dist/components/index.css.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +47 -21
- package/dist/components/index.js.map +1 -1
- package/dist/components/knowledge-graph/edge-labels.d.ts.map +1 -1
- package/dist/components/knowledge-graph/index.js +18 -16
- package/dist/components/knowledge-graph/index.js.map +1 -1
- package/dist/components/label/index.js +5 -0
- package/dist/components/label/index.js.map +1 -0
- package/dist/components/label/label.d.ts.map +1 -1
- package/dist/components/loading-screen/index.js +4 -0
- package/dist/components/loading-screen/index.js.map +1 -0
- package/dist/components/map/MapPointPicker.d.ts.map +1 -1
- package/dist/components/map/index.js +2 -1
- package/dist/components/map/index.js.map +1 -1
- package/dist/components/navigation-progress/index.js +4 -0
- package/dist/components/navigation-progress/index.js.map +1 -0
- package/dist/components/page-content/index.js +4 -0
- package/dist/components/page-content/index.js.map +1 -0
- package/dist/components/popover/index.js +4 -0
- package/dist/components/popover/index.js.map +1 -0
- package/dist/components/research/diagram.d.ts.map +1 -1
- package/dist/components/research/index.js +6 -4
- package/dist/components/research/index.js.map +1 -1
- package/dist/components/research-editor/extensions.d.ts +1 -1
- package/dist/components/research-editor/index.js +11 -10
- package/dist/components/research-editor/index.js.map +1 -1
- package/dist/components/research-editor/math-navigation.d.ts +2 -2
- package/dist/components/research-editor/math-navigation.d.ts.map +1 -1
- package/dist/components/scroll-to-top/index.js +4 -0
- package/dist/components/scroll-to-top/index.js.map +1 -0
- package/dist/components/search-input/index.js +7 -0
- package/dist/components/search-input/index.js.map +1 -0
- package/dist/components/search-input/search-input.d.ts +3 -1
- package/dist/components/search-input/search-input.d.ts.map +1 -1
- package/dist/components/skeleton/index.js +4 -0
- package/dist/components/skeleton/index.js.map +1 -0
- package/dist/components/snackbar/index.js +6 -0
- package/dist/components/snackbar/index.js.map +1 -0
- package/dist/components/stepper/index.js +4 -0
- package/dist/components/stepper/index.js.map +1 -0
- package/dist/components/table/index.d.ts +1 -0
- package/dist/components/table/index.d.ts.map +1 -1
- package/dist/components/table/index.js +5 -0
- package/dist/components/table/index.js.map +1 -0
- package/dist/components/table/table-viewport.d.ts +13 -0
- package/dist/components/table/table-viewport.d.ts.map +1 -0
- package/dist/components/table/table.d.ts +3 -1
- package/dist/components/table/table.d.ts.map +1 -1
- package/dist/components/tabs/index.js +6 -0
- package/dist/components/tabs/index.js.map +1 -0
- package/dist/components/tabs/tabs.d.ts +12 -1
- package/dist/components/tabs/tabs.d.ts.map +1 -1
- package/dist/core/index.js +12 -10
- package/dist/core/index.js.map +1 -1
- package/dist/forms/index.js +2 -0
- package/dist/forms/index.js.map +1 -1
- package/dist/hooks/index.js +14 -12
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/use-config-from-query.d.ts +2 -0
- package/dist/hooks/use-config-from-query.d.ts.map +1 -1
- package/dist/hooks/use-image-dimensions.d.ts.map +1 -1
- package/dist/hooks/use-keyboard-shortcut.d.ts.map +1 -1
- package/dist/hooks/use-scroll-position.d.ts.map +1 -1
- package/dist/hooks/use-window-size.d.ts.map +1 -1
- package/dist/icons/context.d.ts.map +1 -1
- package/dist/icons/index.js +3 -2
- package/dist/icons/index.js.map +1 -1
- package/dist/index.css +13 -10
- package/dist/index.css.map +1 -1
- package/dist/index.js +57 -31
- package/dist/index.js.map +1 -1
- package/dist/internal/research-parser.js +3 -0
- package/dist/internal/research-parser.js.map +1 -0
- package/dist/layouts/core/header-section.d.ts +1 -0
- package/dist/layouts/core/header-section.d.ts.map +1 -1
- package/dist/layouts/dashboard/layout.d.ts +3 -1
- package/dist/layouts/dashboard/layout.d.ts.map +1 -1
- package/dist/layouts/dashboard/sidenav.d.ts.map +1 -1
- package/dist/layouts/index.js +9 -8
- package/dist/layouts/index.js.map +1 -1
- package/dist/netron/index.js +2 -1
- package/dist/netron/index.js.map +1 -1
- package/dist/registry/index.js +1 -1
- package/dist/state/create-store.d.ts.map +1 -1
- package/dist/state/index.js +3 -2
- package/dist/state/index.js.map +1 -1
- package/dist/state/settings-version.d.ts.map +1 -1
- package/dist/theme/components/Chip.d.ts.map +1 -1
- package/dist/theme/components/Dialog.d.ts.map +1 -1
- package/dist/theme/components/TextField.d.ts.map +1 -1
- package/dist/theme/components/index.d.ts.map +1 -1
- package/dist/theme/components/theme-utils.d.ts +2 -2
- package/dist/theme/components/theme-utils.d.ts.map +1 -1
- package/dist/theme/index.js +8 -6
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/palette/overrides.d.ts +1 -0
- package/dist/theme/palette/overrides.d.ts.map +1 -1
- package/dist/theme/semantic-surface.d.ts +8 -0
- package/dist/theme/semantic-surface.d.ts.map +1 -0
- package/dist/types/index.js +2 -2
- package/dist/ui/index.js +6 -5
- package/dist/ui/index.js.map +1 -1
- package/dist/utils/async-lock.d.ts.map +1 -1
- package/package.json +143 -37
- package/dist/chunk-472SOF76.js.map +0 -1
- package/dist/chunk-4Z5DE5GK.js.map +0 -1
- package/dist/chunk-52PQL67Q.js.map +0 -1
- package/dist/chunk-AD4W7HYC.js.map +0 -1
- package/dist/chunk-ADG4HZEP.js.map +0 -1
- package/dist/chunk-BJE2AKD4.js.map +0 -1
- package/dist/chunk-BRDWQVRT.js.map +0 -1
- package/dist/chunk-DRFNMZLG.js.map +0 -1
- package/dist/chunk-FF5RF32O.js.map +0 -1
- package/dist/chunk-FU52GL2E.js +0 -3
- package/dist/chunk-GMIE6III.js.map +0 -1
- package/dist/chunk-JSQTYDPG.js +0 -3
- package/dist/chunk-KQ67XB6T.js.map +0 -1
- package/dist/chunk-LSPFFEJT.js.map +0 -1
- package/dist/chunk-OKTLA23Q.js.map +0 -1
- package/dist/chunk-SNZK5X6F.js.map +0 -1
- package/dist/chunk-SU3LVQ7N.js.map +0 -1
- package/dist/chunk-XIXSSI3B.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/theme/utils/color.ts","../src/theme/mixins.ts"],"names":["base","hover"],"mappings":"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","file":"chunk-HOXFSQUV.js","sourcesContent":["/**\n * Color Utilities\n *\n * Functions for color manipulation, channel generation, and palette creation.\n * Uses HSL-based color math for perceptually correct results.\n * Combines Aurora's sophisticated color system with Prism's extensibility.\n *\n * @module theme/utils/color\n */\n\nimport type {\n ColorScale,\n ColorScaleWithChannels,\n ColorShadeKey,\n PaletteColor,\n PaletteColorWithChannels,\n} from '../../types/theme.js';\n\n// =============================================================================\n// COLOR CONVERSION\n// =============================================================================\n\n/**\n * Convert hex color to RGB values.\n *\n * @param hex - Hex color string (e.g., '#FF5630' or 'FF5630')\n * @returns RGB tuple [r, g, b]\n */\nexport function hexToRgb(hex: string): [number, number, number] {\n const h = hex.replace('#', '');\n const expanded =\n h.length === 3\n ? h\n .split('')\n .map((c) => c + c)\n .join('')\n : h;\n const bigint = parseInt(expanded, 16);\n const r = (bigint >> 16) & 255;\n const g = (bigint >> 8) & 255;\n const b = bigint & 255;\n return [r, g, b];\n}\n\n/**\n * Convert hex color to RGB channel string.\n *\n * @param hex - Hex color string\n * @returns RGB channel string (e.g., '255 86 48')\n */\nexport function hexToRgbChannel(hex: string): string {\n const [r, g, b] = hexToRgb(hex);\n return `${r} ${g} ${b}`;\n}\n\n/**\n * Convert RGB values to hex color.\n *\n * @param r - Red (0-255)\n * @param g - Green (0-255)\n * @param b - Blue (0-255)\n * @returns Hex color string (e.g., '#FF5630')\n */\nexport function rgbToHex(r: number, g: number, b: number): string {\n const to2 = (n: number) => Math.round(n).toString(16).padStart(2, '0');\n return `#${to2(r)}${to2(g)}${to2(b)}`.toUpperCase();\n}\n\n/**\n * Convert hex to HSL values.\n *\n * @param hex - Hex color string\n * @returns HSL values { h: 0-360, s: 0-100, l: 0-100 }\n */\nexport function hexToHsl(hex: string): { h: number; s: number; l: number } {\n const [r, g, b] = hexToRgb(hex);\n const r1 = r / 255;\n const g1 = g / 255;\n const b1 = b / 255;\n const max = Math.max(r1, g1, b1);\n const min = Math.min(r1, g1, b1);\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n const d = max - min;\n\n if (d !== 0) {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r1:\n h = (g1 - b1) / d + (g1 < b1 ? 6 : 0);\n break;\n case g1:\n h = (b1 - r1) / d + 2;\n break;\n default:\n h = (r1 - g1) / d + 4;\n }\n h /= 6;\n }\n\n return { h: h * 360, s: s * 100, l: l * 100 };\n}\n\n/**\n * Convert HSL values to hex color.\n *\n * @param h - Hue (0-360)\n * @param s - Saturation (0-100)\n * @param l - Lightness (0-100)\n * @returns Hex color string\n */\nexport function hslToHex(h: number, s: number, l: number): string {\n const s1 = s / 100;\n const l1 = l / 100;\n const c = (1 - Math.abs(2 * l1 - 1)) * s1;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = l1 - c / 2;\n let r1: number;\n let g1: number;\n let b1: number;\n\n if (h >= 0 && h < 60) {\n [r1, g1, b1] = [c, x, 0];\n } else if (h >= 60 && h < 120) {\n [r1, g1, b1] = [x, c, 0];\n } else if (h >= 120 && h < 180) {\n [r1, g1, b1] = [0, c, x];\n } else if (h >= 180 && h < 240) {\n [r1, g1, b1] = [0, x, c];\n } else if (h >= 240 && h < 300) {\n [r1, g1, b1] = [x, 0, c];\n } else {\n [r1, g1, b1] = [c, 0, x];\n }\n\n return rgbToHex(Math.round((r1 + m) * 255), Math.round((g1 + m) * 255), Math.round((b1 + m) * 255));\n}\n\n// =============================================================================\n// RGBA UTILITIES\n// =============================================================================\n\n/**\n * Create CSS rgba() from hex color.\n *\n * @param color - Hex color string\n * @param alpha - Alpha value (0-1)\n * @returns CSS rgba string\n */\nexport function rgba(color: string, alpha: number): string {\n const [r, g, b] = hexToRgb(color);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\n/**\n * Create CSS rgba() from RGB channel string.\n * Useful for CSS variable references.\n *\n * @param channel - RGB channel string (e.g., '255 86 48')\n * @param alpha - Alpha value (0-1)\n * @returns CSS rgba string using modern syntax\n */\nexport function cssVarRgba(channel: string, alpha: number): string {\n return `rgba(${channel} / ${alpha})`;\n}\n\n// =============================================================================\n// CHANNEL GENERATION\n// =============================================================================\n\n/**\n * Generate palette color with channel values.\n *\n * @param color - Palette color object\n * @returns Palette color with channel values\n */\nexport function generatePaletteColorWithChannels(color: PaletteColor): PaletteColorWithChannels {\n return {\n ...color,\n lighterChannel: hexToRgbChannel(color.lighter),\n lightChannel: hexToRgbChannel(color.light),\n mainChannel: hexToRgbChannel(color.main),\n darkChannel: hexToRgbChannel(color.dark),\n darkerChannel: hexToRgbChannel(color.darker),\n contrastTextChannel: hexToRgbChannel(color.contrastText),\n };\n}\n\n/**\n * Generate color scale with channel values.\n *\n * @param scale - Color scale object\n * @returns Color scale with channel values\n */\nexport function generateColorScaleWithChannels(scale: ColorScale): ColorScaleWithChannels {\n const shadeKeys: ColorShadeKey[] = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950];\n const channels = {} as Record<`${ColorShadeKey}Channel`, string>;\n\n for (const key of shadeKeys) {\n const channelKey = `${key}Channel` as `${ColorShadeKey}Channel`;\n channels[channelKey] = hexToRgbChannel(scale[key]);\n }\n\n return { ...scale, ...channels };\n}\n\n// =============================================================================\n// SHADE GENERATION\n// =============================================================================\n\n/**\n * Clamp a number between min and max.\n */\nfunction clamp(n: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, n));\n}\n\n/**\n * Generate 11-shade color scale from a base color.\n * Uses HSL manipulation to create consistent, accessible shades.\n *\n * @param baseColor - Base hex color (typically the 500 shade)\n * @returns Full 11-shade color scale\n */\nexport function generateColorScale(baseColor: string): ColorScale {\n const base = hexToHsl(baseColor);\n\n const tones: Array<{ key: ColorShadeKey; lDelta: number }> = [\n { key: 50, lDelta: +40 },\n { key: 100, lDelta: +32 },\n { key: 200, lDelta: +24 },\n { key: 300, lDelta: +16 },\n { key: 400, lDelta: +8 },\n { key: 500, lDelta: 0 },\n { key: 600, lDelta: -8 },\n { key: 700, lDelta: -16 },\n { key: 800, lDelta: -24 },\n { key: 900, lDelta: -32 },\n { key: 950, lDelta: -40 },\n ];\n\n const scale = {} as ColorScale;\n\n for (const { key, lDelta } of tones) {\n const l = clamp(base.l + lDelta, 5, 95);\n scale[key] = hslToHex(base.h, base.s, l);\n }\n\n return scale;\n}\n\n/**\n * Generate primary color shades from a base color.\n * Alias for generateColorScale for compatibility with Aurora's naming.\n */\nexport const generatePrimaryShades = generateColorScale;\n\n// =============================================================================\n// PALETTE HELPERS\n// =============================================================================\n\n/**\n * Create semantic palette color from a color scale.\n * Maps 11-shade scale to 5-shade semantic naming.\n *\n * @param scale - Full color scale\n * @param mode - Light or dark mode\n * @returns Semantic palette color\n */\nexport function createPaletteColorFromScale(scale: ColorScale, mode: 'light' | 'dark' = 'light'): PaletteColor {\n const mainColor = mode === 'dark' ? scale[400] : scale[500];\n // `getContrastText` measures both candidates instead of switching on a\n // luminance threshold, and reads the colour through `hexToRgb`, which\n // expands a three-digit hex. The threshold version this replaced did\n // neither: it parsed with `match(/.{2}/g)`, so `#fff` produced `NaN`\n // luminance and therefore WHITE text on a WHITE background. `#212121` stays\n // the dark candidate — that tone is the palette's choice, not the\n // threshold's.\n const contrastText = getContrastText(mainColor, '#FFFFFF', '#212121');\n\n if (mode === 'dark') {\n return {\n lighter: scale[950],\n light: scale[700],\n main: mainColor,\n dark: scale[300],\n darker: scale[100],\n contrastText,\n };\n }\n\n return {\n lighter: scale[50],\n light: scale[400],\n main: mainColor,\n dark: scale[600],\n darker: scale[900],\n contrastText,\n };\n}\n\n/**\n * Create inverted color scale for dark mode.\n * Swaps light and dark shades for proper dark mode contrast.\n *\n * @param scale - Original color scale\n * @returns Inverted color scale\n */\nexport function invertColorScale(scale: ColorScale): ColorScale {\n return {\n 50: scale[950],\n 100: scale[800],\n 200: scale[700],\n 300: scale[600],\n 400: scale[500],\n 500: scale[400],\n 600: scale[300],\n 700: scale[200],\n 800: scale[100],\n 900: scale[50],\n 950: '#FFFFFF',\n };\n}\n\n// =============================================================================\n// CONTRAST UTILITIES\n// =============================================================================\n\n/**\n * Calculate relative luminance of a color.\n *\n * @param hex - Hex color string\n * @returns Relative luminance (0-1)\n */\nexport function getLuminance(hex: string): number {\n const [r, g, b] = hexToRgb(hex).map((c) => {\n const sRgb = c / 255;\n return sRgb <= 0.03928 ? sRgb / 12.92 : Math.pow((sRgb + 0.055) / 1.055, 2.4);\n });\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\n/**\n * Calculate contrast ratio between two colors.\n *\n * @param color1 - First hex color\n * @param color2 - Second hex color\n * @returns Contrast ratio (1-21)\n */\nexport function getContrastRatio(color1: string, color2: string): number {\n const l1 = getLuminance(color1);\n const l2 = getLuminance(color2);\n const lighter = Math.max(l1, l2);\n const darker = Math.min(l1, l2);\n return (lighter + 0.05) / (darker + 0.05);\n}\n\n/**\n * Determine if a color is light or dark.\n *\n * @param hex - Hex color string\n * @returns True if color is light\n */\nexport function isLightColor(hex: string): boolean {\n return getLuminance(hex) > 0.5;\n}\n\n/**\n * Get optimal contrast text color for a background.\n *\n * Picks whichever of the two candidates actually contrasts more, rather than\n * switching on a luminance threshold. The threshold version returned white\n * for every colour below 0.5 luminance, which includes the mid-tone brand\n * colours a theme is most likely to use: `#FF5630` scored 3.17 against white\n * and 6.63 against black, and `#00A76F` 3.11 against white and 6.76 against\n * black. Both were handed the worse of the two and both fall below WCAG AA\n * for body text.\n *\n * The measurement is already in this file — `getContrastRatio` sat next to\n * the threshold and went unused.\n *\n * @param background - Background hex color\n * @param lightText - Light text color (default: white)\n * @param darkText - Dark text color (default: black)\n * @returns Whichever candidate contrasts more with `background`\n */\nexport function getContrastText(background: string, lightText = '#FFFFFF', darkText = '#000000'): string {\n return getContrastRatio(background, lightText) >= getContrastRatio(background, darkText)\n ? lightText\n : darkText;\n}\n\n// =============================================================================\n// HSL-BASED COLOR MANIPULATION\n// =============================================================================\n\n/**\n * Lighten a color using HSL.\n * Preserves hue and saturation while increasing lightness.\n *\n * @param hex - Hex color string\n * @param amount - Amount to lighten (0-100 percentage points)\n * @returns Lightened hex color\n */\nexport function lighten(hex: string, amount: number): string {\n const hsl = hexToHsl(hex);\n const newL = clamp(hsl.l + amount, 0, 100);\n return hslToHex(hsl.h, hsl.s, newL);\n}\n\n/**\n * Darken a color using HSL.\n * Preserves hue and saturation while decreasing lightness.\n *\n * @param hex - Hex color string\n * @param amount - Amount to darken (0-100 percentage points)\n * @returns Darkened hex color\n */\nexport function darken(hex: string, amount: number): string {\n const hsl = hexToHsl(hex);\n const newL = clamp(hsl.l - amount, 0, 100);\n return hslToHex(hsl.h, hsl.s, newL);\n}\n\n/**\n * Saturate a color using HSL.\n *\n * @param hex - Hex color string\n * @param amount - Amount to increase saturation (0-100 percentage points)\n * @returns Saturated hex color\n */\nexport function saturate(hex: string, amount: number): string {\n const hsl = hexToHsl(hex);\n const newS = clamp(hsl.s + amount, 0, 100);\n return hslToHex(hsl.h, newS, hsl.l);\n}\n\n/**\n * Desaturate a color using HSL.\n *\n * @param hex - Hex color string\n * @param amount - Amount to decrease saturation (0-100 percentage points)\n * @returns Desaturated hex color\n */\nexport function desaturate(hex: string, amount: number): string {\n const hsl = hexToHsl(hex);\n const newS = clamp(hsl.s - amount, 0, 100);\n return hslToHex(hsl.h, newS, hsl.l);\n}\n\n/**\n * Adjust hue of a color.\n *\n * @param hex - Hex color string\n * @param degrees - Degrees to rotate hue (-360 to 360)\n * @returns Color with adjusted hue\n */\nexport function adjustHue(hex: string, degrees: number): string {\n const hsl = hexToHsl(hex);\n const newH = (hsl.h + degrees + 360) % 360;\n return hslToHex(newH, hsl.s, hsl.l);\n}\n\n/**\n * Mix two colors together.\n *\n * @param color1 - First hex color\n * @param color2 - Second hex color\n * @param weight - Weight of first color (0-1, default: 0.5)\n * @returns Mixed hex color\n */\nexport function mix(color1: string, color2: string, weight = 0.5): string {\n const [r1, g1, b1] = hexToRgb(color1);\n const [r2, g2, b2] = hexToRgb(color2);\n const w = clamp(weight, 0, 1);\n const newR = Math.round(r1 * w + r2 * (1 - w));\n const newG = Math.round(g1 * w + g2 * (1 - w));\n const newB = Math.round(b1 * w + b2 * (1 - w));\n return rgbToHex(newR, newG, newB);\n}\n\n// =============================================================================\n// CSS VARIABLE ALPHA UTILITIES (Aurora pattern)\n// =============================================================================\n\n/**\n * Validate and normalize opacity value.\n *\n * @param opacity - Opacity value (number 0-1, percentage string, or CSS variable)\n * @param color - Color string for error messages\n * @returns Normalized opacity as percentage string\n * @throws Error if opacity is invalid\n */\nfunction validateOpacity(opacity: string | number, color: string): string {\n const isCSSVar = (val: string) => val.includes('var(--');\n const isPercentage = (val: string) => val.trim().endsWith('%');\n\n const errors = {\n invalid: `[varAlpha]: Invalid opacity \"${opacity}\" for \"${color}\".`,\n range: 'Must be a number between 0 and 1 (e.g., 0.48).',\n format: 'Must be a percentage (e.g., \"48%\") or CSS variable (e.g., \"var(--opacity)\").',\n };\n\n if (typeof opacity === 'string') {\n // Already a percentage - return as-is\n if (isPercentage(opacity)) return opacity;\n\n // CSS variable - wrap in calc to convert to percentage\n if (isCSSVar(opacity)) return `calc(${opacity} * 100%)`;\n\n // Try parsing as a number string\n const parsed = parseFloat(opacity.trim());\n if (!isNaN(parsed) && parsed >= 0 && parsed <= 1) {\n return `${Number((parsed * 100).toFixed(2))}%`;\n }\n\n throw new Error(`${errors.invalid} ${errors.format}`);\n }\n\n if (typeof opacity === 'number') {\n if (opacity >= 0 && opacity <= 1) {\n return `${Number((opacity * 100).toFixed(2))}%`;\n }\n throw new Error(`${errors.invalid} ${errors.range}`);\n }\n\n throw new Error(`${errors.invalid}`);\n}\n\n/**\n * Create CSS rgba() using a CSS variable channel.\n * Essential for dynamic alpha with CSS custom properties.\n *\n * Supports:\n * - RGB channel strings: \"200 250 214\"\n * - CSS variables: \"var(--palette-primary-mainChannel)\"\n * - currentColor (via color-mix)\n *\n * Does NOT support (will throw):\n * - Hex colors: \"#00B8D9\"\n * - RGB: \"rgb(0, 184, 217)\"\n * - RGBA: \"rgba(0, 184, 217, 1)\"\n *\n * @example\n * ```tsx\n * // With CSS variable channel\n * varAlpha('var(--palette-primary-mainChannel)', 0.5)\n * // Returns: \"rgba(var(--palette-primary-mainChannel) / 50%)\"\n *\n * // With RGB channel string\n * varAlpha('200 250 214', 0.8)\n * // Returns: \"rgba(200 250 214 / 80%)\"\n *\n * // With percentage opacity\n * varAlpha('var(--palette-primary-mainChannel)', '50%')\n * // Returns: \"rgba(var(--palette-primary-mainChannel) / 50%)\"\n *\n * // With CSS variable opacity\n * varAlpha('var(--palette-primary-mainChannel)', 'var(--opacity)')\n * // Returns: \"rgba(var(--palette-primary-mainChannel) / calc(var(--opacity) * 100%))\"\n *\n * // With currentColor\n * varAlpha('currentColor', 0.5)\n * // Returns: \"color-mix(in srgb, currentColor 50%, transparent)\"\n * ```\n *\n * @param color - CSS variable reference for the RGB channel, RGB channel string, or 'currentColor'\n * @param opacity - Alpha value (0-1 number, percentage string, or CSS variable)\n * @returns CSS rgba/color-mix string\n * @throws Error if color format is unsupported or opacity is invalid\n */\nexport function varAlpha(color: string, opacity: string | number = 1): string {\n // Validate color input\n if (!color?.trim()) {\n throw new Error('[varAlpha]: Color is undefined or empty!');\n }\n\n // Check for unsupported color formats\n const isUnsupported =\n color.startsWith('#') ||\n color.startsWith('rgb(') ||\n color.startsWith('rgba(') ||\n (!color.includes('var') && color.includes('Channel'));\n\n if (isUnsupported) {\n throw new Error(\n [\n `[varAlpha]: Unsupported color format \"${color}\"`,\n '✅ Supported formats:',\n ' - RGB channels: \"0 184 217\"',\n ' - CSS variables: \"var(--palette-primary-mainChannel)\"',\n ' - currentColor',\n '❌ Unsupported formats:',\n ' - Hex: \"#00B8D9\"',\n ' - RGB: \"rgb(0, 184, 217)\"',\n ' - RGBA: \"rgba(0, 184, 217, 1)\"',\n ].join('\\n')\n );\n }\n\n // Validate and normalize opacity\n const alpha = validateOpacity(opacity, color);\n\n // Handle currentColor specially using color-mix\n if (color.toLowerCase() === 'currentcolor') {\n return `color-mix(in srgb, currentColor ${alpha}, transparent)`;\n }\n\n return `rgba(${color} / ${alpha})`;\n}\n\n/**\n * Create palette channel CSS variables object.\n * Maps semantic color keys to CSS variable references.\n *\n * @param prefix - CSS variable prefix (e.g., '--palette-primary')\n * @returns Object with channel variable references\n */\nexport function createPaletteChannelVars(prefix: string): Record<string, string> {\n return {\n lighterChannel: `var(${prefix}-lighterChannel)`,\n lightChannel: `var(${prefix}-lightChannel)`,\n mainChannel: `var(${prefix}-mainChannel)`,\n darkChannel: `var(${prefix}-darkChannel)`,\n darkerChannel: `var(${prefix}-darkerChannel)`,\n contrastTextChannel: `var(${prefix}-contrastTextChannel)`,\n };\n}\n\n// =============================================================================\n// CSS VARIABLE UTILITIES\n// =============================================================================\n\n/**\n * Parse CSS variable name from a var() expression.\n *\n * @param cssVar - CSS var() expression (e.g., 'var(--prism-primary-main)' or '--prism-primary-main')\n * @returns Variable name without -- prefix, or null if invalid\n *\n * @example\n * ```ts\n * parseCssVar('var(--prism-primary-main)') // 'prism-primary-main'\n * parseCssVar('var(--color, #fff)') // 'color'\n * parseCssVar('--my-variable') // 'my-variable'\n * parseCssVar('invalid') // null\n * ```\n */\nexport function parseCssVar(cssVar: string): string | null {\n if (!cssVar) return null;\n\n // Handle var(--name) or var(--name, fallback) format\n const varMatch = cssVar.match(/var\\(\\s*--([^,)]+)\\s*(?:,\\s*[^)]*)?\\)/);\n if (varMatch) {\n return varMatch[1].trim();\n }\n\n // Handle --name format (direct CSS variable name)\n if (cssVar.startsWith('--')) {\n return cssVar.slice(2);\n }\n\n return null;\n}\n\n/**\n * Check if a value is a CSS variable expression.\n *\n * @param value - Value to check\n * @returns True if value is a var() expression or --variable\n */\nexport function isCssVar(value: string): boolean {\n return value.startsWith('var(') || value.startsWith('--');\n}\n\n/**\n * Extract all CSS variables from a theme.vars object path.\n *\n * @param varsPath - Dot-separated path to CSS variables (e.g., 'palette.primary')\n * @param vars - Theme vars object (from theme.vars)\n * @returns Object with variable names as keys and CSS var expressions as values\n *\n * @example\n * ```ts\n * const vars = extractCssVars('palette.primary', theme.vars);\n * // { main: 'var(--prism-palette-primary-main)', light: '...', dark: '...' }\n * ```\n */\nexport function extractCssVars(varsPath: string, vars: Record<string, unknown>): Record<string, string> {\n const parts = varsPath.split('.');\n let current: Record<string, unknown> = vars;\n\n for (const part of parts) {\n if (current && typeof current === 'object' && part in current) {\n current = current[part] as Record<string, unknown>;\n } else {\n return {};\n }\n }\n\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(current)) {\n if (typeof value === 'string' && isCssVar(value)) {\n result[key] = value;\n }\n }\n return result;\n}\n","/**\n * Theme Mixins\n *\n * Reusable style utilities for component overrides.\n * Based on Minimals template patterns.\n *\n * @module theme/mixins\n */\n\nimport type { Theme, CSSObject } from '@mui/material/styles';\nimport { varAlpha } from './utils/color.js';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Color key types for style variants.\n */\nexport type PaletteColorKey = 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error';\nexport type CommonColorsKeys = 'black' | 'white';\nexport type ColorKey = CommonColorsKeys | PaletteColorKey | 'default' | 'inherit';\n\n/**\n * Options for style variants.\n */\nexport interface StyleOptions {\n hover?: boolean | CSSObject;\n}\n\n/**\n * Options for paper styles.\n */\nexport interface PaperStyleOptions {\n blur?: number;\n color?: string;\n dropdown?: boolean;\n}\n\n/**\n * Background gradient options.\n */\nexport interface BgGradientOptions {\n images?: string[];\n sizes?: string[];\n positions?: string[];\n colors?: string[];\n direction?: string;\n}\n\n// Re-export varAlpha for backwards compatibility\nexport { varAlpha } from './utils/color.js';\n\n/**\n * Helper to generate hover styles.\n */\nfunction getHoverStyles(hoverOption: StyleOptions['hover'], hoverBase: CSSObject): CSSObject {\n if (!hoverOption) return {};\n\n return {\n '&:hover': {\n ...hoverBase,\n ...(typeof hoverOption === 'object' ? hoverOption : {}),\n },\n };\n}\n\n// =============================================================================\n// STYLE VARIANTS\n// =============================================================================\n\n/**\n * Generate filled style variant for components.\n *\n * @example\n * ```tsx\n * // In component styleOverrides\n * ...filledStyles(theme, 'primary', { hover: true })\n * ...filledStyles(theme, 'inherit', { hover: { boxShadow: theme.vars.customShadows.z8 } })\n * ```\n */\nexport function filledStyles(theme: Theme, colorKey: ColorKey, options?: StyleOptions): CSSObject {\n if (!colorKey) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[Prism filledStyles] Missing colorKey parameter.');\n }\n return {};\n }\n\n const palette = theme.vars?.palette || theme.palette;\n const grey = palette.grey;\n\n if (colorKey === 'default') {\n const base: CSSObject = {\n color: grey[800],\n backgroundColor: grey[300],\n };\n const hover = getHoverStyles(options?.hover, {\n backgroundColor: grey[400],\n });\n return { ...base, ...hover };\n }\n\n if (colorKey === 'inherit') {\n const base: CSSObject = {\n color: palette.common.white,\n backgroundColor: grey[800],\n };\n const hover = getHoverStyles(options?.hover, {\n backgroundColor: grey[700],\n });\n return { ...base, ...hover };\n }\n\n if (colorKey === 'white' || colorKey === 'black') {\n const oppositeColor = colorKey === 'white' ? 'black' : 'white';\n const base: CSSObject = {\n color: palette.common[oppositeColor],\n backgroundColor: palette.common[colorKey],\n };\n const hover = getHoverStyles(options?.hover, {\n opacity: 0.8,\n });\n return { ...base, ...hover };\n }\n\n // Palette colors (primary, secondary, info, success, warning, error)\n const paletteColor = palette[colorKey];\n const base: CSSObject = {\n color: paletteColor.contrastText,\n backgroundColor: paletteColor.main,\n };\n const hover = getHoverStyles(options?.hover, {\n backgroundColor: paletteColor.dark,\n });\n\n return { ...base, ...hover };\n}\n\n/**\n * Generate soft style variant for components.\n *\n * @example\n * ```tsx\n * // In component styleOverrides\n * ...softStyles(theme, 'primary')\n * ...softStyles(theme, 'inherit', { hover: true })\n * ```\n */\nexport function softStyles(theme: Theme, colorKey: ColorKey, options?: StyleOptions): CSSObject {\n if (!colorKey) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[Prism softStyles] Missing colorKey parameter.');\n }\n return {};\n }\n\n const palette = theme.vars?.palette || theme.palette;\n const grey = palette.grey;\n\n if (colorKey === 'default') {\n return {\n ...filledStyles(theme, 'default', options),\n boxShadow: 'none',\n };\n }\n\n if (colorKey === 'inherit') {\n const greyChannel = (grey as { ['500Channel']?: string })['500Channel'] || '145, 158, 171';\n const base: CSSObject = {\n boxShadow: 'none',\n backgroundColor: varAlpha(greyChannel, 0.16),\n };\n const hover = getHoverStyles(options?.hover, {\n backgroundColor: varAlpha(greyChannel, 0.32),\n });\n return { ...base, ...hover };\n }\n\n if (colorKey === 'white' || colorKey === 'black') {\n const base: CSSObject = {\n boxShadow: 'none',\n color: palette.common[colorKey],\n backgroundColor: varAlpha('currentColor', 0.08),\n };\n const hover = getHoverStyles(options?.hover, {\n backgroundColor: varAlpha('currentColor', 0.16),\n });\n return { ...base, ...hover };\n }\n\n // Palette colors\n const paletteColor = palette[colorKey];\n const mainChannel =\n (paletteColor as { mainChannel?: string }).mainChannel ||\n (palette.primary as { mainChannel?: string }).mainChannel ||\n '51, 133, 240';\n\n const base: CSSObject = {\n boxShadow: 'none',\n color: paletteColor.dark,\n backgroundColor: varAlpha(mainChannel, 0.16),\n };\n const hover = getHoverStyles(options?.hover, {\n backgroundColor: varAlpha(mainChannel, 0.32),\n });\n\n return { ...base, ...hover };\n}\n\n/**\n * Generate background gradient styles.\n *\n * @example\n * ```tsx\n * ...bgGradient({\n * colors: ['rgba(0,0,0,0.5)', 'rgba(0,0,0,0.8)'],\n * direction: 'to bottom'\n * })\n * ```\n */\nexport function bgGradient(options: BgGradientOptions): CSSObject {\n const { images, sizes, positions, colors, direction = 'to bottom' } = options;\n\n if (colors && colors.length > 0) {\n return {\n background: `linear-gradient(${direction}, ${colors.join(', ')})`,\n };\n }\n\n if (images && images.length > 0) {\n return {\n backgroundImage: images.join(', '),\n backgroundSize: sizes?.join(', ') || 'cover',\n backgroundPosition: positions?.join(', ') || 'center',\n backgroundRepeat: 'no-repeat',\n };\n }\n\n return {};\n}\n\n/**\n * Generate blur background styles.\n *\n * @example\n * ```tsx\n * ...bgBlur({ blur: 20, color: 'rgba(255,255,255,0.8)' })\n * ```\n */\nexport function bgBlur(options: { blur?: number; color?: string }): CSSObject {\n const { blur = 20, color = 'rgba(255, 255, 255, 0.8)' } = options;\n\n return {\n backdropFilter: `blur(${blur}px)`,\n WebkitBackdropFilter: `blur(${blur}px)`,\n backgroundColor: color,\n };\n}\n\n/**\n * Generate paper styles with glass effect.\n *\n * @example\n * ```tsx\n * ...paperStyles(theme, { dropdown: true })\n * ```\n */\nexport function paperStyles(theme: Theme, options?: PaperStyleOptions): CSSObject {\n const { blur = 20, color, dropdown } = options ?? {};\n const palette = theme.vars?.palette || theme.palette;\n\n const baseStyles: CSSObject = {\n backdropFilter: `blur(${blur}px)`,\n WebkitBackdropFilter: `blur(${blur}px)`,\n backgroundColor: color ?? varAlpha('255, 255, 255', 0.9),\n };\n\n if (dropdown) {\n const customShadows = (theme as { customShadows?: { dropdown?: string } }).customShadows;\n const greyChannel = (palette.grey as { ['500Channel']?: string })['500Channel'] || '145, 158, 171';\n return {\n ...baseStyles,\n padding: theme.spacing(0.5),\n boxShadow:\n customShadows?.dropdown ||\n `0 0 2px 0 rgba(${greyChannel}, 0.24), -20px 20px 40px -4px rgba(${greyChannel}, 0.24)`,\n borderRadius: `${Number(theme.shape.borderRadius) * 1.25}px`,\n };\n }\n\n return baseStyles;\n}\n\n/**\n * Generate menu item styles.\n *\n * @example\n * ```tsx\n * ...menuItemStyles(theme)\n * ```\n */\nexport function menuItemStyles(theme: Theme): CSSObject {\n const palette = theme.vars?.palette || theme.palette;\n\n return {\n ...theme.typography.body2,\n padding: theme.spacing(0.75, 1),\n borderRadius: Number(theme.shape.borderRadius) * 0.75,\n // `:not(:last-child)` is the universal sibling-position selector\n // that works regardless of element type. `:last-of-type` only\n // matches the last sibling of the SAME tag, so a fragment-rendered\n // <Divider /> next to <MenuItem /> can fool it (Divider becomes\n // the last-of-type MenuItem too, so the previous MenuItem keeps\n // its margin instead of dropping it). Switching to :last-child\n // also satisfies MUI v9's lint-against-of-type-selectors guidance.\n '&:not(:last-child)': {\n marginBottom: 4,\n },\n '&.Mui-selected': {\n fontWeight: theme.typography.fontWeightMedium,\n backgroundColor: palette.action.selected,\n '&:hover': { backgroundColor: palette.action.hover },\n },\n };\n}\n\n/**\n * Generate max lines text truncation.\n *\n * @example\n * ```tsx\n * ...maxLine({ lines: 2 })\n * ```\n */\nexport function maxLine(options: { lines: number; lineHeight?: number }): CSSObject {\n const { lines, lineHeight = 1.5 } = options;\n\n return {\n overflow: 'hidden',\n display: '-webkit-box',\n WebkitBoxOrient: 'vertical',\n WebkitLineClamp: lines,\n textOverflow: 'ellipsis',\n ...(lineHeight && { lineHeight }),\n };\n}\n\n/**\n * Generate text gradient effect.\n *\n * @example\n * ```tsx\n * ...textGradient('to right', '#FF5630', '#00AB55')\n * ```\n */\nexport function textGradient(direction: string, ...colors: string[]): CSSObject {\n return {\n background: `linear-gradient(${direction}, ${colors.join(', ')})`,\n WebkitBackgroundClip: 'text',\n WebkitTextFillColor: 'transparent',\n backgroundClip: 'text',\n textFillColor: 'transparent',\n display: 'inline-block',\n };\n}\n\n/**\n * Generate border gradient effect using background-clip trick.\n *\n * @example\n * ```tsx\n * ...borderGradient({ color: 'linear-gradient(135deg, #FF5630, #00AB55)', borderWidth: 2 })\n * ```\n */\nexport function borderGradient(options: { color?: string; borderWidth?: number; borderRadius?: number }): CSSObject {\n const { color = 'linear-gradient(135deg, #FF5630, #00AB55)', borderWidth = 2, borderRadius = 0 } = options;\n\n return {\n position: 'relative' as const,\n border: 'none',\n borderRadius,\n '&::before': {\n content: '\"\"',\n position: 'absolute' as const,\n inset: 0,\n borderRadius: 'inherit',\n padding: borderWidth,\n background: color,\n WebkitMask: 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)',\n WebkitMaskComposite: 'xor',\n maskComposite: 'exclude',\n pointerEvents: 'none' as const,\n },\n };\n}\n\n/**\n * Generate theme-aware scrollbar styles.\n * Uses CSS variables for proper dark mode support.\n *\n * @example\n * ```tsx\n * ...scrollbarStyles(theme)\n * ```\n */\nexport function scrollbarStyles(theme: Theme, { autoHide = true }: { autoHide?: boolean } = {}): CSSObject {\n const palette = theme.vars?.palette || theme.palette;\n const greyChannel = (palette.grey as { ['500Channel']?: string })['500Channel'] || '145, 158, 171';\n return {\n scrollbarWidth: 'thin',\n scrollbarColor: `${varAlpha(greyChannel, 0.4)} transparent`,\n '&::-webkit-scrollbar': { width: 6, height: 6 },\n '&::-webkit-scrollbar-track': { backgroundColor: 'transparent' },\n '&::-webkit-scrollbar-thumb': { backgroundColor: varAlpha(greyChannel, 0.4), borderRadius: 3 },\n '&::-webkit-scrollbar-thumb:hover': { backgroundColor: varAlpha(greyChannel, 0.65) },\n '&::-webkit-scrollbar-corner': { backgroundColor: 'transparent' },\n // Change colour only: revealing a thumb must not change the scrollport's\n // geometry. Touch and high-contrast interfaces retain native discoverability.\n '@media (hover: hover) and (pointer: fine) and (forced-colors: none)': {\n scrollbarColor: autoHide ? 'transparent transparent' : `${varAlpha(greyChannel, 0.4)} transparent`,\n '&::-webkit-scrollbar-thumb': {\n backgroundColor: autoHide ? 'transparent' : varAlpha(greyChannel, 0.4),\n },\n '&:hover, &:focus-within': {\n scrollbarColor: `${varAlpha(greyChannel, 0.4)} transparent`,\n '&::-webkit-scrollbar-thumb': { backgroundColor: varAlpha(greyChannel, 0.4) },\n '&::-webkit-scrollbar-thumb:hover': { backgroundColor: varAlpha(greyChannel, 0.65) },\n },\n },\n '@media (forced-colors: active)': {\n scrollbarColor: 'auto',\n scrollbarWidth: 'auto',\n '&::-webkit-scrollbar-thumb': { backgroundColor: 'CanvasText' },\n },\n };\n}\n\n// =============================================================================\n// KEYFRAME ANIMATIONS\n// =============================================================================\n\n/**\n * Spin animation keyframes (for loading spinners).\n */\nexport const spinKeyframes = {\n '@keyframes prism-spin': {\n from: { transform: 'rotate(0deg)' },\n to: { transform: 'rotate(360deg)' },\n },\n};\n\n/**\n * Dash animation keyframes (for SVG stroke animations).\n */\nexport const dashKeyframes = {\n '@keyframes prism-dash': {\n '0%': { strokeDasharray: '1, 200', strokeDashoffset: 0 },\n '50%': { strokeDasharray: '100, 200', strokeDashoffset: -15 },\n '100%': { strokeDasharray: '100, 200', strokeDashoffset: -125 },\n },\n};\n\n/**\n * Pulse animation keyframes.\n */\nexport const pulseKeyframes = {\n '@keyframes prism-pulse': {\n '0%': { transform: 'scale(1)', opacity: 1 },\n '50%': { transform: 'scale(1.05)', opacity: 0.7 },\n '100%': { transform: 'scale(1)', opacity: 1 },\n },\n};\n\n/**\n * Shimmer animation for skeleton loading.\n */\nexport const shimmerKeyframes = {\n '@keyframes prism-shimmer': {\n '0%': { backgroundPosition: '-200% 0' },\n '100%': { backgroundPosition: '200% 0' },\n },\n};\n\n/**\n * Fade in animation.\n */\nexport const fadeInKeyframes = {\n '@keyframes prism-fadeIn': {\n from: { opacity: 0 },\n to: { opacity: 1 },\n },\n};\n\n/**\n * Slide up animation.\n */\nexport const slideUpKeyframes = {\n '@keyframes prism-slideUp': {\n from: { transform: 'translateY(16px)', opacity: 0 },\n to: { transform: 'translateY(0)', opacity: 1 },\n },\n};\n\n// =============================================================================\n// BASIC MIXINS\n// =============================================================================\n\n/**\n * MUI mixins configuration.\n */\nexport const mixins = {\n toolbar: {\n minHeight: 56,\n '@media (min-width:0px)': {\n '@media (orientation: landscape)': {\n minHeight: 48,\n },\n },\n '@media (min-width:600px)': {\n minHeight: 64,\n },\n },\n // Extended mixins\n hideScrollX: {\n msOverflowStyle: 'none' as const,\n scrollbarWidth: 'none' as const,\n overflowX: 'auto' as const,\n '&::-webkit-scrollbar': { display: 'none' },\n },\n hideScrollY: {\n msOverflowStyle: 'none' as const,\n scrollbarWidth: 'none' as const,\n overflowY: 'auto' as const,\n '&::-webkit-scrollbar': { display: 'none' },\n },\n // Style functions (attached at theme creation)\n bgBlur,\n bgGradient,\n maxLine,\n softStyles,\n filledStyles,\n paperStyles,\n menuItemStyles,\n varAlpha,\n textGradient,\n borderGradient,\n scrollbarStyles,\n};\n\n/**\n * Hide scrollbar mixin.\n */\nexport const hideScrollbarMixin = {\n scrollbarWidth: 'none' as const,\n msOverflowStyle: 'none' as const,\n '&::-webkit-scrollbar': {\n display: 'none',\n },\n};\n\n/**\n * Custom scrollbar mixin.\n */\nexport function customScrollbarMixin(theme: Theme): CSSObject {\n return scrollbarStyles(theme);\n}\n\n/**\n * Text overflow ellipsis mixin.\n */\nexport const textEllipsisMixin = {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap' as const,\n};\n\n/**\n * Multi-line text overflow mixin.\n */\nexport function multiLineEllipsisMixin(lines: number) {\n return {\n overflow: 'hidden',\n display: '-webkit-box',\n WebkitBoxOrient: 'vertical' as const,\n WebkitLineClamp: lines,\n };\n}\n\n/**\n * Focus visible ring mixin.\n */\nexport const focusRingMixin = {\n '&:focus-visible': {\n outline: 'none',\n boxShadow: '0 0 0 2px var(--prism-background, #FFF), 0 0 0 4px var(--prism-primary, #3385F0)',\n },\n};\n\n/**\n * Glass/blur background mixin.\n */\nexport const glassMixin = {\n backdropFilter: 'blur(20px)',\n backgroundColor: 'var(--prism-vibrant-overlay, rgba(255, 255, 255, 0.7))',\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/theme/utils/color.ts","../src/theme/mixins.ts"],"names":["base","hover"],"mappings":"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","file":"chunk-IRYU3NTG.js","sourcesContent":["/**\n * Color Utilities\n *\n * Functions for color manipulation, channel generation, and palette creation.\n * Uses HSL-based color math for perceptually correct results.\n * Combines Aurora's sophisticated color system with Prism's extensibility.\n *\n * @module theme/utils/color\n */\n\nimport type {\n ColorScale,\n ColorScaleWithChannels,\n ColorShadeKey,\n PaletteColor,\n PaletteColorWithChannels,\n} from '../../types/theme.js';\n\n// =============================================================================\n// COLOR CONVERSION\n// =============================================================================\n\n/**\n * Convert hex color to RGB values.\n *\n * @param hex - Hex color string (e.g., '#FF5630' or 'FF5630')\n * @returns RGB tuple [r, g, b]\n */\nexport function hexToRgb(hex: string): [number, number, number] {\n const h = hex.replace('#', '');\n const expanded =\n h.length === 3\n ? h\n .split('')\n .map((c) => c + c)\n .join('')\n : h;\n const bigint = parseInt(expanded, 16);\n const r = (bigint >> 16) & 255;\n const g = (bigint >> 8) & 255;\n const b = bigint & 255;\n return [r, g, b];\n}\n\n/**\n * Convert hex color to RGB channel string.\n *\n * @param hex - Hex color string\n * @returns RGB channel string (e.g., '255 86 48')\n */\nexport function hexToRgbChannel(hex: string): string {\n const [r, g, b] = hexToRgb(hex);\n return `${r} ${g} ${b}`;\n}\n\n/**\n * Convert RGB values to hex color.\n *\n * @param r - Red (0-255)\n * @param g - Green (0-255)\n * @param b - Blue (0-255)\n * @returns Hex color string (e.g., '#FF5630')\n */\nexport function rgbToHex(r: number, g: number, b: number): string {\n const to2 = (n: number) => Math.round(n).toString(16).padStart(2, '0');\n return `#${to2(r)}${to2(g)}${to2(b)}`.toUpperCase();\n}\n\n/**\n * Convert hex to HSL values.\n *\n * @param hex - Hex color string\n * @returns HSL values { h: 0-360, s: 0-100, l: 0-100 }\n */\nexport function hexToHsl(hex: string): { h: number; s: number; l: number } {\n const [r, g, b] = hexToRgb(hex);\n const r1 = r / 255;\n const g1 = g / 255;\n const b1 = b / 255;\n const max = Math.max(r1, g1, b1);\n const min = Math.min(r1, g1, b1);\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n const d = max - min;\n\n if (d !== 0) {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r1:\n h = (g1 - b1) / d + (g1 < b1 ? 6 : 0);\n break;\n case g1:\n h = (b1 - r1) / d + 2;\n break;\n default:\n h = (r1 - g1) / d + 4;\n }\n h /= 6;\n }\n\n return { h: h * 360, s: s * 100, l: l * 100 };\n}\n\n/**\n * Convert HSL values to hex color.\n *\n * @param h - Hue (0-360)\n * @param s - Saturation (0-100)\n * @param l - Lightness (0-100)\n * @returns Hex color string\n */\nexport function hslToHex(h: number, s: number, l: number): string {\n const s1 = s / 100;\n const l1 = l / 100;\n const c = (1 - Math.abs(2 * l1 - 1)) * s1;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = l1 - c / 2;\n let r1: number;\n let g1: number;\n let b1: number;\n\n if (h >= 0 && h < 60) {\n [r1, g1, b1] = [c, x, 0];\n } else if (h >= 60 && h < 120) {\n [r1, g1, b1] = [x, c, 0];\n } else if (h >= 120 && h < 180) {\n [r1, g1, b1] = [0, c, x];\n } else if (h >= 180 && h < 240) {\n [r1, g1, b1] = [0, x, c];\n } else if (h >= 240 && h < 300) {\n [r1, g1, b1] = [x, 0, c];\n } else {\n [r1, g1, b1] = [c, 0, x];\n }\n\n return rgbToHex(Math.round((r1 + m) * 255), Math.round((g1 + m) * 255), Math.round((b1 + m) * 255));\n}\n\n// =============================================================================\n// RGBA UTILITIES\n// =============================================================================\n\n/**\n * Create CSS rgba() from hex color.\n *\n * @param color - Hex color string\n * @param alpha - Alpha value (0-1)\n * @returns CSS rgba string\n */\nexport function rgba(color: string, alpha: number): string {\n const [r, g, b] = hexToRgb(color);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\n/**\n * Create CSS rgba() from RGB channel string.\n * Useful for CSS variable references.\n *\n * @param channel - RGB channel string (e.g., '255 86 48')\n * @param alpha - Alpha value (0-1)\n * @returns CSS rgba string using modern syntax\n */\nexport function cssVarRgba(channel: string, alpha: number): string {\n return `rgba(${channel} / ${alpha})`;\n}\n\n// =============================================================================\n// CHANNEL GENERATION\n// =============================================================================\n\n/**\n * Generate palette color with channel values.\n *\n * @param color - Palette color object\n * @returns Palette color with channel values\n */\nexport function generatePaletteColorWithChannels(color: PaletteColor): PaletteColorWithChannels {\n return {\n ...color,\n lighterChannel: hexToRgbChannel(color.lighter),\n lightChannel: hexToRgbChannel(color.light),\n mainChannel: hexToRgbChannel(color.main),\n darkChannel: hexToRgbChannel(color.dark),\n darkerChannel: hexToRgbChannel(color.darker),\n contrastTextChannel: hexToRgbChannel(color.contrastText),\n };\n}\n\n/**\n * Generate color scale with channel values.\n *\n * @param scale - Color scale object\n * @returns Color scale with channel values\n */\nexport function generateColorScaleWithChannels(scale: ColorScale): ColorScaleWithChannels {\n const shadeKeys: ColorShadeKey[] = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950];\n const channels = {} as Record<`${ColorShadeKey}Channel`, string>;\n\n for (const key of shadeKeys) {\n const channelKey = `${key}Channel` as `${ColorShadeKey}Channel`;\n channels[channelKey] = hexToRgbChannel(scale[key]);\n }\n\n return { ...scale, ...channels };\n}\n\n// =============================================================================\n// SHADE GENERATION\n// =============================================================================\n\n/**\n * Clamp a number between min and max.\n */\nfunction clamp(n: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, n));\n}\n\n/**\n * Generate 11-shade color scale from a base color.\n * Uses HSL manipulation to create consistent, accessible shades.\n *\n * @param baseColor - Base hex color (typically the 500 shade)\n * @returns Full 11-shade color scale\n */\nexport function generateColorScale(baseColor: string): ColorScale {\n const base = hexToHsl(baseColor);\n\n const tones: Array<{ key: ColorShadeKey; lDelta: number }> = [\n { key: 50, lDelta: +40 },\n { key: 100, lDelta: +32 },\n { key: 200, lDelta: +24 },\n { key: 300, lDelta: +16 },\n { key: 400, lDelta: +8 },\n { key: 500, lDelta: 0 },\n { key: 600, lDelta: -8 },\n { key: 700, lDelta: -16 },\n { key: 800, lDelta: -24 },\n { key: 900, lDelta: -32 },\n { key: 950, lDelta: -40 },\n ];\n\n const scale = {} as ColorScale;\n\n for (const { key, lDelta } of tones) {\n const l = clamp(base.l + lDelta, 5, 95);\n scale[key] = hslToHex(base.h, base.s, l);\n }\n\n return scale;\n}\n\n/**\n * Generate primary color shades from a base color.\n * Alias for generateColorScale for compatibility with Aurora's naming.\n */\nexport const generatePrimaryShades = generateColorScale;\n\n// =============================================================================\n// PALETTE HELPERS\n// =============================================================================\n\n/**\n * Create semantic palette color from a color scale.\n * Maps 11-shade scale to 5-shade semantic naming.\n *\n * @param scale - Full color scale\n * @param mode - Light or dark mode\n * @returns Semantic palette color\n */\nexport function createPaletteColorFromScale(scale: ColorScale, mode: 'light' | 'dark' = 'light'): PaletteColor {\n const mainColor = mode === 'dark' ? scale[400] : scale[500];\n // `getContrastText` measures both candidates instead of switching on a\n // luminance threshold, and reads the colour through `hexToRgb`, which\n // expands a three-digit hex. The threshold version this replaced did\n // neither: it parsed with `match(/.{2}/g)`, so `#fff` produced `NaN`\n // luminance and therefore WHITE text on a WHITE background. `#212121` stays\n // the dark candidate — that tone is the palette's choice, not the\n // threshold's.\n const contrastText = getContrastText(mainColor, '#FFFFFF', '#212121');\n\n if (mode === 'dark') {\n return {\n lighter: scale[950],\n light: scale[700],\n main: mainColor,\n dark: scale[300],\n darker: scale[100],\n contrastText,\n };\n }\n\n return {\n lighter: scale[50],\n light: scale[400],\n main: mainColor,\n dark: scale[600],\n darker: scale[900],\n contrastText,\n };\n}\n\n/**\n * Create inverted color scale for dark mode.\n * Swaps light and dark shades for proper dark mode contrast.\n *\n * @param scale - Original color scale\n * @returns Inverted color scale\n */\nexport function invertColorScale(scale: ColorScale): ColorScale {\n return {\n 50: scale[950],\n 100: scale[800],\n 200: scale[700],\n 300: scale[600],\n 400: scale[500],\n 500: scale[400],\n 600: scale[300],\n 700: scale[200],\n 800: scale[100],\n 900: scale[50],\n 950: '#FFFFFF',\n };\n}\n\n// =============================================================================\n// CONTRAST UTILITIES\n// =============================================================================\n\n/**\n * Calculate relative luminance of a color.\n *\n * @param hex - Hex color string\n * @returns Relative luminance (0-1)\n */\nexport function getLuminance(hex: string): number {\n const [r, g, b] = hexToRgb(hex).map((c) => {\n const sRgb = c / 255;\n return sRgb <= 0.03928 ? sRgb / 12.92 : Math.pow((sRgb + 0.055) / 1.055, 2.4);\n });\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\n/**\n * Calculate contrast ratio between two colors.\n *\n * @param color1 - First hex color\n * @param color2 - Second hex color\n * @returns Contrast ratio (1-21)\n */\nexport function getContrastRatio(color1: string, color2: string): number {\n const l1 = getLuminance(color1);\n const l2 = getLuminance(color2);\n const lighter = Math.max(l1, l2);\n const darker = Math.min(l1, l2);\n return (lighter + 0.05) / (darker + 0.05);\n}\n\n/**\n * Determine if a color is light or dark.\n *\n * @param hex - Hex color string\n * @returns True if color is light\n */\nexport function isLightColor(hex: string): boolean {\n return getLuminance(hex) > 0.5;\n}\n\n/**\n * Get optimal contrast text color for a background.\n *\n * Picks whichever of the two candidates actually contrasts more, rather than\n * switching on a luminance threshold. The threshold version returned white\n * for every colour below 0.5 luminance, which includes the mid-tone brand\n * colours a theme is most likely to use: `#FF5630` scored 3.17 against white\n * and 6.63 against black, and `#00A76F` 3.11 against white and 6.76 against\n * black. Both were handed the worse of the two and both fall below WCAG AA\n * for body text.\n *\n * The measurement is already in this file — `getContrastRatio` sat next to\n * the threshold and went unused.\n *\n * @param background - Background hex color\n * @param lightText - Light text color (default: white)\n * @param darkText - Dark text color (default: black)\n * @returns Whichever candidate contrasts more with `background`\n */\nexport function getContrastText(background: string, lightText = '#FFFFFF', darkText = '#000000'): string {\n return getContrastRatio(background, lightText) >= getContrastRatio(background, darkText)\n ? lightText\n : darkText;\n}\n\n// =============================================================================\n// HSL-BASED COLOR MANIPULATION\n// =============================================================================\n\n/**\n * Lighten a color using HSL.\n * Preserves hue and saturation while increasing lightness.\n *\n * @param hex - Hex color string\n * @param amount - Amount to lighten (0-100 percentage points)\n * @returns Lightened hex color\n */\nexport function lighten(hex: string, amount: number): string {\n const hsl = hexToHsl(hex);\n const newL = clamp(hsl.l + amount, 0, 100);\n return hslToHex(hsl.h, hsl.s, newL);\n}\n\n/**\n * Darken a color using HSL.\n * Preserves hue and saturation while decreasing lightness.\n *\n * @param hex - Hex color string\n * @param amount - Amount to darken (0-100 percentage points)\n * @returns Darkened hex color\n */\nexport function darken(hex: string, amount: number): string {\n const hsl = hexToHsl(hex);\n const newL = clamp(hsl.l - amount, 0, 100);\n return hslToHex(hsl.h, hsl.s, newL);\n}\n\n/**\n * Saturate a color using HSL.\n *\n * @param hex - Hex color string\n * @param amount - Amount to increase saturation (0-100 percentage points)\n * @returns Saturated hex color\n */\nexport function saturate(hex: string, amount: number): string {\n const hsl = hexToHsl(hex);\n const newS = clamp(hsl.s + amount, 0, 100);\n return hslToHex(hsl.h, newS, hsl.l);\n}\n\n/**\n * Desaturate a color using HSL.\n *\n * @param hex - Hex color string\n * @param amount - Amount to decrease saturation (0-100 percentage points)\n * @returns Desaturated hex color\n */\nexport function desaturate(hex: string, amount: number): string {\n const hsl = hexToHsl(hex);\n const newS = clamp(hsl.s - amount, 0, 100);\n return hslToHex(hsl.h, newS, hsl.l);\n}\n\n/**\n * Adjust hue of a color.\n *\n * @param hex - Hex color string\n * @param degrees - Degrees to rotate hue (-360 to 360)\n * @returns Color with adjusted hue\n */\nexport function adjustHue(hex: string, degrees: number): string {\n const hsl = hexToHsl(hex);\n const newH = (hsl.h + degrees + 360) % 360;\n return hslToHex(newH, hsl.s, hsl.l);\n}\n\n/**\n * Mix two colors together.\n *\n * @param color1 - First hex color\n * @param color2 - Second hex color\n * @param weight - Weight of first color (0-1, default: 0.5)\n * @returns Mixed hex color\n */\nexport function mix(color1: string, color2: string, weight = 0.5): string {\n const [r1, g1, b1] = hexToRgb(color1);\n const [r2, g2, b2] = hexToRgb(color2);\n const w = clamp(weight, 0, 1);\n const newR = Math.round(r1 * w + r2 * (1 - w));\n const newG = Math.round(g1 * w + g2 * (1 - w));\n const newB = Math.round(b1 * w + b2 * (1 - w));\n return rgbToHex(newR, newG, newB);\n}\n\n// =============================================================================\n// CSS VARIABLE ALPHA UTILITIES (Aurora pattern)\n// =============================================================================\n\n/**\n * Validate and normalize opacity value.\n *\n * @param opacity - Opacity value (number 0-1, percentage string, or CSS variable)\n * @param color - Color string for error messages\n * @returns Normalized opacity as percentage string\n * @throws Error if opacity is invalid\n */\nfunction validateOpacity(opacity: string | number, color: string): string {\n const isCSSVar = (val: string) => val.includes('var(--');\n const isPercentage = (val: string) => val.trim().endsWith('%');\n\n const errors = {\n invalid: `[varAlpha]: Invalid opacity \"${opacity}\" for \"${color}\".`,\n range: 'Must be a number between 0 and 1 (e.g., 0.48).',\n format: 'Must be a percentage (e.g., \"48%\") or CSS variable (e.g., \"var(--opacity)\").',\n };\n\n if (typeof opacity === 'string') {\n // Already a percentage - return as-is\n if (isPercentage(opacity)) return opacity;\n\n // CSS variable - wrap in calc to convert to percentage\n if (isCSSVar(opacity)) return `calc(${opacity} * 100%)`;\n\n // Try parsing as a number string\n const parsed = parseFloat(opacity.trim());\n if (!isNaN(parsed) && parsed >= 0 && parsed <= 1) {\n return `${Number((parsed * 100).toFixed(2))}%`;\n }\n\n throw new Error(`${errors.invalid} ${errors.format}`);\n }\n\n if (typeof opacity === 'number') {\n if (opacity >= 0 && opacity <= 1) {\n return `${Number((opacity * 100).toFixed(2))}%`;\n }\n throw new Error(`${errors.invalid} ${errors.range}`);\n }\n\n throw new Error(`${errors.invalid}`);\n}\n\n/**\n * Create CSS rgba() using a CSS variable channel.\n * Essential for dynamic alpha with CSS custom properties.\n *\n * Supports:\n * - RGB channel strings: \"200 250 214\"\n * - CSS variables: \"var(--palette-primary-mainChannel)\"\n * - currentColor (via color-mix)\n *\n * Does NOT support (will throw):\n * - Hex colors: \"#00B8D9\"\n * - RGB: \"rgb(0, 184, 217)\"\n * - RGBA: \"rgba(0, 184, 217, 1)\"\n *\n * @example\n * ```tsx\n * // With CSS variable channel\n * varAlpha('var(--palette-primary-mainChannel)', 0.5)\n * // Returns: \"rgba(var(--palette-primary-mainChannel) / 50%)\"\n *\n * // With RGB channel string\n * varAlpha('200 250 214', 0.8)\n * // Returns: \"rgba(200 250 214 / 80%)\"\n *\n * // With percentage opacity\n * varAlpha('var(--palette-primary-mainChannel)', '50%')\n * // Returns: \"rgba(var(--palette-primary-mainChannel) / 50%)\"\n *\n * // With CSS variable opacity\n * varAlpha('var(--palette-primary-mainChannel)', 'var(--opacity)')\n * // Returns: \"rgba(var(--palette-primary-mainChannel) / calc(var(--opacity) * 100%))\"\n *\n * // With currentColor\n * varAlpha('currentColor', 0.5)\n * // Returns: \"color-mix(in srgb, currentColor 50%, transparent)\"\n * ```\n *\n * @param color - CSS variable reference for the RGB channel, RGB channel string, or 'currentColor'\n * @param opacity - Alpha value (0-1 number, percentage string, or CSS variable)\n * @returns CSS rgba/color-mix string\n * @throws Error if color format is unsupported or opacity is invalid\n */\nexport function varAlpha(color: string, opacity: string | number = 1): string {\n // Validate color input\n if (!color?.trim()) {\n throw new Error('[varAlpha]: Color is undefined or empty!');\n }\n\n // Check for unsupported color formats\n const isUnsupported =\n color.startsWith('#') ||\n color.startsWith('rgb(') ||\n color.startsWith('rgba(') ||\n (!color.includes('var') && color.includes('Channel'));\n\n if (isUnsupported) {\n throw new Error(\n [\n `[varAlpha]: Unsupported color format \"${color}\"`,\n '✅ Supported formats:',\n ' - RGB channels: \"0 184 217\"',\n ' - CSS variables: \"var(--palette-primary-mainChannel)\"',\n ' - currentColor',\n '❌ Unsupported formats:',\n ' - Hex: \"#00B8D9\"',\n ' - RGB: \"rgb(0, 184, 217)\"',\n ' - RGBA: \"rgba(0, 184, 217, 1)\"',\n ].join('\\n')\n );\n }\n\n // Validate and normalize opacity\n const alpha = validateOpacity(opacity, color);\n\n // Handle currentColor specially using color-mix\n if (color.toLowerCase() === 'currentcolor') {\n return `color-mix(in srgb, currentColor ${alpha}, transparent)`;\n }\n\n return `rgba(${color} / ${alpha})`;\n}\n\n/**\n * Create palette channel CSS variables object.\n * Maps semantic color keys to CSS variable references.\n *\n * @param prefix - CSS variable prefix (e.g., '--palette-primary')\n * @returns Object with channel variable references\n */\nexport function createPaletteChannelVars(prefix: string): Record<string, string> {\n return {\n lighterChannel: `var(${prefix}-lighterChannel)`,\n lightChannel: `var(${prefix}-lightChannel)`,\n mainChannel: `var(${prefix}-mainChannel)`,\n darkChannel: `var(${prefix}-darkChannel)`,\n darkerChannel: `var(${prefix}-darkerChannel)`,\n contrastTextChannel: `var(${prefix}-contrastTextChannel)`,\n };\n}\n\n// =============================================================================\n// CSS VARIABLE UTILITIES\n// =============================================================================\n\n/**\n * Parse CSS variable name from a var() expression.\n *\n * @param cssVar - CSS var() expression (e.g., 'var(--prism-primary-main)' or '--prism-primary-main')\n * @returns Variable name without -- prefix, or null if invalid\n *\n * @example\n * ```ts\n * parseCssVar('var(--prism-primary-main)') // 'prism-primary-main'\n * parseCssVar('var(--color, #fff)') // 'color'\n * parseCssVar('--my-variable') // 'my-variable'\n * parseCssVar('invalid') // null\n * ```\n */\nexport function parseCssVar(cssVar: string): string | null {\n if (!cssVar) return null;\n\n // Handle var(--name) or var(--name, fallback) format\n const varMatch = cssVar.match(/var\\(\\s*--([^,)]+)\\s*(?:,\\s*[^)]*)?\\)/);\n if (varMatch) {\n return varMatch[1].trim();\n }\n\n // Handle --name format (direct CSS variable name)\n if (cssVar.startsWith('--')) {\n return cssVar.slice(2);\n }\n\n return null;\n}\n\n/**\n * Check if a value is a CSS variable expression.\n *\n * @param value - Value to check\n * @returns True if value is a var() expression or --variable\n */\nexport function isCssVar(value: string): boolean {\n return value.startsWith('var(') || value.startsWith('--');\n}\n\n/**\n * Extract all CSS variables from a theme.vars object path.\n *\n * @param varsPath - Dot-separated path to CSS variables (e.g., 'palette.primary')\n * @param vars - Theme vars object (from theme.vars)\n * @returns Object with variable names as keys and CSS var expressions as values\n *\n * @example\n * ```ts\n * const vars = extractCssVars('palette.primary', theme.vars);\n * // { main: 'var(--prism-palette-primary-main)', light: '...', dark: '...' }\n * ```\n */\nexport function extractCssVars(varsPath: string, vars: Record<string, unknown>): Record<string, string> {\n const parts = varsPath.split('.');\n let current: Record<string, unknown> = vars;\n\n for (const part of parts) {\n if (current && typeof current === 'object' && part in current) {\n current = current[part] as Record<string, unknown>;\n } else {\n return {};\n }\n }\n\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(current)) {\n if (typeof value === 'string' && isCssVar(value)) {\n result[key] = value;\n }\n }\n return result;\n}\n","/**\n * Theme Mixins\n *\n * Reusable style utilities for component overrides.\n * Based on Minimals template patterns.\n *\n * @module theme/mixins\n */\n\nimport type { Theme, CSSObject } from '@mui/material/styles';\nimport { varAlpha } from './utils/color.js';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Color key types for style variants.\n */\nexport type PaletteColorKey = 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error';\nexport type CommonColorsKeys = 'black' | 'white';\nexport type ColorKey = CommonColorsKeys | PaletteColorKey | 'default' | 'inherit';\n\n/**\n * Options for style variants.\n */\nexport interface StyleOptions {\n hover?: boolean | CSSObject;\n}\n\n/**\n * Options for paper styles.\n */\nexport interface PaperStyleOptions {\n blur?: number;\n color?: string;\n dropdown?: boolean;\n}\n\n/**\n * Background gradient options.\n */\nexport interface BgGradientOptions {\n images?: string[];\n sizes?: string[];\n positions?: string[];\n colors?: string[];\n direction?: string;\n}\n\n// Re-export varAlpha for backwards compatibility\nexport { varAlpha } from './utils/color.js';\n\n/**\n * Helper to generate hover styles.\n */\nfunction getHoverStyles(hoverOption: StyleOptions['hover'], hoverBase: CSSObject): CSSObject {\n if (!hoverOption) return {};\n\n return {\n '&:hover': {\n ...hoverBase,\n ...(typeof hoverOption === 'object' ? hoverOption : {}),\n },\n };\n}\n\n// =============================================================================\n// STYLE VARIANTS\n// =============================================================================\n\n/**\n * Generate filled style variant for components.\n *\n * @example\n * ```tsx\n * // In component styleOverrides\n * ...filledStyles(theme, 'primary', { hover: true })\n * ...filledStyles(theme, 'inherit', { hover: { boxShadow: theme.vars.customShadows.z8 } })\n * ```\n */\nexport function filledStyles(theme: Theme, colorKey: ColorKey, options?: StyleOptions): CSSObject {\n if (!colorKey) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[Prism filledStyles] Missing colorKey parameter.');\n }\n return {};\n }\n\n const palette = theme.vars?.palette || theme.palette;\n const grey = palette.grey;\n\n if (colorKey === 'default') {\n const base: CSSObject = {\n color: grey[800],\n backgroundColor: grey[300],\n };\n const hover = getHoverStyles(options?.hover, {\n backgroundColor: grey[400],\n });\n return { ...base, ...hover };\n }\n\n if (colorKey === 'inherit') {\n const base: CSSObject = {\n color: palette.common.white,\n backgroundColor: grey[800],\n };\n const hover = getHoverStyles(options?.hover, {\n backgroundColor: grey[700],\n });\n return { ...base, ...hover };\n }\n\n if (colorKey === 'white' || colorKey === 'black') {\n const oppositeColor = colorKey === 'white' ? 'black' : 'white';\n const base: CSSObject = {\n color: palette.common[oppositeColor],\n backgroundColor: palette.common[colorKey],\n };\n const hover = getHoverStyles(options?.hover, {\n opacity: 0.8,\n });\n return { ...base, ...hover };\n }\n\n // Palette colors (primary, secondary, info, success, warning, error)\n const paletteColor = palette[colorKey];\n const base: CSSObject = {\n color: paletteColor.contrastText,\n backgroundColor: paletteColor.main,\n };\n const hover = getHoverStyles(options?.hover, {\n backgroundColor: paletteColor.dark,\n });\n\n return { ...base, ...hover };\n}\n\n/**\n * Generate soft style variant for components.\n *\n * @example\n * ```tsx\n * // In component styleOverrides\n * ...softStyles(theme, 'primary')\n * ...softStyles(theme, 'inherit', { hover: true })\n * ```\n */\nexport function softStyles(theme: Theme, colorKey: ColorKey, options?: StyleOptions): CSSObject {\n if (!colorKey) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[Prism softStyles] Missing colorKey parameter.');\n }\n return {};\n }\n\n const palette = theme.vars?.palette || theme.palette;\n const grey = palette.grey;\n\n if (colorKey === 'default') {\n return {\n ...filledStyles(theme, 'default', options),\n boxShadow: 'none',\n };\n }\n\n if (colorKey === 'inherit') {\n const greyChannel = (grey as { ['500Channel']?: string })['500Channel'] || '145, 158, 171';\n const base: CSSObject = {\n boxShadow: 'none',\n backgroundColor: varAlpha(greyChannel, 0.16),\n };\n const hover = getHoverStyles(options?.hover, {\n backgroundColor: varAlpha(greyChannel, 0.32),\n });\n return { ...base, ...hover };\n }\n\n if (colorKey === 'white' || colorKey === 'black') {\n const base: CSSObject = {\n boxShadow: 'none',\n color: palette.common[colorKey],\n backgroundColor: varAlpha('currentColor', 0.08),\n };\n const hover = getHoverStyles(options?.hover, {\n backgroundColor: varAlpha('currentColor', 0.16),\n });\n return { ...base, ...hover };\n }\n\n // Palette colors\n const paletteColor = palette[colorKey];\n const mainChannel =\n (paletteColor as { mainChannel?: string }).mainChannel ||\n (palette.primary as { mainChannel?: string }).mainChannel ||\n '51, 133, 240';\n\n const base: CSSObject = {\n boxShadow: 'none',\n color: paletteColor.dark,\n backgroundColor: varAlpha(mainChannel, 0.16),\n };\n const hover = getHoverStyles(options?.hover, {\n backgroundColor: varAlpha(mainChannel, 0.32),\n });\n\n return { ...base, ...hover };\n}\n\n/**\n * Generate background gradient styles.\n *\n * @example\n * ```tsx\n * ...bgGradient({\n * colors: ['rgba(0,0,0,0.5)', 'rgba(0,0,0,0.8)'],\n * direction: 'to bottom'\n * })\n * ```\n */\nexport function bgGradient(options: BgGradientOptions): CSSObject {\n const { images, sizes, positions, colors, direction = 'to bottom' } = options;\n\n if (colors && colors.length > 0) {\n return {\n background: `linear-gradient(${direction}, ${colors.join(', ')})`,\n };\n }\n\n if (images && images.length > 0) {\n return {\n backgroundImage: images.join(', '),\n backgroundSize: sizes?.join(', ') || 'cover',\n backgroundPosition: positions?.join(', ') || 'center',\n backgroundRepeat: 'no-repeat',\n };\n }\n\n return {};\n}\n\n/**\n * Generate blur background styles.\n *\n * @example\n * ```tsx\n * ...bgBlur({ blur: 20, color: 'rgba(255,255,255,0.8)' })\n * ```\n */\nexport function bgBlur(options: { blur?: number; color?: string }): CSSObject {\n const { blur = 20, color = 'rgba(255, 255, 255, 0.8)' } = options;\n\n return {\n backdropFilter: `blur(${blur}px)`,\n WebkitBackdropFilter: `blur(${blur}px)`,\n backgroundColor: color,\n };\n}\n\n/**\n * Generate paper styles with glass effect.\n *\n * @example\n * ```tsx\n * ...paperStyles(theme, { dropdown: true })\n * ```\n */\nexport function paperStyles(theme: Theme, options?: PaperStyleOptions): CSSObject {\n const { blur = 20, color, dropdown } = options ?? {};\n const palette = theme.vars?.palette || theme.palette;\n\n const baseStyles: CSSObject = {\n backdropFilter: `blur(${blur}px)`,\n WebkitBackdropFilter: `blur(${blur}px)`,\n backgroundColor: color ?? varAlpha('255, 255, 255', 0.9),\n };\n\n if (dropdown) {\n const customShadows = (theme as { customShadows?: { dropdown?: string } }).customShadows;\n const greyChannel = (palette.grey as { ['500Channel']?: string })['500Channel'] || '145, 158, 171';\n return {\n ...baseStyles,\n padding: theme.spacing(0.5),\n boxShadow:\n customShadows?.dropdown ||\n `0 0 2px 0 rgba(${greyChannel}, 0.24), -20px 20px 40px -4px rgba(${greyChannel}, 0.24)`,\n borderRadius: `${Number(theme.shape.borderRadius) * 1.25}px`,\n };\n }\n\n return baseStyles;\n}\n\n/**\n * Generate menu item styles.\n *\n * @example\n * ```tsx\n * ...menuItemStyles(theme)\n * ```\n */\nexport function menuItemStyles(theme: Theme): CSSObject {\n const palette = theme.vars?.palette || theme.palette;\n\n return {\n ...theme.typography.body2,\n padding: theme.spacing(0.75, 1),\n borderRadius: Number(theme.shape.borderRadius) * 0.75,\n // `:not(:last-child)` is the universal sibling-position selector\n // that works regardless of element type. `:last-of-type` only\n // matches the last sibling of the SAME tag, so a fragment-rendered\n // <Divider /> next to <MenuItem /> can fool it (Divider becomes\n // the last-of-type MenuItem too, so the previous MenuItem keeps\n // its margin instead of dropping it). Switching to :last-child\n // also satisfies MUI v9's lint-against-of-type-selectors guidance.\n '&:not(:last-child)': {\n marginBottom: 4,\n },\n '&.Mui-selected': {\n fontWeight: theme.typography.fontWeightMedium,\n backgroundColor: palette.action.selected,\n '&:hover': { backgroundColor: palette.action.hover },\n },\n };\n}\n\n/**\n * Generate max lines text truncation.\n *\n * @example\n * ```tsx\n * ...maxLine({ lines: 2 })\n * ```\n */\nexport function maxLine(options: { lines: number; lineHeight?: number }): CSSObject {\n const { lines, lineHeight = 1.5 } = options;\n\n return {\n overflow: 'hidden',\n display: '-webkit-box',\n WebkitBoxOrient: 'vertical',\n WebkitLineClamp: lines,\n textOverflow: 'ellipsis',\n ...(lineHeight && { lineHeight }),\n };\n}\n\n/**\n * Generate text gradient effect.\n *\n * @example\n * ```tsx\n * ...textGradient('to right', '#FF5630', '#00AB55')\n * ```\n */\nexport function textGradient(direction: string, ...colors: string[]): CSSObject {\n return {\n background: `linear-gradient(${direction}, ${colors.join(', ')})`,\n WebkitBackgroundClip: 'text',\n WebkitTextFillColor: 'transparent',\n backgroundClip: 'text',\n textFillColor: 'transparent',\n display: 'inline-block',\n };\n}\n\n/**\n * Generate border gradient effect using background-clip trick.\n *\n * @example\n * ```tsx\n * ...borderGradient({ color: 'linear-gradient(135deg, #FF5630, #00AB55)', borderWidth: 2 })\n * ```\n */\nexport function borderGradient(options: { color?: string; borderWidth?: number; borderRadius?: number }): CSSObject {\n const { color = 'linear-gradient(135deg, #FF5630, #00AB55)', borderWidth = 2, borderRadius = 0 } = options;\n\n return {\n position: 'relative' as const,\n border: 'none',\n borderRadius,\n '&::before': {\n content: '\"\"',\n position: 'absolute' as const,\n inset: 0,\n borderRadius: 'inherit',\n padding: borderWidth,\n background: color,\n WebkitMask: 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)',\n WebkitMaskComposite: 'xor',\n maskComposite: 'exclude',\n pointerEvents: 'none' as const,\n },\n };\n}\n\n/**\n * Generate theme-aware scrollbar styles.\n * Uses CSS variables for proper dark mode support.\n *\n * @example\n * ```tsx\n * ...scrollbarStyles(theme)\n * ```\n */\nexport function scrollbarStyles(theme: Theme, { autoHide = true }: { autoHide?: boolean } = {}): CSSObject {\n const palette = theme.vars?.palette || theme.palette;\n const greyChannel = (palette.grey as { ['500Channel']?: string })['500Channel'] || '145, 158, 171';\n return {\n scrollbarWidth: 'thin',\n scrollbarColor: `${varAlpha(greyChannel, 0.4)} transparent`,\n '&::-webkit-scrollbar': { width: 6, height: 6 },\n '&::-webkit-scrollbar-track': { backgroundColor: 'transparent' },\n '&::-webkit-scrollbar-thumb': { backgroundColor: varAlpha(greyChannel, 0.4), borderRadius: 3 },\n '&::-webkit-scrollbar-thumb:hover': { backgroundColor: varAlpha(greyChannel, 0.65) },\n '&::-webkit-scrollbar-corner': { backgroundColor: 'transparent' },\n // Change colour only: revealing a thumb must not change the scrollport's\n // geometry. Touch and high-contrast interfaces retain native discoverability.\n '@media (hover: hover) and (pointer: fine) and (forced-colors: none)': {\n scrollbarColor: autoHide ? 'transparent transparent' : `${varAlpha(greyChannel, 0.4)} transparent`,\n '&::-webkit-scrollbar-thumb': {\n backgroundColor: autoHide ? 'transparent' : varAlpha(greyChannel, 0.4),\n },\n '&:hover, &:focus-within': {\n scrollbarColor: `${varAlpha(greyChannel, 0.4)} transparent`,\n '&::-webkit-scrollbar-thumb': { backgroundColor: varAlpha(greyChannel, 0.4) },\n '&::-webkit-scrollbar-thumb:hover': { backgroundColor: varAlpha(greyChannel, 0.65) },\n },\n },\n '@media (forced-colors: active)': {\n scrollbarColor: 'auto',\n scrollbarWidth: 'auto',\n '&::-webkit-scrollbar-thumb': { backgroundColor: 'CanvasText' },\n },\n };\n}\n\n// =============================================================================\n// KEYFRAME ANIMATIONS\n// =============================================================================\n\n/**\n * Spin animation keyframes (for loading spinners).\n */\nexport const spinKeyframes = {\n '@keyframes prism-spin': {\n from: { transform: 'rotate(0deg)' },\n to: { transform: 'rotate(360deg)' },\n },\n};\n\n/**\n * Dash animation keyframes (for SVG stroke animations).\n */\nexport const dashKeyframes = {\n '@keyframes prism-dash': {\n '0%': { strokeDasharray: '1, 200', strokeDashoffset: 0 },\n '50%': { strokeDasharray: '100, 200', strokeDashoffset: -15 },\n '100%': { strokeDasharray: '100, 200', strokeDashoffset: -125 },\n },\n};\n\n/**\n * Pulse animation keyframes.\n */\nexport const pulseKeyframes = {\n '@keyframes prism-pulse': {\n '0%': { transform: 'scale(1)', opacity: 1 },\n '50%': { transform: 'scale(1.05)', opacity: 0.7 },\n '100%': { transform: 'scale(1)', opacity: 1 },\n },\n};\n\n/**\n * Shimmer animation for skeleton loading.\n */\nexport const shimmerKeyframes = {\n '@keyframes prism-shimmer': {\n '0%': { backgroundPosition: '-200% 0' },\n '100%': { backgroundPosition: '200% 0' },\n },\n};\n\n/**\n * Fade in animation.\n */\nexport const fadeInKeyframes = {\n '@keyframes prism-fadeIn': {\n from: { opacity: 0 },\n to: { opacity: 1 },\n },\n};\n\n/**\n * Slide up animation.\n */\nexport const slideUpKeyframes = {\n '@keyframes prism-slideUp': {\n from: { transform: 'translateY(16px)', opacity: 0 },\n to: { transform: 'translateY(0)', opacity: 1 },\n },\n};\n\n// =============================================================================\n// BASIC MIXINS\n// =============================================================================\n\n/**\n * MUI mixins configuration.\n */\nexport const mixins = {\n toolbar: {\n minHeight: 56,\n '@media (min-width:0px)': {\n '@media (orientation: landscape)': {\n minHeight: 48,\n },\n },\n '@media (min-width:600px)': {\n minHeight: 64,\n },\n },\n // Extended mixins\n hideScrollX: {\n msOverflowStyle: 'none' as const,\n scrollbarWidth: 'none' as const,\n overflowX: 'auto' as const,\n '&::-webkit-scrollbar': { display: 'none' },\n },\n hideScrollY: {\n msOverflowStyle: 'none' as const,\n scrollbarWidth: 'none' as const,\n overflowY: 'auto' as const,\n '&::-webkit-scrollbar': { display: 'none' },\n },\n // Style functions (attached at theme creation)\n bgBlur,\n bgGradient,\n maxLine,\n softStyles,\n filledStyles,\n paperStyles,\n menuItemStyles,\n varAlpha,\n textGradient,\n borderGradient,\n scrollbarStyles,\n};\n\n/**\n * Hide scrollbar mixin.\n */\nexport const hideScrollbarMixin = {\n scrollbarWidth: 'none' as const,\n msOverflowStyle: 'none' as const,\n '&::-webkit-scrollbar': {\n display: 'none',\n },\n};\n\n/**\n * Custom scrollbar mixin.\n */\nexport function customScrollbarMixin(theme: Theme): CSSObject {\n return scrollbarStyles(theme);\n}\n\n/**\n * Text overflow ellipsis mixin.\n */\nexport const textEllipsisMixin = {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap' as const,\n};\n\n/**\n * Multi-line text overflow mixin.\n */\nexport function multiLineEllipsisMixin(lines: number) {\n return {\n overflow: 'hidden',\n display: '-webkit-box',\n WebkitBoxOrient: 'vertical' as const,\n WebkitLineClamp: lines,\n };\n}\n\n/**\n * Focus visible ring mixin.\n */\nexport const focusRingMixin = {\n '&:focus-visible': {\n outline: 'none',\n boxShadow: '0 0 0 2px var(--prism-background, #FFF), 0 0 0 4px var(--prism-primary, #3385F0)',\n },\n};\n\n/**\n * Glass/blur background mixin.\n */\nexport const glassMixin = {\n backdropFilter: 'blur(20px)',\n backgroundColor: 'var(--prism-vibrant-overlay, rgba(255, 255, 255, 0.7))',\n};\n"]}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { TableViewport, isRowActionTarget } from './chunk-2KG2NI73.js';
|
|
2
|
+
import { useCallback, useMemo, useState } from 'react';
|
|
3
|
+
import MuiTable from '@mui/material/Table';
|
|
4
|
+
import TableBody from '@mui/material/TableBody';
|
|
5
|
+
import TableCell from '@mui/material/TableCell';
|
|
6
|
+
import TableHead from '@mui/material/TableHead';
|
|
7
|
+
import TableRow from '@mui/material/TableRow';
|
|
8
|
+
import TableSortLabel from '@mui/material/TableSortLabel';
|
|
9
|
+
import TablePagination from '@mui/material/TablePagination';
|
|
10
|
+
import Checkbox from '@mui/material/Checkbox';
|
|
11
|
+
import Skeleton from '@mui/material/Skeleton';
|
|
12
|
+
import Paper from '@mui/material/Paper';
|
|
13
|
+
import Box from '@mui/material/Box';
|
|
14
|
+
import Typography from '@mui/material/Typography';
|
|
15
|
+
import { styled, alpha } from '@mui/material/styles';
|
|
16
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
17
|
+
|
|
18
|
+
var StyledTableContainer = styled(Paper)(({ theme }) => ({
|
|
19
|
+
borderRadius: theme.shape.borderRadius,
|
|
20
|
+
border: `1px solid ${theme.palette.divider}`,
|
|
21
|
+
overflow: "hidden",
|
|
22
|
+
minWidth: 0,
|
|
23
|
+
maxWidth: "100%"
|
|
24
|
+
}));
|
|
25
|
+
var StyledTableHead = styled(TableHead)(({ theme }) => ({
|
|
26
|
+
backgroundColor: alpha(theme.palette.grey[500], 0.08),
|
|
27
|
+
"& .MuiTableCell-head": {
|
|
28
|
+
fontWeight: 600,
|
|
29
|
+
backgroundColor: theme.vars?.palette.background.paper ?? theme.palette.background.paper
|
|
30
|
+
}
|
|
31
|
+
}));
|
|
32
|
+
var StyledTableRow = styled(TableRow)(({ theme }) => ({
|
|
33
|
+
"&:hover": {
|
|
34
|
+
backgroundColor: alpha(theme.palette.primary.main, 0.04)
|
|
35
|
+
},
|
|
36
|
+
"&.Mui-selected": {
|
|
37
|
+
backgroundColor: alpha(theme.palette.primary.main, 0.08),
|
|
38
|
+
"&:hover": {
|
|
39
|
+
backgroundColor: alpha(theme.palette.primary.main, 0.12)
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}));
|
|
43
|
+
function Table({
|
|
44
|
+
columns,
|
|
45
|
+
data,
|
|
46
|
+
rowKey = "id",
|
|
47
|
+
selectable = false,
|
|
48
|
+
selected = [],
|
|
49
|
+
onSelectChange,
|
|
50
|
+
sortable = false,
|
|
51
|
+
sortBy,
|
|
52
|
+
sortOrder = "asc",
|
|
53
|
+
onSortChange,
|
|
54
|
+
paginated = false,
|
|
55
|
+
page = 0,
|
|
56
|
+
rowsPerPage = 10,
|
|
57
|
+
totalRows,
|
|
58
|
+
onPageChange,
|
|
59
|
+
onRowsPerPageChange,
|
|
60
|
+
rowsPerPageOptions = [5, 10, 25, 50],
|
|
61
|
+
emptyContent,
|
|
62
|
+
loading = false,
|
|
63
|
+
loadingRows = 5,
|
|
64
|
+
dense = false,
|
|
65
|
+
stickyHeader = false,
|
|
66
|
+
maxHeight,
|
|
67
|
+
onRowClick,
|
|
68
|
+
containerSx,
|
|
69
|
+
scrollLabel,
|
|
70
|
+
sx,
|
|
71
|
+
ref,
|
|
72
|
+
...other
|
|
73
|
+
}) {
|
|
74
|
+
const getRowKey = useCallback(
|
|
75
|
+
(row, index) => {
|
|
76
|
+
if (typeof rowKey === "function") {
|
|
77
|
+
return rowKey(row);
|
|
78
|
+
}
|
|
79
|
+
const keyValue = row[rowKey];
|
|
80
|
+
return keyValue !== void 0 ? String(keyValue) : index;
|
|
81
|
+
},
|
|
82
|
+
[rowKey]
|
|
83
|
+
);
|
|
84
|
+
const isAllSelected = useMemo(
|
|
85
|
+
() => data.length > 0 && selected.length === data.length,
|
|
86
|
+
[data.length, selected.length]
|
|
87
|
+
);
|
|
88
|
+
const isIndeterminate = useMemo(
|
|
89
|
+
() => selected.length > 0 && selected.length < data.length,
|
|
90
|
+
[data.length, selected.length]
|
|
91
|
+
);
|
|
92
|
+
const handleSelectAll = useCallback(
|
|
93
|
+
(event) => {
|
|
94
|
+
if (event.target.checked) {
|
|
95
|
+
const allKeys = data.map((row, index) => getRowKey(row, index));
|
|
96
|
+
onSelectChange?.(allKeys);
|
|
97
|
+
} else {
|
|
98
|
+
onSelectChange?.([]);
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
[data, getRowKey, onSelectChange]
|
|
102
|
+
);
|
|
103
|
+
const handleSelectRow = useCallback(
|
|
104
|
+
(key) => {
|
|
105
|
+
const newSelected = selected.includes(key) ? selected.filter((k) => k !== key) : [...selected, key];
|
|
106
|
+
onSelectChange?.(newSelected);
|
|
107
|
+
},
|
|
108
|
+
[selected, onSelectChange]
|
|
109
|
+
);
|
|
110
|
+
const handleSort = useCallback(
|
|
111
|
+
(columnId) => {
|
|
112
|
+
const isAsc = sortBy === columnId && sortOrder === "asc";
|
|
113
|
+
onSortChange?.(columnId, isAsc ? "desc" : "asc");
|
|
114
|
+
},
|
|
115
|
+
[sortBy, sortOrder, onSortChange]
|
|
116
|
+
);
|
|
117
|
+
const handlePageChange = useCallback(
|
|
118
|
+
(_, newPage) => {
|
|
119
|
+
onPageChange?.(newPage);
|
|
120
|
+
},
|
|
121
|
+
[onPageChange]
|
|
122
|
+
);
|
|
123
|
+
const handleRowsPerPageChange = useCallback(
|
|
124
|
+
(event) => {
|
|
125
|
+
onRowsPerPageChange?.(parseInt(event.target.value, 10));
|
|
126
|
+
onPageChange?.(0);
|
|
127
|
+
},
|
|
128
|
+
[onRowsPerPageChange, onPageChange]
|
|
129
|
+
);
|
|
130
|
+
const total = totalRows ?? data.length;
|
|
131
|
+
const displayData = useMemo(() => {
|
|
132
|
+
if (paginated && totalRows === void 0) {
|
|
133
|
+
return data.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage);
|
|
134
|
+
}
|
|
135
|
+
return data;
|
|
136
|
+
}, [data, paginated, page, rowsPerPage, totalRows]);
|
|
137
|
+
if (!loading && data.length === 0) {
|
|
138
|
+
return /* @__PURE__ */ jsx(StyledTableContainer, { sx: containerSx, children: /* @__PURE__ */ jsx(Box, { sx: { p: 4, textAlign: "center" }, children: emptyContent || /* @__PURE__ */ jsx(
|
|
139
|
+
Typography,
|
|
140
|
+
{
|
|
141
|
+
sx: {
|
|
142
|
+
color: "text.secondary"
|
|
143
|
+
},
|
|
144
|
+
children: "No data available"
|
|
145
|
+
}
|
|
146
|
+
) }) });
|
|
147
|
+
}
|
|
148
|
+
return /* @__PURE__ */ jsxs(StyledTableContainer, { sx: containerSx, children: [
|
|
149
|
+
/* @__PURE__ */ jsx(TableViewport, { label: scrollLabel, maxHeight, children: /* @__PURE__ */ jsxs(MuiTable, { ref, stickyHeader, size: dense ? "small" : "medium", sx, ...other, children: [
|
|
150
|
+
/* @__PURE__ */ jsx(StyledTableHead, { children: /* @__PURE__ */ jsxs(TableRow, { children: [
|
|
151
|
+
selectable && /* @__PURE__ */ jsx(TableCell, { padding: "checkbox", children: /* @__PURE__ */ jsx(Checkbox, { indeterminate: isIndeterminate, checked: isAllSelected, onChange: handleSelectAll }) }),
|
|
152
|
+
columns.map((column) => /* @__PURE__ */ jsx(
|
|
153
|
+
TableCell,
|
|
154
|
+
{
|
|
155
|
+
align: column.align || "left",
|
|
156
|
+
style: { width: column.width, minWidth: column.minWidth },
|
|
157
|
+
sortDirection: sortBy === column.id ? sortOrder : false,
|
|
158
|
+
children: sortable && column.sortable !== false ? /* @__PURE__ */ jsx(
|
|
159
|
+
TableSortLabel,
|
|
160
|
+
{
|
|
161
|
+
active: sortBy === column.id,
|
|
162
|
+
direction: sortBy === column.id ? sortOrder : "asc",
|
|
163
|
+
onClick: () => handleSort(String(column.id)),
|
|
164
|
+
children: column.label
|
|
165
|
+
}
|
|
166
|
+
) : column.label
|
|
167
|
+
},
|
|
168
|
+
String(column.id)
|
|
169
|
+
))
|
|
170
|
+
] }) }),
|
|
171
|
+
/* @__PURE__ */ jsxs(TableBody, { children: [
|
|
172
|
+
loading && Array.from({ length: Math.max(1, loadingRows) }, (_, rowIndex) => /* @__PURE__ */ jsxs(TableRow, { children: [
|
|
173
|
+
selectable && /* @__PURE__ */ jsx(TableCell, { padding: "checkbox", children: /* @__PURE__ */ jsx(Skeleton, { variant: "rectangular", width: 18, height: 18 }) }),
|
|
174
|
+
columns.map((column) => /* @__PURE__ */ jsx(TableCell, { align: column.align || "left", children: /* @__PURE__ */ jsx(Skeleton, { variant: "text", width: column.width ?? "80%" }) }, String(column.id)))
|
|
175
|
+
] }, `loading-${rowIndex}`)),
|
|
176
|
+
!loading && displayData.map((row, index) => {
|
|
177
|
+
const key = getRowKey(row, index);
|
|
178
|
+
const isSelected = selected.includes(key);
|
|
179
|
+
return /* @__PURE__ */ jsxs(
|
|
180
|
+
StyledTableRow,
|
|
181
|
+
{
|
|
182
|
+
hover: true,
|
|
183
|
+
selected: isSelected,
|
|
184
|
+
tabIndex: onRowClick || selectable ? -1 : void 0,
|
|
185
|
+
"data-row-action": onRowClick ? true : void 0,
|
|
186
|
+
onClick: onRowClick ? (event) => {
|
|
187
|
+
if (isRowActionTarget(event.target)) onRowClick(row, index);
|
|
188
|
+
} : void 0,
|
|
189
|
+
sx: {
|
|
190
|
+
cursor: onRowClick ? "pointer" : "default",
|
|
191
|
+
"&:focus-visible": { outline: "2px solid", outlineColor: "primary.main", outlineOffset: -2 }
|
|
192
|
+
},
|
|
193
|
+
children: [
|
|
194
|
+
selectable && /* @__PURE__ */ jsx(TableCell, { padding: "checkbox", children: /* @__PURE__ */ jsx(
|
|
195
|
+
Checkbox,
|
|
196
|
+
{
|
|
197
|
+
checked: isSelected,
|
|
198
|
+
onClick: (e) => e.stopPropagation(),
|
|
199
|
+
onChange: () => handleSelectRow(key)
|
|
200
|
+
}
|
|
201
|
+
) }),
|
|
202
|
+
columns.map((column) => {
|
|
203
|
+
const value = row[column.id];
|
|
204
|
+
return /* @__PURE__ */ jsx(TableCell, { align: column.align || "left", children: column.render ? column.render(row, index) : column.format ? column.format(value) : String(value ?? "") }, String(column.id));
|
|
205
|
+
})
|
|
206
|
+
]
|
|
207
|
+
},
|
|
208
|
+
key
|
|
209
|
+
);
|
|
210
|
+
})
|
|
211
|
+
] })
|
|
212
|
+
] }) }),
|
|
213
|
+
paginated && /* @__PURE__ */ jsx(
|
|
214
|
+
TablePagination,
|
|
215
|
+
{
|
|
216
|
+
component: "div",
|
|
217
|
+
count: total,
|
|
218
|
+
page,
|
|
219
|
+
rowsPerPage,
|
|
220
|
+
rowsPerPageOptions,
|
|
221
|
+
onPageChange: handlePageChange,
|
|
222
|
+
onRowsPerPageChange: handleRowsPerPageChange
|
|
223
|
+
}
|
|
224
|
+
)
|
|
225
|
+
] });
|
|
226
|
+
}
|
|
227
|
+
function useTable({
|
|
228
|
+
data,
|
|
229
|
+
defaultPage = 0,
|
|
230
|
+
defaultRowsPerPage = 10,
|
|
231
|
+
defaultSortBy,
|
|
232
|
+
defaultSortOrder = "asc"
|
|
233
|
+
}) {
|
|
234
|
+
const [page, setPage] = useState(defaultPage);
|
|
235
|
+
const [rowsPerPage, setRowsPerPage] = useState(defaultRowsPerPage);
|
|
236
|
+
const [sortBy, setSortBy] = useState(defaultSortBy);
|
|
237
|
+
const [sortOrder, setSortOrder] = useState(defaultSortOrder);
|
|
238
|
+
const [selected, setSelected] = useState([]);
|
|
239
|
+
const handleSort = useCallback((column, order) => {
|
|
240
|
+
setSortBy(column);
|
|
241
|
+
setSortOrder(order);
|
|
242
|
+
}, []);
|
|
243
|
+
const sortedData = useMemo(() => {
|
|
244
|
+
if (!sortBy) return data;
|
|
245
|
+
return [...data].sort((a, b) => {
|
|
246
|
+
const aValue = a[sortBy];
|
|
247
|
+
const bValue = b[sortBy];
|
|
248
|
+
if (aValue === bValue) return 0;
|
|
249
|
+
if (aValue === null || aValue === void 0) return 1;
|
|
250
|
+
if (bValue === null || bValue === void 0) return -1;
|
|
251
|
+
const comparison = aValue < bValue ? -1 : 1;
|
|
252
|
+
return sortOrder === "asc" ? comparison : -comparison;
|
|
253
|
+
});
|
|
254
|
+
}, [data, sortBy, sortOrder]);
|
|
255
|
+
const displayData = useMemo(() => {
|
|
256
|
+
const start = page * rowsPerPage;
|
|
257
|
+
return sortedData.slice(start, start + rowsPerPage);
|
|
258
|
+
}, [sortedData, page, rowsPerPage]);
|
|
259
|
+
const reset = useCallback(() => {
|
|
260
|
+
setPage(defaultPage);
|
|
261
|
+
setRowsPerPage(defaultRowsPerPage);
|
|
262
|
+
setSortBy(defaultSortBy);
|
|
263
|
+
setSortOrder(defaultSortOrder);
|
|
264
|
+
setSelected([]);
|
|
265
|
+
}, [defaultPage, defaultRowsPerPage, defaultSortBy, defaultSortOrder]);
|
|
266
|
+
return {
|
|
267
|
+
page,
|
|
268
|
+
setPage,
|
|
269
|
+
rowsPerPage,
|
|
270
|
+
setRowsPerPage,
|
|
271
|
+
sortBy,
|
|
272
|
+
sortOrder,
|
|
273
|
+
handleSort,
|
|
274
|
+
selected,
|
|
275
|
+
setSelected,
|
|
276
|
+
displayData,
|
|
277
|
+
totalRows: data.length,
|
|
278
|
+
reset
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
export { Table, useTable };
|
|
283
|
+
//# sourceMappingURL=chunk-JTIUGPW5.js.map
|
|
284
|
+
//# sourceMappingURL=chunk-JTIUGPW5.js.map
|