@patternfly/patternfly-doc-core 1.0.0 → 1.0.2

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 (44) hide show
  1. package/.astro/data-store.json +1 -0
  2. package/.astro/settings.json +5 -0
  3. package/.github/workflows/build.yml +1 -1
  4. package/.vscode/launch.json +22 -0
  5. package/dist/_astro/Navigation.BBuu_1_L.js +1 -0
  6. package/dist/_astro/PageContext.DIMIWrWv.js +9 -0
  7. package/dist/_astro/{PageToggle.jHn9PsTr.js → PageToggle.jNCPBUqq.js} +1 -1
  8. package/dist/_astro/Toolbar.jxsDq7xe.js +1 -0
  9. package/dist/_astro/{divider.DrQDtXS2.js → divider.Db64YCZ6.js} +1 -1
  10. package/dist/cli/tsconfig.tsbuildinfo +1 -1
  11. package/dist/design-foundations/typography/index.html +2 -2
  12. package/dist/design-foundations/usage-and-behavior/index.html +2 -2
  13. package/dist/get-started/contribute/index.html +2 -2
  14. package/dist/index.html +2 -2
  15. package/eslint.config.mjs +1 -1
  16. package/package.json +1 -1
  17. package/src/components/Toolbar.astro +1 -1
  18. package/src/components/Toolbar.tsx +20 -147
  19. package/src/components/toolbar/DocumentReleaseDropdown.tsx +72 -0
  20. package/src/components/toolbar/SearchComponent.tsx +38 -0
  21. package/src/components/toolbar/ToogleThemeSwitcher.tsx +51 -0
  22. package/src/layouts/Main.astro +11 -0
  23. package/src/pages/index.astro +1 -1
  24. package/src/types.ts +9 -0
  25. package/src/utils/theme.ts +20 -0
  26. package/src/versions.json +1404 -0
  27. package/.history/package_20250227163130.json +0 -97
  28. package/.history/package_20250227163527.json +0 -97
  29. package/.history/package_20250227163646.json +0 -97
  30. package/.history/package_20250227163651.json +0 -97
  31. package/.history/package_20250227163654.json +0 -97
  32. package/.history/package_20250227163657.json +0 -97
  33. package/.history/package_20250227163659.json +0 -97
  34. package/.history/package_20250227164608.json +0 -97
  35. package/.history/package_20250227164611.json +0 -97
  36. package/.history/package_20250227164616.json +0 -98
  37. package/dist/_astro/Navigation.BoL0fVlO.js +0 -1
  38. package/dist/_astro/PageContext.CGSBAxAd.js +0 -9
  39. package/dist/_astro/Toolbar.BI0orElX.js +0 -1
  40. package/src/components/Breadcrumbs.astro +0 -10
  41. package/src/components/KebabDropdownItems.astro +0 -14
  42. package/src/components/KebabDropdownItems.tsx +0 -15
  43. package/src/components/UserDropdownItems.astro +0 -9
  44. package/src/components/UserDropdownItems.tsx +0 -10
@@ -1,60 +1,18 @@
1
1
  import * as React from 'react'
2
- import { useState } from 'react'
3
2
  import {
4
- Avatar,
5
3
  Button,
6
- ButtonVariant,
7
- Divider,
8
- Dropdown,
9
- DropdownGroup,
10
- DropdownList,
11
- MenuToggle,
12
- type MenuToggleElement,
13
4
  Toolbar as PFToolbar,
14
5
  ToolbarContent,
15
6
  ToolbarGroup,
16
7
  ToolbarItem,
17
8
  } from '@patternfly/react-core'
18
- import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon'
19
- import CogIcon from '@patternfly/react-icons/dist/esm/icons/cog-icon'
20
- import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon'
21
- import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon'
22
9
 
23
- import imgAvatar from '/avatarImg.svg?url'
10
+ import { ToggleThemeSwitcher } from './toolbar/ToogleThemeSwitcher'
11
+ import { SearchComponent } from './toolbar/SearchComponent'
12
+ import { DocumentReleaseDropdown } from './toolbar/DocumentReleaseDropdown';
13
+ import GithubIcon from '@patternfly/react-icons/dist/esm/icons/github-icon';
24
14
 
