@udixio/ui-react 1.5.0 → 1.6.1

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 (30) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/index.cjs +2 -2
  3. package/dist/index.js +1284 -1157
  4. package/dist/lib/components/SideSheet.d.ts +9 -0
  5. package/dist/lib/components/SideSheet.d.ts.map +1 -0
  6. package/dist/lib/components/index.d.ts +1 -0
  7. package/dist/lib/components/index.d.ts.map +1 -1
  8. package/dist/lib/effects/ThemeProvider.d.ts +3 -2
  9. package/dist/lib/effects/ThemeProvider.d.ts.map +1 -1
  10. package/dist/lib/interfaces/index.d.ts +1 -0
  11. package/dist/lib/interfaces/index.d.ts.map +1 -1
  12. package/dist/lib/interfaces/navigation-rail.interface.d.ts +1 -1
  13. package/dist/lib/interfaces/navigation-rail.interface.d.ts.map +1 -1
  14. package/dist/lib/interfaces/side-sheet.interface.d.ts +30 -0
  15. package/dist/lib/interfaces/side-sheet.interface.d.ts.map +1 -0
  16. package/dist/lib/styles/index.d.ts +1 -0
  17. package/dist/lib/styles/index.d.ts.map +1 -1
  18. package/dist/lib/styles/navigation-rail.style.d.ts +2 -2
  19. package/dist/lib/styles/side-sheet.style.d.ts +27 -0
  20. package/dist/lib/styles/side-sheet.style.d.ts.map +1 -0
  21. package/package.json +2 -2
  22. package/src/lib/components/SideSheet.tsx +128 -0
  23. package/src/lib/components/index.ts +1 -0
  24. package/src/lib/effects/ThemeProvider.tsx +13 -18
  25. package/src/lib/interfaces/index.ts +1 -0
  26. package/src/lib/interfaces/navigation-rail.interface.ts +1 -1
  27. package/src/lib/interfaces/side-sheet.interface.tsx +28 -0
  28. package/src/lib/styles/index.ts +1 -0
  29. package/src/lib/styles/side-sheet.style.ts +31 -0
  30. package/src/stories/containment/slide-sheet.stories.tsx +45 -0
@@ -0,0 +1,9 @@
1
+ import { MotionProps } from '../utils';
2
+ import { SideSheetInterface } from '../interfaces';
3
+ /**
4
+ * Side sheets show secondary content anchored to the side of the screen
5
+ * @status beta
6
+ * @category Layout
7
+ */
8
+ export declare const SideSheet: ({ variant, className, children, title, position, extended, divider, onExtendedChange, closeIcon, transition, ...rest }: MotionProps<SideSheetInterface>) => import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=SideSheet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SideSheet.d.ts","sourceRoot":"","sources":["../../../src/lib/components/SideSheet.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAUnD;;;;GAIG;AACH,eAAO,MAAM,SAAS,GAAI,wHAYvB,WAAW,CAAC,kBAAkB,CAAC,4CAmGjC,CAAC"}
@@ -9,6 +9,7 @@ export * from './IconButton';
9
9
  export * from './IconButton';
10
10
  export * from './ProgressIndicator';
11
11
  export * from './Slider';
12
+ export * from './SideSheet';
12
13
  export * from './Snackbar';
13
14
  export * from './Switch';
14
15
  export * from './Tab';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,OAAO,CAAC;AACtB,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,OAAO,CAAC;AACtB,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,OAAO,CAAC;AACtB,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,OAAO,CAAC;AACtB,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC"}
