@matteoaliano/forest-ui 1.2.4 → 1.2.5

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/index.mjs CHANGED
@@ -38,7 +38,7 @@ import {
38
38
  toggleColors,
39
39
  warning,
40
40
  widths
41
- } from "./chunk-JYITTRWG.mjs";
41
+ } from "./chunk-B5MZMBLL.mjs";
42
42
 
43
43
  // src/provider/ForestProvider.tsx
44
44
  import { useMemo } from "react";
@@ -86,7 +86,7 @@ function Button({ variant = "contained", ...props }) {
86
86
  // src/components/ButtonGroup/index.tsx
87
87
  import MuiButtonGroup from "@mui/material/ButtonGroup";
88
88
  import { jsx as jsx3 } from "react/jsx-runtime";
89
- function ButtonGroup({ variant = "contained", ...props }) {
89
+ function ButtonGroup({ variant = "outlined", ...props }) {
90
90
  return /* @__PURE__ */ jsx3(MuiButtonGroup, { variant, ...props });
91
91
  }
92
92
 
@@ -838,15 +838,28 @@ var Logo = forwardRef(
838
838
  Logo.displayName = "Logo";
839
839
 
840
840
  // src/components/ToggleButton/index.tsx
841
+ import { createContext, useContext } from "react";
841
842
  import MuiToggleButton from "@mui/material/ToggleButton";
842
- import { default as default10 } from "@mui/material/ToggleButtonGroup";
843
+ import MuiToggleButtonGroup from "@mui/material/ToggleButtonGroup";
843
844
  import { jsx as jsx10 } from "react/jsx-runtime";
845
+ var ToggleButtonVariantContext = createContext(
846
+ void 0
847
+ );
848
+ function ToggleButtonGroup({
849
+ variant = "outlined",
850
+ ...props
851
+ }) {
852
+ return /* @__PURE__ */ jsx10(ToggleButtonVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsx10(MuiToggleButtonGroup, { ...props }) });
853
+ }
844
854
  function ToggleButton({
845
- variant = "contained",
855
+ variant,
846
856
  className,
847
857
  ...props
848
858
  }) {
849
- const cls = variant === "outlined" ? ["ForestToggleButton-outlined", className].filter(Boolean).join(" ") : className;
859
+ var _a;
860
+ const groupVariant = useContext(ToggleButtonVariantContext);
861
+ const resolved = (_a = variant != null ? variant : groupVariant) != null ? _a : "outlined";
862
+ const cls = resolved === "outlined" ? ["ForestToggleButton-outlined", className].filter(Boolean).join(" ") : className;
850
863
  return /* @__PURE__ */ jsx10(MuiToggleButton, { className: cls, ...props });
851
864
  }
852
865
 
@@ -860,31 +873,31 @@ function DatePicker(props) {
860
873
  }
861
874
 
862
875
  // src/components/FormControl/index.tsx
863
- import { default as default11 } from "@mui/material/FormControl";
864
- import { default as default12 } from "@mui/material/FormControlLabel";
865
- import { default as default13 } from "@mui/material/FormGroup";
866
- import { default as default14 } from "@mui/material/FormHelperText";
867
- import { default as default15 } from "@mui/material/FormLabel";
876
+ import { default as default10 } from "@mui/material/FormControl";
877
+ import { default as default11 } from "@mui/material/FormControlLabel";
878
+ import { default as default12 } from "@mui/material/FormGroup";
879
+ import { default as default13 } from "@mui/material/FormHelperText";
880
+ import { default as default14 } from "@mui/material/FormLabel";
868
881
 
869
882
  // src/components/InputAdornment/index.tsx
870
- import { default as default16 } from "@mui/material/InputAdornment";
883
+ import { default as default15 } from "@mui/material/InputAdornment";
871
884
 
872
885
  // src/components/InputBase/index.tsx
873
- import { default as default17 } from "@mui/material/InputBase";
886
+ import { default as default16 } from "@mui/material/InputBase";
874
887
 
875
888
  // src/components/InputLabel/index.tsx
876
- import { default as default18 } from "@mui/material/InputLabel";
889
+ import { default as default17 } from "@mui/material/InputLabel";
877
890
 
878
891
  // src/components/OutlinedInput/index.tsx
879
- import { default as default19 } from "@mui/material/OutlinedInput";
880
- import { default as default20 } from "@mui/material/FilledInput";
892
+ import { default as default18 } from "@mui/material/OutlinedInput";
893
+ import { default as default19 } from "@mui/material/FilledInput";
881
894
 
882
895
  // src/components/Avatar/index.tsx
883
- import { default as default21 } from "@mui/material/Avatar";
884
- import { default as default22 } from "@mui/material/AvatarGroup";
896
+ import { default as default20 } from "@mui/material/Avatar";
897
+ import { default as default21 } from "@mui/material/AvatarGroup";
885
898
 
886
899
  // src/components/Badge/index.tsx
887
- import { default as default23 } from "@mui/material/Badge";
900
+ import { default as default22 } from "@mui/material/Badge";
888
901
 
889
902
  // src/components/Chip/index.tsx
890
903
  import MuiChip from "@mui/material/Chip";
@@ -958,36 +971,36 @@ function Chip({ color, deleteIcon = /* @__PURE__ */ jsx12(CloseIcon, {}), sx, ..
958
971
  }
959
972
 
960
973
  // src/components/Divider/index.tsx
961
- import { default as default24 } from "@mui/material/Divider";
974
+ import { default as default23 } from "@mui/material/Divider";
962
975
 
963
976
  // src/components/ImageList/index.tsx
964
- import { default as default25 } from "@mui/material/ImageList";
965
- import { default as default26 } from "@mui/material/ImageListItem";
966
- import { default as default27 } from "@mui/material/ImageListItemBar";
977
+ import { default as default24 } from "@mui/material/ImageList";
978
+ import { default as default25 } from "@mui/material/ImageListItem";
979
+ import { default as default26 } from "@mui/material/ImageListItemBar";
967
980
 
968
981
  // src/components/List/index.tsx
969
- import { default as default28 } from "@mui/material/List";
970
- import { default as default29 } from "@mui/material/ListItem";
971
- import { default as default30 } from "@mui/material/ListItemButton";
972
- import { default as default31 } from "@mui/material/ListItemIcon";
973
- import { default as default32 } from "@mui/material/ListItemText";
974
- import { default as default33 } from "@mui/material/ListItemAvatar";
975
- import { default as default34 } from "@mui/material/ListSubheader";
976
- import { default as default35 } from "@mui/material/ListItemSecondaryAction";
982
+ import { default as default27 } from "@mui/material/List";
983
+ import { default as default28 } from "@mui/material/ListItem";
984
+ import { default as default29 } from "@mui/material/ListItemButton";
985
+ import { default as default30 } from "@mui/material/ListItemIcon";
986
+ import { default as default31 } from "@mui/material/ListItemText";
987
+ import { default as default32 } from "@mui/material/ListItemAvatar";
988
+ import { default as default33 } from "@mui/material/ListSubheader";
989
+ import { default as default34 } from "@mui/material/ListItemSecondaryAction";
977
990
 
978
991
  // src/components/Rating/index.tsx
979
- import { default as default36 } from "@mui/material/Rating";
992
+ import { default as default35 } from "@mui/material/Rating";
980
993
 
981
994
  // src/components/Table/index.tsx
982
- import { default as default37 } from "@mui/material/Table";
983
- import { default as default38 } from "@mui/material/TableBody";
984
- import { default as default39 } from "@mui/material/TableCell";
985
- import { default as default40 } from "@mui/material/TableContainer";
986
- import { default as default41 } from "@mui/material/TableHead";
987
- import { default as default42 } from "@mui/material/TableRow";
988
- import { default as default43 } from "@mui/material/TableFooter";
989
- import { default as default44 } from "@mui/material/TablePagination";
990
- import { default as default45 } from "@mui/material/TableSortLabel";
995
+ import { default as default36 } from "@mui/material/Table";
996
+ import { default as default37 } from "@mui/material/TableBody";
997
+ import { default as default38 } from "@mui/material/TableCell";
998
+ import { default as default39 } from "@mui/material/TableContainer";
999
+ import { default as default40 } from "@mui/material/TableHead";
1000
+ import { default as default41 } from "@mui/material/TableRow";
1001
+ import { default as default42 } from "@mui/material/TableFooter";
1002
+ import { default as default43 } from "@mui/material/TablePagination";
1003
+ import { default as default44 } from "@mui/material/TableSortLabel";
991
1004
 
992
1005
  // src/components/DataGrid/index.tsx
993
1006
  import { DataGrid } from "@mui/x-data-grid";
@@ -1000,18 +1013,18 @@ function Tooltip({ arrow = true, ...props }) {
1000
1013
  }
1001
1014
 
1002
1015
  // src/components/Typography/index.tsx
1003
- import { default as default46 } from "@mui/material/Typography";
1016
+ import { default as default45 } from "@mui/material/Typography";
1004
1017
 
1005
1018
  // src/components/Accordion/index.tsx
1006
- import { default as default47 } from "@mui/material/Accordion";
1007
- import { default as default48 } from "@mui/material/AccordionSummary";
1008
- import { default as default49 } from "@mui/material/AccordionDetails";
1009
- import { default as default50 } from "@mui/material/AccordionActions";
1019
+ import { default as default46 } from "@mui/material/Accordion";
1020
+ import { default as default47 } from "@mui/material/AccordionSummary";
1021
+ import { default as default48 } from "@mui/material/AccordionDetails";
1022
+ import { default as default49 } from "@mui/material/AccordionActions";
1010
1023
 
1011
1024
  // src/components/AppBar/index.tsx
1012
1025
  import MuiButton3 from "@mui/material/Button";
1013
- import { default as default51 } from "@mui/material/AppBar";
1014
- import { default as default52 } from "@mui/material/Toolbar";
1026
+ import { default as default50 } from "@mui/material/AppBar";
1027
+ import { default as default51 } from "@mui/material/Toolbar";
1015
1028
  import { jsx as jsx14 } from "react/jsx-runtime";
1016
1029
  function AppBarNavItem({
1017
1030
  label,
@@ -1068,10 +1081,10 @@ function AppBarNavItem({
1068
1081
 
1069
1082
  // src/components/Card/index.tsx
1070
1083
  import MuiCard from "@mui/material/Card";
1071
- import { default as default53 } from "@mui/material/CardContent";
1072
- import { default as default54 } from "@mui/material/CardHeader";
1073
- import { default as default55 } from "@mui/material/CardActions";
1074
- import { default as default56 } from "@mui/material/CardMedia";
1084
+ import { default as default52 } from "@mui/material/CardContent";
1085
+ import { default as default53 } from "@mui/material/CardHeader";
1086
+ import { default as default54 } from "@mui/material/CardActions";
1087
+ import { default as default55 } from "@mui/material/CardMedia";
1075
1088
  import { jsx as jsx15 } from "react/jsx-runtime";
1076
1089
  function Card({ color = "primary", sx, ...props }) {
1077
1090
  return /* @__PURE__ */ jsx15(
@@ -1079,7 +1092,12 @@ function Card({ color = "primary", sx, ...props }) {
1079
1092
  {
1080
1093
  ...props,
1081
1094
  sx: [
1082
- color === "secondary" && { backgroundColor: "background.paper" },
1095
+ color === "secondary" && {
1096
+ backgroundColor: "background.paper",
1097
+ // Also hand the surface to a wrapped CardActionArea, which paints the
1098
+ // card's background itself (the Card goes transparent around one).
1099
+ "--forest-card-surface": "var(--mui-palette-background-paper)"
1100
+ },
1083
1101
  ...Array.isArray(sx) ? sx : [sx]
1084
1102
  ]
1085
1103
  }
@@ -1087,42 +1105,42 @@ function Card({ color = "primary", sx, ...props }) {
1087
1105
  }
1088
1106
 
1089
1107
  // src/components/CardActionArea/index.tsx
1090
- import { default as default57 } from "@mui/material/CardActionArea";
1108
+ import { default as default56 } from "@mui/material/CardActionArea";
1091
1109
 
1092
1110
  // src/components/Drawer/index.tsx
1093
1111
  import MuiDrawer from "@mui/material/Drawer";
1094
- import { default as default58 } from "@mui/material/SwipeableDrawer";
1112
+ import { default as default57 } from "@mui/material/SwipeableDrawer";
1095
1113
  import { jsx as jsx16 } from "react/jsx-runtime";
1096
1114
  function Drawer({ anchor = "right", hideBackdrop = true, ...props }) {
1097
1115
  return /* @__PURE__ */ jsx16(MuiDrawer, { anchor, hideBackdrop, ...props });
1098
1116
  }
1099
1117
 
1100
1118
  // src/components/Paper/index.tsx
1101
- import { default as default59 } from "@mui/material/Paper";
1119
+ import { default as default58 } from "@mui/material/Paper";
1102
1120
 
1103
1121
  // src/components/Alert/index.tsx
1104
- import { default as default60 } from "@mui/material/Alert";
1105
- import { default as default61 } from "@mui/material/AlertTitle";
1122
+ import { default as default59 } from "@mui/material/Alert";
1123
+ import { default as default60 } from "@mui/material/AlertTitle";
1106
1124
 
1107
1125
  // src/components/Backdrop/index.tsx
1108
- import { default as default62 } from "@mui/material/Backdrop";
1126
+ import { default as default61 } from "@mui/material/Backdrop";
1109
1127
 
1110
1128
  // src/components/Dialog/index.tsx
1111
- import { default as default63 } from "@mui/material/Dialog";
1112
- import { default as default64 } from "@mui/material/DialogTitle";
1113
- import { default as default65 } from "@mui/material/DialogContent";
1114
- import { default as default66 } from "@mui/material/DialogActions";
1115
- import { default as default67 } from "@mui/material/DialogContentText";
1129
+ import { default as default62 } from "@mui/material/Dialog";
1130
+ import { default as default63 } from "@mui/material/DialogTitle";
1131
+ import { default as default64 } from "@mui/material/DialogContent";
1132
+ import { default as default65 } from "@mui/material/DialogActions";
1133
+ import { default as default66 } from "@mui/material/DialogContentText";
1116
1134
 
1117
1135
  // src/components/Progress/index.tsx
1118
- import { default as default68 } from "@mui/material/LinearProgress";
1119
- import { default as default69 } from "@mui/material/CircularProgress";
1136
+ import { default as default67 } from "@mui/material/LinearProgress";
1137
+ import { default as default68 } from "@mui/material/CircularProgress";
1120
1138
 
1121
1139
  // src/components/Skeleton/index.tsx
1122
- import { default as default70 } from "@mui/material/Skeleton";
1140
+ import { default as default69 } from "@mui/material/Skeleton";
1123
1141
 
1124
1142
  // src/components/Modal/index.tsx
1125
- import { default as default71 } from "@mui/material/Modal";
1143
+ import { default as default70 } from "@mui/material/Modal";
1126
1144
 
1127
1145
  // src/components/Popover/index.tsx
1128
1146
  import MuiPopover from "@mui/material/Popover";
@@ -1144,57 +1162,57 @@ function Popover({ slotProps, ...props }) {
1144
1162
  }
1145
1163
 
1146
1164
  // src/components/Snackbar/index.tsx
1147
- import { default as default72 } from "@mui/material/Snackbar";
1165
+ import { default as default71 } from "@mui/material/Snackbar";
1148
1166
 
1149
1167
  // src/components/SnackbarContent/index.tsx
1150
- import { default as default73 } from "@mui/material/SnackbarContent";
1168
+ import { default as default72 } from "@mui/material/SnackbarContent";
1151
1169
 
1152
1170
  // src/components/BottomNavigation/index.tsx
1153
- import { default as default74 } from "@mui/material/BottomNavigation";
1154
- import { default as default75 } from "@mui/material/BottomNavigationAction";
1171
+ import { default as default73 } from "@mui/material/BottomNavigation";
1172
+ import { default as default74 } from "@mui/material/BottomNavigationAction";
1155
1173
 
1156
1174
  // src/components/Breadcrumbs/index.tsx
1157
- import { default as default76 } from "@mui/material/Breadcrumbs";
1175
+ import { default as default75 } from "@mui/material/Breadcrumbs";
1158
1176
 
1159
1177
  // src/components/Link/index.tsx
1160
- import { default as default77 } from "@mui/material/Link";
1178
+ import { default as default76 } from "@mui/material/Link";
1161
1179
 
1162
1180
  // src/components/Menu/index.tsx
1163
- import { default as default78 } from "@mui/material/Menu";
1164
- import { default as default79 } from "@mui/material/MenuList";
1181
+ import { default as default77 } from "@mui/material/Menu";
1182
+ import { default as default78 } from "@mui/material/MenuList";
1165
1183
 
1166
1184
  // src/components/MobileStepper/index.tsx
1167
- import { default as default80 } from "@mui/material/MobileStepper";
1185
+ import { default as default79 } from "@mui/material/MobileStepper";
1168
1186
 
1169
1187
  // src/components/Pagination/index.tsx
1170
- import { default as default81 } from "@mui/material/Pagination";
1188
+ import { default as default80 } from "@mui/material/Pagination";
1171
1189
 
1172
1190
  // src/components/PaginationItem/index.tsx
1173
- import { default as default82 } from "@mui/material/PaginationItem";
1191
+ import { default as default81 } from "@mui/material/PaginationItem";
1174
1192
 
1175
1193
  // src/components/SpeedDial/index.tsx
1176
- import { default as default83 } from "@mui/material/SpeedDial";
1177
- import { default as default84 } from "@mui/material/SpeedDialAction";
1178
- import { default as default85 } from "@mui/material/SpeedDialIcon";
1194
+ import { default as default82 } from "@mui/material/SpeedDial";
1195
+ import { default as default83 } from "@mui/material/SpeedDialAction";
1196
+ import { default as default84 } from "@mui/material/SpeedDialIcon";
1179
1197
 
1180
1198
  // src/components/Stepper/index.tsx
1181
- import { default as default86 } from "@mui/material/Stepper";
1182
- import { default as default87 } from "@mui/material/Step";
1183
- import { default as default88 } from "@mui/material/StepLabel";
1184
- import { default as default89 } from "@mui/material/StepButton";
1185
- import { default as default90 } from "@mui/material/StepConnector";
1186
- import { default as default91 } from "@mui/material/StepContent";
1187
- import { default as default92 } from "@mui/material/StepIcon";
1199
+ import { default as default85 } from "@mui/material/Stepper";
1200
+ import { default as default86 } from "@mui/material/Step";
1201
+ import { default as default87 } from "@mui/material/StepLabel";
1202
+ import { default as default88 } from "@mui/material/StepButton";
1203
+ import { default as default89 } from "@mui/material/StepConnector";
1204
+ import { default as default90 } from "@mui/material/StepContent";
1205
+ import { default as default91 } from "@mui/material/StepIcon";
1188
1206
 
1189
1207
  // src/components/Tabs/index.tsx
1190
- import { default as default93 } from "@mui/material/Tabs";
1191
- import { default as default94 } from "@mui/material/Tab";
1208
+ import { default as default92 } from "@mui/material/Tabs";
1209
+ import { default as default93 } from "@mui/material/Tab";
1192
1210
 
1193
1211
  // src/components/TabScrollButton/index.tsx
1194
- import { default as default95 } from "@mui/material/TabScrollButton";
1212
+ import { default as default94 } from "@mui/material/TabScrollButton";
1195
1213
 
1196
1214
  // src/components/Sidebar/index.tsx
1197
- import { createContext, useContext } from "react";
1215
+ import { createContext as createContext2, useContext as useContext2, useEffect, useRef, useState as useState2 } from "react";
1198
1216
  import MuiDrawer2 from "@mui/material/Drawer";
1199
1217
  import Box2 from "@mui/material/Box";
1200
1218
  import ChevronLeftOutlined from "@mui/icons-material/ChevronLeftOutlined";
@@ -1204,14 +1222,15 @@ import ListItemIcon from "@mui/material/ListItemIcon";
1204
1222
  import ListItemText from "@mui/material/ListItemText";
1205
1223
  import MuiTooltip2 from "@mui/material/Tooltip";
1206
1224
  import { jsx as jsx18, jsxs as jsxs3 } from "react/jsx-runtime";
1207
- var SidebarContext = createContext({
1225
+ var SidebarContext = createContext2({
1208
1226
  open: true,
1209
1227
  collapsedWidth: 48,
1210
1228
  expandedWidth: 240
1211
1229
  });
1212
1230
  function useSidebar() {
1213
- return useContext(SidebarContext);
1231
+ return useContext2(SidebarContext);
1214
1232
  }
1233
+ var TOGGLE_SIZE = 28;
1215
1234
  function SidebarNav({
1216
1235
  open,
1217
1236
  onOpenChange,
@@ -1222,6 +1241,7 @@ function SidebarNav({
1222
1241
  children,
1223
1242
  header,
1224
1243
  footer,
1244
+ toggleEdgeAllowance = 12,
1225
1245
  sx,
1226
1246
  ...rest
1227
1247
  }) {
@@ -1229,6 +1249,60 @@ function SidebarNav({
1229
1249
  const drawerWidth = open ? expandedWidth : collapsedWidth;
1230
1250
  const layoutWidth = isHover ? collapsedWidth : drawerWidth;
1231
1251
  const shouldShowToggle = showToggle != null ? showToggle : !isHover;
1252
+ const wrapperRef = useRef(null);
1253
+ const toggleRef = useRef(null);
1254
+ const edgeYRef = useRef(null);
1255
+ const [edgeActive, setEdgeActive] = useState2(false);
1256
+ const [toggleFocused, setToggleFocused] = useState2(false);
1257
+ const writeY = (y) => {
1258
+ edgeYRef.current = y;
1259
+ if (y === null) return;
1260
+ const el = toggleRef.current;
1261
+ if (!el) return;
1262
+ el.style.top = "0px";
1263
+ el.style.transform = `translate3d(50%, ${y - TOGGLE_SIZE / 2}px, 0)`;
1264
+ };
1265
+ const resetY = () => {
1266
+ edgeYRef.current = null;
1267
+ const el = toggleRef.current;
1268
+ if (!el) return;
1269
+ el.style.top = "";
1270
+ el.style.transform = "";
1271
+ };
1272
+ useEffect(() => {
1273
+ if (!shouldShowToggle) return;
1274
+ const onMove = (e) => {
1275
+ const el = wrapperRef.current;
1276
+ if (!el) return;
1277
+ const r = el.getBoundingClientRect();
1278
+ const withinBand = Math.abs(e.clientX - r.right) <= toggleEdgeAllowance && e.clientY >= r.top && e.clientY <= r.bottom;
1279
+ const half = TOGGLE_SIZE / 2;
1280
+ const cur = edgeYRef.current;
1281
+ const overToggle = cur !== null && Math.abs(e.clientX - r.right) <= half && Math.abs(e.clientY - (r.top + cur)) <= half;
1282
+ let next = null;
1283
+ if (withinBand || overToggle) {
1284
+ const max = Math.max(r.height - half, half);
1285
+ next = Math.min(Math.max(e.clientY - r.top, half), max);
1286
+ }
1287
+ const prev = edgeYRef.current;
1288
+ if (prev === next) return;
1289
+ if (prev !== null && next !== null && Math.abs(prev - next) < 0.5) return;
1290
+ writeY(next);
1291
+ if (prev === null !== (next === null)) setEdgeActive(next !== null);
1292
+ };
1293
+ const onLeave = () => {
1294
+ if (edgeYRef.current === null) return;
1295
+ writeY(null);
1296
+ setEdgeActive(false);
1297
+ };
1298
+ window.addEventListener("pointermove", onMove, { passive: true });
1299
+ document.addEventListener("pointerleave", onLeave);
1300
+ return () => {
1301
+ window.removeEventListener("pointermove", onMove);
1302
+ document.removeEventListener("pointerleave", onLeave);
1303
+ };
1304
+ }, [shouldShowToggle, toggleEdgeAllowance]);
1305
+ const toggleVisible = edgeActive || toggleFocused;
1232
1306
  const hoverHandlers = isHover ? {
1233
1307
  onMouseEnter: () => onOpenChange(true),
1234
1308
  onMouseLeave: () => onOpenChange(false)
@@ -1236,6 +1310,7 @@ function SidebarNav({
1236
1310
  return /* @__PURE__ */ jsx18(SidebarContext.Provider, { value: { open, collapsedWidth, expandedWidth }, children: /* @__PURE__ */ jsxs3(
1237
1311
  Box2,
1238
1312
  {
1313
+ ref: wrapperRef,
1239
1314
  sx: {
1240
1315
  position: "relative",
1241
1316
  width: layoutWidth,
@@ -1299,50 +1374,94 @@ function SidebarNav({
1299
1374
  )
1300
1375
  }
1301
1376
  ),
1302
- shouldShowToggle && // The forest Button carries the faux-3D bevel/glaze/press, sized down
1303
- // to a square icon toggle. Face is the tonal secondary (light grey in
1304
- // light / charcoal in dark), not the primary brand fill — the toggle
1305
- // is a utility control, not a call to action.
1377
+ shouldShowToggle && // Positioning shell: pinned to the wrapper's top-right, moved down the
1378
+ // edge with a transform written by the pointermove handler (see
1379
+ // `writeY`). Only opacity transitions position snaps to the pointer
1380
+ // so the toggle appears under the cursor and tracks it 1:1.
1306
1381
  /* @__PURE__ */ jsx18(
1307
- Button,
1382
+ Box2,
1308
1383
  {
1309
- "aria-label": open ? "Collapse sidebar" : "Expand sidebar",
1310
- onClick: () => onOpenChange(!open),
1384
+ ref: toggleRef,
1311
1385
  sx: (theme) => ({
1312
1386
  position: "absolute",
1313
- top: "50%",
1314
1387
  right: 0,
1315
- transform: "translate(50%, -50%)",
1388
+ width: TOGGLE_SIZE,
1389
+ height: TOGGLE_SIZE,
1390
+ // Resting spot for keyboard focus and touch, where no pointer
1391
+ // sets a transform: vertically centred on the edge. `writeY`
1392
+ // overrides both `top` and `transform` inline while tracking
1393
+ // and leaves them in place on hide so the exit fades in situ.
1394
+ top: "50%",
1395
+ transform: "translate3d(50%, -50%, 0)",
1396
+ // Hidden until the pointer reaches the edge band. Kept mounted so
1397
+ // it stays in the tab order and can be reached by keyboard.
1398
+ opacity: toggleVisible ? 1 : 0,
1399
+ pointerEvents: toggleVisible ? "auto" : "none",
1400
+ // Enter fast with a strong ease-out so it reads as "already
1401
+ // there"; exit a touch shorter — the user has moved on.
1402
+ transition: toggleVisible ? "opacity 120ms cubic-bezier(0.19, 1, 0.22, 1)" : "opacity 100ms ease",
1403
+ "@media (prefers-reduced-motion: reduce)": {
1404
+ transition: "none"
1405
+ },
1406
+ // No hover on touch: there is no pointer to bring the toggle out,
1407
+ // so it stays visible at its resting position.
1408
+ "@media (hover: none)": {
1409
+ opacity: 1,
1410
+ pointerEvents: "auto"
1411
+ },
1316
1412
  // Above both the AppShell content surface (drawer + 1, which
1317
1413
  // paints its shadow over the sidebar) and the hover-expanded
1318
1414
  // drawer (drawer + 2) — the toggle straddles the seam and has
1319
1415
  // to stay clickable and whole on top of both.
1320
- zIndex: theme.zIndex.drawer + 3,
1321
- minWidth: 0,
1322
- width: 28,
1323
- height: 28,
1324
- padding: 0,
1325
- // Match the shell surface (bg.primary = lightest grey) so the
1326
- // toggle reads as part of the sidebar, not a darker chip.
1327
- backgroundColor: `var(--mui-palette-bg-primary, ${bg.primary})`,
1328
- color: `var(--mui-palette-text-primary, ${text.primary})`,
1329
- // Light-grey standard border instead of the contained bevel's
1330
- // darker greyscale (fg.tertiary) — the toggle is a light utility
1331
- // control, so the heavier border read too dark.
1332
- borderColor: `var(--mui-palette-border-primary, ${border.primary})`,
1333
- "& .MuiSvgIcon-root": {
1334
- fontSize: 18
1335
- },
1336
- "&:hover": {
1337
- backgroundColor: `var(--mui-palette-bg-quaternary, ${bg.quaternary})`,
1338
- // The contained brightness lift assumes a dark face — on the
1339
- // light-grey light-mode face it would blow out. In dark the
1340
- // hover token matches the face, so a small lift is the cue.
1341
- filter: "none",
1342
- ...theme.applyStyles("dark", { filter: "brightness(1.15)" })
1343
- }
1416
+ zIndex: theme.zIndex.drawer + 3
1344
1417
  }),
1345
- children: open ? /* @__PURE__ */ jsx18(ChevronLeftOutlined, {}) : /* @__PURE__ */ jsx18(ChevronRightOutlined, {})
1418
+ children: /* @__PURE__ */ jsx18(
1419
+ Button,
1420
+ {
1421
+ "aria-label": open ? "Collapse sidebar" : "Expand sidebar",
1422
+ onClick: (e) => {
1423
+ onOpenChange(!open);
1424
+ writeY(null);
1425
+ setEdgeActive(false);
1426
+ if (!e.currentTarget.matches(":focus-visible")) {
1427
+ e.currentTarget.blur();
1428
+ }
1429
+ },
1430
+ onFocus: (e) => {
1431
+ const kb = e.currentTarget.matches(":focus-visible");
1432
+ if (kb) resetY();
1433
+ setToggleFocused(kb);
1434
+ },
1435
+ onBlur: () => setToggleFocused(false),
1436
+ sx: (theme) => ({
1437
+ minWidth: 0,
1438
+ width: TOGGLE_SIZE,
1439
+ height: TOGGLE_SIZE,
1440
+ padding: 0,
1441
+ transition: "background-color 300ms ease",
1442
+ // Match the shell surface (bg.primary = lightest grey) so the
1443
+ // toggle reads as part of the sidebar, not a darker chip.
1444
+ backgroundColor: `var(--mui-palette-bg-primary, ${bg.primary})`,
1445
+ color: `var(--mui-palette-text-primary, ${text.primary})`,
1446
+ // Light-grey standard border instead of the contained bevel's
1447
+ // darker greyscale (fg.tertiary) — the toggle is a light
1448
+ // utility control, so the heavier border read too dark.
1449
+ borderColor: `var(--mui-palette-border-primary, ${border.primary})`,
1450
+ "& .MuiSvgIcon-root": {
1451
+ fontSize: 18
1452
+ },
1453
+ "&:hover": {
1454
+ backgroundColor: `var(--mui-palette-bg-quaternary, ${bg.quaternary})`,
1455
+ // The contained brightness lift assumes a dark face — on the
1456
+ // light-grey light-mode face it would blow out. In dark the
1457
+ // hover token matches the face, so a small lift is the cue.
1458
+ filter: "none",
1459
+ ...theme.applyStyles("dark", { filter: "brightness(1.15)" })
1460
+ }
1461
+ }),
1462
+ children: open ? /* @__PURE__ */ jsx18(ChevronLeftOutlined, {}) : /* @__PURE__ */ jsx18(ChevronRightOutlined, {})
1463
+ }
1464
+ )
1346
1465
  }
1347
1466
  )
1348
1467
  ]
@@ -1350,8 +1469,9 @@ function SidebarNav({
1350
1469
  ) });
1351
1470
  }
1352
1471
  var itemSx = {
1353
- // Preset radius.md (4px) same corner radius as buttons and inputs.
1354
- borderRadius: "4px",
1472
+ // Off-scale on purpose: the alkemy+ preset's radius steps run 1→12, so 11px
1473
+ // sits between "3xl" (10) and "4xl" (12) with no token to name it.
1474
+ borderRadius: "11px",
1355
1475
  // The MuiListItemButton override sets 12px; 8px here absorbs the container's
1356
1476
  // new 8px gutter so the icon column stays exactly 16px from the sidebar edge,
1357
1477
  // where it has always been.
@@ -1417,7 +1537,7 @@ function SidebarItem({
1417
1537
  }
1418
1538
 
1419
1539
  // src/components/AppShell/index.tsx
1420
- import { useState as useState2 } from "react";
1540
+ import { useState as useState3 } from "react";
1421
1541
  import Box3 from "@mui/material/Box";
1422
1542
  import MuiDrawer3 from "@mui/material/Drawer";
1423
1543
  import List from "@mui/material/List";
@@ -1468,8 +1588,8 @@ function AppShell({
1468
1588
  }) {
1469
1589
  const theme = useTheme();
1470
1590
  const isMobile = useMediaQuery(theme.breakpoints.down("sm"));
1471
- const [sidebarOpen, setSidebarOpen] = useState2(defaultSidebarOpen);
1472
- const [mobileOpen, setMobileOpen] = useState2(false);
1591
+ const [sidebarOpen, setSidebarOpen] = useState3(defaultSidebarOpen);
1592
+ const [mobileOpen, setMobileOpen] = useState3(false);
1473
1593
  const navContent = nav != null ? nav : navItems && /* @__PURE__ */ jsx19(List, { children: navItems.map(({ label, icon, active, endAdornment, ...link }) => /* @__PURE__ */ jsx19(
1474
1594
  SidebarItem,
1475
1595
  {
@@ -1505,12 +1625,12 @@ function AppShell({
1505
1625
  },
1506
1626
  children: [
1507
1627
  /* @__PURE__ */ jsx19(
1508
- default51,
1628
+ default50,
1509
1629
  {
1510
1630
  position: "sticky",
1511
1631
  elevation: 0,
1512
1632
  sx: { zIndex: theme.zIndex.drawer + 1, borderBottom: "none" },
1513
- children: /* @__PURE__ */ jsxs4(default52, { variant: "dense", sx: { px: { xs: "16px", sm: "16px" } }, children: [
1633
+ children: /* @__PURE__ */ jsxs4(default51, { variant: "dense", sx: { px: { xs: "16px", sm: "16px" } }, children: [
1514
1634
  /* @__PURE__ */ jsxs4(Box3, { sx: { flex: 1, display: "flex", alignItems: "center", justifyContent: "flex-start", gap: 1 }, children: [
1515
1635
  isMobile && /* @__PURE__ */ jsx19(
1516
1636
  IconButton2,
@@ -1697,58 +1817,58 @@ function Page({
1697
1817
  }
1698
1818
 
1699
1819
  // src/components/Box/index.tsx
1700
- import { default as default96 } from "@mui/material/Box";
1820
+ import { default as default95 } from "@mui/material/Box";
1701
1821
 
1702
1822
  // src/components/Stack/index.tsx
1703
- import { default as default97 } from "@mui/material/Stack";
1823
+ import { default as default96 } from "@mui/material/Stack";
1704
1824
 
1705
1825
  // src/components/Grid/index.tsx
1706
- import { default as default98 } from "@mui/material/Grid";
1826
+ import { default as default97 } from "@mui/material/Grid";
1707
1827
 
1708
1828
  // src/components/Container/index.tsx
1709
- import { default as default99 } from "@mui/material/Container";
1829
+ import { default as default98 } from "@mui/material/Container";
1710
1830
 
1711
1831
  // src/components/Collapse/index.tsx
1712
- import { default as default100 } from "@mui/material/Collapse";
1832
+ import { default as default99 } from "@mui/material/Collapse";
1713
1833
 
1714
1834
  // src/components/Fade/index.tsx
1715
- import { default as default101 } from "@mui/material/Fade";
1835
+ import { default as default100 } from "@mui/material/Fade";
1716
1836
 
1717
1837
  // src/components/Grow/index.tsx
1718
- import { default as default102 } from "@mui/material/Grow";
1838
+ import { default as default101 } from "@mui/material/Grow";
1719
1839
 
1720
1840
  // src/components/Slide/index.tsx
1721
- import { default as default103 } from "@mui/material/Slide";
1841
+ import { default as default102 } from "@mui/material/Slide";
1722
1842
 
1723
1843
  // src/components/Zoom/index.tsx
1724
- import { default as default104 } from "@mui/material/Zoom";
1844
+ import { default as default103 } from "@mui/material/Zoom";
1725
1845
 
1726
1846
  // src/components/ButtonBase/index.tsx
1727
- import { default as default105 } from "@mui/material/ButtonBase";
1847
+ import { default as default104 } from "@mui/material/ButtonBase";
1728
1848
 
1729
1849
  // src/components/ClickAwayListener/index.tsx
1730
- import { default as default106 } from "@mui/material/ClickAwayListener";
1850
+ import { default as default105 } from "@mui/material/ClickAwayListener";
1731
1851
 
1732
1852
  // src/components/GlobalStyles/index.tsx
1733
- import { default as default107 } from "@mui/material/GlobalStyles";
1853
+ import { default as default106 } from "@mui/material/GlobalStyles";
1734
1854
 
1735
1855
  // src/components/NoSsr/index.tsx
1736
- import { default as default108 } from "@mui/material/NoSsr";
1856
+ import { default as default107 } from "@mui/material/NoSsr";
1737
1857
 
1738
1858
  // src/components/Popper/index.tsx
1739
- import { default as default109 } from "@mui/material/Popper";
1859
+ import { default as default108 } from "@mui/material/Popper";
1740
1860
 
1741
1861
  // src/components/Portal/index.tsx
1742
- import { default as default110 } from "@mui/material/Portal";
1862
+ import { default as default109 } from "@mui/material/Portal";
1743
1863
 
1744
1864
  // src/components/Slider/index.tsx
1745
- import { default as default111 } from "@mui/material/Slider";
1865
+ import { default as default110 } from "@mui/material/Slider";
1746
1866
 
1747
1867
  // src/components/SvgIcon/index.tsx
1748
- import { default as default112 } from "@mui/material/SvgIcon";
1868
+ import { default as default111 } from "@mui/material/SvgIcon";
1749
1869
 
1750
1870
  // src/components/TextareaAutosize/index.tsx
1751
- import { default as default113 } from "@mui/material/TextareaAutosize";
1871
+ import { default as default112 } from "@mui/material/TextareaAutosize";
1752
1872
 
1753
1873
  // src/components/Charts/LineChart.tsx
1754
1874
  import {
@@ -2313,43 +2433,43 @@ import { useScrollTrigger } from "@mui/material";
2313
2433
  import { useFormControl } from "@mui/material";
2314
2434
  import { useTheme as useTheme9 } from "@mui/material";
2315
2435
  export {
2316
- default47 as Accordion,
2317
- default50 as AccordionActions,
2318
- default49 as AccordionDetails,
2319
- default48 as AccordionSummary,
2320
- default60 as Alert,
2321
- default61 as AlertTitle,
2436
+ default46 as Accordion,
2437
+ default49 as AccordionActions,
2438
+ default48 as AccordionDetails,
2439
+ default47 as AccordionSummary,
2440
+ default59 as Alert,
2441
+ default60 as AlertTitle,
2322
2442
  AnimatedArea,
2323
2443
  AnimatedLine,
2324
- default51 as AppBar,
2444
+ default50 as AppBar,
2325
2445
  AppBarNavItem,
2326
2446
  AppShell,
2327
2447
  AreaElement,
2328
2448
  AreaElementPath,
2329
2449
  AreaPlot,
2330
2450
  default2 as Autocomplete,
2331
- default21 as Avatar,
2332
- default22 as AvatarGroup,
2333
- default62 as Backdrop,
2334
- default23 as Badge,
2451
+ default20 as Avatar,
2452
+ default21 as AvatarGroup,
2453
+ default61 as Backdrop,
2454
+ default22 as Badge,
2335
2455
  BarChart,
2336
2456
  BarElement,
2337
2457
  BarElementPath,
2338
2458
  BarLabel,
2339
2459
  BarPlot,
2340
- default74 as BottomNavigation,
2341
- default75 as BottomNavigationAction,
2342
- default96 as Box,
2343
- default76 as Breadcrumbs,
2460
+ default73 as BottomNavigation,
2461
+ default74 as BottomNavigationAction,
2462
+ default95 as Box,
2463
+ default75 as Breadcrumbs,
2344
2464
  Button,
2345
- default105 as ButtonBase,
2465
+ default104 as ButtonBase,
2346
2466
  ButtonGroup,
2347
2467
  Card,
2348
- default57 as CardActionArea,
2349
- default55 as CardActions,
2350
- default53 as CardContent,
2351
- default54 as CardHeader,
2352
- default56 as CardMedia,
2468
+ default56 as CardActionArea,
2469
+ default54 as CardActions,
2470
+ default52 as CardContent,
2471
+ default53 as CardHeader,
2472
+ default55 as CardMedia,
2353
2473
  ChartContainer,
2354
2474
  ChartsAxis,
2355
2475
  ChartsAxisHighlight,
@@ -2374,81 +2494,81 @@ export {
2374
2494
  ChartsYAxis,
2375
2495
  default3 as Checkbox,
2376
2496
  Chip,
2377
- default69 as CircularProgress,
2378
- default106 as ClickAwayListener,
2379
- default100 as Collapse,
2380
- default99 as Container,
2497
+ default68 as CircularProgress,
2498
+ default105 as ClickAwayListener,
2499
+ default99 as Collapse,
2500
+ default98 as Container,
2381
2501
  ContinuousColorLegend,
2382
2502
  DataGrid,
2383
2503
  DatePicker,
2384
2504
  DefaultChartsAxisTooltipContent,
2385
2505
  DefaultChartsItemTooltipContent,
2386
2506
  DefaultChartsLegend,
2387
- default63 as Dialog,
2388
- default66 as DialogActions,
2389
- default65 as DialogContent,
2390
- default67 as DialogContentText,
2391
- default64 as DialogTitle,
2392
- default24 as Divider,
2507
+ default62 as Dialog,
2508
+ default65 as DialogActions,
2509
+ default64 as DialogContent,
2510
+ default66 as DialogContentText,
2511
+ default63 as DialogTitle,
2512
+ default23 as Divider,
2393
2513
  Drawer,
2394
2514
  Fab,
2395
- default101 as Fade,
2396
- default20 as FilledInput,
2515
+ default100 as Fade,
2516
+ default19 as FilledInput,
2397
2517
  ForestProvider,
2398
- default11 as FormControl,
2399
- default12 as FormControlLabel,
2400
- default13 as FormGroup,
2401
- default14 as FormHelperText,
2402
- default15 as FormLabel,
2518
+ default10 as FormControl,
2519
+ default11 as FormControlLabel,
2520
+ default12 as FormGroup,
2521
+ default13 as FormHelperText,
2522
+ default14 as FormLabel,
2403
2523
  Gauge,
2404
2524
  GaugeContainer,
2405
2525
  GaugeReferenceArc,
2406
2526
  GaugeValueArc,
2407
2527
  GaugeValueText,
2408
- default107 as GlobalStyles,
2409
- default98 as Grid,
2410
- default102 as Grow,
2528
+ default106 as GlobalStyles,
2529
+ default97 as Grid,
2530
+ default101 as Grow,
2411
2531
  HighlightedProvider,
2412
2532
  IconButton2 as IconButton,
2413
- default25 as ImageList,
2414
- default26 as ImageListItem,
2415
- default27 as ImageListItemBar,
2533
+ default24 as ImageList,
2534
+ default25 as ImageListItem,
2535
+ default26 as ImageListItemBar,
2416
2536
  InitColorSchemeScript,
2417
2537
  default9 as Input,
2418
- default16 as InputAdornment,
2419
- default17 as InputBase,
2420
- default18 as InputLabel,
2538
+ default15 as InputAdornment,
2539
+ default16 as InputBase,
2540
+ default17 as InputLabel,
2421
2541
  LineChart,
2422
2542
  LineElement,
2423
2543
  LineElementPath,
2424
2544
  LineHighlightElement,
2425
2545
  LineHighlightPlot,
2426
2546
  LinePlot,
2427
- default68 as LinearProgress,
2428
- default77 as Link,
2429
- default28 as List,
2430
- default29 as ListItem,
2431
- default33 as ListItemAvatar,
2432
- default30 as ListItemButton,
2433
- default31 as ListItemIcon,
2434
- default35 as ListItemSecondaryAction,
2435
- default32 as ListItemText,
2436
- default34 as ListSubheader,
2547
+ default67 as LinearProgress,
2548
+ default76 as Link,
2549
+ default27 as List,
2550
+ default28 as ListItem,
2551
+ default32 as ListItemAvatar,
2552
+ default29 as ListItemButton,
2553
+ default30 as ListItemIcon,
2554
+ default34 as ListItemSecondaryAction,
2555
+ default31 as ListItemText,
2556
+ default33 as ListSubheader,
2437
2557
  Logo,
2438
2558
  MarkElement,
2439
2559
  MarkPlot,
2440
- default78 as Menu,
2560
+ default77 as Menu,
2441
2561
  default6 as MenuItem,
2442
- default79 as MenuList,
2443
- default80 as MobileStepper,
2444
- default71 as Modal,
2562
+ default78 as MenuList,
2563
+ default79 as MobileStepper,
2564
+ default70 as Modal,
2445
2565
  MultiSelect,
2446
- default108 as NoSsr,
2447
- default19 as OutlinedInput,
2566
+ default107 as NoSsr,
2567
+ default18 as OutlinedInput,
2448
2568
  Page,
2449
- default81 as Pagination,
2450
- default82 as PaginationItem,
2451
- default59 as Paper,
2569
+ default80 as Pagination,
2570
+ default81 as PaginationItem,
2571
+ default58 as Paper,
2452
2572
  PieArc,
2453
2573
  PieArcLabel,
2454
2574
  PieArcLabelPlot,
@@ -2457,11 +2577,11 @@ export {
2457
2577
  PiePlot,
2458
2578
  PiecewiseColorLegend,
2459
2579
  Popover,
2460
- default109 as Popper,
2461
- default110 as Portal,
2580
+ default108 as Popper,
2581
+ default109 as Portal,
2462
2582
  default5 as Radio,
2463
2583
  default4 as RadioGroup,
2464
- default36 as Rating,
2584
+ default35 as Rating,
2465
2585
  ResponsiveChartContainer,
2466
2586
  Scatter,
2467
2587
  ScatterChart,
@@ -2470,46 +2590,46 @@ export {
2470
2590
  Select,
2471
2591
  SidebarItem,
2472
2592
  SidebarNav,
2473
- default70 as Skeleton,
2474
- default103 as Slide,
2475
- default111 as Slider,
2476
- default72 as Snackbar,
2477
- default73 as SnackbarContent,
2593
+ default69 as Skeleton,
2594
+ default102 as Slide,
2595
+ default110 as Slider,
2596
+ default71 as Snackbar,
2597
+ default72 as SnackbarContent,
2478
2598
  SparkLineChart,
2479
- default83 as SpeedDial,
2480
- default84 as SpeedDialAction,
2481
- default85 as SpeedDialIcon,
2482
- default97 as Stack,
2483
- default87 as Step,
2484
- default89 as StepButton,
2485
- default90 as StepConnector,
2486
- default91 as StepContent,
2487
- default92 as StepIcon,
2488
- default88 as StepLabel,
2489
- default86 as Stepper,
2490
- default112 as SvgIcon,
2491
- default58 as SwipeableDrawer,
2599
+ default82 as SpeedDial,
2600
+ default83 as SpeedDialAction,
2601
+ default84 as SpeedDialIcon,
2602
+ default96 as Stack,
2603
+ default86 as Step,
2604
+ default88 as StepButton,
2605
+ default89 as StepConnector,
2606
+ default90 as StepContent,
2607
+ default91 as StepIcon,
2608
+ default87 as StepLabel,
2609
+ default85 as Stepper,
2610
+ default111 as SvgIcon,
2611
+ default57 as SwipeableDrawer,
2492
2612
  default7 as Switch,
2493
- default94 as Tab,
2494
- default95 as TabScrollButton,
2495
- default37 as Table,
2496
- default38 as TableBody,
2497
- default39 as TableCell,
2498
- default40 as TableContainer,
2499
- default43 as TableFooter,
2500
- default41 as TableHead,
2501
- default44 as TablePagination,
2502
- default42 as TableRow,
2503
- default45 as TableSortLabel,
2504
- default93 as Tabs,
2613
+ default93 as Tab,
2614
+ default94 as TabScrollButton,
2615
+ default36 as Table,
2616
+ default37 as TableBody,
2617
+ default38 as TableCell,
2618
+ default39 as TableContainer,
2619
+ default42 as TableFooter,
2620
+ default40 as TableHead,
2621
+ default43 as TablePagination,
2622
+ default41 as TableRow,
2623
+ default44 as TableSortLabel,
2624
+ default92 as Tabs,
2505
2625
  default8 as TextField,
2506
- default113 as TextareaAutosize,
2626
+ default112 as TextareaAutosize,
2507
2627
  ToggleButton,
2508
- default10 as ToggleButtonGroup,
2509
- default52 as Toolbar,
2628
+ ToggleButtonGroup,
2629
+ default51 as Toolbar,
2510
2630
  Tooltip,
2511
- default46 as Typography,
2512
- default104 as Zoom,
2631
+ default45 as Typography,
2632
+ default103 as Zoom,
2513
2633
  alpha,
2514
2634
  avatarColors,
2515
2635
  base,