@postnord/web-components
Version:
PostNord Web Components
250 lines (243 loc) • 19.1 kB
JavaScript
/*!
* Built with Stencil
* By PostNord.
*/
'use strict';
var index = require('./index-DVv2io0H.js');
var index$1 = require('./index.cjs.js');
const pnButtonCss = "pn-button{display:inline-block}pn-button .pn-button{position:relative;cursor:pointer;padding:0.75em 1.5em;width:round(up, 100%, 1px);min-height:3em;min-width:5.5em;border:none;border-radius:3em;font-family:inherit;font-size:1em;font-weight:500;color:#ffffff;background-color:transparent;display:flex;justify-content:center;align-items:center;text-decoration:none;line-height:1.5em;-webkit-tap-highlight-color:transparent;transition-property:color, outline-color;transition-duration:0.2s;transition-timing-function:cubic-bezier(0.7, 0, 0.3, 1)}@media (prefers-reduced-motion: reduce){pn-button .pn-button{transition-duration:0s;transition-delay:0s}}pn-button .pn-button{outline:0.2rem solid transparent;outline-offset:0.2rem}pn-button .pn-button:focus-visible{outline-color:#005d92}pn-button .pn-button:disabled,pn-button .pn-button[aria-disabled]{cursor:auto;pointer-events:none}pn-button .pn-button-content{z-index:2;display:flex;justify-content:center;align-items:center;gap:0.5em;transition-property:opacity, transform;transition-duration:0.2s;transition-timing-function:cubic-bezier(0.7, 0, 0.3, 1)}@media (prefers-reduced-motion: reduce){pn-button .pn-button-content{transition-duration:0s;transition-delay:0s}}pn-button .pn-button-content{transition-delay:0.2s}pn-button .pn-button-bg{position:absolute;width:100%;height:100%;top:0;left:50%;transform:translateX(-50%) translateY(0);border-radius:3em;border:none;background-color:#005d92;overflow:hidden;transition-property:width, background-color, border-color;transition-duration:0.2s;transition-timing-function:cubic-bezier(0.7, 0, 0.3, 1)}@media (prefers-reduced-motion: reduce){pn-button .pn-button-bg{transition-duration:0s;transition-delay:0s}}pn-button .pn-button-bg{transition-delay:0.2s, 0s, 0s}pn-button .pn-button-bg::after{content:\"\";position:absolute;will-change:transform;width:100%;height:100%;background-color:#0d234b;border-radius:inherit;left:0;transform:translateX(-103%);opacity:0.5;transition-property:transform;transition-duration:0.2s;transition-timing-function:cubic-bezier(0.7, 0, 0.3, 1)}@media (prefers-reduced-motion: reduce){pn-button .pn-button-bg::after{transition-duration:0s;transition-delay:0s}}pn-button .pn-button .pn-ripple{animation:ripple 0.4s cubic-bezier(0.7, 0, 0.3, 1);position:absolute;border-radius:50%;background-color:#ffffff;transform:translate(-50%, -50%) scale(0);opacity:0.1;pointer-events:none;z-index:3}@keyframes ripple{to{transform:translate(-50%, -50%) scale(1);opacity:0}}pn-button .pn-button-tooltip{z-index:5;position:absolute;top:calc(100% + 0.35em);left:50%;pointer-events:none;color:#ffffff;background-color:#0d234b;box-shadow:0 0.075em 0.225em rgba(0, 0, 0, 0.1), 0 0.4em 0.9em rgba(0, 0, 0, 0.13);padding:0.25em 0.75em;border-radius:inherit;max-width:min(95vw, 40em);transform:translateX(-50%) translateX(var(--pn-dx));width:max-content;opacity:0;transition-property:opacity;transition-duration:0.2s;transition-timing-function:cubic-bezier(0.7, 0, 0.3, 1)}@media (prefers-reduced-motion: reduce){pn-button .pn-button-tooltip{transition-duration:0s;transition-delay:0s}}pn-button .pn-button-tooltip-text{font-size:0.875em;font-weight:300}pn-button .pn-button pn-icon{flex-shrink:0}pn-button .pn-button pn-icon .pn-icon-svg path{fill:#ffffff}pn-button .pn-button pn-spinner{position:absolute;transform:scale(0)}pn-button .pn-button:hover .pn-button-bg:after,pn-button .pn-button:focus .pn-button-bg:after{transform:translateX(0)}pn-button .pn-button[data-appearance=light]{color:#005d92}pn-button .pn-button[data-appearance=light] pn-icon .pn-icon-svg path{fill:#005d92}pn-button .pn-button[data-appearance=light] pn-spinner .pn-spinner-circle{stroke:#005d92}pn-button .pn-button[data-appearance=light] pn-spinner .pn-spinner-dot{fill:#005d92}pn-button .pn-button[data-appearance=light] .pn-button-bg{border-color:#005d92;background-color:#ffffff}pn-button .pn-button[data-appearance=light] .pn-button-bg:after{background-color:#e0f8ff;opacity:1}pn-button .pn-button[data-appearance=light] .pn-button-bg .pn-ripple{background-color:#005d92}pn-button .pn-button[data-appearance=warning]{color:#a70707}pn-button .pn-button[data-appearance=warning] pn-icon .pn-icon-svg path{fill:#a70707}pn-button .pn-button[data-appearance=warning] pn-spinner .pn-spinner-circle{stroke:#a70707}pn-button .pn-button[data-appearance=warning] pn-spinner .pn-spinner-dot{fill:#a70707}pn-button .pn-button[data-appearance=warning] .pn-button-bg{border:0.0625em solid #a70707;background-color:#fdefee}pn-button .pn-button[data-appearance=warning] .pn-button-bg:after{background-color:#a70707;opacity:1}pn-button .pn-button[data-appearance=warning]:hover,pn-button .pn-button[data-appearance=warning]:focus{color:#ffffff}pn-button .pn-button[data-appearance=warning]:hover pn-icon .pn-icon-svg path,pn-button .pn-button[data-appearance=warning]:focus pn-icon .pn-icon-svg path{fill:#ffffff}pn-button .pn-button[data-appearance=warning]:hover pn-spinner .pn-spinner-circle,pn-button .pn-button[data-appearance=warning]:focus pn-spinner .pn-spinner-circle{stroke:#ffffff}pn-button .pn-button[data-appearance=warning]:hover pn-spinner .pn-spinner-dot,pn-button .pn-button[data-appearance=warning]:focus pn-spinner .pn-spinner-dot{fill:#ffffff}pn-button .pn-button[data-appearance=warning]{outline:0.2rem solid transparent;outline-offset:0.2rem}pn-button .pn-button[data-appearance=warning]:focus-visible{outline-color:#a70707}pn-button .pn-button[data-variant=borderless] .pn-button-bg{border:none;background-color:transparent}pn-button .pn-button[data-variant=borderless] .pn-button-bg:after{background-color:#ffffff;opacity:0.1}pn-button .pn-button[data-variant=borderless][data-appearance=light] .pn-button-bg:after{background-color:#e0f8ff;opacity:1}pn-button .pn-button[data-variant=borderless][data-appearance=warning] .pn-button-bg:after{background-color:#a70707;opacity:1}pn-button .pn-button[data-variant=outlined] .pn-button-bg{border:0.0625em solid #ffffff;background-color:transparent}pn-button .pn-button[data-variant=outlined] .pn-button-bg:after{background-color:#ffffff;opacity:0.1}pn-button .pn-button[data-variant=outlined][data-appearance=light] .pn-button-bg{border-color:#005d92;background-color:#ffffff}pn-button .pn-button[data-variant=outlined][data-appearance=light] .pn-button-bg:after{background-color:#00a0d6;opacity:0.1}pn-button .pn-button[data-variant=outlined][data-appearance=warning] .pn-button-bg{border-color:#a70707}pn-button .pn-button[data-variant=outlined][data-appearance=warning] .pn-button-bg:after{background-color:#a70707;opacity:1}pn-button .pn-button[data-left-icon] .pn-button-content{flex-direction:row-reverse}pn-button .pn-button[data-icon-only]{width:3em;min-width:0}pn-button .pn-button[data-icon-only][data-small]{width:2em;min-width:0;padding:0}pn-button .pn-button[data-small]{padding:0.375em 1em;min-height:2em;min-width:unset;line-height:1.25em}pn-button .pn-button[data-small] .pn-button-content{gap:0.25em}pn-button .pn-button[data-small] .pn-button-text{font-size:0.875em}pn-button .pn-button[data-small] pn-icon .pn-icon-svg{height:1.25em;width:1.25em}pn-button .pn-button[data-tooltip-open] .pn-button-tooltip{opacity:1}pn-button .pn-button[data-tooltip-upwards] .pn-button-tooltip{top:auto;bottom:calc(100% + 0.35em)}pn-button .pn-button[data-loading] pn-spinner{transform:scale(1);transition-property:transform;transition-duration:0.2s;transition-timing-function:cubic-bezier(0.7, 0, 0.3, 1)}@media (prefers-reduced-motion: reduce){pn-button .pn-button[data-loading] pn-spinner{transition-duration:0s;transition-delay:0s}}pn-button .pn-button[data-loading] pn-spinner{transition-delay:0.2s}pn-button .pn-button[data-loading] .pn-button-content{pointer-events:none;opacity:0;transition-delay:0s;transform:translateY(100%)}pn-button .pn-button[data-loading] .pn-button-bg{width:3em}pn-button .pn-button[data-loading][data-small] .pn-button-bg{width:2em}";
const PnButton = class {
constructor(hostRef) {
index.registerInstance(this, hostRef);
this.pnClick = index.createEvent(this, "pnClick");
}
buttonEl;
tooltipEl;
tooltipDx;
openEvents = ['mouseover', 'focus'];
closeEvents = ['mouseleave', 'blur', 'touchcancel', 'touchleave'];
eventListeners = [...this.openEvents, ...this.closeEvents];
get hostElement() { return index.getElement(this); }
tooltipOpen = false;
tooltipUpwards = false;
/** The label of the button, this is the same as using the default slot. @since v7.4.0 */
label = '';
/**
* Select the button appearance: default (blue), `light` (white) and `warning` (red).
*
* @category Visual
*/
appearance = '';
/**
* Select the button variant: default (colored background), `outlined` (bordered, no background) and `borderless` (borderless, no background).
*
* @category Visual
*/
variant = '';
/** Use the small button. @category Visual */
small = false;
/** Display the loading indicator. @category Visual */
loading = false;
/**
* The SVG content of the icon you want.
* @see {@link https://portal.postnord.com/web-components/?path=/docs/docs-assets--docs pn-design-assets}
* @category Icon
*/
icon;
/**
* Turn the button into an icon only. Requires `icon` and one of the following props to work: `tooltip`, `arialabel` or `arialabelledby`.
* @summary __You need an `icon` selected, as well as either `tooltip`, `arialabel` or `arialabelledby` for this to work__.
* @see {@link icon}
* @since v7.4.0
* @category Icon
*/
iconOnly = false;
/**
* Place the `icon` to the left of the button.
*
* @summary __You need an `icon` selected for this to work__.
* @see {@link icon}
* @category Icon
*/
leftIcon = false;
/**
* When the user focus/hover the button, the `tooltip` text will show up.
*
* @category Tooltip
*/
tooltip;
/**
* Prefer the tooltip to open upwards. Will still go downwards if there is no space.
* @since v7.4.0
* @category Tooltip
*/
tooltipUp = false;
/** Select HTML button type. @category Button */
type = 'button';
/**
* Connect this button to a HTML form.
* @category Button
* @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#form HTML button form}
*/
form;
/** Pass an href to make the button into link (a-tag). @category Link */
href;
/** The rel attribute of the link. @category Link */
rel;
/** The target attribute of the link. @category Link */
target;
/** The download attribute of the link. @category Link */
download;
/** HTML ID. @category HTML attributes */
buttonId = null;
/** HTML aria-label attribute. @category HTML attributes */
arialabel = null;
/** HTML aria-labelledby attribute. @category HTML attributes */
arialabelledby = null;
/** HTML aria-current attribute. @since v7.9.0 @category HTML attributes */
ariacurrent = null;
/** HTML aria-controls attribute. @category HTML attributes */
ariacontrols = null;
/** HTML aria-pressed attribute. @category HTML attributes */
ariapressed = null;
/** HTML aria-haspopup attribute. @category HTML attributes */
ariahaspopup = null;
/** HTML aria-expanded attribute. @category HTML attributes */
ariaexpanded = null;
/** HTML tabindex. @category HTML attributes */
noTab = false;
openHandler() {
if (this.tooltipOpen)
this.checkTooltipPosition();
}
iconOnlyHandler() {
this.checkTooltipPosition();
if (this.tooltip)
this.initTooltip();
else
this.removeTooltip();
}
/**
* This event is fired when the `button`/`a` element of the `pn-button` is clicked.
* Setting an eventListener for `click` on the `pn-button` will trigger if you click outside of the button area
* or if the button is `disabled` with the `loading` prop.
* @since v7.4.0
**/
pnClick;
componentWillLoad() {
this.tooltipUpwards = this.tooltipUp;
}
componentDidLoad() {
this.iconOnlyHandler();
}
getRect(element) {
return element.getBoundingClientRect();
}
initTooltip() {
this.eventListeners.forEach(e => this.buttonEl.addEventListener(e, this.toggleTooltip));
}
removeTooltip() {
this.eventListeners.forEach(e => this.buttonEl.removeEventListener(e, this.toggleTooltip));
}
toggleTooltip = (event) => {
this.tooltipOpen = this.openEvents.includes(event.type);
};
setTooltipOffset() {
this.tooltipEl.style.setProperty('--pn-dx', `${this.tooltipDx}px`);
}
checkTooltipPosition() {
this.tooltipEl.style.transform = 'translateX(-50%)';
this.tooltipUpwards = this.tooltipUp;
requestAnimationFrame(() => {
const { top, x, y, right, height } = this.getRect(this.tooltipEl);
const extraMargin = 16;
this.tooltipDx = 0;
this.tooltipUpwards = this.tooltipUp ? top > height : y + height > window.innerHeight;
this.tooltipEl.style.transform = '';
if (x < 0)
this.tooltipDx = x * -1 + extraMargin;
if (right > window.innerWidth)
this.tooltipDx = window.innerWidth - right - extraMargin - 8;
requestAnimationFrame(() => this.setTooltipOffset());
});
}
getAttributes() {
const attrs = this.href
? {
'href': this.href,
'rel': !this.rel && this.target === '_blank' ? 'noopener' : this.rel,
'target': this.target ?? null,
'download': this.download ?? null,
'aria-current': this.ariacurrent,
'aria-disabled': this.loading ? 'true' : null,
}
: {
'type': this.type,
'form': this.form,
'disabled': this.loading,
'aria-pressed': this.ariapressed,
'aria-controls': this.ariacontrols,
'aria-haspopup': this.ariahaspopup,
'aria-expanded': this.ariaexpanded,
};
const appearances = ['light', 'warning'];
const variations = ['borderless', 'outlined'];
return {
'tabindex': this.noTab || (this.href && this.loading) ? '-1' : null,
'data-small': this.small,
'data-loading': this.loading,
'data-tooltip-open': this.tooltipOpen,
'data-tooltip-upwards': this.tooltipUpwards,
'data-icon-only': this.showIconOnly(),
'data-left-icon': this.leftIcon,
'data-appearance': appearances.includes(this.appearance) ? this.appearance : null,
'data-variant': variations.includes(this.variant) ? this.variant : null,
...attrs,
};
}
getTagName() {
return this.href ? 'a' : 'button';
}
showIconOnly() {
return !!this.icon && this.iconOnly && !!(this.tooltip || this.arialabel || this.arialabelledby);
}
handleClick(event) {
index$1.ripple(event, this.hostElement, '.pn-button-bg');
this.pnClick.emit(event);
}
render() {
const TagName = this.getTagName();
return (index.h(index.Host, { key: '9fd62df52e09b5f7915c1652c3bd23c47c40db42' }, index.h(TagName, { key: 'aecef05e4c20bb9c501399f18b7290a33e5d82e7', class: "pn-button", id: this.buttonId, "aria-label": this.arialabel, "aria-labelledby": this.arialabelledby, onClick: e => this.handleClick(e), ...this.getAttributes(), ref: (el) => (this.buttonEl = el) }, index.h("div", { key: '9cb56181926a77cd985be9447dd5277720370bf6', class: "pn-button-bg" }), index.h("div", { key: 'f81963c493162009d2219d72171f753c3ba5dcb8', class: "pn-button-content" }, index.h("div", { key: 'd6cc476c9bb3eaa59ae9cf80700b33e4bc836494', class: "pn-button-text", hidden: this.showIconOnly() }, this.label, index.h("slot", { key: '83b07110e17088f980e4a7f0094f5330f7dcc17b' })), !!this.icon && index.h("pn-icon", { key: '6d352caac885f7f5cf3819a7b555e278e7761259', icon: this.icon })), index.h("pn-spinner", { key: '3176c1f592b5e48c14f7baccc9366bf0fc0187dd', light: true }), index.h("div", { key: 'b97ecf99cdf1c4fa0c8db3b26c2eac33c5c9bba4', class: "pn-button-tooltip", hidden: !this.tooltip, ref: el => (this.tooltipEl = el) }, index.h("span", { key: '7825cd9635f5897db28ee4b32d2ac56a8c9a9b0d', class: "pn-button-tooltip-text" }, this.tooltip)))));
}
static get watchers() { return {
"tooltipOpen": ["openHandler"],
"tooltip": ["iconOnlyHandler"]
}; }
};
PnButton.style = pnButtonCss;
const pnSpinnerCss = "pn-spinner{display:inline-block}pn-spinner .pn-spinner{--pn-spinner-size:1.5em;--pn-spinner-color:main.$blue700;height:var(--pn-spinner-size);width:var(--pn-spinner-size);display:block;animation:rotate 1s infinite;animation-timing-function:cubic-bezier(0.7, 0, 0.3, 1)}@media (prefers-reduced-motion: reduce){pn-spinner .pn-spinner{animation-duration:2s}}pn-spinner .pn-spinner-circle{stroke:var(--pn-spinner-color);transform-origin:center center;transform:rotate(-310deg);stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:64;animation:loading 2s infinite;animation-timing-function:cubic-bezier(0.7, 0, 0.3, 1)}@media (prefers-reduced-motion: reduce){pn-spinner .pn-spinner-circle{animation-duration:4s}}pn-spinner .pn-spinner-dot{fill:var(--pn-spinner-color)}@keyframes loading{0%{stroke-dashoffset:55}50%{stroke-dashoffset:12}100%{stroke-dashoffset:55}}@keyframes rotate{from{transform:rotate(-180deg) scaleX(-1)}to{transform:rotate(180deg) scaleX(-1)}}";
const PnSpinner = class {
constructor(hostRef) {
index.registerInstance(this, hostRef);
}
get hostElement() { return index.getElement(this); }
/** Light version of the spinner. */
light = false;
/** Size in em. */
size = 1.5;
getColor() {
if (this.light)
return '#fff';
return '#005d92';
}
getSize() {
return `${this.size}em`;
}
render() {
return (index.h(index.Host, { key: 'a9ecba01b5b30a660a44439c714b7ad57cf02a88' }, index.h("svg", { key: '03fbe990bf1ae0402fcb27707e0c1712d8a84492', class: "pn-spinner", style: { '--pn-spinner-size': this.getSize(), '--pn-spinner-color': this.getColor() }, xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none" }, index.h("circle", { key: 'c48784865cd9c8c3d55cd9b1bd3e0dff7a4ebe35', class: "pn-spinner-circle", cx: "12", cy: "12", r: "10", "stroke-width": "3" }), index.h("circle", { key: '5f69d1bbbf864842f9ae54dc9a29b61603a83bff', class: "pn-spinner-dot", cx: "21.3", cy: "16", r: "1.48" }))));
}
};
PnSpinner.style = pnSpinnerCss;
exports.pn_button = PnButton;
exports.pn_spinner = PnSpinner;
//# sourceMappingURL=pn-button.pn-spinner.entry.cjs.js.map