@recursica/mui-adapter 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/mui-adapter.cjs +30 -20
  3. package/dist/mui-adapter.cjs.map +1 -1
  4. package/dist/mui-adapter.js +2394 -2104
  5. package/dist/mui-adapter.js.map +1 -1
  6. package/dist/src/components/Avatar/Avatar.d.ts +16 -1
  7. package/dist/src/components/Badge/Badge.d.ts +16 -1
  8. package/dist/src/components/Card/Card.d.ts +36 -1
  9. package/dist/src/components/Dropdown/Dropdown.d.ts +1 -1
  10. package/dist/src/components/Radio/index.d.ts +1 -0
  11. package/dist/src/components/Switch/Switch.d.ts +1 -1
  12. package/dist/src/components/Switch/index.d.ts +1 -0
  13. package/dist/src/components/TextArea/TextArea.d.ts +1 -1
  14. package/dist/src/components/Timeline/index.d.ts +1 -0
  15. package/dist/src/components/Typography/index.d.ts +1 -0
  16. package/dist/src/components/index.d.ts +1 -0
  17. package/dist/src/index.d.ts +84 -1
  18. package/package.json +1 -1
  19. package/src/OverStyling.tsx +63 -2
  20. package/src/components/Accordion/Accordion.tsx +1 -0
  21. package/src/components/Autocomplete/Autocomplete.tsx +2 -0
  22. package/src/components/Avatar/Avatar.tsx +2 -2
  23. package/src/components/Badge/Badge.tsx +1 -1
  24. package/src/components/Card/Card.tsx +4 -2
  25. package/src/components/Checkbox/Checkbox.tsx +6 -1
  26. package/src/components/Dropdown/Dropdown.tsx +8 -2
  27. package/src/components/HoverCard/HoverCard.tsx +7 -4
  28. package/src/components/Menu/Menu.stories.tsx +14 -8
  29. package/src/components/Modal/Modal.tsx +11 -4
  30. package/src/components/Radio/Radio.tsx +1 -0
  31. package/src/components/Radio/index.ts +1 -0
  32. package/src/components/SegmentedControl/SegmentedControl.tsx +5 -1
  33. package/src/components/Slider/Slider.tsx +12 -4
  34. package/src/components/Stepper/Stepper.tsx +1 -0
  35. package/src/components/Switch/Switch.tsx +2 -1
  36. package/src/components/Switch/index.ts +1 -0
  37. package/src/components/Table/Table.tsx +1 -1
  38. package/src/components/TextArea/TextArea.tsx +9 -1
  39. package/src/components/TextField/TextField.tsx +2 -0
  40. package/src/components/Timeline/index.ts +1 -0
  41. package/src/components/Typography/index.ts +1 -0
  42. package/src/components/index.ts +1 -0
  43. package/src/index.ts +169 -1
@@ -7,4 +7,19 @@ export type AvatarProps = RecursicaOverStyled<Omit<MuiAvatarProps, "variant" | "
7
7
  *
8
8
  * Supports polymorphism via the `component` prop or `renderRoot` for custom element rendering.
9
9
  */
10
- export declare const Avatar: any;
10
+ export declare const Avatar: import('react').ForwardRefExoticComponent<(Omit<Omit<import('@recursica/adapter-common').WithRecursicaSpacing<Omit<MuiAvatarProps, "color" | "variant" | "size" | "radius"> & RecursicaAvatarProps>, import('@recursica/adapter-common').BlockedStylingKeys> & import('@recursica/adapter-common').ForbiddenStyles & {
11
+ overStyled?: false | undefined;
12
+ }, "ref"> | Omit<Omit<Omit<MuiAvatarProps, "color" | "variant" | "size" | "radius"> & RecursicaAvatarProps, "m" | "my" | "mx" | "mt" | "mb" | "ml" | "mr" | "gap" | "rowGap" | "columnGap"> & {
13
+ m?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
14
+ mx?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
15
+ my?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
16
+ mt?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
17
+ mb?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
18
+ ml?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
19
+ mr?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
20
+ gap?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
21
+ rowGap?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
22
+ columnGap?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
23
+ } & {
24
+ overStyled: true;
25
+ }, "ref">) & import('react').RefAttributes<HTMLDivElement>>;
@@ -7,4 +7,19 @@ export type BadgeProps = RecursicaOverStyled<Omit<MuiBadgeProps, "variant" | "si
7
7
  *
8
8
  * Supports polymorphism via the `component` prop or `renderRoot` for custom element rendering.
9
9
  */
