@roadtrip/components 3.23.0 → 3.24.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/assets/assets.svg +1 -0
- package/assets/index.d.ts +7 -0
- package/assets/index.js +1 -0
- package/dist/assets/assets.svg +1 -0
- package/dist/assets/index.d.ts +7 -0
- package/dist/assets/index.js +1 -0
- package/dist/cjs/index-12592729.js +4 -0
- package/dist/cjs/index.cjs.js +2 -0
- package/dist/cjs/index.cjs.js.map +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/road-accordion.cjs.entry.js +1 -1
- package/dist/cjs/road-accordion.cjs.entry.js.map +1 -1
- package/dist/cjs/road-asset.cjs.entry.js +167 -0
- package/dist/cjs/road-asset.cjs.entry.js.map +1 -0
- package/dist/cjs/road-badge_14.cjs.entry.js +43 -6
- package/dist/cjs/road-badge_14.cjs.entry.js.map +1 -1
- package/dist/cjs/road-select-filter.cjs.entry.js +1 -1
- package/dist/cjs/road-select-filter.cjs.entry.js.map +1 -1
- package/dist/cjs/road-tab-button.cjs.entry.js +1 -1
- package/dist/cjs/road-tab-button.cjs.entry.js.map +1 -1
- package/dist/cjs/road-tooltip.cjs.entry.js +14 -2
- package/dist/cjs/road-tooltip.cjs.entry.js.map +1 -1
- package/dist/cjs/roadtrip.cjs.js +1 -1
- package/dist/cjs/utils-5483e9fa.js +82 -0
- package/dist/cjs/utils-5483e9fa.js.map +1 -0
- package/dist/collection/collection-manifest.json +1 -0
- package/dist/collection/components/accordion/accordion.css +0 -1
- package/dist/collection/components/asset/asset.css +22 -0
- package/dist/collection/components/asset/asset.js +231 -0
- package/dist/collection/components/asset/asset.js.map +1 -0
- package/dist/collection/components/asset/asset.stories.js +42 -0
- package/dist/collection/components/asset/request.js +33 -0
- package/dist/collection/components/asset/request.js.map +1 -0
- package/dist/collection/components/asset/svg/ecomobiliste-baseline-fr.svg +9 -0
- package/dist/collection/components/asset/svg/ecomobiliste-es.svg +22 -0
- package/dist/collection/components/asset/svg/ecomobiliste-fr.svg +9 -0
- package/dist/collection/components/asset/svg/ecomobiliste-inverse-baseline-fr.svg +9 -0
- package/dist/collection/components/asset/svg/ecomobiliste-inverse-es.svg +22 -0
- package/dist/collection/components/asset/svg/ecomobiliste-inverse-fr.svg +9 -0
- package/dist/collection/components/asset/svg/ecomobiliste-inverse-it.svg +21 -0
- package/dist/collection/components/asset/svg/ecomobiliste-it.svg +21 -0
- package/dist/collection/components/asset/utils.js +73 -0
- package/dist/collection/components/asset/utils.js.map +1 -0
- package/dist/collection/components/asset/validate.js +44 -0
- package/dist/collection/components/asset/validate.js.map +1 -0
- package/dist/collection/components/button/button.css +9 -2
- package/dist/collection/components/counter/counter.css +0 -5
- package/dist/collection/components/counter/counter.js +11 -1
- package/dist/collection/components/counter/counter.js.map +1 -1
- package/dist/collection/components/drawer/drawer.js +63 -2
- package/dist/collection/components/drawer/drawer.js.map +1 -1
- package/dist/collection/components/drawer/drawer.stories.js +9 -1
- package/dist/collection/components/input/input.css +2 -2
- package/dist/collection/components/select-filter/select-filter.css +1 -2
- package/dist/collection/components/tab-button/tab-button.css +1 -0
- package/dist/collection/components/tooltip/tooltip.css +5 -0
- package/dist/collection/components/tooltip/tooltip.js +14 -2
- package/dist/collection/components/tooltip/tooltip.js.map +1 -1
- package/dist/collection/index.js +1 -0
- package/dist/collection/index.js.map +1 -1
- package/dist/esm/index-52302079.js +4 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/road-accordion.entry.js +1 -1
- package/dist/esm/road-accordion.entry.js.map +1 -1
- package/dist/esm/road-asset.entry.js +163 -0
- package/dist/esm/road-asset.entry.js.map +1 -0
- package/dist/esm/road-badge_14.entry.js +43 -6
- package/dist/esm/road-badge_14.entry.js.map +1 -1
- package/dist/esm/road-select-filter.entry.js +1 -1
- package/dist/esm/road-select-filter.entry.js.map +1 -1
- package/dist/esm/road-tab-button.entry.js +1 -1
- package/dist/esm/road-tab-button.entry.js.map +1 -1
- package/dist/esm/road-tooltip.entry.js +14 -2
- package/dist/esm/road-tooltip.entry.js.map +1 -1
- package/dist/esm/roadtrip.js +1 -1
- package/dist/esm/utils-158dc960.js +77 -0
- package/dist/esm/utils-158dc960.js.map +1 -0
- package/dist/html.html-data.json +52 -1
- package/dist/roadtrip/index.esm.js +1 -1
- package/dist/roadtrip/p-172d4877.entry.js +2 -0
- package/dist/roadtrip/p-172d4877.entry.js.map +1 -0
- package/dist/roadtrip/{p-bc217d07.entry.js → p-21b1569a.entry.js} +2 -2
- package/dist/roadtrip/{p-bc217d07.entry.js.map → p-21b1569a.entry.js.map} +1 -1
- package/dist/roadtrip/p-3c2da24f.entry.js +2 -0
- package/dist/roadtrip/p-3c2da24f.entry.js.map +1 -0
- package/dist/roadtrip/p-4111f5f2.entry.js +2 -0
- package/dist/roadtrip/p-4111f5f2.entry.js.map +1 -0
- package/dist/roadtrip/p-5829857c.entry.js +2 -0
- package/dist/roadtrip/p-5829857c.entry.js.map +1 -0
- package/dist/roadtrip/p-b65252b7.entry.js +2 -0
- package/dist/roadtrip/p-b65252b7.entry.js.map +1 -0
- package/dist/roadtrip/p-c0f80d9b.js +2 -0
- package/dist/roadtrip/p-c0f80d9b.js.map +1 -0
- package/dist/roadtrip/roadtrip.css +1 -1
- package/dist/roadtrip/roadtrip.esm.js +1 -1
- package/dist/roadtrip/roadtrip.esm.js.map +1 -1
- package/dist/roadtrip/svg/ecomobiliste-baseline-fr.svg +9 -0
- package/dist/roadtrip/svg/ecomobiliste-es.svg +22 -0
- package/dist/roadtrip/svg/ecomobiliste-fr.svg +9 -0
- package/dist/roadtrip/svg/ecomobiliste-inverse-baseline-fr.svg +9 -0
- package/dist/roadtrip/svg/ecomobiliste-inverse-es.svg +22 -0
- package/dist/roadtrip/svg/ecomobiliste-inverse-fr.svg +9 -0
- package/dist/roadtrip/svg/ecomobiliste-inverse-it.svg +21 -0
- package/dist/roadtrip/svg/ecomobiliste-it.svg +21 -0
- package/dist/types/components/asset/asset.d.ts +44 -0
- package/dist/types/components/asset/request.d.ts +2 -0
- package/dist/types/components/asset/utils.d.ts +11 -0
- package/dist/types/components/asset/validate.d.ts +2 -0
- package/dist/types/components/drawer/drawer.d.ts +12 -0
- package/dist/types/components/tooltip/tooltip.d.ts +3 -1
- package/dist/types/components.d.ts +87 -2
- package/dist/types/index.d.ts +1 -0
- package/hydrate/index.js +171 -11
- package/package.json +2 -1
- package/dist/roadtrip/p-b09c076d.entry.js +0 -2
- package/dist/roadtrip/p-b09c076d.entry.js.map +0 -1
- package/dist/roadtrip/p-bc671fae.entry.js +0 -2
- package/dist/roadtrip/p-bc671fae.entry.js.map +0 -1
- package/dist/roadtrip/p-c653d32d.entry.js +0 -2
- package/dist/roadtrip/p-c653d32d.entry.js.map +0 -1
- package/dist/roadtrip/p-d5f9dfea.entry.js +0 -2
- package/dist/roadtrip/p-d5f9dfea.entry.js.map +0 -1
|
@@ -2,7 +2,7 @@ import { r as registerInstance, h } from './index-52302079.js';
|
|
|
2
2
|
import { n as navigationChevron } from './index-7a0158a4.js';
|
|
3
3
|
import './polyfill-dc7c89b2.js';
|
|
4
4
|
|
|
5
|
-
const accordionCss = ":host{--accordion-header-border:1px;--content-margin:0 var(--road-spacing-05) var(--road-spacing-04);--content-padding:var(--road-spacing-04) 0 0;--header-padding:var(--road-spacing-04) var(--road-spacing-05);--icon-color:var(--road-icon);--max-height:none;display:block
|
|
5
|
+
const accordionCss = ":host{--accordion-header-border:1px;--content-margin:0 var(--road-spacing-05) var(--road-spacing-04);--content-padding:var(--road-spacing-04) 0 0;--header-padding:var(--road-spacing-04) var(--road-spacing-05);--icon-color:var(--road-icon);--max-height:none;display:block}:host(.focus-visible){border:1px solid var(--road-primary)}.accordion{--max-height:none;overflow:hidden;font-family:var(--road-font, sans-serif);font-size:var(--road-body-small);line-height:1.5;color:var(--road-on-surface);background:var(--road-surface);border:1px solid;border-color:var(--road-outline-weak);border-radius:0.25rem;transition:max-height 0.3s ease-in-out}.accordion.accordion-light{background:none;border:0}.accordion[open]{max-height:var(--max-height)}.accordion[open] .accordion-arrow{transform:rotate(-90deg)}.accordion[open] .accordion-content{padding:var(--content-padding);margin:var(--content-margin)}.accordion-light[open] .accordion-light-content{margin:0 0 var(--road-spacing-04)}.accordion-light[open] .accordion-light-header::after{display:none}.accordion-trigger{box-sizing:border-box;display:block;border:1px solid transparent;border-radius:0.25rem;outline:0;-webkit-tap-highlight-color:rgba(0, 0, 0, 0)}.accordion-light .accordion-trigger:active{background:none}.accordion-trigger::-webkit-details-marker{display:none}.accordion-trigger.focus-visible{border-color:var(--road-primary)}.accordion-trigger:active{background:var(--road-surface-inverse)}.accordion-header{box-sizing:border-box;display:flex;align-items:center;justify-content:flex-start;padding:var(--header-padding);font-size:var(--road-body-medium);font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none}.accordion-light-header{position:relative;padding:var(--road-spacing-04) 0;font-size:var(--road-body-large)}.accordion-light--small .accordion-light-header{font-size:var(--road-body-medium)}.accordion-light--border .accordion-light-header::after{position:absolute;bottom:1px;width:98.3%;height:1px;content:\"\";background:var(--road-outline-weak)}.accordion-arrow{margin-left:auto;color:var(--icon-color);transform:rotate(90deg)}.accordion-light--small .accordion-arrow{width:1.5rem;height:1.5rem}::slotted([slot=\"header\"]){display:flex;align-items:center}:host(.accordion-icon-left){width:1.5rem;height:1.5rem;margin-right:1rem}.accordion-content{padding:0 0.5rem;margin:0 1rem;overflow:hidden;font-size:var(--road-body-medium);border-top:var(--accordion-header-border) solid var(--road-outline-weak)}.accordion-light-content{border-top:1px solid var(--road-outline-weak)}.accordion-light--border .accordion-light-content{border-top:1px solid var(--road-outline-weak);border-bottom:1px solid var(--road-outline-weak)}";
|
|
6
6
|
|
|
7
7
|
const Accordion = class {
|
|
8
8
|
constructor(hostRef) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"road-accordion.entry.js","mappings":";;;;AAAA,MAAM,YAAY,GAAG,
|
|
1
|
+
{"file":"road-accordion.entry.js","mappings":";;;;AAAA,MAAM,YAAY,GAAG,opFAAopF;;MCiB5pF,SAAS;;;;;;IAyBZ,YAAO,GAAG;MAChB,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;KAC5B,CAAC;kBAtB0C,KAAK;mBAKpB,KAAK;4BAKK,KAAK;mBAKd,KAAK;;EASnC,MAAM;IAEJ,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,GAAG,2BAA2B,GAAG,WAAW,CAAC;IAChF,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,GAAG,yCAAyC,GAAG,kBAAkB,CAAC;IAC3G,MAAM,qBAAqB,GAAG,IAAI,CAAC,OAAO,GAAG,2CAA2C,GAAG,mBAAmB,CAAC;IAC/G,MAAM,uBAAuB,GAAG,IAAI,CAAC,gBAAgB,GAAG,mDAAmD,GAAG,WAAW,CAAC;IAC1H,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,GAAG,kDAAkD,GAAG,WAAW,CAAC;IACvG,QACE,eAAS,KAAK,EAAE,GAAG,cAAc,IAAI,cAAc,IAAI,uBAAuB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,IACjG,eAAS,KAAK,EAAC,mBAAmB,mBAAgB,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAC,GAAG,EAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,IAAI,CAAC,OAAO,IAClH,WAAK,KAAK,EAAE,oBAAoB,IAC9B,YAAM,IAAI,EAAC,WAAW,GAAE,EACxB,YAAM,IAAI,EAAC,QAAQ,GAAE,EACrB,iBAAW,KAAK,EAAC,iBAAiB,EAAC,IAAI,EAAE,iBAAiB,GAAc,CACpE,CACE,EACV,WAAK,KAAK,EAAE,qBAAqB,IAC/B,eAAO,CACH,CACE,EACV;GACH;;;;;;","names":[],"sources":["src/components/accordion/accordion.css?tag=road-accordion&encapsulation=shadow","src/components/accordion/accordion.tsx"],"sourcesContent":["/*\n * Accordion\n *\n * For accessibility, we provide a style for focus only on Tab.\n * For enable this focus, load the javascript polyfill for focus-visible\n * (https://github.com/WICG/focus-visible).\n *\n * Index\n * - Accordion\n * - Button\n * - Content\n */\n\n/**\n * @prop --accordion-header-border: height of the border of the header\n * @prop --content-margin: margin of the accordion content\n * @prop --content-padding: padding of the accordion content\n * @prop --header-padding: padding of the accordion header\n * @prop --icon-color: color of the chevron icon\n * @prop --max-height: maximum height of the collapse content\n */\n\n:host {\n --accordion-header-border: 1px;\n --content-margin: 0 var(--road-spacing-05) var(--road-spacing-04);\n --content-padding: var(--road-spacing-04) 0 0;\n --header-padding: var(--road-spacing-04) var(--road-spacing-05);\n --icon-color: var(--road-icon);\n --max-height: none;\n\n display: block;\n}\n\n:host(.focus-visible){\n border: 1px solid var(--road-primary);\n}\n\n/* ACCORDION\n -------------------- */\n\n.accordion {\n --max-height: none;\n overflow: hidden;\n font-family: var(--road-font, sans-serif);\n font-size: var(--road-body-small);\n line-height: 1.5;\n color: var(--road-on-surface);\n background: var(--road-surface);\n border: 1px solid;\n border-color: var(--road-outline-weak);\n border-radius: 0.25rem;\n transition: max-height 0.3s ease-in-out;\n}\n\n.accordion.accordion-light {\n background: none;\n border: 0;\n}\n\n/**\n * Open state\n */\n\n.accordion[open] {\n max-height: var(--max-height);\n}\n\n.accordion[open] .accordion-arrow {\n transform: rotate(-90deg);\n}\n\n.accordion[open] .accordion-content {\n padding: var(--content-padding);\n margin: var(--content-margin);\n}\n\n.accordion-light[open] .accordion-light-content {\n margin: 0 0 var(--road-spacing-04);\n}\n\n.accordion-light[open] .accordion-light-header::after {\n display: none;\n}\n\n/* BUTTON\n -------------------- */\n\n.accordion-trigger {\n box-sizing: border-box;\n display: block;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n outline: 0;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\n.accordion-light .accordion-trigger:active{\n background: none;\n}\n\n.accordion-trigger::-webkit-details-marker { /* Remove chrome native arrow */\n display: none;\n}\n\n/**\n * Focus on Tab\n */\n\n.accordion-trigger.focus-visible {\n border-color: var(--road-primary);\n}\n\n/**\n * Active state\n */\n\n.accordion-trigger:active {\n background: var(--road-surface-inverse);\n}\n\n/**\n * .accordion-header is an additionnal div\n * because Safari doesn't support flexbox on <summary> element\n */\n\n.accordion-header {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n padding: var(--header-padding);\n font-size: var(--road-body-medium);\n font-weight: 700;\n cursor: pointer;\n user-select: none;\n}\n\n.accordion-light-header {\n position: relative;\n padding: var(--road-spacing-04) 0;\n font-size: var(--road-body-large);\n}\n\n.accordion-light--small .accordion-light-header {\n font-size: var(--road-body-medium);\n}\n\n.accordion-light--border .accordion-light-header::after {\n position: absolute;\n bottom: 1px;\n width: 98.3%;\n height: 1px;\n content: \"\";\n background: var(--road-outline-weak);\n}\n\n/**\n * Custom arrow\n */\n\n.accordion-arrow {\n margin-left: auto;\n color: var(--icon-color);\n transform: rotate(90deg);\n}\n\n.accordion-light--small .accordion-arrow {\n width: 1.5rem;\n height: 1.5rem;\n}\n\n::slotted([slot=\"header\"]){\n display: flex;\n align-items: center;\n}\n\n:host(.accordion-icon-left){\n width: 1.5rem;\n height: 1.5rem;\n margin-right: 1rem;\n}\n\n/* CONTENT\n -------------------- */\n\n.accordion-content {\n padding: 0 0.5rem;\n margin: 0 1rem;\n overflow: hidden;\n font-size: var(--road-body-medium);\n border-top: var(--accordion-header-border) solid var(--road-outline-weak);\n}\n\n.accordion-light-content {\n border-top: 1px solid var(--road-outline-weak);\n}\n\n.accordion-light--border .accordion-light-content {\n border-top: 1px solid var(--road-outline-weak);\n border-bottom: 1px solid var(--road-outline-weak);\n}\n","import { Component, Prop, h } from '@stencil/core';\nimport { navigationChevron } from '../../../icons';\nimport './../../utils/polyfill';\n\n/**\n * @slot header - Content of the header.\n * @slot - Content hidden in the accordion.\n * @slot icon-left - Icon of the alert, it should be a road-icon element.\n * `<road-icon name=\"alert-info-outline\" class=\"mr-16\"></road-icon>`\n\n */\n\n@Component({\n tag: 'road-accordion',\n styleUrl: 'accordion.css',\n shadow: true,\n})\nexport class Accordion {\n\n /**\n * Set to `true` to open the accordion and to `false` to close it.\n */\n @Prop({ mutable: true }) isOpen : boolean = false;\n\n /**\n * Set to `true` to remove border the accordion and to `false` to add border it.\n */\n @Prop() isLight : boolean = false;\n\n /**\n * Set to `true` to add a border in the header and the content only for the light accordion.\n */\n @Prop() isLightSeparator : boolean = false;\n\n /**\n * Set to `true` to add the small version only for the light accordion.\n */\n @Prop() isSmall : boolean = false;\n\n /**\n * Toggle the display when clicking header\n */\n private onClick = () => {\n this.isOpen = !this.isOpen;\n };\n\n render() {\n\n const accordionLight = this.isLight ? 'accordion accordion-light' : 'accordion';\n const accordionLightHeader = this.isLight ? 'accordion-header accordion-light-header' : 'accordion-header';\n const accordionLightContent = this.isLight ? 'accordion-content accordion-light-content' : 'accordion-content';\n const accordionLightSeparator = this.isLightSeparator ? 'accordion accordion-light accordion-light--border' : 'accordion';\n const accordionSmall = this.isSmall ? 'accordion accordion-light accordion-light--small' : 'accordion';\n return (\n <details class={`${accordionLight} ${accordionSmall} ${accordionLightSeparator}`} open={this.isOpen}>\n <summary class=\"accordion-trigger\" aria-expanded={`${this.isOpen}`} tabindex=\"0\" role=\"button\" onClick={this.onClick}>\n <div class={accordionLightHeader}>\n <slot name=\"icon-left\"/>\n <slot name=\"header\"/>\n <road-icon class=\"accordion-arrow\" icon={navigationChevron}></road-icon>\n </div>\n </summary>\n <div class={accordionLightContent}>\n <slot/>\n </div>\n </details>\n );\n }\n}"],"version":3}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { r as registerInstance, h, H as Host, a as getElement } from './index-52302079.js';
|
|
2
|
+
import { i as isStr, g as getUrl, b as getName } from './utils-158dc960.js';
|
|
3
|
+
|
|
4
|
+
const validateContent = (svgContent) => {
|
|
5
|
+
const div = document.createElement('div');
|
|
6
|
+
div.innerHTML = svgContent;
|
|
7
|
+
// setup this way to ensure it works on our buddy IE
|
|
8
|
+
for (let i = div.childNodes.length - 1; i >= 0; i--) {
|
|
9
|
+
if (div.childNodes[i].nodeName.toLowerCase() !== 'svg') {
|
|
10
|
+
div.removeChild(div.childNodes[i]);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
// must only have 1 root element
|
|
14
|
+
const svgElm = div.firstElementChild;
|
|
15
|
+
if (svgElm && svgElm.nodeName.toLowerCase() === 'svg') {
|
|
16
|
+
const svgClass = svgElm.getAttribute('class') || '';
|
|
17
|
+
svgElm.setAttribute('class', (svgClass + ' s-ion-icon').trim());
|
|
18
|
+
// root element must be an svg
|
|
19
|
+
// lets double check we've got valid elements
|
|
20
|
+
// do not allow scripts
|
|
21
|
+
if (isValid(svgElm)) {
|
|
22
|
+
return div.innerHTML;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return '';
|
|
26
|
+
};
|
|
27
|
+
const isValid = (elm) => {
|
|
28
|
+
if (elm.nodeType === 1) {
|
|
29
|
+
if (elm.nodeName.toLowerCase() === 'script') {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
for (let i = 0; i < elm.attributes.length; i++) {
|
|
33
|
+
const val = elm.attributes[i].value;
|
|
34
|
+
if (isStr(val) && val.toLowerCase().indexOf('on') === 0) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
for (let i = 0; i < elm.childNodes.length; i++) {
|
|
39
|
+
if (!isValid(elm.childNodes[i])) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return true;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const roadassetContent = new Map();
|
|
48
|
+
const requests = new Map();
|
|
49
|
+
const getAssetSvgContent = (url, sanitize) => {
|
|
50
|
+
// see if we already have a request for this url
|
|
51
|
+
let req = requests.get(url);
|
|
52
|
+
if (!req) {
|
|
53
|
+
if (typeof fetch !== 'undefined' && typeof document !== 'undefined') {
|
|
54
|
+
// we don't already have a request
|
|
55
|
+
// @ts-ignore
|
|
56
|
+
req = fetch(url).then((rsp) => {
|
|
57
|
+
if (rsp.ok) {
|
|
58
|
+
return rsp.text().then((svgContent) => {
|
|
59
|
+
if (svgContent && sanitize !== false) {
|
|
60
|
+
svgContent = validateContent(svgContent);
|
|
61
|
+
}
|
|
62
|
+
roadassetContent.set(url, svgContent || '');
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
roadassetContent.set(url, '');
|
|
66
|
+
});
|
|
67
|
+
// cache for the same requests
|
|
68
|
+
requests.set(url, req);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
// set to empty for ssr scenarios and resolve promise
|
|
72
|
+
roadassetContent.set(url, '');
|
|
73
|
+
return Promise.resolve();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return req;
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const assetCss = ":host{box-sizing:content-box;contain:strict;display:table}.icon-inner{width:-moz-fit-content;width:fit-content}:host svg{display:block;width:100%;height:100%}";
|
|
80
|
+
|
|
81
|
+
const Asset = class {
|
|
82
|
+
constructor(hostRef) {
|
|
83
|
+
registerInstance(this, hostRef);
|
|
84
|
+
this.assetSvgContent = undefined;
|
|
85
|
+
this.isVisible = false;
|
|
86
|
+
this.ariaLabel = undefined;
|
|
87
|
+
this.ariaHidden = undefined;
|
|
88
|
+
this.name = undefined;
|
|
89
|
+
this.src = undefined;
|
|
90
|
+
this.asset = undefined;
|
|
91
|
+
this.lazy = false;
|
|
92
|
+
this.sanitize = true;
|
|
93
|
+
}
|
|
94
|
+
componentWillLoad() {
|
|
95
|
+
this.waitUntilVisible(this.el, '50px', () => {
|
|
96
|
+
this.isVisible = true;
|
|
97
|
+
this.loadAsset();
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
disconnectedCallback() {
|
|
101
|
+
if (this.io) {
|
|
102
|
+
this.io.disconnect();
|
|
103
|
+
this.io = undefined;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
waitUntilVisible(el, rootMargin, cb) {
|
|
107
|
+
if (this.lazy && window.IntersectionObserver) {
|
|
108
|
+
const io = this.io = new window.IntersectionObserver((data) => {
|
|
109
|
+
if (data[0].isIntersecting) {
|
|
110
|
+
io.disconnect();
|
|
111
|
+
this.io = undefined;
|
|
112
|
+
cb();
|
|
113
|
+
}
|
|
114
|
+
}, { rootMargin });
|
|
115
|
+
io.observe(el);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
// browser doesn't support IntersectionObserver
|
|
119
|
+
// so just fallback to always show it
|
|
120
|
+
cb();
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
loadAsset() {
|
|
124
|
+
if (this.isVisible) {
|
|
125
|
+
const url = getUrl(this);
|
|
126
|
+
if (url) {
|
|
127
|
+
if (roadassetContent.has(url)) {
|
|
128
|
+
// sync if it's already loaded
|
|
129
|
+
this.assetSvgContent = roadassetContent.get(url);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
// async if it hasn't been loaded
|
|
133
|
+
getAssetSvgContent(url, this.sanitize).then(() => (this.assetSvgContent = roadassetContent.get(url)));
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (!this.ariaLabel && this.ariaHidden !== 'true') {
|
|
138
|
+
const label = getName(this.name, this.asset);
|
|
139
|
+
// user did not provide a label
|
|
140
|
+
// come up with the label based on the icon name
|
|
141
|
+
if (label) {
|
|
142
|
+
this.ariaLabel = label.replace(/-/g, ' ');
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
render() {
|
|
147
|
+
return (h(Host, { "aria-hidden": "true", role: "img" }, ((this.assetSvgContent !== '')
|
|
148
|
+
? h("div", { class: "icon-inner", innerHTML: this.assetSvgContent })
|
|
149
|
+
: h("div", { class: "icon-inner" }))));
|
|
150
|
+
}
|
|
151
|
+
static get assetsDirs() { return ["svg"]; }
|
|
152
|
+
get el() { return getElement(this); }
|
|
153
|
+
static get watchers() { return {
|
|
154
|
+
"name": ["loadAsset"],
|
|
155
|
+
"src": ["loadAsset"],
|
|
156
|
+
"asset": ["loadAsset"]
|
|
157
|
+
}; }
|
|
158
|
+
};
|
|
159
|
+
Asset.style = assetCss;
|
|
160
|
+
|
|
161
|
+
export { Asset as road_asset };
|
|
162
|
+
|
|
163
|
+
//# sourceMappingURL=road-asset.entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"file":"road-asset.entry.js","mappings":"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","names":[],"sources":["src/components/asset/validate.ts","src/components/asset/request.ts","src/components/asset/asset.css?tag=road-asset&encapsulation=shadow","src/components/asset/asset.tsx"],"sourcesContent":["import { isStr } from './utils';\n\nexport const validateContent = (svgContent: string) => {\n const div = document.createElement('div');\n div.innerHTML = svgContent;\n\n // setup this way to ensure it works on our buddy IE\n for (let i = div.childNodes.length - 1; i >= 0; i--) {\n if (div.childNodes[i].nodeName.toLowerCase() !== 'svg') {\n div.removeChild(div.childNodes[i]);\n }\n }\n\n // must only have 1 root element\n const svgElm = div.firstElementChild;\n if (svgElm && svgElm.nodeName.toLowerCase() === 'svg') {\n const svgClass = svgElm.getAttribute('class') || '';\n svgElm.setAttribute('class', (svgClass + ' s-ion-icon').trim());\n\n // root element must be an svg\n // lets double check we've got valid elements\n // do not allow scripts\n if (isValid(svgElm as any)) {\n return div.innerHTML;\n }\n }\n return '';\n};\n\nexport const isValid = (elm: HTMLElement) => {\n if (elm.nodeType === 1) {\n if (elm.nodeName.toLowerCase() === 'script') {\n return false;\n }\n\n for (let i = 0; i < elm.attributes.length; i++) {\n const val = elm.attributes[i].value;\n if (isStr(val) && val.toLowerCase().indexOf('on') === 0) {\n return false;\n }\n }\n\n for (let i = 0; i < elm.childNodes.length; i++) {\n if (!isValid(elm.childNodes[i] as any)) {\n return false;\n }\n }\n }\n return true;\n};\n","import { validateContent } from './validate';\n\nexport const roadassetContent = new Map<string, string>();\nconst requests = new Map<string, Promise<any>>();\n\nexport const getAssetSvgContent = (url: string, sanitize: boolean) => {\n // see if we already have a request for this url\n let req = requests.get(url);\n\n if (!req) {\n if (typeof fetch !== 'undefined' && typeof document !== 'undefined') {\n // we don't already have a request\n // @ts-ignore\n req = fetch(url).then((rsp) => {\n if (rsp.ok) {\n return rsp.text().then((svgContent) => {\n if (svgContent && sanitize !== false) {\n svgContent = validateContent(svgContent);\n }\n roadassetContent.set(url, svgContent || '');\n });\n }\n roadassetContent.set(url, '');\n });\n\n // cache for the same requests\n requests.set(url, req);\n } else {\n // set to empty for ssr scenarios and resolve promise\n roadassetContent.set(url, '');\n return Promise.resolve();\n }\n }\n\n return req;\n};\n","/*\n * Asset\n *\n * Index\n */\n\n:host {\n box-sizing: content-box;\n contain: strict;\n display: table;\n}\n\n.icon-inner{\n width: fit-content;\n}\n\n:host svg {\n display: block;\n width: 100%;\n height: 100%;\n}\n","import { Build, Component, Element, Host, Prop, State, Watch, h } from '@stencil/core';\nimport { getAssetSvgContent, roadassetContent } from './request';\nimport { getName, getUrl } from './utils';\n\n@Component({\n tag: 'road-asset',\n assetsDirs: ['svg'],\n styleUrl: 'asset.css',\n shadow: true,\n})\nexport class Asset {\n private io?: IntersectionObserver;\n\n @Element() el!: HTMLRoadAssetElement;\n\n @State() private assetSvgContent?: string;\n\n @State() private isVisible = false;\n\n\n\n /**\n * Specifies the label to use for accessibility. Defaults to the illustration name.\n */\n @Prop({ mutable: true, reflect: true }) ariaLabel?: string;\n\n /**\n * Set the illustration to hidden, respectively `true`, to remove it from the accessibility tree.\n */\n @Prop({ reflect: true }) ariaHidden?: string;\n\n /**\n * Specifies which illustration to use from the built-in set of illustrations.\n */\n @Prop() name?: string;\n\n /**\n * Specifies the exact `src` of an SVG file to use.\n */\n @Prop() src?: string;\n\n /**\n * A combination of both `name` and `src`. If a `src` url is detected\n * it will set the `src` property. Otherwise it assumes it's a built-in named\n * SVG and set the `name` property.\n */\n @Prop() asset?: any;\n\n /**\n * If enabled, road-illustration will be loaded lazily when it's visible in the viewport.\n * Default, `false`.\n */\n @Prop() lazy: boolean = false;\n\n /**\n * When set to `false`, SVG content that is HTTP fetched will not be checked\n * if the response SVG content has any `<script>` elements, or any attributes\n * that start with `on`, such as `onclick`.\n */\n @Prop() sanitize = true;\n\n componentWillLoad() {\n\n this.waitUntilVisible(this.el, '50px', () => {\n this.isVisible = true;\n this.loadAsset();\n });\n }\n\n disconnectedCallback() {\n if (this.io) {\n this.io.disconnect();\n this.io = undefined;\n }\n }\n\n private waitUntilVisible(el: HTMLRoadAssetElement, rootMargin: string, cb: () => void) {\n if (this.lazy && (window as any).IntersectionObserver) {\n const io = this.io = new (window as any).IntersectionObserver((data: IntersectionObserverEntry[]) => {\n if (data[0].isIntersecting) {\n io.disconnect();\n this.io = undefined;\n cb();\n }\n }, { rootMargin });\n\n io.observe(el);\n\n } else {\n // browser doesn't support IntersectionObserver\n // so just fallback to always show it\n cb();\n }\n }\n\n @Watch('name')\n @Watch('src')\n @Watch('asset')\n loadAsset() {\n if (Build.isBrowser && this.isVisible) {\n const url = getUrl(this);\n if (url) {\n if (roadassetContent.has(url)) {\n // sync if it's already loaded\n this.assetSvgContent = roadassetContent.get(url);\n } else {\n // async if it hasn't been loaded\n getAssetSvgContent(url, this.sanitize).then(() => (this.assetSvgContent = roadassetContent.get(url)));\n }\n }\n }\n\n if (!this.ariaLabel && this.ariaHidden !== 'true') {\n const label = getName(this.name, this.asset);\n // user did not provide a label\n // come up with the label based on the icon name\n if (label) {\n this.ariaLabel = label.replace(/-/g, ' ');\n }\n }\n }\n\n render() {\n\n return (\n <Host aria-hidden=\"true\" role=\"img\">\n {(\n (this.assetSvgContent !== '')\n ? <div class=\"icon-inner\" innerHTML={this.assetSvgContent}></div>\n : <div class=\"icon-inner\"></div>\n )}\n </Host>\n );\n }\n}"],"version":3}
|
|
@@ -20,7 +20,7 @@ const Badge = class {
|
|
|
20
20
|
};
|
|
21
21
|
Badge.style = badgeCss;
|
|
22
22
|
|
|
23
|
-
const buttonCss = ":host{--border-radius:0.25rem;--font-size:var(--road-button-medium);--margin-bottom:1rem;--padding-start:1.5rem;--padding-end:1.5rem;box-sizing:border-box;display:inline-flex;display:-webkit-inline-flex;align-items:center;justify-content:center;height:3rem;padding:0;margin-bottom:var(--margin-bottom);font-family:var(--road-font, sans-serif);font-size:var(--font-size);font-weight:700;line-height:1.375;color:var(--road-grey-10);text-decoration:none;white-space:nowrap;vertical-align:middle;background:transparent;border:1px solid transparent;border-radius:var(--border-radius);transition:background 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}:host(:hover){text-decoration:none}:host(.focus-visible){outline:
|
|
23
|
+
const buttonCss = ":host{--border-radius:0.25rem;--font-size:var(--road-button-medium);--margin-bottom:1rem;--padding-start:1.5rem;--padding-end:1.5rem;box-sizing:border-box;display:inline-flex;display:-webkit-inline-flex;align-items:center;justify-content:center;height:3rem;padding:0;margin-bottom:var(--margin-bottom);font-family:var(--road-font, sans-serif);font-size:var(--font-size);font-weight:700;line-height:1.375;color:var(--road-grey-10);text-decoration:none;white-space:nowrap;vertical-align:middle;background:transparent;border:1px solid transparent;border-radius:var(--border-radius);transition:background 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}:host(:hover){text-decoration:none}:host(.focus-visible){text-decoration:underline;outline:auto}.button-native{position:relative;display:flex;flex-flow:row nowrap;flex-shrink:0;align-items:center;justify-content:center;width:100%;height:100%;padding:0 var(--padding-end) 0 var(--padding-start);margin:0;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;color:inherit;text-align:inherit;text-decoration:none;text-indent:inherit;text-overflow:inherit;text-transform:inherit;letter-spacing:inherit;white-space:inherit;cursor:pointer;background:transparent;border:none;outline:0;-webkit-tap-highlight-color:rgba(0, 0, 0, 0)}:host(.btn-default:not([disabled]).focus-visible){background:var(--road-grey-80)}:host(.btn-primary){color:var(--road-on-button-primary);background:var(--road-button-primary)}:host(.btn-primary) ::slotted(road-icon){color:var(--road-on-button-primary)}:host(.btn-primary:not([disabled]):hover),:host(.btn-primary:not([disabled]).focus-visible){background:var(--road-button-primary-variant);outline:0}:host(.btn-secondary){color:var(--road-on-button-secondary);background:var(--road-button-secondary)}:host(.btn-secondary) ::slotted(road-icon){color:var(--road-on-button-secondary)}:host(.btn-secondary:not([disabled]):hover),:host(.btn-secondary:not([disabled]).focus-visible){background:var(--road-button-secondary-variant)}:host(.btn-link){font-weight:400;color:var(--road-link-primary);text-decoration:underline;background:transparent}:host(.btn-link:not([disabled]):hover),:host(.btn-link:not([disabled]).focus-visible){color:var(--road-primary-30)}:host(.btn-outline-primary),:host(.btn-outline-secondary),:host(.btn-outline-default){background:transparent}:host(.btn-outline-default){color:var(--road-on-surface-weak);background:var(--road-surface);border-color:var(--road-outline)}:host(.btn-outline-default) ::slotted(road-icon){color:var(--road-on-surface-weak)}:host(.btn-outline-default:hover),:host(.btn-outline-default.focus-visible){background:var(--road-grey-80)}:host(.btn-ghost) ::slotted(road-icon){color:var(--road-icon)}:host(.btn-ghost:hover),:host(.btn-ghost.focus-visible){background:var(--road-button-ghost-variant)}:host([aria-disabled].btn-outline-primary){background:none}:host(.btn-outline-primary){color:var(--road-button-primary);border-color:var(--road-button-tertiary-outline)}:host(.btn-outline-primary) ::slotted(road-icon){color:var(--road-button-primary)}:host(.btn-outline-primary:hover),:host(.btn-outline-primary.focus-visible){background:var(--road-button-tertiary-variant)}:host(.btn-outline-secondary){color:var(--road-button-secondary);border-color:var(--road-button-secondary)}:host(.btn-outline-secondary) ::slotted(road-icon){color:var(--road-button-secondary)}:host(.btn-outline-secondary:hover),:host(.btn-outline-secondary.focus-visible){background:var(--road-button-tertiary-variant)}:host([aria-disabled]){color:var(--road-on-surface-disabled);pointer-events:none;cursor:not-allowed;background-color:var(--road-surface-disabled);border-color:1px solid var(--road-surface-disabled)}:host([aria-disabled]) ::slotted(road-icon){color:var(--road-on-surface-disabled)}.button-native:disabled{cursor:not-allowed}::slotted([slot=\"start\"]){margin-right:0.5rem}::slotted([slot=\"end\"]){margin-left:0.5rem}:host(.btn-xl){height:3.5rem}:host(.btn-xl) ::slotted(road-icon){width:2rem;height:2rem}:host(.btn-icon.btn-xl){width:56px}:host(.btn-lg){height:3rem}:host(.btn-lg) ::slotted(road-icon){width:2rem;height:2rem}:host(.btn-icon.btn-lg){width:48px}:host(.btn-md){--font-size:var(--road-font-size-14);height:2.5rem}:host(.btn-md) ::slotted(road-icon){width:1.5rem;height:1.5rem}:host(.btn-icon.btn-md){width:40px}:host(.btn-sm){--font-size:var(--road-font-size-14);height:2rem}:host(.btn-sm) ::slotted(road-icon){width:1.25rem;height:1.25rem}:host(.btn-icon.btn-sm){width:32px}:host(.btn-block){width:100%}:host(.btn-icon) .button-native{padding:0}::slotted(road-badge){position:absolute;top:4px;left:calc(50% + 0.375rem);box-sizing:border-box;height:auto}";
|
|
24
24
|
|
|
25
25
|
const Button = class {
|
|
26
26
|
constructor(hostRef) {
|
|
@@ -99,7 +99,7 @@ const Col = class {
|
|
|
99
99
|
};
|
|
100
100
|
Col.style = colCss;
|
|
101
101
|
|
|
102
|
-
const counterCss = ".sc-road-counter-h{position:relative;z-index:0;display:block}road-input.sc-road-counter{--input-text-align:center;--border-radius:0;--margin-bottom:0}
|
|
102
|
+
const counterCss = ".sc-road-counter-h{position:relative;z-index:0;display:block}road-input.sc-road-counter{--input-text-align:center;--border-radius:0;--margin-bottom:0}road-button.sc-road-counter{width:3rem;font-size:var(--road-font-size-24);line-height:1.4;background:var(--road-surface);border:1px solid var(--road-button-tertiary-outline)}road-button.sc-road-counter:hover,road-button.sc-road-counter:focus{background:var(--road-button-tertiary-variant)}road-button.sc-road-counter road-icon.sc-road-counter{display:flex;fill:var(--road-primary)}.disabled.sc-road-counter{margin-right:-1px;margin-left:-1px;pointer-events:none;cursor:not-allowed;background:var(--road-surface-disabled);border:1px solid var(--road-on-surface-disabled);opacity:inherit}.disabled.sc-road-counter:focus{background:var(--road-disabled)}.disabled.sc-road-counter road-icon.sc-road-counter{fill:var(--road-grey-50)}road-button.btn-md.sc-road-counter{width:2.5rem}road-button.btn-sm.sc-road-counter{width:2rem}.counter-md.sc-road-counter{height:2.5rem}.counter-sm.sc-road-counter{height:2rem}.counter-md.sc-road-counter road-input.sc-road-counter{--height:2.5rem}.counter-md.sc-road-counter road-button.sc-road-counter{min-width:2.5rem}.counter-sm.sc-road-counter road-input.sc-road-counter{--height:2rem}.counter-sm.sc-road-counter road-button.sc-road-counter{min-width:2rem}";
|
|
103
103
|
|
|
104
104
|
const Counter = class {
|
|
105
105
|
constructor(hostRef) {
|
|
@@ -198,7 +198,17 @@ const Counter = class {
|
|
|
198
198
|
this.onValueChange(this.value);
|
|
199
199
|
}
|
|
200
200
|
componentDidLoad() {
|
|
201
|
-
|
|
201
|
+
const buttons = this.el.querySelectorAll('road-button');
|
|
202
|
+
// Ajouter les événements pour chaque road-button
|
|
203
|
+
buttons.forEach((btn) => {
|
|
204
|
+
btn.addEventListener('touchstart', () => {
|
|
205
|
+
btn.style.backgroundColor = 'var(--road-button-tertiary-variant)'; // Appliquer le style hover
|
|
206
|
+
});
|
|
207
|
+
btn.addEventListener('touchend', () => {
|
|
208
|
+
btn.style.backgroundColor = 'var(--road-surface)'; // Supprimer le style hover après touchend
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
// Accessibilité : Cacher le label
|
|
202
212
|
const label = this.el.querySelector('.form-label');
|
|
203
213
|
const input = this.el.querySelector('.form-control.sc-road-input');
|
|
204
214
|
if (label) {
|
|
@@ -259,6 +269,8 @@ const Drawer = class {
|
|
|
259
269
|
this.backText = undefined;
|
|
260
270
|
this.drawerTitle = undefined;
|
|
261
271
|
this.ariaLabel = undefined;
|
|
272
|
+
this.ariaLabelBack = undefined;
|
|
273
|
+
this.ariaLabelClose = undefined;
|
|
262
274
|
this.hasCloseIcon = true;
|
|
263
275
|
}
|
|
264
276
|
/**
|
|
@@ -279,9 +291,22 @@ const Drawer = class {
|
|
|
279
291
|
async back() {
|
|
280
292
|
this.onBack.emit();
|
|
281
293
|
}
|
|
294
|
+
// @Watch('isOpen')
|
|
295
|
+
// handleOpen(openValue: boolean) {
|
|
296
|
+
// if(openValue === true) {
|
|
297
|
+
// this.onOpen.emit();
|
|
298
|
+
// } else {
|
|
299
|
+
// this.el.addEventListener('transitionend', () => {
|
|
300
|
+
// this.onClose.emit();
|
|
301
|
+
// this.el.shadowRoot && ((this.el.shadowRoot.querySelector('.drawer-body') as HTMLElement).scrollTop = 0);
|
|
302
|
+
// }, { once: true});
|
|
303
|
+
// }
|
|
304
|
+
// }
|
|
282
305
|
handleOpen(openValue) {
|
|
283
306
|
if (openValue === true) {
|
|
284
307
|
this.onOpen.emit();
|
|
308
|
+
// Focus the first button element after the drawer is opened
|
|
309
|
+
setTimeout(() => this.focusFirstButton(), 50); // Add a slight delay to ensure the element is rendered
|
|
285
310
|
}
|
|
286
311
|
else {
|
|
287
312
|
this.el.addEventListener('transitionend', () => {
|
|
@@ -290,6 +315,16 @@ const Drawer = class {
|
|
|
290
315
|
}, { once: true });
|
|
291
316
|
}
|
|
292
317
|
}
|
|
318
|
+
/**
|
|
319
|
+
* Find and focus the first button element in the drawer
|
|
320
|
+
*/
|
|
321
|
+
focusFirstButton() {
|
|
322
|
+
var _a;
|
|
323
|
+
const buttonElement = (_a = this.el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('button');
|
|
324
|
+
if (buttonElement) {
|
|
325
|
+
buttonElement.focus(); // Focus the first button element
|
|
326
|
+
}
|
|
327
|
+
}
|
|
293
328
|
/**
|
|
294
329
|
* Close the dialog when press Escape key
|
|
295
330
|
*/
|
|
@@ -314,9 +349,11 @@ const Drawer = class {
|
|
|
314
349
|
const drawerIsOpenClass = this.isOpen ? 'drawer-open' : '';
|
|
315
350
|
const inverseHeaderClass = this.hasInverseHeader ? 'drawer-header-inverse' : '';
|
|
316
351
|
const ariaLabel = this.ariaLabel !== undefined ? this.ariaLabel : 'drawer';
|
|
352
|
+
const ariaLabelBack = this.ariaLabelBack !== undefined ? this.ariaLabelBack : 'Back';
|
|
353
|
+
const ariaLabelClose = this.ariaLabelClose !== undefined ? this.ariaLabelClose : 'Close';
|
|
317
354
|
const drawerDelimiterClass = this.drawerTitle !== undefined && !this.hasInverseHeader ? 'drawer-delimiter' : '';
|
|
318
|
-
const backIconElement = this.hasBackIcon ? h("button", { type: "button", class: "drawer-action", "aria-label":
|
|
319
|
-
const closeIconElement = this.hasCloseIcon ? h("button", { type: "button", class: "drawer-close", onClick: this.onClick, "aria-label":
|
|
355
|
+
const backIconElement = this.hasBackIcon ? h("button", { type: "button", class: "drawer-action", "aria-label": `${ariaLabelBack}`, onClick: this.onClickBack }, h("road-icon", { icon: navigationChevron, rotate: "180" }), this.backText) : '';
|
|
356
|
+
const closeIconElement = this.hasCloseIcon ? h("button", { type: "button", class: "drawer-close", onClick: this.onClick, "aria-label": `${ariaLabelClose}` }, h("road-icon", { icon: navigationClose, "aria-hidden": "true" })) : '';
|
|
320
357
|
const drawerWidthValue = this.position === 'bottom' ? '100%' : this.drawerWidth + 'px';
|
|
321
358
|
return (h(Host, { class: `${drawerIsOpenClass} drawer-${this.position}`, tabindex: "0", role: "dialog", "aria-label": `${ariaLabel}` }, h("div", { class: "drawer-overlay", onClick: this.onClick, tabindex: "-1" }), h("div", { class: "drawer-dialog", style: { maxWidth: `${drawerWidthValue}` }, role: "document", tabindex: "0" }, h("div", { class: "drawer-content" }, h("header", { class: `drawer-header ${inverseHeaderClass} ${drawerDelimiterClass}` }, backIconElement, this.drawerTitle !== undefined ? h("h2", { class: "drawer-title" }, this.drawerTitle) : h("div", { class: "drawer-title" }, h("slot", { name: "title" })), closeIconElement), h("div", { class: "drawer-body" }, h("slot", null)), this.hasFooterContent() && (h("footer", { class: "drawer-footer" }, h("slot", { name: "footer" })))))));
|
|
322
359
|
}
|
|
@@ -17692,7 +17729,7 @@ var lodash = createCommonjsModule(function (module, exports) {
|
|
|
17692
17729
|
}.call(commonjsGlobal));
|
|
17693
17730
|
});
|
|
17694
17731
|
|
|
17695
|
-
const inputCss = ".sc-road-input-h{--height:3rem;--border-radius:0.25rem;--input-text-align:left;--margin-bottom:1rem;position:relative;display:block;margin-bottom:var(--margin-bottom);font-family:var(--road-font, sans-serif);color:var(--road-grey-10)}.form-control.sc-road-input{box-sizing:border-box;display:block;width:100%;height:var(--height);padding:0.75rem 1rem 0;margin:0;font-size:var(--road-body-medium);color:var(--road-on-surface);text-align:var(--input-text-align);background:var(--road-surface);border:1px solid var(--road-input-outline);border-radius:var(--border-radius);box-shadow:none;appearance:none}.form-control[type=\"number\"].sc-road-input{appearance:textfield}.form-control.sc-road-input::-webkit-calendar-picker-indicator{margin-top:-0.75rem}.form-control.sc-road-input::-webkit-date-and-time-value{padding-top:0.625rem}.form-control.sc-road-input::placeholder{color:var(--road-on-surface-extra-weak);opacity:1}@media (hover: hover){.form-control.sc-road-input:not(:disabled):hover{border-color:var(--road-input-outline-variant)}}.form-control.sc-road-input:focus~.form-label.sc-road-input,.form-control[required].sc-road-input:valid~.form-label.sc-road-input,.form-control.has-value.sc-road-input~.form-label.sc-road-input,.form-control[type=\"date\"].sc-road-input~.form-label.sc-road-input,.form-control[type=\"time\"].sc-road-input~.form-label.sc-road-input{transform:scale(0.625) translateY(-0.625rem)}.form-control.sc-road-input:placeholder-shown~.form-label.sc-road-input{transform:scale(0.625) translateY(-0.625rem)}.form-control.sc-road-input:-ms-input-placeholder~.form-label.sc-road-input{transform:scale(0.625) translateY(-0.625rem)}.form-control.sc-road-input:not(:disabled):focus,.form-control[autofocus].sc-road-input{border-color:var(--road-input-outline-variant)
|
|
17732
|
+
const inputCss = ".sc-road-input-h{--height:3rem;--border-radius:0.25rem;--input-text-align:left;--margin-bottom:1rem;position:relative;display:block;margin-bottom:var(--margin-bottom);font-family:var(--road-font, sans-serif);color:var(--road-grey-10)}.form-control.sc-road-input{box-sizing:border-box;display:block;width:100%;height:var(--height);padding:0.75rem 1rem 0;margin:0;font-size:var(--road-body-medium);color:var(--road-on-surface);text-align:var(--input-text-align);background:var(--road-surface);border:1px solid var(--road-input-outline);border-radius:var(--border-radius);box-shadow:none;appearance:none}.form-control[type=\"number\"].sc-road-input{appearance:textfield}.form-control.sc-road-input::-webkit-calendar-picker-indicator{margin-top:-0.75rem}.form-control.sc-road-input::-webkit-date-and-time-value{padding-top:0.625rem}.form-control.sc-road-input::placeholder{color:var(--road-on-surface-extra-weak);opacity:1}@media (hover: hover){.form-control.sc-road-input:not(:disabled):hover{border-color:var(--road-input-outline-variant)}}.form-control.sc-road-input:focus~.form-label.sc-road-input,.form-control[required].sc-road-input:valid~.form-label.sc-road-input,.form-control.has-value.sc-road-input~.form-label.sc-road-input,.form-control[type=\"date\"].sc-road-input~.form-label.sc-road-input,.form-control[type=\"time\"].sc-road-input~.form-label.sc-road-input{transform:scale(0.625) translateY(-0.625rem)}.form-control.sc-road-input:placeholder-shown~.form-label.sc-road-input{transform:scale(0.625) translateY(-0.625rem)}.form-control.sc-road-input:-ms-input-placeholder~.form-label.sc-road-input{transform:scale(0.625) translateY(-0.625rem)}.form-control.sc-road-input:not(:disabled):focus,.form-control[autofocus].sc-road-input,.form-control.sc-road-input:focus-visible{border-color:var(--road-input-outline-variant)}.form-control.sc-road-input:disabled,.form-control[readonly].sc-road-input{color:var(--road-on-surface-disabled);cursor:not-allowed;background:var(--road-surface-disabled);opacity:1}.form-label.sc-road-input{position:absolute;top:0.75rem;left:1rem;display:block;font-size:var(--road-body-medium);line-height:1.5;color:var(--road-on-surface-weak);pointer-events:none;transition:transform 200ms cubic-bezier(0, 0, 0.2, 1) 0ms;transform-origin:0 0}.form-control.sc-road-input:required~.form-label.sc-road-input::after{color:var(--road-danger-default);content:\" *\"}.sc-road-input-h:has([disabled]) .form-label.sc-road-input{color:var(--road-on-surface-disabled)}.less-label.sc-road-input{padding-top:0}.input-xl.sc-road-input-h{--height:3.5rem}.input-xl.sc-road-input-h .form-control.sc-road-input{padding:1rem 1rem 0}.phone-number.sc-road-input-h .form-control.sc-road-input{padding-left:2rem}.phone-number.sc-road-input-h .form-label.sc-road-input{left:2rem}.input-xl.sc-road-input-h .form-label.sc-road-input{top:1rem}.input-xl.sc-road-input-h .form-control.sc-road-input:focus~.form-label.sc-road-input,.input-xl.sc-road-input-h .form-control[autofocus].sc-road-input~.form-label.sc-road-input,.input-xl.sc-road-input-h .form-control[required].sc-road-input:valid~.form-label.sc-road-input,.input-xl.sc-road-input-h .form-control.has-value.sc-road-input~.form-label.sc-road-input,.input-xl.sc-road-input-h .form-control[type=\"date\"].sc-road-input~.form-label.sc-road-input,.input-xl.sc-road-input-h .form-control[type=\"time\"].sc-road-input~.form-label.sc-road-input{transform:scale(0.75) translateY(-0.625rem)}.input-xl.sc-road-input-h .form-control.sc-road-input:placeholder-shown~.form-label.sc-road-input{transform:scale(0.625) translateY(-0.625rem)}.invalid-feedback.sc-road-input{display:none;width:100%;margin-top:0.5rem;font-size:var(--road-helper-medium);color:var(--road-on-danger-surface)}.invalid-feedback.sc-road-input road-icon.sc-road-input{color:var(--road-danger-icon);margin-right:var(--road-spacing-02)}.form-control.is-invalid.sc-road-input,.was-validated.sc-road-input .form-control.sc-road-input:invalid{border-color:var(--road-danger-outline)}.form-control.is-invalid.sc-road-input~.invalid-feedback.sc-road-input,.was-validated.sc-road-input .form-control.sc-road-input:invalid~.invalid-feedback.sc-road-input{display:flex}.helper.sc-road-input{margin-top:0.5rem;font-size:var(--road-body-small);color:var(--road-on-surface-weak)}.form-control[type=\"password\"].sc-road-input~.checklist-password.sc-road-input .invalid.sc-road-input{color:var(--road-on-surface-weak)}";
|
|
17696
17733
|
|
|
17697
17734
|
const Input = class {
|
|
17698
17735
|
constructor(hostRef) {
|