@linagora/twake-mui 9.17.0 → 10.1.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.
- package/CHANGELOG.md +42 -0
- package/dist/components/ContactPopover/AttendeeInfo.d.ts +2 -1
- package/dist/components/ContactPopover/ContactPopoverActions.d.ts +1 -1
- package/dist/components/ContactPopover/ContactPopoverCalendarAction.d.ts +2 -1
- package/dist/components/ContactPopover/ContactPopoverChatAction.d.ts +2 -1
- package/dist/components/ContactPopover/ContactPopoverEmailAction.d.ts +2 -1
- package/dist/components/ContactPopover/ContactPopoverVideoAction.d.ts +2 -1
- package/dist/components/Layout/Layout.stories.js +4 -4
- package/dist/components/Nav/index.d.ts +1 -3
- package/dist/components/NavDesktopLimiter/index.js +3 -3
- package/dist/components/NavItem/NavBadge.d.ts +2 -0
- package/dist/components/NavItem/NavBadge.js +12 -0
- package/dist/components/NavItem/NavIndicator.d.ts +2 -0
- package/dist/components/NavItem/NavIndicator.js +7 -0
- package/dist/components/NavItem/NavItem.stories.d.ts +30 -0
- package/dist/components/NavItem/NavItem.stories.js +110 -0
- package/dist/components/NavItem/NavItemActions.d.ts +1 -0
- package/dist/components/NavItem/NavItemActions.js +11 -0
- package/dist/components/NavItem/NavItemRoot.d.ts +3 -0
- package/dist/components/NavItem/NavItemRoot.js +49 -0
- package/dist/components/NavItem/index.d.ts +9 -7
- package/dist/components/NavItem/index.js +19 -30
- package/dist/components/NavLink/NavDropdown.d.ts +7 -0
- package/dist/components/NavLink/NavDropdown.js +19 -0
- package/dist/components/NavLink/NavLink.d.ts +4 -0
- package/dist/components/NavLink/NavLink.js +6 -0
- package/dist/components/NavLink/NavLinkBase.d.ts +5 -0
- package/dist/components/NavLink/NavLinkBase.js +15 -0
- package/dist/components/NavLink/NavLinkRoot.d.ts +2 -0
- package/dist/components/NavLink/NavLinkRoot.js +41 -0
- package/dist/components/NavText/NavPrimaryText.d.ts +2 -0
- package/dist/components/NavText/NavPrimaryText.js +12 -0
- package/dist/components/NavText/NavSecondaryText.d.ts +2 -0
- package/dist/components/NavText/NavSecondaryText.js +8 -0
- package/dist/components/NavText/NavTertiaryText.d.ts +2 -0
- package/dist/components/NavText/NavTertiaryText.js +16 -0
- package/dist/components/NavText/NavTextRoot.d.ts +1 -0
- package/dist/components/NavText/NavTextRoot.js +7 -0
- package/dist/components/NavText/index.d.ts +6 -2
- package/dist/components/NavText/index.js +15 -14
- package/dist/components/SearchBar/DisableHighlight.d.ts +2 -1
- package/dist/components/SearchBar/FocusHighlight.d.ts +2 -1
- package/dist/components/SearchBar/Highlight.d.ts +1 -1
- package/dist/components/SearchBar/SearchBarButtonBase.d.ts +1 -3
- package/dist/components/SearchBar/SearchBarIconWrapper.d.ts +1 -1
- package/dist/components/SearchBar/SearchBarRoot.d.ts +1 -3
- package/dist/components/SearchBar/SearchBarTypography.d.ts +1 -3
- package/dist/components/SearchBar/index.js +2 -2
- package/dist/components/Sidebar/Sidebar.stories.js +11 -6
- package/dist/index.d.ts +7 -3
- package/dist/index.js +4 -2
- package/package.json +10 -10
- package/dist/components/NavLink/index.d.ts +0 -3
- package/dist/components/NavLink/index.js +0 -38
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,45 @@
|
|
|
1
|
+
# @linagora/twake-mui [10.1.0](https://github.com/linagora/twake-ui/compare/@linagora/twake-mui@10.0.0...@linagora/twake-mui@10.1.0) (2026-10-06)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* **twake-mui:** Extract NavLink into dumber components ([c5c3581](https://github.com/linagora/twake-ui/commit/c5c358176c6cdd47666e261575a9e9576bbb8b84))
|
|
7
|
+
* **twake-mui:** Resolve comments ([2b5a9c8](https://github.com/linagora/twake-ui/commit/2b5a9c8aa828991804858aedd1319ce78f910572))
|
|
8
|
+
* **twake-mui:** Update NavDesktopLimiter as secondary variant of NavItem ([8124b58](https://github.com/linagora/twake-ui/commit/8124b58176f38919f8be4399b05854a097ed043f))
|
|
9
|
+
* **twake-mui:** Update NavText to handle secondary and tertiary text ([bd976ce](https://github.com/linagora/twake-ui/commit/bd976ce73fd715d927f2fae967d4a27b01b89f77))
|
|
10
|
+
* **twake-mui:** Update new NavItem ([915a508](https://github.com/linagora/twake-ui/commit/915a50801197c39dc3f60d4d6f00da833d34554d))
|
|
11
|
+
* **twake-mui:** Update new NavLink ([e966794](https://github.com/linagora/twake-ui/commit/e966794971daa5fccd4205d0cf87bc0ccb964bc2))
|
|
12
|
+
* **twake-mui:** Update storybooks of Layout and Sidebar with new NavItem ([b792097](https://github.com/linagora/twake-ui/commit/b7920972992db48fb271aa4daf3dc078de72b605))
|
|
13
|
+
|
|
14
|
+
# @linagora/twake-mui [10.0.0](https://github.com/linagora/twake-ui/compare/@linagora/twake-mui@9.17.0...@linagora/twake-mui@10.0.0) (2026-10-05)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
### Bug Fixes
|
|
18
|
+
|
|
19
|
+
* **twake-mui:** Infer the SearchBar submit event type ([542f632](https://github.com/linagora/twake-ui/commit/542f63255dd143d85be5f96678f6ccc66538918b))
|
|
20
|
+
* **twake-mui:** Pass an initial value to useRef in SearchBar ([f32e365](https://github.com/linagora/twake-ui/commit/f32e36514e56373b6525b38b1c56c022b40b2797))
|
|
21
|
+
* **twake-mui:** Stop using the global JSX namespace in ContactPopover ([102d577](https://github.com/linagora/twake-ui/commit/102d577a050c59724f18f535bf8e3227cafb7b74))
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
### chore
|
|
25
|
+
|
|
26
|
+
* **twake-mui:** Drop the twake-i18n React override by requiring twake-i18n 0.6.0 ([64c678e](https://github.com/linagora/twake-ui/commit/64c678e8e76015b919b6df9965ac512c142eed6f))
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
### Features
|
|
30
|
+
|
|
31
|
+
* **twake-mui:** Support React 19 ([bdc7265](https://github.com/linagora/twake-ui/commit/bdc7265565d7d4991d2c335d4c58a258f56946ed))
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
### BREAKING CHANGES
|
|
35
|
+
|
|
36
|
+
* **twake-mui:** twake-mui now requires twake-i18n >=0.6.0 as a peer
|
|
37
|
+
dependency, up from >=0.5.0. twake-mui only supports React 19 when
|
|
38
|
+
twake-i18n accepts it too, and consumers pinned on twake-i18n 0.5.0 will
|
|
39
|
+
get an ERESOLVE error until they upgrade.
|
|
40
|
+
|
|
41
|
+
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
42
|
+
|
|
1
43
|
# @linagora/twake-mui [9.17.0](https://github.com/linagora/twake-ui/compare/@linagora/twake-mui@9.16.0...@linagora/twake-mui@9.17.0) (2026-10-05)
|
|
2
44
|
|
|
3
45
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import React from 'react';
|
|
1
2
|
export interface AttendeeInfoProps {
|
|
2
3
|
/** Attendee display name */
|
|
3
4
|
name: string;
|
|
@@ -6,4 +7,4 @@ export interface AttendeeInfoProps {
|
|
|
6
7
|
/** Callback when email is copied to clipboard */
|
|
7
8
|
onEmailCopy?: (email: string) => void;
|
|
8
9
|
}
|
|
9
|
-
export declare const AttendeeInfo: ({ name, email, onEmailCopy }: AttendeeInfoProps) =>
|
|
10
|
+
export declare const AttendeeInfo: ({ name, email, onEmailCopy }: AttendeeInfoProps) => React.ReactElement;
|
|
@@ -3,4 +3,4 @@ export interface ContactPopoverActionsProps {
|
|
|
3
3
|
/** Action items rendered inside the actions bar */
|
|
4
4
|
children: React.ReactNode;
|
|
5
5
|
}
|
|
6
|
-
export declare const ContactPopoverActions: ({ children }: ContactPopoverActionsProps) =>
|
|
6
|
+
export declare const ContactPopoverActions: ({ children }: ContactPopoverActionsProps) => React.ReactElement;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
1
2
|
export interface ContactPopoverCalendarActionProps {
|
|
2
3
|
/** URL for calendar action (e.g., view attendee's calendar) */
|
|
3
4
|
url: string;
|
|
4
5
|
/** Disable the action button */
|
|
5
6
|
disabled?: boolean;
|
|
6
7
|
}
|
|
7
|
-
export declare const ContactPopoverCalendarAction: ({ url, disabled }: ContactPopoverCalendarActionProps) =>
|
|
8
|
+
export declare const ContactPopoverCalendarAction: ({ url, disabled }: ContactPopoverCalendarActionProps) => React.ReactElement;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
1
2
|
export interface ContactPopoverChatActionProps {
|
|
2
3
|
/** URL for chat action (e.g., Twake Chat link) */
|
|
3
4
|
url: string;
|
|
4
5
|
/** Disable the action button */
|
|
5
6
|
disabled?: boolean;
|
|
6
7
|
}
|
|
7
|
-
export declare const ContactPopoverChatAction: ({ url, disabled }: ContactPopoverChatActionProps) =>
|
|
8
|
+
export declare const ContactPopoverChatAction: ({ url, disabled }: ContactPopoverChatActionProps) => React.ReactElement;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
1
2
|
export interface ContactPopoverEmailActionProps {
|
|
2
3
|
/** URL for email action */
|
|
3
4
|
url: string;
|
|
4
5
|
/** Disable the action button */
|
|
5
6
|
disabled?: boolean;
|
|
6
7
|
}
|
|
7
|
-
export declare const ContactPopoverEmailAction: ({ url, disabled }: ContactPopoverEmailActionProps) =>
|
|
8
|
+
export declare const ContactPopoverEmailAction: ({ url, disabled }: ContactPopoverEmailActionProps) => React.ReactElement;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
1
2
|
export interface ContactPopoverVideoActionProps {
|
|
2
3
|
/** URL for video call action (e.g., Twake Meet link) */
|
|
3
4
|
url: string;
|
|
4
5
|
/** Disable the action button */
|
|
5
6
|
disabled?: boolean;
|
|
6
7
|
}
|
|
7
|
-
export declare const ContactPopoverVideoAction: ({ url, disabled }: ContactPopoverVideoActionProps) =>
|
|
8
|
+
export declare const ContactPopoverVideoAction: ({ url, disabled }: ContactPopoverVideoActionProps) => React.ReactElement;
|
|
@@ -7,8 +7,8 @@ import { NavDesktopDropdown } from '../NavDesktopDropdown';
|
|
|
7
7
|
import { NavDesktopLimiter } from '../NavDesktopLimiter';
|
|
8
8
|
import { NavIcon } from '../NavIcon';
|
|
9
9
|
import { NavItem } from '../NavItem';
|
|
10
|
-
import { NavLink } from '../NavLink';
|
|
11
|
-
import
|
|
10
|
+
import { NavLink } from '../NavLink/NavLink';
|
|
11
|
+
import NavText from '../NavText';
|
|
12
12
|
import { Sidebar } from '../Sidebar';
|
|
13
13
|
const paragraph = 'Ada Lovelace was an English mathematician chiefly known for her work on Charles Babbage’s proposed mechanical general-purpose computer, the Analytical Engine. She was the first to recognise that the machine had applications beyond pure calculation.';
|
|
14
14
|
const TopBar = () => (React.createElement(Box, { id: "coz-bar", role: "banner", sx: theme => ({
|
|
@@ -42,7 +42,7 @@ const LayoutDemo = ({ monoColumn = false, withTopBar = true, ...props }) => {
|
|
|
42
42
|
React.createElement(NavLink, { ...makeProps(['Section 1']) },
|
|
43
43
|
React.createElement(NavIcon, { icon: Warn }),
|
|
44
44
|
React.createElement(NavText, null, "Section 1"))),
|
|
45
|
-
React.createElement(NavDesktopLimiter, null, Array.from(Array(10).keys()).map(i => (React.createElement(NavItem, {
|
|
45
|
+
React.createElement(NavDesktopLimiter, null, Array.from(Array(10).keys()).map(i => (React.createElement(NavItem, { variant: "secondary", key: i },
|
|
46
46
|
React.createElement(NavLink, { ...makeProps(['Section 1', `Subsection ${i}`]) },
|
|
47
47
|
React.createElement(NavText, null,
|
|
48
48
|
"Subsection ",
|
|
@@ -55,7 +55,7 @@ const LayoutDemo = ({ monoColumn = false, withTopBar = true, ...props }) => {
|
|
|
55
55
|
React.createElement(NavLink, { ...makeProps(['Section 3']) },
|
|
56
56
|
React.createElement(NavIcon, { icon: Download }),
|
|
57
57
|
React.createElement(NavText, null, "Section 3"))),
|
|
58
|
-
React.createElement(NavDesktopDropdown, { label: "Section 4" }, Array.from(Array(6).keys()).map(i => (React.createElement(NavItem, {
|
|
58
|
+
React.createElement(NavDesktopDropdown, { label: "Section 4" }, Array.from(Array(6).keys()).map(i => (React.createElement(NavItem, { variant: "secondary", key: i },
|
|
59
59
|
React.createElement(NavLink, { ...makeProps(['Section 4', `Subsection ${i}`]) },
|
|
60
60
|
React.createElement(NavText, null,
|
|
61
61
|
"Subsection ",
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { Theme } from '@mui/material/styles';
|
|
2
2
|
import React from 'react';
|
|
3
|
-
declare const NavRoot: import("@emotion/styled").StyledComponent<import("@mui/material").ListOwnProps & Omit<import("@mui/material").ListOwnProps, keyof import("@mui/material").ListOwnProps> & import("@mui/material/OverridableComponent").CommonProps & Omit<
|
|
4
|
-
ref?: ((instance: HTMLUListElement | null) => void) | React.RefObject<HTMLUListElement> | null | undefined;
|
|
5
|
-
}, "style" | "className" | "children" | "dense" | "disablePadding" | "classes" | "sx" | "subheader"> & import("@mui/system").MUIStyledCommonProps<Theme>, {}, {}>;
|
|
3
|
+
declare const NavRoot: import("@emotion/styled").StyledComponent<import("@mui/material").ListOwnProps & Omit<import("@mui/material").ListOwnProps, keyof import("@mui/material").ListOwnProps> & import("@mui/material/OverridableComponent").CommonProps & Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLUListElement>, HTMLUListElement>, "style" | "className" | "children" | "dense" | "disablePadding" | "classes" | "sx" | "subheader"> & import("@mui/system").MUIStyledCommonProps<Theme>, {}, {}>;
|
|
6
4
|
export type NavProps = React.ComponentProps<typeof NavRoot>;
|
|
7
5
|
export declare const Nav: (props: NavProps) => React.ReactElement;
|
|
8
6
|
export {};
|
|
@@ -3,8 +3,8 @@ import React, { Children, isValidElement, useState } from 'react';
|
|
|
3
3
|
import { useExtendI18n, useI18n } from 'twake-i18n';
|
|
4
4
|
import { NavIcon } from '../NavIcon';
|
|
5
5
|
import { NavItem } from '../NavItem';
|
|
6
|
-
import { NavLink } from '../NavLink';
|
|
7
|
-
import
|
|
6
|
+
import { NavLink } from '../NavLink/NavLink';
|
|
7
|
+
import NavText from '../NavText';
|
|
8
8
|
import en from './locales/en.json';
|
|
9
9
|
import fr from './locales/fr.json';
|
|
10
10
|
import ru from './locales/ru.json';
|
|
@@ -22,7 +22,7 @@ export const NavDesktopLimiter = ({ children, max = 5 }) => {
|
|
|
22
22
|
return null;
|
|
23
23
|
return (React.createElement(React.Fragment, null,
|
|
24
24
|
viewingAll ? items : items.slice(0, max),
|
|
25
|
-
amountHidden > 0 && (React.createElement(NavItem, {
|
|
25
|
+
amountHidden > 0 && (React.createElement(NavItem, { variant: "secondary" },
|
|
26
26
|
React.createElement(NavLink, { onClick: () => setViewingAll(current => !current) },
|
|
27
27
|
React.createElement(NavIcon, { icon: viewingAll ? Top : Bottom }),
|
|
28
28
|
React.createElement(NavText, null, viewingAll
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { Theme } from '@mui/material/styles';
|
|
2
|
+
export declare const NavBadge: import("@emotion/styled").StyledComponent<import("@mui/material").BadgeOwnProps & import("@mui/material/OverridableComponent").CommonProps & Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "style" | "color" | "className" | "max" | "children" | "classes" | "sx" | "variant" | "slotProps" | "slots" | "anchorOrigin" | "badgeContent" | "invisible" | "overlap" | "showZero"> & import("@mui/system").MUIStyledCommonProps<Theme>, {}, {}>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Badge, badgeClasses } from '@mui/material';
|
|
2
|
+
import { styled } from '@mui/material/styles';
|
|
3
|
+
export const NavBadge = styled(Badge)(({ theme }) => ({
|
|
4
|
+
[`& .${badgeClasses.badge}`]: {
|
|
5
|
+
border: 'none',
|
|
6
|
+
position: 'static',
|
|
7
|
+
transform: 'none',
|
|
8
|
+
backgroundColor: theme.vars.palette.action.selected,
|
|
9
|
+
color: theme.vars.palette.text.primary,
|
|
10
|
+
fontWeight: 500
|
|
11
|
+
}
|
|
12
|
+
}));
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { Theme } from '@mui/material/styles';
|
|
2
|
+
export declare const NavIndicator: import("@emotion/styled").StyledComponent<import("@mui/system").MUIStyledCommonProps<Theme>, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Heart } from '@linagora/twake-icons';
|
|
2
|
+
import { Meta, StoryObj } from '@storybook/react-vite';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { NavItemProps } from './index';
|
|
5
|
+
declare const icons: {
|
|
6
|
+
Heart: typeof Heart;
|
|
7
|
+
None: undefined;
|
|
8
|
+
};
|
|
9
|
+
declare const secondaryActions: {
|
|
10
|
+
None: undefined;
|
|
11
|
+
Dots: React.JSX.Element;
|
|
12
|
+
};
|
|
13
|
+
type NavItemStoryArgs = NavItemProps & {
|
|
14
|
+
text: string;
|
|
15
|
+
secondaryText: string;
|
|
16
|
+
tertiaryText: string;
|
|
17
|
+
tertiaryIcon: keyof typeof icons;
|
|
18
|
+
leftIcon: keyof typeof icons;
|
|
19
|
+
divider: boolean;
|
|
20
|
+
badge: number | string;
|
|
21
|
+
hasIndicator: boolean;
|
|
22
|
+
secondaryAction: keyof typeof secondaryActions;
|
|
23
|
+
hasDropdown: boolean;
|
|
24
|
+
disablePadding: boolean;
|
|
25
|
+
};
|
|
26
|
+
declare const meta: Meta<NavItemStoryArgs>;
|
|
27
|
+
export default meta;
|
|
28
|
+
type Story = StoryObj<NavItemStoryArgs>;
|
|
29
|
+
export declare const Default: Story;
|
|
30
|
+
export declare const Screenshot: Story;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { Folder, Heart, Warn, Dots, Icon } from '@linagora/twake-icons';
|
|
2
|
+
import { IconButton } from '@mui/material';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { NavIcon } from '../NavIcon';
|
|
5
|
+
import { NavDropdown } from '../NavLink/NavDropdown';
|
|
6
|
+
import { NavLink } from '../NavLink/NavLink';
|
|
7
|
+
import NavText from '../NavText';
|
|
8
|
+
import { NavItem } from './index';
|
|
9
|
+
const icons = { Heart, None: undefined };
|
|
10
|
+
const secondaryActions = {
|
|
11
|
+
None: undefined,
|
|
12
|
+
Dots: (React.createElement(IconButton, { size: "small", edge: "end", sx: { p: 0.5 }, onClick: event => event.stopPropagation() },
|
|
13
|
+
React.createElement(Icon, { icon: Dots, rotate: 90, size: 10 })))
|
|
14
|
+
};
|
|
15
|
+
const meta = {
|
|
16
|
+
title: 'NavItem',
|
|
17
|
+
component: NavItem,
|
|
18
|
+
tags: ['autodocs'],
|
|
19
|
+
argTypes: {
|
|
20
|
+
variant: {
|
|
21
|
+
control: 'select',
|
|
22
|
+
options: ['primary', 'secondary', 'tertiary'],
|
|
23
|
+
description: 'The indentation variant of the NavItem.'
|
|
24
|
+
},
|
|
25
|
+
selected: { control: 'boolean' },
|
|
26
|
+
text: { control: 'text' },
|
|
27
|
+
secondaryText: { control: 'text' },
|
|
28
|
+
tertiaryText: { control: 'text' },
|
|
29
|
+
tertiaryIcon: {
|
|
30
|
+
options: Object.keys(icons),
|
|
31
|
+
control: { type: 'select' }
|
|
32
|
+
},
|
|
33
|
+
leftIcon: {
|
|
34
|
+
options: Object.keys(icons),
|
|
35
|
+
control: { type: 'select' }
|
|
36
|
+
},
|
|
37
|
+
divider: { control: 'boolean' },
|
|
38
|
+
badge: { control: 'text' },
|
|
39
|
+
hasIndicator: { control: 'boolean' },
|
|
40
|
+
secondaryAction: {
|
|
41
|
+
options: Object.keys(secondaryActions),
|
|
42
|
+
mapping: secondaryActions,
|
|
43
|
+
control: { type: 'select' }
|
|
44
|
+
},
|
|
45
|
+
hasDropdown: { control: 'boolean' },
|
|
46
|
+
disablePadding: { control: 'boolean' }
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
export default meta;
|
|
50
|
+
export const Default = {
|
|
51
|
+
args: {
|
|
52
|
+
variant: 'primary',
|
|
53
|
+
selected: false,
|
|
54
|
+
text: 'Item',
|
|
55
|
+
secondaryText: '',
|
|
56
|
+
tertiaryText: '',
|
|
57
|
+
tertiaryIcon: 'None',
|
|
58
|
+
leftIcon: 'Heart',
|
|
59
|
+
divider: false,
|
|
60
|
+
badge: 1,
|
|
61
|
+
hasIndicator: true,
|
|
62
|
+
secondaryAction: 'Dots',
|
|
63
|
+
hasDropdown: false,
|
|
64
|
+
disablePadding: true
|
|
65
|
+
},
|
|
66
|
+
render: ({ selected, text, secondaryText, tertiaryText, tertiaryIcon, leftIcon, divider, badge, hasIndicator, secondaryAction, hasDropdown, disablePadding, ...args }) => {
|
|
67
|
+
const IconComponent = icons[leftIcon];
|
|
68
|
+
const TertiaryIconComponent = icons[tertiaryIcon];
|
|
69
|
+
const [open, setOpen] = React.useState(false);
|
|
70
|
+
return (React.createElement("div", { style: { width: 300 } },
|
|
71
|
+
React.createElement(NavItem, { ...args, hasIndicator: hasIndicator, badge: badge, secondaryAction: secondaryAction, divider: divider, disablePadding: disablePadding }, hasDropdown ? (React.createElement(NavDropdown, { selected: Boolean(selected), open: open, onClick: () => setOpen(!open) },
|
|
72
|
+
IconComponent && React.createElement(NavIcon, { icon: IconComponent }),
|
|
73
|
+
React.createElement(NavText, { secondaryText: secondaryText, tertiaryText: tertiaryText, tertiaryIcon: TertiaryIconComponent ? React.createElement(TertiaryIconComponent, null) : undefined }, text))) : (React.createElement(NavLink, { selected: Boolean(selected) },
|
|
74
|
+
IconComponent && React.createElement(NavIcon, { icon: IconComponent }),
|
|
75
|
+
React.createElement(NavText, { secondaryText: secondaryText, tertiaryText: tertiaryText, tertiaryIcon: TertiaryIconComponent ? React.createElement(TertiaryIconComponent, null) : undefined }, text))))));
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
export const Screenshot = {
|
|
79
|
+
tags: ['argos'],
|
|
80
|
+
render: () => {
|
|
81
|
+
return (React.createElement("div", { style: {
|
|
82
|
+
display: 'flex',
|
|
83
|
+
flexDirection: 'column',
|
|
84
|
+
gap: '16px',
|
|
85
|
+
width: 300
|
|
86
|
+
} },
|
|
87
|
+
React.createElement("section", null,
|
|
88
|
+
React.createElement("h3", null, "Primary"),
|
|
89
|
+
React.createElement(NavItem, { disablePadding: true, hasIndicator: true, badge: 1, secondaryAction: secondaryActions.Dots },
|
|
90
|
+
React.createElement(NavDropdown, null,
|
|
91
|
+
React.createElement(NavIcon, { icon: Heart }),
|
|
92
|
+
React.createElement(NavText, { secondaryText: "Secondary", tertiaryText: "Tertiary" }, "Primary Item")))),
|
|
93
|
+
React.createElement("section", null,
|
|
94
|
+
React.createElement("h3", null, "Secondary"),
|
|
95
|
+
React.createElement(NavItem, { disablePadding: true, variant: "secondary", selected: true },
|
|
96
|
+
React.createElement(NavDropdown, null,
|
|
97
|
+
React.createElement(NavText, null, "Secondary Item")))),
|
|
98
|
+
React.createElement("section", null,
|
|
99
|
+
React.createElement("h3", null, "Tertiary"),
|
|
100
|
+
React.createElement(NavItem, { disablePadding: true, variant: "tertiary" },
|
|
101
|
+
React.createElement(NavLink, null,
|
|
102
|
+
React.createElement(NavText, { tertiaryIcon: React.createElement(Warn, null) }, "Tertiary Item")))),
|
|
103
|
+
React.createElement("section", null,
|
|
104
|
+
React.createElement("h3", null, "Divider"),
|
|
105
|
+
React.createElement(NavItem, { disablePadding: true, divider: true },
|
|
106
|
+
React.createElement(NavLink, null,
|
|
107
|
+
React.createElement(NavIcon, { icon: Folder }),
|
|
108
|
+
React.createElement(NavText, null, "Item with Divider"))))));
|
|
109
|
+
}
|
|
110
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const NavItemActions: import("@emotion/styled").StyledComponent<import("@mui/system").MUIStyledCommonProps<import("@mui/material/styles").Theme>, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare const NavItemRoot: import("@emotion/styled").StyledComponent<import("@mui/material").ListItemOwnProps & import("@mui/material/OverridableComponent").CommonProps & Omit<import("react").DetailedHTMLProps<import("react").LiHTMLAttributes<HTMLLIElement>, HTMLLIElement>, "style" | "className" | "children" | "alignItems" | "dense" | "disablePadding" | "disableGutters" | "classes" | "sx" | "divider" | "slotProps" | "slots" | "secondaryAction"> & import("@mui/system").MUIStyledCommonProps<import("@mui/material").Theme> & {
|
|
2
|
+
variant?: "primary" | "secondary" | "tertiary";
|
|
3
|
+
}, {}, {}>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { ListItem } from '@mui/material';
|
|
2
|
+
import { styled } from '@mui/material/styles';
|
|
3
|
+
export const NavItemRoot = styled(ListItem, {
|
|
4
|
+
shouldForwardProp: prop => prop !== 'secondary' && prop !== 'variant'
|
|
5
|
+
})(({ theme, variant = 'primary' }) => {
|
|
6
|
+
const isSecondary = variant === 'secondary';
|
|
7
|
+
const isTertiary = variant === 'tertiary';
|
|
8
|
+
return {
|
|
9
|
+
padding: 0,
|
|
10
|
+
minHeight: 36,
|
|
11
|
+
height: 'auto',
|
|
12
|
+
display: 'flex',
|
|
13
|
+
alignItems: 'center',
|
|
14
|
+
position: 'relative',
|
|
15
|
+
borderRadius: 8,
|
|
16
|
+
cursor: 'pointer',
|
|
17
|
+
margin: '0 16px',
|
|
18
|
+
width: 'calc(100% - 32px)',
|
|
19
|
+
transition: theme.transitions.create('background-color'),
|
|
20
|
+
'&:hover': {
|
|
21
|
+
backgroundColor: theme.vars.palette.action.hover
|
|
22
|
+
},
|
|
23
|
+
[`&.Mui-selected, &:has(.Mui-selected), &:has(.active)`]: {
|
|
24
|
+
color: theme.vars.palette.primary.main,
|
|
25
|
+
backgroundColor: theme.vars.palette.action.selected,
|
|
26
|
+
'&:hover': {
|
|
27
|
+
backgroundColor: theme.vars.palette.action.focus
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
[theme.breakpoints.down('lg')]: {
|
|
31
|
+
display: 'block',
|
|
32
|
+
height: 'auto',
|
|
33
|
+
margin: '0 12px',
|
|
34
|
+
flex: '0 0 40px',
|
|
35
|
+
[`&.Mui-selected, &:has(.Mui-selected), &:has(.active)`]: {
|
|
36
|
+
color: theme.vars.palette.text.primary,
|
|
37
|
+
backgroundColor: 'transparent',
|
|
38
|
+
'&:hover': {
|
|
39
|
+
backgroundColor: 'transparent'
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
...((isSecondary || isTertiary) && {
|
|
44
|
+
margin: '3px 16px',
|
|
45
|
+
[theme.breakpoints.down('lg')]: { display: 'none' },
|
|
46
|
+
paddingLeft: isTertiary ? '3rem' : '2rem'
|
|
47
|
+
})
|
|
48
|
+
};
|
|
49
|
+
});
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ListItem } from '@mui/material';
|
|
2
2
|
import React from 'react';
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
export interface NavItemProps extends React.ComponentProps<typeof ListItem> {
|
|
4
|
+
variant?: 'primary' | 'secondary' | 'tertiary';
|
|
5
|
+
selected?: boolean;
|
|
6
|
+
badge?: React.ReactNode;
|
|
7
|
+
hasIndicator?: boolean;
|
|
8
|
+
divider?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare const NavItem: React.ForwardRefExoticComponent<Omit<NavItemProps, "ref"> & React.RefAttributes<HTMLLIElement>>;
|
|
@@ -1,30 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
margin: '0 16px 0 2.8rem',
|
|
21
|
-
padding: '8px 16px',
|
|
22
|
-
height: 'auto',
|
|
23
|
-
fontSize: theme.typography.pxToRem(14),
|
|
24
|
-
[`&.${listItemButtonClasses.selected}, &.active`]: {
|
|
25
|
-
color: theme.vars.palette.secondary.contrastText,
|
|
26
|
-
backgroundColor: theme.vars.palette.secondary.main
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
})
|
|
30
|
-
}));
|
|
1
|
+
import { Divider } from '@mui/material';
|
|
2
|
+
import cx from 'classnames';
|
|
3
|
+
import React, { forwardRef } from 'react';
|
|
4
|
+
import { NavBadge } from './NavBadge';
|
|
5
|
+
import { NavIndicator } from './NavIndicator';
|
|
6
|
+
import { NavItemActions } from './NavItemActions';
|
|
7
|
+
import { NavItemRoot } from './NavItemRoot';
|
|
8
|
+
export const NavItem = forwardRef((props, ref) => {
|
|
9
|
+
const { variant = 'primary', selected, children, className, badge, hasIndicator, secondaryAction, divider, ...rest } = props;
|
|
10
|
+
return (React.createElement(React.Fragment, null,
|
|
11
|
+
React.createElement(NavItemRoot, { ref: ref, variant: variant, className: cx(className, selected && 'Mui-selected'), ...rest },
|
|
12
|
+
children,
|
|
13
|
+
(hasIndicator || badge || secondaryAction) && (React.createElement(NavItemActions, null,
|
|
14
|
+
hasIndicator && React.createElement(NavIndicator, null),
|
|
15
|
+
badge && React.createElement(NavBadge, { badgeContent: badge }),
|
|
16
|
+
secondaryAction))),
|
|
17
|
+
divider && React.createElement(Divider, { className: "u-mt-half u-mh-1" })));
|
|
18
|
+
});
|
|
19
|
+
NavItem.displayName = 'NavItem';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { NavLinkBaseProps } from './NavLinkBase';
|
|
3
|
+
export interface NavDropdownProps extends Omit<NavLinkBaseProps, 'onToggle'> {
|
|
4
|
+
open?: boolean;
|
|
5
|
+
onToggle?: React.MouseEventHandler<HTMLDivElement>;
|
|
6
|
+
}
|
|
7
|
+
export declare const NavDropdown: React.ForwardRefExoticComponent<NavDropdownProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Icon, Dropdown } from '@linagora/twake-icons';
|
|
2
|
+
import { useTheme } from '@mui/material/styles';
|
|
3
|
+
import React, { forwardRef } from 'react';
|
|
4
|
+
import { NavLinkBase } from './NavLinkBase';
|
|
5
|
+
export const NavDropdown = forwardRef(({ open, onToggle, onClick, children, ...rest }, ref) => {
|
|
6
|
+
const theme = useTheme();
|
|
7
|
+
const handleClick = (e) => {
|
|
8
|
+
if (onToggle) {
|
|
9
|
+
onToggle(e);
|
|
10
|
+
}
|
|
11
|
+
if (onClick) {
|
|
12
|
+
onClick(e);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
return (React.createElement(NavLinkBase, { ref: ref, onClick: handleClick, "aria-expanded": open, ...rest },
|
|
16
|
+
children,
|
|
17
|
+
React.createElement(Icon, { className: "u-ml-half", icon: Dropdown, rotate: open ? 0 : -90, size: 14, color: theme.vars.palette.text.primary })));
|
|
18
|
+
});
|
|
19
|
+
NavDropdown.displayName = 'NavDropdown';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import cx from 'classnames';
|
|
2
|
+
import React, { forwardRef } from 'react';
|
|
3
|
+
import { NavLinkRoot } from './NavLinkRoot';
|
|
4
|
+
export const NavLinkBase = forwardRef(({ selected, onClick, onKeyDown, className, children, ...rest }, ref) => {
|
|
5
|
+
return (React.createElement(NavLinkRoot, { ref: ref, role: "button", tabIndex: 0, onClick: onClick, onKeyDown: (e) => {
|
|
6
|
+
if (onKeyDown) {
|
|
7
|
+
onKeyDown(e);
|
|
8
|
+
}
|
|
9
|
+
if (!e.defaultPrevented && (e.key === 'Enter' || e.key === ' ')) {
|
|
10
|
+
e.preventDefault();
|
|
11
|
+
e.currentTarget.click();
|
|
12
|
+
}
|
|
13
|
+
}, className: cx(className, { active: selected }), ...rest }, children));
|
|
14
|
+
});
|
|
15
|
+
NavLinkBase.displayName = 'NavLinkBase';
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { Theme } from '@mui/material/styles';
|
|
2
|
+
export declare const NavLinkRoot: import("@emotion/styled").StyledComponent<import("@mui/system").MUIStyledCommonProps<Theme>, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { styled } from '@mui/material/styles';
|
|
2
|
+
export const NavLinkRoot = styled('div')(({ theme }) => ({
|
|
3
|
+
padding: 8,
|
|
4
|
+
width: '100%',
|
|
5
|
+
height: '100%',
|
|
6
|
+
minHeight: 0,
|
|
7
|
+
gap: 0,
|
|
8
|
+
borderRadius: 8,
|
|
9
|
+
lineHeight: 1.375,
|
|
10
|
+
color: theme.vars.palette.text.primary,
|
|
11
|
+
display: 'flex',
|
|
12
|
+
alignItems: 'center',
|
|
13
|
+
cursor: 'pointer',
|
|
14
|
+
'&:hover, &:focus, &:active': {
|
|
15
|
+
backgroundColor: 'transparent'
|
|
16
|
+
},
|
|
17
|
+
'&.selected, &.active': {
|
|
18
|
+
color: theme.vars.palette.primary.main,
|
|
19
|
+
backgroundColor: 'transparent',
|
|
20
|
+
'&:hover': { backgroundColor: 'transparent' },
|
|
21
|
+
'& svg, & span': {
|
|
22
|
+
color: theme.vars.palette.primary.main
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
[theme.breakpoints.down('lg')]: {
|
|
26
|
+
display: 'block',
|
|
27
|
+
height: 'auto',
|
|
28
|
+
margin: 0,
|
|
29
|
+
padding: 0,
|
|
30
|
+
textAlign: 'center',
|
|
31
|
+
fontSize: theme.typography.pxToRem(11),
|
|
32
|
+
lineHeight: '12px',
|
|
33
|
+
'&.selected, &.active': {
|
|
34
|
+
color: theme.vars.palette.text.primary,
|
|
35
|
+
'&:hover': { backgroundColor: 'transparent' },
|
|
36
|
+
'& svg, & span': {
|
|
37
|
+
color: theme.vars.palette.text.primary
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}));
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { Theme } from '@mui/material/styles';
|
|
2
|
+
export declare const NavPrimaryText: import("@emotion/styled").StyledComponent<import("@mui/system").MUIStyledCommonProps<Theme>, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, {}>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { styled } from '@mui/material/styles';
|
|
2
|
+
export const NavPrimaryText = styled('span')(({ theme }) => ({
|
|
3
|
+
fontSize: theme.typography.pxToRem(14),
|
|
4
|
+
fontWeight: 500,
|
|
5
|
+
letterSpacing: '.15px',
|
|
6
|
+
[theme.breakpoints.down('lg')]: {
|
|
7
|
+
display: 'block',
|
|
8
|
+
textAlign: 'center',
|
|
9
|
+
whiteSpace: 'nowrap',
|
|
10
|
+
fontSize: theme.typography.pxToRem(12)
|
|
11
|
+
}
|
|
12
|
+
}));
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { Theme } from '@mui/material/styles';
|
|
2
|
+
export declare const NavSecondaryText: import("@emotion/styled").StyledComponent<import("@mui/system").MUIStyledCommonProps<Theme>, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, {}>;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { Theme } from '@mui/material/styles';
|
|
2
|
+
export declare const NavTertiaryText: import("@emotion/styled").StyledComponent<import("@mui/system").MUIStyledCommonProps<Theme>, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, {}>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { styled } from '@mui/material/styles';
|
|
2
|
+
export const NavTertiaryText = styled('span')(({ theme }) => ({
|
|
3
|
+
display: 'flex',
|
|
4
|
+
alignItems: 'center',
|
|
5
|
+
fontSize: theme.typography.pxToRem(11),
|
|
6
|
+
color: theme.vars.palette.text.secondary,
|
|
7
|
+
lineHeight: 1.5,
|
|
8
|
+
fontWeight: 400,
|
|
9
|
+
'& svg': {
|
|
10
|
+
width: 14,
|
|
11
|
+
height: 14,
|
|
12
|
+
marginRight: 4,
|
|
13
|
+
color: 'inherit',
|
|
14
|
+
fill: 'currentColor'
|
|
15
|
+
}
|
|
16
|
+
}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const NavTextRoot: import("@emotion/styled").StyledComponent<import("@mui/system").MUIStyledCommonProps<import("@mui/material/styles").Theme>, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { SxProps } from '@mui/material';
|
|
2
2
|
import { Theme } from '@mui/material/styles';
|
|
3
3
|
import React from 'react';
|
|
4
|
-
export interface NavTextProps extends React.ComponentPropsWithoutRef<'
|
|
4
|
+
export interface NavTextProps extends React.ComponentPropsWithoutRef<'div'> {
|
|
5
5
|
sx?: SxProps<Theme>;
|
|
6
|
+
secondaryText?: React.ReactNode;
|
|
7
|
+
tertiaryText?: React.ReactNode;
|
|
8
|
+
tertiaryIcon?: React.ReactNode;
|
|
6
9
|
}
|
|
7
|
-
|
|
10
|
+
declare const NavText: React.ForwardRefExoticComponent<NavTextProps & React.RefAttributes<HTMLDivElement>>;
|
|
11
|
+
export default NavText;
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { NavPrimaryText } from './NavPrimaryText';
|
|
3
|
+
import { NavSecondaryText } from './NavSecondaryText';
|
|
4
|
+
import { NavTertiaryText } from './NavTertiaryText';
|
|
5
|
+
import { NavTextRoot } from './NavTextRoot';
|
|
6
|
+
const NavText = React.forwardRef(({ secondaryText, tertiaryText, tertiaryIcon, children, sx, ...rest }, ref) => {
|
|
7
|
+
return (React.createElement(NavTextRoot, { ref: ref, sx: sx, ...rest },
|
|
8
|
+
React.createElement(NavPrimaryText, null, children),
|
|
9
|
+
secondaryText && React.createElement(NavSecondaryText, null, secondaryText),
|
|
10
|
+
(tertiaryText || tertiaryIcon) && (React.createElement(NavTertiaryText, null,
|
|
11
|
+
tertiaryIcon,
|
|
12
|
+
tertiaryText))));
|
|
13
|
+
});
|
|
14
|
+
NavText.displayName = 'NavText';
|
|
15
|
+
export default NavText;
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import { Theme } from '@mui/material/styles';
|
|
2
|
+
export declare const DisableHighlight: import("@emotion/styled").StyledComponent<import("@mui/system").MUIStyledCommonProps<Theme> & import("react").ClassAttributes<HTMLSpanElement> & import("react").HTMLAttributes<HTMLSpanElement>, {}, {}>;
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import { Theme } from '@mui/material/styles';
|
|
2
|
+
export declare const FocusHighlight: import("@emotion/styled").StyledComponent<import("@mui/system").MUIStyledCommonProps<Theme> & import("react").ClassAttributes<HTMLSpanElement> & import("react").HTMLAttributes<HTMLSpanElement>, {}, {}>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { Theme } from '@mui/material/styles';
|
|
2
|
-
export declare const Highlight: import("@emotion/styled").StyledComponent<import("@mui/system").MUIStyledCommonProps<Theme>,
|
|
2
|
+
export declare const Highlight: import("@emotion/styled").StyledComponent<import("@mui/system").MUIStyledCommonProps<Theme>, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, {}>;
|
|
@@ -1,3 +1 @@
|
|
|
1
|
-
export declare const SearchBarButtonBase: import("@emotion/styled").StyledComponent<import("@mui/material").ButtonBaseOwnProps & Omit<import("@mui/material").ButtonBaseOwnProps, keyof import("@mui/material").ButtonBaseOwnProps> & import("@mui/material/OverridableComponent").CommonProps & Omit<
|
|
2
|
-
ref?: ((instance: HTMLButtonElement | null) => void) | import("react").RefObject<HTMLButtonElement> | null | undefined;
|
|
3
|
-
}, "disabled" | "style" | "className" | "type" | "tabIndex" | "children" | "classes" | "action" | "centerRipple" | "disableRipple" | "disableTouchRipple" | "focusRipple" | "focusVisibleClassName" | "LinkComponent" | "nativeButton" | "onFocusVisible" | "sx" | "TouchRippleProps" | "touchRippleRef"> & import("@mui/system").MUIStyledCommonProps<import("@mui/material").Theme>, {}, {}>;
|
|
1
|
+
export declare const SearchBarButtonBase: import("@emotion/styled").StyledComponent<import("@mui/material").ButtonBaseOwnProps & Omit<import("@mui/material").ButtonBaseOwnProps, keyof import("@mui/material").ButtonBaseOwnProps> & import("@mui/material/OverridableComponent").CommonProps & Omit<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "disabled" | "style" | "className" | "type" | "tabIndex" | "children" | "classes" | "action" | "centerRipple" | "disableRipple" | "disableTouchRipple" | "focusRipple" | "focusVisibleClassName" | "LinkComponent" | "nativeButton" | "onFocusVisible" | "sx" | "TouchRippleProps" | "touchRippleRef"> & import("@mui/system").MUIStyledCommonProps<import("@mui/material").Theme>, {}, {}>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { Theme } from '@mui/material/styles';
|
|
2
|
-
export declare const SearchBarIconWrapper: import("@emotion/styled").StyledComponent<import("@mui/system").MUIStyledCommonProps<Theme>,
|
|
2
|
+
export declare const SearchBarIconWrapper: import("@emotion/styled").StyledComponent<import("@mui/system").MUIStyledCommonProps<Theme>, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { SearchBarProps } from './types';
|
|
2
|
-
export declare const SearchBarRoot: import("@emotion/styled").StyledComponent<import("@mui/material").PaperOwnProps & import("@mui/material/OverridableComponent").CommonProps & Omit<
|
|
3
|
-
ref?: ((instance: HTMLDivElement | null) => void) | import("react").RefObject<HTMLDivElement> | null | undefined;
|
|
4
|
-
}, "style" | "square" | "className" | "elevation" | "children" | "classes" | "sx" | "variant"> & import("@mui/system").MUIStyledCommonProps<import("@mui/material").Theme> & {
|
|
2
|
+
export declare const SearchBarRoot: import("@emotion/styled").StyledComponent<import("@mui/material").PaperOwnProps & import("@mui/material/OverridableComponent").CommonProps & Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style" | "square" | "className" | "elevation" | "children" | "classes" | "sx" | "variant"> & import("@mui/system").MUIStyledCommonProps<import("@mui/material").Theme> & {
|
|
5
3
|
searchSize: NonNullable<SearchBarProps["size"]>;
|
|
6
4
|
isFocused: boolean;
|
|
7
5
|
}, {}, {}>;
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
export declare const SearchBarTypography: import("@emotion/styled").StyledComponent<import("@mui/material").TypographyOwnProps & import("@mui/material/OverridableComponent").CommonProps & Omit<
|
|
2
|
-
ref?: ((instance: HTMLSpanElement | null) => void) | import("react").RefObject<HTMLSpanElement> | null | undefined;
|
|
3
|
-
}, "style" | "color" | "className" | "children" | "classes" | "sx" | "variant" | "align" | "noWrap" | "gutterBottom" | "variantMapping"> & import("@mui/system").MUIStyledCommonProps<import("@mui/material").Theme> & {
|
|
1
|
+
export declare const SearchBarTypography: import("@emotion/styled").StyledComponent<import("@mui/material").TypographyOwnProps & import("@mui/material/OverridableComponent").CommonProps & Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "style" | "color" | "className" | "children" | "classes" | "sx" | "variant" | "align" | "noWrap" | "gutterBottom" | "variantMapping"> & import("@mui/system").MUIStyledCommonProps<import("@mui/material").Theme> & {
|
|
4
2
|
hasIcon: boolean;
|
|
5
3
|
}, {}, {}>;
|
|
@@ -27,7 +27,7 @@ export const SearchBar = forwardRef(({ placeholder, icon = Magnifier, size = 'sm
|
|
|
27
27
|
useEffect(() => {
|
|
28
28
|
onChangeRef.current = onChange;
|
|
29
29
|
}, [onChange]);
|
|
30
|
-
const delayedOnChangeRef = useRef();
|
|
30
|
+
const delayedOnChangeRef = useRef(undefined);
|
|
31
31
|
useEffect(() => {
|
|
32
32
|
delayedOnChangeRef.current = debounce((ev) => {
|
|
33
33
|
onChangeRef.current(ev);
|
|
@@ -75,7 +75,7 @@ export const SearchBar = forwardRef(({ placeholder, icon = Magnifier, size = 'sm
|
|
|
75
75
|
return (React.createElement(SearchBarRoot, { component: "form", elevation: elevation, searchSize: size, isFocused: effectivelyFocused, className: cx(className, {
|
|
76
76
|
'SearchBar-focused': effectivelyFocused,
|
|
77
77
|
'Mui-disabled': disabled
|
|
78
|
-
}), ref: ref, onSubmit:
|
|
78
|
+
}), ref: ref, onSubmit: ev => {
|
|
79
79
|
ev.preventDefault();
|
|
80
80
|
props.onSubmit?.(ev);
|
|
81
81
|
}, ...props },
|
|
@@ -6,11 +6,13 @@ import { NavDesktopDropdown } from '../NavDesktopDropdown';
|
|
|
6
6
|
import { NavDesktopLimiter } from '../NavDesktopLimiter';
|
|
7
7
|
import { NavIcon } from '../NavIcon';
|
|
8
8
|
import { NavItem } from '../NavItem';
|
|
9
|
-
import
|
|
10
|
-
import { NavText } from '../NavText';
|
|
9
|
+
import NavText from '../NavText';
|
|
11
10
|
import { Sidebar } from './index';
|
|
11
|
+
import { NavDropdown } from '../NavLink/NavDropdown';
|
|
12
|
+
import { NavLink } from '../NavLink/NavLink';
|
|
12
13
|
const SidebarDemo = (props) => {
|
|
13
14
|
const [active, setActive] = useState(['Section 1', 'Subsection 1']);
|
|
15
|
+
const [openSection1, setOpenSection1] = useState(true);
|
|
14
16
|
const makeProps = (route) => ({
|
|
15
17
|
selected: active.slice(0, route.length).join('/') === route.join('/'),
|
|
16
18
|
onClick: () => setActive(route)
|
|
@@ -19,14 +21,17 @@ const SidebarDemo = (props) => {
|
|
|
19
21
|
React.createElement(Sidebar, { ...props },
|
|
20
22
|
React.createElement(Nav, null,
|
|
21
23
|
React.createElement(NavItem, null,
|
|
22
|
-
React.createElement(
|
|
24
|
+
React.createElement(NavDropdown, { ...makeProps(['Section 1']), open: openSection1, onToggle: (e) => {
|
|
25
|
+
e.stopPropagation();
|
|
26
|
+
setOpenSection1(prev => !prev);
|
|
27
|
+
} },
|
|
23
28
|
React.createElement(NavIcon, { icon: Warn }),
|
|
24
29
|
React.createElement(NavText, null, "Section 1"))),
|
|
25
|
-
React.createElement(NavDesktopLimiter, null, Array.from(Array(10).keys()).map(i => (React.createElement(NavItem, {
|
|
30
|
+
openSection1 && (React.createElement(NavDesktopLimiter, null, Array.from(Array(10).keys()).map(i => (React.createElement(NavItem, { variant: "secondary", key: i },
|
|
26
31
|
React.createElement(NavLink, { ...makeProps(['Section 1', `Subsection ${i}`]) },
|
|
27
32
|
React.createElement(NavText, null,
|
|
28
33
|
"Subsection ",
|
|
29
|
-
i)))))),
|
|
34
|
+
i))))))),
|
|
30
35
|
React.createElement(NavItem, null,
|
|
31
36
|
React.createElement(NavLink, { ...makeProps(['Section 2']) },
|
|
32
37
|
React.createElement(NavIcon, { icon: Check }),
|
|
@@ -35,7 +40,7 @@ const SidebarDemo = (props) => {
|
|
|
35
40
|
React.createElement(NavLink, { ...makeProps(['Section 3']) },
|
|
36
41
|
React.createElement(NavIcon, { icon: Download }),
|
|
37
42
|
React.createElement(NavText, null, "Section 3"))),
|
|
38
|
-
React.createElement(NavDesktopDropdown, { label: "Section 4" }, Array.from(Array(6).keys()).map(i => (React.createElement(NavItem, {
|
|
43
|
+
React.createElement(NavDesktopDropdown, { label: "Section 4" }, Array.from(Array(6).keys()).map(i => (React.createElement(NavItem, { variant: "secondary", key: i },
|
|
39
44
|
React.createElement(NavLink, { ...makeProps(['Section 4', `Subsection ${i}`]) },
|
|
40
45
|
React.createElement(NavText, null,
|
|
41
46
|
"Subsection ",
|
package/dist/index.d.ts
CHANGED
|
@@ -29,9 +29,11 @@ export { Sidebar, SIDEBAR_MOBILE_HEIGHT } from './components/Sidebar';
|
|
|
29
29
|
export { Layout, Main, Content } from './components/Layout';
|
|
30
30
|
export { Nav } from './components/Nav';
|
|
31
31
|
export { NavItem } from './components/NavItem';
|
|
32
|
-
export { NavLink } from './components/NavLink';
|
|
32
|
+
export { NavLink } from './components/NavLink/NavLink';
|
|
33
|
+
export { NavLinkBase } from './components/NavLink/NavLinkBase';
|
|
34
|
+
export { NavDropdown } from './components/NavLink/NavDropdown';
|
|
33
35
|
export { NavIcon } from './components/NavIcon';
|
|
34
|
-
export { NavText } from './components/NavText';
|
|
36
|
+
export { default as NavText } from './components/NavText';
|
|
35
37
|
export { NavDesktopLimiter } from './components/NavDesktopLimiter';
|
|
36
38
|
export { NavDesktopDropdown } from './components/NavDesktopDropdown';
|
|
37
39
|
export { nameToColor, supportedColors, getInitials } from './components/Avatar/helpers';
|
|
@@ -70,7 +72,9 @@ export type { SidebarProps } from './components/Sidebar';
|
|
|
70
72
|
export type { LayoutProps, MainProps, ContentProps } from './components/Layout';
|
|
71
73
|
export type { NavProps } from './components/Nav';
|
|
72
74
|
export type { NavItemProps } from './components/NavItem';
|
|
73
|
-
export type { NavLinkProps } from './components/NavLink';
|
|
75
|
+
export type { NavLinkProps } from './components/NavLink/NavLink';
|
|
76
|
+
export type { NavLinkBaseProps } from './components/NavLink/NavLinkBase';
|
|
77
|
+
export type { NavDropdownProps } from './components/NavLink/NavDropdown';
|
|
74
78
|
export type { NavIconProps } from './components/NavIcon';
|
|
75
79
|
export type { NavTextProps } from './components/NavText';
|
|
76
80
|
export type { NavDesktopLimiterProps } from './components/NavDesktopLimiter';
|
package/dist/index.js
CHANGED
|
@@ -32,9 +32,11 @@ export { Sidebar, SIDEBAR_MOBILE_HEIGHT } from './components/Sidebar';
|
|
|
32
32
|
export { Layout, Main, Content } from './components/Layout';
|
|
33
33
|
export { Nav } from './components/Nav';
|
|
34
34
|
export { NavItem } from './components/NavItem';
|
|
35
|
-
export { NavLink } from './components/NavLink';
|
|
35
|
+
export { NavLink } from './components/NavLink/NavLink';
|
|
36
|
+
export { NavLinkBase } from './components/NavLink/NavLinkBase';
|
|
37
|
+
export { NavDropdown } from './components/NavLink/NavDropdown';
|
|
36
38
|
export { NavIcon } from './components/NavIcon';
|
|
37
|
-
export { NavText } from './components/NavText';
|
|
39
|
+
export { default as NavText } from './components/NavText';
|
|
38
40
|
export { NavDesktopLimiter } from './components/NavDesktopLimiter';
|
|
39
41
|
export { NavDesktopDropdown } from './components/NavDesktopDropdown';
|
|
40
42
|
export { nameToColor, supportedColors, getInitials } from './components/Avatar/helpers';
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@linagora/twake-mui",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "10.1.0",
|
|
5
5
|
"description": "MUI v9 theme system for Twake applications",
|
|
6
6
|
"author": "Twake",
|
|
7
7
|
"license": "MIT",
|
|
@@ -53,16 +53,16 @@
|
|
|
53
53
|
"@linagora/twake-icons": ">=2.10.0",
|
|
54
54
|
"@mui/lab": "^9.0.0-beta.6",
|
|
55
55
|
"@mui/material": "^9.2.0",
|
|
56
|
-
"react": "^18",
|
|
57
|
-
"react-dom": "^18",
|
|
58
|
-
"twake-i18n": ">=0.
|
|
56
|
+
"react": "^18 || ^19",
|
|
57
|
+
"react-dom": "^18 || ^19",
|
|
58
|
+
"twake-i18n": ">=0.6.0"
|
|
59
59
|
},
|
|
60
60
|
"dependencies": {
|
|
61
61
|
"@linagora/twake-css": "^1.0.0",
|
|
62
62
|
"@mui/utils": "^9.2.0",
|
|
63
63
|
"classnames": "^2.5.1",
|
|
64
64
|
"react-virtuoso": "4.13.0",
|
|
65
|
-
"rooks": "
|
|
65
|
+
"rooks": "8.4.0"
|
|
66
66
|
},
|
|
67
67
|
"devDependencies": {
|
|
68
68
|
"@argos-ci/cli": "6.9.5",
|
|
@@ -80,8 +80,8 @@
|
|
|
80
80
|
"@storybook/react-vite": "10.3.5",
|
|
81
81
|
"@types/classnames": "^2.3.1",
|
|
82
82
|
"@types/lodash": "4.17.24",
|
|
83
|
-
"@types/react": "
|
|
84
|
-
"@types/react-dom": "^
|
|
83
|
+
"@types/react": "19.3.0",
|
|
84
|
+
"@types/react-dom": "^19.3.0",
|
|
85
85
|
"@vitest/browser-playwright": "4.1.11",
|
|
86
86
|
"cozy-tsconfig": "^2.0.0",
|
|
87
87
|
"eslint": "10.2.1",
|
|
@@ -89,10 +89,10 @@
|
|
|
89
89
|
"eslint-plugin-storybook": "10.3.5",
|
|
90
90
|
"lodash": "4.18.1",
|
|
91
91
|
"playwright": "1.60.0",
|
|
92
|
-
"react": "^
|
|
93
|
-
"react-dom": "^
|
|
92
|
+
"react": "^19.3.0",
|
|
93
|
+
"react-dom": "^19.3.0",
|
|
94
94
|
"storybook": "10.3.5",
|
|
95
|
-
"twake-i18n": "^0.
|
|
95
|
+
"twake-i18n": "^0.6.0",
|
|
96
96
|
"vite": "8.3.1",
|
|
97
97
|
"vitest": "4.1.11"
|
|
98
98
|
}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { ListItemButton, listItemButtonClasses, listItemIconClasses } from '@mui/material';
|
|
2
|
-
import { styled } from '@mui/material/styles';
|
|
3
|
-
// Cast keeps ListItemButton's `component` generic (react-router NavLink etc.)
|
|
4
|
-
export const NavLink = styled(ListItemButton)(({ theme }) => ({
|
|
5
|
-
margin: '0 16px',
|
|
6
|
-
padding: '0 8px',
|
|
7
|
-
height: '100%',
|
|
8
|
-
minHeight: 0,
|
|
9
|
-
gap: 0,
|
|
10
|
-
borderRadius: 8,
|
|
11
|
-
lineHeight: 1.375,
|
|
12
|
-
color: theme.vars.palette.text.primary,
|
|
13
|
-
[`&.${listItemButtonClasses.selected}, &.active`]: {
|
|
14
|
-
color: theme.vars.palette.primary.main,
|
|
15
|
-
backgroundColor: theme.vars.palette.action.selected,
|
|
16
|
-
'&:hover': { backgroundColor: theme.vars.palette.action.selected },
|
|
17
|
-
[`& .${listItemIconClasses.root}`]: {
|
|
18
|
-
color: theme.vars.palette.primary.main
|
|
19
|
-
}
|
|
20
|
-
},
|
|
21
|
-
[theme.breakpoints.down('lg')]: {
|
|
22
|
-
display: 'block',
|
|
23
|
-
height: 'auto',
|
|
24
|
-
margin: 0,
|
|
25
|
-
padding: 0,
|
|
26
|
-
textAlign: 'center',
|
|
27
|
-
fontSize: theme.typography.pxToRem(11),
|
|
28
|
-
lineHeight: '12px',
|
|
29
|
-
color: theme.vars.palette.text.secondary,
|
|
30
|
-
[`&.${listItemButtonClasses.selected}, &.active`]: {
|
|
31
|
-
color: theme.vars.palette.text.primary,
|
|
32
|
-
backgroundColor: 'transparent',
|
|
33
|
-
[`& .${listItemIconClasses.root}`]: {
|
|
34
|
-
color: theme.vars.palette.text.primary
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}));
|