From db16a6b32be4033da9d9c35e1bb2fdd58acc9b61 Mon Sep 17 00:00:00 2001 From: Mark E <51723535+Spark450@users.noreply.github.com> Date: Mon, 15 Jun 2026 12:48:33 -0700 Subject: [PATCH 01/26] feat(#3946): add team migration stories to website (#3990) Co-authored-by: Benji Franck Co-authored-by: Claude Opus 4.8 --- docs/public/search-index.json | 36 +++++++++ docs/src/components/RelatedArticles.astro | 79 +++++++++++++++++++ docs/src/content/config.ts | 1 + docs/src/content/get-started/articles.mdx | 26 ++++++ .../articles/parallel-paths-migration.mdx | 74 +++++++++++++++++ .../articles/two-phase-migration.mdx | 71 +++++++++++++++++ .../src/layouts/DocumentationPageLayout.astro | 6 +- docs/src/lib/get-started-nav.ts | 22 +++--- 8 files changed, 301 insertions(+), 14 deletions(-) create mode 100644 docs/src/components/RelatedArticles.astro create mode 100644 docs/src/content/get-started/articles.mdx create mode 100644 docs/src/content/get-started/articles/parallel-paths-migration.mdx create mode 100644 docs/src/content/get-started/articles/two-phase-migration.mdx diff --git a/docs/public/search-index.json b/docs/public/search-index.json index 1dbc8888b2..3e6089b280 100644 --- a/docs/public/search-index.json +++ b/docs/public/search-index.json @@ -2356,6 +2356,42 @@ ], "slug": "get-started/ai-tools-and-resources" }, + { + "type": "page", + "id": "parallel-paths-migration", + "title": "Parallel paths: migration alongside feature development", + "description": "How the Alberta Childcare Family Portal team managed a design system migration while actively building new features over approximately 2 months", + "status": "published", + "category": "get started", + "tags": [ + "articles" + ], + "slug": "get-started/articles/parallel-paths-migration" + }, + { + "type": "page", + "id": "two-phase-migration", + "title": "A two-phase migration: early adopter to production", + "description": "How the Caregiver Portal team joined the early adopter program and migrated a new product to the updated design system in 7–8 days across two phases", + "status": "published", + "category": "get started", + "tags": [ + "articles" + ], + "slug": "get-started/articles/two-phase-migration" + }, + { + "type": "page", + "id": "articles", + "title": "Articles", + "description": "Perspectives on design and technology from inside government — exploring the craft of building digital services that truly work for Albertans", + "status": "published", + "category": "get started", + "tags": [ + "intro" + ], + "slug": "get-started/articles" + }, { "type": "page", "id": "automated-accessibility", diff --git a/docs/src/components/RelatedArticles.astro b/docs/src/components/RelatedArticles.astro new file mode 100644 index 0000000000..23cf81998d --- /dev/null +++ b/docs/src/components/RelatedArticles.astro @@ -0,0 +1,79 @@ +--- +/** + * RelatedArticles.astro + * + * Renders a "Related articles" section at the bottom of an article page. + * Matches the visual pattern of Related examples in the examples section. + */ + +interface Article { + title: string; + url: string; +} + +interface Props { + articles: Article[]; +} + +const { articles } = Astro.props; +--- + +{articles.length > 0 && ( + +)} + + diff --git a/docs/src/content/config.ts b/docs/src/content/config.ts index c457369e3b..0e46fc3f81 100644 --- a/docs/src/content/config.ts +++ b/docs/src/content/config.ts @@ -275,6 +275,7 @@ const getStarted = defineCollection({ "ai-tools-and-resources", "contribute", "out-of-support", + "articles", ]), // Sort order within section. order: z.number(), diff --git a/docs/src/content/get-started/articles.mdx b/docs/src/content/get-started/articles.mdx new file mode 100644 index 0000000000..7a14664269 --- /dev/null +++ b/docs/src/content/get-started/articles.mdx @@ -0,0 +1,26 @@ +--- +id: articles +title: Articles +description: Perspectives on design and technology from inside government — exploring the craft of building digital services that truly work for Albertans +section: intro +order: 6 +status: published +--- +import { withBase } from "@/lib/base-url"; +import CardLite from "../../components/CardLite.astro"; + +Articles +Perspectives on design and technology from inside government — exploring the craft of building digital services that truly work for Albertans. + +
+ + +
diff --git a/docs/src/content/get-started/articles/parallel-paths-migration.mdx b/docs/src/content/get-started/articles/parallel-paths-migration.mdx new file mode 100644 index 0000000000..7f09e74bc2 --- /dev/null +++ b/docs/src/content/get-started/articles/parallel-paths-migration.mdx @@ -0,0 +1,74 @@ +--- +id: parallel-paths-migration +title: "Parallel paths: migration alongside feature development" +description: How the Alberta Childcare Family Portal team managed a design system migration while actively building new features over approximately 2 months +section: articles +order: 2 +status: published +--- +import { withBase } from "@/lib/base-url"; +import RelatedArticles from "../../../components/RelatedArticles.astro"; + +Parallel paths: migration alongside feature development + +The Alberta Childcare Family Portal helps parents find and access childcare services in Alberta. The team updated to the design system while the product was still in early development. + +

Migration at a glance

+ +
+ + + + + + + + + + + + + + + + + + + + +
Migration typeNew product with some legacy components
Team1 designer, 1 developer, 1 digital architect, 2 QA
TimelineApproximately 2 months (alongside active feature development)
Product size8–12 screens at time of migration
+
+
+ +

How they approached it

+The team updated while the product was still being built. Of the roughly two months the work spanned, around 30% of the effort went into the design system update — the rest was ongoing feature development which was running in parallel. +On the design side, the team identified what needed to change first, then moved quickly. Once the audit was done, the design updates — swapping and updating components — were quick and straightforward. + +

What went faster than expected

+Design updates were quicker than the team expected. After a clear audit of what needed to change, moving through the updates was fast. The smaller product size at the time of migration helped — 8–12 screens is a manageable scope for a focused review. +Development was smoother than expected given the scope of changes. + +

What took more time than expected

+Finding, installing, and configuring the right packages required more time and attention than the team had budgeted for. +Running parallel branches during the update added coordination overhead. Keeping feature development and update work in sync required careful management, particularly when design system packages were also changing during the same period. +Some token changes affected legacy components in unexpected ways and required investigation. API differences between versions also added time. + +

How they used AI

+Claude was used for design audits — comparing layout, spacing, and sizing across pages and understanding differences between versions. The team found AI most useful when prompts included design system context before asking specific questions. + +

What they'd tell another team

+ +- On the development side: + - It's ideal to do the migration in one shot. + - If possible, pause new feature development while your team tackles the upgrade. + - Expect to spend time on package setup and understanding how styling changes affect your application. + - Preparation and awareness of your dependencies matter. +- On the design side: + - Start working with the updated design system early to explore new possibilities. + - The updated design system supports newer patterns and can help you make better design decisions as you go. + + + +Back to articles diff --git a/docs/src/content/get-started/articles/two-phase-migration.mdx b/docs/src/content/get-started/articles/two-phase-migration.mdx new file mode 100644 index 0000000000..bc03e06b84 --- /dev/null +++ b/docs/src/content/get-started/articles/two-phase-migration.mdx @@ -0,0 +1,71 @@ +--- +id: two-phase-migration +title: "A two-phase migration: early adopter to production" +description: How the Caregiver Portal team joined the early adopter program and migrated a new product to the updated design system in 7–8 days across two phases +section: articles +order: 1 +status: published +--- +import { withBase } from "@/lib/base-url"; +import RelatedArticles from "../../../components/RelatedArticles.astro"; + +A two-phase migration: early adopter to production + +The Caregiver Portal is a digital service that supports caregivers navigating child intervention processes. The team joined the early adopters program and migrated before the full release, then later migrated to the production version of the updated design system. + +

Migration at a glance

+ +
+ + + + + + + + + + + + + + + + + + + + +
Migration typeNew product
Team1 designer, 1 developer
Timeline7–8 days across two migration phases
Product sizeNew product — small codebase
+
+
+ +

How they approached it

+The team migrated in two phases. The first move was from the legacy design system to the experimental library (Early adopter program), which took 2–3 days. The second phase, from the experimental library to the production release, took another 4–5 days. +The developer started with documentation, installed the correct packages, got the base implementation running, and then replaced custom styles with design tokens. Most of the time went into that last step. Some components had hundreds of lines of custom CSS to review and replace. +The designer started working with the updated design system before the production release. Staying close to design system standards from the start reduced rework later. + +

What went faster than expected

+Tokens were easier and faster to implement than the team expected. Once the packages were in place, replacing values with tokens was straightforward. On the design side, pulling Figma components directly from the library removed a lot of manual design work. +No major bugs were encountered. Most components just worked. + +

What took more time than expected

+Initial setup — finding the right packages and getting everything configured — took longer than expected. Factor this into your planning, even if your team is comfortable with the tooling. +Cleaning up custom styles also took time. For a new product this was manageable, but teams with more accumulated custom code should expect this phase to take longer. +A small number of component gaps required workarounds. The team needed to create a "data card" component manually, and certain components lack read-only states or the ability to be dismissed. Each gap required a design decision and, at times, extra implementation work. + +

How they used AI

+The developer used GitHub Copilot throughout the migration and recommends it — with one condition: set it up with your environment and documentation before you start. +In practice, Copilot identified custom code and styles and suggested alternative tokens based on the design system documentation. Overall it was helpful for both building and verifying, speeding up development significantly. + +

What they'd tell another team

+
    +
  • Check that your application is running on a modern version of Angular or React before you start. Older applications require more effort to migrate. Updating your framework version before migration will help reduce the overall effort.
  • +
  • Follow the documentation closely, replace old styles gradually, verify as you go, and set up AI tooling early to assist with the migration.
  • +
+ + + +Back to articles diff --git a/docs/src/layouts/DocumentationPageLayout.astro b/docs/src/layouts/DocumentationPageLayout.astro index bf7355fd71..3297b7e0fd 100644 --- a/docs/src/layouts/DocumentationPageLayout.astro +++ b/docs/src/layouts/DocumentationPageLayout.astro @@ -233,13 +233,13 @@ const getStartedNav = await getGetStartedNav(); margin-bottom: var(--goa-space-xs); } - /* Links */ - .prose-content :global(a) { + /* Links — excludes card components that happen to use as their root */ + .prose-content :global(a:not(.card-lite):not(.related-card)) { color: var(--goa-color-interactive-default); text-decoration: underline; } - .prose-content :global(a:hover) { + .prose-content :global(a:not(.card-lite):not(.related-card):hover) { color: var(--goa-color-interactive-hover); } diff --git a/docs/src/lib/get-started-nav.ts b/docs/src/lib/get-started-nav.ts index 73c67d4e81..1889701f15 100644 --- a/docs/src/lib/get-started-nav.ts +++ b/docs/src/lib/get-started-nav.ts @@ -74,17 +74,17 @@ export async function getGetStartedNav(): Promise { const entries = await getCollection("get-started"); const published = entries.filter((e) => e.data.status !== "deprecated"); - const sections: GetStartedNavSection[] = SECTION_ORDER - .filter((slug) => published.some((e) => e.data.section === slug)) - .map((slug) => { - const isGrouped = slug in SECTION_NAMES; - return { - slug, - type: isGrouped ? "grouped" : "flat", - name: isGrouped ? SECTION_NAMES[slug] : undefined, - pages: bySection(published, slug).map(entryToItem), - }; - }); + const sections: GetStartedNavSection[] = SECTION_ORDER.filter((slug) => + published.some((e) => e.data.section === slug), + ).map((slug) => { + const isGrouped = slug in SECTION_NAMES; + return { + slug, + type: isGrouped ? "grouped" : "flat", + name: isGrouped ? SECTION_NAMES[slug] : undefined, + pages: bySection(published, slug).map(entryToItem), + }; + }); return { sections }; } From 4088a110cd00238804cc9642c8d3f149745139a2 Mon Sep 17 00:00:00 2001 From: Mark E <51723535+Spark450@users.noreply.github.com> Date: Mon, 15 Jun 2026 12:49:48 -0700 Subject: [PATCH 02/26] fix(#3837): prevent tab label horizontal shift on selection change (#4036) * fix(#3837): prevent tab label horizontal shift on selection change Co-authored-by: Claude Sonnet 4.6 --- .../routes/bugs/3837/bug3837.component.html | 53 +++++++++ .../src/routes/bugs/3837/bug3837.component.ts | 10 ++ .../src/routes/bugs/3837/bug3837.route.json | 6 + .../src/app/routes/bugs/bug3837.route.ts | 10 ++ apps/prs/react/src/routes/bugs/bug3837.tsx | 112 ++++++++++++++++++ .../src/components/tabs/Tabs.svelte | 15 ++- 6 files changed, 205 insertions(+), 1 deletion(-) create mode 100644 apps/prs/angular/src/routes/bugs/3837/bug3837.component.html create mode 100644 apps/prs/angular/src/routes/bugs/3837/bug3837.component.ts create mode 100644 apps/prs/angular/src/routes/bugs/3837/bug3837.route.json create mode 100644 apps/prs/react/src/app/routes/bugs/bug3837.route.ts create mode 100644 apps/prs/react/src/routes/bugs/bug3837.tsx diff --git a/apps/prs/angular/src/routes/bugs/3837/bug3837.component.html b/apps/prs/angular/src/routes/bugs/3837/bug3837.component.html new file mode 100644 index 0000000000..b182289435 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3837/bug3837.component.html @@ -0,0 +1,53 @@ +Bug 3837 - Tabs: label should not shift horizontally when selection changes + + Click between tabs and observe that labels do not shift horizontally. The active tab bold treatment should be preserved. + + +Test 1: String headings (default) + + Short tab content + Longer tab content + Medium tab content + Another tab content + + +Test 2: Similar-length string headings + + Information content + Documents content + History content + + +Test 3: Slot headings +Tabs using the heading slot rather than a string prop. Verify no shift occurs. + + + Short + Short tab content + + + Much longer label + Longer tab content + + + Medium label + Medium tab content + + + +Test 4: Slot headings with badge +Tabs with a badge alongside the label text in the slot. The ghost text only reserves space for the text portion, so a small shift may still occur here. + + + Notifications + Notifications content + + + Much longer label + Longer tab content + + + History + History content + + diff --git a/apps/prs/angular/src/routes/bugs/3837/bug3837.component.ts b/apps/prs/angular/src/routes/bugs/3837/bug3837.component.ts new file mode 100644 index 0000000000..d8b86c81eb --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3837/bug3837.component.ts @@ -0,0 +1,10 @@ +import { Component } from "@angular/core"; +import { GoabBadge, GoabTab, GoabTabs, GoabText } from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-bug3837", + templateUrl: "./bug3837.component.html", + imports: [GoabBadge, GoabTab, GoabTabs, GoabText], +}) +export class Bug3837Component {} diff --git a/apps/prs/angular/src/routes/bugs/3837/bug3837.route.json b/apps/prs/angular/src/routes/bugs/3837/bug3837.route.json new file mode 100644 index 0000000000..82e0586a85 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3837/bug3837.route.json @@ -0,0 +1,6 @@ +{ + "type": "bug", + "id": "3837", + "path": "bugs/3837", + "title": "Tabs label shift on selection" +} diff --git a/apps/prs/react/src/app/routes/bugs/bug3837.route.ts b/apps/prs/react/src/app/routes/bugs/bug3837.route.ts new file mode 100644 index 0000000000..d63ff79179 --- /dev/null +++ b/apps/prs/react/src/app/routes/bugs/bug3837.route.ts @@ -0,0 +1,10 @@ +import { Bug3837Route } from "../../../routes/bugs/bug3837"; +import type { PrRouteDefinition } from "../../route-manifest"; + +export default { + type: "bug", + id: "3837", + path: "bugs/3837", + title: "Tabs label shift on selection", + component: Bug3837Route, +} satisfies PrRouteDefinition; diff --git a/apps/prs/react/src/routes/bugs/bug3837.tsx b/apps/prs/react/src/routes/bugs/bug3837.tsx new file mode 100644 index 0000000000..e3eeb4a41a --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug3837.tsx @@ -0,0 +1,112 @@ +import { + GoabBlock, + GoabText, + GoabDivider, + GoabDetails, + GoabLink, + GoabTabs, + GoabTab, + GoabBadge, +} from "@abgov/react-components"; + +export function Bug3837Route() { + return ( +
+ + Bug #3837: Tabs label should not shift horizontally when selection changes + + + + + + View on GitHub + + + + + + When switching between tabs, the tab labels shift horizontally. This is caused by a bold + font weight being applied to the active tab, causing the text to take up more space and + nudging adjacent tabs out of position. + + + + + + + Test Cases + + Test 1: String headings (default) + + Click between tabs and observe that the labels do not shift position. The active tab bold + treatment should be preserved. + + + + Short tab content + + + Longer tab content + + + Medium tab content + + + Another tab content + + + + Test 2: Similar-length string headings + + All tabs have similar-length labels to make any shift more visible. Verify no horizontal + movement when switching tabs. + + + + Information content + + + Documents content + + + History content + + + + Test 3: Slot headings (text only) + + Tabs using the heading slot (ReactNode) rather than a string prop. Verify no shift occurs. + + + Short}> + Short tab content + + Much longer label}> + Longer tab content + + Medium label}> + Medium tab content + + + + Test 4: Slot headings with badge + + Tabs with a badge alongside the label text in the slot. The ghost text only reserves space + for the text portion, so a small shift may still occur here. + + + Notifications }> + Notifications content + + Much longer label }> + Longer tab content + + History}> + History content + + +
+ ); +} + +export default Bug3837Route; diff --git a/libs/web-components/src/components/tabs/Tabs.svelte b/libs/web-components/src/components/tabs/Tabs.svelte index 6dba4e53d6..1e4bdfb828 100644 --- a/libs/web-components/src/components/tabs/Tabs.svelte +++ b/libs/web-components/src/components/tabs/Tabs.svelte @@ -208,7 +208,7 @@ link.setAttribute("aria-controls", `tabpanel-${index + 1}`); // Store text content for CSS pseudo-element (prevents layout shift when font-weight changes) - if (variant === "segmented") { + if (variant === "segmented" || version === "2") { const textContent = headingEl.textContent?.trim() || ""; if (textContent) { link.setAttribute("data-text", textContent); @@ -765,6 +765,19 @@ } } + /* Prevent layout shift when bold font is applied to selected tab */ + .v2:not(.segmented) :global([role="tab"][data-text]) { + flex-direction: column; + } + + .v2:not(.segmented) :global([role="tab"][data-text]::before) { + content: attr(data-text); + font: var(--goa-tab-typography-selected); + height: 0; + visibility: hidden; + overflow: hidden; + } + /* ======================================== Segmented Variant (Pill/Button style tabs) ======================================== */ From 35c7b0655dcdf3cabb86d59a217a9b08cab9ec2f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Jun 2026 14:09:26 +0000 Subject: [PATCH 03/26] chore(deps): bump react-router and react-router-dom Bumps [react-router](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router) to 6.30.4 and updates ancestor dependency [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom). These dependencies need to be updated together. Updates `react-router` from 6.30.3 to 6.30.4 - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/react-router@6.30.4/packages/react-router/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router@6.30.4/packages/react-router) Updates `react-router-dom` from 6.30.3 to 6.30.4 - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/react-router-dom@6.30.4/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.30.4/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router dependency-version: 6.30.4 dependency-type: indirect - dependency-name: react-router-dom dependency-version: 6.30.4 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package-lock.json | 26 +++++++++++++------------- package.json | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 01d103b1c5..75693dcf31 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "highlight.js": "11.11.1", "react": "19.2.4", "react-dom": "19.2.4", - "react-router-dom": "6.30.3", + "react-router-dom": "6.30.4", "rxjs": "7.8.2", "style-dictionary": "5.4.0", "svelte-routing": "2.13.0", @@ -12458,9 +12458,9 @@ "license": "MIT" }, "node_modules/@remix-run/router": { - "version": "1.23.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz", - "integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.3.tgz", + "integrity": "sha512-4An71tdz9X8+3sI4Qqqd2LWd9vS39J7sqd9EU4Scw7TJE/qB10Flv/UuqbPVgfQV9XoK8Np6jNquZitnZq5i+Q==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -41300,12 +41300,12 @@ } }, "node_modules/react-router": { - "version": "6.30.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.3.tgz", - "integrity": "sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==", + "version": "6.30.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.4.tgz", + "integrity": "sha512-SVUsDe+DybHM/WmYKIVYhZh1o5Dcuf16yM6WjG02Q9XVFMZIJyHYhwrr6bFBXZkVP6z69kNkMyBCujt8FaFLJA==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.23.2" + "@remix-run/router": "1.23.3" }, "engines": { "node": ">=14.0.0" @@ -41315,13 +41315,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.30.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.3.tgz", - "integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==", + "version": "6.30.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.4.tgz", + "integrity": "sha512-q4HvNl+mmDdkS0g+MqiBZNteQJCuimWoOyHMy4T/RQLAn9Z29+E91QXRaxOujeMl2HTzRSS0KFPd7lxX3PjV0Q==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.23.2", - "react-router": "6.30.3" + "@remix-run/router": "1.23.3", + "react-router": "6.30.4" }, "engines": { "node": ">=14.0.0" diff --git a/package.json b/package.json index 1283400afe..367027c5ea 100644 --- a/package.json +++ b/package.json @@ -145,7 +145,7 @@ "highlight.js": "11.11.1", "react": "19.2.4", "react-dom": "19.2.4", - "react-router-dom": "6.30.3", + "react-router-dom": "6.30.4", "rxjs": "7.8.2", "style-dictionary": "5.4.0", "svelte-routing": "2.13.0", From 0f88d323a8e61cd8819d5d0e86780efe09aec50e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2026 22:43:06 +0000 Subject: [PATCH 04/26] chore(deps): bump shell-quote from 1.8.3 to 1.8.4 Bumps [shell-quote](https://github.com/ljharb/shell-quote) from 1.8.3 to 1.8.4. - [Changelog](https://github.com/ljharb/shell-quote/blob/main/CHANGELOG.md) - [Commits](https://github.com/ljharb/shell-quote/compare/v1.8.3...v1.8.4) --- updated-dependencies: - dependency-name: shell-quote dependency-version: 1.8.4 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 75693dcf31..5fec412740 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44073,9 +44073,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz", + "integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==", "dev": true, "license": "MIT", "engines": { From e74a5592c16596fd9aa52be8dd70b83d7153ccf9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 14 Jun 2026 11:55:32 +0000 Subject: [PATCH 05/26] chore(deps): bump esbuild and tsx in /docs Bumps [esbuild](https://github.com/evanw/esbuild) to 0.28.1 and updates ancestor dependency [tsx](https://github.com/privatenumber/tsx). These dependencies need to be updated together. Updates `esbuild` from 0.27.2 to 0.28.1 - [Release notes](https://github.com/evanw/esbuild/releases) - [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG-2025.md) - [Commits](https://github.com/evanw/esbuild/compare/v0.27.2...v0.28.1) Updates `tsx` from 4.21.0 to 4.22.4 - [Release notes](https://github.com/privatenumber/tsx/releases) - [Changelog](https://github.com/privatenumber/tsx/blob/master/release.config.cjs) - [Commits](https://github.com/privatenumber/tsx/compare/v4.21.0...v4.22.4) --- updated-dependencies: - dependency-name: esbuild dependency-version: 0.28.1 dependency-type: indirect - dependency-name: tsx dependency-version: 4.22.4 dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 248 +++++++++++++++++++---------------------- docs/package.json | 2 +- 2 files changed, 113 insertions(+), 137 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 194823a78d..feb3730e7e 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -15,7 +15,7 @@ "flexsearch": "^0.7.43" }, "devDependencies": { - "tsx": "^4.19.0" + "tsx": "^4.22.4" } }, "node_modules/@abgov/design-tokens-v2": { @@ -48,9 +48,9 @@ "license": "Apache-2.0" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", - "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", "cpu": [ "ppc64" ], @@ -65,9 +65,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", - "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", "cpu": [ "arm" ], @@ -82,9 +82,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", - "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", "cpu": [ "arm64" ], @@ -99,9 +99,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", - "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", "cpu": [ "x64" ], @@ -116,9 +116,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", - "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", "cpu": [ "arm64" ], @@ -133,9 +133,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", - "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", "cpu": [ "x64" ], @@ -150,9 +150,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", - "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", "cpu": [ "arm64" ], @@ -167,9 +167,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", - "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", "cpu": [ "x64" ], @@ -184,9 +184,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", - "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", "cpu": [ "arm" ], @@ -201,9 +201,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", - "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", "cpu": [ "arm64" ], @@ -218,9 +218,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", - "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", "cpu": [ "ia32" ], @@ -235,9 +235,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", - "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", "cpu": [ "loong64" ], @@ -252,9 +252,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", - "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", "cpu": [ "mips64el" ], @@ -269,9 +269,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", - "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", "cpu": [ "ppc64" ], @@ -286,9 +286,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", - "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", "cpu": [ "riscv64" ], @@ -303,9 +303,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", - "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", "cpu": [ "s390x" ], @@ -320,9 +320,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", - "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", "cpu": [ "x64" ], @@ -337,9 +337,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", - "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", "cpu": [ "arm64" ], @@ -354,9 +354,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", - "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", "cpu": [ "x64" ], @@ -371,9 +371,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", - "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", "cpu": [ "arm64" ], @@ -388,9 +388,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", - "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", "cpu": [ "x64" ], @@ -405,9 +405,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", - "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", "cpu": [ "arm64" ], @@ -422,9 +422,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", - "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", "cpu": [ "x64" ], @@ -439,9 +439,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", - "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", "cpu": [ "arm64" ], @@ -456,9 +456,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", - "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", "cpu": [ "ia32" ], @@ -473,9 +473,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", - "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", "cpu": [ "x64" ], @@ -490,9 +490,9 @@ } }, "node_modules/esbuild": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", - "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -503,32 +503,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.2", - "@esbuild/android-arm": "0.27.2", - "@esbuild/android-arm64": "0.27.2", - "@esbuild/android-x64": "0.27.2", - "@esbuild/darwin-arm64": "0.27.2", - "@esbuild/darwin-x64": "0.27.2", - "@esbuild/freebsd-arm64": "0.27.2", - "@esbuild/freebsd-x64": "0.27.2", - "@esbuild/linux-arm": "0.27.2", - "@esbuild/linux-arm64": "0.27.2", - "@esbuild/linux-ia32": "0.27.2", - "@esbuild/linux-loong64": "0.27.2", - "@esbuild/linux-mips64el": "0.27.2", - "@esbuild/linux-ppc64": "0.27.2", - "@esbuild/linux-riscv64": "0.27.2", - "@esbuild/linux-s390x": "0.27.2", - "@esbuild/linux-x64": "0.27.2", - "@esbuild/netbsd-arm64": "0.27.2", - "@esbuild/netbsd-x64": "0.27.2", - "@esbuild/openbsd-arm64": "0.27.2", - "@esbuild/openbsd-x64": "0.27.2", - "@esbuild/openharmony-arm64": "0.27.2", - "@esbuild/sunos-x64": "0.27.2", - "@esbuild/win32-arm64": "0.27.2", - "@esbuild/win32-ia32": "0.27.2", - "@esbuild/win32-x64": "0.27.2" + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" } }, "node_modules/flexsearch": { @@ -552,38 +552,14 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/get-tsconfig": { - "version": "4.13.3", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.3.tgz", - "integrity": "sha512-vp8Cj/+9Q/ibZUrq1rhy8mCTQpCk31A3uu9wc1C50yAb3x2pFHOsGdAZQ7jD86ARayyxZUViYeIztW+GE8dcrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, "node_modules/tsx": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.4.tgz", + "integrity": "sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "~0.27.0", - "get-tsconfig": "^4.7.5" + "esbuild": "~0.28.0" }, "bin": { "tsx": "dist/cli.mjs" diff --git a/docs/package.json b/docs/package.json index 200ba59b04..34002841f5 100644 --- a/docs/package.json +++ b/docs/package.json @@ -22,6 +22,6 @@ "flexsearch": "^0.7.43" }, "devDependencies": { - "tsx": "^4.19.0" + "tsx": "^4.22.4" } } From 159e76a8a65485d838f66482afd4765e6795a7a5 Mon Sep 17 00:00:00 2001 From: Dustin Nielsen Date: Tue, 16 Jun 2026 13:15:57 -0600 Subject: [PATCH 06/26] chore: Updating release build to use built in GITHUB_TOKEN --- .github/workflows/release-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-ci.yml b/.github/workflows/release-ci.yml index a078e103b3..527a45144c 100644 --- a/.github/workflows/release-ci.yml +++ b/.github/workflows/release-ci.yml @@ -48,7 +48,7 @@ jobs: - name: Release libs env: - GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} run: npx nx affected --target release --parallel=false --base=${{ steps.last_successful_commit.outputs.base }} From e2023273577132abe465ecfa144409d7e7fed8ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jun 2026 15:37:34 +0000 Subject: [PATCH 07/26] chore(deps): bump @angular/core from 21.2.6 to 21.2.17 Bumps [@angular/core](https://github.com/angular/angular/tree/HEAD/packages/core) from 21.2.6 to 21.2.17. - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/v21.2.17/packages/core) --- updated-dependencies: - dependency-name: "@angular/core" dependency-version: 21.2.17 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package-lock.json | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5fec412740..4d0de1b042 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@angular/animations": "21.2.6", "@angular/common": "21.2.6", "@angular/compiler": "21.2.6", - "@angular/core": "21.2.6", + "@angular/core": "21.2.17", "@angular/forms": "21.2.6", "@angular/platform-browser": "21.2.6", "@angular/platform-browser-dynamic": "21.2.6", @@ -1178,9 +1178,9 @@ } }, "node_modules/@angular/core": { - "version": "21.2.6", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-21.2.6.tgz", - "integrity": "sha512-svgK5DhFlQlS+sMybXftn08rHHRiDGY/uIKT5LZUaKgyffnkPb8uClpMIW0NzANtU8qs8pwgDZFoJw85Ia3oqQ==", + "version": "21.2.17", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-21.2.17.tgz", + "integrity": "sha512-wYHpwIdnUnjQFOJJNqRcGx7LS3u64jT+R9L0TnMR/ViBM9dQgGYImlSikkftg2yrFCNo5aKRxhG2LLskQurVdg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1189,7 +1189,7 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "21.2.6", + "@angular/compiler": "21.2.17", "rxjs": "^6.5.3 || ^7.4.0", "zone.js": "~0.15.0 || ~0.16.0" }, diff --git a/package.json b/package.json index 367027c5ea..e504db77a7 100644 --- a/package.json +++ b/package.json @@ -129,7 +129,7 @@ "@angular/animations": "21.2.6", "@angular/common": "21.2.6", "@angular/compiler": "21.2.6", - "@angular/core": "21.2.6", + "@angular/core": "21.2.17", "@angular/forms": "21.2.6", "@angular/platform-browser": "21.2.6", "@angular/platform-browser-dynamic": "21.2.6", From d67a36ba19286641894d9c92c136fbe0c7072303 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Jun 2026 19:46:40 +0000 Subject: [PATCH 08/26] chore(deps): bump @angular/common from 21.2.6 to 21.2.17 Bumps [@angular/common](https://github.com/angular/angular/tree/HEAD/packages/common) from 21.2.6 to 21.2.17. - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/v21.2.17/packages/common) --- updated-dependencies: - dependency-name: "@angular/common" dependency-version: 21.2.17 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package-lock.json | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4d0de1b042..61353d25bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "license": "Apache-2.0", "dependencies": { "@angular/animations": "21.2.6", - "@angular/common": "21.2.6", + "@angular/common": "21.2.17", "@angular/compiler": "21.2.6", "@angular/core": "21.2.17", "@angular/forms": "21.2.6", @@ -1117,9 +1117,9 @@ } }, "node_modules/@angular/common": { - "version": "21.2.6", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-21.2.6.tgz", - "integrity": "sha512-2FcpZ1h6AZ4JwCIlnpHCYrbRTGQTOj/RFXkuX/qw7K6cFmJGfWFMmr++xWtHZEvUddfbR9hqDo+v1mkqEKE/Kw==", + "version": "21.2.17", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-21.2.17.tgz", + "integrity": "sha512-hqAQxRfi5ldFE42suAXRcY+JCANrUh7fuSQ/DtZ7L896id5BT/exuv6dWNBC1PyAfQmRbpD5Pt6/pd+tNLyhDQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1128,7 +1128,7 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "21.2.6", + "@angular/core": "21.2.17", "rxjs": "^6.5.3 || ^7.4.0" } }, diff --git a/package.json b/package.json index e504db77a7..d2c64897f8 100644 --- a/package.json +++ b/package.json @@ -127,7 +127,7 @@ }, "dependencies": { "@angular/animations": "21.2.6", - "@angular/common": "21.2.6", + "@angular/common": "21.2.17", "@angular/compiler": "21.2.6", "@angular/core": "21.2.17", "@angular/forms": "21.2.6", From 655a3ef9a60ab782c618b5414eda90f2fbe25457 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Jun 2026 20:33:20 +0000 Subject: [PATCH 09/26] chore(deps): bump @angular/compiler from 21.2.6 to 21.2.17 Bumps [@angular/compiler](https://github.com/angular/angular/tree/HEAD/packages/compiler) from 21.2.6 to 21.2.17. - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/v21.2.17/packages/compiler) --- updated-dependencies: - dependency-name: "@angular/compiler" dependency-version: 21.2.17 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 61353d25bf..a8fcc78d66 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "dependencies": { "@angular/animations": "21.2.6", "@angular/common": "21.2.17", - "@angular/compiler": "21.2.6", + "@angular/compiler": "21.2.17", "@angular/core": "21.2.17", "@angular/forms": "21.2.6", "@angular/platform-browser": "21.2.6", @@ -1133,9 +1133,9 @@ } }, "node_modules/@angular/compiler": { - "version": "21.2.6", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.2.6.tgz", - "integrity": "sha512-shGkb/aAIPbG8oSYkVJ0msGlRdDVcJBVaUVx2KenMltifQjfLn5N8DFMAzOR6haaA3XeugFExxKqmvySjrVq+A==", + "version": "21.2.17", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.2.17.tgz", + "integrity": "sha512-p+NdjYiwAz9Zmu2yul0LlMXaFjMISVVa24+/MVMoKFeQeI82QE8jDywPlnOSHQHvdCcQVpS7saeEriZzX3JuBQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" diff --git a/package.json b/package.json index d2c64897f8..43467dc209 100644 --- a/package.json +++ b/package.json @@ -128,7 +128,7 @@ "dependencies": { "@angular/animations": "21.2.6", "@angular/common": "21.2.17", - "@angular/compiler": "21.2.6", + "@angular/compiler": "21.2.17", "@angular/core": "21.2.17", "@angular/forms": "21.2.6", "@angular/platform-browser": "21.2.6", From ab69b3fe86e8b80c696a08d458e496bf90937d47 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jun 2026 22:53:55 +0000 Subject: [PATCH 10/26] chore(deps): bump form-data from 4.0.5 to 4.0.6 Bumps [form-data](https://github.com/form-data/form-data) from 4.0.5 to 4.0.6. - [Release notes](https://github.com/form-data/form-data/releases) - [Changelog](https://github.com/form-data/form-data/blob/master/CHANGELOG.md) - [Commits](https://github.com/form-data/form-data/compare/v4.0.5...v4.0.6) --- updated-dependencies: - dependency-name: form-data dependency-version: 4.0.6 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index a8fcc78d66..ce3139637f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26535,17 +26535,17 @@ } }, "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -27299,9 +27299,9 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" From 8ff62a5307569ec214715a16d0e1f3cba1064dee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jun 2026 22:53:58 +0000 Subject: [PATCH 11/26] chore(deps): bump dompurify from 3.4.0 to 3.4.9 Bumps [dompurify](https://github.com/cure53/DOMPurify) from 3.4.0 to 3.4.9. - [Release notes](https://github.com/cure53/DOMPurify/releases) - [Commits](https://github.com/cure53/DOMPurify/compare/3.4.0...3.4.9) --- updated-dependencies: - dependency-name: dompurify dependency-version: 3.4.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index ce3139637f..8c7dae6f8e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "@swc/helpers": "0.5.20", "astro": "5.18.1", "date-fns": "3.6.0", - "dompurify": "3.4.0", + "dompurify": "3.4.9", "fastest-levenshtein": "^1.0.16", "flexsearch": "0.8.212", "highlight.js": "11.11.1", @@ -23776,9 +23776,9 @@ } }, "node_modules/dompurify": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.0.tgz", - "integrity": "sha512-nolgK9JcaUXMSmW+j1yaSvaEaoXYHwWyGJlkoCTghc97KgGDDSnpoU/PlEnw63Ah+TGKFOyY+X5LnxaWbCSfXg==", + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.9.tgz", + "integrity": "sha512-4dPSRMRDqHvs0V4YDFCsaIZo4if5u0xM+llyxiM2fwuZFdKArUBAF3VtI2+n8NKg9P870WMdYk0UhqQNoWXbfQ==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" diff --git a/package.json b/package.json index 43467dc209..eb4fcf589a 100644 --- a/package.json +++ b/package.json @@ -139,7 +139,7 @@ "@swc/helpers": "0.5.20", "astro": "5.18.1", "date-fns": "3.6.0", - "dompurify": "3.4.0", + "dompurify": "3.4.9", "fastest-levenshtein": "^1.0.16", "flexsearch": "0.8.212", "highlight.js": "11.11.1", From 1d719dd8c3cd6f8504d9ab32b2e9b94fc941c68e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jun 2026 22:54:16 +0000 Subject: [PATCH 12/26] chore(deps-dev): bump @vitest/browser from 4.1.6 to 4.1.8 Bumps [@vitest/browser](https://github.com/vitest-dev/vitest/tree/HEAD/packages/browser) from 4.1.6 to 4.1.8. - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md) - [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.8/packages/browser) --- updated-dependencies: - dependency-name: "@vitest/browser" dependency-version: 4.1.8 dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- package-lock.json | 42 +++++++++++++++++++++--------------------- package.json | 2 +- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8c7dae6f8e..40f6d1c451 100644 --- a/package-lock.json +++ b/package-lock.json @@ -82,7 +82,7 @@ "@typescript-eslint/utils": "7.18.0", "@vitejs/plugin-react": "4.7.0", "@vitejs/plugin-react-swc": "3.11.0", - "@vitest/browser": "4.1.6", + "@vitest/browser": "4.1.8", "@vitest/browser-playwright": "4.1.2", "@vitest/coverage-v8": "4.1.2", "@vitest/ui": "4.1.2", @@ -17215,15 +17215,15 @@ } }, "node_modules/@vitest/browser": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.1.6.tgz", - "integrity": "sha512-ynsspTubXGSpa58JFJ24xIQt4z4A25epSbugEyaTmmrV1//Wec9EgE/LtoaC6yxUrXi5P7erGHRrkdZIHaVQuA==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.1.8.tgz", + "integrity": "sha512-u21VzX07HzlJYpFgkxmjEXar/tG2UqWGgyGG/46SrrPc7rSdCTPw5vuowopO9CIqF8UCUQzDFdbVnNpw6N0BfQ==", "dev": true, "license": "MIT", "dependencies": { "@blazediff/core": "1.9.1", - "@vitest/mocker": "4.1.6", - "@vitest/utils": "4.1.6", + "@vitest/mocker": "4.1.8", + "@vitest/utils": "4.1.8", "magic-string": "^0.30.21", "pngjs": "^7.0.0", "sirv": "^3.0.2", @@ -17234,7 +17234,7 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "4.1.6" + "vitest": "4.1.8" } }, "node_modules/@vitest/browser-playwright": { @@ -17307,13 +17307,13 @@ } }, "node_modules/@vitest/browser/node_modules/@vitest/mocker": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.6.tgz", - "integrity": "sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.8.tgz", + "integrity": "sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.1.6", + "@vitest/spy": "4.1.8", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -17334,9 +17334,9 @@ } }, "node_modules/@vitest/browser/node_modules/@vitest/pretty-format": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.6.tgz", - "integrity": "sha512-h5SxD/IzNhZYnrSZRsUZQIC+vD0GY8cUvq0iwsmkFKixRCKLLWqCXa/FIQ4S1R+sI+PGoojkHsdNrbZiM9Qpgw==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.8.tgz", + "integrity": "sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==", "dev": true, "license": "MIT", "dependencies": { @@ -17347,9 +17347,9 @@ } }, "node_modules/@vitest/browser/node_modules/@vitest/spy": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.6.tgz", - "integrity": "sha512-JFKxMx6udhwKh/Ldo270e17QX710vgunMkuPAvXjHSvC6oqLWAHhVhjg/I71q0u0CBSErIODV1Kjv0FQNSWjdg==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.8.tgz", + "integrity": "sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==", "dev": true, "license": "MIT", "funding": { @@ -17357,13 +17357,13 @@ } }, "node_modules/@vitest/browser/node_modules/@vitest/utils": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.6.tgz", - "integrity": "sha512-FxIY+U81R3LGKCxaHHFRQ5+g6/iRgGLmeHWdp2Amj4ljQRrEIWHmZyDfDYBRZlpyqA7qKxtS9DD1dhk8RnRIVQ==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.8.tgz", + "integrity": "sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.6", + "@vitest/pretty-format": "4.1.8", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" }, diff --git a/package.json b/package.json index eb4fcf589a..51b8f3deb7 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "@typescript-eslint/utils": "7.18.0", "@vitejs/plugin-react": "4.7.0", "@vitejs/plugin-react-swc": "3.11.0", - "@vitest/browser": "4.1.6", + "@vitest/browser": "4.1.8", "@vitest/browser-playwright": "4.1.2", "@vitest/coverage-v8": "4.1.2", "@vitest/ui": "4.1.2", From ad1381f184b0902a0bc6c29257329e0e7fea3dfc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Jun 2026 19:08:45 +0000 Subject: [PATCH 13/26] chore(deps-dev): bump hono from 4.12.18 to 4.12.25 Bumps [hono](https://github.com/honojs/hono) from 4.12.18 to 4.12.25. - [Release notes](https://github.com/honojs/hono/releases) - [Commits](https://github.com/honojs/hono/compare/v4.12.18...v4.12.25) --- updated-dependencies: - dependency-name: hono dependency-version: 4.12.25 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 40f6d1c451..35077a86bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27623,9 +27623,9 @@ } }, "node_modules/hono": { - "version": "4.12.18", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.18.tgz", - "integrity": "sha512-RWzP96k/yv0PQfyXnWjs6zot20TqfpfsNXhOnev8d1InAxubW93L11/oNUc3tQqn2G0bSdAOBpX+2uDFHV7kdQ==", + "version": "4.12.25", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.25.tgz", + "integrity": "sha512-2NFaIyNVgJmBs/ecmtGzlmluTFs5cHEWGTdu0t1HBwYzoGXOL5nUQBRMXsXWla5i4KkG//QMzVP88m1+I3fdAQ==", "dev": true, "license": "MIT", "engines": { From ad566d78b0eff0cef74dce17ec4021145e7952d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Jun 2026 22:07:46 +0000 Subject: [PATCH 14/26] chore(deps): bump tar and npm Bumps [tar](https://github.com/isaacs/node-tar) and [npm](https://github.com/npm/cli). These dependencies needed to be updated together. Updates `tar` from 7.5.11 to 7.5.16 - [Release notes](https://github.com/isaacs/node-tar/releases) - [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md) - [Commits](https://github.com/isaacs/node-tar/compare/v7.5.11...v7.5.16) Updates `npm` from 11.11.1 to 11.17.0 - [Release notes](https://github.com/npm/cli/releases) - [Changelog](https://github.com/npm/cli/blob/v11.17.0/CHANGELOG.md) - [Commits](https://github.com/npm/cli/compare/v11.11.1...v11.17.0) --- updated-dependencies: - dependency-name: npm dependency-version: 11.17.0 dependency-type: indirect - dependency-name: tar dependency-version: 7.5.16 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 256 ++++++++++++++++------------------------------ 1 file changed, 87 insertions(+), 169 deletions(-) diff --git a/package-lock.json b/package-lock.json index 35077a86bb..49b11de176 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35319,9 +35319,9 @@ } }, "node_modules/npm": { - "version": "11.11.1", - "resolved": "https://registry.npmjs.org/npm/-/npm-11.11.1.tgz", - "integrity": "sha512-asazCodkFdz1ReQzukyzS/DD77uGCIqUFeRG3gtaT8b9UR0ne1m9QOBuMgT72ij1rt7TRrOox4A1WzntMWIuEg==", + "version": "11.17.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-11.17.0.tgz", + "integrity": "sha512-PurxiZexEHDTE4SSaLI3ZrnbAGiZfeyUcQcxcP5D+hfytNAze/D1IzDuInTn9XVLIbAQUnQuSPXJx02LHjLvQw==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -35400,8 +35400,8 @@ ], "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^9.4.1", - "@npmcli/config": "^10.7.1", + "@npmcli/arborist": "^9.8.0", + "@npmcli/config": "^10.11.0", "@npmcli/fs": "^5.0.0", "@npmcli/map-workspaces": "^5.0.3", "@npmcli/metavuln-calculator": "^9.0.3", @@ -35409,37 +35409,37 @@ "@npmcli/promise-spawn": "^9.0.1", "@npmcli/redact": "^4.0.0", "@npmcli/run-script": "^10.0.4", - "@sigstore/tuf": "^4.0.1", + "@sigstore/tuf": "^4.0.2", "abbrev": "^4.0.0", "archy": "~1.0.0", - "cacache": "^20.0.3", + "cacache": "^20.0.4", "chalk": "^5.6.2", "ci-info": "^4.4.0", "fastest-levenshtein": "^1.0.16", "fs-minipass": "^3.0.3", "glob": "^13.0.6", "graceful-fs": "^4.2.11", - "hosted-git-info": "^9.0.2", + "hosted-git-info": "^9.0.3", "ini": "^6.0.0", "init-package-json": "^8.2.5", - "is-cidr": "^6.0.3", + "is-cidr": "^6.0.4", "json-parse-even-better-errors": "^5.0.0", "libnpmaccess": "^10.0.3", - "libnpmdiff": "^8.1.4", - "libnpmexec": "^10.2.4", - "libnpmfund": "^7.0.18", + "libnpmdiff": "^8.1.10", + "libnpmexec": "^10.3.0", + "libnpmfund": "^7.0.24", "libnpmorg": "^8.0.1", - "libnpmpack": "^9.1.4", - "libnpmpublish": "^11.1.3", + "libnpmpack": "^9.1.10", + "libnpmpublish": "^11.2.0", "libnpmsearch": "^9.0.1", "libnpmteam": "^8.0.2", - "libnpmversion": "^8.0.3", - "make-fetch-happen": "^15.0.4", - "minimatch": "^10.2.4", + "libnpmversion": "^8.0.4", + "make-fetch-happen": "^15.0.6", + "minimatch": "^10.2.5", "minipass": "^7.1.3", "minipass-pipeline": "^1.2.4", "ms": "^2.1.2", - "node-gyp": "^12.2.0", + "node-gyp": "^12.4.0", "nopt": "^9.0.0", "npm-audit-report": "^7.0.0", "npm-install-checks": "^8.0.0", @@ -35449,16 +35449,16 @@ "npm-registry-fetch": "^19.1.1", "npm-user-validate": "^4.0.0", "p-map": "^7.0.4", - "pacote": "^21.5.0", + "pacote": "^21.5.1", "parse-conflict-json": "^5.0.1", "proc-log": "^6.1.0", "qrcode-terminal": "^0.12.0", "read": "^5.0.1", - "semver": "^7.7.4", + "semver": "^7.8.4", "spdx-expression-parse": "^4.0.0", "ssri": "^13.0.1", "supports-color": "^10.2.2", - "tar": "^7.5.11", + "tar": "^7.5.16", "text-table": "~0.2.0", "tiny-relative-date": "^2.0.2", "treeverse": "^3.0.0", @@ -35604,26 +35604,14 @@ } }, "node_modules/npm/node_modules/@gar/promise-retry": { - "version": "1.0.2", + "version": "1.0.3", "dev": true, "inBundle": true, "license": "MIT", - "dependencies": { - "retry": "^0.13.1" - }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@gar/promise-retry/node_modules/retry": { - "version": "0.13.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/npm/node_modules/@isaacs/fs-minipass": { "version": "4.0.1", "dev": true, @@ -35643,7 +35631,7 @@ "license": "ISC" }, "node_modules/npm/node_modules/@npmcli/agent": { - "version": "4.0.0", + "version": "4.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -35659,7 +35647,7 @@ } }, "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "9.4.1", + "version": "9.8.0", "dev": true, "inBundle": true, "license": "ISC", @@ -35707,7 +35695,7 @@ } }, "node_modules/npm/node_modules/@npmcli/config": { - "version": "10.7.1", + "version": "10.11.0", "dev": true, "inBundle": true, "license": "ISC", @@ -35901,7 +35889,7 @@ } }, "node_modules/npm/node_modules/@sigstore/core": { - "version": "3.1.0", + "version": "3.2.1", "dev": true, "inBundle": true, "license": "Apache-2.0", @@ -35910,7 +35898,7 @@ } }, "node_modules/npm/node_modules/@sigstore/protobuf-specs": { - "version": "0.5.0", + "version": "0.5.1", "dev": true, "inBundle": true, "license": "Apache-2.0", @@ -35919,24 +35907,24 @@ } }, "node_modules/npm/node_modules/@sigstore/sign": { - "version": "4.1.0", + "version": "4.1.1", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { + "@gar/promise-retry": "^1.0.2", "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.1.0", + "@sigstore/core": "^3.2.0", "@sigstore/protobuf-specs": "^0.5.0", - "make-fetch-happen": "^15.0.3", - "proc-log": "^6.1.0", - "promise-retry": "^2.0.1" + "make-fetch-happen": "^15.0.4", + "proc-log": "^6.1.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@sigstore/tuf": { - "version": "4.0.1", + "version": "4.0.2", "dev": true, "inBundle": true, "license": "Apache-2.0", @@ -35949,13 +35937,13 @@ } }, "node_modules/npm/node_modules/@sigstore/verify": { - "version": "3.1.0", + "version": "3.1.1", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.1.0", + "@sigstore/core": "^3.2.1", "@sigstore/protobuf-specs": "^0.5.0" }, "engines": { @@ -36024,7 +36012,7 @@ } }, "node_modules/npm/node_modules/bin-links": { - "version": "6.0.0", + "version": "6.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -36052,7 +36040,7 @@ } }, "node_modules/npm/node_modules/brace-expansion": { - "version": "5.0.4", + "version": "5.0.6", "dev": true, "inBundle": true, "license": "MIT", @@ -36064,7 +36052,7 @@ } }, "node_modules/npm/node_modules/cacache": { - "version": "20.0.3", + "version": "20.0.4", "dev": true, "inBundle": true, "license": "ISC", @@ -36078,8 +36066,7 @@ "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^7.0.2", - "ssri": "^13.0.0", - "unique-filename": "^5.0.0" + "ssri": "^13.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" @@ -36122,7 +36109,7 @@ } }, "node_modules/npm/node_modules/cidr-regex": { - "version": "5.0.3", + "version": "5.0.5", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -36178,7 +36165,7 @@ } }, "node_modules/npm/node_modules/diff": { - "version": "8.0.3", + "version": "8.0.4", "dev": true, "inBundle": true, "license": "BSD-3-Clause", @@ -36195,12 +36182,6 @@ "node": ">=6" } }, - "node_modules/npm/node_modules/err-code": { - "version": "2.0.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/exponential-backoff": { "version": "3.1.3", "dev": true, @@ -36252,7 +36233,7 @@ "license": "ISC" }, "node_modules/npm/node_modules/hosted-git-info": { - "version": "9.0.2", + "version": "9.0.3", "dev": true, "inBundle": true, "license": "ISC", @@ -36324,15 +36305,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, "node_modules/npm/node_modules/ini": { "version": "6.0.0", "dev": true, @@ -36360,7 +36332,7 @@ } }, "node_modules/npm/node_modules/ip-address": { - "version": "10.1.0", + "version": "10.2.0", "dev": true, "inBundle": true, "license": "MIT", @@ -36369,12 +36341,12 @@ } }, "node_modules/npm/node_modules/is-cidr": { - "version": "6.0.3", + "version": "6.0.4", "dev": true, "inBundle": true, "license": "BSD-2-Clause", "dependencies": { - "cidr-regex": "^5.0.1" + "cidr-regex": "^5.0.4" }, "engines": { "node": ">=20" @@ -36442,12 +36414,12 @@ } }, "node_modules/npm/node_modules/libnpmdiff": { - "version": "8.1.4", + "version": "8.1.10", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^9.4.1", + "@npmcli/arborist": "^9.8.0", "@npmcli/installed-package-contents": "^4.0.0", "binary-extensions": "^3.0.0", "diff": "^8.0.2", @@ -36461,13 +36433,13 @@ } }, "node_modules/npm/node_modules/libnpmexec": { - "version": "10.2.4", + "version": "10.3.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@gar/promise-retry": "^1.0.0", - "@npmcli/arborist": "^9.4.1", + "@npmcli/arborist": "^9.8.0", "@npmcli/package-json": "^7.0.0", "@npmcli/run-script": "^10.0.0", "ci-info": "^4.0.0", @@ -36484,12 +36456,12 @@ } }, "node_modules/npm/node_modules/libnpmfund": { - "version": "7.0.18", + "version": "7.0.24", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^9.4.1" + "@npmcli/arborist": "^9.8.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" @@ -36509,12 +36481,12 @@ } }, "node_modules/npm/node_modules/libnpmpack": { - "version": "9.1.4", + "version": "9.1.10", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^9.4.1", + "@npmcli/arborist": "^9.8.0", "@npmcli/run-script": "^10.0.0", "npm-package-arg": "^13.0.0", "pacote": "^21.0.2" @@ -36524,7 +36496,7 @@ } }, "node_modules/npm/node_modules/libnpmpublish": { - "version": "11.1.3", + "version": "11.2.0", "dev": true, "inBundle": true, "license": "ISC", @@ -36568,7 +36540,7 @@ } }, "node_modules/npm/node_modules/libnpmversion": { - "version": "8.0.3", + "version": "8.0.4", "dev": true, "inBundle": true, "license": "ISC", @@ -36584,7 +36556,7 @@ } }, "node_modules/npm/node_modules/lru-cache": { - "version": "11.2.6", + "version": "11.5.1", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", @@ -36593,13 +36565,14 @@ } }, "node_modules/npm/node_modules/make-fetch-happen": { - "version": "15.0.4", + "version": "15.0.6", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/agent": "^4.0.0", + "@npmcli/redact": "^4.0.0", "cacache": "^20.0.1", "http-cache-semantics": "^4.1.1", "minipass": "^7.0.2", @@ -36615,12 +36588,12 @@ } }, "node_modules/npm/node_modules/minimatch": { - "version": "10.2.4", + "version": "10.2.5", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^5.0.5" }, "engines": { "node": "18 || 20 || >=22" @@ -36668,35 +36641,17 @@ } }, "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", + "version": "1.0.6", "dev": true, "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "yallist": "^4.0.0" + "minipass": "^7.1.3" }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/npm/node_modules/minipass-flush/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, "node_modules/npm/node_modules/minipass-pipeline": { "version": "1.2.4", "dev": true, @@ -36776,7 +36731,7 @@ } }, "node_modules/npm/node_modules/node-gyp": { - "version": "12.2.0", + "version": "12.4.0", "dev": true, "inBundle": true, "license": "MIT", @@ -36784,12 +36739,12 @@ "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^15.0.0", "nopt": "^9.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5", "tar": "^7.5.4", "tinyglobby": "^0.2.12", + "undici": "^6.25.0", "which": "^6.0.0" }, "bin": { @@ -36953,7 +36908,7 @@ } }, "node_modules/npm/node_modules/pacote": { - "version": "21.5.0", + "version": "21.5.1", "dev": true, "inBundle": true, "license": "ISC", @@ -37014,7 +36969,7 @@ } }, "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "7.1.1", + "version": "7.1.4", "dev": true, "inBundle": true, "license": "MIT", @@ -37062,19 +37017,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/npm/node_modules/promzard": { "version": "3.0.1", "dev": true, @@ -37116,15 +37058,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/retry": { - "version": "0.12.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/npm/node_modules/safer-buffer": { "version": "2.1.2", "dev": true, @@ -37133,7 +37066,7 @@ "optional": true }, "node_modules/npm/node_modules/semver": { - "version": "7.7.4", + "version": "7.8.4", "dev": true, "inBundle": true, "license": "ISC", @@ -37157,17 +37090,17 @@ } }, "node_modules/npm/node_modules/sigstore": { - "version": "4.1.0", + "version": "4.1.1", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.1.0", + "@sigstore/core": "^3.2.1", "@sigstore/protobuf-specs": "^0.5.0", - "@sigstore/sign": "^4.1.0", - "@sigstore/tuf": "^4.0.1", - "@sigstore/verify": "^3.1.0" + "@sigstore/sign": "^4.1.1", + "@sigstore/tuf": "^4.0.2", + "@sigstore/verify": "^3.1.1" }, "engines": { "node": "^20.17.0 || >=22.9.0" @@ -37184,12 +37117,12 @@ } }, "node_modules/npm/node_modules/socks": { - "version": "2.8.7", + "version": "2.8.9", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "ip-address": "^10.0.1", + "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" }, "engines": { @@ -37258,7 +37191,7 @@ } }, "node_modules/npm/node_modules/tar": { - "version": "7.5.11", + "version": "7.5.16", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", @@ -37286,13 +37219,13 @@ "license": "MIT" }, "node_modules/npm/node_modules/tinyglobby": { - "version": "0.2.15", + "version": "0.2.17", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "picomatch": "^4.0.4" }, "engines": { "node": ">=12.0.0" @@ -37319,7 +37252,7 @@ } }, "node_modules/npm/node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", + "version": "4.0.4", "dev": true, "inBundle": true, "license": "MIT", @@ -37353,28 +37286,13 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/unique-filename": { - "version": "5.0.0", + "node_modules/npm/node_modules/undici": { + "version": "6.26.0", "dev": true, "inBundle": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^6.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/unique-slug": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, + "license": "MIT", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=18.17" } }, "node_modules/npm/node_modules/util-deprecate": { @@ -45704,9 +45622,9 @@ } }, "node_modules/tar": { - "version": "7.5.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.11.tgz", - "integrity": "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==", + "version": "7.5.16", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.16.tgz", + "integrity": "sha512-56adEpPMouktRlBLXiaYFFzZ/3+JXa8P9n7WbR+ibIjtviN55mEaOkiysCnPnWm+7kkui1Dn8J9l+g6zV8731w==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { From c9d280a90633481a45be9ac6e52d90813877e602 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Jun 2026 22:35:19 +0000 Subject: [PATCH 15/26] chore(deps): bump launch-editor from 2.13.1 to 2.14.1 Bumps [launch-editor](https://github.com/vitejs/launch-editor) from 2.13.1 to 2.14.1. - [Commits](https://github.com/vitejs/launch-editor/compare/v2.13.1...v2.14.1) --- updated-dependencies: - dependency-name: launch-editor dependency-version: 2.14.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 49b11de176..213eccef6f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32336,14 +32336,14 @@ } }, "node_modules/launch-editor": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.13.1.tgz", - "integrity": "sha512-lPSddlAAluRKJ7/cjRFoXUFzaX7q/YKI7yPHuEvSJVqoXvFnJov1/Ud87Aa4zULIbA9Nja4mSPK8l0z/7eV2wA==", + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.14.1.tgz", + "integrity": "sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==", "dev": true, "license": "MIT", "dependencies": { "picocolors": "^1.1.1", - "shell-quote": "^1.8.3" + "shell-quote": "^1.8.4" } }, "node_modules/less": { From 72add682b0de4bdb4c4e2a329d2f7762e6a0383f Mon Sep 17 00:00:00 2001 From: Mark E <51723535+Spark450@users.noreply.github.com> Date: Wed, 17 Jun 2026 08:28:13 -0700 Subject: [PATCH 16/26] docs(#3742): add breakpoints to layout documentation (#4055) Co-authored-by: Claude Opus 4.8 --- .../foundations/style-guide/layout.astro | 89 +++++++++++++------ 1 file changed, 60 insertions(+), 29 deletions(-) diff --git a/docs/src/pages/foundations/style-guide/layout.astro b/docs/src/pages/foundations/style-guide/layout.astro index db06f04c98..121a6b5eaf 100644 --- a/docs/src/pages/foundations/style-guide/layout.astro +++ b/docs/src/pages/foundations/style-guide/layout.astro @@ -52,6 +52,66 @@ import FoundationsSupportCallout from "../../../components/FoundationsSupportCal +

Design for responsiveness

+ + Layouts should adapt across screen sizes without losing clarity. + + +

Breakpoints

+ + Most GoA components handle responsive behaviour internally. Many components use + container queries rather than viewport media queries, so they respond to the size of + their container rather than the size of the window. A component placed in a narrow + sidebar adapts to that sidebar even on a wide screen. + + + When you do need to think about screen size explicitly, the Design System uses 3 + breakpoints: + + +
    +
  • Mobile: under 624px. Phones and small devices.
  • +
  • Tablet: 624px to 1023px. Tablets and medium devices.
  • +
  • Desktop: 1024px and above. Desktop and larger screens.
  • +
+
+ + These align with how the components adapt, so custom layouts built around GoA + components work together at the same breakpoints. On mobile in particular: + + +
    +
  • Buttons go full-width by default, and can be overridden
  • +
  • Form layouts stack labels above inputs
  • +
  • Navigation collapses
  • +
  • Block direction switches to column regardless of the direction prop
  • +
+
+ +

Public form considerations

+ +
    +
  • Use a single-column layout to support a clear reading flow
  • +
  • Keep the main task and primary actions in a predictable location
  • +
  • Avoid adding secondary regions that compete for attention
  • +
+
+ +

Workspace considerations

+ +
    +
  • Keep the main content area as the focus
  • +
  • + Let supporting panels and secondary regions move below or hide as space becomes + limited +
  • +
  • Ensure secondary content is still easy to access
  • +
  • Maintain a clear and predictable page structure across screen sizes
  • +
+
+ + +

Service type

Choose a layout that matches the type of service you are building. @@ -193,35 +253,6 @@ import FoundationsSupportCallout from "../../../components/FoundationsSupportCal - - -

Design for responsiveness

- - Layouts should adapt across screen sizes without losing clarity. - - -

Public form considerations

- -
    -
  • Use a single-column layout to support a clear reading flow
  • -
  • Keep the main task and primary actions in a predictable location
  • -
  • Avoid adding secondary regions that compete for attention
  • -
-
- -

Workspace considerations

- -
    -
  • Keep the main content area as the focus
  • -
  • - Let supporting panels and secondary regions move below or hide as space becomes - limited -
  • -
  • Ensure secondary content is still easy to access
  • -
  • Maintain a clear and predictable page structure across screen sizes
  • -
-
- From 2642305513f05d4b09ff199c2b3d44354242eae6 Mon Sep 17 00:00:00 2001 From: Mark E <51723535+Spark450@users.noreply.github.com> Date: Wed, 17 Jun 2026 08:35:13 -0700 Subject: [PATCH 17/26] fix(#3741): make pagination example reproducible in Angular (#4060) Co-authored-by: Claude Opus 4.8 Co-authored-by: Benji Franck --- .../routes/bugs/3741/bug3741.component.html | 50 +++++++++ .../src/routes/bugs/3741/bug3741.component.ts | 63 +++++++++++ .../src/routes/bugs/3741/bug3741.route.json | 6 ++ .../docs/pagination/pagination.component.html | 1 + .../src/app/routes/bugs/bug3741.route.ts | 10 ++ apps/prs/react/src/routes/bugs/bug3741.tsx | 100 ++++++++++++++++++ .../src/routes/docs/pagination/pagination.tsx | 1 + .../angular.html | 1 + .../show-number-of-results-per-page/react.tsx | 1 + .../web-components.html | 2 +- .../src/lib/components/spacer/spacer.ts | 8 ++ 11 files changed, 242 insertions(+), 1 deletion(-) create mode 100644 apps/prs/angular/src/routes/bugs/3741/bug3741.component.html create mode 100644 apps/prs/angular/src/routes/bugs/3741/bug3741.component.ts create mode 100644 apps/prs/angular/src/routes/bugs/3741/bug3741.route.json create mode 100644 apps/prs/react/src/app/routes/bugs/bug3741.route.ts create mode 100644 apps/prs/react/src/routes/bugs/bug3741.tsx diff --git a/apps/prs/angular/src/routes/bugs/3741/bug3741.component.html b/apps/prs/angular/src/routes/bugs/3741/bug3741.component.html new file mode 100644 index 0000000000..feb6e01176 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3741/bug3741.component.html @@ -0,0 +1,50 @@ +Bug 3741 - Pagination example not reproducible + + The "Show number of results per page" example uses a spacer with + hSpacing="fill" to push the pagination controls to the right edge. In Angular + the spacer collapsed to zero width and the controls bunched on the left. After + the fix the spacer fills and the pagination sits flush right. + + + + + + First name + Last name + Age + + + + @for (user of pageUsers; track user.id) { + + {{ user.firstName }} + {{ user.lastName }} + {{ user.age }} + + } + + + + + + Show + + + + + + per page + + + + diff --git a/apps/prs/angular/src/routes/bugs/3741/bug3741.component.ts b/apps/prs/angular/src/routes/bugs/3741/bug3741.component.ts new file mode 100644 index 0000000000..0b127d420a --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3741/bug3741.component.ts @@ -0,0 +1,63 @@ +import { Component } from "@angular/core"; +import { + GoabBlock, + GoabDropdown, + GoabDropdownItem, + GoabPagination, + GoabSpacer, + GoabTable, + GoabText, +} from "@abgov/angular-components"; +import { + GoabDropdownOnChangeDetail, + GoabPaginationOnChangeDetail, +} from "@abgov/ui-components-common"; + +interface User { + id: string; + firstName: string; + lastName: string; + age: number; +} + +const FIRST_NAMES = ["Emma", "Liam", "Olivia", "Noah", "Ava", "James", "Sophia", "William", "Isabella", "Oliver"]; +const LAST_NAMES = ["Smith", "Johnson", "Williams", "Brown", "Jones", "Garcia", "Miller", "Davis", "Rodriguez", "Martinez"]; + +@Component({ + standalone: true, + selector: "abgov-bug3741", + templateUrl: "./bug3741.component.html", + imports: [ + GoabBlock, + GoabDropdown, + GoabDropdownItem, + GoabPagination, + GoabSpacer, + GoabTable, + GoabText, + ], +}) +export class Bug3741Component { + users: User[] = Array.from({ length: 100 }, (_, i) => ({ + id: `user-${i + 1}`, + firstName: FIRST_NAMES[i % FIRST_NAMES.length], + lastName: LAST_NAMES[i % LAST_NAMES.length], + age: 20 + ((i + 1) % 40), + })); + page = 1; + perPage = 10; + + get pageUsers(): User[] { + const offset = (this.page - 1) * this.perPage; + return this.users.slice(offset, offset + this.perPage); + } + + handlePageChange(event: GoabPaginationOnChangeDetail) { + this.page = event.page; + } + + handlePerPageCountChangeEvent(event: GoabDropdownOnChangeDetail) { + this.page = 1; + this.perPage = parseInt(event.value || "10"); + } +} diff --git a/apps/prs/angular/src/routes/bugs/3741/bug3741.route.json b/apps/prs/angular/src/routes/bugs/3741/bug3741.route.json new file mode 100644 index 0000000000..0782afcbee --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3741/bug3741.route.json @@ -0,0 +1,6 @@ +{ + "type": "bug", + "id": "3741", + "path": "bugs/3741", + "title": "Pagination spacer fill" +} diff --git a/apps/prs/angular/src/routes/docs/pagination/pagination.component.html b/apps/prs/angular/src/routes/docs/pagination/pagination.component.html index 63ffdb33c3..140bc534f2 100644 --- a/apps/prs/angular/src/routes/docs/pagination/pagination.component.html +++ b/apps/prs/angular/src/routes/docs/pagination/pagination.component.html @@ -43,6 +43,7 @@

Show number of results per page

Show diff --git a/apps/prs/react/src/app/routes/bugs/bug3741.route.ts b/apps/prs/react/src/app/routes/bugs/bug3741.route.ts new file mode 100644 index 0000000000..a641f9fade --- /dev/null +++ b/apps/prs/react/src/app/routes/bugs/bug3741.route.ts @@ -0,0 +1,10 @@ +import { Bug3741Route } from "../../../routes/bugs/bug3741"; +import type { PrRouteDefinition } from "../../route-manifest"; + +export default { + type: "bug", + id: "3741", + path: "bugs/3741", + title: "Pagination spacer fill", + component: Bug3741Route, +} satisfies PrRouteDefinition; diff --git a/apps/prs/react/src/routes/bugs/bug3741.tsx b/apps/prs/react/src/routes/bugs/bug3741.tsx new file mode 100644 index 0000000000..7f90812d77 --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug3741.tsx @@ -0,0 +1,100 @@ +import { useState } from "react"; +import { + GoabBlock, + GoabDropdown, + GoabDropdownItem, + GoabPagination, + GoabSpacer, + GoabTable, + GoabText, +} from "@abgov/react-components"; +import type { GoabDropdownOnChangeDetail } from "@abgov/ui-components-common"; + +interface User { + id: string; + firstName: string; + lastName: string; + age: number; +} + +const FIRST_NAMES = ["Emma", "Liam", "Olivia", "Noah", "Ava", "James", "Sophia", "William", "Isabella", "Oliver"]; +const LAST_NAMES = ["Smith", "Johnson", "Williams", "Brown", "Jones", "Garcia", "Miller", "Davis", "Rodriguez", "Martinez"]; + +const USERS: User[] = Array.from({ length: 100 }, (_, i) => ({ + id: `user-${i + 1}`, + firstName: FIRST_NAMES[i % FIRST_NAMES.length], + lastName: LAST_NAMES[i % LAST_NAMES.length], + age: 20 + ((i + 1) % 40), +})); + +export function Bug3741Route() { + const [page, setPage] = useState(1); + const [perPage, setPerPage] = useState(10); + + const offset = (page - 1) * perPage; + const pageUsers = USERS.slice(offset, offset + perPage); + + function handlePerPageCountChangeEvent(event: GoabDropdownOnChangeDetail) { + setPage(1); + setPerPage(parseInt(event.value || "10")); + } + + return ( +
+ + Bug #3741: Pagination example not reproducible + + + The "Show number of results per page" example uses a spacer with + hSpacing="fill" to push the pagination to the right edge. React always + rendered this correctly; this page is the control matching the Angular + fix (bugs/3741). + + + + + + First name + Last name + Age + + + + {pageUsers.map((u) => ( + + {u.firstName} + {u.lastName} + {u.age} + + ))} + + + + + + Show + + + + + + per page + + + setPage(event.page)} + /> + +
+ ); +} + +export default Bug3741Route; diff --git a/apps/prs/react/src/routes/docs/pagination/pagination.tsx b/apps/prs/react/src/routes/docs/pagination/pagination.tsx index 3afa298b5f..c5908bdc4b 100644 --- a/apps/prs/react/src/routes/docs/pagination/pagination.tsx +++ b/apps/prs/react/src/routes/docs/pagination/pagination.tsx @@ -101,6 +101,7 @@ export function DocsPaginationRoute() { onChange={handlePerPageCountChangeEvent} value={perPage.toString()} width="9ch" + size="compact" > diff --git a/docs/src/content/examples/show-number-of-results-per-page/angular.html b/docs/src/content/examples/show-number-of-results-per-page/angular.html index 145e81ef24..678fe3845b 100644 --- a/docs/src/content/examples/show-number-of-results-per-page/angular.html +++ b/docs/src/content/examples/show-number-of-results-per-page/angular.html @@ -24,6 +24,7 @@ (onChange)="handlePerPageCountChangeEvent($event)" [value]="perPage.toString()" width="9ch" + size="compact" > diff --git a/docs/src/content/examples/show-number-of-results-per-page/react.tsx b/docs/src/content/examples/show-number-of-results-per-page/react.tsx index 0d1a780500..4976eedecf 100644 --- a/docs/src/content/examples/show-number-of-results-per-page/react.tsx +++ b/docs/src/content/examples/show-number-of-results-per-page/react.tsx @@ -119,6 +119,7 @@ export function ShowNumberOfResultsPerPage() { onChange={handlePerPageCountChangeEvent} value={perPage.toString()} width="9ch" + size="compact" > diff --git a/docs/src/content/examples/show-number-of-results-per-page/web-components.html b/docs/src/content/examples/show-number-of-results-per-page/web-components.html index 399200986b..f9d95433b8 100644 --- a/docs/src/content/examples/show-number-of-results-per-page/web-components.html +++ b/docs/src/content/examples/show-number-of-results-per-page/web-components.html @@ -16,7 +16,7 @@ Show - + diff --git a/libs/angular-components/src/lib/components/spacer/spacer.ts b/libs/angular-components/src/lib/components/spacer/spacer.ts index c1072a75ab..e0d0d6c4b3 100644 --- a/libs/angular-components/src/lib/components/spacer/spacer.ts +++ b/libs/angular-components/src/lib/components/spacer/spacer.ts @@ -26,6 +26,14 @@ import { `, schemas: [CUSTOM_ELEMENTS_SCHEMA], + + styles: [ + ` + :host { + display: contents; + } + `, + ], }) /** Negative area between the components and the interface. */ export class GoabSpacer implements OnInit { From 475c03aa653aa34d63817c84daf5d9b4204f38dd Mon Sep 17 00:00:00 2001 From: Mark E <51723535+Spark450@users.noreply.github.com> Date: Wed, 17 Jun 2026 14:12:51 -0700 Subject: [PATCH 18/26] fix(#3665): prevent page jump when switching tabs (#4041) Co-authored-by: Claude Opus 4.8 --- .../routes/bugs/3665/bug3665.component.html | 30 +++++++++++ .../src/routes/bugs/3665/bug3665.component.ts | 10 ++++ .../src/routes/bugs/3665/bug3665.route.json | 6 +++ .../src/app/routes/bugs/bug3665.route.ts | 10 ++++ apps/prs/react/src/routes/bugs/bug3665.tsx | 49 ++++++++++++++++++ .../specs/tabs.browser.spec.tsx | 51 +++++++++++++++++++ .../src/components/tabs/Tabs.svelte | 2 +- .../src/components/tabs/tabs.spec.ts | 18 +++++++ 8 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 apps/prs/angular/src/routes/bugs/3665/bug3665.component.html create mode 100644 apps/prs/angular/src/routes/bugs/3665/bug3665.component.ts create mode 100644 apps/prs/angular/src/routes/bugs/3665/bug3665.route.json create mode 100644 apps/prs/react/src/app/routes/bugs/bug3665.route.ts create mode 100644 apps/prs/react/src/routes/bugs/bug3665.tsx diff --git a/apps/prs/angular/src/routes/bugs/3665/bug3665.component.html b/apps/prs/angular/src/routes/bugs/3665/bug3665.component.html new file mode 100644 index 0000000000..0594d0c865 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3665/bug3665.component.html @@ -0,0 +1,30 @@ +Bug 3665 - Tabs: page jumps when switching tabs + + Switching tabs should not move the viewport. Previously setCurrentTab() called el.focus() + on the selected tab, which triggered the browser's scroll-into-view behavior and jumped the + page. Scroll down so the tabs are partially visible, then switch the framework tab. The page + should now stay in place. + + + +
+ Scroll down to the tabs below. +
+ + + +
+ React content. Switch to Angular or Web Components. +
+
+ +
+ Angular content. The page should not jump. +
+
+ +
+ Web Components content. The page should not jump. +
+
+
diff --git a/apps/prs/angular/src/routes/bugs/3665/bug3665.component.ts b/apps/prs/angular/src/routes/bugs/3665/bug3665.component.ts new file mode 100644 index 0000000000..bd2f74e097 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3665/bug3665.component.ts @@ -0,0 +1,10 @@ +import { Component } from "@angular/core"; +import { GoabTab, GoabTabs, GoabText } from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-bug3665", + templateUrl: "./bug3665.component.html", + imports: [GoabTab, GoabTabs, GoabText], +}) +export class Bug3665Component {} diff --git a/apps/prs/angular/src/routes/bugs/3665/bug3665.route.json b/apps/prs/angular/src/routes/bugs/3665/bug3665.route.json new file mode 100644 index 0000000000..4c56bccb00 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3665/bug3665.route.json @@ -0,0 +1,6 @@ +{ + "type": "bug", + "id": "3665", + "path": "bugs/3665", + "title": "Tabs page jump on switch" +} diff --git a/apps/prs/react/src/app/routes/bugs/bug3665.route.ts b/apps/prs/react/src/app/routes/bugs/bug3665.route.ts new file mode 100644 index 0000000000..94dbd849c2 --- /dev/null +++ b/apps/prs/react/src/app/routes/bugs/bug3665.route.ts @@ -0,0 +1,10 @@ +import { Bug3665Route } from "../../../routes/bugs/bug3665"; +import type { PrRouteDefinition } from "../../route-manifest"; + +export default { + type: "bug", + id: "3665", + path: "bugs/3665", + title: "Tabs page jump on switch", + component: Bug3665Route, +} satisfies PrRouteDefinition; diff --git a/apps/prs/react/src/routes/bugs/bug3665.tsx b/apps/prs/react/src/routes/bugs/bug3665.tsx new file mode 100644 index 0000000000..f081b8f69d --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug3665.tsx @@ -0,0 +1,49 @@ +import { GoabTab, GoabTabs, GoabText } from "@abgov/react-components"; + +export function Bug3665Route() { + return ( +
+ + Bug #3665: Tabs page jumps when switching tabs + + + Switching tabs should not move the viewport. Previously, setCurrentTab() called + el.focus() on the selected tab, which triggered the browser's scroll-into-view + behavior and jumped the page. To reproduce the old behavior: scroll down so the + tabs are partially visible, then switch the framework tab. The page should now + stay in place. + + + {/* Tall spacer so the tabs sit below the fold and a jump would be obvious. */} +
+ Scroll down to the tabs below. +
+ + + +
+ React content. Switch to Angular or Web Components. +
+
+ +
+ Angular content. The page should not jump. +
+
+ +
+ Web Components content. The page should not jump. +
+
+
+
+ ); +} + +export default Bug3665Route; diff --git a/libs/react-components/specs/tabs.browser.spec.tsx b/libs/react-components/specs/tabs.browser.spec.tsx index c46ca6b27f..eca3f51a32 100644 --- a/libs/react-components/specs/tabs.browser.spec.tsx +++ b/libs/react-components/specs/tabs.browser.spec.tsx @@ -812,4 +812,55 @@ describe("Tabs Browser Tests", () => { expect(borderLeft).toBe("none"); }); }); + + // Placed last: this test scrolls the shared page far down to exercise the + // scroll-jump fix. Earlier tests rely on history/popstate timing that this + // scrolling perturbs, so keep it after them to avoid cross-test interference. + describe("bug-3665", () => { + it("should not change scroll position when switching tabs", async () => { + /** + * setCurrentTab() focused the selected tab, which triggered the browser's + * scroll-into-view and jumped the page. The fix passes { preventScroll: true }. + * With tall content above and below and the tabs only just in view, clicking a + * tab must leave window.scrollY unchanged. + */ + const Component = () => { + return ( + <> +
Tall content above tabs
+ + Content 1 + Content 2 + +
Tall content below tabs
+ + ); + }; + + const { getByRole } = render(); + const tablist = getByRole("tab"); + + await vi.waitFor(() => { + expect(tablist.elements().length).toBe(2); + }); + + const tabs = tablist.elements(); + + // Scroll so the tab row sits just inside the bottom of the viewport. + const tabAbsoluteTop = tabs[0].getBoundingClientRect().top + window.scrollY; + window.scrollTo(0, tabAbsoluteTop - window.innerHeight + 30); + + const scrollBeforeClick = window.scrollY; + expect(scrollBeforeClick).toBeGreaterThan(0); + + // Switch tabs (native click does not auto-scroll the element into view). + tabs[1].click(); + + await vi.waitFor(() => { + expect(tabs[1].getAttribute("aria-selected")).toBe("true"); + }); + + expect(window.scrollY).toBe(scrollBeforeClick); + }); + }); }); diff --git a/libs/web-components/src/components/tabs/Tabs.svelte b/libs/web-components/src/components/tabs/Tabs.svelte index 1e4bdfb828..79a4ee48de 100644 --- a/libs/web-components/src/components/tabs/Tabs.svelte +++ b/libs/web-components/src/components/tabs/Tabs.svelte @@ -351,7 +351,7 @@ if (isCurrent) { currentLocation = (el as HTMLLinkElement).href; if (!skipFocus) { - el.focus(); + el.focus({ preventScroll: true }); } } }); diff --git a/libs/web-components/src/components/tabs/tabs.spec.ts b/libs/web-components/src/components/tabs/tabs.spec.ts index adabfffb1b..3a717f4e35 100644 --- a/libs/web-components/src/components/tabs/tabs.spec.ts +++ b/libs/web-components/src/components/tabs/tabs.spec.ts @@ -109,6 +109,24 @@ describe("Tabs", () => { }); }); + it("should focus the selected tab with preventScroll to avoid page jump", async () => { + const { container } = render(Tabs); + + const tab2Link = (await waitFor(() => { + const link = container.querySelector("a#tab-2") as HTMLElement; + expect(link).toBeTruthy(); + return link; + })) as HTMLElement; + + const focusSpy = vi.spyOn(tab2Link, "focus"); + + await fireEvent.click(tab2Link); + + await waitFor(() => { + expect(focusSpy).toHaveBeenCalledWith({ preventScroll: true }); + }); + }); + it("should select the last tab if the tab exceeds the number of tabs", async () => { const result = render(Tabs, { initialtab: 3 }); From 805afa91a277e2cf70fd080045811b6554e23ad4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Jun 2026 20:06:21 +0000 Subject: [PATCH 19/26] chore(deps): bump dompurify from 3.4.9 to 3.4.11 Bumps [dompurify](https://github.com/cure53/DOMPurify) from 3.4.9 to 3.4.11. - [Release notes](https://github.com/cure53/DOMPurify/releases) - [Commits](https://github.com/cure53/DOMPurify/compare/3.4.9...3.4.11) --- updated-dependencies: - dependency-name: dompurify dependency-version: 3.4.11 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 213eccef6f..62042243c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "@swc/helpers": "0.5.20", "astro": "5.18.1", "date-fns": "3.6.0", - "dompurify": "3.4.9", + "dompurify": "3.4.11", "fastest-levenshtein": "^1.0.16", "flexsearch": "0.8.212", "highlight.js": "11.11.1", @@ -23776,9 +23776,9 @@ } }, "node_modules/dompurify": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.9.tgz", - "integrity": "sha512-4dPSRMRDqHvs0V4YDFCsaIZo4if5u0xM+llyxiM2fwuZFdKArUBAF3VtI2+n8NKg9P870WMdYk0UhqQNoWXbfQ==", + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.11.tgz", + "integrity": "sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" diff --git a/package.json b/package.json index 51b8f3deb7..67a9aa8af3 100644 --- a/package.json +++ b/package.json @@ -139,7 +139,7 @@ "@swc/helpers": "0.5.20", "astro": "5.18.1", "date-fns": "3.6.0", - "dompurify": "3.4.9", + "dompurify": "3.4.11", "fastest-levenshtein": "^1.0.16", "flexsearch": "0.8.212", "highlight.js": "11.11.1", From 950c18bdf1e2ec9a358d7ce8821bb6d1fe79dbac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Jun 2026 20:06:34 +0000 Subject: [PATCH 20/26] chore(deps): bump webpack-dev-server and @angular-devkit/build-angular Bumps [webpack-dev-server](https://github.com/webpack/webpack-dev-server) to 5.2.5 and updates ancestor dependency [@angular-devkit/build-angular](https://github.com/angular/angular-cli). These dependencies need to be updated together. Updates `webpack-dev-server` from 5.2.3 to 5.2.5 - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v5.2.3...v5.2.5) Updates `@angular-devkit/build-angular` from 21.2.6 to 21.2.16 - [Release notes](https://github.com/angular/angular-cli/releases) - [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular-cli/compare/v21.2.6...v21.2.16) --- updated-dependencies: - dependency-name: webpack-dev-server dependency-version: 5.2.5 dependency-type: indirect - dependency-name: "@angular-devkit/build-angular" dependency-version: 21.2.16 dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- package-lock.json | 311 ++++++++++++++++++++++++++++++++++------------ package.json | 2 +- 2 files changed, 233 insertions(+), 80 deletions(-) diff --git a/package-lock.json b/package-lock.json index 62042243c5..e79455b1b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,7 +40,7 @@ "@abgov/design-tokens": "1.10.0", "@abgov/design-tokens-v2": "npm:@abgov/design-tokens@2.8.0", "@abgov/nx-release": "12.0.0", - "@angular-devkit/build-angular": "21.2.6", + "@angular-devkit/build-angular": "21.2.16", "@angular-devkit/core": "21.2.6", "@angular-devkit/schematics": "21.2.6", "@angular-eslint/eslint-plugin": "21.3.1", @@ -456,17 +456,17 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "21.2.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-21.2.6.tgz", - "integrity": "sha512-eUWcWiMOUg01QyJkaO/csyTy8ZecW2HrMvOlgM+IWLagDyqFQVcSwcx9/NJy/42YA+EtpBcCnXPK3vk5NVob7w==", + "version": "21.2.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-21.2.16.tgz", + "integrity": "sha512-s5rl8Xig67O88zd9P4ZmtI3L2Lro+/PAq+JaegjAOkY1j+ezOQMKtAUffMEmiGTkg69VFpgVfr7s8M99PFJSeg==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2102.6", - "@angular-devkit/build-webpack": "0.2102.6", - "@angular-devkit/core": "21.2.6", - "@angular/build": "21.2.6", + "@angular-devkit/architect": "0.2102.16", + "@angular-devkit/build-webpack": "0.2102.16", + "@angular-devkit/core": "21.2.16", + "@angular/build": "21.2.16", "@babel/core": "7.29.0", "@babel/generator": "7.29.1", "@babel/helper-annotate-as-pure": "7.27.3", @@ -474,10 +474,10 @@ "@babel/plugin-transform-async-generator-functions": "7.29.0", "@babel/plugin-transform-async-to-generator": "7.28.6", "@babel/plugin-transform-runtime": "7.29.0", - "@babel/preset-env": "7.29.0", - "@babel/runtime": "7.28.6", + "@babel/preset-env": "7.29.2", + "@babel/runtime": "7.29.2", "@discoveryjs/json-ext": "0.6.3", - "@ngtools/webpack": "21.2.6", + "@ngtools/webpack": "21.2.16", "ansi-colors": "4.1.3", "autoprefixer": "10.4.27", "babel-loader": "10.0.0", @@ -498,7 +498,7 @@ "ora": "9.3.0", "picomatch": "4.0.4", "piscina": "5.1.4", - "postcss": "8.5.6", + "postcss": "8.5.12", "postcss-loader": "8.2.0", "resolve-url-loader": "5.0.0", "rxjs": "7.8.2", @@ -513,7 +513,7 @@ "tslib": "2.8.1", "webpack": "5.105.2", "webpack-dev-middleware": "7.4.5", - "webpack-dev-server": "5.2.3", + "webpack-dev-server": "5.2.5", "webpack-merge": "6.0.1", "webpack-subresource-integrity": "5.1.0" }, @@ -532,7 +532,7 @@ "@angular/platform-browser": "^21.0.0", "@angular/platform-server": "^21.0.0", "@angular/service-worker": "^21.0.0", - "@angular/ssr": "^21.2.6", + "@angular/ssr": "^21.2.16", "@web/test-runner": "^0.20.0", "browser-sync": "^3.0.2", "jest": "^30.2.0", @@ -588,6 +588,53 @@ } } }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { + "version": "0.2102.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.16.tgz", + "integrity": "sha512-FDUKPpq70nJwGK4CICPD31XmesBEGv57Z+JBCPWrTa5mVZIXCQkeo5waIaNfzAnLdbpd74ULJJ3MDNVt4iaGZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "21.2.16", + "rxjs": "7.8.2" + }, + "bin": { + "architect": "bin/cli.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { + "version": "21.2.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.16.tgz", + "integrity": "sha512-bRot0dqonxdSuGzXyOYtVJis/u9CJycrfC/aaxLeMF37gKtWIyCR2KFkMRXAoiV/AKk5/NuuqDNqcQS9w5G3Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.18.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.4", + "rxjs": "7.8.2", + "source-map": "0.7.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^5.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, "node_modules/@angular-devkit/build-angular/node_modules/es-module-lexer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", @@ -650,9 +697,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.12.tgz", + "integrity": "sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==", "dev": true, "funding": [ { @@ -728,13 +775,13 @@ } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.2102.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2102.6.tgz", - "integrity": "sha512-IN0xUlFTOmDt+UrW1X7ymYgp94Y/HfMj4zNahplBEbBl72WmqQdJGiDMThGgFY+RzJJMyAbqD7RDyiimsVkfOA==", + "version": "0.2102.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2102.16.tgz", + "integrity": "sha512-JrtO7B1jC4mAbdyksyLjJ+d7Nor23Jqt/qywAes8uTkr6ajkM8j6JAiBHMTt+hUN34RGL40R6TWkHsQ8MNHTSg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.2102.6", + "@angular-devkit/architect": "0.2102.16", "rxjs": "7.8.2" }, "engines": { @@ -747,6 +794,53 @@ "webpack-dev-server": "^5.0.2" } }, + "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { + "version": "0.2102.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.16.tgz", + "integrity": "sha512-FDUKPpq70nJwGK4CICPD31XmesBEGv57Z+JBCPWrTa5mVZIXCQkeo5waIaNfzAnLdbpd74ULJJ3MDNVt4iaGZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "21.2.16", + "rxjs": "7.8.2" + }, + "bin": { + "architect": "bin/cli.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": { + "version": "21.2.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.16.tgz", + "integrity": "sha512-bRot0dqonxdSuGzXyOYtVJis/u9CJycrfC/aaxLeMF37gKtWIyCR2KFkMRXAoiV/AKk5/NuuqDNqcQS9w5G3Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.18.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.4", + "rxjs": "7.8.2", + "source-map": "0.7.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^5.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, "node_modules/@angular-devkit/core": { "version": "21.2.6", "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.6.tgz", @@ -907,14 +1001,14 @@ } }, "node_modules/@angular/build": { - "version": "21.2.6", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-21.2.6.tgz", - "integrity": "sha512-PJltYl9/INfz8nZ/KHf39nqlmt3c9PR0jJaZt6hhCPENyAf4PwQpm28erkJmbOYO864goIuws41lduYXyDqQ0Q==", + "version": "21.2.16", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-21.2.16.tgz", + "integrity": "sha512-40Ra2lM/KDPwA68wP6ZX7zVQak/ouo1sTmtUmjUpqihDp5ftXAZWD3t2Mm4Ja88cyHzG3kaI3C0ew/wAdcEeDA==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2102.6", + "@angular-devkit/architect": "0.2102.16", "@babel/core": "7.29.0", "@babel/helper-annotate-as-pure": "7.27.3", "@babel/helper-split-export-declaration": "7.24.7", @@ -938,7 +1032,7 @@ "source-map-support": "0.5.21", "tinyglobby": "0.2.15", "undici": "7.24.4", - "vite": "7.3.1", + "vite": "7.3.2", "watchpack": "2.5.1" }, "engines": { @@ -957,7 +1051,7 @@ "@angular/platform-browser": "^21.0.0", "@angular/platform-server": "^21.0.0", "@angular/service-worker": "^21.0.0", - "@angular/ssr": "^21.2.6", + "@angular/ssr": "^21.2.16", "karma": "^6.4.0", "less": "^4.2.0", "ng-packagr": "^21.0.0", @@ -1006,10 +1100,57 @@ } } }, + "node_modules/@angular/build/node_modules/@angular-devkit/architect": { + "version": "0.2102.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.16.tgz", + "integrity": "sha512-FDUKPpq70nJwGK4CICPD31XmesBEGv57Z+JBCPWrTa5mVZIXCQkeo5waIaNfzAnLdbpd74ULJJ3MDNVt4iaGZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "21.2.16", + "rxjs": "7.8.2" + }, + "bin": { + "architect": "bin/cli.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/build/node_modules/@angular-devkit/core": { + "version": "21.2.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.16.tgz", + "integrity": "sha512-bRot0dqonxdSuGzXyOYtVJis/u9CJycrfC/aaxLeMF37gKtWIyCR2KFkMRXAoiV/AKk5/NuuqDNqcQS9w5G3Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.18.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.4", + "rxjs": "7.8.2", + "source-map": "0.7.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^5.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, "node_modules/@angular/build/node_modules/vite": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", - "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz", + "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", "dev": true, "license": "MIT", "dependencies": { @@ -3487,9 +3628,9 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.0.tgz", - "integrity": "sha512-fNEdfc0yi16lt6IZo2Qxk3knHVdfMYX33czNb4v8yWhemoBhibCpQK/uYHtSKIiO+p/zd3+8fYVXhQdOVV608w==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.2.tgz", + "integrity": "sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw==", "dev": true, "license": "MIT", "dependencies": { @@ -3652,9 +3793,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", - "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", "dev": true, "license": "MIT", "engines": { @@ -8744,9 +8885,9 @@ } }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", - "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.4.tgz", + "integrity": "sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==", "cpu": [ "arm64" ], @@ -8758,9 +8899,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", - "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.4.tgz", + "integrity": "sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w==", "cpu": [ "x64" ], @@ -8772,9 +8913,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", - "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.4.tgz", + "integrity": "sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw==", "cpu": [ "arm" ], @@ -8786,9 +8927,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", - "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.4.tgz", + "integrity": "sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw==", "cpu": [ "arm64" ], @@ -8800,9 +8941,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", - "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.4.tgz", + "integrity": "sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ==", "cpu": [ "x64" ], @@ -8814,9 +8955,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", - "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.4.tgz", + "integrity": "sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ==", "cpu": [ "x64" ], @@ -9164,9 +9305,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "21.2.6", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-21.2.6.tgz", - "integrity": "sha512-SU6aMvFz/0uM2WhIGrZ/QexEIqT/VdLfcmy7OYAxOd3w7u2wqQao/1uSOEJo+BR+B48QYf7Z5LLpS8t1mWZYKQ==", + "version": "21.2.16", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-21.2.16.tgz", + "integrity": "sha512-ytJh8Bk2B/EkThXmo5qeK3uEvyN6R1zNvIxSwKRrtFnZ0FEee+21UBKNEq4pxQqy1h50IOrAQamvNUtKpY2Asg==", "dev": true, "license": "MIT", "engines": { @@ -12559,6 +12700,9 @@ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -12576,6 +12720,9 @@ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -12593,6 +12740,9 @@ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -12610,6 +12760,9 @@ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -12654,14 +12807,14 @@ } }, "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.2.tgz", - "integrity": "sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz", + "integrity": "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@tybys/wasm-util": "^0.10.1" + "@tybys/wasm-util": "^0.10.2" }, "funding": { "type": "github", @@ -15789,9 +15942,9 @@ } }, "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", "dev": true, "license": "MIT", "optional": true, @@ -34743,9 +34896,9 @@ "license": "MIT" }, "node_modules/msgpackr": { - "version": "1.11.9", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.9.tgz", - "integrity": "sha512-FkoAAyyA6HM8wL882EcEyFZ9s7hVADSwG9xrVx3dxxNQAtgADTrJoEWivID82Iv1zWDsv/OtbrrcZAzGzOMdNw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.12.1.tgz", + "integrity": "sha512-4EUH9tQHnMmEgzW/MdAP0KIfa1T9AF+htl0ffe2n5vb2EKn9y2co8ccpgWko6S52Jy1PQZKwRnx5/KkYjtd9MQ==", "dev": true, "license": "MIT", "optional": true, @@ -34754,9 +34907,9 @@ } }, "node_modules/msgpackr-extract": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", - "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.4.tgz", + "integrity": "sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -34768,12 +34921,12 @@ "download-msgpackr-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.4", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.4" } }, "node_modules/muggle-string": { @@ -48714,9 +48867,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.3.tgz", - "integrity": "sha512-9Gyu2F7+bg4Vv+pjbovuYDhHX+mqdqITykfzdM9UyKqKHlsE5aAjRhR+oOEfXW5vBeu8tarzlJFIZva4ZjAdrQ==", + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.5.tgz", + "integrity": "sha512-4wZtCquSuv9CKX8oybo+mqxtxZqWz47uM1Ch94lxowBztOhWCbhqvRbfC/mODOwxgV2brY+JGZpHq58/SuVFYg==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 67a9aa8af3..d8b16f0136 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "@abgov/design-tokens": "1.10.0", "@abgov/design-tokens-v2": "npm:@abgov/design-tokens@2.8.0", "@abgov/nx-release": "12.0.0", - "@angular-devkit/build-angular": "21.2.6", + "@angular-devkit/build-angular": "21.2.16", "@angular-devkit/core": "21.2.6", "@angular-devkit/schematics": "21.2.6", "@angular-eslint/eslint-plugin": "21.3.1", From aa05ce74bf9a5a5ae74bade993a80bf700763be0 Mon Sep 17 00:00:00 2001 From: Mark E <51723535+Spark450@users.noreply.github.com> Date: Fri, 19 Jun 2026 08:02:37 -0700 Subject: [PATCH 21/26] fix(#3921): update segmented tab indicator on resize (#4073) Co-authored-by: Claude Opus 4.8 --- .../routes/bugs/3921/bug3921.component.html | 21 ++++++ .../src/routes/bugs/3921/bug3921.component.ts | 10 +++ .../src/routes/bugs/3921/bug3921.route.json | 6 ++ .../src/app/routes/bugs/bug3921.route.ts | 10 +++ apps/prs/react/src/routes/bugs/bug3921.tsx | 46 +++++++++++++ .../specs/tabs.browser.spec.tsx | 66 ++++++++++++++++++- .../src/components/tabs/Tabs.svelte | 15 +++++ 7 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 apps/prs/angular/src/routes/bugs/3921/bug3921.component.html create mode 100644 apps/prs/angular/src/routes/bugs/3921/bug3921.component.ts create mode 100644 apps/prs/angular/src/routes/bugs/3921/bug3921.route.json create mode 100644 apps/prs/react/src/app/routes/bugs/bug3921.route.ts create mode 100644 apps/prs/react/src/routes/bugs/bug3921.tsx diff --git a/apps/prs/angular/src/routes/bugs/3921/bug3921.component.html b/apps/prs/angular/src/routes/bugs/3921/bug3921.component.html new file mode 100644 index 0000000000..d492a212c2 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3921/bug3921.component.html @@ -0,0 +1,21 @@ +

3921 - Segmented tab dynamic indicator

+

Resize the browser window. The active tab indicator background should follow the selected tab as the layout reflows.

+ +

Many tabs including a long heading

+ + Daily view + Weekly view + Monthly view + Quarterly view + Yearly view + Custom reporting period view + Archived view + Forecast view + + +

Simple three-tab example

+ + Content one + Content two + Content three + diff --git a/apps/prs/angular/src/routes/bugs/3921/bug3921.component.ts b/apps/prs/angular/src/routes/bugs/3921/bug3921.component.ts new file mode 100644 index 0000000000..887e220dd0 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3921/bug3921.component.ts @@ -0,0 +1,10 @@ +import { Component } from "@angular/core"; +import { GoabTab, GoabTabs } from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-bug3921", + templateUrl: "./bug3921.component.html", + imports: [GoabTab, GoabTabs], +}) +export class Bug3921Component {} diff --git a/apps/prs/angular/src/routes/bugs/3921/bug3921.route.json b/apps/prs/angular/src/routes/bugs/3921/bug3921.route.json new file mode 100644 index 0000000000..126d8391ce --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3921/bug3921.route.json @@ -0,0 +1,6 @@ +{ + "type": "bug", + "id": "3921", + "path": "bugs/3921", + "title": "Segmented tab dynamic indicator" +} diff --git a/apps/prs/react/src/app/routes/bugs/bug3921.route.ts b/apps/prs/react/src/app/routes/bugs/bug3921.route.ts new file mode 100644 index 0000000000..2a2c3846f3 --- /dev/null +++ b/apps/prs/react/src/app/routes/bugs/bug3921.route.ts @@ -0,0 +1,10 @@ +import { Bug3921Route } from "../../../routes/bugs/bug3921"; +import type { PrRouteDefinition } from "../../route-manifest"; + +export default { + type: "bug", + id: "3921", + path: "bugs/3921", + title: "Segmented tab dynamic indicator", + component: Bug3921Route, +} satisfies PrRouteDefinition; diff --git a/apps/prs/react/src/routes/bugs/bug3921.tsx b/apps/prs/react/src/routes/bugs/bug3921.tsx new file mode 100644 index 0000000000..3381b2ccb0 --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug3921.tsx @@ -0,0 +1,46 @@ +import { GoabTab, GoabTabs, GoabText } from "@abgov/react-components"; + +export function Bug3921Route() { + return ( +
+
+ + 3921 - Segmented tab dynamic indicator + + + Resize the browser window. The active tab indicator background should follow the + selected tab as the layout reflows. + +
+ +
+ + Many tabs including a long heading + + + Daily view + Weekly view + Monthly view + Quarterly view + Yearly view + + Custom reporting period view + + Archived view + Forecast view + +
+ +
+ + Simple three-tab example + + + Content one + Content two + Content three + +
+
+ ); +} diff --git a/libs/react-components/specs/tabs.browser.spec.tsx b/libs/react-components/specs/tabs.browser.spec.tsx index eca3f51a32..cf8fcdf2cb 100644 --- a/libs/react-components/specs/tabs.browser.spec.tsx +++ b/libs/react-components/specs/tabs.browser.spec.tsx @@ -1,6 +1,5 @@ import { render } from "vitest-browser-react"; -import { GoabTabs, GoabTab } from "../src"; import { GoabTabs, GoabTab } from "../src"; import { expect, describe, it, vi } from "vitest"; import { page } from "@vitest/browser/context"; @@ -813,6 +812,71 @@ describe("Tabs Browser Tests", () => { }); }); + describe("bug-3921", () => { + it("should keep segmented indicator aligned when a long heading wraps on resize", async () => { + // Wide enough that the long heading fits on a single line. + await page.viewport(1024, 600); + + // Mirrors the playground: a long heading that wraps when the container narrows. + const Component = () => ( + + Daily view + Weekly view + Monthly view + Quarterly view + Yearly view + + Custom reporting period view + + Archived view + Forecast view + + ); + + const { getByRole } = render(); + const tablist = getByRole("tab"); + + await vi.waitFor(() => { + expect(tablist.elements().length).toBe(8); + }); + + const tabs = tablist.elements(); + // Select the long-heading tab so its size changes when the heading wraps. + const longHeadingTab = tabs[5]; + await longHeadingTab.click(); + + const tabsContainer = tabs[0].parentElement!; + + const getIndicatorLeft = () => + parseFloat(tabsContainer.style.getPropertyValue("--segmented-indicator-left")); + const getIndicatorWidth = () => + parseFloat(tabsContainer.style.getPropertyValue("--segmented-indicator-width")); + + await vi.waitFor(() => { + expect(getIndicatorWidth()).toBeGreaterThan(0); + }); + + const heightBeforeResize = longHeadingTab.getBoundingClientRect().height; + + // Narrow the viewport so the long heading wraps to multiple lines, + // growing the tab's height and shifting its position. + await page.viewport(480, 600); + + await vi.waitFor(() => { + // Confirm the heading actually wrapped, otherwise this would not + // exercise the dynamic-resize behavior the fix targets. + expect(longHeadingTab.getBoundingClientRect().height).toBeGreaterThan( + heightBeforeResize, + ); + + const containerRect = tabsContainer.getBoundingClientRect(); + const tabRect = longHeadingTab.getBoundingClientRect(); + expect(getIndicatorLeft()).toBeCloseTo(tabRect.left - containerRect.left - 1, 0); + expect(getIndicatorWidth()).toBeCloseTo(tabRect.width, 0); + }); + }); + }); + // Placed last: this test scrolls the shared page far down to exercise the // scroll-jump fix. Earlier tests rely on history/popstate timing that this // scrolling perturbs, so keep it after them to avoid cross-test interference. diff --git a/libs/web-components/src/components/tabs/Tabs.svelte b/libs/web-components/src/components/tabs/Tabs.svelte index 79a4ee48de..a05348f885 100644 --- a/libs/web-components/src/components/tabs/Tabs.svelte +++ b/libs/web-components/src/components/tabs/Tabs.svelte @@ -36,6 +36,7 @@ let _segmentedTransitionDuration: number = 0; let _previousTabIndex: number = 1; let _visibilityObserver: IntersectionObserver | null = null; + let _resizeObserver: ResizeObserver | null = null; const MIN_TRANSITION_DURATION = 200; const DURATION_PER_PIXEL = 0.2; @@ -63,6 +64,10 @@ _visibilityObserver.disconnect(); _visibilityObserver = null; } + if (_resizeObserver) { + _resizeObserver.disconnect(); + _resizeObserver = null; + } }); // ========= @@ -245,6 +250,16 @@ }); _visibilityObserver.observe(_tabsEl); } + + // The indicator is positioned absolutely from a one-time measurement, so it + // drifts out of alignment when the tabs reflow (long heading wraps, window + // resize). Re-measure whenever the container's size changes. + if (_tabsEl && !_resizeObserver) { + _resizeObserver = new ResizeObserver(() => { + updateSegmentedIndicatorPosition({ withAnimation: false }); + }); + _resizeObserver.observe(_tabsEl); + } }); } } From 9c6c124cf9d49422e5edd75a4ee858dbdb7bb41c Mon Sep 17 00:00:00 2001 From: Thomas Jeffery Date: Fri, 12 Jun 2026 14:11:28 -0600 Subject: [PATCH 22/26] chore: collapse generated docs files in PR diffs (linguist-generated) --- .gitattributes | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..35abbe9d4d --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +# Generated docs files: collapse by default in GitHub PR diffs (linguist-generated). +# Deterministic build outputs (see docs/ARCHITECTURE.md). They stay fully diffable, +# searchable, and in history; this only hides them by default in the Files Changed tab. +docs/generated/** linguist-generated=true +docs/public/search-index.json linguist-generated=true From 016689ac172c9239e48aeabe635c4e32d9730d0a Mon Sep 17 00:00:00 2001 From: Mark E Date: Fri, 19 Jun 2026 10:21:53 -0700 Subject: [PATCH 23/26] fix(#3964): mark Angular input/textarea as touched on blur only Reactive FormControl validation using .touched fired as soon as a user tabbed into the field, because the Angular wrappers called markAsTouched on focus, change, and keypress. Touched should mean entered and then left, so markAsTouched now runs only on blur. Co-Authored-By: Claude Opus 4.8 --- .../routes/bugs/3964/bug3964.component.html | 71 ++++++++++ .../src/routes/bugs/3964/bug3964.component.ts | 40 ++++++ .../src/routes/bugs/3964/bug3964.route.json | 6 + .../src/lib/components/input/input.spec.ts | 124 +++++++++++++++++- .../src/lib/components/input/input.ts | 6 +- .../lib/components/textarea/textarea.spec.ts | 114 +++++++++++++++- .../src/lib/components/textarea/textarea.ts | 2 - 7 files changed, 354 insertions(+), 9 deletions(-) create mode 100644 apps/prs/angular/src/routes/bugs/3964/bug3964.component.html create mode 100644 apps/prs/angular/src/routes/bugs/3964/bug3964.component.ts create mode 100644 apps/prs/angular/src/routes/bugs/3964/bug3964.route.json diff --git a/apps/prs/angular/src/routes/bugs/3964/bug3964.component.html b/apps/prs/angular/src/routes/bugs/3964/bug3964.component.html new file mode 100644 index 0000000000..260c56dbce --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3964/bug3964.component.html @@ -0,0 +1,71 @@ +

3964 - Input marked as touched when user tabs in (Angular)

+

+ Tab into a field and tab straight back out without typing: the required error should + appear, because the control was entered and then left. Tabbing in alone, or typing + without leaving, should NOT show the error. Before the fix, the error appeared as soon + as the field received focus. +

+ +

Reactive form (FormControl)

+
+ + + + + + + +
+ +
+
lastName.touched
+
{{ form.get("lastName")?.touched }}
+
bio.touched
+
{{ form.get("bio")?.touched }}
+
+ +

Template-driven form (ngModel)

+

Same behavior should hold for the ngModel binding.

+
+ + + + + + + +
+ +
+
ngModelLastName.touched
+
{{ tdLastName.touched }}
+
ngModelBio.touched
+
{{ tdBio.touched }}
+
diff --git a/apps/prs/angular/src/routes/bugs/3964/bug3964.component.ts b/apps/prs/angular/src/routes/bugs/3964/bug3964.component.ts new file mode 100644 index 0000000000..6a32a79fb3 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3964/bug3964.component.ts @@ -0,0 +1,40 @@ +import { Component } from "@angular/core"; +import { + ReactiveFormsModule, + FormsModule, + FormGroup, + FormControl, + Validators, +} from "@angular/forms"; +import { GoabFormItem, GoabInput, GoabTextArea } from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-bug3964", + templateUrl: "./bug3964.component.html", + imports: [ReactiveFormsModule, FormsModule, GoabFormItem, GoabInput, GoabTextArea], +}) +export class Bug3964Component { + form = new FormGroup({ + lastName: new FormControl("", Validators.required), + bio: new FormControl("", Validators.required), + }); + + // Template-driven (ngModel) values + ngModelLastName = ""; + ngModelBio = ""; + + get lastNameError() { + const control = this.form.get("lastName"); + return control && !control.valid && control.touched && control.hasError("required") + ? "Enter a last name." + : undefined; + } + + get bioError() { + const control = this.form.get("bio"); + return control && !control.valid && control.touched && control.hasError("required") + ? "Enter a bio." + : undefined; + } +} diff --git a/apps/prs/angular/src/routes/bugs/3964/bug3964.route.json b/apps/prs/angular/src/routes/bugs/3964/bug3964.route.json new file mode 100644 index 0000000000..820a05d01a --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3964/bug3964.route.json @@ -0,0 +1,6 @@ +{ + "type": "bug", + "id": "3964", + "path": "bugs/3964", + "title": "Input touched on tab-in (Angular)" +} diff --git a/libs/angular-components/src/lib/components/input/input.spec.ts b/libs/angular-components/src/lib/components/input/input.spec.ts index 4f7fddfd72..0667c2f206 100644 --- a/libs/angular-components/src/lib/components/input/input.spec.ts +++ b/libs/angular-components/src/lib/components/input/input.spec.ts @@ -1,6 +1,6 @@ import { ComponentFixture, TestBed, fakeAsync, tick } from "@angular/core/testing"; import { GoabInput } from "./input"; -import { Component, CUSTOM_ELEMENTS_SCHEMA, TemplateRef } from "@angular/core"; +import { Component, CUSTOM_ELEMENTS_SCHEMA, TemplateRef, ViewChild } from "@angular/core"; import { GoabIconType, GoabInputAutoCapitalize, @@ -10,6 +10,13 @@ import { } from "@abgov/ui-components-common"; import { By } from "@angular/platform-browser"; import { fireEvent } from "@testing-library/dom"; +import { + FormControl, + FormGroup, + FormsModule, + NgModel, + ReactiveFormsModule, +} from "@angular/forms"; @Component({ standalone: true, @@ -326,6 +333,121 @@ describe("GoABInput", () => { }); }); +@Component({ + standalone: true, + imports: [GoabInput, ReactiveFormsModule], + template: ` +
+ +
+ `, +}) +class TestReactiveFormComponent { + form = new FormGroup({ + lastName: new FormControl(""), + }); +} + +describe("GoabInput reactive form touched state", () => { + let fixture: ComponentFixture; + let component: TestReactiveFormComponent; + let input: HTMLElement; + + beforeEach(fakeAsync(() => { + TestBed.configureTestingModule({ + imports: [TestReactiveFormComponent], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + }).compileComponents(); + + fixture = TestBed.createComponent(TestReactiveFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + tick(); + fixture.detectChanges(); + + input = fixture.debugElement.query(By.css("goa-input")).nativeElement; + })); + + it("should not mark the control as touched on focus", () => { + fireEvent(input, new CustomEvent("_focus")); + expect(component.form.get("lastName")?.touched).toBe(false); + }); + + it("should not mark the control as touched on change", () => { + fireEvent( + input, + new CustomEvent("_change", { detail: { name: "lastName", value: "Doe" } }), + ); + expect(component.form.get("lastName")?.touched).toBe(false); + }); + + it("should not mark the control as touched on key press", () => { + fireEvent(input, new CustomEvent("_keyPress")); + expect(component.form.get("lastName")?.touched).toBe(false); + }); + + it("should mark the control as touched on blur", () => { + fireEvent(input, new CustomEvent("_blur")); + expect(component.form.get("lastName")?.touched).toBe(true); + }); +}); + +@Component({ + standalone: true, + imports: [GoabInput, FormsModule], + template: ` + + `, +}) +class TestNgModelComponent { + lastName = ""; + @ViewChild("model") model!: NgModel; +} + +describe("GoabInput template-driven form touched state", () => { + let fixture: ComponentFixture; + let component: TestNgModelComponent; + let input: HTMLElement; + + beforeEach(fakeAsync(() => { + TestBed.configureTestingModule({ + imports: [TestNgModelComponent], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + }).compileComponents(); + + fixture = TestBed.createComponent(TestNgModelComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + tick(); + fixture.detectChanges(); + + input = fixture.debugElement.query(By.css("goa-input")).nativeElement; + })); + + it("should not mark the control as touched on focus", () => { + fireEvent(input, new CustomEvent("_focus")); + expect(component.model.touched).toBe(false); + }); + + it("should not mark the control as touched on change", () => { + fireEvent( + input, + new CustomEvent("_change", { detail: { name: "lastName", value: "Doe" } }), + ); + expect(component.model.touched).toBe(false); + }); + + it("should not mark the control as touched on key press", () => { + fireEvent(input, new CustomEvent("_keyPress")); + expect(component.model.touched).toBe(false); + }); + + it("should mark the control as touched on blur", () => { + fireEvent(input, new CustomEvent("_blur")); + expect(component.model.touched).toBe(true); + }); +}); + @Component({ standalone: true, imports: [GoabInput], diff --git a/libs/angular-components/src/lib/components/input/input.ts b/libs/angular-components/src/lib/components/input/input.ts index 72b574a0a8..19812fc2bb 100644 --- a/libs/angular-components/src/lib/components/input/input.ts +++ b/libs/angular-components/src/lib/components/input/input.ts @@ -199,7 +199,6 @@ export class GoabInput extends GoabControlValueAccessor implements OnInit { } _onChange(e: Event) { - this.markAsTouched(); const detail = { ...(e as CustomEvent).detail, event: e }; this.onChange.emit(detail); @@ -207,20 +206,17 @@ export class GoabInput extends GoabControlValueAccessor implements OnInit { } _onKeyPress(e: Event) { - this.markAsTouched(); const detail = { ...(e as CustomEvent).detail, event: e }; this.onKeyPress.emit(detail); - - this.fcTouched?.(); } _onFocus(e: Event) { - this.markAsTouched(); const detail = { ...(e as CustomEvent).detail, event: e }; this.onFocus.emit(detail); } _onBlur(e: Event) { + this.markAsTouched(); const detail = { ...(e as CustomEvent).detail, event: e }; this.onBlur.emit(detail); } diff --git a/libs/angular-components/src/lib/components/textarea/textarea.spec.ts b/libs/angular-components/src/lib/components/textarea/textarea.spec.ts index 443b69b20a..f6eec85d04 100644 --- a/libs/angular-components/src/lib/components/textarea/textarea.spec.ts +++ b/libs/angular-components/src/lib/components/textarea/textarea.spec.ts @@ -1,9 +1,16 @@ import { ComponentFixture, TestBed, fakeAsync, tick } from "@angular/core/testing"; import { GoabTextArea } from "./textarea"; -import { Component, CUSTOM_ELEMENTS_SCHEMA } from "@angular/core"; +import { Component, CUSTOM_ELEMENTS_SCHEMA, ViewChild } from "@angular/core"; import { GoabTextAreaCountBy, Spacing } from "@abgov/ui-components-common"; import { fireEvent } from "@testing-library/dom"; import { By } from "@angular/platform-browser"; +import { + FormControl, + FormGroup, + FormsModule, + NgModel, + ReactiveFormsModule, +} from "@angular/forms"; @Component({ standalone: true, @@ -180,3 +187,108 @@ describe("GoABTextArea", () => { }); }); }); + +@Component({ + standalone: true, + imports: [GoabTextArea, ReactiveFormsModule], + template: ` +
+ +
+ `, +}) +class TestReactiveFormComponent { + form = new FormGroup({ + bio: new FormControl(""), + }); +} + +describe("GoabTextArea reactive form touched state", () => { + let fixture: ComponentFixture; + let component: TestReactiveFormComponent; + let el: HTMLElement; + + beforeEach(fakeAsync(() => { + TestBed.configureTestingModule({ + imports: [TestReactiveFormComponent], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + }).compileComponents(); + + fixture = TestBed.createComponent(TestReactiveFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + tick(); + fixture.detectChanges(); + + el = fixture.nativeElement.querySelector("goa-textarea"); + })); + + it("should not mark the control as touched on change", () => { + fireEvent( + el, + new CustomEvent("_change", { detail: { name: "bio", value: "hello" } }), + ); + expect(component.form.get("bio")?.touched).toBe(false); + }); + + it("should not mark the control as touched on key press", () => { + fireEvent(el, new CustomEvent("_keyPress")); + expect(component.form.get("bio")?.touched).toBe(false); + }); + + it("should mark the control as touched on blur", () => { + fireEvent(el, new CustomEvent("_blur")); + expect(component.form.get("bio")?.touched).toBe(true); + }); +}); + +@Component({ + standalone: true, + imports: [GoabTextArea, FormsModule], + template: ` + + `, +}) +class TestNgModelComponent { + bio = ""; + @ViewChild("model") model!: NgModel; +} + +describe("GoabTextArea template-driven form touched state", () => { + let fixture: ComponentFixture; + let component: TestNgModelComponent; + let el: HTMLElement; + + beforeEach(fakeAsync(() => { + TestBed.configureTestingModule({ + imports: [TestNgModelComponent], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + }).compileComponents(); + + fixture = TestBed.createComponent(TestNgModelComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + tick(); + fixture.detectChanges(); + + el = fixture.nativeElement.querySelector("goa-textarea"); + })); + + it("should not mark the control as touched on change", () => { + fireEvent( + el, + new CustomEvent("_change", { detail: { name: "bio", value: "hello" } }), + ); + expect(component.model.touched).toBe(false); + }); + + it("should not mark the control as touched on key press", () => { + fireEvent(el, new CustomEvent("_keyPress")); + expect(component.model.touched).toBe(false); + }); + + it("should mark the control as touched on blur", () => { + fireEvent(el, new CustomEvent("_blur")); + expect(component.model.touched).toBe(true); + }); +}); diff --git a/libs/angular-components/src/lib/components/textarea/textarea.ts b/libs/angular-components/src/lib/components/textarea/textarea.ts index 97eab9d75a..676df29a21 100644 --- a/libs/angular-components/src/lib/components/textarea/textarea.ts +++ b/libs/angular-components/src/lib/components/textarea/textarea.ts @@ -115,7 +115,6 @@ export class GoabTextArea extends GoabControlValueAccessor implements OnInit { _onChange(e: Event) { const detail = { ...(e as CustomEvent).detail, event: e }; this.onChange.emit(detail); - this.markAsTouched(); this.fcChange?.(detail.value); } @@ -124,7 +123,6 @@ export class GoabTextArea extends GoabControlValueAccessor implements OnInit { ...(e as CustomEvent).detail, event: e, }; - this.markAsTouched(); this.onKeyPress.emit(detail); } From 3ed2b974ec1daa544cb061259e6f1536d8946765 Mon Sep 17 00:00:00 2001 From: Thomas Jeffery <82968683+twjeffery@users.noreply.github.com> Date: Mon, 22 Jun 2026 15:09:34 -0600 Subject: [PATCH 24/26] fix(#4077): Add heading-2xl size support to Text component * fix(#4077): add heading-2xl size to Text component Add support for a "heading-2xl" size on GoabText (goa-text), the largest heading size. The new size class is backed by the "--goa-typography-heading-2xl" token and falls back to "heading-xl" until that token is published, mirroring the existing "heading-2xs" pattern. Changes: - Text.svelte: add "heading-2xl" to the size union, desktop and mobile CSS (with heading-xl token fallbacks), and top/bottom margin cases matching heading-xl (top "2xl", bottom "l"). - common.ts: add "heading-2xl" to GoabTextHeadingSize. The React and Angular wrappers consume this type, so the new value flows through automatically. - Extend React and Angular wrapper tests to assert the size passes through. - Add React and Angular playground pages (bugs/4077) for visual review. Fixes #4077 Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01S2KHt61RZD1RNrKKZFmKkm * docs(#4077): add heading-2xl to Text heading sizes example Add a "Heading 2XL" entry to the Text component's "Heading sizes" configuration example on the docs site so the new size appears in the React, Angular, and Web Components code samples and live preview. * docs(#4077): explain heading-2xl token fallback Add code comments documenting why .heading-2xl falls back to a different token (heading-xl): heading-2xl is a V2-only typography token, so in V1 mode it degrades to the nearest existing V1 size instead of collapsing to unstyled text. Same rationale as the existing heading-2xs. Prevents the fallback from being mistaken for a copy-paste error in future reviews. --------- Co-authored-by: Claude --- .../routes/bugs/4077/bug4077.component.html | 18 ++++++++ .../src/routes/bugs/4077/bug4077.component.ts | 10 +++++ .../src/routes/bugs/4077/bug4077.route.json | 6 +++ .../src/app/routes/bugs/bug4077.route.ts | 10 +++++ apps/prs/react/src/routes/bugs/bug4077.tsx | 44 +++++++++++++++++++ docs/generated/component-apis/text.json | 3 +- docs/src/data/configurations/text.ts | 6 +++ .../src/lib/components/text/text.spec.ts | 10 +++++ libs/common/src/lib/common.ts | 1 + .../src/lib/text/text.spec.tsx | 7 +++ .../src/components/text/Text.svelte | 26 +++++++++++ 11 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 apps/prs/angular/src/routes/bugs/4077/bug4077.component.html create mode 100644 apps/prs/angular/src/routes/bugs/4077/bug4077.component.ts create mode 100644 apps/prs/angular/src/routes/bugs/4077/bug4077.route.json create mode 100644 apps/prs/react/src/app/routes/bugs/bug4077.route.ts create mode 100644 apps/prs/react/src/routes/bugs/bug4077.tsx diff --git a/apps/prs/angular/src/routes/bugs/4077/bug4077.component.html b/apps/prs/angular/src/routes/bugs/4077/bug4077.component.html new file mode 100644 index 0000000000..3907f4de3f --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/4077/bug4077.component.html @@ -0,0 +1,18 @@ +Bug 4077 - Text component missing heading-2xl + + GoabText now supports a size of "heading-2xl", the largest heading size. It should + render at least as large as "heading-xl". The visual size is driven by the + "--goa-typography-heading-2xl" design token and falls back to "heading-xl" until that + token is published. + + +New size +Heading 2XL + + + +Size scale comparison +Heading 2XL +Heading XL +Heading L +Heading M diff --git a/apps/prs/angular/src/routes/bugs/4077/bug4077.component.ts b/apps/prs/angular/src/routes/bugs/4077/bug4077.component.ts new file mode 100644 index 0000000000..993ec10477 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/4077/bug4077.component.ts @@ -0,0 +1,10 @@ +import { Component } from "@angular/core"; +import { GoabDivider, GoabText } from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-bug4077", + templateUrl: "./bug4077.component.html", + imports: [GoabDivider, GoabText], +}) +export class Bug4077Component {} diff --git a/apps/prs/angular/src/routes/bugs/4077/bug4077.route.json b/apps/prs/angular/src/routes/bugs/4077/bug4077.route.json new file mode 100644 index 0000000000..d36d610b22 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/4077/bug4077.route.json @@ -0,0 +1,6 @@ +{ + "type": "bug", + "id": "4077", + "path": "bugs/4077", + "title": "Text missing heading-2xl" +} diff --git a/apps/prs/react/src/app/routes/bugs/bug4077.route.ts b/apps/prs/react/src/app/routes/bugs/bug4077.route.ts new file mode 100644 index 0000000000..9b07d25ac1 --- /dev/null +++ b/apps/prs/react/src/app/routes/bugs/bug4077.route.ts @@ -0,0 +1,10 @@ +import { Bug4077Route } from "../../../routes/bugs/bug4077"; +import type { PrRouteDefinition } from "../../route-manifest"; + +export default { + type: "bug", + id: "4077", + path: "bugs/4077", + title: "Text missing heading-2xl", + component: Bug4077Route, +} satisfies PrRouteDefinition; diff --git a/apps/prs/react/src/routes/bugs/bug4077.tsx b/apps/prs/react/src/routes/bugs/bug4077.tsx new file mode 100644 index 0000000000..b301d39730 --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug4077.tsx @@ -0,0 +1,44 @@ +import { GoabDivider, GoabText } from "@abgov/react-components"; + +export function Bug4077Route() { + return ( +
+ + Bug #4077: Text component missing heading-2xl + + + GoabText now supports a size of "heading-2xl", the largest heading size. It + should render at least as large as "heading-xl". The visual size is driven by + the "--goa-typography-heading-2xl" design token and falls back to "heading-xl" + until that token is published. + + + + New size + + + Heading 2XL + + + + + + Size scale comparison + + + Heading 2XL + + + Heading XL + + + Heading L + + + Heading M + +
+ ); +} + +export default Bug4077Route; diff --git a/docs/generated/component-apis/text.json b/docs/generated/component-apis/text.json index 7437d8aff7..e80ee24e16 100644 --- a/docs/generated/component-apis/text.json +++ b/docs/generated/component-apis/text.json @@ -223,8 +223,9 @@ }, { "name": "size", - "type": "\"heading-xl\" | \"heading-l\" | \"heading-m\" | \"heading-s\" | \"heading-xs\" | \"heading-2xs\" | \"body-l\" | \"body-m\" | \"body-s\" | \"body-xs\"", + "type": "\"heading-2xl\" | \"heading-xl\" | \"heading-l\" | \"heading-m\" | \"heading-s\" | \"heading-xs\" | \"heading-2xs\" | \"body-l\" | \"body-m\" | \"body-s\" | \"body-xs\"", "values": [ + "heading-2xl", "heading-xl", "heading-l", "heading-m", diff --git a/docs/src/data/configurations/text.ts b/docs/src/data/configurations/text.ts index 49c746f308..1115abc8af 100644 --- a/docs/src/data/configurations/text.ts +++ b/docs/src/data/configurations/text.ts @@ -28,6 +28,8 @@ export const textConfigurations: ComponentConfigurations = { description: "All heading text sizes", code: { react: ` +Heading 2XL + Heading XL Heading L @@ -41,6 +43,8 @@ export const textConfigurations: ComponentConfigurations = { Heading 2XS `, angular: ` +Heading 2XL + Heading XL Heading L @@ -54,6 +58,8 @@ export const textConfigurations: ComponentConfigurations = { Heading 2XS `, webComponents: ` +Heading 2XL + Heading XL Heading L diff --git a/libs/angular-components/src/lib/components/text/text.spec.ts b/libs/angular-components/src/lib/components/text/text.spec.ts index 47ed1784b2..7c8447398c 100644 --- a/libs/angular-components/src/lib/components/text/text.spec.ts +++ b/libs/angular-components/src/lib/components/text/text.spec.ts @@ -58,6 +58,16 @@ describe("GoabText", () => { expect(element.getAttribute("ml")).toBe("xl"); })); + it("should pass heading-2xl size through to the web component", fakeAsync(() => { + component.size = "heading-2xl"; + fixture.detectChanges(); + tick(); + fixture.detectChanges(); + + const element = fixture.nativeElement.querySelector("goa-text"); + expect(element.getAttribute("size")).toBe("heading-2xl"); + })); + it("should handle undefined properties", fakeAsync(() => { fixture.detectChanges(); tick(); diff --git a/libs/common/src/lib/common.ts b/libs/common/src/lib/common.ts index 942333f31d..47b7e5657f 100644 --- a/libs/common/src/lib/common.ts +++ b/libs/common/src/lib/common.ts @@ -1247,6 +1247,7 @@ export type GoabTextMaxWidth = string | "none"; export type GoabTextHeadingElement = "h1" | "h2" | "h3" | "h4" | "h5"; export type GoabTextTextElement = "span" | "div" | "p"; export type GoabTextHeadingSize = + | "heading-2xl" | "heading-xl" | "heading-l" | "heading-m" diff --git a/libs/react-components/src/lib/text/text.spec.tsx b/libs/react-components/src/lib/text/text.spec.tsx index 576e3da4ac..033e6f6393 100644 --- a/libs/react-components/src/lib/text/text.spec.tsx +++ b/libs/react-components/src/lib/text/text.spec.tsx @@ -55,6 +55,13 @@ describe('GoabText', () => { expect(element?.getAttribute('mb')).toBe('l'); }); + it('should pass heading-2xl size through to the web component', () => { + const { container } = render(Largest heading); + const element = container.querySelector('goa-text'); + + expect(element?.getAttribute('size')).toBe('heading-2xl'); + }); + it('should handle different tag values', () => { const cases = [ { tag: 'p', name: 'paragraph' }, diff --git a/libs/web-components/src/components/text/Text.svelte b/libs/web-components/src/components/text/Text.svelte index 7321af7a0a..59f564b0f6 100644 --- a/libs/web-components/src/components/text/Text.svelte +++ b/libs/web-components/src/components/text/Text.svelte @@ -5,6 +5,7 @@ export type TextElement = "span" | "div" | "p"; type HeadingSize = + | "heading-2xl" | "heading-xl" | "heading-l" | "heading-m" @@ -77,6 +78,8 @@ } switch (effectiveSize) { + case "heading-2xl": + return "l"; case "heading-xl": return "l"; case "heading-l": @@ -106,6 +109,7 @@ } switch (effectiveSize) { + case "heading-2xl": case "heading-xl": case "heading-l": case "heading-m": @@ -155,6 +159,20 @@ margin: 0; } + /* + * heading-2xl (like heading-2xs) exists only in the V2 token set. When a + * consumer has only V1 tokens loaded the token is undefined, so it falls back + * to the nearest size that exists in V1 (heading-xl) rather than collapsing to + * unstyled text. Sizes that exist in both token sets (heading-xl through + * heading-xs) reference their token directly and need no fallback. + */ + .heading-2xl { + font: var(--goa-typography-heading-2xl, var(--goa-typography-heading-xl)); + letter-spacing: var( + --goa-typography-heading-2xl-letter-spacing, + var(--goa-typography-heading-xl-letter-spacing) + ); + } .heading-xl { font: var(--goa-typography-heading-xl); letter-spacing: var(--goa-typography-heading-xl-letter-spacing); @@ -193,6 +211,14 @@ } @media (--mobile) { + /* V2-only size; falls back to the nearest V1 size. See the note on the desktop .heading-2xl rule above. */ + .heading-2xl { + font: var(--goa-typography-mobile-heading-2xl, var(--goa-typography-mobile-heading-xl)); + letter-spacing: var( + --goa-typography-mobile-heading-2xl-letter-spacing, + var(--goa-typography-mobile-heading-xl-letter-spacing) + ); + } .heading-xl { font: var(--goa-typography-mobile-heading-xl); letter-spacing: var(--goa-typography-mobile-heading-xl-letter-spacing); From 9d44cba730d6607dcd2aa389ed795bef9b4e6d7c Mon Sep 17 00:00:00 2001 From: Vanessa Tran Date: Fri, 19 Jun 2026 11:26:51 -0600 Subject: [PATCH 25/26] chore(#3943): release docs from main and add dev branch preview --- .github/workflows/dev-release.yml | 126 ++++++++++++++++++ .../{release-ci.yml => main-release.yml} | 7 +- .github/workflows/pull-request.yml | 1 - .releaserc.json | 4 - 4 files changed, 127 insertions(+), 11 deletions(-) create mode 100644 .github/workflows/dev-release.yml rename .github/workflows/{release-ci.yml => main-release.yml} (94%) diff --git a/.github/workflows/dev-release.yml b/.github/workflows/dev-release.yml new file mode 100644 index 0000000000..d648b0005c --- /dev/null +++ b/.github/workflows/dev-release.yml @@ -0,0 +1,126 @@ +name: Dev Release & Preview + +on: + push: + branches: [dev] + workflow_dispatch: + +concurrency: + group: dev-release + cancel-in-progress: false + +permissions: + contents: write + id-token: write # Required for OIDC + +jobs: + dev-release: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v5 + with: + fetch-depth: 0 + + - uses: actions/setup-node@v6 + with: + node-version: "24" + cache: "npm" + cache-dependency-path: | + package-lock.json + docs/package-lock.json + + - name: Install npm 11 + run: npm install -g npm@11 + + - name: Install dependencies + run: | + npm ci + cd docs && npm ci --legacy-peer-deps + + # ---- Release libs to npm (dev prerelease channel) ---- + - name: Get last successful commit + uses: nrwl/nx-set-shas@v4 + id: last_successful_commit + with: + main-branch-name: ${{ github.ref_name }} + + - name: Build libs + run: npm run build:prod + + - name: Fix web-component lib README + run: cp libs/web-components/README.md dist/libs/web-components + + - name: Release libs + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + run: npx nx affected --target release --parallel=false --base=${{ steps.last_successful_commit.outputs.base }} + + # ---- Build + deploy docs & playground previews to Pages ---- + - name: Build docs + env: + PREVIEW_SITE: https://govalta.github.io + PREVIEW_BASE: /ui-components/dev/ + run: npx nx run docs:build + + - name: Build React playground + env: + PREVIEW_BASE_REACT: /ui-components/dev-react/ + run: npx nx run react-prs:build:production + + - name: Build Angular playground + env: + PREVIEW_BASE_ANGULAR: /ui-components/dev-angular/ + run: npx nx run angular-prs:build:production --base-href=$PREVIEW_BASE_ANGULAR + + # force: false => rebase onto the latest gh-pages instead of force-pushing, + # so a concurrent PR-preview deploy to a different folder is not clobbered. + # clean-exclude protects the sibling folders as a safety net. + - name: Deploy docs + uses: JamesIves/github-pages-deploy-action@v4 + with: + branch: gh-pages + folder: ./dist/docs + target-folder: dev + force: false + attempt-limit: 5 + clean: true + clean-exclude: | + pr-preview + pr-preview-react + pr-preview-angular + dev-react + dev-angular + + - name: Deploy React playground + uses: JamesIves/github-pages-deploy-action@v4 + with: + branch: gh-pages + folder: ./dist/apps/prs/react + target-folder: dev-react + force: false + attempt-limit: 5 + clean: true + clean-exclude: | + pr-preview + pr-preview-react + pr-preview-angular + dev + dev-angular + + - name: Deploy Angular playground + uses: JamesIves/github-pages-deploy-action@v4 + with: + branch: gh-pages + folder: ./dist/apps/prs/angular/browser + target-folder: dev-angular + force: false + attempt-limit: 5 + clean: true + clean-exclude: | + pr-preview + pr-preview-react + pr-preview-angular + dev + dev-react diff --git a/.github/workflows/release-ci.yml b/.github/workflows/main-release.yml similarity index 94% rename from .github/workflows/release-ci.yml rename to .github/workflows/main-release.yml index 527a45144c..b57307e6cc 100644 --- a/.github/workflows/release-ci.yml +++ b/.github/workflows/main-release.yml @@ -1,11 +1,9 @@ -name: Release CI +name: Main Release on: push: branches: - main - - next - - dev # Allows you to run this workflow manually from the Actions tab workflow_dispatch: @@ -56,9 +54,6 @@ jobs: runs-on: ubuntu-latest needs: build - # this will get changed to main in the future - if: github.ref == 'refs/heads/dev' - steps: - uses: actions/checkout@v5 with: diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 46f8ffdaca..616a2abe13 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -7,7 +7,6 @@ on: pull_request: branches: - main - - next - dev jobs: diff --git a/.releaserc.json b/.releaserc.json index 0def22f89e..5bd376007d 100644 --- a/.releaserc.json +++ b/.releaserc.json @@ -3,10 +3,6 @@ "branches": [ "+([0-9])?(.{+([0-9]),x}).x", "main", - { - "name": "next", - "prerelease": true - }, { "name": "dev", "prerelease": true From df673ceeeaf9954e228fb6ff390d50e2fb4fd961 Mon Sep 17 00:00:00 2001 From: Vanessa Tran Date: Tue, 16 Jun 2026 18:24:35 -0600 Subject: [PATCH 26/26] feat(#3347): add workspace-layout and scroll panel components Co-authored-by: Thomas Jeffery --- apps/prs/angular/src/app/app.component.html | 158 +++-- apps/prs/angular/src/app/app.component.ts | 34 +- .../scroll-panel/scroll-panel.component.html | 96 +++ .../scroll-panel/scroll-panel.component.ts | 19 + .../docs/scroll-panel/scroll-panel.route.json | 6 + ...rkspace-layout-scroll-monitor.component.ts | 66 ++ .../workspace-layout.component.html | 135 ++++ .../workspace-layout.component.ts | 52 ++ .../workspace-layout.route.json | 10 + .../features/feat3347/feat3347.component.css | 55 ++ .../features/feat3347/feat3347.component.html | 323 ++++++++++ .../features/feat3347/feat3347.component.ts | 197 ++++++ .../features/feat3347/feat3347.route.json | 6 + .../feat3347PushDrawer.component.html | 27 + .../feat3347PushDrawer.component.ts | 17 + .../feat3347PushDrawer.route.json | 6 + .../push-drawer-host.service.ts | 19 + apps/prs/react/src/app/app.tsx | 275 +++++--- .../src/app/routes/docs/scroll-panel.route.ts | 10 + .../app/routes/docs/workspace-layout.route.ts | 10 + .../src/app/routes/features/feat3347.route.ts | 9 + .../features/feat3347PushDrawer.route.ts | 9 + apps/prs/react/src/main.tsx | 1 - .../routes/docs/scroll-panel/scroll-panel.tsx | 133 ++++ .../workspace-layout/workspace-layout.css | 10 + .../workspace-layout/workspace-layout.tsx | 186 ++++++ .../react/src/routes/features/feat3347.tsx | 597 ++++++++++++++++++ .../routes/features/feat3347PushDrawer.tsx | 43 ++ docs/ARCHITECTURE.md | 11 + .../component-apis/scroll-panel.json | 103 +++ .../component-apis/workspace-layout.json | 143 +++++ docs/package-lock.json | 53 +- docs/package.json | 2 +- .../examples/workspace-layout-diagram.png | Bin 0 -> 69936 bytes docs/public/search-index.json | 36 +- .../public/thumbnails/workspace-card-view.png | Bin 244027 -> 153207 bytes docs/src/components/CodeSnippet.css | 2 +- docs/src/components/DoDont.astro | 13 +- docs/src/components/PreviewContainer.astro | 20 +- docs/src/content/components/scroll-panel.mdx | 19 + .../content/components/workspace-layout.mdx | 55 ++ docs/src/content/config.ts | 3 + .../examples/workspace/case-detail/index.mdx | 1 + .../examples/workspace/dashboard/index.mdx | 1 + .../examples/workspace/index-page/index.mdx | 1 + .../scroll-panel-shared-scroll-primitive.mdx | 22 + ...workspace-layout-host-at-viewport-root.mdx | 15 + .../workspace-layout-reading-scroll-state.mdx | 17 + .../guidance/workspace-layout-when-to-use.mdx | 17 + .../content/productTypes/workspace/index.mdx | 99 ++- docs/src/data/configurations/index.ts | 6 + docs/src/data/configurations/scroll-panel.ts | 306 +++++++++ .../data/configurations/workspace-layout.ts | 505 +++++++++++++++ docs/src/layouts/ExamplesPageLayout.astro | 15 + docs/src/layouts/PreviewLayout.astro | 12 + docs/src/lib/extract-code-parts.ts | 11 + docs/src/pages/components/[slug].astro | 11 +- .../examples/[family]/[page]/preview.astro | 1 + docs/src/scripts/extract-api.ts | 4 + .../src/lib/components/index.ts | 3 + .../scroll-panel/scroll-panel.spec.ts | 84 +++ .../components/scroll-panel/scroll-panel.ts | 64 ++ .../workspace-layout-scroll-state.service.ts | 32 + .../workspace-layout/workspace-layout.spec.ts | 111 ++++ .../workspace-layout/workspace-layout.ts | 94 +++ libs/common/src/lib/common.ts | 21 + .../specs/modal.browser.spec.tsx | 72 ++- .../specs/scroll-panel.browser.spec.tsx | 131 ++++ .../specs/work-side-menu.browser.spec.tsx | 21 +- .../specs/workspace-layout.browser.spec.tsx | 184 ++++++ libs/react-components/src/index.ts | 2 + .../lib/scroll-panel/scroll-panel.spec.tsx | 74 +++ .../src/lib/scroll-panel/scroll-panel.tsx | 55 ++ .../workspace-layout-scroll-state.tsx | 36 ++ .../workspace-layout.spec.tsx | 99 +++ .../lib/workspace-layout/workspace-layout.tsx | 100 +++ .../src/components/drawer/Drawer.svelte | 268 ++------ .../src/components/drawer/drawer.spec.ts | 57 -- .../src/components/modal/Modal.svelte | 211 +++---- .../push-drawer/PushDrawerInternal.svelte | 253 +++----- .../scroll-panel/ScrollPanel.spec.ts | 87 +++ .../scroll-panel/ScrollPanel.svelte | 273 ++++++++ .../ScrollPanelWrapper.test.svelte | 18 + .../work-side-menu/WorkSideMenu.svelte | 353 +++++------ .../WorkSideNotificationPanel.svelte | 168 ++--- .../workspace-layout/WorkspaceLayout.spec.ts | 59 ++ .../workspace-layout/WorkspaceLayout.svelte | 519 +++++++++++++++ .../WorkspaceLayoutWrapper.test.svelte | 21 + libs/web-components/src/index.ts | 2 + libs/web-components/src/types/relay-types.ts | 64 +- package-lock.json | 8 +- package.json | 2 +- 92 files changed, 6428 insertions(+), 1131 deletions(-) create mode 100644 apps/prs/angular/src/routes/docs/scroll-panel/scroll-panel.component.html create mode 100644 apps/prs/angular/src/routes/docs/scroll-panel/scroll-panel.component.ts create mode 100644 apps/prs/angular/src/routes/docs/scroll-panel/scroll-panel.route.json create mode 100644 apps/prs/angular/src/routes/docs/workspace-layout/workspace-layout-scroll-monitor.component.ts create mode 100644 apps/prs/angular/src/routes/docs/workspace-layout/workspace-layout.component.html create mode 100644 apps/prs/angular/src/routes/docs/workspace-layout/workspace-layout.component.ts create mode 100644 apps/prs/angular/src/routes/docs/workspace-layout/workspace-layout.route.json create mode 100644 apps/prs/angular/src/routes/features/feat3347/feat3347.component.css create mode 100644 apps/prs/angular/src/routes/features/feat3347/feat3347.component.html create mode 100644 apps/prs/angular/src/routes/features/feat3347/feat3347.component.ts create mode 100644 apps/prs/angular/src/routes/features/feat3347/feat3347.route.json create mode 100644 apps/prs/angular/src/routes/features/feat3347PushDrawer/feat3347PushDrawer.component.html create mode 100644 apps/prs/angular/src/routes/features/feat3347PushDrawer/feat3347PushDrawer.component.ts create mode 100644 apps/prs/angular/src/routes/features/feat3347PushDrawer/feat3347PushDrawer.route.json create mode 100644 apps/prs/angular/src/routes/features/feat3347PushDrawer/push-drawer-host.service.ts create mode 100644 apps/prs/react/src/app/routes/docs/scroll-panel.route.ts create mode 100644 apps/prs/react/src/app/routes/docs/workspace-layout.route.ts create mode 100644 apps/prs/react/src/app/routes/features/feat3347.route.ts create mode 100644 apps/prs/react/src/app/routes/features/feat3347PushDrawer.route.ts create mode 100644 apps/prs/react/src/routes/docs/scroll-panel/scroll-panel.tsx create mode 100644 apps/prs/react/src/routes/docs/workspace-layout/workspace-layout.css create mode 100644 apps/prs/react/src/routes/docs/workspace-layout/workspace-layout.tsx create mode 100644 apps/prs/react/src/routes/features/feat3347.tsx create mode 100644 apps/prs/react/src/routes/features/feat3347PushDrawer.tsx create mode 100644 docs/generated/component-apis/scroll-panel.json create mode 100644 docs/generated/component-apis/workspace-layout.json create mode 100644 docs/public/images/examples/workspace-layout-diagram.png create mode 100644 docs/src/content/components/scroll-panel.mdx create mode 100644 docs/src/content/components/workspace-layout.mdx create mode 100644 docs/src/content/guidance/scroll-panel-shared-scroll-primitive.mdx create mode 100644 docs/src/content/guidance/workspace-layout-host-at-viewport-root.mdx create mode 100644 docs/src/content/guidance/workspace-layout-reading-scroll-state.mdx create mode 100644 docs/src/content/guidance/workspace-layout-when-to-use.mdx create mode 100644 docs/src/data/configurations/scroll-panel.ts create mode 100644 docs/src/data/configurations/workspace-layout.ts create mode 100644 libs/angular-components/src/lib/components/scroll-panel/scroll-panel.spec.ts create mode 100644 libs/angular-components/src/lib/components/scroll-panel/scroll-panel.ts create mode 100644 libs/angular-components/src/lib/components/workspace-layout/workspace-layout-scroll-state.service.ts create mode 100644 libs/angular-components/src/lib/components/workspace-layout/workspace-layout.spec.ts create mode 100644 libs/angular-components/src/lib/components/workspace-layout/workspace-layout.ts create mode 100644 libs/react-components/specs/scroll-panel.browser.spec.tsx create mode 100644 libs/react-components/specs/workspace-layout.browser.spec.tsx create mode 100644 libs/react-components/src/lib/scroll-panel/scroll-panel.spec.tsx create mode 100644 libs/react-components/src/lib/scroll-panel/scroll-panel.tsx create mode 100644 libs/react-components/src/lib/workspace-layout/workspace-layout-scroll-state.tsx create mode 100644 libs/react-components/src/lib/workspace-layout/workspace-layout.spec.tsx create mode 100644 libs/react-components/src/lib/workspace-layout/workspace-layout.tsx create mode 100644 libs/web-components/src/components/scroll-panel/ScrollPanel.spec.ts create mode 100644 libs/web-components/src/components/scroll-panel/ScrollPanel.svelte create mode 100644 libs/web-components/src/components/scroll-panel/ScrollPanelWrapper.test.svelte create mode 100644 libs/web-components/src/components/workspace-layout/WorkspaceLayout.spec.ts create mode 100644 libs/web-components/src/components/workspace-layout/WorkspaceLayout.svelte create mode 100644 libs/web-components/src/components/workspace-layout/WorkspaceLayoutWrapper.test.svelte diff --git a/apps/prs/angular/src/app/app.component.html b/apps/prs/angular/src/app/app.component.html index 280b854410..a82e87a40f 100644 --- a/apps/prs/angular/src/app/app.component.html +++ b/apps/prs/angular/src/app/app.component.html @@ -1,78 +1,102 @@ @if (!isFullPage) { -
-
- - -
+ + + + + + + -
- - - + + + + @for (route of bugRouteDefinitions; track route.path) { + [label]="route.id + ' - ' + route.title" + [url]="baseHref + route.path" + /> + } + + + @for (route of docsRouteDefinitions; track route.path) { + + } + + + @for (route of featureRouteDefinitions; track route.path) { - + [label]="route.id + ' - ' + route.title" + [url]="baseHref + route.path" + /> + } + + - - - - @for (route of bugRouteDefinitions; track route.path) { - - } - - - @for (route of docsRouteDefinitions; track route.path) { - - } - - - @for (route of featureRouteDefinitions; track route.path) { - - } - - -
- -
+ + + + + + + + + + Cancel + Save + + + + + + @for (n of pushDrawerParagraphs; track n) { +

+ Paragraph {{ n }} — Push Drawer V2 now uses goa-scroll-panel internally. Verify + header sticky + actions sticky + content scrolls + outer chrome morphs + (margins/radius/height) as scroll state changes between top / middle / bottom. +

+ } +
+
+ + +
+
-
- -
-
+ } @if (isFullPage) { - + } diff --git a/apps/prs/angular/src/app/app.component.ts b/apps/prs/angular/src/app/app.component.ts index 594c670822..4bcf9f53ae 100644 --- a/apps/prs/angular/src/app/app.component.ts +++ b/apps/prs/angular/src/app/app.component.ts @@ -5,12 +5,16 @@ import { filter } from "rxjs/operators"; import { GoabAppFooter, GoabAppHeader, - GoabMicrositeHeader, + GoabButton, + GoabButtonGroup, + GoabPushDrawer, GoabThemeService, GoabWorkSideMenu, GoabWorkSideMenuItem, GoabWorkSideMenuGroup, + GoabWorkspaceLayout, } from "@abgov/angular-components"; +import { PushDrawerHostService } from "../routes/features/feat3347PushDrawer/push-drawer-host.service"; import { bugRouteDefinitions, docsRouteDefinitions, @@ -34,37 +38,55 @@ const TOKEN_TOGGLE_URL = "#tokens"; RouterOutlet, GoabAppFooter, GoabAppHeader, - GoabMicrositeHeader, + GoabButton, + GoabButtonGroup, + GoabPushDrawer, GoabWorkSideMenu, GoabWorkSideMenuItem, GoabWorkSideMenuGroup, + GoabWorkspaceLayout, ], schemas: [CUSTOM_ELEMENTS_SCHEMA], }) export class AppComponent { isFullPage = false; - readonly workSideMenuHeight = "calc(100vh - 10.1875rem)"; + isPushDrawerRoute = false; readonly bugRouteDefinitions = bugRouteDefinitions; readonly featureRouteDefinitions = featureRouteDefinitions; readonly docsRouteDefinitions = docsRouteDefinitions; readonly baseHref = inject(LocationStrategy).getBaseHref(); readonly tokenToggleUrl = TOKEN_TOGGLE_URL; tokenMode: TokenVersion = resolveTokenVersion(); + readonly pushDrawerParagraphs = Array.from({ length: 30 }, (_, i) => i + 1); private fullPageRoutes = ["/features/2885"]; private router = inject(Router); readonly theme = inject(GoabThemeService); + private pushDrawerHost = inject(PushDrawerHostService); + readonly pushDrawerOpen = this.pushDrawerHost.open; constructor() { + const initialUrl = window.location.pathname.startsWith(this.baseHref) + ? "/" + window.location.pathname.slice(this.baseHref.length) + : window.location.pathname; + this.isFullPage = this.fullPageRoutes.includes(initialUrl); + this.isPushDrawerRoute = initialUrl.startsWith("/features/3347-push"); + if (this.isPushDrawerRoute) this.pushDrawerHost.openDrawer(); + this.router.events .pipe(filter((event) => event instanceof NavigationEnd)) .subscribe((event) => { - this.isFullPage = this.fullPageRoutes.includes( - (event as NavigationEnd).urlAfterRedirects, - ); + const url = (event as NavigationEnd).urlAfterRedirects; + this.isFullPage = this.fullPageRoutes.includes(url); + this.isPushDrawerRoute = url.startsWith("/features/3347-push"); + if (this.isPushDrawerRoute) this.pushDrawerHost.openDrawer(); }); } + closePushDrawer() { + this.pushDrawerHost.closeDrawer(); + } + handleNavigate(path: string): void { if (path === TOKEN_TOGGLE_URL) { this.tokenMode = this.tokenMode === "v1" ? "v2" : "v1"; diff --git a/apps/prs/angular/src/routes/docs/scroll-panel/scroll-panel.component.html b/apps/prs/angular/src/routes/docs/scroll-panel/scroll-panel.component.html new file mode 100644 index 0000000000..269b259df5 --- /dev/null +++ b/apps/prs/angular/src/routes/docs/scroll-panel/scroll-panel.component.html @@ -0,0 +1,96 @@ +

Scroll panel

+

+ Mirrors the documentation examples for goab-scroll-panel: a bounded + container with sticky header / footer slots and a scrollable body. +

+ +

Basic scroll panel

+ +
+ Case details +
+
+ +
+ + Cancel + Save changes + +
+
+
+ +
+ @for (n of paragraphs; track n) { +

+ Paragraph {{ n }} — Scrollable body content. The panel will scroll inside its + 480px height, with sticky header and footer pinned. Notice the subtle border + + inset shadow that appears when scrolling indicates more content. +

+ } +
+
+
+ +

Header only

+ +
+ Activity feed +
+
+
+ +
+ @for (n of rows; track n) { +

Row {{ n }} — scroll me, header stays pinned at the top.

+ } +
+
+
+ +

Footer only

+ +
+ + Submit + +
+
+
+ +
+ @for (n of rows; track n) { +

Row {{ n }} — scroll me, footer stays pinned at the bottom.

+ } +
+
+
+ +

Custom height

+

+ The height prop accepts any valid CSS height value (e.g. "600px", "80vh"). + It defaults to "100%" so the panel fills a height-constrained parent. +

+ +
+ Custom 600px height +
+
+ +
+ Footer pinned at bottom +
+
+
+ +
+ @for (n of tallRows; track n) { +

+ Row {{ n }} — Body scrolls within the explicit 600px height. Swap to "80vh" for + viewport-relative sizing, or leave the prop off (defaults to "100%") when a + parent already constrains height. +

+ } +
+
+
diff --git a/apps/prs/angular/src/routes/docs/scroll-panel/scroll-panel.component.ts b/apps/prs/angular/src/routes/docs/scroll-panel/scroll-panel.component.ts new file mode 100644 index 0000000000..6f51765026 --- /dev/null +++ b/apps/prs/angular/src/routes/docs/scroll-panel/scroll-panel.component.ts @@ -0,0 +1,19 @@ +import { Component } from "@angular/core"; +import { + GoabButton, + GoabButtonGroup, + GoabScrollPanel, + GoabText, +} from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-docs-scroll-panel", + templateUrl: "./scroll-panel.component.html", + imports: [GoabScrollPanel, GoabText, GoabButton, GoabButtonGroup], +}) +export class DocsScrollPanelComponent { + paragraphs = Array.from({ length: 15 }, (_, i) => i + 1); + rows = Array.from({ length: 12 }, (_, i) => i + 1); + tallRows = Array.from({ length: 20 }, (_, i) => i + 1); +} diff --git a/apps/prs/angular/src/routes/docs/scroll-panel/scroll-panel.route.json b/apps/prs/angular/src/routes/docs/scroll-panel/scroll-panel.route.json new file mode 100644 index 0000000000..a334235302 --- /dev/null +++ b/apps/prs/angular/src/routes/docs/scroll-panel/scroll-panel.route.json @@ -0,0 +1,6 @@ +{ + "type": "docs", + "id": "scroll-panel", + "path": "docs/scroll-panel", + "title": "Scroll Panel" +} diff --git a/apps/prs/angular/src/routes/docs/workspace-layout/workspace-layout-scroll-monitor.component.ts b/apps/prs/angular/src/routes/docs/workspace-layout/workspace-layout-scroll-monitor.component.ts new file mode 100644 index 0000000000..a5013fe019 --- /dev/null +++ b/apps/prs/angular/src/routes/docs/workspace-layout/workspace-layout-scroll-monitor.component.ts @@ -0,0 +1,66 @@ +import { Component, computed, inject } from "@angular/core"; +import { + GoabText, + GoabWorkSideMenu, + GoabWorkSideMenuItem, + GoabWorkspaceLayout, + GoabWorkspaceLayoutScrollStateService, +} from "@abgov/angular-components"; + +/** + * Scroll-state example, isolated in its own component so its + * GoabWorkspaceLayoutScrollStateService instance does not cross-talk with the + * other workspace layouts stacked on the same docs page (the service is normally + * root-scoped, and "most recent update wins"). + */ +@Component({ + standalone: true, + selector: "abgov-docs-wsl-scroll-monitor", + providers: [GoabWorkspaceLayoutScrollStateService], + imports: [GoabWorkspaceLayout, GoabWorkSideMenu, GoabWorkSideMenuItem, GoabText], + template: ` + +
+ @for (n of rows; track n) { +

Case row {{ n }}

+ } +
+
+ + + My cases + @if (!collapsed()) { + Scroll down to collapse this subtitle. + } + + + + + + + + + + `, +}) +export class DocsWorkspaceLayoutScrollMonitorComponent { + rows = Array.from({ length: 20 }, (_, i) => i + 1); + + private scrollState = inject(GoabWorkspaceLayoutScrollStateService); + + // Collapse once the user scrolls past the top. + collapsed = computed(() => { + const pos = this.scrollState.scrollPosition(); + return pos === "middle" || pos === "at-bottom"; + }); +} diff --git a/apps/prs/angular/src/routes/docs/workspace-layout/workspace-layout.component.html b/apps/prs/angular/src/routes/docs/workspace-layout/workspace-layout.component.html new file mode 100644 index 0000000000..23ac3c9df9 --- /dev/null +++ b/apps/prs/angular/src/routes/docs/workspace-layout/workspace-layout.component.html @@ -0,0 +1,135 @@ +

Workspace layout

+

+ Mirrors the documentation examples for goab-workspace-layout. Each + example is bounded to 600px so they stack on this page; in a real app the layout + fills the viewport. +

+ +

Basic workspace

+
+ +
+ @for (n of rows; track n) { +

Case row {{ n }} — scroll this area while the side menu stays in place.

+ } +
+
+
+ + + + + + + + + +

Sticky header

+
+ +
+ @for (n of rows; track n) { +

Case row {{ n }} — scroll this area and the header stays pinned at the top.

+ } +
+
+
+ + + + + + + + +
+ My cases + + Filter + New case + +
+
+ +

Sticky footer

+
+ +
+ @for (n of rows; track n) { +

Case row {{ n }} — scroll this area and the footer stays pinned at the bottom.

+ } +
+
+
+ + + + + + + + +
+ 3 cases selected + + Clear + Export + +
+
+ +

Push drawer

+
+ +
+ Open + @for (n of rows; track n) { +

+ Case row {{ n }} — open the drawer and it appears beside this content, + narrowing it instead of covering it. +

+ } +
+
+
+ + + + + + + + + +

Details for the selected case appear here, beside the page content.

+
+
+ +

Monitor scroll state

+

+ The page header collapses its subtitle once content scrolls past the top, via + GoabWorkspaceLayoutScrollStateService. +

+
+ +
diff --git a/apps/prs/angular/src/routes/docs/workspace-layout/workspace-layout.component.ts b/apps/prs/angular/src/routes/docs/workspace-layout/workspace-layout.component.ts new file mode 100644 index 0000000000..75c4e35cc9 --- /dev/null +++ b/apps/prs/angular/src/routes/docs/workspace-layout/workspace-layout.component.ts @@ -0,0 +1,52 @@ +import { Component } from "@angular/core"; +import { + GoabButton, + GoabButtonGroup, + GoabPushDrawer, + GoabText, + GoabWorkSideMenu, + GoabWorkSideMenuItem, + GoabWorkspaceLayout, +} from "@abgov/angular-components"; +import { DocsWorkspaceLayoutScrollMonitorComponent } from "./workspace-layout-scroll-monitor.component"; + +@Component({ + standalone: true, + selector: "abgov-docs-workspace-layout", + templateUrl: "./workspace-layout.component.html", + imports: [ + GoabWorkspaceLayout, + GoabWorkSideMenu, + GoabWorkSideMenuItem, + GoabText, + GoabButton, + GoabButtonGroup, + GoabPushDrawer, + DocsWorkspaceLayoutScrollMonitorComponent, + ], + styles: [ + ` + .wsl-demo { + margin-bottom: var(--goa-space-2xl, 3rem); + } + /* goab-workspace-layout fills the viewport (100vh) by default. Bound each + demo so they stack on this page; !important overrides the web + component's :host height rule. */ + :host ::ng-deep goab-workspace-layout, + :host ::ng-deep abgov-docs-wsl-scroll-monitor { + display: block; + } + :host ::ng-deep goa-workspace-layout { + height: 600px !important; + } + `, + ], +}) +export class DocsWorkspaceLayoutComponent { + rows = Array.from({ length: 16 }, (_, i) => i + 1); + open = false; + + handleNavigate(path: string): void { + console.log("navigate", path); + } +} diff --git a/apps/prs/angular/src/routes/docs/workspace-layout/workspace-layout.route.json b/apps/prs/angular/src/routes/docs/workspace-layout/workspace-layout.route.json new file mode 100644 index 0000000000..b068b96d97 --- /dev/null +++ b/apps/prs/angular/src/routes/docs/workspace-layout/workspace-layout.route.json @@ -0,0 +1,10 @@ +{ + "type": "docs", + "id": "workspace-layout", + "path": "docs/workspace-layout", + "title": "Workspace Layout" +} + + + + diff --git a/apps/prs/angular/src/routes/features/feat3347/feat3347.component.css b/apps/prs/angular/src/routes/features/feat3347/feat3347.component.css new file mode 100644 index 0000000000..9331be9010 --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat3347/feat3347.component.css @@ -0,0 +1,55 @@ +.demo-header, +.ws-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--goa-space-m); + padding: var(--goa-space-m) var(--goa-space-l); +} + +.ws-header__actions { + display: flex; + gap: var(--goa-space-s); +} + +.demo-body, +.ws-body { + padding: var(--goa-space-m) var(--goa-space-l); +} + +.ws-row { + padding: var(--goa-space-s) 0; + border-bottom: var(--goa-border-width-s) solid var(--goa-color-greyscale-150); +} + +.ws-row__title { + font-weight: var(--goa-font-weight-bold); +} + +.ws-row__meta { + color: var(--goa-color-text-secondary); + font-size: var(--goa-font-size-2); +} + +.demo-footer, +.ws-footer { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--goa-space-m); + padding: var(--goa-space-s) var(--goa-space-l); +} + +.ws-footer__count { + color: var(--goa-color-text-secondary); +} + +/* Test 6: bound the notification panel's width (panel itself is 710px tall by + default) and frame it so it visually stands apart from the surrounding page + content. */ +.notification-panel-stage { + width: 360px; + border: var(--goa-border-width-s) solid var(--goa-color-greyscale-200); + border-radius: var(--goa-popover-border-radius); + overflow: hidden; +} diff --git a/apps/prs/angular/src/routes/features/feat3347/feat3347.component.html b/apps/prs/angular/src/routes/features/feat3347/feat3347.component.html new file mode 100644 index 0000000000..a1a3ace28f --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat3347/feat3347.component.html @@ -0,0 +1,323 @@ +

#3347 Scroll Panel — Workspace shell evaluation

+

Test 1: Bounded panel (the use case it's built for)

+

+ Fixed height 480px. Header + scrollable body + footer. This is where the component + shines. +

+ + +
+
+ Case details + + + + +
+ Close +
+
+ + + + + +
+ @for (n of paragraphs; track n) { +

+ Paragraph {{ n }} — Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed + do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim + veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo + consequat. +

+ } +
+
+ + + + + + +

Test 2: Header only / Footer only

+

Verifying optional template slots render correctly.

+ + +
+ Header only — pinned at top +
+
+ + + + + + +
+ @for (n of paragraphs; track n) { +

Row {{ n }} — scroll me, header stays pinned.

+ } +
+
+ + +
+ @for (n of paragraphs; track n) { +

Row {{ n }} — scroll me, footer stays pinned.

+ } +
+
+
+ + + +

Test 3: Default height (100%) inside a constrained parent

+

Parent gives the height context — scroll panel fills it.

+ + +
+ Inherits parent height +
+
+ + + + +
+ +
+ @for (n of paragraphs; track n) { +

Row {{ n }} — body scrolls within the parent's 380px.

+ } +
+
+
+ + + +

Test 4: Drawer V2 (refactored internally with goa-scroll-panel)

+

+ Verifies Drawer V2 still works after its internal scroll mechanics were replaced with + <goa-scroll-panel>. Open and scroll inside — header should stay + pinned at top (with border on scroll), actions footer should stay pinned at bottom (with + border when content overflows above). +

+ + + + Cancel + Save + + + +Open drawer + + + @for (n of paragraphs; track n) { +

+ Paragraph {{ n }} — Drawer V2 now uses goa-scroll-panel internally. Verify header + sticky + actions sticky + content scrolls + borders appear when scrolled + (top/middle/bottom states). +

+ } +
+ + + +

+ Push Drawer V2 also got the scroll-panel treatment — see the dedicated full-page test at + features/3347-push (linked in the side menu as + 3347-push - Scroll Panel - Push Drawer V2) so the drawer's internal + scroll can be verified without page scroll bubbling. +

+ + + + + + +

Test 5: Modal (refactored internally with goa-scroll-panel)

+

+ Verifies Modal still works after its V2 path was refactored to use + <goa-scroll-panel> instead of <goa-scrollable>. V1 + path is unchanged (still uses goa-scrollable + maxheight calc). The + GoabModal React/Angular wrapper hardcodes version="2" + so this test exercises the new path. Open and scroll inside — header should stay pinned + at top with border on scroll, action footer pinned at bottom with border when content + overflows above. +

+ + + + Cancel + Save + + + +Open modal + + + @for (n of paragraphs; track n) { +

+ Paragraph {{ n }} — Modal V2 now uses goa-scroll-panel internally. Verify header + sticky + actions sticky + content scrolls + borders appear when scrolled + (top/middle/bottom states). The pane should remain centered with a 64px gap from + viewport edges. +

+ } +
+ + + + + + +

Test 6: WorkSideNotificationPanel (refactored to use goa-scroll-panel)

+

+ Verifies the notification panel still works after its layout was refactored to use + <goa-scroll-panel> internally (header slot for title + tabs, + default slot for the scrollable notification list, footer slot for "View all" + / "Mark all as read" actions). Rendered inline here (normally lives inside a + popover triggered from a work-side-menu icon). Scroll inside the notification + list to verify sticky header + sticky footer + border feedback on scroll. +

+ +
+ + @for (notif of notifications; track trackById($index, notif)) { + + } + +
+ + + + + + +

Validator case 1: valid calc() height (no error)

+

+ Passes height="calc(20rem + 2rem)". The old regex validator + rejected calc(), so this used to log a false console error. With CSS.supports + it is accepted: no error logged, and the panel scrolls within its explicit + height. Scroll to the bottom and keep scrolling with the pointer over the + panel, the page scrolls next (no scroll trap). +

+ + +
+ Valid calc() height +
+
+ + +
+ @for (n of paragraphs; track n) { +

Row {{ n }} — body content inside a calc() height panel.

+ } +
+
+ + + + + + +

Validator case 2: invalid height (errors, falls back to 100%)

+

+ Passes height="not-a-height". Open the console: it logs a + ScrollPanel height error. Instead of collapsing to content height (an + unscrollable block that swallowed page scroll), the host now falls back to + height: 100%, so inside this 320px parent the panel is bounded and + scrolls normally. +

+ + +
+ Invalid height (fallback) +
+
+ +
+ +
+ @for (n of paragraphs; track n) { +

Row {{ n }} — body content inside an invalid-height panel.

+ } +
+
+
diff --git a/apps/prs/angular/src/routes/features/feat3347/feat3347.component.ts b/apps/prs/angular/src/routes/features/feat3347/feat3347.component.ts new file mode 100644 index 0000000000..ccbc48465c --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat3347/feat3347.component.ts @@ -0,0 +1,197 @@ +import { Component } from "@angular/core"; +import { + GoabBlock, + GoabButton, + GoabButtonGroup, + GoabDivider, + GoabDrawer, + GoabIconButton, + GoabModal, + GoabScrollPanel, + GoabText, + GoabTooltip, + GoabWorkSideNotificationItem, + GoabWorkSideNotificationPanel, +} from "@abgov/angular-components"; + +type NotificationData = { + id: string; + title: string; + description: string; + timestamp: string; + type: "info" | "success" | "warning" | "critical"; + readStatus: "read" | "unread"; + priority: "normal" | "urgent"; +}; + +@Component({ + standalone: true, + selector: "abgov-feat3347", + templateUrl: "./feat3347.component.html", + styleUrls: ["./feat3347.component.css"], + imports: [ + GoabBlock, + GoabButton, + GoabButtonGroup, + GoabDivider, + GoabDrawer, + GoabIconButton, + GoabModal, + GoabScrollPanel, + GoabText, + GoabTooltip, + GoabWorkSideNotificationItem, + GoabWorkSideNotificationPanel, + ], +}) +export class Feat3347Component { + paragraphs = Array.from({ length: 25 }, (_, i) => i + 1); + selectedCount = 0; + drawerOpen = false; + modalOpen = false; + + toggleSelection() { + this.selectedCount = this.selectedCount > 0 ? 0 : 3; + } + + openDrawer() { + this.drawerOpen = true; + } + + closeDrawer() { + this.drawerOpen = false; + } + + openModal() { + this.modalOpen = true; + } + + closeModal() { + this.modalOpen = false; + } + + // Notification panel test data — enough items to trigger scroll inside the + // panel's 710px height so the scroll-panel sticky borders can be verified. + notifications: NotificationData[] = [ + { + id: "1", + title: "New case assigned", + description: "Case #12345 has been assigned to you for review.", + timestamp: new Date(Date.now() - 5 * 60 * 1000).toISOString(), + type: "info", + readStatus: "unread", + priority: "normal", + }, + { + id: "2", + title: "Document uploaded", + description: "A new document was uploaded to Case #12340.", + timestamp: new Date(Date.now() - 30 * 60 * 1000).toISOString(), + type: "success", + readStatus: "unread", + priority: "normal", + }, + { + id: "3", + title: "System maintenance", + description: "Scheduled maintenance tonight at 11 PM MST.", + timestamp: new Date(Date.now() - 60 * 60 * 1000).toISOString(), + type: "critical", + readStatus: "unread", + priority: "urgent", + }, + { + id: "4", + title: "Action required", + description: "Please review the pending approval request.", + timestamp: this.daysAgo(1, 2), + type: "warning", + readStatus: "unread", + priority: "normal", + }, + { + id: "5", + title: "Deadline approaching", + description: "Case #12300 deadline is in 24 hours.", + timestamp: this.daysAgo(1, 5), + type: "warning", + readStatus: "unread", + priority: "urgent", + }, + { + id: "6", + title: "Comment added", + description: "John Smith commented on Case #12342.", + timestamp: this.daysAgo(1, 8), + type: "info", + readStatus: "unread", + priority: "normal", + }, + { + id: "7", + title: "Case status updated", + description: "Case #12339 status changed to 'In Review'.", + timestamp: this.daysAgo(3, 2), + type: "success", + readStatus: "read", + priority: "normal", + }, + { + id: "8", + title: "New attachment", + description: "PDF document attached to Case #12338.", + timestamp: this.daysAgo(3, 6), + type: "info", + readStatus: "read", + priority: "normal", + }, + { + id: "9", + title: "Weekly report generated", + description: "Your weekly summary report is ready.", + timestamp: this.daysAgo(7, 0), + type: "info", + readStatus: "read", + priority: "normal", + }, + { + id: "10", + title: "Password reminder", + description: "Your password will expire in 30 days.", + timestamp: this.daysAgo(14, 0), + type: "warning", + readStatus: "read", + priority: "normal", + }, + ]; + + trackById(_index: number, item: NotificationData): string { + return item.id; + } + + daysAgo(days: number, hours = 0): string { + const date = new Date(); + date.setDate(date.getDate() - days); + date.setHours(date.getHours() - hours); + return date.toISOString(); + } + + handleNotificationClick(id: string) { + this.notifications = this.notifications.map((notif) => + notif.id === id && notif.readStatus === "unread" + ? { ...notif, readStatus: "read" as const } + : notif, + ); + } + + handleMarkAllRead() { + this.notifications = this.notifications.map((notif) => ({ + ...notif, + readStatus: "read" as const, + })); + } + + handleViewAll() { + console.log("View all notifications"); + } +} diff --git a/apps/prs/angular/src/routes/features/feat3347/feat3347.route.json b/apps/prs/angular/src/routes/features/feat3347/feat3347.route.json new file mode 100644 index 0000000000..754b6b6493 --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat3347/feat3347.route.json @@ -0,0 +1,6 @@ +{ + "title": "Scroll Panel", + "path": "features/3347", + "id": "3347", + "type": "feature" +} diff --git a/apps/prs/angular/src/routes/features/feat3347PushDrawer/feat3347PushDrawer.component.html b/apps/prs/angular/src/routes/features/feat3347PushDrawer/feat3347PushDrawer.component.html new file mode 100644 index 0000000000..523656898e --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat3347PushDrawer/feat3347PushDrawer.component.html @@ -0,0 +1,27 @@ +

Push Drawer V2 — scroll-panel integration test

+

+ The drawer on the right is rendered at the app shell level (the + pushDrawer slot of goab-workspace-layout in + app.component.html), not inside this page. Scroll inside it and watch the + outer chrome morph: +

+
    +
  • + No scroll: full chrome (16px margin all sides, all corners + rounded). +
  • +
  • + At top: bottom flush (margin-bottom: 0, bottom corners square). +
  • +
  • + Middle: both edges flush, all corners square, header + footer have + border. +
  • +
  • At bottom: top flush (margin-top: 0, top corners square).
  • +
+

+ The heading "Push Drawer V2 test" should also collapse from heading-s → + heading-xs when scrolled past top. +

+ +Open push drawer diff --git a/apps/prs/angular/src/routes/features/feat3347PushDrawer/feat3347PushDrawer.component.ts b/apps/prs/angular/src/routes/features/feat3347PushDrawer/feat3347PushDrawer.component.ts new file mode 100644 index 0000000000..2fb7c53d5a --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat3347PushDrawer/feat3347PushDrawer.component.ts @@ -0,0 +1,17 @@ +import { Component, inject } from "@angular/core"; +import { GoabButton } from "@abgov/angular-components"; +import { PushDrawerHostService } from "./push-drawer-host.service"; + +@Component({ + standalone: true, + selector: "abgov-feat3347-push", + templateUrl: "./feat3347PushDrawer.component.html", + imports: [GoabButton], +}) +export class Feat3347PushDrawerComponent { + private pushDrawerHost = inject(PushDrawerHostService); + + openPushDrawer() { + this.pushDrawerHost.openDrawer(); + } +} diff --git a/apps/prs/angular/src/routes/features/feat3347PushDrawer/feat3347PushDrawer.route.json b/apps/prs/angular/src/routes/features/feat3347PushDrawer/feat3347PushDrawer.route.json new file mode 100644 index 0000000000..ab0a392265 --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat3347PushDrawer/feat3347PushDrawer.route.json @@ -0,0 +1,6 @@ +{ + "title": "Scroll Panel - Push Drawer V2", + "path": "features/3347-push", + "id": "3347-push", + "type": "feature" +} diff --git a/apps/prs/angular/src/routes/features/feat3347PushDrawer/push-drawer-host.service.ts b/apps/prs/angular/src/routes/features/feat3347PushDrawer/push-drawer-host.service.ts new file mode 100644 index 0000000000..19a1a5aa13 --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat3347PushDrawer/push-drawer-host.service.ts @@ -0,0 +1,19 @@ +import { Injectable, signal } from "@angular/core"; + +/** + * Shared state for the push drawer that lives in the app shell. Mirrors the + * React playground pattern where the drawer is rendered at the workspace + * layout level and the route just triggers open via outlet context. + */ +@Injectable({ providedIn: "root" }) +export class PushDrawerHostService { + readonly open = signal(false); + + openDrawer() { + this.open.set(true); + } + + closeDrawer() { + this.open.set(false); + } +} diff --git a/apps/prs/react/src/app/app.tsx b/apps/prs/react/src/app/app.tsx index 04a769a9bf..4e92abd6eb 100644 --- a/apps/prs/react/src/app/app.tsx +++ b/apps/prs/react/src/app/app.tsx @@ -1,21 +1,23 @@ -import { useState, type CSSProperties } from "react"; -import { Outlet, useNavigate } from "react-router-dom"; +import { useEffect, useState } from "react"; +import { Outlet, useLocation, useNavigate } from "react-router-dom"; import { - GoabAppFooter, - GoabAppHeader, - GoabMicrositeHeader, - GoabOneColumnLayout, + GoabButton, + GoabButtonGroup, + GoabPushDrawer, + GoabText, GoabWorkSideMenu, GoabWorkSideMenuGroup, GoabWorkSideMenuItem, useTheme, + GoabWorkspaceLayout, + useGoabWorkspaceLayoutScrollState, } from "@abgov/react-components"; +import { GoabWorkspaceLayoutScrollState } from "@abgov/ui-components-common"; import { bugRouteDefinitions, docsRouteDefinitions, featureRouteDefinitions, } from "./route-manifest"; - import "@abgov/style"; // Runtime V1/V2 token switching. Importing this module applies the currently // selected token set (default V2) to before the app renders. The @@ -27,22 +29,90 @@ import { type TokenVersion, } from "./tokenVersion"; +const PUSH_DRAWER_ROUTE_PATH = "/features/3347-push"; +const pushDrawerTestParagraphs = Array.from({ length: 30 }, (_, i) => i + 1); + +/** Outlet context shape exposed to routes rendered inside App. */ +export interface AppOutletContext { + openPushDrawer: () => void; +} + // Sentinel URL handled by onNavigate below to toggle tokens instead of routing. const TOKEN_TOGGLE_URL = "#tokens"; -const appContentStyle: CSSProperties = { - display: "flex", - minHeight: "calc(100vh - 10.1875rem)", - "--goa-work-side-menu-height": "calc(100vh - 10.1875rem)", -} as CSSProperties; +// Demo: a slotted page-header that shrinks its heading once content scrolls +// under the pinned header. It reads the layout's scroll state via the context +// hook (no prop drilling), using the same middle / at-bottom states that drive +// the scroll cue. The heading size swaps discretely between states. Because it +// reads context, it must be its own component rendered inside the layout, not +// inline JSX created up in App. +function PlaygroundPageHeader() { + const { scrollPosition } = useGoabWorkspaceLayoutScrollState(); + const pinned = + scrollPosition === GoabWorkspaceLayoutScrollState.MIDDLE || + scrollPosition === GoabWorkspaceLayoutScrollState.AT_BOTTOM; + + return ( +
+ + Testing Playground + + + + Secondary + + + Primary action + + +
+ ); +} export function App() { const navigate = useNavigate(); const { mode, toggle } = useTheme(); const isDark = mode === "dark"; + const location = useLocation(); const baseUrl = import.meta.env.BASE_URL; const [tokenMode, setTokenMode] = useState(() => resolveTokenVersion()); + const isPushDrawerRoute = + location.pathname === PUSH_DRAWER_ROUTE_PATH || + location.pathname === `${baseUrl}features/3347-push`; + const [pushDrawerOpen, setPushDrawerOpen] = useState(isPushDrawerRoute); + + // Re-open the drawer each time the user navigates back to the test route so + // closing it once doesn't make the rest of the page useless for the demo. + useEffect(() => { + if (isPushDrawerRoute) setPushDrawerOpen(true); + }, [isPushDrawerRoute]); + + const closePushDrawer = () => setPushDrawerOpen(false); + const pushDrawerActions = ( + + + Save + + + Cancel + + + ); + const handleSideMenuNavigate = (path: string) => { if (path === TOKEN_TOGGLE_URL) { const next: TokenVersion = tokenMode === "v1" ? "v2" : "v1"; @@ -58,78 +128,133 @@ export function App() { navigate(internal); }; - return ( - -
- - -
-
- + const sideMenu = ( + + + + + } + primaryContent={ + <> + + {bugRouteDefinitions.map((route) => ( + ))} + + + + {featureRouteDefinitions.map((route) => ( - - } - primaryContent={ - <> - - {bugRouteDefinitions.map((route) => ( - - ))} - - - - {featureRouteDefinitions.map((route) => ( - - ))} - - - {docsRouteDefinitions.map((route) => ( - - ))} - + ))} + + + {docsRouteDefinitions.map((route) => ( - + ))} + + + + } + /> + ); + + // Sticky page-header slot. This slot is for contextual page-level content + // (page heading, action bars), not the app chrome. See PlaygroundPageHeader, + // which also demos shrinking the heading on scroll via the scroll-state hook. + const pageHeader = ; + // Sticky page-footer slot. Like the header, this is for contextual content + // (e.g. a bulk-action bar that appears when rows are selected), not the app + // footer. GoabAppFooter (with the GoA logo) was the wrong mental model here. + const pageFooter = ( +
+ + 3 rows selected + + + + Clear selection + + + Export selected + + +
+ ); + + const pushDrawer = isPushDrawerRoute || pushDrawerOpen ? ( + + {pushDrawerTestParagraphs.map((n) => ( +

+ Paragraph {n} — Push Drawer V2 now uses goa-scroll-panel internally. Verify + header sticky + actions sticky + content scrolls + outer chrome morphs + (margins/radius/height) as scroll state changes between top / middle / bottom. +

+ ))} +
+ ) : undefined; + + return ( + +
+ setPushDrawerOpen(true), + } satisfies AppOutletContext } /> -
- -
-
- -
- +
); } diff --git a/apps/prs/react/src/app/routes/docs/scroll-panel.route.ts b/apps/prs/react/src/app/routes/docs/scroll-panel.route.ts new file mode 100644 index 0000000000..15c306238a --- /dev/null +++ b/apps/prs/react/src/app/routes/docs/scroll-panel.route.ts @@ -0,0 +1,10 @@ +import { DocsScrollPanelRoute } from "../../../routes/docs/scroll-panel/scroll-panel"; +import type { PrRouteDefinition } from "../../route-manifest"; + +export default { + type: "docs", + id: "scroll-panel", + path: "docs/scroll-panel", + title: "Scroll Panel", + component: DocsScrollPanelRoute, +} satisfies PrRouteDefinition; diff --git a/apps/prs/react/src/app/routes/docs/workspace-layout.route.ts b/apps/prs/react/src/app/routes/docs/workspace-layout.route.ts new file mode 100644 index 0000000000..596771f34a --- /dev/null +++ b/apps/prs/react/src/app/routes/docs/workspace-layout.route.ts @@ -0,0 +1,10 @@ +import { DocsWorkspaceLayoutRoute } from "../../../routes/docs/workspace-layout/workspace-layout"; +import type { PrRouteDefinition } from "../../route-manifest"; + +export default { + type: "docs", + id: "workspace-layout", + path: "docs/workspace-layout", + title: "Workspace Layout", + component: DocsWorkspaceLayoutRoute, +} satisfies PrRouteDefinition; diff --git a/apps/prs/react/src/app/routes/features/feat3347.route.ts b/apps/prs/react/src/app/routes/features/feat3347.route.ts new file mode 100644 index 0000000000..42369f416f --- /dev/null +++ b/apps/prs/react/src/app/routes/features/feat3347.route.ts @@ -0,0 +1,9 @@ +import { Feat3347Route } from "../../../routes/features/feat3347"; +import type { PrRouteDefinition } from "../../route-manifest"; +export default { + type: "feature", + id: "3347", + path: "features/3347", + title: "Scroll Panel", + component: Feat3347Route, +} satisfies PrRouteDefinition; diff --git a/apps/prs/react/src/app/routes/features/feat3347PushDrawer.route.ts b/apps/prs/react/src/app/routes/features/feat3347PushDrawer.route.ts new file mode 100644 index 0000000000..302093f9bb --- /dev/null +++ b/apps/prs/react/src/app/routes/features/feat3347PushDrawer.route.ts @@ -0,0 +1,9 @@ +import { Feat3347PushDrawerRoute } from "../../../routes/features/feat3347PushDrawer"; +import type { PrRouteDefinition } from "../../route-manifest"; +export default { + type: "feature", + id: "3347-push", + path: "features/3347-push", + title: "Scroll Panel - Push Drawer V2", + component: Feat3347PushDrawerRoute, +} satisfies PrRouteDefinition; diff --git a/apps/prs/react/src/main.tsx b/apps/prs/react/src/main.tsx index 7cc14365be..8849490743 100644 --- a/apps/prs/react/src/main.tsx +++ b/apps/prs/react/src/main.tsx @@ -20,7 +20,6 @@ root.render( } /> {prRouteDefinitions.map((route) => { const Component = route.component; - return } />; })} diff --git a/apps/prs/react/src/routes/docs/scroll-panel/scroll-panel.tsx b/apps/prs/react/src/routes/docs/scroll-panel/scroll-panel.tsx new file mode 100644 index 0000000000..bf52134f79 --- /dev/null +++ b/apps/prs/react/src/routes/docs/scroll-panel/scroll-panel.tsx @@ -0,0 +1,133 @@ +import { + GoabButton, + GoabButtonGroup, + GoabScrollPanel, + GoabText, +} from "@abgov/react-components"; + +const paragraphs = Array.from({ length: 15 }, (_, i) => i + 1); +const rows = Array.from({ length: 12 }, (_, i) => i + 1); +const tallRows = Array.from({ length: 20 }, (_, i) => i + 1); + +export function DocsScrollPanelRoute() { + return ( +
+

Scroll panel

+

+ Mirrors the documentation examples for GoabScrollPanel: a bounded + container with sticky header / footer slots and a scrollable body. +

+ +

Basic scroll panel

+
+ + + Case details + +
+ } + footer={ +
+ + + Cancel + + + Save changes + + +
+ } + > +
+ {paragraphs.map((n) => ( +

+ Paragraph {n} — Scrollable body content. The panel will scroll inside its + 480px height, with sticky header and footer pinned. Notice the subtle + border + inset shadow that appears when scrolling indicates more content. +

+ ))} +
+ +
+ +

Header only

+
+ + + Activity feed + +
+ } + > +
+ {rows.map((n) => ( +

Row {n} — scroll me, header stays pinned at the top.

+ ))} +
+ +
+ +

Footer only

+
+ + + + Submit + + +
+ } + > +
+ {rows.map((n) => ( +

Row {n} — scroll me, footer stays pinned at the bottom.

+ ))} +
+ +
+ +

Custom height

+

+ The height prop accepts any valid CSS height value (e.g. "600px", + "80vh"). It defaults to "100%" so the panel fills a height-constrained parent. +

+
+ + + Custom 600px height + +
+ } + footer={ +
+ Footer pinned at bottom +
+ } + > +
+ {tallRows.map((n) => ( +

+ Row {n} — Body scrolls within the explicit 600px height. Swap to "80vh" + for viewport-relative sizing, or leave the prop off (defaults to "100%") + when a parent already constrains height. +

+ ))} +
+ + + + ); +} diff --git a/apps/prs/react/src/routes/docs/workspace-layout/workspace-layout.css b/apps/prs/react/src/routes/docs/workspace-layout/workspace-layout.css new file mode 100644 index 0000000000..0b91da8d53 --- /dev/null +++ b/apps/prs/react/src/routes/docs/workspace-layout/workspace-layout.css @@ -0,0 +1,10 @@ +.wsl-demo { + margin-bottom: var(--goa-space-2xl, 3rem); +} + +/* GoabWorkspaceLayout renders at 100vh by default. Bound + each demo so they stack on this page; !important overrides the web component's + :host height rule. */ +.wsl-demo goa-workspace-layout { + height: 600px !important; +} diff --git a/apps/prs/react/src/routes/docs/workspace-layout/workspace-layout.tsx b/apps/prs/react/src/routes/docs/workspace-layout/workspace-layout.tsx new file mode 100644 index 0000000000..daf9552add --- /dev/null +++ b/apps/prs/react/src/routes/docs/workspace-layout/workspace-layout.tsx @@ -0,0 +1,186 @@ +import { useState } from "react"; +import { + GoabButton, + GoabButtonGroup, + GoabPushDrawer, + GoabText, + GoabWorkSideMenu, + GoabWorkSideMenuItem, + GoabWorkspaceLayout, + useGoabWorkspaceLayoutScrollState, +} from "@abgov/react-components"; +import "./workspace-layout.css"; + +const rows = Array.from({ length: 16 }, (_, i) => i + 1); +const scrollRows = Array.from({ length: 20 }, (_, i) => i + 1); + +function navigate(path: string) { + console.log("navigate", path); +} + +const sideMenu = ( + navigate(path)} + primaryContent={ + <> + + + + } + /> +); + +const pageHeader = ( +
+ + My cases + + + + Filter + + + New case + + +
+); + +const pageFooter = ( +
+ + 3 cases selected + + + + Clear + + + Export + + +
+); + +// Rendered inside GoabWorkspaceLayout, so the hook reads that layout's scroll state. +function ScrollAwareHeader() { + const { scrollPosition } = useGoabWorkspaceLayoutScrollState(); + const collapsed = scrollPosition === "middle" || scrollPosition === "at-bottom"; + return ( +
+ + My cases + + {!collapsed && ( + + Scroll down to collapse this subtitle. + + )} +
+ ); +} + +export function DocsWorkspaceLayoutRoute() { + const [open, setOpen] = useState(false); + + return ( +
+

Workspace layout

+

+ Mirrors the documentation examples for GoabWorkspaceLayout. Each + example is bounded to 600px so they stack on this page; in a real app the layout + fills the viewport. +

+ +

Basic workspace

+
+ +
+ {rows.map((n) => ( +

Case row {n} — scroll this area while the side menu stays in place.

+ ))} +
+
+
+ +

Sticky header

+
+ +
+ {rows.map((n) => ( +

Case row {n} — scroll this area and the header stays pinned at the top.

+ ))} +
+
+
+ +

Sticky footer

+
+ +
+ {rows.map((n) => ( +

+ Case row {n} — scroll this area and the footer stays pinned at the bottom. +

+ ))} +
+
+
+ +

Push drawer

+
+ setOpen(false)}> +

Details for the selected case appear here, beside the page content.

+ + } + > +
+ setOpen(true)}> + Open + + {rows.map((n) => ( +

+ Case row {n} — open the drawer and it appears beside this content, narrowing it + instead of covering it. +

+ ))} +
+
+
+ +

Monitor scroll state

+

+ The page header collapses its subtitle once content scrolls past the top, via the{" "} + useGoabWorkspaceLayoutScrollState hook. +

+
+ }> +
+ {scrollRows.map((n) => ( +

Case row {n}

+ ))} +
+
+
+
+ ); +} diff --git a/apps/prs/react/src/routes/features/feat3347.tsx b/apps/prs/react/src/routes/features/feat3347.tsx new file mode 100644 index 0000000000..937c44c909 --- /dev/null +++ b/apps/prs/react/src/routes/features/feat3347.tsx @@ -0,0 +1,597 @@ +/** + * Feature #3347: Scroll Panel — Workspace shell evaluation + * + * React mirror of apps/prs/angular/.../feat3347. Verifies: + * 1. Bounded panel (header + scroll + footer) + * 2. Optional header-only / footer-only slots + * 3. Default height (100%) inside a constrained parent + * 4. Drawer V2 (refactored to use goa-scroll-panel internally) + * 5. Modal V2 (refactored to use goa-scroll-panel internally) + * 6. WorkSideNotificationPanel (refactored to use goa-scroll-panel internally) + * 7. Push Drawer V2 (shell-level drawer that pushes the card) + * + * Push Drawer V2 also has its own full-page route at features/3347-push. + */ + +import { useState, type CSSProperties } from "react"; +import { useOutletContext } from "react-router-dom"; +import { + GoabBlock, + GoabButton, + GoabButtonGroup, + GoabDivider, + GoabDrawer, + GoabIconButton, + GoabModal, + GoabScrollPanel, + GoabText, + GoabTooltip, + GoabWorkSideNotificationItem, + GoabWorkSideNotificationPanel, +} from "@abgov/react-components"; +import type { AppOutletContext } from "../../app/app"; + +type NotificationData = { + id: string; + title: string; + description: string; + timestamp: string; + type: "info" | "success" | "warning" | "critical"; + readStatus: "read" | "unread"; + priority: "normal" | "urgent"; +}; + +const paragraphs = Array.from({ length: 25 }, (_, i) => i + 1); + +function daysAgo(days: number, hours = 0): string { + const date = new Date(); + date.setDate(date.getDate() - days); + date.setHours(date.getHours() - hours); + return date.toISOString(); +} + +const initialNotifications: NotificationData[] = [ + { + id: "1", + title: "New case assigned", + description: "Case #12345 has been assigned to you for review.", + timestamp: new Date(Date.now() - 5 * 60 * 1000).toISOString(), + type: "info", + readStatus: "unread", + priority: "normal", + }, + { + id: "2", + title: "Document uploaded", + description: "A new document was uploaded to Case #12340.", + timestamp: new Date(Date.now() - 30 * 60 * 1000).toISOString(), + type: "success", + readStatus: "unread", + priority: "normal", + }, + { + id: "3", + title: "System maintenance", + description: "Scheduled maintenance tonight at 11 PM MST.", + timestamp: new Date(Date.now() - 60 * 60 * 1000).toISOString(), + type: "critical", + readStatus: "unread", + priority: "urgent", + }, + { + id: "4", + title: "Action required", + description: "Please review the pending approval request.", + timestamp: daysAgo(1, 2), + type: "warning", + readStatus: "unread", + priority: "normal", + }, + { + id: "5", + title: "Deadline approaching", + description: "Case #12300 deadline is in 24 hours.", + timestamp: daysAgo(1, 5), + type: "warning", + readStatus: "unread", + priority: "urgent", + }, + { + id: "6", + title: "Comment added", + description: "John Smith commented on Case #12342.", + timestamp: daysAgo(1, 8), + type: "info", + readStatus: "unread", + priority: "normal", + }, + { + id: "7", + title: "Case status updated", + description: "Case #12339 status changed to 'In Review'.", + timestamp: daysAgo(3, 2), + type: "success", + readStatus: "read", + priority: "normal", + }, + { + id: "8", + title: "New attachment", + description: "PDF document attached to Case #12338.", + timestamp: daysAgo(3, 6), + type: "info", + readStatus: "read", + priority: "normal", + }, + { + id: "9", + title: "Weekly report generated", + description: "Your weekly summary report is ready.", + timestamp: daysAgo(7, 0), + type: "info", + readStatus: "read", + priority: "normal", + }, + { + id: "10", + title: "Password reminder", + description: "Your password will expire in 30 days.", + timestamp: daysAgo(14, 0), + type: "warning", + readStatus: "read", + priority: "normal", + }, +]; + +const demoHeaderStyle: CSSProperties = { + display: "flex", + alignItems: "center", + justifyContent: "space-between", + gap: "var(--goa-space-m)", + padding: "var(--goa-space-m) var(--goa-space-l)", +}; + +const demoBodyStyle: CSSProperties = { + padding: "var(--goa-space-m) var(--goa-space-l)", +}; + +const demoFooterStyle: CSSProperties = { + display: "flex", + alignItems: "center", + justifyContent: "space-between", + gap: "var(--goa-space-m)", + padding: "var(--goa-space-s) var(--goa-space-l)", +}; + +const notificationStageStyle: CSSProperties = { + width: "360px", + border: "var(--goa-border-width-s) solid var(--goa-color-greyscale-200)", + borderRadius: "var(--goa-popover-border-radius)", + overflow: "hidden", +}; + +export function Feat3347Route() { + const [drawerOpen, setDrawerOpen] = useState(false); + const [modalOpen, setModalOpen] = useState(false); + const [modalTallOpen, setModalTallOpen] = useState(false); + const [notifications, setNotifications] = + useState(initialNotifications); + const { openPushDrawer } = useOutletContext(); + + const handleNotificationClick = (id: string) => { + setNotifications((prev) => + prev.map((n) => + n.id === id && n.readStatus === "unread" + ? { ...n, readStatus: "read" as const } + : n, + ), + ); + }; + + const handleMarkAllRead = () => { + setNotifications((prev) => prev.map((n) => ({ ...n, readStatus: "read" as const }))); + }; + + const handleViewAll = () => { + console.log("View all notifications"); + }; + + // ===== Test 1 templates ===== + const t1Header = ( +
+
+ + Case details + + + + +
+ + Close + +
+ ); + + const t1Footer = ( +
+ + Cancel + Save changes + +
+ ); + + // ===== Test 2 templates ===== + const t2HeaderOnly = ( +
+ + Header only — pinned at top + +
+ ); + + const t2FooterOnly = ( +
+ + + Footer only — pinned at bottom + + +
+ ); + + // ===== Test 3 templates ===== + const t3Header = ( +
+ + Inherits parent height + +
+ ); + + const t3Footer = ( +
+ Footer pinned at the bottom +
+ ); + + // ===== Test 4 (drawer) actions ===== + const t4Actions = ( + + setDrawerOpen(false)}> + Save + + setDrawerOpen(false)}> + Cancel + + + ); + + // ===== Test 5 (modal) actions ===== + const t5Actions = ( + + setModalOpen(false)}> + Cancel + + setModalOpen(false)}> + Save + + + ); + + // ===== Test 5b (modal stress: tall header + wrapped actions) ===== + const t5bActions = ( + + setModalTallOpen(false)}> + Cancel + + setModalTallOpen(false)}> + Save draft + + setModalTallOpen(false)}> + Request changes + + setModalTallOpen(false)}> + Approve and submit + + + ); + + return ( + <> +

#3347 Scroll Panel — Workspace shell evaluation

+ + {/* Test 1 */} +

Test 1: Bounded panel (the use case it's built for)

+

+ Fixed height 480px. Header + scrollable body + footer. This is where the component + shines. +

+ +
+ {paragraphs.map((n) => ( +

+ Paragraph {n} — Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed + do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad + minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex + ea commodo consequat. +

+ ))} +
+
+ + + + {/* Test 2 */} +

Test 2: Header only / Footer only

+

Verifying optional template slots render correctly.

+ + +
+ {paragraphs.map((n) => ( +

Row {n} — scroll me, header stays pinned.

+ ))} +
+
+ + +
+ {paragraphs.map((n) => ( +

Row {n} — scroll me, footer stays pinned.

+ ))} +
+
+
+ + + + {/* Test 3 */} +

Test 3: Default height (100%) inside a constrained parent

+

Parent gives the height context — scroll panel fills it.

+
+ +
+ {paragraphs.map((n) => ( +

Row {n} — body scrolls within the parent's 380px.

+ ))} +
+
+
+ + + + {/* Test 4 — Drawer V2 */} +

Test 4: Drawer V2 (refactored internally with goa-scroll-panel)

+

+ Verifies Drawer V2 still works after its internal scroll mechanics were replaced + with <goa-scroll-panel>. Open and scroll inside — header should + stay pinned at top (with border on scroll), actions footer should stay pinned at + bottom (with border when content overflows above). +

+ setDrawerOpen(true)}> + Open drawer + + setDrawerOpen(false)} + > + {paragraphs.map((n) => ( +

+ Paragraph {n} — Drawer V2 now uses goa-scroll-panel internally. Verify header + sticky + actions sticky + content scrolls + borders appear when scrolled + (top/middle/bottom states). +

+ ))} +
+ + + +

+ Push Drawer V2 also got the scroll-panel treatment — see the dedicated full-page + test at features/3347-push so the drawer's internal scroll can be + verified without page scroll bubbling. +

+ + + + {/* Test 5 — Modal V2 */} +

Test 5: Modal (refactored internally with goa-scroll-panel)

+

+ Verifies Modal still works after its V2 path was refactored to use + <goa-scroll-panel> instead of{" "} + <goa-scrollable>. V1 path is unchanged (still uses + goa-scrollable + maxheight calc). The GoabModal React/ Angular + wrapper hardcodes version="2" so this test exercises the new path. + Open and scroll inside — header should stay pinned at top with border on scroll, + action footer pinned at bottom with border when content overflows above. +

+ setModalOpen(true)}> + Open modal + + setModalOpen(false)} + > + {paragraphs.map((n) => ( +

+ Paragraph {n} — Modal V2 now uses goa-scroll-panel internally. Verify header + sticky + actions sticky + content scrolls + borders appear when scrolled + (top/middle/bottom states). The pane should remain centered with a 64px gap + from viewport edges. +

+ ))} +
+ + + + {/* Test 5b — Modal stress: tall header + wrapped actions */} +

Test 5b: Modal stress — tall heading + wrapped actions

+

+ Stresses the static max-height: calc(100vh - 160px) on{" "} + .modal-pane. The heading wraps to multiple lines and the + actions wrap to two rows, so the header + footer chrome is tall. The pane + is overflow: hidden, so if the combined chrome ever exceeds + the pane height the chrome clips (rather than the middle scrolling).{" "} + Resize the window short to check whether the header and + footer stay fully visible while only the middle shrinks/scrolls. +

+ setModalTallOpen(true)}> + Open tall-chrome modal + + setModalTallOpen(false)} + > + {paragraphs.map((n) => ( +

+ Paragraph {n} — stress content. Watch the header (multi-line heading) + and the footer (wrapped action buttons): both should stay fully + visible and pinned while only this middle area scrolls. +

+ ))} +
+ + + + {/* Test 6 — WorkSideNotificationPanel */} +

Test 6: WorkSideNotificationPanel (refactored to use goa-scroll-panel)

+

+ Verifies the notification panel still works after its layout was refactored to use{" "} + <goa-scroll-panel> internally (header slot for title + tabs, + default slot for the scrollable notification list, footer slot for "View all" / + "Mark all as read" actions). Rendered inline here (normally lives inside a popover + triggered from a work-side-menu icon). Scroll inside the notification list to + verify sticky header + sticky footer + border feedback on scroll. +

+
+ + {notifications.map((notif) => ( + handleNotificationClick(notif.id)} + /> + ))} + +
+ + + +

Validator case 1: valid calc() height (no error)

+

+ Passes height="calc(20rem + 2rem)". The old regex validator + rejected calc(), so this used to log a false console error. With + CSS.supports it is accepted: no error logged, and the panel scrolls within + its explicit height. Scroll to the bottom and keep scrolling with the + pointer over the panel, the page scrolls next (no scroll trap). +

+ + + + Valid calc() height + + + } + > +
+ {paragraphs.map((n) => ( +

Row {n} — body content inside a calc() height panel.

+ ))} +
+
+ + + +

Validator case 2: invalid height (errors, falls back to 100%)

+

+ Passes height="not-a-height". Open the console: it logs a + ScrollPanel height error. Instead of collapsing to content height (an + unscrollable block that swallowed page scroll), the host now falls back to{" "} + height: 100%, so inside this 320px parent the panel is bounded + and scrolls normally. +

+ +
+ + + Invalid height (fallback) + +
+ } + > +
+ {paragraphs.map((n) => ( +

Row {n} — body content inside an invalid-height panel.

+ ))} +
+ + + + + + {/* Test 7 — Push Drawer (shell-level, pushes the card) */} +

Test 7: Push Drawer (refactored to use goa-scroll-panel)

+

+ Opens the push drawer that lives at the app shell level (a sibling of{" "} + GoabWorkspaceLayout in app.tsx), so it pushes + the whole card aside instead of overlaying it. The drawer body uses{" "} + <goa-scroll-panel> internally: scroll inside it to see + the sticky header/footer and the outer chrome morph across scroll + states. (The same drawer also has its own full-page test at{" "} + features/3347-push.) +

+ + Open push drawer + + + ); +} + +export default Feat3347Route; diff --git a/apps/prs/react/src/routes/features/feat3347PushDrawer.tsx b/apps/prs/react/src/routes/features/feat3347PushDrawer.tsx new file mode 100644 index 0000000000..5587a02960 --- /dev/null +++ b/apps/prs/react/src/routes/features/feat3347PushDrawer.tsx @@ -0,0 +1,43 @@ +import { useOutletContext } from "react-router-dom"; +import { GoabButton } from "@abgov/react-components"; +import type { AppOutletContext } from "../../app/app"; + +export function Feat3347PushDrawerRoute() { + const { openPushDrawer } = useOutletContext(); + + return ( +
+

Push Drawer V2 — scroll-panel integration test

+

+ The drawer on the right is rendered at the app shell level (sibling of{" "} + GoabWorkspaceLayout in app.tsx), not inside this page. + Scroll inside it and watch the outer chrome morph: +

+
    +
  • + No scroll: full chrome (16px margin all sides, all corners + rounded). +
  • +
  • + At top: bottom flush (margin-bottom: 0, bottom corners square). +
  • +
  • + Middle: both edges flush, all corners square, header + footer + have border. +
  • +
  • + At bottom: top flush (margin-top: 0, top corners square). +
  • +
+

+ The heading "Push Drawer V2 test" should also collapse from heading-s{" "} + → heading-xs when scrolled past top. +

+ + Open push drawer + +
+ ); +} + +export default Feat3347PushDrawerRoute; diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 31c85558ac..2070fd5858 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -150,6 +150,7 @@ relatedComponents: [button-group, icon-button] figmaUrl: https://www.figma.com/... hidden: true # optional — hide from nav (used for subcomponents, deprecated, internal) subcomponent: true # optional — show API on parent component page +hideTabs: [examples] # optional, hide tabs on this page (examples, usage, accessibility); Properties always shows --- ``` @@ -360,6 +361,16 @@ grep -rl "subcomponent: true" docs/src/content/components/ Set `hidden: true` in the component's MDX frontmatter. It won't appear in the nav or component grid, but the page still exists if you visit the URL directly. +### Hide a tab on a component page + +Not every component needs all four tabs (for example, a primitive with no curated examples). Set `hideTabs` in the component's MDX frontmatter to drop specific tabs: + +```yaml +hideTabs: [examples] # any of: examples, usage, accessibility +``` + +Properties always shows (it is the API). The page renders only the remaining tabs. Used on `scroll-panel` to drop its empty Examples tab. + ### Add guidance for a component 1. Create `src/content/guidance/.mdx` diff --git a/docs/generated/component-apis/scroll-panel.json b/docs/generated/component-apis/scroll-panel.json new file mode 100644 index 0000000000..6277decdf3 --- /dev/null +++ b/docs/generated/component-apis/scroll-panel.json @@ -0,0 +1,103 @@ +{ + "componentSlug": "scroll-panel", + "extractedFrom": "libs/web-components/src/components/scroll-panel/ScrollPanel.svelte", + "frameworks": { + "react": { + "props": [ + { + "name": "height", + "type": "string", + "required": false, + "default": null, + "description": "Sets the height of the panel. Accepts any valid CSS height value, including calc()/min()/clamp() and viewport units (e.g. \"400px\", \"100%\", \"100vh\", \"calc(100vh - 4rem)\"). Invalid values fall back to \"100%\". Defaults to \"100%\". The parent element must establish a height context for \"100%\" to resolve." + }, + { + "name": "testId", + "type": "string", + "required": false, + "default": null, + "description": "Sets a data-testid attribute for automated testing." + } + ], + "events": [], + "slots": [ + { + "name": "footer", + "type": "ReactNode", + "description": "Content rendered in the sticky footer region.", + "required": false + }, + { + "name": "header", + "type": "ReactNode", + "description": "Content rendered in the sticky header region.", + "required": false + } + ] + }, + "angular": { + "props": [ + { + "name": "height", + "type": "string", + "required": false, + "default": null, + "description": "Sets the height of the panel. Accepts any valid CSS height value, including calc()/min()/clamp() and viewport units (e.g. \"400px\", \"100%\", \"100vh\", \"calc(100vh - 4rem)\"). Invalid values fall back to \"100%\". Defaults to \"100%\". The parent element must establish a height context for \"100%\" to resolve." + }, + { + "name": "testId", + "type": "string", + "required": false, + "default": null, + "description": "Sets the data-testid attribute for automated testing." + } + ], + "events": [], + "slots": [ + { + "name": "footer", + "type": "TemplateRef", + "description": "Content rendered in the sticky footer region.", + "required": false + }, + { + "name": "header", + "type": "TemplateRef", + "description": "Content rendered in the sticky header region.", + "required": false + } + ] + }, + "webComponents": { + "props": [ + { + "name": "height", + "type": "string", + "required": false, + "default": "100%", + "description": "Sets the height of the container. Accepts any valid CSS height value, including calc()/min()/clamp() and viewport units (e.g. \"400px\", \"100%\", \"100vh\", \"calc(100vh - 4rem)\"). Invalid values fall back to \"100%\". Defaults to \"100%\". The parent element must establish a height context for \"100%\" to resolve." + }, + { + "name": "testid", + "type": "string", + "required": false, + "default": "", + "description": "Sets a data-testid attribute for automated testing." + } + ], + "events": [], + "slots": [ + { + "name": "footer", + "description": "Content rendered in the sticky footer region.", + "required": false + }, + { + "name": "header", + "description": "Content rendered in the sticky header region.", + "required": false + } + ] + } + } +} \ No newline at end of file diff --git a/docs/generated/component-apis/workspace-layout.json b/docs/generated/component-apis/workspace-layout.json new file mode 100644 index 0000000000..44bff889de --- /dev/null +++ b/docs/generated/component-apis/workspace-layout.json @@ -0,0 +1,143 @@ +{ + "componentSlug": "workspace-layout", + "extractedFrom": "libs/web-components/src/components/workspace-layout/WorkspaceLayout.svelte", + "frameworks": { + "react": { + "props": [ + { + "name": "testId", + "type": "string", + "required": false, + "default": null, + "description": "Sets a data-testid attribute for automated testing." + } + ], + "events": [ + { + "name": "onScrollStateChange", + "type": "(detail: GoabWorkspaceLayoutOnScrollStateChangeDetail) => void", + "description": "Called whenever the internal scroll state changes (no-scroll → at-top → middle → at-bottom)", + "frameworks": [ + "react" + ] + } + ], + "slots": [ + { + "name": "pageFooter", + "type": "ReactNode", + "description": "Content rendered in the sticky page footer region.", + "required": false + }, + { + "name": "pageHeader", + "type": "ReactNode", + "description": "Content rendered in the sticky page header region.", + "required": false + }, + { + "name": "pushDrawer", + "type": "ReactNode", + "description": "A GoabPushDrawer rendered as a sibling of the main card, inside the same workspace shell. Use this slot when the page needs a push drawer alongside the workspace layout — it gives the drawer the shell-level height and flex context it expects, so the consumer does not have to wrap the layout in their own flex container. The side menu is not pushed; only the card is.", + "required": false + }, + { + "name": "sideMenu", + "type": "ReactNode", + "description": "Content rendered in the side navigation region (e.g. work-side-menu).", + "required": false + } + ] + }, + "angular": { + "props": [ + { + "name": "testId", + "type": "string", + "required": false, + "default": null, + "description": "Sets the data-testid attribute for automated testing." + } + ], + "events": [ + { + "name": "onScrollStateChange", + "type": "(event: GoabWorkspaceLayoutOnScrollStateChangeDetail) => void", + "description": "Emitted whenever the internal scroll state changes (no-scroll → at-top → middle → at-bottom).", + "frameworks": [ + "angular" + ] + } + ], + "slots": [ + { + "name": "pageFooter", + "type": "TemplateRef", + "description": "Content rendered in the sticky page footer region.", + "required": false + }, + { + "name": "pageHeader", + "type": "TemplateRef", + "description": "Content rendered in the sticky page header region.", + "required": false + }, + { + "name": "pushDrawer", + "type": "TemplateRef", + "description": "A GoabPushDrawer rendered as a sibling of the main card, inside the same workspace shell. Use this slot when the page needs a push drawer alongside the workspace layout — it gives the drawer the shell-level height and flex context it expects, so the consumer does not have to wrap the layout in their own flex container. The side menu is not pushed; only the card is.", + "required": false + }, + { + "name": "sideMenu", + "type": "TemplateRef", + "description": "Content rendered in the side navigation region (e.g. work-side-menu).", + "required": false + } + ] + }, + "webComponents": { + "props": [ + { + "name": "testid", + "type": "string", + "required": false, + "default": "", + "description": "Sets a data-testid attribute for automated testing." + } + ], + "events": [ + { + "name": "_scrollStateChange", + "type": "CustomEvent<{ state: 'no-scroll' | 'at-top' | 'middle' | 'at-bottom'; isScrollable: boolean }>", + "description": "", + "frameworks": [ + "webComponents" + ] + } + ], + "slots": [ + { + "name": "page-footer", + "description": "Content rendered in the sticky page footer region.", + "required": false + }, + { + "name": "page-header", + "description": "Content rendered in the sticky page header region.", + "required": false + }, + { + "name": "push-drawer", + "description": "A GoabPushDrawer rendered as a sibling of the main card, inside the same workspace shell. Use this slot when the page needs a push drawer alongside the workspace layout — it gives the drawer the shell-level height and flex context it expects, so the consumer does not have to wrap the layout in their own flex container. The side menu is not pushed; only the card is.", + "required": false + }, + { + "name": "side-menu", + "description": "Content rendered in the side navigation region (e.g. work-side-menu).", + "required": false + } + ] + } + } +} \ No newline at end of file diff --git a/docs/package-lock.json b/docs/package-lock.json index feb3730e7e..c4f28b6e83 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -8,7 +8,7 @@ "name": "docs", "version": "0.0.1", "dependencies": { - "@abgov/design-tokens-v2": "npm:@abgov/design-tokens@^2.8.0", + "@abgov/design-tokens-v2": "npm:@abgov/design-tokens@^2.9.0", "@abgov/react-components": "*", "@abgov/ui-components-common": "*", "@abgov/web-components": "*", @@ -20,9 +20,9 @@ }, "node_modules/@abgov/design-tokens-v2": { "name": "@abgov/design-tokens", - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@abgov/design-tokens/-/design-tokens-2.8.0.tgz", - "integrity": "sha512-roDjWROKgJkrPuqsWLAapYefIyFI8BwNSTMt3IAX6dwmpZOGfbNrAhaAhF1F8toESXgBUA1SyWMA2VKuKcgSjw==" + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@abgov/design-tokens/-/design-tokens-2.9.0.tgz", + "integrity": "sha512-Z3+wHUhLHCKJDXUBR0KpGBod5k5Jk+ehRNUC9J2OJZ0jcK3jF2/Ggeqhhze7+haiS0FdC1cikqT9vCnKZItU8Q==" }, "node_modules/@abgov/react-components": { "version": "6.9.3", @@ -489,6 +489,22 @@ "node": ">=18" } }, + "node_modules/@types/react": { + "version": "19.2.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", + "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, "node_modules/esbuild": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", @@ -552,6 +568,35 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/react": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", + "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", + "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.7" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, "node_modules/tsx": { "version": "4.22.4", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.4.tgz", diff --git a/docs/package.json b/docs/package.json index 34002841f5..b4e815b28f 100644 --- a/docs/package.json +++ b/docs/package.json @@ -15,7 +15,7 @@ "verify-bundle": "npx tsx src/scripts/content-generators/verify-bundle.ts" }, "dependencies": { - "@abgov/design-tokens-v2": "npm:@abgov/design-tokens@^2.8.0", + "@abgov/design-tokens-v2": "npm:@abgov/design-tokens@^2.9.0", "@abgov/react-components": "*", "@abgov/ui-components-common": "*", "@abgov/web-components": "*", diff --git a/docs/public/images/examples/workspace-layout-diagram.png b/docs/public/images/examples/workspace-layout-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..6b08b210702a7d0060506cbc391e56421e806de8 GIT binary patch literal 69936 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 literal 0 HcmV?d00001 diff --git a/docs/public/search-index.json b/docs/public/search-index.json index 3e6089b280..f18f7fa12e 100644 --- a/docs/public/search-index.json +++ b/docs/public/search-index.json @@ -562,6 +562,23 @@ ], "slug": "radio-group" }, + { + "type": "component", + "id": "scroll-panel", + "name": "Scroll Panel", + "description": "A bounded container with sticky header and footer slots that scrolls its body content when it overflows.", + "status": "stable", + "category": "utilities", + "tags": [ + "container", + "layout", + "scroll", + "sticky header", + "sticky footer", + "bounded" + ], + "slug": "scroll-panel" + }, { "type": "component", "id": "side-menu", @@ -716,6 +733,23 @@ ], "slug": "work-side-notification-panel" }, + { + "type": "component", + "id": "workspace-layout", + "name": "Workspace Layout", + "description": "A full-page layout for workspace-style applications that wraps your content responsively.", + "status": "stable", + "category": "structure-and-navigation", + "tags": [ + "layout", + "workspace", + "side menu", + "sticky header", + "sticky footer", + "push drawer" + ], + "slug": "workspace-layout" + }, { "type": "example", "id": "add-a-filter-chip", @@ -2652,7 +2686,7 @@ "type": "example", "id": "workspace", "title": "Workspace", - "description": "The workspace is for productivity-focused services used by service delivery staff as a daily tool to review information, manage records, and complete tasks. The design prioritizes productivity, efficiency, and accuracy so staff can move through their work quickly while ensuring the best outcome for citizens and government.", + "description": "The workspace is a pattern for productivity-focused services that service delivery staff use as a daily tool to review information, manage records, and complete tasks. The design prioritizes efficiency and accuracy. The reference example is a starting point to adapt to your service's context, not a rigid template.", "status": "published", "size": "product", "tags": [ diff --git a/docs/public/thumbnails/workspace-card-view.png b/docs/public/thumbnails/workspace-card-view.png index d93ac713ab213a43125867c4c766bf203ce05688..3cbc015c8cf3cd39da1d3a18ab0a7eeaaea8352c 100644 GIT binary patch literal 153207 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 z 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

C<6>G~ZVY)v-1u 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 )} + {figmaUrl && ( + + + + )} {stackblitzUrl && ( {moreUrl && ( - View more + More info )} {demoUrl && ( diff --git a/docs/src/content/components/scroll-panel.mdx b/docs/src/content/components/scroll-panel.mdx new file mode 100644 index 0000000000..fe60fb9cea --- /dev/null +++ b/docs/src/content/components/scroll-panel.mdx @@ -0,0 +1,19 @@ +--- +name: Scroll Panel +description: A bounded container with sticky header and footer slots that scrolls its body content when it overflows. +status: stable +category: utilities +tags: + - container + - layout + - scroll + - sticky header + - sticky footer + - bounded +relatedComponents: + - drawer + - modal + - push-drawer + - work-side-notification-panel +hideTabs: [examples] +--- diff --git a/docs/src/content/components/workspace-layout.mdx b/docs/src/content/components/workspace-layout.mdx new file mode 100644 index 0000000000..838a051d2b --- /dev/null +++ b/docs/src/content/components/workspace-layout.mdx @@ -0,0 +1,55 @@ +--- +name: Workspace Layout +description: A full-page layout for workspace-style applications that wraps your content responsively. +status: stable +category: structure-and-navigation +tags: + - layout + - workspace + - side menu + - sticky header + - sticky footer + - push drawer +relatedComponents: + - scroll-panel + - work-side-menu + - drawer + - push-drawer +hideTabs: [examples] +--- + +import { withBase } from "@/lib/base-url"; + +The workspace layout is the shell for workspace-style applications such as case management tools, internal dashboards, and back-office apps. It gives you a side menu, a sticky header and footer, a scrollable content area, and an optional push drawer, all wired together and responsive out of the box. + +## Anatomy + +Diagram of the workspace layout showing its pieces: a work side menu down the left, a sticky header with a heading and actions across the top, the page content in the centre, a sticky footer along the bottom, and a push drawer on the right. + +### Work side menu + +The main navigation for the workspace, built with a [work side menu](/components/work-side-menu). It stays in place while the content scrolls. On narrow screens it hides and opens from the mobile hamburger menu. + +### Sticky header + +A header pinned to the top while the content scrolls. Use it for the page title, key actions, or a toolbar. A soft shadow appears under it once content scrolls past, so people can tell there is more above. It can also collapse as people scroll down. + +### Page content + +Your page content. The layout wraps it in a scrollable card and handles the spacing, so the header and footer stay in place while this area scrolls. + +### Sticky footer + +A footer pinned to the bottom while the content scrolls. Use it for a summary or contextual actions that should stay reachable, such as a bulk action bar that appears once rows are selected. + +### Push drawer + +An optional drawer that opens beside the page content instead of over it. Unlike a modal drawer, it narrows the content rather than covering it, so people can still interact with the main page content while the drawer is open. + +### Mobile hamburger menu + +At narrow screen widths the side menu hides to save space, and the layout adds a hamburger button that opens it. This comes with the layout, you do not wire it up yourself. diff --git a/docs/src/content/config.ts b/docs/src/content/config.ts index 0e46fc3f81..24c72ec8f0 100644 --- a/docs/src/content/config.ts +++ b/docs/src/content/config.ts @@ -33,6 +33,9 @@ const components = defineCollection({ // Visibility hidden: z.boolean().optional(), // Hide from navigation and public views subcomponent: z.boolean().optional(), // Show API on parent component page + hideTabs: z + .array(z.enum(["examples", "usage", "accessibility"])) + .optional(), // Hide specific tabs on this component's page }), }); diff --git a/docs/src/content/examples/workspace/case-detail/index.mdx b/docs/src/content/examples/workspace/case-detail/index.mdx index ef0a7d6ad5..c2de6b8db4 100644 --- a/docs/src/content/examples/workspace/case-detail/index.mdx +++ b/docs/src/content/examples/workspace/case-detail/index.mdx @@ -8,6 +8,7 @@ previewUrl: https://digital-service-demo-v2.netlify.app/workspace/application/ef previewImage: /thumbnails/workspace-case-detail.png reactSourceUrl: https://github.com/GovAlta/goa-workspace-playground/tree/main/src/routes/cases angularSourceUrl: https://github.com/GovAlta/goa-workspace-angular/tree/main/src/app/pages/cases +figmaUrl: https://www.figma.com/design/Jpy1Ea5qglwnp1SgGnagY9/%E2%9D%96-Component-library?node-id=60159-129834 components: - accordion - badge diff --git a/docs/src/content/examples/workspace/dashboard/index.mdx b/docs/src/content/examples/workspace/dashboard/index.mdx index dedc429277..770ca55154 100644 --- a/docs/src/content/examples/workspace/dashboard/index.mdx +++ b/docs/src/content/examples/workspace/dashboard/index.mdx @@ -8,6 +8,7 @@ previewUrl: https://digital-service-demo-v2.netlify.app/workspace previewImage: /thumbnails/workspace-dashboard.png reactSourceUrl: https://github.com/GovAlta/goa-workspace-playground/tree/main/src/routes/dashboard angularSourceUrl: https://github.com/GovAlta/goa-workspace-angular/tree/main/src/app/pages/dashboard +figmaUrl: https://www.figma.com/design/Jpy1Ea5qglwnp1SgGnagY9/%E2%9D%96-Component-library?node-id=60158-598232 components: - container - block diff --git a/docs/src/content/examples/workspace/index-page/index.mdx b/docs/src/content/examples/workspace/index-page/index.mdx index 6980db1f85..ecc9311b8e 100644 --- a/docs/src/content/examples/workspace/index-page/index.mdx +++ b/docs/src/content/examples/workspace/index-page/index.mdx @@ -8,6 +8,7 @@ previewUrl: https://digital-service-demo-v2.netlify.app/workspace/applications previewImage: /thumbnails/workspace-table-view.png reactSourceUrl: https://github.com/GovAlta/goa-workspace-playground/tree/main/src/routes/search angularSourceUrl: https://github.com/GovAlta/goa-workspace-angular/tree/main/src/app/pages/search +figmaUrl: https://www.figma.com/design/Jpy1Ea5qglwnp1SgGnagY9/%E2%9D%96-Component-library?node-id=67092-145149 components: - work-side-menu - data-grid diff --git a/docs/src/content/guidance/scroll-panel-shared-scroll-primitive.mdx b/docs/src/content/guidance/scroll-panel-shared-scroll-primitive.mdx new file mode 100644 index 0000000000..564c2323c7 --- /dev/null +++ b/docs/src/content/guidance/scroll-panel-shared-scroll-primitive.mdx @@ -0,0 +1,22 @@ +--- +id: scroll-panel-shared-scroll-primitive +type: info +description: Scroll panel keeps a header and footer in place while the content between them scrolls. +topic: usage +tags: + - scroll + - layout +appliesTo: + components: + - scroll-panel +status: published +--- + +You usually will not add scroll panel yourself. It works inside several other components, giving each one the same scrolling and the same soft shadow when there is more to see: + +- [Modal](/components/modal) scrolls its content between the fixed heading and the buttons. +- [Drawer](/components/drawer) and [push drawer](/components/push-drawer) scroll their content under a sticky header. +- [Work side notification panel](/components/work-side-notification-panel) scrolls its list under the tabs. +- [Work side menu](/components/work-side-menu) scrolls its navigation under a sticky heading. + +You can also use it on its own when you need a box whose content scrolls while a header or footer stays in place. diff --git a/docs/src/content/guidance/workspace-layout-host-at-viewport-root.mdx b/docs/src/content/guidance/workspace-layout-host-at-viewport-root.mdx new file mode 100644 index 0000000000..d09c120f81 --- /dev/null +++ b/docs/src/content/guidance/workspace-layout-host-at-viewport-root.mdx @@ -0,0 +1,15 @@ +--- +id: workspace-layout-host-at-viewport-root +type: tip +description: The workspace layout fills the viewport, so host it directly in the router outlet, not inside another scrolling container. +topic: layout +tags: + - layout + - workspace +appliesTo: + components: + - workspace-layout +status: published +--- + +The workspace layout fills the full height of the viewport and manages its own scrolling inside the content area. Place it directly in your router outlet or page root. If you nest it inside another element that scrolls, the sticky header and footer will not stay in place as expected. diff --git a/docs/src/content/guidance/workspace-layout-reading-scroll-state.mdx b/docs/src/content/guidance/workspace-layout-reading-scroll-state.mdx new file mode 100644 index 0000000000..bc709b44d4 --- /dev/null +++ b/docs/src/content/guidance/workspace-layout-reading-scroll-state.mdx @@ -0,0 +1,17 @@ +--- +id: workspace-layout-reading-scroll-state +type: info +description: Read the layout's scroll state to respond as people scroll, such as collapsing the header or recording when someone reaches the bottom of a list. +topic: interaction +tags: + - scroll + - interaction +appliesTo: + components: + - workspace-layout +status: published +--- + +The layout tracks how far the content has scrolled (at the top, in the middle, or at the bottom) and lets you read that to respond. Common uses are collapsing a tall header as people scroll down, showing a back to top button, or recording an analytics event when someone reaches the bottom of a long list. + +Read it with the `useGoabWorkspaceLayoutScrollState` hook in React, or the `GoabWorkspaceLayoutScrollStateService` in Angular. In web components, listen for the `_scrollStateChange` event. See the Properties tab for the full event payload. diff --git a/docs/src/content/guidance/workspace-layout-when-to-use.mdx b/docs/src/content/guidance/workspace-layout-when-to-use.mdx new file mode 100644 index 0000000000..f0f5acc4de --- /dev/null +++ b/docs/src/content/guidance/workspace-layout-when-to-use.mdx @@ -0,0 +1,17 @@ +--- +id: workspace-layout-when-to-use +type: do +description: Use the workspace layout for worker tools where pages share a side menu and people scroll long content while header and footer actions stay in reach. +topic: usage +tags: + - layout + - workspace +appliesTo: + components: + - workspace-layout +status: published +--- + +Reach for the workspace layout when you are building a tool people use to get work done, such as case management, internal dashboards, or back-office apps. It suits pages that share a side menu and where people scroll through long content while the header and footer actions stay in reach. + +It is built for these worker applications, not public citizen-facing pages. diff --git a/docs/src/content/productTypes/workspace/index.mdx b/docs/src/content/productTypes/workspace/index.mdx index d3b5d25f72..1a1402a86a 100644 --- a/docs/src/content/productTypes/workspace/index.mdx +++ b/docs/src/content/productTypes/workspace/index.mdx @@ -1,7 +1,7 @@ --- id: workspace title: Workspace -summary: The workspace is for productivity-focused services used by service delivery staff as a daily tool to review information, manage records, and complete tasks. The design prioritizes productivity, efficiency, and accuracy so staff can move through their work quickly while ensuring the best outcome for citizens and government.
Workspaces should be adapted to fit each service's context and user needs. The reference example is a starting point to expand on, not a rigid template. +summary: The workspace is a pattern for productivity-focused services that service delivery staff use as a daily tool to review information, manage records, and complete tasks. The design prioritizes efficiency and accuracy. The reference example is a starting point to adapt to your service's context, not a rigid template. heroImage: /thumbnails/workspace-preview.png demoUrl: https://digital-service-demo-v2.netlify.app/workspace sourceUrl: https://github.com/GovAlta/goa-workspace-playground @@ -25,31 +25,26 @@ components: status: published --- -View demo - import LinkCard from "../../../components/LinkCard.astro"; import PreviewContainer from "../../../components/PreviewContainer.astro"; +import { withBase } from "@/lib/base-url"; -

- Contextual case navigation + Secondary contextual navigation

Workspace contextual sidebar showing case-specific navigation items @@ -161,7 +161,7 @@ Keep top-level navigation focused on the main areas of work. When a user opens a ### Sticky action bar -A scroll-aware header that pins to the top of the content area as the user scrolls. Use it to keep the most important tools visible. +A scroll-aware header that pins to the top of the content area as the user scrolls. Use it to keep the most important tools visible. The [workspace layout](/components/workspace-layout) provides this as its sticky page header. Set the content for each page based on the task: @@ -171,14 +171,14 @@ Set the content for each page based on the task: Do not pin everything. Keep only the information and actions people need to continue their work without losing context. Workspace sticky action bar ### Push drawer -Use a [push drawer](/components/push-drawer) for focused work that should happen without leaving the current page. +Use a [push drawer](/components/push-drawer) for focused work that should happen without leaving the current page. The [workspace layout](/components/workspace-layout) hosts this as a push drawer that narrows the main card rather than overlaying it. This works well for actions such as: @@ -190,7 +190,7 @@ This works well for actions such as: Use it when users need to keep the main record in view while completing the task. Workspace push drawer @@ -201,12 +201,12 @@ Use it when users need to keep the main record in view while completing the task Workspace patterns are supported by component features designed for denser, more productive interfaces: -- **Compact inputs.** Every input component now has a `compact` variant that reduces height and spacing. This lets you build tighter forms and toolbars without sacrificing usability. -- **Compact badges and notifications.** [Badges](/components/badge) and [notification banners](/components/notification) also have compact sizing to fit within dense data views and action bars. -- **Badge variants.** [Badges](/components/badge) now include `strong` and `subtle` emphasis options, giving you control over visual weight depending on context. -- **Data grid.** The [data grid](/components/data-grid) works with the table component to support accessible, keyboard-navigable data views. Use them together when the user needs to move through records efficiently without relying on a mouse. -- **Segmented tabs.** A new [tab](/components/tab) variant that works as a segmented toggle for switching between views or modes within a workspace, rather than navigating between pages. -- **Enhanced filter chips.** [Filter chips](/components/filter-chip) now support secondary text and secondary icons, making them more useful for richer filtering in workspace data views. +- **Compact inputs:** Every input component now has a `compact` variant that reduces height and spacing. This lets you build tighter forms and toolbars without sacrificing usability. +- **Compact badges and notifications:** [Badges](/components/badge) and [notification banners](/components/notification) also have compact sizing to fit within dense data views and action bars. +- **Badge variants:** [Badges](/components/badge) now include `strong` and `subtle` emphasis options, giving you control over visual weight depending on context. +- **Data grid:** The [data grid](/components/data-grid) works with the table component to support accessible, keyboard-navigable data views. Use them together when the user needs to move through records efficiently without relying on a mouse. +- **Segmented tabs:** A new [tab](/components/tab) variant that works as a segmented toggle for switching between views or modes within a workspace, rather than navigating between pages. +- **Enhanced filter chips:** [Filter chips](/components/filter-chip) now support secondary text and secondary icons, making them more useful for richer filtering in workspace data views. --- @@ -227,7 +227,7 @@ Use the workspace when your service needs to support regular, task-based work, s ## When not to use -- Citizen-facing services. Use the [public form](/examples/public-form) pattern instead. +- Public facing applications or forms. Use the [public form](/examples/public-form) pattern instead. - Content-only pages that do not involve case management. - Simple internal tools that do not need structured case processing. @@ -251,12 +251,3 @@ Use one of the workspace templates as a starting point for your service. Each te description="GitHub template for building a workspace with Angular" />
- ---- - -## Considerations - -- The reference demo is a spike. Component customizations have not gone through the production pipeline yet. -- There should be significant variability within a workspace to meet each service's specific context and user needs. -- The demo is a starting point to expand on and adapt, not a rigid template to copy exactly. -- Desktop uses a card container pattern for the main content area. This is removed on mobile for space. diff --git a/docs/src/data/configurations/index.ts b/docs/src/data/configurations/index.ts index cbfbe46429..5c471cf66e 100644 --- a/docs/src/data/configurations/index.ts +++ b/docs/src/data/configurations/index.ts @@ -70,6 +70,8 @@ export { dataGridConfigurations } from "./data-grid"; export { modalConfigurations } from "./modal"; export { drawerConfigurations } from "./drawer"; export { pushDrawerConfigurations } from "./push-drawer"; +export { scrollPanelConfigurations } from "./scroll-panel"; +export { workspaceLayoutConfigurations } from "./workspace-layout"; export { popoverConfigurations } from "./popover"; export { accordionConfigurations } from "./accordion"; export { detailsConfigurations } from "./details"; @@ -137,6 +139,8 @@ import { dataGridConfigurations } from "./data-grid"; import { modalConfigurations } from "./modal"; import { drawerConfigurations } from "./drawer"; import { pushDrawerConfigurations } from "./push-drawer"; +import { scrollPanelConfigurations } from "./scroll-panel"; +import { workspaceLayoutConfigurations } from "./workspace-layout"; import { popoverConfigurations } from "./popover"; import { accordionConfigurations } from "./accordion"; import { detailsConfigurations } from "./details"; @@ -214,6 +218,8 @@ export const configurationRegistry: ConfigurationRegistry = { modal: modalConfigurations, drawer: drawerConfigurations, "push-drawer": pushDrawerConfigurations, + "scroll-panel": scrollPanelConfigurations, + "workspace-layout": workspaceLayoutConfigurations, popover: popoverConfigurations, accordion: accordionConfigurations, details: detailsConfigurations, diff --git a/docs/src/data/configurations/scroll-panel.ts b/docs/src/data/configurations/scroll-panel.ts new file mode 100644 index 0000000000..2e8ebc59fe --- /dev/null +++ b/docs/src/data/configurations/scroll-panel.ts @@ -0,0 +1,306 @@ +/** + * Scroll Panel Component Configurations + * + * Bounded container with sticky header / footer slots and a scrollable body. + * Renders a subtle border on header/footer + inset shadows on content when the + * body overflows, so users know there's more content above or below. + */ + +import type { ComponentConfigurations } from "./types"; + +export const scrollPanelConfigurations: ComponentConfigurations = { + componentSlug: "scroll-panel", + componentName: "Scroll Panel", + defaultConfigurationId: "basic", + + // ScrollPanel fills its parent — strip the sandbox's default padding so the + // panel sits flush to the preview edges, matching how it appears in real use. + previewStyle: "padding: 0;", + + configurations: [ + { + id: "basic", + name: "Basic scroll panel", + description: "Header + scrollable body + footer with a fixed height.", + code: { + react: { + ts: `const paragraphs = Array.from({ length: 15 }, (_, i) => i + 1);`, + jsx: ` + + Case details + + + } + footer={ +
+ + Cancel + Save changes + +
+ } +> +
+ {paragraphs.map((n) => ( +

+ Paragraph {n} — Scrollable body content. The panel will scroll inside its + 480px height, with sticky header and footer pinned. Notice the subtle + border + inset shadow that appears when scrolling indicates more content. +

+ ))} +
+
`, + }, + angular: { + ts: `export class SomeComponent { + paragraphs = Array.from({ length: 15 }, (_, i) => i + 1); +}`, + template: ` +
+ Case details +
+
+ +
+ + Cancel + Save changes + +
+
+ + +
+ @for (n of paragraphs; track n) { +

+ Paragraph {{ n }} — Scrollable body content. The panel will scroll inside + its 480px height, with sticky header and footer pinned. Notice the subtle + border + inset shadow that appears when scrolling indicates more content. +

+ } +
+
`, + }, + webComponents: ` +
+ Case details +
+
+
+ + Cancel + Save changes + +
+
+`, + }, + }, + { + id: "header-only", + name: "Header only", + description: "Sticky header pinned at the top with a scrollable body — no footer slot.", + code: { + react: { + ts: `const rows = Array.from({ length: 12 }, (_, i) => i + 1);`, + jsx: ` + + Activity feed + + + } +> +
+ {rows.map((n) => ( +

Row {n} — scroll me, header stays pinned at the top.

+ ))} +
+
`, + }, + angular: { + ts: `export class SomeComponent { + rows = Array.from({ length: 12 }, (_, i) => i + 1); +}`, + template: ` +
+ Activity feed +
+
+ + +
+ @for (n of rows; track n) { +

Row {{ n }} — scroll me, header stays pinned at the top.

+ } +
+
`, + }, + webComponents: ` +
+ Activity feed +
+
+
+`, + }, + }, + { + id: "footer-only", + name: "Footer only", + description: "Sticky footer pinned at the bottom with a scrollable body — no header slot.", + code: { + react: { + ts: `const rows = Array.from({ length: 12 }, (_, i) => i + 1);`, + jsx: ` + + + Submit + + + + } +> +
+ {rows.map((n) => ( +

Row {n} — scroll me, footer stays pinned at the bottom.

+ ))} +
+
`, + }, + angular: { + ts: `export class SomeComponent { + rows = Array.from({ length: 12 }, (_, i) => i + 1); +}`, + template: ` +
+ + Submit + +
+
+ + +
+ @for (n of rows; track n) { +

Row {{ n }} — scroll me, footer stays pinned at the bottom.

+ } +
+
`, + }, + webComponents: ` + +
+ + Submit + +
+
+`, + }, + }, + { + id: "custom-height", + name: "Custom height", + description: + "The `height` prop accepts any valid CSS height value (e.g. \"600px\", \"80vh\"). It defaults to \"100%\" so the panel can fill a height-constrained parent — useful when the panel is inside a div, modal, or drawer that already establishes the viewport bounds.", + code: { + react: { + ts: `const rows = Array.from({ length: 20 }, (_, i) => i + 1);`, + jsx: ` + + Custom 600px height + + + } + footer={ +
+ Footer pinned at bottom +
+ } +> +
+ {rows.map((n) => ( +

+ Row {n} — Body scrolls within the explicit 600px height. Swap to + "80vh" for viewport-relative sizing, or leave the prop off (defaults + to "100%") when a parent already constrains height. +

+ ))} +
+
`, + }, + angular: { + ts: `export class SomeComponent { + rows = Array.from({ length: 20 }, (_, i) => i + 1); +}`, + template: ` +
+ Custom 600px height +
+
+ +
+ Footer pinned at bottom +
+
+ + +
+ @for (n of rows; track n) { +

+ Row {{ n }} — Body scrolls within the explicit 600px height. Swap to + "80vh" for viewport-relative sizing, or leave the prop off (defaults + to "100%") when a parent already constrains height. +

+ } +
+
`, + }, + webComponents: ` +
+ Custom 600px height +
+
+
+ Footer pinned at bottom +
+
+`, + }, + }, + ], +}; diff --git a/docs/src/data/configurations/workspace-layout.ts b/docs/src/data/configurations/workspace-layout.ts new file mode 100644 index 0000000000..75939d803f --- /dev/null +++ b/docs/src/data/configurations/workspace-layout.ts @@ -0,0 +1,505 @@ +/** + * Workspace Layout Component Configurations + * + * Full-page shell for worker applications: a side menu, a sticky page header, + * a scrollable content area, an optional sticky footer for contextual actions, + * and an optional push drawer. + * + * The component sets its own height to 100vh. The preview bounds it with an + * inline height so it renders as a contained workspace instead of filling the + * whole docs page (inline style overrides the :host height rule). + */ + +import type { ComponentConfigurations } from "./types"; + +export const workspaceLayoutConfigurations: ComponentConfigurations = { + componentSlug: "workspace-layout", + componentName: "Workspace Layout", + defaultConfigurationId: "basic", + + // The layout fills its parent — strip the sandbox padding so it sits flush. + previewStyle: "padding: 0;", + + configurations: [ + { + id: "basic", + name: "Basic workspace", + description: + "A side menu and a scrollable content area. The simplest shell, before you add a sticky header, footer, or push drawer.", + code: { + react: { + ts: `const rows = Array.from({ length: 16 }, (_, i) => i + 1); + +const sideMenu = ( + navigate(path)} + primaryContent={ + <> + + + + + } + /> +);`, + jsx: ` +
+ {rows.map((n) => ( +

+ Case row {n} — scroll this area while the side menu stays in place. +

+ ))} +
+
`, + }, + angular: { + ts: `export class SomeComponent { + rows = Array.from({ length: 16 }, (_, i) => i + 1); + handleNavigate(path: string) { + // route to path + } +}`, + template: ` +
+ @for (n of rows; track n) { +

Case row {{ n }} — scroll this area while the side menu stays in place.

+ } +
+
+ + + + + + + + +`, + }, + webComponents: ` + + + + + + +
+
+`, + }, + }, + { + id: "sticky-header", + name: "Sticky header", + description: + "Add a sticky page header for the page title and key actions. It stays pinned while the content scrolls, and a soft shadow appears under it once content scrolls past.", + code: { + react: { + ts: `const rows = Array.from({ length: 16 }, (_, i) => i + 1); + +const sideMenu = ( + navigate(path)} + primaryContent={ + <> + + + + } + /> +); + +const pageHeader = ( +
+ My cases + + Filter + New case + +
+);`, + jsx: ` +
+ {rows.map((n) => ( +

+ Case row {n} — scroll this area and the header stays pinned at the top. +

+ ))} +
+
`, + }, + angular: { + ts: `export class SomeComponent { + rows = Array.from({ length: 16 }, (_, i) => i + 1); + handleNavigate(path: string) { + // route to path + } +}`, + template: ` +
+ @for (n of rows; track n) { +

Case row {{ n }} — scroll this area and the header stays pinned at the top.

+ } +
+
+ + + + + + + + + +
+ My cases + + Filter + New case + +
+
`, + }, + webComponents: ` + + + + + +
+ My cases + + Filter + New case + +
+ +
+
+`, + }, + }, + { + id: "sticky-footer", + name: "Sticky footer", + description: + "Add a sticky page footer for a summary or contextual actions, such as a bar of bulk actions. It stays pinned to the bottom while the content scrolls, with a soft shadow above it once content scrolls underneath.", + code: { + react: { + ts: `const rows = Array.from({ length: 16 }, (_, i) => i + 1); + +const sideMenu = ( + navigate(path)} + primaryContent={ + <> + + + + } + /> +); + +const pageFooter = ( +
+ 3 cases selected + + Clear + Export + +
+);`, + jsx: ` +
+ {rows.map((n) => ( +

+ Case row {n} — scroll this area and the footer stays pinned at the bottom. +

+ ))} +
+
`, + }, + angular: { + ts: `export class SomeComponent { + rows = Array.from({ length: 16 }, (_, i) => i + 1); + handleNavigate(path: string) { + // route to path + } +}`, + template: ` +
+ @for (n of rows; track n) { +

Case row {{ n }} — scroll this area and the footer stays pinned at the bottom.

+ } +
+
+ + + + + + + + + +
+ 3 cases selected + + Clear + Export + +
+
`, + }, + webComponents: ` + + + + + + + +
+ 3 cases selected + + Clear + Export + +
+
+`, + }, + }, + { + id: "push-drawer", + name: "Push drawer", + description: + "An optional drawer that opens beside the content instead of over it. It narrows the content rather than covering it, so people can still work with the page while the drawer is open. The side menu stays in place.", + code: { + react: { + ts: `const [open, setOpen] = useState(false); + +const sideMenu = ( + navigate(path)} + primaryContent={ + <> + + + + } + /> +); + +const drawer = ( + setOpen(false)}> + {/* drawer content */} + +);`, + jsx: ` +
+ setOpen(true)}>Open + {/* main page content */} +
+
`, + }, + angular: { + ts: `export class SomeComponent { + open = false; + handleNavigate(path: string) { + // route to path + } +}`, + template: ` +
+ Open + +
+
+ + + + + + + + + + + + +`, + }, + webComponents: ` + + + + + +
+ Open +
+
+ + +
+
+
+`, + }, + }, + { + id: "monitor-scroll-state", + name: "Monitor scroll state", + description: + "React to scroll progress inside the layout. Here the page header collapses its subtitle once content scrolls past the top. React exposes the useGoabWorkspaceLayoutScrollState hook, Angular the GoabWorkspaceLayoutScrollStateService (signals), and the web component a _scrollStateChange event. The scroll states are no-scroll, at-top, middle, and at-bottom.", + code: { + react: { + ts: `import { + GoabWorkSideMenu, + GoabWorkSideMenuItem, + GoabWorkspaceLayout, + useGoabWorkspaceLayoutScrollState, +} from "@abgov/react-components"; + +const rows = Array.from({ length: 20 }, (_, i) => i + 1); + +const sideMenu = ( + + + + + } + /> +); + +function PageHeader() { + const { scrollPosition } = useGoabWorkspaceLayoutScrollState(); + const collapsed = + scrollPosition === "middle" || scrollPosition === "at-bottom"; + return ( +
+

My cases

+ {!collapsed && ( +

Scroll down to collapse this subtitle.

+ )} +
+ ); +}`, + jsx: `}> +
+ {rows.map((n) => ( +

Case row {n}

+ ))} +
+
`, + }, + angular: { + ts: `import { computed, inject } from "@angular/core"; +import { GoabWorkspaceLayoutScrollStateService } from "@abgov/angular-components"; + +export class SomeComponent { + rows = Array.from({ length: 20 }, (_, i) => i + 1); + + // The service is populated by goab-workspace-layout; read its signals anywhere. + private scrollState = inject(GoabWorkspaceLayoutScrollStateService); + + // Collapse once the user scrolls past the top. + collapsed = computed(() => { + const pos = this.scrollState.scrollPosition(); + return pos === "middle" || pos === "at-bottom"; + }); +}`, + template: ` +
+ @for (n of rows; track n) { +

Case row {{ n }}

+ } +
+
+ + +

My cases

+ @if (!collapsed()) { +

Scroll down to collapse this subtitle.

+ } +
+ + + + + + + +`, + }, + webComponents: ` + + + + + +
+ My cases + Scroll down to collapse this subtitle. +
+ +
+
+`, + }, + }, + ], +}; diff --git a/docs/src/layouts/ExamplesPageLayout.astro b/docs/src/layouts/ExamplesPageLayout.astro index 860ec99154..5e5b55e91a 100644 --- a/docs/src/layouts/ExamplesPageLayout.astro +++ b/docs/src/layouts/ExamplesPageLayout.astro @@ -118,6 +118,21 @@ const getStartedNav = await getGetStartedNav(); padding: var(--goa-space-xl) var(--card-padding-h); } + /* Inline code chips in the slotted MDX content (matches documentation pages) */ + .content-card :global(code) { + font-family: "Roboto Mono", monospace; + font-size: var(--goa-font-size-2); + background: var(--goa-color-greyscale-100, #f5f5f5); + padding: 0.125em 0.375em; + border-radius: var(--goa-border-radius-xs); + color: var(--goa-color-text-default, #333); + } + + .content-card :global(pre code) { + background: none; + padding: 0; + } + /* Tablet: modal drawer mode (push drawer switches at 1023px) */ @media (max-width: 1023px) { .content-card { diff --git a/docs/src/layouts/PreviewLayout.astro b/docs/src/layouts/PreviewLayout.astro index f6b2a5f064..fe512396ea 100644 --- a/docs/src/layouts/PreviewLayout.astro +++ b/docs/src/layouts/PreviewLayout.astro @@ -23,6 +23,7 @@ interface Props { backLabel?: string; reactSourceUrl?: string; angularSourceUrl?: string; + figmaUrl?: string; } const { @@ -31,6 +32,7 @@ const { backLabel = "Back to Examples", reactSourceUrl, angularSourceUrl, + figmaUrl, } = Astro.props; const resolvedBackUrl = withBase(backUrl); @@ -76,6 +78,16 @@ const resolvedBackUrl = withBase(backUrl); > )} + {figmaUrl && ( + + + + )}
@@ -276,72 +184,55 @@ data-first-focus="true" aria-labelledby={_showCloseButton ? "goa-drawer-heading" : undefined} > - - {#if _showCloseButton} -
- {#if heading || $$slots.heading} - {#if heading} - {#if version === "2"} - {heading} + + {#if _showCloseButton} +
+ {#if heading || $$slots.heading} + {#if heading} + {#if version === "2"} + {heading} + {:else} + {heading} + {/if} {:else} - {heading} + {/if} - {:else} - {/if} - {/if} - - -
- {/if} - - -
- {#if version === "1"} - -
- -
-
- {:else} + + +
+ {/if} + +
+
+ + {#if $$slots.actions} +
+ +
{/if} -
- - - {#if $$slots.actions} -
- -
- {/if} +
@@ -358,24 +249,10 @@ transition: opacity 200ms ease-out; } - /* Shadow styles for scrollable content */ - .root.top .drawer-content { - box-shadow: inset 0 -8px 8px -8px rgba(0, 0, 0, 0.3); - } - - .root.bottom .drawer-content { - box-shadow: inset 0 8px 8px -8px rgba(0, 0, 0, 0.3); - } - - .root.middle .drawer-content { - box-shadow: - inset 0 8px 8px -8px rgba(0, 0, 0, 0.2), - inset 0 -8px 8px -8px rgba(0, 0, 0, 0.2); - } - - /* V2: Remove scroll shadows (sticky elements provide visual feedback) */ - .root .drawer.v2 .drawer-content { - box-shadow: none !important; + /* scroll-panel owns scroll mechanics and the sticky header/footer scroll cue (V1 + V2) */ + .drawer goa-scroll-panel { + flex: 1 1 auto; + min-height: 0; } /* Background overlay */ @@ -437,32 +314,9 @@ margin-top: -0.1875rem; } - /* V2: Show header border when scrolled from top (middle or bottom position) */ - .root.middle .drawer.v2 .header, - .root.bottom .drawer.v2 .header { - border-bottom: var(--goa-border-width-s) solid - var(--goa-color-greyscale-200); - } - - /* Content styles */ - .drawer-content { - box-shadow: none; - flex: 0 1 auto; /* Don't grow, but can shrink - keeps actions below content */ - min-height: 0; /* Allow flexbox to shrink this element */ - overflow: hidden; /* Contain the scrollable content */ - } - - /* V2: drawer-content scrolls and takes remaining space */ - .v2.drawer-right .drawer-content, - .v2.drawer-left .drawer-content, - .v2.drawer-bottom .drawer-content { - flex: 1 1 auto; /* Take remaining space */ - overflow-y: auto; /* V2 scrolls here, not via goa-scrollable */ - } - .scroll-content { padding: var(--goa-drawer-content-padding-vertical, var(--goa-space-l)) - var(--goa-drawer-content-padding-horizontal, var(--goa-space-xl)); + var(--goa-drawer-content-padding-horizontal, var(--goa-space-l)); } /* Remove margin-top from first child in content to prevent double spacing */ @@ -489,12 +343,6 @@ border-top: none; /* Remove border by default */ } - /* V2: Show actions border when has overflow AND not at bottom (top or middle position) */ - .root.top .drawer.v2 .drawer-actions, - .root.middle .drawer.v2 .drawer-actions { - border-top: var(--goa-border-width-s) solid var(--goa-color-greyscale-200); - } - /* V2: Bottom drawer actions rounded corners */ .v2.drawer-bottom .drawer-actions { border-bottom-left-radius: var(--goa-drawer-border-radius, 24px); @@ -553,8 +401,7 @@ .drawer-right { right: var(--drawer-offset); - height: auto; /* Content-driven height */ - min-height: 100vh; /* V1: Full height background */ + height: 100vh; /* V1: bound to viewport so the scroll-panel scrolls internally */ transform: translateX(100%); box-shadow: var(--goa-drawer-right-shadow); } @@ -569,7 +416,6 @@ top: var(--goa-drawer-offset, 0); /* No bottom positioning - allows height: auto to work naturally */ height: auto; - min-height: 0; /* Override V1 min-height */ /* Max-height accounts for BOTH top and bottom margins (modal stays floating) */ max-height: calc(100vh - 2 * var(--goa-drawer-offset, 0)); overflow-y: hidden; /* No scroll on drawer itself */ @@ -590,17 +436,11 @@ transform: translateX(0); /* Slide in */ } - /* V2: When scrolled to bottom, add bottom constraint to lift drawer up */ - .root.bottom .v2.drawer-right { - bottom: var(--goa-drawer-offset, 0); - } - /* Left */ .drawer-left { left: var(--drawer-offset); - height: auto; /* Content-driven height */ - min-height: 100vh; /* V1: Full height background */ + height: 100vh; /* V1: bound to viewport so the scroll-panel scrolls internally */ transform: translateX(-100%); box-shadow: var(--goa-drawer-left-shadow); } @@ -615,7 +455,6 @@ top: var(--goa-drawer-offset, 0); /* No bottom positioning - allows height: auto to work naturally */ height: auto; - min-height: 0; /* Override V1 min-height */ /* Max-height accounts for BOTH top and bottom margins (modal stays floating) */ max-height: calc(100vh - 2 * var(--goa-drawer-offset, 0)); overflow-y: hidden; /* No scroll on drawer itself */ @@ -635,9 +474,4 @@ left: var(--goa-drawer-offset, 0); transform: translateX(0); /* Slide in */ } - - /* V2: When scrolled to bottom, add bottom constraint to lift drawer up */ - .root.bottom .v2.drawer-left { - bottom: var(--goa-drawer-offset, 0); - } diff --git a/libs/web-components/src/components/drawer/drawer.spec.ts b/libs/web-components/src/components/drawer/drawer.spec.ts index a7dffe574a..91e4077f0d 100644 --- a/libs/web-components/src/components/drawer/drawer.spec.ts +++ b/libs/web-components/src/components/drawer/drawer.spec.ts @@ -165,61 +165,4 @@ describe("Drawer", () => { expect(header).toBeTruthy(); }); }); - - it("updates scroll position correctly", async () => { - const el = render(DrawerWrapper, { - position: "right", - heading: "Heading", - content: "Content".repeat(100), // Create long content to enable scrolling - testid: "drawer", - }); - - const buttonEl = await el.findByTestId("open"); - - // Open the drawer and wait for it to be visible - await fireEvent.click(buttonEl); - const drawerEl = await el.findByTestId("drawer"); - await waitFor(() => { - expect(drawerEl.style.pointerEvents).toBe("auto"); - }); - - const scrollableEl = drawerEl.querySelector("goa-scrollable"); - expect(scrollableEl).toBeTruthy(); - - // Wait for the drawer to be fully rendered - await waitFor(() => { - expect(scrollableEl).toBeTruthy(); - }); - - // Simulate scroll events - await fireEvent( - scrollableEl as Element, - new CustomEvent("_scroll", { - detail: { scrollTop: 0, scrollHeight: 1000, offsetHeight: 500 }, - }), - ); - await waitFor(() => { - expect(drawerEl.classList.contains("top")).toBe(true); - }); - - await fireEvent( - scrollableEl as Element, - new CustomEvent("_scroll", { - detail: { scrollTop: 250, scrollHeight: 1000, offsetHeight: 500 }, - }), - ); - await waitFor(() => { - expect(drawerEl?.classList.contains("middle")).toBe(true); - }); - - await fireEvent( - scrollableEl as Element, - new CustomEvent("_scroll", { - detail: { scrollTop: 500, scrollHeight: 1000, offsetHeight: 500 }, - }), - ); - await waitFor(() => { - expect(drawerEl.classList.contains("bottom")).toBe(true); - }); - }); }); diff --git a/libs/web-components/src/components/modal/Modal.svelte b/libs/web-components/src/components/modal/Modal.svelte index 0e9ce8d64c..4105d7043b 100644 --- a/libs/web-components/src/components/modal/Modal.svelte +++ b/libs/web-components/src/components/modal/Modal.svelte @@ -43,15 +43,9 @@ // ******* let _rootEl: HTMLElement | null = null; - let _scrollPos: "top" | "middle" | "bottom" | null = "top"; - let _scrollEl: HTMLElement | undefined; - let _headerEl: HTMLElement | undefined; let _isOpen: boolean = false; - let _actionsHeight: number; let _headingSlotHasContent = false; let _actionsSlotHasContent = false; - let _headerHeight: number; - let _edgeMargin: number = 128; //64px top edge + 64px bottom edge // Type verification const [CALLOUT_VARIANT, validateCalloutVariant] = typeValidator( @@ -81,12 +75,6 @@ // DDIDS-1288 $: setTimeout(() => (_isOpen = toBoolean(open)), 1); - // Show the shadow at the top of the content after scrolling down - $: if (_isOpen && _scrollEl) { - const hasScroll = _scrollEl.scrollHeight > _scrollEl.offsetHeight; - _scrollPos = hasScroll ? "top" : null; - } - $: _transitionTime = transition === "none" ? 0 : transition === "slow" ? 400 : 200; @@ -188,25 +176,6 @@ break; } }; - - function handleScroll(e: CustomEvent) { - const hasScroll = e.detail.scrollHeight > e.detail.offsetHeight; - if (!_isOpen || !hasScroll) return; - - // top - if (e.detail.scrollTop == 0) { - _scrollPos = "top"; - } else if ( - // bottom - Math.abs( - e.detail.scrollHeight - e.detail.scrollTop - e.detail.offsetHeight, - ) < 1 - ) { - _scrollPos = "bottom"; - } else { - _scrollPos = "middle"; - } - } {#if _isOpen} @@ -216,8 +185,8 @@ in:fade={{ duration: _transitionTime }} out:fade={{ delay: _transitionTime, duration: _transitionTime }} data-testid={testid} - class={`modal ${_scrollPos ?? ""}`} - style={`--maxwidth: ${maxwidth}; --actions-height: ${_actionsHeight}px; --header-height: ${_headerHeight}`} + class="modal" + style={`--maxwidth: ${maxwidth}`} role="presentation" bind:this={_rootEl} > @@ -244,70 +213,63 @@ {/if}
-
-
- + +
@@ -444,18 +406,11 @@ } .modal-content { - margin: var(--goa-modal-content-margin-mobile, 0 -1.5rem); - padding: var(--goa-modal-content-padding, 0); + margin: 0; + padding: 0 var(--goa-modal-scrollable-padding-mobile, var(--goa-space-m)); box-shadow: none; } - :host { - --scrollable-padding: var( - --goa-modal-scrollable-padding-mobile, - var(--goa-scrollable-padding-mobile) - ); - } - /* V2 Mobile Overrides */ .v2 .content header { padding: var(--goa-modal-heading-padding-mobile, var(--goa-space-m)); @@ -471,7 +426,7 @@ .v2 .modal-content { padding: var( --goa-modal-content-padding-mobile, - var(--goa-space-l) var(--goa-space-m) var(--goa-space-xl) + var(--goa-space-xl) var(--goa-space-m) var(--goa-space-xl) var(--goa-space-m) ); } @@ -490,15 +445,16 @@ } .modal-content { - margin: var(--goa-modal-content-margin, 0 -2rem); - padding: var(--goa-modal-content-padding, 0); + margin: 0; + padding: 0 var(--goa-modal-scrollable-padding-desktop, var(--goa-space-l)); box-shadow: none; } - :host { - --scrollable-padding: var( - --goa-modal-scrollable-padding-desktop, - var(--goa-scrollable-padding-desktop) + .v2 .modal-content { + padding: var( + --goa-modal-content-padding-desktop, + var(--goa-space-l) var(--goa-space-l) var(--goa-space-xl) + var(--goa-space-l) ); } } @@ -517,13 +473,32 @@ border: none; } + /* Bound the pane so scroll-panel inside has a flex height context. 160px = + 128px edge margin (64px top + 64px bottom) + 32px (matches the prior V1 + maxheight calc's extra --goa-space-xl term), */ + .modal-pane { + max-height: calc(100vh - 160px); + overflow: hidden; + } + + .content { + display: flex; + flex-direction: column; + min-height: 0; + overflow: hidden; + } + + goa-scroll-panel { + flex: 1 1 auto; + min-height: 0; + } + .modal-content :global(::slotted(:last-child)) { margin-bottom: var(--goa-space-m) !important; } - /* V2: Remove margins from slotted content to prevent spacing issues */ - .v2 .modal-content :global(::slotted(*)) { - margin: 0 !important; + .v2 .modal-content :global(::slotted(:first-child)) { + margin-top: 0 !important; } .modal-title { @@ -553,20 +528,6 @@ padding: 0; } - .modal.top .modal-content { - box-shadow: inset 0 -8px 8px -8px rgba(0, 0, 0, 0.3); - } - - .modal.bottom .modal-content { - box-shadow: inset 0 8px 8px -8px rgba(0, 0, 0, 0.3); - } - - .modal.middle .modal-content { - box-shadow: - inset 0 8px 8px -8px rgba(0, 0, 0, 0.2), - inset 0 -8px 8px -8px rgba(0, 0, 0, 0.2); - } - /* V2 Callout Styles */ .v2 .modal-heading-content { display: flex; diff --git a/libs/web-components/src/components/push-drawer/PushDrawerInternal.svelte b/libs/web-components/src/components/push-drawer/PushDrawerInternal.svelte index 192bfa1e9e..a71264cdb7 100644 --- a/libs/web-components/src/components/push-drawer/PushDrawerInternal.svelte +++ b/libs/web-components/src/components/push-drawer/PushDrawerInternal.svelte @@ -12,8 +12,12 @@ /> @@ -190,70 +141,62 @@ aria-labelledby="goa-drawer-heading" style="--goa-push-drawer-width: {width};" > -
-
- {#if heading || $$slots.heading} - {#if heading} - {#if version === "2"} - - {heading} - + +
+
+ {#if heading || $$slots.heading} + {#if heading} + {#if version === "2"} + + {heading} + + {:else} + + {heading} + + {/if} {:else} - - {heading} - + {/if} - {:else} - {/if} - {/if} - - + + +
-
- -
-
- + +
+
+ +
-
- - {#if $$slots.actions} -
- -
- {/if} + + {#if $$slots.actions} +
+ +
+ {/if} +
diff --git a/libs/web-components/src/components/scroll-panel/ScrollPanelWrapper.test.svelte b/libs/web-components/src/components/scroll-panel/ScrollPanelWrapper.test.svelte new file mode 100644 index 0000000000..7b5e7d9b40 --- /dev/null +++ b/libs/web-components/src/components/scroll-panel/ScrollPanelWrapper.test.svelte @@ -0,0 +1,18 @@ + + + + + + {#if header} +
{header}
+ {/if} +
{@html content}
+ {#if footer} + + {/if} +
diff --git a/libs/web-components/src/components/work-side-menu/WorkSideMenu.svelte b/libs/web-components/src/components/work-side-menu/WorkSideMenu.svelte index 7cdd29e252..5b881b5c10 100644 --- a/libs/web-components/src/components/work-side-menu/WorkSideMenu.svelte +++ b/libs/web-components/src/components/work-side-menu/WorkSideMenu.svelte @@ -16,8 +16,15 @@ /> + +
- - +
+ View demo + React template + Angular template
-Primary user: Service delivery staff +## Page types -## Pages +Common pages seen in workspace products that you can combine and adapt to fit the work your service supports. -Combine and adapt these to fit the work your service supports. + + All of the page examples are built using the workspace layout component. It is a responsive shell with a side menu, sticky page header and footer, and an optional push drawer. On small screens, the side menu collapses into a hamburger menu. +
+ ### Dashboard @@ -62,6 +57,7 @@ The landing view of a workspace, showing staff their counts, trends, and assigne reactSourceUrl="https://github.com/GovAlta/goa-workspace-playground/tree/main/src/routes/dashboard" angularSourceUrl="https://github.com/GovAlta/goa-workspace-angular/tree/main/src/app/pages/dashboard" moreUrl="/examples/workspace/dashboard" + figmaUrl="https://www.figma.com/design/Jpy1Ea5qglwnp1SgGnagY9/%E2%9D%96-Component-library?node-id=60158-598232" /> ### Index page @@ -75,6 +71,7 @@ The page where staff scan and pick records to work on, with filters, search, and reactSourceUrl="https://github.com/GovAlta/goa-workspace-playground/tree/main/src/routes/search" angularSourceUrl="https://github.com/GovAlta/goa-workspace-angular/tree/main/src/app/pages/search" moreUrl="/examples/workspace/index-page" + figmaUrl="https://www.figma.com/design/Jpy1Ea5qglwnp1SgGnagY9/%E2%9D%96-Component-library?node-id=67092-145149" /> ### Case detail @@ -88,51 +85,54 @@ A single-record view for reviewing and acting on one case. reactSourceUrl="https://github.com/GovAlta/goa-workspace-playground/tree/main/src/routes/cases" angularSourceUrl="https://github.com/GovAlta/goa-workspace-angular/tree/main/src/app/pages/cases" moreUrl="/examples/workspace/case-detail" + figmaUrl="https://www.figma.com/design/Jpy1Ea5qglwnp1SgGnagY9/%E2%9D%96-Component-library?node-id=60159-129834" /> --- -## Patterns +## Interaction patterns -Patterns that show up across multiple workspace pages. +Common interaction patterns that show up across multiple workspace pages. ### Data views Workers need different ways to view, scan, and act on records depending on the task. Choose the data view that best supports the task. -- **Table view.** Dense, scannable rows with sortable columns. Best for users who need to compare fields across many records at once. -- **Card view.** Each record as a card showing key details grouped into sections. Useful when records have more complex data that doesn't fit neatly into columns. -- **Expandable list view.** Compact rows that expand inline to reveal detail. A middle ground between the density of a table and the richness of cards. - -Any view can be combined with grouping (for example, group by priority or status) to organize records into collapsible sections. Users can also search, filter by status using [tabs](/components/tabs), sort with multi-level sorting, and manage active filters with [filter chips](/components/filter-chip). +- **Table view:** Dense, scannable rows with sortable columns. Best for users who need to compare fields across many records at once. +- **Card view:** Each record as a card showing key details grouped into sections. Useful when records have more complex data that doesn't fit neatly into columns. +- **Expandable list view:** Compact rows that expand inline to reveal detail. A middle ground between the density of a table and the richness of cards. - +
+ Table view with sortable columns Card view of case files Expandable list view with grouping +
+ +Any view can be combined with grouping (for example, group by priority or status) to organize records into collapsible sections. Users can also search, filter by status using [tabs](/components/tabs), sort with multi-level sorting, and manage active filters with [filter chips](/components/filter-chip). ### Sidebar navigation -Use the [work side menu](/components/work-side-menu) as the primary navigation for a workspace. +Use the [work side menu](/components/work-side-menu) as the primary navigation for a workspace. The [workspace layout](/components/workspace-layout) provides this navigation, including the collapse to a hamburger on mobile. Keep top-level navigation focused on the main areas of work. When a user opens a record or case, switch to contextual navigation that supports that task. This puts the user into a focused mode with relevant navigation items (like sections of an application, comments, reminders) and a back link to return to the main view. The sidebar can adapt to what the user is doing, it doesn't have to show everything at once. @@ -142,17 +142,17 @@ Keep top-level navigation focused on the main areas of work. When a user opens a Main workspace navigation

Workspace main sidebar navigation with Dashboard and Applications items