@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.
- package/dist/ui/menu/menu-nav.d.ts +1 -0
- package/dist/ui/menu/menu-nav.js +35 -0
- package/dist/ui/menu/menu-nav.js.map +1 -1
- package/dist/ui/menu/menu.js +3 -12
- package/dist/ui/menu/menu.js.map +1 -1
- package/dist/ui/menu/menu.module.scss +22 -0
- package/package-tar/teambit-component-0.0.918.tgz +0 -0
- package/package.json +24 -26
- package/{preview-1669346776422.js → preview-1669765084342.js} +2 -2
- package/ui/menu/menu-nav.tsx +27 -0
- package/ui/menu/menu.module.scss +22 -0
- package/ui/menu/menu.tsx +5 -6
- package/dist/ui/menu/mobile-menu-nav.d.ts +0 -7
- package/dist/ui/menu/mobile-menu-nav.js +0 -168
- package/dist/ui/menu/mobile-menu-nav.js.map +0 -1
- package/dist/ui/menu/mobile-menu-nav.module.scss +0 -70
- package/package-tar/teambit-component-0.0.915.tgz +0 -0
- package/ui/menu/mobile-menu-nav.module.scss +0 -70
- package/ui/menu/mobile-menu-nav.tsx +0 -108
|
@@ -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;
|
package/dist/ui/menu/menu-nav.js
CHANGED
|
@@ -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":"
|
|
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"}
|
package/dist/ui/menu/menu.js
CHANGED
|
@@ -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().
|
|
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
|
package/dist/ui/menu/menu.js.map
CHANGED
|
@@ -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":"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"}
|
|
@@ -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
|
+
}
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@teambit/component",
|
|
3
|
-
"version": "0.0.
|
|
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.
|
|
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.
|
|
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.
|
|
40
|
-
"@teambit/express": "0.0.
|
|
41
|
-
"@teambit/graphql": "0.0.
|
|
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.
|
|
42
|
+
"@teambit/command-bar": "0.0.918",
|
|
44
43
|
"@teambit/component.ui.deprecation-icon": "0.0.501",
|
|
45
|
-
"@teambit/preview": "0.0.
|
|
46
|
-
"@teambit/pubsub": "0.0.
|
|
47
|
-
"@teambit/react-router": "0.0.
|
|
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.
|
|
52
|
-
"@teambit/ui": "0.0.
|
|
53
|
-
"@teambit/component-issues": "0.0.
|
|
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.
|
|
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/
|
|
69
|
-
"@teambit/
|
|
70
|
-
"@teambit/
|
|
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.
|
|
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.
|
|
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.
|
|
2
|
-
import * as overview_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad3d35bfc38b9cd90c0e05b598a5a55af/teambit.component_component@0.0.
|
|
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];
|
package/ui/menu/menu-nav.tsx
CHANGED
|
@@ -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
|
package/ui/menu/menu.module.scss
CHANGED
|
@@ -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
|
-
<
|
|
91
|
-
|
|
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
|
-
}
|
|
Binary file
|
|
@@ -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
|
-
}
|