@noctuatech/uswds 0.2.0 → 1.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/README.md +5 -6
  2. package/package.json +1 -1
  3. package/src/lib/breadcrumbs/breadcrumb/breadcrumb.element.ts +59 -0
  4. package/src/lib/breadcrumbs/breadcrumbs.element.ts +42 -0
  5. package/src/lib/breadcrumbs/breadcrumbs.stories.ts +31 -0
  6. package/src/lib/breadcrumbs/breadcrumbs.test.ts +21 -0
  7. package/src/lib/button-group/button-group.element.ts +33 -0
  8. package/src/lib/button-group/button-group.stories.ts +29 -0
  9. package/src/lib/button-group/button-group.test.ts +15 -0
  10. package/src/lib/define.ts +6 -0
  11. package/src/lib/in-page-nav/in-page-nav-item/in-page-nav-item.element.ts +4 -1
  12. package/src/lib/in-page-nav/in-page-nav.element.ts +7 -4
  13. package/src/lib/in-page-nav/in-page-nav.stories.ts +12 -10
  14. package/src/lib/in-page-nav/in-page-nav.test.ts +27 -1
  15. package/src/lib/link/link.element.ts +2 -1
  16. package/src/lib/modal/modal.element.ts +5 -5
  17. package/src/lib/pagination/pagination-item/pagination-item.element.ts +35 -0
  18. package/src/lib/pagination/pagination-no/pagination-no.element.ts +59 -0
  19. package/src/lib/pagination/pagination.element.ts +31 -0
  20. package/src/lib/pagination/pagination.stories.ts +62 -0
  21. package/src/lib/pagination/pagination.test.ts +15 -0
  22. package/src/lib.ts +6 -0
  23. package/target/lib/breadcrumbs/breadcrumb/breadcrumb.element.d.ts +11 -0
  24. package/target/lib/breadcrumbs/breadcrumb/breadcrumb.element.js +48 -0
  25. package/target/lib/breadcrumbs/breadcrumb/breadcrumb.element.js.map +1 -0
  26. package/target/lib/breadcrumbs/breadcrumbs.element.d.ts +9 -0
  27. package/target/lib/breadcrumbs/breadcrumbs.element.js +48 -0
  28. package/target/lib/breadcrumbs/breadcrumbs.element.js.map +1 -0
  29. package/target/lib/breadcrumbs/breadcrumbs.stories.d.ts +12 -0
  30. package/target/lib/breadcrumbs/breadcrumbs.stories.js +17 -0
  31. package/target/lib/breadcrumbs/breadcrumbs.stories.js.map +1 -0
  32. package/target/lib/breadcrumbs/breadcrumbs.test.d.ts +2 -0
  33. package/target/lib/breadcrumbs/breadcrumbs.test.js +10 -0
  34. package/target/lib/breadcrumbs/breadcrumbs.test.js.map +1 -0
  35. package/target/lib/button-group/button-group.element.d.ts +7 -0
  36. package/target/lib/button-group/button-group.element.js +28 -0
  37. package/target/lib/button-group/button-group.element.js.map +1 -0
  38. package/target/lib/button-group/button-group.stories.d.ts +12 -0
  39. package/target/lib/button-group/button-group.stories.js +17 -0
  40. package/target/lib/button-group/button-group.stories.js.map +1 -0
  41. package/target/lib/button-group/button-group.test.d.ts +1 -0
  42. package/target/lib/button-group/button-group.test.js +9 -0
  43. package/target/lib/button-group/button-group.test.js.map +1 -0
  44. package/target/lib/define.d.ts +6 -0
  45. package/target/lib/define.js +6 -0
  46. package/target/lib/define.js.map +1 -1
  47. package/target/lib/in-page-nav/in-page-nav-item/in-page-nav-item.element.js +1 -1
  48. package/target/lib/in-page-nav/in-page-nav-item/in-page-nav-item.element.js.map +1 -1
  49. package/target/lib/in-page-nav/in-page-nav.element.d.ts +2 -0
  50. package/target/lib/in-page-nav/in-page-nav.element.js +12 -4
  51. package/target/lib/in-page-nav/in-page-nav.element.js.map +1 -1
  52. package/target/lib/in-page-nav/in-page-nav.stories.js +1 -1
  53. package/target/lib/in-page-nav/in-page-nav.stories.js.map +1 -1
  54. package/target/lib/in-page-nav/in-page-nav.test.d.ts +1 -0
  55. package/target/lib/in-page-nav/in-page-nav.test.js +2 -1
  56. package/target/lib/in-page-nav/in-page-nav.test.js.map +1 -1
  57. package/target/lib/link/link.element.js +1 -1
  58. package/target/lib/link/link.element.js.map +1 -1
  59. package/target/lib/modal/modal.element.d.ts +0 -1
  60. package/target/lib/modal/modal.element.js +6 -5
  61. package/target/lib/modal/modal.element.js.map +1 -1
  62. package/target/lib/pagination/pagination-item/pagination-item.element.d.ts +7 -0
  63. package/target/lib/pagination/pagination-item/pagination-item.element.js +28 -0
  64. package/target/lib/pagination/pagination-item/pagination-item.element.js.map +1 -0
  65. package/target/lib/pagination/pagination-no/pagination-no.element.d.ts +11 -0
  66. package/target/lib/pagination/pagination-no/pagination-no.element.js +48 -0
  67. package/target/lib/pagination/pagination-no/pagination-no.element.js.map +1 -0
  68. package/target/lib/pagination/pagination.element.d.ts +7 -0
  69. package/target/lib/pagination/pagination.element.js +28 -0
  70. package/target/lib/pagination/pagination.element.js.map +1 -0
  71. package/target/lib/pagination/pagination.stories.d.ts +12 -0
  72. package/target/lib/pagination/pagination.stories.js +17 -0
  73. package/target/lib/pagination/pagination.stories.js.map +1 -0
  74. package/target/lib/pagination/pagination.test.d.ts +1 -0
  75. package/target/lib/pagination/pagination.test.js +9 -0
  76. package/target/lib/pagination/pagination.test.js.map +1 -0
  77. package/target/lib.d.ts +6 -0
  78. package/target/lib.js +6 -0
  79. package/target/lib.js.map +1 -1
