@udixio/ui-react 2.9.5 → 2.9.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/index.cjs +3 -3
  3. package/dist/index.js +1802 -1703
  4. package/dist/lib/components/Tab.d.ts +1 -1
  5. package/dist/lib/components/Tab.d.ts.map +1 -1
  6. package/dist/lib/components/TabGroup.d.ts +9 -0
  7. package/dist/lib/components/TabGroup.d.ts.map +1 -0
  8. package/dist/lib/components/TabGroupContext.d.ts +10 -0
  9. package/dist/lib/components/TabGroupContext.d.ts.map +1 -0
  10. package/dist/lib/components/TabPanel.d.ts +10 -0
  11. package/dist/lib/components/TabPanel.d.ts.map +1 -0
  12. package/dist/lib/components/TabPanels.d.ts +10 -0
  13. package/dist/lib/components/TabPanels.d.ts.map +1 -0
  14. package/dist/lib/components/Tabs.d.ts.map +1 -1
  15. package/dist/lib/components/index.d.ts +3 -0
  16. package/dist/lib/components/index.d.ts.map +1 -1
  17. package/dist/lib/interfaces/index.d.ts +2 -0
  18. package/dist/lib/interfaces/index.d.ts.map +1 -1
  19. package/dist/lib/interfaces/tab-group.interface.d.ts +13 -0
  20. package/dist/lib/interfaces/tab-group.interface.d.ts.map +1 -0
  21. package/dist/lib/interfaces/tab-panels.interface.d.ts +20 -0
  22. package/dist/lib/interfaces/tab-panels.interface.d.ts.map +1 -0
  23. package/dist/lib/interfaces/tab.interface.d.ts +2 -1
  24. package/dist/lib/interfaces/tab.interface.d.ts.map +1 -1
  25. package/dist/lib/styles/index.d.ts +1 -0
  26. package/dist/lib/styles/index.d.ts.map +1 -1
  27. package/dist/lib/styles/tab-panels.style.d.ts +31 -0
  28. package/dist/lib/styles/tab-panels.style.d.ts.map +1 -0
  29. package/dist/lib/styles/tab.style.d.ts +2 -0
  30. package/dist/lib/styles/tab.style.d.ts.map +1 -1
  31. package/package.json +3 -3
  32. package/src/lib/components/Tab.tsx +5 -1
  33. package/src/lib/components/TabGroup.tsx +60 -0
  34. package/src/lib/components/TabGroupContext.tsx +11 -0
  35. package/src/lib/components/TabPanel.tsx +24 -0
  36. package/src/lib/components/TabPanels.tsx +71 -0
  37. package/src/lib/components/Tabs.tsx +17 -6
  38. package/src/lib/components/index.ts +3 -0
  39. package/src/lib/interfaces/index.ts +2 -0
  40. package/src/lib/interfaces/tab-group.interface.ts +13 -0
  41. package/src/lib/interfaces/tab-panels.interface.ts +21 -0
  42. package/src/lib/interfaces/tab.interface.ts +2 -1
  43. package/src/lib/styles/index.ts +1 -0
  44. package/src/lib/styles/tab-panels.style.ts +35 -0
@@ -4,5 +4,5 @@ import { ReactProps } from '../utils/component';
4
4
  * @status beta
5
5
  * @parent Tabs
6
6
  */
7
- export declare const Tab: ({ className, onClick, label, variant, href, icon, selectedTab, setSelectedTab, tabsId, index, onTabSelected, scrollable, selected, ref, ...restProps }: ReactProps<TabInterface>) => import("react/jsx-runtime").JSX.Element;
7
+ export declare const Tab: ({ className, onClick, label: labelProp, variant, href, icon, selectedTab, setSelectedTab, tabsId, index, onTabSelected, scrollable, selected, children, ref, ...restProps }: ReactProps<TabInterface>) => import("react/jsx-runtime").JSX.Element;
8
8
  //# sourceMappingURL=Tab.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tab.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Tab.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD;;;GAGG;AACH,eAAO,MAAM,GAAG,GAAI,wJAgBjB,UAAU,CAAC,YAAY,CAAC,4CAoF1B,CAAC"}