@@ -1,6 +1,7 @@
1
- import { ConfigInterface } from '@udixio/theme';
2
- export declare const ThemeProvider: ({ config, throttleDelay, }: {
1
+ import { API, ConfigInterface } from '@udixio/theme';
2
+ export declare const ThemeProvider: ({ config, throttleDelay, onLoad, }: {
3
3
  config: ConfigInterface;
4
+ onLoad?: (api: API) => void;
4
5
  throttleDelay?: number;
5
6
  }) => import("react/jsx-runtime").JSX.Element | null;
6
7
  //# sourceMappingURL=ThemeProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ThemeProvider.d.ts","sourceRoot":"","sources":["../../../src/lib/effects/ThemeProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAU,MAAM,eAAe,CAAC;AAS7D,eAAO,MAAM,aAAa,GAAI,4BAG3B;IACD,MAAM,EAAE,eAAe,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,mDA2FA,CAAC"}
1
+ {"version":3,"file":"ThemeProvider.d.ts","sourceRoot":"","sources":["../../../src/lib/effects/ThemeProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,eAAe,EAAU,MAAM,eAAe,CAAC;AASvE,eAAO,MAAM,aAAa,GAAI,oCAI3B;IACD,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,mDAoFA,CAAC"}
@@ -6,6 +6,7 @@ export * from './divider.interface';
6
6
  export * from './fab.interface';
7
7
  export * from './icon-button.interface';
8
8
  export * from './progress-indicator.interface';
9
+ export * from './side-sheet.interface';
9
10
  export * from './slider.interface';
10
11
  export * from './snackbar.interface';
11
12
  export * from './switch.interface';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/interfaces/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kCAAkC,CAAC;AACjD,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/interfaces/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kCAAkC,CAAC;AACjD,cAAc,qBAAqB,CAAC"}
@@ -20,12 +20,12 @@ export interface NavigationRailInterface {
20
20
  selectedItem?: number | null;
21
21
  setSelectedItem?: Dispatch<SetStateAction<number | null>>;
22
22
  extended?: boolean;
23
+ onExtendedChange?: (extended: boolean) => void;
23
24
  alignment?: 'middle' | 'top';
24
25
  menu?: {
25
26
  closed: MenuState;
26
27
  opened: MenuState;
27
28
  };
28
- onExtendedChange?: (extended: boolean) => void;
29
29
  transition?: Transition;
30
30
  };
31
31
  states: {
@@ -1 +1 @@
1
- {"version":3,"file":"navigation-rail.interface.d.ts","sourceRoot":"","sources":["../../../src/lib/interfaces/navigation-rail.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,KAAK,SAAS,GAAG;IACf,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE;QACL,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;QAC/B,cAAc,CAAC,EAAE,CACf,IAAI,EAAE;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAC5B,UAAU,CAAC,2BAA2B,CAAC,EACvC,OAAO,GAAG,MAAM,CACjB,GAAG;YACA,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;SACrB,KACA,IAAI,CAAC;QACV,QAAQ,EAAE,SAAS,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,eAAe,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;QAC1D,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,SAAS,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,EAAE;YACL,MAAM,EAAE,SAAS,CAAC;YAClB,MAAM,EAAE,SAAS,CAAC;SACnB,CAAC;QACF,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;QAE/C,UAAU,CAAC,EAAE,UAAU,CAAC;KACzB,CAAC;IACF,MAAM,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACjC,QAAQ,EAAE,CAAC,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;CAChE"}
1
+ {"version":3,"file":"navigation-rail.interface.d.ts","sourceRoot":"","sources":["../../../src/lib/interfaces/navigation-rail.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,KAAK,SAAS,GAAG;IACf,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE;QACL,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;QAC/B,cAAc,CAAC,EAAE,CACf,IAAI,EAAE;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAC5B,UAAU,CAAC,2BAA2B,CAAC,EACvC,OAAO,GAAG,MAAM,CACjB,GAAG;YACA,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;SACrB,KACA,IAAI,CAAC;QACV,QAAQ,EAAE,SAAS,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,eAAe,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;QAC1D,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;QAC/C,SAAS,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,EAAE;YACL,MAAM,EAAE,SAAS,CAAC;YAClB,MAAM,EAAE,SAAS,CAAC;SACnB,CAAC;QAEF,UAAU,CAAC,EAAE,UAAU,CAAC;KACzB,CAAC;IACF,MAAM,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACjC,QAAQ,EAAE,CAAC,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;CAChE"}
@@ -0,0 +1,30 @@
1
+ import { Transition } from 'motion';
2
+ import { Icon } from '../icon';
3
+ export interface SideSheetInterface {
4
+ type: 'div';
5
+ props: {
6
+ variant?: 'standard' | 'modal';
7
+ children: React.ReactNode;
8
+ title?: string;
9
+ position?: 'left' | 'right';
10
+ extended?: boolean;
11
+ onExtendedChange?: (extended: boolean) => void;
12
+ transition?: Transition;
13
+ closeIcon?: Icon;
14
+ divider?: boolean;
15
+ };
16
+ states: {
17
+ isExtended: boolean;
18
+ };
19
+ elements: [
20
+ 'slideSheet',
21
+ 'container',
22
+ 'title',
23
+ 'content',
24
+ 'header',
25
+ 'closeButton',
26
+ 'divider',
27
+ 'overlay'
28
+ ];
29
+ }
30
+ //# sourceMappingURL=side-sheet.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"side-sheet.interface.d.ts","sourceRoot":"","sources":["../../../src/lib/interfaces/side-sheet.interface.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE;QACL,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;QAC/B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;QAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;QAC/C,UAAU,CAAC,EAAE,UAAU,CAAC;QACxB,SAAS,CAAC,EAAE,IAAI,CAAC;QACjB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;IACF,MAAM,EAAE;QAAE,UAAU,EAAE,OAAO,CAAA;KAAE,CAAC;IAChC,QAAQ,EAAE;QACR,YAAY;QACZ,WAAW;QACX,OAAO;QACP,SAAS;QACT,QAAQ;QACR,aAAa;QACb,SAAS;QACT,SAAS;KACV,CAAC;CACH"}
@@ -6,6 +6,7 @@ export * from './divider.style';
6
6
  export * from './fab.style';
7
7
  export * from './icon-button.style';
8
8
  export * from './progress-indicator.style';
9
+ export * from './side-sheet.style';
9
10
  export * from './slider.style';
10
11
  export * from './snackbar.style';
11
12
  export * from './switch.style';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/styles/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/styles/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC"}
@@ -6,9 +6,9 @@ export declare const navigationRailStyle: (states: {
6
6
  selectedItem: any;
7
7
  setSelectedItem: any;
8
8
  extended: any;
9
+ onExtendedChange: any;
9
10
  alignment: any;
10
11
  menu: any;
11
- onExtendedChange: any;
12
12
  transition: any;
13
13
  } & {
14
14
  variant?: "standard" | "modal";
@@ -21,6 +21,7 @@ export declare const navigationRailStyle: (states: {
21
21
  selectedItem?: number | null;
22
22
  setSelectedItem?: import('react').Dispatch<import('react').SetStateAction<number | null>>;
23
23
  extended?: boolean;
24
+ onExtendedChange?: (extended: boolean) => void;
24
25
  alignment?: "middle" | "top";
25
26
  menu?: {
26
27
  closed: {
@@ -32,7 +33,6 @@ export declare const navigationRailStyle: (states: {
32
33
  label: string;
33
34
  };
34
35
  };
35
- onExtendedChange?: (extended: boolean) => void;
36
36
  transition?: import('motion').Transition;
37
37
  } & {
38
38
  isExtended?: boolean;
@@ -0,0 +1,27 @@
1
+ import { SideSheetInterface } from '../interfaces/side-sheet.interface';
2
+ export declare const sideSheetStyle: (states: {
3
+ variant: any;
4
+ children: any;
5
+ title: any;
6
+ position: any;
7
+ extended: any;
8
+ onExtendedChange: any;
9
+ transition: any;
10
+ closeIcon: any;
11
+ divider: any;
12
+ } & {
13
+ variant?: "standard" | "modal";
14
+ children: React.ReactNode;
15
+ title?: string;
16
+ position?: "left" | "right";
17
+ extended?: boolean;
18
+ onExtendedChange?: (extended: boolean) => void;
19
+ transition?: import('motion').Transition;
20
+ closeIcon?: import('..').Icon;
21
+ divider?: boolean;
22
+ } & {
23
+ isExtended: boolean;
24
+ } & {
25
+ className: string | import('..').ClassNameComponent<SideSheetInterface> | undefined;
26
+ }) => Record<"container" | "content" | "header" | "title" | "overlay" | "divider" | "slideSheet" | "closeButton", string>;
27
+ //# sourceMappingURL=side-sheet.style.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"side-sheet.style.d.ts","sourceRoot":"","sources":["../../../src/lib/styles/side-sheet.style.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAExE,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;yHA2B1B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@udixio/ui-react",
3
- "version": "1.5.0",
3
+ "version": "1.6.1",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -36,7 +36,7 @@
36
36
  "react": "^19.1.1",
37
37
  "react-dom": "^19.1.1",
38
38
  "@udixio/theme": "1.2.0",
39
- "@udixio/tailwind": "1.5.0"
39
+ "@udixio/tailwind": "1.7.0"
40
40
  },
41
41
  "repository": {
42
42
  "type": "git",
@@ -0,0 +1,128 @@
1
+ import { MotionProps } from '../utils';
2
+ import { SideSheetInterface } from '../interfaces';
3
+ import { sideSheetStyle } from '../styles';
4
+ import { Divider } from './Divider';
5
+
6
+ import { faXmark } from '@fortawesome/free-solid-svg-icons';
7
+ import { IconButton } from './IconButton';
8
+ import { useEffect, useState } from 'react';
9
+ import { createPortal } from 'react-dom';
10
+ import { AnimatePresence, motion } from 'motion/react';
11
+
12
+ /**
13
+ * Side sheets show secondary content anchored to the side of the screen
14
+ * @status beta
15
+ * @category Layout
16
+ */
17
+ export const SideSheet = ({
18
+ variant = 'standard',
19
+ className,
20
+ children,
21
+ title,
22
+ position = 'right',
23
+ extended,
24
+ divider,
25
+ onExtendedChange,
26
+ closeIcon = faXmark,
27
+ transition,
28
+ ...rest
29
+ }: MotionProps<SideSheetInterface>) => {
30
+ transition = { duration: 0.3, ...transition };
31
+
32
+ const [isExtended, setIsExtended] = useState(extended ?? true);
33
+
34
+ const styles = sideSheetStyle({
35
+ transition,
36
+ title,
37
+ position,
38
+ closeIcon,
39
+ className,
40
+ children,
41
+ onExtendedChange,
42
+ divider,
43
+ isExtended,
44
+ extended: isExtended,
45
+ variant,
46
+ });
47
+
48
+ useEffect(() => {
49
+ onExtendedChange?.(isExtended ?? false);
50
+ }, [isExtended]);
51
+
52
+ useEffect(() => {
53
+ if (extended != undefined) {
54
+ setIsExtended(extended);
55
+ }
56
+ }, [extended]);
57
+
58
+ const variants = {
59
+ close: {
60
+ width: 0,
61
+ },
62
+ open: {
63
+ width: 'auto',
64
+ },
65
+ };
66
+
67
+ const render = () => (
68
+ <>
69
+ <AnimatePresence>
70
+ {variant == 'modal' && isExtended && (
71
+ <motion.div
72
+ initial={{ opacity: 0 }}
73
+ animate={{ opacity: 1 }}
74
+ exit={{ opacity: 0 }}
75
+ transition={transition}
76
+ onClick={() => setIsExtended(false)}
77
+ className={styles.overlay}
78
+ ></motion.div>
79
+ )}
80
+ </AnimatePresence>
81
+ <AnimatePresence>
82
+ {isExtended && (
83
+ <div
84
+ {...rest}
85
+ className={styles.slideSheet}
86
+ style={{ transition: transition.duration + 's' }}
87
+ >
88
+ <motion.div
89
+ variants={variants}
90
+ initial={extended === false ? 'open' : 'close'}
91
+ animate={'open'}
92
+ exit={'close'}
93
+ className={styles.container}
94
+ >
95
+ <div className={styles.header}>
96
+ {title && <p className={styles.title}>{title}</p>}
97
+ <IconButton
98
+ size={'small'}
99
+ label={'close'}
100
+ icon={closeIcon}
101
+ onClick={() => setIsExtended(false)}
102
+ className={styles.closeButton}
103
+ ></IconButton>
104
+ </div>
105
+ <div
106
+ className={styles.content}
107
+ style={{ transition: transition.duration + 's' }}
108
+ >
109
+ {children}
110
+ </div>
111
+ </motion.div>
112
+ {(divider == undefined && variant == 'standard'
113
+ ? true
114
+ : divider) && (
115
+ <Divider className={styles.divider} orientation="vertical" />
116
+ )}
117
+ </div>
118
+ )}
119
+ </AnimatePresence>
120
+ </>
121
+ );
122
+
123
+ if (variant == 'modal') {
124
+ return createPortal(render(), document.body);
125
+ }
126
+
127
+ return render();
128
+ };
@@ -9,6 +9,7 @@ export * from './IconButton';
9
9
  export * from './IconButton';
10
10
  export * from './ProgressIndicator';
11
11
  export * from './Slider';
12
+ export * from './SideSheet';
12
13
  export * from './Snackbar';
13
14
  export * from './Switch';
14
15
  export * from './Tab';
@@ -1,4 +1,4 @@
1
- import { type ConfigInterface, loader } from '@udixio/theme';
1
+ import { type API, type ConfigInterface, loader } from '@udixio/theme';
2
2
  import { useEffect, useRef, useState } from 'react';
3
3
  import { TailwindPlugin } from '@udixio/tailwind';
4
4
 
@@ -10,11 +10,12 @@ function isValidHexColor(hexColorString: string) {
10
10
  export const ThemeProvider = ({
11
11
  config,
12
12
  throttleDelay = 100, // Délai par défaut de 300ms
13
+ onLoad,
13
14
  }: {
14
15
  config: ConfigInterface;
16
+ onLoad?: (api: API) => void;
15
17
  throttleDelay?: number;
16
18
  }) => {
17
- const [error, setError] = useState<string | null>(null);
18
19
  const [outputCss, setOutputCss] = useState<null | string>(null);
19
20
 
20
21
  // Refs pour gérer le throttling
@@ -42,9 +43,9 @@ export const ThemeProvider = ({
42
43
  }
43
44
 
44
45
  // Programmer un nouveau changement de thème avec un délai
45
- timeoutRef.current = setTimeout(() => {
46
+ timeoutRef.current = setTimeout(async () => {
46
47
  lastSourceColorRef.current = config.sourceColor;
47
- applyThemeChange(config.sourceColor);
48
+ await applyThemeChange(config.sourceColor);
48
49
  timeoutRef.current = null;
49
50
  }, throttleDelay);
50
51
 
@@ -59,19 +60,16 @@ export const ThemeProvider = ({
59
60
 
60
61
  const applyThemeChange = async (sourceColor: string) => {
61
62
  if (!isValidHexColor(sourceColor)) {
62
- setError('Invalid hex color');
63
- return;
63
+ throw new Error('Invalid hex color');
64
64
  }
65
65
 
66
- setError(null);
67
-
68
66
  try {
69
67
  // Mesure du temps de chargement de l'API
70
- const api = await loader(config);
71
- api.themes.update({
72
- sourceColorHex: sourceColor,
68
+ const api = await loader({
69
+ ...config,
70
+ sourceColor,
73
71
  });
74
- await api.load();
72
+ onLoad?.(api);
75
73
 
76
74
  const generatedCss = api.plugins
77
75
  .getPlugin(TailwindPlugin)
@@ -81,7 +79,9 @@ export const ThemeProvider = ({
81
79
  setOutputCss(generatedCss);
82
80
  }
83
81
  } catch (err) {
84
- setError(err instanceof Error ? err.message : 'Theme loading failed');
82
+ throw new Error(
83
+ err instanceof Error ? err.message : 'Theme loading failed',
84
+ );
85
85
  }
86
86
  };
87
87
 
@@ -94,12 +94,7 @@ export const ThemeProvider = ({
94
94
  };
95
95
  }, []);
96
96
 
97
- if (error) {
98
- return null;
99
- }
100
-
101
97
  if (!outputCss) {
102
- console.error('ThemeProvider null');
103
98
  return null;
104
99
  }
105
100
 
@@ -6,6 +6,7 @@ export * from './divider.interface';
6
6
  export * from './fab.interface';
7
7
  export * from './icon-button.interface';
8
8
  export * from './progress-indicator.interface';
9
+ export * from './side-sheet.interface';
9
10
  export * from './slider.interface';
10
11
  export * from './snackbar.interface';
11
12
  export * from './switch.interface';
@@ -25,12 +25,12 @@ export interface NavigationRailInterface {
25
25
  selectedItem?: number | null;
26
26
  setSelectedItem?: Dispatch<SetStateAction<number | null>>;
27
27
  extended?: boolean;
28
+ onExtendedChange?: (extended: boolean) => void;
28
29
  alignment?: 'middle' | 'top';
29
30
  menu?: {
30
31
  closed: MenuState;
31
32
  opened: MenuState;
32
33
  };
33
- onExtendedChange?: (extended: boolean) => void;
34
34
 
35
35
  transition?: Transition;
36
36
  };
@@ -0,0 +1,28 @@
1
+ import { Transition } from 'motion';
2
+ import { Icon } from '../icon';
3
+
4
+ export interface SideSheetInterface {
5
+ type: 'div';
6
+ props: {
7
+ variant?: 'standard' | 'modal';
8
+ children: React.ReactNode;
9
+ title?: string;
10
+ position?: 'left' | 'right';
11
+ extended?: boolean;
12
+ onExtendedChange?: (extended: boolean) => void;
13
+ transition?: Transition;
14
+ closeIcon?: Icon;
15
+ divider?: boolean;
16
+ };
17
+ states: { isExtended: boolean };
18
+ elements: [
19
+ 'slideSheet',
20
+ 'container',
21
+ 'title',
22
+ 'content',
23
+ 'header',
24
+ 'closeButton',
25
+ 'divider',
26
+ 'overlay',
27
+ ];
28
+ }
@@ -6,6 +6,7 @@ export * from './divider.style';
6
6
  export * from './fab.style';
7
7
  export * from './icon-button.style';
8
8
  export * from './progress-indicator.style';
9
+ export * from './side-sheet.style';
9
10
  export * from './slider.style';
10
11
  export * from './snackbar.style';
11
12
  export * from './switch.style';
@@ -0,0 +1,31 @@
1
+ import { classNames, defaultClassNames } from '../utils';
2
+ import { SideSheetInterface } from '../interfaces/side-sheet.interface';
3
+
4
+ export const sideSheetStyle = defaultClassNames<SideSheetInterface>(
5
+ 'slideSheet',
6
+ ({ variant, position }) => ({
7
+ slideSheet: classNames(
8
+ 'bg-surface flex justify-between max-w-xs z-10',
9
+ {
10
+ 'flex-row-reverse': position == 'right',
11
+ 'h-full': variant == 'standard',
12
+ },
13
+ variant == 'modal' && [
14
+ 'rounded-2xl fixed top-0 m-[1rem] h-[calc(100dvh-2rem)]',
15
+ {
16
+ 'right-0': position == 'right',
17
+ 'left-0': position == 'left',
18
+ },
19
+ ],
20
+ ),
21
+ container: classNames('w-full overflow-hidden', {}),
22
+ content: classNames('w-fit '),
23
+ header: classNames('p-4 flex items-center gap-2'),
24
+ title: classNames('text-on-surface-variant text-title-large'),
25
+ closeButton: classNames('ml-auto'),
26
+ divider: classNames({ hidden: variant == 'modal' }),
27
+ overlay: classNames(
28
+ 'bg-[black]/[0.32] fixed top-0 left-0 w-screen h-screen',
29
+ ),
30
+ }),
31
+ );
@@ -0,0 +1,45 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { MotionProps, ReactProps, SideSheet, SideSheetInterface } from '../../';
3
+
4
+ // More on how to set up stories at: https://storybook.js.org/docs/react/writing-stories/introduction#default-export
5
+ const meta = {
6
+ title: 'containment/SlideSheet',
7
+ component: SideSheet,
8
+ parameters: {
9
+ // Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/react/configure/story-layout
10
+ },
11
+ // This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/react/writing-docs/autodocs
12
+ tags: ['autodocs'],
13
+ // More on argTypes: https://storybook.js.org/docs/react/api/argtypes
14
+ argTypes: {},
15
+ } satisfies Meta<typeof SideSheet>;
16
+
17
+ export default meta;
18
+ type Story = StoryObj<typeof meta>;
19
+
20
+ // More on writing stories with args: https://storybook.js.org/docs/react/writing-stories/args
21
+
22
+ const createSlideSheetStory = (
23
+ variant: ReactProps<SideSheetInterface>['variant'],
24
+ ) => {
25
+ const SlideSheetStory: Story = (args: MotionProps<SideSheetInterface>) => (
26
+ <>
27
+ <div
28
+ className={
29
+ 'bg-surface-container-highest h-screen w-full flex justify-between'
30
+ }
31
+ >
32
+ <SideSheet position={'left'} {...args}></SideSheet>
33
+ <SideSheet position={'right'} {...args}></SideSheet>
34
+ </div>
35
+ </>
36
+ );
37
+ SlideSheetStory.args = {
38
+ children: <div className={'h-96 w-96 bg-secondary-container'}></div>,
39
+ variant: variant,
40
+ title: 'SlideSheet',
41
+ };
42
+ return SlideSheetStory;
43
+ };
44
+ export const Standard = createSlideSheetStory('standard');
45
+ export const Modal = createSlideSheetStory('modal');