@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.
- package/.astro/collections/textContent.schema.json +6 -0
- package/README.md +11 -10
- package/astro.config.mjs +8 -1
- package/cli/buildPropsData.ts +113 -0
- package/cli/cli.ts +54 -6
- package/cli/getConfig.ts +6 -0
- package/cli/hasFile.ts +5 -0
- package/cli/symLinkConfig.ts +21 -0
- package/cli/templates/pf-docs.config.mjs +14 -2
- package/cli/tsDocGen.js +199 -0
- package/dist/cli/buildPropsData.js +68 -0
- package/dist/cli/cli.js +39 -4
- package/dist/cli/hasFile.js +4 -0
- package/dist/cli/symLinkConfig.js +15 -0
- package/dist/cli/templates/pf-docs.config.mjs +13 -1
- package/dist/cli/tsDocGen.js +153 -0
- package/dist/cli/tsconfig.tsbuildinfo +1 -1
- package/dist/client/_astro/Navigation.75VF_8AW.js +1 -0
- package/dist/client/_astro/_page_.SnUmZn2y.css +1 -0
- package/dist/client/design-foundations/typography/index.html +219 -0
- package/dist/client/design-foundations/usage-and-behavior/index.html +368 -0
- package/dist/client/get-started/contribute/index.html +115 -0
- package/dist/client/index.html +42 -0
- package/dist/server/_@astrojs-ssr-adapter.mjs +1 -0
- package/dist/server/_noop-middleware.mjs +3 -0
- package/dist/server/chunks/PropsTables_D_v4KAMn.mjs +1826 -0
- package/dist/server/chunks/_@astrojs-ssr-adapter_ByVMUK8O.mjs +3621 -0
- package/dist/server/chunks/_astro_assets_CLOMnm-3.mjs +1507 -0
- package/dist/server/chunks/_astro_data-layer-content_DDGBHvtb.mjs +1 -0
- package/dist/server/chunks/angle-down-icon_BNJvzYv-.mjs +3970 -0
- package/dist/server/chunks/astro/server_D4f31GMD.mjs +2769 -0
- package/dist/server/chunks/astro-designed-error-pages_CpHpbfhr.mjs +282 -0
- package/dist/server/chunks/consts_BmVDRGlB.mjs +32 -0
- package/dist/server/chunks/content-assets_DleWbedO.mjs +1 -0
- package/dist/server/chunks/content-modules_Dz-S_Wwv.mjs +1 -0
- package/dist/server/chunks/path_Cvt6sEOY.mjs +58 -0
- package/dist/server/chunks/sharp_BYpUyJGL.mjs +88 -0
- package/dist/server/entry.mjs +45 -0
- package/dist/server/manifest_CBenwYiZ.mjs +102 -0
- package/dist/server/pages/_image.astro.mjs +132 -0
- package/dist/server/pages/_section_/_---page_.astro.mjs +1 -0
- package/dist/server/pages/_section_/_page_/_---tab_.astro.mjs +1 -0
- package/dist/server/pages/index.astro.mjs +1 -0
- package/dist/server/pages/props.astro.mjs +25 -0
- package/dist/server/renderers.mjs +259 -0
- package/jest.config.ts +1 -1
- package/package.json +4 -1
- package/pf-docs.config.mjs +31 -0
- package/src/components/Navigation.astro +15 -4
- package/src/components/Navigation.tsx +26 -2
- package/src/components/PropsTable.tsx +3 -3
- package/src/components/PropsTables.astro +38 -0
- package/src/content.config.ts +1 -0
- package/src/pages/[section]/[...page].astro +16 -8
- package/src/pages/[section]/[page]/[...tab].astro +4 -1
- package/src/pages/props.ts +17 -0
- package/src/pf-docs.config.mjs +21 -0
- package/textContent/contribute.md +1 -0
- package/dist/_astro/Navigation.Cede__Ud.js +0 -1
- package/dist/design-foundations/typography/index.html +0 -193
- package/dist/design-foundations/usage-and-behavior/index.html +0 -342
- package/dist/get-started/contribute/index.html +0 -89
- package/dist/index.html +0 -42
- /package/dist/{PF-HorizontalLogo-Color.svg → client/PF-HorizontalLogo-Color.svg} +0 -0
- /package/dist/{PF-HorizontalLogo-Reverse.svg → client/PF-HorizontalLogo-Reverse.svg} +0 -0
- /package/dist/{_astro → client/_astro}/Button.C3_jB5tC.js +0 -0
- /package/dist/{_astro → client/_astro}/ClientRouter.astro_astro_type_script_index_0_lang.Cainpjm5.js +0 -0
- /package/dist/{_astro → client/_astro}/PageContext.C7BqCh9N.js +0 -0
- /package/dist/{_astro → client/_astro}/PageToggle.DDEjruql.js +0 -0
- /package/dist/{_astro → client/_astro}/RedHatDisplayVF-Italic.CRpusWc8.woff2 +0 -0
- /package/dist/{_astro → client/_astro}/RedHatDisplayVF.CYDHf1NI.woff2 +0 -0
- /package/dist/{_astro → client/_astro}/RedHatMonoVF-Italic.DGQo2ogW.woff2 +0 -0
- /package/dist/{_astro → client/_astro}/RedHatMonoVF.C4fMH6Vz.woff2 +0 -0
- /package/dist/{_astro → client/_astro}/RedHatTextVF-Italic.Dkj_WqbA.woff2 +0 -0
- /package/dist/{_astro → client/_astro}/RedHatTextVF.wYvZ7prR.woff2 +0 -0
- /package/dist/{_astro → client/_astro}/Toolbar.TAdHxLSQ.js +0 -0
- /package/dist/{_astro → client/_astro}/_page_.CXyz_BEo.css +0 -0
- /package/dist/{_astro → client/_astro}/_page_.DVvr_Mfl.css +0 -0
- /package/dist/{_astro → client/_astro}/client.CeeiqVaE.js +0 -0
- /package/dist/{_astro → client/_astro}/divider.BSD-oFoh.js +0 -0
- /package/dist/{_astro → client/_astro}/fa-solid-900.DguXoeIz.woff2 +0 -0
- /package/dist/{_astro → client/_astro}/index.CTH3fVMn.js +0 -0
- /package/dist/{_astro → client/_astro}/page.B65lVdBS.js +0 -0
- /package/dist/{_astro → client/_astro}/pf-v6-pficon.Dy6oiu9u.woff2 +0 -0
- /package/dist/{avatarImg.svg → client/avatarImg.svg} +0 -0
- /package/dist/{avatarImgDark.svg → client/avatarImgDark.svg} +0 -0
- /package/dist/{content → client/content}/typography/line-height.png +0 -0
- /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
|
-
|
|
19
|
-
.
|
|
20
|
-
|
|
21
|
-
|
|
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,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
|
-
|
|
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};
|