1
+ {"version":3,"file":"Tab.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Tab.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD;;;GAGG;AACH,eAAO,MAAM,GAAG,GAAI,6KAiBjB,UAAU,CAAC,YAAY,CAAC,4CAuF1B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { TabGroupInterface } from '../interfaces/tab-group.interface';
2
+ import { ReactProps } from '../utils/component';
3
+ /**
4
+ * TabGroup provides shared state for Tabs and TabPanels
5
+ * @status beta
6
+ * @category Navigation
7
+ */
8
+ export declare const TabGroup: ({ children, selectedTab: externalSelectedTab, setSelectedTab: externalSetSelectedTab, defaultTab, }: ReactProps<TabGroupInterface>) => import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=TabGroup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabGroup.d.ts","sourceRoot":"","sources":["../../../src/lib/components/TabGroup.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAI,qGAKtB,UAAU,CAAC,iBAAiB,CAAC,4CA2C/B,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { Dispatch, SetStateAction } from 'react';
2
+ export interface TabGroupContextValue {
3
+ selectedTab: number | null;
4
+ setSelectedTab: Dispatch<SetStateAction<number | null>>;
5
+ previousTab: number | null;
6
+ direction: number;
7
+ tabsId: string;
8
+ }
9
+ export declare const TabGroupContext: import('react').Context<TabGroupContextValue | null>;
10
+ //# sourceMappingURL=TabGroupContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabGroupContext.d.ts","sourceRoot":"","sources":["../../../src/lib/components/TabGroupContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAEhE,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IACxD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,eAAe,sDAAmD,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { TabPanelInterface } from '../interfaces/tab-panels.interface';
2
+ import { ReactProps } from '../utils/component';
3
+ /**
4
+ * TabPanel contains the content for a single tab
5
+ * Must be used within TabPanels
6
+ * @status beta
7
+ * @category Navigation
8
+ */
9
+ export declare const TabPanel: ({ children, className, isSelected, }: ReactProps<TabPanelInterface>) => import("react/jsx-runtime").JSX.Element;
10
+ //# sourceMappingURL=TabPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabPanel.d.ts","sourceRoot":"","sources":["../../../src/lib/components/TabPanel.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,GAAI,sCAItB,UAAU,CAAC,iBAAiB,CAAC,4CAQ/B,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { TabPanelsInterface } from '../interfaces/tab-panels.interface';
2
+ import { ReactProps } from '../utils/component';
3
+ /**
4
+ * TabPanels renders the content panels with slide animation
5
+ * Must be used within a TabGroup
6
+ * @status beta
7
+ * @category Navigation
8
+ */
9
+ export declare const TabPanels: ({ children, className, }: ReactProps<TabPanelsInterface>) => import("react/jsx-runtime").JSX.Element | null;
10
+ //# sourceMappingURL=TabPanels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabPanels.d.ts","sourceRoot":"","sources":["../../../src/lib/components/TabPanels.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIhD;;;;;GAKG;AACH,eAAO,MAAM,SAAS,GAAI,0BAGvB,UAAU,CAAC,kBAAkB,CAAC,mDAqDhC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Tabs.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAG7D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIhD;;;;GAIG;AACH,eAAO,MAAM,IAAI,GAAI,wIAQlB,UAAU,CAAC,aAAa,CAAC,4CAmE3B,CAAC"}
1
+ {"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Tabs.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAG7D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAKhD;;;;GAIG;AACH,eAAO,MAAM,IAAI,GAAI,wIAQlB,UAAU,CAAC,aAAa,CAAC,4CA6E3B,CAAC"}
@@ -17,6 +17,9 @@ export * from './Snackbar';
17
17
  export * from './Switch';
18
18
  export * from './Tab';
19
19
  export * from './Tabs';
20
+ export * from './TabGroup';
21
+ export * from './TabPanels';
22
+ export * from './TabPanel';
20
23
  export * from './TextField';
21
24
  export * from './NavigationRailItem';
22
25
  export * from './NavigationRail';
@@ -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,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,OAAO,CAAC;AACtB,cAAc,WAAW,CAAC;AAC1B,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
+ {"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,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,OAAO,CAAC;AACtB,cAAc,WAAW,CAAC;AAC1B,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,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC"}
@@ -15,6 +15,8 @@ export * from './snackbar.interface';
15
15
  export * from './switch.interface';
16
16
  export * from './tab.interface';
17
17
  export * from './tabs.interface';
18
+ export * from './tab-group.interface';
19
+ export * from './tab-panels.interface';
18
20
  export * from './text-field.interface';
19
21
  export * from './navigation-rail-item.interface';
20
22
  export * from './tooltip.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,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,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"}
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,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,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,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kCAAkC,CAAC;AACjD,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { Dispatch, ReactNode, SetStateAction } from 'react';
2
+ export interface TabGroupInterface {
3
+ type: 'div';
4
+ props: {
5
+ children: ReactNode;
6
+ selectedTab?: number | null;
7
+ setSelectedTab?: Dispatch<SetStateAction<number | null>>;
8
+ defaultTab?: number;
9
+ };
10
+ states: object;
11
+ elements: ['tabGroup'];
12
+ }
13
+ //# sourceMappingURL=tab-group.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tab-group.interface.d.ts","sourceRoot":"","sources":["../../../src/lib/interfaces/tab-group.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAE5D,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE;QACL,QAAQ,EAAE,SAAS,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,cAAc,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;QACzD,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,UAAU,CAAC,CAAC;CACxB"}
@@ -0,0 +1,20 @@
1
+ import { ReactNode } from 'react';
2
+ export interface TabPanelsInterface {
3
+ type: 'div';
4
+ props: {
5
+ children: ReactNode;
6
+ };
7
+ states: object;
8
+ elements: ['tabPanels'];
9
+ }
10
+ export interface TabPanelInterface {
11
+ type: 'div';
12
+ props: {
13
+ children: ReactNode;
14
+ };
15
+ states: {
16
+ isSelected: boolean;
17
+ };
18
+ elements: ['tabPanel'];
19
+ }
20
+ //# sourceMappingURL=tab-panels.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tab-panels.interface.d.ts","sourceRoot":"","sources":["../../../src/lib/interfaces/tab-panels.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE;QACL,QAAQ,EAAE,SAAS,CAAC;KACrB,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,WAAW,CAAC,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE;QACL,QAAQ,EAAE,SAAS,CAAC;KACrB,CAAC;IACF,MAAM,EAAE;QACN,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,QAAQ,EAAE,CAAC,UAAU,CAAC,CAAC;CACxB"}
@@ -1,6 +1,6 @@
1
1
  import { ActionOrLink } from '../utils/component';
2
2
  import { TabsVariant } from './tabs.interface';
3
- import { Dispatch, RefObject, SetStateAction } from 'react';
3
+ import { Dispatch, ReactNode, RefObject, SetStateAction } from 'react';
4
4
  import { Icon } from '../icon';
5
5
  export type TabProps = {
6
6
  selected?: boolean;
@@ -17,6 +17,7 @@ export type TabProps = {
17
17
  }) => void;
18
18
  index?: number;
19
19
  scrollable?: boolean;
20
+ children?: ReactNode;
20
21
  };