10
- export declare const Badge: any;
10
+ export declare const Badge: import('react').ForwardRefExoticComponent<(Omit<Omit<import('@recursica/adapter-common').WithRecursicaSpacing<Omit<MuiBadgeProps, "color" | "variant" | "size" | "radius"> & RecursicaBadgeProps>, import('@recursica/adapter-common').BlockedStylingKeys> & import('@recursica/adapter-common').ForbiddenStyles & {
11
+ overStyled?: false | undefined;
12
+ }, "ref"> | Omit<Omit<Omit<MuiBadgeProps, "color" | "variant" | "size" | "radius"> & RecursicaBadgeProps, "m" | "my" | "mx" | "mt" | "mb" | "ml" | "mr" | "gap" | "rowGap" | "columnGap"> & {
13
+ m?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
14
+ mx?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
15
+ my?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
16
+ mt?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
17
+ mb?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
18
+ ml?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
19
+ mr?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
20
+ gap?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
21
+ rowGap?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
22
+ columnGap?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
23
+ } & {
24
+ overStyled: true;
25
+ }, "ref">) & import('react').RefAttributes<HTMLDivElement>>;
@@ -36,7 +36,42 @@ export declare const CardContent: import('react').ForwardRefExoticComponent<Card
36
36
  * Supports polymorphism via the `component` prop or `renderRoot` for custom element rendering.
37
37
  * Use dot-notation sub-components for structured card layouts.
38
38
  */
