@flipdish/ui-library 0.20.0 → 0.20.1
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/components/__internal__/navigation/nav.types.d.ts +56 -0
- package/dist/components/__internal__/navigation/nav.types.d.ts.map +1 -0
- package/dist/components/__internal__/navigation/nav.utils.cjs +28 -0
- package/dist/components/__internal__/navigation/nav.utils.cjs.map +1 -0
- package/dist/components/__internal__/navigation/nav.utils.d.ts +23 -0
- package/dist/components/__internal__/navigation/nav.utils.d.ts.map +1 -0
- package/dist/components/__internal__/navigation/nav.utils.js +23 -0
- package/dist/components/__internal__/navigation/nav.utils.js.map +1 -0
- package/dist/components/organisms/HeaderNavigation/components/nav-list.cjs +7 -11
- package/dist/components/organisms/HeaderNavigation/components/nav-list.cjs.map +1 -1
- package/dist/components/organisms/HeaderNavigation/components/nav-list.d.ts.map +1 -1
- package/dist/components/organisms/HeaderNavigation/components/nav-list.js +7 -11
- package/dist/components/organisms/HeaderNavigation/components/nav-list.js.map +1 -1
- package/dist/components/organisms/HeaderNavigation/headerNavigation.types.d.ts +5 -39
- package/dist/components/organisms/HeaderNavigation/headerNavigation.types.d.ts.map +1 -1
- package/dist/components/organisms/SidebarNavigation/components/nav-list.cjs +5 -9
- package/dist/components/organisms/SidebarNavigation/components/nav-list.cjs.map +1 -1
- package/dist/components/organisms/SidebarNavigation/components/nav-list.d.ts.map +1 -1
- package/dist/components/organisms/SidebarNavigation/components/nav-list.js +5 -9
- package/dist/components/organisms/SidebarNavigation/components/nav-list.js.map +1 -1
- package/dist/components/organisms/SidebarNavigation/sidebarNavigation.types.d.ts +5 -42
- package/dist/components/organisms/SidebarNavigation/sidebarNavigation.types.d.ts.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* INTERNAL — shared base types for the two navigation organisms. Not a public
|
|
3
|
+
* subpath (no `index.tsx`, so the `components/*` entry globs and exports map never
|
|
4
|
+
* see this folder); each organism re-exports its public type names from here, so
|
|
5
|
+
* `NavItemType` / `NavSubItemType` / `NavItemDividerType` keep a single definition
|
|
6
|
+
* instead of the triplicated copies that previously drifted (audit finding H1).
|
|
7
|
+
*
|
|
8
|
+
* SidebarNavigation extends the base with its `toggle` capability; HeaderNavigation
|
|
9
|
+
* uses the base as-is. Genuinely organism-specific behaviour stays in the organisms.
|
|
10
|
+
*/
|
|
11
|
+
import type { FC, ReactNode } from 'react';
|
|
12
|
+
export type NavSubItemType = {
|
|
13
|
+
/** Label text for the sub-item. */
|
|
14
|
+
label: string;
|
|
15
|
+
/** URL to navigate to when the sub-item is clicked. */
|
|
16
|
+
href: string;
|
|
17
|
+
/** Icon component to display. */
|
|
18
|
+
icon?: FC<{
|
|
19
|
+
className?: string;
|
|
20
|
+
}>;
|
|
21
|
+
/** Badge to display. */
|
|
22
|
+
badge?: ReactNode;
|
|
23
|
+
/** Stable id used to derive the sub-item's default `data-testid`. Falls back to a slug of `label`. */
|
|
24
|
+
id?: string;
|
|
25
|
+
/** Overrides the derived `data-testid`. */
|
|
26
|
+
'data-testid'?: string;
|
|
27
|
+
};
|
|
28
|
+
/** Common shape of a top-level nav item; organisms extend it with their own capabilities. */
|
|
29
|
+
export type NavItemTypeBase = {
|
|
30
|
+
/** Label text for the nav item. */
|
|
31
|
+
label: string;
|
|
32
|
+
/** URL to navigate to when the nav item is clicked. */
|
|
33
|
+
href?: string;
|
|
34
|
+
/** Icon component to display. */
|
|
35
|
+
icon?: FC<{
|
|
36
|
+
className?: string;
|
|
37
|
+
}>;
|
|
38
|
+
/** Badge to display. */
|
|
39
|
+
badge?: ReactNode;
|
|
40
|
+
/** List of sub-items to display. */
|
|
41
|
+
items?: NavSubItemType[];
|
|
42
|
+
/** Whether this nav item is a divider. */
|
|
43
|
+
divider?: boolean;
|
|
44
|
+
/** Stable id used to derive the item's default `data-testid`. Falls back to a slug of `label`. */
|
|
45
|
+
id?: string;
|
|
46
|
+
/** Overrides the derived `data-testid`. */
|
|
47
|
+
'data-testid'?: string;
|
|
48
|
+
};
|
|
49
|
+
/** Divider variant of an organism's item type — label optional, `divider` required. */
|
|
50
|
+
export type NavItemDividerOf<T extends NavItemTypeBase> = Omit<T, 'icon' | 'label' | 'divider'> & {
|
|
51
|
+
/** Label text for the divider. */
|
|
52
|
+
label?: string;
|
|
53
|
+
/** Whether this nav item is a divider. */
|
|
54
|
+
divider: true;
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=nav.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nav.types.d.ts","sourceRoot":"","sources":["../../../../src/components/__internal__/navigation/nav.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE3C,MAAM,MAAM,cAAc,GAAG;IAC3B,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,IAAI,CAAC,EAAE,EAAE,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClC,wBAAwB;IACxB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,sGAAsG;IACtG,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,6FAA6F;AAC7F,MAAM,MAAM,eAAe,GAAG;IAC5B,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,IAAI,CAAC,EAAE,EAAE,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClC,wBAAwB;IACxB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,oCAAoC;IACpC,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kGAAkG;IAClG,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,uFAAuF;AACvF,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,eAAe,IAAI,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GAAG;IAChG,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,OAAO,EAAE,IAAI,CAAC;CACf,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var testIdUtils = require('@flipdish/ui-library/utilities/testIdUtils');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* INTERNAL — shared navigation utils: the nav-list logic where the Sidebar/Header fork historically drifted
|
|
7
|
+
* (audit finding H1): active-item resolution and testid derivation each shipped a
|
|
8
|
+
* one-sided bug fix. One implementation, used by both organisms' nav-lists; the JSX
|
|
9
|
+
* stays per-organism because the underlying NavItemBase designs genuinely differ.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* The item (or sub-item parent) matching `activeUrl`. Only matches a DEFINED
|
|
13
|
+
* `activeUrl` — parents may be hrefless, and `undefined === undefined` would
|
|
14
|
+
* otherwise "activate" the first of them by default.
|
|
15
|
+
*/
|
|
16
|
+
const findActiveItem = (items, activeUrl) => activeUrl === undefined ? undefined : items.find((item) => item.href === activeUrl || item.items?.some((subItem) => subItem.href === activeUrl));
|
|
17
|
+
/** Whether `item` is the current page — guarded so hrefless items never match an omitted `activeUrl`. */
|
|
18
|
+
const isCurrentItem = (item, activeUrl) => activeUrl !== undefined && activeUrl === item.href;
|
|
19
|
+
/** Derived testid for a top-level item: explicit override wins; otherwise `<prefix>--nav-item-<id|label-slug>`. */
|
|
20
|
+
const navItemTestId = (testIdPrefix, item) => item['data-testid'] ?? (testIdPrefix ? testIdUtils.joinTestId(testIdPrefix, `nav-item-${item.id ?? testIdUtils.slugifyTestId(item.label ?? '')}`) : undefined);
|
|
21
|
+
/** Derived testid for a sub-item, rooted at its parent's resolved testid. */
|
|
22
|
+
const navSubItemTestId = (parentTestId, subItem) => subItem['data-testid'] ?? (parentTestId ? testIdUtils.joinTestId(parentTestId, `sub-item-${subItem.id ?? testIdUtils.slugifyTestId(subItem.label)}`) : undefined);
|
|
23
|
+
|
|
24
|
+
exports.findActiveItem = findActiveItem;
|
|
25
|
+
exports.isCurrentItem = isCurrentItem;
|
|
26
|
+
exports.navItemTestId = navItemTestId;
|
|
27
|
+
exports.navSubItemTestId = navSubItemTestId;
|
|
28
|
+
//# sourceMappingURL=nav.utils.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nav.utils.cjs","sources":["../../../../src/components/__internal__/navigation/nav.utils.ts"],"sourcesContent":[null],"names":["joinTestId","slugifyTestId"],"mappings":";;;;AAAA;;;;;AAKG;AAaH;;;;AAIG;AACI,MAAM,cAAc,GAAG,CAAwB,KAAmB,EAAE,SAA6B,KACtG,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC;AAEjJ;MACa,aAAa,GAAG,CAAC,IAA+B,EAAE,SAA6B,KAC1F,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC;AAEhD;MACa,aAAa,GAAG,CAAC,YAAgC,EAAE,IAAuD,KACrH,IAAI,CAAC,aAAa,CAAC,KAAK,YAAY,GAAGA,sBAAU,CAAC,YAAY,EAAE,YAAY,IAAI,CAAC,EAAE,IAAIC,yBAAa,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA,CAAE,CAAC,GAAG,SAAS;AAEvI;AACO,MAAM,gBAAgB,GAAG,CAAC,YAAgC,EAAE,OAAuB,KACxF,OAAO,CAAC,aAAa,CAAC,KAAK,YAAY,GAAGD,sBAAU,CAAC,YAAY,EAAE,CAAA,SAAA,EAAY,OAAO,CAAC,EAAE,IAAIC,yBAAa,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,SAAS;;;;;;;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { NavSubItemType } from './nav.types';
|
|
2
|
+
/** Structural minimum the helpers need — covers both item and divider variants. */
|
|
3
|
+
type NavItemLike = {
|
|
4
|
+
label?: string;
|
|
5
|
+
href?: string;
|
|
6
|
+
id?: string;
|
|
7
|
+
'data-testid'?: string;
|
|
8
|
+
items?: NavSubItemType[];
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* The item (or sub-item parent) matching `activeUrl`. Only matches a DEFINED
|
|
12
|
+
* `activeUrl` — parents may be hrefless, and `undefined === undefined` would
|
|
13
|
+
* otherwise "activate" the first of them by default.
|
|
14
|
+
*/
|
|
15
|
+
export declare const findActiveItem: <T extends NavItemLike>(items: readonly T[], activeUrl: string | undefined) => T | undefined;
|
|
16
|
+
/** Whether `item` is the current page — guarded so hrefless items never match an omitted `activeUrl`. */
|
|
17
|
+
export declare const isCurrentItem: (item: Pick<NavItemLike, "href">, activeUrl: string | undefined) => boolean;
|
|
18
|
+
/** Derived testid for a top-level item: explicit override wins; otherwise `<prefix>--nav-item-<id|label-slug>`. */
|
|
19
|
+
export declare const navItemTestId: (testIdPrefix: string | undefined, item: Pick<NavItemLike, "label" | "id" | "data-testid">) => string | undefined;
|
|
20
|
+
/** Derived testid for a sub-item, rooted at its parent's resolved testid. */
|
|
21
|
+
export declare const navSubItemTestId: (parentTestId: string | undefined, subItem: NavSubItemType) => string | undefined;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=nav.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nav.utils.d.ts","sourceRoot":"","sources":["../../../../src/components/__internal__/navigation/nav.utils.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,mFAAmF;AACnF,KAAK,WAAW,GAAG;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;CAC1B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAI,CAAC,SAAS,WAAW,EAAE,OAAO,SAAS,CAAC,EAAE,EAAE,WAAW,MAAM,GAAG,SAAS,KAAG,CAAC,GAAG,SACmC,CAAC;AAEnJ,yGAAyG;AACzG,eAAO,MAAM,aAAa,GAAI,MAAM,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,WAAW,MAAM,GAAG,SAAS,KAAG,OAC3C,CAAC;AAErD,mHAAmH;AACnH,eAAO,MAAM,aAAa,GAAI,cAAc,MAAM,GAAG,SAAS,EAAE,MAAM,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,IAAI,GAAG,aAAa,CAAC,KAAG,MAAM,GAAG,SACK,CAAC;AAEzI,6EAA6E;AAC7E,eAAO,MAAM,gBAAgB,GAAI,cAAc,MAAM,GAAG,SAAS,EAAE,SAAS,cAAc,KAAG,MAAM,GAAG,SACqC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { joinTestId, slugifyTestId } from '@flipdish/ui-library/utilities/testIdUtils';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* INTERNAL — shared navigation utils: the nav-list logic where the Sidebar/Header fork historically drifted
|
|
5
|
+
* (audit finding H1): active-item resolution and testid derivation each shipped a
|
|
6
|
+
* one-sided bug fix. One implementation, used by both organisms' nav-lists; the JSX
|
|
7
|
+
* stays per-organism because the underlying NavItemBase designs genuinely differ.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* The item (or sub-item parent) matching `activeUrl`. Only matches a DEFINED
|
|
11
|
+
* `activeUrl` — parents may be hrefless, and `undefined === undefined` would
|
|
12
|
+
* otherwise "activate" the first of them by default.
|
|
13
|
+
*/
|
|
14
|
+
const findActiveItem = (items, activeUrl) => activeUrl === undefined ? undefined : items.find((item) => item.href === activeUrl || item.items?.some((subItem) => subItem.href === activeUrl));
|
|
15
|
+
/** Whether `item` is the current page — guarded so hrefless items never match an omitted `activeUrl`. */
|
|
16
|
+
const isCurrentItem = (item, activeUrl) => activeUrl !== undefined && activeUrl === item.href;
|
|
17
|
+
/** Derived testid for a top-level item: explicit override wins; otherwise `<prefix>--nav-item-<id|label-slug>`. */
|
|
18
|
+
const navItemTestId = (testIdPrefix, item) => item['data-testid'] ?? (testIdPrefix ? joinTestId(testIdPrefix, `nav-item-${item.id ?? slugifyTestId(item.label ?? '')}`) : undefined);
|
|
19
|
+
/** Derived testid for a sub-item, rooted at its parent's resolved testid. */
|
|
20
|
+
const navSubItemTestId = (parentTestId, subItem) => subItem['data-testid'] ?? (parentTestId ? joinTestId(parentTestId, `sub-item-${subItem.id ?? slugifyTestId(subItem.label)}`) : undefined);
|
|
21
|
+
|
|
22
|
+
export { findActiveItem, isCurrentItem, navItemTestId, navSubItemTestId };
|
|
23
|
+
//# sourceMappingURL=nav.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nav.utils.js","sources":["../../../../src/components/__internal__/navigation/nav.utils.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAAA;;;;;AAKG;AAaH;;;;AAIG;AACI,MAAM,cAAc,GAAG,CAAwB,KAAmB,EAAE,SAA6B,KACtG,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC;AAEjJ;MACa,aAAa,GAAG,CAAC,IAA+B,EAAE,SAA6B,KAC1F,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC;AAEhD;MACa,aAAa,GAAG,CAAC,YAAgC,EAAE,IAAuD,KACrH,IAAI,CAAC,aAAa,CAAC,KAAK,YAAY,GAAG,UAAU,CAAC,YAAY,EAAE,YAAY,IAAI,CAAC,EAAE,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA,CAAE,CAAC,GAAG,SAAS;AAEvI;AACO,MAAM,gBAAgB,GAAG,CAAC,YAAgC,EAAE,OAAuB,KACxF,OAAO,CAAC,aAAa,CAAC,KAAK,YAAY,GAAG,UAAU,CAAC,YAAY,EAAE,CAAA,SAAA,EAAY,OAAO,CAAC,EAAE,IAAI,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,SAAS;;;;"}
|
|
@@ -2,18 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
4
|
var cx = require('@flipdish/ui-library/utilities/cx');
|
|
5
|
-
var
|
|
5
|
+
var nav_utils = require('../../../__internal__/navigation/nav.utils.cjs');
|
|
6
6
|
var navItem = require('./nav-item.cjs');
|
|
7
7
|
|
|
8
8
|
const NavList = ({ activeUrl, items, className, testIdPrefix }) => {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const
|
|
12
|
-
const itemTestId = (item) => item['data-testid'] ?? (testIdPrefix ? testIdUtils.joinTestId(testIdPrefix, `nav-item-${item.id ?? testIdUtils.slugifyTestId(item.label ?? '')}`) : undefined);
|
|
13
|
-
const subItemTestId = (parent, sub) => {
|
|
14
|
-
const parentId = itemTestId(parent);
|
|
15
|
-
return sub['data-testid'] ?? (parentId ? testIdUtils.joinTestId(parentId, `sub-item-${sub.id ?? testIdUtils.slugifyTestId(sub.label)}`) : undefined);
|
|
16
|
-
};
|
|
9
|
+
const activeItem = nav_utils.findActiveItem(items, activeUrl);
|
|
10
|
+
const itemTestId = (item) => nav_utils.navItemTestId(testIdPrefix, item);
|
|
11
|
+
const subItemTestId = (parent, sub) => nav_utils.navSubItemTestId(itemTestId(parent), sub);
|
|
17
12
|
return (jsxRuntime.jsx("ul", { className: cx.cx('flex flex-col px-4 pt-5', className), children: items.map((item, index) => {
|
|
18
13
|
if (item.divider) {
|
|
19
14
|
return (
|
|
@@ -21,9 +16,10 @@ const NavList = ({ activeUrl, items, className, testIdPrefix }) => {
|
|
|
21
16
|
jsxRuntime.jsx("li", { className: "w-full px-0.5 py-2", children: jsxRuntime.jsx("hr", { className: "h-px w-full border-none bg-border-secondary" }) }, index));
|
|
22
17
|
}
|
|
23
18
|
if (item.items?.length) {
|
|
24
|
-
|
|
19
|
+
// Reference compare, not href: hrefless parents all share `undefined` and would otherwise force-open together.
|
|
20
|
+
return (jsxRuntime.jsxs("details", { open: activeItem === item, className: "appearance-none py-0.25", children: [jsxRuntime.jsx(navItem.NavItemBase, { href: item.href, badge: item.badge, icon: item.icon, type: "collapsible", "data-testid": itemTestId(item), children: item.label }), jsxRuntime.jsx("dd", { children: jsxRuntime.jsx("ul", { className: "pb-1", children: item.items.map((childItem) => (jsxRuntime.jsx("li", { className: "py-0.25", children: jsxRuntime.jsx(navItem.NavItemBase, { href: childItem.href, badge: childItem.badge, type: "collapsible-child", current: activeUrl === childItem.href, "data-testid": subItemTestId(item, childItem), children: childItem.label }) }, childItem.label))) }) })] }, item.label));
|
|
25
21
|
}
|
|
26
|
-
return (jsxRuntime.jsx("li", { className: "py-px", children: jsxRuntime.jsx(navItem.NavItemBase, { type: "link", badge: item.badge, icon: item.icon, href: item.href, current:
|
|
22
|
+
return (jsxRuntime.jsx("li", { className: "py-px", children: jsxRuntime.jsx(navItem.NavItemBase, { type: "link", badge: item.badge, icon: item.icon, href: item.href, current: nav_utils.isCurrentItem(item, activeUrl), "data-testid": itemTestId(item), children: item.label }) }, item.label));
|
|
27
23
|
}) }));
|
|
28
24
|
};
|
|
29
25
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nav-list.cjs","sources":["../../../../../src/components/organisms/HeaderNavigation/components/nav-list.tsx"],"sourcesContent":[null],"names":["
|
|
1
|
+
{"version":3,"file":"nav-list.cjs","sources":["../../../../../src/components/organisms/HeaderNavigation/components/nav-list.tsx"],"sourcesContent":[null],"names":["findActiveItem","navItemTestId","navSubItemTestId","_jsx","cx","_jsxs","NavItemBase","isCurrentItem"],"mappings":";;;;;;;AAkBO,MAAM,OAAO,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAgB,KAAI;IACrF,MAAM,UAAU,GAAGA,wBAAc,CAAC,KAAK,EAAE,SAAS,CAAC;AACnD,IAAA,MAAM,UAAU,GAAG,CAAC,IAAsC,KAAKC,uBAAa,CAAC,YAAY,EAAE,IAAI,CAAC;AAChG,IAAA,MAAM,aAAa,GAAG,CAAC,MAAwC,EAAE,GAAmB,KAAKC,0BAAgB,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC;IAElI,QACEC,uBAAI,SAAS,EAAEC,KAAE,CAAC,yBAAyB,EAAE,SAAS,CAAC,YACpD,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AACzB,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE;gBAChB;;AAEE,gBAAAD,cAAA,CAAA,IAAA,EAAA,EAAgB,SAAS,EAAC,oBAAoB,EAAA,QAAA,EAC5CA,cAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,6CAA6C,EAAA,CAAG,EAAA,EADvD,KAAK,CAET;YAET;AAEA,YAAA,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE;;gBAEtB,QACEE,eAAA,CAAA,SAAA,EAAA,EAA0B,IAAI,EAAE,UAAU,KAAK,IAAI,EAAE,SAAS,EAAC,yBAAyB,EAAA,QAAA,EAAA,CACtFF,cAAA,CAACG,mBAAW,EAAA,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAC,aAAa,EAAA,aAAA,EAAc,UAAU,CAAC,IAAI,CAAC,EAAA,QAAA,EAC/G,IAAI,CAAC,KAAK,EAAA,CACC,EAEdH,cAAA,CAAA,IAAA,EAAA,EAAA,QAAA,EACEA,cAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,MAAM,EAAA,QAAA,EACjB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,SAAS,MACxBA,cAAA,CAAA,IAAA,EAAA,EAA0B,SAAS,EAAC,SAAS,EAAA,QAAA,EAC3CA,cAAA,CAACG,mBAAW,EAAA,EACV,IAAI,EAAE,SAAS,CAAC,IAAI,EACpB,KAAK,EAAE,SAAS,CAAC,KAAK,EACtB,IAAI,EAAC,mBAAmB,EACxB,OAAO,EAAE,SAAS,KAAK,SAAS,CAAC,IAAI,EAAA,aAAA,EACxB,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,EAAA,QAAA,EAE1C,SAAS,CAAC,KAAK,EAAA,CACJ,EAAA,EATP,SAAS,CAAC,KAAK,CAUnB,CACN,CAAC,EAAA,CACC,EAAA,CACF,CAAA,EAAA,EArBO,IAAI,CAAC,KAAK,CAsBd;YAEd;YAEA,QACEH,cAAA,CAAA,IAAA,EAAA,EAAqB,SAAS,EAAC,OAAO,YACpCA,cAAA,CAACG,mBAAW,EAAA,EACV,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,OAAO,EAAEC,uBAAa,CAAC,IAAI,EAAE,SAAS,CAAC,EAAA,aAAA,EAC1B,UAAU,CAAC,IAAI,CAAC,EAAA,QAAA,EAE5B,IAAI,CAAC,KAAK,EAAA,CACC,EAAA,EAVP,IAAI,CAAC,KAAK,CAWd;QAET,CAAC,CAAC,EAAA,CACC;AAET;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nav-list.d.ts","sourceRoot":"","sources":["../../../../../src/components/organisms/HeaderNavigation/components/nav-list.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAkB,MAAM,2BAA2B,CAAC;AAGjG,UAAU,YAAY;IACpB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,KAAK,EAAE,CAAC,WAAW,GAAG,kBAAkB,CAAC,EAAE,CAAC;IAC5C,8EAA8E;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,OAAO,GAAI,+CAA+C,YAAY,
|
|
1
|
+
{"version":3,"file":"nav-list.d.ts","sourceRoot":"","sources":["../../../../../src/components/organisms/HeaderNavigation/components/nav-list.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAkB,MAAM,2BAA2B,CAAC;AAGjG,UAAU,YAAY;IACpB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,KAAK,EAAE,CAAC,WAAW,GAAG,kBAAkB,CAAC,EAAE,CAAC;IAC5C,8EAA8E;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,OAAO,GAAI,+CAA+C,YAAY,gCA+DlF,CAAC"}
|
|
@@ -1,17 +1,12 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import { cx } from '@flipdish/ui-library/utilities/cx';
|
|
3
|
-
import {
|
|
3
|
+
import { findActiveItem, isCurrentItem, navItemTestId, navSubItemTestId } from '../../../__internal__/navigation/nav.utils.js';
|
|
4
4
|
import { NavItemBase } from './nav-item.js';
|
|
5
5
|
|
|
6
6
|
const NavList = ({ activeUrl, items, className, testIdPrefix }) => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
const itemTestId = (item) => item['data-testid'] ?? (testIdPrefix ? joinTestId(testIdPrefix, `nav-item-${item.id ?? slugifyTestId(item.label ?? '')}`) : undefined);
|
|
11
|
-
const subItemTestId = (parent, sub) => {
|
|
12
|
-
const parentId = itemTestId(parent);
|
|
13
|
-
return sub['data-testid'] ?? (parentId ? joinTestId(parentId, `sub-item-${sub.id ?? slugifyTestId(sub.label)}`) : undefined);
|
|
14
|
-
};
|
|
7
|
+
const activeItem = findActiveItem(items, activeUrl);
|
|
8
|
+
const itemTestId = (item) => navItemTestId(testIdPrefix, item);
|
|
9
|
+
const subItemTestId = (parent, sub) => navSubItemTestId(itemTestId(parent), sub);
|
|
15
10
|
return (jsx("ul", { className: cx('flex flex-col px-4 pt-5', className), children: items.map((item, index) => {
|
|
16
11
|
if (item.divider) {
|
|
17
12
|
return (
|
|
@@ -19,9 +14,10 @@ const NavList = ({ activeUrl, items, className, testIdPrefix }) => {
|
|
|
19
14
|
jsx("li", { className: "w-full px-0.5 py-2", children: jsx("hr", { className: "h-px w-full border-none bg-border-secondary" }) }, index));
|
|
20
15
|
}
|
|
21
16
|
if (item.items?.length) {
|
|
22
|
-
|
|
17
|
+
// Reference compare, not href: hrefless parents all share `undefined` and would otherwise force-open together.
|
|
18
|
+
return (jsxs("details", { open: activeItem === item, className: "appearance-none py-0.25", children: [jsx(NavItemBase, { href: item.href, badge: item.badge, icon: item.icon, type: "collapsible", "data-testid": itemTestId(item), children: item.label }), jsx("dd", { children: jsx("ul", { className: "pb-1", children: item.items.map((childItem) => (jsx("li", { className: "py-0.25", children: jsx(NavItemBase, { href: childItem.href, badge: childItem.badge, type: "collapsible-child", current: activeUrl === childItem.href, "data-testid": subItemTestId(item, childItem), children: childItem.label }) }, childItem.label))) }) })] }, item.label));
|
|
23
19
|
}
|
|
24
|
-
return (jsx("li", { className: "py-px", children: jsx(NavItemBase, { type: "link", badge: item.badge, icon: item.icon, href: item.href, current:
|
|
20
|
+
return (jsx("li", { className: "py-px", children: jsx(NavItemBase, { type: "link", badge: item.badge, icon: item.icon, href: item.href, current: isCurrentItem(item, activeUrl), "data-testid": itemTestId(item), children: item.label }) }, item.label));
|
|
25
21
|
}) }));
|
|
26
22
|
};
|
|
27
23
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nav-list.js","sources":["../../../../../src/components/organisms/HeaderNavigation/components/nav-list.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":";;;;;AAkBO,MAAM,OAAO,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAgB,KAAI
|
|
1
|
+
{"version":3,"file":"nav-list.js","sources":["../../../../../src/components/organisms/HeaderNavigation/components/nav-list.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":";;;;;AAkBO,MAAM,OAAO,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAgB,KAAI;IACrF,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC;AACnD,IAAA,MAAM,UAAU,GAAG,CAAC,IAAsC,KAAK,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC;AAChG,IAAA,MAAM,aAAa,GAAG,CAAC,MAAwC,EAAE,GAAmB,KAAK,gBAAgB,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC;IAElI,QACEA,YAAI,SAAS,EAAE,EAAE,CAAC,yBAAyB,EAAE,SAAS,CAAC,YACpD,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AACzB,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE;gBAChB;;AAEE,gBAAAA,GAAA,CAAA,IAAA,EAAA,EAAgB,SAAS,EAAC,oBAAoB,EAAA,QAAA,EAC5CA,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,6CAA6C,EAAA,CAAG,EAAA,EADvD,KAAK,CAET;YAET;AAEA,YAAA,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE;;gBAEtB,QACEC,IAAA,CAAA,SAAA,EAAA,EAA0B,IAAI,EAAE,UAAU,KAAK,IAAI,EAAE,SAAS,EAAC,yBAAyB,EAAA,QAAA,EAAA,CACtFD,GAAA,CAAC,WAAW,EAAA,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAC,aAAa,EAAA,aAAA,EAAc,UAAU,CAAC,IAAI,CAAC,EAAA,QAAA,EAC/G,IAAI,CAAC,KAAK,EAAA,CACC,EAEdA,GAAA,CAAA,IAAA,EAAA,EAAA,QAAA,EACEA,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,MAAM,EAAA,QAAA,EACjB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,SAAS,MACxBA,GAAA,CAAA,IAAA,EAAA,EAA0B,SAAS,EAAC,SAAS,EAAA,QAAA,EAC3CA,GAAA,CAAC,WAAW,EAAA,EACV,IAAI,EAAE,SAAS,CAAC,IAAI,EACpB,KAAK,EAAE,SAAS,CAAC,KAAK,EACtB,IAAI,EAAC,mBAAmB,EACxB,OAAO,EAAE,SAAS,KAAK,SAAS,CAAC,IAAI,EAAA,aAAA,EACxB,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,EAAA,QAAA,EAE1C,SAAS,CAAC,KAAK,EAAA,CACJ,EAAA,EATP,SAAS,CAAC,KAAK,CAUnB,CACN,CAAC,EAAA,CACC,EAAA,CACF,CAAA,EAAA,EArBO,IAAI,CAAC,KAAK,CAsBd;YAEd;YAEA,QACEA,GAAA,CAAA,IAAA,EAAA,EAAqB,SAAS,EAAC,OAAO,YACpCA,GAAA,CAAC,WAAW,EAAA,EACV,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,OAAO,EAAE,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,EAAA,aAAA,EAC1B,UAAU,CAAC,IAAI,CAAC,EAAA,QAAA,EAE5B,IAAI,CAAC,KAAK,EAAA,CACC,EAAA,EAVP,IAAI,CAAC,KAAK,CAWd;QAET,CAAC,CAAC,EAAA,CACC;AAET;;;;"}
|
|
@@ -1,40 +1,6 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export type NavSubItemType
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
className?: string;
|
|
7
|
-
}>;
|
|
8
|
-
badge?: ReactNode;
|
|
9
|
-
/** Stable id used to derive this sub-item's `data-testid` (falls back to a slug of `label`). */
|
|
10
|
-
id?: string;
|
|
11
|
-
/** Overrides the derived `data-testid` for this sub-item. */
|
|
12
|
-
'data-testid'?: string;
|
|
13
|
-
};
|
|
14
|
-
export type NavItemType = {
|
|
15
|
-
/** Label text for the nav item. */
|
|
16
|
-
label: string;
|
|
17
|
-
/** URL to navigate to when the nav item is clicked. */
|
|
18
|
-
href?: string;
|
|
19
|
-
/** Icon component to display. */
|
|
20
|
-
icon?: FC<{
|
|
21
|
-
className?: string;
|
|
22
|
-
}>;
|
|
23
|
-
/** Badge to display. */
|
|
24
|
-
badge?: ReactNode;
|
|
25
|
-
/** List of sub-items to display. */
|
|
26
|
-
items?: NavSubItemType[];
|
|
27
|
-
/** Whether this nav item is a divider. */
|
|
28
|
-
divider?: boolean;
|
|
29
|
-
/** Stable id used to derive this item's `data-testid` (falls back to a slug of `label`). */
|
|
30
|
-
id?: string;
|
|
31
|
-
/** Overrides the derived `data-testid` for this item. */
|
|
32
|
-
'data-testid'?: string;
|
|
33
|
-
};
|
|
34
|
-
export type NavItemDividerType = Omit<NavItemType, 'icon' | 'label' | 'divider'> & {
|
|
35
|
-
/** Label text for the divider. */
|
|
36
|
-
label?: string;
|
|
37
|
-
/** Whether this nav item is a divider. */
|
|
38
|
-
divider: true;
|
|
39
|
-
};
|
|
1
|
+
import type { NavItemDividerOf, NavItemTypeBase, NavSubItemType } from '../../__internal__/navigation/nav.types';
|
|
2
|
+
export type { NavSubItemType };
|
|
3
|
+
/** Header nav item — the shared base shape. */
|
|
4
|
+
export type NavItemType = NavItemTypeBase;
|
|
5
|
+
export type NavItemDividerType = NavItemDividerOf<NavItemType>;
|
|
40
6
|
//# sourceMappingURL=headerNavigation.types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headerNavigation.types.d.ts","sourceRoot":"","sources":["../../../../src/components/organisms/HeaderNavigation/headerNavigation.types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"headerNavigation.types.d.ts","sourceRoot":"","sources":["../../../../src/components/organisms/HeaderNavigation/headerNavigation.types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAEjH,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B,+CAA+C;AAC/C,MAAM,MAAM,WAAW,GAAG,eAAe,CAAC;AAE1C,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC"}
|
|
@@ -2,18 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
4
|
var cx = require('@flipdish/ui-library/utilities/cx');
|
|
5
|
-
var
|
|
5
|
+
var nav_utils = require('../../../__internal__/navigation/nav.utils.cjs');
|
|
6
6
|
var navItem = require('./nav-item.cjs');
|
|
7
7
|
var navSectionToggle = require('./nav-section-toggle.cjs');
|
|
8
8
|
|
|
9
9
|
const NavList = ({ activeUrl, items, className, onNavigate, testIdPrefix }) => {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
const itemTestId = (item) => testIdPrefix ? (item['data-testid'] ?? testIdUtils.joinTestId(testIdPrefix, `nav-item-${item.id ?? testIdUtils.slugifyTestId(item.label ?? '')}`)) : item['data-testid'];
|
|
14
|
-
const subItemTestId = (parentTestId, subItem) => parentTestId
|
|
15
|
-
? (subItem['data-testid'] ?? testIdUtils.joinTestId(parentTestId, `sub-item-${subItem.id ?? testIdUtils.slugifyTestId(subItem.label)}`))
|
|
16
|
-
: subItem['data-testid'];
|
|
10
|
+
const activeItem = nav_utils.findActiveItem(items, activeUrl);
|
|
11
|
+
const itemTestId = (item) => nav_utils.navItemTestId(testIdPrefix, item);
|
|
12
|
+
const subItemTestId = nav_utils.navSubItemTestId;
|
|
17
13
|
return (jsxRuntime.jsx("ul", { className: cx.cx('flex flex-col px-4 pt-5', className), children: items.map((item, index) => {
|
|
18
14
|
if (item.divider) {
|
|
19
15
|
return (
|
|
@@ -25,7 +21,7 @@ const NavList = ({ activeUrl, items, className, onNavigate, testIdPrefix }) => {
|
|
|
25
21
|
// Reference compare, not href: hrefless parents all share `undefined` and would otherwise force-open together.
|
|
26
22
|
return (jsxRuntime.jsxs("details", { open: activeItem === item, className: "appearance-none py-0.25", children: [jsxRuntime.jsx(navItem.NavItemBase, { badge: item.badge, icon: item.icon, type: "collapsible", "data-testid": parentTestId, children: item.label }), jsxRuntime.jsxs("dd", { children: [jsxRuntime.jsx("ul", { className: "pb-1", children: item.items.map((childItem) => (jsxRuntime.jsx("li", { className: "py-0.25", children: jsxRuntime.jsx(navItem.NavItemBase, { href: childItem.href, badge: childItem.badge, type: "collapsible-child", current: activeUrl === childItem.href, onClick: onNavigate, "data-testid": subItemTestId(parentTestId, childItem), children: childItem.label }) }, childItem.label))) }), item.toggle && jsxRuntime.jsx(navSectionToggle.NavSectionToggleRow, { toggle: item.toggle, testIdPrefix: parentTestId, className: "py-2 pr-3 pl-10" })] })] }, item.label));
|
|
27
23
|
}
|
|
28
|
-
return (jsxRuntime.jsx("li", { className: "py-px", children: jsxRuntime.jsx(navItem.NavItemBase, { type: "link", badge: item.badge, icon: item.icon, href: item.href, current:
|
|
24
|
+
return (jsxRuntime.jsx("li", { className: "py-px", children: jsxRuntime.jsx(navItem.NavItemBase, { type: "link", badge: item.badge, icon: item.icon, href: item.href, current: nav_utils.isCurrentItem(item, activeUrl), onClick: onNavigate, "data-testid": itemTestId(item), children: item.label }) }, item.label));
|
|
29
25
|
}) }));
|
|
30
26
|
};
|
|
31
27
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nav-list.cjs","sources":["../../../../../src/components/organisms/SidebarNavigation/components/nav-list.tsx"],"sourcesContent":[null],"names":["
|
|
1
|
+
{"version":3,"file":"nav-list.cjs","sources":["../../../../../src/components/organisms/SidebarNavigation/components/nav-list.tsx"],"sourcesContent":[null],"names":["findActiveItem","navItemTestId","navSubItemTestId","_jsx","cx","_jsxs","NavItemBase","NavSectionToggleRow","isCurrentItem"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nav-list.d.ts","sourceRoot":"","sources":["../../../../../src/components/organisms/SidebarNavigation/components/nav-list.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAkB,MAAM,4BAA4B,CAAC;AAIlG,UAAU,YAAY;IACpB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,KAAK,EAAE,CAAC,WAAW,GAAG,kBAAkB,CAAC,EAAE,CAAC;IAC5C,mGAAmG;IACnG,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,OAAO,GAAI,2DAA2D,YAAY,
|
|
1
|
+
{"version":3,"file":"nav-list.d.ts","sourceRoot":"","sources":["../../../../../src/components/organisms/SidebarNavigation/components/nav-list.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAkB,MAAM,4BAA4B,CAAC;AAIlG,UAAU,YAAY;IACpB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,KAAK,EAAE,CAAC,WAAW,GAAG,kBAAkB,CAAC,EAAE,CAAC;IAC5C,mGAAmG;IACnG,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,OAAO,GAAI,2DAA2D,YAAY,gCAqE9F,CAAC"}
|
|
@@ -1,17 +1,13 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import { cx } from '@flipdish/ui-library/utilities/cx';
|
|
3
|
-
import {
|
|
3
|
+
import { findActiveItem, isCurrentItem, navItemTestId, navSubItemTestId } from '../../../__internal__/navigation/nav.utils.js';
|
|
4
4
|
import { NavItemBase } from './nav-item.js';
|
|
5
5
|
import { NavSectionToggleRow } from './nav-section-toggle.js';
|
|
6
6
|
|
|
7
7
|
const NavList = ({ activeUrl, items, className, onNavigate, testIdPrefix }) => {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
const itemTestId = (item) => testIdPrefix ? (item['data-testid'] ?? joinTestId(testIdPrefix, `nav-item-${item.id ?? slugifyTestId(item.label ?? '')}`)) : item['data-testid'];
|
|
12
|
-
const subItemTestId = (parentTestId, subItem) => parentTestId
|
|
13
|
-
? (subItem['data-testid'] ?? joinTestId(parentTestId, `sub-item-${subItem.id ?? slugifyTestId(subItem.label)}`))
|
|
14
|
-
: subItem['data-testid'];
|
|
8
|
+
const activeItem = findActiveItem(items, activeUrl);
|
|
9
|
+
const itemTestId = (item) => navItemTestId(testIdPrefix, item);
|
|
10
|
+
const subItemTestId = navSubItemTestId;
|
|
15
11
|
return (jsx("ul", { className: cx('flex flex-col px-4 pt-5', className), children: items.map((item, index) => {
|
|
16
12
|
if (item.divider) {
|
|
17
13
|
return (
|
|
@@ -23,7 +19,7 @@ const NavList = ({ activeUrl, items, className, onNavigate, testIdPrefix }) => {
|
|
|
23
19
|
// Reference compare, not href: hrefless parents all share `undefined` and would otherwise force-open together.
|
|
24
20
|
return (jsxs("details", { open: activeItem === item, className: "appearance-none py-0.25", children: [jsx(NavItemBase, { badge: item.badge, icon: item.icon, type: "collapsible", "data-testid": parentTestId, children: item.label }), jsxs("dd", { children: [jsx("ul", { className: "pb-1", children: item.items.map((childItem) => (jsx("li", { className: "py-0.25", children: jsx(NavItemBase, { href: childItem.href, badge: childItem.badge, type: "collapsible-child", current: activeUrl === childItem.href, onClick: onNavigate, "data-testid": subItemTestId(parentTestId, childItem), children: childItem.label }) }, childItem.label))) }), item.toggle && jsx(NavSectionToggleRow, { toggle: item.toggle, testIdPrefix: parentTestId, className: "py-2 pr-3 pl-10" })] })] }, item.label));
|
|
25
21
|
}
|
|
26
|
-
return (jsx("li", { className: "py-px", children: jsx(NavItemBase, { type: "link", badge: item.badge, icon: item.icon, href: item.href, current:
|
|
22
|
+
return (jsx("li", { className: "py-px", children: jsx(NavItemBase, { type: "link", badge: item.badge, icon: item.icon, href: item.href, current: isCurrentItem(item, activeUrl), onClick: onNavigate, "data-testid": itemTestId(item), children: item.label }) }, item.label));
|
|
27
23
|
}) }));
|
|
28
24
|
};
|
|
29
25
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nav-list.js","sources":["../../../../../src/components/organisms/SidebarNavigation/components/nav-list.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":";;;;;;AAqBO,MAAM,OAAO,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAgB,KAAI
|
|
1
|
+
{"version":3,"file":"nav-list.js","sources":["../../../../../src/components/organisms/SidebarNavigation/components/nav-list.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { NavItemDividerOf, NavItemTypeBase, NavSubItemType } from '../../__internal__/navigation/nav.types';
|
|
2
2
|
/**
|
|
3
3
|
* Switch pinned to the bottom of a section's sub-navigation panel. The sidebar only renders
|
|
4
4
|
* it — state and effect stay with the consumer.
|
|
@@ -17,48 +17,11 @@ export type NavSectionToggle = {
|
|
|
17
17
|
/** Overrides the derived `data-testid`. */
|
|
18
18
|
'data-testid'?: string;
|
|
19
19
|
};
|
|
20
|
-
export type NavSubItemType
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
/** URL to navigate to when the sub-item is clicked. */
|
|
24
|
-
href: string;
|
|
25
|
-
/** Icon component to display. */
|
|
26
|
-
icon?: FC<{
|
|
27
|
-
className?: string;
|
|
28
|
-
}>;
|
|
29
|
-
/** Badge to display. */
|
|
30
|
-
badge?: ReactNode;
|
|
31
|
-
/** Stable id used to derive the sub-item's default `data-testid`. Falls back to a slug of `label`. */
|
|
32
|
-
id?: string;
|
|
33
|
-
/** Overrides the derived `data-testid`. */
|
|
34
|
-
'data-testid'?: string;
|
|
35
|
-
};
|
|
36
|
-
export type NavItemType = {
|
|
37
|
-
/** Label text for the nav item. */
|
|
38
|
-
label: string;
|
|
39
|
-
/** URL to navigate to when the nav item is clicked. */
|
|
40
|
-
href?: string;
|
|
41
|
-
/** Icon component to display. */
|
|
42
|
-
icon?: FC<{
|
|
43
|
-
className?: string;
|
|
44
|
-
}>;
|
|
45
|
-
/** Badge to display. */
|
|
46
|
-
badge?: ReactNode;
|
|
47
|
-
/** List of sub-items to display. */
|
|
48
|
-
items?: NavSubItemType[];
|
|
20
|
+
export type { NavSubItemType };
|
|
21
|
+
/** Sidebar nav item — the shared base plus the sidebar-only section `toggle`. */
|
|
22
|
+
export type NavItemType = NavItemTypeBase & {
|
|
49
23
|
/** Switch shown below this section's sub-items. Ignored on items without `items`. */
|
|
50
24
|
toggle?: NavSectionToggle;
|
|
51
|
-
/** Whether this nav item is a divider. */
|
|
52
|
-
divider?: boolean;
|
|
53
|
-
/** Stable id used to derive the item's default `data-testid`. Falls back to a slug of `label`. */
|
|
54
|
-
id?: string;
|
|
55
|
-
/** Overrides the derived `data-testid`. */
|
|
56
|
-
'data-testid'?: string;
|
|
57
|
-
};
|
|
58
|
-
export type NavItemDividerType = Omit<NavItemType, 'icon' | 'label' | 'divider'> & {
|
|
59
|
-
/** Label text for the divider. */
|
|
60
|
-
label?: string;
|
|
61
|
-
/** Whether this nav item is a divider. */
|
|
62
|
-
divider: true;
|
|
63
25
|
};
|
|
26
|
+
export type NavItemDividerType = NavItemDividerOf<NavItemType>;
|
|
64
27
|
//# sourceMappingURL=sidebarNavigation.types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sidebarNavigation.types.d.ts","sourceRoot":"","sources":["../../../../src/components/organisms/SidebarNavigation/sidebarNavigation.types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sidebarNavigation.types.d.ts","sourceRoot":"","sources":["../../../../src/components/organisms/SidebarNavigation/sidebarNavigation.types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAEjH;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gDAAgD;IAChD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sCAAsC;IACtC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B,iFAAiF;AACjF,MAAM,MAAM,WAAW,GAAG,eAAe,GAAG;IAC1C,qFAAqF;IACrF,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flipdish/ui-library",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.1",
|
|
4
4
|
"description": "Flipdish Design System — atomic-design component library (Tailwind v4 + UntitledUI + React Aria).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"imports": {
|
|
7
|
+
"#internal/components/*": "./src/components/__internal__/*.ts",
|
|
7
8
|
"#internal/hooks/*": "./src/hooks/__internal__/*.ts",
|
|
8
9
|
"#internal/utilities/*": "./src/utilities/__internal__/*.ts"
|
|
9
10
|
},
|