@zendir/ui 0.1.4 → 0.1.6
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/dist/react/astro/MonitoringIcon.js +19 -22
- package/dist/react/astro/MonitoringIcon.js.map +1 -1
- package/dist/react/core/Icon.d.ts +1 -1
- package/dist/react/core/Icon.js +31 -40
- package/dist/react/core/Icon.js.map +1 -1
- package/dist/react/core/SideNav.js +3 -2
- package/dist/react/core/SideNav.js.map +1 -1
- package/dist/react/visualizations/ThermalHeatmapCard.js +1 -1
- package/dist/react/visualizations/ThermalHeatmapCard.js.map +1 -1
- package/package.json +1 -1
|
@@ -60,26 +60,26 @@ const renderStatusSymbol = (status, size, fillColor, borderColor, glow) => {
|
|
|
60
60
|
}
|
|
61
61
|
};
|
|
62
62
|
const ICON_PATHS = {
|
|
63
|
-
// Astro Icons (Space/Mission)
|
|
64
|
-
thermal: "
|
|
65
|
-
"propulsion-power": "
|
|
66
|
-
payload: "
|
|
67
|
-
netcom: "
|
|
68
|
-
antenna: "M12
|
|
69
|
-
solar: "
|
|
70
|
-
altitude: "M12
|
|
71
|
-
processor: "
|
|
72
|
-
mission: "M12
|
|
73
|
-
equipment: "M22
|
|
74
|
-
"satellite-transmit": "
|
|
75
|
-
"satellite-receive": "
|
|
76
|
-
"satellite-off": "
|
|
77
|
-
hardware: "
|
|
63
|
+
// Astro Icons (Space/Mission) - Paths from @astrouxds/astro-web-components
|
|
64
|
+
thermal: "M10.5 2C12.433 2 14 3.567 14 5.5L14.0005 12.2576C15.2217 13.2664 16 14.7923 16 16.5C16 19.5376 13.5376 22 10.5 22C7.46243 22 5 19.5376 5 16.5C5 14.7919 5.77868 13.2656 7.00044 12.2568L7 5.5C7 3.567 8.567 2 10.5 2ZM10.5 4C9.7203 4 9.07955 4.59489 9.00687 5.35543L9 5.49987L9.0005 13.199L8.27384 13.799C7.47135 14.4616 7 15.4402 7 16.5C7 18.433 8.567 20 10.5 20C12.433 20 14 18.433 14 16.5C14 15.5111 13.5896 14.593 12.8828 13.9362L12.7268 13.7995L12.0006 13.1997L12 5.5C12 4.7203 11.4051 4.07955 10.6445 4.00687L10.5 4ZM11 5.5C11 5.22386 10.7761 5 10.5 5C10.2239 5 10 5.22386 10 5.5L10.0006 14.0499C8.85917 14.2813 8 15.2903 8 16.5C8 17.8807 9.11929 19 10.5 19C11.8807 19 13 17.8807 13 16.5C13 15.2907 12.1413 14.2819 11.0004 14.0501L11 5.5ZM20 11C20.5523 11 21 11.4477 21 12C21 12.5523 20.5523 13 20 13H17C16.4477 13 16 12.5523 16 12C16 11.4477 16.4477 11 17 11H20ZM19 9C19 8.44772 18.5523 8 18 8H17C16.4477 8 16 8.44772 16 9C16 9.55228 16.4477 10 17 10H18C18.5523 10 19 9.55228 19 9ZM20 5C20.5523 5 21 5.44772 21 6C21 6.55228 20.5523 7 20 7H17C16.4477 7 16 6.55228 16 6C16 5.44772 16.4477 5 17 5H20ZM19 3C19 2.44772 18.5523 2 18 2H17C16.4477 2 16 2.44772 16 3C16 3.55228 16.4477 4 17 4H18C18.5523 4 19 3.55228 19 3Z",
|
|
65
|
+
"propulsion-power": "M16 2C17.1046 2 18 2.89543 18 4V20C18 21.1046 17.1046 22 16 22H9C7.89543 22 7 21.1046 7 20V4C7 2.89543 7.89543 2 9 2H16ZM13.8115 5.69961C13.8115 5.00797 12.9835 4.75858 12.631 5.27555L12.5794 5.36359L9.0799 12.364C8.8597 12.8083 9.11904 13.3258 9.55954 13.3928L9.6566 13.4001H11.1901V18.3004C11.1901 18.992 12.0181 19.2414 12.3706 18.7245L12.4222 18.6364L15.9217 11.636C16.1419 11.1917 15.8711 10.6742 15.4398 10.6072L15.345 10.5999H13.8115V5.69961Z",
|
|
66
|
+
payload: "M12.6802 2.24483L12.8418 2.31637L20.8418 6.31637C21.4305 6.6107 21.819 7.18871 21.8753 7.83667L21.8824 8V16C21.8824 16.6581 21.5391 17.2641 20.9848 17.6043L20.8418 17.6836L12.8418 21.6836C12.3649 21.9221 11.812 21.9459 11.3198 21.7552L11.1582 21.6836L3.15821 17.6836C2.56956 17.3893 2.18104 16.8113 2.12475 16.1633L2.11768 16V8C2.11768 7.34186 2.46091 6.73586 3.0153 6.39574L3.15821 6.31637L3.4276 6.17973C3.50773 6.12386 3.59511 6.0805 3.6866 6.05036L11.1582 2.31637C11.5822 2.1044 12.0662 2.062 12.5141 2.18919L12.6802 2.24483ZM3.99968 8.17865L4.00003 16L10.9997 19.4996V12.5536L3.99968 8.17865ZM12.9997 12.6176L19.9997 9.11765L20 16L12.9997 19.4996V12.6176ZM18.5 15C18.7762 15 19 15.2239 19 15.5C19 15.7761 18.7762 16 18.5 16C18.2239 16 18 15.7761 18 15.5C18 15.2239 18.2239 15 18.5 15ZM6.00003 15.5C6.00003 15.2239 5.77617 15 5.50003 15C5.22389 15 5.00003 15.2239 5.00003 15.5C5.00003 15.7761 5.22389 16 5.50003 16C5.77617 16 6.00003 15.7761 6.00003 15.5ZM16.5 14C16.7762 14 17 14.2239 17 14.5C17 14.7761 16.7762 15 16.5 15C16.2239 15 16 14.7761 16 14.5C16 14.2239 16.2239 14 16.5 14ZM8.00003 14.5C8.00003 14.2239 7.77617 14 7.50003 14C7.22389 14 7.00003 14.2239 7.00003 14.5C7.00003 14.7761 7.22389 15 7.50003 15C7.77617 15 8.00003 14.7761 8.00003 14.5ZM9.50003 13C9.77617 13 10 13.2239 10 13.5C10 13.7761 9.77617 14 9.50003 14C9.22389 14 9.00003 13.7761 9.00003 13.5C9.00003 13.2239 9.22389 13 9.50003 13ZM15 13.5C15 13.2239 14.7762 13 14.5 13C14.2239 13 14 13.2239 14 13.5C14 13.7761 14.2239 14 14.5 14C14.7762 14 15 13.7761 15 13.5ZM12 4L5.93668 7.03065L12.053 10.854L18.8807 7.44065L12 4ZM12.5 9.5C12.5 9.22386 12.2762 9 12 9C11.7239 9 11.5 9.22386 11.5 9.5C11.5 9.77614 11.7239 10 12 10C12.2762 10 12.5 9.77614 12.5 9.5ZM12 7C12.2762 7 12.5 7.22386 12.5 7.5C12.5 7.77614 12.2762 8 12 8C11.7239 8 11.5 7.77614 11.5 7.5C11.5 7.22386 11.7239 7 12 7ZM12.5 5.5C12.5 5.22386 12.2762 5 12 5C11.7239 5 11.5 5.22386 11.5 5.5C11.5 5.77614 11.7239 6 12 6C12.2762 6 12.5 5.77614 12.5 5.5Z",
|
|
67
|
+
netcom: "M16 2C17.6569 2 19 3.34315 19 5C19 6.65685 17.6569 8 16 8C15.8259 8 15.6553 7.98518 15.4894 7.95672L14.8034 9.14676C15.3137 9.64825 15.6902 10.2856 15.874 11.0002L18.2676 10.9999C18.6134 10.4022 19.2597 10 20 10C21.1046 10 22 10.8954 22 12C22 13.1046 21.1046 14 20 14C19.2602 14 18.6142 13.5983 18.2682 13.0011L15.8738 13.0008C15.6717 13.7853 15.2375 14.4767 14.6488 14.9974L15.2128 16.1044C15.4637 16.0363 15.7276 16 16 16C17.6569 16 19 17.3431 19 19C19 20.6569 17.6569 22 16 22C14.3431 22 13 20.6569 13 19C13 18.3508 13.2062 17.7498 13.5567 17.2589L12.8669 15.9058C12.5878 15.9675 12.2977 16 12 16C11.2582 16 10.5635 15.7981 9.96801 15.4462L7.75736 17.6569L7.59355 17.4912C7.85196 17.9345 8 18.4499 8 19C8 20.6569 6.65685 22 5 22C3.34315 22 2 20.6569 2 19C2 17.3431 3.34315 16 5 16C5.55006 16 6.06555 16.148 6.50879 16.4065L6.34315 16.2426L8.55383 14.032C8.20193 13.4365 8 12.7418 8 12C8 9.79086 9.79086 8 12 8C12.3705 8 12.7293 8.05038 13.0698 8.14467L13.7446 6.97823C13.281 6.45014 13 5.75789 13 5C13 3.34315 14.3431 2 16 2ZM12 10C10.8954 10 10 10.8954 10 12C10 13.1046 10.8954 14 12 14C13.1046 14 14 13.1046 14 12C14 10.8954 13.1046 10 12 10Z",
|
|
68
|
+
antenna: "M12.5 8C13.6506 8 14.5833 8.89543 14.5833 10C14.5833 10.7398 14.1649 11.3858 13.5428 11.7318L13.5416 22H11.4583L11.4582 11.7324C10.8356 11.3866 10.4166 10.7403 10.4166 10C10.4166 8.89543 11.3494 8 12.5 8ZM6.63099 2.32732C6.98124 2.70075 7.0016 3.27819 6.64763 3.65177C3.61283 6.82949 3.34936 11.6553 6.02151 15.1201C6.33286 15.5271 6.26451 16.1001 5.86774 16.4431C5.40872 16.8398 4.68582 16.775 4.3192 16.294C1.13831 12.1519 1.38131 6.45292 4.85709 2.56983L5.07393 2.33438L5.1678 2.24643C5.59314 1.89421 6.24722 1.91815 6.63099 2.32732ZM19.9142 2.24643L20.0081 2.33438C23.6894 6.21966 24.0087 12.0674 20.7628 16.294C20.3962 16.775 19.6733 16.8398 19.2143 16.4431C18.8175 16.1001 18.7492 15.5271 19.0605 15.1201C21.7327 11.6553 21.4692 6.82949 18.4344 3.65177C18.0804 3.27819 18.1008 2.70075 18.4511 2.32732C18.8348 1.91815 19.4889 1.89421 19.9142 2.24643ZM9.8013 5.34518C10.1466 5.71337 10.1537 6.26509 9.82646 6.65682C8.45162 8.33503 8.32337 10.6773 9.50741 12.4838C9.79011 12.9062 9.72281 13.4541 9.33916 13.7858C8.86156 14.1986 8.10517 14.1177 7.75278 13.6059C6.10277 11.1439 6.21558 7.93692 8.0237 5.58971L8.20397 5.3653L8.28854 5.2755C8.70418 4.88648 9.40006 4.91737 9.8013 5.34518ZM16.7935 5.2755L16.8781 5.3653C18.8573 7.72924 19.0325 11.0644 17.3292 13.6059C16.9769 14.1177 16.2205 14.1986 15.7429 13.7858C15.3592 13.4541 15.2919 12.9062 15.5746 12.4838C16.7586 10.6773 16.6304 8.33503 15.2556 6.65682C14.9283 6.26509 14.9354 5.71337 15.2807 5.34518C15.682 4.91737 16.3778 4.88648 16.7935 5.2755Z",
|
|
69
|
+
solar: "M19.5385 4C20.3456 4 21 4.67008 21 5.49666V17.5033C21 18.3299 20.3456 19 19.5385 19H3.46154C2.65436 19 2 18.3299 2 17.5033V5.49666C2 4.67008 2.65436 4 3.46154 4H19.5385ZM7 6H4V11H7V6ZM11 6H8V11H11V6ZM15 6H12V11H15V6ZM19 6H16V11H19V6ZM7 12H4V17H7V12ZM11 12H8V17H11V12ZM15 12H12V17H15V12ZM19 12H16V17H19V12Z",
|
|
70
|
+
altitude: "M12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2ZM12 4C7.58172 4 4 7.58172 4 12C4 16.4183 7.58172 20 12 20C16.4183 20 20 16.4183 20 12C20 7.58172 16.4183 4 12 4ZM14 18C14 17.4477 13.5523 17 13 17H11C10.4477 17 10 17.4477 10 18C10 18.5523 10.4477 19 11 19H13C13.5523 19 14 18.5523 14 18ZM14 14C14.5523 14 15 14.4477 15 15C15 15.5523 14.5523 16 14 16H10C9.44772 16 9 15.5523 9 15C9 14.4477 9.44772 14 10 14H14ZM16 12L19 14V10L16 12ZM5 10L8 12L5 14V10ZM14 12C14 11.4477 13.5523 11 13 11H11C10.4477 11 10 11.4477 10 12C10 12.5523 10.4477 13 11 13H13C13.5523 13 14 12.5523 14 12ZM14 8C14.5523 8 15 8.44772 15 9C15 9.55228 14.5523 10 14 10H10C9.44772 10 9 9.55228 9 9C9 8.44772 9.44772 8 10 8H14ZM14 6C14 5.44772 13.5523 5 13 5H11C10.4477 5 10 5.44772 10 6C10 6.55228 10.4477 7 11 7H13C13.5523 7 14 6.55228 14 6Z",
|
|
71
|
+
processor: "M9 20V22H7V20H9ZM13 20V22H11V20H13ZM17 20V22H15V20H17ZM17 5C18.1046 5 19 5.89543 19 7V17C19 18.1046 18.1046 19 17 19H7C5.89543 19 5 18.1046 5 17V7C5 5.89543 5.89543 5 7 5H17ZM17 16C16.4477 16 16 16.4477 16 17C16 17.5523 16.4477 18 17 18C17.5523 18 18 17.5523 18 17C18 16.4477 17.5523 16 17 16ZM4 15V17H2V15H4ZM22 15V17H20V15H22ZM4 11V13H2V11H4ZM22 11V13H20V11H22ZM4 7V9H2V7H4ZM22 7V9H20V7H22ZM7 6C6.44772 6 6 6.44772 6 7C6 7.55228 6.44772 8 7 8C7.55228 8 8 7.55228 8 7C8 6.44772 7.55228 6 7 6ZM9 2V4H7V2H9ZM13 2V4H11V2H13ZM17 2V4H15V2H17Z",
|
|
72
|
+
mission: "M12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2ZM12 4C7.58172 4 4 7.58172 4 12C4 16.4183 7.58172 20 12 20C16.4183 20 20 16.4183 20 12C20 7.58172 16.4183 4 12 4ZM18 12C18 8.68629 15.3137 6 12 6C8.68629 6 6 8.68629 6 12C6 15.3137 8.68629 18 12 18C15.3137 18 18 15.3137 18 12ZM12 8C9.79086 8 8 9.79086 8 12C8 14.2091 9.79086 16 12 16C14.2091 16 16 14.2091 16 12C16 9.79086 14.2091 8 12 8ZM14 12C14 10.8954 13.1046 10 12 10C10.8954 10 10 10.8954 10 12C10 13.1046 10.8954 14 12 14C13.1046 14 14 13.1046 14 12Z",
|
|
73
|
+
equipment: "M22 5C22 3.89543 21.1046 3 20 3H4C2.89543 3 2 3.89543 2 5V9C2 10.1046 2.89543 11 4 11H20C21.1046 11 22 10.1046 22 9V5ZM22 15C22 13.8954 21.1046 13 20 13H4C2.89543 13 2 13.8954 2 15V19C2 20.1046 2.89543 21 4 21H20C21.1046 21 22 20.1046 22 19V15ZM4 15H20V19H4V15ZM7 16V18H5V16H7ZM10 18V16H8V18H10ZM13 16V18H11V16H13ZM20 5H4V9H20V5ZM7 8V6H5V8H7ZM10 6V8H8V6H10ZM13 8V6H11V8H13Z",
|
|
74
|
+
"satellite-transmit": "M8.87871 8.87868C9.65976 8.09763 10.9261 8.09763 11.7071 8.87868L13.1213 10.2929C13.9024 11.0739 13.9024 12.3403 13.1213 13.1213C12.3403 13.9024 11.074 13.9024 10.2929 13.1213L8.87871 11.7071C8.09766 10.9261 8.09766 9.65973 8.87871 8.87868ZM4.05657 15.3702C4.09551 15.3313 4.13761 15.2956 4.18243 15.2636L8.1716 12.4142L9.58581 13.8284L6.73641 17.8176C6.4154 18.267 5.79085 18.3711 5.34144 18.0501C5.29662 18.0181 5.25452 17.9824 5.21557 17.9435L4.05657 16.7845C3.66604 16.3939 3.66604 15.7608 4.05657 15.3702ZM20.9898 11C21.5828 11 22.0551 11.5125 21.9948 12.1055C21.4823 17.3315 17.3416 21.4721 12.1156 21.9947C11.5226 22.055 11 21.5927 11 20.9998C11 20.4973 11.3719 20.0551 11.8744 20.0048C16.1658 19.5928 19.5828 16.1757 19.9949 11.8844C20.0451 11.3819 20.4773 11 20.9898 11ZM16.9776 11C17.5946 11 18.08 11.546 17.989 12.1527C17.5035 15.1355 15.1469 17.5015 12.1531 17.9868C11.5462 18.088 11 17.5925 11 16.9757C11 16.4803 11.3641 16.0657 11.8597 15.9848C13.8884 15.6338 15.5032 14.0794 15.9425 12.083L15.9864 11.8595C16.0673 11.364 16.482 11 16.9776 11ZM16.6903 3.97335L16.7845 4.05653L17.9435 5.21554C17.9824 5.25449 18.0181 5.29659 18.0501 5.34141C18.3464 5.75625 18.2805 6.32032 17.9152 6.65713L17.8176 6.73638L13.8285 9.58578L12.4142 8.17157L15.2636 4.1824C15.2957 4.13758 15.3313 4.09548 15.3703 4.05653C15.7308 3.69605 16.298 3.66832 16.6903 3.97335Z",
|
|
75
|
+
"satellite-receive": "M5.53115 17.8387L6.58945 18.8268L8.92522 18.602L9.83101 20.4262C9.89964 20.5644 9.93535 20.7167 9.93535 20.871C9.93535 21.3838 9.54931 21.8065 9.05197 21.8642L8.93535 21.871H4.20497C3.9626 21.871 3.72849 21.7829 3.54616 21.6233C3.16263 21.2874 3.09746 20.7233 3.37588 20.3117L3.45266 20.2122L5.53115 17.8387ZM7.09757 10.0443C7.33377 10.0636 7.55543 10.1662 7.72301 10.3338L10.042 12.653L12 12L11.347 13.958L13.2146 15.8254C13.6051 16.2159 13.6051 16.8491 13.2146 17.2396C13.047 17.4072 12.8253 17.5098 12.5891 17.5291L7.30432 17.9622C7.01163 17.9862 6.7232 17.8803 6.51554 17.6726L5.87575 17.0328C5.66809 16.8252 5.56221 16.5368 5.58619 16.2441L6.01924 10.9593C6.06434 10.4088 6.54713 9.99916 7.09757 10.0443ZM14 9C14.5523 9 15 9.44772 15 10C15 10.5523 14.5523 11 14 11C13.4477 11 13 10.5523 13 10C13 9.44772 13.4477 9 14 9ZM16 7C16.5523 7 17 7.44772 17 8C17 8.55228 16.5523 9 16 9C15.4477 9 15 8.55228 15 8C15 7.44772 15.4477 7 16 7ZM18.5 4C19.3284 4 20 4.67157 20 5.5C20 6.32843 19.3284 7 18.5 7C17.6716 7 17 6.32843 17 5.5C17 4.67157 17.6716 4 18.5 4Z",
|
|
76
|
+
"satellite-off": "M8.87867 11.7071C8.09762 10.9261 8.09762 9.65973 8.87867 8.87868C9.65972 8.09763 10.926 8.09763 11.7071 8.87868L13.1213 10.2929C13.9024 11.0739 13.9024 12.3403 13.1213 13.1213C12.3403 13.9024 11.0739 13.9024 10.2929 13.1213L8.87867 11.7071ZM4.05653 16.7845C3.61958 16.3475 3.67956 15.6228 4.1824 15.2636L8.17156 12.4142L9.58578 13.8284L6.73637 17.8176C6.3772 18.3204 5.65248 18.3804 5.21553 17.9435L4.05653 16.7845ZM15.2636 4.1824C15.6228 3.67956 16.3475 3.61958 16.7844 4.05653L17.9435 5.21554C18.3804 5.65249 18.3204 6.37721 17.8176 6.73638L13.8284 9.58578L12.4142 8.17157L15.2636 4.1824Z",
|
|
77
|
+
hardware: "M4 17.8247V10.4692H20V17.8247H4ZM2 9.77297C2 9.05293 2.58371 8.46922 3.30375 8.46922H20.6962C21.4163 8.46922 22 9.05293 22 9.77298V18.5209C22 19.241 21.4163 19.8247 20.6962 19.8247H3.30375C2.58371 19.8247 2 19.241 2 18.5209V9.77297ZM8.99573 13.637H4.99573V11.637H8.99573V13.637ZM8.99573 16.642H4.99573V14.642H8.99573V16.642ZM10 13.637H14V11.637H10V13.637ZM14 16.642H10V14.642H14V16.642ZM14.9987 13.637H18.9987V11.637H14.9987V13.637ZM18.9987 16.6424H14.9987V14.6424H18.9987V16.6424Z",
|
|
78
78
|
release: "M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8-8-8z",
|
|
79
79
|
// Legacy aliases
|
|
80
|
-
satellite: "
|
|
81
|
-
power: "
|
|
82
|
-
comms: "
|
|
80
|
+
satellite: "M8.87867 11.7071C8.09762 10.9261 8.09762 9.65973 8.87867 8.87868C9.65972 8.09763 10.926 8.09763 11.7071 8.87868L13.1213 10.2929C13.9024 11.0739 13.9024 12.3403 13.1213 13.1213C12.3403 13.9024 11.0739 13.9024 10.2929 13.1213L8.87867 11.7071ZM4.05653 16.7845C3.61958 16.3475 3.67956 15.6228 4.1824 15.2636L8.17156 12.4142L9.58578 13.8284L6.73637 17.8176C6.3772 18.3204 5.65248 18.3804 5.21553 17.9435L4.05653 16.7845ZM15.2636 4.1824C15.6228 3.67956 16.3475 3.61958 16.7844 4.05653L17.9435 5.21554C18.3804 5.65249 18.3204 6.37721 17.8176 6.73638L13.8284 9.58578L12.4142 8.17157L15.2636 4.1824Z",
|
|
81
|
+
power: "M16 2C17.1046 2 18 2.89543 18 4V20C18 21.1046 17.1046 22 16 22H9C7.89543 22 7 21.1046 7 20V4C7 2.89543 7.89543 2 9 2H16ZM13.8115 5.69961C13.8115 5.00797 12.9835 4.75858 12.631 5.27555L12.5794 5.36359L9.0799 12.364C8.8597 12.8083 9.11904 13.3258 9.55954 13.3928L9.6566 13.4001H11.1901V18.3004C11.1901 18.992 12.0181 19.2414 12.3706 18.7245L12.4222 18.6364L15.9217 11.636C16.1419 11.1917 15.8711 10.6742 15.4398 10.6072L15.345 10.5999H13.8115V5.69961Z",
|
|
82
|
+
comms: "M16 2C17.6569 2 19 3.34315 19 5C19 6.65685 17.6569 8 16 8C15.8259 8 15.6553 7.98518 15.4894 7.95672L14.8034 9.14676C15.3137 9.64825 15.6902 10.2856 15.874 11.0002L18.2676 10.9999C18.6134 10.4022 19.2597 10 20 10C21.1046 10 22 10.8954 22 12C22 13.1046 21.1046 14 20 14C19.2602 14 18.6142 13.5983 18.2682 13.0011L15.8738 13.0008C15.6717 13.7853 15.2375 14.4767 14.6488 14.9974L15.2128 16.1044C15.4637 16.0363 15.7276 16 16 16C17.6569 16 19 17.3431 19 19C19 20.6569 17.6569 22 16 22C14.3431 22 13 20.6569 13 19C13 18.3508 13.2062 17.7498 13.5567 17.2589L12.8669 15.9058C12.5878 15.9675 12.2977 16 12 16C11.2582 16 10.5635 15.7981 9.96801 15.4462L7.75736 17.6569L7.59355 17.4912C7.85196 17.9345 8 18.4499 8 19C8 20.6569 6.65685 22 5 22C3.34315 22 2 20.6569 2 19C2 17.3431 3.34315 16 5 16C5.55006 16 6.06555 16.148 6.50879 16.4065L6.34315 16.2426L8.55383 14.032C8.20193 13.4365 8 12.7418 8 12C8 9.79086 9.79086 8 12 8C12.3705 8 12.7293 8.05038 13.0698 8.14467L13.7446 6.97823C13.281 6.45014 13 5.75789 13 5C13 3.34315 14.3431 2 16 2ZM12 10C10.8954 10 10 10.8954 10 12C10 13.1046 10.8954 14 12 14C13.1046 14 14 13.1046 14 12C14 10.8954 13.1046 10 12 10Z"
|
|
83
83
|
};
|
|
84
84
|
const renderPercentageArc = (percentage, statusColor, showValue = true, size = 48) => {
|
|
85
85
|
const pct = Math.max(0, Math.min(100, percentage));
|
|
@@ -201,10 +201,7 @@ const MonitoringIcon = memo(function MonitoringIcon2({
|
|
|
201
201
|
fill: "currentColor",
|
|
202
202
|
style: { width: 24, height: 24 },
|
|
203
203
|
"aria-hidden": "true",
|
|
204
|
-
children: iconPath ? /* @__PURE__ */ jsx("path", { d: iconPath }) : (
|
|
205
|
-
// Default mission icon
|
|
206
|
-
/* @__PURE__ */ jsx("path", { d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z" })
|
|
207
|
-
)
|
|
204
|
+
children: iconPath ? /* @__PURE__ */ jsx("path", { d: iconPath, fillRule: "evenodd", clipRule: "evenodd" }) : /* @__PURE__ */ jsx("path", { d: "M12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2ZM12 4C7.58172 4 4 7.58172 4 12C4 16.4183 7.58172 20 12 20C16.4183 20 20 16.4183 20 12C20 7.58172 16.4183 4 12 4ZM18 12C18 8.68629 15.3137 6 12 6C8.68629 6 6 8.68629 6 12C6 15.3137 8.68629 18 12 18C15.3137 18 18 15.3137 18 12ZM12 8C9.79086 8 8 9.79086 8 12C8 14.2091 9.79086 16 12 16C14.2091 16 16 14.2091 16 12C16 9.79086 14.2091 8 12 8ZM14 12C14 10.8954 13.1046 10 12 10C10.8954 10 10 10.8954 10 12C10 13.1046 10.8954 14 12 14C13.1046 14 14 13.1046 14 12Z", fillRule: "evenodd", clipRule: "evenodd" })
|
|
208
205
|
}
|
|
209
206
|
);
|
|
210
207
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MonitoringIcon.js","sources":["../../../src/react/astro/MonitoringIcon.tsx"],"sourcesContent":["/**\n * @zendir/ui - MonitoringIcon Component (Pure React)\n * \n * Status monitoring icon following Astro UX Design System patterns.\n * Displays a monitoring icon with status, label, and sub-label.\n * \n * Astro UX Compliance (https://www.astrouxds.com/components/icons-and-symbols/):\n * - Must include a label and status indicator\n * - Light theme requires border around status indicator\n * - Uses 6-level status color system\n * \n * Features:\n * - Status-based coloring with theme integration\n * - Notification badge\n * - Astro icon library support\n * - Light theme border support\n * - Tooltip support\n * - Keyboard accessible\n */\n\nimport React, { memo, useState } from 'react';\nimport { useTheme } from '../theme';\nimport { classNames, type StatusLevel } from '../utils';\nimport { Icon, isValidIconName, type IconName } from '../core/Icon';\n\nexport type MonitoringStatus = StatusLevel;\n\nexport interface MonitoringIconProps {\n /** Current status of the monitored item */\n status: MonitoringStatus;\n /** Primary label (always visible) */\n label: string;\n /** Sub-label for dynamic info (optional) */\n sublabel?: string;\n /** Icon name or custom icon element */\n icon?: string | React.ReactNode;\n /** Notification count badge */\n notifications?: number;\n /** Show tooltip on hover */\n tooltip?: string;\n /** Custom className */\n className?: string;\n /** Click handler */\n onClick?: () => void;\n \n // === Percentage Arc Display (Astro UX) ===\n /** \n * Show percentage arc display instead of icon \n * When true, displays a circular arc showing the percentage value\n */\n showPercentage?: boolean;\n /** Percentage value (0-100) - displayed as arc when showPercentage is true */\n percentage?: number;\n /** Map percentage to status colors (e.g., low = critical, high = normal) */\n percentageToStatus?: 'ascending' | 'descending';\n /** Show percentage value as text inside the arc */\n showPercentageValue?: boolean;\n}\n\n/**\n * Astro UX Status Colors (Light Theme - Border)\n * Required for light backgrounds per Astro UX\n */\nconst STATUS_BORDER_COLORS: Record<StatusLevel, string> = {\n off: '#3c3e42',\n standby: '#285766',\n normal: '#005a00',\n caution: '#645600',\n serious: '#664618',\n critical: '#661102',\n};\n\n/**\n * Render Astro-compliant status shape for MonitoringIcon\n * Shapes per https://www.astrouxds.com/patterns/status-system/\n * - Off: Circle (grey)\n * - Standby: Ring (cyan)\n * - Normal: Circle (green)\n * - Caution: Square (yellow)\n * - Serious: Diamond (orange)\n * - Critical: Triangle pointing down (red)\n */\nconst renderStatusSymbol = (\n status: StatusLevel,\n size: number,\n fillColor: string,\n borderColor?: string,\n glow?: boolean,\n): React.ReactNode => {\n const hasBorder = !!borderColor;\n const strokeWidth = hasBorder ? 1 : 0;\n const glowFilter = glow ? `drop-shadow(0 0 3px ${fillColor})` : undefined;\n \n switch (status) {\n // Small filled circle: off\n case 'off':\n return (\n <svg viewBox=\"0 0 12 12\" width={size} height={size} style={{ filter: glowFilter }}>\n <circle cx=\"6\" cy=\"6\" r={hasBorder ? 2.5 : 3} fill={fillColor} stroke={borderColor} strokeWidth={strokeWidth} />\n </svg>\n );\n \n // Ring (donut): standby\n case 'standby':\n return (\n <svg viewBox=\"0 0 12 12\" width={size} height={size} style={{ filter: glowFilter }}>\n <circle cx=\"6\" cy=\"6\" r=\"3.5\" fill=\"none\" stroke={fillColor} strokeWidth=\"2\" />\n </svg>\n );\n \n // Filled circle: normal\n case 'normal':\n return (\n <svg viewBox=\"0 0 12 12\" width={size} height={size} style={{ filter: glowFilter }}>\n <circle cx=\"6\" cy=\"6\" r={hasBorder ? 4.5 : 5} fill={fillColor} stroke={borderColor} strokeWidth={strokeWidth} />\n </svg>\n );\n \n // Square shape: caution\n case 'caution':\n return (\n <svg viewBox=\"0 0 12 12\" width={size} height={size} style={{ filter: glowFilter }}>\n <rect\n x={hasBorder ? 1.5 : 1}\n y={hasBorder ? 1.5 : 1}\n width={hasBorder ? 9 : 10}\n height={hasBorder ? 9 : 10}\n fill={fillColor}\n stroke={borderColor}\n strokeWidth={strokeWidth}\n />\n </svg>\n );\n \n // Diamond shape: serious (rotated square)\n case 'serious':\n return (\n <svg viewBox=\"0 0 12 12\" width={size} height={size} style={{ filter: glowFilter }}>\n <polygon\n points=\"6,1 11,6 6,11 1,6\"\n fill={fillColor}\n stroke={borderColor}\n strokeWidth={strokeWidth}\n />\n </svg>\n );\n \n // Triangle pointing down: critical\n case 'critical':\n return (\n <svg viewBox=\"0 0 12 12\" width={size} height={size} style={{ filter: glowFilter }}>\n <polygon\n points=\"6,11 1,2 11,2\"\n fill={fillColor}\n stroke={borderColor}\n strokeWidth={strokeWidth}\n />\n </svg>\n );\n \n default:\n return null;\n }\n};\n\n/**\n * Astro UX Icon Library\n * Based on https://astro-components.netlify.app/?path=/story/components-icons--all-icons\n * \n * Categories: Astro (space/mission), Equipment, System\n */\nconst ICON_PATHS: Record<string, string> = {\n // Astro Icons (Space/Mission)\n thermal: 'M15 13V5c0-1.66-1.34-3-3-3S9 3.34 9 5v8c-1.21.91-2 2.37-2 4 0 2.76 2.24 5 5 5s5-2.24 5-5c0-1.63-.79-3.09-2-4zm-4-8c0-.55.45-1 1-1s1 .45 1 1h-1v1h1v2h-1v1h1v2h-2V5z',\n 'propulsion-power': 'M13 3h-2v10h2V3zm4.83 2.17l-1.42 1.42A6.92 6.92 0 0119 12c0 3.87-3.13 7-7 7s-7-3.13-7-7c0-2.53 1.37-4.77 3.4-6l-1.42-1.42A8.962 8.962 0 003 12c0 4.97 4.03 9 9 9s9-4.03 9-9a8.96 8.96 0 00-4.17-7.83z',\n payload: 'M17 3H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H7V5h10v14zm-5-7c1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3 1.34 3 3 3z',\n netcom: 'M20 15.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1z',\n antenna: 'M12 5c-3.87 0-7 3.13-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.87-3.13-7-7-7zm0 4c-1.66 0-3 1.34-3 3h2c0-.55.45-1 1-1s1 .45 1 1h2c0-1.66-1.34-3-3-3zm0-8C5.93 1 1 5.93 1 12h2c0-4.97 4.03-9 9-9s9 4.03 9 9h2c0-6.07-4.93-11-11-11z',\n solar: 'M20 18V6c0-1.1-.9-2-2-2H6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2zM6 6h12v4H6V6zm0 6h4v6H6v-6zm6 6v-6h6v6h-6z',\n altitude: 'M12 2L4.5 20.29l.71.71L12 18l6.79 3 .71-.71L12 2z',\n processor: 'M22 9V7h-2V5c0-1.1-.9-2-2-2H6c-1.1 0-2 .9-2 2v2H2v2h2v2H2v2h2v2H2v2h2v2c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-2h2v-2h-2v-2h2v-2h-2V9h2zm-4 10H6V5h12v14zm-5-7h-2V8h2v4zm0 6h-2v-4h2v4z',\n mission: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z',\n equipment: 'M22 9V7h-2V5c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-2h2v-2h-2v-2h2v-2h-2V9h2zm-4 10H4V5h14v14zM6 13h5v4H6v-4zm6-6h4v3h-4V7zM6 7h5v5H6V7zm6 4h4v6h-4v-6z',\n 'satellite-transmit': 'M6 6L1 11l5 5 1.41-1.41L4.83 12l2.58-2.59L6 6zm6-4l-3 7 3 3 3-3-3-7zm6 4l-1.41 1.41L19.17 12l-2.58 2.59L18 16l5-5-5-5z',\n 'satellite-receive': 'M18 6l-1.41 1.41L19.17 10H6.83l2.58-2.59L8 6l-5 5 5 5 1.41-1.41L6.83 12h12.34l-2.58 2.59L18 16l5-5-5-5z',\n 'satellite-off': 'M1 21l5-5 1.41 1.41-5 5L1 21zm22-9l-5-5-1.41 1.41 5 5L23 12zm-9-9l-5 5 1.41 1.41 5-5L14 3z',\n hardware: 'M17 3H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H7V5h10v14zm-3-8h-4v2h4v-2z',\n release: 'M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8-8-8z',\n // Legacy aliases\n satellite: 'M6 6L1 11l5 5 1.41-1.41L4.83 12l2.58-2.59L6 6zm6-4l-3 7 3 3 3-3-3-7zm6 4l-1.41 1.41L19.17 12l-2.58 2.59L18 16l5-5-5-5z',\n power: 'M13 3h-2v10h2V3zm4.83 2.17l-1.42 1.42A6.92 6.92 0 0119 12c0 3.87-3.13 7-7 7s-7-3.13-7-7c0-2.53 1.37-4.77 3.4-6l-1.42-1.42A8.962 8.962 0 003 12c0 4.97 4.03 9 9 9s9-4.03 9-9a8.96 8.96 0 00-4.17-7.83z',\n comms: 'M20 15.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1z',\n};\n\n/**\n * Render percentage arc display (Astro UX pattern)\n * \n * Displays a circular arc showing a percentage value 0-100.\n * The arc fills clockwise from the top, with status-colored fill.\n */\nconst renderPercentageArc = (\n percentage: number,\n statusColor: string,\n showValue: boolean = true,\n size: number = 48,\n): React.ReactNode => {\n // Clamp percentage to 0-100\n const pct = Math.max(0, Math.min(100, percentage));\n \n // Arc geometry\n const centerX = size / 2;\n const centerY = size / 2;\n const radius = (size / 2) - 4; // Leave room for stroke\n const strokeWidth = 4;\n const innerRadius = radius - strokeWidth / 2;\n \n // Calculate arc path\n // Start at top (12 o'clock) and sweep clockwise\n const startAngle = -90; // Start at top\n const endAngle = startAngle + (pct / 100) * 360;\n \n // Convert to radians\n const startRad = (startAngle * Math.PI) / 180;\n const endRad = (endAngle * Math.PI) / 180;\n \n // Calculate start and end points\n const startX = centerX + innerRadius * Math.cos(startRad);\n const startY = centerY + innerRadius * Math.sin(startRad);\n const endX = centerX + innerRadius * Math.cos(endRad);\n const endY = centerY + innerRadius * Math.sin(endRad);\n \n // Determine if we need a large arc (> 180 degrees)\n const largeArcFlag = pct > 50 ? 1 : 0;\n \n // Create arc path\n const arcPath = pct > 0 && pct < 100\n ? `M ${startX} ${startY} A ${innerRadius} ${innerRadius} 0 ${largeArcFlag} 1 ${endX} ${endY}`\n : pct >= 100\n ? `M ${centerX} ${centerY - innerRadius} A ${innerRadius} ${innerRadius} 0 1 1 ${centerX - 0.001} ${centerY - innerRadius}` // Full circle\n : ''; // Empty when 0%\n \n return (\n <svg\n width={size}\n height={size}\n viewBox={`0 0 ${size} ${size}`}\n style={{ display: 'block' }}\n >\n {/* Background circle (track) */}\n <circle\n cx={centerX}\n cy={centerY}\n r={innerRadius}\n fill=\"none\"\n stroke=\"rgba(255, 255, 255, 0.1)\"\n strokeWidth={strokeWidth}\n />\n \n {/* Progress arc */}\n {arcPath && (\n <path\n d={arcPath}\n fill=\"none\"\n stroke={statusColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n style={{\n filter: `drop-shadow(0 0 4px ${statusColor}60)`,\n }}\n />\n )}\n \n {/* Center value text */}\n {showValue && (\n <text\n x={centerX}\n y={centerY}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n fill={statusColor}\n fontSize={size * 0.28}\n fontWeight={600}\n fontFamily=\"system-ui, -apple-system, sans-serif\"\n >\n {Math.round(pct)}\n </text>\n )}\n </svg>\n );\n};\n\n/**\n * Get status based on percentage value\n * - ascending: low values = critical, high values = normal\n * - descending: low values = normal, high values = critical\n */\nconst getStatusFromPercentage = (\n percentage: number,\n direction: 'ascending' | 'descending',\n): MonitoringStatus => {\n const pct = direction === 'descending' ? 100 - percentage : percentage;\n \n if (pct >= 80) return 'normal';\n if (pct >= 60) return 'standby';\n if (pct >= 40) return 'caution';\n if (pct >= 20) return 'serious';\n return 'critical';\n};\n\n/**\n * MonitoringIcon - Pure React monitoring icon component\n * \n * Displays system status with icon, label, and optional notification badge.\n * Fully Astro UX compliant with theme integration.\n * \n * @example\n * ```tsx\n * // Standard monitoring icon\n * <MonitoringIcon \n * status=\"normal\" \n * label=\"Power\" \n * sublabel=\"85%\"\n * icon=\"power\"\n * />\n * \n * // Percentage arc display\n * <MonitoringIcon\n * status=\"normal\"\n * label=\"Battery\"\n * showPercentage\n * percentage={75}\n * percentageToStatus=\"ascending\"\n * />\n * ```\n */\nexport const MonitoringIcon = memo(function MonitoringIcon({\n status,\n label,\n sublabel,\n icon = 'mission',\n notifications,\n tooltip,\n className = '',\n onClick,\n showPercentage = false,\n percentage = 0,\n percentageToStatus,\n showPercentageValue = true,\n}: MonitoringIconProps): React.ReactElement {\n const { tokens, mode, theme } = useTheme();\n const isTransparentTheme = theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\n const [showTooltip, setShowTooltip] = useState(false);\n \n // Calculate effective status when using percentage-to-status mapping\n const effectiveStatus = percentageToStatus \n ? getStatusFromPercentage(percentage, percentageToStatus)\n : status;\n \n // Get status color from theme\n const color = tokens.colors.status[effectiveStatus] || '#a4abb6';\n const isLightTheme = mode === 'light';\n const borderColor = isLightTheme ? STATUS_BORDER_COLORS[effectiveStatus] : undefined;\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (onClick && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n onClick();\n }\n };\n\n const renderIcon = () => {\n // Percentage arc display mode\n if (showPercentage) {\n return renderPercentageArc(percentage, color, showPercentageValue, 48);\n }\n \n // Custom React element\n if (React.isValidElement(icon)) {\n return icon;\n }\n\n // Use Icon component if valid icon name from core library\n if (typeof icon === 'string' && isValidIconName(icon)) {\n return <Icon name={icon as IconName} size={24} color=\"currentColor\" />;\n }\n\n // Fallback to legacy ICON_PATHS for backward compatibility\n const iconPath = typeof icon === 'string' ? ICON_PATHS[icon] : undefined;\n \n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n style={{ width: 24, height: 24 }}\n aria-hidden=\"true\"\n >\n {iconPath ? (\n <path d={iconPath} />\n ) : (\n // Default mission icon\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z\" />\n )}\n </svg>\n );\n };\n\n return (\n <div\n className={classNames('zendir-monitoring-icon', className)}\n onClick={onClick}\n onKeyDown={onClick ? handleKeyDown : undefined}\n onMouseEnter={() => setShowTooltip(true)}\n onMouseLeave={() => setShowTooltip(false)}\n tabIndex={onClick ? 0 : undefined}\n role=\"status\"\n aria-label={`${label}: ${sublabel ?? status}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: tokens.spacing.xs,\n padding: `${tokens.spacing.sm} ${tokens.spacing.md}`,\n minWidth: 72,\n backgroundColor: isTransparentTheme ? 'transparent' : tokens.colors.background.surface,\n ...(isTransparentTheme && { backdropFilter: 'blur(12px)', WebkitBackdropFilter: 'blur(12px)' as const }),\n ...(tokens.colors.border.cardStyle ?? { border: `1px solid ${tokens.colors.border.muted}` }),\n borderRadius: tokens.borderRadius.md,\n cursor: onClick ? 'pointer' : 'default',\n outline: 'none',\n transition: tokens.animation.fast,\n }}\n >\n {/* Icon with status indicator */}\n <div\n style={{\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color,\n // Explicit sizing for predictable layout\n width: showPercentage ? 48 : 24,\n height: showPercentage ? 48 : 24,\n }}\n >\n {renderIcon()}\n \n {/* Status symbol - shape based on status per Astro UX */}\n <span\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n transform: 'translate(-35%, -35%)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {renderStatusSymbol(effectiveStatus, 9, color, borderColor, !isLightTheme)}\n </span>\n\n {/* Notification badge */}\n {notifications !== undefined && notifications > 0 && (\n <span\n style={{\n position: 'absolute',\n top: 0,\n right: 0,\n transform: 'translate(40%, -40%)',\n minWidth: 16,\n height: 16,\n padding: '0 4px',\n borderRadius: tokens.borderRadius.full,\n backgroundColor: tokens.colors.status.critical,\n color: '#ffffff',\n fontSize: '0.625rem', // 10px in rem\n fontWeight: 700, // AstroUXDS bold for status values\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {notifications > 99 ? '99+' : notifications}\n </span>\n )}\n </div>\n\n {/* Label - sentence case per Astro UX */}\n <span\n style={{\n fontSize: tokens.typography.fontSize.xs,\n fontWeight: tokens.typography.fontWeight.medium,\n color: tokens.colors.text.secondary,\n textTransform: 'none', // Astro uses sentence case, not uppercase\n letterSpacing: tokens.typography.letterSpacing.normal,\n whiteSpace: 'nowrap',\n }}\n >\n {label}\n </span>\n\n {/* Sublabel - dynamic value */}\n {sublabel && (\n <span\n style={{\n fontSize: tokens.typography.fontSize.sm,\n fontWeight: tokens.typography.fontWeight.semibold,\n fontVariantNumeric: 'tabular-nums',\n color: tokens.colors.text.primary,\n }}\n >\n {sublabel}\n </span>\n )}\n\n {/* Tooltip */}\n {tooltip && showTooltip && (\n <div\n style={{\n position: 'absolute',\n bottom: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginBottom: 8,\n padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\n backgroundColor: tokens.colors.background.overlay,\n borderRadius: tokens.borderRadius.sm,\n fontSize: tokens.typography.fontSize.sm,\n color: tokens.colors.text.primary,\n whiteSpace: 'nowrap',\n zIndex: 1000,\n pointerEvents: 'none',\n boxShadow: tokens.shadows.md,\n }}\n >\n {tooltip}\n {/* Tooltip arrow */}\n <span\n style={{\n position: 'absolute',\n top: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n borderWidth: 4,\n borderStyle: 'solid',\n borderColor: `${tokens.colors.background.overlay} transparent transparent transparent`,\n }}\n />\n </div>\n )}\n </div>\n );\n});\n"],"names":["MonitoringIcon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MonitoringIcon.js","sources":["../../../src/react/astro/MonitoringIcon.tsx"],"sourcesContent":["/**\n * @zendir/ui - MonitoringIcon Component (Pure React)\n * \n * Status monitoring icon following Astro UX Design System patterns.\n * Displays a monitoring icon with status, label, and sub-label.\n * \n * Astro UX Compliance (https://www.astrouxds.com/components/icons-and-symbols/):\n * - Must include a label and status indicator\n * - Light theme requires border around status indicator\n * - Uses 6-level status color system\n * \n * Features:\n * - Status-based coloring with theme integration\n * - Notification badge\n * - Astro icon library support\n * - Light theme border support\n * - Tooltip support\n * - Keyboard accessible\n */\n\nimport React, { memo, useState } from 'react';\nimport { useTheme } from '../theme';\nimport { classNames, type StatusLevel } from '../utils';\nimport { Icon, isValidIconName, type IconName } from '../core/Icon';\n\nexport type MonitoringStatus = StatusLevel;\n\nexport interface MonitoringIconProps {\n /** Current status of the monitored item */\n status: MonitoringStatus;\n /** Primary label (always visible) */\n label: string;\n /** Sub-label for dynamic info (optional) */\n sublabel?: string;\n /** Icon name or custom icon element */\n icon?: string | React.ReactNode;\n /** Notification count badge */\n notifications?: number;\n /** Show tooltip on hover */\n tooltip?: string;\n /** Custom className */\n className?: string;\n /** Click handler */\n onClick?: () => void;\n \n // === Percentage Arc Display (Astro UX) ===\n /** \n * Show percentage arc display instead of icon \n * When true, displays a circular arc showing the percentage value\n */\n showPercentage?: boolean;\n /** Percentage value (0-100) - displayed as arc when showPercentage is true */\n percentage?: number;\n /** Map percentage to status colors (e.g., low = critical, high = normal) */\n percentageToStatus?: 'ascending' | 'descending';\n /** Show percentage value as text inside the arc */\n showPercentageValue?: boolean;\n}\n\n/**\n * Astro UX Status Colors (Light Theme - Border)\n * Required for light backgrounds per Astro UX\n */\nconst STATUS_BORDER_COLORS: Record<StatusLevel, string> = {\n off: '#3c3e42',\n standby: '#285766',\n normal: '#005a00',\n caution: '#645600',\n serious: '#664618',\n critical: '#661102',\n};\n\n/**\n * Render Astro-compliant status shape for MonitoringIcon\n * Shapes per https://www.astrouxds.com/patterns/status-system/\n * - Off: Circle (grey)\n * - Standby: Ring (cyan)\n * - Normal: Circle (green)\n * - Caution: Square (yellow)\n * - Serious: Diamond (orange)\n * - Critical: Triangle pointing down (red)\n */\nconst renderStatusSymbol = (\n status: StatusLevel,\n size: number,\n fillColor: string,\n borderColor?: string,\n glow?: boolean,\n): React.ReactNode => {\n const hasBorder = !!borderColor;\n const strokeWidth = hasBorder ? 1 : 0;\n const glowFilter = glow ? `drop-shadow(0 0 3px ${fillColor})` : undefined;\n \n switch (status) {\n // Small filled circle: off\n case 'off':\n return (\n <svg viewBox=\"0 0 12 12\" width={size} height={size} style={{ filter: glowFilter }}>\n <circle cx=\"6\" cy=\"6\" r={hasBorder ? 2.5 : 3} fill={fillColor} stroke={borderColor} strokeWidth={strokeWidth} />\n </svg>\n );\n \n // Ring (donut): standby\n case 'standby':\n return (\n <svg viewBox=\"0 0 12 12\" width={size} height={size} style={{ filter: glowFilter }}>\n <circle cx=\"6\" cy=\"6\" r=\"3.5\" fill=\"none\" stroke={fillColor} strokeWidth=\"2\" />\n </svg>\n );\n \n // Filled circle: normal\n case 'normal':\n return (\n <svg viewBox=\"0 0 12 12\" width={size} height={size} style={{ filter: glowFilter }}>\n <circle cx=\"6\" cy=\"6\" r={hasBorder ? 4.5 : 5} fill={fillColor} stroke={borderColor} strokeWidth={strokeWidth} />\n </svg>\n );\n \n // Square shape: caution\n case 'caution':\n return (\n <svg viewBox=\"0 0 12 12\" width={size} height={size} style={{ filter: glowFilter }}>\n <rect\n x={hasBorder ? 1.5 : 1}\n y={hasBorder ? 1.5 : 1}\n width={hasBorder ? 9 : 10}\n height={hasBorder ? 9 : 10}\n fill={fillColor}\n stroke={borderColor}\n strokeWidth={strokeWidth}\n />\n </svg>\n );\n \n // Diamond shape: serious (rotated square)\n case 'serious':\n return (\n <svg viewBox=\"0 0 12 12\" width={size} height={size} style={{ filter: glowFilter }}>\n <polygon\n points=\"6,1 11,6 6,11 1,6\"\n fill={fillColor}\n stroke={borderColor}\n strokeWidth={strokeWidth}\n />\n </svg>\n );\n \n // Triangle pointing down: critical\n case 'critical':\n return (\n <svg viewBox=\"0 0 12 12\" width={size} height={size} style={{ filter: glowFilter }}>\n <polygon\n points=\"6,11 1,2 11,2\"\n fill={fillColor}\n stroke={borderColor}\n strokeWidth={strokeWidth}\n />\n </svg>\n );\n \n default:\n return null;\n }\n};\n\n/**\n * Astro UX Icon Library\n * Based on https://astro-components.netlify.app/?path=/story/components-icons--all-icons\n * \n * Categories: Astro (space/mission), Equipment, System\n */\nconst ICON_PATHS: Record<string, string> = {\n // Astro Icons (Space/Mission) - Paths from @astrouxds/astro-web-components\n thermal: 'M10.5 2C12.433 2 14 3.567 14 5.5L14.0005 12.2576C15.2217 13.2664 16 14.7923 16 16.5C16 19.5376 13.5376 22 10.5 22C7.46243 22 5 19.5376 5 16.5C5 14.7919 5.77868 13.2656 7.00044 12.2568L7 5.5C7 3.567 8.567 2 10.5 2ZM10.5 4C9.7203 4 9.07955 4.59489 9.00687 5.35543L9 5.49987L9.0005 13.199L8.27384 13.799C7.47135 14.4616 7 15.4402 7 16.5C7 18.433 8.567 20 10.5 20C12.433 20 14 18.433 14 16.5C14 15.5111 13.5896 14.593 12.8828 13.9362L12.7268 13.7995L12.0006 13.1997L12 5.5C12 4.7203 11.4051 4.07955 10.6445 4.00687L10.5 4ZM11 5.5C11 5.22386 10.7761 5 10.5 5C10.2239 5 10 5.22386 10 5.5L10.0006 14.0499C8.85917 14.2813 8 15.2903 8 16.5C8 17.8807 9.11929 19 10.5 19C11.8807 19 13 17.8807 13 16.5C13 15.2907 12.1413 14.2819 11.0004 14.0501L11 5.5ZM20 11C20.5523 11 21 11.4477 21 12C21 12.5523 20.5523 13 20 13H17C16.4477 13 16 12.5523 16 12C16 11.4477 16.4477 11 17 11H20ZM19 9C19 8.44772 18.5523 8 18 8H17C16.4477 8 16 8.44772 16 9C16 9.55228 16.4477 10 17 10H18C18.5523 10 19 9.55228 19 9ZM20 5C20.5523 5 21 5.44772 21 6C21 6.55228 20.5523 7 20 7H17C16.4477 7 16 6.55228 16 6C16 5.44772 16.4477 5 17 5H20ZM19 3C19 2.44772 18.5523 2 18 2H17C16.4477 2 16 2.44772 16 3C16 3.55228 16.4477 4 17 4H18C18.5523 4 19 3.55228 19 3Z',\n 'propulsion-power': 'M16 2C17.1046 2 18 2.89543 18 4V20C18 21.1046 17.1046 22 16 22H9C7.89543 22 7 21.1046 7 20V4C7 2.89543 7.89543 2 9 2H16ZM13.8115 5.69961C13.8115 5.00797 12.9835 4.75858 12.631 5.27555L12.5794 5.36359L9.0799 12.364C8.8597 12.8083 9.11904 13.3258 9.55954 13.3928L9.6566 13.4001H11.1901V18.3004C11.1901 18.992 12.0181 19.2414 12.3706 18.7245L12.4222 18.6364L15.9217 11.636C16.1419 11.1917 15.8711 10.6742 15.4398 10.6072L15.345 10.5999H13.8115V5.69961Z',\n payload: 'M12.6802 2.24483L12.8418 2.31637L20.8418 6.31637C21.4305 6.6107 21.819 7.18871 21.8753 7.83667L21.8824 8V16C21.8824 16.6581 21.5391 17.2641 20.9848 17.6043L20.8418 17.6836L12.8418 21.6836C12.3649 21.9221 11.812 21.9459 11.3198 21.7552L11.1582 21.6836L3.15821 17.6836C2.56956 17.3893 2.18104 16.8113 2.12475 16.1633L2.11768 16V8C2.11768 7.34186 2.46091 6.73586 3.0153 6.39574L3.15821 6.31637L3.4276 6.17973C3.50773 6.12386 3.59511 6.0805 3.6866 6.05036L11.1582 2.31637C11.5822 2.1044 12.0662 2.062 12.5141 2.18919L12.6802 2.24483ZM3.99968 8.17865L4.00003 16L10.9997 19.4996V12.5536L3.99968 8.17865ZM12.9997 12.6176L19.9997 9.11765L20 16L12.9997 19.4996V12.6176ZM18.5 15C18.7762 15 19 15.2239 19 15.5C19 15.7761 18.7762 16 18.5 16C18.2239 16 18 15.7761 18 15.5C18 15.2239 18.2239 15 18.5 15ZM6.00003 15.5C6.00003 15.2239 5.77617 15 5.50003 15C5.22389 15 5.00003 15.2239 5.00003 15.5C5.00003 15.7761 5.22389 16 5.50003 16C5.77617 16 6.00003 15.7761 6.00003 15.5ZM16.5 14C16.7762 14 17 14.2239 17 14.5C17 14.7761 16.7762 15 16.5 15C16.2239 15 16 14.7761 16 14.5C16 14.2239 16.2239 14 16.5 14ZM8.00003 14.5C8.00003 14.2239 7.77617 14 7.50003 14C7.22389 14 7.00003 14.2239 7.00003 14.5C7.00003 14.7761 7.22389 15 7.50003 15C7.77617 15 8.00003 14.7761 8.00003 14.5ZM9.50003 13C9.77617 13 10 13.2239 10 13.5C10 13.7761 9.77617 14 9.50003 14C9.22389 14 9.00003 13.7761 9.00003 13.5C9.00003 13.2239 9.22389 13 9.50003 13ZM15 13.5C15 13.2239 14.7762 13 14.5 13C14.2239 13 14 13.2239 14 13.5C14 13.7761 14.2239 14 14.5 14C14.7762 14 15 13.7761 15 13.5ZM12 4L5.93668 7.03065L12.053 10.854L18.8807 7.44065L12 4ZM12.5 9.5C12.5 9.22386 12.2762 9 12 9C11.7239 9 11.5 9.22386 11.5 9.5C11.5 9.77614 11.7239 10 12 10C12.2762 10 12.5 9.77614 12.5 9.5ZM12 7C12.2762 7 12.5 7.22386 12.5 7.5C12.5 7.77614 12.2762 8 12 8C11.7239 8 11.5 7.77614 11.5 7.5C11.5 7.22386 11.7239 7 12 7ZM12.5 5.5C12.5 5.22386 12.2762 5 12 5C11.7239 5 11.5 5.22386 11.5 5.5C11.5 5.77614 11.7239 6 12 6C12.2762 6 12.5 5.77614 12.5 5.5Z',\n netcom: 'M16 2C17.6569 2 19 3.34315 19 5C19 6.65685 17.6569 8 16 8C15.8259 8 15.6553 7.98518 15.4894 7.95672L14.8034 9.14676C15.3137 9.64825 15.6902 10.2856 15.874 11.0002L18.2676 10.9999C18.6134 10.4022 19.2597 10 20 10C21.1046 10 22 10.8954 22 12C22 13.1046 21.1046 14 20 14C19.2602 14 18.6142 13.5983 18.2682 13.0011L15.8738 13.0008C15.6717 13.7853 15.2375 14.4767 14.6488 14.9974L15.2128 16.1044C15.4637 16.0363 15.7276 16 16 16C17.6569 16 19 17.3431 19 19C19 20.6569 17.6569 22 16 22C14.3431 22 13 20.6569 13 19C13 18.3508 13.2062 17.7498 13.5567 17.2589L12.8669 15.9058C12.5878 15.9675 12.2977 16 12 16C11.2582 16 10.5635 15.7981 9.96801 15.4462L7.75736 17.6569L7.59355 17.4912C7.85196 17.9345 8 18.4499 8 19C8 20.6569 6.65685 22 5 22C3.34315 22 2 20.6569 2 19C2 17.3431 3.34315 16 5 16C5.55006 16 6.06555 16.148 6.50879 16.4065L6.34315 16.2426L8.55383 14.032C8.20193 13.4365 8 12.7418 8 12C8 9.79086 9.79086 8 12 8C12.3705 8 12.7293 8.05038 13.0698 8.14467L13.7446 6.97823C13.281 6.45014 13 5.75789 13 5C13 3.34315 14.3431 2 16 2ZM12 10C10.8954 10 10 10.8954 10 12C10 13.1046 10.8954 14 12 14C13.1046 14 14 13.1046 14 12C14 10.8954 13.1046 10 12 10Z',\n antenna: 'M12.5 8C13.6506 8 14.5833 8.89543 14.5833 10C14.5833 10.7398 14.1649 11.3858 13.5428 11.7318L13.5416 22H11.4583L11.4582 11.7324C10.8356 11.3866 10.4166 10.7403 10.4166 10C10.4166 8.89543 11.3494 8 12.5 8ZM6.63099 2.32732C6.98124 2.70075 7.0016 3.27819 6.64763 3.65177C3.61283 6.82949 3.34936 11.6553 6.02151 15.1201C6.33286 15.5271 6.26451 16.1001 5.86774 16.4431C5.40872 16.8398 4.68582 16.775 4.3192 16.294C1.13831 12.1519 1.38131 6.45292 4.85709 2.56983L5.07393 2.33438L5.1678 2.24643C5.59314 1.89421 6.24722 1.91815 6.63099 2.32732ZM19.9142 2.24643L20.0081 2.33438C23.6894 6.21966 24.0087 12.0674 20.7628 16.294C20.3962 16.775 19.6733 16.8398 19.2143 16.4431C18.8175 16.1001 18.7492 15.5271 19.0605 15.1201C21.7327 11.6553 21.4692 6.82949 18.4344 3.65177C18.0804 3.27819 18.1008 2.70075 18.4511 2.32732C18.8348 1.91815 19.4889 1.89421 19.9142 2.24643ZM9.8013 5.34518C10.1466 5.71337 10.1537 6.26509 9.82646 6.65682C8.45162 8.33503 8.32337 10.6773 9.50741 12.4838C9.79011 12.9062 9.72281 13.4541 9.33916 13.7858C8.86156 14.1986 8.10517 14.1177 7.75278 13.6059C6.10277 11.1439 6.21558 7.93692 8.0237 5.58971L8.20397 5.3653L8.28854 5.2755C8.70418 4.88648 9.40006 4.91737 9.8013 5.34518ZM16.7935 5.2755L16.8781 5.3653C18.8573 7.72924 19.0325 11.0644 17.3292 13.6059C16.9769 14.1177 16.2205 14.1986 15.7429 13.7858C15.3592 13.4541 15.2919 12.9062 15.5746 12.4838C16.7586 10.6773 16.6304 8.33503 15.2556 6.65682C14.9283 6.26509 14.9354 5.71337 15.2807 5.34518C15.682 4.91737 16.3778 4.88648 16.7935 5.2755Z',\n solar: 'M19.5385 4C20.3456 4 21 4.67008 21 5.49666V17.5033C21 18.3299 20.3456 19 19.5385 19H3.46154C2.65436 19 2 18.3299 2 17.5033V5.49666C2 4.67008 2.65436 4 3.46154 4H19.5385ZM7 6H4V11H7V6ZM11 6H8V11H11V6ZM15 6H12V11H15V6ZM19 6H16V11H19V6ZM7 12H4V17H7V12ZM11 12H8V17H11V12ZM15 12H12V17H15V12ZM19 12H16V17H19V12Z',\n altitude: 'M12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2ZM12 4C7.58172 4 4 7.58172 4 12C4 16.4183 7.58172 20 12 20C16.4183 20 20 16.4183 20 12C20 7.58172 16.4183 4 12 4ZM14 18C14 17.4477 13.5523 17 13 17H11C10.4477 17 10 17.4477 10 18C10 18.5523 10.4477 19 11 19H13C13.5523 19 14 18.5523 14 18ZM14 14C14.5523 14 15 14.4477 15 15C15 15.5523 14.5523 16 14 16H10C9.44772 16 9 15.5523 9 15C9 14.4477 9.44772 14 10 14H14ZM16 12L19 14V10L16 12ZM5 10L8 12L5 14V10ZM14 12C14 11.4477 13.5523 11 13 11H11C10.4477 11 10 11.4477 10 12C10 12.5523 10.4477 13 11 13H13C13.5523 13 14 12.5523 14 12ZM14 8C14.5523 8 15 8.44772 15 9C15 9.55228 14.5523 10 14 10H10C9.44772 10 9 9.55228 9 9C9 8.44772 9.44772 8 10 8H14ZM14 6C14 5.44772 13.5523 5 13 5H11C10.4477 5 10 5.44772 10 6C10 6.55228 10.4477 7 11 7H13C13.5523 7 14 6.55228 14 6Z',\n processor: 'M9 20V22H7V20H9ZM13 20V22H11V20H13ZM17 20V22H15V20H17ZM17 5C18.1046 5 19 5.89543 19 7V17C19 18.1046 18.1046 19 17 19H7C5.89543 19 5 18.1046 5 17V7C5 5.89543 5.89543 5 7 5H17ZM17 16C16.4477 16 16 16.4477 16 17C16 17.5523 16.4477 18 17 18C17.5523 18 18 17.5523 18 17C18 16.4477 17.5523 16 17 16ZM4 15V17H2V15H4ZM22 15V17H20V15H22ZM4 11V13H2V11H4ZM22 11V13H20V11H22ZM4 7V9H2V7H4ZM22 7V9H20V7H22ZM7 6C6.44772 6 6 6.44772 6 7C6 7.55228 6.44772 8 7 8C7.55228 8 8 7.55228 8 7C8 6.44772 7.55228 6 7 6ZM9 2V4H7V2H9ZM13 2V4H11V2H13ZM17 2V4H15V2H17Z',\n mission: 'M12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2ZM12 4C7.58172 4 4 7.58172 4 12C4 16.4183 7.58172 20 12 20C16.4183 20 20 16.4183 20 12C20 7.58172 16.4183 4 12 4ZM18 12C18 8.68629 15.3137 6 12 6C8.68629 6 6 8.68629 6 12C6 15.3137 8.68629 18 12 18C15.3137 18 18 15.3137 18 12ZM12 8C9.79086 8 8 9.79086 8 12C8 14.2091 9.79086 16 12 16C14.2091 16 16 14.2091 16 12C16 9.79086 14.2091 8 12 8ZM14 12C14 10.8954 13.1046 10 12 10C10.8954 10 10 10.8954 10 12C10 13.1046 10.8954 14 12 14C13.1046 14 14 13.1046 14 12Z',\n equipment: 'M22 5C22 3.89543 21.1046 3 20 3H4C2.89543 3 2 3.89543 2 5V9C2 10.1046 2.89543 11 4 11H20C21.1046 11 22 10.1046 22 9V5ZM22 15C22 13.8954 21.1046 13 20 13H4C2.89543 13 2 13.8954 2 15V19C2 20.1046 2.89543 21 4 21H20C21.1046 21 22 20.1046 22 19V15ZM4 15H20V19H4V15ZM7 16V18H5V16H7ZM10 18V16H8V18H10ZM13 16V18H11V16H13ZM20 5H4V9H20V5ZM7 8V6H5V8H7ZM10 6V8H8V6H10ZM13 8V6H11V8H13Z',\n 'satellite-transmit': 'M8.87871 8.87868C9.65976 8.09763 10.9261 8.09763 11.7071 8.87868L13.1213 10.2929C13.9024 11.0739 13.9024 12.3403 13.1213 13.1213C12.3403 13.9024 11.074 13.9024 10.2929 13.1213L8.87871 11.7071C8.09766 10.9261 8.09766 9.65973 8.87871 8.87868ZM4.05657 15.3702C4.09551 15.3313 4.13761 15.2956 4.18243 15.2636L8.1716 12.4142L9.58581 13.8284L6.73641 17.8176C6.4154 18.267 5.79085 18.3711 5.34144 18.0501C5.29662 18.0181 5.25452 17.9824 5.21557 17.9435L4.05657 16.7845C3.66604 16.3939 3.66604 15.7608 4.05657 15.3702ZM20.9898 11C21.5828 11 22.0551 11.5125 21.9948 12.1055C21.4823 17.3315 17.3416 21.4721 12.1156 21.9947C11.5226 22.055 11 21.5927 11 20.9998C11 20.4973 11.3719 20.0551 11.8744 20.0048C16.1658 19.5928 19.5828 16.1757 19.9949 11.8844C20.0451 11.3819 20.4773 11 20.9898 11ZM16.9776 11C17.5946 11 18.08 11.546 17.989 12.1527C17.5035 15.1355 15.1469 17.5015 12.1531 17.9868C11.5462 18.088 11 17.5925 11 16.9757C11 16.4803 11.3641 16.0657 11.8597 15.9848C13.8884 15.6338 15.5032 14.0794 15.9425 12.083L15.9864 11.8595C16.0673 11.364 16.482 11 16.9776 11ZM16.6903 3.97335L16.7845 4.05653L17.9435 5.21554C17.9824 5.25449 18.0181 5.29659 18.0501 5.34141C18.3464 5.75625 18.2805 6.32032 17.9152 6.65713L17.8176 6.73638L13.8285 9.58578L12.4142 8.17157L15.2636 4.1824C15.2957 4.13758 15.3313 4.09548 15.3703 4.05653C15.7308 3.69605 16.298 3.66832 16.6903 3.97335Z',\n 'satellite-receive': 'M5.53115 17.8387L6.58945 18.8268L8.92522 18.602L9.83101 20.4262C9.89964 20.5644 9.93535 20.7167 9.93535 20.871C9.93535 21.3838 9.54931 21.8065 9.05197 21.8642L8.93535 21.871H4.20497C3.9626 21.871 3.72849 21.7829 3.54616 21.6233C3.16263 21.2874 3.09746 20.7233 3.37588 20.3117L3.45266 20.2122L5.53115 17.8387ZM7.09757 10.0443C7.33377 10.0636 7.55543 10.1662 7.72301 10.3338L10.042 12.653L12 12L11.347 13.958L13.2146 15.8254C13.6051 16.2159 13.6051 16.8491 13.2146 17.2396C13.047 17.4072 12.8253 17.5098 12.5891 17.5291L7.30432 17.9622C7.01163 17.9862 6.7232 17.8803 6.51554 17.6726L5.87575 17.0328C5.66809 16.8252 5.56221 16.5368 5.58619 16.2441L6.01924 10.9593C6.06434 10.4088 6.54713 9.99916 7.09757 10.0443ZM14 9C14.5523 9 15 9.44772 15 10C15 10.5523 14.5523 11 14 11C13.4477 11 13 10.5523 13 10C13 9.44772 13.4477 9 14 9ZM16 7C16.5523 7 17 7.44772 17 8C17 8.55228 16.5523 9 16 9C15.4477 9 15 8.55228 15 8C15 7.44772 15.4477 7 16 7ZM18.5 4C19.3284 4 20 4.67157 20 5.5C20 6.32843 19.3284 7 18.5 7C17.6716 7 17 6.32843 17 5.5C17 4.67157 17.6716 4 18.5 4Z',\n 'satellite-off': 'M8.87867 11.7071C8.09762 10.9261 8.09762 9.65973 8.87867 8.87868C9.65972 8.09763 10.926 8.09763 11.7071 8.87868L13.1213 10.2929C13.9024 11.0739 13.9024 12.3403 13.1213 13.1213C12.3403 13.9024 11.0739 13.9024 10.2929 13.1213L8.87867 11.7071ZM4.05653 16.7845C3.61958 16.3475 3.67956 15.6228 4.1824 15.2636L8.17156 12.4142L9.58578 13.8284L6.73637 17.8176C6.3772 18.3204 5.65248 18.3804 5.21553 17.9435L4.05653 16.7845ZM15.2636 4.1824C15.6228 3.67956 16.3475 3.61958 16.7844 4.05653L17.9435 5.21554C18.3804 5.65249 18.3204 6.37721 17.8176 6.73638L13.8284 9.58578L12.4142 8.17157L15.2636 4.1824Z',\n hardware: 'M4 17.8247V10.4692H20V17.8247H4ZM2 9.77297C2 9.05293 2.58371 8.46922 3.30375 8.46922H20.6962C21.4163 8.46922 22 9.05293 22 9.77298V18.5209C22 19.241 21.4163 19.8247 20.6962 19.8247H3.30375C2.58371 19.8247 2 19.241 2 18.5209V9.77297ZM8.99573 13.637H4.99573V11.637H8.99573V13.637ZM8.99573 16.642H4.99573V14.642H8.99573V16.642ZM10 13.637H14V11.637H10V13.637ZM14 16.642H10V14.642H14V16.642ZM14.9987 13.637H18.9987V11.637H14.9987V13.637ZM18.9987 16.6424H14.9987V14.6424H18.9987V16.6424Z',\n release: 'M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8-8-8z',\n // Legacy aliases\n satellite: 'M8.87867 11.7071C8.09762 10.9261 8.09762 9.65973 8.87867 8.87868C9.65972 8.09763 10.926 8.09763 11.7071 8.87868L13.1213 10.2929C13.9024 11.0739 13.9024 12.3403 13.1213 13.1213C12.3403 13.9024 11.0739 13.9024 10.2929 13.1213L8.87867 11.7071ZM4.05653 16.7845C3.61958 16.3475 3.67956 15.6228 4.1824 15.2636L8.17156 12.4142L9.58578 13.8284L6.73637 17.8176C6.3772 18.3204 5.65248 18.3804 5.21553 17.9435L4.05653 16.7845ZM15.2636 4.1824C15.6228 3.67956 16.3475 3.61958 16.7844 4.05653L17.9435 5.21554C18.3804 5.65249 18.3204 6.37721 17.8176 6.73638L13.8284 9.58578L12.4142 8.17157L15.2636 4.1824Z',\n power: 'M16 2C17.1046 2 18 2.89543 18 4V20C18 21.1046 17.1046 22 16 22H9C7.89543 22 7 21.1046 7 20V4C7 2.89543 7.89543 2 9 2H16ZM13.8115 5.69961C13.8115 5.00797 12.9835 4.75858 12.631 5.27555L12.5794 5.36359L9.0799 12.364C8.8597 12.8083 9.11904 13.3258 9.55954 13.3928L9.6566 13.4001H11.1901V18.3004C11.1901 18.992 12.0181 19.2414 12.3706 18.7245L12.4222 18.6364L15.9217 11.636C16.1419 11.1917 15.8711 10.6742 15.4398 10.6072L15.345 10.5999H13.8115V5.69961Z',\n comms: 'M16 2C17.6569 2 19 3.34315 19 5C19 6.65685 17.6569 8 16 8C15.8259 8 15.6553 7.98518 15.4894 7.95672L14.8034 9.14676C15.3137 9.64825 15.6902 10.2856 15.874 11.0002L18.2676 10.9999C18.6134 10.4022 19.2597 10 20 10C21.1046 10 22 10.8954 22 12C22 13.1046 21.1046 14 20 14C19.2602 14 18.6142 13.5983 18.2682 13.0011L15.8738 13.0008C15.6717 13.7853 15.2375 14.4767 14.6488 14.9974L15.2128 16.1044C15.4637 16.0363 15.7276 16 16 16C17.6569 16 19 17.3431 19 19C19 20.6569 17.6569 22 16 22C14.3431 22 13 20.6569 13 19C13 18.3508 13.2062 17.7498 13.5567 17.2589L12.8669 15.9058C12.5878 15.9675 12.2977 16 12 16C11.2582 16 10.5635 15.7981 9.96801 15.4462L7.75736 17.6569L7.59355 17.4912C7.85196 17.9345 8 18.4499 8 19C8 20.6569 6.65685 22 5 22C3.34315 22 2 20.6569 2 19C2 17.3431 3.34315 16 5 16C5.55006 16 6.06555 16.148 6.50879 16.4065L6.34315 16.2426L8.55383 14.032C8.20193 13.4365 8 12.7418 8 12C8 9.79086 9.79086 8 12 8C12.3705 8 12.7293 8.05038 13.0698 8.14467L13.7446 6.97823C13.281 6.45014 13 5.75789 13 5C13 3.34315 14.3431 2 16 2ZM12 10C10.8954 10 10 10.8954 10 12C10 13.1046 10.8954 14 12 14C13.1046 14 14 13.1046 14 12C14 10.8954 13.1046 10 12 10Z',\n};\n\n/**\n * Render percentage arc display (Astro UX pattern)\n * \n * Displays a circular arc showing a percentage value 0-100.\n * The arc fills clockwise from the top, with status-colored fill.\n */\nconst renderPercentageArc = (\n percentage: number,\n statusColor: string,\n showValue: boolean = true,\n size: number = 48,\n): React.ReactNode => {\n // Clamp percentage to 0-100\n const pct = Math.max(0, Math.min(100, percentage));\n \n // Arc geometry\n const centerX = size / 2;\n const centerY = size / 2;\n const radius = (size / 2) - 4; // Leave room for stroke\n const strokeWidth = 4;\n const innerRadius = radius - strokeWidth / 2;\n \n // Calculate arc path\n // Start at top (12 o'clock) and sweep clockwise\n const startAngle = -90; // Start at top\n const endAngle = startAngle + (pct / 100) * 360;\n \n // Convert to radians\n const startRad = (startAngle * Math.PI) / 180;\n const endRad = (endAngle * Math.PI) / 180;\n \n // Calculate start and end points\n const startX = centerX + innerRadius * Math.cos(startRad);\n const startY = centerY + innerRadius * Math.sin(startRad);\n const endX = centerX + innerRadius * Math.cos(endRad);\n const endY = centerY + innerRadius * Math.sin(endRad);\n \n // Determine if we need a large arc (> 180 degrees)\n const largeArcFlag = pct > 50 ? 1 : 0;\n \n // Create arc path\n const arcPath = pct > 0 && pct < 100\n ? `M ${startX} ${startY} A ${innerRadius} ${innerRadius} 0 ${largeArcFlag} 1 ${endX} ${endY}`\n : pct >= 100\n ? `M ${centerX} ${centerY - innerRadius} A ${innerRadius} ${innerRadius} 0 1 1 ${centerX - 0.001} ${centerY - innerRadius}` // Full circle\n : ''; // Empty when 0%\n \n return (\n <svg\n width={size}\n height={size}\n viewBox={`0 0 ${size} ${size}`}\n style={{ display: 'block' }}\n >\n {/* Background circle (track) */}\n <circle\n cx={centerX}\n cy={centerY}\n r={innerRadius}\n fill=\"none\"\n stroke=\"rgba(255, 255, 255, 0.1)\"\n strokeWidth={strokeWidth}\n />\n \n {/* Progress arc */}\n {arcPath && (\n <path\n d={arcPath}\n fill=\"none\"\n stroke={statusColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n style={{\n filter: `drop-shadow(0 0 4px ${statusColor}60)`,\n }}\n />\n )}\n \n {/* Center value text */}\n {showValue && (\n <text\n x={centerX}\n y={centerY}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n fill={statusColor}\n fontSize={size * 0.28}\n fontWeight={600}\n fontFamily=\"system-ui, -apple-system, sans-serif\"\n >\n {Math.round(pct)}\n </text>\n )}\n </svg>\n );\n};\n\n/**\n * Get status based on percentage value\n * - ascending: low values = critical, high values = normal\n * - descending: low values = normal, high values = critical\n */\nconst getStatusFromPercentage = (\n percentage: number,\n direction: 'ascending' | 'descending',\n): MonitoringStatus => {\n const pct = direction === 'descending' ? 100 - percentage : percentage;\n \n if (pct >= 80) return 'normal';\n if (pct >= 60) return 'standby';\n if (pct >= 40) return 'caution';\n if (pct >= 20) return 'serious';\n return 'critical';\n};\n\n/**\n * MonitoringIcon - Pure React monitoring icon component\n * \n * Displays system status with icon, label, and optional notification badge.\n * Fully Astro UX compliant with theme integration.\n * \n * @example\n * ```tsx\n * // Standard monitoring icon\n * <MonitoringIcon \n * status=\"normal\" \n * label=\"Power\" \n * sublabel=\"85%\"\n * icon=\"power\"\n * />\n * \n * // Percentage arc display\n * <MonitoringIcon\n * status=\"normal\"\n * label=\"Battery\"\n * showPercentage\n * percentage={75}\n * percentageToStatus=\"ascending\"\n * />\n * ```\n */\nexport const MonitoringIcon = memo(function MonitoringIcon({\n status,\n label,\n sublabel,\n icon = 'mission',\n notifications,\n tooltip,\n className = '',\n onClick,\n showPercentage = false,\n percentage = 0,\n percentageToStatus,\n showPercentageValue = true,\n}: MonitoringIconProps): React.ReactElement {\n const { tokens, mode, theme } = useTheme();\n const isTransparentTheme = theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\n const [showTooltip, setShowTooltip] = useState(false);\n \n // Calculate effective status when using percentage-to-status mapping\n const effectiveStatus = percentageToStatus \n ? getStatusFromPercentage(percentage, percentageToStatus)\n : status;\n \n // Get status color from theme\n const color = tokens.colors.status[effectiveStatus] || '#a4abb6';\n const isLightTheme = mode === 'light';\n const borderColor = isLightTheme ? STATUS_BORDER_COLORS[effectiveStatus] : undefined;\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (onClick && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n onClick();\n }\n };\n\n const renderIcon = () => {\n // Percentage arc display mode\n if (showPercentage) {\n return renderPercentageArc(percentage, color, showPercentageValue, 48);\n }\n \n // Custom React element\n if (React.isValidElement(icon)) {\n return icon;\n }\n\n // Use Icon component if valid icon name from core library\n if (typeof icon === 'string' && isValidIconName(icon)) {\n return <Icon name={icon as IconName} size={24} color=\"currentColor\" />;\n }\n\n // Fallback to legacy ICON_PATHS for backward compatibility\n const iconPath = typeof icon === 'string' ? ICON_PATHS[icon] : undefined;\n \n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n style={{ width: 24, height: 24 }}\n aria-hidden=\"true\"\n >\n {iconPath ? (\n <path d={iconPath} fillRule=\"evenodd\" clipRule=\"evenodd\" />\n ) : (\n <path d=\"M12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2ZM12 4C7.58172 4 4 7.58172 4 12C4 16.4183 7.58172 20 12 20C16.4183 20 20 16.4183 20 12C20 7.58172 16.4183 4 12 4ZM18 12C18 8.68629 15.3137 6 12 6C8.68629 6 6 8.68629 6 12C6 15.3137 8.68629 18 12 18C15.3137 18 18 15.3137 18 12ZM12 8C9.79086 8 8 9.79086 8 12C8 14.2091 9.79086 16 12 16C14.2091 16 16 14.2091 16 12C16 9.79086 14.2091 8 12 8ZM14 12C14 10.8954 13.1046 10 12 10C10.8954 10 10 10.8954 10 12C10 13.1046 10.8954 14 12 14C13.1046 14 14 13.1046 14 12Z\" fillRule=\"evenodd\" clipRule=\"evenodd\" />\n )}\n </svg>\n );\n };\n\n return (\n <div\n className={classNames('zendir-monitoring-icon', className)}\n onClick={onClick}\n onKeyDown={onClick ? handleKeyDown : undefined}\n onMouseEnter={() => setShowTooltip(true)}\n onMouseLeave={() => setShowTooltip(false)}\n tabIndex={onClick ? 0 : undefined}\n role=\"status\"\n aria-label={`${label}: ${sublabel ?? status}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: tokens.spacing.xs,\n padding: `${tokens.spacing.sm} ${tokens.spacing.md}`,\n minWidth: 72,\n backgroundColor: isTransparentTheme ? 'transparent' : tokens.colors.background.surface,\n ...(isTransparentTheme && { backdropFilter: 'blur(12px)', WebkitBackdropFilter: 'blur(12px)' as const }),\n ...(tokens.colors.border.cardStyle ?? { border: `1px solid ${tokens.colors.border.muted}` }),\n borderRadius: tokens.borderRadius.md,\n cursor: onClick ? 'pointer' : 'default',\n outline: 'none',\n transition: tokens.animation.fast,\n }}\n >\n {/* Icon with status indicator */}\n <div\n style={{\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color,\n // Explicit sizing for predictable layout\n width: showPercentage ? 48 : 24,\n height: showPercentage ? 48 : 24,\n }}\n >\n {renderIcon()}\n \n {/* Status symbol - shape based on status per Astro UX */}\n <span\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n transform: 'translate(-35%, -35%)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {renderStatusSymbol(effectiveStatus, 9, color, borderColor, !isLightTheme)}\n </span>\n\n {/* Notification badge */}\n {notifications !== undefined && notifications > 0 && (\n <span\n style={{\n position: 'absolute',\n top: 0,\n right: 0,\n transform: 'translate(40%, -40%)',\n minWidth: 16,\n height: 16,\n padding: '0 4px',\n borderRadius: tokens.borderRadius.full,\n backgroundColor: tokens.colors.status.critical,\n color: '#ffffff',\n fontSize: '0.625rem', // 10px in rem\n fontWeight: 700, // AstroUXDS bold for status values\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {notifications > 99 ? '99+' : notifications}\n </span>\n )}\n </div>\n\n {/* Label - sentence case per Astro UX */}\n <span\n style={{\n fontSize: tokens.typography.fontSize.xs,\n fontWeight: tokens.typography.fontWeight.medium,\n color: tokens.colors.text.secondary,\n textTransform: 'none', // Astro uses sentence case, not uppercase\n letterSpacing: tokens.typography.letterSpacing.normal,\n whiteSpace: 'nowrap',\n }}\n >\n {label}\n </span>\n\n {/* Sublabel - dynamic value */}\n {sublabel && (\n <span\n style={{\n fontSize: tokens.typography.fontSize.sm,\n fontWeight: tokens.typography.fontWeight.semibold,\n fontVariantNumeric: 'tabular-nums',\n color: tokens.colors.text.primary,\n }}\n >\n {sublabel}\n </span>\n )}\n\n {/* Tooltip */}\n {tooltip && showTooltip && (\n <div\n style={{\n position: 'absolute',\n bottom: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginBottom: 8,\n padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\n backgroundColor: tokens.colors.background.overlay,\n borderRadius: tokens.borderRadius.sm,\n fontSize: tokens.typography.fontSize.sm,\n color: tokens.colors.text.primary,\n whiteSpace: 'nowrap',\n zIndex: 1000,\n pointerEvents: 'none',\n boxShadow: tokens.shadows.md,\n }}\n >\n {tooltip}\n {/* Tooltip arrow */}\n <span\n style={{\n position: 'absolute',\n top: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n borderWidth: 4,\n borderStyle: 'solid',\n borderColor: `${tokens.colors.background.overlay} transparent transparent transparent`,\n }}\n />\n </div>\n )}\n </div>\n );\n});\n"],"names":["MonitoringIcon"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
2
|
import { StatusLevel } from '../utils';
|
|
3
3
|
|
|
4
|
-
export type IconName = 'satellite' | 'satellite-transmit' | 'satellite-receive' | 'satellite-off' | 'antenna' | 'antenna-transmit' | 'antenna-receive' | 'antenna-off' | 'mission' | 'altitude' | 'solar' | 'thermal' | 'propulsion' | 'payload' | 'processor' | 'equipment' | 'netcom' | 'hardware' | 'orbit' | 'ground-station' | 'battery' | 'location' | 'rocket' | 'thermometer' | 'settings' | 'notifications' | 'notifications-off' | 'warning' | 'error' | 'info' | 'check' | 'close' | 'add' | 'remove' | 'edit' | 'delete' | 'search' | 'filter' | 'refresh' | 'sync' | 'download' | 'upload' | 'expand' | 'collapse' | 'fullscreen' | 'fullscreen-exit' | 'visibility' | 'visibility-off' | 'lock' | 'unlock' | 'arrow-up' | 'arrow-down' | 'arrow-left' | 'arrow-right' | 'chevron-up' | 'chevron-down' | 'chevron-left' | 'chevron-right' | 'menu' | 'more-vert' | 'more-horiz' | 'chart' | 'list' | 'grid' | 'timeline' | 'calendar' | 'clock' | 'play' | 'pause' | 'stop' | 'record' | 'link' | 'link-off' | 'send' | 'message' | 'mail' | 'photo-camera' | 'images' | 'error-outline';
|
|
4
|
+
export type IconName = 'satellite' | 'satellite-transmit' | 'satellite-receive' | 'satellite-off' | 'antenna' | 'antenna-transmit' | 'antenna-receive' | 'antenna-off' | 'mission' | 'altitude' | 'solar' | 'thermal' | 'propulsion' | 'payload' | 'processor' | 'equipment' | 'netcom' | 'hardware' | 'orbit' | 'ground-station' | 'battery' | 'location' | 'rocket' | 'thermometer' | 'settings' | 'notifications' | 'notifications-off' | 'warning' | 'error' | 'info' | 'check' | 'close' | 'add' | 'remove' | 'edit' | 'delete' | 'search' | 'filter' | 'refresh' | 'sync' | 'download' | 'upload' | 'expand' | 'collapse' | 'fullscreen' | 'fullscreen-exit' | 'visibility' | 'visibility-off' | 'lock' | 'unlock' | 'arrow-up' | 'arrow-down' | 'arrow-left' | 'arrow-right' | 'chevron-up' | 'chevron-down' | 'chevron-left' | 'chevron-right' | 'menu' | 'more-vert' | 'more-horiz' | 'chart' | 'list' | 'grid' | 'timeline' | 'calendar' | 'clock' | 'play' | 'play-arrow' | 'pause' | 'stop' | 'skip-next' | 'skip-previous' | 'fast-forward' | 'fast-rewind' | 'record' | 'link' | 'link-off' | 'send' | 'message' | 'mail' | 'photo-camera' | 'images' | 'error-outline';
|
|
5
5
|
export interface IconProps {
|
|
6
6
|
/** Icon name from the library */
|
|
7
7
|
name: IconName;
|
package/dist/react/core/Icon.js
CHANGED
|
@@ -3,50 +3,36 @@ import { memo } from "react";
|
|
|
3
3
|
import { useTheme } from "../theme/ThemeProvider.js";
|
|
4
4
|
const ICON_PATHS = {
|
|
5
5
|
// === Astro Space/Mission Icons ===
|
|
6
|
-
satellite:
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
"
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
"
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
antenna: "M12 5c-3.87 0-7 3.13-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.87-3.13-7-7-7zm0 4c-1.66 0-3 1.34-3 3h2c0-.55.45-1 1-1s1 .45 1 1h2c0-1.66-1.34-3-3-3zm0-8C5.93 1 1 5.93 1 12h2c0-4.97 4.03-9 9-9s9 4.03 9 9h2c0-6.07-4.93-11-11-11zm0 18c-3.87 0-7-3.13-7-7H3c0 4.97 4.03 9 9 9s9-4.03 9-9h-2c0 3.87-3.13 7-7 7z",
|
|
25
|
-
"antenna-transmit": "M12 5c-3.87 0-7 3.13-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.87-3.13-7-7-7zm0 4c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zm0-8C5.93 1 1 5.93 1 12h2c0-4.97 4.03-9 9-9s9 4.03 9 9h2c0-6.07-4.93-11-11-11z",
|
|
26
|
-
"antenna-receive": "M12 5c-3.87 0-7 3.13-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.87-3.13-7-7-7zm0-4C5.93 1 1 5.93 1 12h2c0-4.97 4.03-9 9-9s9 4.03 9 9h2c0-6.07-4.93-11-11-11zm0 18c-3.87 0-7-3.13-7-7H3c0 4.97 4.03 9 9 9s9-4.03 9-9h-2c0 3.87-3.13 7-7 7z",
|
|
27
|
-
"antenna-off": "M12 5c-3.87 0-7 3.13-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.87-3.13-7-7-7zM2.81 2.81L1.39 4.22l2.69 2.69C2.78 8.6 2 10.2 2 12h2c0-1.26.52-2.4 1.35-3.23l1.42 1.42C5.71 11.04 5.17 12 5.17 12.88L5 13h2c0-.55.45-1 1-1 .23 0 .44.08.6.21l1.42 1.42c-.62.24-1.02.83-1.02 1.5 0 .83.67 1.5 1.5 1.5.67 0 1.26-.4 1.5-1.02l6.78 6.78 1.41-1.41L2.81 2.81zM12 1C5.93 1 1 5.93 1 12h2c0-4.97 4.03-9 9-9s9 4.03 9 9h2c0-6.07-4.93-11-11-11z",
|
|
28
|
-
mission: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z",
|
|
29
|
-
altitude: "M12 2L4.5 20.29l.71.71L12 18l6.79 3 .71-.71L12 2z",
|
|
30
|
-
solar: "M20 18V6c0-1.1-.9-2-2-2H6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2zM6 6h12v4H6V6zm0 6h4v6H6v-6zm6 6v-6h6v6h-6z",
|
|
31
|
-
thermal: "M15 13V5c0-1.66-1.34-3-3-3S9 3.34 9 5v8c-1.21.91-2 2.37-2 4 0 2.76 2.24 5 5 5s5-2.24 5-5c0-1.63-.79-3.09-2-4zm-4-8c0-.55.45-1 1-1s1 .45 1 1h-1v1h1v2h-1v1h1v2h-2V5z",
|
|
32
|
-
propulsion: "M13 3h-2v10h2V3zm4.83 2.17l-1.42 1.42A6.92 6.92 0 0119 12c0 3.87-3.13 7-7 7s-7-3.13-7-7c0-2.53 1.37-4.77 3.4-6l-1.42-1.42A8.962 8.962 0 003 12c0 4.97 4.03 9 9 9s9-4.03 9-9a8.96 8.96 0 00-4.17-7.83z",
|
|
33
|
-
payload: "M17 3H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H7V5h10v14zm-5-7c1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3 1.34 3 3 3z",
|
|
34
|
-
processor: "M22 9V7h-2V5c0-1.1-.9-2-2-2H6c-1.1 0-2 .9-2 2v2H2v2h2v2H2v2h2v2H2v2h2v2c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-2h2v-2h-2v-2h2v-2h-2V9h2zm-4 10H6V5h12v14zm-5-7h-2V8h2v4zm0 6h-2v-4h2v4z",
|
|
35
|
-
equipment: "M22 9V7h-2V5c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-2h2v-2h-2v-2h2v-2h-2V9h2zm-4 10H4V5h14v14zM6 13h5v4H6v-4zm6-6h4v3h-4V7zM6 7h5v5H6V7zm6 4h4v6h-4v-6z",
|
|
36
|
-
netcom: "M20 15.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1z",
|
|
37
|
-
hardware: "M17 3H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H7V5h10v14zm-3-8h-4v2h4v-2z",
|
|
6
|
+
satellite: "M8.87867 11.7071C8.09762 10.9261 8.09762 9.65973 8.87867 8.87868C9.65972 8.09763 10.926 8.09763 11.7071 8.87868L13.1213 10.2929C13.9024 11.0739 13.9024 12.3403 13.1213 13.1213C12.3403 13.9024 11.0739 13.9024 10.2929 13.1213L8.87867 11.7071ZM4.05653 16.7845C3.61958 16.3475 3.67956 15.6228 4.1824 15.2636L8.17156 12.4142L9.58578 13.8284L6.73637 17.8176C6.3772 18.3204 5.65248 18.3804 5.21553 17.9435L4.05653 16.7845ZM15.2636 4.1824C15.6228 3.67956 16.3475 3.61958 16.7844 4.05653L17.9435 5.21554C18.3804 5.65249 18.3204 6.37721 17.8176 6.73638L13.8284 9.58578L12.4142 8.17157L15.2636 4.1824Z",
|
|
7
|
+
"satellite-transmit": "M8.87871 8.87868C9.65976 8.09763 10.9261 8.09763 11.7071 8.87868L13.1213 10.2929C13.9024 11.0739 13.9024 12.3403 13.1213 13.1213C12.3403 13.9024 11.074 13.9024 10.2929 13.1213L8.87871 11.7071C8.09766 10.9261 8.09766 9.65973 8.87871 8.87868ZM4.05657 15.3702C4.09551 15.3313 4.13761 15.2956 4.18243 15.2636L8.1716 12.4142L9.58581 13.8284L6.73641 17.8176C6.4154 18.267 5.79085 18.3711 5.34144 18.0501C5.29662 18.0181 5.25452 17.9824 5.21557 17.9435L4.05657 16.7845C3.66604 16.3939 3.66604 15.7608 4.05657 15.3702ZM20.9898 11C21.5828 11 22.0551 11.5125 21.9948 12.1055C21.4823 17.3315 17.3416 21.4721 12.1156 21.9947C11.5226 22.055 11 21.5927 11 20.9998C11 20.4973 11.3719 20.0551 11.8744 20.0048C16.1658 19.5928 19.5828 16.1757 19.9949 11.8844C20.0451 11.3819 20.4773 11 20.9898 11ZM16.9776 11C17.5946 11 18.08 11.546 17.989 12.1527C17.5035 15.1355 15.1469 17.5015 12.1531 17.9868C11.5462 18.088 11 17.5925 11 16.9757C11 16.4803 11.3641 16.0657 11.8597 15.9848C13.8884 15.6338 15.5032 14.0794 15.9425 12.083L15.9864 11.8595C16.0673 11.364 16.482 11 16.9776 11ZM16.6903 3.97335L16.7845 4.05653L17.9435 5.21554C17.9824 5.25449 18.0181 5.29659 18.0501 5.34141C18.3464 5.75625 18.2805 6.32032 17.9152 6.65713L17.8176 6.73638L13.8285 9.58578L12.4142 8.17157L15.2636 4.1824C15.2957 4.13758 15.3313 4.09548 15.3703 4.05653C15.7308 3.69605 16.298 3.66832 16.6903 3.97335Z",
|
|
8
|
+
"satellite-receive": "M19.5 18C20.3285 18 21 18.6716 21 19.5C21 20.3284 20.3285 21 19.5 21C18.6716 21 18 20.3284 18 19.5C18 18.6716 18.6716 18 19.5 18ZM8.1716 12.4142L9.58581 13.8284L6.73641 17.8176C6.4154 18.267 5.79085 18.3711 5.34144 18.0501C5.29662 18.0181 5.25452 17.9824 5.21557 17.9435L4.05657 16.7845C3.66604 16.3939 3.66604 15.7608 4.05657 15.3702C4.09551 15.3313 4.13761 15.2956 4.18243 15.2636L8.1716 12.4142ZM17 16C17.5523 16 18 16.4477 18 17C18 17.5523 17.5523 18 17 18C16.4477 18 16 17.5523 16 17C16 16.4477 16.4477 16 17 16ZM15 14C15.5523 14 16 14.4477 16 15C16 15.5523 15.5523 16 15 16C14.4477 16 14 15.5523 14 15C14 14.4477 14.4477 14 15 14ZM11.7071 8.87868L13.1213 10.2929C13.9024 11.0739 13.9024 12.3403 13.1213 13.1213C12.3403 13.9024 11.074 13.9024 10.2929 13.1213L8.87871 11.7071C8.09766 10.9261 8.09766 9.65973 8.87871 8.87868C9.65976 8.09763 10.9261 8.09763 11.7071 8.87868ZM16.6903 3.97335L16.7845 4.05653L17.9435 5.21554C17.9824 5.25449 18.0181 5.29659 18.0501 5.34141C18.3464 5.75625 18.2805 6.32032 17.9152 6.65713L17.8176 6.73638L13.8285 9.58578L12.4142 8.17157L15.2636 4.1824C15.2957 4.13758 15.3313 4.09548 15.3703 4.05653C15.7007 3.72609 16.2049 3.67525 16.5888 3.90402L16.6903 3.97335Z",
|
|
9
|
+
"satellite-off": "M8.87867 11.7071C8.09762 10.9261 8.09762 9.65973 8.87867 8.87868C9.65972 8.09763 10.926 8.09763 11.7071 8.87868L13.1213 10.2929C13.9024 11.0739 13.9024 12.3403 13.1213 13.1213C12.3403 13.9024 11.0739 13.9024 10.2929 13.1213L8.87867 11.7071ZM4.05653 16.7845C3.61958 16.3475 3.67956 15.6228 4.1824 15.2636L8.17156 12.4142L9.58578 13.8284L6.73637 17.8176C6.3772 18.3204 5.65248 18.3804 5.21553 17.9435L4.05653 16.7845ZM15.2636 4.1824C15.6228 3.67956 16.3475 3.61958 16.7844 4.05653L17.9435 5.21554C18.3804 5.65249 18.3204 6.37721 17.8176 6.73638L13.8284 9.58578L12.4142 8.17157L15.2636 4.1824Z",
|
|
10
|
+
antenna: "M12.5 8C13.6506 8 14.5833 8.89543 14.5833 10C14.5833 10.7398 14.1649 11.3858 13.5428 11.7318L13.5416 22H11.4583L11.4582 11.7324C10.8356 11.3866 10.4166 10.7403 10.4166 10C10.4166 8.89543 11.3494 8 12.5 8ZM6.63099 2.32732C6.98124 2.70075 7.0016 3.27819 6.64763 3.65177C3.61283 6.82949 3.34936 11.6553 6.02151 15.1201C6.33286 15.5271 6.26451 16.1001 5.86774 16.4431C5.40872 16.8398 4.68582 16.775 4.3192 16.294C1.13831 12.1519 1.38131 6.45292 4.85709 2.56983L5.07393 2.33438L5.1678 2.24643C5.59314 1.89421 6.24722 1.91815 6.63099 2.32732ZM19.9142 2.24643L20.0081 2.33438C23.6894 6.21966 24.0087 12.0674 20.7628 16.294C20.3962 16.775 19.6733 16.8398 19.2143 16.4431C18.8175 16.1001 18.7492 15.5271 19.0605 15.1201C21.7327 11.6553 21.4692 6.82949 18.4344 3.65177C18.0804 3.27819 18.1008 2.70075 18.4511 2.32732C18.8348 1.91815 19.4889 1.89421 19.9142 2.24643ZM9.8013 5.34518C10.1466 5.71337 10.1537 6.26509 9.82646 6.65682C8.45162 8.33503 8.32337 10.6773 9.50741 12.4838C9.79011 12.9062 9.72281 13.4541 9.33916 13.7858C8.86156 14.1986 8.10517 14.1177 7.75278 13.6059C6.10277 11.1439 6.21558 7.93692 8.0237 5.58971L8.20397 5.3653L8.28854 5.2755C8.70418 4.88648 9.40006 4.91737 9.8013 5.34518ZM16.7935 5.2755L16.8781 5.3653C18.8573 7.72924 19.0325 11.0644 17.3292 13.6059C16.9769 14.1177 16.2205 14.1986 15.7429 13.7858C15.3592 13.4541 15.2919 12.9062 15.5746 12.4838C16.7586 10.6773 16.6304 8.33503 15.2556 6.65682C14.9283 6.26509 14.9354 5.71337 15.2807 5.34518C15.682 4.91737 16.3778 4.88648 16.7935 5.2755Z",
|
|
11
|
+
"antenna-transmit": "M5.53115 17.8387L6.58945 18.8268L8.92522 18.6021L9.83101 20.4262C9.89964 20.5644 9.93535 20.7167 9.93535 20.871C9.93535 21.3838 9.54931 21.8065 9.05197 21.8642L8.93535 21.871H4.20497C3.9626 21.871 3.72849 21.783 3.54616 21.6233C3.16263 21.2874 3.09746 20.7233 3.37588 20.3117L3.45266 20.2122L5.53115 17.8387ZM7.09757 10.0443C7.33377 10.0636 7.55543 10.1662 7.72301 10.3338L10.042 12.6529L12 12L11.347 13.9579L13.2146 15.8254C13.6051 16.2159 13.6051 16.8491 13.2146 17.2396C13.047 17.4072 12.8253 17.5098 12.5891 17.5291L7.30432 17.9622C7.01163 17.9862 6.7232 17.8803 6.51554 17.6726L5.87575 17.0328C5.66809 16.8252 5.56221 16.5368 5.58619 16.2441L6.01924 10.9593C6.06434 10.4088 6.54713 9.99916 7.09757 10.0443ZM12.0401 6.00108L12.153 6.01316C15.1469 6.4985 17.5035 8.86452 17.989 11.8473C18.08 12.454 17.5945 13 16.9776 13C16.5201 13 16.1315 12.6898 16.0108 12.2524L15.9864 12.1406C15.6222 10.0374 13.9635 8.37918 11.8597 8.01518C11.3641 7.93429 11 7.51973 11 7.02428C11 6.4846 11.4182 6.03781 11.9292 6.00228L12.0401 6.00108ZM11.998 2.00009L12.1156 2.0053C17.3416 2.5279 21.4822 6.6685 21.9948 11.8945C22.0551 12.4875 21.5827 13 20.9898 13C20.4772 13 20.0451 12.6181 19.9948 12.1156C19.5828 7.82425 16.1657 4.40725 11.8744 3.9952C11.3719 3.94495 11 3.50275 11 3.00025C11 2.48636 11.3925 2.0706 11.8832 2.00812L11.998 2.00009Z",
|
|
12
|
+
"antenna-receive": "M5.53115 17.8387L6.58945 18.8268L8.92522 18.602L9.83101 20.4262C9.89964 20.5644 9.93535 20.7167 9.93535 20.871C9.93535 21.3838 9.54931 21.8065 9.05197 21.8642L8.93535 21.871H4.20497C3.9626 21.871 3.72849 21.7829 3.54616 21.6233C3.16263 21.2874 3.09746 20.7233 3.37588 20.3117L3.45266 20.2122L5.53115 17.8387ZM7.09757 10.0443C7.33377 10.0636 7.55543 10.1662 7.72301 10.3338L10.042 12.653L12 12L11.347 13.958L13.2146 15.8254C13.6051 16.2159 13.6051 16.8491 13.2146 17.2396C13.047 17.4072 12.8253 17.5098 12.5891 17.5291L7.30432 17.9622C7.01163 17.9862 6.7232 17.8803 6.51554 17.6726L5.87575 17.0328C5.66809 16.8252 5.56221 16.5368 5.58619 16.2441L6.01924 10.9593C6.06434 10.4088 6.54713 9.99916 7.09757 10.0443ZM14 9C14.5523 9 15 9.44772 15 10C15 10.5523 14.5523 11 14 11C13.4477 11 13 10.5523 13 10C13 9.44772 13.4477 9 14 9ZM16 7C16.5523 7 17 7.44772 17 8C17 8.55228 16.5523 9 16 9C15.4477 9 15 8.55228 15 8C15 7.44772 15.4477 7 16 7ZM18.5 4C19.3284 4 20 4.67157 20 5.5C20 6.32843 19.3284 7 18.5 7C17.6716 7 17 6.32843 17 5.5C17 4.67157 17.6716 4 18.5 4Z",
|
|
13
|
+
"antenna-off": "M5.53115 17.8387L6.58945 18.8268L8.92522 18.602L9.83101 20.4262C9.89964 20.5644 9.93535 20.7167 9.93535 20.871C9.93535 21.3838 9.54931 21.8065 9.05197 21.8642L8.93535 21.871H4.20497C3.9626 21.871 3.72849 21.7829 3.54616 21.6233C3.16263 21.2874 3.09746 20.7232 3.37588 20.3117L3.45266 20.2122L5.53115 17.8387ZM7.09757 10.0443C7.33377 10.0636 7.55543 10.1662 7.72301 10.3338L10.042 12.653L12 12L11.347 13.958L13.2146 15.8254C13.6051 16.2159 13.6051 16.8491 13.2146 17.2396C13.047 17.4072 12.8253 17.5098 12.5891 17.5291L7.30432 17.9622C7.01163 17.9862 6.7232 17.8803 6.51554 17.6726L5.87575 17.0328C5.66809 16.8252 5.56221 16.5367 5.58619 16.2441L6.01924 10.9592C6.06434 10.4088 6.54713 9.99915 7.09757 10.0443Z",
|
|
14
|
+
mission: "M12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2ZM12 4C7.58172 4 4 7.58172 4 12C4 16.4183 7.58172 20 12 20C16.4183 20 20 16.4183 20 12C20 7.58172 16.4183 4 12 4ZM18 12C18 8.68629 15.3137 6 12 6C8.68629 6 6 8.68629 6 12C6 15.3137 8.68629 18 12 18C15.3137 18 18 15.3137 18 12ZM12 8C9.79086 8 8 9.79086 8 12C8 14.2091 9.79086 16 12 16C14.2091 16 16 14.2091 16 12C16 9.79086 14.2091 8 12 8ZM14 12C14 10.8954 13.1046 10 12 10C10.8954 10 10 10.8954 10 12C10 13.1046 10.8954 14 12 14C13.1046 14 14 13.1046 14 12Z",
|
|
15
|
+
altitude: "M12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2ZM12 4C7.58172 4 4 7.58172 4 12C4 16.4183 7.58172 20 12 20C16.4183 20 20 16.4183 20 12C20 7.58172 16.4183 4 12 4ZM14 18C14 17.4477 13.5523 17 13 17H11C10.4477 17 10 17.4477 10 18C10 18.5523 10.4477 19 11 19H13C13.5523 19 14 18.5523 14 18ZM14 14C14.5523 14 15 14.4477 15 15C15 15.5523 14.5523 16 14 16H10C9.44772 16 9 15.5523 9 15C9 14.4477 9.44772 14 10 14H14ZM16 12L19 14V10L16 12ZM5 10L8 12L5 14V10ZM14 12C14 11.4477 13.5523 11 13 11H11C10.4477 11 10 11.4477 10 12C10 12.5523 10.4477 13 11 13H13C13.5523 13 14 12.5523 14 12ZM14 8C14.5523 8 15 8.44772 15 9C15 9.55228 14.5523 10 14 10H10C9.44772 10 9 9.55228 9 9C9 8.44772 9.44772 8 10 8H14ZM14 6C14 5.44772 13.5523 5 13 5H11C10.4477 5 10 5.44772 10 6C10 6.55228 10.4477 7 11 7H13C13.5523 7 14 6.55228 14 6Z",
|
|
16
|
+
solar: "M19.5385 4C20.3456 4 21 4.67008 21 5.49666V17.5033C21 18.3299 20.3456 19 19.5385 19H3.46154C2.65436 19 2 18.3299 2 17.5033V5.49666C2 4.67008 2.65436 4 3.46154 4H19.5385ZM7 6H4V11H7V6ZM11 6H8V11H11V6ZM15 6H12V11H15V6ZM19 6H16V11H19V6ZM7 12H4V17H7V12ZM11 12H8V17H11V12ZM15 12H12V17H15V12ZM19 12H16V17H19V12Z",
|
|
17
|
+
thermal: "M10.5 2C12.433 2 14 3.567 14 5.5L14.0005 12.2576C15.2217 13.2664 16 14.7923 16 16.5C16 19.5376 13.5376 22 10.5 22C7.46243 22 5 19.5376 5 16.5C5 14.7919 5.77868 13.2656 7.00044 12.2568L7 5.5C7 3.567 8.567 2 10.5 2ZM10.5 4C9.7203 4 9.07955 4.59489 9.00687 5.35543L9 5.49987L9.0005 13.199L8.27384 13.799C7.47135 14.4616 7 15.4402 7 16.5C7 18.433 8.567 20 10.5 20C12.433 20 14 18.433 14 16.5C14 15.5111 13.5896 14.593 12.8828 13.9362L12.7268 13.7995L12.0006 13.1997L12 5.5C12 4.7203 11.4051 4.07955 10.6445 4.00687L10.5 4ZM11 5.5C11 5.22386 10.7761 5 10.5 5C10.2239 5 10 5.22386 10 5.5L10.0006 14.0499C8.85917 14.2813 8 15.2903 8 16.5C8 17.8807 9.11929 19 10.5 19C11.8807 19 13 17.8807 13 16.5C13 15.2907 12.1413 14.2819 11.0004 14.0501L11 5.5ZM20 11C20.5523 11 21 11.4477 21 12C21 12.5523 20.5523 13 20 13H17C16.4477 13 16 12.5523 16 12C16 11.4477 16.4477 11 17 11H20ZM19 9C19 8.44772 18.5523 8 18 8H17C16.4477 8 16 8.44772 16 9C16 9.55228 16.4477 10 17 10H18C18.5523 10 19 9.55228 19 9ZM20 5C20.5523 5 21 5.44772 21 6C21 6.55228 20.5523 7 20 7H17C16.4477 7 16 6.55228 16 6C16 5.44772 16.4477 5 17 5H20ZM19 3C19 2.44772 18.5523 2 18 2H17C16.4477 2 16 2.44772 16 3C16 3.55228 16.4477 4 17 4H18C18.5523 4 19 3.55228 19 3Z",
|
|
18
|
+
propulsion: "M16 2C17.1046 2 18 2.89543 18 4V20C18 21.1046 17.1046 22 16 22H9C7.89543 22 7 21.1046 7 20V4C7 2.89543 7.89543 2 9 2H16ZM13.8115 5.69961C13.8115 5.00797 12.9835 4.75858 12.631 5.27555L12.5794 5.36359L9.0799 12.364C8.8597 12.8083 9.11904 13.3258 9.55954 13.3928L9.6566 13.4001H11.1901V18.3004C11.1901 18.992 12.0181 19.2414 12.3706 18.7245L12.4222 18.6364L15.9217 11.636C16.1419 11.1917 15.8711 10.6742 15.4398 10.6072L15.345 10.5999H13.8115V5.69961Z",
|
|
19
|
+
payload: "M12.6802 2.24483L12.8418 2.31637L20.8418 6.31637C21.4305 6.6107 21.819 7.18871 21.8753 7.83667L21.8824 8V16C21.8824 16.6581 21.5391 17.2641 20.9848 17.6043L20.8418 17.6836L12.8418 21.6836C12.3649 21.9221 11.812 21.9459 11.3198 21.7552L11.1582 21.6836L3.15821 17.6836C2.56956 17.3893 2.18104 16.8113 2.12475 16.1633L2.11768 16V8C2.11768 7.34186 2.46091 6.73586 3.0153 6.39574L3.15821 6.31637L3.4276 6.17973C3.50773 6.12386 3.59511 6.0805 3.6866 6.05036L11.1582 2.31637C11.5822 2.1044 12.0662 2.062 12.5141 2.18919L12.6802 2.24483ZM3.99968 8.17865L4.00003 16L10.9997 19.4996V12.5536L3.99968 8.17865ZM12.9997 12.6176L19.9997 9.11765L20 16L12.9997 19.4996V12.6176ZM18.5 15C18.7762 15 19 15.2239 19 15.5C19 15.7761 18.7762 16 18.5 16C18.2239 16 18 15.7761 18 15.5C18 15.2239 18.2239 15 18.5 15ZM6.00003 15.5C6.00003 15.2239 5.77617 15 5.50003 15C5.22389 15 5.00003 15.2239 5.00003 15.5C5.00003 15.7761 5.22389 16 5.50003 16C5.77617 16 6.00003 15.7761 6.00003 15.5ZM16.5 14C16.7762 14 17 14.2239 17 14.5C17 14.7761 16.7762 15 16.5 15C16.2239 15 16 14.7761 16 14.5C16 14.2239 16.2239 14 16.5 14ZM8.00003 14.5C8.00003 14.2239 7.77617 14 7.50003 14C7.22389 14 7.00003 14.2239 7.00003 14.5C7.00003 14.7761 7.22389 15 7.50003 15C7.77617 15 8.00003 14.7761 8.00003 14.5ZM9.50003 13C9.77617 13 10 13.2239 10 13.5C10 13.7761 9.77617 14 9.50003 14C9.22389 14 9.00003 13.7761 9.00003 13.5C9.00003 13.2239 9.22389 13 9.50003 13ZM15 13.5C15 13.2239 14.7762 13 14.5 13C14.2239 13 14 13.2239 14 13.5C14 13.7761 14.2239 14 14.5 14C14.7762 14 15 13.7761 15 13.5ZM12 4L5.93668 7.03065L12.053 10.854L18.8807 7.44065L12 4ZM12.5 9.5C12.5 9.22386 12.2762 9 12 9C11.7239 9 11.5 9.22386 11.5 9.5C11.5 9.77614 11.7239 10 12 10C12.2762 10 12.5 9.77614 12.5 9.5ZM12 7C12.2762 7 12.5 7.22386 12.5 7.5C12.5 7.77614 12.2762 8 12 8C11.7239 8 11.5 7.77614 11.5 7.5C11.5 7.22386 11.7239 7 12 7ZM12.5 5.5C12.5 5.22386 12.2762 5 12 5C11.7239 5 11.5 5.22386 11.5 5.5C11.5 5.77614 11.7239 6 12 6C12.2762 6 12.5 5.77614 12.5 5.5Z",
|
|
20
|
+
processor: "M9 20V22H7V20H9ZM13 20V22H11V20H13ZM17 20V22H15V20H17ZM17 5C18.1046 5 19 5.89543 19 7V17C19 18.1046 18.1046 19 17 19H7C5.89543 19 5 18.1046 5 17V7C5 5.89543 5.89543 5 7 5H17ZM17 16C16.4477 16 16 16.4477 16 17C16 17.5523 16.4477 18 17 18C17.5523 18 18 17.5523 18 17C18 16.4477 17.5523 16 17 16ZM4 15V17H2V15H4ZM22 15V17H20V15H22ZM4 11V13H2V11H4ZM22 11V13H20V11H22ZM4 7V9H2V7H4ZM22 7V9H20V7H22ZM7 6C6.44772 6 6 6.44772 6 7C6 7.55228 6.44772 8 7 8C7.55228 8 8 7.55228 8 7C8 6.44772 7.55228 6 7 6ZM9 2V4H7V2H9ZM13 2V4H11V2H13ZM17 2V4H15V2H17Z",
|
|
21
|
+
equipment: "M22 5C22 3.89543 21.1046 3 20 3H4C2.89543 3 2 3.89543 2 5V9C2 10.1046 2.89543 11 4 11H20C21.1046 11 22 10.1046 22 9V5ZM22 15C22 13.8954 21.1046 13 20 13H4C2.89543 13 2 13.8954 2 15V19C2 20.1046 2.89543 21 4 21H20C21.1046 21 22 20.1046 22 19V15ZM4 15H20V19H4V15ZM7 16V18H5V16H7ZM10 18V16H8V18H10ZM13 16V18H11V16H13ZM20 5H4V9H20V5ZM7 8V6H5V8H7ZM10 6V8H8V6H10ZM13 8V6H11V8H13Z",
|
|
22
|
+
netcom: "M16 2C17.6569 2 19 3.34315 19 5C19 6.65685 17.6569 8 16 8C15.8259 8 15.6553 7.98518 15.4894 7.95672L14.8034 9.14676C15.3137 9.64825 15.6902 10.2856 15.874 11.0002L18.2676 10.9999C18.6134 10.4022 19.2597 10 20 10C21.1046 10 22 10.8954 22 12C22 13.1046 21.1046 14 20 14C19.2602 14 18.6142 13.5983 18.2682 13.0011L15.8738 13.0008C15.6717 13.7853 15.2375 14.4767 14.6488 14.9974L15.2128 16.1044C15.4637 16.0363 15.7276 16 16 16C17.6569 16 19 17.3431 19 19C19 20.6569 17.6569 22 16 22C14.3431 22 13 20.6569 13 19C13 18.3508 13.2062 17.7498 13.5567 17.2589L12.8669 15.9058C12.5878 15.9675 12.2977 16 12 16C11.2582 16 10.5635 15.7981 9.96801 15.4462L7.75736 17.6569L7.59355 17.4912C7.85196 17.9345 8 18.4499 8 19C8 20.6569 6.65685 22 5 22C3.34315 22 2 20.6569 2 19C2 17.3431 3.34315 16 5 16C5.55006 16 6.06555 16.148 6.50879 16.4065L6.34315 16.2426L8.55383 14.032C8.20193 13.4365 8 12.7418 8 12C8 9.79086 9.79086 8 12 8C12.3705 8 12.7293 8.05038 13.0698 8.14467L13.7446 6.97823C13.281 6.45014 13 5.75789 13 5C13 3.34315 14.3431 2 16 2ZM12 10C10.8954 10 10 10.8954 10 12C10 13.1046 10.8954 14 12 14C13.1046 14 14 13.1046 14 12C14 10.8954 13.1046 10 12 10Z",
|
|
23
|
+
hardware: "M4 17.8247V10.4692H20V17.8247H4ZM2 9.77297C2 9.05293 2.58371 8.46922 3.30375 8.46922H20.6962C21.4163 8.46922 22 9.05293 22 9.77298V18.5209C22 19.241 21.4163 19.8247 20.6962 19.8247H3.30375C2.58371 19.8247 2 19.241 2 18.5209V9.77297ZM8.99573 13.637H4.99573V11.637H8.99573V13.637ZM8.99573 16.642H4.99573V14.642H8.99573V16.642ZM10 13.637H14V11.637H10V13.637ZM14 16.642H10V14.642H14V16.642ZM14.9987 13.637H18.9987V11.637H14.9987V13.637ZM18.9987 16.6424H14.9987V14.6424H18.9987V16.6424Z",
|
|
38
24
|
orbit: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm0-14c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm0 10c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4z",
|
|
39
25
|
"ground-station": "M12 3L2 12h3v8h6v-6h2v6h6v-8h3L12 3zm0 11.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z",
|
|
40
|
-
battery: "M15.67
|
|
41
|
-
location: "
|
|
26
|
+
battery: "M15.67 4H14V3C14 2.45 13.55 2 13 2H11C10.45 2 10 2.45 10 3V4H8.33C7.6 4 7 4.6 7 5.33V20.66C7 21.4 7.6 22 8.34 22H15.66C16.4 22 17 21.4 17 20.67V5.33C17 4.6 16.4 4 15.67 4Z",
|
|
27
|
+
location: "M5 9C5 5.13 8.13 2 12 2C15.87 2 19 5.13 19 9C19 13.17 14.58 18.92 12.77 21.11C12.37 21.59 11.64 21.59 11.24 21.11C9.42 18.92 5 13.17 5 9ZM9.5 9C9.5 10.38 10.62 11.5 12 11.5C13.38 11.5 14.5 10.38 14.5 9C14.5 7.62 13.38 6.5 12 6.5C10.62 6.5 9.5 7.62 9.5 9Z",
|
|
42
28
|
rocket: "M12 2c0 0-6.5 5-6.5 12 0 2.5.5 4 1 5.5l5.5-3 5.5 3c.5-1.5 1-3 1-5.5C18.5 7 12 2 12 2zm0 13c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zM7 22l1.5-1.5L10 22l2-2 2 2 1.5-1.5L17 22l-2.5-2.5-2.5 2.5-2.5-2.5L7 22z",
|
|
43
|
-
thermometer: "
|
|
29
|
+
thermometer: "M10.5 2C12.433 2 14 3.567 14 5.5L14.0005 12.2576C15.2217 13.2664 16 14.7923 16 16.5C16 19.5376 13.5376 22 10.5 22C7.46243 22 5 19.5376 5 16.5C5 14.7919 5.77868 13.2656 7.00044 12.2568L7 5.5C7 3.567 8.567 2 10.5 2ZM10.5 4C9.7203 4 9.07955 4.59489 9.00687 5.35543L9 5.49987L9.0005 13.199L8.27384 13.799C7.47135 14.4616 7 15.4402 7 16.5C7 18.433 8.567 20 10.5 20C12.433 20 14 18.433 14 16.5C14 15.5111 13.5896 14.593 12.8828 13.9362L12.7268 13.7995L12.0006 13.1997L12 5.5C12 4.7203 11.4051 4.07955 10.6445 4.00687L10.5 4ZM11 5.5C11 5.22386 10.7761 5 10.5 5C10.2239 5 10 5.22386 10 5.5L10.0006 14.0499C8.85917 14.2813 8 15.2903 8 16.5C8 17.8807 9.11929 19 10.5 19C11.8807 19 13 17.8807 13 16.5C13 15.2907 12.1413 14.2819 11.0004 14.0501L11 5.5ZM20 11C20.5523 11 21 11.4477 21 12C21 12.5523 20.5523 13 20 13H17C16.4477 13 16 12.5523 16 12C16 11.4477 16.4477 11 17 11H20ZM19 9C19 8.44772 18.5523 8 18 8H17C16.4477 8 16 8.44772 16 9C16 9.55228 16.4477 10 17 10H18C18.5523 10 19 9.55228 19 9ZM20 5C20.5523 5 21 5.44772 21 6C21 6.55228 20.5523 7 20 7H17C16.4477 7 16 6.55228 16 6C16 5.44772 16.4477 5 17 5H20ZM19 3C19 2.44772 18.5523 2 18 2H17C16.4477 2 16 2.44772 16 3C16 3.55228 16.4477 4 17 4H18C18.5523 4 19 3.55228 19 3Z",
|
|
44
30
|
// === System Icons ===
|
|
45
|
-
settings: "M19.
|
|
46
|
-
notifications: "
|
|
31
|
+
settings: "M19.5 12C19.5 12.34 19.47 12.66 19.43 12.98L21.54 14.63C21.73 14.78 21.78 15.05 21.66 15.27L19.66 18.73C19.54 18.95 19.28 19.04 19.05 18.95L16.56 17.95C16.04 18.34 15.48 18.68 14.87 18.93L14.49 21.58C14.46 21.82 14.25 22 14 22H10C9.75002 22 9.54002 21.82 9.51002 21.58L9.13002 18.93C8.52002 18.68 7.96002 18.35 7.44002 17.95L4.95002 18.95C4.73002 19.03 4.46002 18.95 4.34002 18.73L2.34002 15.27C2.22002 15.05 2.27002 14.78 2.46002 14.63L4.57002 12.98C4.53002 12.66 4.50002 12.33 4.50002 12C4.50002 11.67 4.53002 11.34 4.57002 11.02L2.46002 9.37C2.27002 9.22 2.21002 8.95 2.34002 8.73L4.34002 5.27C4.46002 5.05 4.72002 4.96 4.95002 5.05L7.44002 6.05C7.96002 5.66 8.52002 5.32 9.13002 5.07L9.51002 2.42C9.54002 2.18 9.75002 2 10 2H14C14.25 2 14.46 2.18 14.49 2.42L14.87 5.07C15.48 5.32 16.04 5.65 16.56 6.05L19.05 5.05C19.27 4.97 19.54 5.05 19.66 5.27L21.66 8.73C21.78 8.95 21.73 9.22 21.54 9.37L19.43 11.02C19.47 11.34 19.5 11.66 19.5 12ZM8.50002 12C8.50002 13.93 10.07 15.5 12 15.5C13.93 15.5 15.5 13.93 15.5 12C15.5 10.07 13.93 8.5 12 8.5C10.07 8.5 8.50002 10.07 8.50002 12Z",
|
|
32
|
+
notifications: "M18 11V16L19.29 17.29C19.92 17.92 19.47 19 18.58 19H5.40999C4.51999 19 4.07999 17.92 4.70999 17.29L5.99999 16V11C5.99999 7.92 7.62999 5.36 10.5 4.68V4C10.5 3.17 11.17 2.5 12 2.5C12.83 2.5 13.5 3.17 13.5 4V4.68C16.36 5.36 18 7.93 18 11ZM14 20C14 21.1 13.1 22 12 22C10.89 22 9.99999 21.1 9.99999 20H14Z",
|
|
47
33
|
"notifications-off": "M20 18.69L7.84 6.14 5.27 3.49 4 4.76l2.8 2.8v.01c-.52.99-.8 2.16-.8 3.42v5l-2 2v1h13.73l2 2L21 19.72l-1-1.03zM12 22c1.11 0 2-.89 2-2h-4c0 1.11.89 2 2 2zm6-7.32V11c0-3.08-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68c-.15.03-.29.08-.42.12-.1.03-.2.07-.3.11h-.01c-.01 0-.01 0-.02.01-.23.09-.46.2-.68.31 0 0-.01 0-.01.01L18 14.68z",
|
|
48
|
-
warning: "
|
|
49
|
-
error: "M12 2C6.48 2 2 6.48 2
|
|
34
|
+
warning: "M19.53 21.0001C21.07 21.0001 22.03 19.3301 21.26 18.0001L13.73 4.99005C12.96 3.66005 11.04 3.66005 10.27 4.99005L2.74 18.0001C1.97 19.3301 2.93 21.0001 4.47 21.0001H19.53ZM12 14.0001C11.45 14.0001 11 13.5501 11 13.0001V11.0001C11 10.4501 11.45 10.0001 12 10.0001C12.55 10.0001 13 10.4501 13 11.0001V13.0001C13 13.5501 12.55 14.0001 12 14.0001ZM11 16.0001V18.0001H13V16.0001H11Z",
|
|
35
|
+
error: "M12 2C6.48 2 2 6.48 2 12C2 17.52 6.48 22 12 22C17.52 22 22 17.52 22 12C22 6.48 17.52 2 12 2ZM12 13C11.45 13 11 12.55 11 12V8C11 7.45 11.45 7 12 7C12.55 7 13 7.45 13 8V12C13 12.55 12.55 13 12 13ZM11 15V17H13V15H11Z",
|
|
50
36
|
info: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z",
|
|
51
37
|
check: "M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z",
|
|
52
38
|
close: "M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z",
|
|
@@ -88,8 +74,13 @@ const ICON_PATHS = {
|
|
|
88
74
|
calendar: "M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zM9 10H7v2h2v-2zm4 0h-2v2h2v-2zm4 0h-2v2h2v-2z",
|
|
89
75
|
clock: "M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z",
|
|
90
76
|
play: "M8 5v14l11-7z",
|
|
77
|
+
"play-arrow": "M8 5v14l11-7z",
|
|
91
78
|
pause: "M6 19h4V5H6v14zm8-14v14h4V5h-4z",
|
|
92
79
|
stop: "M6 6h12v12H6z",
|
|
80
|
+
"skip-next": "M6 18l8.5-6L6 6v12zM16 6v12h2V6h-2z",
|
|
81
|
+
"skip-previous": "M6 6h2v12H6zm3.5 6l8.5 6V6z",
|
|
82
|
+
"fast-forward": "M4 18l8.5-6L4 6v12zm9-12v12l8.5-6L13 6z",
|
|
83
|
+
"fast-rewind": "M11 18V6l-8.5 6 8.5 6zm.5-6l8.5 6V6l-8.5 6z",
|
|
93
84
|
record: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 14c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4z",
|
|
94
85
|
// === Communication Icons ===
|
|
95
86
|
link: "M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z",
|
|
@@ -141,7 +132,7 @@ const Icon = memo(function Icon2({
|
|
|
141
132
|
transition: `fill ${tokens.animation.fast}`,
|
|
142
133
|
...style
|
|
143
134
|
},
|
|
144
|
-
children: Array.isArray(pathData) ? pathData.map((d, i) => /* @__PURE__ */ jsx("path", { d }, i)) : /* @__PURE__ */ jsx("path", { d: pathData })
|
|
135
|
+
children: Array.isArray(pathData) ? pathData.map((d, i) => /* @__PURE__ */ jsx("path", { d, fillRule: "evenodd", clipRule: "evenodd" }, i)) : /* @__PURE__ */ jsx("path", { d: pathData, fillRule: "evenodd", clipRule: "evenodd" })
|
|
145
136
|
}
|
|
146
137
|
);
|
|
147
138
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Icon.js","sources":["../../../src/react/core/Icon.tsx"],"sourcesContent":["/**\n * @zendir/ui - Icon Component\n * \n * Complete icon library following Astro UX Design System.\n * \n * Astro UX Compliance (https://www.astrouxds.com/components/icons-and-symbols/):\n * - Consistent icon sizing\n * - Accessibility via aria-label\n * - Use with MonitoringIcon for status indication\n * \n * IMPORTANT per Astro UX Guidelines:\n * - Icons themselves should NOT change color based on status\n * - Status is communicated via a separate StatusIndicator/StatusSymbol\n * - Use MonitoringIcon component to combine icon + status + label\n * - The `status` prop is provided for convenience but should be used sparingly\n * \n * @example\n * ```tsx\n * // Standard usage - neutral color\n * <Icon name=\"satellite\" />\n * <Icon name=\"antenna\" size={32} />\n * \n * // Custom color (use sparingly)\n * <Icon name=\"thermal\" color=\"#4dacff\" />\n * \n * // For status indication, use MonitoringIcon instead:\n * <MonitoringIcon icon=\"antenna\" status=\"normal\" label=\"Antenna-1\" />\n * ```\n */\n\nimport React, { memo } from 'react';\nimport { useTheme } from '../theme';\nimport type { StatusLevel } from '../utils';\n\nexport type IconName =\n // Astro Space/Mission Icons\n | 'satellite'\n | 'satellite-transmit'\n | 'satellite-receive'\n | 'satellite-off'\n | 'antenna'\n | 'antenna-transmit'\n | 'antenna-receive'\n | 'antenna-off'\n | 'mission'\n | 'altitude'\n | 'solar'\n | 'thermal'\n | 'propulsion'\n | 'payload'\n | 'processor'\n | 'equipment'\n | 'netcom'\n | 'hardware'\n | 'orbit'\n | 'ground-station'\n | 'battery'\n | 'location'\n | 'rocket'\n | 'thermometer'\n // System Icons\n | 'settings'\n | 'notifications'\n | 'notifications-off'\n | 'warning'\n | 'error'\n | 'info'\n | 'check'\n | 'close'\n | 'add'\n | 'remove'\n | 'edit'\n | 'delete'\n | 'search'\n | 'filter'\n | 'refresh'\n | 'sync'\n | 'download'\n | 'upload'\n | 'expand'\n | 'collapse'\n | 'fullscreen'\n | 'fullscreen-exit'\n | 'visibility'\n | 'visibility-off'\n | 'lock'\n | 'unlock'\n // Navigation Icons\n | 'arrow-up'\n | 'arrow-down'\n | 'arrow-left'\n | 'arrow-right'\n | 'chevron-up'\n | 'chevron-down'\n | 'chevron-left'\n | 'chevron-right'\n | 'menu'\n | 'more-vert'\n | 'more-horiz'\n // Data Icons\n | 'chart'\n | 'list'\n | 'grid'\n | 'timeline'\n | 'calendar'\n | 'clock'\n | 'play'\n | 'pause'\n | 'stop'\n | 'record'\n // Communication Icons\n | 'link'\n | 'link-off'\n | 'send'\n | 'message'\n | 'mail'\n | 'photo-camera'\n | 'images'\n | 'error-outline';\n\nexport interface IconProps {\n /** Icon name from the library */\n name: IconName;\n /** Icon size in pixels (default: 24) */\n size?: number;\n /** Status-based coloring (uses Astro status colors) */\n status?: StatusLevel;\n /** Custom color (overrides status) */\n color?: string;\n /** Custom className */\n className?: string;\n /** Accessibility label */\n 'aria-label'?: string;\n /** Click handler */\n onClick?: () => void;\n /** Custom style */\n style?: React.CSSProperties;\n}\n\n/**\n * Complete Astro UX Icon Library\n * SVG paths for 24x24 viewBox\n */\nconst ICON_PATHS: Record<IconName, string | string[]> = {\n // === Astro Space/Mission Icons ===\n satellite: [\n 'M15.44.59l-3.18 3.18c-.78.78-.78 2.05 0 2.83l1.24 1.24-.71.71-1.24-1.25c-.78-.78-2.05-.78-2.83 0L5.54 10.48c-.78.78-.78 2.05 0 2.83l1.24 1.24-.71.71-1.23-1.25c-.78-.78-2.05-.78-2.83 0L.59 14.59 9.41 23.41l.59-.59c.78-.78.78-2.05 0-2.83l-1.24-1.24.71-.71 1.24 1.25c.78.78 2.05.78 2.83 0l3.18-3.18c.78-.78.78-2.05 0-2.83l-1.24-1.24.71-.71 1.24 1.24c.78.78 2.05.78 2.83 0l.58-.58L15.44.59z',\n 'M6.6 20.19l-2.79-2.79.71-.71 2.79 2.79-.71.71z',\n ],\n 'satellite-transmit': [\n 'M15.44.59l-3.18 3.18c-.78.78-.78 2.05 0 2.83l1.24 1.24-.71.71-1.24-1.25c-.78-.78-2.05-.78-2.83 0L5.54 10.48c-.78.78-.78 2.05 0 2.83l1.24 1.24-.71.71-1.23-1.25c-.78-.78-2.05-.78-2.83 0L.59 14.59 9.41 23.41l.59-.59c.78-.78.78-2.05 0-2.83l-1.24-1.24.71-.71 1.24 1.25c.78.78 2.05.78 2.83 0l3.18-3.18c.78-.78.78-2.05 0-2.83l-1.24-1.24.71-.71 1.24 1.24c.78.78 2.05.78 2.83 0l.58-.58L15.44.59zM6.6 20.19l-2.79-2.79.71-.71 2.79 2.79-.71.71z',\n 'M17 13c0 2.21-1.79 4-4 4v2c3.31 0 6-2.69 6-6h-2z',\n 'M21 13c0 4.42-3.58 8-8 8v2c5.52 0 10-4.48 10-10h-2z',\n ],\n 'satellite-receive': [\n 'M15.44.59l-3.18 3.18c-.78.78-.78 2.05 0 2.83l1.24 1.24-.71.71-1.24-1.25c-.78-.78-2.05-.78-2.83 0L5.54 10.48c-.78.78-.78 2.05 0 2.83l1.24 1.24-.71.71-1.23-1.25c-.78-.78-2.05-.78-2.83 0L.59 14.59 9.41 23.41l.59-.59c.78-.78.78-2.05 0-2.83l-1.24-1.24.71-.71 1.24 1.25c.78.78 2.05.78 2.83 0l3.18-3.18c.78-.78.78-2.05 0-2.83l-1.24-1.24.71-.71 1.24 1.24c.78.78 2.05.78 2.83 0l.58-.58L15.44.59zM6.6 20.19l-2.79-2.79.71-.71 2.79 2.79-.71.71z',\n 'M7 11c0-2.21 1.79-4 4-4V5c-3.31 0-6 2.69-6 6h2z',\n 'M3 11c0-4.42 3.58-8 8-8V1C5.48 1 1 5.48 1 11h2z',\n ],\n 'satellite-off': [\n 'M15.44.59l-3.18 3.18c-.78.78-.78 2.05 0 2.83l1.24 1.24-.71.71-1.24-1.25c-.78-.78-2.05-.78-2.83 0L5.54 10.48c-.78.78-.78 2.05 0 2.83l1.24 1.24-.71.71-1.23-1.25c-.78-.78-2.05-.78-2.83 0L.59 14.59 9.41 23.41l.59-.59c.78-.78.78-2.05 0-2.83l-1.24-1.24.71-.71 1.24 1.25c.78.78 2.05.78 2.83 0l3.18-3.18c.78-.78.78-2.05 0-2.83l-1.24-1.24.71-.71 1.24 1.24c.78.78 2.05.78 2.83 0l.58-.58L15.44.59z',\n 'M3.27 3L2 4.27l16.73 16.73L20 19.73 3.27 3z',\n ],\n antenna: 'M12 5c-3.87 0-7 3.13-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.87-3.13-7-7-7zm0 4c-1.66 0-3 1.34-3 3h2c0-.55.45-1 1-1s1 .45 1 1h2c0-1.66-1.34-3-3-3zm0-8C5.93 1 1 5.93 1 12h2c0-4.97 4.03-9 9-9s9 4.03 9 9h2c0-6.07-4.93-11-11-11zm0 18c-3.87 0-7-3.13-7-7H3c0 4.97 4.03 9 9 9s9-4.03 9-9h-2c0 3.87-3.13 7-7 7z',\n 'antenna-transmit': 'M12 5c-3.87 0-7 3.13-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.87-3.13-7-7-7zm0 4c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zm0-8C5.93 1 1 5.93 1 12h2c0-4.97 4.03-9 9-9s9 4.03 9 9h2c0-6.07-4.93-11-11-11z',\n 'antenna-receive': 'M12 5c-3.87 0-7 3.13-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.87-3.13-7-7-7zm0-4C5.93 1 1 5.93 1 12h2c0-4.97 4.03-9 9-9s9 4.03 9 9h2c0-6.07-4.93-11-11-11zm0 18c-3.87 0-7-3.13-7-7H3c0 4.97 4.03 9 9 9s9-4.03 9-9h-2c0 3.87-3.13 7-7 7z',\n 'antenna-off': 'M12 5c-3.87 0-7 3.13-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.87-3.13-7-7-7zM2.81 2.81L1.39 4.22l2.69 2.69C2.78 8.6 2 10.2 2 12h2c0-1.26.52-2.4 1.35-3.23l1.42 1.42C5.71 11.04 5.17 12 5.17 12.88L5 13h2c0-.55.45-1 1-1 .23 0 .44.08.6.21l1.42 1.42c-.62.24-1.02.83-1.02 1.5 0 .83.67 1.5 1.5 1.5.67 0 1.26-.4 1.5-1.02l6.78 6.78 1.41-1.41L2.81 2.81zM12 1C5.93 1 1 5.93 1 12h2c0-4.97 4.03-9 9-9s9 4.03 9 9h2c0-6.07-4.93-11-11-11z',\n mission: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z',\n altitude: 'M12 2L4.5 20.29l.71.71L12 18l6.79 3 .71-.71L12 2z',\n solar: 'M20 18V6c0-1.1-.9-2-2-2H6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2zM6 6h12v4H6V6zm0 6h4v6H6v-6zm6 6v-6h6v6h-6z',\n thermal: 'M15 13V5c0-1.66-1.34-3-3-3S9 3.34 9 5v8c-1.21.91-2 2.37-2 4 0 2.76 2.24 5 5 5s5-2.24 5-5c0-1.63-.79-3.09-2-4zm-4-8c0-.55.45-1 1-1s1 .45 1 1h-1v1h1v2h-1v1h1v2h-2V5z',\n propulsion: 'M13 3h-2v10h2V3zm4.83 2.17l-1.42 1.42A6.92 6.92 0 0119 12c0 3.87-3.13 7-7 7s-7-3.13-7-7c0-2.53 1.37-4.77 3.4-6l-1.42-1.42A8.962 8.962 0 003 12c0 4.97 4.03 9 9 9s9-4.03 9-9a8.96 8.96 0 00-4.17-7.83z',\n payload: 'M17 3H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H7V5h10v14zm-5-7c1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3 1.34 3 3 3z',\n processor: 'M22 9V7h-2V5c0-1.1-.9-2-2-2H6c-1.1 0-2 .9-2 2v2H2v2h2v2H2v2h2v2H2v2h2v2c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-2h2v-2h-2v-2h2v-2h-2V9h2zm-4 10H6V5h12v14zm-5-7h-2V8h2v4zm0 6h-2v-4h2v4z',\n equipment: 'M22 9V7h-2V5c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-2h2v-2h-2v-2h2v-2h-2V9h2zm-4 10H4V5h14v14zM6 13h5v4H6v-4zm6-6h4v3h-4V7zM6 7h5v5H6V7zm6 4h4v6h-4v-6z',\n netcom: 'M20 15.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1z',\n hardware: 'M17 3H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H7V5h10v14zm-3-8h-4v2h4v-2z',\n orbit: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm0-14c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm0 10c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4z',\n 'ground-station': 'M12 3L2 12h3v8h6v-6h2v6h6v-8h3L12 3zm0 11.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z',\n battery: 'M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33v15.33C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V5.33C17 4.6 16.4 4 15.67 4zM11 20v-5.5H9L13 7v5.5h2L11 20z',\n location: 'M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z',\n rocket: 'M12 2c0 0-6.5 5-6.5 12 0 2.5.5 4 1 5.5l5.5-3 5.5 3c.5-1.5 1-3 1-5.5C18.5 7 12 2 12 2zm0 13c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zM7 22l1.5-1.5L10 22l2-2 2 2 1.5-1.5L17 22l-2.5-2.5-2.5 2.5-2.5-2.5L7 22z',\n thermometer: 'M15 13V5c0-1.66-1.34-3-3-3S9 3.34 9 5v8c-1.21.91-2 2.37-2 4 0 2.76 2.24 5 5 5s5-2.24 5-5c0-1.63-.79-3.09-2-4zm-4-8c0-.55.45-1 1-1s1 .45 1 1h-1v1h1v2h-1v1h1v2h-2V5z',\n \n // === System Icons ===\n settings: 'M19.14 12.94c.04-.31.06-.63.06-.94 0-.31-.02-.63-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.04.31-.06.63-.06.94s.02.63.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z',\n notifications: 'M12 22c1.1 0 2-.9 2-2h-4c0 1.1.89 2 2 2zm6-6v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2z',\n 'notifications-off': 'M20 18.69L7.84 6.14 5.27 3.49 4 4.76l2.8 2.8v.01c-.52.99-.8 2.16-.8 3.42v5l-2 2v1h13.73l2 2L21 19.72l-1-1.03zM12 22c1.11 0 2-.89 2-2h-4c0 1.11.89 2 2 2zm6-7.32V11c0-3.08-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68c-.15.03-.29.08-.42.12-.1.03-.2.07-.3.11h-.01c-.01 0-.01 0-.02.01-.23.09-.46.2-.68.31 0 0-.01 0-.01.01L18 14.68z',\n warning: 'M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z',\n error: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z',\n info: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z',\n check: 'M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z',\n close: 'M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z',\n add: 'M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z',\n remove: 'M19 13H5v-2h14v2z',\n edit: 'M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z',\n delete: 'M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z',\n search: 'M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z',\n filter: 'M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z',\n refresh: 'M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z',\n sync: 'M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z',\n download: 'M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z',\n upload: 'M9 16h6v-6h4l-7-7-7 7h4v6zm-4 2h14v2H5v-2z',\n expand: 'M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z',\n collapse: 'M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z',\n fullscreen: 'M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z',\n 'fullscreen-exit': 'M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z',\n visibility: 'M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z',\n 'visibility-off': 'M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z',\n lock: 'M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9H8.9V6c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z',\n unlock: 'M12 17c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm6-9h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6h1.9c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm0 12H6V10h12v10z',\n \n // === Navigation Icons ===\n 'arrow-up': 'M4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z',\n 'arrow-down': 'M20 12l-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z',\n 'arrow-left': 'M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z',\n 'arrow-right': 'M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8-8-8z',\n 'chevron-up': 'M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z',\n 'chevron-down': 'M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z',\n 'chevron-left': 'M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z',\n 'chevron-right': 'M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z',\n menu: 'M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z',\n 'more-vert': 'M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z',\n 'more-horiz': 'M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z',\n \n // === Data Icons ===\n chart: 'M3.5 18.49l6-6.01 4 4L22 6.92l-1.41-1.41-7.09 7.97-4-4L2 16.99z',\n list: 'M3 13h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm4 4h14v-2H7v2zm0 4h14v-2H7v2zM7 7v2h14V7H7z',\n grid: 'M3 3h8v8H3V3zm0 10h8v8H3v-8zm10-10h8v8h-8V3zm0 10h8v8h-8v-8z',\n timeline: 'M23 8c0 1.1-.9 2-2 2-.18 0-.35-.02-.51-.07l-3.56 3.55c.05.16.07.34.07.52 0 1.1-.9 2-2 2s-2-.9-2-2c0-.18.02-.36.07-.52l-2.55-2.55c-.16.05-.34.07-.52.07s-.36-.02-.52-.07l-4.55 4.56c.05.16.07.33.07.51 0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2c.18 0 .35.02.51.07l4.56-4.55C8.02 9.36 8 9.18 8 9c0-1.1.9-2 2-2s2 .9 2 2c0 .18-.02.36-.07.52l2.55 2.55c.16-.05.34-.07.52-.07s.36.02.52.07l3.55-3.56C19.02 8.35 19 8.18 19 8c0-1.1.9-2 2-2s2 .9 2 2z',\n calendar: 'M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zM9 10H7v2h2v-2zm4 0h-2v2h2v-2zm4 0h-2v2h2v-2z',\n clock: 'M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z',\n play: 'M8 5v14l11-7z',\n pause: 'M6 19h4V5H6v14zm8-14v14h4V5h-4z',\n stop: 'M6 6h12v12H6z',\n record: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 14c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4z',\n \n // === Communication Icons ===\n link: 'M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z',\n 'link-off': 'M17 7h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.43-.98 2.63-2.31 2.98l1.46 1.46C20.88 15.61 22 13.95 22 12c0-2.76-2.24-5-5-5zm-1 4h-2.19l2 2H16v-2zM2 4.27l3.11 3.11C3.29 8.12 2 9.91 2 12c0 2.76 2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1 0-1.59 1.21-2.9 2.76-3.07L8.73 11H8v2h2.73L13 15.27V17h1.73l4.01 4L20 19.74 3.27 3 2 4.27z',\n send: 'M2.01 21L23 12 2.01 3 2 10l15 2-15 2z',\n message: 'M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-2 12H6v-2h12v2zm0-3H6V9h12v2zm0-3H6V6h12v2z',\n mail: 'M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z',\n 'photo-camera': 'M12 12m-3.2 0a3.2 3.2 0 1 0 6.4 0 3.2 3.2 0 1 0-6.4 0M9 2L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2h-3.17L15 2H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z',\n images: 'M22 16V4c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2zm-11-4l2.03 2.71L16 11l4 5H8l3-4zM2 6v14c0 1.1.9 2 2 2h14v-2H4V6H2z',\n 'error-outline': 'M11 15h2v2h-2v-2zm0-8h2v6h-2V7zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z',\n};\n\nexport const Icon = memo(function Icon({\n name,\n size = 24,\n status,\n color,\n className = '',\n 'aria-label': ariaLabel,\n onClick,\n style,\n}: IconProps): React.ReactElement {\n const { tokens } = useTheme();\n \n // Determine color: custom > status > default\n const iconColor = color \n ?? (status ? tokens.colors.status[status] : tokens.colors.text.primary);\n \n const pathData = ICON_PATHS[name];\n const isInteractive = !!onClick;\n \n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill={iconColor}\n className={className}\n role={ariaLabel ? 'img' : 'presentation'}\n aria-label={ariaLabel ?? name}\n aria-hidden={!ariaLabel}\n onClick={onClick}\n onKeyDown={onClick ? (e: React.KeyboardEvent) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onClick(); } } : undefined}\n tabIndex={isInteractive ? 0 : undefined}\n style={{\n cursor: isInteractive ? 'pointer' : 'default',\n flexShrink: 0,\n transition: `fill ${tokens.animation.fast}`,\n ...style,\n }}\n >\n {Array.isArray(pathData) ? (\n pathData.map((d, i) => <path key={i} d={d} />)\n ) : (\n <path d={pathData} />\n )}\n </svg>\n );\n});\n\n/**\n * Get all available icon names\n */\nexport function getIconNames(): IconName[] {\n return Object.keys(ICON_PATHS) as IconName[];\n}\n\n/**\n * Check if an icon name exists\n */\nexport function isValidIconName(name: string): name is IconName {\n return name in ICON_PATHS;\n}\n\nexport default Icon;\n"],"names":["Icon"],"mappings":";;;AA+IA,MAAM,aAAkD;AAAA;AAAA,EAEtD,WAAW;AAAA,IACT;AAAA,IACA;AAAA,EAAA;AAAA,EAEF,sBAAsB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEF,qBAAqB;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEF,iBAAiB;AAAA,IACf;AAAA,IACA;AAAA,EAAA;AAAA,EAEF,SAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AAAA,EACP,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AAAA,EACP,kBAAkB;AAAA,EAClB,SAAS;AAAA,EACT,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,aAAa;AAAA;AAAA,EAGb,UAAU;AAAA,EACV,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,MAAM;AAAA,EACN,QAAQ;AAAA;AAAA,EAGR,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,cAAc;AAAA,EACd,eAAe;AAAA,EACf,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,aAAa;AAAA,EACb,cAAc;AAAA;AAAA,EAGd,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA;AAAA,EAGR,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,iBAAiB;AACnB;AAEO,MAAM,OAAO,KAAK,SAASA,MAAK;AAAA,EACrC;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,cAAc;AAAA,EACd;AAAA,EACA;AACF,GAAkC;AAChC,QAAM,EAAE,OAAA,IAAW,SAAA;AAGnB,QAAM,YAAY,UACZ,SAAS,OAAO,OAAO,OAAO,MAAM,IAAI,OAAO,OAAO,KAAK;AAEjE,QAAM,WAAW,WAAW,IAAI;AAChC,QAAM,gBAAgB,CAAC,CAAC;AAExB,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAQ;AAAA,MACR,MAAM;AAAA,MACN;AAAA,MACA,MAAM,YAAY,QAAQ;AAAA,MAC1B,cAAY,aAAa;AAAA,MACzB,eAAa,CAAC;AAAA,MACd;AAAA,MACA,WAAW,UAAU,CAAC,MAA2B;AAAE,YAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AAAE,YAAE,eAAA;AAAkB,kBAAA;AAAA,QAAW;AAAA,MAAE,IAAI;AAAA,MAClI,UAAU,gBAAgB,IAAI;AAAA,MAC9B,OAAO;AAAA,QACL,QAAQ,gBAAgB,YAAY;AAAA,QACpC,YAAY;AAAA,QACZ,YAAY,QAAQ,OAAO,UAAU,IAAI;AAAA,QACzC,GAAG;AAAA,MAAA;AAAA,MAGJ,gBAAM,QAAQ,QAAQ,IACrB,SAAS,IAAI,CAAC,GAAG,MAAM,oBAAC,QAAA,EAAa,KAAH,CAAS,CAAE,IAE7C,oBAAC,QAAA,EAAK,GAAG,SAAA,CAAU;AAAA,IAAA;AAAA,EAAA;AAI3B,CAAC;AAKM,SAAS,eAA2B;AACzC,SAAO,OAAO,KAAK,UAAU;AAC/B;AAKO,SAAS,gBAAgB,MAAgC;AAC9D,SAAO,QAAQ;AACjB;"}
|
|
1
|
+
{"version":3,"file":"Icon.js","sources":["../../../src/react/core/Icon.tsx"],"sourcesContent":["/**\n * @zendir/ui - Icon Component\n * \n * Complete icon library following Astro UX Design System.\n * \n * Astro UX Compliance (https://www.astrouxds.com/components/icons-and-symbols/):\n * - Consistent icon sizing\n * - Accessibility via aria-label\n * - Use with MonitoringIcon for status indication\n * \n * IMPORTANT per Astro UX Guidelines:\n * - Icons themselves should NOT change color based on status\n * - Status is communicated via a separate StatusIndicator/StatusSymbol\n * - Use MonitoringIcon component to combine icon + status + label\n * - The `status` prop is provided for convenience but should be used sparingly\n * \n * @example\n * ```tsx\n * // Standard usage - neutral color\n * <Icon name=\"satellite\" />\n * <Icon name=\"antenna\" size={32} />\n * \n * // Custom color (use sparingly)\n * <Icon name=\"thermal\" color=\"#4dacff\" />\n * \n * // For status indication, use MonitoringIcon instead:\n * <MonitoringIcon icon=\"antenna\" status=\"normal\" label=\"Antenna-1\" />\n * ```\n */\n\nimport React, { memo } from 'react';\nimport { useTheme } from '../theme';\nimport type { StatusLevel } from '../utils';\n\nexport type IconName =\n // Astro Space/Mission Icons\n | 'satellite'\n | 'satellite-transmit'\n | 'satellite-receive'\n | 'satellite-off'\n | 'antenna'\n | 'antenna-transmit'\n | 'antenna-receive'\n | 'antenna-off'\n | 'mission'\n | 'altitude'\n | 'solar'\n | 'thermal'\n | 'propulsion'\n | 'payload'\n | 'processor'\n | 'equipment'\n | 'netcom'\n | 'hardware'\n | 'orbit'\n | 'ground-station'\n | 'battery'\n | 'location'\n | 'rocket'\n | 'thermometer'\n // System Icons\n | 'settings'\n | 'notifications'\n | 'notifications-off'\n | 'warning'\n | 'error'\n | 'info'\n | 'check'\n | 'close'\n | 'add'\n | 'remove'\n | 'edit'\n | 'delete'\n | 'search'\n | 'filter'\n | 'refresh'\n | 'sync'\n | 'download'\n | 'upload'\n | 'expand'\n | 'collapse'\n | 'fullscreen'\n | 'fullscreen-exit'\n | 'visibility'\n | 'visibility-off'\n | 'lock'\n | 'unlock'\n // Navigation Icons\n | 'arrow-up'\n | 'arrow-down'\n | 'arrow-left'\n | 'arrow-right'\n | 'chevron-up'\n | 'chevron-down'\n | 'chevron-left'\n | 'chevron-right'\n | 'menu'\n | 'more-vert'\n | 'more-horiz'\n // Data Icons\n | 'chart'\n | 'list'\n | 'grid'\n | 'timeline'\n | 'calendar'\n | 'clock'\n | 'play'\n | 'play-arrow'\n | 'pause'\n | 'stop'\n | 'skip-next'\n | 'skip-previous'\n | 'fast-forward'\n | 'fast-rewind'\n | 'record'\n // Communication Icons\n | 'link'\n | 'link-off'\n | 'send'\n | 'message'\n | 'mail'\n | 'photo-camera'\n | 'images'\n | 'error-outline';\n\nexport interface IconProps {\n /** Icon name from the library */\n name: IconName;\n /** Icon size in pixels (default: 24) */\n size?: number;\n /** Status-based coloring (uses Astro status colors) */\n status?: StatusLevel;\n /** Custom color (overrides status) */\n color?: string;\n /** Custom className */\n className?: string;\n /** Accessibility label */\n 'aria-label'?: string;\n /** Click handler */\n onClick?: () => void;\n /** Custom style */\n style?: React.CSSProperties;\n}\n\n/**\n * Complete Astro UX Icon Library\n * SVG paths for 24x24 viewBox\n */\nconst ICON_PATHS: Record<IconName, string | string[]> = {\n // === Astro Space/Mission Icons ===\n satellite: 'M8.87867 11.7071C8.09762 10.9261 8.09762 9.65973 8.87867 8.87868C9.65972 8.09763 10.926 8.09763 11.7071 8.87868L13.1213 10.2929C13.9024 11.0739 13.9024 12.3403 13.1213 13.1213C12.3403 13.9024 11.0739 13.9024 10.2929 13.1213L8.87867 11.7071ZM4.05653 16.7845C3.61958 16.3475 3.67956 15.6228 4.1824 15.2636L8.17156 12.4142L9.58578 13.8284L6.73637 17.8176C6.3772 18.3204 5.65248 18.3804 5.21553 17.9435L4.05653 16.7845ZM15.2636 4.1824C15.6228 3.67956 16.3475 3.61958 16.7844 4.05653L17.9435 5.21554C18.3804 5.65249 18.3204 6.37721 17.8176 6.73638L13.8284 9.58578L12.4142 8.17157L15.2636 4.1824Z',\n 'satellite-transmit': 'M8.87871 8.87868C9.65976 8.09763 10.9261 8.09763 11.7071 8.87868L13.1213 10.2929C13.9024 11.0739 13.9024 12.3403 13.1213 13.1213C12.3403 13.9024 11.074 13.9024 10.2929 13.1213L8.87871 11.7071C8.09766 10.9261 8.09766 9.65973 8.87871 8.87868ZM4.05657 15.3702C4.09551 15.3313 4.13761 15.2956 4.18243 15.2636L8.1716 12.4142L9.58581 13.8284L6.73641 17.8176C6.4154 18.267 5.79085 18.3711 5.34144 18.0501C5.29662 18.0181 5.25452 17.9824 5.21557 17.9435L4.05657 16.7845C3.66604 16.3939 3.66604 15.7608 4.05657 15.3702ZM20.9898 11C21.5828 11 22.0551 11.5125 21.9948 12.1055C21.4823 17.3315 17.3416 21.4721 12.1156 21.9947C11.5226 22.055 11 21.5927 11 20.9998C11 20.4973 11.3719 20.0551 11.8744 20.0048C16.1658 19.5928 19.5828 16.1757 19.9949 11.8844C20.0451 11.3819 20.4773 11 20.9898 11ZM16.9776 11C17.5946 11 18.08 11.546 17.989 12.1527C17.5035 15.1355 15.1469 17.5015 12.1531 17.9868C11.5462 18.088 11 17.5925 11 16.9757C11 16.4803 11.3641 16.0657 11.8597 15.9848C13.8884 15.6338 15.5032 14.0794 15.9425 12.083L15.9864 11.8595C16.0673 11.364 16.482 11 16.9776 11ZM16.6903 3.97335L16.7845 4.05653L17.9435 5.21554C17.9824 5.25449 18.0181 5.29659 18.0501 5.34141C18.3464 5.75625 18.2805 6.32032 17.9152 6.65713L17.8176 6.73638L13.8285 9.58578L12.4142 8.17157L15.2636 4.1824C15.2957 4.13758 15.3313 4.09548 15.3703 4.05653C15.7308 3.69605 16.298 3.66832 16.6903 3.97335Z',\n 'satellite-receive': 'M19.5 18C20.3285 18 21 18.6716 21 19.5C21 20.3284 20.3285 21 19.5 21C18.6716 21 18 20.3284 18 19.5C18 18.6716 18.6716 18 19.5 18ZM8.1716 12.4142L9.58581 13.8284L6.73641 17.8176C6.4154 18.267 5.79085 18.3711 5.34144 18.0501C5.29662 18.0181 5.25452 17.9824 5.21557 17.9435L4.05657 16.7845C3.66604 16.3939 3.66604 15.7608 4.05657 15.3702C4.09551 15.3313 4.13761 15.2956 4.18243 15.2636L8.1716 12.4142ZM17 16C17.5523 16 18 16.4477 18 17C18 17.5523 17.5523 18 17 18C16.4477 18 16 17.5523 16 17C16 16.4477 16.4477 16 17 16ZM15 14C15.5523 14 16 14.4477 16 15C16 15.5523 15.5523 16 15 16C14.4477 16 14 15.5523 14 15C14 14.4477 14.4477 14 15 14ZM11.7071 8.87868L13.1213 10.2929C13.9024 11.0739 13.9024 12.3403 13.1213 13.1213C12.3403 13.9024 11.074 13.9024 10.2929 13.1213L8.87871 11.7071C8.09766 10.9261 8.09766 9.65973 8.87871 8.87868C9.65976 8.09763 10.9261 8.09763 11.7071 8.87868ZM16.6903 3.97335L16.7845 4.05653L17.9435 5.21554C17.9824 5.25449 18.0181 5.29659 18.0501 5.34141C18.3464 5.75625 18.2805 6.32032 17.9152 6.65713L17.8176 6.73638L13.8285 9.58578L12.4142 8.17157L15.2636 4.1824C15.2957 4.13758 15.3313 4.09548 15.3703 4.05653C15.7007 3.72609 16.2049 3.67525 16.5888 3.90402L16.6903 3.97335Z',\n 'satellite-off': 'M8.87867 11.7071C8.09762 10.9261 8.09762 9.65973 8.87867 8.87868C9.65972 8.09763 10.926 8.09763 11.7071 8.87868L13.1213 10.2929C13.9024 11.0739 13.9024 12.3403 13.1213 13.1213C12.3403 13.9024 11.0739 13.9024 10.2929 13.1213L8.87867 11.7071ZM4.05653 16.7845C3.61958 16.3475 3.67956 15.6228 4.1824 15.2636L8.17156 12.4142L9.58578 13.8284L6.73637 17.8176C6.3772 18.3204 5.65248 18.3804 5.21553 17.9435L4.05653 16.7845ZM15.2636 4.1824C15.6228 3.67956 16.3475 3.61958 16.7844 4.05653L17.9435 5.21554C18.3804 5.65249 18.3204 6.37721 17.8176 6.73638L13.8284 9.58578L12.4142 8.17157L15.2636 4.1824Z',\n antenna: 'M12.5 8C13.6506 8 14.5833 8.89543 14.5833 10C14.5833 10.7398 14.1649 11.3858 13.5428 11.7318L13.5416 22H11.4583L11.4582 11.7324C10.8356 11.3866 10.4166 10.7403 10.4166 10C10.4166 8.89543 11.3494 8 12.5 8ZM6.63099 2.32732C6.98124 2.70075 7.0016 3.27819 6.64763 3.65177C3.61283 6.82949 3.34936 11.6553 6.02151 15.1201C6.33286 15.5271 6.26451 16.1001 5.86774 16.4431C5.40872 16.8398 4.68582 16.775 4.3192 16.294C1.13831 12.1519 1.38131 6.45292 4.85709 2.56983L5.07393 2.33438L5.1678 2.24643C5.59314 1.89421 6.24722 1.91815 6.63099 2.32732ZM19.9142 2.24643L20.0081 2.33438C23.6894 6.21966 24.0087 12.0674 20.7628 16.294C20.3962 16.775 19.6733 16.8398 19.2143 16.4431C18.8175 16.1001 18.7492 15.5271 19.0605 15.1201C21.7327 11.6553 21.4692 6.82949 18.4344 3.65177C18.0804 3.27819 18.1008 2.70075 18.4511 2.32732C18.8348 1.91815 19.4889 1.89421 19.9142 2.24643ZM9.8013 5.34518C10.1466 5.71337 10.1537 6.26509 9.82646 6.65682C8.45162 8.33503 8.32337 10.6773 9.50741 12.4838C9.79011 12.9062 9.72281 13.4541 9.33916 13.7858C8.86156 14.1986 8.10517 14.1177 7.75278 13.6059C6.10277 11.1439 6.21558 7.93692 8.0237 5.58971L8.20397 5.3653L8.28854 5.2755C8.70418 4.88648 9.40006 4.91737 9.8013 5.34518ZM16.7935 5.2755L16.8781 5.3653C18.8573 7.72924 19.0325 11.0644 17.3292 13.6059C16.9769 14.1177 16.2205 14.1986 15.7429 13.7858C15.3592 13.4541 15.2919 12.9062 15.5746 12.4838C16.7586 10.6773 16.6304 8.33503 15.2556 6.65682C14.9283 6.26509 14.9354 5.71337 15.2807 5.34518C15.682 4.91737 16.3778 4.88648 16.7935 5.2755Z',\n 'antenna-transmit': 'M5.53115 17.8387L6.58945 18.8268L8.92522 18.6021L9.83101 20.4262C9.89964 20.5644 9.93535 20.7167 9.93535 20.871C9.93535 21.3838 9.54931 21.8065 9.05197 21.8642L8.93535 21.871H4.20497C3.9626 21.871 3.72849 21.783 3.54616 21.6233C3.16263 21.2874 3.09746 20.7233 3.37588 20.3117L3.45266 20.2122L5.53115 17.8387ZM7.09757 10.0443C7.33377 10.0636 7.55543 10.1662 7.72301 10.3338L10.042 12.6529L12 12L11.347 13.9579L13.2146 15.8254C13.6051 16.2159 13.6051 16.8491 13.2146 17.2396C13.047 17.4072 12.8253 17.5098 12.5891 17.5291L7.30432 17.9622C7.01163 17.9862 6.7232 17.8803 6.51554 17.6726L5.87575 17.0328C5.66809 16.8252 5.56221 16.5368 5.58619 16.2441L6.01924 10.9593C6.06434 10.4088 6.54713 9.99916 7.09757 10.0443ZM12.0401 6.00108L12.153 6.01316C15.1469 6.4985 17.5035 8.86452 17.989 11.8473C18.08 12.454 17.5945 13 16.9776 13C16.5201 13 16.1315 12.6898 16.0108 12.2524L15.9864 12.1406C15.6222 10.0374 13.9635 8.37918 11.8597 8.01518C11.3641 7.93429 11 7.51973 11 7.02428C11 6.4846 11.4182 6.03781 11.9292 6.00228L12.0401 6.00108ZM11.998 2.00009L12.1156 2.0053C17.3416 2.5279 21.4822 6.6685 21.9948 11.8945C22.0551 12.4875 21.5827 13 20.9898 13C20.4772 13 20.0451 12.6181 19.9948 12.1156C19.5828 7.82425 16.1657 4.40725 11.8744 3.9952C11.3719 3.94495 11 3.50275 11 3.00025C11 2.48636 11.3925 2.0706 11.8832 2.00812L11.998 2.00009Z',\n 'antenna-receive': 'M5.53115 17.8387L6.58945 18.8268L8.92522 18.602L9.83101 20.4262C9.89964 20.5644 9.93535 20.7167 9.93535 20.871C9.93535 21.3838 9.54931 21.8065 9.05197 21.8642L8.93535 21.871H4.20497C3.9626 21.871 3.72849 21.7829 3.54616 21.6233C3.16263 21.2874 3.09746 20.7233 3.37588 20.3117L3.45266 20.2122L5.53115 17.8387ZM7.09757 10.0443C7.33377 10.0636 7.55543 10.1662 7.72301 10.3338L10.042 12.653L12 12L11.347 13.958L13.2146 15.8254C13.6051 16.2159 13.6051 16.8491 13.2146 17.2396C13.047 17.4072 12.8253 17.5098 12.5891 17.5291L7.30432 17.9622C7.01163 17.9862 6.7232 17.8803 6.51554 17.6726L5.87575 17.0328C5.66809 16.8252 5.56221 16.5368 5.58619 16.2441L6.01924 10.9593C6.06434 10.4088 6.54713 9.99916 7.09757 10.0443ZM14 9C14.5523 9 15 9.44772 15 10C15 10.5523 14.5523 11 14 11C13.4477 11 13 10.5523 13 10C13 9.44772 13.4477 9 14 9ZM16 7C16.5523 7 17 7.44772 17 8C17 8.55228 16.5523 9 16 9C15.4477 9 15 8.55228 15 8C15 7.44772 15.4477 7 16 7ZM18.5 4C19.3284 4 20 4.67157 20 5.5C20 6.32843 19.3284 7 18.5 7C17.6716 7 17 6.32843 17 5.5C17 4.67157 17.6716 4 18.5 4Z',\n 'antenna-off': 'M5.53115 17.8387L6.58945 18.8268L8.92522 18.602L9.83101 20.4262C9.89964 20.5644 9.93535 20.7167 9.93535 20.871C9.93535 21.3838 9.54931 21.8065 9.05197 21.8642L8.93535 21.871H4.20497C3.9626 21.871 3.72849 21.7829 3.54616 21.6233C3.16263 21.2874 3.09746 20.7232 3.37588 20.3117L3.45266 20.2122L5.53115 17.8387ZM7.09757 10.0443C7.33377 10.0636 7.55543 10.1662 7.72301 10.3338L10.042 12.653L12 12L11.347 13.958L13.2146 15.8254C13.6051 16.2159 13.6051 16.8491 13.2146 17.2396C13.047 17.4072 12.8253 17.5098 12.5891 17.5291L7.30432 17.9622C7.01163 17.9862 6.7232 17.8803 6.51554 17.6726L5.87575 17.0328C5.66809 16.8252 5.56221 16.5367 5.58619 16.2441L6.01924 10.9592C6.06434 10.4088 6.54713 9.99915 7.09757 10.0443Z',\n mission: 'M12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2ZM12 4C7.58172 4 4 7.58172 4 12C4 16.4183 7.58172 20 12 20C16.4183 20 20 16.4183 20 12C20 7.58172 16.4183 4 12 4ZM18 12C18 8.68629 15.3137 6 12 6C8.68629 6 6 8.68629 6 12C6 15.3137 8.68629 18 12 18C15.3137 18 18 15.3137 18 12ZM12 8C9.79086 8 8 9.79086 8 12C8 14.2091 9.79086 16 12 16C14.2091 16 16 14.2091 16 12C16 9.79086 14.2091 8 12 8ZM14 12C14 10.8954 13.1046 10 12 10C10.8954 10 10 10.8954 10 12C10 13.1046 10.8954 14 12 14C13.1046 14 14 13.1046 14 12Z',\n altitude: 'M12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2ZM12 4C7.58172 4 4 7.58172 4 12C4 16.4183 7.58172 20 12 20C16.4183 20 20 16.4183 20 12C20 7.58172 16.4183 4 12 4ZM14 18C14 17.4477 13.5523 17 13 17H11C10.4477 17 10 17.4477 10 18C10 18.5523 10.4477 19 11 19H13C13.5523 19 14 18.5523 14 18ZM14 14C14.5523 14 15 14.4477 15 15C15 15.5523 14.5523 16 14 16H10C9.44772 16 9 15.5523 9 15C9 14.4477 9.44772 14 10 14H14ZM16 12L19 14V10L16 12ZM5 10L8 12L5 14V10ZM14 12C14 11.4477 13.5523 11 13 11H11C10.4477 11 10 11.4477 10 12C10 12.5523 10.4477 13 11 13H13C13.5523 13 14 12.5523 14 12ZM14 8C14.5523 8 15 8.44772 15 9C15 9.55228 14.5523 10 14 10H10C9.44772 10 9 9.55228 9 9C9 8.44772 9.44772 8 10 8H14ZM14 6C14 5.44772 13.5523 5 13 5H11C10.4477 5 10 5.44772 10 6C10 6.55228 10.4477 7 11 7H13C13.5523 7 14 6.55228 14 6Z',\n solar: 'M19.5385 4C20.3456 4 21 4.67008 21 5.49666V17.5033C21 18.3299 20.3456 19 19.5385 19H3.46154C2.65436 19 2 18.3299 2 17.5033V5.49666C2 4.67008 2.65436 4 3.46154 4H19.5385ZM7 6H4V11H7V6ZM11 6H8V11H11V6ZM15 6H12V11H15V6ZM19 6H16V11H19V6ZM7 12H4V17H7V12ZM11 12H8V17H11V12ZM15 12H12V17H15V12ZM19 12H16V17H19V12Z',\n thermal: 'M10.5 2C12.433 2 14 3.567 14 5.5L14.0005 12.2576C15.2217 13.2664 16 14.7923 16 16.5C16 19.5376 13.5376 22 10.5 22C7.46243 22 5 19.5376 5 16.5C5 14.7919 5.77868 13.2656 7.00044 12.2568L7 5.5C7 3.567 8.567 2 10.5 2ZM10.5 4C9.7203 4 9.07955 4.59489 9.00687 5.35543L9 5.49987L9.0005 13.199L8.27384 13.799C7.47135 14.4616 7 15.4402 7 16.5C7 18.433 8.567 20 10.5 20C12.433 20 14 18.433 14 16.5C14 15.5111 13.5896 14.593 12.8828 13.9362L12.7268 13.7995L12.0006 13.1997L12 5.5C12 4.7203 11.4051 4.07955 10.6445 4.00687L10.5 4ZM11 5.5C11 5.22386 10.7761 5 10.5 5C10.2239 5 10 5.22386 10 5.5L10.0006 14.0499C8.85917 14.2813 8 15.2903 8 16.5C8 17.8807 9.11929 19 10.5 19C11.8807 19 13 17.8807 13 16.5C13 15.2907 12.1413 14.2819 11.0004 14.0501L11 5.5ZM20 11C20.5523 11 21 11.4477 21 12C21 12.5523 20.5523 13 20 13H17C16.4477 13 16 12.5523 16 12C16 11.4477 16.4477 11 17 11H20ZM19 9C19 8.44772 18.5523 8 18 8H17C16.4477 8 16 8.44772 16 9C16 9.55228 16.4477 10 17 10H18C18.5523 10 19 9.55228 19 9ZM20 5C20.5523 5 21 5.44772 21 6C21 6.55228 20.5523 7 20 7H17C16.4477 7 16 6.55228 16 6C16 5.44772 16.4477 5 17 5H20ZM19 3C19 2.44772 18.5523 2 18 2H17C16.4477 2 16 2.44772 16 3C16 3.55228 16.4477 4 17 4H18C18.5523 4 19 3.55228 19 3Z',\n propulsion: 'M16 2C17.1046 2 18 2.89543 18 4V20C18 21.1046 17.1046 22 16 22H9C7.89543 22 7 21.1046 7 20V4C7 2.89543 7.89543 2 9 2H16ZM13.8115 5.69961C13.8115 5.00797 12.9835 4.75858 12.631 5.27555L12.5794 5.36359L9.0799 12.364C8.8597 12.8083 9.11904 13.3258 9.55954 13.3928L9.6566 13.4001H11.1901V18.3004C11.1901 18.992 12.0181 19.2414 12.3706 18.7245L12.4222 18.6364L15.9217 11.636C16.1419 11.1917 15.8711 10.6742 15.4398 10.6072L15.345 10.5999H13.8115V5.69961Z',\n payload: 'M12.6802 2.24483L12.8418 2.31637L20.8418 6.31637C21.4305 6.6107 21.819 7.18871 21.8753 7.83667L21.8824 8V16C21.8824 16.6581 21.5391 17.2641 20.9848 17.6043L20.8418 17.6836L12.8418 21.6836C12.3649 21.9221 11.812 21.9459 11.3198 21.7552L11.1582 21.6836L3.15821 17.6836C2.56956 17.3893 2.18104 16.8113 2.12475 16.1633L2.11768 16V8C2.11768 7.34186 2.46091 6.73586 3.0153 6.39574L3.15821 6.31637L3.4276 6.17973C3.50773 6.12386 3.59511 6.0805 3.6866 6.05036L11.1582 2.31637C11.5822 2.1044 12.0662 2.062 12.5141 2.18919L12.6802 2.24483ZM3.99968 8.17865L4.00003 16L10.9997 19.4996V12.5536L3.99968 8.17865ZM12.9997 12.6176L19.9997 9.11765L20 16L12.9997 19.4996V12.6176ZM18.5 15C18.7762 15 19 15.2239 19 15.5C19 15.7761 18.7762 16 18.5 16C18.2239 16 18 15.7761 18 15.5C18 15.2239 18.2239 15 18.5 15ZM6.00003 15.5C6.00003 15.2239 5.77617 15 5.50003 15C5.22389 15 5.00003 15.2239 5.00003 15.5C5.00003 15.7761 5.22389 16 5.50003 16C5.77617 16 6.00003 15.7761 6.00003 15.5ZM16.5 14C16.7762 14 17 14.2239 17 14.5C17 14.7761 16.7762 15 16.5 15C16.2239 15 16 14.7761 16 14.5C16 14.2239 16.2239 14 16.5 14ZM8.00003 14.5C8.00003 14.2239 7.77617 14 7.50003 14C7.22389 14 7.00003 14.2239 7.00003 14.5C7.00003 14.7761 7.22389 15 7.50003 15C7.77617 15 8.00003 14.7761 8.00003 14.5ZM9.50003 13C9.77617 13 10 13.2239 10 13.5C10 13.7761 9.77617 14 9.50003 14C9.22389 14 9.00003 13.7761 9.00003 13.5C9.00003 13.2239 9.22389 13 9.50003 13ZM15 13.5C15 13.2239 14.7762 13 14.5 13C14.2239 13 14 13.2239 14 13.5C14 13.7761 14.2239 14 14.5 14C14.7762 14 15 13.7761 15 13.5ZM12 4L5.93668 7.03065L12.053 10.854L18.8807 7.44065L12 4ZM12.5 9.5C12.5 9.22386 12.2762 9 12 9C11.7239 9 11.5 9.22386 11.5 9.5C11.5 9.77614 11.7239 10 12 10C12.2762 10 12.5 9.77614 12.5 9.5ZM12 7C12.2762 7 12.5 7.22386 12.5 7.5C12.5 7.77614 12.2762 8 12 8C11.7239 8 11.5 7.77614 11.5 7.5C11.5 7.22386 11.7239 7 12 7ZM12.5 5.5C12.5 5.22386 12.2762 5 12 5C11.7239 5 11.5 5.22386 11.5 5.5C11.5 5.77614 11.7239 6 12 6C12.2762 6 12.5 5.77614 12.5 5.5Z',\n processor: 'M9 20V22H7V20H9ZM13 20V22H11V20H13ZM17 20V22H15V20H17ZM17 5C18.1046 5 19 5.89543 19 7V17C19 18.1046 18.1046 19 17 19H7C5.89543 19 5 18.1046 5 17V7C5 5.89543 5.89543 5 7 5H17ZM17 16C16.4477 16 16 16.4477 16 17C16 17.5523 16.4477 18 17 18C17.5523 18 18 17.5523 18 17C18 16.4477 17.5523 16 17 16ZM4 15V17H2V15H4ZM22 15V17H20V15H22ZM4 11V13H2V11H4ZM22 11V13H20V11H22ZM4 7V9H2V7H4ZM22 7V9H20V7H22ZM7 6C6.44772 6 6 6.44772 6 7C6 7.55228 6.44772 8 7 8C7.55228 8 8 7.55228 8 7C8 6.44772 7.55228 6 7 6ZM9 2V4H7V2H9ZM13 2V4H11V2H13ZM17 2V4H15V2H17Z',\n equipment: 'M22 5C22 3.89543 21.1046 3 20 3H4C2.89543 3 2 3.89543 2 5V9C2 10.1046 2.89543 11 4 11H20C21.1046 11 22 10.1046 22 9V5ZM22 15C22 13.8954 21.1046 13 20 13H4C2.89543 13 2 13.8954 2 15V19C2 20.1046 2.89543 21 4 21H20C21.1046 21 22 20.1046 22 19V15ZM4 15H20V19H4V15ZM7 16V18H5V16H7ZM10 18V16H8V18H10ZM13 16V18H11V16H13ZM20 5H4V9H20V5ZM7 8V6H5V8H7ZM10 6V8H8V6H10ZM13 8V6H11V8H13Z',\n netcom: 'M16 2C17.6569 2 19 3.34315 19 5C19 6.65685 17.6569 8 16 8C15.8259 8 15.6553 7.98518 15.4894 7.95672L14.8034 9.14676C15.3137 9.64825 15.6902 10.2856 15.874 11.0002L18.2676 10.9999C18.6134 10.4022 19.2597 10 20 10C21.1046 10 22 10.8954 22 12C22 13.1046 21.1046 14 20 14C19.2602 14 18.6142 13.5983 18.2682 13.0011L15.8738 13.0008C15.6717 13.7853 15.2375 14.4767 14.6488 14.9974L15.2128 16.1044C15.4637 16.0363 15.7276 16 16 16C17.6569 16 19 17.3431 19 19C19 20.6569 17.6569 22 16 22C14.3431 22 13 20.6569 13 19C13 18.3508 13.2062 17.7498 13.5567 17.2589L12.8669 15.9058C12.5878 15.9675 12.2977 16 12 16C11.2582 16 10.5635 15.7981 9.96801 15.4462L7.75736 17.6569L7.59355 17.4912C7.85196 17.9345 8 18.4499 8 19C8 20.6569 6.65685 22 5 22C3.34315 22 2 20.6569 2 19C2 17.3431 3.34315 16 5 16C5.55006 16 6.06555 16.148 6.50879 16.4065L6.34315 16.2426L8.55383 14.032C8.20193 13.4365 8 12.7418 8 12C8 9.79086 9.79086 8 12 8C12.3705 8 12.7293 8.05038 13.0698 8.14467L13.7446 6.97823C13.281 6.45014 13 5.75789 13 5C13 3.34315 14.3431 2 16 2ZM12 10C10.8954 10 10 10.8954 10 12C10 13.1046 10.8954 14 12 14C13.1046 14 14 13.1046 14 12C14 10.8954 13.1046 10 12 10Z',\n hardware: 'M4 17.8247V10.4692H20V17.8247H4ZM2 9.77297C2 9.05293 2.58371 8.46922 3.30375 8.46922H20.6962C21.4163 8.46922 22 9.05293 22 9.77298V18.5209C22 19.241 21.4163 19.8247 20.6962 19.8247H3.30375C2.58371 19.8247 2 19.241 2 18.5209V9.77297ZM8.99573 13.637H4.99573V11.637H8.99573V13.637ZM8.99573 16.642H4.99573V14.642H8.99573V16.642ZM10 13.637H14V11.637H10V13.637ZM14 16.642H10V14.642H14V16.642ZM14.9987 13.637H18.9987V11.637H14.9987V13.637ZM18.9987 16.6424H14.9987V14.6424H18.9987V16.6424Z',\n orbit: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm0-14c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm0 10c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4z',\n 'ground-station': 'M12 3L2 12h3v8h6v-6h2v6h6v-8h3L12 3zm0 11.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z',\n battery: 'M15.67 4H14V3C14 2.45 13.55 2 13 2H11C10.45 2 10 2.45 10 3V4H8.33C7.6 4 7 4.6 7 5.33V20.66C7 21.4 7.6 22 8.34 22H15.66C16.4 22 17 21.4 17 20.67V5.33C17 4.6 16.4 4 15.67 4Z',\n location: 'M5 9C5 5.13 8.13 2 12 2C15.87 2 19 5.13 19 9C19 13.17 14.58 18.92 12.77 21.11C12.37 21.59 11.64 21.59 11.24 21.11C9.42 18.92 5 13.17 5 9ZM9.5 9C9.5 10.38 10.62 11.5 12 11.5C13.38 11.5 14.5 10.38 14.5 9C14.5 7.62 13.38 6.5 12 6.5C10.62 6.5 9.5 7.62 9.5 9Z',\n rocket: 'M12 2c0 0-6.5 5-6.5 12 0 2.5.5 4 1 5.5l5.5-3 5.5 3c.5-1.5 1-3 1-5.5C18.5 7 12 2 12 2zm0 13c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zM7 22l1.5-1.5L10 22l2-2 2 2 1.5-1.5L17 22l-2.5-2.5-2.5 2.5-2.5-2.5L7 22z',\n thermometer: 'M10.5 2C12.433 2 14 3.567 14 5.5L14.0005 12.2576C15.2217 13.2664 16 14.7923 16 16.5C16 19.5376 13.5376 22 10.5 22C7.46243 22 5 19.5376 5 16.5C5 14.7919 5.77868 13.2656 7.00044 12.2568L7 5.5C7 3.567 8.567 2 10.5 2ZM10.5 4C9.7203 4 9.07955 4.59489 9.00687 5.35543L9 5.49987L9.0005 13.199L8.27384 13.799C7.47135 14.4616 7 15.4402 7 16.5C7 18.433 8.567 20 10.5 20C12.433 20 14 18.433 14 16.5C14 15.5111 13.5896 14.593 12.8828 13.9362L12.7268 13.7995L12.0006 13.1997L12 5.5C12 4.7203 11.4051 4.07955 10.6445 4.00687L10.5 4ZM11 5.5C11 5.22386 10.7761 5 10.5 5C10.2239 5 10 5.22386 10 5.5L10.0006 14.0499C8.85917 14.2813 8 15.2903 8 16.5C8 17.8807 9.11929 19 10.5 19C11.8807 19 13 17.8807 13 16.5C13 15.2907 12.1413 14.2819 11.0004 14.0501L11 5.5ZM20 11C20.5523 11 21 11.4477 21 12C21 12.5523 20.5523 13 20 13H17C16.4477 13 16 12.5523 16 12C16 11.4477 16.4477 11 17 11H20ZM19 9C19 8.44772 18.5523 8 18 8H17C16.4477 8 16 8.44772 16 9C16 9.55228 16.4477 10 17 10H18C18.5523 10 19 9.55228 19 9ZM20 5C20.5523 5 21 5.44772 21 6C21 6.55228 20.5523 7 20 7H17C16.4477 7 16 6.55228 16 6C16 5.44772 16.4477 5 17 5H20ZM19 3C19 2.44772 18.5523 2 18 2H17C16.4477 2 16 2.44772 16 3C16 3.55228 16.4477 4 17 4H18C18.5523 4 19 3.55228 19 3Z',\n \n // === System Icons ===\n settings: 'M19.5 12C19.5 12.34 19.47 12.66 19.43 12.98L21.54 14.63C21.73 14.78 21.78 15.05 21.66 15.27L19.66 18.73C19.54 18.95 19.28 19.04 19.05 18.95L16.56 17.95C16.04 18.34 15.48 18.68 14.87 18.93L14.49 21.58C14.46 21.82 14.25 22 14 22H10C9.75002 22 9.54002 21.82 9.51002 21.58L9.13002 18.93C8.52002 18.68 7.96002 18.35 7.44002 17.95L4.95002 18.95C4.73002 19.03 4.46002 18.95 4.34002 18.73L2.34002 15.27C2.22002 15.05 2.27002 14.78 2.46002 14.63L4.57002 12.98C4.53002 12.66 4.50002 12.33 4.50002 12C4.50002 11.67 4.53002 11.34 4.57002 11.02L2.46002 9.37C2.27002 9.22 2.21002 8.95 2.34002 8.73L4.34002 5.27C4.46002 5.05 4.72002 4.96 4.95002 5.05L7.44002 6.05C7.96002 5.66 8.52002 5.32 9.13002 5.07L9.51002 2.42C9.54002 2.18 9.75002 2 10 2H14C14.25 2 14.46 2.18 14.49 2.42L14.87 5.07C15.48 5.32 16.04 5.65 16.56 6.05L19.05 5.05C19.27 4.97 19.54 5.05 19.66 5.27L21.66 8.73C21.78 8.95 21.73 9.22 21.54 9.37L19.43 11.02C19.47 11.34 19.5 11.66 19.5 12ZM8.50002 12C8.50002 13.93 10.07 15.5 12 15.5C13.93 15.5 15.5 13.93 15.5 12C15.5 10.07 13.93 8.5 12 8.5C10.07 8.5 8.50002 10.07 8.50002 12Z',\n notifications: 'M18 11V16L19.29 17.29C19.92 17.92 19.47 19 18.58 19H5.40999C4.51999 19 4.07999 17.92 4.70999 17.29L5.99999 16V11C5.99999 7.92 7.62999 5.36 10.5 4.68V4C10.5 3.17 11.17 2.5 12 2.5C12.83 2.5 13.5 3.17 13.5 4V4.68C16.36 5.36 18 7.93 18 11ZM14 20C14 21.1 13.1 22 12 22C10.89 22 9.99999 21.1 9.99999 20H14Z',\n 'notifications-off': 'M20 18.69L7.84 6.14 5.27 3.49 4 4.76l2.8 2.8v.01c-.52.99-.8 2.16-.8 3.42v5l-2 2v1h13.73l2 2L21 19.72l-1-1.03zM12 22c1.11 0 2-.89 2-2h-4c0 1.11.89 2 2 2zm6-7.32V11c0-3.08-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68c-.15.03-.29.08-.42.12-.1.03-.2.07-.3.11h-.01c-.01 0-.01 0-.02.01-.23.09-.46.2-.68.31 0 0-.01 0-.01.01L18 14.68z',\n warning: 'M19.53 21.0001C21.07 21.0001 22.03 19.3301 21.26 18.0001L13.73 4.99005C12.96 3.66005 11.04 3.66005 10.27 4.99005L2.74 18.0001C1.97 19.3301 2.93 21.0001 4.47 21.0001H19.53ZM12 14.0001C11.45 14.0001 11 13.5501 11 13.0001V11.0001C11 10.4501 11.45 10.0001 12 10.0001C12.55 10.0001 13 10.4501 13 11.0001V13.0001C13 13.5501 12.55 14.0001 12 14.0001ZM11 16.0001V18.0001H13V16.0001H11Z',\n error: 'M12 2C6.48 2 2 6.48 2 12C2 17.52 6.48 22 12 22C17.52 22 22 17.52 22 12C22 6.48 17.52 2 12 2ZM12 13C11.45 13 11 12.55 11 12V8C11 7.45 11.45 7 12 7C12.55 7 13 7.45 13 8V12C13 12.55 12.55 13 12 13ZM11 15V17H13V15H11Z',\n info: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z',\n check: 'M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z',\n close: 'M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z',\n add: 'M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z',\n remove: 'M19 13H5v-2h14v2z',\n edit: 'M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z',\n delete: 'M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z',\n search: 'M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z',\n filter: 'M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z',\n refresh: 'M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z',\n sync: 'M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z',\n download: 'M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z',\n upload: 'M9 16h6v-6h4l-7-7-7 7h4v6zm-4 2h14v2H5v-2z',\n expand: 'M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z',\n collapse: 'M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z',\n fullscreen: 'M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z',\n 'fullscreen-exit': 'M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z',\n visibility: 'M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z',\n 'visibility-off': 'M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z',\n lock: 'M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9H8.9V6c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z',\n unlock: 'M12 17c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm6-9h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6h1.9c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm0 12H6V10h12v10z',\n \n // === Navigation Icons ===\n 'arrow-up': 'M4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z',\n 'arrow-down': 'M20 12l-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z',\n 'arrow-left': 'M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z',\n 'arrow-right': 'M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8-8-8z',\n 'chevron-up': 'M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z',\n 'chevron-down': 'M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z',\n 'chevron-left': 'M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z',\n 'chevron-right': 'M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z',\n menu: 'M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z',\n 'more-vert': 'M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z',\n 'more-horiz': 'M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z',\n \n // === Data Icons ===\n chart: 'M3.5 18.49l6-6.01 4 4L22 6.92l-1.41-1.41-7.09 7.97-4-4L2 16.99z',\n list: 'M3 13h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm4 4h14v-2H7v2zm0 4h14v-2H7v2zM7 7v2h14V7H7z',\n grid: 'M3 3h8v8H3V3zm0 10h8v8H3v-8zm10-10h8v8h-8V3zm0 10h8v8h-8v-8z',\n timeline: 'M23 8c0 1.1-.9 2-2 2-.18 0-.35-.02-.51-.07l-3.56 3.55c.05.16.07.34.07.52 0 1.1-.9 2-2 2s-2-.9-2-2c0-.18.02-.36.07-.52l-2.55-2.55c-.16.05-.34.07-.52.07s-.36-.02-.52-.07l-4.55 4.56c.05.16.07.33.07.51 0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2c.18 0 .35.02.51.07l4.56-4.55C8.02 9.36 8 9.18 8 9c0-1.1.9-2 2-2s2 .9 2 2c0 .18-.02.36-.07.52l2.55 2.55c.16-.05.34-.07.52-.07s.36.02.52.07l3.55-3.56C19.02 8.35 19 8.18 19 8c0-1.1.9-2 2-2s2 .9 2 2z',\n calendar: 'M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zM9 10H7v2h2v-2zm4 0h-2v2h2v-2zm4 0h-2v2h2v-2z',\n clock: 'M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z',\n play: 'M8 5v14l11-7z',\n 'play-arrow': 'M8 5v14l11-7z',\n pause: 'M6 19h4V5H6v14zm8-14v14h4V5h-4z',\n stop: 'M6 6h12v12H6z',\n 'skip-next': 'M6 18l8.5-6L6 6v12zM16 6v12h2V6h-2z',\n 'skip-previous': 'M6 6h2v12H6zm3.5 6l8.5 6V6z',\n 'fast-forward': 'M4 18l8.5-6L4 6v12zm9-12v12l8.5-6L13 6z',\n 'fast-rewind': 'M11 18V6l-8.5 6 8.5 6zm.5-6l8.5 6V6l-8.5 6z',\n record: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 14c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4z',\n \n // === Communication Icons ===\n link: 'M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z',\n 'link-off': 'M17 7h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.43-.98 2.63-2.31 2.98l1.46 1.46C20.88 15.61 22 13.95 22 12c0-2.76-2.24-5-5-5zm-1 4h-2.19l2 2H16v-2zM2 4.27l3.11 3.11C3.29 8.12 2 9.91 2 12c0 2.76 2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1 0-1.59 1.21-2.9 2.76-3.07L8.73 11H8v2h2.73L13 15.27V17h1.73l4.01 4L20 19.74 3.27 3 2 4.27z',\n send: 'M2.01 21L23 12 2.01 3 2 10l15 2-15 2z',\n message: 'M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-2 12H6v-2h12v2zm0-3H6V9h12v2zm0-3H6V6h12v2z',\n mail: 'M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z',\n 'photo-camera': 'M12 12m-3.2 0a3.2 3.2 0 1 0 6.4 0 3.2 3.2 0 1 0-6.4 0M9 2L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2h-3.17L15 2H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z',\n images: 'M22 16V4c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2zm-11-4l2.03 2.71L16 11l4 5H8l3-4zM2 6v14c0 1.1.9 2 2 2h14v-2H4V6H2z',\n 'error-outline': 'M11 15h2v2h-2v-2zm0-8h2v6h-2V7zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z',\n};\n\nexport const Icon = memo(function Icon({\n name,\n size = 24,\n status,\n color,\n className = '',\n 'aria-label': ariaLabel,\n onClick,\n style,\n}: IconProps): React.ReactElement {\n const { tokens } = useTheme();\n \n // Determine color: custom > status > default\n const iconColor = color \n ?? (status ? tokens.colors.status[status] : tokens.colors.text.primary);\n \n const pathData = ICON_PATHS[name];\n const isInteractive = !!onClick;\n \n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill={iconColor}\n className={className}\n role={ariaLabel ? 'img' : 'presentation'}\n aria-label={ariaLabel ?? name}\n aria-hidden={!ariaLabel}\n onClick={onClick}\n onKeyDown={onClick ? (e: React.KeyboardEvent) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onClick(); } } : undefined}\n tabIndex={isInteractive ? 0 : undefined}\n style={{\n cursor: isInteractive ? 'pointer' : 'default',\n flexShrink: 0,\n transition: `fill ${tokens.animation.fast}`,\n ...style,\n }}\n >\n {Array.isArray(pathData) ? (\n pathData.map((d, i) => <path key={i} d={d} fillRule=\"evenodd\" clipRule=\"evenodd\" />)\n ) : (\n <path d={pathData} fillRule=\"evenodd\" clipRule=\"evenodd\" />\n )}\n </svg>\n );\n});\n\n/**\n * Get all available icon names\n */\nexport function getIconNames(): IconName[] {\n return Object.keys(ICON_PATHS) as IconName[];\n}\n\n/**\n * Check if an icon name exists\n */\nexport function isValidIconName(name: string): name is IconName {\n return name in ICON_PATHS;\n}\n\nexport default Icon;\n"],"names":["Icon"],"mappings":"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"}
|
|
@@ -270,7 +270,8 @@ const SideNavHeader = memo(function SideNavHeader2({
|
|
|
270
270
|
borderBottom: `1px solid ${tokens.colors.border.muted}`,
|
|
271
271
|
flexShrink: 0,
|
|
272
272
|
justifyContent: collapsed ? "center" : "flex-start",
|
|
273
|
-
boxSizing: "border-box"
|
|
273
|
+
boxSizing: "border-box",
|
|
274
|
+
position: "relative"
|
|
274
275
|
}, children: children ? children : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
275
276
|
displayLogo && /* @__PURE__ */ jsx("div", { style: { flexShrink: 0, cursor: collapsed && showToggle ? "pointer" : void 0 }, onClick: collapsed && showToggle ? toggleCollapse : void 0, children: displayLogo }),
|
|
276
277
|
!collapsed && /* @__PURE__ */ jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [
|
|
@@ -301,7 +302,7 @@ const SideNavHeader = memo(function SideNavHeader2({
|
|
|
301
302
|
}, children: badge })
|
|
302
303
|
] })
|
|
303
304
|
] }),
|
|
304
|
-
showToggle && /* @__PURE__ */ jsx(CollapseToggleButton, {})
|
|
305
|
+
showToggle && (collapsed ? /* @__PURE__ */ jsx("div", { style: { position: "absolute", right: 4, top: "50%", transform: "translateY(-50%)" }, children: /* @__PURE__ */ jsx(CollapseToggleButton, {}) }) : /* @__PURE__ */ jsx(CollapseToggleButton, {}))
|
|
305
306
|
] }) });
|
|
306
307
|
});
|
|
307
308
|
const TAG_COLORS = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SideNav.js","sources":["../../../src/react/core/SideNav.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - SideNav Component\r\n * \r\n * Persistent sidebar navigation for operator dashboards. Compound component\r\n * pattern with Header, Item, Section, Divider, and Footer subcomponents.\r\n * \r\n * Responsive: Full sidebar on desktop, hamburger overlay on mobile.\r\n * \r\n * Astro UX Compliance:\r\n * - Persistent side navigation pattern (AstroUXDS Navigation)\r\n * - Status indicator integration\r\n * - Active state highlighting with accent color\r\n * - Keyboard navigation support\r\n * - Reduced motion support\r\n * \r\n * @example\r\n * ```tsx\r\n * <SideNav>\r\n * <SideNav.Header logo={<Icon name=\"satellite\" size={24} />} title=\"Space Range\" badge=\"Operator\" />\r\n * <SideNav.Section title=\"Operations\">\r\n * <SideNav.Item icon=\"controls\" label=\"Controls\" description=\"System command interface\" href=\"/controls\" active />\r\n * <SideNav.Item icon=\"telemetry\" label=\"Telemetry\" href=\"/telemetry\" badge={3} tag=\"LIVE\" tagVariant=\"success\" />\r\n * <SideNav.Item icon=\"images\" label=\"Images\" href=\"/images\" />\r\n * </SideNav.Section>\r\n * <SideNav.Divider />\r\n * <SideNav.Section title=\"Analysis\">\r\n * <SideNav.Item icon=\"chart\" label=\"Plots\" href=\"/plots\" />\r\n * <SideNav.Item icon=\"map\" label=\"Map\" href=\"/map\" />\r\n * </SideNav.Section>\r\n * <SideNav.Footer>\r\n * <SideNav.Item icon=\"settings\" label=\"Settings\" href=\"/settings\" />\r\n * </SideNav.Footer>\r\n * </SideNav>\r\n * ```\r\n */\r\n\r\nimport React, { memo, useState, createContext, useContext, useCallback, useEffect } from 'react';\r\nimport { useTheme } from '../theme';\r\nimport { safeAccentText } from '../utils';\r\nimport { Icon } from './Icon';\r\nimport type { IconName } from './Icon';\r\n\r\n// ─── Astro UX Status Shape ───────────────────────────────────────────────────\r\n\r\nconst SIDENAV_STATUS_COLORS: Record<string, string> = {\r\n off: '#a4abb6',\r\n standby: '#2dccff',\r\n normal: '#56f000',\r\n caution: '#fce83a',\r\n serious: '#ffb302',\r\n critical: '#ff3838',\r\n};\r\n\r\n/** Astro UX dual-coded status shape (color + geometry). */\r\nfunction NavStatusShape({ status, size = 8 }: { status: string; size?: number }) {\r\n const color = SIDENAV_STATUS_COLORS[status] ?? SIDENAV_STATUS_COLORS.off;\r\n const glow = `${color}50`;\r\n const style = { flexShrink: 0 as const, filter: `drop-shadow(0 0 3px ${glow})` };\r\n\r\n switch (status) {\r\n case 'caution':\r\n return <svg viewBox=\"0 0 12 12\" width={size} height={size} style={style} aria-hidden=\"true\"><rect x=\"1\" y=\"1\" width=\"10\" height=\"10\" fill={color} /></svg>;\r\n case 'serious':\r\n return <svg viewBox=\"0 0 12 12\" width={size} height={size} style={style} aria-hidden=\"true\"><polygon points=\"6,1 11,6 6,11 1,6\" fill={color} /></svg>;\r\n case 'critical':\r\n return <svg viewBox=\"0 0 12 12\" width={size} height={size} style={style} aria-hidden=\"true\"><polygon points=\"6,11 1,2 11,2\" fill={color} /></svg>;\r\n case 'standby':\r\n return <svg viewBox=\"0 0 12 12\" width={size} height={size} style={style} aria-hidden=\"true\"><circle cx=\"6\" cy=\"6\" r=\"3.5\" fill=\"none\" stroke={color} strokeWidth=\"2\" /></svg>;\r\n case 'off':\r\n return <svg viewBox=\"0 0 12 12\" width={size} height={size} style={style} aria-hidden=\"true\"><circle cx=\"6\" cy=\"6\" r=\"3\" fill={color} /></svg>;\r\n default: // normal\r\n return <svg viewBox=\"0 0 12 12\" width={size} height={size} style={style} aria-hidden=\"true\"><circle cx=\"6\" cy=\"6\" r=\"5\" fill={color} /></svg>;\r\n }\r\n}\r\n\r\n// ─── Responsive Breakpoints ──────────────────────────────────────────────────\r\n\r\nconst SIDENAV_BREAKPOINTS = {\r\n mobile: 768,\r\n tablet: 1024,\r\n} as const;\r\n\r\ntype SideNavMode = 'desktop' | 'tablet' | 'mobile';\r\n\r\nfunction getSideNavMode(width: number): SideNavMode {\r\n if (width < SIDENAV_BREAKPOINTS.mobile) return 'mobile';\r\n if (width < SIDENAV_BREAKPOINTS.tablet) return 'tablet';\r\n return 'desktop';\r\n}\r\n\r\n// ─── Context ─────────────────────────────────────────────────────────────────\r\n\r\ninterface SideNavContextValue {\r\n collapsed: boolean;\r\n mobileOpen: boolean;\r\n mode: SideNavMode;\r\n showCollapseToggle: boolean;\r\n setMobileOpen: (open: boolean) => void;\r\n toggleCollapse: () => void;\r\n}\r\n\r\nconst SideNavContext = createContext<SideNavContextValue>({\r\n collapsed: false,\r\n mobileOpen: false,\r\n mode: 'desktop',\r\n showCollapseToggle: true,\r\n setMobileOpen: () => {},\r\n toggleCollapse: () => {},\r\n});\r\n\r\n// ─── SideNav ─────────────────────────────────────────────────────────────────\r\n\r\nexport interface SideNavProps {\r\n /** Collapsed mode (icon-only). When omitted, auto-collapses on tablet viewports. */\r\n collapsed?: boolean;\r\n /** Callback when collapsed state changes (via toggle button or responsive breakpoint). */\r\n onCollapsedChange?: (collapsed: boolean) => void;\r\n /** Show a collapse/expand toggle button in the sidebar (default true). */\r\n showCollapseToggle?: boolean;\r\n /** Width in pixels (default 260) */\r\n width?: number;\r\n /** Collapsed width in pixels (default 64) */\r\n collapsedWidth?: number;\r\n /**\r\n * Mobile viewport behavior.\r\n * - `'drawer'` (default): hamburger button with slide-out overlay drawer.\r\n * - `'collapsed'`: persistent collapsed icon-only strip (same as tablet).\r\n */\r\n mobileVariant?: 'drawer' | 'collapsed';\r\n /** Children (SideNav.Header, SideNav.Item, SideNav.Section, SideNav.Footer) */\r\n children?: React.ReactNode;\r\n /** Custom style */\r\n style?: React.CSSProperties;\r\n}\r\n\r\nconst SideNavRoot = memo(function SideNav({\r\n collapsed,\r\n onCollapsedChange,\r\n showCollapseToggle = true,\r\n width = 260,\r\n collapsedWidth = 64,\r\n mobileVariant = 'drawer',\r\n children,\r\n style,\r\n}: SideNavProps): React.ReactElement {\r\n const { tokens, theme } = useTheme();\r\n const isTransparentTheme = theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\r\n const [mobileOpen, setMobileOpen] = useState(false);\r\n const [userCollapsed, setUserCollapsed] = useState<boolean | null>(null);\r\n const [viewMode, setViewMode] = useState<SideNavMode>(() => {\r\n if (typeof window !== 'undefined') return getSideNavMode(window.innerWidth);\r\n return 'desktop';\r\n });\r\n \r\n useEffect(() => {\r\n if (typeof window === 'undefined') return;\r\n let rafId: number;\r\n const handleResize = () => {\r\n cancelAnimationFrame(rafId);\r\n rafId = requestAnimationFrame(() => setViewMode(getSideNavMode(window.innerWidth)));\r\n };\r\n window.addEventListener('resize', handleResize, { passive: true });\r\n return () => {\r\n window.removeEventListener('resize', handleResize);\r\n cancelAnimationFrame(rafId);\r\n };\r\n }, []);\r\n\r\n // When mobileVariant='collapsed', promote mobile to tablet (collapsed inline strip)\r\n const effectiveMode = mobileVariant === 'collapsed' && viewMode === 'mobile' ? 'tablet' : viewMode;\r\n\r\n // Reset user toggle when crossing breakpoints\r\n useEffect(() => {\r\n setUserCollapsed(null);\r\n }, [effectiveMode]);\r\n\r\n // Close mobile drawer when switching away from mobile\r\n useEffect(() => {\r\n if (effectiveMode !== 'mobile' && mobileOpen) setMobileOpen(false);\r\n }, [effectiveMode, mobileOpen]);\r\n \r\n // Close mobile nav on escape\r\n useEffect(() => {\r\n if (!mobileOpen) return;\r\n const handleEsc = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') setMobileOpen(false);\r\n };\r\n document.addEventListener('keydown', handleEsc);\r\n return () => document.removeEventListener('keydown', handleEsc);\r\n }, [mobileOpen]);\r\n\r\n // Resolve collapsed: explicit prop > user toggle > auto (tablet = collapsed)\r\n const autoCollapsed = effectiveMode === 'tablet';\r\n const isCollapsed = collapsed !== undefined\r\n ? collapsed\r\n : userCollapsed !== null\r\n ? userCollapsed\r\n : autoCollapsed;\r\n const isMobile = effectiveMode === 'mobile';\r\n const navWidth = isCollapsed ? collapsedWidth : width;\r\n\r\n const handleToggleCollapse = useCallback(() => {\r\n const next = !isCollapsed;\r\n setUserCollapsed(next);\r\n onCollapsedChange?.(next);\r\n }, [isCollapsed, onCollapsedChange]);\r\n \r\n const navStyle: React.CSSProperties = {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: isMobile ? 280 : navWidth,\r\n height: '100%',\r\n backgroundColor: isTransparentTheme\r\n ? 'rgba(15, 12, 30, 0.7)'\r\n : tokens.colors.background.surface,\r\n borderRight: `1px solid ${tokens.colors.border.muted}`,\r\n transition: 'width 0.25s ease, transform 0.25s ease',\r\n overflowX: 'hidden',\r\n overflowY: 'auto',\r\n flexShrink: 0,\r\n fontFamily: tokens.typography.fontFamily.primary,\r\n ...(isTransparentTheme ? {\r\n backdropFilter: 'blur(16px)',\r\n WebkitBackdropFilter: 'blur(16px)',\r\n } : {}),\r\n ...style,\r\n };\r\n \r\n const contextValue: SideNavContextValue = { collapsed: isCollapsed, mobileOpen, mode: effectiveMode, showCollapseToggle, setMobileOpen, toggleCollapse: handleToggleCollapse };\r\n \r\n // Mobile: hamburger button + overlay drawer\r\n if (isMobile) {\r\n return (\r\n <SideNavContext.Provider value={contextValue}>\r\n {/* Hamburger button */}\r\n <button\r\n aria-label=\"Open navigation\"\r\n onClick={() => setMobileOpen(true)}\r\n style={{\r\n position: 'fixed',\r\n top: 6,\r\n left: 6,\r\n zIndex: 1001,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n width: 32,\r\n height: 32,\r\n border: 'none',\r\n borderRadius: tokens.borderRadius.sm,\r\n backgroundColor: 'transparent',\r\n color: tokens.colors.text.primary,\r\n cursor: 'pointer',\r\n padding: 0,\r\n transition: tokens.animation.fast,\r\n }}\r\n >\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\">\r\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\r\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" />\r\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n \r\n {/* Overlay */}\r\n <div\r\n aria-hidden=\"true\"\r\n style={{\r\n position: 'fixed',\r\n inset: 0,\r\n zIndex: 1002,\r\n backgroundColor: `${tokens.colors.background.base}99`,\r\n backdropFilter: 'blur(4px)',\r\n opacity: mobileOpen ? 1 : 0,\r\n pointerEvents: mobileOpen ? 'auto' : 'none',\r\n transition: 'opacity 0.25s ease',\r\n }}\r\n onClick={() => setMobileOpen(false)}\r\n />\r\n \r\n {/* Slide-out nav */}\r\n <nav\r\n role=\"navigation\"\r\n aria-label=\"Main navigation\"\r\n style={{\r\n ...navStyle,\r\n position: 'fixed',\r\n top: 0,\r\n left: 0,\r\n zIndex: 1003,\r\n transform: mobileOpen ? 'translateX(0)' : 'translateX(-100%)',\r\n boxShadow: mobileOpen ? tokens.shadows.xl : 'none',\r\n }}\r\n >\r\n {children}\r\n </nav>\r\n </SideNavContext.Provider>\r\n );\r\n }\r\n \r\n return (\r\n <SideNavContext.Provider value={contextValue}>\r\n <nav role=\"navigation\" aria-label=\"Main navigation\" style={navStyle}>\r\n {children}\r\n </nav>\r\n </SideNavContext.Provider>\r\n );\r\n});\r\n\r\n// ─── Header ──────────────────────────────────────────────────────────────────\r\n\r\nexport interface SideNavHeaderProps {\r\n /** Logo element (Icon, image, or ReactNode) */\r\n logo?: React.ReactNode;\r\n /** Compact logo shown when sidebar is collapsed or on tablet (e.g., just the icon mark) */\r\n collapsedLogo?: React.ReactNode;\r\n /** App title */\r\n title?: string;\r\n /** Subtitle or version */\r\n subtitle?: string;\r\n /** Role badge (e.g., \"Operator\", \"Admin\") */\r\n badge?: string;\r\n /** Badge variant for color */\r\n badgeVariant?: 'info' | 'success' | 'warning' | 'caution';\r\n /** Children override (advanced: replaces default header content entirely) */\r\n children?: React.ReactNode;\r\n}\r\n\r\n/** Chevron toggle button for collapsing/expanding the sidebar. */\r\nfunction CollapseToggleButton() {\r\n const { tokens } = useTheme();\r\n const { collapsed, toggleCollapse } = useContext(SideNavContext);\r\n const [hovered, setHovered] = useState(false);\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n aria-label={collapsed ? 'Expand sidebar' : 'Collapse sidebar'}\r\n onClick={toggleCollapse}\r\n onMouseEnter={() => setHovered(true)}\r\n onMouseLeave={() => setHovered(false)}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n width: 28,\r\n height: 28,\r\n border: `1px solid ${hovered ? tokens.colors.border.focus : tokens.colors.border.muted}`,\r\n borderRadius: tokens.borderRadius.md,\r\n backgroundColor: hovered ? `${tokens.colors.accent.primary}15` : 'transparent',\r\n color: hovered ? tokens.colors.accent.primary : tokens.colors.text.tertiary,\r\n cursor: 'pointer',\r\n flexShrink: 0,\r\n padding: 0,\r\n transition: tokens.animation.fast,\r\n outline: 'none',\r\n }}\r\n >\r\n <svg\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n style={{\r\n transition: 'transform 0.25s ease',\r\n transform: collapsed ? 'rotate(180deg)' : 'rotate(0deg)',\r\n }}\r\n >\r\n <polyline points=\"15 18 9 12 15 6\" />\r\n </svg>\r\n </button>\r\n );\r\n}\r\n\r\nconst SideNavHeader = memo(function SideNavHeader({\r\n logo,\r\n collapsedLogo,\r\n title,\r\n subtitle,\r\n badge,\r\n badgeVariant = 'info',\r\n children,\r\n}: SideNavHeaderProps): React.ReactElement {\r\n const { tokens } = useTheme();\r\n const { collapsed, mode, showCollapseToggle, toggleCollapse } = useContext(SideNavContext);\r\n const displayLogo = collapsed && collapsedLogo ? collapsedLogo : logo;\r\n const showToggle = showCollapseToggle && mode !== 'mobile';\r\n \r\n const badgeColors: Record<string, string> = {\r\n info: tokens.colors.accent.primary,\r\n success: tokens.colors.status.normal,\r\n warning: tokens.colors.status.caution,\r\n caution: tokens.colors.status.serious,\r\n };\r\n \r\n return (\r\n <div style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: tokens.spacing.sm,\r\n padding: collapsed ? `${tokens.spacing.md} ${tokens.spacing.sm}` : `0 16px 0 15px`,\r\n minHeight: 91,\r\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\r\n flexShrink: 0,\r\n justifyContent: collapsed ? 'center' : 'flex-start',\r\n boxSizing: 'border-box',\r\n }}>\r\n {children ? children : (<>\r\n {displayLogo && <div style={{ flexShrink: 0, cursor: collapsed && showToggle ? 'pointer' : undefined }} onClick={collapsed && showToggle ? toggleCollapse : undefined}>{displayLogo}</div>}\r\n {!collapsed && (\r\n <div style={{ flex: 1, minWidth: 0 }}>\r\n {title && (\r\n <div style={{\r\n fontSize: tokens.typography.fontSize.sm,\r\n fontWeight: tokens.typography.fontWeight.bold,\r\n color: tokens.colors.text.primary,\r\n lineHeight: tokens.typography.lineHeight.tight,\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n }}>\r\n {title}\r\n </div>\r\n )}\r\n <div style={{ display: 'flex', alignItems: 'center', gap: tokens.spacing.xs, marginTop: '2px' }}>\r\n {subtitle && (\r\n <span style={{\r\n fontSize: tokens.typography.fontSize.xxs,\r\n color: tokens.colors.text.tertiary,\r\n }}>\r\n {subtitle}\r\n </span>\r\n )}\r\n {badge && (\r\n <span style={{\r\n fontSize: '0.6rem',\r\n fontWeight: tokens.typography.fontWeight.bold,\r\n color: badgeColors[badgeVariant] || safeAccentText(tokens.colors.accent.primary),\r\n backgroundColor: `${badgeColors[badgeVariant] || tokens.colors.accent.primary}18`,\r\n border: `1px solid ${badgeColors[badgeVariant] || tokens.colors.accent.primary}30`,\r\n padding: '1px 6px',\r\n borderRadius: tokens.borderRadius.sm,\r\n textTransform: 'uppercase',\r\n letterSpacing: '0.05em',\r\n }}>\r\n {badge}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n {showToggle && <CollapseToggleButton />}\r\n </>)}\r\n </div>\r\n );\r\n});\r\n\r\n// ─── Item ────────────────────────────────────────────────────────────────────\r\n\r\nexport interface SideNavItemProps {\r\n /** Icon name from zendir-ui icon library */\r\n icon?: IconName | React.ReactNode;\r\n /** Label text */\r\n label: string;\r\n /** Description text displayed beneath the label (hidden in collapsed mode) */\r\n description?: string;\r\n /** Small tag/chip displayed after the label (e.g. \"v2\", \"NEW\", \"BETA\") */\r\n tag?: string;\r\n /** Tag color variant */\r\n tagVariant?: 'default' | 'info' | 'success' | 'warning' | 'danger';\r\n /** Link href (renders <a>) */\r\n href?: string;\r\n /** Click handler (renders <button>) */\r\n onClick?: () => void;\r\n /** Active state */\r\n active?: boolean;\r\n /** Disabled state */\r\n disabled?: boolean;\r\n /** Notification badge count */\r\n badge?: number;\r\n /** External link indicator */\r\n external?: boolean;\r\n /**\r\n * Astro UX status level — renders a dual-coded indicator (color + shape).\r\n * Shapes per official Astro UXDS: normal = ● filled circle, standby = ◎ ring,\r\n * caution = ■ square, serious = ◆ diamond, critical = ▼ triangle, off = · small circle.\r\n */\r\n status?: 'off' | 'standby' | 'normal' | 'caution' | 'serious' | 'critical';\r\n /** Optional status label shown as tooltip or text next to status shape */\r\n statusLabel?: string;\r\n /** Right-side slot — arbitrary ReactNode rendered at the end of the item row */\r\n suffix?: React.ReactNode;\r\n}\r\n\r\nconst TAG_COLORS: Record<string, { bg: string; fg: string; border: string }> = {\r\n default: { bg: '#ffffff10', fg: '#9590a8', border: '#ffffff15' },\r\n info: { bg: '#8a2be218', fg: '#c4a0ff', border: '#8a2be230' },\r\n success: { bg: '#56f00018', fg: '#56f000', border: '#56f00030' },\r\n warning: { bg: '#fce83a18', fg: '#fce83a', border: '#fce83a30' },\r\n danger: { bg: '#ff383818', fg: '#ff3838', border: '#ff383830' },\r\n};\r\n\r\nconst SideNavItem = memo(function SideNavItem({\r\n icon,\r\n label,\r\n description,\r\n tag,\r\n tagVariant = 'default',\r\n href,\r\n onClick,\r\n active = false,\r\n disabled = false,\r\n badge,\r\n external = false,\r\n status,\r\n statusLabel,\r\n suffix,\r\n}: SideNavItemProps): React.ReactElement {\r\n const { tokens } = useTheme();\r\n const { collapsed, setMobileOpen } = useContext(SideNavContext);\r\n const [isHovered, setIsHovered] = useState(false);\r\n \r\n const handleClick = useCallback(() => {\r\n if (disabled) return;\r\n setMobileOpen(false);\r\n onClick?.();\r\n }, [disabled, onClick, setMobileOpen]);\r\n \r\n // Status-aware accent: when an item has a status, tint active/hover with its color\r\n const statusColor = status ? (SIDENAV_STATUS_COLORS[status] ?? undefined) : undefined;\r\n const accentColor = statusColor && active ? statusColor : safeAccentText(tokens.colors.accent.primary);\r\n \r\n const hasDescription = !!description && !collapsed;\r\n \r\n const iconElement = typeof icon === 'string'\r\n ? <Icon name={icon as IconName} size={hasDescription ? 22 : 20} color={active ? accentColor : tokens.colors.text.secondary} />\r\n : icon;\r\n \r\n const itemStyle: React.CSSProperties = {\r\n display: 'flex',\r\n alignItems: hasDescription ? 'flex-start' : 'center',\r\n gap: tokens.spacing.sm,\r\n padding: collapsed\r\n ? `${tokens.spacing.sm} 0`\r\n : hasDescription\r\n ? `10px 16px 10px 12px`\r\n : `${tokens.spacing.sm} 16px ${tokens.spacing.sm} 12px`,\r\n justifyContent: collapsed ? 'center' : 'flex-start',\r\n color: active\r\n ? accentColor\r\n : disabled\r\n ? tokens.colors.text.tertiary\r\n : tokens.colors.text.secondary,\r\n backgroundColor: active\r\n ? `${accentColor}12`\r\n : isHovered && !disabled\r\n ? `${accentColor}08`\r\n : 'transparent',\r\n fontSize: tokens.typography.fontSize.sm,\r\n fontWeight: active ? tokens.typography.fontWeight.semibold : tokens.typography.fontWeight.normal,\r\n fontFamily: tokens.typography.fontFamily.primary,\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n textDecoration: 'none',\r\n borderTop: 'none',\r\n borderRight: 'none',\r\n borderBottom: 'none',\r\n borderLeft: active\r\n ? `3px solid ${accentColor}`\r\n : '3px solid transparent',\r\n outline: 'none',\r\n width: '100%',\r\n boxSizing: 'border-box',\r\n transition: tokens.animation.fast,\r\n position: 'relative',\r\n opacity: disabled ? 0.5 : 1,\r\n };\r\n \r\n const tagColors = TAG_COLORS[tagVariant] ?? TAG_COLORS.default;\r\n \r\n const content = (\r\n <>\r\n {/* Icon + collapsed status overlay */}\r\n {iconElement && (\r\n <span style={{ flexShrink: 0, display: 'flex', position: 'relative', marginTop: hasDescription ? '2px' : 0 }}>\r\n {iconElement}\r\n {/* In collapsed mode, show a small status shape overlaid on the icon (top-left) */}\r\n {collapsed && status && (\r\n <span\r\n style={{\r\n position: 'absolute',\r\n top: -3,\r\n left: -4,\r\n lineHeight: 0,\r\n }}\r\n title={statusLabel ?? status}\r\n >\r\n <NavStatusShape status={status} size={7} />\r\n </span>\r\n )}\r\n </span>\r\n )}\r\n {!collapsed && (\r\n <>\r\n {/* Label + description block */}\r\n <span style={{ flex: 1, minWidth: 0, overflow: 'hidden' }}>\r\n <span style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\r\n <span style={{ whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>\r\n {label}\r\n </span>\r\n {tag && (\r\n <span style={{\r\n fontSize: '0.6rem',\r\n fontWeight: tokens.typography.fontWeight.bold,\r\n color: tagColors.fg,\r\n backgroundColor: tagColors.bg,\r\n border: `1px solid ${tagColors.border}`,\r\n padding: '1px 5px',\r\n borderRadius: tokens.borderRadius.sm,\r\n textTransform: 'uppercase',\r\n letterSpacing: '0.04em',\r\n flexShrink: 0,\r\n lineHeight: '1.3',\r\n whiteSpace: 'nowrap',\r\n }}>\r\n {tag}\r\n </span>\r\n )}\r\n </span>\r\n {description && (\r\n <span style={{\r\n display: 'block',\r\n fontSize: tokens.typography.fontSize.xxs,\r\n color: tokens.colors.text.tertiary,\r\n lineHeight: tokens.typography.lineHeight.normal,\r\n marginTop: '2px',\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n fontWeight: tokens.typography.fontWeight.normal,\r\n }}>\r\n {description}\r\n </span>\r\n )}\r\n </span>\r\n {/* Right-side trailing elements — badge, status, suffix, external icon */}\r\n {(badge !== undefined && badge > 0 || status || suffix || external) && (\r\n <span style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 8,\r\n flexShrink: 0,\r\n marginTop: hasDescription ? '2px' : 0,\r\n }}>\r\n {/* Badge */}\r\n {badge !== undefined && badge > 0 && (\r\n <span style={{\r\n fontSize: '0.65rem',\r\n fontWeight: tokens.typography.fontWeight.bold,\r\n color: '#fff',\r\n backgroundColor: tokens.colors.status.critical,\r\n borderRadius: tokens.borderRadius.full,\r\n minWidth: '18px',\r\n height: '18px',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n padding: '0 5px',\r\n flexShrink: 0,\r\n lineHeight: 1,\r\n boxSizing: 'border-box',\r\n }}>\r\n {badge > 99 ? '99+' : badge}\r\n </span>\r\n )}\r\n {/* Status */}\r\n {status && (\r\n <span\r\n style={{ display: 'inline-flex', alignItems: 'center', flexShrink: 0 }}\r\n role=\"status\"\r\n aria-label={`Status: ${statusLabel ?? status}`}\r\n title={statusLabel ?? status}\r\n >\r\n <NavStatusShape status={status} size={8} />\r\n </span>\r\n )}\r\n {/* Suffix */}\r\n {suffix && (\r\n <span style={{ flexShrink: 0, display: 'inline-flex', alignItems: 'center' }}>\r\n {suffix}\r\n </span>\r\n )}\r\n {/* External */}\r\n {external && (\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" style={{ flexShrink: 0, opacity: 0.5 }}>\r\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\r\n <polyline points=\"15 3 21 3 21 9\" />\r\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\" />\r\n </svg>\r\n )}\r\n </span>\r\n )}\r\n </>\r\n )}\r\n </>\r\n );\r\n \r\n const props = {\r\n style: itemStyle,\r\n onMouseEnter: () => setIsHovered(true),\r\n onMouseLeave: () => setIsHovered(false),\r\n title: collapsed ? label : undefined,\r\n 'aria-current': active ? ('page' as const) : undefined,\r\n 'aria-disabled': disabled,\r\n };\r\n \r\n if (href && !disabled) {\r\n return (\r\n <a href={href} onClick={handleClick} target={external ? '_blank' : undefined} rel={external ? 'noopener noreferrer' : undefined} {...props}>\r\n {content}\r\n </a>\r\n );\r\n }\r\n \r\n return (\r\n <button type=\"button\" onClick={handleClick} disabled={disabled} {...props}>\r\n {content}\r\n </button>\r\n );\r\n});\r\n\r\n// ─── Section ─────────────────────────────────────────────────────────────────\r\n\r\nexport interface SideNavSectionProps {\r\n /** Section title */\r\n title?: string;\r\n /** Children (SideNav.Item elements) */\r\n children?: React.ReactNode;\r\n}\r\n\r\nconst SideNavSection = memo(function SideNavSection({\r\n title,\r\n children,\r\n}: SideNavSectionProps): React.ReactElement {\r\n const { tokens } = useTheme();\r\n const { collapsed } = useContext(SideNavContext);\r\n \r\n return (\r\n <div style={{ marginTop: tokens.spacing.sm }}>\r\n {title && !collapsed && (\r\n <div style={{\r\n padding: `${tokens.spacing.xs} 16px ${tokens.spacing.xs} 15px`,\r\n fontSize: tokens.typography.fontSize.xxs,\r\n fontWeight: tokens.typography.fontWeight.bold,\r\n color: tokens.colors.text.tertiary,\r\n textTransform: 'uppercase',\r\n letterSpacing: '0.08em',\r\n }}>\r\n {title}\r\n </div>\r\n )}\r\n {collapsed && title && (\r\n <div style={{\r\n width: '60%',\r\n height: '1px',\r\n backgroundColor: tokens.colors.border.muted,\r\n margin: `${tokens.spacing.xs} auto`,\r\n }} />\r\n )}\r\n {children}\r\n </div>\r\n );\r\n});\r\n\r\n// ─── Divider ─────────────────────────────────────────────────────────────────\r\n\r\nexport interface SideNavDividerProps {\r\n /** Optional label shown in the center of the divider line */\r\n label?: string;\r\n}\r\n\r\nconst SideNavDivider = memo(function SideNavDivider({\r\n label,\r\n}: SideNavDividerProps): React.ReactElement {\r\n const { tokens } = useTheme();\r\n const { collapsed } = useContext(SideNavContext);\r\n\r\n if (collapsed) {\r\n return (\r\n <div style={{\r\n width: '60%',\r\n height: '1px',\r\n backgroundColor: tokens.colors.border.muted,\r\n margin: `${tokens.spacing.sm} auto`,\r\n }} />\r\n );\r\n }\r\n\r\n if (label) {\r\n return (\r\n <div style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: tokens.spacing.sm,\r\n padding: `${tokens.spacing.sm} 16px ${tokens.spacing.sm} 15px`,\r\n }}>\r\n <div style={{ flex: 1, height: '1px', backgroundColor: tokens.colors.border.muted }} />\r\n <span style={{\r\n fontSize: tokens.typography.fontSize.xxs,\r\n color: tokens.colors.text.tertiary,\r\n textTransform: 'uppercase',\r\n letterSpacing: '0.06em',\r\n whiteSpace: 'nowrap',\r\n }}>\r\n {label}\r\n </span>\r\n <div style={{ flex: 1, height: '1px', backgroundColor: tokens.colors.border.muted }} />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div style={{\r\n height: '1px',\r\n backgroundColor: tokens.colors.border.muted,\r\n margin: `${tokens.spacing.sm} 16px ${tokens.spacing.sm} 15px`,\r\n }} />\r\n );\r\n});\r\n\r\n// ─── Footer ──────────────────────────────────────────────────────────────────\r\n\r\nexport interface SideNavFooterProps {\r\n children?: React.ReactNode;\r\n}\r\n\r\nconst SideNavFooter = memo(function SideNavFooter({\r\n children,\r\n}: SideNavFooterProps): React.ReactElement {\r\n const { tokens } = useTheme();\r\n \r\n return (\r\n <div style={{\r\n marginTop: 'auto',\r\n borderTop: `1px solid ${tokens.colors.border.muted}`,\r\n paddingTop: tokens.spacing.xs,\r\n paddingBottom: tokens.spacing.xs,\r\n }}>\r\n {children}\r\n </div>\r\n );\r\n});\r\n\r\n// ─── Compound Export ─────────────────────────────────────────────────────────\r\n\r\ntype SideNavComponent = typeof SideNavRoot & {\r\n Header: typeof SideNavHeader;\r\n Item: typeof SideNavItem;\r\n Section: typeof SideNavSection;\r\n Divider: typeof SideNavDivider;\r\n Footer: typeof SideNavFooter;\r\n};\r\n\r\nexport const SideNav: SideNavComponent = Object.assign(SideNavRoot, {\r\n Header: SideNavHeader,\r\n Item: SideNavItem,\r\n Section: SideNavSection,\r\n Divider: SideNavDivider,\r\n Footer: SideNavFooter,\r\n});\r\n\r\nexport default SideNav;\r\n"],"names":["SideNav","SideNavHeader","SideNavItem","SideNavSection","SideNavDivider","SideNavFooter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SideNav.js","sources":["../../../src/react/core/SideNav.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - SideNav Component\r\n * \r\n * Persistent sidebar navigation for operator dashboards. Compound component\r\n * pattern with Header, Item, Section, Divider, and Footer subcomponents.\r\n * \r\n * Responsive: Full sidebar on desktop, hamburger overlay on mobile.\r\n * \r\n * Astro UX Compliance:\r\n * - Persistent side navigation pattern (AstroUXDS Navigation)\r\n * - Status indicator integration\r\n * - Active state highlighting with accent color\r\n * - Keyboard navigation support\r\n * - Reduced motion support\r\n * \r\n * @example\r\n * ```tsx\r\n * <SideNav>\r\n * <SideNav.Header logo={<Icon name=\"satellite\" size={24} />} title=\"Space Range\" badge=\"Operator\" />\r\n * <SideNav.Section title=\"Operations\">\r\n * <SideNav.Item icon=\"controls\" label=\"Controls\" description=\"System command interface\" href=\"/controls\" active />\r\n * <SideNav.Item icon=\"telemetry\" label=\"Telemetry\" href=\"/telemetry\" badge={3} tag=\"LIVE\" tagVariant=\"success\" />\r\n * <SideNav.Item icon=\"images\" label=\"Images\" href=\"/images\" />\r\n * </SideNav.Section>\r\n * <SideNav.Divider />\r\n * <SideNav.Section title=\"Analysis\">\r\n * <SideNav.Item icon=\"chart\" label=\"Plots\" href=\"/plots\" />\r\n * <SideNav.Item icon=\"map\" label=\"Map\" href=\"/map\" />\r\n * </SideNav.Section>\r\n * <SideNav.Footer>\r\n * <SideNav.Item icon=\"settings\" label=\"Settings\" href=\"/settings\" />\r\n * </SideNav.Footer>\r\n * </SideNav>\r\n * ```\r\n */\r\n\r\nimport React, { memo, useState, createContext, useContext, useCallback, useEffect } from 'react';\r\nimport { useTheme } from '../theme';\r\nimport { safeAccentText } from '../utils';\r\nimport { Icon } from './Icon';\r\nimport type { IconName } from './Icon';\r\n\r\n// ─── Astro UX Status Shape ───────────────────────────────────────────────────\r\n\r\nconst SIDENAV_STATUS_COLORS: Record<string, string> = {\r\n off: '#a4abb6',\r\n standby: '#2dccff',\r\n normal: '#56f000',\r\n caution: '#fce83a',\r\n serious: '#ffb302',\r\n critical: '#ff3838',\r\n};\r\n\r\n/** Astro UX dual-coded status shape (color + geometry). */\r\nfunction NavStatusShape({ status, size = 8 }: { status: string; size?: number }) {\r\n const color = SIDENAV_STATUS_COLORS[status] ?? SIDENAV_STATUS_COLORS.off;\r\n const glow = `${color}50`;\r\n const style = { flexShrink: 0 as const, filter: `drop-shadow(0 0 3px ${glow})` };\r\n\r\n switch (status) {\r\n case 'caution':\r\n return <svg viewBox=\"0 0 12 12\" width={size} height={size} style={style} aria-hidden=\"true\"><rect x=\"1\" y=\"1\" width=\"10\" height=\"10\" fill={color} /></svg>;\r\n case 'serious':\r\n return <svg viewBox=\"0 0 12 12\" width={size} height={size} style={style} aria-hidden=\"true\"><polygon points=\"6,1 11,6 6,11 1,6\" fill={color} /></svg>;\r\n case 'critical':\r\n return <svg viewBox=\"0 0 12 12\" width={size} height={size} style={style} aria-hidden=\"true\"><polygon points=\"6,11 1,2 11,2\" fill={color} /></svg>;\r\n case 'standby':\r\n return <svg viewBox=\"0 0 12 12\" width={size} height={size} style={style} aria-hidden=\"true\"><circle cx=\"6\" cy=\"6\" r=\"3.5\" fill=\"none\" stroke={color} strokeWidth=\"2\" /></svg>;\r\n case 'off':\r\n return <svg viewBox=\"0 0 12 12\" width={size} height={size} style={style} aria-hidden=\"true\"><circle cx=\"6\" cy=\"6\" r=\"3\" fill={color} /></svg>;\r\n default: // normal\r\n return <svg viewBox=\"0 0 12 12\" width={size} height={size} style={style} aria-hidden=\"true\"><circle cx=\"6\" cy=\"6\" r=\"5\" fill={color} /></svg>;\r\n }\r\n}\r\n\r\n// ─── Responsive Breakpoints ──────────────────────────────────────────────────\r\n\r\nconst SIDENAV_BREAKPOINTS = {\r\n mobile: 768,\r\n tablet: 1024,\r\n} as const;\r\n\r\ntype SideNavMode = 'desktop' | 'tablet' | 'mobile';\r\n\r\nfunction getSideNavMode(width: number): SideNavMode {\r\n if (width < SIDENAV_BREAKPOINTS.mobile) return 'mobile';\r\n if (width < SIDENAV_BREAKPOINTS.tablet) return 'tablet';\r\n return 'desktop';\r\n}\r\n\r\n// ─── Context ─────────────────────────────────────────────────────────────────\r\n\r\ninterface SideNavContextValue {\r\n collapsed: boolean;\r\n mobileOpen: boolean;\r\n mode: SideNavMode;\r\n showCollapseToggle: boolean;\r\n setMobileOpen: (open: boolean) => void;\r\n toggleCollapse: () => void;\r\n}\r\n\r\nconst SideNavContext = createContext<SideNavContextValue>({\r\n collapsed: false,\r\n mobileOpen: false,\r\n mode: 'desktop',\r\n showCollapseToggle: true,\r\n setMobileOpen: () => {},\r\n toggleCollapse: () => {},\r\n});\r\n\r\n// ─── SideNav ─────────────────────────────────────────────────────────────────\r\n\r\nexport interface SideNavProps {\r\n /** Collapsed mode (icon-only). When omitted, auto-collapses on tablet viewports. */\r\n collapsed?: boolean;\r\n /** Callback when collapsed state changes (via toggle button or responsive breakpoint). */\r\n onCollapsedChange?: (collapsed: boolean) => void;\r\n /** Show a collapse/expand toggle button in the sidebar (default true). */\r\n showCollapseToggle?: boolean;\r\n /** Width in pixels (default 260) */\r\n width?: number;\r\n /** Collapsed width in pixels (default 64) */\r\n collapsedWidth?: number;\r\n /**\r\n * Mobile viewport behavior.\r\n * - `'drawer'` (default): hamburger button with slide-out overlay drawer.\r\n * - `'collapsed'`: persistent collapsed icon-only strip (same as tablet).\r\n */\r\n mobileVariant?: 'drawer' | 'collapsed';\r\n /** Children (SideNav.Header, SideNav.Item, SideNav.Section, SideNav.Footer) */\r\n children?: React.ReactNode;\r\n /** Custom style */\r\n style?: React.CSSProperties;\r\n}\r\n\r\nconst SideNavRoot = memo(function SideNav({\r\n collapsed,\r\n onCollapsedChange,\r\n showCollapseToggle = true,\r\n width = 260,\r\n collapsedWidth = 64,\r\n mobileVariant = 'drawer',\r\n children,\r\n style,\r\n}: SideNavProps): React.ReactElement {\r\n const { tokens, theme } = useTheme();\r\n const isTransparentTheme = theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\r\n const [mobileOpen, setMobileOpen] = useState(false);\r\n const [userCollapsed, setUserCollapsed] = useState<boolean | null>(null);\r\n const [viewMode, setViewMode] = useState<SideNavMode>(() => {\r\n if (typeof window !== 'undefined') return getSideNavMode(window.innerWidth);\r\n return 'desktop';\r\n });\r\n \r\n useEffect(() => {\r\n if (typeof window === 'undefined') return;\r\n let rafId: number;\r\n const handleResize = () => {\r\n cancelAnimationFrame(rafId);\r\n rafId = requestAnimationFrame(() => setViewMode(getSideNavMode(window.innerWidth)));\r\n };\r\n window.addEventListener('resize', handleResize, { passive: true });\r\n return () => {\r\n window.removeEventListener('resize', handleResize);\r\n cancelAnimationFrame(rafId);\r\n };\r\n }, []);\r\n\r\n // When mobileVariant='collapsed', promote mobile to tablet (collapsed inline strip)\r\n const effectiveMode = mobileVariant === 'collapsed' && viewMode === 'mobile' ? 'tablet' : viewMode;\r\n\r\n // Reset user toggle when crossing breakpoints\r\n useEffect(() => {\r\n setUserCollapsed(null);\r\n }, [effectiveMode]);\r\n\r\n // Close mobile drawer when switching away from mobile\r\n useEffect(() => {\r\n if (effectiveMode !== 'mobile' && mobileOpen) setMobileOpen(false);\r\n }, [effectiveMode, mobileOpen]);\r\n \r\n // Close mobile nav on escape\r\n useEffect(() => {\r\n if (!mobileOpen) return;\r\n const handleEsc = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') setMobileOpen(false);\r\n };\r\n document.addEventListener('keydown', handleEsc);\r\n return () => document.removeEventListener('keydown', handleEsc);\r\n }, [mobileOpen]);\r\n\r\n // Resolve collapsed: explicit prop > user toggle > auto (tablet = collapsed)\r\n const autoCollapsed = effectiveMode === 'tablet';\r\n const isCollapsed = collapsed !== undefined\r\n ? collapsed\r\n : userCollapsed !== null\r\n ? userCollapsed\r\n : autoCollapsed;\r\n const isMobile = effectiveMode === 'mobile';\r\n const navWidth = isCollapsed ? collapsedWidth : width;\r\n\r\n const handleToggleCollapse = useCallback(() => {\r\n const next = !isCollapsed;\r\n setUserCollapsed(next);\r\n onCollapsedChange?.(next);\r\n }, [isCollapsed, onCollapsedChange]);\r\n \r\n const navStyle: React.CSSProperties = {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: isMobile ? 280 : navWidth,\r\n height: '100%',\r\n backgroundColor: isTransparentTheme\r\n ? 'rgba(15, 12, 30, 0.7)'\r\n : tokens.colors.background.surface,\r\n borderRight: `1px solid ${tokens.colors.border.muted}`,\r\n transition: 'width 0.25s ease, transform 0.25s ease',\r\n overflowX: 'hidden',\r\n overflowY: 'auto',\r\n flexShrink: 0,\r\n fontFamily: tokens.typography.fontFamily.primary,\r\n ...(isTransparentTheme ? {\r\n backdropFilter: 'blur(16px)',\r\n WebkitBackdropFilter: 'blur(16px)',\r\n } : {}),\r\n ...style,\r\n };\r\n \r\n const contextValue: SideNavContextValue = { collapsed: isCollapsed, mobileOpen, mode: effectiveMode, showCollapseToggle, setMobileOpen, toggleCollapse: handleToggleCollapse };\r\n \r\n // Mobile: hamburger button + overlay drawer\r\n if (isMobile) {\r\n return (\r\n <SideNavContext.Provider value={contextValue}>\r\n {/* Hamburger button */}\r\n <button\r\n aria-label=\"Open navigation\"\r\n onClick={() => setMobileOpen(true)}\r\n style={{\r\n position: 'fixed',\r\n top: 6,\r\n left: 6,\r\n zIndex: 1001,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n width: 32,\r\n height: 32,\r\n border: 'none',\r\n borderRadius: tokens.borderRadius.sm,\r\n backgroundColor: 'transparent',\r\n color: tokens.colors.text.primary,\r\n cursor: 'pointer',\r\n padding: 0,\r\n transition: tokens.animation.fast,\r\n }}\r\n >\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\">\r\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\r\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" />\r\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n \r\n {/* Overlay */}\r\n <div\r\n aria-hidden=\"true\"\r\n style={{\r\n position: 'fixed',\r\n inset: 0,\r\n zIndex: 1002,\r\n backgroundColor: `${tokens.colors.background.base}99`,\r\n backdropFilter: 'blur(4px)',\r\n opacity: mobileOpen ? 1 : 0,\r\n pointerEvents: mobileOpen ? 'auto' : 'none',\r\n transition: 'opacity 0.25s ease',\r\n }}\r\n onClick={() => setMobileOpen(false)}\r\n />\r\n \r\n {/* Slide-out nav */}\r\n <nav\r\n role=\"navigation\"\r\n aria-label=\"Main navigation\"\r\n style={{\r\n ...navStyle,\r\n position: 'fixed',\r\n top: 0,\r\n left: 0,\r\n zIndex: 1003,\r\n transform: mobileOpen ? 'translateX(0)' : 'translateX(-100%)',\r\n boxShadow: mobileOpen ? tokens.shadows.xl : 'none',\r\n }}\r\n >\r\n {children}\r\n </nav>\r\n </SideNavContext.Provider>\r\n );\r\n }\r\n \r\n return (\r\n <SideNavContext.Provider value={contextValue}>\r\n <nav role=\"navigation\" aria-label=\"Main navigation\" style={navStyle}>\r\n {children}\r\n </nav>\r\n </SideNavContext.Provider>\r\n );\r\n});\r\n\r\n// ─── Header ──────────────────────────────────────────────────────────────────\r\n\r\nexport interface SideNavHeaderProps {\r\n /** Logo element (Icon, image, or ReactNode) */\r\n logo?: React.ReactNode;\r\n /** Compact logo shown when sidebar is collapsed or on tablet (e.g., just the icon mark) */\r\n collapsedLogo?: React.ReactNode;\r\n /** App title */\r\n title?: string;\r\n /** Subtitle or version */\r\n subtitle?: string;\r\n /** Role badge (e.g., \"Operator\", \"Admin\") */\r\n badge?: string;\r\n /** Badge variant for color */\r\n badgeVariant?: 'info' | 'success' | 'warning' | 'caution';\r\n /** Children override (advanced: replaces default header content entirely) */\r\n children?: React.ReactNode;\r\n}\r\n\r\n/** Chevron toggle button for collapsing/expanding the sidebar. */\r\nfunction CollapseToggleButton() {\r\n const { tokens } = useTheme();\r\n const { collapsed, toggleCollapse } = useContext(SideNavContext);\r\n const [hovered, setHovered] = useState(false);\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n aria-label={collapsed ? 'Expand sidebar' : 'Collapse sidebar'}\r\n onClick={toggleCollapse}\r\n onMouseEnter={() => setHovered(true)}\r\n onMouseLeave={() => setHovered(false)}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n width: 28,\r\n height: 28,\r\n border: `1px solid ${hovered ? tokens.colors.border.focus : tokens.colors.border.muted}`,\r\n borderRadius: tokens.borderRadius.md,\r\n backgroundColor: hovered ? `${tokens.colors.accent.primary}15` : 'transparent',\r\n color: hovered ? tokens.colors.accent.primary : tokens.colors.text.tertiary,\r\n cursor: 'pointer',\r\n flexShrink: 0,\r\n padding: 0,\r\n transition: tokens.animation.fast,\r\n outline: 'none',\r\n }}\r\n >\r\n <svg\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n style={{\r\n transition: 'transform 0.25s ease',\r\n transform: collapsed ? 'rotate(180deg)' : 'rotate(0deg)',\r\n }}\r\n >\r\n <polyline points=\"15 18 9 12 15 6\" />\r\n </svg>\r\n </button>\r\n );\r\n}\r\n\r\nconst SideNavHeader = memo(function SideNavHeader({\r\n logo,\r\n collapsedLogo,\r\n title,\r\n subtitle,\r\n badge,\r\n badgeVariant = 'info',\r\n children,\r\n}: SideNavHeaderProps): React.ReactElement {\r\n const { tokens } = useTheme();\r\n const { collapsed, mode, showCollapseToggle, toggleCollapse } = useContext(SideNavContext);\r\n const displayLogo = collapsed && collapsedLogo ? collapsedLogo : logo;\r\n const showToggle = showCollapseToggle && mode !== 'mobile';\r\n \r\n const badgeColors: Record<string, string> = {\r\n info: tokens.colors.accent.primary,\r\n success: tokens.colors.status.normal,\r\n warning: tokens.colors.status.caution,\r\n caution: tokens.colors.status.serious,\r\n };\r\n \r\n return (\r\n <div style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: tokens.spacing.sm,\r\n padding: collapsed ? `${tokens.spacing.md} ${tokens.spacing.sm}` : `0 16px 0 15px`,\r\n minHeight: 91,\r\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\r\n flexShrink: 0,\r\n justifyContent: collapsed ? 'center' : 'flex-start',\r\n boxSizing: 'border-box',\r\n position: 'relative',\r\n }}>\r\n {children ? children : (<>\r\n {displayLogo && <div style={{ flexShrink: 0, cursor: collapsed && showToggle ? 'pointer' : undefined }} onClick={collapsed && showToggle ? toggleCollapse : undefined}>{displayLogo}</div>}\r\n {!collapsed && (\r\n <div style={{ flex: 1, minWidth: 0 }}>\r\n {title && (\r\n <div style={{\r\n fontSize: tokens.typography.fontSize.sm,\r\n fontWeight: tokens.typography.fontWeight.bold,\r\n color: tokens.colors.text.primary,\r\n lineHeight: tokens.typography.lineHeight.tight,\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n }}>\r\n {title}\r\n </div>\r\n )}\r\n <div style={{ display: 'flex', alignItems: 'center', gap: tokens.spacing.xs, marginTop: '2px' }}>\r\n {subtitle && (\r\n <span style={{\r\n fontSize: tokens.typography.fontSize.xxs,\r\n color: tokens.colors.text.tertiary,\r\n }}>\r\n {subtitle}\r\n </span>\r\n )}\r\n {badge && (\r\n <span style={{\r\n fontSize: '0.6rem',\r\n fontWeight: tokens.typography.fontWeight.bold,\r\n color: badgeColors[badgeVariant] || safeAccentText(tokens.colors.accent.primary),\r\n backgroundColor: `${badgeColors[badgeVariant] || tokens.colors.accent.primary}18`,\r\n border: `1px solid ${badgeColors[badgeVariant] || tokens.colors.accent.primary}30`,\r\n padding: '1px 6px',\r\n borderRadius: tokens.borderRadius.sm,\r\n textTransform: 'uppercase',\r\n letterSpacing: '0.05em',\r\n }}>\r\n {badge}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n {showToggle && (\r\n collapsed\r\n ? <div style={{ position: 'absolute', right: 4, top: '50%', transform: 'translateY(-50%)' }}><CollapseToggleButton /></div>\r\n : <CollapseToggleButton />\r\n )}\r\n </>)}\r\n </div>\r\n );\r\n});\r\n\r\n// ─── Item ────────────────────────────────────────────────────────────────────\r\n\r\nexport interface SideNavItemProps {\r\n /** Icon name from zendir-ui icon library */\r\n icon?: IconName | React.ReactNode;\r\n /** Label text */\r\n label: string;\r\n /** Description text displayed beneath the label (hidden in collapsed mode) */\r\n description?: string;\r\n /** Small tag/chip displayed after the label (e.g. \"v2\", \"NEW\", \"BETA\") */\r\n tag?: string;\r\n /** Tag color variant */\r\n tagVariant?: 'default' | 'info' | 'success' | 'warning' | 'danger';\r\n /** Link href (renders <a>) */\r\n href?: string;\r\n /** Click handler (renders <button>) */\r\n onClick?: () => void;\r\n /** Active state */\r\n active?: boolean;\r\n /** Disabled state */\r\n disabled?: boolean;\r\n /** Notification badge count */\r\n badge?: number;\r\n /** External link indicator */\r\n external?: boolean;\r\n /**\r\n * Astro UX status level — renders a dual-coded indicator (color + shape).\r\n * Shapes per official Astro UXDS: normal = ● filled circle, standby = ◎ ring,\r\n * caution = ■ square, serious = ◆ diamond, critical = ▼ triangle, off = · small circle.\r\n */\r\n status?: 'off' | 'standby' | 'normal' | 'caution' | 'serious' | 'critical';\r\n /** Optional status label shown as tooltip or text next to status shape */\r\n statusLabel?: string;\r\n /** Right-side slot — arbitrary ReactNode rendered at the end of the item row */\r\n suffix?: React.ReactNode;\r\n}\r\n\r\nconst TAG_COLORS: Record<string, { bg: string; fg: string; border: string }> = {\r\n default: { bg: '#ffffff10', fg: '#9590a8', border: '#ffffff15' },\r\n info: { bg: '#8a2be218', fg: '#c4a0ff', border: '#8a2be230' },\r\n success: { bg: '#56f00018', fg: '#56f000', border: '#56f00030' },\r\n warning: { bg: '#fce83a18', fg: '#fce83a', border: '#fce83a30' },\r\n danger: { bg: '#ff383818', fg: '#ff3838', border: '#ff383830' },\r\n};\r\n\r\nconst SideNavItem = memo(function SideNavItem({\r\n icon,\r\n label,\r\n description,\r\n tag,\r\n tagVariant = 'default',\r\n href,\r\n onClick,\r\n active = false,\r\n disabled = false,\r\n badge,\r\n external = false,\r\n status,\r\n statusLabel,\r\n suffix,\r\n}: SideNavItemProps): React.ReactElement {\r\n const { tokens } = useTheme();\r\n const { collapsed, setMobileOpen } = useContext(SideNavContext);\r\n const [isHovered, setIsHovered] = useState(false);\r\n \r\n const handleClick = useCallback(() => {\r\n if (disabled) return;\r\n setMobileOpen(false);\r\n onClick?.();\r\n }, [disabled, onClick, setMobileOpen]);\r\n \r\n // Status-aware accent: when an item has a status, tint active/hover with its color\r\n const statusColor = status ? (SIDENAV_STATUS_COLORS[status] ?? undefined) : undefined;\r\n const accentColor = statusColor && active ? statusColor : safeAccentText(tokens.colors.accent.primary);\r\n \r\n const hasDescription = !!description && !collapsed;\r\n \r\n const iconElement = typeof icon === 'string'\r\n ? <Icon name={icon as IconName} size={hasDescription ? 22 : 20} color={active ? accentColor : tokens.colors.text.secondary} />\r\n : icon;\r\n \r\n const itemStyle: React.CSSProperties = {\r\n display: 'flex',\r\n alignItems: hasDescription ? 'flex-start' : 'center',\r\n gap: tokens.spacing.sm,\r\n padding: collapsed\r\n ? `${tokens.spacing.sm} 0`\r\n : hasDescription\r\n ? `10px 16px 10px 12px`\r\n : `${tokens.spacing.sm} 16px ${tokens.spacing.sm} 12px`,\r\n justifyContent: collapsed ? 'center' : 'flex-start',\r\n color: active\r\n ? accentColor\r\n : disabled\r\n ? tokens.colors.text.tertiary\r\n : tokens.colors.text.secondary,\r\n backgroundColor: active\r\n ? `${accentColor}12`\r\n : isHovered && !disabled\r\n ? `${accentColor}08`\r\n : 'transparent',\r\n fontSize: tokens.typography.fontSize.sm,\r\n fontWeight: active ? tokens.typography.fontWeight.semibold : tokens.typography.fontWeight.normal,\r\n fontFamily: tokens.typography.fontFamily.primary,\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n textDecoration: 'none',\r\n borderTop: 'none',\r\n borderRight: 'none',\r\n borderBottom: 'none',\r\n borderLeft: active\r\n ? `3px solid ${accentColor}`\r\n : '3px solid transparent',\r\n outline: 'none',\r\n width: '100%',\r\n boxSizing: 'border-box',\r\n transition: tokens.animation.fast,\r\n position: 'relative',\r\n opacity: disabled ? 0.5 : 1,\r\n };\r\n \r\n const tagColors = TAG_COLORS[tagVariant] ?? TAG_COLORS.default;\r\n \r\n const content = (\r\n <>\r\n {/* Icon + collapsed status overlay */}\r\n {iconElement && (\r\n <span style={{ flexShrink: 0, display: 'flex', position: 'relative', marginTop: hasDescription ? '2px' : 0 }}>\r\n {iconElement}\r\n {/* In collapsed mode, show a small status shape overlaid on the icon (top-left) */}\r\n {collapsed && status && (\r\n <span\r\n style={{\r\n position: 'absolute',\r\n top: -3,\r\n left: -4,\r\n lineHeight: 0,\r\n }}\r\n title={statusLabel ?? status}\r\n >\r\n <NavStatusShape status={status} size={7} />\r\n </span>\r\n )}\r\n </span>\r\n )}\r\n {!collapsed && (\r\n <>\r\n {/* Label + description block */}\r\n <span style={{ flex: 1, minWidth: 0, overflow: 'hidden' }}>\r\n <span style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\r\n <span style={{ whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>\r\n {label}\r\n </span>\r\n {tag && (\r\n <span style={{\r\n fontSize: '0.6rem',\r\n fontWeight: tokens.typography.fontWeight.bold,\r\n color: tagColors.fg,\r\n backgroundColor: tagColors.bg,\r\n border: `1px solid ${tagColors.border}`,\r\n padding: '1px 5px',\r\n borderRadius: tokens.borderRadius.sm,\r\n textTransform: 'uppercase',\r\n letterSpacing: '0.04em',\r\n flexShrink: 0,\r\n lineHeight: '1.3',\r\n whiteSpace: 'nowrap',\r\n }}>\r\n {tag}\r\n </span>\r\n )}\r\n </span>\r\n {description && (\r\n <span style={{\r\n display: 'block',\r\n fontSize: tokens.typography.fontSize.xxs,\r\n color: tokens.colors.text.tertiary,\r\n lineHeight: tokens.typography.lineHeight.normal,\r\n marginTop: '2px',\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n fontWeight: tokens.typography.fontWeight.normal,\r\n }}>\r\n {description}\r\n </span>\r\n )}\r\n </span>\r\n {/* Right-side trailing elements — badge, status, suffix, external icon */}\r\n {(badge !== undefined && badge > 0 || status || suffix || external) && (\r\n <span style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 8,\r\n flexShrink: 0,\r\n marginTop: hasDescription ? '2px' : 0,\r\n }}>\r\n {/* Badge */}\r\n {badge !== undefined && badge > 0 && (\r\n <span style={{\r\n fontSize: '0.65rem',\r\n fontWeight: tokens.typography.fontWeight.bold,\r\n color: '#fff',\r\n backgroundColor: tokens.colors.status.critical,\r\n borderRadius: tokens.borderRadius.full,\r\n minWidth: '18px',\r\n height: '18px',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n padding: '0 5px',\r\n flexShrink: 0,\r\n lineHeight: 1,\r\n boxSizing: 'border-box',\r\n }}>\r\n {badge > 99 ? '99+' : badge}\r\n </span>\r\n )}\r\n {/* Status */}\r\n {status && (\r\n <span\r\n style={{ display: 'inline-flex', alignItems: 'center', flexShrink: 0 }}\r\n role=\"status\"\r\n aria-label={`Status: ${statusLabel ?? status}`}\r\n title={statusLabel ?? status}\r\n >\r\n <NavStatusShape status={status} size={8} />\r\n </span>\r\n )}\r\n {/* Suffix */}\r\n {suffix && (\r\n <span style={{ flexShrink: 0, display: 'inline-flex', alignItems: 'center' }}>\r\n {suffix}\r\n </span>\r\n )}\r\n {/* External */}\r\n {external && (\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" style={{ flexShrink: 0, opacity: 0.5 }}>\r\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\r\n <polyline points=\"15 3 21 3 21 9\" />\r\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\" />\r\n </svg>\r\n )}\r\n </span>\r\n )}\r\n </>\r\n )}\r\n </>\r\n );\r\n \r\n const props = {\r\n style: itemStyle,\r\n onMouseEnter: () => setIsHovered(true),\r\n onMouseLeave: () => setIsHovered(false),\r\n title: collapsed ? label : undefined,\r\n 'aria-current': active ? ('page' as const) : undefined,\r\n 'aria-disabled': disabled,\r\n };\r\n \r\n if (href && !disabled) {\r\n return (\r\n <a href={href} onClick={handleClick} target={external ? '_blank' : undefined} rel={external ? 'noopener noreferrer' : undefined} {...props}>\r\n {content}\r\n </a>\r\n );\r\n }\r\n \r\n return (\r\n <button type=\"button\" onClick={handleClick} disabled={disabled} {...props}>\r\n {content}\r\n </button>\r\n );\r\n});\r\n\r\n// ─── Section ─────────────────────────────────────────────────────────────────\r\n\r\nexport interface SideNavSectionProps {\r\n /** Section title */\r\n title?: string;\r\n /** Children (SideNav.Item elements) */\r\n children?: React.ReactNode;\r\n}\r\n\r\nconst SideNavSection = memo(function SideNavSection({\r\n title,\r\n children,\r\n}: SideNavSectionProps): React.ReactElement {\r\n const { tokens } = useTheme();\r\n const { collapsed } = useContext(SideNavContext);\r\n \r\n return (\r\n <div style={{ marginTop: tokens.spacing.sm }}>\r\n {title && !collapsed && (\r\n <div style={{\r\n padding: `${tokens.spacing.xs} 16px ${tokens.spacing.xs} 15px`,\r\n fontSize: tokens.typography.fontSize.xxs,\r\n fontWeight: tokens.typography.fontWeight.bold,\r\n color: tokens.colors.text.tertiary,\r\n textTransform: 'uppercase',\r\n letterSpacing: '0.08em',\r\n }}>\r\n {title}\r\n </div>\r\n )}\r\n {collapsed && title && (\r\n <div style={{\r\n width: '60%',\r\n height: '1px',\r\n backgroundColor: tokens.colors.border.muted,\r\n margin: `${tokens.spacing.xs} auto`,\r\n }} />\r\n )}\r\n {children}\r\n </div>\r\n );\r\n});\r\n\r\n// ─── Divider ─────────────────────────────────────────────────────────────────\r\n\r\nexport interface SideNavDividerProps {\r\n /** Optional label shown in the center of the divider line */\r\n label?: string;\r\n}\r\n\r\nconst SideNavDivider = memo(function SideNavDivider({\r\n label,\r\n}: SideNavDividerProps): React.ReactElement {\r\n const { tokens } = useTheme();\r\n const { collapsed } = useContext(SideNavContext);\r\n\r\n if (collapsed) {\r\n return (\r\n <div style={{\r\n width: '60%',\r\n height: '1px',\r\n backgroundColor: tokens.colors.border.muted,\r\n margin: `${tokens.spacing.sm} auto`,\r\n }} />\r\n );\r\n }\r\n\r\n if (label) {\r\n return (\r\n <div style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: tokens.spacing.sm,\r\n padding: `${tokens.spacing.sm} 16px ${tokens.spacing.sm} 15px`,\r\n }}>\r\n <div style={{ flex: 1, height: '1px', backgroundColor: tokens.colors.border.muted }} />\r\n <span style={{\r\n fontSize: tokens.typography.fontSize.xxs,\r\n color: tokens.colors.text.tertiary,\r\n textTransform: 'uppercase',\r\n letterSpacing: '0.06em',\r\n whiteSpace: 'nowrap',\r\n }}>\r\n {label}\r\n </span>\r\n <div style={{ flex: 1, height: '1px', backgroundColor: tokens.colors.border.muted }} />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div style={{\r\n height: '1px',\r\n backgroundColor: tokens.colors.border.muted,\r\n margin: `${tokens.spacing.sm} 16px ${tokens.spacing.sm} 15px`,\r\n }} />\r\n );\r\n});\r\n\r\n// ─── Footer ──────────────────────────────────────────────────────────────────\r\n\r\nexport interface SideNavFooterProps {\r\n children?: React.ReactNode;\r\n}\r\n\r\nconst SideNavFooter = memo(function SideNavFooter({\r\n children,\r\n}: SideNavFooterProps): React.ReactElement {\r\n const { tokens } = useTheme();\r\n \r\n return (\r\n <div style={{\r\n marginTop: 'auto',\r\n borderTop: `1px solid ${tokens.colors.border.muted}`,\r\n paddingTop: tokens.spacing.xs,\r\n paddingBottom: tokens.spacing.xs,\r\n }}>\r\n {children}\r\n </div>\r\n );\r\n});\r\n\r\n// ─── Compound Export ─────────────────────────────────────────────────────────\r\n\r\ntype SideNavComponent = typeof SideNavRoot & {\r\n Header: typeof SideNavHeader;\r\n Item: typeof SideNavItem;\r\n Section: typeof SideNavSection;\r\n Divider: typeof SideNavDivider;\r\n Footer: typeof SideNavFooter;\r\n};\r\n\r\nexport const SideNav: SideNavComponent = Object.assign(SideNavRoot, {\r\n Header: SideNavHeader,\r\n Item: SideNavItem,\r\n Section: SideNavSection,\r\n Divider: SideNavDivider,\r\n Footer: SideNavFooter,\r\n});\r\n\r\nexport default SideNav;\r\n"],"names":["SideNav","SideNavHeader","SideNavItem","SideNavSection","SideNavDivider","SideNavFooter"],"mappings":"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"}
|
|
@@ -99,7 +99,7 @@ const ThermalHeatmapCard = memo(function ThermalHeatmapCard2({
|
|
|
99
99
|
color: tokens.colors.text.tertiary
|
|
100
100
|
},
|
|
101
101
|
children: [
|
|
102
|
-
/* @__PURE__ */ jsx("svg", { width: "32", height: "32", viewBox: "0 0 24 24", fill: "currentColor", style: { opacity: 0.5, marginBottom: 8 }, children: /* @__PURE__ */ jsx("path", { d: "
|
|
102
|
+
/* @__PURE__ */ jsx("svg", { width: "32", height: "32", viewBox: "0 0 24 24", fill: "currentColor", style: { opacity: 0.5, marginBottom: 8 }, children: /* @__PURE__ */ jsx("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M10.5 2C12.433 2 14 3.567 14 5.5L14.0005 12.2576C15.2217 13.2664 16 14.7923 16 16.5C16 19.5376 13.5376 22 10.5 22C7.46243 22 5 19.5376 5 16.5C5 14.7919 5.77868 13.2656 7.00044 12.2568L7 5.5C7 3.567 8.567 2 10.5 2ZM10.5 4C9.7203 4 9.07955 4.59489 9.00687 5.35543L9 5.49987L9.0005 13.199L8.27384 13.799C7.47135 14.4616 7 15.4402 7 16.5C7 18.433 8.567 20 10.5 20C12.433 20 14 18.433 14 16.5C14 15.5111 13.5896 14.593 12.8828 13.9362L12.7268 13.7995L12.0006 13.1997L12 5.5C12 4.7203 11.4051 4.07955 10.6445 4.00687L10.5 4ZM11 5.5C11 5.22386 10.7761 5 10.5 5C10.2239 5 10 5.22386 10 5.5L10.0006 14.0499C8.85917 14.2813 8 15.2903 8 16.5C8 17.8807 9.11929 19 10.5 19C11.8807 19 13 17.8807 13 16.5C13 15.2907 12.1413 14.2819 11.0004 14.0501L11 5.5ZM20 11C20.5523 11 21 11.4477 21 12C21 12.5523 20.5523 13 20 13H17C16.4477 13 16 12.5523 16 12C16 11.4477 16.4477 11 17 11H20ZM19 9C19 8.44772 18.5523 8 18 8H17C16.4477 8 16 8.44772 16 9C16 9.55228 16.4477 10 17 10H18C18.5523 10 19 9.55228 19 9ZM20 5C20.5523 5 21 5.44772 21 6C21 6.55228 20.5523 7 20 7H17C16.4477 7 16 6.55228 16 6C16 5.44772 16.4477 5 17 5H20ZM19 3C19 2.44772 18.5523 2 18 2H17C16.4477 2 16 2.44772 16 3C16 3.55228 16.4477 4 17 4H18C18.5523 4 19 3.55228 19 3Z" }) }),
|
|
103
103
|
/* @__PURE__ */ jsx("p", { style: { margin: 0, fontSize: tokens.typography.body[2].fontSize }, children: "No thermal data available" })
|
|
104
104
|
]
|
|
105
105
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThermalHeatmapCard.js","sources":["../../../src/react/visualizations/ThermalHeatmapCard.tsx"],"sourcesContent":["/**\n * @zendir/ui - ThermalHeatmapCard Component\n * \n * Spacecraft thermal visualization with \"paper doll\" view showing\n * temperature of each component with color-coded ranges.\n * \n * AstroUXDS Compliance:\n * - Uses status colors appropriately (temperature = status indicator)\n * - Standby (cyan) = Too cold\n * - Normal (green) = Within cool range\n * - Caution (yellow) = Within warm range \n * - Critical (red) = Too hot\n * - Heater indicators use caution color per status semantics\n * \n * Features:\n * - Full null-safety with graceful fallbacks\n * - Color-coded temperature display\n * - Heater status indicators\n * - Loading and empty states\n */\n\nimport React, { memo, useMemo } from 'react';\nimport { useTheme } from '../theme';\nimport {\n safeNumber,\n formatTemperature,\n classNames,\n type StatusLevel,\n} from '../utils';\n\nexport interface ComponentThermal {\n id: string;\n name: string;\n /** Temperature in Celsius */\n temperatureCelsius: number;\n /** Minimum safe temperature */\n minSafeCelsius: number;\n /** Maximum safe temperature */\n maxSafeCelsius: number;\n /** Heater active status */\n heaterActive?: boolean;\n}\n\nexport interface ThermalHeatmapCardProps {\n /** Component thermal data */\n components?: ComponentThermal[];\n /** Average spacecraft temperature */\n averageTemperature?: number;\n /** Compact mode (fewer items) */\n compact?: boolean;\n /** Loading state */\n loading?: boolean;\n /** Custom class name */\n className?: string;\n}\n\n\n/**\n * Get status text and level\n */\nfunction getThermalStatus(\n temp: number | undefined,\n min: number,\n max: number\n): { text: string; level: StatusLevel } {\n if (temp === undefined || !Number.isFinite(temp)) return { text: '--', level: 'off' };\n if (temp < min) return { text: 'COLD', level: 'standby' };\n if (temp > max) return { text: 'HOT', level: 'critical' };\n return { text: 'OK', level: 'normal' };\n}\n\n/**\n * ThermalHeatmapCard - Displays spacecraft thermal status\n * \n * @example\n * ```tsx\n * <ThermalHeatmapCard\n * components={thermalComponents}\n * averageTemperature={22.5}\n * />\n * ```\n */\nexport const ThermalHeatmapCard = memo(function ThermalHeatmapCard({\n components,\n averageTemperature,\n compact = false,\n loading = false,\n className = '',\n}: ThermalHeatmapCardProps): React.ReactElement {\n const { tokens, theme, prefersReducedMotion } = useTheme();\n const isTransparentTheme = theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\n // Use transparent background with blur for transparent themes (matching Timeline)\n const cardBg = isTransparentTheme ? 'transparent' : tokens.colors.background.surface;\n const cardGlass = isTransparentTheme ? { \n backdropFilter: 'blur(12px)' as const, \n WebkitBackdropFilter: 'blur(12px)' as const,\n } : {};\n\n // Sort components by name\n const sortedComponents = useMemo(() => {\n if (!components) return [];\n return [...components].sort((a, b) => a.name.localeCompare(b.name));\n }, [components]);\n\n // Calculate overall status\n const hasWarning = useMemo(() => {\n if (!components) return false;\n return components.some((c) => {\n const temp = c.temperatureCelsius;\n return Number.isFinite(temp) && (temp < c.minSafeCelsius || temp > c.maxSafeCelsius);\n });\n }, [components]);\n\n // Count active heaters\n const activeHeaterCount = useMemo(() => {\n if (!components) return 0;\n return components.filter((c) => c.heaterActive).length;\n }, [components]);\n\n const transitionDuration = prefersReducedMotion ? '0ms' : '200ms';\n // Medium-soft status colors (readable, not too pale)\n const statusColors: Record<StatusLevel, string> = {\n normal: '#6ed86e',\n caution: '#ffd54f',\n serious: '#ffa726',\n critical: '#e57373',\n off: '#90a4ae',\n standby: '#4fc3f7',\n };\n\n // Loading state\n if (loading) {\n return (\n <div\n className={classNames('zendir-thermal-heatmap-card', 'loading', className)}\n role=\"article\"\n aria-busy=\"true\"\n aria-label=\"Loading thermal data\"\n style={{\n backgroundColor: cardBg,\n ...cardGlass,\n border: 'none',\n borderRadius: tokens.borderRadius.lg,\n padding: tokens.spacing.md,\n minHeight: 200,\n }}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 16 }}>\n <div style={{ height: 24, width: '40%', backgroundColor: 'rgba(255,255,255,0.1)', borderRadius: 4 }} />\n <div style={{ height: 24, width: 60, backgroundColor: 'rgba(255,255,255,0.1)', borderRadius: 4 }} />\n </div>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: 8 }}>\n {[1, 2, 3, 4, 5, 6].map((i) => (\n <div\n key={i}\n style={{\n height: 64,\n backgroundColor: 'rgba(255,255,255,0.06)',\n borderRadius: 8,\n }}\n />\n ))}\n </div>\n </div>\n );\n }\n\n // Empty state\n if (!components || components.length === 0) {\n return (\n <div\n className={classNames('zendir-thermal-heatmap-card', 'empty', className)}\n role=\"article\"\n aria-label=\"No thermal data\"\n style={{\n backgroundColor: cardBg,\n ...cardGlass,\n border: 'none',\n borderRadius: tokens.borderRadius.lg,\n padding: tokens.spacing.lg,\n textAlign: 'center',\n color: tokens.colors.text.tertiary,\n }}\n >\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style={{ opacity: 0.5, marginBottom: 8 }}>\n <path d=\"M15 13V5c0-1.66-1.34-3-3-3S9 3.34 9 5v8c-1.21.91-2 2.37-2 4 0 2.76 2.24 5 5 5s5-2.24 5-5c0-1.63-.79-3.09-2-4zm-4-8c0-.55.45-1 1-1s1 .45 1 1h-1v1h1v2h-1v1h1v2h-2V5z\" />\n </svg>\n <p style={{ margin: 0, fontSize: tokens.typography.body[2].fontSize }}>No thermal data available</p>\n </div>\n );\n }\n\n const getTempColor = (temp: number | undefined, min: number, max: number) => {\n if (temp === undefined || !Number.isFinite(temp)) return statusColors.off;\n const mid = (max + min) / 2;\n if (temp < min) return statusColors.standby;\n if (temp > max) return statusColors.critical;\n if (temp > mid + (max - mid) * 0.5) return statusColors.caution;\n return statusColors.normal;\n };\n const overallStatusColor = hasWarning ? statusColors.critical : statusColors.normal;\n\n return (\n <article\n className={classNames('zendir-thermal-heatmap-card', className)}\n aria-label=\"Spacecraft thermal status\"\n style={{\n backgroundColor: cardBg,\n ...cardGlass,\n border: 'none',\n borderRadius: tokens.borderRadius.lg,\n padding: tokens.spacing.md,\n fontFamily: tokens.typography.fontFamily.primary,\n color: tokens.colors.text.primary,\n }}\n >\n {/* Header */}\n {!compact && (\n <header\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n marginBottom: tokens.spacing.md,\n }}\n >\n <div>\n <h3\n style={{\n margin: 0,\n fontSize: tokens.typography.fontSize.md,\n fontWeight: tokens.typography.fontWeight.semibold,\n }}\n >\n Thermal Status\n </h3>\n <p\n style={{\n margin: '2px 0 0 0',\n fontSize: tokens.typography.fontSize.xs,\n color: tokens.colors.text.tertiary,\n }}\n >\n {components.length} zones • Avg{' '}\n <span style={{ fontFamily: tokens.typography.fontFamily.mono }}>\n {formatTemperature(averageTemperature)}\n </span>\n </p>\n </div>\n <span\n role=\"status\"\n style={{\n padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\n borderRadius: tokens.borderRadius.sm,\n fontSize: tokens.typography.fontSize.xxs, // 0.625rem / 10px (AstroUXDS compact)\n fontWeight: tokens.typography.fontWeight.medium, // 500 (AstroUXDS medium)\n backgroundColor: `${overallStatusColor}20`,\n color: overallStatusColor,\n }}\n >\n {hasWarning ? 'Warning' : 'Nominal'}\n </span>\n </header>\n )}\n\n {/* Thermal Grid */}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(3, 1fr)',\n gap: tokens.spacing.sm,\n }}\n >\n {sortedComponents.slice(0, compact ? 6 : 9).map((component) => {\n const color = getTempColor(\n component.temperatureCelsius,\n component.minSafeCelsius,\n component.maxSafeCelsius\n );\n const status = getThermalStatus(\n component.temperatureCelsius,\n component.minSafeCelsius,\n component.maxSafeCelsius\n );\n\n return (\n <div\n key={component.id}\n style={{\n position: 'relative',\n borderRadius: tokens.borderRadius.md,\n padding: tokens.spacing.sm,\n textAlign: 'center',\n transition: `transform ${transitionDuration}`,\n backgroundColor: `${color}22`,\n borderLeft: `3px solid ${color}`,\n }}\n >\n {/* Heater indicator */}\n {component.heaterActive && (\n <div\n title=\"Heater Active\"\n style={{\n position: 'absolute',\n top: 4,\n right: 4,\n width: 8,\n height: 8,\n backgroundColor: statusColors.caution,\n borderRadius: '50%',\n animation: prefersReducedMotion ? 'none' : 'heaterPulse 1s ease-in-out infinite',\n }}\n />\n )}\n\n {/* Component name */}\n <div\n style={{\n fontSize: tokens.typography.fontSize.xxs, // 0.625rem / 10px (AstroUXDS compact)\n color: tokens.colors.text.tertiary,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n marginBottom: 2,\n }}\n >\n {component.name}\n </div>\n\n {/* Temperature */}\n <div\n style={{\n fontSize: tokens.typography.fontSize.lg,\n fontWeight: tokens.typography.fontWeight.bold,\n fontFamily: tokens.typography.fontFamily.mono,\n fontVariantNumeric: 'tabular-nums',\n color,\n }}\n >\n {safeNumber(component.temperatureCelsius, 0)}°\n </div>\n\n {/* Status */}\n <div\n style={{\n fontSize: tokens.typography.fontSize.micro, // 0.5625rem / 9px (AstroUXDS micro)\n fontWeight: tokens.typography.fontWeight.medium, // 500 (AstroUXDS medium)\n color: statusColors[status.level] || statusColors.off,\n }}\n >\n {status.text}\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Legend */}\n <div\n style={{\n marginTop: tokens.spacing.md,\n paddingTop: tokens.spacing.md,\n borderTop: `1px solid ${tokens.colors.border.muted}`,\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n fontSize: tokens.typography.fontSize.xxs, // 0.625rem / 10px (AstroUXDS compact)\n }}\n >\n <span style={{ color: statusColors.standby }}>Cold</span>\n <div\n style={{\n flex: 1,\n margin: `0 ${tokens.spacing.sm}`,\n height: 8,\n borderRadius: 4,\n background: `linear-gradient(to right, ${statusColors.standby}, ${statusColors.normal}, ${statusColors.caution}, ${statusColors.critical})`,\n }}\n />\n <span style={{ color: statusColors.critical }}>Hot</span>\n </div>\n\n {/* Active heaters */}\n {activeHeaterCount > 0 && (\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n fontSize: tokens.typography.fontSize.xs,\n marginTop: tokens.spacing.sm,\n }}\n >\n <span style={{ color: tokens.colors.text.tertiary }}>Active Heaters</span>\n <span\n style={{\n color: statusColors.caution,\n fontFamily: tokens.typography.fontFamily.mono,\n }}\n >\n {activeHeaterCount}/{components.length}\n </span>\n </div>\n )}\n </div>\n\n {/* Keyframe animation */}\n <style>{`\n @keyframes heaterPulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n `}</style>\n </article>\n );\n});\n"],"names":["ThermalHeatmapCard"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ThermalHeatmapCard.js","sources":["../../../src/react/visualizations/ThermalHeatmapCard.tsx"],"sourcesContent":["/**\n * @zendir/ui - ThermalHeatmapCard Component\n * \n * Spacecraft thermal visualization with \"paper doll\" view showing\n * temperature of each component with color-coded ranges.\n * \n * AstroUXDS Compliance:\n * - Uses status colors appropriately (temperature = status indicator)\n * - Standby (cyan) = Too cold\n * - Normal (green) = Within cool range\n * - Caution (yellow) = Within warm range \n * - Critical (red) = Too hot\n * - Heater indicators use caution color per status semantics\n * \n * Features:\n * - Full null-safety with graceful fallbacks\n * - Color-coded temperature display\n * - Heater status indicators\n * - Loading and empty states\n */\n\nimport React, { memo, useMemo } from 'react';\nimport { useTheme } from '../theme';\nimport {\n safeNumber,\n formatTemperature,\n classNames,\n type StatusLevel,\n} from '../utils';\n\nexport interface ComponentThermal {\n id: string;\n name: string;\n /** Temperature in Celsius */\n temperatureCelsius: number;\n /** Minimum safe temperature */\n minSafeCelsius: number;\n /** Maximum safe temperature */\n maxSafeCelsius: number;\n /** Heater active status */\n heaterActive?: boolean;\n}\n\nexport interface ThermalHeatmapCardProps {\n /** Component thermal data */\n components?: ComponentThermal[];\n /** Average spacecraft temperature */\n averageTemperature?: number;\n /** Compact mode (fewer items) */\n compact?: boolean;\n /** Loading state */\n loading?: boolean;\n /** Custom class name */\n className?: string;\n}\n\n\n/**\n * Get status text and level\n */\nfunction getThermalStatus(\n temp: number | undefined,\n min: number,\n max: number\n): { text: string; level: StatusLevel } {\n if (temp === undefined || !Number.isFinite(temp)) return { text: '--', level: 'off' };\n if (temp < min) return { text: 'COLD', level: 'standby' };\n if (temp > max) return { text: 'HOT', level: 'critical' };\n return { text: 'OK', level: 'normal' };\n}\n\n/**\n * ThermalHeatmapCard - Displays spacecraft thermal status\n * \n * @example\n * ```tsx\n * <ThermalHeatmapCard\n * components={thermalComponents}\n * averageTemperature={22.5}\n * />\n * ```\n */\nexport const ThermalHeatmapCard = memo(function ThermalHeatmapCard({\n components,\n averageTemperature,\n compact = false,\n loading = false,\n className = '',\n}: ThermalHeatmapCardProps): React.ReactElement {\n const { tokens, theme, prefersReducedMotion } = useTheme();\n const isTransparentTheme = theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\n // Use transparent background with blur for transparent themes (matching Timeline)\n const cardBg = isTransparentTheme ? 'transparent' : tokens.colors.background.surface;\n const cardGlass = isTransparentTheme ? { \n backdropFilter: 'blur(12px)' as const, \n WebkitBackdropFilter: 'blur(12px)' as const,\n } : {};\n\n // Sort components by name\n const sortedComponents = useMemo(() => {\n if (!components) return [];\n return [...components].sort((a, b) => a.name.localeCompare(b.name));\n }, [components]);\n\n // Calculate overall status\n const hasWarning = useMemo(() => {\n if (!components) return false;\n return components.some((c) => {\n const temp = c.temperatureCelsius;\n return Number.isFinite(temp) && (temp < c.minSafeCelsius || temp > c.maxSafeCelsius);\n });\n }, [components]);\n\n // Count active heaters\n const activeHeaterCount = useMemo(() => {\n if (!components) return 0;\n return components.filter((c) => c.heaterActive).length;\n }, [components]);\n\n const transitionDuration = prefersReducedMotion ? '0ms' : '200ms';\n // Medium-soft status colors (readable, not too pale)\n const statusColors: Record<StatusLevel, string> = {\n normal: '#6ed86e',\n caution: '#ffd54f',\n serious: '#ffa726',\n critical: '#e57373',\n off: '#90a4ae',\n standby: '#4fc3f7',\n };\n\n // Loading state\n if (loading) {\n return (\n <div\n className={classNames('zendir-thermal-heatmap-card', 'loading', className)}\n role=\"article\"\n aria-busy=\"true\"\n aria-label=\"Loading thermal data\"\n style={{\n backgroundColor: cardBg,\n ...cardGlass,\n border: 'none',\n borderRadius: tokens.borderRadius.lg,\n padding: tokens.spacing.md,\n minHeight: 200,\n }}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 16 }}>\n <div style={{ height: 24, width: '40%', backgroundColor: 'rgba(255,255,255,0.1)', borderRadius: 4 }} />\n <div style={{ height: 24, width: 60, backgroundColor: 'rgba(255,255,255,0.1)', borderRadius: 4 }} />\n </div>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: 8 }}>\n {[1, 2, 3, 4, 5, 6].map((i) => (\n <div\n key={i}\n style={{\n height: 64,\n backgroundColor: 'rgba(255,255,255,0.06)',\n borderRadius: 8,\n }}\n />\n ))}\n </div>\n </div>\n );\n }\n\n // Empty state\n if (!components || components.length === 0) {\n return (\n <div\n className={classNames('zendir-thermal-heatmap-card', 'empty', className)}\n role=\"article\"\n aria-label=\"No thermal data\"\n style={{\n backgroundColor: cardBg,\n ...cardGlass,\n border: 'none',\n borderRadius: tokens.borderRadius.lg,\n padding: tokens.spacing.lg,\n textAlign: 'center',\n color: tokens.colors.text.tertiary,\n }}\n >\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style={{ opacity: 0.5, marginBottom: 8 }}>\n <path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M10.5 2C12.433 2 14 3.567 14 5.5L14.0005 12.2576C15.2217 13.2664 16 14.7923 16 16.5C16 19.5376 13.5376 22 10.5 22C7.46243 22 5 19.5376 5 16.5C5 14.7919 5.77868 13.2656 7.00044 12.2568L7 5.5C7 3.567 8.567 2 10.5 2ZM10.5 4C9.7203 4 9.07955 4.59489 9.00687 5.35543L9 5.49987L9.0005 13.199L8.27384 13.799C7.47135 14.4616 7 15.4402 7 16.5C7 18.433 8.567 20 10.5 20C12.433 20 14 18.433 14 16.5C14 15.5111 13.5896 14.593 12.8828 13.9362L12.7268 13.7995L12.0006 13.1997L12 5.5C12 4.7203 11.4051 4.07955 10.6445 4.00687L10.5 4ZM11 5.5C11 5.22386 10.7761 5 10.5 5C10.2239 5 10 5.22386 10 5.5L10.0006 14.0499C8.85917 14.2813 8 15.2903 8 16.5C8 17.8807 9.11929 19 10.5 19C11.8807 19 13 17.8807 13 16.5C13 15.2907 12.1413 14.2819 11.0004 14.0501L11 5.5ZM20 11C20.5523 11 21 11.4477 21 12C21 12.5523 20.5523 13 20 13H17C16.4477 13 16 12.5523 16 12C16 11.4477 16.4477 11 17 11H20ZM19 9C19 8.44772 18.5523 8 18 8H17C16.4477 8 16 8.44772 16 9C16 9.55228 16.4477 10 17 10H18C18.5523 10 19 9.55228 19 9ZM20 5C20.5523 5 21 5.44772 21 6C21 6.55228 20.5523 7 20 7H17C16.4477 7 16 6.55228 16 6C16 5.44772 16.4477 5 17 5H20ZM19 3C19 2.44772 18.5523 2 18 2H17C16.4477 2 16 2.44772 16 3C16 3.55228 16.4477 4 17 4H18C18.5523 4 19 3.55228 19 3Z\" />\n </svg>\n <p style={{ margin: 0, fontSize: tokens.typography.body[2].fontSize }}>No thermal data available</p>\n </div>\n );\n }\n\n const getTempColor = (temp: number | undefined, min: number, max: number) => {\n if (temp === undefined || !Number.isFinite(temp)) return statusColors.off;\n const mid = (max + min) / 2;\n if (temp < min) return statusColors.standby;\n if (temp > max) return statusColors.critical;\n if (temp > mid + (max - mid) * 0.5) return statusColors.caution;\n return statusColors.normal;\n };\n const overallStatusColor = hasWarning ? statusColors.critical : statusColors.normal;\n\n return (\n <article\n className={classNames('zendir-thermal-heatmap-card', className)}\n aria-label=\"Spacecraft thermal status\"\n style={{\n backgroundColor: cardBg,\n ...cardGlass,\n border: 'none',\n borderRadius: tokens.borderRadius.lg,\n padding: tokens.spacing.md,\n fontFamily: tokens.typography.fontFamily.primary,\n color: tokens.colors.text.primary,\n }}\n >\n {/* Header */}\n {!compact && (\n <header\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n marginBottom: tokens.spacing.md,\n }}\n >\n <div>\n <h3\n style={{\n margin: 0,\n fontSize: tokens.typography.fontSize.md,\n fontWeight: tokens.typography.fontWeight.semibold,\n }}\n >\n Thermal Status\n </h3>\n <p\n style={{\n margin: '2px 0 0 0',\n fontSize: tokens.typography.fontSize.xs,\n color: tokens.colors.text.tertiary,\n }}\n >\n {components.length} zones • Avg{' '}\n <span style={{ fontFamily: tokens.typography.fontFamily.mono }}>\n {formatTemperature(averageTemperature)}\n </span>\n </p>\n </div>\n <span\n role=\"status\"\n style={{\n padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\n borderRadius: tokens.borderRadius.sm,\n fontSize: tokens.typography.fontSize.xxs, // 0.625rem / 10px (AstroUXDS compact)\n fontWeight: tokens.typography.fontWeight.medium, // 500 (AstroUXDS medium)\n backgroundColor: `${overallStatusColor}20`,\n color: overallStatusColor,\n }}\n >\n {hasWarning ? 'Warning' : 'Nominal'}\n </span>\n </header>\n )}\n\n {/* Thermal Grid */}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(3, 1fr)',\n gap: tokens.spacing.sm,\n }}\n >\n {sortedComponents.slice(0, compact ? 6 : 9).map((component) => {\n const color = getTempColor(\n component.temperatureCelsius,\n component.minSafeCelsius,\n component.maxSafeCelsius\n );\n const status = getThermalStatus(\n component.temperatureCelsius,\n component.minSafeCelsius,\n component.maxSafeCelsius\n );\n\n return (\n <div\n key={component.id}\n style={{\n position: 'relative',\n borderRadius: tokens.borderRadius.md,\n padding: tokens.spacing.sm,\n textAlign: 'center',\n transition: `transform ${transitionDuration}`,\n backgroundColor: `${color}22`,\n borderLeft: `3px solid ${color}`,\n }}\n >\n {/* Heater indicator */}\n {component.heaterActive && (\n <div\n title=\"Heater Active\"\n style={{\n position: 'absolute',\n top: 4,\n right: 4,\n width: 8,\n height: 8,\n backgroundColor: statusColors.caution,\n borderRadius: '50%',\n animation: prefersReducedMotion ? 'none' : 'heaterPulse 1s ease-in-out infinite',\n }}\n />\n )}\n\n {/* Component name */}\n <div\n style={{\n fontSize: tokens.typography.fontSize.xxs, // 0.625rem / 10px (AstroUXDS compact)\n color: tokens.colors.text.tertiary,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n marginBottom: 2,\n }}\n >\n {component.name}\n </div>\n\n {/* Temperature */}\n <div\n style={{\n fontSize: tokens.typography.fontSize.lg,\n fontWeight: tokens.typography.fontWeight.bold,\n fontFamily: tokens.typography.fontFamily.mono,\n fontVariantNumeric: 'tabular-nums',\n color,\n }}\n >\n {safeNumber(component.temperatureCelsius, 0)}°\n </div>\n\n {/* Status */}\n <div\n style={{\n fontSize: tokens.typography.fontSize.micro, // 0.5625rem / 9px (AstroUXDS micro)\n fontWeight: tokens.typography.fontWeight.medium, // 500 (AstroUXDS medium)\n color: statusColors[status.level] || statusColors.off,\n }}\n >\n {status.text}\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Legend */}\n <div\n style={{\n marginTop: tokens.spacing.md,\n paddingTop: tokens.spacing.md,\n borderTop: `1px solid ${tokens.colors.border.muted}`,\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n fontSize: tokens.typography.fontSize.xxs, // 0.625rem / 10px (AstroUXDS compact)\n }}\n >\n <span style={{ color: statusColors.standby }}>Cold</span>\n <div\n style={{\n flex: 1,\n margin: `0 ${tokens.spacing.sm}`,\n height: 8,\n borderRadius: 4,\n background: `linear-gradient(to right, ${statusColors.standby}, ${statusColors.normal}, ${statusColors.caution}, ${statusColors.critical})`,\n }}\n />\n <span style={{ color: statusColors.critical }}>Hot</span>\n </div>\n\n {/* Active heaters */}\n {activeHeaterCount > 0 && (\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n fontSize: tokens.typography.fontSize.xs,\n marginTop: tokens.spacing.sm,\n }}\n >\n <span style={{ color: tokens.colors.text.tertiary }}>Active Heaters</span>\n <span\n style={{\n color: statusColors.caution,\n fontFamily: tokens.typography.fontFamily.mono,\n }}\n >\n {activeHeaterCount}/{components.length}\n </span>\n </div>\n )}\n </div>\n\n {/* Keyframe animation */}\n <style>{`\n @keyframes heaterPulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n `}</style>\n </article>\n );\n});\n"],"names":["ThermalHeatmapCard"],"mappings":"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"}
|