@patternfly/patternfly-doc-core 1.2.1 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/.astro/collections/textContent.schema.json +6 -0
  2. package/README.md +11 -10
  3. package/astro.config.mjs +8 -1
  4. package/cli/buildPropsData.ts +113 -0
  5. package/cli/cli.ts +54 -6
  6. package/cli/getConfig.ts +6 -0
  7. package/cli/hasFile.ts +5 -0
  8. package/cli/symLinkConfig.ts +21 -0
  9. package/cli/templates/pf-docs.config.mjs +14 -2
  10. package/cli/tsDocGen.js +199 -0
  11. package/dist/cli/buildPropsData.js +68 -0
  12. package/dist/cli/cli.js +39 -4
  13. package/dist/cli/hasFile.js +4 -0
  14. package/dist/cli/symLinkConfig.js +15 -0
  15. package/dist/cli/templates/pf-docs.config.mjs +13 -1
  16. package/dist/cli/tsDocGen.js +153 -0
  17. package/dist/cli/tsconfig.tsbuildinfo +1 -1
  18. package/dist/client/_astro/Navigation.75VF_8AW.js +1 -0
  19. package/dist/client/_astro/_page_.SnUmZn2y.css +1 -0
  20. package/dist/client/design-foundations/typography/index.html +219 -0
  21. package/dist/client/design-foundations/usage-and-behavior/index.html +368 -0
  22. package/dist/client/get-started/contribute/index.html +115 -0
  23. package/dist/client/index.html +42 -0
  24. package/dist/server/_@astrojs-ssr-adapter.mjs +1 -0
  25. package/dist/server/_noop-middleware.mjs +3 -0
  26. package/dist/server/chunks/PropsTables_D_v4KAMn.mjs +1826 -0
  27. package/dist/server/chunks/_@astrojs-ssr-adapter_ByVMUK8O.mjs +3621 -0
  28. package/dist/server/chunks/_astro_assets_CLOMnm-3.mjs +1507 -0
  29. package/dist/server/chunks/_astro_data-layer-content_DDGBHvtb.mjs +1 -0
  30. package/dist/server/chunks/angle-down-icon_BNJvzYv-.mjs +3970 -0
  31. package/dist/server/chunks/astro/server_D4f31GMD.mjs +2769 -0
  32. package/dist/server/chunks/astro-designed-error-pages_CpHpbfhr.mjs +282 -0
  33. package/dist/server/chunks/consts_BmVDRGlB.mjs +32 -0
  34. package/dist/server/chunks/content-assets_DleWbedO.mjs +1 -0
  35. package/dist/server/chunks/content-modules_Dz-S_Wwv.mjs +1 -0
  36. package/dist/server/chunks/path_Cvt6sEOY.mjs +58 -0
  37. package/dist/server/chunks/sharp_BYpUyJGL.mjs +88 -0
  38. package/dist/server/entry.mjs +45 -0
  39. package/dist/server/manifest_CBenwYiZ.mjs +102 -0
  40. package/dist/server/pages/_image.astro.mjs +132 -0
  41. package/dist/server/pages/_section_/_---page_.astro.mjs +1 -0
  42. package/dist/server/pages/_section_/_page_/_---tab_.astro.mjs +1 -0
  43. package/dist/server/pages/index.astro.mjs +1 -0
  44. package/dist/server/pages/props.astro.mjs +25 -0
  45. package/dist/server/renderers.mjs +259 -0
  46. package/jest.config.ts +1 -1
  47. package/package.json +4 -1
  48. package/pf-docs.config.mjs +31 -0
  49. package/src/components/Navigation.astro +15 -4
  50. package/src/components/Navigation.tsx +26 -2
  51. package/src/components/PropsTable.tsx +3 -3
  52. package/src/components/PropsTables.astro +38 -0
  53. package/src/content.config.ts +1 -0
  54. package/src/pages/[section]/[...page].astro +16 -8
  55. package/src/pages/[section]/[page]/[...tab].astro +4 -1
  56. package/src/pages/props.ts +17 -0
  57. package/src/pf-docs.config.mjs +21 -0
  58. package/textContent/contribute.md +1 -0
  59. package/dist/_astro/Navigation.Cede__Ud.js +0 -1
  60. package/dist/design-foundations/typography/index.html +0 -193
  61. package/dist/design-foundations/usage-and-behavior/index.html +0 -342
  62. package/dist/get-started/contribute/index.html +0 -89
  63. package/dist/index.html +0 -42
  64. /package/dist/{PF-HorizontalLogo-Color.svg → client/PF-HorizontalLogo-Color.svg} +0 -0
  65. /package/dist/{PF-HorizontalLogo-Reverse.svg → client/PF-HorizontalLogo-Reverse.svg} +0 -0
  66. /package/dist/{_astro → client/_astro}/Button.C3_jB5tC.js +0 -0
  67. /package/dist/{_astro → client/_astro}/ClientRouter.astro_astro_type_script_index_0_lang.Cainpjm5.js +0 -0
  68. /package/dist/{_astro → client/_astro}/PageContext.C7BqCh9N.js +0 -0
  69. /package/dist/{_astro → client/_astro}/PageToggle.DDEjruql.js +0 -0
  70. /package/dist/{_astro → client/_astro}/RedHatDisplayVF-Italic.CRpusWc8.woff2 +0 -0
  71. /package/dist/{_astro → client/_astro}/RedHatDisplayVF.CYDHf1NI.woff2 +0 -0
  72. /package/dist/{_astro → client/_astro}/RedHatMonoVF-Italic.DGQo2ogW.woff2 +0 -0
  73. /package/dist/{_astro → client/_astro}/RedHatMonoVF.C4fMH6Vz.woff2 +0 -0
  74. /package/dist/{_astro → client/_astro}/RedHatTextVF-Italic.Dkj_WqbA.woff2 +0 -0
  75. /package/dist/{_astro → client/_astro}/RedHatTextVF.wYvZ7prR.woff2 +0 -0
  76. /package/dist/{_astro → client/_astro}/Toolbar.TAdHxLSQ.js +0 -0
  77. /package/dist/{_astro → client/_astro}/_page_.CXyz_BEo.css +0 -0
  78. /package/dist/{_astro → client/_astro}/_page_.DVvr_Mfl.css +0 -0
  79. /package/dist/{_astro → client/_astro}/client.CeeiqVaE.js +0 -0
  80. /package/dist/{_astro → client/_astro}/divider.BSD-oFoh.js +0 -0
  81. /package/dist/{_astro → client/_astro}/fa-solid-900.DguXoeIz.woff2 +0 -0
  82. /package/dist/{_astro → client/_astro}/index.CTH3fVMn.js +0 -0
  83. /package/dist/{_astro → client/_astro}/page.B65lVdBS.js +0 -0
  84. /package/dist/{_astro → client/_astro}/pf-v6-pficon.Dy6oiu9u.woff2 +0 -0
  85. /package/dist/{avatarImg.svg → client/avatarImg.svg} +0 -0
  86. /package/dist/{avatarImgDark.svg → client/avatarImgDark.svg} +0 -0
  87. /package/dist/{content → client/content}/typography/line-height.png +0 -0
  88. /package/dist/{favicon.svg → client/favicon.svg} +0 -0