25
- import { KebabDropdownItems } from './KebabDropdownItems'
26
- import { UserDropdownItems } from './UserDropdownItems'
27
-
28
- export const Toolbar: React.FunctionComponent = () => {
29
- const [isDropdownOpen, setIsDropdownOpen] = useState(false)
30
- const [isKebabDropdownOpen, setIsKebabDropdownOpen] = useState(false)
31
- const [isFullKebabDropdownOpen, setIsFullKebabDropdownOpen] = useState(false)
32
-
33
- const onDropdownToggle = () => {
34
- setIsDropdownOpen(!isDropdownOpen)
35
- }
36
-
37
- const onDropdownSelect = () => {
38
- setIsDropdownOpen(false)
39
- }
40
-
41
- const onKebabDropdownToggle = () => {
42
- setIsKebabDropdownOpen(!isKebabDropdownOpen)
43
- }
44
-
45
- const onKebabDropdownSelect = () => {
46
- setIsKebabDropdownOpen(false)
47
- }
48
-
49
- const onFullKebabDropdownToggle = () => {
50
- setIsFullKebabDropdownOpen(!isFullKebabDropdownOpen)
51
- }
52
-
53
- const onFullKebabDropdownSelect = () => {
54
- setIsFullKebabDropdownOpen(false)
55
- }
56
-
57
- return (
15
+ export const Toolbar: React.FunctionComponent = () => (
58
16
  <PFToolbar id="toolbar" isStatic>
59
17
  <ToolbarContent>
60
18
  <ToolbarGroup
@@ -63,111 +21,26 @@ export const Toolbar: React.FunctionComponent = () => {
63
21
  gap={{ default: 'gapNone', md: 'gapMd' }}
64
22
  >
65
23
  <ToolbarItem>
66
- <Button
67
- aria-label="Notifications"
68
- variant={ButtonVariant.plain}
69
- icon={<BellIcon />}
70
- />
24
+ <ToggleThemeSwitcher/>
71
25
  </ToolbarItem>
72
- <ToolbarGroup
73
- variant="action-group-plain"
74
- visibility={{ default: 'hidden', lg: 'visible' }}
75
- >
76
- <ToolbarItem>
77
- <Button
78
- aria-label="Settings"
79
- variant={ButtonVariant.plain}
80
- icon={<CogIcon />}
81
- />
82
- </ToolbarItem>
83
- <ToolbarItem>
84
- <Button
85
- aria-label="Help"
86
- variant={ButtonVariant.plain}
87
- icon={<QuestionCircleIcon />}
88
- />
89
- </ToolbarItem>
90
- </ToolbarGroup>
91
- <ToolbarItem
92
- visibility={{ default: 'hidden', md: 'visible', lg: 'hidden' }}
93
- >
94
- <Dropdown
95
- isOpen={isKebabDropdownOpen}
96
- onSelect={onKebabDropdownSelect}
97
- onOpenChange={(isOpen: boolean) => setIsKebabDropdownOpen(isOpen)}
98
- popperProps={{ position: 'right' }}
99
- toggle={(toggleRef: React.Ref<MenuToggleElement>) => (
100
- <MenuToggle
101
- ref={toggleRef}
102
- onClick={onKebabDropdownToggle}
103
- isExpanded={isKebabDropdownOpen}
104
- variant="plain"
105
- aria-label="Settings and help"
106
- >
107
- <EllipsisVIcon aria-hidden="true" />
108
- </MenuToggle>
109
- )}
110
- >
111
- <DropdownList>
112
- <KebabDropdownItems />
113
- </DropdownList>
114
- </Dropdown>
26
+ <ToolbarItem>
27
+ <SearchComponent/>
115
28
  </ToolbarItem>
116
- <ToolbarItem visibility={{ md: 'hidden' }}>
117
- <Dropdown
118
- isOpen={isFullKebabDropdownOpen}
119
- onSelect={onFullKebabDropdownSelect}
120
- onOpenChange={(isOpen: boolean) =>
121
- setIsFullKebabDropdownOpen(isOpen)
122
- }
123
- popperProps={{ position: 'right' }}
124
- toggle={(toggleRef: React.Ref<MenuToggleElement>) => (
125
- <MenuToggle
126
- ref={toggleRef}
127
- onClick={onFullKebabDropdownToggle}
128
- isExpanded={isFullKebabDropdownOpen}
129
- variant="plain"
130
- aria-label="Toolbar menu"
131
- >
132
- <EllipsisVIcon aria-hidden="true" />
133
- </MenuToggle>
134
- )}
29
+ <ToolbarItem>
30
+ <Button
31
+ component="a"
32
+ variant="plain"
33
+ href="//github.com/patternfly"
34
+ target="top"
35
+ aria-label="PatternFly GitHub page"
135
36
  >
136
- <DropdownGroup key="group 2" aria-label="User actions">
137
- <DropdownList>
138
- <UserDropdownItems />
139
- </DropdownList>
140
- </DropdownGroup>
141
- <Divider />
142
- <DropdownList>
143
- <KebabDropdownItems />
144
- </DropdownList>
145
- </Dropdown>
37
+ <GithubIcon />
38
+ </Button>
39
+ </ToolbarItem>
40
+ <ToolbarItem>
41
+ <DocumentReleaseDropdown/>
146
42
  </ToolbarItem>
147
43
  </ToolbarGroup>
148
- <ToolbarItem visibility={{ default: 'hidden', md: 'visible' }}>
149
- <Dropdown
150
- isOpen={isDropdownOpen}
151
- onSelect={onDropdownSelect}
152
- onOpenChange={(isOpen: boolean) => setIsDropdownOpen(isOpen)}
153
- popperProps={{ position: 'right' }}
154
- toggle={(toggleRef: React.Ref<MenuToggleElement>) => (
155
- <MenuToggle
156
- ref={toggleRef}
157
- onClick={onDropdownToggle}
158
- isExpanded={isDropdownOpen}
159
- icon={<Avatar src={imgAvatar} alt="" size="sm" />}
160
- >
161
- Ned Username
162
- </MenuToggle>
163
- )}
164
- >
165
- <DropdownList>
166
- <UserDropdownItems />
167
- </DropdownList>
168
- </Dropdown>
169
- </ToolbarItem>
170
44
  </ToolbarContent>
171
45
  </PFToolbar>
172
46
  )
173
- }
@@ -0,0 +1,72 @@
1
+ import React from 'react'
2
+ import {
3
+ Dropdown,
4
+ DropdownList,
5
+ MenuToggle,
6
+ DropdownGroup,
7
+ DropdownItem,
8
+ Divider,
9
+ } from '@patternfly/react-core'
10
+ import { Release } from '../../types'
11
+ import versions from '../../versions.json'
12
+
13
+ export const DocumentReleaseDropdown: React.FunctionComponent = () => {
14
+ const latestRelease = versions.Releases.find(
15
+ (release) => release.latest,
16
+ ) as Release
17
+ const previousReleases = Object.values(versions.Releases).filter(
18
+ (release) => !release.hidden && !release.latest,
19
+ ) as Release []
20
+
21
+ const previousVersions = Object.values(versions.ArchivedReleases) as Release[];
22
+
23
+ const [isDropdownOpen, setDropdownOpen] = React.useState(false)
24
+
25
+ const getDropdownItem = (version: Release, isLatest = false) => (
26
+ <DropdownItem
27
+ itemId={`${version.name}-latest-release`}
28
+ key={`${version.name}-latest`}
29
+ // eslint-disable-next-line no-nested-ternary
30
+ to={isLatest ? '/' : version.href ? version.href : `/${version.name}`}
31
+ isExternalLink = {version.href ? true : false}
32
+ >
33
+ {`Release ${version.name}`}
34
+ </DropdownItem>
35
+ )
36
+ return (
37
+ <Dropdown
38
+ onSelect={() => setDropdownOpen(!isDropdownOpen)}
39
+ onOpenChange={(isOpen) => setDropdownOpen(isOpen)}
40
+ isOpen={isDropdownOpen}
41
+ toggle={(toggleRef) => (
42
+ <MenuToggle
43
+ ref={toggleRef}
44
+ onClick={() => setDropdownOpen(!isDropdownOpen)}
45
+ isExpanded={isDropdownOpen}
46
+ >
47
+ {`Release ${latestRelease.name}`}
48
+ </MenuToggle>
49
+ )}
50
+ popperProps={{ position: 'right' }}
51
+ >
52
+ <DropdownGroup key="Latest" label="Latest">
53
+ <DropdownList>{getDropdownItem(latestRelease, true)}</DropdownList>
54
+ </DropdownGroup>
55
+ {previousReleases.length > 0 && (
56
+ <DropdownGroup key="Previous releases" label="Previous releases">
57
+ <DropdownList>
58
+ {previousReleases
59
+ .slice(0, 3)
60
+ .map((version) => getDropdownItem(version))}
61
+ </DropdownList>
62
+ </DropdownGroup>
63
+ )}
64
+ {previousVersions.length > 0 && (
65
+ <><Divider key="divider1" /><DropdownGroup key="Previous versions" label="Previous versions">
66
+ <DropdownList>
67
+ {previousVersions.map((version) => getDropdownItem(version))}
68
+ </DropdownList>
69
+ </DropdownGroup></>)}
70
+ </Dropdown>
71
+ )
72
+ }
@@ -0,0 +1,38 @@
1
+ import React from 'react';
2
+ import { SearchInput } from '@patternfly/react-core';
3
+
4
+ interface SearchComponentProps {
5
+ /* Indicates if search compoonent should be visible or not. */
6
+ searchEnabled?: boolean
7
+ }
8
+
9
+ export const SearchComponent : React.FunctionComponent<SearchComponentProps> = ({searchEnabled = true}) => {
10
+ const [searchValue, setSearchValue] = React.useState('');
11
+ const [isSearchExpanded, setIsSearchExpanded] = React.useState(false);
12
+
13
+ //TODO: Add search for algolia or alternative search to this component.
14
+
15
+ const onChange = (_evt: any, value: any) => {
16
+ setSearchValue(value);
17
+ };
18
+
19
+ const onToggleExpand = (_evt: any, isSearchExpanded: boolean) => {
20
+ setIsSearchExpanded(!isSearchExpanded);
21
+ };
22
+
23
+
24
+ return (
25
+ searchEnabled && <SearchInput
26
+ className="ws-global-search"
27
+ placeholder="Search"
28
+ value={searchValue}
29
+ onChange={onChange}
30
+ onClear={(_evt) => onChange(_evt, '')}
31
+ expandableInput={{
32
+ isExpanded: isSearchExpanded,
33
+ onToggleExpand,
34
+ toggleAriaLabel: 'Expandable search input toggle'
35
+ }}
36
+ />
37
+ )
38
+ }
@@ -0,0 +1,51 @@
1
+ import React from 'react'
2
+ import { Icon, ToggleGroup, ToggleGroupItem } from '@patternfly/react-core'
3
+ import MoonIcon from '@patternfly/react-icons/dist/esm/icons/moon-icon'
4
+ import SunIcon from '@patternfly/react-icons/dist/esm/icons/sun-icon'
5
+ import { getThemePreference, updateThemePreference } from '../../utils/theme'
6
+
7
+ export const ToggleThemeSwitcher: React.FunctionComponent = () => {
8
+ const [isDarkTheme, setIsDarkTheme] = React.useState(false);
9
+
10
+ React.useEffect(() => {
11
+ // const darkTheme = window?.localStorage?.getItem('darkMode') === 'true' ? true : false;
12
+ // const html = document.querySelector('html') as HTMLHtmlElement
13
+ // html.classList.toggle('pf-v6-theme-dark', darkTheme)
14
+ const darkTheme = getThemePreference() === 'dark';
15
+ setIsDarkTheme(darkTheme);
16
+ }, []);
17
+
18
+ const toggleDarkTheme = (_evt: unknown, selected: boolean) => {
19
+ const darkThemeToggleClicked = !selected === isDarkTheme
20
+ updateThemePreference(darkThemeToggleClicked ? 'dark' : 'light');
21
+ // const html = document.querySelector('html') as HTMLHtmlElement
22
+ // html.classList.toggle('pf-v6-theme-dark', darkThemeToggleClicked)
23
+ setIsDarkTheme(darkThemeToggleClicked);
24
+ //localStorage.setItem('darkMode', JSON.stringify(darkThemeToggleClicked));
25
+ }
26
+
27
+ return (
28
+ <ToggleGroup aria-label="Dark theme toggle group">
29
+ <ToggleGroupItem
30
+ aria-label="light theme toggle"
31
+ icon={
32
+ <Icon size="md">
33
+ <SunIcon />
34
+ </Icon>
35
+ }
36
+ isSelected={!isDarkTheme}
37
+ onChange={toggleDarkTheme}
38
+ />
39
+ <ToggleGroupItem
40
+ aria-label="dark theme toggle"
41
+ icon={
42
+ <Icon size="md">
43
+ <MoonIcon />
44
+ </Icon>
45
+ }
46
+ isSelected={isDarkTheme}
47
+ onChange={toggleDarkTheme}
48
+ />
49
+ </ToggleGroup>
50
+ )
51
+ }
@@ -5,6 +5,7 @@ import { ClientRouter } from 'astro:transitions'
5
5
  import Page from '../components/Page.astro'
6
6
  import Masthead from '../components/Masthead.astro'
7
7
  import Navigation from '../components/Navigation.astro'
8
+
8
9
  ---
9
10
 
10
11
  <html lang="en" transition:animate="none">
@@ -24,3 +25,13 @@ import Navigation from '../components/Navigation.astro'
24
25
  </Page>
25
26
  </body>
26
27
  </html>
28
+
29
+ <script>
30
+ const themePreference = window.localStorage.getItem ('theme-preference');
31
+ document?.querySelector('html')?.classList.toggle('pf-v6-theme-dark', themePreference === 'dark' );
32
+
33
+ document.addEventListener("astro:after-swap", () => {
34
+ const themePreference = window.localStorage.getItem ('theme-preference');
35
+ document?.querySelector('html')?.classList.toggle('pf-v6-theme-dark', themePreference === 'dark' );
36
+ });
37
+ </script>
@@ -9,7 +9,7 @@ import MainLayout from '../layouts/Main.astro'
9
9
  <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
10
10
  <meta name="viewport" content="width=device-width" />
11
11
  <meta name="generator" content={Astro.generator} />
12
- <title>Astro</title>
12
+ <title>PatternFly</title>
13
13
  </head>
14
14
  <body>
15
15
  <MainLayout title="PatternFly X Astro"> Page content </MainLayout>
package/src/types.ts ADDED
@@ -0,0 +1,9 @@
1
+ export type Release = {
2
+ name: string;
3
+ date?: string;
4
+ latest?: string;
5
+ hidden?: boolean,
6
+ versions?: any,
7
+ href?: string
8
+ }
9
+
@@ -0,0 +1,20 @@
1
+ export type Theme = 'dark' | 'light' | 'system';
2
+
3
+ export const updateThemePreference = (theme: Theme) => {
4
+ if(typeof window !== undefined) {
5
+ window?.localStorage?.setItem('theme-preference', theme)
6
+ document?.querySelector('html')?.classList.toggle('pf-v6-theme-dark', theme === 'dark' );
7
+ };
8
+ };
9
+ export const getThemePreference = (): Theme => {
10
+ const theme = window?.localStorage?.getItem ('theme-preference');
11
+ return theme !== undefined ? (theme as Theme) : 'system';
12
+ };
13
+
14
+ export const themeLoader = () => {
15
+ if(typeof window !== 'undefined') {
16
+ window.addEventListener('DOMContentLoaded', ()=> {
17
+ updateThemePreference(getThemePreference());
18
+ })
19
+ };
20
+ }