@sproutsocial/seeds-react-menu 1.17.0 → 1.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/.turbo/turbo-build.log +14 -22
  2. package/CHANGELOG.md +30 -0
  3. package/dist/esm/index.js +542 -229
  4. package/dist/esm/index.js.map +1 -1
  5. package/dist/esm/v3/index.js +793 -1038
  6. package/dist/esm/v3/index.js.map +1 -1
  7. package/dist/v3/index.d.mts +64 -38
  8. package/dist/v3/index.d.ts +64 -38
  9. package/dist/v3/index.js +813 -1058
  10. package/dist/v3/index.js.map +1 -1
  11. package/dist/v3/menu.css +947 -0
  12. package/package.json +20 -21
  13. package/src/v3/ActionMenuStyles.tsx +169 -149
  14. package/src/v3/Common/ComboboxStyles.tsx +396 -511
  15. package/src/v3/Common/SelectIcons.tsx +17 -8
  16. package/src/v3/Common/SelectItem.tsx +25 -38
  17. package/src/v3/Common/SelectStyles.tsx +146 -144
  18. package/src/v3/Common/cn.ts +38 -0
  19. package/src/v3/MenuButtonStyles.tsx +55 -34
  20. package/src/v3/MultiSearchableSelect.tsx +8 -8
  21. package/src/v3/MultiSelect.tsx +11 -16
  22. package/src/v3/SingleSelect.tsx +13 -13
  23. package/src/v3/menu.css +947 -0
  24. package/tsup.config.ts +0 -1
  25. package/dist/esm/chunk-ROQATIB7.js +0 -357
  26. package/dist/esm/chunk-ROQATIB7.js.map +0 -1
  27. package/dist/esm/v2/index.js +0 -2089
  28. package/dist/esm/v2/index.js.map +0 -1
  29. package/dist/v2/index.d.mts +0 -108
  30. package/dist/v2/index.d.ts +0 -108
  31. package/dist/v2/index.js +0 -2280
  32. package/dist/v2/index.js.map +0 -1
  33. package/src/v2/Autocomplete/Autocomplete.stories.tsx +0 -645
  34. package/src/v2/Autocomplete/MultiAutocomplete.tsx +0 -487
  35. package/src/v2/Autocomplete/SingleAutocomplete.tsx +0 -366
  36. package/src/v2/Autocomplete/index.ts +0 -2
  37. package/src/v2/Common-V2/ComboboxContent.tsx +0 -457
  38. package/src/v2/Common-V2/MenuGroup.tsx +0 -60
  39. package/src/v2/Common-V2/MenuGroupTypes.ts +0 -30
  40. package/src/v2/Common-V2/MenuHeading.tsx +0 -83
  41. package/src/v2/Common-V2/MenuItem.tsx +0 -138
  42. package/src/v2/Common-V2/Popout.tsx +0 -124
  43. package/src/v2/Common-V2/PopoutTypes.tsx +0 -109
  44. package/src/v2/Common-V2/SelectToggleButton.tsx +0 -99
  45. package/src/v2/Common-V2/index.ts +0 -11
  46. package/src/v2/Common-V2/props.ts +0 -84
  47. package/src/v2/Common-V2/styles.tsx +0 -41
  48. package/src/v2/Common-V2/types.ts +0 -16
  49. package/src/v2/Common-V2/useHighlightedIndex.ts +0 -62
  50. package/src/v2/Common-V2/utils.ts +0 -238
  51. package/src/v2/SearchableSelect/AutocompleteContent.tsx +0 -325
  52. package/src/v2/SearchableSelect/SearchableMultiSelect.tsx +0 -527
  53. package/src/v2/SearchableSelect/SearchableSelect.tsx +0 -395
  54. package/src/v2/SearchableSelect/index.ts +0 -12
  55. package/src/v2/Select/MultiSelect.tsx +0 -417
  56. package/src/v2/Select/Select.stories.tsx +0 -593
  57. package/src/v2/Select/SingleSelect.tsx +0 -285
  58. package/src/v2/Select/index.ts +0 -2
  59. package/src/v2/index.ts +0 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sproutsocial/seeds-react-menu",
3
- "version": "1.17.0",
3
+ "version": "1.18.0",
4
4
  "description": "Seeds React Menu",
5
5
  "author": "Sprout Social, Inc.",
6
6
  "license": "MIT",
@@ -13,20 +13,19 @@
13
13
  "import": "./dist/esm/index.js",
