@usace/groundwork 1.0.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.
Files changed (77) hide show
  1. package/.eslintrc.cjs +18 -0
  2. package/.github/workflows/deploy-docs.yml +59 -0
  3. package/.github/workflows/publish.yml +19 -0
  4. package/README.md +5 -0
  5. package/index.html +13 -0
  6. package/lib/catalyst/alert.jsx +110 -0
  7. package/lib/catalyst/avatar.jsx +64 -0
  8. package/lib/catalyst/badge.jsx +72 -0
  9. package/lib/catalyst/checkbox.jsx +160 -0
  10. package/lib/catalyst/dialog.jsx +101 -0
  11. package/lib/catalyst/dropdown.jsx +202 -0
  12. package/lib/catalyst/fieldset.jsx +87 -0
  13. package/lib/catalyst/input.jsx +78 -0
  14. package/lib/catalyst/listbox.jsx +195 -0
  15. package/lib/catalyst/pagination.jsx +75 -0
  16. package/lib/catalyst/radio.jsx +144 -0
  17. package/lib/catalyst/select.jsx +78 -0
  18. package/lib/catalyst/switch.jsx +203 -0
  19. package/lib/catalyst/textarea.jsx +59 -0
  20. package/lib/components/breadcrumbs.jsx +46 -0
  21. package/lib/components/button.jsx +219 -0
  22. package/lib/components/display/headings.jsx +39 -0
  23. package/lib/components/display/text.jsx +48 -0
  24. package/lib/components/hero.jsx +51 -0
  25. package/lib/components/layout/container.jsx +13 -0
  26. package/lib/components/layout/usace-box.jsx +26 -0
  27. package/lib/components/link.jsx +18 -0
  28. package/lib/components/table.jsx +146 -0
  29. package/lib/composite/footer/essayons.jsx +12 -0
  30. package/lib/composite/footer/footer-links.jsx +33 -0
  31. package/lib/composite/footer/index.jsx +148 -0
  32. package/lib/composite/footer/logo-banner.jsx +55 -0
  33. package/lib/composite/footer/social-links.jsx +60 -0
  34. package/lib/composite/header/index.jsx +83 -0
  35. package/lib/composite/header/navbar-links.jsx +113 -0
  36. package/lib/composite/header/usa-banner/USABanner.jsx +114 -0
  37. package/lib/composite/header/usa-banner/usa-banner.css +220 -0
  38. package/lib/composite/site-wrapper/index.jsx +52 -0
  39. package/lib/index.jsx +19 -0
  40. package/package.json +39 -0
  41. package/postcss.config.js +6 -0
  42. package/public/Magnifying_glass_icon.svg +5 -0
  43. package/public/armystar-logo-rb.svg +4 -0
  44. package/public/cwbi-logo.png +0 -0
  45. package/public/essayonscrest.png +0 -0
  46. package/public/icon-dot-gov.svg +1 -0
  47. package/public/icon-https.svg +1 -0
  48. package/public/nww-lucky-peak-dam.jpg +0 -0
  49. package/public/rsgis-logo.png +0 -0
  50. package/public/us_flag_small.png +0 -0
  51. package/public/usace-logo-color.svg +1 -0
  52. package/src/App.jsx +38 -0
  53. package/src/app-bundles/index.js +4 -0
  54. package/src/app-bundles/route-bundle.js +36 -0
  55. package/src/app-components/code-example.jsx +17 -0
  56. package/src/app-components/copy-button.jsx +32 -0
  57. package/src/app-components/props-table.jsx +43 -0
  58. package/src/app-components/sub-site-banner.jsx +15 -0
  59. package/src/app-pages/documentation/_docs-page.jsx +31 -0
  60. package/src/app-pages/documentation/_docs-sidebar.jsx +111 -0
  61. package/src/app-pages/documentation/_template.jsx +55 -0
  62. package/src/app-pages/documentation/app-shell/index.jsx +39 -0
  63. package/src/app-pages/documentation/app-shell/site-wrapper.jsx +190 -0
  64. package/src/app-pages/documentation/buttons/index.jsx +170 -0
  65. package/src/app-pages/documentation/index.jsx +57 -0
  66. package/src/app-pages/documentation/layout/container.jsx +68 -0
  67. package/src/app-pages/documentation/layout/index.jsx +52 -0
  68. package/src/app-pages/documentation/layout/usace-box.jsx +76 -0
  69. package/src/app-pages/documentation/navigation/breadcrumbs.jsx +119 -0
  70. package/src/app-pages/documentation/navigation/index.jsx +31 -0
  71. package/src/app-pages/documentation/types/index.jsx +31 -0
  72. package/src/app-pages/documentation/types/link.jsx +72 -0
  73. package/src/app-pages/home.jsx +71 -0
  74. package/src/index.css +3 -0
  75. package/src/main.jsx +18 -0
  76. package/tailwind.config.js +31 -0
  77. package/vite.config.js +46 -0
