@salesforcedevs/arch-components 1.20.17-alpha8 → 1.25.0

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 (158) hide show
  1. package/LICENSE +12 -0
  2. package/lwc.config.json +42 -3
  3. package/package.json +36 -46
  4. package/src/assets/css/arch-variables.css +512 -0
  5. package/src/modules/arch/badge/badge.css +22 -0
  6. package/src/modules/arch/badge/badge.html +5 -0
  7. package/src/modules/arch/badge/badge.ts +9 -0
  8. package/src/modules/arch/button/button.css +1 -0
  9. package/src/modules/arch/button/button.html +20 -0
  10. package/src/modules/arch/button/button.ts +67 -0
  11. package/src/modules/arch/buttonLink/buttonLink.css +1 -0
  12. package/src/modules/arch/buttonLink/buttonLink.html +19 -0
  13. package/src/modules/arch/buttonLink/buttonLink.stories.js +34 -0
  14. package/src/modules/arch/buttonLink/buttonLink.ts +8 -0
  15. package/src/modules/arch/buttonStyles/buttonStyles.css +220 -0
  16. package/src/modules/arch/card/card.css +128 -0
  17. package/src/modules/arch/card/card.html +85 -0
  18. package/src/modules/arch/card/card.ts +277 -0
  19. package/src/modules/arch/cardBase/cardBase.css +11 -0
  20. package/src/modules/arch/cardBase/cardBase.html +2 -0
  21. package/src/modules/arch/cardGridA/cardGridA.css +11 -0
  22. package/src/modules/arch/cardGridA/cardGridA.html +21 -0
  23. package/src/modules/arch/cardGridA/cardGridA.stories.js +118 -0
  24. package/src/modules/arch/cardGridA/cardGridA.ts +24 -0
  25. package/src/modules/arch/cardGridC/cardGridC.css +24 -0
  26. package/src/modules/arch/cardGridC/cardGridC.html +22 -0
  27. package/src/modules/arch/cardGridC/cardGridC.stories.js +51 -0
  28. package/src/modules/arch/cardGridC/cardGridC.ts +11 -0
  29. package/src/modules/arch/cardGridD/cardGridD.css +17 -0
  30. package/src/modules/arch/cardGridD/cardGridD.html +20 -0
  31. package/src/modules/arch/cardGridD/cardGridD.stories.js +43 -0
  32. package/src/modules/arch/cardGridD/cardGridD.ts +7 -0
  33. package/src/modules/arch/cardNew/cardNew.css +31 -0
  34. package/src/modules/arch/cardNew/cardNew.html +32 -0
  35. package/src/modules/arch/cardNew/cardNew.ts +66 -0
  36. package/src/modules/arch/children/children.html +2 -0
  37. package/src/modules/arch/children/children.ts +31 -0
  38. package/src/modules/arch/color/color.ts +59 -0
  39. package/src/modules/arch/content/__fixtures__/index.ts +884 -0
  40. package/src/modules/arch/content/content.css +643 -0
  41. package/src/modules/arch/content/content.html +65 -0
  42. package/src/modules/arch/content/content.stories.js +21 -0
  43. package/src/modules/arch/content/content.ts +169 -0
  44. package/src/modules/arch/contentIcon/contentIcon.css +48 -0
  45. package/src/modules/arch/contentIcon/contentIcon.html +15 -0
  46. package/src/modules/arch/contentIcon/contentIcon.stories.js +130 -0
  47. package/src/modules/arch/contentIcon/contentIcon.ts +68 -0
  48. package/src/{common → modules/arch}/context/context.ts +21 -19
  49. package/src/modules/arch/contextAdapter/constants.ts +1 -0
  50. package/src/modules/arch/contextAdapter/contextAdapter.ts +54 -0
  51. package/src/modules/arch/debounce/debounce.ts +32 -0
  52. package/src/modules/arch/dialog/dialog.ts +154 -0
  53. package/src/modules/arch/dialogStyles/dialogStyles.css +90 -0
  54. package/src/modules/arch/effectAdapter/effectAdapter.html +1 -0
  55. package/src/modules/arch/effectAdapter/effectAdapter.ts +28 -0
  56. package/src/modules/arch/explorer/explorer.css +301 -0
  57. package/src/modules/arch/explorer/explorer.html +418 -0
  58. package/src/modules/arch/explorer/explorer.ts +718 -0
  59. package/src/modules/arch/explorer/types.d.ts +60 -0
  60. package/src/modules/arch/fetch/fetch.ts +55 -0
  61. package/src/modules/arch/footerMfe/footerMfe.html +3 -0
  62. package/src/modules/arch/footerMfe/footerMfe.ts +19 -0
  63. package/src/modules/arch/gallery/gallery.css +365 -0
  64. package/src/modules/arch/gallery/gallery.html +71 -0
  65. package/src/modules/arch/gallery/gallery.ts +366 -0
  66. package/src/modules/arch/gallery/types.d.ts +35 -0
  67. package/src/modules/arch/heading/heading.css +1 -0
  68. package/src/modules/arch/heading/heading.html +9 -0
  69. package/src/modules/arch/heading/heading.ts +36 -0
  70. package/src/modules/arch/helpers/helpers.ts +141 -0
  71. package/src/modules/arch/heroA/heroA.css +116 -0
  72. package/src/modules/arch/heroA/heroA.html +28 -0
  73. package/src/modules/arch/heroA/heroA.stories.js +60 -0
  74. package/src/modules/arch/heroA/heroA.ts +53 -0
  75. package/src/modules/arch/heroB/heroB.css +79 -0
  76. package/src/modules/arch/heroB/heroB.html +27 -0
  77. package/src/modules/arch/heroB/heroB.stories.js +55 -0
  78. package/src/modules/arch/heroB/heroB.ts +26 -0
  79. package/src/modules/arch/i18n/i18n.ts +78 -0
  80. package/src/modules/arch/icon/icon.css +28 -0
  81. package/src/modules/arch/icon/icon.html +17 -0
  82. package/src/modules/arch/icon/icon.stories.js +26 -0
  83. package/src/modules/arch/icon/icon.ts +92 -0
  84. package/src/modules/arch/instrumentation/instrumentation.css +1 -0
  85. package/src/modules/arch/instrumentation/instrumentation.html +1 -0
  86. package/src/modules/arch/instrumentation/instrumentation.ts +113 -0
  87. package/src/modules/arch/labels/helpers.ts +25 -0
  88. package/src/modules/arch/labels/pointHelpers.ts +47 -0
  89. package/src/modules/arch/labels/timeHelpers.ts +182 -0
  90. package/src/modules/arch/labels/types.d.ts +5 -0
  91. package/src/modules/arch/logger/logger.ts +33 -0
  92. package/src/modules/arch/menu/menu.ts +260 -0
  93. package/src/modules/arch/overflow/overflow.ts +71 -0
  94. package/src/modules/arch/page/page.css +3 -0
  95. package/src/modules/arch/page/page.html +3 -0
  96. package/src/modules/arch/page/page.stories.js +19 -0
  97. package/src/modules/arch/page/page.ts +3 -0
  98. package/src/modules/arch/pageHeaderA/pageHeaderA.css +82 -0
  99. package/src/modules/arch/pageHeaderA/pageHeaderA.html +24 -0
  100. package/src/modules/arch/pageHeaderA/pageHeaderA.stories.js +25 -0
  101. package/src/modules/arch/pageHeaderA/pageHeaderA.ts +51 -0
  102. package/src/modules/arch/pill/pill.css +70 -0
  103. package/src/modules/arch/pill/pill.html +17 -0
  104. package/src/modules/arch/pill/pill.ts +34 -0
  105. package/src/modules/arch/polling-request.ts +97 -0
  106. package/src/modules/arch/reflectedElement/reflectedElement.html +2 -0
  107. package/src/{common → modules/arch}/reflectedElement/reflectedElement.ts +5 -3
  108. package/src/modules/arch/reset/reset.css +39 -0
  109. package/src/modules/arch/searchList/searchList.css +120 -0
  110. package/src/modules/arch/searchList/searchList.html +46 -0
  111. package/src/modules/arch/searchList/searchList.ts +53 -0
  112. package/src/modules/arch/sectionA/sectionA.css +64 -0
  113. package/src/modules/arch/sectionA/sectionA.html +21 -0
  114. package/src/modules/arch/sectionA/sectionA.stories.js +25 -0
  115. package/src/modules/arch/sectionA/sectionA.ts +27 -0
  116. package/src/modules/arch/select/select.css +40 -0
  117. package/src/modules/arch/select/select.html +24 -0
  118. package/src/modules/arch/select/select.ts +64 -0
  119. package/src/modules/arch/socialShare/socialShare.css +50 -0
  120. package/src/modules/arch/socialShare/socialShare.html +56 -0
  121. package/src/modules/arch/socialShare/socialShare.ts +29 -0
  122. package/src/modules/arch/spinner/spinner.css +195 -0
  123. package/src/modules/arch/spinner/spinner.html +9 -0
  124. package/src/modules/arch/spinner/spinner.ts +15 -0
  125. package/src/modules/arch/styles/styles.css +24 -0
  126. package/src/modules/arch/summary/summary.css +134 -0
  127. package/src/modules/arch/summary/summary.html +71 -0
  128. package/src/modules/arch/summary/summary.stories.js +163 -0
  129. package/src/modules/arch/summary/summary.ts +96 -0
  130. package/src/modules/arch/tab/tab.css +3 -0
  131. package/src/modules/arch/tab/tab.html +5 -0
  132. package/src/modules/arch/tab/tab.ts +46 -0
  133. package/src/modules/arch/tabset/tabset.css +112 -0
  134. package/src/modules/arch/tabset/tabset.html +62 -0
  135. package/src/modules/arch/tabset/tabset.ts +244 -0
  136. package/src/modules/arch/testutils.ts +118 -0
  137. package/src/modules/arch/threeCardGrid/threeCardGrid.css +6 -0
  138. package/src/modules/arch/threeCardGrid/threeCardGrid.html +5 -0
  139. package/src/modules/arch/threeCardGrid/threeCardGrid.ts +3 -0
  140. package/src/modules/arch/track/track.ts +23 -0
  141. package/src/modules/arch/trailhead.ts +120 -0
  142. package/src/modules/arch/types.d.ts +1 -0
  143. package/src/modules/arch/useEffectAttr.ts +16 -0
  144. package/src/modules/arch/utils/utils.ts +20 -0
  145. package/src/modules/arch/withState.ts +21 -0
  146. package/src/modules/arch/xsfMfeEvents/xsfMfeEvents.html +1 -0
  147. package/src/modules/arch/xsfMfeEvents/xsfMfeEvents.ts +47 -0
  148. package/src/common/effectAdapter/__tests__/effectAdapter.test.ts +0 -12
  149. package/src/common/effectAdapter/effectAdapter.ts +0 -18
  150. package/src/common/reflectedElement/__tests__/modules/test/select/select.html +0 -3
  151. package/src/common/reflectedElement/__tests__/modules/test/select/select.ts +0 -7
  152. package/src/common/reflectedElement/__tests__/modules/test/selectTransform/selectTransform.html +0 -3
  153. package/src/common/reflectedElement/__tests__/modules/test/selectTransform/selectTransform.ts +0 -18
  154. package/src/common/reflectedElement/__tests__/reflectedElement.test.ts +0 -75
  155. package/src/common/slot/__tests__/slot.test.ts +0 -96
  156. package/src/common/slot/slot.ts +0 -20
  157. /package/src/{common → modules/arch}/context/context.html +0 -0
  158. /package/src/{common/effectAdapter/effectAdapter.html → modules/arch/contextAdapter/contextAdapter.html} +0 -0
