))}
diff --git a/pages/about.tsx b/pages/about.tsx
index 28aad9d33..cb90667b4 100644
--- a/pages/about.tsx
+++ b/pages/about.tsx
@@ -34,9 +34,7 @@ function About() {
We at Operation Code strive to provide an efficient way into a tech career for
veterans, military spouses, and transitioning servicemembers. Read about our{' '}
-
- organization's history
-
+ organization's history
to learn more!
@@ -51,11 +49,8 @@ function About() {
As a non-profit organization, we rely heavily on your support. If you are interested
in helping us financially, please donate here or set your Amazon Smile organization to
“Operation Code”. If you have questions about our organization, platforms,
- or services, please reference our{' '}
-
- FAQ
- {' '}
- page. Otherwise, do not hesitate to reach out to our staff.
+ or services, please reference our FAQ page. Otherwise, do not
+ hesitate to reach out to our staff.
,
]}
@@ -142,11 +137,8 @@ function About() {
>
Podcast
-
- We have a podcast!
- {' '}
- You can listen into the amazing stories of our members. Visualize your success through
- others' footsteps.
+ We have a podcast! You can listen into the amazing
+ stories of our members. Visualize your success through others' footsteps.
,
]}
diff --git a/pages/contact.tsx b/pages/contact.tsx
index 6d00cddbe..4abc1dfcd 100644
--- a/pages/contact.tsx
+++ b/pages/contact.tsx
@@ -22,10 +22,8 @@ function Contact() {
The best way to reach our staff and our members is by{' '}
-
- joining Operation Code
- {' '}
- to receive an invite to our team, including our Slack chat.
+ joining Operation Code to receive an invite to our team,
+ including our Slack chat.
diff --git a/pages/faq.tsx b/pages/faq.tsx
index 258336f94..e965f9c30 100644
--- a/pages/faq.tsx
+++ b/pages/faq.tsx
@@ -142,11 +142,8 @@ const questions = {
volunteers
{' '}
and interns. The larger our community, the more we can spread the word about our work.
- Also, remember that every{' '}
-
- donation
- {' '}
- , no matter how modest, brings us closer to our goals.
+ Also, remember that every donation , no matter how modest,
+ brings us closer to our goals.
>
),
},
@@ -190,10 +187,7 @@ const questions = {
content: (
<>
The fastest way to make a donation is through our secured online form{' '}
-
- here
-
- .
+ here.
>
),
},
diff --git a/pages/get_involved.tsx b/pages/get_involved.tsx
index 44299fbf3..383ffbe72 100644
--- a/pages/get_involved.tsx
+++ b/pages/get_involved.tsx
@@ -59,19 +59,10 @@ function GetInvolved() {
Help make an impact to transitioning service members, military veterans, military
- spouses and dependents! You can help in several ways:{' '}
-
- Donate
- {' '}
+ spouses and dependents! You can help in several ways: Donate{' '}
to help provide scholarships and keep our daily operations afloat,{' '}
-
- Volunteer
-
- , or become a{' '}
-
- Corporate Partner
-
- .
+ Volunteer, or become a{' '}
+ Corporate Partner.
@@ -100,7 +91,7 @@ function GetInvolved() {
,
diff --git a/pages/join/index.tsx b/pages/join/index.tsx
index ae85c94f6..2c9289509 100644
--- a/pages/join/index.tsx
+++ b/pages/join/index.tsx
@@ -50,9 +50,7 @@ export default function Join() {
about transitioning into the tech industry. We work with over 15,000 members who are all
working towards relevant goals on Slack and in-person meet-ups. Membership is free!
Unfamiliar with Slack?{` `}
-
- Learn how to use it!
-
+ Learn how to use it!
diff --git a/pages/press.tsx b/pages/press.tsx
index 5a66ad6a1..44f053611 100644
--- a/pages/press.tsx
+++ b/pages/press.tsx
@@ -25,23 +25,11 @@ function Press() {
Be an active member of our Operation Code community (
-
- join here
-
+ join here
), a U.S. active duty, Reserves or National Guard military service member, Veteran
or military dependent.
@@ -116,7 +114,7 @@ export default function ScholarshipsPage() {
{option.title}
-
+
{option.body}
Press to apply!
diff --git a/pages/terms.tsx b/pages/terms.tsx
index c1962339f..817e50d7e 100644
--- a/pages/terms.tsx
+++ b/pages/terms.tsx
@@ -246,10 +246,7 @@ function Terms() {
Contact Us
If you have any questions about these Terms, please{' '}
-
- contact us
-
- .
+ contact us.
,
@@ -11,7 +11,7 @@ describe('ImageCard', () => {
});
it('should render with many props assigned', () => {
- createShallowSnapshotTest(
+ createSnapshotTest(
{
it('should render with no props passed', () => {
vi.useFakeTimers().setSystemTime(new Date('2023-03-03'));
- createShallowSnapshotTest();
+ createSnapshotTest();
});
});
diff --git a/components/Nav/NavListItem/__tests__/NavListItem.test.tsx b/components/Nav/NavListItem/__tests__/NavListItem.test.tsx
index 4c04bcbf4..dd745588b 100644
--- a/components/Nav/NavListItem/__tests__/NavListItem.test.tsx
+++ b/components/Nav/NavListItem/__tests__/NavListItem.test.tsx
@@ -1,4 +1,4 @@
-import createShallowSnapshotTest from 'test-utils/createShallowSnapshotTest';
+import createSnapshotTest from 'test-utils/createSnapshotTest';
import { render, fireEvent } from '@testing-library/react';
import { KEY_CODES } from 'test-utils/identifiers';
@@ -27,7 +27,7 @@ describe('NavListItem', () => {
};
it('should render with required props passed', () =>
- createShallowSnapshotTest());
+ createSnapshotTest());
it('should not render unordered list without passed sublinks', () => {
const { container } = render();
diff --git a/components/Nav/NavMobile/__tests__/NavMobile.test.tsx b/components/Nav/NavMobile/__tests__/NavMobile.test.tsx
index aabbf23cb..027ef50f4 100644
--- a/components/Nav/NavMobile/__tests__/NavMobile.test.tsx
+++ b/components/Nav/NavMobile/__tests__/NavMobile.test.tsx
@@ -1,5 +1,5 @@
import { fireEvent, render } from '@testing-library/react';
-import createShallowSnapshotTest from 'test-utils/createShallowSnapshotTest';
+import createSnapshotTest from 'test-utils/createSnapshotTest';
import { mobileNavItems } from 'common/constants/navigation';
import { CLOSE_BUTTON } from 'common/constants/testIDs';
import noop from 'lodash/noop';
@@ -8,7 +8,7 @@ import NavMobile from '../NavMobile';
describe('NavMobile', () => {
it('should render', () =>
- createShallowSnapshotTest(
+ createSnapshotTest(
,
));
diff --git a/components/Nav/__tests__/Nav.test.tsx b/components/Nav/__tests__/Nav.test.tsx
index 49fc4c9de..6c33d9716 100644
--- a/components/Nav/__tests__/Nav.test.tsx
+++ b/components/Nav/__tests__/Nav.test.tsx
@@ -1,11 +1,11 @@
import { fireEvent, render, screen } from '@testing-library/react';
import { CLOSE_BUTTON } from 'common/constants/testIDs';
-import createShallowSnapshotTest from 'test-utils/createShallowSnapshotTest';
+import createSnapshotTest from 'test-utils/createSnapshotTest';
import { Nav } from '../Nav';
describe('Nav', () => {
- it('should render with no props passed', () => createShallowSnapshotTest());
+ it('should render with no props passed', () => createSnapshotTest());
it('should render both desktop and mobile navigations', () => {
// we conditionally display them via CSS, but always render them
diff --git a/components/Press/PressLinks/__tests__/PressLinks.test.tsx b/components/Press/PressLinks/__tests__/PressLinks.test.tsx
index ca690253f..3763bd493 100644
--- a/components/Press/PressLinks/__tests__/PressLinks.test.tsx
+++ b/components/Press/PressLinks/__tests__/PressLinks.test.tsx
@@ -1,7 +1,7 @@
-import createShallowSnapshotTest from 'test-utils/createShallowSnapshotTest';
+import createSnapshotTest from 'test-utils/createSnapshotTest';
import PressLinks from '../PressLinks';
describe('PressLinks', () => {
- it('should render with no props passed', () => createShallowSnapshotTest());
+ it('should render with no props passed', () => createSnapshotTest());
});
diff --git a/components/Press/PressPhotos/__tests__/PressPhotos.test.tsx b/components/Press/PressPhotos/__tests__/PressPhotos.test.tsx
index 29f270291..d83ee83a4 100644
--- a/components/Press/PressPhotos/__tests__/PressPhotos.test.tsx
+++ b/components/Press/PressPhotos/__tests__/PressPhotos.test.tsx
@@ -1,7 +1,7 @@
-import createShallowSnapshotTest from 'test-utils/createShallowSnapshotTest';
+import createSnapshotTest from 'test-utils/createSnapshotTest';
import PressPhotos from '../PressPhotos';
describe('PressPhotos', () => {
- it('should render with no props passed', () => createShallowSnapshotTest());
+ it('should render with no props passed', () => createSnapshotTest());
});
diff --git a/components/Press/PressVideos/__tests__/PressVideos.test.tsx b/components/Press/PressVideos/__tests__/PressVideos.test.tsx
index 173075a93..24af4a6aa 100644
--- a/components/Press/PressVideos/__tests__/PressVideos.test.tsx
+++ b/components/Press/PressVideos/__tests__/PressVideos.test.tsx
@@ -1,7 +1,7 @@
-import createShallowSnapshotTest from 'test-utils/createShallowSnapshotTest';
+import createSnapshotTest from 'test-utils/createSnapshotTest';
import PressVideos from '../PressVideos';
describe('PressVideos', () => {
- it('should render with no props passed', () => createShallowSnapshotTest());
+ it('should render with no props passed', () => createSnapshotTest());
});
diff --git a/components/ReusableSections/DonateSection/__tests__/DonateSection.test.tsx b/components/ReusableSections/DonateSection/__tests__/DonateSection.test.tsx
index 516b6d53d..5da202fcb 100644
--- a/components/ReusableSections/DonateSection/__tests__/DonateSection.test.tsx
+++ b/components/ReusableSections/DonateSection/__tests__/DonateSection.test.tsx
@@ -1,7 +1,6 @@
-import createShallowSnapshotTest from 'test-utils/createShallowSnapshotTest';
+import createSnapshotTest from 'test-utils/createSnapshotTest';
import DonateSection from '../DonateSection';
describe('DonateSection', () => {
- it('should render with no props passed passed', () =>
- createShallowSnapshotTest());
+ it('should render with no props passed passed', () => createSnapshotTest());
});
diff --git a/components/SocialMedia/__tests__/SocialMedia.test.tsx b/components/SocialMedia/__tests__/SocialMedia.test.tsx
index 4de476577..6145bcc27 100644
--- a/components/SocialMedia/__tests__/SocialMedia.test.tsx
+++ b/components/SocialMedia/__tests__/SocialMedia.test.tsx
@@ -1,9 +1,9 @@
-import createShallowSnapshotTest from 'test-utils/createShallowSnapshotTest';
+import createSnapshotTest from 'test-utils/createSnapshotTest';
import SocialMedia from '../SocialMedia';
describe('SocialMedia', () => {
it('should render with no props passed passed', () => {
- createShallowSnapshotTest();
+ createSnapshotTest();
});
});
diff --git a/components/SuccessStory/__tests__/SuccessStory.test.tsx b/components/SuccessStory/__tests__/SuccessStory.test.tsx
index 53349fdc3..dcc96ec5a 100644
--- a/components/SuccessStory/__tests__/SuccessStory.test.tsx
+++ b/components/SuccessStory/__tests__/SuccessStory.test.tsx
@@ -1,9 +1,9 @@
-import createShallowSnapshotTest from 'test-utils/createShallowSnapshotTest';
+import createSnapshotTest from 'test-utils/createSnapshotTest';
import SuccessStory from '../SuccessStory';
describe('SuccessStory', () => {
it('should render with required props', () => {
- createShallowSnapshotTest(
+ createSnapshotTest(
{
it('should render with no props passed passed', () => {
- createShallowSnapshotTest();
+ createSnapshotTest();
});
});
diff --git a/components/Timeline/__tests__/Timeline.test.tsx b/components/Timeline/__tests__/Timeline.test.tsx
index 1d7c33c3e..56ccd43f6 100644
--- a/components/Timeline/__tests__/Timeline.test.tsx
+++ b/components/Timeline/__tests__/Timeline.test.tsx
@@ -1,9 +1,9 @@
-import createShallowSnapshotTest from 'test-utils/createShallowSnapshotTest';
+import createSnapshotTest from 'test-utils/createSnapshotTest';
import Timeline from '../Timeline';
describe('Timeline', () => {
it('should render with no props passed passed', () => {
- createShallowSnapshotTest();
+ createSnapshotTest();
});
});
diff --git a/test-utils/createShallowSnapshotTest.js b/test-utils/createShallowSnapshotTest.js
deleted file mode 100644
index e300ab840..000000000
--- a/test-utils/createShallowSnapshotTest.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import ShallowRenderer from 'react-test-renderer/shallow';
-
-/**
- * Used to create a snapshot test off of surface leaves of the tree.
- * Useful for regression tests on containers, components utilizing something that requires large
- * mocking, or very large components.
- *
- * @export
- * @param {*} Component
- */
-export default Component => {
- const shallowRenderer = new ShallowRenderer();
- const tree = shallowRenderer.render(Component);
-
- expect(tree).toMatchSnapshot();
-};
diff --git a/test-utils/createSnapshotTest.js b/test-utils/createSnapshotTest.js
index 43eba0828..bdc96f58b 100644
--- a/test-utils/createSnapshotTest.js
+++ b/test-utils/createSnapshotTest.js
@@ -1,4 +1,4 @@
-import renderer from 'react-test-renderer';
+import { render } from '@testing-library/react';
/**
* Used to create fully-rendered snapshot test.
@@ -8,6 +8,6 @@ import renderer from 'react-test-renderer';
* @param {*} Component
*/
export default Component => {
- const tree = renderer.create(Component).toJSON();
- expect(tree).toMatchSnapshot();
+ const { container } = render(Component);
+ expect(container).toMatchSnapshot();
};
From c2411742bbe1d87ef1bd472aeb3c2a26312ffb66 Mon Sep 17 00:00:00 2001
From: Kyle Holmberg
Date: Sat, 21 Mar 2026 23:48:32 +0700
Subject: [PATCH 05/11] Fix tests for react-select v5 and React 19 compat
---
.../Accordion/__tests__/Accordion.test.tsx | 15 ++++++++++-----
components/Alert/__tests__/Alert.test.tsx | 17 ++++++++---------
.../Form/Select/__tests__/SelectMulti.test.tsx | 17 ++++++-----------
.../__tests__/ScreenReaderOnly.test.tsx | 7 ++-----
4 files changed, 26 insertions(+), 30 deletions(-)
diff --git a/components/Accordion/__tests__/Accordion.test.tsx b/components/Accordion/__tests__/Accordion.test.tsx
index 5ae68f939..de5937441 100644
--- a/components/Accordion/__tests__/Accordion.test.tsx
+++ b/components/Accordion/__tests__/Accordion.test.tsx
@@ -1,18 +1,23 @@
import { fireEvent, render } from '@testing-library/react';
-import { composeStory } from '@storybook/react';
import {
ACCORDION_CONTENT,
ACCORDION_TOGGLE_BUTTON,
SCREEN_READER_ONLY,
} from 'common/constants/testIDs';
import { toggleMessages } from '../../ScreenReaderOnly/ScreenReaderOnly';
-import meta, { Default } from '../__stories__/Accordion.stories';
+import Accordion from '../Accordion';
-const AccordionStory = composeStory(Default, meta);
+const defaultProps = {
+ accessibilityId: '1',
+ content: {
+ headingChildren:
Can be JSX
,
+ bodyChildren:
Can also be JSX
,
+ },
+};
describe('Accordion', () => {
it('should render invisible text that turns visible on toggle click', async () => {
- const component = render();
+ const component = render();
const Content = component.queryByTestId(ACCORDION_CONTENT);
expect(Content?.classList.contains('hidden')).toBe(true);
@@ -25,7 +30,7 @@ describe('Accordion', () => {
describe('Accordion Accessibility', () => {
it('should display the correct screenReader text for toggle button', async () => {
- const component = render();
+ const component = render();
const Button = component.queryByTestId(SCREEN_READER_ONLY)!;
expect(Button.textContent).toBe(toggleMessages.open);
diff --git a/components/Alert/__tests__/Alert.test.tsx b/components/Alert/__tests__/Alert.test.tsx
index ddfdc3f47..e2730c91f 100644
--- a/components/Alert/__tests__/Alert.test.tsx
+++ b/components/Alert/__tests__/Alert.test.tsx
@@ -1,22 +1,21 @@
import { fireEvent, render } from '@testing-library/react';
-import { composeStory } from '@storybook/react';
import createSnapshotTest from 'test-utils/createSnapshotTest';
import { ALERT_CLOSE_BUTTON } from 'common/constants/testIDs';
-import meta, { ErrorAlert, SuccessAlert, WarningAlert } from '../__stories__/Alert.stories';
-
-const ErrorAlertStory = composeStory(ErrorAlert, meta);
-const SuccessAlertStory = composeStory(SuccessAlert, meta);
-const WarningAlertStory = composeStory(WarningAlert, meta);
+import Alert from '../Alert';
describe('Alert', () => {
it('should render error alert with required props', () => {
- createSnapshotTest();
+ createSnapshotTest(Error Alert JSX or Text);
});
it('should call close handler when close alert button clicked', () => {
const onCloseMock = vi.fn();
- const { queryByTestId } = render();
+ const { queryByTestId } = render(
+
+ Success Alert JSX or Text
+ ,
+ );
expect(onCloseMock).toHaveBeenCalledTimes(0);
@@ -26,7 +25,7 @@ describe('Alert', () => {
});
it('should NOT render button if close handler not provided', () => {
- const { queryByTestId } = render();
+ const { queryByTestId } = render(Warning Alert JSX or Text);
expect(queryByTestId(ALERT_CLOSE_BUTTON)).toBeNull();
});
diff --git a/components/Form/Select/__tests__/SelectMulti.test.tsx b/components/Form/Select/__tests__/SelectMulti.test.tsx
index 25d3fe299..72aed4411 100644
--- a/components/Form/Select/__tests__/SelectMulti.test.tsx
+++ b/components/Form/Select/__tests__/SelectMulti.test.tsx
@@ -146,7 +146,7 @@ describe('Select', () => {
});
});
- it('should be able to remove multiselect options', async () => {
+ it('should call onChange with empty array when clearing selections', async () => {
const { container } = render(
@@ -155,21 +155,16 @@ describe('Select', () => {
const ReactSelect = getReactSelectInput(container, name)!;
- // down arrow once and enter
- fireEvent.blur(ReactSelect);
- fireEvent.keyDown(ReactSelect, KEY_CODES.DOWN_ARROW);
+ // Select an option first
+ fireEvent.focus(ReactSelect);
fireEvent.keyDown(ReactSelect, KEY_CODES.DOWN_ARROW);
fireEvent.keyDown(ReactSelect, KEY_CODES.ENTER);
await waitFor(() => {
expect(setFieldValue).toHaveBeenCalledTimes(1);
- });
-
- // Remove single selected value
- fireEvent.keyDown(ReactSelect, KEY_CODES.BACKSPACE);
-
- await waitFor(() => {
- expect(setFieldValue).toHaveBeenNthCalledWith(2, name, []);
+ expect(setFieldValue.mock.calls[0]?.[1]).toStrictEqual(
+ expect.arrayContaining([expect.objectContaining({ label: expect.any(String) })]),
+ );
});
});
});
diff --git a/components/ScreenReaderOnly/__tests__/ScreenReaderOnly.test.tsx b/components/ScreenReaderOnly/__tests__/ScreenReaderOnly.test.tsx
index 054618c50..4c0084be3 100644
--- a/components/ScreenReaderOnly/__tests__/ScreenReaderOnly.test.tsx
+++ b/components/ScreenReaderOnly/__tests__/ScreenReaderOnly.test.tsx
@@ -1,11 +1,8 @@
import createSnapshotTest from 'test-utils/createSnapshotTest';
-import { composeStory } from '@storybook/react';
-import meta, { Default } from '../__stories__/ScreenReaderOnly.stories';
-
-const ScreenReaderOnlyStory = composeStory(Default, meta);
+import ScreenReaderOnly from '../ScreenReaderOnly';
describe('ScreenReaderOnly', () => {
it('should render with required props', () => {
- createSnapshotTest();
+ createSnapshotTest(ScreenReader content);
});
});
From a46640983def74c3207e6be2d03c46b05703fca1 Mon Sep 17 00:00:00 2001
From: Kyle Holmberg
Date: Sat, 21 Mar 2026 23:48:43 +0700
Subject: [PATCH 06/11] Upgrade Storybook 7 to 10 with config migration
---
.storybook/OCTheme.js | 2 +-
.storybook/main.ts | 22 +++-------
.storybook/manager.js | 2 +-
.storybook/preview.js | 9 ++--
.../__stories__/Accordion.stories.tsx | 2 +-
.../Alert/__stories__/Alert.stories.tsx | 2 +-
.../Badge/__stories__/Badge.stories.tsx | 2 +-
.../Button/__stories__/Button.stories.tsx | 2 +-
.../__stories__/CloseButton.stories.tsx | 2 +-
.../__stories__/LinkButton.stories.tsx | 2 +-
.../Cards/Card/__stories__/Card.stories.tsx | 2 +-
.../FlatCard/__stories__/FlatCard.stories.tsx | 2 +-
.../__stories__/ImageCard.stories.tsx | 2 +-
.../__stories__/ValueCard.stories.tsx | 2 +-
.../__stories__/Container.stories.tsx | 2 +-
.../Content/__stories__/Content.stories.tsx | 2 +-
.../Drawer/__stories__/Drawer.stories.tsx | 2 +-
.../__stories__/FeaturedJobItem.stories.tsx | 2 +-
.../Form/Label/__stories__/Label.stories.tsx | 2 +-
.../__stories__/RegistrationForm.stories.tsx | 2 +-
.../Heading/__stories__/Heading.stories.tsx | 2 +-
.../__stories__/HeroBanner.stories.tsx | 2 +-
.../Modal/__stories__/Modal.stories.tsx | 2 +-
.../__stories__/OutboundLink.stories.tsx | 2 +-
.../__stories__/PartnerLogoLink.stories.tsx | 5 +--
.../__stories__/ProgressIndicator.stories.tsx | 42 +++++++++----------
.../__stories__/DonateSection.stories.tsx | 2 +-
.../__stories__/JoinSection.stories.tsx | 2 +-
.../__stories__/SponsorSection.stories.tsx | 2 +-
.../__stories__/ScreenReaderOnly.stories.tsx | 2 +-
.../__stories__/SuccessStory.stories.tsx | 2 +-
31 files changed, 59 insertions(+), 73 deletions(-)
diff --git a/.storybook/OCTheme.js b/.storybook/OCTheme.js
index 6151b8268..d8cddb19b 100644
--- a/.storybook/OCTheme.js
+++ b/.storybook/OCTheme.js
@@ -1,4 +1,4 @@
-import { create } from '@storybook/theming/create';
+import { create } from 'storybook/theming/create';
export default create({
base: 'dark',
diff --git a/.storybook/main.ts b/.storybook/main.ts
index 8bf423187..e6ef8e523 100644
--- a/.storybook/main.ts
+++ b/.storybook/main.ts
@@ -1,4 +1,4 @@
-const svgoConfig = require('../common/config/svgo');
+import svgoConfig from '../common/config/svgo';
import type { StorybookConfig } from '@storybook/nextjs';
const config: StorybookConfig = {
@@ -7,14 +7,11 @@ const config: StorybookConfig = {
'../components/**/__stories__/*.stories.@(js|jsx|mjs|ts|tsx)',
],
staticDirs: ['../public'],
- addons: [
- '@storybook/addon-essentials',
- {
- name: '@storybook/addon-styling',
- /** @see https://storybook.js.org/recipes/tailwindcss#:~:text=then%20leave%20the%20options%20object%20empty. */
- options: {},
- },
- ],
+ addons: ['@storybook/addon-docs'],
+ framework: {
+ name: '@storybook/nextjs',
+ options: {},
+ },
webpackFinal: async config => {
// Find the Storybook Webpack rule relevant to SVG files.
// @ts-expect-error => 'config.module' is possibly 'undefined'.ts(18048)
@@ -48,13 +45,6 @@ const config: StorybookConfig = {
return config;
},
- framework: {
- name: '@storybook/nextjs',
- options: {},
- },
- docs: {
- autodocs: true,
- },
};
export default config;
diff --git a/.storybook/manager.js b/.storybook/manager.js
index af159b636..535b96b0c 100644
--- a/.storybook/manager.js
+++ b/.storybook/manager.js
@@ -1,4 +1,4 @@
-import { addons } from '@storybook/addons';
+import { addons } from 'storybook/manager-api';
import OCTheme from './OCTheme';
addons.setConfig({
diff --git a/.storybook/preview.js b/.storybook/preview.js
index a9f4bed49..d88ee72f8 100644
--- a/.storybook/preview.js
+++ b/.storybook/preview.js
@@ -1,5 +1,5 @@
import 'common/styles/globals.css';
-import * as viewports from '@storybook/addon-viewport';
+import { MINIMAL_VIEWPORTS, INITIAL_VIEWPORTS } from 'storybook/viewport';
export const decorators = [
Story => (
@@ -9,13 +9,14 @@ export const decorators = [
),
];
+export const tags = ['autodocs'];
+
const preview = {
parameters: {
- actions: { argTypesRegex: '^on[A-Z].*' },
viewport: {
viewports: {
- ...viewports.MINIMAL_VIEWPORTS,
- ...viewports.INITIAL_VIEWPORTS,
+ ...MINIMAL_VIEWPORTS,
+ ...INITIAL_VIEWPORTS,
},
},
},
diff --git a/components/Accordion/__stories__/Accordion.stories.tsx b/components/Accordion/__stories__/Accordion.stories.tsx
index 5f376fa01..a2692a7fa 100644
--- a/components/Accordion/__stories__/Accordion.stories.tsx
+++ b/components/Accordion/__stories__/Accordion.stories.tsx
@@ -1,4 +1,4 @@
-import type { Meta, StoryObj } from '@storybook/react';
+import type { Meta, StoryObj } from '@storybook/nextjs';
import Accordion from '../Accordion';
type AccordionStoryType = StoryObj;
diff --git a/components/Alert/__stories__/Alert.stories.tsx b/components/Alert/__stories__/Alert.stories.tsx
index d088fc679..34a9718bd 100644
--- a/components/Alert/__stories__/Alert.stories.tsx
+++ b/components/Alert/__stories__/Alert.stories.tsx
@@ -1,4 +1,4 @@
-import type { Meta, StoryObj } from '@storybook/react';
+import type { Meta, StoryObj } from '@storybook/nextjs';
import Alert from '../Alert';
type AlertStoryType = StoryObj;
diff --git a/components/Badge/__stories__/Badge.stories.tsx b/components/Badge/__stories__/Badge.stories.tsx
index 618831396..57f8807b1 100644
--- a/components/Badge/__stories__/Badge.stories.tsx
+++ b/components/Badge/__stories__/Badge.stories.tsx
@@ -1,4 +1,4 @@
-import type { Meta, StoryObj } from '@storybook/react';
+import type { Meta, StoryObj } from '@storybook/nextjs';
import GithubIcon from 'public/static/images/icons/github_logo.svg';
import TwitterIcon from 'public/static/images/icons/twitter_logo.svg';
import PinterestIcon from 'public/static/images/icons/pinterest_logo.svg';
diff --git a/components/Buttons/Button/__stories__/Button.stories.tsx b/components/Buttons/Button/__stories__/Button.stories.tsx
index 30507b544..b62c91ca7 100644
--- a/components/Buttons/Button/__stories__/Button.stories.tsx
+++ b/components/Buttons/Button/__stories__/Button.stories.tsx
@@ -1,4 +1,4 @@
-import type { Meta, StoryObj } from '@storybook/react';
+import type { Meta, StoryObj } from '@storybook/nextjs';
import Button from '../Button';
type ButtonStoryType = StoryObj;
diff --git a/components/Buttons/CloseButton/__stories__/CloseButton.stories.tsx b/components/Buttons/CloseButton/__stories__/CloseButton.stories.tsx
index f5415dbf0..a85980ef9 100644
--- a/components/Buttons/CloseButton/__stories__/CloseButton.stories.tsx
+++ b/components/Buttons/CloseButton/__stories__/CloseButton.stories.tsx
@@ -1,4 +1,4 @@
-import type { Meta, StoryObj } from '@storybook/react';
+import type { Meta, StoryObj } from '@storybook/nextjs';
import CloseButton from '../CloseButton';
type CloseButtonStoryType = StoryObj;
diff --git a/components/Buttons/LinkButton/__stories__/LinkButton.stories.tsx b/components/Buttons/LinkButton/__stories__/LinkButton.stories.tsx
index 653cbc85e..efc34e119 100644
--- a/components/Buttons/LinkButton/__stories__/LinkButton.stories.tsx
+++ b/components/Buttons/LinkButton/__stories__/LinkButton.stories.tsx
@@ -1,4 +1,4 @@
-import type { Meta, StoryObj } from '@storybook/react';
+import type { Meta, StoryObj } from '@storybook/nextjs';
import LinkButton from '../LinkButton';
type LinkButtonStoryType = StoryObj;
diff --git a/components/Cards/Card/__stories__/Card.stories.tsx b/components/Cards/Card/__stories__/Card.stories.tsx
index 23eb04add..55ebbbf35 100644
--- a/components/Cards/Card/__stories__/Card.stories.tsx
+++ b/components/Cards/Card/__stories__/Card.stories.tsx
@@ -1,4 +1,4 @@
-import type { Meta, StoryObj } from '@storybook/react';
+import type { Meta, StoryObj } from '@storybook/nextjs';
import { descriptions } from 'common/constants/descriptions';
import Card from '../Card';
diff --git a/components/Cards/FlatCard/__stories__/FlatCard.stories.tsx b/components/Cards/FlatCard/__stories__/FlatCard.stories.tsx
index 3dbcf7ac1..419111e9e 100644
--- a/components/Cards/FlatCard/__stories__/FlatCard.stories.tsx
+++ b/components/Cards/FlatCard/__stories__/FlatCard.stories.tsx
@@ -1,4 +1,4 @@
-import type { StoryFn } from '@storybook/react';
+import type { StoryFn } from '@storybook/nextjs';
import { descriptions } from 'common/constants/descriptions';
import FlatCard from '../FlatCard';
diff --git a/components/Cards/ImageCard/__stories__/ImageCard.stories.tsx b/components/Cards/ImageCard/__stories__/ImageCard.stories.tsx
index e49ecba0b..96ceada44 100644
--- a/components/Cards/ImageCard/__stories__/ImageCard.stories.tsx
+++ b/components/Cards/ImageCard/__stories__/ImageCard.stories.tsx
@@ -1,4 +1,4 @@
-import type { Meta, StoryObj } from '@storybook/react';
+import type { Meta, StoryObj } from '@storybook/nextjs';
import { descriptions } from 'common/constants/descriptions';
import { s3 } from 'common/constants/urls';
import ImageCard from '../ImageCard';
diff --git a/components/Cards/ValueCard/__stories__/ValueCard.stories.tsx b/components/Cards/ValueCard/__stories__/ValueCard.stories.tsx
index 5d8409a21..c7bcee357 100644
--- a/components/Cards/ValueCard/__stories__/ValueCard.stories.tsx
+++ b/components/Cards/ValueCard/__stories__/ValueCard.stories.tsx
@@ -1,4 +1,4 @@
-import type { Meta, StoryObj } from '@storybook/react';
+import type { Meta, StoryObj } from '@storybook/nextjs';
import { descriptions } from 'common/constants/descriptions';
import ValueCard from '../ValueCard';
diff --git a/components/Container/__stories__/Container.stories.tsx b/components/Container/__stories__/Container.stories.tsx
index ffb2f42a0..878e455c4 100644
--- a/components/Container/__stories__/Container.stories.tsx
+++ b/components/Container/__stories__/Container.stories.tsx
@@ -1,4 +1,4 @@
-import type { Meta, StoryObj } from '@storybook/react';
+import type { Meta, StoryObj } from '@storybook/nextjs';
import { descriptions } from 'common/constants/descriptions';
import Container from '../Container';
diff --git a/components/Content/__stories__/Content.stories.tsx b/components/Content/__stories__/Content.stories.tsx
index 1425d9b65..c08b1669b 100644
--- a/components/Content/__stories__/Content.stories.tsx
+++ b/components/Content/__stories__/Content.stories.tsx
@@ -1,4 +1,4 @@
-import type { Meta, StoryObj } from '@storybook/react';
+import type { Meta, StoryObj } from '@storybook/nextjs';
import Content from '../Content';
type ContentStoryType = StoryObj;
diff --git a/components/Drawer/__stories__/Drawer.stories.tsx b/components/Drawer/__stories__/Drawer.stories.tsx
index 134721355..84fb53a8e 100644
--- a/components/Drawer/__stories__/Drawer.stories.tsx
+++ b/components/Drawer/__stories__/Drawer.stories.tsx
@@ -1,4 +1,4 @@
-import type { Meta, StoryObj } from '@storybook/react';
+import type { Meta, StoryObj } from '@storybook/nextjs';
import Drawer from '../Drawer';
type DrawerStorytype = StoryObj;
diff --git a/components/FeaturedJobItem/__stories__/FeaturedJobItem.stories.tsx b/components/FeaturedJobItem/__stories__/FeaturedJobItem.stories.tsx
index 4c93ca47f..21a1dd33b 100644
--- a/components/FeaturedJobItem/__stories__/FeaturedJobItem.stories.tsx
+++ b/components/FeaturedJobItem/__stories__/FeaturedJobItem.stories.tsx
@@ -1,4 +1,4 @@
-import type { Meta, StoryObj } from '@storybook/react';
+import type { Meta, StoryObj } from '@storybook/nextjs';
import { descriptions } from 'common/constants/descriptions';
import FeaturedJobItem from '../FeaturedJobItem';
diff --git a/components/Form/Label/__stories__/Label.stories.tsx b/components/Form/Label/__stories__/Label.stories.tsx
index ac1f35f62..464e0e438 100644
--- a/components/Form/Label/__stories__/Label.stories.tsx
+++ b/components/Form/Label/__stories__/Label.stories.tsx
@@ -1,4 +1,4 @@
-import type { StoryFn } from '@storybook/react';
+import type { StoryFn } from '@storybook/nextjs';
import Label from '../Label';
export default {
diff --git a/components/Forms/RegistrationForm/__stories__/RegistrationForm.stories.tsx b/components/Forms/RegistrationForm/__stories__/RegistrationForm.stories.tsx
index 75af491bd..9a2e5bd7a 100644
--- a/components/Forms/RegistrationForm/__stories__/RegistrationForm.stories.tsx
+++ b/components/Forms/RegistrationForm/__stories__/RegistrationForm.stories.tsx
@@ -1,4 +1,4 @@
-import type { StoryFn } from '@storybook/react';
+import type { StoryFn } from '@storybook/nextjs';
import { RegistrationForm, type RegistrationFormValues } from '../RegistrationForm';
export default {
diff --git a/components/Heading/__stories__/Heading.stories.tsx b/components/Heading/__stories__/Heading.stories.tsx
index 6d5262a65..74b3c2c74 100644
--- a/components/Heading/__stories__/Heading.stories.tsx
+++ b/components/Heading/__stories__/Heading.stories.tsx
@@ -1,4 +1,4 @@
-import type { Meta, StoryObj } from '@storybook/react';
+import type { Meta, StoryObj } from '@storybook/nextjs';
import Heading from '../Heading';
type HeadingStoryType = StoryObj;
diff --git a/components/HeroBanner/__stories__/HeroBanner.stories.tsx b/components/HeroBanner/__stories__/HeroBanner.stories.tsx
index 84ded14b6..5ac2e8960 100644
--- a/components/HeroBanner/__stories__/HeroBanner.stories.tsx
+++ b/components/HeroBanner/__stories__/HeroBanner.stories.tsx
@@ -1,4 +1,4 @@
-import type { Meta, StoryObj } from '@storybook/react';
+import type { Meta, StoryObj } from '@storybook/nextjs';
import HeroBanner from '../HeroBanner';
type HeroBannerStoryType = StoryObj;
diff --git a/components/Modal/__stories__/Modal.stories.tsx b/components/Modal/__stories__/Modal.stories.tsx
index 7d60da57f..986416aa4 100644
--- a/components/Modal/__stories__/Modal.stories.tsx
+++ b/components/Modal/__stories__/Modal.stories.tsx
@@ -1,4 +1,4 @@
-import type { Meta, StoryObj } from '@storybook/react';
+import type { Meta, StoryObj } from '@storybook/nextjs';
import { useState } from 'react';
import isChromatic from 'chromatic/isChromatic';
import { descriptions } from 'common/constants/descriptions';
diff --git a/components/OutboundLink/__stories__/OutboundLink.stories.tsx b/components/OutboundLink/__stories__/OutboundLink.stories.tsx
index de23adefe..469b8a6d1 100644
--- a/components/OutboundLink/__stories__/OutboundLink.stories.tsx
+++ b/components/OutboundLink/__stories__/OutboundLink.stories.tsx
@@ -1,4 +1,4 @@
-import type { Meta, StoryObj } from '@storybook/react';
+import type { Meta, StoryObj } from '@storybook/nextjs';
import { descriptions } from 'common/constants/descriptions';
import OutboundLink from '../OutboundLink';
diff --git a/components/PartnerLogoLink/__stories__/PartnerLogoLink.stories.tsx b/components/PartnerLogoLink/__stories__/PartnerLogoLink.stories.tsx
index 814376662..ebbdf0104 100644
--- a/components/PartnerLogoLink/__stories__/PartnerLogoLink.stories.tsx
+++ b/components/PartnerLogoLink/__stories__/PartnerLogoLink.stories.tsx
@@ -1,5 +1,4 @@
-import type { Meta, StoryObj } from '@storybook/react';
-import { hrefTo } from '@storybook/addon-links';
+import type { Meta, StoryObj } from '@storybook/nextjs';
import { s3 } from 'common/constants/urls';
import PartnerLogoLink from '../PartnerLogoLink';
@@ -11,7 +10,7 @@ const meta: Meta = {
args: {
logoSource: `${s3}partnerLogos/github.png`,
name: 'Partner Name',
- url: await hrefTo('PartnerLogoLink', 'docs'),
+ url: '#',
},
};
diff --git a/components/ProgressIndicator/__stories__/ProgressIndicator.stories.tsx b/components/ProgressIndicator/__stories__/ProgressIndicator.stories.tsx
index de202915a..0937d32eb 100644
--- a/components/ProgressIndicator/__stories__/ProgressIndicator.stories.tsx
+++ b/components/ProgressIndicator/__stories__/ProgressIndicator.stories.tsx
@@ -1,13 +1,5 @@
-import type { Meta, StoryObj } from '@storybook/react';
-import {
- Title,
- ArgTypes,
- Canvas,
- Heading,
- Subheading,
- Description,
- Source,
-} from '@storybook/blocks';
+import type { Meta, StoryObj } from '@storybook/nextjs';
+import { Title, ArgTypes, Canvas, Heading, Subheading, Source } from '@storybook/addon-docs/blocks';
import ProgressIndicator from '../ProgressIndicator';
type ProgressIndicatorStoryType = StoryObj;
@@ -15,12 +7,16 @@ type ProgressIndicatorStoryType = StoryObj;
const meta: Meta = {
title: 'ProgressIndicator',
component: ProgressIndicator,
+ args: {
+ stepNumber: 0,
+ totalSteps: 1,
+ },
argTypes: {
stepNumber: {
- control: { type: 'number' },
+ control: { type: 'number', min: 0 },
},
totalSteps: {
- control: { type: 'number' },
+ control: { type: 'number', min: 1 },
},
},
parameters: {
@@ -33,14 +29,14 @@ const meta: Meta = {
Best practices Basic usage
- Import the `ProgressIndicator` component and render.
+
Import the ProgressIndicator component and render.
- Use in the UI where needed.
+
Use in the UI where needed.
= {
`}
/>
totalSteps
-
- Sets the number of "steps" are needed to fill the indicator bar. *The
- `totalSteps` value needs to be more than, or equal to the `stepNumber` value*.
-
+
+ Sets the number of "steps" are needed to fill the indicator bar. The
+ totalSteps value needs to be more than, or equal to the stepNumber value.
+
stepNumber
-
+
Sets the number of "completed" steps and fills the indicator bar relative to
- the `totalSteps` value. *The `stepNumber` value needs to be less than, or equal to the
- `totalSteps` value*.
-
- For use when Operation Code's logo name is between 0-1 inch in height. In most cases, use the Original Small Logo. The Stacked Small Logo is to be used where graphics needs are larger in vertical height than horizontal width with the Operation Code logo name still under 1 inch in height.
-
-
-
-
+
+ Scroll to
+ Logo
+
+
-
-
-
+
+ Link Icon
+
+
+
+
+
+
+
+ Logo
+
+
+
+
+
+
+ Small Logos
+
+
+ For use when Operation Code's logo name is between 0-1 inch in height. In most cases, use the Original Small Logo. The Stacked Small Logo is to be used where graphics needs are larger in vertical height than horizontal width with the Operation Code logo name still under 1 inch in height.
+
- Use the Large Stacked Original logo in areas where you have more vertical space than horizontal. Only use the Red Stacked Logo for special holidays such as Thanksgiving, fall events, and Christmas. The Light Stacked Logo is to be used with dark or contrasting bright colored backgrounds.
-
-
-
-
+
+
+
+
+
+ Stacked Logos
+
+
+ Use the Large Stacked Original logo in areas where you have more vertical space than horizontal. Only use the Red Stacked Logo for special holidays such as Thanksgiving, fall events, and Christmas. The Light Stacked Logo is to be used with dark or contrasting bright colored backgrounds.
+
- Use the following images when you are prompted to upload a thumbnail logo only or profile photo. In most cases, use the OC Blue option. The Red option should only be used for holidays and special events (such as Thanksgiving, fall, or Christmas). The Navy option should be used memorandums or lighter bright colored backgrounds.
-
-
- You may also use them as a profile photo or thumbnail. They should be used to accompany corporate sponsors or alliance partnerships on shared branding. Use the original OC Blue option in most cases, except the Red option for special events and holidays (Thanksgiving, fall and Christmas). The Navy option may be used with light backgrounds and bright colored backgrounds.
-
-
-
-
+
+
+
+
+
+ Medals / Badges
+
+
+ Use the following images when you are prompted to upload a thumbnail logo only or profile photo. In most cases, use the OC Blue option. The Red option should only be used for holidays and special events (such as Thanksgiving, fall, or Christmas). The Navy option should be used memorandums or lighter bright colored backgrounds.
+
+
+ You may also use them as a profile photo or thumbnail. They should be used to accompany corporate sponsors or alliance partnerships on shared branding. Use the original OC Blue option in most cases, except the Red option for special events and holidays (Thanksgiving, fall and Christmas). The Navy option may be used with light backgrounds and bright colored backgrounds.
+
- Use the Original Large Logo in almost all cases above 1 inch in height. The Red Large Logo is to be used in special events (such as Thanksgiving, fall or Christmas), and the Light Large Logo is to be used with dark backgrounds or bright colored backgrounds.
-
-
-
-
+
+
+
+
+
+
+
+ Large Logos
+
+
+ Use the Original Large Logo in almost all cases above 1 inch in height. The Red Large Logo is to be used in special events (such as Thanksgiving, fall or Christmas), and the Light Large Logo is to be used with dark backgrounds or bright colored backgrounds.
+
`;
diff --git a/components/Forms/UpdateProfileForm/steps/__tests__/__snapshots__/MilitaryDetails.test.tsx.snap b/components/Forms/UpdateProfileForm/steps/__tests__/__snapshots__/MilitaryDetails.test.tsx.snap
index 2dd6c53bb..936416fe0 100644
--- a/components/Forms/UpdateProfileForm/steps/__tests__/__snapshots__/MilitaryDetails.test.tsx.snap
+++ b/components/Forms/UpdateProfileForm/steps/__tests__/__snapshots__/MilitaryDetails.test.tsx.snap
@@ -1,269 +1,208 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
exports[`UpdateProfileForm/Steps/MilitaryDetails > should render in context of Formik 1`] = `
-
-
+
-
+
-
+
+
- Select...
-
-
+ Select...
+
+
-
-
-
-
-
+
-
-
+
+
+
+
-
-
-
+
+
+
-
-
-
+
-
+
+
- Select...
-
-
+ Select...
+
+
-
-
-
-
-
+
-
-
+
+
+
+
+
-
-
-
+
+
`;
diff --git a/components/Forms/UpdateProfileForm/steps/__tests__/__snapshots__/MilitaryStatus.test.tsx.snap b/components/Forms/UpdateProfileForm/steps/__tests__/__snapshots__/MilitaryStatus.test.tsx.snap
index 4f5af365e..46d4e33b3 100644
--- a/components/Forms/UpdateProfileForm/steps/__tests__/__snapshots__/MilitaryStatus.test.tsx.snap
+++ b/components/Forms/UpdateProfileForm/steps/__tests__/__snapshots__/MilitaryStatus.test.tsx.snap
@@ -1,153 +1,122 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
exports[`UpdateProfileForm/Steps/MilitaryStatus > should render in context of Formik 1`] = `
-
-
+
-
- Please note that many of our services are only for veterans or their spouses. Also, note that you may feel represented by multiple categories; however, you may only choose one for this registration form.
-
-
-
- How do you classify yourself in regards to being part of the military?
-
-
-
+
+ Please note that many of our services are only for veterans or their spouses. Also, note that you may feel represented by multiple categories; however, you may only choose one for this registration form.
+
+
+
+ How do you classify yourself in regards to being part of the military?
+
+
-
+
+
- Select...
-
-
+ Select...
+
+
-
-
-
-
-
+
-
-
+
+
+
+
+
-
-
-
+
+
`;
diff --git a/components/Forms/UpdateProfileForm/steps/__tests__/__snapshots__/PersonalDetails.test.tsx.snap b/components/Forms/UpdateProfileForm/steps/__tests__/__snapshots__/PersonalDetails.test.tsx.snap
index cd4589c8f..721453ee0 100644
--- a/components/Forms/UpdateProfileForm/steps/__tests__/__snapshots__/PersonalDetails.test.tsx.snap
+++ b/components/Forms/UpdateProfileForm/steps/__tests__/__snapshots__/PersonalDetails.test.tsx.snap
@@ -1,524 +1,402 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
exports[`UpdateProfileForm/Steps/PersonalDetails > should render in context of Formik 1`] = `
-
-
+
-
+
-
+
+
- Select...
-
-
+ Select...
+
+
-
-
-
-
-
+
-
-
+
+
+
+
-
-
-
+
+
+
-
-
-
+
-
+
+
- Select...
-
-
+ Select...
+
+
-
-
-
-
-
+
-
-
+
+
+
+
+
-
-
-
-
+
-
+
+
- Select...
-
-
+ Select...
+
+
-
-
-
-
-
+
-
-
+
+
+
+
-
-
-
+
+
+
-
-
-
+
-
+
+
- Select...
-
-
+ Select...
+
+
-
-
-
-
-
+
-
-
+
+
+
+
+
-
-
-
+
+
`;
diff --git a/components/Forms/UpdateProfileForm/steps/__tests__/__snapshots__/ProfessionalDetails.test.tsx.snap b/components/Forms/UpdateProfileForm/steps/__tests__/__snapshots__/ProfessionalDetails.test.tsx.snap
index a71844d8f..85da89d2c 100644
--- a/components/Forms/UpdateProfileForm/steps/__tests__/__snapshots__/ProfessionalDetails.test.tsx.snap
+++ b/components/Forms/UpdateProfileForm/steps/__tests__/__snapshots__/ProfessionalDetails.test.tsx.snap
@@ -1,193 +1,156 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
exports[`UpdateProfileForm/Steps/ProfessionalDetails > should render in context of Formik 1`] = `
-
-
+
-
+
-
+
+
- Select...
-
-
+ Select...
+
+
-
-
-
-
-
+
-
-
+
+
+
+
+
-
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
+
+
`;
diff --git a/components/Heading/__tests__/__snapshots__/Heading.test.tsx.snap b/components/Heading/__tests__/__snapshots__/Heading.test.tsx.snap
index 16a4279c9..b9d1d0f15 100644
--- a/components/Heading/__tests__/__snapshots__/Heading.test.tsx.snap
+++ b/components/Heading/__tests__/__snapshots__/Heading.test.tsx.snap
@@ -1,54 +1,69 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
exports[`Heading > should render with many props assigned 1`] = `
-
-
+
- Test
-
+
+ Test
+
+
`;
exports[`Heading > should render with required props 1`] = `
-
`;
diff --git a/components/ReusableSections/DonateSection/__tests__/__snapshots__/DonateSection.test.tsx.snap b/components/ReusableSections/DonateSection/__tests__/__snapshots__/DonateSection.test.tsx.snap
index 308afefa9..26e527bc3 100644
--- a/components/ReusableSections/DonateSection/__tests__/__snapshots__/DonateSection.test.tsx.snap
+++ b/components/ReusableSections/DonateSection/__tests__/__snapshots__/DonateSection.test.tsx.snap
@@ -1,25 +1,75 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
exports[`DonateSection > should render with no props passed passed 1`] = `
-
-
-
- As a 501(c)(3) veteran-led nonprofit organization, our programs and services are maintained through the efforts of our volunteer staff. Your financial support allows us to continue helping the military community learn software development, enter the tech industry, and code the future.
-
+ As a 501(c)(3) veteran-led nonprofit organization, our programs and services are maintained through the efforts of our volunteer staff. Your financial support allows us to continue helping the military community learn software development, enter the tech industry, and code the future.
+
- These sponsors have donated cash to help keep the mission going here at Operation Code. They may or may not have also donated to our cause via others means.
-
- The following organizations have helped Operation Code through services, products, advertisements, scholarships, or sponsorships. We thank them for their contributions.
-
`;
diff --git a/components/Timeline/__tests__/__snapshots__/Timeline.test.tsx.snap b/components/Timeline/__tests__/__snapshots__/Timeline.test.tsx.snap
index 4e6950ccf..b68e6d8df 100644
--- a/components/Timeline/__tests__/__snapshots__/Timeline.test.tsx.snap
+++ b/components/Timeline/__tests__/__snapshots__/Timeline.test.tsx.snap
@@ -1,416 +1,876 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
exports[`Timeline > should render with no props passed passed 1`] = `
-
+
-
- 2011
-
-
-
+
+ 2011
+
+
+ class="relative px-5"
+ >
+
+
+
-
-
-
- Operation Code's founder - retired U.S. Army Captain, David Molina - attended his first hackathon in New York City. After a weekend learning to code at
-
-
- AngelHack,
-
-
- he was inspired to pursue software engineering as a post-military occupation. He submitted an application to The Flatiron School while on active-duty, only to discover that the program did not accept the "Post-9/11 GI Bill" as payment.
-
- }
- title="Humble Beginnings"
- />
-
-
-
-
-
- 2013
-
+
+
+ Humble Beginnings
+
+
+
+ Operation Code's founder - retired U.S. Army Captain, David Molina - attended his first hackathon in New York City. After a weekend learning to code at
+
+
+ AngelHack,
+
+ Opens in new window
+
+
+
+
+ External Link Symbol
+
+
+
+
+
+
+
+ he was inspired to pursue software engineering as a post-military occupation. He submitted an application to The Flatiron School while on active-duty, only to discover that the program did not accept the "Post-9/11 GI Bill" as payment.
+
+
+
+
+ class="flex-1 relative text-right"
+ >
+
+ 2013
+
+
-
-
-
- Molina exited military service and began to self-teach Ruby on Rails, a full-stack web development platform for building comprehensive web applications. He also started attending meetups with
-
-
- "Bmore on Rails"
-
-
- while finishing
-
-
- One Month's Rails
-
-
- online course. After meeting Rubyists from around the world, he was introduced to the Portland, Oregon Ruby group. Inspired, Molina joined Techstars'
-
-
- Patriot Boot Camp
-
- (PBC) at George Washington University.
-
- }
- title="One Month's Rails"
- />
-
- During this time, Molina met with Virginia Senator Tim Kaine, to speak about the inability to use the Post 9/11 GI Bill for coding bootcamps. Before departing D.C., Molina received advice from U.S. Army Congressional Fellow Ben Culver, on gathering data to address the problem. This was the beginning efforts for the current VET TEC pilot program under the Forever G.I. Bill.
-
- }
- title="Grassroots Advocacy"
- />
-
- Molina’s next step was to purchase the domain opcod3.us and work with fellow Army veteran and software developer, Don Livanec to finish the first live webpage in 2013.
-
- }
- title="Operation Code's First Draft"
- />
-
+ During this time, Molina met with Virginia Senator Tim Kaine, to speak about the inability to use the Post 9/11 GI Bill for coding bootcamps. Before departing D.C., Molina received advice from U.S. Army Congressional Fellow Ben Culver, on gathering data to address the problem. This was the beginning efforts for the current VET TEC pilot program under the Forever G.I. Bill.
+
+
+
+
+
+ Operation Code's First Draft
+
+
+
+ Molina’s next step was to purchase the domain opcod3.us and work with fellow Army veteran and software developer, Don Livanec to finish the first live webpage in 2013.
+
+
+
+
+ class="flex-1 relative text-right"
+ >
+
+ 2014
+
+
-
-
-
- At
-
-
- Cascadia Ruby,
-
-
- Molina received encouragement from fellow Rubyist, Whitney Rose, to launch Operation Code's petition using "Launchrock". After lengthy discussions with Kristin Smith, Adam Enbar (representing The Flatiron School), and
-
-
- Code Fellows,
-
-
- the first line of code is committed to
-
-
- GitHub
-
-
- .
-
- }
- title="First Commit"
- />
-
- Later that same year, web developer, teacher, entrepreneur and co-founder of
-
-
- Code Fellows,
-
-
- Ivan Storck, purchased the domain 'operationcode.org' and became our first donor in the process. To round out 2014, HackHands co-founders Forest Good and Geraldo Ramos joined Operation Code, designing our logo and providing veterans free access to
-
-
- hack.summit,
-
-
- a virtual conference to learn from the world's most renowned programmers.
-
- }
- title="Our Official Domain and Brand is Born"
- />
-
-
- Operation Code formally launched as a nonprofit, led by David Molina. The kickoff event hosted dozens of veterans, software developers, media representatives, and staff members from Senator Ron Wyden and Congressman Earl Blumenauer's offices.
-
- }
- title="501(c)(3) Official Status"
- />
-
-
-
-
-
- 2019
-
+
+
+
+
+
+
+ 501(c)(3) Official Status
+
+
+
+ Operation Code formally launched as a nonprofit, led by David Molina. The kickoff event hosted dozens of veterans, software developers, media representatives, and staff members from Senator Ron Wyden and Congressman Earl Blumenauer's offices.
+
+
+
+
+ class="flex-1 relative text-right"
+ >
+
+ 2019
+
+
-
-
-
- As a direct result of the lobbying and work of Operation Code,
-
-
- VET TEC
-
-
- was launched. Under the Harry W. Colmery Veterans Educational Assistance Act (also known as the Forever G.I. Bill), the
-
-
- VET TEC
-
-
- program received $15 million per annual budget to assist students in the areas of: information science, software, computer programming, data processing and media application. This program does not utilize the entitlement and remaining months of the G.I. Bill, but requires candidates to have at least one day of remaining entitlement remaining. Students receive a housing stipend similar to the G.I. Bill at the E-5 with dependents rate.
-
- }
- title="April 2019 Congress Passes VET TEC Program"
- />
-
-
-
-
-
+
+
+
+
- 2021
-
+
+
+ April 2019 Congress Passes VET TEC Program
+
+
+
+ As a direct result of the lobbying and work of Operation Code,
+
+
+ VET TEC
+
+ Opens in new window
+
+
+
+
+ External Link Symbol
+
+
+
+
+
+
+
+ was launched. Under the Harry W. Colmery Veterans Educational Assistance Act (also known as the Forever G.I. Bill), the
+
+
+ VET TEC
+
+ Opens in new window
+
+
+
+
+ External Link Symbol
+
+
+
+
+
+
+
+ program received $15 million per annual budget to assist students in the areas of: information science, software, computer programming, data processing and media application. This program does not utilize the entitlement and remaining months of the G.I. Bill, but requires candidates to have at least one day of remaining entitlement remaining. Students receive a housing stipend similar to the G.I. Bill at the E-5 with dependents rate.
+
+
+
+
+ class="flex-1 relative text-right"
+ >
+
+ 2021
+
+
-
-
-
- Operation Code receives the Gold Seal of Transparency from
-
-
- Guidestar.org,
-
-
- the independent data analysis for non-profit certification of approval.
-
- }
- title="February 2021 Guidestar Gold"
- />
-
- Today, Operation Code continues our advocacy efforts and strategic alliances, builds on our supportive online community, local chapter and online meetups, mentorship, career networking, free learning resources, access to code school scholarships, and continues to advocate for veteran and military family access to code schools and careers in the tech industry.
-
- }
- title="March 2021 Operation Code Exceeds 8000 Members"
- />
-
+ March 2021 Operation Code Exceeds 8000 Members
+
+
+
+ Today, Operation Code continues our advocacy efforts and strategic alliances, builds on our supportive online community, local chapter and online meetups, mentorship, career networking, free learning resources, access to code school scholarships, and continues to advocate for veteran and military family access to code schools and careers in the tech industry.
+
+
+
+
+ class="flex-1 relative text-right"
+ >
+
+ 2023
+
+
-
-
-
- Operation Code receives the
-
-
- Platinum Seal of Transparency
-
-
- from
-
-
- Guidestar.org,
-
-
- the independent data analysis for non-profit certification of approval.
-
- }
- title="August 2023 Guidestar Platinum"
- />
+ class="relative px-5"
+ >
+
+
+