@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/{chunk-JYITTRWG.mjs → chunk-B5MZMBLL.mjs} +178 -108
- package/dist/chunk-B5MZMBLL.mjs.map +1 -0
- package/dist/index.d.mts +21 -6
- package/dist/index.d.ts +21 -6
- package/dist/index.js +344 -154
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +377 -257
- package/dist/index.mjs.map +1 -1
- package/dist/theme.js +177 -107
- package/dist/theme.js.map +1 -1
- package/dist/theme.mjs +1 -1
- package/package.json +1 -1
- package/skills/forest-alkemy-plus/SKILL.md +2 -2
- package/skills/forest-alkemy-plus/references/components.md +2 -2
- package/dist/chunk-JYITTRWG.mjs.map +0 -1
|
@@ -282,19 +282,13 @@ function buildComponents(tokens2) {
|
|
|
282
282
|
}
|
|
283
283
|
};
|
|
284
284
|
const bevelHover = {
|
|
285
|
-
borderTopWidth:
|
|
286
|
-
borderBottomWidth: 1
|
|
287
|
-
borderTopLeftRadius: radius4.lg,
|
|
288
|
-
borderTopRightRadius: radius4.lg,
|
|
289
|
-
borderBottomLeftRadius: radius4.md,
|
|
290
|
-
borderBottomRightRadius: radius4.md
|
|
285
|
+
borderTopWidth: 3,
|
|
286
|
+
borderBottomWidth: 1
|
|
291
287
|
};
|
|
292
288
|
const bevelPress = {
|
|
293
289
|
// Snap the press faster than the 300ms hover flip so it feels tactile.
|
|
294
290
|
transition: "border-width 120ms ease, border-radius 120ms ease, opacity 120ms ease",
|
|
295
291
|
borderTopWidth: 1,
|
|
296
|
-
borderTopLeftRadius: radius4.md,
|
|
297
|
-
borderTopRightRadius: radius4.md,
|
|
298
292
|
opacity: 0.75
|
|
299
293
|
};
|
|
300
294
|
const bevel3D = {
|
|
@@ -305,9 +299,7 @@ function buildComponents(tokens2) {
|
|
|
305
299
|
borderTopWidth: 1,
|
|
306
300
|
borderRightWidth: 1,
|
|
307
301
|
borderLeftWidth: 1,
|
|
308
|
-
borderBottomWidth:
|
|
309
|
-
borderBottomLeftRadius: radius4.lg,
|
|
310
|
-
borderBottomRightRadius: radius4.lg,
|
|
302
|
+
borderBottomWidth: 3,
|
|
311
303
|
"&::before": {
|
|
312
304
|
content: '""',
|
|
313
305
|
position: "absolute",
|
|
@@ -344,6 +336,21 @@ function buildComponents(tokens2) {
|
|
|
344
336
|
}
|
|
345
337
|
}
|
|
346
338
|
},
|
|
339
|
+
// ─── ButtonBase (global) ────────────────────────────────────────
|
|
340
|
+
// Kills MUI's TouchRipple everywhere in one place. Every clickable in the
|
|
341
|
+
// library renders through ButtonBase, so this reaches Button, IconButton,
|
|
342
|
+
// Fab, ToggleButton, CardActionArea, ListItemButton, MenuItem, Tab, Chip,
|
|
343
|
+
// PaginationItem, StepButton, BottomNavigationAction, SpeedDialAction and
|
|
344
|
+
// the Pickers' day/month/year cells without a per-component opt-out.
|
|
345
|
+
//
|
|
346
|
+
// The press feedback is the faux-3D bevel instead: the raised bottom edge
|
|
347
|
+
// collapses and the face dims on :active (see `bevelPress`). An expanding
|
|
348
|
+
// circle on top of that reads as a second, competing press affordance.
|
|
349
|
+
MuiButtonBase: {
|
|
350
|
+
defaultProps: {
|
|
351
|
+
disableRipple: true
|
|
352
|
+
}
|
|
353
|
+
},
|
|
347
354
|
// ─── Button ─────────────────────────────────────────────────────
|
|
348
355
|
MuiButton: {
|
|
349
356
|
defaultProps: {
|
|
@@ -363,7 +370,7 @@ function buildComponents(tokens2) {
|
|
|
363
370
|
const colorScales = { error: error2, warning: warning2, success: success2, info: info2 };
|
|
364
371
|
const faceScale = ownerState.color ? colorScales[ownerState.color] : void 0;
|
|
365
372
|
return {
|
|
366
|
-
borderRadius: radius4.
|
|
373
|
+
borderRadius: radius4.lg,
|
|
367
374
|
fontWeight: 600,
|
|
368
375
|
boxShadow: tokenShadows.xs,
|
|
369
376
|
height: 32,
|
|
@@ -381,12 +388,7 @@ function buildComponents(tokens2) {
|
|
|
381
388
|
borderTopWidth: 1,
|
|
382
389
|
borderRightWidth: 1,
|
|
383
390
|
borderLeftWidth: 1,
|
|
384
|
-
borderBottomWidth:
|
|
385
|
-
// Round the thick-bevel side more than the rest so the inner
|
|
386
|
-
// surface isn't squared off. Follows the bevel: bottom at rest,
|
|
387
|
-
// top on hover.
|
|
388
|
-
borderBottomLeftRadius: radius4.lg,
|
|
389
|
-
borderBottomRightRadius: radius4.lg,
|
|
391
|
+
borderBottomWidth: 3,
|
|
390
392
|
// Contained buttons have no border of their own — give them a
|
|
391
393
|
// translucent bevel. Outlined keeps its own border color.
|
|
392
394
|
...isContained && {
|
|
@@ -411,12 +413,8 @@ function buildComponents(tokens2) {
|
|
|
411
413
|
transition: "top 500ms ease-in-out"
|
|
412
414
|
},
|
|
413
415
|
"&:hover": {
|
|
414
|
-
borderTopWidth:
|
|
416
|
+
borderTopWidth: 3,
|
|
415
417
|
borderBottomWidth: 1,
|
|
416
|
-
borderTopLeftRadius: radius4.lg,
|
|
417
|
-
borderTopRightRadius: radius4.lg,
|
|
418
|
-
borderBottomLeftRadius: radius4.md,
|
|
419
|
-
borderBottomRightRadius: radius4.md,
|
|
420
418
|
// One step lighter than the default bevel (60% → 70%) so it
|
|
421
419
|
// stays visible against the brightened face on hover.
|
|
422
420
|
...isContained && {
|
|
@@ -443,8 +441,6 @@ function buildComponents(tokens2) {
|
|
|
443
441
|
// like a tactile click rather than a slow settle.
|
|
444
442
|
transition: "border-width 120ms ease, border-radius 120ms ease, opacity 120ms ease",
|
|
445
443
|
borderTopWidth: 1,
|
|
446
|
-
borderTopLeftRadius: radius4.md,
|
|
447
|
-
borderTopRightRadius: radius4.md,
|
|
448
444
|
opacity: 0.75
|
|
449
445
|
},
|
|
450
446
|
// Unified disabled treatment across the button family (Button,
|
|
@@ -459,7 +455,7 @@ function buildComponents(tokens2) {
|
|
|
459
455
|
borderTopWidth: 1,
|
|
460
456
|
borderRightWidth: 1,
|
|
461
457
|
borderLeftWidth: 1,
|
|
462
|
-
borderBottomWidth:
|
|
458
|
+
borderBottomWidth: 3
|
|
463
459
|
},
|
|
464
460
|
"@media (prefers-reduced-motion: reduce)": {
|
|
465
461
|
transition: "none",
|
|
@@ -494,7 +490,7 @@ function buildComponents(tokens2) {
|
|
|
494
490
|
},
|
|
495
491
|
styleOverrides: {
|
|
496
492
|
root: {
|
|
497
|
-
borderRadius: radius4.
|
|
493
|
+
borderRadius: radius4.lg,
|
|
498
494
|
// contained group → children already render as contained Buttons; only
|
|
499
495
|
// re-pin the bevel border color, which MUI's own grouped-contained
|
|
500
496
|
// default (palette grey) otherwise overrides away from the standalone
|
|
@@ -534,7 +530,7 @@ function buildComponents(tokens2) {
|
|
|
534
530
|
backgroundColor: "transparent",
|
|
535
531
|
color: buttonColors4.tertiaryColor.fg,
|
|
536
532
|
borderWidth: 0,
|
|
537
|
-
borderRadius: radius4.
|
|
533
|
+
borderRadius: radius4.lg,
|
|
538
534
|
boxShadow: "none",
|
|
539
535
|
"&::before": { display: "none" },
|
|
540
536
|
"&:active": { opacity: 1 },
|
|
@@ -566,17 +562,17 @@ function buildComponents(tokens2) {
|
|
|
566
562
|
MuiIconButton: {
|
|
567
563
|
styleOverrides: {
|
|
568
564
|
root: ({ theme }) => ({
|
|
569
|
-
borderRadius: radius4.
|
|
565
|
+
borderRadius: radius4.lg,
|
|
570
566
|
padding: 6,
|
|
571
567
|
"& .MuiSvgIcon-root": {
|
|
572
568
|
fontSize: 20
|
|
573
569
|
},
|
|
574
570
|
"&.ForestIconButton": {
|
|
575
571
|
...bevel3D,
|
|
576
|
-
// Square 32×32 with border-box so the faux-3D bevel (1px top +
|
|
572
|
+
// Square 32×32 with border-box so the faux-3D bevel (1px top + 3px
|
|
577
573
|
// bottom, 1px left/right) is absorbed rather than added on top —
|
|
578
|
-
// otherwise it rendered
|
|
579
|
-
// standalone Button's 32px height.
|
|
574
|
+
// otherwise it rendered an oversized control instead of matching
|
|
575
|
+
// the standalone Button's 32px height.
|
|
580
576
|
height: 32,
|
|
581
577
|
width: 32,
|
|
582
578
|
boxSizing: "border-box",
|
|
@@ -633,8 +629,7 @@ function buildComponents(tokens2) {
|
|
|
633
629
|
// ─── FAB ────────────────────────────────────────────────────────
|
|
634
630
|
// A Fab is a round contained Button: same faux-3D bevel, light sweep,
|
|
635
631
|
// brightness lift, and press. The border radii are left untouched so the
|
|
636
|
-
// circular / extended silhouettes survive the bevel flip
|
|
637
|
-
// like Button/IconButton do on their rounded corners).
|
|
632
|
+
// circular / extended silhouettes survive the bevel flip.
|
|
638
633
|
MuiFab: {
|
|
639
634
|
styleOverrides: {
|
|
640
635
|
root: ({ theme, ownerState }) => ({
|
|
@@ -650,7 +645,7 @@ function buildComponents(tokens2) {
|
|
|
650
645
|
borderTopWidth: 1,
|
|
651
646
|
borderRightWidth: 1,
|
|
652
647
|
borderLeftWidth: 1,
|
|
653
|
-
borderBottomWidth:
|
|
648
|
+
borderBottomWidth: 3,
|
|
654
649
|
"&::before": {
|
|
655
650
|
content: '""',
|
|
656
651
|
position: "absolute",
|
|
@@ -668,7 +663,7 @@ function buildComponents(tokens2) {
|
|
|
668
663
|
},
|
|
669
664
|
"&:hover": {
|
|
670
665
|
boxShadow: tokenShadows.xs,
|
|
671
|
-
borderTopWidth:
|
|
666
|
+
borderTopWidth: 3,
|
|
672
667
|
borderBottomWidth: 1,
|
|
673
668
|
// Light mode: dark face, brightness lift reads as hover. Dark
|
|
674
669
|
// mode: the face is already light — a lift blows out the top
|
|
@@ -883,7 +878,10 @@ function buildComponents(tokens2) {
|
|
|
883
878
|
MuiAutocomplete: {
|
|
884
879
|
styleOverrides: {
|
|
885
880
|
paper: {
|
|
886
|
-
borderRadius
|
|
881
|
+
// No borderRadius here on purpose — it inherits MuiPaper's `rounded`
|
|
882
|
+
// (radius.lg), so the popup matches Menu, Popover and every other
|
|
883
|
+
// Paper surface. It used to set radius.md and was the one popup in
|
|
884
|
+
// the system with a sharper corner.
|
|
887
885
|
boxShadow: tokenShadows.lg,
|
|
888
886
|
border: `1px solid ${border4.secondary}`,
|
|
889
887
|
marginTop: 4
|
|
@@ -897,10 +895,42 @@ function buildComponents(tokens2) {
|
|
|
897
895
|
lineHeight: "20px"
|
|
898
896
|
}
|
|
899
897
|
},
|
|
898
|
+
// MUI hardcodes this slot's own padding/marginRight in its source
|
|
899
|
+
// (padding: 2, marginRight: -2), which wins over the global
|
|
900
|
+
// MuiIconButton root override at equal specificity — left alone, the
|
|
901
|
+
// popup toggle renders as a small 24px button that doesn't fill the
|
|
902
|
+
// 32px input row and stops short of the edge. Restated here at the
|
|
903
|
+
// same size/inset as the DatePicker's open-picker button (32px,
|
|
904
|
+
// padding 6, flush against the input's 12px right padding) so both
|
|
905
|
+
// end-of-input icon buttons match.
|
|
906
|
+
popupIndicator: {
|
|
907
|
+
padding: 6,
|
|
908
|
+
// Not a straight copy of the DatePicker's -12px: that value cancels
|
|
909
|
+
// the input row's 12px padding directly, but this button's
|
|
910
|
+
// grandparent (`.MuiAutocomplete-endAdornment`) is itself inset 9px
|
|
911
|
+
// from the input's true right edge by MUI's own variant styles.
|
|
912
|
+
// -9px reaches through that inset to land flush, matching the
|
|
913
|
+
// DatePicker's open-picker button exactly.
|
|
914
|
+
marginRight: -9
|
|
915
|
+
},
|
|
916
|
+
// Same MUI-hardcoded-slot problem as popupIndicator, one size down
|
|
917
|
+
// (padding: 4, marginRight: -2) — sized to match it here. The
|
|
918
|
+
// popupIndicator's own marginRight anchors it to the input edge
|
|
919
|
+
// independent of clearIndicator's box, so this needs no matching
|
|
920
|
+
// offset: with both buttons the same size, 0 sits them edge-to-edge,
|
|
921
|
+
// and their equal padding already reads as the gap between the icons.
|
|
922
|
+
clearIndicator: {
|
|
923
|
+
padding: 6,
|
|
924
|
+
marginRight: 0
|
|
925
|
+
},
|
|
900
926
|
option: {
|
|
901
927
|
fontSize: 14,
|
|
902
928
|
lineHeight: "20px",
|
|
903
|
-
|
|
929
|
+
// An Autocomplete option is a plain <li class="MuiAutocomplete-option">,
|
|
930
|
+
// not a MenuItem, so MuiMenuItem's radius never reaches it. Match it
|
|
931
|
+
// here so the hover/selected highlight reads as the same pill a Select
|
|
932
|
+
// draws, inset by the listbox's 4px padding.
|
|
933
|
+
borderRadius: radius4.md,
|
|
904
934
|
// Hover + selected backgrounds come from MUI's theme-aware action
|
|
905
935
|
// overlays (a light overlay on dark, so they stay visible — a solid
|
|
906
936
|
// dark-grey tier here reads as "no hover"). Selected keeps the text
|
|
@@ -910,7 +940,14 @@ function buildComponents(tokens2) {
|
|
|
910
940
|
}
|
|
911
941
|
},
|
|
912
942
|
listbox: {
|
|
913
|
-
padding: 4
|
|
943
|
+
padding: 4,
|
|
944
|
+
// Padding has to live here, not in the `option` slot: MUI nests its
|
|
945
|
+
// own option styles under the listbox, so a rule from `option` ties
|
|
946
|
+
// on specificity and loses on source order. This selector outranks
|
|
947
|
+
// it. 6px 8px matches MuiMenuItem.
|
|
948
|
+
"& .MuiAutocomplete-option": {
|
|
949
|
+
padding: "6px 8px"
|
|
950
|
+
}
|
|
914
951
|
}
|
|
915
952
|
}
|
|
916
953
|
},
|
|
@@ -922,7 +959,7 @@ function buildComponents(tokens2) {
|
|
|
922
959
|
styleOverrides: {
|
|
923
960
|
root: {
|
|
924
961
|
color: border4.primary,
|
|
925
|
-
borderRadius: radius4.
|
|
962
|
+
borderRadius: radius4.sm,
|
|
926
963
|
padding: 0,
|
|
927
964
|
width: 20,
|
|
928
965
|
height: 20,
|
|
@@ -939,7 +976,7 @@ function buildComponents(tokens2) {
|
|
|
939
976
|
"&.Mui-focusVisible": {
|
|
940
977
|
outline: "none",
|
|
941
978
|
boxShadow: focusRings4.brand,
|
|
942
|
-
borderRadius: radius4.
|
|
979
|
+
borderRadius: radius4.sm
|
|
943
980
|
},
|
|
944
981
|
"&.Mui-disabled": {
|
|
945
982
|
color: border4.primary
|
|
@@ -1075,13 +1112,13 @@ function buildComponents(tokens2) {
|
|
|
1075
1112
|
color: buttonColors4.primary.fg,
|
|
1076
1113
|
borderTopWidth: 1,
|
|
1077
1114
|
borderBottomWidth: 1,
|
|
1078
|
-
borderTopLeftRadius: radius4.
|
|
1079
|
-
borderTopRightRadius: radius4.
|
|
1080
|
-
borderBottomLeftRadius: radius4.
|
|
1081
|
-
borderBottomRightRadius: radius4.
|
|
1115
|
+
borderTopLeftRadius: radius4.lg,
|
|
1116
|
+
borderTopRightRadius: radius4.lg,
|
|
1117
|
+
borderBottomLeftRadius: radius4.lg,
|
|
1118
|
+
borderBottomRightRadius: radius4.lg,
|
|
1082
1119
|
opacity: 0.75,
|
|
1083
1120
|
// The pressed-in cue is carried by the flattened bevel (bottom
|
|
1084
|
-
// border
|
|
1121
|
+
// border 3px -> 1px) alone in light mode. On the dark-mode face
|
|
1085
1122
|
// that geometry reads too faintly, so it keeps the inner shadow.
|
|
1086
1123
|
boxShadow: "none",
|
|
1087
1124
|
...theme.applyStyles("dark", {
|
|
@@ -1094,8 +1131,8 @@ function buildComponents(tokens2) {
|
|
|
1094
1131
|
filter: "none",
|
|
1095
1132
|
borderTopWidth: 1,
|
|
1096
1133
|
borderBottomWidth: 1,
|
|
1097
|
-
borderTopLeftRadius: radius4.
|
|
1098
|
-
borderTopRightRadius: radius4.
|
|
1134
|
+
borderTopLeftRadius: radius4.lg,
|
|
1135
|
+
borderTopRightRadius: radius4.lg
|
|
1099
1136
|
}
|
|
1100
1137
|
},
|
|
1101
1138
|
// variant="outlined" (Forest wrapper class): the outlined <Button> /
|
|
@@ -1139,7 +1176,7 @@ function buildComponents(tokens2) {
|
|
|
1139
1176
|
borderTopWidth: 1,
|
|
1140
1177
|
borderRightWidth: 1,
|
|
1141
1178
|
borderLeftWidth: 1,
|
|
1142
|
-
borderBottomWidth:
|
|
1179
|
+
borderBottomWidth: 3,
|
|
1143
1180
|
"&::before": { display: "none" },
|
|
1144
1181
|
// selected+disabled keeps the pressed-in cue, greyed.
|
|
1145
1182
|
"&.Mui-selected": {
|
|
@@ -1156,7 +1193,7 @@ function buildComponents(tokens2) {
|
|
|
1156
1193
|
MuiToggleButtonGroup: {
|
|
1157
1194
|
styleOverrides: {
|
|
1158
1195
|
root: {
|
|
1159
|
-
borderRadius: radius4.
|
|
1196
|
+
borderRadius: radius4.lg,
|
|
1160
1197
|
overflow: "hidden"
|
|
1161
1198
|
},
|
|
1162
1199
|
// The child ToggleButton's selected/hover/active rules set per-corner
|
|
@@ -1173,14 +1210,14 @@ function buildComponents(tokens2) {
|
|
|
1173
1210
|
},
|
|
1174
1211
|
"&:first-of-type": {
|
|
1175
1212
|
"&, &:hover, &:active, &.Mui-selected": {
|
|
1176
|
-
borderTopLeftRadius: radius4.
|
|
1177
|
-
borderBottomLeftRadius: radius4.
|
|
1213
|
+
borderTopLeftRadius: radius4.lg,
|
|
1214
|
+
borderBottomLeftRadius: radius4.lg
|
|
1178
1215
|
}
|
|
1179
1216
|
},
|
|
1180
1217
|
"&:last-of-type": {
|
|
1181
1218
|
"&, &:hover, &:active, &.Mui-selected": {
|
|
1182
|
-
borderTopRightRadius: radius4.
|
|
1183
|
-
borderBottomRightRadius: radius4.
|
|
1219
|
+
borderTopRightRadius: radius4.lg,
|
|
1220
|
+
borderBottomRightRadius: radius4.lg
|
|
1184
1221
|
}
|
|
1185
1222
|
}
|
|
1186
1223
|
}
|
|
@@ -1206,7 +1243,27 @@ function buildComponents(tokens2) {
|
|
|
1206
1243
|
border: `1px solid ${border4.secondary}`,
|
|
1207
1244
|
backgroundColor: bg4.primary,
|
|
1208
1245
|
boxShadow: tokenShadows.xs,
|
|
1209
|
-
overflow: "hidden"
|
|
1246
|
+
overflow: "hidden",
|
|
1247
|
+
// Which surface a wrapped CardActionArea should paint. The action
|
|
1248
|
+
// area can't read the Card's own `background-color` (the Card goes
|
|
1249
|
+
// transparent when it wraps one, see below), so the colour is handed
|
|
1250
|
+
// down as a custom property instead. `<Card color="secondary">`
|
|
1251
|
+
// overrides it alongside its own background.
|
|
1252
|
+
"--forest-card-surface": bg4.primary,
|
|
1253
|
+
// A Card wrapping a CardActionArea hands its whole frame over: the
|
|
1254
|
+
// action area already draws the border, surface, radius and shadow,
|
|
1255
|
+
// and flips the radius on hover. Keeping the Card's own stacks a
|
|
1256
|
+
// second, static border just outside the moving one.
|
|
1257
|
+
"&:has(> .MuiCardActionArea-root)": {
|
|
1258
|
+
border: "none",
|
|
1259
|
+
borderRadius: 0,
|
|
1260
|
+
backgroundColor: "transparent",
|
|
1261
|
+
boxShadow: "none",
|
|
1262
|
+
// The action area clips its own content (it has overflow: hidden
|
|
1263
|
+
// for the glaze), so the Card must not also clip — its square
|
|
1264
|
+
// corners would cut the action area's rounded ones.
|
|
1265
|
+
overflow: "visible"
|
|
1266
|
+
}
|
|
1210
1267
|
}
|
|
1211
1268
|
}
|
|
1212
1269
|
},
|
|
@@ -2304,52 +2361,67 @@ function buildComponents(tokens2) {
|
|
|
2304
2361
|
}
|
|
2305
2362
|
},
|
|
2306
2363
|
// ─── CardActionArea ─────────────────────────────────────────────
|
|
2307
|
-
// Clickable-card affordance:
|
|
2308
|
-
// that flips bottom->top on hover),
|
|
2309
|
-
//
|
|
2310
|
-
//
|
|
2364
|
+
// Clickable-card affordance: the outlined Button's interaction at card
|
|
2365
|
+
// scale. Same faux-3D bevel (thick edge that flips bottom->top on hover),
|
|
2366
|
+
// same glaze sweep, same brightness darken on hover, same press-to-sink —
|
|
2367
|
+
// the only difference is the radius, which stays on the card steps
|
|
2368
|
+
// (xl / 2xl) rather than the button's (md / lg). Use
|
|
2369
|
+
// <Card><CardActionArea>…</CardActionArea></Card> for any interactive card;
|
|
2370
|
+
// the Card hands over its border and surface when it sees one.
|
|
2311
2371
|
MuiCardActionArea: {
|
|
2312
2372
|
styleOverrides: {
|
|
2313
2373
|
root: {
|
|
2314
2374
|
position: "relative",
|
|
2315
2375
|
overflow: "hidden",
|
|
2316
|
-
borderRadius: radius4
|
|
2376
|
+
borderRadius: radius4["2xl"],
|
|
2317
2377
|
borderStyle: "solid",
|
|
2318
|
-
|
|
2378
|
+
// The token the outlined Button reads, not `border.primary`, so the
|
|
2379
|
+
// two stay identical under any preset.
|
|
2380
|
+
borderColor: buttonColors4.secondaryColor.border,
|
|
2381
|
+
// Painted here rather than on the Card, which goes transparent so its
|
|
2382
|
+
// square box can't clip these corners. Falls back to the default card
|
|
2383
|
+
// surface when a CardActionArea is used outside a Card.
|
|
2384
|
+
backgroundColor: `var(--forest-card-surface, ${bg4.primary})`,
|
|
2319
2385
|
borderTopWidth: 1,
|
|
2320
2386
|
borderRightWidth: 1,
|
|
2321
2387
|
borderLeftWidth: 1,
|
|
2322
|
-
borderBottomWidth:
|
|
2323
|
-
borderBottomLeftRadius: radius4["2xl"],
|
|
2324
|
-
borderBottomRightRadius: radius4["2xl"],
|
|
2388
|
+
borderBottomWidth: 3,
|
|
2325
2389
|
boxShadow: tokenShadows.xs,
|
|
2326
|
-
transition: "
|
|
2327
|
-
|
|
2390
|
+
transition: "filter 300ms ease, border-width 300ms ease, border-radius 300ms ease, opacity 300ms ease, background-color 300ms ease",
|
|
2391
|
+
"&:focus-visible": {
|
|
2392
|
+
boxShadow: focusRings4.brandShadowXs
|
|
2393
|
+
},
|
|
2394
|
+
// Moving glaze — a soft light streak that sweeps top->bottom on
|
|
2395
|
+
// hover. Same parameters as the outlined Button's sweep.
|
|
2328
2396
|
"&::before": {
|
|
2329
2397
|
content: '""',
|
|
2330
2398
|
position: "absolute",
|
|
2331
2399
|
left: 0,
|
|
2332
2400
|
top: "-150%",
|
|
2333
2401
|
width: "100%",
|
|
2334
|
-
height:
|
|
2402
|
+
height: 5,
|
|
2335
2403
|
borderRadius: 4,
|
|
2336
|
-
backgroundColor: "color-mix(in srgb, currentColor
|
|
2337
|
-
boxShadow: "0 0
|
|
2338
|
-
opacity: 0.
|
|
2404
|
+
backgroundColor: "color-mix(in srgb, currentColor 45%, #fff)",
|
|
2405
|
+
boxShadow: "0 0 24px 4px color-mix(in srgb, currentColor 45%, #fff)",
|
|
2406
|
+
opacity: 0.2,
|
|
2339
2407
|
filter: "blur(3px)",
|
|
2340
2408
|
pointerEvents: "none",
|
|
2341
|
-
transition: "top
|
|
2409
|
+
transition: "top 500ms ease-in-out",
|
|
2342
2410
|
zIndex: 1
|
|
2343
2411
|
},
|
|
2344
2412
|
"&:hover": {
|
|
2345
|
-
|
|
2346
|
-
|
|
2347
|
-
|
|
2348
|
-
|
|
2349
|
-
|
|
2350
|
-
|
|
2351
|
-
|
|
2352
|
-
|
|
2413
|
+
// Darken the whole surface via brightness, the same mechanism the
|
|
2414
|
+
// outlined Button uses — no border-color shift; the border stays
|
|
2415
|
+
// put and only the bevel geometry moves. Lighter than the Button's
|
|
2416
|
+
// 0.97 on purpose: the filter dims a card's media and copy along
|
|
2417
|
+
// with its surface, so the same amount reads much heavier here.
|
|
2418
|
+
filter: "brightness(0.995)",
|
|
2419
|
+
// The Button drops its resting shadow on hover (MUI's
|
|
2420
|
+
// disableElevation), so the raised edge is the only depth cue
|
|
2421
|
+
// mid-interaction. Matched here for parity.
|
|
2422
|
+
boxShadow: "none",
|
|
2423
|
+
borderTopWidth: 3,
|
|
2424
|
+
borderBottomWidth: 1
|
|
2353
2425
|
},
|
|
2354
2426
|
"&:hover::before": {
|
|
2355
2427
|
top: "150%"
|
|
@@ -2359,15 +2431,13 @@ function buildComponents(tokens2) {
|
|
|
2359
2431
|
"&:active": {
|
|
2360
2432
|
transition: "border-width 120ms ease, border-radius 120ms ease, opacity 120ms ease",
|
|
2361
2433
|
borderTopWidth: 1,
|
|
2362
|
-
|
|
2363
|
-
borderTopRightRadius: radius4.xl,
|
|
2364
|
-
opacity: 0.85
|
|
2365
|
-
},
|
|
2366
|
-
"&:hover .MuiCardActionArea-focusHighlight": {
|
|
2367
|
-
opacity: 0.04
|
|
2434
|
+
opacity: 0.75
|
|
2368
2435
|
},
|
|
2369
|
-
|
|
2370
|
-
|
|
2436
|
+
// MUI's own hover/focus tint overlay. The outlined Button has no
|
|
2437
|
+
// equivalent (it suppresses the variant hover background), so the
|
|
2438
|
+
// brightness darken above is the only hover feedback.
|
|
2439
|
+
"& .MuiCardActionArea-focusHighlight": {
|
|
2440
|
+
opacity: 0
|
|
2371
2441
|
},
|
|
2372
2442
|
"@media (prefers-reduced-motion: reduce)": {
|
|
2373
2443
|
transition: "none",
|
|
@@ -3125,8 +3195,8 @@ var container = {
|
|
|
3125
3195
|
paddingMobile: 16,
|
|
3126
3196
|
// Corner radius of the App Shell's content surface where it meets the
|
|
3127
3197
|
// chrome. Deliberately a layout value rather than a step on the `radius`
|
|
3128
|
-
// scale: that scale governs components (and the
|
|
3129
|
-
//
|
|
3198
|
+
// scale: that scale governs components (and the alkemy+ preset caps it at
|
|
3199
|
+
// 22), so a 24 sitting in it would misread as a component radius.
|
|
3130
3200
|
shellRadius: 24
|
|
3131
3201
|
};
|
|
3132
3202
|
var widths = {
|
|
@@ -3393,15 +3463,15 @@ var alpha = {
|
|
|
3393
3463
|
var highlight = magenta;
|
|
3394
3464
|
var radius2 = {
|
|
3395
3465
|
...radius,
|
|
3396
|
-
xxs:
|
|
3397
|
-
xs:
|
|
3398
|
-
sm:
|
|
3399
|
-
md:
|
|
3400
|
-
lg:
|
|
3401
|
-
xl:
|
|
3402
|
-
"2xl":
|
|
3403
|
-
"3xl":
|
|
3404
|
-
"4xl":
|
|
3466
|
+
xxs: 2,
|
|
3467
|
+
xs: 4,
|
|
3468
|
+
sm: 6,
|
|
3469
|
+
md: 8,
|
|
3470
|
+
lg: 11,
|
|
3471
|
+
xl: 14,
|
|
3472
|
+
"2xl": 16,
|
|
3473
|
+
"3xl": 20,
|
|
3474
|
+
"4xl": 22
|
|
3405
3475
|
};
|
|
3406
3476
|
var text2 = {
|
|
3407
3477
|
primary: gray[50],
|
|
@@ -3716,15 +3786,15 @@ var colors = {
|
|
|
3716
3786
|
};
|
|
3717
3787
|
var radius3 = {
|
|
3718
3788
|
...radius,
|
|
3719
|
-
xxs:
|
|
3720
|
-
xs:
|
|
3721
|
-
sm:
|
|
3722
|
-
md:
|
|
3723
|
-
lg:
|
|
3724
|
-
xl:
|
|
3725
|
-
"2xl":
|
|
3726
|
-
"3xl":
|
|
3727
|
-
"4xl":
|
|
3789
|
+
xxs: 2,
|
|
3790
|
+
xs: 4,
|
|
3791
|
+
sm: 6,
|
|
3792
|
+
md: 8,
|
|
3793
|
+
lg: 11,
|
|
3794
|
+
xl: 14,
|
|
3795
|
+
"2xl": 16,
|
|
3796
|
+
"3xl": 20,
|
|
3797
|
+
"4xl": 22
|
|
3728
3798
|
};
|
|
3729
3799
|
var text3 = {
|
|
3730
3800
|
primary: gray[900],
|
|
@@ -4060,4 +4130,4 @@ export {
|
|
|
4060
4130
|
forestTheme,
|
|
4061
4131
|
forestThemeOptions
|
|
4062
4132
|
};
|
|
4063
|
-
//# sourceMappingURL=chunk-
|
|
4133
|
+
//# sourceMappingURL=chunk-B5MZMBLL.mjs.map
|