21
22
  type Elements = ['tab', 'stateLayer', 'icon', 'label', 'content', 'underline'];
22
23
  export type TabInterface = ActionOrLink<TabProps> & {
@@ -1 +1 @@
1
- {"version":3,"file":"tab.interface.d.ts","sourceRoot":"","sources":["../../../src/lib/interfaces/tab.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,cAAc,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,CACd,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC,GAAG;QACzD,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;KACrB,KACA,IAAI,CAAC;IACV,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,KAAK,QAAQ,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;AAE/E,MAAM,MAAM,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG;IAClD,MAAM,EAAE;QACN,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,QAAQ,EAAE,QAAQ,CAAC;CACpB,CAAC"}
1
+ {"version":3,"file":"tab.interface.d.ts","sourceRoot":"","sources":["../../../src/lib/interfaces/tab.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,cAAc,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,CACd,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC,GAAG;QACzD,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;KACrB,KACA,IAAI,CAAC;IACV,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,KAAK,QAAQ,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;AAE/E,MAAM,MAAM,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG;IAClD,MAAM,EAAE;QACN,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,QAAQ,EAAE,QAAQ,CAAC;CACpB,CAAC"}
@@ -15,6 +15,7 @@ export * from './snackbar.style';
15
15
  export * from './switch.style';
16
16
  export * from './tab.style';
17
17
  export * from './tabs.style';
18
+ export * from './tab-panels.style';
18
19
  export * from './text-field.style';
19
20
  export * from './tooltip.style';
20
21
  export { useButtonStyle } from './button.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,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,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;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,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,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,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,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { TabPanelsInterface, TabPanelInterface } from '../interfaces';
2
+ import { ClassNameComponent } from '../utils';
3
+ export declare const tabPanelsStyle: (states: {
4
+ children: any;
5
+ } & {
6
+ children: import('react').ReactNode;
7
+ } & object & {
8
+ className: string | ClassNameComponent<TabPanelsInterface> | undefined;
9
+ }) => Record<"tabPanels", string>;
10
+ export declare const useTabPanelsStyle: (states: object & {
11
+ children: import('react').ReactNode;
12
+ } & {
13
+ className?: string | ClassNameComponent<TabPanelsInterface> | undefined;
14
+ }) => Record<"tabPanels", string>;
15
+ export declare const tabPanelStyle: (states: {
16
+ children: any;
17
+ } & {
18
+ children: import('react').ReactNode;
19
+ } & {
20
+ isSelected: boolean;
21
+ } & {
22
+ className: string | ClassNameComponent<TabPanelInterface> | undefined;
23
+ }) => Record<"tabPanel", string>;
24
+ export declare const useTabPanelStyle: (states: {
25
+ isSelected: boolean;
26
+ } & {
27
+ children: import('react').ReactNode;
28
+ } & {
29
+ className?: string | ClassNameComponent<TabPanelInterface> | undefined;
30
+ }) => Record<"tabPanel", string>;
31
+ //# sourceMappingURL=tab-panels.style.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tab-panels.style.d.ts","sourceRoot":"","sources":["../../../src/lib/styles/tab-panels.style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EACL,KAAK,kBAAkB,EAIxB,MAAM,UAAU,CAAC;AAMlB,eAAO,MAAM,cAAc;;;;;;iCAG1B,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;iCAG7B,CAAC;AAMF,eAAO,MAAM,aAAa;;;;;;;;gCAGzB,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;;;;gCAG5B,CAAC"}
@@ -11,6 +11,7 @@ export declare const tabStyle: (states: (({
11
11
  onTabSelected: any;
12
12
  index: any;
13
13
  scrollable: any;
14
+ children: any;
14
15
  href: any;
15
16
  } | {
16
17
  selected: any;
@@ -23,6 +24,7 @@ export declare const tabStyle: (states: (({
23
24
  onTabSelected: any;
24
25
  index: any;
25
26
  scrollable: any;
27
+ children: any;
26
28
  href: any;
27
29
  }) & ((import('..').TabProps & {
28
30
  href?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"tab.style.d.ts","sourceRoot":"","sources":["../../../src/lib/styles/tab.style.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EAIxB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAqE7C,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uFAAoD,CAAC;AAE1E,eAAO,MAAM,WAAW;;;;;;;;wFAAsD,CAAC"}
1
+ {"version":3,"file":"tab.style.d.ts","sourceRoot":"","sources":["../../../src/lib/styles/tab.style.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EAIxB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAqE7C,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uFAAoD,CAAC;AAE1E,eAAO,MAAM,WAAW;;;;;;;;wFAAsD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@udixio/ui-react",
3
- "version": "2.9.5",
3
+ "version": "2.9.6",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -36,8 +36,8 @@
36
36
  "devDependencies": {
37
37
  "react": "^19.1.1",
38
38
  "react-dom": "^19.1.1",
39
- "@udixio/theme": "2.1.8",
40
- "@udixio/tailwind": "2.4.6"
39
+ "@udixio/theme": "2.1.9",
40
+ "@udixio/tailwind": "2.4.7"
41
41
  },
42
42
  "repository": {
43
43
  "type": "git",
@@ -14,7 +14,7 @@ import { State } from '../effects';
14
14
  export const Tab = ({
15
15
  className,
16
16
  onClick,
17
- label,
17
+ label: labelProp,
18
18
  variant = 'primary',
19
19
  href,
20
20
  icon,
@@ -25,12 +25,16 @@ export const Tab = ({
25
25
  onTabSelected,
26
26
  scrollable = false,
27
27
  selected = false,
28
+ children,
28
29
  ref,
29
30
  ...restProps
30
31
  }: ReactProps<TabInterface>) => {
31
32
  const defaultRef = useRef(null);
32
33
  const resolvedRef = ref || defaultRef;
33
34
 
35
+ // children (string) peut être utilisé comme alternative à label prop
36
+ const label = labelProp ?? (typeof children === 'string' ? children : undefined);
37
+
34
38
  const [isSelected, setIsSelected] = useState<boolean>(selected);
35
39
 
36
40
  useEffect(() => {
@@ -0,0 +1,60 @@
1
+ import React, { useMemo, useRef, useState } from 'react';
2
+ import { v4 as uuidv4 } from 'uuid';
3
+ import { TabGroupContext, TabGroupContextValue } from './TabGroupContext';
4
+ import { TabGroupInterface } from '../interfaces/tab-group.interface';
5
+ import { ReactProps } from '../utils/component';
6
+
7
+ /**
8
+ * TabGroup provides shared state for Tabs and TabPanels
9
+ * @status beta
10
+ * @category Navigation
11
+ */
12
+ export const TabGroup = ({
13
+ children,
14
+ selectedTab: externalSelectedTab,
15
+ setSelectedTab: externalSetSelectedTab,
16
+ defaultTab = 0,
17
+ }: ReactProps<TabGroupInterface>) => {
18
+ const [internalSelectedTab, internalSetSelectedTab] = useState<number | null>(
19
+ defaultTab,
20
+ );
21
+ const previousTabRef = useRef<number | null>(null);
22
+
23
+ // Priorité : props externes > état interne
24
+ const selectedTab =
25
+ externalSelectedTab !== undefined ? externalSelectedTab : internalSelectedTab;
26
+
27
+ const setSelectedTab = externalSetSelectedTab ?? internalSetSelectedTab;
28
+
29
+ // Calculer la direction du slide
30
+ const direction =
31
+ previousTabRef.current !== null && selectedTab !== null
32
+ ? selectedTab > previousTabRef.current
33
+ ? 1
34
+ : -1
35
+ : 0;
36
+
37
+ // Mettre à jour la référence précédente
38
+ if (selectedTab !== previousTabRef.current) {
39
+ previousTabRef.current = selectedTab;
40
+ }
41
+
42
+ const tabsId = useMemo(() => uuidv4(), []);
43
+
44
+ const contextValue: TabGroupContextValue = useMemo(
45
+ () => ({
46
+ selectedTab,
47
+ setSelectedTab,
48
+ previousTab: previousTabRef.current,
49
+ direction,
50
+ tabsId,
51
+ }),
52
+ [selectedTab, setSelectedTab, direction, tabsId],
53
+ );
54
+
55
+ return (
56
+ <TabGroupContext.Provider value={contextValue}>
57
+ {children}
58
+ </TabGroupContext.Provider>
59
+ );
60
+ };
@@ -0,0 +1,11 @@
1
+ import { createContext, Dispatch, SetStateAction } from 'react';
2
+
3
+ export interface TabGroupContextValue {
4
+ selectedTab: number | null;
5
+ setSelectedTab: Dispatch<SetStateAction<number | null>>;
6
+ previousTab: number | null;
7
+ direction: number;
8
+ tabsId: string;
9
+ }
10
+
11
+ export const TabGroupContext = createContext<TabGroupContextValue | null>(null);
@@ -0,0 +1,24 @@
1
+ import React from 'react';
2
+ import { TabPanelInterface } from '../interfaces/tab-panels.interface';
3
+ import { ReactProps } from '../utils/component';
4
+ import { useTabPanelStyle } from '../styles/tab-panels.style';
5
+
6
+ /**
7
+ * TabPanel contains the content for a single tab
8
+ * Must be used within TabPanels
9
+ * @status beta
10
+ * @category Navigation
11
+ */
12
+ export const TabPanel = ({
13
+ children,
14
+ className,
15
+ isSelected = false,
16
+ }: ReactProps<TabPanelInterface>) => {
17
+ const styles = useTabPanelStyle({
18
+ children,
19
+ className,
20
+ isSelected,
21
+ });
22
+
23
+ return <div className={styles.tabPanel}>{children}</div>;
24
+ };
@@ -0,0 +1,71 @@
1
+ import React, { useContext } from 'react';
2
+ import { AnimatePresence, motion } from 'motion/react';
3
+ import { TabGroupContext } from './TabGroupContext';
4
+ import { TabPanelsInterface } from '../interfaces/tab-panels.interface';
5
+ import { ReactProps } from '../utils/component';
6
+ import { useTabPanelsStyle } from '../styles/tab-panels.style';
7
+ import { TabPanel } from './TabPanel';
8
+
9
+ /**
10
+ * TabPanels renders the content panels with slide animation
11
+ * Must be used within a TabGroup
12
+ * @status beta
13
+ * @category Navigation
14
+ */
15
+ export const TabPanels = ({
16
+ children,
17
+ className,
18
+ }: ReactProps<TabPanelsInterface>) => {
19
+ const context = useContext(TabGroupContext);
20
+
21
+ if (!context) {
22
+ console.warn('TabPanels must be used within a TabGroup');
23
+ return null;
24
+ }
25
+
26
+ const { selectedTab, direction, tabsId } = context;
27
+
28
+ const panelChildren = React.Children.toArray(children).filter(
29
+ (child) => React.isValidElement(child) && child.type === TabPanel,
30
+ ) as React.ReactElement[];
31
+
32
+ const styles = useTabPanelsStyle({
33
+ children,
34
+ className,
35
+ });
36
+
37
+ return (
38
+ <div className={styles.tabPanels}>
39
+ <AnimatePresence initial={false} custom={direction} mode="popLayout">
40
+ {panelChildren.map(
41
+ (child, index) =>
42
+ selectedTab === index && (
43
+ <motion.div
44
+ key={index}
45
+ custom={direction}
46
+ variants={{
47
+ enter: (dir: number) => ({
48
+ x: dir * 100 + '%',
49
+ opacity: 1,
50
+ }),
51
+ center: { x: 0, opacity: 1 },
52
+ exit: (dir: number) => ({
53
+ x: dir * -100 + '%',
54
+ opacity: 1,
55
+ }),
56
+ }}
57
+ initial="enter"
58
+ animate="center"
59
+ exit="exit"
60
+ transition={{ type: 'spring', stiffness: 400, damping: 40 }}
61
+ role="tabpanel"
62
+ aria-labelledby={`tab-${tabsId}-${index}`}
63
+ >
64
+ {React.cloneElement(child, { isSelected: true })}
65
+ </motion.div>
66
+ ),
67
+ )}
68
+ </AnimatePresence>
69
+ </div>
70
+ );
71
+ };
@@ -1,4 +1,4 @@
1
- import React, { useMemo, useState } from 'react';
1
+ import React, { useContext, useMemo, useState } from 'react';
2
2
  import { v4 as uuidv4 } from 'uuid';
3
3
  import { TabsInterface } from '../interfaces/tabs.interface';
4
4
 
@@ -6,6 +6,7 @@ import { useTabsStyle } from '../styles/tabs.style';
6
6
  import { ReactProps } from '../utils/component';
7
7
  import { TabProps } from '../interfaces/tab.interface';
8
8
  import { Tab } from './Tab';
9
+ import { TabGroupContext } from './TabGroupContext';
9
10
 
10
11
  /**
11
12
  * Tabs organize content across different screens and views
@@ -21,22 +22,28 @@ export const Tabs = ({
21
22
  setSelectedTab: externalSetSelectedTab,
22
23
  scrollable = false,
23
24
  }: ReactProps<TabsInterface>) => {
25
+ const tabGroupContext = useContext(TabGroupContext);
26
+
24
27
  const [internalSelectedTab, internalSetSelectedTab] = useState<number | null>(
25
28
  null,
26
29
  );
27
30
 
31
+ // Priorité : props > context > état interne
28
32
  let selectedTab: number | null;
29
- if (externalSelectedTab == 0 || externalSelectedTab != undefined) {
33
+ if (externalSelectedTab === 0 || externalSelectedTab != undefined) {
30
34
  selectedTab = externalSelectedTab;
35
+ } else if (tabGroupContext) {
36
+ selectedTab = tabGroupContext.selectedTab;
31
37
  } else {
32
38
  selectedTab = internalSelectedTab;
33
39
  }
34
40
 
35
- const setSelectedTab = externalSetSelectedTab || internalSetSelectedTab;
41
+ const setSelectedTab =
42
+ externalSetSelectedTab ?? tabGroupContext?.setSelectedTab ?? internalSetSelectedTab;
36
43
 
37
44
  const tabChildren = React.Children.toArray(children).filter(
38
45
  (child) => React.isValidElement(child) && child.type === Tab,
39
- );
46
+ ) as React.ReactElement<TabProps>[];
40
47
 
41
48
  const ref = React.useRef<HTMLDivElement | null>(null);
42
49
 
@@ -60,7 +67,10 @@ export const Tabs = ({
60
67
  }
61
68
  };
62
69
 
63
- const tabsId = useMemo(() => uuidv4(), []);
70
+ const tabsId = useMemo(
71
+ () => tabGroupContext?.tabsId ?? uuidv4(),
72
+ [tabGroupContext?.tabsId],
73
+ );
64
74
 
65
75
  const styles = useTabsStyle({
66
76
  children,
@@ -71,10 +81,11 @@ export const Tabs = ({
71
81
  className,
72
82
  variant,
73
83
  });
84
+
74
85
  return (
75
86
  <div ref={ref} role="tablist" className={styles.tabs}>
76
87
  {tabChildren.map((child, index) => {
77
- return React.cloneElement(child as React.ReactElement<TabProps>, {
88
+ return React.cloneElement(child, {
78
89
  key: index,
79
90
  index,
80
91
  variant: variant,
@@ -17,6 +17,9 @@ export * from './Snackbar';
17
17
  export * from './Switch';
18
18
  export * from './Tab';
19
19
  export * from './Tabs';
20
+ export * from './TabGroup';
21
+ export * from './TabPanels';
22
+ export * from './TabPanel';
20
23
  export * from './TextField';
21
24
  export * from './NavigationRailItem';
22
25
  export * from './NavigationRail';
@@ -15,6 +15,8 @@ export * from './snackbar.interface';
15
15
  export * from './switch.interface';
16
16
  export * from './tab.interface';
17
17
  export * from './tabs.interface';
18
+ export * from './tab-group.interface';
19
+ export * from './tab-panels.interface';
18
20
  export * from './text-field.interface';
19
21
  export * from './navigation-rail-item.interface';
20
22
  export * from './tooltip.interface';
@@ -0,0 +1,13 @@
1
+ import { Dispatch, ReactNode, SetStateAction } from 'react';
2
+
3
+ export interface TabGroupInterface {
4
+ type: 'div';
5
+ props: {
6
+ children: ReactNode;
7
+ selectedTab?: number | null;
8
+ setSelectedTab?: Dispatch<SetStateAction<number | null>>;
9
+ defaultTab?: number;
10
+ };
11
+ states: object;
12
+ elements: ['tabGroup'];
13
+ }
@@ -0,0 +1,21 @@
1
+ import { ReactNode } from 'react';
2
+
3
+ export interface TabPanelsInterface {
4
+ type: 'div';
5
+ props: {
6
+ children: ReactNode;
7
+ };
8
+ states: object;
9
+ elements: ['tabPanels'];
10
+ }
11
+
12
+ export interface TabPanelInterface {
13
+ type: 'div';
14
+ props: {
15
+ children: ReactNode;
16
+ };
17
+ states: {
18
+ isSelected: boolean;
19
+ };
20
+ elements: ['tabPanel'];
21
+ }
@@ -1,6 +1,6 @@
1
1
  import { ActionOrLink } from '../utils/component';
2
2
  import { TabsVariant } from './tabs.interface';
3
- import { Dispatch, RefObject, SetStateAction } from 'react';
3
+ import { Dispatch, ReactNode, RefObject, SetStateAction } from 'react';
4
4
  import { Icon } from '../icon';
5
5
 
6
6
  export type TabProps = {
@@ -18,6 +18,7 @@ export type TabProps = {
18
18
  ) => void;
19
19
  index?: number;
20
20
  scrollable?: boolean;
21
+ children?: ReactNode;
21
22
  };
22
23
 
23
24
  type Elements = ['tab', 'stateLayer', 'icon', 'label', 'content', 'underline'];
@@ -15,6 +15,7 @@ export * from './snackbar.style';
15
15
  export * from './switch.style';
16
16
  export * from './tab.style';
17
17
  export * from './tabs.style';
18
+ export * from './tab-panels.style';
18
19
  export * from './text-field.style';
19
20
  export * from './tooltip.style';
20
21
  export { useButtonStyle } from './button.style';