package/README.md CHANGED
@@ -72,7 +72,7 @@ npm run gen element
72
72
 
73
73
  ### Form Components
74
74
  - [x] Button
75
- - [ ] Button group
75
+ - [x] Button group
76
76
  - [x] Checkbox
77
77
  - [x] Combo box
78
78
  - [ ] Date picker
@@ -90,10 +90,10 @@ npm run gen element
90
90
 
91
91
  ### Navigation Components
92
92
  - [x] Accordion
93
- - [ ] Breadcrumb
94
- - [ ] In-page navigation
93
+ - [x] Breadcrumb
94
+ - [x] In-page navigation
95
95
  - [x] Link
96
- - [ ] Pagination
96
+ - [x] Pagination
97
97
  - [x] Side navigation
98
98
  - [x] Step indicator
99
99
 
@@ -105,10 +105,9 @@ npm run gen element
105
105
  - [ ] Footer
106
106
  - [ ] Header
107
107
  - [x] Icon
108
- - [ ] Identifier
109
108
  - [ ] List
110
109
  - [x] Modal
111
- - [ ] Process list
110
+ - [x] Process list
112
111
  - [ ] Prose
113
112
  - [x] Site alert
114
113
  - [x] Summary box
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@noctuatech/uswds",
3
- "version": "0.2.0",
3
+ "version": "1.0.0-rc.1",
4
4
  "type": "module",
5
5
  "workspaces": ["packages/**"],
6
6
  "main": "./target/lib.js",