@@ -0,0 +1,277 @@
1
+ import { api, track, LightningElement } from "lwc";
2
+
3
+ import { track as analyticsTrack } from "arch/instrumentation";
4
+ import { sendInteractionEvent, InteractionEventTypes } from "arch/helpers";
5
+
6
+ export type CardAttribute = string | null;
7
+
8
+ export type CardImageVariant =
9
+ | "top-cover"
10
+ | "top-small"
11
+ | "left-small"
12
+ | "left-cover"
13
+ | "right-cover";
14
+
15
+ export type Card = {
16
+ assistiveText: CardAttribute;
17
+ ctaHref: CardAttribute;
18
+ ctaTarget: CardAttribute;
19
+ ctaTitle: CardAttribute;
20
+ description: CardAttribute;
21
+ imgSrc: CardAttribute;
22
+ pretitle: CardAttribute;
23
+ pretitleHref: CardAttribute;
24
+ pretitleHrefText: CardAttribute;
25
+ title: CardAttribute;
26
+ productArea: CardAttribute;
27
+ date: CardAttribute;
28
+ level: CardAttribute;
29
+ };
30
+
31
+ const widths = [820, 640, 320, 75];
32
+
33
+ const homepageCtaTitles = ["design", "deliver", "govern", "roadmap"];
34
+
35
+ // arch-card-grid taks care of adjusting the grid to the correct number
36
+ // of columns at smaller view ports
37
+ export const mediaQuerySnapToTop = window.matchMedia(`(max-width: 500px)`);
38
+
39
+ export default class extends LightningElement {
40
+ @api assistiveText: CardAttribute = null;
41
+ @api ctaHref: CardAttribute = null;
42
+ @api ctaTarget: CardAttribute = null;
43
+ @api ctaTitle: CardAttribute = null;
44
+ @api description: CardAttribute = null;
45
+ @api imgAspect: CardAttribute = null;
46
+ @api imgSrc: CardAttribute = null;
47
+ @api imgVariant: CardImageVariant = "top-cover";
48
+ @api pretitle: CardAttribute = null;
49
+ @api pretitleHref: CardAttribute = null;
50
+ @api pretitleHrefText: CardAttribute = null;
51
+ @api title: string = "";
52
+ @api productArea: string = "";
53
+ @api date: string = "";
54
+ @api level: string = "";
55
+
56
+ @track private snapToTop = mediaQuerySnapToTop.matches;
57
+ private cardId: string = "";
58
+
59
+ private get imgStyle() {
60
+ if (!this.imgSrc) {
61
+ return "";
62
+ }
63
+ const style: string[] = [];
64
+ const { imgVariantResponsive: variant, imgSrc } = this;
65
+
66
+ if (variant.includes("cover")) {
67
+ const image = imgSrc;
68
+
69
+ // Use the original image if it's a remote image or WebP
70
+ /* if (!this.isRemoteImage && !imgSrc.includes('webp')) {
71
+ const imgType = imgSrc.split('.').pop();
72
+ image = imgSrc.replace(`.${imgType}`, '-820w.webp');
73
+ } */
74
+
75
+ style.push(`background-image: url(${image})`);
76
+ }
77
+ if (variant === "top-cover") {
78
+ style.push(`padding-top: ${this.imgAspect || "40%"}`);
79
+ }
80
+ return style.join(";");
81
+ }
82
+
83
+ private get imgTag() {
84
+ return this.imgVariant.includes("small");
85
+ }
86
+
87
+ private get isRemoteImage() {
88
+ return /^(https?:\/\/|\/\/)/i.test(this.imgSrc);
89
+ }
90
+
91
+ private get imgSrcSetWebP() {
92
+ if (this.isRemoteImage) {
93
+ return this.imgSrc;
94
+ }
95
+ const imgType = this.imgSrc?.split(".").pop();
96
+ const imgName = this.imgSrc?.replace(`.${imgType}`, "");
97
+ const srcSet: string[] = [];
98
+ widths.forEach((width) => {
99
+ srcSet.push(`${imgName}-${width}w.webp ${width}w`);
100
+ });
101
+ return srcSet.join(",");
102
+ }
103
+
104
+ private get imgSrcSetJpg() {
105
+ if (this.isRemoteImage) {
106
+ return this.imgSrc;
107
+ }
108
+ const imgType = this.imgSrc?.split(".").pop();
109
+ const imgName = this.imgSrc?.replace(`.${imgType}`, "");
110
+ const srcSet: string[] = [];
111
+ widths.forEach((width) => {
112
+ srcSet.push(`${imgName}-${width}w.jpg ${width}w`);
113
+ });
114
+ return srcSet.join(",");
115
+ }
116
+
117
+ private get imgTagNoSvg() {
118
+ return this.imgTag && !this.imgSrc?.toLowerCase().endsWith("svg");
119
+ }
120
+
121
+ private get imgTagSvg() {
122
+ return this.imgTag && this.imgSrc?.toLowerCase().endsWith("svg");
123
+ }
124
+
125
+ private get rel() {
126
+ return this.ctaTarget === "_blank" ? "noopener" : "";
127
+ }
128
+
129
+ get isExternalHref() {
130
+ return this.ctaTarget === "_blank" && this.ctaTitle;
131
+ }
132
+
133
+ private get imgVariantResponsive() {
134
+ if (!this.snapToTop) {
135
+ return this.imgVariant;
136
+ }
137
+ return String(this.imgVariant).replace(/left|right/, "top");
138
+ }
139
+
140
+ // Accessibility getters
141
+ get cardTitleId() {
142
+ return `${this.cardId}-title`;
143
+ }
144
+
145
+ get ctaTitleId() {
146
+ return `${this.cardId}-cta`;
147
+ }
148
+
149
+ get imageDivId() {
150
+ return `${this.cardId}-image-div`;
151
+ }
152
+
153
+ get imageImgId() {
154
+ return `${this.cardId}-image-img`;
155
+ }
156
+
157
+ get imageSvgId() {
158
+ return `${this.cardId}-image-svg`;
159
+ }
160
+
161
+ get imageAriaLabel() {
162
+ const title = this.title || "Card";
163
+ const description = this.description || "";
164
+ return `View ${title}${description ? `: ${description}` : ""}`;
165
+ }
166
+
167
+ get imageAltText() {
168
+ return this.description || this.title || "Card image";
169
+ }
170
+
171
+ connectedCallback() {
172
+ mediaQuerySnapToTop.addListener(this.onMediaQuerySnapToTop);
173
+ // Generate unique ID for this card instance
174
+ const title = this.title || "Card";
175
+ this.cardId = `${title}-${Math.random().toString(36).substring(2, 11)}`;
176
+ }
177
+
178
+ disconnectedCallback() {
179
+ mediaQuerySnapToTop.removeListener(this.onMediaQuerySnapToTop);
180
+ }
181
+
182
+ private onImageClick(e: MouseEvent) {
183
+ const element = e.target as HTMLElement;
184
+ sendInteractionEvent(
185
+ "Card Image Click",
186
+ InteractionEventTypes.IMAGE_CLICK,
187
+ e,
188
+ element
189
+ );
190
+
191
+ const { ctaHref, ctaTarget } = this;
192
+ if (ctaHref) {
193
+ if (ctaTarget) {
194
+ window.open(ctaHref, ctaTarget);
195
+ } else {
196
+ window.location.href = ctaHref;
197
+ }
198
+ }
199
+ this.trackLinkClick(e, true);
200
+ }
201
+
202
+ private trackLinkClick(e: MouseEvent, imgClick: boolean) {
203
+ const element = e.currentTarget as HTMLAnchorElement;
204
+ const linkText = this.ctaTitle;
205
+ const title = typeof this.title === "string" ? this.title : "";
206
+ let event: string = "";
207
+ let payload: Record<string, string> = {};
208
+ if (!imgClick) {
209
+ sendInteractionEvent(
210
+ "Card Link Click",
211
+ InteractionEventTypes.CLICK,
212
+ e,
213
+ element
214
+ );
215
+ }
216
+
217
+ if (
218
+ window.location.pathname === "/" &&
219
+ homepageCtaTitles.includes(this.title.toLowerCase())
220
+ ) {
221
+ event = "homepage_cta";
222
+ payload = {
223
+ linkText: `home: ${linkText}`,
224
+ headingText: title,
225
+ itemLocation: "card"
226
+ };
227
+ } else {
228
+ event = "select_content";
229
+ payload = {
230
+ contentType: "card grid",
231
+ itemTitle: !title || title === "" ? undefined : title,
232
+ itemLocation: "card"
233
+ };
234
+ }
235
+ if (element.target) {
236
+ const parsedLink = new URL(element.href);
237
+ analyticsTrack(this.template.host, "custEv_outboundClick", {
238
+ clickText: title,
239
+ clickUrl: parsedLink.href
240
+ });
241
+ }
242
+ analyticsTrack(this.template.host, event, payload);
243
+ }
244
+
245
+ private onMediaQuerySnapToTop = (e: MediaQueryListEvent) => {
246
+ this.snapToTop = e.matches;
247
+ };
248
+
249
+ // Accessibility keyboard handlers
250
+ handleCardKeydown(e: KeyboardEvent) {
251
+ if (e.key === "Enter" || e.key === " ") {
252
+ this.trackLinkClick(e as unknown as MouseEvent, false);
253
+ e.preventDefault();
254
+ if (this.ctaHref) {
255
+ if (this.ctaTarget) {
256
+ window.open(this.ctaHref, this.ctaTarget);
257
+ } else {
258
+ window.location.href = this.ctaHref;
259
+ }
260
+ }
261
+ }
262
+ }
263
+ }
264
+
265
+ export function extractCardAttributes(element: Element) {
266
+ return {
267
+ ctaHref: element.getAttribute("cta-href")!,
268
+ ctaTarget: element.getAttribute("cta-target")!,
269
+ ctaTitle: element.getAttribute("cta-title")!,
270
+ description: element.getAttribute("description"),
271
+ imgSrc: element.getAttribute("img-src"),
272
+ pretitle: element.getAttribute("pretitle"),
273
+ pretitleHref: element.getAttribute("pretitle-href"),
274
+ pretitleHrefText: element.getAttribute("pretitle-href-text"),
275
+ title: element.getAttribute("title")
276
+ } as Card;
277
+ }
@@ -0,0 +1,11 @@
1
+ .card-base {
2
+ background-color: var(--arch-color-white);
3
+ border-radius: var(--arch-radius-lg);
4
+ box-shadow: var(--arch-shadow-xs);
5
+ height: 100%;
6
+ transition: all 250ms ease-in-out;
7
+ }
8
+
9
+ .card-base:hover {
10
+ box-shadow: var(--arch-shadow-md);
11
+ }
@@ -0,0 +1,2 @@
1
+ <template></template>
2
+
@@ -0,0 +1,11 @@
1
+ @import "arch/reset";
2
+
3
+ ul {
4
+ --spacing: var(--arch-spacing-6);
5
+
6
+ justify-content: center;
7
+ display: grid;
8
+ grid-template-columns: repeat(auto-fit, minmax(280px, 280px));
9
+ grid-gap: var(--spacing);
10
+ max-width: 1280px;
11
+ }
@@ -0,0 +1,21 @@
1
+ <template>
2
+ <ul>
3
+ <template for:each={items} for:item="item">
4
+ <li key={item.ctaHref}>
5
+ <arch-card
6
+ cta-href={item.ctaHref}
7
+ cta-target={item.ctaTarget}
8
+ cta-title={item.ctaTitle}
9
+ img-aspect={imgAspect}
10
+ img-src={item.imgSrc}
11
+ img-variant={imgVariant}
12
+ description={item.description}
13
+ title={item.title}
14
+ pretitle={item.pretitle}
15
+ pretitle-href={item.pretitleHref}
16
+ pretitle-href-text={item.pretitleHrefText}
17
+ ></arch-card>
18
+ </li>
19
+ </template>
20
+ </ul>
21
+ </template>
@@ -0,0 +1,118 @@
1
+ import { html } from "lit-html";
2
+
3
+ export default {
4
+ title: "arch/arch-card-grid-a",
5
+ component: "sb-arch-card-grid-a",
6
+ parameters: {
7
+ chromatic: {
8
+ viewports: [450, 800, 1199]
9
+ }
10
+ }
11
+ };
12
+
13
+ // prettier-ignore
14
+ const createStyles = () => html `
15
+ <style>
16
+ sb-arch-card-grid-a {
17
+ display: block;
18
+ }
19
+ </style>`;
20
+
21
+ // prettier-ignore
22
+ export const Base = () => html` ${createStyles()}
23
+ <sb-arch-card-grid-a img-aspect="60%">
24
+ <sb-arch-card
25
+ cta-href="/"
26
+ cta-title="Read More"
27
+ cta-target="_blank"
28
+ description="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget velit placerat, scelerisque libero sed, mattis orci. Aenean eget velit placerat, scelerisque libero sed, mattis orci."
29
+ title="Hello A"
30
+ ></sb-arch-card>
31
+ <sb-arch-card
32
+ cta-href="/"
33
+ cta-title="Read More"
34
+ description="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget velit placerat, scelerisque libero sed, mattis orci."
35
+ title="Hello B"
36
+ ></sb-arch-card>
37
+ <sb-arch-card
38
+ cta-href="/"
39
+ cta-title="Read More"
40
+ description="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget velit placerat, scelerisque libero sed, mattis orci."
41
+ title="Hello C"
42
+ ></sb-arch-card>
43
+ <sb-arch-card
44
+ cta-href="/"
45
+ cta-title="Read More"
46
+ description="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget velit placerat, scelerisque libero sed, mattis orci."
47
+ title="Hello D"
48
+ ></sb-arch-card>
49
+ <sb-arch-card
50
+ cta-href="/"
51
+ cta-title="Read More"
52
+ description="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget velit placerat, scelerisque libero sed, mattis orci."
53
+ title="Hello E"
54
+ ></sb-arch-card>
55
+ </sb-arch-card-grid-a>
56
+ `;
57
+
58
+ // prettier-ignore
59
+ export const ImageFull = () => html` ${createStyles()}
60
+ <sb-arch-card-grid-a img-aspect="60%" img-type="full">
61
+ <sb-arch-card
62
+ description="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget velit placerat, scelerisque libero sed, mattis orci."
63
+ img-src="/images/card-a.png"
64
+ title="Hello A"
65
+ ></sb-arch-card>
66
+ <sb-arch-card
67
+ description="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget velit placerat, scelerisque libero sed, mattis orci."
68
+ img-src="/images/card-a.png"
69
+ title="Hello B"
70
+ ></sb-arch-card>
71
+ <sb-arch-card
72
+ description="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget velit placerat, scelerisque libero sed, mattis orci."
73
+ img-src="/images/card-a.png"
74
+ title="Hello C"
75
+ ></sb-arch-card>
76
+ <sb-arch-card
77
+ description="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget velit placerat, scelerisque libero sed, mattis orci."
78
+ img-src="/images/card-a.png"
79
+ title="Hello D"
80
+ ></sb-arch-card>
81
+ <sb-arch-card
82
+ description="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget velit placerat, scelerisque libero sed, mattis orci."
83
+ img-src="/images/card-a.png"
84
+ title="Hello E"
85
+ ></sb-arch-card>
86
+ </sb-arch-card-grid-a>
87
+ `;
88
+
89
+ // prettier-ignore
90
+ export const ImageLeft = () => html` ${createStyles()}
91
+ <sb-arch-card-grid-a img-aspect="60%" img-type="left">
92
+ <sb-arch-card
93
+ description="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget velit placerat, scelerisque libero sed, mattis orci."
94
+ img-src="/images/card-a.png"
95
+ title="Hello A"
96
+ ></sb-arch-card>
97
+ <sb-arch-card
98
+ description="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget velit placerat, scelerisque libero sed, mattis orci."
99
+ img-src="/images/card-a.png"
100
+ title="Hello B"
101
+ ></sb-arch-card>
102
+ <sb-arch-card
103
+ description="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget velit placerat, scelerisque libero sed, mattis orci."
104
+ img-src="/images/card-a.png"
105
+ title="Hello C"
106
+ ></sb-arch-card>
107
+ <sb-arch-card
108
+ description="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget velit placerat, scelerisque libero sed, mattis orci."
109
+ img-src="/images/card-a.png"
110
+ title="Hello D"
111
+ ></sb-arch-card>
112
+ <sb-arch-card
113
+ description="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget velit placerat, scelerisque libero sed, mattis orci."
114
+ img-src="/images/card-a.png"
115
+ title="Hello E"
116
+ ></sb-arch-card>
117
+ </sb-arch-card-grid-a>
118
+ `;
@@ -0,0 +1,24 @@
1
+ import { api } from "lwc";
2
+
3
+ import { Card, extractCardAttributes } from "arch/card";
4
+
5
+ import { ChildrenElement } from "arch/children";
6
+
7
+ export default class extends ChildrenElement<Card> {
8
+ @api items: Card[] = [];
9
+ @api imgAspect: string | null = null;
10
+ @api imgType: "full" | "left" | null = null;
11
+
12
+ private get imgVariant() {
13
+ switch (this.imgType) {
14
+ case "full":
15
+ return "top-cover";
16
+ case "left":
17
+ return "top-small";
18
+ default:
19
+ return "";
20
+ }
21
+ }
22
+
23
+ extractor = extractCardAttributes;
24
+ }
@@ -0,0 +1,24 @@
1
+ @import "arch/reset";
2
+
3
+ ul {
4
+ --spacing: var(--arch-spacing-6);
5
+
6
+ justify-content: center;
7
+ display: grid;
8
+ grid-template-columns: repeat(auto-fit, minmax(340px, 1fr));
9
+ grid-gap: var(--spacing);
10
+ max-width: 1280px;
11
+ margin: auto;
12
+ }
13
+
14
+ @media screen and (max-width: 800px) {
15
+ ul {
16
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
17
+ }
18
+ }
19
+
20
+ @media screen and (max-width: 400px) {
21
+ ul {
22
+ grid-template-columns: 1fr;
23
+ }
24
+ }
@@ -0,0 +1,22 @@
1
+ <template>
2
+ <ul>
3
+ <template for:each={items} for:item="item">
4
+ <li key={item.title}>
5
+ <arch-card
6
+ class="card"
7
+ cta-href={item.ctaHref}
8
+ cta-target={item.ctaTarget}
9
+ cta-title={item.ctaTitle}
10
+ img-aspect={imgAspect}
11
+ img-src={item.imgSrc}
12
+ img-variant="top-cover"
13
+ description={item.description}
14
+ pretitle={item.pretitle}
15
+ pretitle-href={item.pretitleHref}
16
+ pretitle-href-text={item.pretitleHrefText}
17
+ title={item.title}
18
+ ></arch-card>
19
+ </li>
20
+ </template>
21
+ </ul>
22
+ </template>
@@ -0,0 +1,51 @@
1
+ import { html } from "lit-html";
2
+
3
+ export default {
4
+ title: "arch/arch-card-grid-c",
5
+ component: "sb-arch-card-grid-c",
6
+ parameters: {
7
+ chromatic: {
8
+ viewports: [380, 800, 1199]
9
+ }
10
+ }
11
+ };
12
+
13
+ // prettier-ignore
14
+ const createStyles = () => html `
15
+ <style>
16
+ sb-arch-card-grid-c {
17
+ display: block;
18
+ }
19
+ </style>`;
20
+
21
+ // prettier-ignore
22
+ export const Base = () => html` ${createStyles()}
23
+ <sb-arch-card-grid-c img-aspect="60%">
24
+ <sb-arch-card
25
+ cta-href="/posts/1"
26
+ cta-title="Read More"
27
+ description="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget velit placerat, scelerisque libero sed, mattis orci."
28
+ img-src="/images/card-a.png"
29
+ pretitle="Blog by"
30
+ pretitle-href="/user/amylee"
31
+ pretitle-href-text="Amy Lee"
32
+ title="Inspire Your Peers Careers by Sharing Your #AwesomeAdmin Advice"
33
+ ></sb-arch-card>
34
+ <sb-arch-card
35
+ cta-href="/posts/1"
36
+ cta-title="Read More"
37
+ description="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget velit placerat, scelerisque libero sed, mattis orci."
38
+ img-src="/images/card-a.png"
39
+ pretitle="Blog by Amy Lee"
40
+ title="Hello B"
41
+ ></sb-arch-card>
42
+ <sb-arch-card
43
+ cta-href="/posts/1"
44
+ cta-title="Read More"
45
+ description="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget velit placerat, scelerisque libero sed, mattis orci."
46
+ img-src="/images/card-a.png"
47
+ pretitle="Blog by Amy Lee"
48
+ title="Hello C"
49
+ ></sb-arch-card>
50
+ </sb-arch-card-grid-c>
51
+ `;
@@ -0,0 +1,11 @@
1
+ import { api } from 'lwc';
2
+
3
+ import { Card, extractCardAttributes } from 'arch/card';
4
+
5
+ import { ChildrenElement } from 'arch/children';
6
+
7
+ export default class extends ChildrenElement<Card> {
8
+ @api imgAspect: string | null = null;
9
+
10
+ extractor = extractCardAttributes;
11
+ }
@@ -0,0 +1,17 @@
1
+ @import "arch/reset";
2
+
3
+ ul {
4
+ --spacing: var(--arch-spacing-6);
5
+
6
+ justify-content: center;
7
+ display: grid;
8
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
9
+ grid-gap: var(--spacing);
10
+ max-width: 1280px;
11
+ }
12
+
13
+ @media screen and (max-width: 800px) {
14
+ ul {
15
+ grid-template-columns: 1fr;
16
+ }
17
+ }
@@ -0,0 +1,20 @@
1
+ <template>
2
+ <ul>
3
+ <template for:each={items} for:item="item">
4
+ <li key={item.title}>
5
+ <arch-card
6
+ cta-href={item.ctaHref}
7
+ cta-target={item.ctaTarget}
8
+ cta-title={item.ctaTitle}
9
+ img-src={item.imgSrc}
10
+ img-variant="right-cover"
11
+ description={item.description}
12
+ pretitle={item.pretitle}
13
+ pretitle-href={item.pretitleHref}
14
+ pretitle-href-text={item.pretitleHrefText}
15
+ title={item.title}
16
+ ></arch-card>
17
+ </li>
18
+ </template>
19
+ </ul>
20
+ </template>
@@ -0,0 +1,43 @@
1
+ import { html } from "lit-html";
2
+
3
+ export default {
4
+ title: "arch/arch-card-grid-d",
5
+ component: "sb-arch-card-grid-d",
6
+ parameters: {
7
+ chromatic: {
8
+ viewports: [400, 800, 1199]
9
+ }
10
+ }
11
+ };
12
+
13
+ // prettier-ignore
14
+ const createStyles = () => html `
15
+ <style>
16
+ sb-arch-card-grid-d {
17
+ display: block;
18
+ }
19
+ </style>`;
20
+
21
+ // prettier-ignore
22
+ export const Base = () => html` ${createStyles()}
23
+ <sb-arch-card-grid-d>
24
+ <sb-arch-card
25
+ cta-href="/"
26
+ cta-title="Start"
27
+ description="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eget velit placerat, scelerisque libero sed, mattis orci."
28
+ img-src="/images/card-a.png"
29
+ pretitle="Learning with"
30
+ pretitle-href="/users/astro"
31
+ pretitle-href-text="Astro"
32
+ title="Hello A"
33
+ ></sb-arch-card>
34
+ <sb-arch-card
35
+ cta-href="/"
36
+ cta-title="Start"
37
+ description="Lorem ipsum dolor sit amet, consectetur adipiscing elit."
38
+ img-src="/images/card-a.png"
39
+ pretitle="Hello"
40
+ title="Hello B"
41
+ ></sb-arch-card>
42
+ </sb-arch-card-grid-d>
43
+ `;
@@ -0,0 +1,7 @@
1
+ import { Card, extractCardAttributes } from 'arch/card';
2
+
3
+ import { ChildrenElement } from 'arch/children';
4
+
5
+ export default class extends ChildrenElement<Card> {
6
+ extractor = extractCardAttributes;
7
+ }