39
- declare const PolymorphicCard: any;
39
+ declare const PolymorphicCard: import('react').ForwardRefExoticComponent<(Omit<Omit<import('@recursica/adapter-common').WithRecursicaSpacing<import('@mui/material').CardOwnProps & import('@mui/material/OverridableComponent').CommonProps & Omit<import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "className" | "classes" | "style" | "sx" | "children" | "variant" | "elevation" | "square" | "raised"> & {
40
+ component?: React.ElementType | undefined;
41
+ } & RecursicaCardProps>, import('@recursica/adapter-common').BlockedStylingKeys> & import('@recursica/adapter-common').ForbiddenStyles & {
42
+ overStyled?: false | undefined;
43
+ } & {
44
+ flex?: string | number;
45
+ flexGrow?: string | number;
46
+ flexShrink?: string | number;
47
+ flexBasis?: string | number;
48
+ grow?: string | number;
49
+ h?: string | number;
50
+ height?: string | number;
51
+ }, "ref"> | Omit<Omit<import('@mui/material').CardOwnProps & import('@mui/material/OverridableComponent').CommonProps & Omit<import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "className" | "classes" | "style" | "sx" | "children" | "variant" | "elevation" | "square" | "raised"> & {
52
+ component?: React.ElementType | undefined;
53
+ } & RecursicaCardProps, "m" | "my" | "mx" | "mt" | "mb" | "ml" | "mr" | "gap" | "rowGap" | "columnGap"> & {
54
+ m?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
55
+ mx?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
56
+ my?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
57
+ mt?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
58
+ mb?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
59
+ ml?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
60
+ mr?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
61
+ gap?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
62
+ rowGap?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
63
+ columnGap?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
64
+ } & {
65
+ overStyled: true;
66
+ } & {
67
+ flex?: string | number;
68
+ flexGrow?: string | number;
69
+ flexShrink?: string | number;
70
+ flexBasis?: string | number;
71
+ grow?: string | number;
72
+ h?: string | number;
73
+ height?: string | number;
74
+ }, "ref">) & import('react').RefAttributes<HTMLDivElement>>;
40
75
  export declare const Card: typeof PolymorphicCard & {
41
76
  Section: typeof CardSection;
42
77
  Header: typeof CardHeader;
@@ -3,7 +3,7 @@ import { SelectProps as MuiSelectProps } from '@mui/material';
3
3
  import { ReadOnlyControlProps, RecursicaDropdownProps as BaseRecursicaDropdownProps } from '@recursica/adapter-common';
4
4
  import { RecursicaOverStyled } from '../../utils/filterStylingProps';
5
5
  import { RecursicaFormControlWrapperProps } from '../FormControlWrapper/FormControlWrapper';
6
- export interface RecursicaDropdownProps extends Omit<MuiSelectProps, "size" | "variant" | "classes" | "inputProps" | "SelectDisplayProps">, Omit<RecursicaFormControlWrapperProps, "controlMaxWidth" | "controlMinWidth">, ReadOnlyControlProps, BaseRecursicaDropdownProps {
6
+ export interface RecursicaDropdownProps extends Omit<MuiSelectProps, keyof React.HTMLAttributes<HTMLDivElement> | "size" | "variant" | "classes" | "inputProps" | "SelectDisplayProps" | "ref">, Omit<RecursicaFormControlWrapperProps, "controlMaxWidth" | "controlMinWidth">, ReadOnlyControlProps, BaseRecursicaDropdownProps {
7
7
  }
8
8
  export type DropdownProps = RecursicaOverStyled<RecursicaDropdownProps>;
9
9
  export declare const Dropdown: React.ForwardRefExoticComponent<(Omit<Omit<import('@recursica/adapter-common').WithRecursicaSpacing<RecursicaDropdownProps>, import('@recursica/adapter-common').BlockedStylingKeys> & import('@recursica/adapter-common').ForbiddenStyles & {
@@ -1 +1,2 @@
1
1
  export * from './Radio';
2
+ export * from './RadioGroup';
@@ -5,6 +5,6 @@ import { FormControlLayoutProps } from '../FormControlLayout/FormControlLayout';
5
5
  export type SwitchWrapperProps = Omit<MuiSwitchProps, "size" | "color" | "radius" | "variant"> & RecursicaSwitchProps & ReadOnlyControlProps & Pick<FormControlLayoutProps, "formLayout" | "labelSize" | "controlMaxWidth" | "controlMinWidth">;
6
6
  export type RecursicaSwitchPropsAlias = RequireAccessibleLabel<SwitchWrapperProps>;
7
7
  export type SwitchProps = RecursicaOverStyled<RecursicaSwitchPropsAlias>;
8
- type SwitchComponent = any;
8
+ type SwitchComponent = React.ComponentType<SwitchProps>;
9
9
  export declare const Switch: SwitchComponent;
10
10
  export {};
@@ -1 +1,2 @@
1
1
  export * from './Switch';
2
+ export * from './SwitchGroup';
@@ -3,7 +3,7 @@ import { TextFieldProps as MuiTextareaProps } from '@mui/material';
3
3
  import { ReadOnlyControlProps, RecursicaTextAreaProps as BaseRecursicaTextAreaProps } from '@recursica/adapter-common';
4
4
  import { RecursicaOverStyled } from '../../utils/filterStylingProps';
5
5
  import { RecursicaFormControlWrapperProps } from '../FormControlWrapper/FormControlWrapper';
6
- export interface RecursicaTextAreaProps extends Omit<MuiTextareaProps, "size" | "variant" | "radius" | "wrapperProps" | "maxRows" | "minRows">, Omit<RecursicaFormControlWrapperProps, "controlMaxWidth" | "controlMinWidth">, ReadOnlyControlProps, BaseRecursicaTextAreaProps {
6
+ export interface RecursicaTextAreaProps extends Omit<MuiTextareaProps, keyof React.HTMLAttributes<HTMLDivElement> | "size" | "variant" | "radius" | "wrapperProps" | "maxRows" | "minRows" | "classes">, Omit<RecursicaFormControlWrapperProps, "controlMaxWidth" | "controlMinWidth">, ReadOnlyControlProps, BaseRecursicaTextAreaProps {
7
7
  }
8
8
  export type TextAreaProps = RecursicaOverStyled<RecursicaTextAreaProps>;
9
9
  export declare const TextArea: React.ForwardRefExoticComponent<(Omit<Omit<import('@recursica/adapter-common').WithRecursicaSpacing<RecursicaTextAreaProps>, import('@recursica/adapter-common').BlockedStylingKeys> & import('@recursica/adapter-common').ForbiddenStyles & {
@@ -1 +1,2 @@
1
1
  export * from './Timeline';
2
+ export * from './TimelineItem';
@@ -0,0 +1 @@
1
+ export * from './Typography';
@@ -45,3 +45,4 @@ export * from './Title';
45
45
  export * from './Toast';
46
46
  export * from './Tooltip';
47
47
  export * from './TransferList';
48
+ export * from './Typography';
@@ -1,3 +1,86 @@
1
- export * from './components';
1
+ import * as rawComponents from "./components";
2
2
  export * from '@recursica/adapter-common';
3
+ export declare const Box: <C extends React.ElementType = "div">(props: rawComponents.BoxProps<C> & {
4
+ ref?: React.ForwardedRef<any>;
5
+ }) => React.ReactElement | null;
6
+ export declare const Flex: import('react').ForwardRefExoticComponent<Omit<rawComponents.FlexProps, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
7
+ export declare const Group: import('react').ForwardRefExoticComponent<Omit<rawComponents.GroupProps, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
8
+ export declare const Stack: import('react').ForwardRefExoticComponent<Omit<rawComponents.StackProps, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
9
+ export declare const Container: import('react').ForwardRefExoticComponent<Omit<rawComponents.ContainerProps, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
10
+ export declare const Typography: import('react').ForwardRefExoticComponent<(Omit<Omit<import('@recursica/adapter-common').WithRecursicaSpacing<Omit<import('@mui/material').TypographyProps, "variant"> & {
11
+ typographyClass: string;
12
+ component?: React.ElementType;
13
+ }>, import('@recursica/adapter-common').BlockedStylingKeys> & import('@recursica/adapter-common').ForbiddenStyles & {
14
+ overStyled?: false | undefined;
15
+ }, "ref"> | Omit<Omit<Omit<import('@mui/material').TypographyProps, "variant"> & {
16
+ typographyClass: string;
17
+ component?: React.ElementType;
18
+ }, "m" | "my" | "mx" | "mt" | "mb" | "ml" | "mr" | "gap" | "rowGap" | "columnGap"> & {
19
+ m?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
20
+ mx?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
21
+ my?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
22
+ mt?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
23
+ mb?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
24
+ ml?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
25
+ mr?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
26
+ gap?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
27
+ rowGap?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
28
+ columnGap?: string | number | import('@recursica/adapter-common').RecursicaSpacing;
29
+ } & {
30
+ overStyled: true;
31
+ }, "ref">) & import('react').RefAttributes<HTMLElement>>;
32
+ export declare const FileInput: import('react').FC<rawComponents.FileInputProps>;
33
+ export declare const FileUpload: import('react').FC<rawComponents.FileUploadProps>;
34
+ export declare const Accordion: typeof rawComponents.Accordion;
35
+ export declare const AccordionItem: typeof rawComponents.AccordionItem;
36
+ export declare const AccordionControl: typeof rawComponents.AccordionControl;
37
+ export declare const AccordionPanel: typeof rawComponents.AccordionPanel;
38
+ export declare const AssistiveElement: typeof rawComponents.AssistiveElement;
39
+ export declare const Autocomplete: typeof rawComponents.Autocomplete;
40
+ export declare const Avatar: typeof rawComponents.Avatar;
41
+ export declare const Badge: typeof rawComponents.Badge;
42
+ export declare const Breadcrumb: typeof rawComponents.Breadcrumb;
43
+ export declare const Button: typeof rawComponents.Button;
44
+ export declare const Card: typeof rawComponents.Card;
45
+ export declare const Checkbox: typeof rawComponents.Checkbox;
46
+ export declare const CheckboxGroup: typeof rawComponents.CheckboxGroup;
47
+ export declare const Chip: typeof rawComponents.Chip;
48
+ export declare const DatePicker: typeof rawComponents.DatePicker;
49
+ export declare const Dropdown: typeof rawComponents.Dropdown;
50
+ export declare const FormControlLayout: typeof rawComponents.FormControlLayout;
51
+ export declare const FormControlWrapper: typeof rawComponents.FormControlWrapper;
52
+ export declare const HoverCard: typeof rawComponents.HoverCard;
53
+ export declare const Label: typeof rawComponents.Label;
54
+ export declare const Link: typeof rawComponents.Link;
55
+ export declare const Loader: typeof rawComponents.Loader;
56
+ export declare const Menu: typeof rawComponents.Menu;
57
+ export declare const MenuItem: typeof rawComponents.MenuItem;
58
+ export declare const MenuDivider: typeof rawComponents.MenuDivider;
59
+ export declare const Modal: typeof rawComponents.Modal;
60
+ export declare const NumberInput: typeof rawComponents.NumberInput;
61
+ export declare const Pagination: typeof rawComponents.Pagination;
62
+ export declare const Panel: typeof rawComponents.Panel;
63
+ export declare const PanelFooter: typeof rawComponents.PanelFooter;
64
+ export declare const Radio: typeof rawComponents.Radio;
65
+ export declare const RadioGroup: typeof rawComponents.RadioGroup;
66
+ export declare const ReadOnlyField: typeof rawComponents.ReadOnlyField;
67
+ export declare const SegmentedControl: typeof rawComponents.SegmentedControl;
68
+ export declare const Slider: typeof rawComponents.Slider;
69
+ export declare const Stepper: typeof rawComponents.Stepper;
70
+ export declare const Switch: typeof rawComponents.Switch;
71
+ export declare const SwitchGroup: typeof rawComponents.SwitchGroup;
72
+ export declare const Table: typeof rawComponents.Table;
73
+ export declare const Tab: typeof rawComponents.Tab;
74
+ export declare const TabPanel: typeof rawComponents.TabPanel;
75
+ export declare const Tabs: typeof rawComponents.Tabs;
76
+ export declare const Text: typeof rawComponents.Text;
77
+ export declare const TextArea: typeof rawComponents.TextArea;
78
+ export declare const TextField: typeof rawComponents.TextField;
79
+ export declare const TimePicker: typeof rawComponents.TimePicker;
80
+ export declare const Timeline: typeof rawComponents.Timeline;
81
+ export declare const TimelineItem: typeof rawComponents.TimelineItem;
82
+ export declare const Title: typeof rawComponents.Title;
83
+ export declare const Toast: typeof rawComponents.Toast;
84
+ export declare const Tooltip: typeof rawComponents.Tooltip;
85
+ export declare const TransferList: typeof rawComponents.TransferList;
3
86
  export type { RecursicaAutocompleteProps, RecursicaDropdownProps, RecursicaFormControlWrapperProps, RecursicaNumberInputProps, RecursicaSliderProps, RecursicaTextAreaProps, RecursicaTextFieldProps, RecursicaToastProps, } from './components';
package/package.json CHANGED
@@ -13,7 +13,7 @@
13
13
  "url": "git+https://github.com/borderux/recursica.git",
14
14
  "directory": "packages/mui-adapter"
15
15
  },
16
- "version": "0.10.0",
16
+ "version": "0.11.0",
17
17
  "publishConfig": {
18
18
  "access": "public"
19
19
  },
@@ -1,8 +1,25 @@
1
1
  import { Paper, Divider } from "@mui/material";
2
- import { Container, Stack, Box, Text, Title } from "./components";
3
- import { Button } from "./components/Button/Button";
2
+ import {
3
+ Container,
4
+ Stack,
5
+ Box,
6
+ Text as RawText,
7
+ Title,
8
+ Switch as RawSwitch,
9
+ } from "./components";
10
+ import { Button as RawButton } from "./components/Button/Button";
11
+ import {
12
+ useGlobalOverStyled,
13
+ toggleGlobalOverStyled,
14
+ wrapComponent,
15
+ } from "@recursica/adapter-common";
16
+
17
+ const Button = wrapComponent(RawButton);
18
+ const Text = wrapComponent(RawText);
19
+ const Switch = wrapComponent(RawSwitch);
4
20
 
5
21
  export const OverStylingInfo = () => {
22
+ const isHighlightActive = useGlobalOverStyled();
6
23
  return (
7
24
  <Container size="md" style={{ padding: "32px 0" }}>
8
25
  <Paper variant="outlined" sx={{ p: 4, borderRadius: 2 }}>
@@ -172,6 +189,50 @@ export const OverStylingInfo = () => {
172
189
 
173
190
  <Divider sx={{ mb: 4 }} />
174
191
 
192
+ <Title order={6} mb={1}>
193
+ Visual Auditing & Highlights (Development Only)
194
+ </Title>
195
+ <Text mb={2}>
196
+ To make it easy to spot technical debt and design system violations,
197
+ Recursica automatically tracks any component that uses the{" "}
198
+ <code>overStyled={`{true}`}</code> prop.
199
+ </Text>
200
+ <Text mb={2}>
201
+ In <strong>development builds</strong>, you can highlight all
202
+ over-styled components on the page. Open your browser's developer
203
+ console and run:
204
+ </Text>
205
+ <Box
206
+ component="pre"
207
+ sx={{
208
+ p: 1.5,
209
+ bgcolor: "grey.100",
210
+ borderRadius: 1,
211
+ fontSize: 13,
212
+ mt: 1,
213
+ mb: 2,
214
+ }}
215
+ >
216
+ <code>recursica.toggleOverStyled()</code>
217
+ </Box>
218
+ <Stack direction="row" alignItems="center" gap="rec-sm" mb="rec-md">
219
+ <Switch
220
+ label="Highlight Over-Styled Components"
221
+ checked={isHighlightActive}
222
+ onChange={() => toggleGlobalOverStyled()}
223
+ />
224
+ </Stack>
225
+ <Text mb={4}>
226
+ This toggles a <strong>cyan 2px box shadow</strong> outline around the
227
+ children of all over-styled components. The wrapping elements use{" "}
228
+ <code>display: contents</code> under the hood to ensure they occupy
229
+ zero DOM space and do not affect flex, grid, or absolute positioning
230
+ flow. In production builds, this debugging helper is completely
231
+ disabled and stripped with zero performance overhead.
232
+ </Text>
233
+
234
+ <Divider sx={{ mb: 4 }} />
235
+
175
236
  <Title order={6} mb={2}>
176
237
  Live Example
177
238
  </Title>
@@ -175,6 +175,7 @@ export const AccordionItem = forwardRef<
175
175
  </>
176
176
  ) : (
177
177
  children
178
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
178
179
  )) as any
179
180
  }
180
181
  </MuiAccordion>
@@ -18,6 +18,7 @@ import { type RecursicaAutocompleteProps as BaseRecursicaAutocompleteProps } fro
18
18
 
19
19
  export interface RecursicaAutocompleteProps
20
20
  extends Omit<
21
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
22
  MuiAutocompleteProps<any, any, any, any, "div">,
22
23
  | "variant"
23
24
  | "size"
@@ -32,6 +33,7 @@ export interface RecursicaAutocompleteProps
32
33
  | "controlMaxWidth"
33
34
  | "controlMinWidth"
34
35
  | "error"
36
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
35
37
  | keyof MuiAutocompleteProps<any, any, any, any, "div">
36
38
  >,
37
39
  ReadOnlyControlProps,
@@ -74,7 +74,7 @@ const _Avatar = forwardRef<HTMLDivElement, AvatarProps>(function Avatar(
74
74
  ref={ref}
75
75
  className={classNameProp}
76
76
  classes={mergedClassNames}
77
- variant={mapVariant[variant] as any}
77
+ variant={mapVariant[variant] as unknown as MuiAvatarProps["variant"]}
78
78
  src={src}
79
79
  data-variant={variant}
80
80
  data-size={size}
@@ -98,4 +98,4 @@ _Avatar.displayName = "Avatar";
98
98
  *
99
99
  * Supports polymorphism via the `component` prop or `renderRoot` for custom element rendering.
100
100
  */
101
- export const Avatar = _Avatar as any;
101
+ export const Avatar = _Avatar;
@@ -66,4 +66,4 @@ _Badge.displayName = "Badge";
66
66
  *
67
67
  * Supports polymorphism via the `component` prop or `renderRoot` for custom element rendering.
68
68
  */
69
- export const Badge = _Badge as any;
69
+ export const Badge = _Badge;
@@ -45,7 +45,9 @@ const CardBase = forwardRef<HTMLDivElement, CardProps>(function Card(
45
45
  ] as const;
46
46
  safeCardLayoutKeys.forEach((key) => {
47
47
  if (key in rest && !(key in sanitizedProps)) {
48
- (sanitizedProps as any)[key] = (rest as any)[key];
48
+ (sanitizedProps as Record<string, unknown>)[key] = (
49
+ rest as Record<string, unknown>
50
+ )[key];
49
51
  }
50
52
  });
51
53
 
@@ -193,7 +195,7 @@ CardContent.displayName = "CardContent";
193
195
  * Supports polymorphism via the `component` prop or `renderRoot` for custom element rendering.
194
196
  * Use dot-notation sub-components for structured card layouts.
195
197
  */
196
- const PolymorphicCard = CardBase as any;
198
+ const PolymorphicCard = CardBase;
197
199
 
198
200
  // Attach static components for dot-notation access
199
201
  const _card = PolymorphicCard as unknown as Record<string, unknown>;
@@ -133,7 +133,12 @@ export const Checkbox = forwardRef<HTMLButtonElement, CheckboxProps>(
133
133
  }
134
134
  } else {
135
135
  if (restRecord.onChange) {
136
- (restRecord.onChange as any)(e, e.target.checked);
136
+ (
137
+ restRecord.onChange as (
138
+ event: React.ChangeEvent<HTMLInputElement>,
139
+ checked: boolean,
140
+ ) => void
141
+ )(e, e.target.checked);
137
142
  }
138
143
  }
139
144
  };
@@ -18,7 +18,13 @@ import { type RecursicaDropdownProps as BaseRecursicaDropdownProps } from "@recu
18
18
  export interface RecursicaDropdownProps
19
19
  extends Omit<
20
20
  MuiSelectProps,
21
- "size" | "variant" | "classes" | "inputProps" | "SelectDisplayProps"
21
+ | keyof React.HTMLAttributes<HTMLDivElement>
22
+ | "size"
23
+ | "variant"
24
+ | "classes"
25
+ | "inputProps"
26
+ | "SelectDisplayProps"
27
+ | "ref"
22
28
  >,
23
29
  Omit<
24
30
  RecursicaFormControlWrapperProps,
@@ -160,7 +166,7 @@ export const Dropdown = forwardRef<HTMLInputElement, DropdownProps>(
160
166
  inputProps={{
161
167
  "data-disabled": disabled ? "true" : undefined,
162
168
  "data-error": error ? "true" : undefined,
163
- ...(restRecord.inputProps as any),
169
+ ...(restRecord.inputProps as Record<string, unknown>),
164
170
  }}
165
171
  {...(sanitizedProps as unknown as MuiSelectProps)}
166
172
  >
@@ -63,7 +63,10 @@ const HoverCardBase = function HoverCard({
63
63
 
64
64
  React.Children.forEach(children, (child) => {
65
65
  if (isValidElement(child)) {
66
- const childElement = child as any;
66
+ const childElement = child as unknown as {
67
+ type?: { displayName?: string };
68
+ props: { children?: React.ReactNode };
69
+ };
67
70
  if (childElement.type?.displayName === "HoverCardTarget") {
68
71
  targetNode = childElement.props.children;
69
72
  } else if (childElement.type?.displayName === "HoverCardDropdown") {
@@ -83,7 +86,7 @@ const HoverCardBase = function HoverCard({
83
86
  return (
84
87
  <MuiTooltip
85
88
  title={dropdownNode}
86
- placement={position as any}
89
+ placement={position as unknown as MuiTooltipProps["placement"]}
87
90
  arrow={withBeak}
88
91
  enterDelay={openDelay}
89
92
  leaveDelay={closeDelay}
@@ -100,8 +103,8 @@ const HoverCardBase = function HoverCard({
100
103
  ],
101
104
  },
102
105
  }}
103
- classes={mergedClassNames as any}
104
- {...(sanitizedProps as any)}
106
+ classes={mergedClassNames as unknown as MuiTooltipProps["classes"]}
107
+ {...(sanitizedProps as unknown as Record<string, unknown>)}
105
108
  >
106
109
  {/* Tooltip requires a single valid React element child that accepts a ref */}
107
110
  {isValidElement(targetNode) ? targetNode : <span>{targetNode}</span>}
@@ -13,7 +13,7 @@ import { Menu, MenuItem, MenuDivider } from "./Menu";
13
13
  import { Button } from "../Button";
14
14
  import { ListSubheader } from "@mui/material";
15
15
 
16
- const SettingsIcon = (props: any) => (
16
+ const SettingsIcon = (props: React.ComponentProps<"svg">) => (
17
17
  <svg
18
18
  xmlns="http://www.w3.org/2000/svg"
19
19
  width="14"
@@ -31,7 +31,7 @@ const SettingsIcon = (props: any) => (
31
31
  </svg>
32
32
  );
33
33
 
34
- const SearchIcon = (props: any) => (
34
+ const SearchIcon = (props: React.ComponentProps<"svg">) => (
35
35
  <svg
36
36
  xmlns="http://www.w3.org/2000/svg"
37
37
  width="14"
@@ -49,7 +49,7 @@ const SearchIcon = (props: any) => (
49
49
  </svg>
50
50
  );
51
51
 
52
- const MessageIcon = (props: any) => (
52
+ const MessageIcon = (props: React.ComponentProps<"svg">) => (
53
53
  <svg
54
54
  xmlns="http://www.w3.org/2000/svg"
55
55
  width="14"
@@ -66,7 +66,7 @@ const MessageIcon = (props: any) => (
66
66
  </svg>
67
67
  );
68
68
 
69
- const ImageIcon = (props: any) => (
69
+ const ImageIcon = (props: React.ComponentProps<"svg">) => (
70
70
  <svg
71
71
  xmlns="http://www.w3.org/2000/svg"
72
72
  width="14"
@@ -85,7 +85,7 @@ const ImageIcon = (props: any) => (
85
85
  </svg>
86
86
  );
87
87
 
88
- const TrashIcon = (props: any) => (
88
+ const TrashIcon = (props: React.ComponentProps<"svg">) => (
89
89
  <svg
90
90
  xmlns="http://www.w3.org/2000/svg"
91
91
  width="14"
@@ -103,7 +103,7 @@ const TrashIcon = (props: any) => (
103
103
  </svg>
104
104
  );
105
105
 
106
- const ArrowsIcon = (props: any) => (
106
+ const ArrowsIcon = (props: React.ComponentProps<"svg">) => (
107
107
  <svg
108
108
  xmlns="http://www.w3.org/2000/svg"
109
109
  width="14"
@@ -123,7 +123,7 @@ const ArrowsIcon = (props: any) => (
123
123
  </svg>
124
124
  );
125
125
 
126
- type MenuStoryArgs = Record<string, any>;
126
+ type MenuStoryArgs = Record<string, unknown>;
127
127
 
128
128
  const meta: Meta = {
129
129
  title: "UI-Kit/Menu",
@@ -135,7 +135,13 @@ export default meta;
135
135
 
136
136
  type Story = StoryObj<MenuStoryArgs>;
137
137
 
138
- const InteractiveMenu = ({ children, openDelay, ...args }: any) => {
138
+ interface InteractiveMenuProps {
139
+ children?: React.ReactNode;
140
+ opened?: boolean;
141
+ [key: string]: unknown;
142
+ }
143
+
144
+ const InteractiveMenu = ({ children, ...args }: InteractiveMenuProps) => {
139
145
  const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
140
146
  const buttonRef = useRef<HTMLButtonElement>(null);
141
147
 
@@ -65,7 +65,8 @@ const ModalRoot = forwardRef<HTMLDivElement, ModalProps>(function ModalRoot(
65
65
  if (
66
66
  React.isValidElement(child) &&
67
67
  (child.type === ModalFooter ||
68
- (child.type as any)?.displayName === "Modal.Footer")
68
+ (child.type as unknown as { displayName?: string })?.displayName ===
69
+ "Modal.Footer")
69
70
  ) {
70
71
  footer = child;
71
72
  } else {
@@ -81,7 +82,11 @@ const ModalRoot = forwardRef<HTMLDivElement, ModalProps>(function ModalRoot(
81
82
  paper: styles.inner,
82
83
  }}
83
84
  {...(sanitizedProps as MuiDialogProps)}
84
- open={opened || (sanitizedProps as any).open}
85
+ open={
86
+ opened ||
87
+ ((sanitizedProps as Record<string, unknown>).open as boolean) ||
88
+ false
89
+ }
85
90
  onClose={onClose}
86
91
  >
87
92
  {(title || withCloseButton) && (
@@ -117,6 +122,7 @@ const ModalTitle = forwardRef<HTMLDivElement, ModalTitleProps>(
117
122
 
118
123
  return (
119
124
  <MuiDialogTitle
125
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
120
126
  ref={ref as any}
121
127
  className={`${styles.title} ${className || ""}`}
122
128
  {...(sanitizedProps as MuiDialogTitleProps)}
@@ -159,10 +165,10 @@ const ModalBody = forwardRef<HTMLDivElement, ModalBodyProps>(function ModalBody(
159
165
  return (
160
166
  <MuiDialogContent
161
167
  ref={(node) => {
162
- if (typeof ref === "function") ref(node as any);
168
+ if (typeof ref === "function") ref(node as HTMLDivElement);
163
169
  else if (ref)
164
170
  (ref as React.MutableRefObject<HTMLDivElement | null>).current =
165
- node as any;
171
+ node as HTMLDivElement;
166
172
  if (internalRef)
167
173
  (
168
174
  internalRef as React.MutableRefObject<HTMLDivElement | null>
@@ -193,6 +199,7 @@ const ModalFooter = forwardRef<HTMLDivElement, ModalFooterProps>(
193
199
 
194
200
  return (
195
201
  <MuiDialogActions
202
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
196
203
  ref={ref as any}
197
204
  className={`${styles.footer} ${className || ""}`}
198
205
  {...(sanitizedProps as MuiDialogActionsProps)}
@@ -147,6 +147,7 @@ export const Radio = forwardRef<HTMLInputElement, RadioProps>(
147
147
  // We omit Mui's sizing/coloring so we rely strictly on variables from Radio.module.css
148
148
  const radioNode = (
149
149
  <MuiRadio
150
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
150
151
  ref={ref as any}
151
152
  icon={<RadioIcon />}
152
153
  checkedIcon={<RadioIcon className={styles.checked} />}
@@ -1 +1,2 @@
1
1
  export * from "./Radio";
2
+ export * from "./RadioGroup";
@@ -108,7 +108,11 @@ const _SegmentedControl = forwardRef<HTMLDivElement, SegmentedControlProps>(
108
108
  data-orientation={orientation}
109
109
  exclusive
110
110
  value={value}
111
- onChange={handleChange as any}
111
+ onChange={
112
+ handleChange as React.ComponentProps<
113
+ typeof MuiSegmentedControl
114
+ >["onChange"]
115
+ }
112
116
  {...(sanitizedProps as Omit<
113
117
  MuiSegmentedControlProps,
114
118
  "variant" | "size" | "value" | "onChange"