@noctuatech/uswds 0.1.4 → 0.2.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 (74) hide show
  1. package/README.md +48 -0
  2. package/package.json +4 -4
  3. package/src/lib/button/button.element.ts +11 -3
  4. package/src/lib/combo-box/combo-box.element.ts +20 -0
  5. package/src/lib/combo-box/combo-box.test.ts +18 -31
  6. package/src/lib/define.ts +5 -0
  7. package/src/lib/in-page-nav/in-page-nav-item/in-page-nav-item.element.ts +80 -0
  8. package/src/lib/in-page-nav/in-page-nav.element.ts +58 -0
  9. package/src/lib/in-page-nav/in-page-nav.stories.ts +67 -0
  10. package/src/lib/in-page-nav/in-page-nav.test.ts +15 -0
  11. package/src/lib/input/input.element.ts +9 -1
  12. package/src/lib/process-list/process-list-item/process-list-item.element.ts +80 -0
  13. package/src/lib/process-list/process-list.element.ts +27 -0
  14. package/src/lib/process-list/process-list.stories.ts +61 -0
  15. package/src/lib/process-list/process-list.test.ts +41 -0
  16. package/src/lib/search/search.element.ts +94 -0
  17. package/src/lib/search/search.event.ts +15 -0
  18. package/src/lib/search/search.stories.ts +31 -0
  19. package/src/lib/search/search.test.ts +81 -0
  20. package/src/lib.ts +5 -0
  21. package/target/lib/button/button.element.js +1 -1
  22. package/target/lib/button/button.element.js.map +1 -1
  23. package/target/lib/checkbox/checkbox.element.js +1 -1
  24. package/target/lib/combo-box/combo-box.element.d.ts +3 -0
  25. package/target/lib/combo-box/combo-box.element.js +23 -2
  26. package/target/lib/combo-box/combo-box.element.js.map +1 -1
  27. package/target/lib/combo-box/combo-box.test.js +7 -25
  28. package/target/lib/combo-box/combo-box.test.js.map +1 -1
  29. package/target/lib/define.d.ts +5 -0
  30. package/target/lib/define.js +5 -0
  31. package/target/lib/define.js.map +1 -1
  32. package/target/lib/in-page-nav/in-page-nav-item/in-page-nav-item.element.d.ts +15 -0
  33. package/target/lib/in-page-nav/in-page-nav-item/in-page-nav-item.element.js +78 -0
  34. package/target/lib/in-page-nav/in-page-nav-item/in-page-nav-item.element.js.map +1 -0
  35. package/target/lib/in-page-nav/in-page-nav.element.d.ts +10 -0
  36. package/target/lib/in-page-nav/in-page-nav.element.js +50 -0
  37. package/target/lib/in-page-nav/in-page-nav.element.js.map +1 -0
  38. package/target/lib/in-page-nav/in-page-nav.stories.d.ts +12 -0
  39. package/target/lib/in-page-nav/in-page-nav.stories.js +17 -0
  40. package/target/lib/in-page-nav/in-page-nav.stories.js.map +1 -0
  41. package/target/lib/in-page-nav/in-page-nav.test.d.ts +1 -0
  42. package/target/lib/in-page-nav/in-page-nav.test.js +9 -0
  43. package/target/lib/in-page-nav/in-page-nav.test.js.map +1 -0
  44. package/target/lib/input/input.element.d.ts +3 -1
  45. package/target/lib/input/input.element.js +14 -2
  46. package/target/lib/input/input.element.js.map +1 -1
  47. package/target/lib/process-list/process-list-item/process-list-item.element.d.ts +8 -0
  48. package/target/lib/process-list/process-list-item/process-list-item.element.js +40 -0
  49. package/target/lib/process-list/process-list-item/process-list-item.element.js.map +1 -0
  50. package/target/lib/process-list/process-list.element.d.ts +8 -0
  51. package/target/lib/process-list/process-list.element.js +40 -0
  52. package/target/lib/process-list/process-list.element.js.map +1 -0
  53. package/target/lib/process-list/process-list.stories.d.ts +12 -0
  54. package/target/lib/process-list/process-list.stories.js +17 -0
  55. package/target/lib/process-list/process-list.stories.js.map +1 -0
  56. package/target/lib/process-list/process-list.test.d.ts +2 -0
  57. package/target/lib/process-list/process-list.test.js +10 -0
  58. package/target/lib/process-list/process-list.test.js.map +1 -0
  59. package/target/lib/radio/radio.element.js +1 -1
  60. package/target/lib/search/search.element.d.ts +16 -0
  61. package/target/lib/search/search.element.js +99 -0
  62. package/target/lib/search/search.element.js.map +1 -0
  63. package/target/lib/search/search.event.d.ts +9 -0
  64. package/target/lib/search/search.event.js +8 -0
  65. package/target/lib/search/search.event.js.map +1 -0
  66. package/target/lib/search/search.stories.d.ts +12 -0
  67. package/target/lib/search/search.stories.js +21 -0
  68. package/target/lib/search/search.stories.js.map +1 -0
  69. package/target/lib/search/search.test.d.ts +3 -0
  70. package/target/lib/search/search.test.js +52 -0
  71. package/target/lib/search/search.test.js.map +1 -0
  72. package/target/lib.d.ts +5 -0
  73. package/target/lib.js +5 -0
  74. package/target/lib.js.map +1 -1