@@ -0,0 +1,148 @@
1
+ import Container from "../../components/layout/container";
2
+ import { Text } from "../../components/display/text";
3
+ import Essayons from "./essayons";
4
+ import LogoBanner from "./logo-banner";
5
+ import SocialLinks from "./social-links";
6
+ import FooterLinks from "./footer-links";
7
+
8
+ const defaultLinks = [
9
+ {
10
+ href: "https://www.lrd.usace.army.mil/about/connect-with-us/",
11
+ text: "Contact",
12
+ },
13
+ {
14
+ href: "https://www.lrd.usace.army.mil/Careers/",
15
+ text: "Join Our Team",
16
+ },
17
+ {
18
+ href: "https://www.lrd.usace.army.mil/Wetlands-Permits/",
19
+ text: "Request a Permit (Regulatory)",
20
+ },
21
+ {
22
+ href: "https://www.lrd.usace.army.mil/FOIA/",
23
+ text: "Records Request (FOIA)",
24
+ },
25
+ {
26
+ href: "https://www.usace.army.mil/About/Offices-and-Units/Engineer-Inspector-General/",
27
+ text: "File a Complaint (IG)",
28
+ },
29
+ {
30
+ href: "https://www.lrd.usace.army.mil/Business-With-Us/",
31
+ text: "Business With Us",
32
+ },
33
+ {
34
+ href: "https://www.lrd.usace.army.mil/Equal-Employment-Opportunity/",
35
+ text: "Equal Employment Opportunity (EEO)",
36
+ },
37
+ {
38
+ href: "https://www.usace.army.mil/LinkDisclaimer.aspx",
39
+ text: "Link Disclaimer",
40
+ },
41
+ {
42
+ href: "https://www.usace.army.mil/PrivacyandSecurity.aspx",
43
+ text: "Privacy and Security",
44
+ },
45
+ {
46
+ href: "https://www.lrd.usace.army.mil/SiteMap.aspx",
47
+ text: "Site Map",
48
+ },
49
+ ];
50
+
51
+ const defaultOffsiteLinks = [
52
+ {
53
+ href: "https://dodcio.defense.gov/DoDSection508/Std_Stmt.aspx",
54
+ text: "Accessibility (Section 508)",
55
+ },
56
+ {
57
+ href: "http://www.esd.whs.mil/DD/plainlanguage",
58
+ text: "Plain Writing Act",
59
+ },
60
+ {
61
+ href: "https://prhome.defense.gov/nofear",
62
+ text: "No FEAR Act",
63
+ },
64
+ {
65
+ href: "https://open.defense.gov/",
66
+ text: "Open Government",
67
+ },
68
+ {
69
+ href: "https://business.defense.gov/",
70
+ text: "Small Business Act",
71
+ },
72
+ {
73
+ href: "https://www.inscom.army.mil/isalute/",
74
+ text: "Report Suspicious Activity",
75
+ },
76
+ {
77
+ href: "https://www.usa.gov",
78
+ text: "Find Government Services (USA.gov)",
79
+ },
80
+ ];
81
+
82
+ function Footer({
83
+ missionText,
84
+ aboutText,
85
+ facebookUrl,
86
+ twitterUrl,
87
+ youtubeUrl,
88
+ flickrUrl,
89
+ usaceLinks,
90
+ externalLinks,
91
+ armyLogo,
92
+ usaceLogo,
93
+ rsgisLogo,
94
+ cwbiLogo,
95
+ }) {
96
+ return (
97
+ <footer className="relative text-footer-light-gray text-sm bg-footer-black border-t-gray-600 border-t-4 pb-[128px]">
98
+ <Essayons />
99
+ <div className="bg-footer-gray pt-8 pb-16">
100
+ <Container fluid>
101
+ <div className="grid grid-cols-12 gap-2">
102
+ <div className="col-span-12 lg:col-span-6">
103
+ <div className="grid grid-cols-12 gap-2">
104
+ <div className="col-span-6 lg:col-span-12">
105
+ {missionText && (
106
+ <>
107
+ <h2 className="text-lg">Our Mission</h2>
108
+ <Text>{missionText}</Text>
109
+ </>
110
+ )}
111
+ </div>
112
+ <div className="col-span-6 lg:col-span-12">
113
+ {aboutText && (
114
+ <>
115
+ <h2 className="text-lg">About this Website</h2>
116
+ <Text>{aboutText}</Text>
117
+ </>
118
+ )}
119
+ </div>
120
+ </div>
121
+ </div>
122
+ <div className="col-span-8 mt-8 lg:mt-2 lg:col-span-4">
123
+ <SocialLinks
124
+ facebook={facebookUrl}
125
+ twitter={twitterUrl}
126
+ youtube={youtubeUrl}
127
+ flickr={flickrUrl}
128
+ />
129
+ <FooterLinks links={usaceLinks} />
130
+ </div>
131
+ <div className="col-span-4 mt-[66px] lg:mt-2 lg:col-span-2">
132
+ <FooterLinks links={externalLinks} columnCount={1} />
133
+ </div>
134
+ </div>
135
+ </Container>
136
+ <LogoBanner
137
+ army={armyLogo}
138
+ usace={usaceLogo}
139
+ rsgis={rsgisLogo}
140
+ cwbi={cwbiLogo}
141
+ />
142
+ </div>
143
+ </footer>
144
+ );
145
+ }
146
+
147
+ export default Footer;
148
+ export { Footer };
@@ -0,0 +1,55 @@
1
+ const base = import.meta.env.BASE_URL;
2
+
3
+ function LogoBanner({ army, usace, rsgis, cwbi }) {
4
+ return (
5
+ <div className="flex flex-row justify-center align-middle gap-6 mb-4">
6
+ {army && (
7
+ <a href="https://www.army.mil" target="_blank" rel="noopener">
8
+ <img
9
+ src={`${base}armystar-logo-rb.svg`}
10
+ alt="U.S. Army"
11
+ className="max-h-[75px]"
12
+ />
13
+ </a>
14
+ )}
15
+ {usace && (
16
+ <a href="https://www.usace.army.mil" target="_blank" rel="noopener">
17
+ <img
18
+ src={`${base}usace-logo-color.svg`}
19
+ alt="U.S. Army Corps of Engineers"
20
+ className="max-h-[75px] h-[75px] w-auto"
21
+ />
22
+ </a>
23
+ )}
24
+ {rsgis && (
25
+ <a
26
+ href="https://www.erdc.usace.army.mil/Media/Fact-Sheets/Fact-Sheet-Article-View/article/476649/remote-sensinggeographic-information-systems-center/"
27
+ target="_blank"
28
+ rel="noopener"
29
+ >
30
+ <img
31
+ src={`${base}rsgis-logo.png`}
32
+ alt="Remote Sensing - GIS Center of Expertise"
33
+ className="max-h-[75px]"
34
+ />
35
+ </a>
36
+ )}
37
+ {cwbi && (
38
+ <a
39
+ href="https://cwbi.sec.usace.army.mil"
40
+ target="_blank"
41
+ rel="noopener"
42
+ >
43
+ <img
44
+ src={`${base}cwbi-logo.png`}
45
+ alt="Civil Works Business Intelligence"
46
+ className="max-h-[75px]"
47
+ />
48
+ </a>
49
+ )}
50
+ </div>
51
+ );
52
+ }
53
+
54
+ export default LogoBanner;
55
+ export { LogoBanner };
@@ -0,0 +1,60 @@
1
+ import { FaFacebook, FaYoutube, FaFlickr } from "react-icons/fa";
2
+ import { FaXTwitter } from "react-icons/fa6";
3
+
4
+ function SocialLinks({ facebook, twitter, youtube, flickr }) {
5
+ return (
6
+ <ul className="text-2xl flex flex-row flex-wrap gap-2 list-none mb-3">
7
+ {facebook && (
8
+ <li>
9
+ <a
10
+ href={facebook}
11
+ target="_blank"
12
+ rel="noopener noreferrer"
13
+ title="Facebook"
14
+ >
15
+ <FaFacebook />
16
+ </a>
17
+ </li>
18
+ )}
19
+ {twitter && (
20
+ <li>
21
+ <a
22
+ href={twitter}
23
+ target="_blank"
24
+ rel="noopener noreferrer"
25
+ title="Twitter"
26
+ >
27
+ <FaXTwitter />
28
+ </a>
29
+ </li>
30
+ )}
31
+ {youtube && (
32
+ <li>
33
+ <a
34
+ href={youtube}
35
+ target="_blank"
36
+ rel="noopener noreferrer"
37
+ title="YouTube"
38
+ >
39
+ <FaYoutube />
40
+ </a>
41
+ </li>
42
+ )}
43
+ {flickr && (
44
+ <li>
45
+ <a
46
+ href={flickr}
47
+ target="_blank"
48
+ rel="noopener noreferrer"
49
+ title="Flickr"
50
+ >
51
+ <FaFlickr />
52
+ </a>
53
+ </li>
54
+ )}
55
+ </ul>
56
+ );
57
+ }
58
+
59
+ export default SocialLinks;
60
+ export { SocialLinks };
@@ -0,0 +1,83 @@
1
+ import { NavbarLinks } from "./navbar-links";
2
+
3
+ const base = import.meta.env.BASE_URL;
4
+
5
+ function classNames(...classes) {
6
+ return classes.filter(Boolean).join(" ");
7
+ }
8
+
9
+ function Title({ title = "Title", subtitle = "Subtitle" }) {
10
+ return (
11
+ <div
12
+ style={{ order: 2 }}
13
+ className="font-usace w-full pl-[100px] bg-nav-gray"
14
+ >
15
+ <span className="text-sm font-bold mr-1">{title}</span>
16
+ <span className="text-sm">{subtitle}</span>
17
+ </div>
18
+ );
19
+ }
20
+
21
+ function Nav({ children }) {
22
+ return (
23
+ <nav
24
+ style={{ order: 1 }}
25
+ className="flex flex-row relative justify-between content-center bg-nav-black text-white h-12 pl-[91px] z-80"
26
+ >
27
+ {children}
28
+ </nav>
29
+ );
30
+ }
31
+
32
+ function Logo() {
33
+ return (
34
+ <div className="absolute left-[15px] bottom-[-15px] w-[82px] z-10">
35
+ <a href="/">
36
+ <img className="h-[50px] w-auto" src={`${base}usace-logo-color.svg`} />
37
+ </a>
38
+ <div className="absolute left-[65px] bottom-[-9px] text-sm text-black">
39
+ ®
40
+ </div>
41
+ </div>
42
+ );
43
+ }
44
+
45
+ function Search() {
46
+ return (
47
+ <input
48
+ style={{
49
+ order: 2,
50
+ backgroundImage: `url("${base}Magnifying_glass_icon.svg")`,
51
+ backgroundSize: "13px",
52
+ backgroundRepeat: "no-repeat",
53
+ backgroundPosition: "10px center",
54
+ }}
55
+ className="bg-white border-gray-200 border-2 rounded h-8 m-2 text-sm text-black w-full max-w-[300px] pl-8"
56
+ />
57
+ );
58
+ }
59
+
60
+ function Header({ links, title, subtitle }) {
61
+ const headerClass = classNames(
62
+ "flex",
63
+ "flex-col",
64
+ "w-full",
65
+ "sticky",
66
+ "top-0",
67
+ "z-20"
68
+ );
69
+
70
+ return (
71
+ <header className={headerClass}>
72
+ <Title title={title} subtitle={subtitle} />
73
+ <Nav>
74
+ <Logo />
75
+ <NavbarLinks links={links} />
76
+ <Search />
77
+ </Nav>
78
+ </header>
79
+ );
80
+ }
81
+
82
+ export default Header;
83
+ export { Header };
@@ -0,0 +1,113 @@
1
+ import { useState } from "react";
2
+ import { Menu } from "@headlessui/react";
3
+ import { Fragment } from "react";
4
+
5
+ const classNames = (...classes) => {
6
+ return classes.filter(Boolean).join(" ");
7
+ };
8
+
9
+ function NavbarLinkItem({ link, ...props }) {
10
+ const [open, setOpen] = useState(false);
11
+
12
+ const menuButtonClass = classNames(
13
+ "inline-block relative h-12 inline-flex w-auto justify-center items-center px-3 text-sm",
14
+ open ? "bg-nav-dark-gray text-white" : "text-nav-light-gray",
15
+ link.children ? "after:content-['▼'] after:text-[10px] after:ml-2" : ""
16
+ );
17
+
18
+ return (
19
+ <Menu
20
+ as="li"
21
+ className="relative"
22
+ onMouseOver={() => setOpen(true)}
23
+ onMouseLeave={() => setOpen(false)}
24
+ >
25
+ <a href={link.link} className={menuButtonClass} {...props}>
26
+ {link.label}
27
+ </a>
28
+ {link.children && open && (
29
+ <Menu.Items
30
+ static
31
+ as="ul"
32
+ className="absolute left-0 top-13 width-auto bg-nav-dark-gray"
33
+ >
34
+ {link.children.map((child) => {
35
+ return (
36
+ <Menu.Item key={child.id} as={Fragment}>
37
+ <a
38
+ href={child.link}
39
+ className="block text-sm border-b border-nav-black bg-nav-dark-gray hover:bg-nav-translucent-gray text-nav-light-gray hover:text-white text-nowrap font-semibold px-[16px] py-[8px] bg-none"
40
+ >
41
+ {child.label}
42
+ </a>
43
+ </Menu.Item>
44
+ );
45
+ })}
46
+ </Menu.Items>
47
+ )}
48
+ </Menu>
49
+ );
50
+ }
51
+
52
+ // links look like this:
53
+ const linksTemplate = [
54
+ {
55
+ id: "layout",
56
+ label: "Layout",
57
+ link: "/layout",
58
+ children: [
59
+ {
60
+ id: "layout-1",
61
+ label: "Layout 1 goes here",
62
+ link: "/layout-1",
63
+ },
64
+ {
65
+ id: "layout-2",
66
+ label: "Layout 2",
67
+ link: "/layout-2",
68
+ },
69
+ ],
70
+ },
71
+ {
72
+ id: "another",
73
+ label: "Another",
74
+ link: "/another",
75
+ },
76
+ ];
77
+
78
+ function NavbarLinksList({ links, ...props }) {
79
+ return (
80
+ <ul
81
+ role="list"
82
+ className="flex flex-row justify-start m-0 pl-0 w-full"
83
+ {...props}
84
+ >
85
+ {links.map((link) => {
86
+ return <NavbarLinkItem key={link.id} link={link} />;
87
+ })}
88
+ </ul>
89
+ );
90
+ }
91
+
92
+ const NavbarLinks = ({ links = linksTemplate }) => {
93
+ // const [openMobileMenu, setOpenMobileMenu] = useState(false);
94
+ // const mobileMenuClass = classnames({
95
+ // "nav-links-list": true,
96
+ // "nav-links-list-open": openMobileMenu,
97
+ // });
98
+ return (
99
+ <div className="flex flex-row flex-wrap content-center justify-between w-full pr-3">
100
+ <NavbarLinksList links={links} />
101
+ </div>
102
+ );
103
+ };
104
+
105
+ export default NavbarLinks;
106
+ export { NavbarLinks };
107
+
108
+ // display: flex;
109
+ // flex-direction: row;
110
+ // align-items: center;
111
+ // justify-content: space-between;
112
+ // width: 100%;
113
+ // padding-right: 8px;
@@ -0,0 +1,114 @@
1
+ import { useState } from "react";
2
+ import "./usa-banner.css";
3
+
4
+ function classNames(...classes) {
5
+ return classes.filter(Boolean).join(" ");
6
+ }
7
+
8
+ const USABanner = () => {
9
+ const [open, setOpen] = useState(false);
10
+ return (
11
+ <div
12
+ id="dnn_ctl03_header_banner_container"
13
+ className="header_banner_container"
14
+ >
15
+ <span className="header_banner_inner">
16
+ <div className="header_banner_flag">
17
+ An official website of the United States government
18
+ <div className="header_banner_accordion" tabIndex={0}>
19
+ <u
20
+ onClick={() => {
21
+ setOpen(!open);
22
+ }}
23
+ >
24
+ Here's how you know
25
+ <span
26
+ className={classNames(
27
+ "expand-more-container",
28
+ open ? "active" : ""
29
+ )}
30
+ >
31
+ <svg
32
+ xmlns="http://www.w3.org/2000/svg"
33
+ height="24"
34
+ viewBox="0 0 24 24"
35
+ width="24"
36
+ >
37
+ <path d="M0 0h24v24H0z" fill="none"></path>
38
+ <path
39
+ className="expand-more"
40
+ d="M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z"
41
+ ></path>
42
+ </svg>
43
+ </span>
44
+ </u>
45
+ </div>
46
+ </div>
47
+ {open ? (
48
+ <div
49
+ className="header_banner_panel active active"
50
+ style={{
51
+ paddingTop: "24px",
52
+ paddingBottom: "18px",
53
+ maxHeight: "154px",
54
+ }}
55
+ >
56
+ <div className="header_banner_panel_item">
57
+ <span className="header_banner_dotgov"></span>
58
+ <div
59
+ id="dnn_ctl03_bannerContentLeft"
60
+ className="header_banner_content"
61
+ >
62
+ <p className="banner-contentLeft-text">
63
+ <strong> Official websites use .mil </strong>
64
+ </p>
65
+ A <strong>.mil</strong> website belongs to an official U.S.
66
+ Department of Defense organization in the United States.
67
+ </div>
68
+ </div>
69
+ <div className="header_banner_panel_item https">
70
+ <span className="header_banner_https"></span>
71
+ <div
72
+ id="dnn_ctl03_bannerContentRight"
73
+ className="header_banner_content"
74
+ >
75
+ <p className="banner-contentRight-text">
76
+ <strong>Secure .mil websites use HTTPS</strong>
77
+ </p>
78
+ <div>
79
+ {" "}
80
+ A{" "}
81
+ <strong>
82
+ lock (
83
+ <span className="header_banner_icon_lock">
84
+ <svg
85
+ xmlns="http://www.w3.org/2000/svg"
86
+ width="52"
87
+ height="64"
88
+ viewBox="0 0 52 64"
89
+ >
90
+ <title>lock </title>
91
+ <path
92
+ className="icon_lock"
93
+ fillRule="evenodd"
94
+ d="M26 0c10.493 0 19 8.507 19 19v9h3a4 4 0 0 1 4 4v28a4 4 0 0 1-4 4H4a4 4 0 0 1-4-4V32a4 4 0 0 1 4-4h3v-9C7 8.507 15.507 0 26 0zm0 8c-5.979 0-10.843 4.77-10.996 10.712L15 19v9h22v-9c0-6.075-4.925-11-11-11z"
95
+ ></path>{" "}
96
+ </svg>
97
+ </span>
98
+ )
99
+ </strong>{" "}
100
+ or <strong> https://</strong> means you’ve safely connected to
101
+ the .mil website. Share sensitive information only on
102
+ official, secure websites.
103
+ </div>
104
+ </div>
105
+ </div>
106
+ </div>
107
+ ) : null}
108
+ </span>
109
+ </div>
110
+ );
111
+ };
112
+
113
+ export default USABanner;
114
+ export { USABanner };