@teambit/component 0.0.915 → 0.0.918

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.
@@ -4,3 +4,4 @@ export declare type MenuNavProps = {
4
4
  navigationSlot: OrderedNavigationSlot;
5
5
  } & React.HTMLAttributes<HTMLElement>;
6
6
  export declare function MenuNav({ navigationSlot, className }: MenuNavProps): JSX.Element;
7
+ export declare function CollapsableMenuNav({ navigationSlot, className }: MenuNavProps): JSX.Element;
@@ -6,6 +6,7 @@ require("core-js/modules/es.array.sort.js");
6
6
  Object.defineProperty(exports, "__esModule", {
7
7
  value: true
8
8
  });
9
+ exports.CollapsableMenuNav = CollapsableMenuNav;
9
10
  exports.MenuNav = MenuNav;
10
11
  function _extends2() {
11
12
  const data = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
@@ -28,6 +29,13 @@ function _classnames() {
28
29
  };
29
30
  return data;
30
31
  }
32
+ function _designNavigation() {
33
+ const data = require("@teambit/design.navigation.responsive-navbar");
34
+ _designNavigation = function () {
35
+ return data;
36
+ };
37
+ return data;
38
+ }
31
39
  function _topBarNav() {
32
40
  const data = require("../top-bar-nav");
33
41
  _topBarNav = function () {
@@ -57,6 +65,33 @@ function MenuNav({
57
65
  }, menuItem.props));
58
66
  }));
59
67
  }