14
14
  "require": "./dist/index.js"
15
15
  },
16
- "./experimental": {
17
- "types": "./dist/v2/index.d.ts",
18
- "import": "./dist/esm/v2/index.js",
19
- "require": "./dist/v2/index.js"
20
- },
21
16
  "./base": {
22
17
  "types": "./dist/v3/index.d.ts",
23
18
  "import": "./dist/esm/v3/index.js",
24
19
  "require": "./dist/v3/index.js"
25
- }
20
+ },
21
+ "./base/css": "./dist/v3/menu.css"
26
22
  },
23
+ "sideEffects": [
24
+ "**/*.css"
25
+ ],
27
26
  "scripts": {
28
- "build": "tsup --dts",
29
- "build:debug": "tsup --dts --metafile",
27
+ "build": "tsup --dts && cp src/v3/menu.css dist/v3/menu.css",
28
+ "build:debug": "tsup --dts --metafile && cp src/v3/menu.css dist/v3/menu.css",
30
29
  "dev": "tsup --watch --dts",
31
30
  "clean": "rm -rf .turbo dist",
32
31
  "clean:modules": "rm -rf node_modules",
@@ -36,18 +35,18 @@
36
35
  },
37
36
  "dependencies": {
38
37
  "@radix-ui/react-popover": "^1.1.2",
39
- "@sproutsocial/seeds-react-box": "^1.1.31",
40
- "@sproutsocial/seeds-react-button": "^2.3.8",
41
- "@sproutsocial/seeds-react-checkbox": "^1.3.53",
42
- "@sproutsocial/seeds-react-icon": "^2.5.1",
43
- "@sproutsocial/seeds-react-input": "^1.5.41",
44
- "@sproutsocial/seeds-react-label": "^1.0.33",
45
- "@sproutsocial/seeds-react-popout": "^2.5.22",
46
- "@sproutsocial/seeds-react-radio": "^1.3.34",
47
- "@sproutsocial/seeds-react-switch": "^1.2.51",
38
+ "@sproutsocial/seeds-react-box": "^1.1.32",
39
+ "@sproutsocial/seeds-react-button": "^2.3.9",
40
+ "@sproutsocial/seeds-react-checkbox": "^1.3.54",
41
+ "@sproutsocial/seeds-react-icon": "^2.5.2",
42
+ "@sproutsocial/seeds-react-input": "^1.5.42",
43
+ "@sproutsocial/seeds-react-label": "^1.0.34",
44
+ "@sproutsocial/seeds-react-popout": "^2.5.23",
45
+ "@sproutsocial/seeds-react-radio": "^1.3.35",
46
+ "@sproutsocial/seeds-react-switch": "^1.2.52",
48
47
  "@sproutsocial/seeds-react-system-props": "^3.2.1",
49
- "@sproutsocial/seeds-react-theme": "^4.5.0",
50
- "@sproutsocial/seeds-react-token-input": "^1.4.63",
48
+ "@sproutsocial/seeds-react-theme": "^4.5.1",
49
+ "@sproutsocial/seeds-react-token-input": "^1.4.64",
51
50
  "@sproutsocial/seeds-react-utilities": "^4.3.0",
52
51
  "@base-ui/react": "^1.3.0",
53
52
  "@tanstack/react-virtual": "^3.13.12",
@@ -57,7 +56,7 @@
57
56
  "styled-system": "^5.1.5"
58
57
  },
