UNPKG

@postnord/web-components

Version:
250 lines (243 loc) 19.1 kB
/*! * 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