package/README.md CHANGED
@@ -67,3 +67,51 @@ npm run storybook
67
67
  ```sh
68
68
  npm run gen element
69
69
  ```
70
+
71
+ ## USWDS Components Checklist
72
+
73
+ ### Form Components
74
+ - [x] Button
75
+ - [ ] Button group
76
+ - [x] Checkbox
77
+ - [x] Combo box
78
+ - [ ] Date picker
79
+ - [ ] Date range picker
80
+ - [x] File input
81
+ - [x] Input mask
82
+ - [x] Input prefix or suffix
83
+ - [ ] Memorable date
84
+ - [x] Radio buttons
85
+ - [x] Range slider
86
+ - [x] Search
87
+ - [x] Select
88
+ - [x] Text input
89
+ - [ ] Time picker
90
+
91
+ ### Navigation Components
92
+ - [x] Accordion
93
+ - [ ] Breadcrumb
94
+ - [ ] In-page navigation
95
+ - [x] Link
96
+ - [ ] Pagination
97
+ - [x] Side navigation
98
+ - [x] Step indicator
99
+
100
+ ### Content Components
101
+ - [x] Alert
102
+ - [ ] Banner
103
+ - [x] Card
104
+ - [x] Collection
105
+ - [ ] Footer
106
+ - [ ] Header
107
+ - [x] Icon
108
+ - [ ] Identifier
109
+ - [ ] List
110
+ - [x] Modal
111
+ - [ ] Process list
112
+ - [ ] Prose
113
+ - [x] Site alert
114
+ - [x] Summary box
115
+ - [ ] Table
116
+ - [x] Tag
117
+ - [ ] Tooltip
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@noctuatech/uswds",
3
- "version": "0.1.4",
3
+ "version": "0.2.1",
4
4
  "type": "module",
5
5
  "workspaces": ["packages/**"],
6
6
  "main": "./target/lib.js",
@@ -70,9 +70,9 @@
70
70
  "license": "ISC",
71
71
  "description": "",
72
72
  "dependencies": {
73
- "@joist/di": "^4.2.1-next.0",
74
- "@joist/element": "^4.2.1-next.0",
75
- "@joist/observable": "^4.2.1-next.0",
73
+ "@joist/di": "^4.2.2",
74
+ "@joist/element": "^4.2.2",
75
+ "@joist/observable": "^4.2.2",
76
76
  "tslib": "2.8.1"
77
77
  },
