link.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /*!
  2. * All material copyright ESRI, All Rights Reserved, unless otherwise specified.
  3. * See https://github.com/Esri/calcite-components/blob/master/LICENSE.md for details.
  4. * v1.0.0-beta.97
  5. */
  6. import { proxyCustomElement, HTMLElement, h, Host } from '@stencil/core/internal/client/index.js';
  7. import { c as getElementDir, C as CSS_UTILITY, f as focusElement } from './dom.js';
  8. import { u as updateHostInteraction } from './interactive.js';
  9. import { d as defineCustomElement$1 } from './icon.js';
  10. const linkCss = "@keyframes in{0%{opacity:0}100%{opacity:1}}@keyframes in-down{0%{opacity:0;transform:translate3D(0, -5px, 0)}100%{opacity:1;transform:translate3D(0, 0, 0)}}@keyframes in-up{0%{opacity:0;transform:translate3D(0, 5px, 0)}100%{opacity:1;transform:translate3D(0, 0, 0)}}@keyframes in-scale{0%{opacity:0;transform:scale3D(0.95, 0.95, 1)}100%{opacity:1;transform:scale3D(1, 1, 1)}}:root{--calcite-animation-timing:calc(150ms * var(--calcite-internal-duration-factor));--calcite-internal-duration-factor:var(--calcite-duration-factor, 1);--calcite-internal-animation-timing-fast:calc(100ms * var(--calcite-internal-duration-factor));--calcite-internal-animation-timing-medium:calc(200ms * var(--calcite-internal-duration-factor));--calcite-internal-animation-timing-slow:calc(300ms * var(--calcite-internal-duration-factor))}.calcite-animate{opacity:0;animation-fill-mode:both;animation-duration:var(--calcite-animation-timing)}.calcite-animate__in{animation-name:in}.calcite-animate__in-down{animation-name:in-down}.calcite-animate__in-up{animation-name:in-up}.calcite-animate__in-scale{animation-name:in-scale}@media (prefers-reduced-motion: reduce){:root{--calcite-internal-duration-factor:0.01}}:root{--calcite-floating-ui-transition:var(--calcite-animation-timing)}:host([hidden]){display:none}:host([disabled]){pointer-events:none;cursor:default;-webkit-user-select:none;user-select:none;opacity:var(--calcite-ui-opacity-disabled)}:host{display:inline}:host a,:host span{position:relative;display:flex;cursor:pointer;align-items:center;justify-content:center;border-radius:0px;border-style:none;font-family:inherit;transition:all var(--calcite-animation-timing) ease-in-out 0s, outline 0s, outline-offset 0s;text-decoration:none;line-height:inherit;font-size:inherit;-webkit-appearance:none}:host a:hover,:host span:hover{text-decoration:none}:host a,:host span{outline-color:transparent}:host a:focus,:host span:focus{outline:2px solid var(--calcite-ui-brand);outline-offset:-2px}calcite-icon{inline-size:1em;block-size:1em;min-inline-size:unset;min-block-size:unset}.calcite-link--icon{vertical-align:text-top;transition:all var(--calcite-animation-timing) ease-in-out 0s, outline 0s, outline-offset 0s;margin-block-start:0.125rem}:host .calcite-link--icon.icon-start{margin-inline-end:0.5rem}:host .calcite-link--icon.icon-end{margin-inline-start:0.5rem}:host span,:host a{position:relative;display:inline;border-style:none;background-color:transparent;padding:0px;color:var(--calcite-ui-text-link);transition:all var(--calcite-animation-timing) ease-in-out 0s, outline 0s, outline-offset 0s;line-height:inherit;white-space:initial;background-image:linear-gradient(currentColor, currentColor), linear-gradient(var(--calcite-link-blue-underline), var(--calcite-link-blue-underline));background-position:0% 100%, 100% 100%;background-repeat:no-repeat, no-repeat;background-size:0% 1px, 100% 1px}:host span:hover,:host span:focus,:host a:hover,:host a:focus{background-size:100% 1px, 100% 1px}:host span:active,:host a:active{background-size:100% 2px, 100% 2px}:host span.calcite--rtl,:host a.calcite--rtl{background-position:100% 100%, 100% 100%}:host([disabled]) ::slotted([calcite-hydrated][disabled]),:host([disabled]) [calcite-hydrated][disabled]{opacity:1}";
  11. const Link = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
  12. constructor() {
  13. super();
  14. this.__registerHost();
  15. this.__attachShadow();
  16. //--------------------------------------------------------------------------
  17. //
  18. // Properties
  19. //
  20. //--------------------------------------------------------------------------
  21. /** When `true`, interaction is prevented and the component is displayed with lower opacity. */
  22. this.disabled = false;
  23. /**
  24. * Prompts the user to save the linked URL instead of navigating to it. Can be used with or without a value:
  25. * Without a value, the browser will suggest a filename/extension
  26. * See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-download.
  27. */
  28. this.download = false;
  29. this.childElClickHandler = (event) => {
  30. if (!event.isTrusted) {
  31. // click was invoked internally, we stop it here
  32. event.stopPropagation();
  33. }
  34. };
  35. //--------------------------------------------------------------------------
  36. //
  37. // Private Methods
  38. //
  39. //--------------------------------------------------------------------------
  40. this.storeTagRef = (el) => {
  41. this.childEl = el;
  42. };
  43. }
  44. //--------------------------------------------------------------------------
  45. //
  46. // Lifecycle
  47. //
  48. //--------------------------------------------------------------------------
  49. componentDidRender() {
  50. updateHostInteraction(this);
  51. }
  52. render() {
  53. const { download, el } = this;
  54. const dir = getElementDir(el);
  55. const childElType = this.href ? "a" : "span";
  56. const iconStartEl = (h("calcite-icon", { class: "calcite-link--icon icon-start", flipRtl: this.iconFlipRtl === "start" || this.iconFlipRtl === "both", icon: this.iconStart, scale: "s" }));
  57. const iconEndEl = (h("calcite-icon", { class: "calcite-link--icon icon-end", flipRtl: this.iconFlipRtl === "end" || this.iconFlipRtl === "both", icon: this.iconEnd, scale: "s" }));
  58. const Tag = childElType;
  59. const role = childElType === "span" ? "link" : null;
  60. const tabIndex = childElType === "span" ? 0 : null;
  61. return (h(Host, { role: "presentation" }, h(Tag, { class: { [CSS_UTILITY.rtl]: dir === "rtl" },
  62. /*
  63. When the 'download' property of type 'boolean | string' is set to true, the value is "".
  64. This works around that issue for now.
  65. */
  66. download: Tag === "a" && (download === "" || download) ? download : null, href: Tag === "a" && this.href, onClick: this.childElClickHandler, ref: this.storeTagRef, rel: Tag === "a" && this.rel, role: role, tabIndex: tabIndex, target: Tag === "a" && this.target }, this.iconStart ? iconStartEl : null, h("slot", null), this.iconEnd ? iconEndEl : null)));
  67. }
  68. //--------------------------------------------------------------------------
  69. //
  70. // Events
  71. //
  72. //--------------------------------------------------------------------------
  73. clickHandler(event) {
  74. // forwards the click() to the internal link for non user-initiated events
  75. if (!event.isTrusted) {
  76. this.childEl.click();
  77. }
  78. }
  79. //--------------------------------------------------------------------------
  80. //
  81. // Public Methods
  82. //
  83. //--------------------------------------------------------------------------
  84. /** Sets focus on the component. */
  85. async setFocus() {
  86. focusElement(this.childEl);
  87. }
  88. get el() { return this; }
  89. static get style() { return linkCss; }
  90. }, [1, "calcite-link", {
  91. "disabled": [516],
  92. "download": [520],
  93. "href": [513],
  94. "iconEnd": [513, "icon-end"],
  95. "iconFlipRtl": [513, "icon-flip-rtl"],
  96. "iconStart": [513, "icon-start"],
  97. "rel": [1],
  98. "target": [1],
  99. "setFocus": [64]
  100. }, [[0, "click", "clickHandler"]]]);
  101. function defineCustomElement() {
  102. if (typeof customElements === "undefined") {
  103. return;
  104. }
  105. const components = ["calcite-link", "calcite-icon"];
  106. components.forEach(tagName => { switch (tagName) {
  107. case "calcite-link":
  108. if (!customElements.get(tagName)) {
  109. customElements.define(tagName, Link);
  110. }
  111. break;
  112. case "calcite-icon":
  113. if (!customElements.get(tagName)) {
  114. defineCustomElement$1();
  115. }
  116. break;
  117. } });
  118. }
  119. defineCustomElement();
  120. export { Link as L, defineCustomElement as d };