package/dist/cli/cli.js CHANGED
@@ -8,6 +8,9 @@ import { setFsRootDir } from './setFsRootDir.js';
8
8
  import { createConfigFile } from './createConfigFile.js';
9
9
  import { updatePackageFile } from './updatePackageFile.js';
10
10
  import { getConfig } from './getConfig.js';
11
+ import { symLinkConfig } from './symLinkConfig.js';
12
+ import { buildPropsData } from './buildPropsData.js';
13
+ import { hasFile } from './hasFile.js';
11
14
  function updateContent(program) {
12
15
  const { verbose } = program.opts();
13
16
  if (verbose) {
@@ -15,14 +18,36 @@ function updateContent(program) {
15
18
  }
16
19
  createCollectionContent(astroRoot, `${process.cwd()}/pf-docs.config.mjs`, verbose);
17
20
  }
18
- const astroRoot = import.meta
19
- .resolve('@patternfly/patternfly-doc-core')
20
- .replace('dist/cli/cli.js', '')
21
- .replace('file://', '');
21
+ async function generateProps(program, forceProps = false) {
22
+ const { verbose, props } = program.opts();
23
+ if (!props && !forceProps) {
24
+ return;
25
+ }
26
+ if (verbose) {
27
+ console.log('Verbose mode enabled');
28
+ }
29
+ buildPropsData(currentDir, astroRoot, `${currentDir}/pf-docs.config.mjs`, verbose);
30
+ }
31
+ let astroRoot = '';
32
+ try {
33
+ astroRoot = import.meta
34
+ .resolve('@patternfly/patternfly-doc-core')
35
+ .replace('dist/cli/cli.js', '')
36
+ .replace('file://', '');
37
+ }
38
+ catch (e) {
39
+ if (e.code === 'ERR_MODULE_NOT_FOUND') {
40
+ astroRoot = process.cwd();
41
+ }
42
+ else {
43
+ console.error('Error resolving astroRoot', e);
44
+ }
45
+ }
22
46
  const currentDir = process.cwd();
23
47
  const program = new Command();
24
48
  program.name('pf-doc-core');
25
49
  program.option('--verbose', 'verbose mode', false);
50
+ program.option('--props', 'generate props data', false);
26
51
  program.command('setup').action(async () => {
27
52
  await Promise.all([
28
53
  updatePackageFile(astroRoot, currentDir),
@@ -32,14 +57,20 @@ program.command('setup').action(async () => {
32
57
  });
33
58
  program.command('init').action(async () => {
34
59
  await setFsRootDir(astroRoot, currentDir);
60
+ await symLinkConfig(astroRoot, currentDir);
35
61
  console.log('\nInitialization complete, next update your pf-docs.config.mjs file and then run the `start` script to start the dev server');
36
62
  });
37
63
  program.command('start').action(async () => {
38
64
  updateContent(program);
65
+ // if a props file hasn't been generated yet, but the consumer has propsData, it will cause a runtime error so to
66
+ // prevent that we're just creating a props file regardless of what they say if one doesn't exist yet
67
+ const hasPropsFile = await hasFile(join(astroRoot, 'dist', 'props.json'));
68
+ await generateProps(program, !hasPropsFile);
39
69
  dev({ mode: 'development', root: astroRoot });
40
70
  });
41
71
  program.command('build').action(async () => {
42
72
  updateContent(program);
73
+ await generateProps(program, true);
43
74
  const config = await getConfig(`${currentDir}/pf-docs.config.mjs`);
44
75
  if (!config) {
45
76
  console.error('No config found, please run the `setup` command or manually create a pf-docs.config.mjs file');
@@ -51,6 +82,10 @@ program.command('build').action(async () => {
51
82
  }
52
83
  build({ root: astroRoot, outDir: join(currentDir, config.outputDir) });
53
84
  });
85
+ program.command('generate-props').action(async () => {
86
+ await generateProps(program, true);
87
+ console.log('\nProps data generated');
88
+ });
54
89
  program.command('serve').action(async () => {
55
90
  updateContent(program);
56
91
  preview({ root: astroRoot });
@@ -0,0 +1,4 @@
1
+ import { readFile } from "fs/promises";
2
+ export async function hasFile(path) {
3
+ return readFile(path).then(() => true, () => false);
4
+ }
@@ -0,0 +1,15 @@
1
+ /* eslint-disable no-console */
2
+ import { symlink } from 'fs/promises';
3
+ export async function symLinkConfig(astroRootDir, consumerRootDir) {
4
+ const configFileName = '/pf-docs.config.mjs';
5
+ const docsConfigFile = consumerRootDir + configFileName;
6
+ try {
7
+ await symlink(docsConfigFile, astroRootDir + configFileName);
8
+ }
9
+ catch (e) {
10
+ console.error(`Error creating symlink to ${docsConfigFile} in ${astroRootDir}`, e);
11
+ }
12
+ finally {
13
+ console.log(`Symlink to ${docsConfigFile} in ${astroRootDir} created`);
14
+ }
15
+ }
@@ -16,5 +16,17 @@ export const config = {
16
16
  // name: "react-component-docs",
17
17
  // },
18
18
  ],
19
- outputDir: "./dist/docs"
19
+ navSectionOrder: ["get-started", "design-foundations"],
20
+ outputDir: './dist/docs',
21
+ propsGlobs: [
22
+ // {
23
+ // include: ['*/@patternfly/react-core/src/**/*.tsx'],
24
+ // exclude: [
25
+ // '/**/examples/**',
26
+ // '/**/__mocks__/**',
27
+ // '/**/__tests__/**',
28
+ // '/**/*.test.tsx',
29
+ // ],
30
+ // },
31
+ ],
20
32
  };
@@ -0,0 +1,153 @@
1
+ import { readFile } from 'fs/promises';
2
+ import { parse } from 'react-docgen';
3
+ import ts from 'typescript';
4
+ const annotations = [
5
+ {
6
+ regex: /@deprecated/,
7
+ name: 'deprecated',
8
+ type: 'Boolean',
9
+ },
10
+ {
11
+ regex: /@hide/,
12
+ name: 'hide',
13
+ type: 'Boolean',
14
+ },
15
+ {
16
+ regex: /@beta/,
17
+ name: 'beta',
18
+ type: 'Boolean',
19
+ },
20
+ {
21
+ regex: /@propType\s+(.*)/,
22
+ name: 'type',
23
+ type: 'String',
24
+ },
25
+ ];
26
+ function addAnnotations(prop) {
27
+ if (prop.description) {
28
+ annotations.forEach(({ regex, name }) => {
29
+ const match = prop.description.match(regex);
30
+ if (match) {
31
+ prop.description = prop.description.replace(regex, '').trim();
32
+ if (name) {
33
+ prop[name] = match[2] || match[1] || true;
34
+ }
35
+ }
36
+ });
37
+ }
38
+ return prop;
39
+ }
40
+ function getComponentMetadata(filename, sourceText) {
41
+ let parsedComponents = null;
42
+ try {
43
+ parsedComponents = parse(sourceText, { filename });
44
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
45
+ }
46
+ catch (_err) {
47
+ // eslint-disable-next-line no-console
48
+ // console.warn(`No component found in ${filename}:`, err);
49
+ }
50
+ return (parsedComponents || []).filter((parsed) => parsed && parsed.displayName);
51
+ }
52
+ const getNodeText = (node, sourceText) => {
53
+ if (!node || !node.pos || !node.end) {
54
+ return undefined;
55
+ }
56
+ return sourceText.substring(node.pos, node.end).trim();
57
+ };
58
+ const buildJsDocProps = (nodes, sourceText) => nodes?.reduce((acc, member) => {
59
+ const name = (member.name && member.name.escapedText) ||
60
+ (member.parameters &&
61
+ `[${getNodeText(member.parameters[0], sourceText)}]`) ||
62
+ 'Unknown';
63
+ acc[name] = {
64
+ description: member.jsDoc
65
+ ? member.jsDoc.map((doc) => doc.comment).join('\n')
66
+ : null,
67
+ required: member.questionToken === undefined,
68
+ type: {
69
+ raw: getNodeText(member.type, sourceText).trim(),
70
+ },
71
+ };
72
+ return acc;
73
+ }, {});
74
+ const getSourceFileStatements = (filename, sourceText) => {
75
+ const { statements } = ts.createSourceFile(filename, sourceText, ts.ScriptTarget.Latest);
76
+ return statements;
77
+ };
78
+ const getInterfaceMetadata = (filename, sourceText) => getSourceFileStatements(filename, sourceText).reduce((metaDataAcc, statement) => {
79
+ if (statement.kind === ts.SyntaxKind.InterfaceDeclaration) {
80
+ const _statement = statement;
81
+ metaDataAcc.push({
82
+ displayName: _statement.name.escapedText,
83
+ description: _statement.jsDoc?.map((doc) => doc.comment).join('\n'),
84
+ props: buildJsDocProps(_statement.members, sourceText),
85
+ });
86
+ }
87
+ return metaDataAcc;
88
+ }, []);
89
+ const getTypeAliasMetadata = (filename, sourceText) => getSourceFileStatements(filename, sourceText).reduce((metaDataAcc, statement) => {
90
+ if (statement.kind === ts.SyntaxKind.TypeAliasDeclaration) {
91
+ const _statement = statement;
92
+ const props = _statement.type.types?.reduce((propAcc, type) => {
93
+ if (type.members) {
94
+ propAcc.push(buildJsDocProps(type.members, sourceText));
95
+ }
96
+ return propAcc;
97
+ }, []);
98
+ metaDataAcc.push({
99
+ props,
100
+ displayName: _statement.name.escapedText,
101
+ description: _statement.jsDoc?.map((doc) => doc.comment).join('\n'),
102
+ });
103
+ }
104
+ return metaDataAcc;
105
+ }, []);
106
+ function normalizeProp([name, { required, annotatedType, type, tsType, description, defaultValue },]) {
107
+ const res = {
108
+ name,
109
+ type: annotatedType ||
110
+ (type && type.name) ||
111
+ (type && (type.raw || type.name)) ||
112
+ (tsType && (tsType.raw || tsType.name)) ||
113
+ 'No type info',
114
+ description,
115
+ };
116
+ if (required) {
117
+ res.required = true;
118
+ }
119
+ if (defaultValue && defaultValue.value) {
120
+ res.defaultValue = defaultValue.value;
121
+ }
122
+ return res;
123
+ }
124
+ export async function tsDocgen(file) {
125
+ const sourceText = await readFile(file, 'utf8');
126
+ const componentMeta = getComponentMetadata(file, sourceText); // Array of components with props
127
+ const interfaceMeta = getInterfaceMetadata(file, sourceText); // Array of interfaces with props
128
+ const typeAliasMeta = getTypeAliasMetadata(file, sourceText); // Array of type aliases with props
129
+ const propsMetaMap = [...interfaceMeta, ...typeAliasMeta].reduce(function (target, interfaceOrTypeAlias) {
130
+ target[interfaceOrTypeAlias.displayName] = interfaceOrTypeAlias;
131
+ return target;
132
+ }, {});
133
+ // Go through each component and check if they have an interface or type alias with a jsDoc description
134
+ // If so copy it over (fix for https://github.com/patternfly/patternfly-react/issues/7612)
135
+ componentMeta.forEach((c) => {
136
+ if (c.description) {
137
+ return c;
138
+ }
139
+ const propsName = `${c.displayName}Props`;
140
+ if (propsMetaMap[propsName]?.description) {
141
+ c.description = propsMetaMap[propsName].description;
142
+ }
143
+ });
144
+ return [...componentMeta, ...interfaceMeta, ...typeAliasMeta].map((parsed) => ({
145
+ name: parsed.displayName,
146
+ description: parsed.description || '',
147
+ props: Object.entries(parsed.props || {})
148
+ .map(normalizeProp)
149
+ .map(addAnnotations)
150
+ .filter((prop) => !prop.hide)
151
+ .sort((p1, p2) => p1.name.localeCompare(p2.name)),
152
+ }));
153
+ }
@@ -1 +1 @@
1
- {"root":["../../cli/cli.ts","../../cli/createCollectionContent.ts","../../cli/createConfigFile.ts","../../cli/getConfig.ts","../../cli/setFsRootDir.ts","../../cli/updatePackageFile.ts","../../cli/templates/pf-docs.config.mjs"],"version":"5.6.3"}
1
+ {"root":["../../cli/buildPropsData.ts","../../cli/cli.ts","../../cli/createCollectionContent.ts","../../cli/createConfigFile.ts","../../cli/getConfig.ts","../../cli/hasFile.ts","../../cli/setFsRootDir.ts","../../cli/symLinkConfig.ts","../../cli/tsDocGen.js","../../cli/updatePackageFile.ts","../../cli/templates/pf-docs.config.mjs"],"version":"5.6.3"}
@@ -0,0 +1 @@
1
+ import{f as ee,_ as O,d as h,h as te,v as B,w as J,B as Q,u as xe,g as be,j as y}from"./Button.C3_jB5tC.js";import{r as t}from"./index.CTH3fVMn.js";/* empty css */import{g as Ie,A as Le,a as $,d as ye,P as Ne,m as Ce}from"./divider.BSD-oFoh.js";import{s as F}from"./page.B65lVdBS.js";const i={modifiers:{expanded:"pf-m-expanded",hover:"pf-m-hover",current:"pf-m-current",flyout:"pf-m-flyout",horizontal:"pf-m-horizontal",subnav:"pf-m-subnav",scrollable:"pf-m-scrollable"},nav:"pf-v6-c-nav",navItem:"pf-v6-c-nav__item",navLink:"pf-v6-c-nav__link",navLinkIcon:"pf-v6-c-nav__link-icon",navList:"pf-v6-c-nav__list",navScrollButton:"pf-v6-c-nav__scroll-button",navSubnav:"pf-v6-c-nav__subnav",navToggle:"pf-v6-c-nav__toggle",navToggleIcon:"pf-v6-c-nav__toggle-icon"},Ae={},A=t.createContext(Ae);class w extends t.Component{constructor(){super(...arguments),this.state={isScrollable:!1,ouiaStateId:ee(w.displayName,this.props.variant),flyoutRef:null},this.navRef=t.createRef()}onSelect(e,n,s,a,l,c){l&&e.preventDefault(),this.props.onSelect(e,{groupId:n,itemId:s,to:a}),c&&c(e,s,n,a)}onToggle(e,n,s){this.props.onToggle(e,{groupId:n,isExpanded:s})}render(){const e=this.props,{"aria-label":n,children:s,className:a,onSelect:l,onToggle:c,ouiaId:d,ouiaSafe:r,variant:p}=e,m=O(e,["aria-label","children","className","onSelect","onToggle","ouiaId","ouiaSafe","variant"]),v=["horizontal","horizontal-subnav"].includes(p);return t.createElement(A.Provider,{value:{onSelect:(g,I,E,R,N,P)=>this.onSelect(g,I,E,R,N,P),onToggle:(g,I,E)=>this.onToggle(g,I,E),updateIsScrollable:g=>this.setState({isScrollable:g}),isHorizontal:["horizontal","horizontal-subnav"].includes(p),flyoutRef:this.state.flyoutRef,setFlyoutRef:g=>this.setState({flyoutRef:g}),navRef:this.navRef}},t.createElement("nav",Object.assign({className:h(i.nav,v&&i.modifiers.horizontal,p==="horizontal-subnav"&&i.modifiers.subnav,this.state.isScrollable&&i.modifiers.scrollable,a),"aria-label":n||(p==="horizontal-subnav"?"Local":"Global"),ref:this.navRef},te(w.displayName,d!==void 0?d:this.state.ouiaStateId,r),m),s))}}w.displayName="Nav";w.defaultProps={onSelect:()=>{},onToggle:()=>{},ouiaSafe:!0};const we={isSidebarOpen:!0},M=t.createContext(we);class U extends t.Component{constructor(){super(...arguments),this.direction="ltr",this.state={scrollViewAtStart:!1,scrollViewAtEnd:!1},this.navList=t.createRef(),this.observer=()=>{},this.handleScrollButtons=()=>{const e=this.navList.current;if(e){const n=B(e,e.firstChild),s=B(e,e.lastChild);this.setState({scrollViewAtStart:n,scrollViewAtEnd:s}),this.context.updateIsScrollable(!n||!s)}},this.scrollBack=()=>{const e=this.navList.current;if(e){const n=Array.from(e.children);let s,a;for(let l=0;l<n.length&&!s;l++)B(e,n[l])&&(s=n[l],a=n[l-1]);a&&(this.direction==="ltr"?e.scrollLeft-=a.scrollWidth:e.scrollLeft+=a.scrollWidth),this.handleScrollButtons()}},this.scrollForward=()=>{const e=this.navList.current;if(e){const n=Array.from(e.children);let s,a;for(let l=n.length-1;l>=0&&!s;l--)B(e,n[l])&&(s=n[l],a=n[l+1]);a&&(this.direction==="ltr"?e.scrollLeft+=a.scrollWidth:e.scrollLeft-=a.scrollWidth),this.handleScrollButtons()}}}componentDidMount(){this.observer=Ie(this.navList.current,this.handleScrollButtons),this.direction=J(this.navList.current),this.handleScrollButtons()}componentWillUnmount(){this.observer()}componentDidUpdate(){this.direction=J(this.navList.current)}render(){const e=this.props,{children:n,className:s,backScrollAriaLabel:a,forwardScrollAriaLabel:l}=e,c=O(e,["children","className","backScrollAriaLabel","forwardScrollAriaLabel"]),{scrollViewAtStart:d,scrollViewAtEnd:r}=this.state;return t.createElement(A.Consumer,null,({isHorizontal:p})=>t.createElement(M.Consumer,null,({isSidebarOpen:m})=>t.createElement(t.Fragment,null,p&&(!d||!r)&&t.createElement("div",{className:h(i.navScrollButton)},t.createElement(Q,{variant:"plain","aria-label":a,onClick:this.scrollBack,isDisabled:d,tabIndex:m?null:-1,icon:t.createElement(Le,null)})),t.createElement("ul",Object.assign({ref:this.navList,className:h(i.navList,s),onScroll:this.handleScrollButtons,role:"list"},c),n),p&&(!d||!r)&&t.createElement("div",{className:h(i.navScrollButton)},t.createElement(Q,{variant:"plain","aria-label":l,onClick:this.scrollForward,isDisabled:r,tabIndex:m?null:-1,icon:t.createElement($,null)})))))}}U.displayName="NavList";U.contextType=A;U.defaultProps={backScrollAriaLabel:"Scroll back",forwardScrollAriaLabel:"Scroll foward"};const W=o=>{var{children:e,styleChildren:n=!0,className:s,to:a,isActive:l=!1,groupId:c=null,itemId:d=null,preventDefault:r=!1,onClick:p,component:m="a",flyout:v,onShowFlyout:g,ouiaId:I,ouiaSafe:E,zIndex:R=9999,icon:N}=o,P=O(o,["children","styleChildren","className","to","isActive","groupId","itemId","preventDefault","onClick","component","flyout","onShowFlyout","ouiaId","ouiaSafe","zIndex","icon"]);const{flyoutRef:T,setFlyoutRef:j,navRef:V}=t.useContext(A),{isSidebarOpen:re}=t.useContext(M),[z,ie]=t.useState(null),[ce,H]=t.useState(!1),L=t.useRef(),x=L===T,C=t.useRef(),S=v!==void 0,de=S?"button":m;a&&S&&console.error('NavItem cannot have both "to" and "flyout" props.');const D=(u,f)=>{(!x||f)&&u?j(L):(x||f)&&!u&&j(null),g&&u&&g()},ue=u=>{const f=u.target.closest(`.${i.navItem}.pf-m-flyout`);S&&!x?D(!0):T!==null&&!f&&j(null)},q=u=>{u.target.closest(".pf-m-flyout")||(S?D(!1,!0):T!==null&&j(null))},pe=u=>{var f,b;const k=u.key,K=u.target;(k===" "||k==="Enter"||k==="ArrowRight")&&S&&(!((f=L?.current)===null||f===void 0)&&f.contains(K))&&(u.stopPropagation(),u.preventDefault(),x||(D(!0),ie(K))),(k==="Escape"||k==="ArrowLeft")&&((b=C?.current)===null||b===void 0?void 0:b.querySelectorAll(`.${Ce.menu}`).length)===1&&x&&(u.stopPropagation(),u.preventDefault(),D(!1))};t.useEffect(()=>(S&&window.addEventListener("click",q),()=>{S&&window.removeEventListener("click",q)}),[]),t.useEffect(()=>{z&&(x?Array.from(C.current.getElementsByTagName("UL")[0].children).filter(f=>!(f.classList.contains("pf-m-disabled")||f.classList.contains(ye.divider)))[0].firstChild.focus():z.focus())},[x,z]);const X=t.createElement("span",{className:h(i.navToggle)},t.createElement("span",{className:h(i.navToggleIcon)},t.createElement($,{"aria-hidden":!0}))),fe={"aria-haspopup":"menu","aria-expanded":x},G=re?null:-1,me=u=>{const f=r||!a;return t.createElement(de,Object.assign({href:a,onClick:b=>u.onSelect(b,c,d,a,f,p),className:h(i.navLink,l&&i.modifiers.current,ce&&i.modifiers.hover,s),"aria-current":l?"page":null,tabIndex:G},S&&Object.assign({},fe),P),N&&t.createElement("span",{className:h(i.navLinkIcon)},N),t.createElement("span",{className:h(`${i.nav}__link-text`)},e),v&&X)},he=(u,f)=>t.cloneElement(f,Object.assign(Object.assign({onClick:b=>u.onSelect(b,c,d,a,r,p),"aria-current":l?"page":null},n&&{className:h(i.navLink,l&&i.modifiers.current,f.props&&f.props.className)}),{tabIndex:f.props.tabIndex||G,children:S?t.createElement(t.Fragment,null,f.props.children,X):f.props.children})),ve=xe(W.displayName,I,E),ge=()=>{H(!0)},Se=()=>{H(!1)},Ee=t.createElement(Ne,{triggerRef:L,popper:t.createElement("div",{ref:C,onMouseEnter:ge,onMouseLeave:Se},v),popperRef:C,placement:"right-start",isVisible:x,onDocumentKeyDown:pe,zIndex:R,appendTo:V?.current});return t.createElement(t.Fragment,null,t.createElement("li",Object.assign({onMouseOver:ue,className:h(i.navItem,S&&i.modifiers.flyout,s),ref:L},ve),t.createElement(A.Consumer,null,u=>t.isValidElement(e)?he(u,e):me(u))),v&&Ee)};W.displayName="NavItem";class _ extends t.Component{constructor(){super(...arguments),this.id=this.props.id||be(),this.state={expandedState:this.props.isExpanded,ouiaStateId:ee(_.displayName)},this.onExpand=(e,n)=>{const{expandedState:s}=this.state;if(this.props.onExpand)this.props.onExpand(e,!s);else{this.setState(l=>({expandedState:!l.expandedState}));const{groupId:a}=this.props;n(e,a,!s)}}}componentDidMount(){this.setState({expandedState:this.props.isExpanded})}componentDidUpdate(e){this.props.isExpanded!==e.isExpanded&&this.setState({expandedState:this.props.isExpanded})}render(){const e=this.props,{title:n,srText:s,children:a,className:l,isActive:c,ouiaId:d,groupId:r,id:p,isExpanded:m,buttonProps:v,onExpand:g}=e,I=O(e,["title","srText","children","className","isActive","ouiaId","groupId","id","isExpanded","buttonProps","onExpand"]),{expandedState:E,ouiaStateId:R}=this.state;return t.createElement(A.Consumer,null,N=>t.createElement("li",Object.assign({className:h(i.navItem,E&&i.modifiers.expanded,c&&i.modifiers.current,l)},te(_.displayName,d!==void 0?d:R),I),t.createElement(M.Consumer,null,({isSidebarOpen:P})=>t.createElement("button",Object.assign({className:h(i.navLink),id:s?null:this.id,onClick:T=>this.onExpand(T,N.onToggle),"aria-expanded":E,tabIndex:P?null:-1},v),typeof n!="string"?t.createElement("span",{className:h(`${i.nav}__link-text`)},n):n,t.createElement("span",{className:h(i.navToggle)},t.createElement("span",{className:h(i.navToggleIcon)},t.createElement($,{"aria-hidden":"true"}))))),t.createElement("section",{className:h(i.navSubnav),"aria-labelledby":this.id,hidden:E?null:!0},s&&t.createElement("h2",{className:"pf-v6-screen-reader",id:this.id},s),t.createElement("ul",{className:h(i.navList),role:"list"},a))))}}_.displayName="NavExpandable";_.defaultProps={srText:"",isExpanded:!1,children:"",className:"",groupId:null,isActive:!1,id:""};const ne=o=>{var{children:e,className:n,usePageInsets:s,isFilled:a,isContextSelector:l}=o,c=O(o,["children","className","usePageInsets","isFilled","isContextSelector"]);return t.createElement("div",Object.assign({className:h(F.pageSidebarBody,s&&F.modifiers.pageInsets,a===!1&&F.modifiers.noFill,a===!0&&F.modifiers.fill,l===!0&&F.modifiers.contextSelector,n)},c),e)};ne.displayName="PageSidebarBody";const _e=/([\p{Ll}\d])(\p{Lu})/gu,Re=/(\p{Lu})([\p{Lu}][\p{Ll}])/gu,Pe=/(\d)\p{Ll}|(\p{L})\d/u,Te=/[^\p{L}\d]+/giu,Y="$1\0$2",Z="";function se(o){let e=o.trim();e=e.replace(_e,Y).replace(Re,Y),e=e.replace(Te,"\0");let n=0,s=e.length;for(;e.charAt(n)==="\0";)n++;if(n===s)return[];for(;e.charAt(s-1)==="\0";)s--;return e.slice(n,s).split(/\0/g)}function ke(o){const e=se(o);for(let n=0;n<e.length;n++){const s=e[n],a=Pe.exec(s);if(a){const l=a.index+(a[1]??a[2]).length;e.splice(n,1,s.slice(0,l),s.slice(l))}}return e}function Fe(o,e){const[n,s,a]=oe(o,e);return n+s.map(le(e?.locale)).join(e?.delimiter??" ")+a}function ae(o,e){return Fe(o,{delimiter:"-",...e})}function Oe(o,e){const[n,s,a]=oe(o,e),l=le(e?.locale),c=je(e?.locale),d=De(l,c);return n+s.map((r,p)=>p===0?d(r):l(r)).join(" ")+a}function le(o){return o===!1?e=>e.toLowerCase():e=>e.toLocaleLowerCase(o)}function je(o){return e=>e.toLocaleUpperCase(o)}function De(o,e){return n=>`${e(n[0])}${o(n.slice(1))}`}function oe(o,e={}){const n=e.split??(e.separateNumbers?ke:se),s=e.prefixCharacters??Z,a=e.suffixCharacters??Z;let l=0,c=o.length;for(;l<o.length;){const d=o.charAt(l);if(!s.includes(d))break;l++}for(;c>l;){const d=c-1,r=o.charAt(d);if(!a.includes(r))break;c=d}return[o.slice(0,l),n(o.slice(l,c)),o.slice(c)]}const Be=({entry:o,isActive:e})=>{const{id:n}=o,{id:s,section:a}=o.data,l=a==="components"||a==="layouts"?ae(s):n;return y.jsx(W,{itemId:l,to:`/${a}/${l}`,isActive:e,id:`nav-entry-${l}`,children:s})},Ue=({entries:o,sectionId:e,activeItem:n})=>{const s=window.location.pathname.includes(e),a=o.sort((r,p)=>r.data.id.localeCompare(p.data.id)),l=a.some(r=>r.id===n);let c=a;(e==="components"||e==="layouts")&&(c=[...a.reduce((r,p)=>(r.has(p.data.id)||r.set(p.data.id,p),r),new Map).values()]);const d=c.map(r=>y.jsx(Be,{entry:r,isActive:n===r.id||window.location.pathname.includes(ae(r.data.id))},r.id));return y.jsx(_,{title:Oe(e),isActive:l,isExpanded:s,id:`nav-section-${e}`,children:d})},qe=({navEntries:o,navSectionOrder:e})=>{const[n,s]=t.useState("");t.useEffect(()=>{s(window.location.pathname.split("/").reverse()[0])},[]);const a=(m,v)=>{s(v.itemId.toString())},l=Array.from(new Set(o.map(m=>m.data.section))),[c,d]=l.reduce((m,v)=>{if(!e)return m[1].push(v),m;const g=e.indexOf(v);return g>-1?m[0][g]=v:m[1].push(v),m},[[],[]]),p=[...c,...d.sort()].map(m=>{const v=o.filter(g=>g.data.section===m);return y.jsx(Ue,{entries:v,sectionId:m,activeItem:n},m)});return y.jsx(ne,{id:"page-sidebar-body",children:y.jsx(w,{onSelect:a,children:y.jsx(U,{children:p})})})};export{qe as Navigation};