78
78
  "devDependencies": {
@@ -25,7 +25,11 @@ export type ButtonVariant = (typeof BUTTON_VARIANTS)[number];
25
25
  shadowDom: [
26
26
  css`
27
27
  :host {
28
- display: contents;
28
+ display: inline-block;
29
+ border-top-right-radius: 0.25rem;
30
+ border-bottom-right-radius: 0.25rem;
31
+ border-top-left-radius: 0.25rem;
32
+ border-bottom-left-radius: 0.25rem;
29
33
  }
30
34
 
31
35
  button {
@@ -39,7 +43,10 @@ export type ButtonVariant = (typeof BUTTON_VARIANTS)[number];
39
43
  appearance: none;
40
44
  align-items: center;
41
45
  border: 0;
42
- border-radius: 0.25rem;
46
+ border-top-right-radius: inherit;
47
+ border-bottom-right-radius: inherit;
48
+ border-top-left-radius: inherit;
49
+ border-bottom-left-radius: inherit;
43
50
  cursor: pointer;
44
51
  -moz-column-gap: 0.5rem;
45
52
  column-gap: 0.5rem;
@@ -50,11 +57,12 @@ export type ButtonVariant = (typeof BUTTON_VARIANTS)[number];
50
57
  text-align: center;
51
58
  text-decoration: none;
52
59
  width: 100%;
60
+ height: 100%;
53
61
  cursor: pointer;
54
62
  }
55
63
 
56
64
  @media all and (min-width: 30em) {
57
- button {
65
+ :host {
58
66
  width: auto;
59
67
  }
60
68
  }
@@ -151,6 +151,9 @@ export class USAComboBoxElement
151
151
  @attr()
152
152
  accessor placeholder = "";
153
153
 
154
+ @attr()
155
+ accessor disabled = false;
156
+
154
157
  list = query("ul");
155
158
  input = query("input");
156
159
  currentItemEl: Element | null = null;
@@ -163,6 +166,7 @@ export class USAComboBoxElement
163
166
  name: this.name,
164
167
  placeholder: this.placeholder,
165
168
  required: this.required,
169
+ disabled: this.disabled,
166
170
  });
167
171
  }
168
172
 
@@ -189,6 +193,10 @@ export class USAComboBoxElement
189
193
 
190
194
  @listen("focus", (host) => host.input())
191
195
  onFocusIn() {
196
+ if (this.disabled) {
197
+ return;
198
+ }
199
+
192
200
  this.currentItemEl = null;
193
201
 
194
202
  const list = this.list();
@@ -204,8 +212,20 @@ export class USAComboBoxElement
204
212
  list.replaceChildren(fragment);
205
213
  }
206
214
 
215
+ focus(options?: FocusOptions): void {
216
+ this.input().focus(options);
217
+ }
218
+
219
+ blur(): void {
220
+ this.input().blur();
221
+ }
222
+
207
223
  @listen("input")
208
224
  async onInput() {
225
+ if (this.disabled) {
226
+ return;
227
+ }
228
+
209
229
  const input = this.input();
210
230
  const list = this.list();
211
231
 
@@ -3,7 +3,6 @@ import "./combo-box-option/combo-box-option.element.js";
3
3
  import "../input/input.element.js";
4
4
 
5
5
  import { assert, fixture, html } from "@open-wc/testing";
6
- import { userEvent } from "@testing-library/user-event";
7
6
 
8
7
  import type { USAComboBoxElement } from "./combo-box.element.js";
9
8
 
@@ -225,34 +224,22 @@ describe("usa-combo-box", () => {
225
224
  assert.equal(form.checkValidity(), false);
226
225
  });
227
226
 
228
- // it("should reset to default value when form is reset", async () => {
229
- // const form = await fixture<HTMLFormElement>(html`
230
- // <form>
231
- // <usa-combo-box name="search" value="Apple" placeholder="Select a fruit">
232
- // <span slot="label">Fruits</span>
233
-
234
- // <usa-combo-box-option value="Apple">Apple</usa-combo-box-option>
235
- // <usa-combo-box-option value="Banana">Banana</usa-combo-box-option>
236
- // <usa-combo-box-option value="Blueberry">Blueberry</usa-combo-box-option>
237
- // <usa-combo-box-option value="Cherry">Cherry</usa-combo-box-option>
238
- // </usa-combo-box>
239
-
240
- // <button type="submit">Submit</button>
241
- // <button type="reset">Reset</button>
242
- // </form>
243
- // `);
244
-
245
- // const comboBox = form.querySelector("usa-combo-box");
246
- // if (comboBox) {
247
- // // Change the value
248
- // comboBox.value = "Banana";
249
- // comboBox.dispatchEvent(new Event("input", { bubbles: true }));
250
-
251
- // // Reset the form
252
- // form.reset();
253
-
254
- // // Check that the value was reset
255
- // assert.equal(comboBox.value, "Apple");
256
- // }
257
- // });
227
+ it("should not show suggestions when disabled", async () => {
228
+ const disabledComboBox = await fixture<USAComboBoxElement>(html`
229
+ <usa-combo-box name="search" disabled placeholder="Select a fruit">
230
+ <span slot="label">Fruits</span>
231
+
232
+ <usa-combo-box-option value="Apple">Apple</usa-combo-box-option>
233
+ <usa-combo-box-option value="Banana">Banana</usa-combo-box-option>
234
+ <usa-combo-box-option value="Blueberry">Blueberry</usa-combo-box-option>
235
+ <usa-combo-box-option value="Cherry">Cherry</usa-combo-box-option>
236
+ </usa-combo-box>
237
+ `);
238
+
239
+ const input = disabledComboBox.input();
240
+ input.focus();
241
+
242
+ const suggestions = disabledComboBox.listItems();
243
+ assert.equal(suggestions.length, 0);
244
+ });
258
245
  });