@@ -0,0 +1,59 @@
1
+ import { attr, css, element, html, query } from "@joist/element";
2
+
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ "usa-breadcrumb": USABreadcrumbElement;
6
+ }
7
+ }
8
+
9
+ @element({
10
+ tagName: "usa-breadcrumb",
11
+ shadowDom: [
12
+ css`
13
+ :host {
14
+ position: relative;
15
+ right: auto;
16
+ display: inline;
17
+ max-width: unset;
18
+ padding-right: 1.5rem;
19
+ }
20
+
21
+ :host(:last-child) usa-icon {
22
+ display: none;
23
+ }
24
+
25
+ a[href] {
26
+ color: #005ea2;
27
+ display: inline;
28
+ text-decoration: underline;
29
+ }
30
+
31
+ usa-icon {
32
+ height: 1rem;
33
+ width: 1.5rem;
34
+ position: absolute;
35
+ top: .075rem;
36
+ }
37
+ `,
38
+ html`
39
+ <a>
40
+ <slot></slot>
41
+ </a>
42
+
43
+ <usa-icon icon="navigate_next"></usa-icon>
44
+ `,
45
+ ],
46
+ })
47
+ export class USABreadcrumbElement extends HTMLElement {
48
+ @attr()
49
+ accessor href = "";
50
+
51
+ @attr()
52
+ accessor role = "listitem";
53
+
54
+ #a = query("a");
55
+
56
+ attributeChangedCallback() {
57
+ this.#a({ href: this.href });
58
+ }
59
+ }
@@ -0,0 +1,42 @@
1
+ import { attr, css, element, html } from "@joist/element";
2
+
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ "usa-breadcrumbs": USABreadcrumbsElement;
6
+ }
7
+ }
8
+
9
+ @element({
10
+ tagName: "usa-breadcrumbs",
11
+ shadowDom: [
12
+ css`
13
+ :host {
14
+ white-space: nowrap;
15
+ text-overflow: ellipsis;
16
+ overflow: hidden;
17
+ margin-bottom: 0;
18
+ margin-top: 0;
19
+ list-style-type: none;
20
+ padding-left: 0;
21
+ display: block;
22
+ padding: .25rem;
23
+ margin-left: -.25rem;
24
+ margin-right: -.25rem;
25
+ }
26
+
27
+ :host([wrap]) {
28
+ white-space: normal;
29
+ }
30
+ `,
31
+ html`
32
+ <slot></slot>
33
+ `,
34
+ ],
35
+ })
36
+ export class USABreadcrumbsElement extends HTMLElement {
37
+ @attr()
38
+ accessor role = "list";
39
+
40
+ @attr()
41
+ accessor wrap = false;
42
+ }
@@ -0,0 +1,31 @@
1
+ import type { Meta, StoryObj } from "@storybook/web-components";
2
+ import { html } from "lit";
3
+
4
+ import type { USABreadcrumbsElement } from "./breadcrumbs.element.js";
5
+
6
+ // More on how to set up stories at: https://storybook.js.org/docs/writing-stories
7
+ const meta = {
8
+ title: "usa-breadcrumbs",
9
+ tags: ["autodocs"],
10
+ render() {
11
+ return html`
12
+ <usa-breadcrumbs>
13
+ <usa-breadcrumb href="/">Home</usa-breadcrumb>
14
+ <usa-breadcrumb href="/">Federal Contracting</usa-breadcrumb>
15
+ <usa-breadcrumb href="/">Contracting assistance programs</usa-breadcrumb>
16
+ <usa-breadcrumb>Economically disadvantaged women-owned small business federal contracting program</usa-breadcrumb>
17
+ </usa-breadcrumbs>
18
+ `;
19
+ },
20
+ argTypes: {},
21
+ args: {},
22
+ } satisfies Meta<USABreadcrumbsElement>;
23
+
24
+ export default meta;
25
+
26
+ type Story = StoryObj<USABreadcrumbsElement>;
27
+
28
+ // More on writing stories with args: https://storybook.js.org/docs/writing-stories/args
29
+ export const Primary: Story = {
30
+ args: {},
31
+ };
@@ -0,0 +1,21 @@
1
+ import "./breadcrumbs.element.js";
2
+ import "./breadcrumb/breadcrumb.element.js";
3
+
4
+ import { assert, fixture, html } from "@open-wc/testing";
5
+
6
+ import type { USABreadcrumbsElement } from "./breadcrumbs.element.js";
7
+
8
+ describe("usa-breadcrumbs", () => {
9
+ it("should be accessible", async () => {
10
+ const breadcrumbs = await fixture<USABreadcrumbsElement>(html`
11
+ <usa-breadcrumbs>
12
+ <usa-breadcrumb href="/">Home</usa-breadcrumb>
13
+ <usa-breadcrumb href="/">Federal Contracting</usa-breadcrumb>
14
+ <usa-breadcrumb href="/">Contracting assistance programs</usa-breadcrumb>
15
+ <usa-breadcrumb>Economically disadvantaged women-owned small business federal contracting program</usa-breadcrumb>
16
+ </usa-breadcrumbs>
17
+ `);
18
+
19
+ return assert.isAccessible(breadcrumbs);
20
+ });
21
+ });
@@ -0,0 +1,33 @@
1
+ import { css, element, html } from "@joist/element";
2
+
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ "usa-button-group": USAButtonGroupElement;
6
+ }
7
+ }
8
+
9
+ @element({
10
+ tagName: "usa-button-group",
11
+ shadowDom: [
12
+ css`
13
+ :host {
14
+ display: flex;
15
+ gap: 0.5rem;
16
+ margin-top: 0.25rem;
17
+ margin-bottom: 0.25rem;
18
+ }
19
+
20
+ @media (min-width: 30em) {
21
+ :host {
22
+ flex-wrap: nowrap;
23
+ align-items: stretch;
24
+ flex-direction: row;
25
+ }
26
+ }
27
+ `,
28
+ html`
29
+ <slot></slot>
30
+ `,
31
+ ],
32
+ })
33
+ export class USAButtonGroupElement extends HTMLElement {}
@@ -0,0 +1,29 @@
1
+ import type { Meta, StoryObj } from "@storybook/web-components";
2
+ import { html } from "lit";
3
+
4
+ import type { USAButtonGroupElement } from "./button-group.element.js";
5
+
6
+ // More on how to set up stories at: https://storybook.js.org/docs/writing-stories
7
+ const meta = {
8
+ title: "usa-button-group",
9
+ tags: ["autodocs"],
10
+ render() {
11
+ return html`
12
+ <usa-button-group>
13
+ <usa-button variant="outline">Back</usa-button>
14
+ <usa-button variant="primary">Continue</usa-button>
15
+ </usa-button-group>
16
+ `;
17
+ },
18
+ argTypes: {},
19
+ args: {},
20
+ } satisfies Meta<USAButtonGroupElement>;
21
+
22
+ export default meta;
23
+
24
+ type Story = StoryObj<USAButtonGroupElement>;
25
+
26
+ // More on writing stories with args: https://storybook.js.org/docs/writing-stories/args
27
+ export const Primary: Story = {
28
+ args: {},
29
+ };
@@ -0,0 +1,15 @@
1
+ import "./button-group.element.js";
2
+
3
+ import { assert, fixture, html } from "@open-wc/testing";
4
+
5
+ import type { USAButtonGroupElement } from "./button-group.element.js";
6
+
7
+ describe("usa-button-group", () => {
8
+ it("should be accessible", async () => {
9
+ const buttonGroup = await fixture<USAButtonGroupElement>(html`
10
+ <usa-button-group>Hello World</usa-button-group>
11
+ `);
12
+
13
+ return assert.isAccessible(buttonGroup);
14
+ });
15
+ });
package/src/lib/define.ts CHANGED
@@ -41,3 +41,9 @@ import "./process-list/process-list.element.js";
41
41
  import "./process-list/process-list-item/process-list-item.element.js";