59
58
  "devDependencies": {
60
- "@sproutsocial/seeds-react-tooltip": "^1.1.38",
59
+ "@sproutsocial/seeds-react-tooltip": "^1.1.39",
61
60
  "@sproutsocial/eslint-config-seeds": "*",
62
61
  "@sproutsocial/seeds-react-testing-library": "*",
63
62
  "@sproutsocial/seeds-testing": "*",
@@ -1,154 +1,174 @@
1
+ import * as React from "react";
1
2
  import { Menu } from "@base-ui/react/menu";
2
- import styled, { css } from "styled-components";
3
- import { focusRing } from "@sproutsocial/seeds-react-mixins";
4
-
5
- export const ActionMenuTrigger = styled(Menu.Trigger)``;
6
-
7
- export const ActionMenuPositioner = styled(Menu.Positioner)`
8
- min-width: var(--anchor-width);
9
- z-index: 7;
10
- `;
3
+ import { cn, type WithStringClassName } from "./Common/cn";
4
+
5
+ /**
6
+ * v3 Action Menu surface, rendered with CSS classes from menu.css (imported via
7
+ * @sproutsocial/seeds-react-menu/base/css) instead of styled-components. Each
8
+ * export keeps its previous name and forwards props/refs to the underlying
9
+ * Base UI Menu component.
10
+ */
11
+
12
+ // Trigger had no styles of its own; keep it as a thin pass-through so the
13
+ // existing render/disabled props still reach Menu.Trigger.
14
+ export const ActionMenuTrigger = Menu.Trigger;
15
+
16
+ export const ActionMenuPositioner = React.forwardRef<
17
+ React.ElementRef<typeof Menu.Positioner>,
18
+ WithStringClassName<React.ComponentProps<typeof Menu.Positioner>>
19
+ >(({ className, ...rest }, ref) => (
20
+ <Menu.Positioner
21
+ ref={ref}
22
+ className={cn("seeds-action-menu-positioner", className)}
23
+ {...rest}
24
+ />
25
+ ));
26
+ ActionMenuPositioner.displayName = "ActionMenuPositioner";
11
27
 
12
28
  // Opt out of Base UI Drawer's swipe-to-dismiss pointer capture when the menu
13
29
  // is rendered inside a Drawer. Without this, the Drawer's viewport captures
14
30
  // pointermove/up on portaled popups and MenuItem clicks never fire.
15
- export const ActionMenuPopup = styled(Menu.Popup).attrs({
16
- "data-base-ui-swipe-ignore": "",
17
- })`
18
- font-family: ${({ theme }) => theme.fontFamily};
19
- background: ${({ theme }) => theme.colors.container.background.base};
20
- border: 1px solid ${({ theme }) => theme.colors.container.border.base};
21
- border-radius: ${({ theme }) => theme.radii[500]};
22
- box-shadow: ${({ theme }) => theme.shadows.low};
23
- outline: none;
24
- max-height: min(var(--available-height, 400px), 400px);
25
- overflow-y: auto;
26
- padding: ${({ theme }) => theme.space[300]};
27
-
28
- &[data-open] {
29
- animation: action-menu-popup-in 120ms ease-out;
30
- }
31
-
32
- &[data-closed] {
33
- animation: action-menu-popup-out 100ms ease-in;
34
- }
35
-
36
- @keyframes action-menu-popup-in {
37
- from {
38
- opacity: 0;
39
- transform: scale(0.95);
40
- }
41
- to {
42
- opacity: 1;
43
- transform: scale(1);
44
- }
45
- }
46
-
47
- @keyframes action-menu-popup-out {
48
- from {
49
- opacity: 1;
50
- transform: scale(1);
51
- }
52
- to {
53
- opacity: 0;
54
- transform: scale(0.95);
55
- }
56
- }
57
- `;
58
-
59
- export const ActionMenuGroup = styled(Menu.Group)`
60
- display: block;
61
- `;
62
-
63
- export const ActionMenuGroupLabel = styled(Menu.GroupLabel)`
64
- padding: ${({ theme }) => `${theme.space[300]}`};
65
- font-size: ${({ theme }) => theme.typography[100].fontSize};
66
- color: ${({ theme }) => theme.colors.text.body};
67
- `;
68
-
69
- export const ActionMenuSeparator = styled(Menu.Separator)`
70
- height: 1px;
71
- margin: ${({ theme }) => `${theme.space[300]} -${theme.space[300]}`};
72
- background: ${({ theme }) => theme.colors.container.border.base};
73
- `;
74
-
75
- const menuItemStyles = css`
76
- box-sizing: border-box;
77
- display: block;
78
- width: 100%;
79
- border-radius: ${({ theme }) => theme.radii[500]};
80
- background-color: ${({ theme }) => theme.colors.listItem.background.base};
81
- border: 1px solid ${({ theme }) => theme.colors.listItem.background.base};
82
- color: ${({ theme }) => theme.colors.text.body};
83
- font-family: ${({ theme }) => theme.fontFamily};
84
- font-weight: ${({ theme }) => theme.fontWeights.normal};
85
- text-align: left;
86
- text-decoration: none;
87
- padding: ${({ theme }) => theme.space[300]};
88
- outline: 0;
89
- ${({ theme }) => theme.typography[200]};
90
- transition: all ${({ theme }) => theme.duration.fast};
91
- cursor: pointer;
92
- user-select: none;
93
-
94
- &[data-highlighted] {
95
- border-color: ${({ theme }) => theme.colors.listItem.border.base};
96
- background-color: ${({ theme }) => theme.colors.listItem.background.hover};
97
- color: ${({ theme }) => theme.colors.text.body};
98
- text-decoration: none;
99
- }
100
-
101
- &[data-disabled] {
102
- cursor: not-allowed;
103
- opacity: 0.4;
104
- }
105
- `;
106
-
107
- export const StyledMenuItem = styled(Menu.Item)`
108
- ${menuItemStyles}
109
- `;
110
-
111
- export const StyledCheckboxItem = styled(Menu.CheckboxItem)`
112
- ${menuItemStyles}
113
- display: flex;
114
- align-items: center;
115
- gap: ${({ theme }) => theme.space[300]};
116
- `;
117
-
118
- export const StyledRadioItem = styled(Menu.RadioItem)`
119
- ${menuItemStyles}
120
- display: flex;
121
- align-items: center;
122
- gap: ${({ theme }) => theme.space[300]};
123
- `;
124
-
125
- export const StyledCheckboxItemIndicator = styled(Menu.CheckboxItemIndicator)`
126
- display: flex;
127
- align-items: center;
128
- width: 16px;
129
- color: ${({ theme }) => theme.colors.text.body};
130
- `;
131
-
132
- export const StyledRadioItemIndicator = styled(Menu.RadioItemIndicator)`
133
- display: flex;
134
- align-items: center;
135
- width: 16px;
136
- color: ${({ theme }) => theme.colors.text.body};
137
- `;
138
-
139
- export const StyledSubmenuTrigger = styled(Menu.SubmenuTrigger)`
140
- ${menuItemStyles}
141
- display: flex;
142
- align-items: center;
143
- gap: ${({ theme }) => theme.space[300]};
144
- justify-content: space-between;
145
-
146
- &[data-popup-open] {
147
- border-color: ${({ theme }) => theme.colors.listItem.border.base};
148
- background-color: ${({ theme }) => theme.colors.listItem.background.hover};
149
- }
150
- `;
151
-
152
- export const StyledLinkItem = styled(Menu.LinkItem)`
153
- ${menuItemStyles}
154
- `;
31
+ export const ActionMenuPopup = React.forwardRef<
32
+ React.ElementRef<typeof Menu.Popup>,
33
+ WithStringClassName<React.ComponentProps<typeof Menu.Popup>>
34
+ >(({ className, ...rest }, ref) => (
35
+ <Menu.Popup
36
+ ref={ref}
37
+ data-base-ui-swipe-ignore=""
38
+ className={cn("seeds-action-menu-popup", className)}
39
+ {...rest}
40
+ />
41
+ ));
42
+ ActionMenuPopup.displayName = "ActionMenuPopup";
43
+
44
+ export const ActionMenuGroup = React.forwardRef<
45
+ React.ElementRef<typeof Menu.Group>,
46
+ WithStringClassName<React.ComponentProps<typeof Menu.Group>>
47
+ >(({ className, ...rest }, ref) => (
48
+ <Menu.Group
49
+ ref={ref}
50
+ className={cn("seeds-action-menu-group", className)}
51
+ {...rest}
52
+ />
53
+ ));
54
+ ActionMenuGroup.displayName = "ActionMenuGroup";
55
+
56
+ export const ActionMenuGroupLabel = React.forwardRef<
57
+ React.ElementRef<typeof Menu.GroupLabel>,
58
+ WithStringClassName<React.ComponentProps<typeof Menu.GroupLabel>>
59
+ >(({ className, ...rest }, ref) => (
60
+ <Menu.GroupLabel
61
+ ref={ref}
62
+ className={cn("seeds-action-menu-group-label", className)}
63
+ {...rest}
64
+ />
65
+ ));
66
+ ActionMenuGroupLabel.displayName = "ActionMenuGroupLabel";
67
+
68
+ export const ActionMenuSeparator = React.forwardRef<
69
+ React.ElementRef<typeof Menu.Separator>,
70
+ WithStringClassName<React.ComponentProps<typeof Menu.Separator>>
71
+ >(({ className, ...rest }, ref) => (
72
+ <Menu.Separator
73
+ ref={ref}
74
+ className={cn("seeds-action-menu-separator", className)}
75
+ {...rest}
76
+ />
77
+ ));
78
+ ActionMenuSeparator.displayName = "ActionMenuSeparator";
79
+
80
+ export const StyledMenuItem = React.forwardRef<
81
+ React.ElementRef<typeof Menu.Item>,
82
+ WithStringClassName<React.ComponentProps<typeof Menu.Item>>
83
+ >(({ className, ...rest }, ref) => (
84
+ <Menu.Item
85
+ ref={ref}
86
+ className={cn("seeds-action-menu-item", className)}
87
+ {...rest}
88
+ />
89
+ ));
90
+ StyledMenuItem.displayName = "StyledMenuItem";
91
+
92
+ export const StyledCheckboxItem = React.forwardRef<
93
+ React.ElementRef<typeof Menu.CheckboxItem>,
94
+ WithStringClassName<React.ComponentProps<typeof Menu.CheckboxItem>>
95
+ >(({ className, ...rest }, ref) => (
96
+ <Menu.CheckboxItem
97
+ ref={ref}
98
+ className={cn(
99
+ "seeds-action-menu-item",
100
+ "seeds-action-menu-item--flex",
101
+ className
102
+ )}
103
+ {...rest}
104
+ />
105
+ ));
106
+ StyledCheckboxItem.displayName = "StyledCheckboxItem";
107
+
108
+ export const StyledRadioItem = React.forwardRef<
109
+ React.ElementRef<typeof Menu.RadioItem>,
110
+ WithStringClassName<React.ComponentProps<typeof Menu.RadioItem>>
111
+ >(({ className, ...rest }, ref) => (
112
+ <Menu.RadioItem
113
+ ref={ref}
114
+ className={cn(
115
+ "seeds-action-menu-item",
116
+ "seeds-action-menu-item--flex",
117
+ className
118
+ )}
119
+ {...rest}
120
+ />
121
+ ));
122
+ StyledRadioItem.displayName = "StyledRadioItem";
123
+
124
+ export const StyledCheckboxItemIndicator = React.forwardRef<
125
+ React.ElementRef<typeof Menu.CheckboxItemIndicator>,
126
+ WithStringClassName<React.ComponentProps<typeof Menu.CheckboxItemIndicator>>
127
+ >(({ className, ...rest }, ref) => (
128
+ <Menu.CheckboxItemIndicator
129
+ ref={ref}
130
+ className={cn("seeds-action-menu-item-indicator", className)}
131
+ {...rest}
132
+ />
133
+ ));
134
+ StyledCheckboxItemIndicator.displayName = "StyledCheckboxItemIndicator";
135
+
136
+ export const StyledRadioItemIndicator = React.forwardRef<
137
+ React.ElementRef<typeof Menu.RadioItemIndicator>,
138
+ WithStringClassName<React.ComponentProps<typeof Menu.RadioItemIndicator>>
139
+ >(({ className, ...rest }, ref) => (
140
+ <Menu.RadioItemIndicator
141
+ ref={ref}
142
+ className={cn("seeds-action-menu-item-indicator", className)}
143
+ {...rest}
144
+ />
145
+ ));
146
+ StyledRadioItemIndicator.displayName = "StyledRadioItemIndicator";
147
+
148
+ export const StyledSubmenuTrigger = React.forwardRef<
149
+ React.ElementRef<typeof Menu.SubmenuTrigger>,
150
+ WithStringClassName<React.ComponentProps<typeof Menu.SubmenuTrigger>>
151
+ >(({ className, ...rest }, ref) => (
152
+ <Menu.SubmenuTrigger
153
+ ref={ref}
154
+ className={cn(
155
+ "seeds-action-menu-item",
156
+ "seeds-action-menu-submenu-trigger",
157
+ className
158
+ )}
159
+ {...rest}
160
+ />
161
+ ));
162
+ StyledSubmenuTrigger.displayName = "StyledSubmenuTrigger";
163
+
164
+ export const StyledLinkItem = React.forwardRef<
165
+ React.ElementRef<typeof Menu.LinkItem>,
166
+ WithStringClassName<React.ComponentProps<typeof Menu.LinkItem>>
167
+ >(({ className, ...rest }, ref) => (
168
+ <Menu.LinkItem
169
+ ref={ref}
170
+ className={cn("seeds-action-menu-item", className)}
171
+ {...rest}
172
+ />
173
+ ));
174
+ StyledLinkItem.displayName = "StyledLinkItem";