68
+ function CollapsableMenuNav({
69
+ navigationSlot,
70
+ className
71
+ }) {
72
+ const plugins = (0, _react().useMemo)(() => navigationSlot.toArray().sort(sortFn), [navigationSlot]);
73
+ const links = plugins.map(([id, menuItem]) => {
74
+ return {
75
+ component: function TopBarNavComponent({
76
+ isInMenu
77
+ }) {
78
+ return /*#__PURE__*/_react().default.createElement(_topBarNav().TopBarNav, (0, _extends2().default)({
79
+ className: (0, _classnames().default)(_menuModule().default.topBarNav, isInMenu && _menuModule().default.noBorder),
80
+ key: id
81
+ }, menuItem.props));
82
+ }
83
+ };
84
+ });
85
+ return /*#__PURE__*/_react().default.createElement(_designNavigation().ResponsiveNavbar, {
86
+ navClassName: (0, _classnames().default)(_menuModule().default.tab, className),
87
+ style: {
88
+ width: '100%',
89
+ height: '100%'
90
+ },
91
+ priority: "none",
92
+ tabs: links
93
+ });
94
+ }
60
95
  function sortFn([, {
61
96
  order: first
62
97
  }], [, {
@@ -1 +1 @@
1
- {"version":3,"names":["MenuNav","navigationSlot","className","plugins","useMemo","toArray","sort","sortFn","classnames","styles","navigation","desktopNav","map","id","menuItem","props","order","first","second"],"sources":["menu-nav.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport classnames from 'classnames';\nimport { TopBarNav } from '../top-bar-nav';\nimport styles from './menu.module.scss';\nimport { NavPlugin, OrderedNavigationSlot } from './nav-plugin';\n\nexport type MenuNavProps = {\n navigationSlot: OrderedNavigationSlot;\n} & React.HTMLAttributes<HTMLElement>;\n\nexport function MenuNav({ navigationSlot, className }: MenuNavProps) {\n const plugins = useMemo(() => navigationSlot.toArray().sort(sortFn), [navigationSlot]);\n\n return (\n <nav className={classnames(styles.navigation, styles.desktopNav, className)}>\n {plugins.map(([id, menuItem]) => {\n return <TopBarNav key={id} {...menuItem.props} />;\n })}\n </nav>\n );\n}\n\nfunction sortFn([, { order: first }]: [string, NavPlugin], [, { order: second }]: [string, NavPlugin]) {\n // 0 - equal\n // <0 - first < second\n // >0 - first > second\n\n return (first ?? 0) - (second ?? 0);\n}\n\n// // this is the aspect-oriented and serialize-able way to sort plugins.\n// const pluginOrder = ['teambit.docs/docs', 'teambit.compositions/compositions', 'teambit.docs/docs'];\n// export function toSortedArray<T>(slot: SlotRegistry<T>, order: string[]) {\n// // sort items according to the order\n// const sorted = order.map((x) => [x, slot.get(x)]).filter(([, val]) => !!val) as [string, T][];\n//\n// // add all other items\n// const unsorted = slot.toArray().filter(([id]) => order.indexOf(id) < 0);\n//\n// return sorted.concat(unsorted);\n// }\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAAwC;AAAA;AAOjC,SAASA,OAAO,CAAC;EAAEC,cAAc;EAAEC;AAAwB,CAAC,EAAE;EACnE,MAAMC,OAAO,GAAG,IAAAC,gBAAO,EAAC,MAAMH,cAAc,CAACI,OAAO,EAAE,CAACC,IAAI,CAACC,MAAM,CAAC,EAAE,CAACN,cAAc,CAAC,CAAC;EAEtF,oBACE;IAAK,SAAS,EAAE,IAAAO,qBAAU,EAACC,qBAAM,CAACC,UAAU,EAAED,qBAAM,CAACE,UAAU,EAAET,SAAS;EAAE,GACzEC,OAAO,CAACS,GAAG,CAAC,CAAC,CAACC,EAAE,EAAEC,QAAQ,CAAC,KAAK;IAC/B,oBAAO,+BAAC,sBAAS;MAAC,GAAG,EAAED;IAAG,GAAKC,QAAQ,CAACC,KAAK,EAAI;EACnD,CAAC,CAAC,CACE;AAEV;AAEA,SAASR,MAAM,CAAC,GAAG;EAAES,KAAK,EAAEC;AAAM,CAAC,CAAsB,EAAE,GAAG;EAAED,KAAK,EAAEE;AAAO,CAAC,CAAsB,EAAE;EACrG;EACA;EACA;;EAEA,OAAO,CAACD,KAAK,aAALA,KAAK,cAALA,KAAK,GAAI,CAAC,KAAKC,MAAM,aAANA,MAAM,cAANA,MAAM,GAAI,CAAC,CAAC;AACrC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
1
+ {"version":3,"names":["MenuNav","navigationSlot","className","plugins","useMemo","toArray","sort","sortFn","classnames","styles","navigation","desktopNav","map","id","menuItem","props","CollapsableMenuNav","links","component","TopBarNavComponent","isInMenu","topBarNav","noBorder","tab","width","height","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 { TopBarNav } from '../top-bar-nav';\nimport styles from './menu.module.scss';\nimport { NavPlugin, OrderedNavigationSlot } from './nav-plugin';\n\nexport type MenuNavProps = {\n navigationSlot: OrderedNavigationSlot;\n} & React.HTMLAttributes<HTMLElement>;\n\nexport function MenuNav({ navigationSlot, className }: MenuNavProps) {\n const plugins = useMemo(() => navigationSlot.toArray().sort(sortFn), [navigationSlot]);\n\n return (\n <nav className={classnames(styles.navigation, styles.desktopNav, className)}>\n {plugins.map(([id, menuItem]) => {\n return <TopBarNav key={id} {...menuItem.props} />;\n })}\n </nav>\n );\n}\n\nexport function CollapsableMenuNav({ navigationSlot, className }: MenuNavProps) {\n const plugins = useMemo(() => navigationSlot.toArray().sort(sortFn), [navigationSlot]);\n const links = plugins.map(([id, menuItem]) => {\n return {\n component: function TopBarNavComponent({ isInMenu }: TabProps) {\n return (\n <TopBarNav\n className={classnames(styles.topBarNav, isInMenu && styles.noBorder)}\n key={id}\n {...menuItem.props}\n />\n );\n },\n };\n });\n return (\n <ResponsiveNavbar\n navClassName={classnames(styles.tab, className)}\n style={{ width: '100%', height: '100%' }}\n priority=\"none\"\n tabs={links}\n />\n );\n}\n\nfunction sortFn([, { order: first }]: [string, NavPlugin], [, { order: second }]: [string, NavPlugin]) {\n // 0 - equal\n // <0 - first < second\n // >0 - first > second\n\n return (first ?? 0) - (second ?? 0);\n}\n\n// // this is the aspect-oriented and serialize-able way to sort plugins.\n// const pluginOrder = ['teambit.docs/docs', 'teambit.compositions/compositions', 'teambit.docs/docs'];\n// export function toSortedArray<T>(slot: SlotRegistry<T>, order: string[]) {\n// // sort items according to the order\n// const sorted = order.map((x) => [x, slot.get(x)]).filter(([, val]) => !!val) as [string, T][];\n//\n// // add all other items\n// const unsorted = slot.toArray().filter(([id]) => order.indexOf(id) < 0);\n//\n// return sorted.concat(unsorted);\n// }\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAEA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAAwC;AAAA;AAOjC,SAASA,OAAO,CAAC;EAAEC,cAAc;EAAEC;AAAwB,CAAC,EAAE;EACnE,MAAMC,OAAO,GAAG,IAAAC,gBAAO,EAAC,MAAMH,cAAc,CAACI,OAAO,EAAE,CAACC,IAAI,CAACC,MAAM,CAAC,EAAE,CAACN,cAAc,CAAC,CAAC;EAEtF,oBACE;IAAK,SAAS,EAAE,IAAAO,qBAAU,EAACC,qBAAM,CAACC,UAAU,EAAED,qBAAM,CAACE,UAAU,EAAET,SAAS;EAAE,GACzEC,OAAO,CAACS,GAAG,CAAC,CAAC,CAACC,EAAE,EAAEC,QAAQ,CAAC,KAAK;IAC/B,oBAAO,+BAAC,sBAAS;MAAC,GAAG,EAAED;IAAG,GAAKC,QAAQ,CAACC,KAAK,EAAI;EACnD,CAAC,CAAC,CACE;AAEV;AAEO,SAASC,kBAAkB,CAAC;EAAEf,cAAc;EAAEC;AAAwB,CAAC,EAAE;EAC9E,MAAMC,OAAO,GAAG,IAAAC,gBAAO,EAAC,MAAMH,cAAc,CAACI,OAAO,EAAE,CAACC,IAAI,CAACC,MAAM,CAAC,EAAE,CAACN,cAAc,CAAC,CAAC;EACtF,MAAMgB,KAAK,GAAGd,OAAO,CAACS,GAAG,CAAC,CAAC,CAACC,EAAE,EAAEC,QAAQ,CAAC,KAAK;IAC5C,OAAO;MACLI,SAAS,EAAE,SAASC,kBAAkB,CAAC;QAAEC;MAAmB,CAAC,EAAE;QAC7D,oBACE,+BAAC,sBAAS;UACR,SAAS,EAAE,IAAAZ,qBAAU,EAACC,qBAAM,CAACY,SAAS,EAAED,QAAQ,IAAIX,qBAAM,CAACa,QAAQ,CAAE;UACrE,GAAG,EAAET;QAAG,GACJC,QAAQ,CAACC,KAAK,EAClB;MAEN;IACF,CAAC;EACH,CAAC,CAAC;EACF,oBACE,+BAAC,oCAAgB;IACf,YAAY,EAAE,IAAAP,qBAAU,EAACC,qBAAM,CAACc,GAAG,EAAErB,SAAS,CAAE;IAChD,KAAK,EAAE;MAAEsB,KAAK,EAAE,MAAM;MAAEC,MAAM,EAAE;IAAO,CAAE;IACzC,QAAQ,EAAC,MAAM;IACf,IAAI,EAAER;EAAM,EACZ;AAEN;AAEA,SAASV,MAAM,CAAC,GAAG;EAAEmB,KAAK,EAAEC;AAAM,CAAC,CAAsB,EAAE,GAAG;EAAED,KAAK,EAAEE;AAAO,CAAC,CAAsB,EAAE;EACrG;EACA;EACA;;EAEA,OAAO,CAACD,KAAK,aAALA,KAAK,cAALA,KAAK,GAAI,CAAC,KAAKC,MAAM,aAANA,MAAM,cAANA,MAAM,GAAI,CAAC,CAAC;AACrC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
@@ -105,13 +105,6 @@ function _menuNav() {
105
105
  };
106
106
  return data;
107
107
  }
108
- function _mobileMenuNav() {
109
- const data = require("./mobile-menu-nav");
110
- _mobileMenuNav = function () {
111
- return data;
112
- };
113
- return data;
114
- }
115
108
  function _menuModule() {
116
109
  const data = _interopRequireDefault(require("./menu.module.scss"));
117
110
  _menuModule = function () {
@@ -175,11 +168,8 @@ function ComponentMenu({
175
168
  className: (0, _classnames().default)(_menuModule().default.topBar, className)
176
169
  }, /*#__PURE__*/_react().default.createElement("div", {
177
170
  className: _menuModule().default.leftSide
178
- }, /*#__PURE__*/_react().default.createElement(_menuNav().MenuNav, {
171
+ }, /*#__PURE__*/_react().default.createElement(_menuNav().CollapsableMenuNav, {
179
172
  navigationSlot: navigationSlot
180
- }), /*#__PURE__*/_react().default.createElement(_mobileMenuNav().MobileMenuNav, {
181
- navigationSlot: navigationSlot,
182
- widgetSlot: widgetSlot
183
173
  })), /*#__PURE__*/_react().default.createElement("div", {
184
174
  className: _menuModule().default.rightSide
185
175
  }, /*#__PURE__*/_react().default.createElement("div", {
@@ -191,6 +181,7 @@ function ComponentMenu({
191
181
  consumeMethods: consumeMethodSlot,
192
182
  host: host
193
183
  }), /*#__PURE__*/_react().default.createElement(_uiFoundationUi().MainDropdown, {
184
+ className: _menuModule().default.hideOnMobile,
194
185
  menuItems: mainMenuItems
195
186
  })))
196
187
  }));
@@ -232,7 +223,7 @@ function VersionRelatedDropdowns({
232
223
  const methods = useConsumeMethods(consumeMethods, component, currentLane);
233
224
  return /*#__PURE__*/_react().default.createElement(_react().default.Fragment, null, tags.length > 0 && /*#__PURE__*/_react().default.createElement(_uiFoundationUiUseBox().UseBoxDropdown, {
234
225
  position: "bottom-end",
235
- className: _menuModule().default.useBox,
226
+ className: (0, _classnames().default)(_menuModule().default.useBox, _menuModule().default.hideOnMobile),
236
227
  Menu: /*#__PURE__*/_react().default.createElement(_uiFoundationUiUseBox2().Menu, {
237
228
  methods: methods,
238
229
  componentName: component.id.name
@@ -1 +1 @@
1
- {"version":3,"names":["getComponentIdStr","componentIdStr","isFunction","ComponentMenu","navigationSlot","widgetSlot","className","host","menuItemSlot","consumeMethodSlot","useComponent","path","useComponentFilters","idFromLocation","useIdFromLocation","_componentIdStr","componentId","ComponentID","fromString","undefined","resolvedComponentIdStr","useComponentOptions","logFilters","customUseComponent","component","useComponentQuery","toString","mainMenuItems","useMemo","groupBy","flatten","values","classnames","styles","topBar","leftSide","rightSide","widgets","VersionRelatedDropdowns","consumeMethods","location","useLocation","lanesModel","useLanes","currentLane","viewedLane","id","isDefault","logs","isWorkspace","snaps","filter","log","tag","map","snap","version","hash","tags","tagLookup","Map","forEach","set","compact","toArray","reverse","get","isNew","length","lanes","getLanesByComponentId","lane","localVersion","currentVersion","search","includes","methods","useConsumeMethods","useBox","name","latest","componentVersionMenu","componentModel","method","x","Component","Title"],"sources":["menu.tsx"],"sourcesContent":["import { Routes, Route } from 'react-router-dom';\nimport { MainDropdown, MenuItemSlot } from '@teambit/ui-foundation.ui.main-dropdown';\nimport { VersionDropdown } from '@teambit/component.ui.version-dropdown';\nimport { FullLoader } from '@teambit/ui-foundation.ui.full-loader';\nimport type { ConsumeMethod } from '@teambit/ui-foundation.ui.use-box.menu';\nimport { useLocation } from '@teambit/base-react.navigation.link';\nimport { flatten, groupBy, compact, isFunction } from 'lodash';\nimport classnames from 'classnames';\nimport React, { useMemo } from 'react';\nimport { UseBoxDropdown } from '@teambit/ui-foundation.ui.use-box.dropdown';\nimport { useLanes } from '@teambit/lanes.hooks.use-lanes';\nimport { LaneModel } from '@teambit/lanes.ui.models.lanes-model';\nimport { Menu as ConsumeMethodsMenu } from '@teambit/ui-foundation.ui.use-box.menu';\nimport { LegacyComponentLog } from '@teambit/legacy-component-log';\nimport type { ComponentModel } from '../component-model';\nimport { useComponent as useComponentQuery, UseComponentType } from '../use-component';\nimport { MenuNav } from './menu-nav';\nimport { MobileMenuNav } from './mobile-menu-nav';\nimport styles from './menu.module.scss';\nimport { OrderedNavigationSlot, ConsumeMethodSlot } from './nav-plugin';\nimport { useIdFromLocation } from '../use-component-from-location';\nimport { ComponentID } from '../..';\nimport { Filters } from '../use-component-query';\n\nexport type MenuProps = {\n className?: string;\n /**\n * slot for top bar menu nav items\n */\n navigationSlot: OrderedNavigationSlot;\n /**\n * right side menu item slot\n */\n widgetSlot: OrderedNavigationSlot;\n host: string;\n /**\n * main dropdown item slot\n */\n menuItemSlot: MenuItemSlot;\n\n consumeMethodSlot: ConsumeMethodSlot;\n\n componentIdStr?: string | (() => string | undefined);\n\n useComponent?: UseComponentType;\n\n path?: string;\n\n useComponentFilters?: () => Filters;\n};\nfunction getComponentIdStr(componentIdStr?: string | (() => string | undefined)): string | undefined {\n if (isFunction(componentIdStr)) return componentIdStr();\n return componentIdStr;\n}\n/**\n * top bar menu.\n */\nexport function ComponentMenu({\n navigationSlot,\n widgetSlot,\n className,\n host,\n menuItemSlot,\n consumeMethodSlot,\n componentIdStr,\n useComponent,\n path,\n useComponentFilters,\n}: MenuProps) {\n const idFromLocation = useIdFromLocation();\n const _componentIdStr = getComponentIdStr(componentIdStr);\n const componentId = _componentIdStr ? ComponentID.fromString(_componentIdStr) : undefined;\n const resolvedComponentIdStr = path || idFromLocation;\n\n const useComponentOptions = {\n logFilters: useComponentFilters?.(),\n customUseComponent: useComponent,\n };\n\n const { component } = useComponentQuery(host, componentId?.toString() || idFromLocation, useComponentOptions);\n const mainMenuItems = useMemo(() => groupBy(flatten(menuItemSlot.values()), 'category'), [menuItemSlot]);\n if (!component) return <FullLoader />;\n return (\n <Routes>\n <Route\n path={`${resolvedComponentIdStr}/*`}\n element={\n <div className={classnames(styles.topBar, className)}>\n <div className={styles.leftSide}>\n <MenuNav navigationSlot={navigationSlot} />\n <MobileMenuNav navigationSlot={navigationSlot} widgetSlot={widgetSlot} />\n </div>\n <div className={styles.rightSide}>\n <div className={styles.widgets}>\n <MenuNav navigationSlot={widgetSlot} />\n </div>\n <VersionRelatedDropdowns component={component} consumeMethods={consumeMethodSlot} host={host} />\n <MainDropdown menuItems={mainMenuItems} />\n </div>\n </div>\n }\n />\n </Routes>\n );\n}\n\nfunction VersionRelatedDropdowns({\n component,\n consumeMethods,\n host,\n}: {\n component: ComponentModel;\n consumeMethods: ConsumeMethodSlot;\n host: string;\n}) {\n const location = useLocation();\n const { lanesModel } = useLanes();\n const currentLane =\n lanesModel?.viewedLane?.id && !lanesModel?.viewedLane?.id.isDefault() ? lanesModel.viewedLane : undefined;\n\n const { logs } = component;\n const isWorkspace = host === 'teambit.workspace/workspace';\n\n const snaps = useMemo(() => {\n return (logs || []).filter((log) => !log.tag).map((snap) => ({ ...snap, version: snap.hash }));\n }, [logs]);\n\n const tags = useMemo(() => {\n const tagLookup = new Map<string, LegacyComponentLog>();\n (logs || [])\n .filter((log) => log.tag)\n .forEach((tag) => {\n tagLookup.set(tag?.tag as string, tag);\n });\n return compact(\n component.tags\n ?.toArray()\n .reverse()\n .map((tag) => tagLookup.get(tag.version.version))\n ).map((tag) => ({ ...tag, version: tag.tag as string }));\n }, [logs]);\n\n const isNew = snaps.length === 0 && tags.length === 0;\n\n const lanes = lanesModel?.getLanesByComponentId(component.id)?.filter((lane) => !lane.id.isDefault()) || [];\n const localVersion = isWorkspace && !isNew && !currentLane;\n\n const currentVersion =\n isWorkspace && !isNew && !location?.search.includes('version') ? 'workspace' : component.version;\n\n const methods = useConsumeMethods(consumeMethods, component, currentLane);\n return (\n <>\n {tags.length > 0 && (\n <UseBoxDropdown\n position=\"bottom-end\"\n className={styles.useBox}\n Menu={<ConsumeMethodsMenu methods={methods} componentName={component.id.name} />}\n />\n )}\n <VersionDropdown\n tags={tags}\n snaps={snaps}\n lanes={lanes}\n localVersion={localVersion}\n currentVersion={currentVersion}\n latestVersion={component.latest}\n currentLane={currentLane}\n menuClassName={styles.componentVersionMenu}\n />\n </>\n );\n}\n\nfunction useConsumeMethods(\n consumeMethods: ConsumeMethodSlot,\n componentModel: ComponentModel,\n currentLane?: LaneModel\n): ConsumeMethod[] {\n return useMemo(\n () =>\n flatten(consumeMethods.values())\n .map((method) => {\n return method?.(componentModel, { currentLane });\n })\n .filter((x) => !!x && x.Component && x.Title) as ConsumeMethod[],\n [consumeMethods, componentModel, currentLane]\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["getComponentIdStr","componentIdStr","isFunction","ComponentMenu","navigationSlot","widgetSlot","className","host","menuItemSlot","consumeMethodSlot","useComponent","path","useComponentFilters","idFromLocation","useIdFromLocation","_componentIdStr","componentId","ComponentID","fromString","undefined","resolvedComponentIdStr","useComponentOptions","logFilters","customUseComponent","component","useComponentQuery","toString","mainMenuItems","useMemo","groupBy","flatten","values","classnames","styles","topBar","leftSide","rightSide","widgets","hideOnMobile","VersionRelatedDropdowns","consumeMethods","location","useLocation","lanesModel","useLanes","currentLane","viewedLane","id","isDefault","logs","isWorkspace","snaps","filter","log","tag","map","snap","version","hash","tags","tagLookup","Map","forEach","set","compact","toArray","reverse","get","isNew","length","lanes","getLanesByComponentId","lane","localVersion","currentVersion","search","includes","methods","useConsumeMethods","useBox","name","latest","componentVersionMenu","componentModel","method","x","Component","Title"],"sources":["menu.tsx"],"sourcesContent":["import { Routes, Route } from 'react-router-dom';\nimport { MainDropdown, MenuItemSlot } from '@teambit/ui-foundation.ui.main-dropdown';\nimport { VersionDropdown } from '@teambit/component.ui.version-dropdown';\nimport { FullLoader } from '@teambit/ui-foundation.ui.full-loader';\nimport type { ConsumeMethod } from '@teambit/ui-foundation.ui.use-box.menu';\nimport { useLocation } from '@teambit/base-react.navigation.link';\nimport { flatten, groupBy, compact, isFunction } from 'lodash';\nimport classnames from 'classnames';\nimport React, { useMemo } from 'react';\nimport { UseBoxDropdown } from '@teambit/ui-foundation.ui.use-box.dropdown';\nimport { useLanes } from '@teambit/lanes.hooks.use-lanes';\nimport { LaneModel } from '@teambit/lanes.ui.models.lanes-model';\nimport { Menu as ConsumeMethodsMenu } from '@teambit/ui-foundation.ui.use-box.menu';\nimport { LegacyComponentLog } from '@teambit/legacy-component-log';\nimport type { ComponentModel } from '../component-model';\nimport { useComponent as useComponentQuery, UseComponentType } from '../use-component';\nimport { MenuNav, CollapsableMenuNav } from './menu-nav';\nimport styles from './menu.module.scss';\nimport { OrderedNavigationSlot, ConsumeMethodSlot } from './nav-plugin';\nimport { useIdFromLocation } from '../use-component-from-location';\nimport { ComponentID } from '../..';\nimport { Filters } from '../use-component-query';\n\nexport type MenuProps = {\n className?: string;\n /**\n * slot for top bar menu nav items\n */\n navigationSlot: OrderedNavigationSlot;\n /**\n * right side menu item slot\n */\n widgetSlot: OrderedNavigationSlot;\n host: string;\n /**\n * main dropdown item slot\n */\n menuItemSlot: MenuItemSlot;\n\n consumeMethodSlot: ConsumeMethodSlot;\n\n componentIdStr?: string | (() => string | undefined);\n\n useComponent?: UseComponentType;\n\n path?: string;\n\n useComponentFilters?: () => Filters;\n};\nfunction getComponentIdStr(componentIdStr?: string | (() => string | undefined)): string | undefined {\n if (isFunction(componentIdStr)) return componentIdStr();\n return componentIdStr;\n}\n/**\n * top bar menu.\n */\nexport function ComponentMenu({\n navigationSlot,\n widgetSlot,\n className,\n host,\n menuItemSlot,\n consumeMethodSlot,\n componentIdStr,\n useComponent,\n path,\n useComponentFilters,\n}: MenuProps) {\n const idFromLocation = useIdFromLocation();\n const _componentIdStr = getComponentIdStr(componentIdStr);\n const componentId = _componentIdStr ? ComponentID.fromString(_componentIdStr) : undefined;\n const resolvedComponentIdStr = path || idFromLocation;\n\n const useComponentOptions = {\n logFilters: useComponentFilters?.(),\n customUseComponent: useComponent,\n };\n\n const { component } = useComponentQuery(host, componentId?.toString() || idFromLocation, useComponentOptions);\n const mainMenuItems = useMemo(() => groupBy(flatten(menuItemSlot.values()), 'category'), [menuItemSlot]);\n if (!component) return <FullLoader />;\n return (\n <Routes>\n <Route\n path={`${resolvedComponentIdStr}/*`}\n element={\n <div className={classnames(styles.topBar, className)}>\n <div className={styles.leftSide}>\n <CollapsableMenuNav navigationSlot={navigationSlot} />\n \n </div>\n <div className={styles.rightSide}>\n <div className={styles.widgets}>\n <MenuNav navigationSlot={widgetSlot} />\n </div>\n <VersionRelatedDropdowns component={component} consumeMethods={consumeMethodSlot} host={host} />\n <MainDropdown className={styles.hideOnMobile} menuItems={mainMenuItems} />\n </div>\n </div>\n }\n />\n </Routes>\n );\n}\n\nfunction VersionRelatedDropdowns({\n component,\n consumeMethods,\n host,\n}: {\n component: ComponentModel;\n consumeMethods: ConsumeMethodSlot;\n host: string;\n}) {\n const location = useLocation();\n const { lanesModel } = useLanes();\n const currentLane =\n lanesModel?.viewedLane?.id && !lanesModel?.viewedLane?.id.isDefault() ? lanesModel.viewedLane : undefined;\n\n const { logs } = component;\n const isWorkspace = host === 'teambit.workspace/workspace';\n\n const snaps = useMemo(() => {\n return (logs || []).filter((log) => !log.tag).map((snap) => ({ ...snap, version: snap.hash }));\n }, [logs]);\n\n const tags = useMemo(() => {\n const tagLookup = new Map<string, LegacyComponentLog>();\n (logs || [])\n .filter((log) => log.tag)\n .forEach((tag) => {\n tagLookup.set(tag?.tag as string, tag);\n });\n return compact(\n component.tags\n ?.toArray()\n .reverse()\n .map((tag) => tagLookup.get(tag.version.version))\n ).map((tag) => ({ ...tag, version: tag.tag as string }));\n }, [logs]);\n\n const isNew = snaps.length === 0 && tags.length === 0;\n\n const lanes = lanesModel?.getLanesByComponentId(component.id)?.filter((lane) => !lane.id.isDefault()) || [];\n const localVersion = isWorkspace && !isNew && !currentLane;\n\n const currentVersion =\n isWorkspace && !isNew && !location?.search.includes('version') ? 'workspace' : component.version;\n\n const methods = useConsumeMethods(consumeMethods, component, currentLane);\n return (\n <>\n {tags.length > 0 && (\n <UseBoxDropdown\n position=\"bottom-end\"\n className={classnames(styles.useBox, styles.hideOnMobile)}\n Menu={<ConsumeMethodsMenu methods={methods} componentName={component.id.name} />}\n />\n )}\n <VersionDropdown\n tags={tags}\n snaps={snaps}\n lanes={lanes}\n localVersion={localVersion}\n currentVersion={currentVersion}\n latestVersion={component.latest}\n currentLane={currentLane}\n menuClassName={styles.componentVersionMenu}\n />\n </>\n );\n}\n\nfunction useConsumeMethods(\n consumeMethods: ConsumeMethodSlot,\n componentModel: ComponentModel,\n currentLane?: LaneModel\n): ConsumeMethod[] {\n return useMemo(\n () =>\n flatten(consumeMethods.values())\n .map((method) => {\n return method?.(componentModel, { currentLane });\n })\n .filter((x) => !!x && x.Component && x.Title) as ConsumeMethod[],\n [consumeMethods, componentModel, currentLane]\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAEA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAEA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAGA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAEA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAAoC;AAAA;AAAA;AAAA;AA6BpC,SAASA,iBAAiB,CAACC,cAAoD,EAAsB;EACnG,IAAI,IAAAC,oBAAU,EAACD,cAAc,CAAC,EAAE,OAAOA,cAAc,EAAE;EACvD,OAAOA,cAAc;AACvB;AACA;AACA;AACA;AACO,SAASE,aAAa,CAAC;EAC5BC,cAAc;EACdC,UAAU;EACVC,SAAS;EACTC,IAAI;EACJC,YAAY;EACZC,iBAAiB;EACjBR,cAAc;EACdS,YAAY;EACZC,IAAI;EACJC;AACS,CAAC,EAAE;EACZ,MAAMC,cAAc,GAAG,IAAAC,6CAAiB,GAAE;EAC1C,MAAMC,eAAe,GAAGf,iBAAiB,CAACC,cAAc,CAAC;EACzD,MAAMe,WAAW,GAAGD,eAAe,GAAGE,eAAW,CAACC,UAAU,CAACH,eAAe,CAAC,GAAGI,SAAS;EACzF,MAAMC,sBAAsB,GAAGT,IAAI,IAAIE,cAAc;EAErD,MAAMQ,mBAAmB,GAAG;IAC1BC,UAAU,EAAEV,mBAAmB,aAAnBA,mBAAmB,uBAAnBA,mBAAmB,EAAI;IACnCW,kBAAkB,EAAEb;EACtB,CAAC;EAED,MAAM;IAAEc;EAAU,CAAC,GAAG,IAAAC,4BAAiB,EAAClB,IAAI,EAAE,CAAAS,WAAW,aAAXA,WAAW,uBAAXA,WAAW,CAAEU,QAAQ,EAAE,KAAIb,cAAc,EAAEQ,mBAAmB,CAAC;EAC7G,MAAMM,aAAa,GAAG,IAAAC,gBAAO,EAAC,MAAM,IAAAC,iBAAO,EAAC,IAAAC,iBAAO,EAACtB,YAAY,CAACuB,MAAM,EAAE,CAAC,EAAE,UAAU,CAAC,EAAE,CAACvB,YAAY,CAAC,CAAC;EACxG,IAAI,CAACgB,SAAS,EAAE,oBAAO,+BAAC,6BAAU,OAAG;EACrC,oBACE,+BAAC,wBAAM,qBACL,+BAAC,uBAAK;IACJ,IAAI,EAAG,GAAEJ,sBAAuB,IAAI;IACpC,OAAO,eACL;MAAK,SAAS,EAAE,IAAAY,qBAAU,EAACC,qBAAM,CAACC,MAAM,EAAE5B,SAAS;IAAE,gBACnD;MAAK,SAAS,EAAE2B,qBAAM,CAACE;IAAS,gBAC9B,+BAAC,6BAAkB;MAAC,cAAc,EAAE/B;IAAe,EAAG,CAElD,eACN;MAAK,SAAS,EAAE6B,qBAAM,CAACG;IAAU,gBAC/B;MAAK,SAAS,EAAEH,qBAAM,CAACI;IAAQ,gBAC7B,+BAAC,kBAAO;MAAC,cAAc,EAAEhC;IAAW,EAAG,CACnC,eACN,+BAAC,uBAAuB;MAAC,SAAS,EAAEmB,SAAU;MAAC,cAAc,EAAEf,iBAAkB;MAAC,IAAI,EAAEF;IAAK,EAAG,eAChG,+BAAC,8BAAY;MAAC,SAAS,EAAE0B,qBAAM,CAACK,YAAa;MAAC,SAAS,EAAEX;IAAc,EAAG,CACtE;EAET,EACD,CACK;AAEb;AAEA,SAASY,uBAAuB,CAAC;EAC/Bf,SAAS;EACTgB,cAAc;EACdjC;AAKF,CAAC,EAAE;EAAA;EACD,MAAMkC,QAAQ,GAAG,IAAAC,kCAAW,GAAE;EAC9B,MAAM;IAAEC;EAAW,CAAC,GAAG,IAAAC,sBAAQ,GAAE;EACjC,MAAMC,WAAW,GACfF,UAAU,aAAVA,UAAU,wCAAVA,UAAU,CAAEG,UAAU,kDAAtB,sBAAwBC,EAAE,IAAI,EAACJ,UAAU,aAAVA,UAAU,yCAAVA,UAAU,CAAEG,UAAU,mDAAtB,uBAAwBC,EAAE,CAACC,SAAS,EAAE,IAAGL,UAAU,CAACG,UAAU,GAAG3B,SAAS;EAE3G,MAAM;IAAE8B;EAAK,CAAC,GAAGzB,SAAS;EAC1B,MAAM0B,WAAW,GAAG3C,IAAI,KAAK,6BAA6B;EAE1D,MAAM4C,KAAK,GAAG,IAAAvB,gBAAO,EAAC,MAAM;IAC1B,OAAO,CAACqB,IAAI,IAAI,EAAE,EAAEG,MAAM,CAAEC,GAAG,IAAK,CAACA,GAAG,CAACC,GAAG,CAAC,CAACC,GAAG,CAAEC,IAAI,oCAAWA,IAAI;MAAEC,OAAO,EAAED,IAAI,CAACE;IAAI,EAAG,CAAC;EAChG,CAAC,EAAE,CAACT,IAAI,CAAC,CAAC;EAEV,MAAMU,IAAI,GAAG,IAAA/B,gBAAO,EAAC,MAAM;IAAA;IACzB,MAAMgC,SAAS,GAAG,IAAIC,GAAG,EAA8B;IACvD,CAACZ,IAAI,IAAI,EAAE,EACRG,MAAM,CAAEC,GAAG,IAAKA,GAAG,CAACC,GAAG,CAAC,CACxBQ,OAAO,CAAER,GAAG,IAAK;MAChBM,SAAS,CAACG,GAAG,CAACT,GAAG,aAAHA,GAAG,uBAAHA,GAAG,CAAEA,GAAG,EAAYA,GAAG,CAAC;IACxC,CAAC,CAAC;IACJ,OAAO,IAAAU,iBAAO,qBACZxC,SAAS,CAACmC,IAAI,oDAAd,gBACIM,OAAO,EAAE,CACVC,OAAO,EAAE,CACTX,GAAG,CAAED,GAAG,IAAKM,SAAS,CAACO,GAAG,CAACb,GAAG,CAACG,OAAO,CAACA,OAAO,CAAC,CAAC,CACpD,CAACF,GAAG,CAAED,GAAG,oCAAWA,GAAG;MAAEG,OAAO,EAAEH,GAAG,CAACA;IAAa,EAAG,CAAC;EAC1D,CAAC,EAAE,CAACL,IAAI,CAAC,CAAC;EAEV,MAAMmB,KAAK,GAAGjB,KAAK,CAACkB,MAAM,KAAK,CAAC,IAAIV,IAAI,CAACU,MAAM,KAAK,CAAC;EAErD,MAAMC,KAAK,GAAG,CAAA3B,UAAU,aAAVA,UAAU,gDAAVA,UAAU,CAAE4B,qBAAqB,CAAC/C,SAAS,CAACuB,EAAE,CAAC,0DAA/C,sBAAiDK,MAAM,CAAEoB,IAAI,IAAK,CAACA,IAAI,CAACzB,EAAE,CAACC,SAAS,EAAE,CAAC,KAAI,EAAE;EAC3G,MAAMyB,YAAY,GAAGvB,WAAW,IAAI,CAACkB,KAAK,IAAI,CAACvB,WAAW;EAE1D,MAAM6B,cAAc,GAClBxB,WAAW,IAAI,CAACkB,KAAK,IAAI,EAAC3B,QAAQ,aAARA,QAAQ,eAARA,QAAQ,CAAEkC,MAAM,CAACC,QAAQ,CAAC,SAAS,CAAC,IAAG,WAAW,GAAGpD,SAAS,CAACiC,OAAO;EAElG,MAAMoB,OAAO,GAAGC,iBAAiB,CAACtC,cAAc,EAAEhB,SAAS,EAAEqB,WAAW,CAAC;EACzE,oBACE,gEACGc,IAAI,CAACU,MAAM,GAAG,CAAC,iBACd,+BAAC,sCAAc;IACb,QAAQ,EAAC,YAAY;IACrB,SAAS,EAAE,IAAArC,qBAAU,EAACC,qBAAM,CAAC8C,MAAM,EAAE9C,qBAAM,CAACK,YAAY,CAAE;IAC1D,IAAI,eAAE,+BAAC,6BAAkB;MAAC,OAAO,EAAEuC,OAAQ;MAAC,aAAa,EAAErD,SAAS,CAACuB,EAAE,CAACiC;IAAK;EAAI,EAEpF,eACD,+BAAC,8BAAe;IACd,IAAI,EAAErB,IAAK;IACX,KAAK,EAAER,KAAM;IACb,KAAK,EAAEmB,KAAM;IACb,YAAY,EAAEG,YAAa;IAC3B,cAAc,EAAEC,cAAe;IAC/B,aAAa,EAAElD,SAAS,CAACyD,MAAO;IAChC,WAAW,EAAEpC,WAAY;IACzB,aAAa,EAAEZ,qBAAM,CAACiD;EAAqB,EAC3C,CACD;AAEP;AAEA,SAASJ,iBAAiB,CACxBtC,cAAiC,EACjC2C,cAA8B,EAC9BtC,WAAuB,EACN;EACjB,OAAO,IAAAjB,gBAAO,EACZ,MACE,IAAAE,iBAAO,EAACU,cAAc,CAACT,MAAM,EAAE,CAAC,CAC7BwB,GAAG,CAAE6B,MAAM,IAAK;IACf,OAAOA,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAGD,cAAc,EAAE;MAAEtC;IAAY,CAAC,CAAC;EAClD,CAAC,CAAC,CACDO,MAAM,CAAEiC,CAAC,IAAK,CAAC,CAACA,CAAC,IAAIA,CAAC,CAACC,SAAS,IAAID,CAAC,CAACE,KAAK,CAAoB,EACpE,CAAC/C,cAAc,EAAE2C,cAAc,EAAEtC,WAAW,CAAC,CAC9C;AACH"}
@@ -6,12 +6,15 @@
6
6
  align-items: center;
7
7
  width: 100%;
8
8
  height: 100%;
9
+ min-width: 0;
9
10
  }
10
11
 
11
12
  .leftSide {
12
13
  display: flex;
13
14
  align-items: center;
14
15
  height: 100%;
16
+ flex-grow: 1;
17
+ min-width: 0;
15
18
  }
16
19
 
17
20
  .navigation {
@@ -91,3 +94,22 @@
91
94
  .componentVersionMenu {
92
95
  width: 350px;
93
96
  }
97
+
98
+ .tab {
99
+ > div {
100
+ padding: 0;
101
+ }
102
+ }
103
+ .topBarNav {
104
+ height: 100%;
105
+
106
+ &.noBorder::after {
107
+ display: none;
108
+ }
109
+ }
110
+
111
+ .hideOnMobile {
112
+ @media screen and (max-width: $br-md) {
113
+ display: none;
114
+ }
115
+ }
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@teambit/component",
3
- "version": "0.0.915",
3
+ "version": "0.0.918",
4
4
  "homepage": "https://bit.dev/teambit/component/component",
5
5
  "main": "dist/index.js",
6
6
  "componentId": {
7
7
  "scope": "teambit.component",
8
8
  "name": "component",
9
- "version": "0.0.915"
9
+ "version": "0.0.918"
10
10
  },
11
11
  "dependencies": {
12
12
  "@teambit/any-fs": "0.0.5",
@@ -27,50 +27,48 @@
27
27
  "@teambit/documenter.ui.heading": "4.1.1",
28
28
  "@teambit/documenter.ui.separator": "4.1.1",
29
29
  "@teambit/explorer.ui.command-bar": "2.0.3",
30
+ "@teambit/design.navigation.responsive-navbar": "0.0.1",
30
31
  "@teambit/base-ui.layout.breakpoints": "1.0.0",
31
- "@teambit/design.elements.icon": "1.0.5",
32
- "@teambit/design.inputs.dropdown": "0.0.7",
33
32
  "@teambit/component-id": "0.0.425",
34
33
  "@teambit/ui-foundation.ui.menu-widget-icon": "0.0.495",
35
- "@teambit/aspect-loader": "0.0.915",
34
+ "@teambit/aspect-loader": "0.0.918",
36
35
  "@teambit/legacy-bit-id": "0.0.421",
37
36
  "@teambit/toolbox.path.match-patterns": "0.0.9",
38
37
  "@teambit/toolbox.string.capitalize": "0.0.490",
39
- "@teambit/cli": "0.0.611",
40
- "@teambit/express": "0.0.709",
41
- "@teambit/graphql": "0.0.915",
38
+ "@teambit/cli": "0.0.614",
39
+ "@teambit/express": "0.0.712",
40
+ "@teambit/graphql": "0.0.918",
42
41
  "@teambit/bit-error": "0.0.402",
43
- "@teambit/command-bar": "0.0.915",
42
+ "@teambit/command-bar": "0.0.918",
44
43
  "@teambit/component.ui.deprecation-icon": "0.0.501",
45
- "@teambit/preview": "0.0.915",
46
- "@teambit/pubsub": "0.0.915",
47
- "@teambit/react-router": "0.0.915",
44
+ "@teambit/preview": "0.0.918",
45
+ "@teambit/pubsub": "0.0.918",
46
+ "@teambit/react-router": "0.0.918",
48
47
  "@teambit/ui-foundation.ui.is-browser": "0.0.493",
49
48
  "@teambit/ui-foundation.ui.main-dropdown": "0.0.494",
50
49
  "@teambit/ui-foundation.ui.react-router.slot-router": "0.0.497",
51
- "@teambit/ui-foundation.ui.use-box.menu": "0.0.126",
52
- "@teambit/ui": "0.0.915",
53
- "@teambit/component-issues": "0.0.80",
50
+ "@teambit/ui-foundation.ui.use-box.menu": "0.0.127",
51
+ "@teambit/ui": "0.0.918",
52
+ "@teambit/component-issues": "0.0.82",
54
53
  "@teambit/ui-foundation.ui.hooks.use-data-query": "0.0.498",
55
54
  "@teambit/cli-table": "0.0.41",
56
- "@teambit/component-descriptor": "0.0.181",
55
+ "@teambit/component-descriptor": "0.0.184",
57
56
  "@teambit/ui-foundation.ui.react-router.use-query": "0.0.494",
58
57
  "@teambit/design.ui.empty-box": "0.0.361",
59
58
  "@teambit/harmony.ui.aspect-box": "0.0.495",
60
59
  "@teambit/design.ui.pages.not-found": "0.0.364",
61
60
  "@teambit/design.ui.pages.server-error": "0.0.364",
62
- "@teambit/compositions": "0.0.915",
63
- "@teambit/deprecation": "0.0.915",
64
- "@teambit/envs": "0.0.915",
65
- "@teambit/legacy-component-log": "0.0.399",
66
61
  "@teambit/design.ui.styles.ellipsis": "0.0.355",
67
62
  "@teambit/envs.ui.env-icon": "0.0.493",
68
- "@teambit/component.ui.version-dropdown": "0.0.676",
69
- "@teambit/lanes.hooks.use-lanes": "0.0.74",
70
- "@teambit/lanes.ui.models.lanes-model": "0.0.36",
63
+ "@teambit/compositions": "0.0.918",
64
+ "@teambit/deprecation": "0.0.918",
65
+ "@teambit/envs": "0.0.918",
66
+ "@teambit/legacy-component-log": "0.0.399",
67
+ "@teambit/component.ui.version-dropdown": "0.0.679",
68
+ "@teambit/lanes.hooks.use-lanes": "0.0.77",
69
+ "@teambit/lanes.ui.models.lanes-model": "0.0.39",
71
70
  "@teambit/ui-foundation.ui.full-loader": "0.0.493",
72
- "@teambit/ui-foundation.ui.use-box.dropdown": "0.0.126",
73
- "@teambit/ui-foundation.ui.constants.z-indexes": "0.0.496"
71
+ "@teambit/ui-foundation.ui.use-box.dropdown": "0.0.127"
74
72
  },
75
73
  "devDependencies": {
76
74
  "@types/react": "^17.0.8",
@@ -89,7 +87,7 @@
89
87
  "peerDependencies": {
90
88
  "react-router-dom": "^6.0.0",
91
89
  "@apollo/client": "^3.6.0",
92
- "@teambit/legacy": "1.0.390",
90
+ "@teambit/legacy": "1.0.395",
93
91
  "react-dom": "^16.8.0 || ^17.0.0",
94
92
  "react": "^16.8.0 || ^17.0.0"
95
93
  },
@@ -1,5 +1,5 @@
1
- import * as compositions_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad3d35bfc38b9cd90c0e05b598a5a55af/teambit.component_component@0.0.915/dist/component.composition.js';
2
- import * as overview_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad3d35bfc38b9cd90c0e05b598a5a55af/teambit.component_component@0.0.915/dist/component.docs.mdx';
1
+ import * as compositions_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad3d35bfc38b9cd90c0e05b598a5a55af/teambit.component_component@0.0.918/dist/component.composition.js';
2
+ import * as overview_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad3d35bfc38b9cd90c0e05b598a5a55af/teambit.component_component@0.0.918/dist/component.docs.mdx';
3
3
 
4
4
  export const compositions = [compositions_0];
5
5
  export const overview = [overview_0];
@@ -1,5 +1,7 @@
1
1
  import React, { useMemo } from 'react';
2
2
  import classnames from 'classnames';
3
+ import { ResponsiveNavbar } from '@teambit/design.navigation.responsive-navbar';
4
+ import type { TabProps } from '@teambit/design.navigation.responsive-navbar';
3
5
  import { TopBarNav } from '../top-bar-nav';
4
6
  import styles from './menu.module.scss';
5
7
  import { NavPlugin, OrderedNavigationSlot } from './nav-plugin';
@@ -20,6 +22,31 @@ export function MenuNav({ navigationSlot, className }: MenuNavProps) {
20
22
  );
21
23
  }
22
24
 
25
+ export function CollapsableMenuNav({ navigationSlot, className }: MenuNavProps) {
26
+ const plugins = useMemo(() => navigationSlot.toArray().sort(sortFn), [navigationSlot]);
27
+ const links = plugins.map(([id, menuItem]) => {
28
+ return {
29
+ component: function TopBarNavComponent({ isInMenu }: TabProps) {
30
+ return (
31
+ <TopBarNav
32
+ className={classnames(styles.topBarNav, isInMenu && styles.noBorder)}
33
+ key={id}
34
+ {...menuItem.props}
35
+ />
36
+ );
37
+ },
38
+ };
39
+ });
40
+ return (
41
+ <ResponsiveNavbar
42
+ navClassName={classnames(styles.tab, className)}
43
+ style={{ width: '100%', height: '100%' }}
44
+ priority="none"
45
+ tabs={links}
46
+ />
47
+ );
48
+ }
49
+
23
50
  function sortFn([, { order: first }]: [string, NavPlugin], [, { order: second }]: [string, NavPlugin]) {
24
51
  // 0 - equal
25
52
  // <0 - first < second
@@ -6,12 +6,15 @@
6
6
  align-items: center;
7
7
  width: 100%;
8
8
  height: 100%;
9
+ min-width: 0;
9
10
  }
10
11
 
11
12
  .leftSide {
12
13
  display: flex;
13
14
  align-items: center;
14
15
  height: 100%;
16
+ flex-grow: 1;
17
+ min-width: 0;
15
18
  }
16
19
 
17
20
  .navigation {
@@ -91,3 +94,22 @@
91
94
  .componentVersionMenu {
92
95
  width: 350px;
93
96
  }
97
+
98
+ .tab {
99
+ > div {
100
+ padding: 0;
101
+ }
102
+ }
103
+ .topBarNav {
104
+ height: 100%;
105
+
106
+ &.noBorder::after {
107
+ display: none;
108
+ }
109
+ }
110
+
111
+ .hideOnMobile {
112
+ @media screen and (max-width: $br-md) {
113
+ display: none;
114
+ }
115
+ }
package/ui/menu/menu.tsx CHANGED
@@ -14,8 +14,7 @@ import { Menu as ConsumeMethodsMenu } from '@teambit/ui-foundation.ui.use-box.me
14
14
  import { LegacyComponentLog } from '@teambit/legacy-component-log';
15
15
  import type { ComponentModel } from '../component-model';
16
16
  import { useComponent as useComponentQuery, UseComponentType } from '../use-component';
17
- import { MenuNav } from './menu-nav';
18
- import { MobileMenuNav } from './mobile-menu-nav';
17
+ import { MenuNav, CollapsableMenuNav } from './menu-nav';
19
18
  import styles from './menu.module.scss';
20
19
  import { OrderedNavigationSlot, ConsumeMethodSlot } from './nav-plugin';
21
20
  import { useIdFromLocation } from '../use-component-from-location';
@@ -87,15 +86,15 @@ export function ComponentMenu({
87
86
  element={
88
87
  <div className={classnames(styles.topBar, className)}>
89
88
  <div className={styles.leftSide}>
90
- <MenuNav navigationSlot={navigationSlot} />
91
- <MobileMenuNav navigationSlot={navigationSlot} widgetSlot={widgetSlot} />
89
+ <CollapsableMenuNav navigationSlot={navigationSlot} />
90
+
92
91
  </div>
93
92
  <div className={styles.rightSide}>
94
93
  <div className={styles.widgets}>
95
94
  <MenuNav navigationSlot={widgetSlot} />
96
95
  </div>
97
96
  <VersionRelatedDropdowns component={component} consumeMethods={consumeMethodSlot} host={host} />
98
- <MainDropdown menuItems={mainMenuItems} />
97
+ <MainDropdown className={styles.hideOnMobile} menuItems={mainMenuItems} />
99
98
  </div>
100
99
  </div>
101
100
  }
@@ -154,7 +153,7 @@ function VersionRelatedDropdowns({
154
153
  {tags.length > 0 && (
155
154
  <UseBoxDropdown
156
155
  position="bottom-end"
157
- className={styles.useBox}
156
+ className={classnames(styles.useBox, styles.hideOnMobile)}
158
157
  Menu={<ConsumeMethodsMenu methods={methods} componentName={component.id.name} />}
159
158
  />
160
159
  )}
@@ -1,7 +0,0 @@
1
- /// <reference types="react" />
2
- import { OrderedNavigationSlot } from './nav-plugin';
3
- export declare function MobileMenuNav({ navigationSlot, widgetSlot, className, }: {
4
- navigationSlot: OrderedNavigationSlot;
5
- widgetSlot: OrderedNavigationSlot;
6
- className?: string;
7
- }): JSX.Element;
@@ -1,168 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- require("core-js/modules/es.array.iterator.js");
5
- require("core-js/modules/es.array.sort.js");
6
- Object.defineProperty(exports, "__esModule", {
7
- value: true
8
- });
9
- exports.MobileMenuNav = MobileMenuNav;
10
- function _objectWithoutProperties2() {
11
- const data = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
12
- _objectWithoutProperties2 = function () {
13
- return data;
14
- };
15
- return data;
16
- }
17
- function _extends2() {
18
- const data = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
19
- _extends2 = function () {
20
- return data;
21
- };
22
- return data;
23
- }
24
- function _react() {
25
- const data = _interopRequireWildcard(require("react"));
26
- _react = function () {
27
- return data;
28
- };
29
- return data;
30
- }
31
- function _reactRouterDom() {
32
- const data = require("react-router-dom");
33
- _reactRouterDom = function () {
34
- return data;
35
- };
36
- return data;
37
- }
38
- function _classnames() {
39
- const data = _interopRequireDefault(require("classnames"));
40
- _classnames = function () {
41
- return data;
42
- };
43
- return data;
44
- }
45
- function _designElements() {
46
- const data = require("@teambit/design.elements.icon");
47
- _designElements = function () {
48
- return data;
49
- };
50
- return data;
51
- }
52
- function _designInputs() {
53
- const data = require("@teambit/design.inputs.dropdown");
54
- _designInputs = function () {
55
- return data;
56
- };
57
- return data;
58
- }
59
- function _baseReactNavigation() {
60
- const data = require("@teambit/base-react.navigation.link");
61
- _baseReactNavigation = function () {
62
- return data;
63
- };
64
- return data;
65
- }
66
- function _topBarNav() {
67
- const data = require("../top-bar-nav");
68
- _topBarNav = function () {
69
- return data;
70
- };
71
- return data;
72
- }
73
- function _menuModule() {
74
- const data = _interopRequireDefault(require("./menu.module.scss"));
75
- _menuModule = function () {
76
- return data;
77
- };
78
- return data;
79
- }
80
- function _mobileMenuNavModule() {
81
- const data = _interopRequireDefault(require("./mobile-menu-nav.module.scss"));
82
- _mobileMenuNavModule = function () {
83
- return data;
84
- };
85
- return data;
86
- }
87
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
88
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
89
- function MobileMenuNav({
90
- navigationSlot,
91
- widgetSlot,
92
- className
93
- }) {
94
- const totalSlots = (0, _react().useMemo)(() => [...navigationSlot.toArray().sort(sortFn), ...widgetSlot.toArray().sort(sortFn)], [navigationSlot, widgetSlot]);
95
- return /*#__PURE__*/_react().default.createElement(_designInputs().Dropdown
96
- // @ts-ignore - mismatch between @types/react
97
- , {
98
- placeholder: /*#__PURE__*/_react().default.createElement(Placeholder, {
99
- slots: totalSlots
100
- }),
101
- className: (0, _classnames().default)(_menuModule().default.navigation, _menuModule().default.mobileNav, className),
102
- dropClass: _mobileMenuNavModule().default.mobileMenu
103
- }, /*#__PURE__*/_react().default.createElement("nav", null, /*#__PURE__*/_react().default.createElement(_designElements().Icon, {
104
- of: "x-thick",
105
- className: _mobileMenuNavModule().default.close
106
- }), totalSlots.map(([id, menuItem]) => {
107
- return /*#__PURE__*/_react().default.createElement(_topBarNav().TopBarNav, (0, _extends2().default)({
108
- key: id
109
- }, menuItem.props, {
110
- className: _mobileMenuNavModule().default.mobileMenuLink,
111
- activeClassName: _mobileMenuNavModule().default.active
112
- }), typeof menuItem.props.children === 'string' ? menuItem.props.children : menuItem.props.displayName);
113
- })));
114
- }
115
- function sortFn([, {
116
- order: first
117
- }], [, {
118
- order: second
119
- }]) {
120
- // 0 - equal
121
- // <0 - first < second
122
- // >0 - first > second
123
-
124
- return (first !== null && first !== void 0 ? first : 0) - (second !== null && second !== void 0 ? second : 0);
125
- }
126
- function Placeholder(_ref) {
127
- let {
128
- slots
129
- } = _ref,
130
- rest = (0, _objectWithoutProperties2().default)(_ref, ["slots"]);
131
- return /*#__PURE__*/_react().default.createElement("div", (0, _extends2().default)({}, rest, {
132
- className: _mobileMenuNavModule().default.placeholder
133
- }), slots.map(([id, menuItem]) => /*#__PURE__*/_react().default.createElement(ShowWhenMatch, {
134
- key: id,
135
- href: menuItem.props.href || '',
136
- end: menuItem.props.exact
137
- }, typeof menuItem.props.children === 'string' ? menuItem.props.children : menuItem.props.displayName)), /*#__PURE__*/_react().default.createElement(_designElements().Icon, {
138
- of: "fat-arrow-down"
139
- }));
140
- }
141
- function ShowWhenMatch({
142
- href,
143
- children,
144
- caseSensitive,
145
- end: exact
146
- }) {
147
- const isMatch = useLinkMatch(href, {
148
- caseSensitive,
149
- exact
150
- });
151
- if (!isMatch) return null;
152
- return /*#__PURE__*/_react().default.createElement(_react().default.Fragment, null, children);
153
- }
154
- function useLinkMatch(href, {
155
- caseSensitive,
156
- exact
157
- } = {}) {
158
- const location = (0, _baseReactNavigation().useLocation)();
159
- let pathname = (location === null || location === void 0 ? void 0 : location.pathname) || '/';
160
- let destination = (0, _reactRouterDom().useResolvedPath)(href).pathname;
161
- if (!caseSensitive) {
162
- pathname = pathname.toLowerCase();
163
- destination = destination.toLowerCase();
164
- }
165
- return destination === pathname || !exact && pathname.startsWith(destination) && pathname.charAt(destination.length) === '/';
166
- }
167
-
168
- //# sourceMappingURL=mobile-menu-nav.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["MobileMenuNav","navigationSlot","widgetSlot","className","totalSlots","useMemo","toArray","sort","sortFn","classnames","styles","navigation","mobileNav","mobileStyles","mobileMenu","close","map","id","menuItem","props","mobileMenuLink","active","children","displayName","order","first","second","Placeholder","slots","rest","placeholder","href","exact","ShowWhenMatch","caseSensitive","end","isMatch","useLinkMatch","location","useLocation","pathname","destination","useResolvedPath","toLowerCase","startsWith","charAt","length"],"sources":["mobile-menu-nav.tsx"],"sourcesContent":["import React, { ReactNode, useMemo } from 'react';\nimport { useResolvedPath } from 'react-router-dom';\nimport classnames from 'classnames';\nimport { Icon } from '@teambit/design.elements.icon';\nimport { Dropdown } from '@teambit/design.inputs.dropdown';\nimport { useLocation } from '@teambit/base-react.navigation.link';\nimport { TopBarNav } from '../top-bar-nav';\nimport styles from './menu.module.scss';\nimport mobileStyles from './mobile-menu-nav.module.scss';\nimport { NavPlugin, OrderedNavigationSlot } from './nav-plugin';\n\nexport function MobileMenuNav({\n navigationSlot,\n widgetSlot,\n className,\n}: {\n navigationSlot: OrderedNavigationSlot;\n widgetSlot: OrderedNavigationSlot;\n className?: string;\n}) {\n const totalSlots = useMemo(\n () => [...navigationSlot.toArray().sort(sortFn), ...widgetSlot.toArray().sort(sortFn)],\n [navigationSlot, widgetSlot]\n );\n\n return (\n <Dropdown\n // @ts-ignore - mismatch between @types/react\n placeholder={<Placeholder slots={totalSlots} />}\n className={classnames(styles.navigation, styles.mobileNav, className)}\n dropClass={mobileStyles.mobileMenu}\n >\n <nav>\n <Icon of=\"x-thick\" className={mobileStyles.close} />\n {totalSlots.map(([id, menuItem]) => {\n return (\n <TopBarNav\n key={id}\n {...menuItem.props}\n className={mobileStyles.mobileMenuLink}\n activeClassName={mobileStyles.active}\n >\n {typeof menuItem.props.children === 'string' ? menuItem.props.children : menuItem.props.displayName}\n </TopBarNav>\n );\n })}\n </nav>\n </Dropdown>\n );\n}\n\nfunction sortFn([, { order: first }]: [string, NavPlugin], [, { order: second }]: [string, NavPlugin]) {\n // 0 - equal\n // <0 - first < second\n // >0 - first > second\n\n return (first ?? 0) - (second ?? 0);\n}\n\ntype PlaceholderProps = {\n slots: [string, NavPlugin][];\n baseUrl?: string;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nfunction Placeholder({ slots, ...rest }: PlaceholderProps) {\n return (\n <div {...rest} className={mobileStyles.placeholder}>\n {slots.map(([id, menuItem]) => (\n <ShowWhenMatch key={id} href={menuItem.props.href || ''} end={menuItem.props.exact}>\n {typeof menuItem.props.children === 'string' ? menuItem.props.children : menuItem.props.displayName}\n </ShowWhenMatch>\n ))}\n <Icon of=\"fat-arrow-down\" />\n </div>\n );\n}\n\nfunction ShowWhenMatch({\n href,\n children,\n caseSensitive,\n end: exact,\n}: {\n href: string;\n children: ReactNode;\n caseSensitive?: boolean;\n end?: boolean;\n}) {\n const isMatch = useLinkMatch(href, { caseSensitive, exact });\n if (!isMatch) return null;\n return <>{children}</>;\n}\n\nfunction useLinkMatch(href: string, { caseSensitive, exact }: { caseSensitive?: boolean; exact?: boolean } = {}) {\n const location = useLocation();\n let pathname = location?.pathname || '/';\n let destination = useResolvedPath(href).pathname;\n\n if (!caseSensitive) {\n pathname = pathname.toLowerCase();\n destination = destination.toLowerCase();\n }\n\n return (\n destination === pathname ||\n (!exact && pathname.startsWith(destination) && pathname.charAt(destination.length) === '/')\n );\n}\n"],"mappings":"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"}
@@ -1,70 +0,0 @@
1
- @import '~@teambit/ui-foundation.ui.constants.z-indexes/z-indexes.module.scss';
2
- @import '~@teambit/base-ui.layout.breakpoints/_breakpoints.scss';
3
-
4
- .mobileMenuLink {
5
- margin: 0;
6
- transition: background-color 300ms ease-in-out;
7
- &:hover {
8
- background-color: var(--bit-bg-heavy);
9
- }
10
- @media screen and (max-width: $br-md) {
11
- height: 40px;
12
- font-size: 16px;
13
- }
14
- }
15
-
16
- .mobileMenu {
17
- > nav {
18
- display: flex;
19
- flex-direction: column;
20
- }
21
- .active {
22
- background-color: var(--bit-accent-bg, #eceaff);
23
- color: inherit;
24
- &:after {
25
- background-color: unset;
26
- }
27
- }
28
- .close {
29
- display: none;
30
- }
31
- @media screen and (max-width: $br-md) {
32
- position: fixed;
33
- top: 0;
34
- bottom: 0;
35
- left: 0;
36
- right: 0;
37
- padding: 0;
38
- z-index: $modal-z-index;
39
- .close {
40
- align-self: self-end;
41
- padding: 8px;
42
- display: flex;
43
- &:hover {
44
- background-color: var(--bit-bg-heavy, #f6f6f6);
45
- }
46
- }
47
- }
48
- }
49
-
50
- .placeholder {
51
- display: flex;
52
- align-items: center;
53
- box-sizing: border-box;
54
- padding: 0 8px;
55
- height: 30px;
56
- border-radius: 6px;
57
- user-select: none;
58
- cursor: pointer;
59
- transition: background-color 300ms ease-in-out;
60
- border: 1px solid var(--bit-border-color, #babec9);
61
- [data-open='true'] & {
62
- color: var(--bit-accent-color, #6c5ce7);
63
- }
64
- > span {
65
- padding-left: 8px;
66
- }
67
- &:hover {
68
- background-color: var(--bit-bg-heavy, #f6f6f6);
69
- }
70
- }
@@ -1,70 +0,0 @@
1
- @import '~@teambit/ui-foundation.ui.constants.z-indexes/z-indexes.module.scss';
2
- @import '~@teambit/base-ui.layout.breakpoints/_breakpoints.scss';
3
-
4
- .mobileMenuLink {
5
- margin: 0;
6
- transition: background-color 300ms ease-in-out;
7
- &:hover {
8
- background-color: var(--bit-bg-heavy);
9
- }
10
- @media screen and (max-width: $br-md) {
11
- height: 40px;
12
- font-size: 16px;
13
- }
14
- }
15
-
16
- .mobileMenu {
17
- > nav {
18
- display: flex;
19
- flex-direction: column;
20
- }
21
- .active {
22
- background-color: var(--bit-accent-bg, #eceaff);
23
- color: inherit;
24
- &:after {
25
- background-color: unset;
26
- }
27
- }
28
- .close {
29
- display: none;
30
- }
31
- @media screen and (max-width: $br-md) {
32
- position: fixed;
33
- top: 0;
34
- bottom: 0;
35
- left: 0;
36
- right: 0;
37
- padding: 0;
38
- z-index: $modal-z-index;
39
- .close {
40
- align-self: self-end;
41
- padding: 8px;
42
- display: flex;
43
- &:hover {
44
- background-color: var(--bit-bg-heavy, #f6f6f6);
45
- }
46
- }
47
- }
48
- }
49
-
50
- .placeholder {
51
- display: flex;
52
- align-items: center;
53
- box-sizing: border-box;
54
- padding: 0 8px;
55
- height: 30px;
56
- border-radius: 6px;
57
- user-select: none;
58
- cursor: pointer;
59
- transition: background-color 300ms ease-in-out;
60
- border: 1px solid var(--bit-border-color, #babec9);
61
- [data-open='true'] & {
62
- color: var(--bit-accent-color, #6c5ce7);
63
- }
64
- > span {
65
- padding-left: 8px;
66
- }
67
- &:hover {
68
- background-color: var(--bit-bg-heavy, #f6f6f6);
69
- }
70
- }
@@ -1,108 +0,0 @@
1
- import React, { ReactNode, useMemo } from 'react';
2
- import { useResolvedPath } from 'react-router-dom';
3
- import classnames from 'classnames';
4
- import { Icon } from '@teambit/design.elements.icon';
5
- import { Dropdown } from '@teambit/design.inputs.dropdown';
6
- import { useLocation } from '@teambit/base-react.navigation.link';
7
- import { TopBarNav } from '../top-bar-nav';
8
- import styles from './menu.module.scss';
9
- import mobileStyles from './mobile-menu-nav.module.scss';
10
- import { NavPlugin, OrderedNavigationSlot } from './nav-plugin';
11
-
12
- export function MobileMenuNav({
13
- navigationSlot,
14
- widgetSlot,
15
- className,
16
- }: {
17
- navigationSlot: OrderedNavigationSlot;
18
- widgetSlot: OrderedNavigationSlot;
19
- className?: string;
20
- }) {
21
- const totalSlots = useMemo(
22
- () => [...navigationSlot.toArray().sort(sortFn), ...widgetSlot.toArray().sort(sortFn)],
23
- [navigationSlot, widgetSlot]
24
- );
25
-
26
- return (
27
- <Dropdown
28
- // @ts-ignore - mismatch between @types/react
29
- placeholder={<Placeholder slots={totalSlots} />}
30
- className={classnames(styles.navigation, styles.mobileNav, className)}
31
- dropClass={mobileStyles.mobileMenu}
32
- >
33
- <nav>
34
- <Icon of="x-thick" className={mobileStyles.close} />
35
- {totalSlots.map(([id, menuItem]) => {
36
- return (
37
- <TopBarNav
38
- key={id}
39
- {...menuItem.props}
40
- className={mobileStyles.mobileMenuLink}
41
- activeClassName={mobileStyles.active}
42
- >
43
- {typeof menuItem.props.children === 'string' ? menuItem.props.children : menuItem.props.displayName}
44
- </TopBarNav>
45
- );
46
- })}
47
- </nav>
48
- </Dropdown>
49
- );
50
- }
51
-
52
- function sortFn([, { order: first }]: [string, NavPlugin], [, { order: second }]: [string, NavPlugin]) {
53
- // 0 - equal
54
- // <0 - first < second
55
- // >0 - first > second
56
-
57
- return (first ?? 0) - (second ?? 0);
58
- }
59
-
60
- type PlaceholderProps = {
61
- slots: [string, NavPlugin][];
62
- baseUrl?: string;
63
- } & React.HTMLAttributes<HTMLDivElement>;
64
-
65
- function Placeholder({ slots, ...rest }: PlaceholderProps) {
66
- return (
67
- <div {...rest} className={mobileStyles.placeholder}>
68
- {slots.map(([id, menuItem]) => (
69
- <ShowWhenMatch key={id} href={menuItem.props.href || ''} end={menuItem.props.exact}>
70
- {typeof menuItem.props.children === 'string' ? menuItem.props.children : menuItem.props.displayName}
71
- </ShowWhenMatch>
72
- ))}
73
- <Icon of="fat-arrow-down" />
74
- </div>
75
- );
76
- }
77
-
78
- function ShowWhenMatch({
79
- href,
80
- children,
81
- caseSensitive,
82
- end: exact,
83
- }: {
84
- href: string;
85
- children: ReactNode;
86
- caseSensitive?: boolean;
87
- end?: boolean;
88
- }) {
89
- const isMatch = useLinkMatch(href, { caseSensitive, exact });
90
- if (!isMatch) return null;
91
- return <>{children}</>;
92
- }
93
-
94
- function useLinkMatch(href: string, { caseSensitive, exact }: { caseSensitive?: boolean; exact?: boolean } = {}) {
95
- const location = useLocation();
96
- let pathname = location?.pathname || '/';
97
- let destination = useResolvedPath(href).pathname;
98
-
99
- if (!caseSensitive) {
100
- pathname = pathname.toLowerCase();
101
- destination = destination.toLowerCase();
102
- }
103
-
104
- return (
105
- destination === pathname ||
106
- (!exact && pathname.startsWith(destination) && pathname.charAt(destination.length) === '/')
107
- );
108
- }