@codeforamerica/marcomms-design-system 1.0.0 → 1.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 (91) hide show
  1. package/package.json +2 -1
  2. package/src/components/accordion.js +141 -0
  3. package/src/components/accordion.stories.js +56 -0
  4. package/src/components/avatar.js +62 -0
  5. package/src/components/avatar.stories.js +27 -0
  6. package/src/components/banner.js +152 -0
  7. package/src/components/banner.stories.js +115 -0
  8. package/src/components/bar.js +102 -0
  9. package/src/components/bar.stories.js +22 -0
  10. package/src/components/blob.js +119 -0
  11. package/src/components/blob.stories.js +64 -0
  12. package/src/components/box.js +55 -0
  13. package/src/components/box.stories.js +24 -0
  14. package/src/components/breadcrumbs.js +80 -0
  15. package/src/components/breadcrumbs.stories.js +27 -0
  16. package/src/components/button.js +167 -0
  17. package/src/components/button.scss +162 -0
  18. package/src/components/button.stories.js +49 -0
  19. package/src/components/callout.js +62 -0
  20. package/src/components/callout.stories.js +20 -0
  21. package/src/components/card.js +403 -0
  22. package/src/components/card.stories.js +170 -0
  23. package/src/components/carousel.js +182 -0
  24. package/src/components/carousel.stories.js +61 -0
  25. package/src/components/cta.js +99 -0
  26. package/src/components/cta.stories.js +22 -0
  27. package/src/components/details.scss +71 -0
  28. package/src/components/details.stories.js +27 -0
  29. package/src/components/flexible-layout.js +126 -0
  30. package/src/components/flexible-layout.stories.js +48 -0
  31. package/src/components/form-elements.scss +305 -0
  32. package/src/components/form-elements.stories.js +134 -0
  33. package/src/components/icon.js +41 -0
  34. package/src/components/icon.scss +31 -0
  35. package/src/components/icon.stories.js +16 -0
  36. package/src/components/label.js +63 -0
  37. package/src/components/label.stories.js +29 -0
  38. package/src/components/link-list.scss +80 -0
  39. package/src/components/link-list.stories.js +52 -0
  40. package/src/components/loader.scss +24 -0
  41. package/src/components/loader.stories.js +12 -0
  42. package/src/components/logo-card.js +93 -0
  43. package/src/components/logo-card.stories.js +48 -0
  44. package/src/components/nav.js +99 -0
  45. package/src/components/nav.stories.js +40 -0
  46. package/src/components/page-nav.js +171 -0
  47. package/src/components/page-nav.stories.js +112 -0
  48. package/src/components/pager.js +98 -0
  49. package/src/components/pager.stories.js +30 -0
  50. package/src/components/pagination.js +116 -0
  51. package/src/components/pagination.stories.js +30 -0
  52. package/src/components/person-card.js +240 -0
  53. package/src/components/person-card.stories.js +58 -0
  54. package/src/components/pill.js +33 -0
  55. package/src/components/pill.stories.js +23 -0
  56. package/src/components/promo.js +83 -0
  57. package/src/components/promo.stories.js +37 -0
  58. package/src/components/pullquote.js +42 -0
  59. package/src/components/pullquote.stories.js +16 -0
  60. package/src/components/quote.js +84 -0
  61. package/src/components/quote.stories.js +23 -0
  62. package/src/components/reveal.js +83 -0
  63. package/src/components/reveal.stories.js +40 -0
  64. package/src/components/slide.js +121 -0
  65. package/src/components/slide.stories.js +53 -0
  66. package/src/components/social-icon.js +233 -0
  67. package/src/components/social-icon.stories.js +36 -0
  68. package/src/components/stat.js +92 -0
  69. package/src/components/stat.stories.js +28 -0
  70. package/src/components/tab-list.js +114 -0
  71. package/src/components/tab-list.stories.js +18 -0
  72. package/src/components/tab.js +95 -0
  73. package/src/components/tab.stories.js +29 -0
  74. package/src/components/tile.js +150 -0
  75. package/src/components/tile.stories.js +41 -0
  76. package/src/components/transcript.js +44 -0
  77. package/src/components/transcript.stories.js +167 -0
  78. package/src/core/_base.scss +86 -0
  79. package/src/core/_grid.scss +295 -0
  80. package/src/core/_helpers.scss +111 -0
  81. package/src/core/_layout.scss +79 -0
  82. package/src/core/_reset.scss +53 -0
  83. package/src/core/_tokens.scss +251 -0
  84. package/src/core/_typography.scss +426 -0
  85. package/src/core/_wordpress.scss +27 -0
  86. package/src/core/colors.mdx +100 -0
  87. package/src/core/typography.mdx +66 -0
  88. package/src/shared/common.js +15 -0
  89. package/src/shared/layout.js +14 -0
  90. package/src/shared/typography.js +111 -0
  91. package/src/styles.scss +16 -0
