@noctuatech/uswds 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +25 -0
  3. package/package.json +89 -0
  4. package/src/lib/alert/alert-types.ts +33 -0
  5. package/src/lib/alert/alert.element.ts +105 -0
  6. package/src/lib/alert/alert.stories.ts +63 -0
  7. package/src/lib/alert/alert.test.ts +23 -0
  8. package/src/lib/button/button.element.ts +224 -0
  9. package/src/lib/button/button.stories.ts +34 -0
  10. package/src/lib/button/button.test.ts +17 -0
  11. package/src/lib/checkbox/checkbox.element.ts +166 -0
  12. package/src/lib/checkbox/checkbox.stories.ts +57 -0
  13. package/src/lib/checkbox/checkbox.test.ts +47 -0
  14. package/src/lib/config/config.element.ts +31 -0
  15. package/src/lib/config/config.test.ts +15 -0
  16. package/src/lib/define.ts +14 -0
  17. package/src/lib/description/description.element.ts +22 -0
  18. package/src/lib/description/description.test.ts +15 -0
  19. package/src/lib/file-input/file-input-preview.element.ts +121 -0
  20. package/src/lib/file-input/file-input-preview.test.ts +95 -0
  21. package/src/lib/file-input/file-input.element.ts +140 -0
  22. package/src/lib/file-input/file-input.stories.ts +46 -0
  23. package/src/lib/file-input/file-input.test.ts +47 -0
  24. package/src/lib/icon/icon-types.ts +263 -0
  25. package/src/lib/icon/icon.element.ts +65 -0
  26. package/src/lib/icon/icon.stories.ts +50 -0
  27. package/src/lib/input/input.element.ts +138 -0
  28. package/src/lib/input/input.stories.ts +30 -0
  29. package/src/lib/input/input.test.ts +48 -0
  30. package/src/lib/input-mask/format.ts +56 -0
  31. package/src/lib/input-mask/input-mask.element.ts +93 -0
  32. package/src/lib/input-mask/input-mask.stories.ts +38 -0
  33. package/src/lib/input-mask/input-mask.test.ts +106 -0
  34. package/src/lib/input-mask/maskable.element.ts +5 -0
  35. package/src/lib/link/link.element.ts +62 -0
  36. package/src/lib/link/link.stories.ts +30 -0
  37. package/src/lib/radio/radio-option.element.ts +46 -0
  38. package/src/lib/radio/radio-option.test.ts +20 -0
  39. package/src/lib/radio/radio.element.ts +152 -0
  40. package/src/lib/radio/radio.stories.ts +47 -0
  41. package/src/lib/radio/radio.test.ts +174 -0
  42. package/src/lib/select/select-option.element.ts +40 -0
  43. package/src/lib/select/select.element.ts +121 -0
  44. package/src/lib/select/select.stories.ts +33 -0
  45. package/src/lib/select/select.test.ts +113 -0
  46. package/src/lib/tag/tag.element.ts +46 -0
  47. package/src/lib/tag/tag.stories.ts +31 -0
  48. package/src/lib/tag/tag.test.ts +15 -0
  49. package/src/lib.ts +13 -0
  50. package/target/lib/alert/alert-types.d.ts +7 -0
  51. package/target/lib/alert/alert-types.js +25 -0
  52. package/target/lib/alert/alert-types.js.map +1 -0
  53. package/target/lib/alert/alert.element.d.ts +11 -0
  54. package/target/lib/alert/alert.element.js +124 -0
  55. package/target/lib/alert/alert.element.js.map +1 -0
  56. package/target/lib/alert/alert.stories.d.ts +11 -0
  57. package/target/lib/alert/alert.stories.js +56 -0
  58. package/target/lib/alert/alert.stories.js.map +1 -0
  59. package/target/lib/alert/alert.test.d.ts +1 -0
  60. package/target/lib/alert/alert.test.js +20 -0
  61. package/target/lib/alert/alert.test.js.map +1 -0
  62. package/target/lib/button/button.element.d.ts +17 -0
  63. package/target/lib/button/button.element.js +259 -0
  64. package/target/lib/button/button.element.js.map +1 -0
  65. package/target/lib/button/button.stories.d.ts +12 -0
  66. package/target/lib/button/button.stories.js +25 -0
  67. package/target/lib/button/button.stories.js.map +1 -0
  68. package/target/lib/button/button.test.d.ts +1 -0
  69. package/target/lib/button/button.test.js +14 -0
  70. package/target/lib/button/button.test.js.map +1 -0
  71. package/target/lib/checkbox/checkbox.element.d.ts +16 -0
  72. package/target/lib/checkbox/checkbox.element.js +205 -0
  73. package/target/lib/checkbox/checkbox.element.js.map +1 -0
  74. package/target/lib/checkbox/checkbox.stories.d.ts +31 -0
  75. package/target/lib/checkbox/checkbox.stories.js +46 -0
  76. package/target/lib/checkbox/checkbox.stories.js.map +1 -0
  77. package/target/lib/checkbox/checkbox.test.d.ts +1 -0
  78. package/target/lib/checkbox/checkbox.test.js +38 -0
  79. package/target/lib/checkbox/checkbox.test.js.map +1 -0
  80. package/target/lib/config/config.element.d.ts +8 -0
  81. package/target/lib/config/config.element.js +57 -0
  82. package/target/lib/config/config.element.js.map +1 -0
  83. package/target/lib/config/config.test.d.ts +1 -0
  84. package/target/lib/config/config.test.js +11 -0
  85. package/target/lib/config/config.test.js.map +1 -0
  86. package/target/lib/define.d.ts +14 -0
  87. package/target/lib/define.js +15 -0
  88. package/target/lib/define.js.map +1 -0
  89. package/target/lib/description/description.element.d.ts +7 -0
  90. package/target/lib/description/description.element.js +34 -0
  91. package/target/lib/description/description.element.js.map +1 -0
  92. package/target/lib/description/description.test.d.ts +1 -0
  93. package/target/lib/description/description.test.js +11 -0
  94. package/target/lib/description/description.test.js.map +1 -0
  95. package/target/lib/file-input/file-input-preview.element.d.ts +11 -0
  96. package/target/lib/file-input/file-input-preview.element.js +136 -0
  97. package/target/lib/file-input/file-input-preview.element.js.map +1 -0
  98. package/target/lib/file-input/file-input-preview.test.d.ts +2 -0
  99. package/target/lib/file-input/file-input-preview.test.js +67 -0
  100. package/target/lib/file-input/file-input-preview.test.js.map +1 -0
  101. package/target/lib/file-input/file-input.element.d.ts +18 -0
  102. package/target/lib/file-input/file-input.element.js +180 -0
  103. package/target/lib/file-input/file-input.element.js.map +1 -0
  104. package/target/lib/file-input/file-input.stories.d.ts +12 -0
  105. package/target/lib/file-input/file-input.stories.js +36 -0
  106. package/target/lib/file-input/file-input.stories.js.map +1 -0
  107. package/target/lib/file-input/file-input.test.d.ts +1 -0
  108. package/target/lib/file-input/file-input.test.js +37 -0
  109. package/target/lib/file-input/file-input.test.js.map +1 -0
  110. package/target/lib/icon/icon-types.d.ts +2 -0
  111. package/target/lib/icon/icon-types.js +262 -0
  112. package/target/lib/icon/icon-types.js.map +1 -0
  113. package/target/lib/icon/icon.element.d.ts +12 -0
  114. package/target/lib/icon/icon.element.js +84 -0
  115. package/target/lib/icon/icon.element.js.map +1 -0
  116. package/target/lib/icon/icon.stories.d.ts +12 -0
  117. package/target/lib/icon/icon.stories.js +39 -0
  118. package/target/lib/icon/icon.stories.js.map +1 -0
  119. package/target/lib/input/input.element.d.ts +19 -0
  120. package/target/lib/input/input.element.js +166 -0
  121. package/target/lib/input/input.element.js.map +1 -0
  122. package/target/lib/input/input.stories.d.ts +12 -0
  123. package/target/lib/input/input.stories.js +23 -0
  124. package/target/lib/input/input.stories.js.map +1 -0
  125. package/target/lib/input/input.test.d.ts +1 -0
  126. package/target/lib/input/input.test.js +38 -0
  127. package/target/lib/input/input.test.js.map +1 -0
  128. package/target/lib/input-mask/format.d.ts +15 -0
  129. package/target/lib/input-mask/format.js +47 -0
  130. package/target/lib/input-mask/format.js.map +1 -0
  131. package/target/lib/input-mask/input-mask.element.d.ts +12 -0
  132. package/target/lib/input-mask/input-mask.element.js +111 -0
  133. package/target/lib/input-mask/input-mask.element.js.map +1 -0
  134. package/target/lib/input-mask/input-mask.stories.d.ts +14 -0
  135. package/target/lib/input-mask/input-mask.stories.js +31 -0
  136. package/target/lib/input-mask/input-mask.stories.js.map +1 -0
  137. package/target/lib/input-mask/input-mask.test.d.ts +2 -0
  138. package/target/lib/input-mask/input-mask.test.js +85 -0
  139. package/target/lib/input-mask/input-mask.test.js.map +1 -0
  140. package/target/lib/input-mask/maskable.element.d.ts +5 -0
  141. package/target/lib/input-mask/maskable.element.js +2 -0
  142. package/target/lib/input-mask/maskable.element.js.map +1 -0
  143. package/target/lib/link/link.element.d.ts +13 -0
  144. package/target/lib/link/link.element.js +98 -0
  145. package/target/lib/link/link.element.js.map +1 -0
  146. package/target/lib/link/link.stories.d.ts +16 -0
  147. package/target/lib/link/link.stories.js +23 -0
  148. package/target/lib/link/link.stories.js.map +1 -0
  149. package/target/lib/radio/radio-option.element.d.ts +13 -0
  150. package/target/lib/radio/radio-option.element.js +63 -0
  151. package/target/lib/radio/radio-option.element.js.map +1 -0
  152. package/target/lib/radio/radio-option.test.d.ts +2 -0
  153. package/target/lib/radio/radio-option.test.js +15 -0
  154. package/target/lib/radio/radio-option.test.js.map +1 -0
  155. package/target/lib/radio/radio.element.d.ts +18 -0
  156. package/target/lib/radio/radio.element.js +177 -0
  157. package/target/lib/radio/radio.element.js.map +1 -0
  158. package/target/lib/radio/radio.stories.d.ts +12 -0
  159. package/target/lib/radio/radio.stories.js +40 -0
  160. package/target/lib/radio/radio.stories.js.map +1 -0
  161. package/target/lib/radio/radio.test.d.ts +2 -0
  162. package/target/lib/radio/radio.test.js +147 -0
  163. package/target/lib/radio/radio.test.js.map +1 -0
  164. package/target/lib/select/select-option.element.d.ts +11 -0
  165. package/target/lib/select/select-option.element.js +58 -0
  166. package/target/lib/select/select-option.element.js.map +1 -0
  167. package/target/lib/select/select.element.d.ts +16 -0
  168. package/target/lib/select/select.element.js +144 -0
  169. package/target/lib/select/select.element.js.map +1 -0
  170. package/target/lib/select/select.stories.d.ts +12 -0
  171. package/target/lib/select/select.stories.js +26 -0
  172. package/target/lib/select/select.stories.js.map +1 -0
  173. package/target/lib/select/select.test.d.ts +2 -0
  174. package/target/lib/select/select.test.js +89 -0
  175. package/target/lib/select/select.test.js.map +1 -0
  176. package/target/lib/tag/tag.element.d.ts +10 -0
  177. package/target/lib/tag/tag.element.js +66 -0
  178. package/target/lib/tag/tag.element.js.map +1 -0
  179. package/target/lib/tag/tag.stories.d.ts +19 -0
  180. package/target/lib/tag/tag.stories.js +25 -0
  181. package/target/lib/tag/tag.stories.js.map +1 -0
  182. package/target/lib/tag/tag.test.d.ts +1 -0
  183. package/target/lib/tag/tag.test.js +11 -0
  184. package/target/lib/tag/tag.test.js.map +1 -0
  185. package/target/lib.d.ts +13 -0
  186. package/target/lib.js +14 -0
  187. package/target/lib.js.map +1 -0
