@linagora/twake-mui 9.11.0 → 9.11.2

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 CHANGED
@@ -1,3 +1,19 @@
1
+ ## @linagora/twake-mui [9.11.2](https://github.com/linagora/twake-ui/compare/@linagora/twake-mui@9.11.1...@linagora/twake-mui@9.11.2) (2026-09-29)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * Added break-word to long name and email ([fdfcd16](https://github.com/linagora/twake-ui/commit/fdfcd16b7a381eb9272e1e405f60fc65c85fbbdd))
7
+ * Added disable param for contact popover actions ([fe4af23](https://github.com/linagora/twake-ui/commit/fe4af23240350aa9df0b2a9a58a2bb255340efce))
8
+ * Removed fullwidth from email action button ([e7eb7da](https://github.com/linagora/twake-ui/commit/e7eb7dae06b5afc4421b5f77c512e765ee7b7dfb))
9
+
10
+ ## @linagora/twake-mui [9.11.1](https://github.com/linagora/twake-ui/compare/@linagora/twake-mui@9.11.0...@linagora/twake-mui@9.11.1) (2026-09-29)
11
+
12
+
13
+ ### Reverts
14
+
15
+ * Revert "feat(twake-mui): Migrate ExtendableFab from cozy-ui" ([671a8f7](https://github.com/linagora/twake-ui/commit/671a8f7621b383aeec7071bda645d07560d6f470))
16
+
1
17
  # @linagora/twake-mui [9.11.0](https://github.com/linagora/twake-ui/compare/@linagora/twake-mui@9.10.0...@linagora/twake-mui@9.11.0) (2026-09-29)
2
18
 
3
19
 
@@ -25,9 +25,9 @@ export const AttendeeInfo = ({ name, email, onEmailCopy }) => {
25
25
  return (React.createElement(Box, { sx: { display: 'flex', alignItems: 'center', gap: 2 } },
26
26
  React.createElement(Avatar, { color: avatarColor, size: 48, sx: { width: 48, height: 48, fontSize: '1.25rem' } }, initials),
27
27
  React.createElement(Box, { sx: { minWidth: 0 } },
28
- name && name !== email ? (React.createElement(Typography, { variant: "body1", sx: { fontWeight: 500 }, noWrap: true }, name)) : null,
28
+ name && name !== email ? (React.createElement(Typography, { variant: "body1", sx: { fontWeight: 500, wordBreak: 'break-word' } }, name)) : null,
29
29
  React.createElement(Box, { sx: { display: 'flex', alignItems: 'center', gap: 1 } },
30
- React.createElement(Typography, { variant: "body2", color: "text.secondary", noWrap: true }, email),
30
+ React.createElement(Typography, { variant: "body2", color: "text.secondary", sx: { wordBreak: 'break-word' } }, email),
31
31
  React.createElement(IconButton, { size: "small", onClick: () => void handleCopy(), sx: { p: 0.5, color: alpha(theme.palette.grey[900], 0.9) }, title: showCopied
32
32
  ? t('ContactPopover.copiedTooltip')
33
33
  : t('ContactPopover.copyTooltip') },
@@ -1,5 +1,7 @@
1
1
  export interface ContactPopoverCalendarActionProps {
2
2
  /** URL for calendar action (e.g., view attendee's calendar) */
3
3
  url: string;
4
+ /** Disable the action button */
5
+ disabled?: boolean;
4
6
  }
5
- export declare const ContactPopoverCalendarAction: ({ url }: ContactPopoverCalendarActionProps) => JSX.Element;
7
+ export declare const ContactPopoverCalendarAction: ({ url, disabled }: ContactPopoverCalendarActionProps) => JSX.Element;
@@ -2,8 +2,8 @@ import { Icon } from '@linagora/twake-icons';
2
2
  import { CalendarToday } from '@linagora/twake-icons';
3
3
  import { IconButton, useTheme } from '@mui/material';
4
4
  import React from 'react';
5
- export const ContactPopoverCalendarAction = ({ url }) => {
5
+ export const ContactPopoverCalendarAction = ({ url, disabled = false }) => {
6
6
  const theme = useTheme();
7
- return (React.createElement(IconButton, { href: url, target: "_blank", rel: "noopener noreferrer", size: "small", sx: { border: `1px solid ${theme.palette.divider}` } },
7
+ return (React.createElement(IconButton, { href: url, target: "_blank", rel: "noopener noreferrer", size: "small", disabled: disabled, sx: { border: `1px solid ${theme.palette.divider}` } },
8
8
  React.createElement(Icon, { icon: CalendarToday, size: 20, color: theme.palette.text.icon })));
9
9
  };
@@ -1,5 +1,7 @@
1
1
  export interface ContactPopoverChatActionProps {
2
2
  /** URL for chat action (e.g., Twake Chat link) */
3
3
  url: string;
4
+ /** Disable the action button */
5
+ disabled?: boolean;
4
6
  }
5
- export declare const ContactPopoverChatAction: ({ url }: ContactPopoverChatActionProps) => JSX.Element;
7
+ export declare const ContactPopoverChatAction: ({ url, disabled }: ContactPopoverChatActionProps) => JSX.Element;
@@ -2,8 +2,8 @@ import { Icon } from '@linagora/twake-icons';
2
2
  import { Discuss } from '@linagora/twake-icons';
3
3
  import { IconButton, useTheme } from '@mui/material';
4
4
  import React from 'react';
5
- export const ContactPopoverChatAction = ({ url }) => {
5
+ export const ContactPopoverChatAction = ({ url, disabled = false }) => {
6
6
  const theme = useTheme();
7
- return (React.createElement(IconButton, { href: url, target: "_blank", rel: "noopener noreferrer", size: "small", sx: { border: `1px solid ${theme.palette.divider}` } },
7
+ return (React.createElement(IconButton, { href: url, target: "_blank", rel: "noopener noreferrer", size: "small", disabled: disabled, sx: { border: `1px solid ${theme.palette.divider}` } },
8
8
  React.createElement(Icon, { icon: Discuss, size: 20, color: theme.palette.text.icon })));
9
9
  };
@@ -1,5 +1,7 @@
1
1
  export interface ContactPopoverEmailActionProps {
2
2
  /** URL for email action */
3
3
  url: string;
4
+ /** Disable the action button */
5
+ disabled?: boolean;
4
6
  }
5
- export declare const ContactPopoverEmailAction: ({ url }: ContactPopoverEmailActionProps) => JSX.Element;
7
+ export declare const ContactPopoverEmailAction: ({ url, disabled }: ContactPopoverEmailActionProps) => JSX.Element;
@@ -1,10 +1,10 @@
1
1
  import { Button, useTheme } from '@mui/material';
2
2
  import React from 'react';
3
3
  import { useI18n } from 'twake-i18n';
4
- export const ContactPopoverEmailAction = ({ url }) => {
4
+ export const ContactPopoverEmailAction = ({ url, disabled = false }) => {
5
5
  const theme = useTheme();
6
6
  const { t } = useI18n();
7
- return (React.createElement(Button, { href: url, target: "_blank", rel: "noopener noreferrer", variant: "outlined", size: "small", fullWidth: true, sx: {
7
+ return (React.createElement(Button, { href: url, target: "_blank", rel: "noopener noreferrer", variant: "outlined", size: "small", disabled: disabled, sx: {
8
8
  justifyContent: 'center',
9
9
  color: theme.palette.text.primary,
10
10
  borderColor: theme.palette.divider
@@ -1,5 +1,7 @@
1
1
  export interface ContactPopoverVideoActionProps {
2
2
  /** URL for video call action (e.g., Twake Meet link) */
3
3
  url: string;
4
+ /** Disable the action button */
5
+ disabled?: boolean;
4
6
  }
5
- export declare const ContactPopoverVideoAction: ({ url }: ContactPopoverVideoActionProps) => JSX.Element;
7
+ export declare const ContactPopoverVideoAction: ({ url, disabled }: ContactPopoverVideoActionProps) => JSX.Element;
@@ -2,8 +2,8 @@ import { Icon } from '@linagora/twake-icons';
2
2
  import { Camera } from '@linagora/twake-icons';
3
3
  import { IconButton, useTheme } from '@mui/material';
4
4
  import React from 'react';
5
- export const ContactPopoverVideoAction = ({ url }) => {
5
+ export const ContactPopoverVideoAction = ({ url, disabled = false }) => {
6
6
  const theme = useTheme();
7
- return (React.createElement(IconButton, { href: url, target: "_blank", rel: "noopener noreferrer", size: "small", sx: { border: `1px solid ${theme.palette.divider}` } },
7
+ return (React.createElement(IconButton, { href: url, target: "_blank", rel: "noopener noreferrer", size: "small", disabled: disabled, sx: { border: `1px solid ${theme.palette.divider}` } },
8
8
  React.createElement(Icon, { icon: Camera, size: 20, color: theme.palette.text.icon })));
9
9
  };
@@ -113,7 +113,8 @@ export const ContactPopover = ({ name, email, children, onEmailCopy, onClose, di
113
113
  paper: {
114
114
  elevation: 4,
115
115
  sx: {
116
- borderRadius: 2
116
+ borderRadius: 2,
117
+ maxWidth: 400
117
118
  },
118
119
  onMouseEnter: handlePopoverMouseEnter,
119
120
  onMouseLeave: handleMouseLeave
package/dist/index.d.ts CHANGED
@@ -13,7 +13,6 @@ export { Dialog, default as DialogDefault } from './components/Dialog';
13
13
  export { ContactPopover, default as ContactPopoverDefault } from './components/ContactPopover';
14
14
  export { default as DropdownButton } from './components/DropdownButton';
15
15
  export { default as DropdownText } from './components/DropdownText';
16
- export { ExtendableFab } from './components/ExtendableFab';
17
16
  export { default as ListItem } from './components/ListItem';
18
17
  export { default as ListItemButton } from './components/ListItemButton';
19
18
  export { default as ListItemText } from './components/ListItemText';
@@ -50,7 +49,6 @@ export type { ChipProps } from './components/Chip';
50
49
  export type { DialogProps, DialogSize } from './components/Dialog';
51
50
  export type { DropdownButtonProps } from './components/DropdownButton';
52
51
  export type { DropdownTextProps, DropdownTextVariant } from './components/DropdownText';
53
- export type { ExtendableFabProps, ScrollOptions } from './components/ExtendableFab';
54
52
  export type { ListItemProps, ListItemGutters, ListItemSize } from './components/ListItem';
55
53
  export type { ListItemButtonProps } from './components/ListItemButton';
56
54
  export type { ListItemTextProps } from './components/ListItemText';
package/dist/index.js CHANGED
@@ -16,7 +16,6 @@ export { Dialog, default as DialogDefault } from './components/Dialog';
16
16
  export { ContactPopover, default as ContactPopoverDefault } from './components/ContactPopover';
17
17
  export { default as DropdownButton } from './components/DropdownButton';
18
18
  export { default as DropdownText } from './components/DropdownText';
19
- export { ExtendableFab } from './components/ExtendableFab';
20
19
  export { default as ListItem } from './components/ListItem';
21
20
  export { default as ListItemButton } from './components/ListItemButton';
22
21
  export { default as ListItemText } from './components/ListItemText';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@linagora/twake-mui",
3
3
  "type": "module",
4
- "version": "9.11.0",
4
+ "version": "9.11.2",
5
5
  "description": "MUI v9 theme system for Twake applications",
6
6
  "author": "Twake",
7
7
  "license": "MIT",
@@ -1,7 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { ExtendableFab } from './index';
3
- declare const meta: Meta<typeof ExtendableFab>;
4
- export default meta;
5
- type Story = StoryObj<typeof meta>;
6
- export declare const Default: Story;
7
- export declare const Screenshot: Story;
@@ -1,43 +0,0 @@
1
- import { Plus } from '@linagora/twake-icons';
2
- import { Box, Stack } from '@mui/material';
3
- import React from 'react';
4
- import { ExtendableFab } from './index';
5
- const meta = {
6
- title: 'ExtendableFab',
7
- component: ExtendableFab,
8
- parameters: { layout: 'fullscreen' },
9
- tags: ['autodocs'],
10
- args: {
11
- label: 'Add',
12
- icon: Plus,
13
- color: 'primary',
14
- size: 'medium',
15
- topLimit: 50,
16
- scrollOptions: { delay: 250 }
17
- },
18
- argTypes: {
19
- label: { control: 'text' },
20
- icon: { control: false },
21
- color: {
22
- control: 'select',
23
- options: ['default', 'primary', 'secondary', 'inherit']
24
- },
25
- size: { control: 'select', options: ['small', 'medium', 'large'] },
26
- topLimit: { control: 'number' },
27
- scrollOptions: { control: 'object' },
28
- disabled: { control: 'boolean' }
29
- }
30
- };
31
- export default meta;
32
- export const Default = {
33
- render: args => (React.createElement(Box, { sx: { p: 2 } },
34
- React.createElement(ExtendableFab, { sx: { position: 'sticky', top: 16 }, ...args }),
35
- React.createElement(Box, { sx: { py: 2 } }, "Scroll the page vertically"),
36
- React.createElement(Box, { sx: { height: '200vh' } })))
37
- };
38
- export const Screenshot = {
39
- tags: ['argos'],
40
- render: () => (React.createElement(Stack, { spacing: 2, direction: "row", sx: { p: 4 } },
41
- React.createElement(ExtendableFab, { label: "Add", icon: Plus, color: "primary" }),
42
- React.createElement(ExtendableFab, { label: "Add", icon: Plus, color: "inherit" })))
43
- };
@@ -1,16 +0,0 @@
1
- import { IconProps } from '@linagora/twake-icons';
2
- import { FabProps } from '@mui/material';
3
- import React from 'react';
4
- export interface ScrollOptions {
5
- /** Delay in ms before the window scroll position is read */
6
- delay?: number;
7
- }
8
- export interface ExtendableFabProps extends Omit<FabProps, 'ref' | 'children'> {
9
- label: string;
10
- icon: IconProps['icon'];
11
- /** Window scroll offset in px below which the Fab stays extended */
12
- topLimit?: number;
13
- scrollOptions?: ScrollOptions;
14
- }
15
- export declare const ExtendableFab: React.ForwardRefExoticComponent<ExtendableFabProps & React.RefAttributes<HTMLButtonElement>>;
16
- export default ExtendableFab;
@@ -1,17 +0,0 @@
1
- import { Icon } from '@linagora/twake-icons';
2
- import { Fab, styled } from '@mui/material';
3
- import React, { forwardRef, useState } from 'react';
4
- import { useDebounce, useOnWindowScroll } from 'rooks';
5
- const GappedFab = styled(Fab)(({ theme }) => ({ gap: theme.spacing(1) }));
6
- export const ExtendableFab = forwardRef(({ label, icon, topLimit = 50, scrollOptions, ...props }, ref) => {
7
- const [isBelowTopLimit, setIsBelowTopLimit] = useState(true);
8
- const handleScroll = useDebounce(() => {
9
- setIsBelowTopLimit(window.scrollY < topLimit);
10
- }, scrollOptions?.delay ?? 250);
11
- useOnWindowScroll(handleScroll);
12
- return (React.createElement(GappedFab, { ref: ref, "aria-label": label, variant: isBelowTopLimit ? 'extended' : 'circular', ...props },
13
- React.createElement(Icon, { icon: icon }),
14
- isBelowTopLimit && label));
15
- });
16
- ExtendableFab.displayName = 'ExtendableFab';
17
- export default ExtendableFab;