package/src/lib/define.ts CHANGED
@@ -36,3 +36,8 @@ import "./checkbox/checkbox-group/checkbox-group.element.js";
36
36
  import "./range-slider/range-slider.element.js";
37
37
  import "./combo-box/combo-box.element.js";
38
38
  import "./combo-box/combo-box-option/combo-box-option.element.js";
39
+ import "./search/search.element.js";
40
+ import "./process-list/process-list.element.js";
41
+ import "./process-list/process-list-item/process-list-item.element.js";
42
+ import "./in-page-nav/in-page-nav.element.js";
43
+ import "./in-page-nav/in-page-nav-item/in-page-nav-item.element.js";
@@ -0,0 +1,80 @@
1
+ import { attr, css, element, html, listen, query } from "@joist/element";
2
+
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ "usa-in-page-nav-item": USAInPageNavItemElement;
6
+ }
7
+ }
8
+
9
+ @element({
10
+ tagName: "usa-in-page-nav-item",
11
+ shadowDom: [
12
+ css`
13
+ :host {
14
+ border-left: solid .25rem transparent;
15
+ display: flex;
16
+ font-size: .93rem;
17
+ line-height: 1.1;
18
+ position: relative;
19
+ }
20
+
21
+ a {
22
+ color: #005ea2;
23
+ padding: .5rem 1rem;
24
+ text-decoration: none;
25
+ }
26
+
27
+ :host([primary]) a {
28
+ font-weight: bold;
29
+ }
30
+
31
+ :host([active]) a {
32
+ color: #1b1b1b;
33
+ }
34
+
35
+ :host([active]) {
36
+ border-color: #1b1b1b;
37
+ color: #1b1b1b;
38
+ }
39
+ `,
40
+ html`
41
+ <a>
42
+ <slot></slot>
43
+ </a>
44
+ `,
45
+ ],
46
+ })
47
+ export class USAInPageNavItemElement extends HTMLElement {
48
+ @attr()
49
+ accessor role = "listitem";
50
+
51
+ @attr()
52
+ accessor primary = false;
53
+
54
+ @attr()
55
+ accessor target = "";
56
+
57
+ @attr()
58
+ accessor active = false;
59
+
60
+ get targetElement() {
61
+ return document.getElementById(this.target);
62
+ }
63
+
64
+ #a = query("a");
65
+
66
+ attributeChangedCallback() {
67
+ this.#a({ href: `#${this.target}` });
68
+ }
69
+
70
+ @listen("click")
71
+ async onClick(e: Event) {
72
+ e.preventDefault();
73
+
74
+ if (this.targetElement) {
75
+ this.targetElement.scrollIntoView({ behavior: "smooth" });
76
+ }
77
+
78
+ history.pushState(null, "", `#${this.target}`);
79
+ }
80
+ }
@@ -0,0 +1,58 @@
1
+ import { css, element, html, queryAll } from "@joist/element";
2
+
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ "usa-in-page-nav": USAInPageNavElement;
6
+ }
7
+ }
8
+
9
+ @element({
10
+ tagName: "usa-in-page-nav",
11
+ shadowDom: [
12
+ css`
13
+ :host {
14
+ display: flex;
15
+ flex-direction: column;
16
+ margin-bottom: 0;
17
+ margin-top: 0;
18
+ padding: 0;
19
+ max-width: 15rem;
20
+ }
21
+ `,
22
+ html`
23
+ <slot></slot>
24
+ `,
25
+ ],
26
+ })
27
+ export class USAInPageNavElement extends HTMLElement {
28
+ #items = queryAll("usa-in-page-nav-item", this);
29
+
30
+ #observer = new IntersectionObserver(
31
+ (entries) => {
32
+ for (const entry of entries) {
33
+ if (entry.isIntersecting) {
34
+ for (const item of this.#items()) {
35
+ item.active = entry.target === item.targetElement;
36
+ }
37
+
38
+ break;
39
+ }
40
+ }
41
+ },
42
+ { rootMargin: "0px 0px -60% 0px" },
43
+ );
44
+
45
+ connectedCallback() {
46
+ const items = this.#items();
47
+
48
+ for (const item of items) {
49
+ if (item.targetElement) {
50
+ this.#observer.observe(item.targetElement);
51
+ }
52
+ }
53
+ }
54
+
55
+ disconnectedCallback() {
56
+ this.#observer.disconnect();
57
+ }
58
+ }
@@ -0,0 +1,67 @@
1
+ import type { Meta, StoryObj } from "@storybook/web-components";
2
+ import { html } from "lit";
3
+
4
+ import type { USAInPageNavElement } from "./in-page-nav.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-in-page-nav",
9
+ tags: ["autodocs"],
10
+ render() {
11
+ return html`
12
+ <div class="usa-in-page-nav-container">
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>
24
+ </aside>
25
+
26
+ <main style="padding-right: 16rem; max-width: 68ex;">
27
+ <h1>Sample in-page navigation page</h1>
28
+
29
+ <h2 id="lorem-ipsum-dolor">Lorem ipsum dolor</h2>
30
+ <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien.</p><p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien.</p>
31
+
32
+ <h2 id="consectetuer-adipiscing-elit">Consectetuer adipiscing elit</h2>
33
+ <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien.</p><p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien.</p>
34
+
35
+ <h3 id="nullam-sit-amet-enim">Nullam sit amet enim</h3>
36
+ <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien.</p><p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien.</p>
37
+
38
+ <h3 id="vivamus-pharetra-posuere-sapien">Vivamus pharetra posuere sapien</h3>
39
+ <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien.</p><p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien.</p>
40
+
41
+ <h3 id="suspendisse-id-velit">Suspendisse id velit</h3>
42
+ <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien.</p><p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien.</p>
43
+
44
+ <h3 id="orci-magna-rhoncus-neque">Orci magna rhoncus neque</h3>
45
+ <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien.</p><p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien.</p>
46
+
47
+ <h2 id="aliquam-erat-volutpat-velit-vitae-ligula-volutpat">Aliquam erat volutpat: velit vitae ligula volutpat</h2>
48
+ <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien.</p><p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien.</p><p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien.</p>
49
+
50
+ <h3 id="vitae-ligula">Vitae ligula</h3>
51
+ <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien.</p><p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien.</p><p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero. Vivamus pharetra posuere sapien.</p>
52
+ </main>
53
+ </div>
54
+ `;
55
+ },
56
+ argTypes: {},
57
+ args: {},
58
+ } satisfies Meta<USAInPageNavElement>;
59
+
60
+ export default meta;
61
+
62
+ type Story = StoryObj<USAInPageNavElement>;
63
+
64
+ // More on writing stories with args: https://storybook.js.org/docs/writing-stories/args
65
+ export const Primary: Story = {
66
+ args: {},
67
+ };
@@ -0,0 +1,15 @@
1
+ import "./in-page-nav.element.js";
2
+
3
+ import { assert, fixture, html } from "@open-wc/testing";
4
+
5
+ import type { USAInPageNavElement } from "./in-page-nav.element.js";
6
+
7
+ describe("usa-in-page-nav", () => {
8
+ it("should be accessible", async () => {
9
+ const inPageNav = await fixture<USAInPageNavElement>(html`
10
+ <usa-in-page-nav>Hello World</usa-in-page-nav>
11
+ `);
12
+
13
+ return assert.isAccessible(inPageNav);
14
+ });
15
+ });
@@ -117,6 +117,9 @@ export class USATextInputElement
117
117
  @attr()