42
42
  import "./in-page-nav/in-page-nav.element.js";
43
43
  import "./in-page-nav/in-page-nav-item/in-page-nav-item.element.js";
44
+ import "./button-group/button-group.element.js";
45
+ import "./breadcrumbs/breadcrumbs.element.js";
46
+ import "./breadcrumbs/breadcrumb/breadcrumb.element.js";
47
+ import "./pagination/pagination.element.js";
48
+ import "./pagination/pagination-item/pagination-item.element.js";
49
+ import "./pagination/pagination-no/pagination-no.element.js";
@@ -1,5 +1,4 @@
1
1
  import { attr, css, element, html, listen, query } from "@joist/element";
2
- import { click } from "@testing-library/user-event/dist/cjs/convenience/click.js";
3
2
 
4
3
  declare global {
5
4
  interface HTMLElementTagNameMap {
@@ -25,6 +24,10 @@ declare global {
25
24
  text-decoration: none;
26
25
  }
27
26
 
27
+ a:hover {
28
+ text-decoration: underline;
29
+ }
30
+
28
31
  :host([primary]) a {
29
32
  font-weight: bold;
30
33
  }
@@ -1,4 +1,4 @@
1
- import { css, element, html, queryAll } from "@joist/element";
1
+ import { attr, css, element, html, queryAll } from "@joist/element";
2
2
 
3
3
  declare global {
4
4
  interface HTMLElementTagNameMap {
@@ -25,13 +25,16 @@ declare global {
25
25
  ],
26
26
  })
27
27
  export class USAInPageNavElement extends HTMLElement {
28
- #items = queryAll("usa-in-page-nav-item", this);
28
+ @attr()
29
+ accessor role = "list";
30
+
31
+ items = queryAll("usa-in-page-nav-item", this);
29
32
 
30
33
  #observer = new IntersectionObserver(
31
34
  (entries) => {
32
35
  for (const entry of entries) {
33
36
  if (entry.isIntersecting) {
34
- for (const item of this.#items()) {
37
+ for (const item of this.items()) {
35
38
  item.active = entry.target === item.targetElement;
36
39
  }
37
40
 
@@ -43,7 +46,7 @@ export class USAInPageNavElement extends HTMLElement {
43
46
  );
44
47
 
45
48
  connectedCallback() {
46
- const items = this.#items();
49
+ const items = this.items();
47
50
 
48
51
  for (const item of items) {
49
52
  if (item.targetElement) {
@@ -11,16 +11,18 @@ const meta = {
11
11
  return html`
12
12
  <div class="usa-in-page-nav-container">
13
13
  <aside style="position: fixed; right: 1rem; top: 2rem;">
14
- <usa-in-page-nav>
15
- <usa-in-page-nav-item target="lorem-ipsum-dolor" primary>Lorem ipsum dolor</usa-in-page-nav-item>
16
- <usa-in-page-nav-item target="consectetuer-adipiscing-elit" primary>Consectetuer adipiscing elit</usa-in-page-nav-item>
17
- <usa-in-page-nav-item target="nullam-sit-amet-enim">Nullam sit amet enim</usa-in-page-nav-item>
18
- <usa-in-page-nav-item target="vivamus-pharetra-posuere-sapien">Vivamus pharetra posuere sapien</usa-in-page-nav-item>
19
- <usa-in-page-nav-item target="suspendisse-id-velit">Suspendisse id velit</usa-in-page-nav-item>
20
- <usa-in-page-nav-item target="orci-magna-rhoncus-neque">Orci magna rhoncus neque</usa-in-page-nav-item>
21
- <usa-in-page-nav-item target="aliquam-erat-volutpat-velit-vitae-ligula-volutpat" primary>Aliquam erat volutpat: velit vitae ligula volutpat</usa-in-page-nav-item>
22
- <usa-in-page-nav-item target="vitae-ligula">Vitae ligula</usa-in-page-nav-item>
23
- </usa-in-page-nav>
14
+ <nav>
15
+ <usa-in-page-nav>
16
+ <usa-in-page-nav-item target="lorem-ipsum-dolor" primary>Lorem ipsum dolor</usa-in-page-nav-item>
17
+ <usa-in-page-nav-item target="consectetuer-adipiscing-elit" primary>Consectetuer adipiscing elit</usa-in-page-nav-item>
18
+ <usa-in-page-nav-item target="nullam-sit-amet-enim">Nullam sit amet enim</usa-in-page-nav-item>
19
+ <usa-in-page-nav-item target="vivamus-pharetra-posuere-sapien">Vivamus pharetra posuere sapien</usa-in-page-nav-item>
20
+ <usa-in-page-nav-item target="suspendisse-id-velit">Suspendisse id velit</usa-in-page-nav-item>
21
+ <usa-in-page-nav-item target="orci-magna-rhoncus-neque">Orci magna rhoncus neque</usa-in-page-nav-item>
22
+ <usa-in-page-nav-item target="aliquam-erat-volutpat-velit-vitae-ligula-volutpat" primary>Aliquam erat volutpat: velit vitae ligula volutpat</usa-in-page-nav-item>
23
+ <usa-in-page-nav-item target="vitae-ligula">Vitae ligula</usa-in-page-nav-item>
24
+ </usa-in-page-nav>
25
+ </nav>
24
26
  </aside>
25
27
 
26
28
  <main style="padding-right: 16rem; max-width: 68ex;">
@@ -1,4 +1,5 @@
1
1
  import "./in-page-nav.element.js";
2
+ import "./in-page-nav-item/in-page-nav-item.element.js";
2
3
 
3
4
  import { assert, fixture, html } from "@open-wc/testing";
4
5
 
@@ -7,7 +8,32 @@ import type { USAInPageNavElement } from "./in-page-nav.element.js";
7
8
  describe("usa-in-page-nav", () => {
8
9
  it("should be accessible", async () => {
9
10
  const inPageNav = await fixture<USAInPageNavElement>(html`
10
- <usa-in-page-nav>Hello World</usa-in-page-nav>
11
+ <usa-in-page-nav>
12
+ <usa-in-page-nav-item target="lorem-ipsum-dolor" primary>
13
+ Lorem ipsum dolor
14
+ </usa-in-page-nav-item>
15
+ <usa-in-page-nav-item target="consectetuer-adipiscing-elit" primary>
16
+ Consectetuer adipiscing elit
17
+ </usa-in-page-nav-item>
18
+ <usa-in-page-nav-item target="nullam-sit-amet-enim">
19
+ Nullam sit amet enim
20
+ </usa-in-page-nav-item>
21
+ <usa-in-page-nav-item target="vivamus-pharetra-posuere-sapien">
22
+ Vivamus pharetra posuere sapien
23
+ </usa-in-page-nav-item>
24
+ <usa-in-page-nav-item target="suspendisse-id-velit">
25
+ Suspendisse id velit
26
+ </usa-in-page-nav-item>
27
+ <usa-in-page-nav-item target="orci-magna-rhoncus-neque">
28
+ Orci magna rhoncus neque
29
+ </usa-in-page-nav-item>
30
+ <usa-in-page-nav-item target="aliquam-erat-volutpat-velit-vitae-ligula-volutpat" primary>
31
+ Aliquam erat volutpat: velit vitae ligula volutpat
32
+ </usa-in-page-nav-item>
33
+ <usa-in-page-nav-item target="vitae-ligula">
34
+ Vitae ligula
35
+ </usa-in-page-nav-item>
36
+ </usa-in-page-nav>
11
37
  `);
12
38
 
13
39
  return assert.isAccessible(inPageNav);
@@ -11,7 +11,7 @@ declare global {
11
11
  shadowDom: [
12
12
  css`
13
13
  :host {
14
- display: inline-flex;
14
+ display: contents;
15
15
  color: #005ea2;
16
16
  text-decoration: underline;
17
17
  }
@@ -20,6 +20,7 @@ declare global {
20
20
  color: inherit;
21
21
  text-decoration: inherit;
22
22
  display: inherit;
23
+ text-overflow: inherit
23
24
  }
24
25
  `,
25
26
  html`
@@ -45,8 +45,6 @@ declare global {
45
45
  ],
46
46
  })
47
47
  export class USAModalElement extends HTMLElement {
48
- modalAction: null | string = null;
49
-
50
48
  #dialog = query("dialog");
51
49
 
52
50
  openModal() {
@@ -75,11 +73,13 @@ export class USAModalElement extends HTMLElement {
75
73
  @listen("click", (host) => host)
76
74
  onModalAction(e: Event) {
77
75
  if (e.target instanceof Element) {
78
- this.modalAction = e.target.getAttribute("modal-action");
76
+ const modalAction = e.target.getAttribute("modal-action");
79
77
 
80
- this.closeModal();
78
+ if (modalAction === "close") {
79
+ this.closeModal();
81
80
 
82
- this.dispatchEvent(new Event("usa::modal::close"));
81
+ this.dispatchEvent(new Event("usa::modal::close"));
82
+ }
83
83
  }
84
84
  }
85
85
  }
@@ -0,0 +1,35 @@
1
+ import { css, element, html } from "@joist/element";
2
+
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ "usa-pagination-item": USAPaginationItemElement;
6
+ }
7
+ }
8
+
9
+ @element({
10
+ tagName: "usa-pagination-item",
11
+ shadowDom: [
12
+ css`
13
+ :host {
14
+ display: inline-flex;
15
+ height: 2.5rem;
16
+ justify-content: center;
17
+ line-height: 1;
18
+ min-width: 2.5rem;
19
+ align-items: center;
20
+ }
21
+
22
+ :host(:first-child) {
23
+ margin-right: 1rem;
24
+ }
25
+
26
+ :host(:last-child) {
27
+ margin-left: 1rem;
28
+ }
29
+ `,
30
+ html`
31
+ <slot></slot>
32
+ `,
33
+ ],
34
+ })
35
+ export class USAPaginationItemElement extends HTMLElement {}
@@ -0,0 +1,59 @@
1
+ import { attr, css, element, html, query } from "@joist/element";
2
+
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ "usa-pagination-no": USAPaginationNoElement;
6
+ }
7
+ }
8
+
9
+ @element({
10
+ tagName: "usa-pagination-no",
11
+ shadowDom: [
12
+ css`
13
+ :host {
14
+ align-items: center;
15
+ border-color: rgba(27, 27, 27, .2);
16
+ border-radius: .25rem;
17
+ border-style: solid;
18
+ border-width: 1px;
19
+ color: #005ea2;
20
+ display: inline-flex;
21
+ justify-content: center;
22
+ width: 100%;
23
+ }
24
+
25
+ a {
26
+ display: inline-flex;
27
+ justify-content: center;
28
+ text-decoration: underline;
29
+ cursor: pointer;
30
+ padding: .5rem;
31
+ color: inherit;
32
+ }
33
+
34
+ :host([active]) {
35
+ background-color: #1b1b1b;
36
+ border-color: transparent;
37
+ color: #fff;
38
+ }
39
+ `,
40
+ html`
41
+ <a>
42
+ <slot></slot>
43
+ </a>
44
+ `,
45
+ ],
46
+ })
47
+ export class USAPaginationNoElement extends HTMLElement {
48
+ @attr()
49
+ accessor href = "#";
50
+
51
+ @attr()
52
+ accessor active = false;
53
+
54
+ #a = query("a");
55
+
56
+ attributeChangedCallback() {
57
+ this.#a({ href: this.href });
58
+ }
59
+ }
@@ -0,0 +1,31 @@
1
+ import { css, element, html } from "@joist/element";
2
+
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ "usa-pagination": USAPaginationElement;
6
+ }
7
+ }
8
+
9
+ @element({
10
+ tagName: "usa-pagination",
11
+ shadowDom: [
12
+ css`
13
+ :host {
14
+ margin-bottom: 0;
15
+ margin-top: 0;
16
+ list-style-type: none;
17
+ padding-left: 0;
18
+ align-items: center;
19
+ display: flex;
20
+ flex-flow: row nowrap;
21
+ justify-content: center;
22
+ width: auto;
23
+ gap: .5rem;
24
+ }
25
+ `,
26
+ html`
27
+ <slot></slot>
28
+ `,
29
+ ],
30
+ })
31
+ export class USAPaginationElement extends HTMLElement {}
@@ -0,0 +1,62 @@
1
+ import type { Meta, StoryObj } from "@storybook/web-components";
2
+ import { html } from "lit";
3
+
4
+ import type { USAPaginationElement } from "./pagination.element.js";
5
+
6
+ // More on how to set up stories at: https://storybook.js.org/docs/writing-stories
7
+ const meta = {
8
+ title: "usa-pagination",
9
+ tags: ["autodocs"],
10
+ render(args) {
11
+ return html`
12
+ <usa-pagination>
13
+ <usa-pagination-item>
14
+ <usa-link href="#">
15
+ <usa-icon icon="navigate_before"></usa-icon> Previous
16
+ </usa-link>
17
+ </usa-pagination-item>
18
+
19
+ <usa-pagination-item>
20
+ <usa-pagination-no>1</usa-pagination-no>
21
+ </usa-pagination-item>
22
+
23
+ <usa-pagination-item>...</usa-pagination-item>
24
+
25
+ <usa-pagination-item>
26
+ <usa-pagination-no>9</usa-pagination-no>
27
+ </usa-pagination-item>
28
+
29
+ <usa-pagination-item>
30
+ <usa-pagination-no active>10</usa-pagination-no>
31
+ </usa-pagination-item>
32
+
33
+ <usa-pagination-item>
34
+ <usa-pagination-no>11</usa-pagination-no>
35
+ </usa-pagination-item>
36
+
37
+ <usa-pagination-item>...</usa-pagination-item>
38
+
39
+ <usa-pagination-item>
40
+ <usa-pagination-no>24</usa-pagination-no>
41
+ </usa-pagination-item>
42
+
43
+ <usa-pagination-item>
44
+ <usa-link href="#">
45
+ Next <usa-icon icon="navigate_next"></usa-icon>
46
+ </usa-link>
47
+ </usa-pagination-item>
48
+ </usa-pagination>
49
+ `;
50
+ },
51
+ argTypes: {},
52
+ args: {},
53
+ } satisfies Meta<USAPaginationElement>;
54
+
55
+ export default meta;
56
+
57
+ type Story = StoryObj<USAPaginationElement>;
58
+
59
+ // More on writing stories with args: https://storybook.js.org/docs/writing-stories/args
60
+ export const Primary: Story = {
61
+ args: {},
62
+ };
@@ -0,0 +1,15 @@
1
+ import "./pagination.element.js";
2
+
3
+ import { assert, fixture, html } from "@open-wc/testing";
4
+
5
+ import type { USAPaginationElement } from "./pagination.element.js";
6
+
7
+ describe("usa-pagination", () => {
8
+ it("should be accessible", async () => {
9
+ const pagination = await fixture<USAPaginationElement>(html`
10
+ <usa-pagination>Hello World</usa-pagination>
11
+ `);
12
+
13
+ return assert.isAccessible(pagination);
14
+ });
15
+ });
package/src/lib.ts CHANGED
@@ -41,3 +41,9 @@ export { USAProcessListElement } from "./lib/process-list/process-list.element.j
41
41
  export { USAProcessListItemElement } from "./lib/process-list/process-list-item/process-list-item.element.js";
42
42
  export { USAInPageNavElement } from "./lib/in-page-nav/in-page-nav.element.js";
43
43
  export { USAInPageNavItemElement } from "./lib/in-page-nav/in-page-nav-item/in-page-nav-item.element.js";
44
+ export { USAButtonGroupElement } from "./lib/button-group/button-group.element.js";
45
+ export { USABreadcrumbsElement } from "./lib/breadcrumbs/breadcrumbs.element.js";
46
+ export { USABreadcrumbElement } from "./lib/breadcrumbs/breadcrumb/breadcrumb.element.js";
47
+ export { USAPaginationElement } from "./lib/pagination/pagination.element.js";
48
+ export { USAPaginationItemElement } from "./lib/pagination/pagination-item/pagination-item.element.js";
49
+ export { USAPaginationNoElement } from "./lib/pagination/pagination-no/pagination-no.element.js";