@@ -0,0 +1,150 @@
1
+ import { LitElement, html, css, nothing } from "lit";
2
+ import { commonStyles } from "../shared/common.js";
3
+ import { typographyStyles } from "../shared/typography.js";
4
+ import "./blob";
5
+ import "./icon";
6
+
7
+ class Tile extends LitElement {
8
+ static properties = {
9
+ title: { type: String },
10
+ description: { type: String },
11
+ actionLabel: { type: String },
12
+ linkUrl: { type: String },
13
+ linkTarget: { type: String },
14
+ imageUrl: { type: String },
15
+ imageThumbnailUrl: { type: String },
16
+ imageAltText: { type: String },
17
+ };
18
+ static styles = [
19
+ commonStyles,
20
+ typographyStyles,
21
+ css`
22
+ :host {
23
+ --bg-color: var(--white);
24
+ --title-color: var(--purple-60);
25
+ --text-color: var(--black);
26
+ --action-label-color: var(--purple-80);
27
+ --action-label-hover-highlight: var(--purple-20);
28
+ --blob-color: var(--purple-20);
29
+
30
+ align-items: stretch;
31
+ display: flex;
32
+ text-align: center;
33
+ width: 100%;
34
+ }
35
+
36
+ .tile {
37
+ background-color: var(--bg-color);
38
+ border-radius: var(--spacing-component-2);
39
+ border: var(--hairline) solid var(--black-20);
40
+ color: var(--text-color);
41
+ display: flex;
42
+ flex-direction: column;
43
+ max-width: var(--column-span-6);
44
+ padding: var(--spacing-component-4);
45
+ text-decoration: none;
46
+ transition:
47
+ box-shadow 0.5s ease-in-out,
48
+ border-color 0.5s ease-in-out;
49
+ width: 100%;
50
+ }
51
+
52
+ a.tile:hover {
53
+ box-shadow: var(--shadow-medium);
54
+ border-color: rgba(0, 0, 0, 0);
55
+ }
56
+
57
+ picture {
58
+ display: grid;
59
+ place-items: center;
60
+ padding-block-end: var(--spacing-layout-1);
61
+ }
62
+
63
+ picture > * {
64
+ height: var(--spacing-layout-4);
65
+ grid-area: 1 / 1;
66
+ }
67
+
68
+ cfa-blob {
69
+ transition: scale 0.5s ease-in-out;
70
+ }
71
+
72
+ a.tile:hover cfa-blob {
73
+ scale: 1.2;
74
+ }
75
+
76
+ img {
77
+ object-fit: contain;
78
+ z-index: 2;
79
+ }
80
+
81
+ .title {
82
+ color: var(--title-color);
83
+ }
84
+
85
+ .label {
86
+ color: var(--action-label-color);
87
+ display: inline-block;
88
+ margin-block-start: auto;
89
+ padding-block-start: var(--spacing-layout-half);
90
+ }
91
+ `,
92
+ ];
93
+ tileContentTemplate() {
94
+ return html`
95
+ ${this.imageUrl
96
+ ? html`
97
+ <picture>
98
+ <cfa-blob></cfa-blob>
99
+ <img
100
+ src="${this.imageUrl}"
101
+ alt="${this.imageAltText}"
102
+ load="lazy"
103
+ />
104
+ </picture>
105
+ `
106
+ : nothing}
107
+
108
+ <div class="title h3">${this.title}</div>
109
+
110
+ <!-- Description -->
111
+ ${this.description
112
+ ? html` <p class="small">${this.description}</p> `
113
+ : nothing}
114
+
115
+ <!-- Action label -->
116
+ ${this.actionLabel
117
+ ? html`
118
+ <div class="label small strong">
119
+ ${this.actionLabel}&nbsp;<cfa-icon>arrow_forward</cfa-icon>
120
+ </div>
121
+ `
122
+ : nothing}
123
+ `;
124
+ }
125
+ render() {
126
+ return html`
127
+ <style>
128
+ cfa-blob {
129
+ --color: var(--blob-color);
130
+ }
131
+ </style>
132
+ ${this.linkUrl
133
+ ? html`
134
+ <a
135
+ href="${this.linkUrl}"
136
+ target="${this.linkTarget}"
137
+ rel="${this.linkTarget == "_blank" ? "noopener" : nothing}"
138
+ class="tile"
139
+ >
140
+ ${this.tileContentTemplate()}
141
+ </a>
142
+ `
143
+ : html` <div class="tile">${this.tileContentTemplate()}</div> `}
144
+ `;
145
+ }
146
+ }
147
+
148
+ if (!customElements.get("cfa-tile")) {
149
+ customElements.define("cfa-tile", Tile);
150
+ }
@@ -0,0 +1,41 @@
1
+ import { html } from "lit-html";
2
+ import "./tile.js";
3
+
4
+ export default {
5
+ title: "Molecules/Tile",
6
+ argTypes: {},
7
+ };
8
+
9
+ const Template = ({
10
+ title,
11
+ description,
12
+ imageUrl,
13
+ imageAltText,
14
+ linkUrl,
15
+ linkTarget,
16
+ actionLabel,
17
+ }) => html`
18
+ <cfa-tile
19
+ title="${title}"
20
+ description="${description}"
21
+ imageUrl="${imageUrl}"
22
+ imageAltText="${imageAltText}"
23
+ linkUrl="${linkUrl}"
24
+ linkTarget="${linkTarget}"
25
+ actionLabel="${actionLabel}"
26
+ >
27
+ </cfa-tile>
28
+ `;
29
+
30
+ export const Default = Template.bind({});
31
+ Default.args = {
32
+ title: "Build equitable systems",
33
+ description:
34
+ "Government services should lead to outcomes that are just and equitable",
35
+ imageUrl: "https://files.codeforamerica.org/2021/05/28124726/equity.svg",
36
+ imageAltText:
37
+ "Icon representing equity, with three people of different heights and the two shorter people standing on a box to be the same height as the tallest person",
38
+ linkUrl: "#",
39
+ linkTarget: "_blank",
40
+ actionLabel: "Learn more",
41
+ };
@@ -0,0 +1,44 @@
1
+ import { LitElement, html, css } from "lit";
2
+ import { commonStyles } from "../shared/common.js";
3
+ import { typographyStyles } from "../shared/typography.js";
4
+
5
+ class Transcript extends LitElement {
6
+ static styles = [
7
+ commonStyles,
8
+ typographyStyles,
9
+ css`
10
+ :host {
11
+ --label-color: var(--purple-60);
12
+
13
+ display: block;
14
+ max-width: var(--column-span-8);
15
+ }
16
+
17
+ .label {
18
+ --text-color: var(--label-color);
19
+ }
20
+
21
+ .text {
22
+ background-color: var(--white);
23
+ border: var(--hairline) solid var(--black-20);
24
+ color: var(--black);
25
+ height: calc(12 * var(--spacing-layout-1));
26
+ overflow: auto;
27
+ padding: var(--spacing-component-3);
28
+ }
29
+ `,
30
+ ];
31
+
32
+ render() {
33
+ return html`
34
+ <div class="label eyebrow-with-line">Transcript</div>
35
+ <div class="text">
36
+ <slot />
37
+ </div>
38
+ `;
39
+ }
40
+ }
41
+
42
+ if (!customElements.get("cfa-transcript")) {
43
+ customElements.define("cfa-transcript", Transcript);
44
+ }
@@ -0,0 +1,167 @@
1
+ import { html } from "lit-html";
2
+ import "./transcript";
3
+
4
+ export default {
5
+ title: "Molecules/Transcript",
6
+ argTypes: {},
7
+ };
8
+
9
+ const Template = () => html`
10
+ <cfa-transcript>
11
+ <p>00:00</p>
12
+ <p>
13
+ My dad’s first lesson to me was, “Look people in the eye, mi hija, make
14
+ sure people see you and you see them.” He has been a proud janitor, farm
15
+ worker, shoe shiner, home builder and small business owner. He has seen
16
+ the world from so many different lenses and has lots of stories to tell.
17
+ But there’s one I’ve never been able to get out of my head. A story when
18
+ my dad was a young kid.
19
+ </p>
20
+ <p>00:27</p>
21
+ <p>
22
+ He and my tio Milo knew exactly when the trucks would come in. Under the
23
+ freeway, just as the sun set, they jumped the fence to get into the dump.
24
+ And as they waited for the trucks, they’d make bets on who would find the
25
+ best food. An uneaten apple they could clean, a perfect banana, sometimes
26
+ a candy bar or a wrapped sandwich. And then they’d grab whatever they
27
+ could find, and save the very best to bring home to their even younger
28
+ brothers and sisters.
29
+ </p>
30
+ <p>01:00</p>
31
+ <p>
32
+ I hate that story. But I share it because we can’t solve what we can’t
33
+ see.
34
+ </p>
35
+ <p>01:10</p>
36
+ <p>
37
+ In 1936, this image of the migrant mother captured the living conditions
38
+ in the West, showing lawmakers what people were going through. After it
39
+ published, the United States government sent 20,000 pounds of food, and
40
+ that image solidified support for the very first safety-net programs in
41
+ America. Yet still today, more than 37 million Americans are still living
42
+ in poverty. One in six kids.
43
+ </p>
44
+ <p>01:37</p>
45
+ <p>
46
+ As a student of economics and a career public servant, I know we’ve been
47
+ at this for a long time. But it’s my work today that has given me the hope
48
+ that we can finally end poverty as we know it. And here’s why. Right now,
49
+ there are 80 public benefit programs all across the country, intended to
50
+ provide critical anti-poverty resources. Yet an estimated 60 billion
51
+ dollars in benefits go unclaimed every year. Sixty billion. I believe, in
52
+ large part, due to complicated, outdated systems that weren’t designed to
53
+ see the people they serve.
54
+ </p>
55
+ <p>02:13</p>
56
+ <p>
57
+ I want you to imagine for a moment that you lost your job, and you don’t
58
+ know how you’re going to put food on the table. But you hear about this
59
+ government program that can help. And you begin the process of applying.
60
+ The first thing you realize is you can’t do it on the only online
61
+ connection you have, your phone, because the only way to apply online is
62
+ through a desktop computer. So you head to the community library, you go
63
+ through screen after screen, answering close to 200 questions, wading
64
+ through confusing instructions. It feels a little bit like a game of
65
+ gotcha, except your benefits are at risk. Now, if you’re from a place like
66
+ my hometown, a small rural farming town, there isn’t an easily accessible
67
+ public venue with desktop computers. So you have to find a ride to the
68
+ nearest social services office, maybe 30 miles away. When you get there,
69
+ you have to walk through metal detectors with two security guards, past a
70
+ long table of scattered paper forms into the main waiting room. It’s loud,
71
+ and there’s a long line leading to that service counter. When you get to
72
+ the front of it, you’re met with a thick, clouded sheet of bulletproof
73
+ glass separating you from someone who could finally help.
74
+ </p>
75
+ <p>03:31</p>
76
+ <p>
77
+ That has been the system in America for many communities like mine. So
78
+ it’s no wonder that 14 million Americans aren’t enrolled in child and food
79
+ nutrition programs, or that six million are missing health care benefits.
80
+ Technology has changed almost every aspect of our lives. It’s made things
81
+ faster, more efficient, automatic. We need to do the same for people
82
+ seeking benefits.
83
+ </p>
84
+ <p>03:56</p>
85
+ <p>
86
+ I work for an organization called Code for America. We deploy
87
+ human-centered technology, the kind that respects you from the start,
88
+ meets you where you are, provides an easy, positive experience. And our
89
+ research has shown there are four factors we need to overcome. First, we
90
+ know that far more people have access to the internet on their phone than
91
+ a desktop computer. So applications should be online and mobile-friendly.
92
+ Second, lots of people are falling off because the process is complicated.
93
+ So applications need to be simple and easy to use. Third, we know that
94
+ people who are eligible for one program, like food assistance, are pretty
95
+ likely to be eligible for another, like health care. So let’s combine
96
+ processes where we can. And finally, we know there are unseen heroes in
97
+ government — caseworkers, social workers — on the front lines, navigating
98
+ old systems. We can equip them with the data and tools to streamline their
99
+ efforts.
100
+ </p>
101
+ <p>04:56</p>
102
+ <p>
103
+ Here’s what California’s food assistance used to look like. 183 questions,
104
+ 51 pages of screens available only by desktop computer. We took that
105
+ application and redesigned it. This is GetCalFresh, a mobile-first
106
+ application available 24 hours a day in multiple languages, with chat
107
+ support.
108
+ </p>
109
+ <p>05:17</p>
110
+ <p>(Applause)</p>
111
+ <p>05:23</p>
112
+ <p>
113
+ California’s food assistance application went from one of the most complex
114
+ in the nation to being recognized as one of the easiest application
115
+ experiences of any state. For 10 years we had been working with multiple
116
+ states on projects just like that, showing the importance and potential of
117
+ digital delivery of benefits. And that’s when the pandemic hit. And these
118
+ images in West Valley, Utah; San Antonio, Texas; Pittsburgh, Pennsylvania.
119
+ Parking lots filled with families waiting for food. America could finally
120
+ see what we had been seeing for a decade. The growing number of people in
121
+ poverty and communities left out as a result of failing systems. Our phone
122
+ started ringing. From Washington to Maryland, we helped states distribute
123
+ 600 million dollars in benefits to kids in school lunch programs.
124
+ Louisiana used our best practices tools in notifying people. They
125
+ proactively sent out more than 40 million texts to residents on how to
126
+ access critical services. And in Minnesota, we developed an all-in-one
127
+ application for nine different safety-net benefits. That can be completed
128
+ in less than 14 minutes.
129
+ </p>
130
+ <p>06:41</p>
131
+ <p>(Applause)</p>
132
+ <p>06:47</p>
133
+ <p>
134
+ Nearly 200,000 people immediately applied in the first six months. And for
135
+ the first time ever, Minnesota’s system integrated to reach all sovereign
136
+ tribal nation members.
137
+ </p>
138
+ <p>06:58</p>
139
+ <p>(Applause)</p>
140
+ <p>07:02</p>
141
+ <p>
142
+ That’s what is possible, and this is the moment to keep going, redesigning
143
+ our safety net for a new time and a new age. And we can do it all across
144
+ the country, as governments reset.
145
+ </p>
146
+ <p>07:12</p>
147
+ <p>
148
+ Over the next seven years, we will partner to redesign systems to unlock
149
+ 30 billion dollars in benefits for 13 million eligible people in at least
150
+ 15 states. We will bring data scientists and engineers, technologists and
151
+ researchers together, sitting side by side with government teams. And our
152
+ Safety Net Innovation Lab will improve upon and share best practices so
153
+ that every government can benefit. Because at the heart of our audacious
154
+ goal is to show the world what’s possible when we use the best tools we
155
+ have today: human-centered technology and government. So that families
156
+ aren’t waiting in parking lots for resources. Or kids, growing up like my
157
+ dad, aren’t searching for food by whatever means possible. Then, then we
158
+ will see the true potential of every kid. And that’s the calling of this
159
+ moment to redesign our systems to see people, all people.
160
+ </p>
161
+ <p>08:23</p>
162
+ <p>Thank you.</p>
163
+ </cfa-transcript>
164
+ `;
165
+
166
+ export const Default = Template.bind({});
167
+ Default.args = {};
@@ -0,0 +1,86 @@
1
+ // Base
2
+
3
+ html {
4
+ color: var(--text-color);
5
+ font-family: var(--font-family-base);
6
+ font-size: var(--font-size-base);
7
+ font-weight: var(--font-weight-regular);
8
+ image-rendering: -webkit-optimize-contrast;
9
+ letter-spacing: var(--letter-spacing-base);
10
+ line-height: var(--line-height-base);
11
+ scroll-behavior: smooth;
12
+ scroll-padding-top: var(--spacing-layout-3);
13
+ text-underline-offset: var(--text-underline-offset);
14
+ }
15
+
16
+ body {
17
+ display: flex;
18
+ flex-direction: column;
19
+ min-height: 1vh;
20
+ }
21
+
22
+ body > main {
23
+ flex-grow: 1;
24
+ }
25
+
26
+ a {
27
+ color: var(--link-color);
28
+ text-decoration: underline;
29
+ text-decoration-thickness: var(--hairline);
30
+
31
+ &:hover {
32
+ color: var(--link-hover-color);
33
+ }
34
+ }
35
+
36
+ *:focus-visible,
37
+ *:target {
38
+ outline: var(--focus-outline);
39
+ position: relative;
40
+ }
41
+
42
+ // Color modes
43
+
44
+ [data-color-mode="dark"] {
45
+ --link-color: var(--white);
46
+ --link-hover-color: var(--white);
47
+
48
+ color: var(--white);
49
+ }
50
+
51
+ [data-color-mode="light"] {
52
+ --link-color: var(--link-color);
53
+ --link-hover-color: var(--link-hover-color);
54
+
55
+ color: var(--text-color);
56
+ }
57
+
58
+ // Fonts
59
+
60
+ @font-face {
61
+ font-family: 'Source Sans 3';
62
+ font-style: normal;
63
+ src: url('../static/fonts/SourceSans3.woff2') format('woff2');
64
+ }
65
+
66
+ @font-face {
67
+ font-family: 'Source Sans 3';
68
+ font-style: italic;
69
+ src: url('../static/fonts/SourceSans3-Italic.woff2') format('woff2');
70
+ }
71
+
72
+ @font-face {
73
+ font-family: 'Source Serif 4';
74
+ font-style: normal;
75
+ src: url('../static/fonts/SourceSerif4.woff2') format('woff2');
76
+ }
77
+
78
+ @font-face {
79
+ font-family: 'Source Serif 4';
80
+ font-style: italic;
81
+ src: url('../static/fonts/SourceSerif4-Italic.woff2') format('woff2');
82
+ }
83
+
84
+ // Outlines
85
+
86
+ $highlight-outline: var(--medium) solid var(--yellow-40);