@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.
Files changed (256) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/custom-elements.json +160 -1
  3. package/dist/cjs/{index-DJ4H_bFj.js → index-BnETQtSf.js} +9 -382
  4. package/dist/cjs/loader.cjs.js +2 -2
  5. package/dist/cjs/r-accordion-panel.cjs.entry.js +1 -1
  6. package/dist/cjs/r-accordion-section.cjs.entry.js +1 -1
  7. package/dist/cjs/r-accordion-trigger.cjs.entry.js +1 -1
  8. package/dist/cjs/r-accordion.cjs.entry.js +1 -1
  9. package/dist/cjs/r-alert.cjs.entry.js +9 -6
  10. package/dist/cjs/r-badge.cjs.entry.js +1 -1
  11. package/dist/cjs/r-button.cjs.entry.js +6 -2
  12. package/dist/cjs/r-checkbox-group.cjs.entry.js +1 -1
  13. package/dist/cjs/r-checkbox.cjs.entry.js +4 -4
  14. package/dist/cjs/r-design-system-devtools.cjs.entry.js +1 -1
  15. package/dist/cjs/r-dialog.cjs.entry.js +1 -1
  16. package/dist/cjs/r-hint_2.cjs.entry.js +3 -3
  17. package/dist/cjs/r-icon-button_2.cjs.entry.js +24 -4
  18. package/dist/cjs/r-icon.cjs.entry.js +2 -2
  19. package/dist/cjs/r-illustration.cjs.entry.js +396 -0
  20. package/dist/cjs/r-input-code.cjs.entry.js +34 -12
  21. package/dist/cjs/r-input-date.cjs.entry.js +7 -7
  22. package/dist/cjs/r-input-password.cjs.entry.js +3 -3
  23. package/dist/cjs/r-input-phone-number.cjs.entry.js +4 -4
  24. package/dist/cjs/r-input.cjs.entry.js +5 -4
  25. package/dist/cjs/r-list-item.cjs.entry.js +1 -1
  26. package/dist/cjs/r-pagination.cjs.entry.js +56 -50
  27. package/dist/cjs/r-panel.cjs.entry.js +3 -3
  28. package/dist/cjs/r-popover-action.cjs.entry.js +2 -2
  29. package/dist/cjs/r-popover-content.cjs.entry.js +2 -2
  30. package/dist/cjs/r-popover-headline.cjs.entry.js +2 -2
  31. package/dist/cjs/r-popover-trigger.cjs.entry.js +2 -2
  32. package/dist/cjs/r-popover.cjs.entry.js +46 -5
  33. package/dist/cjs/r-progress-bar.cjs.entry.js +2 -2
  34. package/dist/cjs/r-radio-button-description.cjs.entry.js +2 -2
  35. package/dist/cjs/r-radio-button-leading.cjs.entry.js +2 -2
  36. package/dist/cjs/r-radio-button-title.cjs.entry.js +2 -2
  37. package/dist/cjs/r-radio-button-trailing.cjs.entry.js +2 -2
  38. package/dist/cjs/r-radio-button.cjs.entry.js +8 -7
  39. package/dist/cjs/r-radio-group.cjs.entry.js +83 -10
  40. package/dist/cjs/r-select-option.cjs.entry.js +2 -2
  41. package/dist/cjs/r-select.cjs.entry.js +6 -4
  42. package/dist/cjs/r-skip-link.cjs.entry.js +2 -2
  43. package/dist/cjs/r-stepper-item.cjs.entry.js +19 -4
  44. package/dist/cjs/r-stepper.cjs.entry.js +76 -3
  45. package/dist/cjs/r-tab-panel.cjs.entry.js +2 -2
  46. package/dist/cjs/r-tab.cjs.entry.js +3 -3
  47. package/dist/cjs/r-tabs-list.cjs.entry.js +4 -4
  48. package/dist/cjs/r-tabs.cjs.entry.js +2 -2
  49. package/dist/cjs/r-textarea.cjs.entry.js +1 -1
  50. package/dist/cjs/r-toast-group.cjs.entry.js +13 -4
  51. package/dist/cjs/r-toast.cjs.entry.js +87 -18
  52. package/dist/cjs/web-components.cjs.js +2 -2
  53. package/dist/collection/collection-manifest.json +1 -0
  54. package/dist/collection/components/alert/alert.css +4 -3
  55. package/dist/collection/components/alert/alert.js +7 -4
  56. package/dist/collection/components/button/button.js +30 -1
  57. package/dist/collection/components/button/exports.js +1 -0
  58. package/dist/collection/components/checkbox/checkbox.js +3 -3
  59. package/dist/collection/components/icon/exports.js +1 -1
  60. package/dist/collection/components/icon/icon.js +1 -1
  61. package/dist/collection/components/icon/riverty-kit.js +1 -1
  62. package/dist/collection/components/illustration/data.js +112 -0
  63. package/dist/collection/components/illustration/exports.js +3 -0
  64. package/dist/collection/components/illustration/illustration.js +540 -0
  65. package/dist/collection/components/illustration/illustration.scss +56 -0
  66. package/dist/collection/components/illustration/illustrations-ui-kit.js +2 -0
  67. package/dist/collection/components/input/exports.js +1 -0
  68. package/dist/collection/components/input/input.css +3 -0
  69. package/dist/collection/components/input/input.js +47 -2
  70. package/dist/collection/components/input-code/input-code.css +6 -0
  71. package/dist/collection/components/input-code/input-code.js +48 -10
  72. package/dist/collection/components/input-date/input-date.js +6 -6
  73. package/dist/collection/components/input-password/input-password.js +2 -2
  74. package/dist/collection/components/input-phone-number/input-phone-number.js +3 -3
  75. package/dist/collection/components/label/label.js +2 -2
  76. package/dist/collection/components/pagination/pagination.css +33 -72
  77. package/dist/collection/components/pagination/pagination.js +194 -48
  78. package/dist/collection/components/panel/panel.js +2 -2
  79. package/dist/collection/components/popover/popover.css +0 -1
  80. package/dist/collection/components/popover/popover.js +44 -3
  81. package/dist/collection/components/popover-action/popover-action.js +1 -1
  82. package/dist/collection/components/popover-content/popover-content.js +1 -1
  83. package/dist/collection/components/popover-headline/popover-headline.js +1 -1
  84. package/dist/collection/components/popover-trigger/popover-trigger.js +1 -1
  85. package/dist/collection/components/progress-bar/progress-bar.js +1 -1
  86. package/dist/collection/components/radio-button/radio-button.js +7 -6
  87. package/dist/collection/components/radio-button-description/radio-button-description.js +1 -1
  88. package/dist/collection/components/radio-button-leading/radio-button-leading.js +1 -1
  89. package/dist/collection/components/radio-button-title/radio-button-title.js +1 -1
  90. package/dist/collection/components/radio-button-trailing/radio-button-trailing.js +1 -1
  91. package/dist/collection/components/radio-group/radio-group.css +4 -1
  92. package/dist/collection/components/radio-group/radio-group.js +100 -8
  93. package/dist/collection/components/select/select.js +5 -3
  94. package/dist/collection/components/select-option/select-option.js +1 -1
  95. package/dist/collection/components/skip-link/skip-link.js +1 -1
  96. package/dist/collection/components/stepper/stepper.css +4 -1
  97. package/dist/collection/components/stepper/stepper.js +125 -1
  98. package/dist/collection/components/stepper-item/stepper-item.css +22 -9
  99. package/dist/collection/components/stepper-item/stepper-item.js +36 -2
  100. package/dist/collection/components/tab/tab.js +2 -2
  101. package/dist/collection/components/tab-panel/tab-panel.js +1 -1
  102. package/dist/collection/components/tabs/tabs.js +1 -1
  103. package/dist/collection/components/tabs-list/tabs-list.js +3 -3
  104. package/dist/collection/components/toast/toast.css +9 -9
  105. package/dist/collection/components/toast/toast.js +109 -21
  106. package/dist/collection/components/toast-group/toast-group.css +5 -11
  107. package/dist/collection/components/toast-group/toast-group.js +12 -3
  108. package/dist/collection/components/tooltip/tooltip.js +23 -3
  109. package/dist/esm/{index-Da7qOBFr.js → index-CTxpqopm.js} +9 -382
  110. package/dist/esm/loader.js +3 -3
  111. package/dist/esm/r-accordion-panel.entry.js +1 -1
  112. package/dist/esm/r-accordion-section.entry.js +1 -1
  113. package/dist/esm/r-accordion-trigger.entry.js +1 -1
  114. package/dist/esm/r-accordion.entry.js +1 -1
  115. package/dist/esm/r-alert.entry.js +9 -6
  116. package/dist/esm/r-badge.entry.js +1 -1
  117. package/dist/esm/r-button.entry.js +6 -2
  118. package/dist/esm/r-checkbox-group.entry.js +1 -1
  119. package/dist/esm/r-checkbox.entry.js +4 -4
  120. package/dist/esm/r-design-system-devtools.entry.js +1 -1
  121. package/dist/esm/r-dialog.entry.js +1 -1
  122. package/dist/esm/r-hint_2.entry.js +3 -3
  123. package/dist/esm/r-icon-button_2.entry.js +24 -4
  124. package/dist/esm/r-icon.entry.js +2 -2
  125. package/dist/esm/r-illustration.entry.js +394 -0
  126. package/dist/esm/r-input-code.entry.js +34 -12
  127. package/dist/esm/r-input-date.entry.js +7 -7
  128. package/dist/esm/r-input-password.entry.js +3 -3
  129. package/dist/esm/r-input-phone-number.entry.js +4 -4
  130. package/dist/esm/r-input.entry.js +5 -4
  131. package/dist/esm/r-list-item.entry.js +1 -1
  132. package/dist/esm/r-pagination.entry.js +56 -50
  133. package/dist/esm/r-panel.entry.js +3 -3
  134. package/dist/esm/r-popover-action.entry.js +2 -2
  135. package/dist/esm/r-popover-content.entry.js +2 -2
  136. package/dist/esm/r-popover-headline.entry.js +2 -2
  137. package/dist/esm/r-popover-trigger.entry.js +2 -2
  138. package/dist/esm/r-popover.entry.js +46 -5
  139. package/dist/esm/r-progress-bar.entry.js +2 -2
  140. package/dist/esm/r-radio-button-description.entry.js +2 -2
  141. package/dist/esm/r-radio-button-leading.entry.js +2 -2
  142. package/dist/esm/r-radio-button-title.entry.js +2 -2
  143. package/dist/esm/r-radio-button-trailing.entry.js +2 -2
  144. package/dist/esm/r-radio-button.entry.js +8 -7
  145. package/dist/esm/r-radio-group.entry.js +83 -10
  146. package/dist/esm/r-select-option.entry.js +2 -2
  147. package/dist/esm/r-select.entry.js +6 -4
  148. package/dist/esm/r-skip-link.entry.js +2 -2
  149. package/dist/esm/r-stepper-item.entry.js +19 -4
  150. package/dist/esm/r-stepper.entry.js +76 -3
  151. package/dist/esm/r-tab-panel.entry.js +2 -2
  152. package/dist/esm/r-tab.entry.js +3 -3
  153. package/dist/esm/r-tabs-list.entry.js +4 -4
  154. package/dist/esm/r-tabs.entry.js +2 -2
  155. package/dist/esm/r-textarea.entry.js +1 -1
  156. package/dist/esm/r-toast-group.entry.js +13 -4
  157. package/dist/esm/r-toast.entry.js +87 -18
  158. package/dist/esm/web-components.js +3 -3
  159. package/dist/types/components/alert/alert.d.ts +1 -0
  160. package/dist/types/components/button/button.d.ts +8 -1
  161. package/dist/types/components/button/exports.d.ts +2 -0
  162. package/dist/types/components/icon/exports.d.ts +1 -1
  163. package/dist/types/components/icon/riverty-kit.d.ts +1 -1
  164. package/dist/types/components/illustration/data.d.ts +52 -0
  165. package/dist/types/components/illustration/exports.d.ts +23 -0
  166. package/dist/types/components/illustration/illustration.d.ts +51 -0
  167. package/dist/types/components/illustration/illustrations-ui-kit.d.ts +21 -0
  168. package/dist/types/components/input/exports.d.ts +2 -0
  169. package/dist/types/components/input/input.d.ts +15 -1
  170. package/dist/types/components/input-code/input-code.d.ts +15 -1
  171. package/dist/types/components/pagination/pagination.d.ts +19 -0
  172. package/dist/types/components/popover/popover.d.ts +9 -0
  173. package/dist/types/components/radio-group/radio-group.d.ts +16 -0
  174. package/dist/types/components/stepper/stepper.d.ts +11 -0
  175. package/dist/types/components/stepper-item/stepper-item.d.ts +7 -0
  176. package/dist/types/components/toast/toast.d.ts +10 -4
  177. package/dist/types/components/tooltip/tooltip.d.ts +5 -0
  178. package/dist/types/components.d.ts +273 -7
  179. package/dist/web-components/p-02b22f8e.entry.js +1 -0
  180. package/dist/web-components/{p-d054eb4d.entry.js → p-075a8dc8.entry.js} +1 -1
  181. package/dist/web-components/{p-8a66d20c.entry.js → p-0a34d33b.entry.js} +1 -1
  182. package/dist/web-components/{p-8c31cbd5.entry.js → p-10cc9983.entry.js} +1 -1
  183. package/dist/web-components/{p-d7726e46.entry.js → p-253068b9.entry.js} +1 -1
  184. package/dist/web-components/{p-3884c6e7.entry.js → p-3b8c8951.entry.js} +1 -1
  185. package/dist/web-components/{p-550e2237.entry.js → p-3beacdab.entry.js} +1 -1
  186. package/dist/web-components/p-4214867d.entry.js +1 -0
  187. package/dist/web-components/{p-3f60c6c0.entry.js → p-42c857e9.entry.js} +1 -1
  188. package/dist/web-components/{p-7fed6f4d.entry.js → p-44f87e16.entry.js} +1 -1
  189. package/dist/web-components/p-477614c5.entry.js +1 -0
  190. package/dist/web-components/{p-1da75540.entry.js → p-495ba3d2.entry.js} +1 -1
  191. package/dist/web-components/{p-19407a14.entry.js → p-4de76291.entry.js} +1 -1
  192. package/dist/web-components/{p-cd5daad2.entry.js → p-55600d47.entry.js} +1 -1
  193. package/dist/web-components/{p-c95b6470.entry.js → p-562051aa.entry.js} +1 -1
  194. package/dist/web-components/p-5b850e0f.entry.js +1 -0
  195. package/dist/web-components/p-6013dfc8.entry.js +1 -0
  196. package/dist/web-components/{p-6cc2ea2c.entry.js → p-62e7ae04.entry.js} +1 -1
  197. package/dist/web-components/p-71519d37.entry.js +1 -0
  198. package/dist/web-components/p-88f7b47f.entry.js +1 -0
  199. package/dist/web-components/p-8975a6a3.entry.js +1 -0
  200. package/dist/web-components/{p-6bb44ec6.entry.js → p-8e125826.entry.js} +1 -1
  201. package/dist/web-components/p-91cc0bde.entry.js +1 -0
  202. package/dist/web-components/{p-0347feff.entry.js → p-93435fcd.entry.js} +1 -1
  203. package/dist/web-components/p-947969d7.entry.js +1 -0
  204. package/dist/web-components/{p-cdd88c5a.entry.js → p-95396b5c.entry.js} +1 -1
  205. package/dist/web-components/p-9de3a1a5.entry.js +1 -0
  206. package/dist/web-components/p-9f583ed1.entry.js +1 -0
  207. package/dist/web-components/p-CTxpqopm.js +2 -0
  208. package/dist/web-components/{p-5eeb7002.entry.js → p-a1086abe.entry.js} +1 -1
  209. package/dist/web-components/{p-f9d5004c.entry.js → p-bbba6d79.entry.js} +1 -1
  210. package/dist/web-components/{p-c478712b.entry.js → p-bde44ec4.entry.js} +1 -1
  211. package/dist/web-components/p-bfc7e6c0.entry.js +1 -0
  212. package/dist/web-components/p-c1030394.entry.js +1 -0
  213. package/dist/web-components/p-c1f59ed1.entry.js +1 -0
  214. package/dist/web-components/{p-26ef77d6.entry.js → p-c80a5541.entry.js} +1 -1
  215. package/dist/web-components/{p-9ef1bbee.entry.js → p-c96ee61a.entry.js} +1 -1
  216. package/dist/web-components/{p-8dac326b.entry.js → p-caf8f067.entry.js} +1 -1
  217. package/dist/web-components/p-cc363c3d.entry.js +1 -0
  218. package/dist/web-components/p-cf4ff357.entry.js +1 -0
  219. package/dist/web-components/p-d0310ed4.entry.js +1 -0
  220. package/dist/web-components/p-d1412932.entry.js +1 -0
  221. package/dist/web-components/{p-62b788bf.entry.js → p-d2447e30.entry.js} +1 -1
  222. package/dist/web-components/p-dc9cca06.entry.js +1 -0
  223. package/dist/web-components/p-e5b943a2.entry.js +1 -0
  224. package/dist/web-components/{p-4cc58c6a.entry.js → p-e67b13df.entry.js} +1 -1
  225. package/dist/web-components/p-efec231a.entry.js +1 -0
  226. package/dist/web-components/{p-4595fa8e.entry.js → p-f867e4c3.entry.js} +1 -1
  227. package/dist/web-components/web-components.esm.js +1 -1
  228. package/package.json +5 -2
  229. package/dist/collection/components/icon/bundled-icons/all-kit.json +0 -1
  230. package/dist/collection/components/icon/bundled-icons/riverty-kit.json +0 -1
  231. package/dist/web-components/bundled-icons/all-kit.json +0 -1
  232. package/dist/web-components/bundled-icons/riverty-kit.json +0 -1
  233. package/dist/web-components/p-159822fe.entry.js +0 -1
  234. package/dist/web-components/p-4f261b63.entry.js +0 -1
  235. package/dist/web-components/p-50893211.entry.js +0 -1
  236. package/dist/web-components/p-589baaf9.entry.js +0 -1
  237. package/dist/web-components/p-60341de2.entry.js +0 -1
  238. package/dist/web-components/p-63fd817d.entry.js +0 -1
  239. package/dist/web-components/p-67fa3f84.entry.js +0 -1
  240. package/dist/web-components/p-70784685.entry.js +0 -1
  241. package/dist/web-components/p-7ce57332.entry.js +0 -1
  242. package/dist/web-components/p-92c7cf33.entry.js +0 -1
  243. package/dist/web-components/p-Da7qOBFr.js +0 -2
  244. package/dist/web-components/p-a7d22c76.entry.js +0 -1
  245. package/dist/web-components/p-b96d59ca.entry.js +0 -1
  246. package/dist/web-components/p-b98ab649.entry.js +0 -1
  247. package/dist/web-components/p-ba801820.entry.js +0 -1
  248. package/dist/web-components/p-bfc8c077.entry.js +0 -1
  249. package/dist/web-components/p-c05b05da.entry.js +0 -1
  250. package/dist/web-components/p-c1e748f2.entry.js +0 -1
  251. package/dist/web-components/p-d433a828.entry.js +0 -1
  252. package/dist/web-components/p-d819c8e5.entry.js +0 -1
  253. package/dist/web-components/p-e4dc60f0.entry.js +0 -1
  254. package/dist/web-components/p-f7adb875.entry.js +0 -1
  255. package/dist/collection/components/icon/{icon-data.js → data.js} +0 -0
  256. 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
+ }