Skip to content

Commit 9c3ec2c

Browse files
committed
feat(#2915): callout v2 layout and emphasis levels
1 parent e02a70b commit 9c3ec2c

File tree

1 file changed

+191
-14
lines changed

1 file changed

+191
-14
lines changed

libs/web-components/src/components/callout/Callout.svelte

Lines changed: 191 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,23 @@
1919
"medium",
2020
"large",
2121
]);
22+
const [CalloutEmphasis, validateCalloutEmphasis] = typeValidator(
23+
"Callout emphasis",
24+
["high", "medium", "low"],
25+
);
2226
const [AriaLive, validateAriaLive] = typeValidator("Aria live", [
2327
"off",
2428
"assertive",
2529
"polite",
2630
]);
31+
const [Version, validateVersion] = typeValidator("Version", ["1", "2"]);
2732
2833
// Types
2934
type CalloutType = (typeof Types)[number];
3035
type CalloutSize = (typeof CalloutSizes)[number];
36+
type CalloutEmphasisType = (typeof CalloutEmphasis)[number];
3137
type AriaLiveType = (typeof AriaLive)[number];
38+
type VersionType = (typeof Version)[number];
3239
3340
// margin
3441
export let mt: Spacing = null;
@@ -38,11 +45,13 @@
3845
3946
export let size: CalloutSize = "large";
4047
export let type: CalloutType;
48+
export let emphasis: CalloutEmphasisType = "medium";
4149
export let heading: string = "";
4250
export let maxwidth: string = "none";
4351
export let testid: string = "";
4452
export let arialive: AriaLiveType = "off";
4553
export let icontheme: IconTheme = "outline";
54+
export let version: VersionType = "1";
4655
4756
// Private
4857
@@ -68,7 +77,9 @@
6877
6978
onMount(() => {
7079
validateCalloutSize(size);
80+
validateCalloutEmphasis(emphasis);
7181
validateAriaLive(arialive);
82+
validateVersion(version);
7283
7384
setTimeout(() => {
7485
validateType(type);
@@ -85,24 +96,35 @@
8596
${calculateMargin(mt, mr, mb, ml)};
8697
max-width: ${maxwidth};
8798
`}
88-
class="notification {type}"
99+
class="notification {type} emphasis-{emphasis}"
89100
class:medium={isMediumCallout}
101+
class:v2={version === "2"}
90102
data-testid={testid}
91103
aria-live={arialive}
92104
>
93-
<span class="icon {type}">
94-
<goa-icon
95-
type={iconType}
96-
size={iconSize}
97-
theme={icontheme}
98-
/>
99-
</span>
100-
<span class="content {type}">
101-
{#if heading}
102-
<h3 class:medium={isMediumCallout}>{heading}</h3>
103-
{/if}
104-
<slot />
105-
</span>
105+
{#if version === "2"}
106+
<div class="heading">
107+
<goa-icon
108+
type={iconType}
109+
size={iconSize}
110+
theme={emphasis === "high" ? "outline" : "filled"}
111+
/>
112+
<h3 class="heading-label">{heading}</h3>
113+
</div>
114+
<div class="body">
115+
<slot />
116+
</div>
117+
{:else}
118+
<span class="icon {type}">
119+
<goa-icon type={iconType} size={iconSize} theme={icontheme} />
120+
</span>
121+
<span class="content {type}">
122+
{#if heading}
123+
<h3 class:medium={isMediumCallout}>{heading}</h3>
124+
{/if}
125+
<slot />
126+
</span>
127+
{/if}
106128
</div>
107129

108130
<!-- Style -->
@@ -221,4 +243,159 @@
221243
.notification.medium .icon {
222244
padding: var(--goa-callout-m-statusbar-padding);
223245
}
246+
247+
/* Version two: Layout */
248+
249+
.v2.notification {
250+
flex-direction: column;
251+
border: var(--goa-callout-border);
252+
}
253+
254+
.v2.notification .heading {
255+
display: flex;
256+
flex-direction: row;
257+
align-items: center;
258+
padding: var(--goa-callout-heading-padding);
259+
gap: var(--goa-callout-heading-gap);
260+
color: var(--goa-callout-heading-color);
261+
}
262+
263+
.v2.notification .heading-label {
264+
margin-bottom: 0;
265+
font: var(--goa-callout-heading-typography);
266+
}
267+
268+
.v2.notification .body {
269+
padding: var(--goa-callout-body-padding);
270+
color: var(--goa-callout-body-color);
271+
font: var(--goa-callout-body-typography);
272+
}
273+
274+
/* Version two: Low emphasis layout */
275+
276+
.v2.emphasis-low .body {
277+
padding: var(--goa-callout-l-with-heading-body-padding);
278+
}
279+
280+
.v2.emphasis-low:has(.heading-label:empty) {
281+
flex-direction: row;
282+
align-items: start;
283+
}
284+
285+
.v2.emphasis-low .heading-label:empty {
286+
display: none;
287+
}
288+
289+
.v2.emphasis-low:has(.heading-label:empty) .body {
290+
padding: var(--goa-callout-l-without-heading-body-padding);
291+
}
292+
293+
.v2.information {
294+
background-color: var(--goa-callout-info-content-bg-color);
295+
}
296+
297+
/* Version two: Types */
298+
299+
.v2.information .heading {
300+
background-color: var(--goa-callout-info-heading-bg-color);
301+
--fill-color: var(--goa-callout-info-icon-color);
302+
}
303+
304+
.v2.information.emphasis-low {
305+
border-color: var(--goa-callout-l-info-border-color);
306+
background-color: var(--goa-callout-l-info-content-bg-color);
307+
}
308+
309+
.v2.information.emphasis-high {
310+
border-color: var(--goa-callout-h-info-border-color);
311+
background-color: var(--goa-callout-h-info-content-bg-color);
312+
}
313+
314+
.v2.information.emphasis-high .heading {
315+
background-color: var(--goa-callout-h-info-heading-bg-color);
316+
color: var(--goa-callout-h-info-heading-color);
317+
--fill-color: var(--goa-callout-h-info-icon-color);
318+
}
319+
320+
.v2.emergency {
321+
background-color: var(--goa-callout-emergency-content-bg-color);
322+
}
323+
324+
.v2.emergency .heading {
325+
background-color: var(--goa-callout-emergency-heading-bg-color);
326+
--fill-color: var(--goa-callout-emergency-icon-color);
327+
}
328+
329+
.v2.emergency.emphasis-low {
330+
border-color: var(--goa-callout-l-emergency-border-color);
331+
background-color: var(--goa-callout-l-emergency-content-bg-color);
332+
}
333+
334+
.v2.emergency.emphasis-high {
335+
border-color: var(--goa-callout-h-emergency-border-color);
336+
background-color: var(--goa-callout-h-emergency-content-bg-color);
337+
}
338+
339+
.v2.emergency.emphasis-high .heading {
340+
background-color: var(--goa-callout-h-emergency-heading-bg-color);
341+
color: var(--goa-callout-h-emergency-heading-color);
342+
--fill-color: var(--goa-callout-h-emergency-icon-color);
343+
}
344+
345+
.v2.important {
346+
background-color: var(--goa-callout-important-content-bg-color);
347+
}
348+
349+
.v2.important .heading {
350+
background-color: var(--goa-callout-important-heading-bg-color);
351+
--fill-color: var(--goa-callout-important-icon-color);
352+
}
353+
354+
.v2.important.emphasis-low {
355+
border-color: var(--goa-callout-l-important-border-color);
356+
background-color: var(--goa-callout-l-important-content-bg-color);
357+
}
358+
359+
.v2.important.emphasis-high {
360+
border-color: var(--goa-callout-h-important-border-color);
361+
background-color: var(--goa-callout-h-important-content-bg-color);
362+
}
363+
364+
.v2.important.emphasis-high .heading {
365+
background-color: var(--goa-callout-h-important-heading-bg-color);
366+
color: var(--goa-callout-h-important-heading-color);
367+
--fill-color: var(--goa-callout-h-important-icon-color);
368+
}
369+
370+
.v2.success {
371+
background-color: var(--goa-callout-success-content-bg-color);
372+
}
373+
374+
.v2.success .heading {
375+
background-color: var(--goa-callout-success-heading-bg-color);
376+
--fill-color: var(--goa-callout-success-icon-color);
377+
}
378+
379+
.v2.success.emphasis-low {
380+
border-color: var(--goa-callout-l-success-border-color);
381+
background-color: var(--goa-callout-l-success-content-bg-color);
382+
}
383+
384+
.v2.success.emphasis-high {
385+
border-color: var(--goa-callout-h-success-border-color);
386+
background-color: var(--goa-callout-h-success-content-bg-color);
387+
}
388+
389+
.v2.success.emphasis-high .heading {
390+
background-color: var(--goa-callout-h-success-heading-bg-color);
391+
color: var(--goa-callout-h-success-heading-color);
392+
--fill-color: var(--goa-callout-h-success-icon-color);
393+
}
394+
395+
.v2.information.emphasis-low .heading,
396+
.v2.important.emphasis-low .heading,
397+
.v2.emergency.emphasis-low .heading,
398+
.v2.success.v2.emphasis-low .heading {
399+
background-color: transparent;
400+
}
224401
</style>

0 commit comments

Comments
 (0)