@teambit/component 1.0.1217 → 1.0.1219

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.
@@ -1,5 +1,5 @@
1
- import * as compositions_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.component_component@1.0.1217/dist/component.composition.js';
2
- import * as overview_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.component_component@1.0.1217/dist/component.docs.mdx';
1
+ import * as compositions_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.component_component@1.0.1219/dist/component.composition.js';
2
+ import * as overview_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.component_component@1.0.1219/dist/component.docs.mdx';
3
3
 
4
4
  export const compositions = [compositions_0];
5
5
  export const overview = [overview_0];
@@ -109,12 +109,27 @@ function CollapsibleMenuNav({
109
109
  }
110
110
  return (_widgetPlugins || []).filter(widget => !widget[1].props.hideInMinimalMode).sort(sortFn);
111
111
  }, [widgetSlot, widgetPlugins, isMinimal]);
112
- const links = [...plugins, ...widgets].map(([, menuItem], index) => {
112
+
113
+ // in minimal mode, primary tabs (e.g. Preview) render outside the ResponsiveNavbar, which would
114
+ // otherwise collapse any tab but the first when space runs out. The first tab is kept with them
115
+ // to preserve its position (the navbar never collapses it either); all other tabs stay collapsible.
116
+ const hasPrimary = isMinimal && plugins.some(([, {
117
+ props
118
+ }]) => props.primaryInMinimalMode);
119
+ const fixedPlugins = hasPrimary ? plugins.filter(([, {
120
+ props
121
+ }], index) => index === 0 || props.primaryInMinimalMode) : [];
122
+ const collapsiblePlugins = plugins.filter(plugin => !fixedPlugins.includes(plugin));
123
+ const responsiveItems = [...collapsiblePlugins, ...widgets];
124
+
125
+ // `activeTabIndex` refers to the full list; map it to the responsive list (-1 when a fixed tab is active)
126
+ const responsiveActiveIndex = activeTabIndex === undefined ? undefined : responsiveItems.indexOf([...plugins, ...widgets][activeTabIndex]);
127
+ const links = responsiveItems.map(([, menuItem], index) => {
113
128
  // these styles keep plugins to the left and widgets to the right.
114
- const lastPluginStyle = plugins.length - 1 === index ? {
129
+ const lastPluginStyle = collapsiblePlugins.length - 1 === index ? {
115
130
  marginRight: 'auto'
116
131
  } : {};
117
- const firstWidgetStyle = plugins.length === index ? {
132
+ const firstWidgetStyle = collapsiblePlugins.length === index ? {
118
133
  marginLeft: 'auto'
119
134
  } : {};
120
135
  return {
@@ -127,9 +142,17 @@ function CollapsibleMenuNav({
127
142
  };
128
143
  });
129
144
  return /*#__PURE__*/_react().default.createElement(_react().default.Fragment, null, isMinimal && /*#__PURE__*/_react().default.createElement(MinimalMenuNav, {
130
- links: links,
145
+ navItems: [...plugins, ...widgets],
131
146
  secondaryNavClassName: secondaryNavClassName
132
- }), /*#__PURE__*/_react().default.createElement(_designNavigation().ResponsiveNavbar, {
147
+ }), fixedPlugins.length > 0 && /*#__PURE__*/_react().default.createElement("div", {
148
+ className: _menuModule().default.minimalFixedNav
149
+ }, fixedPlugins.map(([, {
150
+ props
151
+ }], index) => /*#__PURE__*/_react().default.createElement(TopBarNavComponent, {
152
+ key: `minimal-fixed-${index}`,
153
+ menuItemProps: props,
154
+ isInMenu: false
155
+ }))), /*#__PURE__*/_react().default.createElement(_designNavigation().ResponsiveNavbar, {
133
156
  navClassName: (0, _classnames().default)(_menuModule().default.tab, isMinimal && _menuModule().default.hideMinimalMobileNav, className),
134
157
  secondaryNavClassName: secondaryNavClassName,
135
158
  style: {
@@ -138,18 +161,27 @@ function CollapsibleMenuNav({
138
161
  },
139
162
  priority: "none",
140
163
  tabs: links,
141
- defaultActiveIndex: activeTabIndex,
164
+ defaultActiveIndex: responsiveActiveIndex,
142
165
  alwaysShowActiveTab: alwaysShowActiveTab
143
166
  }, children));
144
167
  }
145
168
  function MinimalMenuNav({
146
- links,
169
+ navItems,
147
170
  secondaryNavClassName
148
171
  }) {
149
- if (links.length === 0) return null;
172
+ if (navItems.length === 0) return null;
173
+
174
+ // primary tabs (e.g. Preview) stay pinned on mobile, right after the More menu that holds the
175
+ // rest (Overview first); they render their compact `minimalMobileChildren` (an icon) when given.
176
+ const primaryItems = navItems.filter(([, {
177
+ props
178
+ }]) => props.primaryInMinimalMode);
179
+ const moreItems = navItems.filter(([, {
180
+ props
181
+ }]) => !props.primaryInMinimalMode);
150
182
  return /*#__PURE__*/_react().default.createElement("div", {
151
183
  className: _menuModule().default.minimalMoreNav
152
- }, /*#__PURE__*/_react().default.createElement(_designInputs().Dropdown, {
184
+ }, moreItems.length > 0 && /*#__PURE__*/_react().default.createElement(_designInputs().Dropdown, {
153
185
  placeholderContent: /*#__PURE__*/_react().default.createElement("div", {
154
186
  className: _menuModule().default.minimalMoreButton,
155
187
  "aria-label": "More component sections"
@@ -162,13 +194,24 @@ function MinimalMenuNav({
162
194
  placeholderBorder: false,
163
195
  clickToggles: true,
164
196
  margin: 8
165
- }, links.map((link, index) => /*#__PURE__*/_react().default.createElement(_designInputsSelectors().MenuItem, {
197
+ }, moreItems.map(([, {
198
+ props
199
+ }], index) => /*#__PURE__*/_react().default.createElement(_designInputsSelectors().MenuItem, {
166
200
  className: _menuModule().default.minimalMenuItem,
167
201
  key: `minimal-dropdown-${index}`
168
202
  }, /*#__PURE__*/_react().default.createElement(TopBarNavComponent, {
169
- menuItemProps: link.tabProps?.menuItemProps,
203
+ menuItemProps: props,
170
204
  isInMenu: true
171
- })))));
205
+ })))), primaryItems.map(([, {
206
+ props
207
+ }], index) => /*#__PURE__*/_react().default.createElement(TopBarNavComponent, {
208
+ key: `minimal-primary-${index}`,
209
+ menuItemProps: _objectSpread(_objectSpread({}, props), {}, {
210
+ children: props.minimalMobileChildren ?? props.children,
211
+ className: (0, _classnames().default)(props.className, _menuModule().default.minimalPrimaryTab)
212
+ }),
213
+ isInMenu: false
214
+ })));
172
215
  }
173
216
  function sortFn([, {
174
217
  order: first
@@ -1 +1 @@
1
- {"version":3,"names":["_react","data","_interopRequireWildcard","require","_classnames","_interopRequireDefault","_designNavigation","_designInputs","_designInputsSelectors","_workspaceUi","_topBarNav","_menuModule","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ownKeys","keys","getOwnPropertySymbols","filter","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","_toPropertyKey","value","configurable","writable","_toPrimitive","Symbol","toPrimitive","TypeError","String","Number","_extends","assign","bind","TopBarNavComponent","isInMenu","menuItemProps","widgetDisplayText","displayName","undefined","createElement","TopBarNav","className","classnames","styles","topBarNav","noBorder","children","CollapsibleMenuNav","navigationSlot","widgetSlot","navPlugins","widgetPlugins","secondaryNavClassName","activeTabIndex","alwaysShowActiveTab","isMinimal","useWorkspaceMode","plugins","useMemo","_navPlugins","toArray","sort","sortFn","widget","props","hideInMinimalMode","widgets","_widgetPlugins","links","map","menuItem","index","lastPluginStyle","marginRight","firstWidgetStyle","marginLeft","component","tabProps","style","Fragment","MinimalMenuNav","ResponsiveNavbar","navClassName","tab","hideMinimalMobileNav","width","height","priority","tabs","defaultActiveIndex","minimalMoreNav","Dropdown","placeholderContent","minimalMoreButton","src","alt","dropClass","position","placeholderBorder","clickToggles","margin","link","MenuItem","minimalMenuItem","key","order","first","second"],"sources":["menu-nav.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport classnames from 'classnames';\nimport { ResponsiveNavbar } from '@teambit/design.navigation.responsive-navbar';\nimport type { Tab, TabProps } from '@teambit/design.navigation.responsive-navbar';\nimport { Dropdown } from '@teambit/design.inputs.dropdown';\nimport { MenuItem } from '@teambit/design.inputs.selectors.menu-item';\nimport { useWorkspaceMode } from '@teambit/workspace.ui.use-workspace-mode';\nimport { TopBarNav } from '../top-bar-nav';\nimport styles from './menu.module.scss';\nimport type { NavPlugin, OrderedNavigationSlot } from './nav-plugin';\n\nexport type MenuNavProps = {\n /**\n * @deprecated\n * use @property navPlugins\n */\n navigationSlot?: OrderedNavigationSlot;\n /**\n * @deprecated\n * use @property widgetPlugins\n */\n widgetSlot?: OrderedNavigationSlot;\n navPlugins?: [string, NavPlugin][];\n widgetPlugins?: [string, NavPlugin][];\n /**\n * A className to pass to the secondary nav, i.e dropdown\n */\n secondaryNavClassName?: string;\n activeTabIndex?: number;\n alwaysShowActiveTab?: boolean;\n} & React.HTMLAttributes<HTMLElement>;\n\nfunction TopBarNavComponent({ isInMenu, menuItemProps }: TabProps) {\n /**\n * to accommodate for the top level nav which should display the children\n * in the dropdown secondary menu if there is a displayName set\n */\n const widgetDisplayText = menuItemProps?.displayName && isInMenu ? menuItemProps?.displayName : undefined;\n return (\n <TopBarNav\n {...menuItemProps}\n className={classnames(menuItemProps?.className, styles.topBarNav, isInMenu && styles.noBorder)}\n >\n {widgetDisplayText || menuItemProps?.children}\n </TopBarNav>\n );\n}\n\nexport function CollapsibleMenuNav({\n navigationSlot,\n widgetSlot,\n navPlugins = [],\n widgetPlugins = [],\n className,\n secondaryNavClassName,\n activeTabIndex,\n alwaysShowActiveTab,\n children,\n}: MenuNavProps) {\n const { isMinimal } = useWorkspaceMode();\n const plugins = useMemo(() => {\n const _navPlugins = navPlugins.length > 0 ? navPlugins : navigationSlot?.toArray();\n if (!isMinimal) {\n return (_navPlugins || []).sort(sortFn);\n }\n return (_navPlugins || []).filter((widget) => !widget[1].props.hideInMinimalMode).sort(sortFn);\n }, [navigationSlot, navPlugins, isMinimal]);\n\n const widgets = useMemo(() => {\n const _widgetPlugins = widgetPlugins.length > 0 ? widgetPlugins : widgetSlot?.toArray();\n if (!isMinimal) {\n return (_widgetPlugins || []).sort(sortFn);\n }\n return (_widgetPlugins || []).filter((widget) => !widget[1].props.hideInMinimalMode).sort(sortFn);\n }, [widgetSlot, widgetPlugins, isMinimal]);\n\n const links = [...plugins, ...widgets].map(([, menuItem], index) => {\n // these styles keep plugins to the left and widgets to the right.\n const lastPluginStyle = plugins.length - 1 === index ? { marginRight: 'auto' } : {};\n\n const firstWidgetStyle = plugins.length === index ? { marginLeft: 'auto' } : {};\n\n return {\n component: TopBarNavComponent,\n tabProps: {\n menuItemProps: menuItem.props,\n },\n style: { ...firstWidgetStyle, ...lastPluginStyle },\n className: menuItem.props.className,\n };\n });\n\n return (\n <>\n {isMinimal && <MinimalMenuNav links={links} secondaryNavClassName={secondaryNavClassName} />}\n <ResponsiveNavbar\n navClassName={classnames(styles.tab, isMinimal && styles.hideMinimalMobileNav, className)}\n secondaryNavClassName={secondaryNavClassName}\n style={{ width: '100%', height: '100%' }}\n priority=\"none\"\n tabs={links}\n defaultActiveIndex={activeTabIndex}\n alwaysShowActiveTab={alwaysShowActiveTab}\n >\n {children}\n </ResponsiveNavbar>\n </>\n );\n}\n\nfunction MinimalMenuNav({ links, secondaryNavClassName }: { links: Tab[]; secondaryNavClassName?: string }) {\n if (links.length === 0) return null;\n\n return (\n <div className={styles.minimalMoreNav}>\n <Dropdown\n placeholderContent={\n <div className={styles.minimalMoreButton} aria-label=\"More component sections\">\n <img src=\"https://static.bit.dev/bit-icons/more-h.svg\" alt=\"\" />\n </div>\n }\n dropClass={secondaryNavClassName}\n position=\"bottom-end\"\n placeholderBorder={false}\n clickToggles\n margin={8}\n >\n {links.map((link, index) => (\n <MenuItem className={styles.minimalMenuItem} key={`minimal-dropdown-${index}`}>\n <TopBarNavComponent menuItemProps={link.tabProps?.menuItemProps} isInMenu />\n </MenuItem>\n ))}\n </Dropdown>\n </div>\n );\n}\n\nfunction sortFn([, { order: first }]: [string, NavPlugin], [, { order: second }]: [string, NavPlugin]) {\n return (first ?? 0) - (second ?? 0);\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","data","_interopRequireWildcard","require","_classnames","_interopRequireDefault","_designNavigation","_designInputs","_designInputsSelectors","_workspaceUi","_topBarNav","_menuModule","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ownKeys","keys","getOwnPropertySymbols","filter","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","_toPropertyKey","value","configurable","writable","_toPrimitive","Symbol","toPrimitive","TypeError","String","Number","_extends","assign","bind","TopBarNavComponent","isInMenu","menuItemProps","widgetDisplayText","displayName","undefined","createElement","TopBarNav","className","classnames","styles","topBarNav","noBorder","children","CollapsibleMenuNav","navigationSlot","widgetSlot","navPlugins","widgetPlugins","secondaryNavClassName","activeTabIndex","alwaysShowActiveTab","isMinimal","useWorkspaceMode","plugins","useMemo","_navPlugins","toArray","sort","sortFn","widget","props","hideInMinimalMode","widgets","_widgetPlugins","hasPrimary","some","primaryInMinimalMode","fixedPlugins","index","collapsiblePlugins","plugin","includes","responsiveItems","responsiveActiveIndex","indexOf","links","map","menuItem","lastPluginStyle","marginRight","firstWidgetStyle","marginLeft","component","tabProps","style","Fragment","MinimalMenuNav","navItems","minimalFixedNav","key","ResponsiveNavbar","navClassName","tab","hideMinimalMobileNav","width","height","priority","tabs","defaultActiveIndex","primaryItems","moreItems","minimalMoreNav","Dropdown","placeholderContent","minimalMoreButton","src","alt","dropClass","position","placeholderBorder","clickToggles","margin","MenuItem","minimalMenuItem","minimalMobileChildren","minimalPrimaryTab","order","first","second"],"sources":["menu-nav.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport classnames from 'classnames';\nimport { ResponsiveNavbar } from '@teambit/design.navigation.responsive-navbar';\nimport type { TabProps } from '@teambit/design.navigation.responsive-navbar';\nimport { Dropdown } from '@teambit/design.inputs.dropdown';\nimport { MenuItem } from '@teambit/design.inputs.selectors.menu-item';\nimport { useWorkspaceMode } from '@teambit/workspace.ui.use-workspace-mode';\nimport { TopBarNav } from '../top-bar-nav';\nimport styles from './menu.module.scss';\nimport type { NavPlugin, OrderedNavigationSlot } from './nav-plugin';\n\nexport type MenuNavProps = {\n /**\n * @deprecated\n * use @property navPlugins\n */\n navigationSlot?: OrderedNavigationSlot;\n /**\n * @deprecated\n * use @property widgetPlugins\n */\n widgetSlot?: OrderedNavigationSlot;\n navPlugins?: [string, NavPlugin][];\n widgetPlugins?: [string, NavPlugin][];\n /**\n * A className to pass to the secondary nav, i.e dropdown\n */\n secondaryNavClassName?: string;\n activeTabIndex?: number;\n alwaysShowActiveTab?: boolean;\n} & React.HTMLAttributes<HTMLElement>;\n\nfunction TopBarNavComponent({ isInMenu, menuItemProps }: TabProps) {\n /**\n * to accommodate for the top level nav which should display the children\n * in the dropdown secondary menu if there is a displayName set\n */\n const widgetDisplayText = menuItemProps?.displayName && isInMenu ? menuItemProps?.displayName : undefined;\n return (\n <TopBarNav\n {...menuItemProps}\n className={classnames(menuItemProps?.className, styles.topBarNav, isInMenu && styles.noBorder)}\n >\n {widgetDisplayText || menuItemProps?.children}\n </TopBarNav>\n );\n}\n\nexport function CollapsibleMenuNav({\n navigationSlot,\n widgetSlot,\n navPlugins = [],\n widgetPlugins = [],\n className,\n secondaryNavClassName,\n activeTabIndex,\n alwaysShowActiveTab,\n children,\n}: MenuNavProps) {\n const { isMinimal } = useWorkspaceMode();\n const plugins = useMemo(() => {\n const _navPlugins = navPlugins.length > 0 ? navPlugins : navigationSlot?.toArray();\n if (!isMinimal) {\n return (_navPlugins || []).sort(sortFn);\n }\n return (_navPlugins || []).filter((widget) => !widget[1].props.hideInMinimalMode).sort(sortFn);\n }, [navigationSlot, navPlugins, isMinimal]);\n\n const widgets = useMemo(() => {\n const _widgetPlugins = widgetPlugins.length > 0 ? widgetPlugins : widgetSlot?.toArray();\n if (!isMinimal) {\n return (_widgetPlugins || []).sort(sortFn);\n }\n return (_widgetPlugins || []).filter((widget) => !widget[1].props.hideInMinimalMode).sort(sortFn);\n }, [widgetSlot, widgetPlugins, isMinimal]);\n\n // in minimal mode, primary tabs (e.g. Preview) render outside the ResponsiveNavbar, which would\n // otherwise collapse any tab but the first when space runs out. The first tab is kept with them\n // to preserve its position (the navbar never collapses it either); all other tabs stay collapsible.\n const hasPrimary = isMinimal && plugins.some(([, { props }]) => props.primaryInMinimalMode);\n const fixedPlugins = hasPrimary\n ? plugins.filter(([, { props }], index) => index === 0 || props.primaryInMinimalMode)\n : [];\n const collapsiblePlugins = plugins.filter((plugin) => !fixedPlugins.includes(plugin));\n const responsiveItems = [...collapsiblePlugins, ...widgets];\n\n // `activeTabIndex` refers to the full list; map it to the responsive list (-1 when a fixed tab is active)\n const responsiveActiveIndex =\n activeTabIndex === undefined ? undefined : responsiveItems.indexOf([...plugins, ...widgets][activeTabIndex]);\n\n const links = responsiveItems.map(([, menuItem], index) => {\n // these styles keep plugins to the left and widgets to the right.\n const lastPluginStyle = collapsiblePlugins.length - 1 === index ? { marginRight: 'auto' } : {};\n\n const firstWidgetStyle = collapsiblePlugins.length === index ? { marginLeft: 'auto' } : {};\n\n return {\n component: TopBarNavComponent,\n tabProps: {\n menuItemProps: menuItem.props,\n },\n style: { ...firstWidgetStyle, ...lastPluginStyle },\n className: menuItem.props.className,\n };\n });\n\n return (\n <>\n {isMinimal && (\n <MinimalMenuNav navItems={[...plugins, ...widgets]} secondaryNavClassName={secondaryNavClassName} />\n )}\n {fixedPlugins.length > 0 && (\n <div className={styles.minimalFixedNav}>\n {fixedPlugins.map(([, { props }], index) => (\n <TopBarNavComponent key={`minimal-fixed-${index}`} menuItemProps={props} isInMenu={false} />\n ))}\n </div>\n )}\n <ResponsiveNavbar\n navClassName={classnames(styles.tab, isMinimal && styles.hideMinimalMobileNav, className)}\n secondaryNavClassName={secondaryNavClassName}\n style={{ width: '100%', height: '100%' }}\n priority=\"none\"\n tabs={links}\n defaultActiveIndex={responsiveActiveIndex}\n alwaysShowActiveTab={alwaysShowActiveTab}\n >\n {children}\n </ResponsiveNavbar>\n </>\n );\n}\n\nfunction MinimalMenuNav({\n navItems,\n secondaryNavClassName,\n}: {\n navItems: [string, NavPlugin][];\n secondaryNavClassName?: string;\n}) {\n if (navItems.length === 0) return null;\n\n // primary tabs (e.g. Preview) stay pinned on mobile, right after the More menu that holds the\n // rest (Overview first); they render their compact `minimalMobileChildren` (an icon) when given.\n const primaryItems = navItems.filter(([, { props }]) => props.primaryInMinimalMode);\n const moreItems = navItems.filter(([, { props }]) => !props.primaryInMinimalMode);\n\n return (\n <div className={styles.minimalMoreNav}>\n {moreItems.length > 0 && (\n <Dropdown\n placeholderContent={\n <div className={styles.minimalMoreButton} aria-label=\"More component sections\">\n <img src=\"https://static.bit.dev/bit-icons/more-h.svg\" alt=\"\" />\n </div>\n }\n dropClass={secondaryNavClassName}\n position=\"bottom-end\"\n placeholderBorder={false}\n clickToggles\n margin={8}\n >\n {moreItems.map(([, { props }], index) => (\n <MenuItem className={styles.minimalMenuItem} key={`minimal-dropdown-${index}`}>\n <TopBarNavComponent menuItemProps={props} isInMenu />\n </MenuItem>\n ))}\n </Dropdown>\n )}\n {primaryItems.map(([, { props }], index) => (\n <TopBarNavComponent\n key={`minimal-primary-${index}`}\n menuItemProps={{\n ...props,\n children: props.minimalMobileChildren ?? props.children,\n className: classnames(props.className, styles.minimalPrimaryTab),\n }}\n isInMenu={false}\n />\n ))}\n </div>\n );\n}\n\nfunction sortFn([, { order: first }]: [string, NavPlugin], [, { order: second }]: [string, NavPlugin]) {\n return (first ?? 0) - (second ?? 0);\n}\n"],"mappings":"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","ignoreList":[]}
@@ -10,6 +10,10 @@
10
10
  }
11
11
 
12
12
  .topBarMinimal {
13
+ // Size from content (not 100%) so the breadcrumb beside it only shrinks when space is short.
14
+ flex: 1 1 auto;
15
+ width: auto;
16
+
13
17
  @media screen and (max-width: $br-md) {
14
18
  // The breadcrumb owns the remaining mobile space, while this menu keeps the intrinsic width
15
19
  // of its pinned actions and right-side controls.
@@ -80,6 +84,27 @@
80
84
  }
81
85
  }
82
86
 
87
+ // Desktop minimal mode: Overview + Preview sit outside the ResponsiveNavbar so they can never
88
+ // collapse into its overflow menu. Matches the navbar's tab row (8px gap, 14px, no wrapping).
89
+ .minimalFixedNav {
90
+ display: flex;
91
+ flex: none;
92
+ gap: 8px;
93
+ height: 100%;
94
+ margin-right: 8px;
95
+ font-size: var(--bit-p-xs, 14px);
96
+ white-space: nowrap;
97
+ color: var(--on-background-color, #2b2b2b);
98
+
99
+ @media screen and (max-width: $br-md) {
100
+ display: none;
101
+ }
102
+ }
103
+
104
+ .minimalPrimaryTab {
105
+ height: 100%;
106
+ }
107
+
83
108
  .hideMinimalMobileNav {
84
109
  @media screen and (max-width: $br-md) {
85
110
  display: none;
@@ -1,3 +1,4 @@
1
+ import type React from 'react';
1
2
  import type { SlotRegistry } from '@teambit/harmony';
2
3
  import type { LinkProps } from '@teambit/base-react.navigation.link';
3
4
  import type { ConsumeMethod } from '@teambit/ui-foundation.ui.use-box.menu';
@@ -8,6 +9,16 @@ export type NavPluginProps = {
8
9
  displayName?: string;
9
10
  ignoreQueryParams?: boolean;
10
11
  hideInMinimalMode?: boolean;
12
+ /**
13
+ * in minimal mode on mobile, keep this tab visible next to the compact "More" menu instead of
14
+ * collapsing it into the menu.
15
+ */
16
+ primaryInMinimalMode?: boolean;
17
+ /**
18
+ * compact content (e.g. an icon) to render instead of `children` for a primary tab in minimal
19
+ * mode on mobile, where the row is shared with the breadcrumb and menu actions.
20
+ */
21
+ minimalMobileChildren?: React.ReactNode;
11
22
  } & LinkProps;
12
23
  export type NavPlugin = {
13
24
  props: NavPluginProps;
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["nav-plugin.tsx"],"sourcesContent":["import type { SlotRegistry } from '@teambit/harmony';\nimport type { LinkProps } from '@teambit/base-react.navigation.link';\nimport type { ConsumeMethod } from '@teambit/ui-foundation.ui.use-box.menu';\nimport type { LaneModel } from '@teambit/lanes.ui.models.lanes-model';\nimport type { ComponentID } from '@teambit/component-id';\nimport type { ComponentModel } from '../component-model';\n\nexport type NavPluginProps = {\n displayName?: string;\n ignoreQueryParams?: boolean;\n hideInMinimalMode?: boolean;\n} & LinkProps;\n\nexport type NavPlugin = {\n props: NavPluginProps;\n order?: number;\n};\n\nexport type OrderedNavigationSlot = SlotRegistry<NavPlugin>;\nexport type ConsumePluginOptions = {\n viewedLane?: LaneModel;\n hide?: boolean;\n disableInstall?: boolean;\n};\n\nexport type ConsumePluginProps = {\n id: ComponentID;\n packageName: string;\n latest?: string;\n // @deprecated - pass id, packageName and latest instead via props\n componentModel?: ComponentModel;\n options?: ConsumePluginOptions;\n authToken?: string;\n};\n\nexport type ConsumePlugin = (props: ConsumePluginProps) => ConsumeMethod | undefined;\n\nexport type ConsumeMethodSlot = SlotRegistry<ConsumePlugin[]>;\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["nav-plugin.tsx"],"sourcesContent":["import type React from 'react';\nimport type { SlotRegistry } from '@teambit/harmony';\nimport type { LinkProps } from '@teambit/base-react.navigation.link';\nimport type { ConsumeMethod } from '@teambit/ui-foundation.ui.use-box.menu';\nimport type { LaneModel } from '@teambit/lanes.ui.models.lanes-model';\nimport type { ComponentID } from '@teambit/component-id';\nimport type { ComponentModel } from '../component-model';\n\nexport type NavPluginProps = {\n displayName?: string;\n ignoreQueryParams?: boolean;\n hideInMinimalMode?: boolean;\n /**\n * in minimal mode on mobile, keep this tab visible next to the compact \"More\" menu instead of\n * collapsing it into the menu.\n */\n primaryInMinimalMode?: boolean;\n /**\n * compact content (e.g. an icon) to render instead of `children` for a primary tab in minimal\n * mode on mobile, where the row is shared with the breadcrumb and menu actions.\n */\n minimalMobileChildren?: React.ReactNode;\n} & LinkProps;\n\nexport type NavPlugin = {\n props: NavPluginProps;\n order?: number;\n};\n\nexport type OrderedNavigationSlot = SlotRegistry<NavPlugin>;\nexport type ConsumePluginOptions = {\n viewedLane?: LaneModel;\n hide?: boolean;\n disableInstall?: boolean;\n};\n\nexport type ConsumePluginProps = {\n id: ComponentID;\n packageName: string;\n latest?: string;\n // @deprecated - pass id, packageName and latest instead via props\n componentModel?: ComponentModel;\n options?: ConsumePluginOptions;\n authToken?: string;\n};\n\nexport type ConsumePlugin = (props: ConsumePluginProps) => ConsumeMethod | undefined;\n\nexport type ConsumeMethodSlot = SlotRegistry<ConsumePlugin[]>;\n"],"mappings":"","ignoreList":[]}
@@ -1,3 +1,3 @@
1
1
  import React from 'react';
2
2
  import type { NavPluginProps } from '../menu/nav-plugin';
3
- export declare function TopBarNav({ href, className, activeClassName, children, displayName, ignoreQueryParams, ...rest }: NavPluginProps): React.JSX.Element;
3
+ export declare function TopBarNav({ href, className, activeClassName, children, displayName, ignoreQueryParams, hideInMinimalMode: _hideInMinimalMode, primaryInMinimalMode: _primaryInMinimalMode, minimalMobileChildren: _minimalMobileChildren, ...rest }: NavPluginProps): React.JSX.Element;
@@ -39,7 +39,7 @@ function _topBarNavModule() {
39
39
  };
40
40
  return data;
41
41
  }
42
- const _excluded = ["href", "className", "activeClassName", "children", "displayName", "ignoreQueryParams"];
42
+ const _excluded = ["href", "className", "activeClassName", "children", "displayName", "ignoreQueryParams", "hideInMinimalMode", "primaryInMinimalMode", "minimalMobileChildren"];
43
43
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
44
44
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
45
45
  function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
@@ -53,7 +53,11 @@ function TopBarNav(_ref) {
53
53
  activeClassName,
54
54
  children,
55
55
  displayName,
56
- ignoreQueryParams
56
+ ignoreQueryParams,
57
+ // menu layout flags, not link attributes
58
+ hideInMinimalMode: _hideInMinimalMode,
59
+ primaryInMinimalMode: _primaryInMinimalMode,
60
+ minimalMobileChildren: _minimalMobileChildren
57
61
  } = _ref,
58
62
  rest = _objectWithoutProperties(_ref, _excluded);
59
63
  const {
@@ -1 +1 @@
1
- {"version":3,"names":["_react","data","_interopRequireDefault","require","_classnames","_reactRouterDom","_baseReactNavigation","_topBarNavModule","_excluded","e","__esModule","default","_extends","Object","assign","bind","n","arguments","length","t","r","hasOwnProperty","call","apply","_objectWithoutProperties","o","i","_objectWithoutPropertiesLoose","getOwnPropertySymbols","indexOf","propertyIsEnumerable","Link","BaseLink","TopBarNav","_ref","href","className","activeClassName","children","displayName","ignoreQueryParams","rest","search","useLocation","preventPassingDisplayNameToLink","target","createElement","classnames","styles","topBarLink","active"],"sources":["top-bar-nav.tsx"],"sourcesContent":["import React from 'react';\nimport classnames from 'classnames';\nimport { useLocation } from 'react-router-dom';\nimport { Link as BaseLink } from '@teambit/base-react.navigation.link';\nimport type { NavPluginProps } from '../menu/nav-plugin';\n\nimport styles from './top-bar-nav.module.scss';\n\n// @todo - this will be fixed as part of the @teambit/base-react.navigation.link upgrade to latest\nconst Link = BaseLink as any;\n\nexport function TopBarNav({\n href,\n className,\n activeClassName,\n children,\n displayName,\n ignoreQueryParams,\n ...rest\n}: NavPluginProps) {\n const { search } = useLocation(); // sticky query params\n\n // @hack - this is so that the displayName will not pass to the link and cause a warning in the console.\n // it is used for component page nav link widgets (code, aspects etc),\n // but not for regular menu links (overview, compositions, etc).\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const preventPassingDisplayNameToLink = displayName;\n\n const target = (href && !ignoreQueryParams && `${href}${search}`) || href;\n\n return (\n <Link\n {...rest}\n className={classnames(className, styles.topBarLink)}\n activeClassName={classnames(activeClassName, styles.active)}\n href={target}\n >\n <div>{children}</div>\n </Link>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","data","_interopRequireDefault","require","_classnames","_reactRouterDom","_baseReactNavigation","_topBarNavModule","_excluded","e","__esModule","default","_extends","Object","assign","bind","n","arguments","length","t","r","hasOwnProperty","call","apply","_objectWithoutProperties","o","i","_objectWithoutPropertiesLoose","getOwnPropertySymbols","indexOf","propertyIsEnumerable","Link","BaseLink","TopBarNav","_ref","href","className","activeClassName","children","displayName","ignoreQueryParams","hideInMinimalMode","_hideInMinimalMode","primaryInMinimalMode","_primaryInMinimalMode","minimalMobileChildren","_minimalMobileChildren","rest","search","useLocation","preventPassingDisplayNameToLink","target","createElement","classnames","styles","topBarLink","active"],"sources":["top-bar-nav.tsx"],"sourcesContent":["import React from 'react';\nimport classnames from 'classnames';\nimport { useLocation } from 'react-router-dom';\nimport { Link as BaseLink } from '@teambit/base-react.navigation.link';\nimport type { NavPluginProps } from '../menu/nav-plugin';\n\nimport styles from './top-bar-nav.module.scss';\n\n// @todo - this will be fixed as part of the @teambit/base-react.navigation.link upgrade to latest\nconst Link = BaseLink as any;\n\nexport function TopBarNav({\n href,\n className,\n activeClassName,\n children,\n displayName,\n ignoreQueryParams,\n // menu layout flags, not link attributes\n hideInMinimalMode: _hideInMinimalMode,\n primaryInMinimalMode: _primaryInMinimalMode,\n minimalMobileChildren: _minimalMobileChildren,\n ...rest\n}: NavPluginProps) {\n const { search } = useLocation(); // sticky query params\n\n // @hack - this is so that the displayName will not pass to the link and cause a warning in the console.\n // it is used for component page nav link widgets (code, aspects etc),\n // but not for regular menu links (overview, compositions, etc).\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const preventPassingDisplayNameToLink = displayName;\n\n const target = (href && !ignoreQueryParams && `${href}${search}`) || href;\n\n return (\n <Link\n {...rest}\n className={classnames(className, styles.topBarLink)}\n activeClassName={classnames(activeClassName, styles.active)}\n href={target}\n >\n <div>{children}</div>\n </Link>\n );\n}\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@teambit/component",
3
- "version": "1.0.1217",
3
+ "version": "1.0.1219",
4
4
  "homepage": "https://bit.cloud/teambit/component/component",
5
5
  "main": "dist/index.js",
6
6
  "componentId": {
7
7
  "scope": "teambit.component",
8
8
  "name": "component",
9
- "version": "1.0.1217"
9
+ "version": "1.0.1219"
10
10
  },
11
11
  "dependencies": {
12
12
  "@teambit/any-fs": "0.0.5",
@@ -86,8 +86,8 @@
86
86
  "@teambit/lanes.hooks.use-lanes": "0.0.300",
87
87
  "@teambit/lanes.ui.models.lanes-model": "0.0.239",
88
88
  "@teambit/ui-foundation.ui.use-box.dropdown": "0.0.151",
89
- "@teambit/aspect-loader": "1.0.1217",
90
- "@teambit/dependency-resolver": "1.0.1217"
89
+ "@teambit/aspect-loader": "1.0.1219",
90
+ "@teambit/dependency-resolver": "1.0.1219"
91
91
  },
92
92
  "devDependencies": {
93
93
  "@types/lodash": "4.14.165",
@@ -1,7 +1,7 @@
1
1
  import React, { useMemo } from 'react';
2
2
  import classnames from 'classnames';
3
3
  import { ResponsiveNavbar } from '@teambit/design.navigation.responsive-navbar';
4
- import type { Tab, TabProps } from '@teambit/design.navigation.responsive-navbar';
4
+ import type { TabProps } from '@teambit/design.navigation.responsive-navbar';
5
5
  import { Dropdown } from '@teambit/design.inputs.dropdown';
6
6
  import { MenuItem } from '@teambit/design.inputs.selectors.menu-item';
7
7
  import { useWorkspaceMode } from '@teambit/workspace.ui.use-workspace-mode';
@@ -74,11 +74,25 @@ export function CollapsibleMenuNav({
74
74
  return (_widgetPlugins || []).filter((widget) => !widget[1].props.hideInMinimalMode).sort(sortFn);
75
75
  }, [widgetSlot, widgetPlugins, isMinimal]);
76
76
 
77
- const links = [...plugins, ...widgets].map(([, menuItem], index) => {
77
+ // in minimal mode, primary tabs (e.g. Preview) render outside the ResponsiveNavbar, which would
78
+ // otherwise collapse any tab but the first when space runs out. The first tab is kept with them
79
+ // to preserve its position (the navbar never collapses it either); all other tabs stay collapsible.
80
+ const hasPrimary = isMinimal && plugins.some(([, { props }]) => props.primaryInMinimalMode);
81
+ const fixedPlugins = hasPrimary
82
+ ? plugins.filter(([, { props }], index) => index === 0 || props.primaryInMinimalMode)
83
+ : [];
84
+ const collapsiblePlugins = plugins.filter((plugin) => !fixedPlugins.includes(plugin));
85
+ const responsiveItems = [...collapsiblePlugins, ...widgets];
86
+
87
+ // `activeTabIndex` refers to the full list; map it to the responsive list (-1 when a fixed tab is active)
88
+ const responsiveActiveIndex =
89
+ activeTabIndex === undefined ? undefined : responsiveItems.indexOf([...plugins, ...widgets][activeTabIndex]);
90
+
91
+ const links = responsiveItems.map(([, menuItem], index) => {
78
92
  // these styles keep plugins to the left and widgets to the right.
79
- const lastPluginStyle = plugins.length - 1 === index ? { marginRight: 'auto' } : {};
93
+ const lastPluginStyle = collapsiblePlugins.length - 1 === index ? { marginRight: 'auto' } : {};
80
94
 
81
- const firstWidgetStyle = plugins.length === index ? { marginLeft: 'auto' } : {};
95
+ const firstWidgetStyle = collapsiblePlugins.length === index ? { marginLeft: 'auto' } : {};
82
96
 
83
97
  return {
84
98
  component: TopBarNavComponent,
@@ -92,14 +106,23 @@ export function CollapsibleMenuNav({
92
106
 
93
107
  return (
94
108
  <>
95
- {isMinimal && <MinimalMenuNav links={links} secondaryNavClassName={secondaryNavClassName} />}
109
+ {isMinimal && (
110
+ <MinimalMenuNav navItems={[...plugins, ...widgets]} secondaryNavClassName={secondaryNavClassName} />
111
+ )}
112
+ {fixedPlugins.length > 0 && (
113
+ <div className={styles.minimalFixedNav}>
114
+ {fixedPlugins.map(([, { props }], index) => (
115
+ <TopBarNavComponent key={`minimal-fixed-${index}`} menuItemProps={props} isInMenu={false} />
116
+ ))}
117
+ </div>
118
+ )}
96
119
  <ResponsiveNavbar
97
120
  navClassName={classnames(styles.tab, isMinimal && styles.hideMinimalMobileNav, className)}
98
121
  secondaryNavClassName={secondaryNavClassName}
99
122
  style={{ width: '100%', height: '100%' }}
100
123
  priority="none"
101
124
  tabs={links}
102
- defaultActiveIndex={activeTabIndex}
125
+ defaultActiveIndex={responsiveActiveIndex}
103
126
  alwaysShowActiveTab={alwaysShowActiveTab}
104
127
  >
105
128
  {children}
@@ -108,29 +131,53 @@ export function CollapsibleMenuNav({
108
131
  );
109
132
  }
110
133
 
111
- function MinimalMenuNav({ links, secondaryNavClassName }: { links: Tab[]; secondaryNavClassName?: string }) {
112
- if (links.length === 0) return null;
134
+ function MinimalMenuNav({
135
+ navItems,
136
+ secondaryNavClassName,
137
+ }: {
138
+ navItems: [string, NavPlugin][];
139
+ secondaryNavClassName?: string;
140
+ }) {
141
+ if (navItems.length === 0) return null;
142
+
143
+ // primary tabs (e.g. Preview) stay pinned on mobile, right after the More menu that holds the
144
+ // rest (Overview first); they render their compact `minimalMobileChildren` (an icon) when given.
145
+ const primaryItems = navItems.filter(([, { props }]) => props.primaryInMinimalMode);
146
+ const moreItems = navItems.filter(([, { props }]) => !props.primaryInMinimalMode);
113
147
 
114
148
  return (
115
149
  <div className={styles.minimalMoreNav}>
116
- <Dropdown
117
- placeholderContent={
118
- <div className={styles.minimalMoreButton} aria-label="More component sections">
119
- <img src="https://static.bit.dev/bit-icons/more-h.svg" alt="" />
120
- </div>
121
- }
122
- dropClass={secondaryNavClassName}
123
- position="bottom-end"
124
- placeholderBorder={false}
125
- clickToggles
126
- margin={8}
127
- >
128
- {links.map((link, index) => (
129
- <MenuItem className={styles.minimalMenuItem} key={`minimal-dropdown-${index}`}>
130
- <TopBarNavComponent menuItemProps={link.tabProps?.menuItemProps} isInMenu />
131
- </MenuItem>
132
- ))}
133
- </Dropdown>
150
+ {moreItems.length > 0 && (
151
+ <Dropdown
152
+ placeholderContent={
153
+ <div className={styles.minimalMoreButton} aria-label="More component sections">
154
+ <img src="https://static.bit.dev/bit-icons/more-h.svg" alt="" />
155
+ </div>
156
+ }
157
+ dropClass={secondaryNavClassName}
158
+ position="bottom-end"
159
+ placeholderBorder={false}
160
+ clickToggles
161
+ margin={8}
162
+ >
163
+ {moreItems.map(([, { props }], index) => (
164
+ <MenuItem className={styles.minimalMenuItem} key={`minimal-dropdown-${index}`}>
165
+ <TopBarNavComponent menuItemProps={props} isInMenu />
166
+ </MenuItem>
167
+ ))}
168
+ </Dropdown>
169
+ )}
170
+ {primaryItems.map(([, { props }], index) => (
171
+ <TopBarNavComponent
172
+ key={`minimal-primary-${index}`}
173
+ menuItemProps={{
174
+ ...props,
175
+ children: props.minimalMobileChildren ?? props.children,
176
+ className: classnames(props.className, styles.minimalPrimaryTab),
177
+ }}
178
+ isInMenu={false}
179
+ />
180
+ ))}
134
181
  </div>
135
182
  );
136
183
  }
@@ -10,6 +10,10 @@
10
10
  }
11
11
 
12
12
  .topBarMinimal {
13
+ // Size from content (not 100%) so the breadcrumb beside it only shrinks when space is short.
14
+ flex: 1 1 auto;
15
+ width: auto;
16
+
13
17
  @media screen and (max-width: $br-md) {
14
18
  // The breadcrumb owns the remaining mobile space, while this menu keeps the intrinsic width
15
19
  // of its pinned actions and right-side controls.
@@ -80,6 +84,27 @@
80
84
  }
81
85
  }
82
86
 
87
+ // Desktop minimal mode: Overview + Preview sit outside the ResponsiveNavbar so they can never
88
+ // collapse into its overflow menu. Matches the navbar's tab row (8px gap, 14px, no wrapping).
89
+ .minimalFixedNav {
90
+ display: flex;
91
+ flex: none;
92
+ gap: 8px;
93
+ height: 100%;
94
+ margin-right: 8px;
95
+ font-size: var(--bit-p-xs, 14px);
96
+ white-space: nowrap;
97
+ color: var(--on-background-color, #2b2b2b);
98
+
99
+ @media screen and (max-width: $br-md) {
100
+ display: none;
101
+ }
102
+ }
103
+
104
+ .minimalPrimaryTab {
105
+ height: 100%;
106
+ }
107
+
83
108
  .hideMinimalMobileNav {
84
109
  @media screen and (max-width: $br-md) {
85
110
  display: none;
@@ -1,3 +1,4 @@
1
+ import type React from 'react';
1
2
  import type { SlotRegistry } from '@teambit/harmony';
2
3
  import type { LinkProps } from '@teambit/base-react.navigation.link';
3
4
  import type { ConsumeMethod } from '@teambit/ui-foundation.ui.use-box.menu';
@@ -9,6 +10,16 @@ export type NavPluginProps = {
9
10
  displayName?: string;
10
11
  ignoreQueryParams?: boolean;
11
12
  hideInMinimalMode?: boolean;
13
+ /**
14
+ * in minimal mode on mobile, keep this tab visible next to the compact "More" menu instead of
15
+ * collapsing it into the menu.
16
+ */
17
+ primaryInMinimalMode?: boolean;
18
+ /**
19
+ * compact content (e.g. an icon) to render instead of `children` for a primary tab in minimal
20
+ * mode on mobile, where the row is shared with the breadcrumb and menu actions.
21
+ */
22
+ minimalMobileChildren?: React.ReactNode;
12
23
  } & LinkProps;
13
24
 
14
25
  export type NavPlugin = {
@@ -16,6 +16,10 @@ export function TopBarNav({
16
16
  children,
17
17
  displayName,
18
18
  ignoreQueryParams,
19
+ // menu layout flags, not link attributes
20
+ hideInMinimalMode: _hideInMinimalMode,
21
+ primaryInMinimalMode: _primaryInMinimalMode,
22
+ minimalMobileChildren: _minimalMobileChildren,
19
23
  ...rest
20
24
  }: NavPluginProps) {
21
25
  const { search } = useLocation(); // sticky query params