@riverty/web-components 6.1.0 → 6.2.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.
- package/CHANGELOG.md +23 -0
- package/custom-elements.json +160 -1
- package/dist/cjs/{index-DJ4H_bFj.js → index-BnETQtSf.js} +9 -382
- package/dist/cjs/loader.cjs.js +2 -2
- package/dist/cjs/r-accordion-panel.cjs.entry.js +1 -1
- package/dist/cjs/r-accordion-section.cjs.entry.js +1 -1
- package/dist/cjs/r-accordion-trigger.cjs.entry.js +1 -1
- package/dist/cjs/r-accordion.cjs.entry.js +1 -1
- package/dist/cjs/r-alert.cjs.entry.js +9 -6
- package/dist/cjs/r-badge.cjs.entry.js +1 -1
- package/dist/cjs/r-button.cjs.entry.js +6 -2
- package/dist/cjs/r-checkbox-group.cjs.entry.js +1 -1
- package/dist/cjs/r-checkbox.cjs.entry.js +4 -4
- package/dist/cjs/r-design-system-devtools.cjs.entry.js +1 -1
- package/dist/cjs/r-dialog.cjs.entry.js +1 -1
- package/dist/cjs/r-hint_2.cjs.entry.js +3 -3
- package/dist/cjs/r-icon-button_2.cjs.entry.js +24 -4
- package/dist/cjs/r-icon.cjs.entry.js +2 -2
- package/dist/cjs/r-illustration.cjs.entry.js +396 -0
- package/dist/cjs/r-input-code.cjs.entry.js +34 -12
- package/dist/cjs/r-input-date.cjs.entry.js +7 -7
- package/dist/cjs/r-input-password.cjs.entry.js +3 -3
- package/dist/cjs/r-input-phone-number.cjs.entry.js +4 -4
- package/dist/cjs/r-input.cjs.entry.js +5 -4
- package/dist/cjs/r-list-item.cjs.entry.js +1 -1
- package/dist/cjs/r-pagination.cjs.entry.js +56 -50
- package/dist/cjs/r-panel.cjs.entry.js +3 -3
- package/dist/cjs/r-popover-action.cjs.entry.js +2 -2
- package/dist/cjs/r-popover-content.cjs.entry.js +2 -2
- package/dist/cjs/r-popover-headline.cjs.entry.js +2 -2
- package/dist/cjs/r-popover-trigger.cjs.entry.js +2 -2
- package/dist/cjs/r-popover.cjs.entry.js +46 -5
- package/dist/cjs/r-progress-bar.cjs.entry.js +2 -2
- package/dist/cjs/r-radio-button-description.cjs.entry.js +2 -2
- package/dist/cjs/r-radio-button-leading.cjs.entry.js +2 -2
- package/dist/cjs/r-radio-button-title.cjs.entry.js +2 -2
- package/dist/cjs/r-radio-button-trailing.cjs.entry.js +2 -2
- package/dist/cjs/r-radio-button.cjs.entry.js +8 -7
- package/dist/cjs/r-radio-group.cjs.entry.js +83 -10
- package/dist/cjs/r-select-option.cjs.entry.js +2 -2
- package/dist/cjs/r-select.cjs.entry.js +6 -4
- package/dist/cjs/r-skip-link.cjs.entry.js +2 -2
- package/dist/cjs/r-stepper-item.cjs.entry.js +19 -4
- package/dist/cjs/r-stepper.cjs.entry.js +76 -3
- package/dist/cjs/r-tab-panel.cjs.entry.js +2 -2
- package/dist/cjs/r-tab.cjs.entry.js +3 -3
- package/dist/cjs/r-tabs-list.cjs.entry.js +4 -4
- package/dist/cjs/r-tabs.cjs.entry.js +2 -2
- package/dist/cjs/r-textarea.cjs.entry.js +1 -1
- package/dist/cjs/r-toast-group.cjs.entry.js +13 -4
- package/dist/cjs/r-toast.cjs.entry.js +87 -18
- package/dist/cjs/web-components.cjs.js +2 -2
- package/dist/collection/collection-manifest.json +1 -0
- package/dist/collection/components/alert/alert.css +4 -3
- package/dist/collection/components/alert/alert.js +7 -4
- package/dist/collection/components/button/button.js +30 -1
- package/dist/collection/components/button/exports.js +1 -0
- package/dist/collection/components/checkbox/checkbox.js +3 -3
- package/dist/collection/components/icon/exports.js +1 -1
- package/dist/collection/components/icon/icon.js +1 -1
- package/dist/collection/components/icon/riverty-kit.js +1 -1
- package/dist/collection/components/illustration/data.js +112 -0
- package/dist/collection/components/illustration/exports.js +3 -0
- package/dist/collection/components/illustration/illustration.js +540 -0
- package/dist/collection/components/illustration/illustration.scss +56 -0
- package/dist/collection/components/illustration/illustrations-ui-kit.js +2 -0
- package/dist/collection/components/input/exports.js +1 -0
- package/dist/collection/components/input/input.css +3 -0
- package/dist/collection/components/input/input.js +47 -2
- package/dist/collection/components/input-code/input-code.css +6 -0
- package/dist/collection/components/input-code/input-code.js +48 -10
- package/dist/collection/components/input-date/input-date.js +6 -6
- package/dist/collection/components/input-password/input-password.js +2 -2
- package/dist/collection/components/input-phone-number/input-phone-number.js +3 -3
- package/dist/collection/components/label/label.js +2 -2
- package/dist/collection/components/pagination/pagination.css +33 -72
- package/dist/collection/components/pagination/pagination.js +194 -48
- package/dist/collection/components/panel/panel.js +2 -2
- package/dist/collection/components/popover/popover.css +0 -1
- package/dist/collection/components/popover/popover.js +44 -3
- package/dist/collection/components/popover-action/popover-action.js +1 -1
- package/dist/collection/components/popover-content/popover-content.js +1 -1
- package/dist/collection/components/popover-headline/popover-headline.js +1 -1
- package/dist/collection/components/popover-trigger/popover-trigger.js +1 -1
- package/dist/collection/components/progress-bar/progress-bar.js +1 -1
- package/dist/collection/components/radio-button/radio-button.js +7 -6
- package/dist/collection/components/radio-button-description/radio-button-description.js +1 -1
- package/dist/collection/components/radio-button-leading/radio-button-leading.js +1 -1
- package/dist/collection/components/radio-button-title/radio-button-title.js +1 -1
- package/dist/collection/components/radio-button-trailing/radio-button-trailing.js +1 -1
- package/dist/collection/components/radio-group/radio-group.css +4 -1
- package/dist/collection/components/radio-group/radio-group.js +100 -8
- package/dist/collection/components/select/select.js +5 -3
- package/dist/collection/components/select-option/select-option.js +1 -1
- package/dist/collection/components/skip-link/skip-link.js +1 -1
- package/dist/collection/components/stepper/stepper.css +4 -1
- package/dist/collection/components/stepper/stepper.js +125 -1
- package/dist/collection/components/stepper-item/stepper-item.css +22 -9
- package/dist/collection/components/stepper-item/stepper-item.js +36 -2
- package/dist/collection/components/tab/tab.js +2 -2
- package/dist/collection/components/tab-panel/tab-panel.js +1 -1
- package/dist/collection/components/tabs/tabs.js +1 -1
- package/dist/collection/components/tabs-list/tabs-list.js +3 -3
- package/dist/collection/components/toast/toast.css +9 -9
- package/dist/collection/components/toast/toast.js +109 -21
- package/dist/collection/components/toast-group/toast-group.css +5 -11
- package/dist/collection/components/toast-group/toast-group.js +12 -3
- package/dist/collection/components/tooltip/tooltip.js +23 -3
- package/dist/esm/{index-Da7qOBFr.js → index-CTxpqopm.js} +9 -382
- package/dist/esm/loader.js +3 -3
- package/dist/esm/r-accordion-panel.entry.js +1 -1
- package/dist/esm/r-accordion-section.entry.js +1 -1
- package/dist/esm/r-accordion-trigger.entry.js +1 -1
- package/dist/esm/r-accordion.entry.js +1 -1
- package/dist/esm/r-alert.entry.js +9 -6
- package/dist/esm/r-badge.entry.js +1 -1
- package/dist/esm/r-button.entry.js +6 -2
- package/dist/esm/r-checkbox-group.entry.js +1 -1
- package/dist/esm/r-checkbox.entry.js +4 -4
- package/dist/esm/r-design-system-devtools.entry.js +1 -1
- package/dist/esm/r-dialog.entry.js +1 -1
- package/dist/esm/r-hint_2.entry.js +3 -3
- package/dist/esm/r-icon-button_2.entry.js +24 -4
- package/dist/esm/r-icon.entry.js +2 -2
- package/dist/esm/r-illustration.entry.js +394 -0
- package/dist/esm/r-input-code.entry.js +34 -12
- package/dist/esm/r-input-date.entry.js +7 -7
- package/dist/esm/r-input-password.entry.js +3 -3
- package/dist/esm/r-input-phone-number.entry.js +4 -4
- package/dist/esm/r-input.entry.js +5 -4
- package/dist/esm/r-list-item.entry.js +1 -1
- package/dist/esm/r-pagination.entry.js +56 -50
- package/dist/esm/r-panel.entry.js +3 -3
- package/dist/esm/r-popover-action.entry.js +2 -2
- package/dist/esm/r-popover-content.entry.js +2 -2
- package/dist/esm/r-popover-headline.entry.js +2 -2
- package/dist/esm/r-popover-trigger.entry.js +2 -2
- package/dist/esm/r-popover.entry.js +46 -5
- package/dist/esm/r-progress-bar.entry.js +2 -2
- package/dist/esm/r-radio-button-description.entry.js +2 -2
- package/dist/esm/r-radio-button-leading.entry.js +2 -2
- package/dist/esm/r-radio-button-title.entry.js +2 -2
- package/dist/esm/r-radio-button-trailing.entry.js +2 -2
- package/dist/esm/r-radio-button.entry.js +8 -7
- package/dist/esm/r-radio-group.entry.js +83 -10
- package/dist/esm/r-select-option.entry.js +2 -2
- package/dist/esm/r-select.entry.js +6 -4
- package/dist/esm/r-skip-link.entry.js +2 -2
- package/dist/esm/r-stepper-item.entry.js +19 -4
- package/dist/esm/r-stepper.entry.js +76 -3
- package/dist/esm/r-tab-panel.entry.js +2 -2
- package/dist/esm/r-tab.entry.js +3 -3
- package/dist/esm/r-tabs-list.entry.js +4 -4
- package/dist/esm/r-tabs.entry.js +2 -2
- package/dist/esm/r-textarea.entry.js +1 -1
- package/dist/esm/r-toast-group.entry.js +13 -4
- package/dist/esm/r-toast.entry.js +87 -18
- package/dist/esm/web-components.js +3 -3
- package/dist/types/components/alert/alert.d.ts +1 -0
- package/dist/types/components/button/button.d.ts +8 -1
- package/dist/types/components/button/exports.d.ts +2 -0
- package/dist/types/components/icon/exports.d.ts +1 -1
- package/dist/types/components/icon/riverty-kit.d.ts +1 -1
- package/dist/types/components/illustration/data.d.ts +52 -0
- package/dist/types/components/illustration/exports.d.ts +23 -0
- package/dist/types/components/illustration/illustration.d.ts +51 -0
- package/dist/types/components/illustration/illustrations-ui-kit.d.ts +21 -0
- package/dist/types/components/input/exports.d.ts +2 -0
- package/dist/types/components/input/input.d.ts +15 -1
- package/dist/types/components/input-code/input-code.d.ts +15 -1
- package/dist/types/components/pagination/pagination.d.ts +19 -0
- package/dist/types/components/popover/popover.d.ts +9 -0
- package/dist/types/components/radio-group/radio-group.d.ts +16 -0
- package/dist/types/components/stepper/stepper.d.ts +11 -0
- package/dist/types/components/stepper-item/stepper-item.d.ts +7 -0
- package/dist/types/components/toast/toast.d.ts +10 -4
- package/dist/types/components/tooltip/tooltip.d.ts +5 -0
- package/dist/types/components.d.ts +273 -7
- package/dist/web-components/p-02b22f8e.entry.js +1 -0
- package/dist/web-components/{p-d054eb4d.entry.js → p-075a8dc8.entry.js} +1 -1
- package/dist/web-components/{p-8a66d20c.entry.js → p-0a34d33b.entry.js} +1 -1
- package/dist/web-components/{p-8c31cbd5.entry.js → p-10cc9983.entry.js} +1 -1
- package/dist/web-components/{p-d7726e46.entry.js → p-253068b9.entry.js} +1 -1
- package/dist/web-components/{p-3884c6e7.entry.js → p-3b8c8951.entry.js} +1 -1
- package/dist/web-components/{p-550e2237.entry.js → p-3beacdab.entry.js} +1 -1
- package/dist/web-components/p-4214867d.entry.js +1 -0
- package/dist/web-components/{p-3f60c6c0.entry.js → p-42c857e9.entry.js} +1 -1
- package/dist/web-components/{p-7fed6f4d.entry.js → p-44f87e16.entry.js} +1 -1
- package/dist/web-components/p-477614c5.entry.js +1 -0
- package/dist/web-components/{p-1da75540.entry.js → p-495ba3d2.entry.js} +1 -1
- package/dist/web-components/{p-19407a14.entry.js → p-4de76291.entry.js} +1 -1
- package/dist/web-components/{p-cd5daad2.entry.js → p-55600d47.entry.js} +1 -1
- package/dist/web-components/{p-c95b6470.entry.js → p-562051aa.entry.js} +1 -1
- package/dist/web-components/p-5b850e0f.entry.js +1 -0
- package/dist/web-components/p-6013dfc8.entry.js +1 -0
- package/dist/web-components/{p-6cc2ea2c.entry.js → p-62e7ae04.entry.js} +1 -1
- package/dist/web-components/p-71519d37.entry.js +1 -0
- package/dist/web-components/p-88f7b47f.entry.js +1 -0
- package/dist/web-components/p-8975a6a3.entry.js +1 -0
- package/dist/web-components/{p-6bb44ec6.entry.js → p-8e125826.entry.js} +1 -1
- package/dist/web-components/p-91cc0bde.entry.js +1 -0
- package/dist/web-components/{p-0347feff.entry.js → p-93435fcd.entry.js} +1 -1
- package/dist/web-components/p-947969d7.entry.js +1 -0
- package/dist/web-components/{p-cdd88c5a.entry.js → p-95396b5c.entry.js} +1 -1
- package/dist/web-components/p-9de3a1a5.entry.js +1 -0
- package/dist/web-components/p-9f583ed1.entry.js +1 -0
- package/dist/web-components/p-CTxpqopm.js +2 -0
- package/dist/web-components/{p-5eeb7002.entry.js → p-a1086abe.entry.js} +1 -1
- package/dist/web-components/{p-f9d5004c.entry.js → p-bbba6d79.entry.js} +1 -1
- package/dist/web-components/{p-c478712b.entry.js → p-bde44ec4.entry.js} +1 -1
- package/dist/web-components/p-bfc7e6c0.entry.js +1 -0
- package/dist/web-components/p-c1030394.entry.js +1 -0
- package/dist/web-components/p-c1f59ed1.entry.js +1 -0
- package/dist/web-components/{p-26ef77d6.entry.js → p-c80a5541.entry.js} +1 -1
- package/dist/web-components/{p-9ef1bbee.entry.js → p-c96ee61a.entry.js} +1 -1
- package/dist/web-components/{p-8dac326b.entry.js → p-caf8f067.entry.js} +1 -1
- package/dist/web-components/p-cc363c3d.entry.js +1 -0
- package/dist/web-components/p-cf4ff357.entry.js +1 -0
- package/dist/web-components/p-d0310ed4.entry.js +1 -0
- package/dist/web-components/p-d1412932.entry.js +1 -0
- package/dist/web-components/{p-62b788bf.entry.js → p-d2447e30.entry.js} +1 -1
- package/dist/web-components/p-dc9cca06.entry.js +1 -0
- package/dist/web-components/p-e5b943a2.entry.js +1 -0
- package/dist/web-components/{p-4cc58c6a.entry.js → p-e67b13df.entry.js} +1 -1
- package/dist/web-components/p-efec231a.entry.js +1 -0
- package/dist/web-components/{p-4595fa8e.entry.js → p-f867e4c3.entry.js} +1 -1
- package/dist/web-components/web-components.esm.js +1 -1
- package/package.json +5 -2
- package/dist/collection/components/icon/bundled-icons/all-kit.json +0 -1
- package/dist/collection/components/icon/bundled-icons/riverty-kit.json +0 -1
- package/dist/web-components/bundled-icons/all-kit.json +0 -1
- package/dist/web-components/bundled-icons/riverty-kit.json +0 -1
- package/dist/web-components/p-159822fe.entry.js +0 -1
- package/dist/web-components/p-4f261b63.entry.js +0 -1
- package/dist/web-components/p-50893211.entry.js +0 -1
- package/dist/web-components/p-589baaf9.entry.js +0 -1
- package/dist/web-components/p-60341de2.entry.js +0 -1
- package/dist/web-components/p-63fd817d.entry.js +0 -1
- package/dist/web-components/p-67fa3f84.entry.js +0 -1
- package/dist/web-components/p-70784685.entry.js +0 -1
- package/dist/web-components/p-7ce57332.entry.js +0 -1
- package/dist/web-components/p-92c7cf33.entry.js +0 -1
- package/dist/web-components/p-Da7qOBFr.js +0 -2
- package/dist/web-components/p-a7d22c76.entry.js +0 -1
- package/dist/web-components/p-b96d59ca.entry.js +0 -1
- package/dist/web-components/p-b98ab649.entry.js +0 -1
- package/dist/web-components/p-ba801820.entry.js +0 -1
- package/dist/web-components/p-bfc8c077.entry.js +0 -1
- package/dist/web-components/p-c05b05da.entry.js +0 -1
- package/dist/web-components/p-c1e748f2.entry.js +0 -1
- package/dist/web-components/p-d433a828.entry.js +0 -1
- package/dist/web-components/p-d819c8e5.entry.js +0 -1
- package/dist/web-components/p-e4dc60f0.entry.js +0 -1
- package/dist/web-components/p-f7adb875.entry.js +0 -1
- package/dist/collection/components/icon/{icon-data.js → data.js} +0 -0
- package/dist/types/components/icon/{icon-data.d.ts → data.d.ts} +1 -1
|
@@ -0,0 +1,540 @@
|
|
|
1
|
+
import { Host, h } from "@stencil/core";
|
|
2
|
+
import { getSvgElementByNameFromCdn, getSvgElementByName, addToIllustrationsData } from "./data";
|
|
3
|
+
export class RIllustration {
|
|
4
|
+
constructor() {
|
|
5
|
+
/** Defines initial width of an illustration. */
|
|
6
|
+
this.width = '342px';
|
|
7
|
+
/** Theme mode for illustration rendering */
|
|
8
|
+
this.theme = 'auto';
|
|
9
|
+
/** Error message text to display when illustration fails to load */
|
|
10
|
+
this.errorMessage = 'Failed to load illustration';
|
|
11
|
+
/** Accessibility: title for the image representing "failed-to-load" state */
|
|
12
|
+
this.emptyImageTitle = 'Failed to load illustration';
|
|
13
|
+
/** Accessibility: title for the marker representing "failed-to-load" state */
|
|
14
|
+
this.emptyMarkerTitle = 'Failed to load illustration marker';
|
|
15
|
+
this.detectedTheme = null;
|
|
16
|
+
this.error = false;
|
|
17
|
+
// SVG attributes extracted from the element
|
|
18
|
+
this.svgAttributes = {};
|
|
19
|
+
// SVG inner content (without the <svg> wrapper)
|
|
20
|
+
this.svgInnerHTML = '';
|
|
21
|
+
// Unique ID for aria references
|
|
22
|
+
this.uniqueId = `r-illustration-${Date.now().toString(32)}${Math.random().toString(32)}`.replace(/\./g, '');
|
|
23
|
+
this._setElementAttrs = (el, attrs = {}) => {
|
|
24
|
+
if (!el)
|
|
25
|
+
return;
|
|
26
|
+
const keys = Object.keys(attrs);
|
|
27
|
+
keys.forEach(key => {
|
|
28
|
+
const elHasNoAttr = el.getAttribute(key) === null;
|
|
29
|
+
const attrHasValue = attrs[key] !== undefined;
|
|
30
|
+
if (elHasNoAttr && attrHasValue) {
|
|
31
|
+
el.setAttribute(key, attrs[key]);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
// Combine attributes for <SVG>
|
|
36
|
+
this._defineSvgAttrs = () => {
|
|
37
|
+
const attrs = {
|
|
38
|
+
xmlns: 'http://www.w3.org/2000/svg',
|
|
39
|
+
role: this.ariaRole,
|
|
40
|
+
'aria-labelledby': this.ariaLabelledBy,
|
|
41
|
+
'aria-hidden': this.ariaRole === 'presentation'
|
|
42
|
+
};
|
|
43
|
+
return attrs;
|
|
44
|
+
};
|
|
45
|
+
// Pass attributes from <r-illustration> to <SVG>
|
|
46
|
+
this._passAttributesToSvg = () => {
|
|
47
|
+
// Search for an <svg> within <r-illustration> component
|
|
48
|
+
const svgElement = this.host.querySelector('svg');
|
|
49
|
+
// If an SVG was not found inside <r-illustration>
|
|
50
|
+
// Exit function
|
|
51
|
+
if (svgElement === null)
|
|
52
|
+
return;
|
|
53
|
+
// Set values of attributes of an <SVG>
|
|
54
|
+
this._setElementAttrs(svgElement, {
|
|
55
|
+
role: this.ariaRole,
|
|
56
|
+
'aria-labelledby': this.ariaLabelledBy,
|
|
57
|
+
'aria-hidden': this.ariaRole === 'presentation'
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
this._defineIllustrationElement = async () => {
|
|
61
|
+
let svgElement = null;
|
|
62
|
+
// Check name attribute
|
|
63
|
+
if (!this.name) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
this.error = false;
|
|
67
|
+
if (this.name) {
|
|
68
|
+
// Getting an <SVG> element by name
|
|
69
|
+
svgElement = getSvgElementByName(this.name);
|
|
70
|
+
if (svgElement !== null) {
|
|
71
|
+
this._setElementAttrs(svgElement, this._defineSvgAttrs());
|
|
72
|
+
return svgElement;
|
|
73
|
+
}
|
|
74
|
+
// If element was NOT found by name, fetch from CDN
|
|
75
|
+
try {
|
|
76
|
+
svgElement = await getSvgElementByNameFromCdn(this.name);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
console.info(`Error while fetching illustration "${this.name}":`, error);
|
|
80
|
+
this.error = true;
|
|
81
|
+
this.rFailed.emit();
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
if (!svgElement) {
|
|
85
|
+
console.info(`
|
|
86
|
+
No SVG Element received after fetching "${this.name}".
|
|
87
|
+
`);
|
|
88
|
+
this.error = true;
|
|
89
|
+
this.rFailed.emit();
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
// Add set of attributes to SVG
|
|
93
|
+
this._setElementAttrs(svgElement, this._defineSvgAttrs());
|
|
94
|
+
// Save illustration content to data object
|
|
95
|
+
addToIllustrationsData(this.name, `${svgElement.outerHTML}`);
|
|
96
|
+
return svgElement;
|
|
97
|
+
}
|
|
98
|
+
return null;
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
get cssVars() {
|
|
102
|
+
const styles = {};
|
|
103
|
+
if (this.minWidth) {
|
|
104
|
+
styles['--r-illustration--min-width'] = this.minWidth;
|
|
105
|
+
}
|
|
106
|
+
if (this.maxWidth) {
|
|
107
|
+
styles['--r-illustration--max-width'] = this.maxWidth;
|
|
108
|
+
}
|
|
109
|
+
if (this.width) {
|
|
110
|
+
styles['--r-illustration--width'] = this.width;
|
|
111
|
+
}
|
|
112
|
+
return Object.keys(styles).length > 0 ? styles : undefined;
|
|
113
|
+
}
|
|
114
|
+
get ariaRole() {
|
|
115
|
+
// Use 'img' role when text is provided
|
|
116
|
+
// Use 'presentation' for decorative illustrations
|
|
117
|
+
return (this.svgTitle || this.svgDescription) ? 'img' : 'presentation';
|
|
118
|
+
}
|
|
119
|
+
get ariaLabelledBy() {
|
|
120
|
+
return [
|
|
121
|
+
this.svgTitle ? `${this.uniqueId}-title` : '',
|
|
122
|
+
this.svgDescription ? `${this.uniqueId}-desc` : ''
|
|
123
|
+
].filter(Boolean).join(' ') || undefined;
|
|
124
|
+
}
|
|
125
|
+
componentWillLoad() {
|
|
126
|
+
// If an <SVG> within <r-illustration> slot exists
|
|
127
|
+
// Collect attributes and pass them to an <SVG>
|
|
128
|
+
// According to defined priority (host -> svg -> default)
|
|
129
|
+
this._passAttributesToSvg();
|
|
130
|
+
// Set up theme detection for auto mode
|
|
131
|
+
this._setupAutoThemeDetection();
|
|
132
|
+
}
|
|
133
|
+
async componentWillRender() {
|
|
134
|
+
// Define the <SVG> element from name
|
|
135
|
+
this.svgElement = await this._defineIllustrationElement();
|
|
136
|
+
// Extract SVG attributes and inner content
|
|
137
|
+
if (this.svgElement) {
|
|
138
|
+
this._extractSvgData();
|
|
139
|
+
// Emit rComplete event after successful load
|
|
140
|
+
this.rComplete.emit();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
_extractSvgData() {
|
|
144
|
+
if (!this.svgElement)
|
|
145
|
+
return;
|
|
146
|
+
// Extract attributes from SVG element
|
|
147
|
+
const attrs = this.svgElement.attributes;
|
|
148
|
+
this.svgAttributes = {};
|
|
149
|
+
let width = null;
|
|
150
|
+
let height = null;
|
|
151
|
+
for (let i = 0; i < attrs.length; i++) {
|
|
152
|
+
const attr = attrs[i];
|
|
153
|
+
// Capture width and height for viewBox conversion
|
|
154
|
+
if (attr.name === 'width') {
|
|
155
|
+
width = attr.value;
|
|
156
|
+
}
|
|
157
|
+
else if (attr.name === 'height') {
|
|
158
|
+
height = attr.value;
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
// Copy all other attributes
|
|
162
|
+
this.svgAttributes[attr.name] = attr.value;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// Convert width/height to viewBox if not already present
|
|
166
|
+
if (width && height && !this.svgAttributes['viewBox']) {
|
|
167
|
+
// Remove 'px' or other units and get numeric values
|
|
168
|
+
const numericWidth = parseFloat(width);
|
|
169
|
+
const numericHeight = parseFloat(height);
|
|
170
|
+
if (!isNaN(numericWidth) && !isNaN(numericHeight)) {
|
|
171
|
+
this.svgAttributes['viewBox'] = `0 0 ${numericWidth} ${numericHeight}`;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// Extract inner HTML (everything inside <svg>...</svg>)
|
|
175
|
+
this.svgInnerHTML = this.svgElement.innerHTML;
|
|
176
|
+
}
|
|
177
|
+
_buildSvgContent() {
|
|
178
|
+
let content = '';
|
|
179
|
+
// Start with the original SVG inner content
|
|
180
|
+
let svgContent = this.svgInnerHTML;
|
|
181
|
+
// Add title element if provided
|
|
182
|
+
if (this.svgTitle) {
|
|
183
|
+
// Remove existing <title> elements
|
|
184
|
+
svgContent = svgContent.replace(/<title[^>]*>[\s\S]*?<\/title>/gi, '');
|
|
185
|
+
content += `<title id="${this.uniqueId}-title">${this.svgTitle}</title>`;
|
|
186
|
+
}
|
|
187
|
+
// Add description element if provided
|
|
188
|
+
if (this.svgDescription) {
|
|
189
|
+
// Remove existing <desc> elements
|
|
190
|
+
svgContent = svgContent.replace(/<desc[^>]*>[\s\S]*?<\/desc>/gi, '');
|
|
191
|
+
content += `<desc id="${this.uniqueId}-desc">${this.svgDescription}</desc>`;
|
|
192
|
+
}
|
|
193
|
+
// Add the cleaned SVG content
|
|
194
|
+
content += svgContent;
|
|
195
|
+
return content;
|
|
196
|
+
}
|
|
197
|
+
disconnectedCallback() {
|
|
198
|
+
// Clean up observer when component is removed
|
|
199
|
+
if (this.themeObserver) {
|
|
200
|
+
this.themeObserver.disconnect();
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
_setupAutoThemeDetection() {
|
|
204
|
+
if (this.theme !== 'auto')
|
|
205
|
+
return;
|
|
206
|
+
// Detect parent theme changes (e.g., Storybook theme switcher)
|
|
207
|
+
const detectParentTheme = () => {
|
|
208
|
+
// Find closest parent with data-theme attribute
|
|
209
|
+
let element = this.host;
|
|
210
|
+
// Traverse up the DOM tree looking for data-theme
|
|
211
|
+
while (element && element !== document.documentElement) {
|
|
212
|
+
element = element.parentElement;
|
|
213
|
+
if (element && element.hasAttribute('data-theme')) {
|
|
214
|
+
this.detectedTheme = element.getAttribute('data-theme');
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
// If no parent data-theme found, check document root
|
|
219
|
+
if (!this.detectedTheme) {
|
|
220
|
+
const documentTheme = document.documentElement.getAttribute('data-theme');
|
|
221
|
+
const bodyTheme = document.body.getAttribute('data-theme');
|
|
222
|
+
this.detectedTheme = documentTheme || bodyTheme;
|
|
223
|
+
}
|
|
224
|
+
const isDark = this.detectedTheme === 'dark';
|
|
225
|
+
const isLight = this.detectedTheme === 'light';
|
|
226
|
+
// Apply detected theme as data attribute for CSS to use
|
|
227
|
+
// If no explicit theme found, remove attribute to use media query fallback
|
|
228
|
+
if (isDark || isLight) {
|
|
229
|
+
this.host.setAttribute('data-detected-theme', this.detectedTheme);
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
this.host.removeAttribute('data-detected-theme');
|
|
233
|
+
};
|
|
234
|
+
// Initial detection
|
|
235
|
+
detectParentTheme();
|
|
236
|
+
// Observe changes to document elements and all parents
|
|
237
|
+
this.themeObserver = new MutationObserver(detectParentTheme);
|
|
238
|
+
// Observe document root
|
|
239
|
+
this.themeObserver.observe(document.documentElement, {
|
|
240
|
+
attributes: true,
|
|
241
|
+
attributeFilter: ['data-theme']
|
|
242
|
+
});
|
|
243
|
+
// Observe body
|
|
244
|
+
this.themeObserver.observe(document.body, {
|
|
245
|
+
attributes: true,
|
|
246
|
+
attributeFilter: ['data-theme']
|
|
247
|
+
});
|
|
248
|
+
// Observe all parent elements up the tree
|
|
249
|
+
let parent = this.host.parentElement;
|
|
250
|
+
while (parent && parent !== document.documentElement) {
|
|
251
|
+
this.themeObserver.observe(parent, {
|
|
252
|
+
attributes: true,
|
|
253
|
+
attributeFilter: ['data-theme']
|
|
254
|
+
});
|
|
255
|
+
parent = parent.parentElement;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
render() {
|
|
259
|
+
const styleAttrs = this.cssVars ? { style: this.cssVars } : {};
|
|
260
|
+
const errorStateImageTitleId = `${this.uniqueId}-error-state-image-title`;
|
|
261
|
+
const errorStateMarkerTitleId = `${this.uniqueId}--error-state-marker-title`;
|
|
262
|
+
// If error state, render fallback content
|
|
263
|
+
if (this.error) {
|
|
264
|
+
return (h(Host, { "data-error": "true" }, h("div", Object.assign({ class: "r-illustration" }, styleAttrs), h("slot", { name: "error" }, h("div", { class: "status" }, h("div", { class: "status-icon" }, h("svg", { role: "img", "aria-labelledby": errorStateImageTitleId, viewBox: "0 0 49 35", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, h("title", { id: errorStateImageTitleId }, this.emptyImageTitle), h("rect", { x: "3.88477", y: "3.88477", width: "40.8361", height: "26.9672", stroke: "#686868", "stroke-width": "1.60519" }), h("rect", { x: "0.802734", y: "0.802734", width: "47", height: "33.1311", stroke: "#686868", "stroke-width": "1.60519" }), h("path", { d: "M3.88477 29.3104L17.887 20.835L26.9995 25.6117", stroke: "#686868", "stroke-width": "1.60519", "stroke-linecap": "round" }), h("path", { d: "M22.377 23.1472L40.5297 10.0488L44.7212 12.7455", stroke: "#686868", "stroke-width": "1.60519", "stroke-linecap": "round" }), h("circle", { cx: "10.434", cy: "10.434", r: "2.69672", stroke: "#686868", "stroke-width": "1.60519" })), h("div", { class: "status-marker" }, h("svg", { role: "img", "aria-labelledby": errorStateMarkerTitleId, viewBox: "0 0 21 21", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, h("title", { id: errorStateMarkerTitleId }, this.emptyMarkerTitle), h("circle", { cx: "10.4776", cy: "10.4776", r: "7.37313", fill: "#E4E2E0", stroke: "#B00C15", "stroke-width": "1.61692" }), h("circle", { cx: "10.4774", cy: "10.4774", r: "9.31343", stroke: "#E4E2E0", "stroke-width": "2.32836" }), h("path", { d: "M7.81841 13.2929L13.3154 7.7959", stroke: "#B00C15", "stroke-width": "1.61692", "stroke-linecap": "round" }), h("path", { d: "M13.4062 13.2929L7.90918 7.7959", stroke: "#B00C15", "stroke-width": "1.61692", "stroke-linecap": "round" })))))))));
|
|
265
|
+
}
|
|
266
|
+
// If no <SVG> Element defined at this point
|
|
267
|
+
if (!this.svgElement) {
|
|
268
|
+
// Render slot content
|
|
269
|
+
return (h(Host, null, h("div", Object.assign({ class: "r-illustration" }, styleAttrs), h("slot", null))));
|
|
270
|
+
}
|
|
271
|
+
// Determine the current effective theme
|
|
272
|
+
const effectiveTheme = this.theme === 'auto'
|
|
273
|
+
? this.detectedTheme : this.theme;
|
|
274
|
+
// Render SVG with wrapper element to ensure CSS variables cascade
|
|
275
|
+
return (h(Host, null, h("div", Object.assign({ class: "r-illustration" }, styleAttrs), h("svg", Object.assign({}, this.svgAttributes, { "data-theme": effectiveTheme, ref: (el) => el && (el.innerHTML = this._buildSvgContent()) })))));
|
|
276
|
+
}
|
|
277
|
+
static get is() { return "r-illustration"; }
|
|
278
|
+
static get encapsulation() { return "shadow"; }
|
|
279
|
+
static get originalStyleUrls() {
|
|
280
|
+
return {
|
|
281
|
+
"$": ["illustration.scss"]
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
static get styleUrls() {
|
|
285
|
+
return {
|
|
286
|
+
"$": ["illustration.css"]
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
static get properties() {
|
|
290
|
+
return {
|
|
291
|
+
"name": {
|
|
292
|
+
"type": "string",
|
|
293
|
+
"attribute": "name",
|
|
294
|
+
"mutable": false,
|
|
295
|
+
"complexType": {
|
|
296
|
+
"original": "IllustrationName",
|
|
297
|
+
"resolved": "string",
|
|
298
|
+
"references": {
|
|
299
|
+
"IllustrationName": {
|
|
300
|
+
"location": "import",
|
|
301
|
+
"path": "./exports",
|
|
302
|
+
"id": "src/components/illustration/exports.ts::IllustrationName"
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
},
|
|
306
|
+
"required": false,
|
|
307
|
+
"optional": true,
|
|
308
|
+
"docs": {
|
|
309
|
+
"tags": [],
|
|
310
|
+
"text": "Name of illustration to select from the set"
|
|
311
|
+
},
|
|
312
|
+
"getter": false,
|
|
313
|
+
"setter": false,
|
|
314
|
+
"reflect": true
|
|
315
|
+
},
|
|
316
|
+
"width": {
|
|
317
|
+
"type": "string",
|
|
318
|
+
"attribute": "width",
|
|
319
|
+
"mutable": false,
|
|
320
|
+
"complexType": {
|
|
321
|
+
"original": "string",
|
|
322
|
+
"resolved": "string",
|
|
323
|
+
"references": {}
|
|
324
|
+
},
|
|
325
|
+
"required": false,
|
|
326
|
+
"optional": true,
|
|
327
|
+
"docs": {
|
|
328
|
+
"tags": [],
|
|
329
|
+
"text": "Defines initial width of an illustration."
|
|
330
|
+
},
|
|
331
|
+
"getter": false,
|
|
332
|
+
"setter": false,
|
|
333
|
+
"reflect": true,
|
|
334
|
+
"defaultValue": "'342px'"
|
|
335
|
+
},
|
|
336
|
+
"theme": {
|
|
337
|
+
"type": "string",
|
|
338
|
+
"attribute": "theme",
|
|
339
|
+
"mutable": false,
|
|
340
|
+
"complexType": {
|
|
341
|
+
"original": "IllustrationTheme",
|
|
342
|
+
"resolved": "\"auto\" | \"dark\" | \"light\"",
|
|
343
|
+
"references": {
|
|
344
|
+
"IllustrationTheme": {
|
|
345
|
+
"location": "import",
|
|
346
|
+
"path": "./exports",
|
|
347
|
+
"id": "src/components/illustration/exports.ts::IllustrationTheme"
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
},
|
|
351
|
+
"required": false,
|
|
352
|
+
"optional": false,
|
|
353
|
+
"docs": {
|
|
354
|
+
"tags": [],
|
|
355
|
+
"text": "Theme mode for illustration rendering"
|
|
356
|
+
},
|
|
357
|
+
"getter": false,
|
|
358
|
+
"setter": false,
|
|
359
|
+
"reflect": true,
|
|
360
|
+
"defaultValue": "'auto'"
|
|
361
|
+
},
|
|
362
|
+
"minWidth": {
|
|
363
|
+
"type": "string",
|
|
364
|
+
"attribute": "min-width",
|
|
365
|
+
"mutable": false,
|
|
366
|
+
"complexType": {
|
|
367
|
+
"original": "string",
|
|
368
|
+
"resolved": "string",
|
|
369
|
+
"references": {}
|
|
370
|
+
},
|
|
371
|
+
"required": false,
|
|
372
|
+
"optional": true,
|
|
373
|
+
"docs": {
|
|
374
|
+
"tags": [],
|
|
375
|
+
"text": "Minimum width constraint for responsive behavior"
|
|
376
|
+
},
|
|
377
|
+
"getter": false,
|
|
378
|
+
"setter": false,
|
|
379
|
+
"reflect": false
|
|
380
|
+
},
|
|
381
|
+
"maxWidth": {
|
|
382
|
+
"type": "string",
|
|
383
|
+
"attribute": "max-width",
|
|
384
|
+
"mutable": false,
|
|
385
|
+
"complexType": {
|
|
386
|
+
"original": "string",
|
|
387
|
+
"resolved": "string",
|
|
388
|
+
"references": {}
|
|
389
|
+
},
|
|
390
|
+
"required": false,
|
|
391
|
+
"optional": true,
|
|
392
|
+
"docs": {
|
|
393
|
+
"tags": [],
|
|
394
|
+
"text": "Maximum width constraint for responsive behavior"
|
|
395
|
+
},
|
|
396
|
+
"getter": false,
|
|
397
|
+
"setter": false,
|
|
398
|
+
"reflect": false
|
|
399
|
+
},
|
|
400
|
+
"svgTitle": {
|
|
401
|
+
"type": "string",
|
|
402
|
+
"attribute": "svg-title",
|
|
403
|
+
"mutable": false,
|
|
404
|
+
"complexType": {
|
|
405
|
+
"original": "string",
|
|
406
|
+
"resolved": "string",
|
|
407
|
+
"references": {}
|
|
408
|
+
},
|
|
409
|
+
"required": false,
|
|
410
|
+
"optional": true,
|
|
411
|
+
"docs": {
|
|
412
|
+
"tags": [],
|
|
413
|
+
"text": "Optional title element to be added inside the SVG for accessibility"
|
|
414
|
+
},
|
|
415
|
+
"getter": false,
|
|
416
|
+
"setter": false,
|
|
417
|
+
"reflect": false
|
|
418
|
+
},
|
|
419
|
+
"svgDescription": {
|
|
420
|
+
"type": "string",
|
|
421
|
+
"attribute": "svg-description",
|
|
422
|
+
"mutable": false,
|
|
423
|
+
"complexType": {
|
|
424
|
+
"original": "string",
|
|
425
|
+
"resolved": "string",
|
|
426
|
+
"references": {}
|
|
427
|
+
},
|
|
428
|
+
"required": false,
|
|
429
|
+
"optional": true,
|
|
430
|
+
"docs": {
|
|
431
|
+
"tags": [],
|
|
432
|
+
"text": "Optional description element to be added inside the SVG for accessibility"
|
|
433
|
+
},
|
|
434
|
+
"getter": false,
|
|
435
|
+
"setter": false,
|
|
436
|
+
"reflect": false
|
|
437
|
+
},
|
|
438
|
+
"errorMessage": {
|
|
439
|
+
"type": "string",
|
|
440
|
+
"attribute": "error-message",
|
|
441
|
+
"mutable": false,
|
|
442
|
+
"complexType": {
|
|
443
|
+
"original": "string",
|
|
444
|
+
"resolved": "string",
|
|
445
|
+
"references": {}
|
|
446
|
+
},
|
|
447
|
+
"required": false,
|
|
448
|
+
"optional": true,
|
|
449
|
+
"docs": {
|
|
450
|
+
"tags": [],
|
|
451
|
+
"text": "Error message text to display when illustration fails to load"
|
|
452
|
+
},
|
|
453
|
+
"getter": false,
|
|
454
|
+
"setter": false,
|
|
455
|
+
"reflect": false,
|
|
456
|
+
"defaultValue": "'Failed to load illustration'"
|
|
457
|
+
},
|
|
458
|
+
"emptyImageTitle": {
|
|
459
|
+
"type": "string",
|
|
460
|
+
"attribute": "empty-image-title",
|
|
461
|
+
"mutable": false,
|
|
462
|
+
"complexType": {
|
|
463
|
+
"original": "string",
|
|
464
|
+
"resolved": "string",
|
|
465
|
+
"references": {}
|
|
466
|
+
},
|
|
467
|
+
"required": false,
|
|
468
|
+
"optional": true,
|
|
469
|
+
"docs": {
|
|
470
|
+
"tags": [],
|
|
471
|
+
"text": "Accessibility: title for the image representing \"failed-to-load\" state"
|
|
472
|
+
},
|
|
473
|
+
"getter": false,
|
|
474
|
+
"setter": false,
|
|
475
|
+
"reflect": false,
|
|
476
|
+
"defaultValue": "'Failed to load illustration'"
|
|
477
|
+
},
|
|
478
|
+
"emptyMarkerTitle": {
|
|
479
|
+
"type": "string",
|
|
480
|
+
"attribute": "empty-marker-title",
|
|
481
|
+
"mutable": false,
|
|
482
|
+
"complexType": {
|
|
483
|
+
"original": "string",
|
|
484
|
+
"resolved": "string",
|
|
485
|
+
"references": {}
|
|
486
|
+
},
|
|
487
|
+
"required": false,
|
|
488
|
+
"optional": true,
|
|
489
|
+
"docs": {
|
|
490
|
+
"tags": [],
|
|
491
|
+
"text": "Accessibility: title for the marker representing \"failed-to-load\" state"
|
|
492
|
+
},
|
|
493
|
+
"getter": false,
|
|
494
|
+
"setter": false,
|
|
495
|
+
"reflect": false,
|
|
496
|
+
"defaultValue": "'Failed to load illustration marker'"
|
|
497
|
+
}
|
|
498
|
+
};
|
|
499
|
+
}
|
|
500
|
+
static get states() {
|
|
501
|
+
return {
|
|
502
|
+
"detectedTheme": {},
|
|
503
|
+
"error": {}
|
|
504
|
+
};
|
|
505
|
+
}
|
|
506
|
+
static get events() {
|
|
507
|
+
return [{
|
|
508
|
+
"method": "rFailed",
|
|
509
|
+
"name": "rFailed",
|
|
510
|
+
"bubbles": true,
|
|
511
|
+
"cancelable": true,
|
|
512
|
+
"composed": true,
|
|
513
|
+
"docs": {
|
|
514
|
+
"tags": [],
|
|
515
|
+
"text": "Emitted when illustration fails to load"
|
|
516
|
+
},
|
|
517
|
+
"complexType": {
|
|
518
|
+
"original": "void",
|
|
519
|
+
"resolved": "void",
|
|
520
|
+
"references": {}
|
|
521
|
+
}
|
|
522
|
+
}, {
|
|
523
|
+
"method": "rComplete",
|
|
524
|
+
"name": "rComplete",
|
|
525
|
+
"bubbles": true,
|
|
526
|
+
"cancelable": true,
|
|
527
|
+
"composed": true,
|
|
528
|
+
"docs": {
|
|
529
|
+
"tags": [],
|
|
530
|
+
"text": "Emitted when illustration completes loading"
|
|
531
|
+
},
|
|
532
|
+
"complexType": {
|
|
533
|
+
"original": "void",
|
|
534
|
+
"resolved": "void",
|
|
535
|
+
"references": {}
|
|
536
|
+
}
|
|
537
|
+
}];
|
|
538
|
+
}
|
|
539
|
+
static get elementRef() { return "host"; }
|
|
540
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
:host {
|
|
2
|
+
display: inline-flex;
|
|
3
|
+
svg {
|
|
4
|
+
width: 100%;
|
|
5
|
+
height: auto;
|
|
6
|
+
vertical-align: top;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
:host([theme="auto"]) {
|
|
11
|
+
color-scheme: light dark;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
:host([theme="light"]) {
|
|
15
|
+
color-scheme: light;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
:host([theme="dark"]) {
|
|
19
|
+
color-scheme: dark;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
:host([data-error="true"]) {
|
|
23
|
+
.status {
|
|
24
|
+
background: var(--r-illustration--status--background, var(--r-haze-500));
|
|
25
|
+
height: var(--r-illustration--status--height, 100%);
|
|
26
|
+
display: var(--r-illustration--status--display, flex);
|
|
27
|
+
justify-content: var(--r-illustration--status--justify-content, center);
|
|
28
|
+
align-items: var(--r-illustration--status--align-items, center);
|
|
29
|
+
aspect-ratio: var(--r-illustration--status--aspect-ratio, 342 / 176);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.status-icon {
|
|
33
|
+
width: var(--r-illustration--status-info--width, clamp(42px, 18%, 72px));
|
|
34
|
+
position: var(--r-illustration--status-info--position, relative);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.status-marker {
|
|
38
|
+
width: var(--r-illustration--status-marker--width, clamp(16px, 40%, 22px));
|
|
39
|
+
position: var(--r-illustration--status-marker--position, absolute);
|
|
40
|
+
top: var(--r-illustration--status-marker--top, 100%);
|
|
41
|
+
left: var(--r-illustration--status-marker--left, 100%);
|
|
42
|
+
transform: var(--r-illustration--status-marker--transform, translate(-65%, -65%));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.r-illustration {
|
|
47
|
+
display: var(--r-illustration--display, flex);
|
|
48
|
+
justify-content: var(--r-illustration--justify-content, center);
|
|
49
|
+
align-items: var(--r-illustration--align-items, center);
|
|
50
|
+
background: var(--r-illustration--background, transparent);
|
|
51
|
+
aspect-ratio: var(--r-illustration--aspect-ratio, 342 / 176);
|
|
52
|
+
width: var(--r-illustration--width, 100%);
|
|
53
|
+
min-width: var(--r-illustration--min-width, auto);
|
|
54
|
+
max-width: var(--r-illustration--max-width, 100%);
|
|
55
|
+
height: var(--r-illustration--height, auto);
|
|
56
|
+
}
|