@@ -0,0 +1,46 @@
1
+ import { attr, css, element, html } from "@joist/element";
2
+
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ "usa-tag": USATagElement;
6
+ }
7
+ }
8
+
9
+ export const TAG_VARIANTS = ["default", "big"] as const;
10
+
11
+ export type TagVariant = (typeof TAG_VARIANTS)[number];
12
+
13
+ @element({
14
+ tagName: "usa-tag",
15
+ shadowDom: [
16
+ css`
17
+ :host {
18
+ font-family:
19
+ Source Sans Pro Web,
20
+ Helvetica Neue,
21
+ Helvetica,
22
+ Roboto,
23
+ Arial,
24
+ sans-serif;
25
+ font-size: 0.93rem;
26
+ color: #fff;
27
+ text-transform: uppercase;
28
+ background-color: #5c5c5c;
29
+ border-radius: 2px;
30
+ margin-right: 0.25rem;
31
+ padding: 1px 0.5rem;
32
+ }
33
+
34
+ :host([variant="big"]) {
35
+ padding-left: 0.5rem;
36
+ padding-right: 0.5rem;
37
+ font-size: 1.06rem;
38
+ }
39
+ `,
40
+ html`<slot></slot>`,
41
+ ],
42
+ })
43
+ export class USATagElement extends HTMLElement {
44
+ @attr()
45
+ accessor variant: TagVariant = "default";
46
+ }
@@ -0,0 +1,31 @@
1
+ import type { Meta, StoryObj } from "@storybook/web-components";
2
+ import { html } from "lit";
3
+
4
+ import { TAG_VARIANTS, type USATagElement } from "./tag.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-tag",
9
+ tags: ["autodocs"],
10
+ render(args) {
11
+ return html`<usa-tag variant=${args.variant}>Hello World</usa-tag>`;
12
+ },
13
+ argTypes: {
14
+ variant: {
15
+ control: "select",
16
+ options: TAG_VARIANTS,
17
+ },
18
+ },
19
+ args: {
20
+ variant: "default",
21
+ },
22
+ } satisfies Meta<USATagElement>;
23
+
24
+ export default meta;
25
+
26
+ type Story = StoryObj<USATagElement>;
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,15 @@
1
+ import "./tag.element.js";
2
+
3
+ import { fixture, html, assert } from "@open-wc/testing";
4
+
5
+ import { USATagElement } from "./tag.element.js";
6
+
7
+ describe("usa-tag", () => {
8
+ it("should be accessible", async () => {
9
+ const tag = await fixture<USATagElement>(html`
10
+ <usa-tag>Hello World</usa-tag>
11
+ `);
12
+
13
+ return assert.isAccessible(tag);
14
+ });
15
+ });
package/src/lib.ts ADDED
@@ -0,0 +1,13 @@
1
+ export { USAAlertElement } from "./lib/alert/alert.element.js";
2
+ export { USAButtonElement } from "./lib/button/button.element.js";
3
+ export { USACheckboxElement } from "./lib/checkbox/checkbox.element.js";
4
+ export { USADescriptionElement } from "./lib/description/description.element.js";
5
+ export { USAIconElement } from "./lib/icon/icon.element.js";
6
+ export { USATextInputElement } from "./lib/input/input.element.js";
7
+ export { USAInputMaskElement } from "./lib/input-mask/input-mask.element.js";
8
+ export { USALinkElement } from "./lib/link/link.element.js";
9
+ export { USARadioElement } from "./lib/radio/radio.element.js";
10
+ export { USARadioOptionElement } from "./lib/radio/radio-option.element.js";
11
+ export { USASelectElement } from "./lib/select/select.element.js";
12
+ export { USASelecOptionElement } from "./lib/select/select-option.element.js";
13
+ export { USATagElement } from "./lib/tag/tag.element.js";
@@ -0,0 +1,7 @@
1
+ import { USAIcon } from "../icon/icon-types.js";
2
+ export declare const USA_ALERT_TYPES: readonly ["info", "warning", "success", "error", "emergency"];
3
+ export type USAAlertType = (typeof USA_ALERT_TYPES)[number];
4
+ export interface USAAlert {
5
+ icon: USAIcon;
6
+ }
7
+ export declare const USA_ALERT_CONFIG: Record<USAAlertType, USAAlert>;
@@ -0,0 +1,25 @@
1
+ export const USA_ALERT_TYPES = [
2
+ "info",
3
+ "warning",
4
+ "success",
5
+ "error",
6
+ "emergency",
7
+ ];
8
+ export const USA_ALERT_CONFIG = {
9
+ info: {
10
+ icon: "info",
11
+ },
12
+ warning: {
13
+ icon: "warning",
14
+ },
15
+ success: {
16
+ icon: "check_circle",
17
+ },
18
+ error: {
19
+ icon: "error",
20
+ },
21
+ emergency: {
22
+ icon: "error",
23
+ },
24
+ };
25
+ //# sourceMappingURL=alert-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alert-types.js","sourceRoot":"","sources":["../../../src/lib/alert/alert-types.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,MAAM;IACN,SAAS;IACT,SAAS;IACT,OAAO;IACP,WAAW;CACH,CAAC;AAQX,MAAM,CAAC,MAAM,gBAAgB,GAAmC;IAC9D,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;KACb;IACD,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;KAChB;IACD,OAAO,EAAE;QACP,IAAI,EAAE,cAAc;KACrB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;KACd;IACD,SAAS,EAAE;QACT,IAAI,EAAE,OAAO;KACd;CACF,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { USAAlertType } from "./alert-types.js";
2
+ declare global {
3
+ interface HTMLElementTagNameMap {
4
+ "usa-alert": USAAlertElement;
5
+ }
6
+ }
7
+ export declare class USAAlertElement extends HTMLElement {
8
+ #private;
9
+ accessor type: USAAlertType;
10
+ attributeChangedCallback(): void;
11
+ }
@@ -0,0 +1,124 @@
1
+ import { __classPrivateFieldGet, __classPrivateFieldSet, __esDecorate, __runInitializers, __setFunctionName } from "tslib";
2
+ import { attr, css, element, html, query } from "@joist/element";
3
+ import { USA_ALERT_CONFIG } from "./alert-types.js";
4
+ let USAAlertElement = (() => {
5
+ var _USAAlertElement_icon, _USAAlertElement_type_accessor_storage;
6
+ let _classDecorators = [element({
7
+ tagName: "usa-alert",
8
+ shadowDom: [
9
+ css `
10
+ :host {
11
+ display: block;
12
+ border-left: 0.5rem solid #adadad;
13
+ padding: 1rem 1.2rem;
14
+ color: #1b1b1b;
15
+ margin-bottom: 1rem;
16
+ }
17
+
18
+ :host([type="info"]) {
19
+ border-left-color: #00bde3;
20
+ background-color: #e7f6f8;
21
+ }
22
+
23
+ :host([type="warning"]) {
24
+ background-color: #faf3d1;
25
+ border-left-color: #ffbe2e;
26
+ }
27
+
28
+ :host([type="success"]) {
29
+ background-color: #ecf3ec;
30
+ border-left-color: #00a91c;
31
+ }
32
+
33
+ :host([type="error"]) {
34
+ background-color: #f4e3db;
35
+ border-left-color: #d54309;
36
+ }
37
+
38
+ :host([type="emergency"]) {
39
+ background-color: #9c3d10;
40
+ border-left-color: #9c3d10;
41
+ color: #fff;
42
+ }
43
+
44
+ :host([type="emergency"]) ::slotted(*) {
45
+ color: #fff;
46
+ }
47
+
48
+ .alert-heading {
49
+ display: grid;
50
+ grid-template-columns: auto 1fr;
51
+ align-items: center;
52
+ }
53
+
54
+ usa-icon {
55
+ margin: -0.28rem 0.75rem 0 0;
56
+ }
57
+
58
+ #heading::slotted(*) {
59
+ font-family:
60
+ Source Sans Pro Web,
61
+ Helvetica Neue,
62
+ Helvetica,
63
+ Roboto,
64
+ Arial,
65
+ sans-serif;
66
+ font-size: 1.33rem;
67
+ line-height: 0.9;
68
+ margin-top: 0;
69
+ margin-bottom: 0.5rem;
70
+ }
71
+ `,
72
+ html `
73
+ <div class="alert-heading">
74
+ <usa-icon icon="check_circle"></usa-icon>
75
+
76
+ <div>
77
+ <slot id="heading" name="heading"></slot>
78
+ </div>
79
+
80
+ <div class="spacer"></div>
81
+
82
+ <div>
83
+ <slot></slot>
84
+ </div>
85
+ </div>
86
+ `,
87
+ ],
88
+ })];
89
+ let _classDescriptor;
90
+ let _classExtraInitializers = [];
91
+ let _classThis;
92
+ let _classSuper = HTMLElement;
93
+ let _type_decorators;
94
+ let _type_initializers = [];
95
+ let _type_extraInitializers = [];
96
+ var USAAlertElement = _classThis = class extends _classSuper {
97
+ constructor() {
98
+ super(...arguments);
99
+ _USAAlertElement_type_accessor_storage.set(this, __runInitializers(this, _type_initializers, "info"));
100
+ _USAAlertElement_icon.set(this, (__runInitializers(this, _type_extraInitializers), query("usa-icon")));
101
+ }
102
+ get type() { return __classPrivateFieldGet(this, _USAAlertElement_type_accessor_storage, "f"); }
103
+ set type(value) { __classPrivateFieldSet(this, _USAAlertElement_type_accessor_storage, value, "f"); }
104
+ attributeChangedCallback() {
105
+ const icon = __classPrivateFieldGet(this, _USAAlertElement_icon, "f").call(this);
106
+ icon.icon = USA_ALERT_CONFIG[this.type].icon;
107
+ }
108
+ };
109
+ _USAAlertElement_icon = new WeakMap();
110
+ _USAAlertElement_type_accessor_storage = new WeakMap();
111
+ __setFunctionName(_classThis, "USAAlertElement");
112
+ (() => {
113
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
114
+ _type_decorators = [attr()];
115
+ __esDecorate(_classThis, null, _type_decorators, { kind: "accessor", name: "type", static: false, private: false, access: { has: obj => "type" in obj, get: obj => obj.type, set: (obj, value) => { obj.type = value; } }, metadata: _metadata }, _type_initializers, _type_extraInitializers);
116
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
117
+ USAAlertElement = _classThis = _classDescriptor.value;
118
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
119
+ __runInitializers(_classThis, _classExtraInitializers);
120
+ })();
121
+ return USAAlertElement = _classThis;
122
+ })();
123
+ export { USAAlertElement };
124
+ //# sourceMappingURL=alert.element.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alert.element.js","sourceRoot":"","sources":["../../../src/lib/alert/alert.element.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEjE,OAAO,EAAE,gBAAgB,EAAgB,MAAM,kBAAkB,CAAC;IA2FrD,eAAe;;4BAnF3B,OAAO,CAAC;YACP,OAAO,EAAE,WAAW;YACpB,SAAS,EAAE;gBACT,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA8DF;gBACD,IAAI,CAAA;;;;;;;;;;;;;;KAcH;aACF;SACF,CAAC;;;;sBACmC,WAAW;;;;4CAAnB,SAAQ,WAAW;;;YAErC,6FAAqB,MAAM,GAAC;YAErC,mFAAQ,KAAK,CAAC,UAAU,CAAC,GAAC;QAO5B,CAAC;QATC,IAAS,IAAI,wFAAwB;QAArC,IAAS,IAAI,6FAAwB;QAIrC,wBAAwB;YACtB,MAAM,IAAI,GAAG,uBAAA,IAAI,6BAAM,MAAV,IAAI,CAAQ,CAAC;YAE1B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;QAC/C,CAAC;;;;;;;4BATA,IAAI,EAAE;QACP,uKAAS,IAAI,6BAAJ,IAAI,mFAAwB;QAFvC,6KAWC;;;QAXY,uDAAe;;;;SAAf,eAAe"}
@@ -0,0 +1,11 @@
1
+ import type { StoryObj } from "@storybook/web-components";
2
+ import type { USAAlertElement } from "./alert.element.js";
3
+ declare const meta: {
4
+ title: string;
5
+ tags: string[];
6
+ argTypes: {};
7
+ args: {};
8
+ };
9
+ export default meta;
10
+ type Story = StoryObj<USAAlertElement>;
11
+ export declare const Primary: Story;
@@ -0,0 +1,56 @@
1
+ import { html } from "lit";
2
+ // More on how to set up stories at: https://storybook.js.org/docs/writing-stories
3
+ const meta = {
4
+ title: "usa-alert",
5
+ tags: ["autodocs"],
6
+ argTypes: {},
7
+ args: {},
8
+ };
9
+ export default meta;
10
+ // More on writing stories with args: https://storybook.js.org/docs/writing-stories/args
11
+ export const Primary = {
12
+ render() {
13
+ return html `
14
+ <usa-alert type="info">
15
+ <h3 slot="heading">Informative status</h3>
16
+
17
+ Lorem ipsum dolor sit amet,&nbsp;
18
+ <usa-link href="#">consectetur adipiscing</usa-link>&nbsp;elit, sed do
19
+ eiusmod.
20
+ </usa-alert>
21
+
22
+ <usa-alert type="warning">
23
+ <h3 slot="heading">Warning status</h3>
24
+
25
+ Lorem ipsum dolor sit amet,&nbsp;
26
+ <usa-link href="#">consectetur adipiscing</usa-link>&nbsp;elit, sed do
27
+ eiusmod.
28
+ </usa-alert>
29
+
30
+ <usa-alert type="success">
31
+ <h3 slot="heading">Success status</h3>
32
+
33
+ Lorem ipsum dolor sit amet,&nbsp;
34
+ <usa-link href="#">consectetur adipiscing</usa-link>&nbsp;elit, sed do
35
+ eiusmod.
36
+ </usa-alert>
37
+
38
+ <usa-alert type="error">
39
+ <h3 slot="heading">Error status</h3>
40
+
41
+ Lorem ipsum dolor sit amet,&nbsp;
42
+ <usa-link href="#">consectetur adipiscing</usa-link>&nbsp;elit, sed do
43
+ eiusmod.
44
+ </usa-alert>
45
+
46
+ <usa-alert type="emergency">
47
+ <h3 slot="heading">Emergency status</h3>
48
+
49
+ Lorem ipsum dolor sit amet,&nbsp;
50
+ <usa-link href="#">consectetur adipiscing</usa-link>&nbsp;elit, sed do
51
+ eiusmod.
52
+ </usa-alert>
53
+ `;
54
+ },
55
+ };
56
+ //# sourceMappingURL=alert.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alert.stories.js","sourceRoot":"","sources":["../../../src/lib/alert/alert.stories.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAI3B,kFAAkF;AAClF,MAAM,IAAI,GAAG;IACX,KAAK,EAAE,WAAW;IAClB,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,QAAQ,EAAE,EAAE;IACZ,IAAI,EAAE,EAAE;CACuB,CAAC;AAElC,eAAe,IAAI,CAAC;AAIpB,wFAAwF;AACxF,MAAM,CAAC,MAAM,OAAO,GAAU;IAC5B,MAAM;QACJ,OAAO,IAAI,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAwCV,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1 @@
1
+ import "./alert.element.js";
@@ -0,0 +1,20 @@
1
+ import "./alert.element.js";
2
+ import { fixture, html, assert } from "@open-wc/testing";
3
+ import { USA_ALERT_TYPES } from "./alert-types.js";
4
+ describe("usa-alert", () => {
5
+ for (let alert of USA_ALERT_TYPES) {
6
+ it(`should be accessible: ${alert}`, async () => {
7
+ const form = await fixture(html `
8
+ <usa-alert type=${alert}>
9
+ <h3 slot="heading">Status</h3>
10
+
11
+ Lorem ipsum dolor sit amet,&nbsp;
12
+ <usa-link href="#">consectetur adipiscing</usa-link>&nbsp;elit, sed do
13
+ eiusmod.
14
+ </usa-alert>
15
+ `);
16
+ return assert.isAccessible(form);
17
+ });
18
+ }
19
+ });
20
+ //# sourceMappingURL=alert.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alert.test.js","sourceRoot":"","sources":["../../../src/lib/alert/alert.test.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,CAAC;AAE5B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,KAAK,IAAI,KAAK,IAAI,eAAe,EAAE,CAAC;QAClC,EAAE,CAAC,yBAAyB,KAAK,EAAE,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAA;0BACX,KAAK;;;;;;;OAOxB,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ declare global {
2
+ interface HTMLElementTagNameMap {
3
+ "usa-button": USAButtonElement;
4
+ }
5
+ }
6
+ export declare const BUTTON_VARIANTS: readonly ["primary", "secondary", "cool", "warm", "outline"];
7
+ export type ButtonVariant = (typeof BUTTON_VARIANTS)[number];
8
+ export declare class USAButtonElement extends HTMLElement {
9
+ #private;
10
+ static formAssociated: boolean;
11
+ accessor type: "button" | "submit" | "reset";
12
+ accessor disabled: boolean;
13
+ accessor variant: ButtonVariant;
14
+ onKeyDown(e: KeyboardEvent): void;
15
+ onInternalClick(): void;
16
+ attributeChangedCallback(): void;
17
+ }
@@ -0,0 +1,259 @@
1
+ import { __classPrivateFieldGet, __classPrivateFieldSet, __esDecorate, __runInitializers, __setFunctionName } from "tslib";
2
+ import { attr, css, element, html, listen, query } from "@joist/element";
3
+ export const BUTTON_VARIANTS = [
4
+ "primary",
5
+ "secondary",
6
+ "cool",
7
+ "warm",
8
+ "outline",
9
+ ];
10
+ let USAButtonElement = (() => {
11
+ var _USAButtonElement_instances, _USAButtonElement_internals, _USAButtonElement_button, _USAButtonElement_handleForm, _USAButtonElement_type_accessor_storage, _USAButtonElement_disabled_accessor_storage, _USAButtonElement_variant_accessor_storage;
12
+ let _classDecorators = [element({
13
+ tagName: "usa-button",
14
+ shadowDom: [
15
+ css `
16
+ :host {
17
+ display: contents;
18
+ }
19
+
20
+ .usa-button {
21
+ box-sizing: border-box;
22
+ font-family:
23
+ Source Sans Pro Web,
24
+ Helvetica Neue,
25
+ Helvetica,
26
+ Roboto,
27
+ Arial,
28
+ sans-serif;
29
+ font-size: 1.06rem;
30
+ line-height: 0.9;
31
+ color: white;
32
+ background-color: #005ea2;
33
+ -webkit-appearance: none;
34
+ -moz-appearance: none;
35
+ appearance: none;
36
+ align-items: center;
37
+ border: 0;
38
+ border-radius: 0.25rem;
39
+ cursor: pointer;
40
+ -moz-column-gap: 0.5rem;
41
+ column-gap: 0.5rem;
42
+ display: inline-flex;
43
+ font-weight: 700;
44
+ justify-content: center;
45
+ padding: 0.75rem 1.25rem;
46
+ text-align: center;
47
+ text-decoration: none;
48
+ width: 100%;
49
+ cursor: pointer;
50
+ }
51
+
52
+ @media all and (min-width: 30em) {
53
+ .usa-button {
54
+ width: auto;
55
+ }
56
+ }
57
+
58
+ .usa-button:visited {
59
+ color: white;
60
+ }
61
+
62
+ .usa-button:hover {
63
+ color: white;
64
+ background-color: #1a4480;
65
+ border-bottom: 0;
66
+ text-decoration: none;
67
+ }
68
+
69
+ .usa-button:active {
70
+ color: white;
71
+ background-color: #162e51;
72
+ }
73
+
74
+ .usa-button:not([disabled]):focus {
75
+ outline-offset: 0.25rem;
76
+ }
77
+
78
+ .usa-button:disabled {
79
+ color: #454545;
80
+ background-color: #c9c9c9;
81
+ cursor: not-allowed;
82
+ opacity: 1;
83
+ }
84
+
85
+ .usa-button:disabled:hover,
86
+ .usa-button:disabled:active,
87
+ .usa-button:disabled:focus {
88
+ color: #454545;
89
+ background-color: #c9c9c9;
90
+ }
91
+
92
+ .usa-button:focus {
93
+ outline: 0.25rem solid #2491ff;
94
+ outline-offset: 0;
95
+ }
96
+
97
+ /** Secondary */
98
+ :host([variant="secondary"]) .usa-button {
99
+ color: #fff;
100
+ background-color: #d83933;
101
+ }
102
+
103
+ :host([variant="secondary"]) .usa-button:hover {
104
+ background-color: #b50909;
105
+ }
106
+
107
+ :host([variant="secondary"]) .usa-button:active {
108
+ background-color: #8b0a03;
109
+ }
110
+
111
+ /** cool */
112
+ :host([variant="cool"]) .usa-button {
113
+ color: #1b1b1b;
114
+ background-color: #00bde3;
115
+ }
116
+
117
+ :host([variant="cool"]) .usa-button:hover {
118
+ background-color: #28a0cb;
119
+ }
120
+
121
+ :host([variant="cool"]) .usa-button:active {
122
+ color: #fff;
123
+ background-color: #07648d;
124
+ }
125
+
126
+ /** warm */
127
+ :host([variant="warm"]) .usa-button {
128
+ color: #1b1b1b;
129
+ background-color: #fa9441;
130
+ }
131
+
132
+ :host([variant="warm"]) .usa-button:hover {
133
+ color: #fff;
134
+ background-color: #c05600;
135
+ }
136
+
137
+ :host([variant="warm"]) .usa-button:active {
138
+ color: #fff;
139
+ background-color: #775540;
140
+ }
141
+
142
+ /** outline */
143
+ :host([variant="outline"]) .usa-button {
144
+ background-color: transparent;
145
+ box-shadow: inset 0 0 0 2px #005ea2;
146
+ color: #005ea2;
147
+ }
148
+
149
+ :host([variant="outline"]) .usa-button:hover {
150
+ box-shadow: inset 0 0 0 2px #1a4480;
151
+ color: #1a4480;
152
+ }
153
+
154
+ :host([variant="outline"]) .usa-button:active {
155
+ box-shadow: inset 0 0 0 2px #162e51;
156
+ color: #162e51;
157
+ }
158
+ `,
159
+ html `
160
+ <button class="usa-button">
161
+ <slot></slot>
162
+ </button>
163
+ `,
164
+ ],
165
+ })];
166
+ let _classDescriptor;
167
+ let _classExtraInitializers = [];
168
+ let _classThis;
169
+ let _classSuper = HTMLElement;
170
+ let _instanceExtraInitializers = [];
171
+ let _type_decorators;
172
+ let _type_initializers = [];
173
+ let _type_extraInitializers = [];
174
+ let _disabled_decorators;
175
+ let _disabled_initializers = [];
176
+ let _disabled_extraInitializers = [];
177
+ let _variant_decorators;
178
+ let _variant_initializers = [];
179
+ let _variant_extraInitializers = [];
180
+ let _onKeyDown_decorators;
181
+ let _onInternalClick_decorators;
182
+ var USAButtonElement = _classThis = class extends _classSuper {
183
+ constructor() {
184
+ super(...arguments);
185
+ _USAButtonElement_instances.add(this);
186
+ _USAButtonElement_type_accessor_storage.set(this, (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _type_initializers, "button")));
187
+ _USAButtonElement_disabled_accessor_storage.set(this, (__runInitializers(this, _type_extraInitializers), __runInitializers(this, _disabled_initializers, false)));
188
+ _USAButtonElement_variant_accessor_storage.set(this, (__runInitializers(this, _disabled_extraInitializers), __runInitializers(this, _variant_initializers, "primary")));
189
+ _USAButtonElement_internals.set(this, (__runInitializers(this, _variant_extraInitializers), this.attachInternals()));
190
+ _USAButtonElement_button.set(this, query("button"));
191
+ }
192
+ get type() { return __classPrivateFieldGet(this, _USAButtonElement_type_accessor_storage, "f"); }
193
+ set type(value) { __classPrivateFieldSet(this, _USAButtonElement_type_accessor_storage, value, "f"); }
194
+ get disabled() { return __classPrivateFieldGet(this, _USAButtonElement_disabled_accessor_storage, "f"); }
195
+ set disabled(value) { __classPrivateFieldSet(this, _USAButtonElement_disabled_accessor_storage, value, "f"); }
196
+ get variant() { return __classPrivateFieldGet(this, _USAButtonElement_variant_accessor_storage, "f"); }
197
+ set variant(value) { __classPrivateFieldSet(this, _USAButtonElement_variant_accessor_storage, value, "f"); }
198
+ onKeyDown(e) {
199
+ if (this.type === "submit") {
200
+ if (e.key.toUpperCase() === "ENTER") {
201
+ __classPrivateFieldGet(this, _USAButtonElement_instances, "m", _USAButtonElement_handleForm).call(this);
202
+ }
203
+ }
204
+ }
205
+ onInternalClick() {
206
+ __classPrivateFieldGet(this, _USAButtonElement_instances, "m", _USAButtonElement_handleForm).call(this);
207
+ }
208
+ attributeChangedCallback() {
209
+ const button = __classPrivateFieldGet(this, _USAButtonElement_button, "f").call(this);
210
+ button.type = this.type;
211
+ button.disabled = this.disabled;
212
+ }
213
+ };
214
+ _USAButtonElement_internals = new WeakMap();
215
+ _USAButtonElement_button = new WeakMap();
216
+ _USAButtonElement_instances = new WeakSet();
217
+ _USAButtonElement_type_accessor_storage = new WeakMap();
218
+ _USAButtonElement_disabled_accessor_storage = new WeakMap();
219
+ _USAButtonElement_variant_accessor_storage = new WeakMap();
220
+ _USAButtonElement_handleForm = function _USAButtonElement_handleForm() {
221
+ const { form } = __classPrivateFieldGet(this, _USAButtonElement_internals, "f");
222
+ if (form) {
223
+ if (this.type === "submit") {
224
+ const btn = document.createElement("button");
225
+ btn.type = "submit";
226
+ form.append(btn);
227
+ btn.click();
228
+ btn.remove();
229
+ }
230
+ else if (this.type === "reset") {
231
+ form.reset();
232
+ }
233
+ }
234
+ };
235
+ __setFunctionName(_classThis, "USAButtonElement");
236
+ (() => {
237
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
238
+ _type_decorators = [attr()];
239
+ _disabled_decorators = [attr()];
240
+ _variant_decorators = [attr()];
241
+ _onKeyDown_decorators = [listen("keydown", () => document.body)];
242
+ _onInternalClick_decorators = [listen("click")];
243
+ __esDecorate(_classThis, null, _type_decorators, { kind: "accessor", name: "type", static: false, private: false, access: { has: obj => "type" in obj, get: obj => obj.type, set: (obj, value) => { obj.type = value; } }, metadata: _metadata }, _type_initializers, _type_extraInitializers);
244
+ __esDecorate(_classThis, null, _disabled_decorators, { kind: "accessor", name: "disabled", static: false, private: false, access: { has: obj => "disabled" in obj, get: obj => obj.disabled, set: (obj, value) => { obj.disabled = value; } }, metadata: _metadata }, _disabled_initializers, _disabled_extraInitializers);
245
+ __esDecorate(_classThis, null, _variant_decorators, { kind: "accessor", name: "variant", static: false, private: false, access: { has: obj => "variant" in obj, get: obj => obj.variant, set: (obj, value) => { obj.variant = value; } }, metadata: _metadata }, _variant_initializers, _variant_extraInitializers);
246
+ __esDecorate(_classThis, null, _onKeyDown_decorators, { kind: "method", name: "onKeyDown", static: false, private: false, access: { has: obj => "onKeyDown" in obj, get: obj => obj.onKeyDown }, metadata: _metadata }, null, _instanceExtraInitializers);
247
+ __esDecorate(_classThis, null, _onInternalClick_decorators, { kind: "method", name: "onInternalClick", static: false, private: false, access: { has: obj => "onInternalClick" in obj, get: obj => obj.onInternalClick }, metadata: _metadata }, null, _instanceExtraInitializers);
248
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
249
+ USAButtonElement = _classThis = _classDescriptor.value;
250
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
251
+ })();
252
+ _classThis.formAssociated = true;
253
+ (() => {
254
+ __runInitializers(_classThis, _classExtraInitializers);
255
+ })();
256
+ return USAButtonElement = _classThis;
257
+ })();
258
+ export { USAButtonElement };
259
+ //# sourceMappingURL=button.element.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"button.element.js","sourceRoot":"","sources":["../../../src/lib/button/button.element.ts"],"names":[],"mappings":"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"}