118
118
  accessor required = false;
119
119
 
120
+ @attr()
121
+ accessor disabled = false;
122
+
120
123
  @attr()
121
124
  accessor type: "text" | "password" | "number" = "text";
122
125
 
@@ -137,6 +140,10 @@ export class USATextInputElement
137
140
  @observe()
138
141
  accessor selectionEnd: number | null = null;
139
142
 
143
+ get validationMessage() {
144
+ return this.#input().validationMessage;
145
+ }
146
+
140
147
  #internals = this.attachInternals();
141
148
  #input = query("input");
142
149
 
@@ -145,7 +152,7 @@ export class USATextInputElement
145
152
  this.#input({ autofocus: this.autofocus });
146
153
  }
147
154
 
148
- attributeChangedCallback() {
155
+ attributeChangedCallback(attr: string) {
149
156
  this.#input({
150
157
  autocomplete: this.autocomplete,
151
158
  placeholder: this.placeholder,
@@ -156,6 +163,7 @@ export class USATextInputElement
156
163
  max: this.max,
157
164
  minLength: this.minLength,
158
165
  maxLength: this.maxLength,
166
+ disabled: this.disabled,
159
167
  });
160
168
  }
161
169
 
@@ -0,0 +1,80 @@
1
+ import { attr, css, element, html } from "@joist/element";
2
+
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ "usa-process-list-item": USAProcessListItemElement;
6
+ }
7
+ }
8
+
9
+ @element({
10
+ tagName: "usa-process-list-item",
11
+ shadowDom: [
12
+ css`
13
+ * {
14
+ box-sizing: border-box;
15
+ }
16
+
17
+ :host {
18
+ display: flex;
19
+ gap: .5rem;
20
+ flex-direction: column;
21
+ position: relative;
22
+ padding-left: 3rem;
23
+ }
24
+
25
+ .number {
26
+ background: #fff;
27
+ box-shadow: 0 0 0 .25rem #fff;
28
+ border: .25rem solid #1b1b1b;
29
+ position: absolute;
30
+ height: 2.5rem;
31
+ width: 2.5rem;
32
+ border-radius: 50%;
33
+ left: 0;
34
+ top: -11px;
35
+ display: flex;
36
+ align-items: center;
37
+ justify-content: center;
38
+ font-weight: bold;
39
+ z-index: 1;
40
+ }
41
+
42
+ .line {
43
+ background: #d9e8f6;
44
+ width: 0.5rem;
45
+ position: absolute;
46
+ top: 0;
47
+ bottom: -2rem;
48
+ left: calc(2.5rem / 2 - .25rem);
49
+ }
50
+
51
+ #title::slotted(*) {
52
+ margin-top: 0;
53
+ margin-bottom: 0;
54
+ padding-top: 0;
55
+ padding-bottom: 0;
56
+ }
57
+
58
+ :host(:last-child) .line {
59
+ display: none;
60
+ }
61
+ `,
62
+ html`
63
+ <div class="number">
64
+ <slot name="count">1</slot>
65
+ </div>
66
+
67
+ <div class="line"></div>
68
+
69
+ <slot id="title" name="title"></slot>
70
+
71
+ <div class="content">
72
+ <slot></slot>
73
+ </div>
74
+ `,
75
+ ],
76
+ })
77
+ export class USAProcessListItemElement extends HTMLElement {
78
+ @attr()
79
+ accessor role = "listitem";
80
+ }