calcite-link.entry.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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 { r as registerInstance, h, H as Host, g as getElement } from './index-1f9b54dc.js';
  7. import { a as getElementDir, f as focusElement } from './dom-8f0a9ff2.js';
  8. import { C as CSS_UTILITY } from './resources-9c476cb6.js';
  9. import { u as updateHostInteraction } from './interactive-5db230e8.js';
  10. import './guid-9f15e57a.js';
  11. 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}";
  12. const Link = class {
  13. constructor(hostRef) {
  14. registerInstance(this, hostRef);
  15. //--------------------------------------------------------------------------
  16. //
  17. // Properties
  18. //
  19. //--------------------------------------------------------------------------
  20. /** When `true`, interaction is prevented and the component is displayed with lower opacity. */
  21. this.disabled = false;
  22. /**
  23. * Prompts the user to save the linked URL instead of navigating to it. Can be used with or without a value:
  24. * Without a value, the browser will suggest a filename/extension
  25. * See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-download.
  26. */
  27. this.download = false;
  28. this.childElClickHandler = (event) => {
  29. if (!event.isTrusted) {
  30. // click was invoked internally, we stop it here
  31. event.stopPropagation();
  32. }
  33. };
  34. //--------------------------------------------------------------------------
  35. //
  36. // Private Methods
  37. //
  38. //--------------------------------------------------------------------------
  39. this.storeTagRef = (el) => {
  40. this.childEl = el;
  41. };
  42. }
  43. //--------------------------------------------------------------------------
  44. //
  45. // Lifecycle
  46. //
  47. //--------------------------------------------------------------------------
  48. componentDidRender() {
  49. updateHostInteraction(this);
  50. }
  51. render() {
  52. const { download, el } = this;
  53. const dir = getElementDir(el);
  54. const childElType = this.href ? "a" : "span";
  55. const iconStartEl = (h("calcite-icon", { class: "calcite-link--icon icon-start", flipRtl: this.iconFlipRtl === "start" || this.iconFlipRtl === "both", icon: this.iconStart, scale: "s" }));
  56. const iconEndEl = (h("calcite-icon", { class: "calcite-link--icon icon-end", flipRtl: this.iconFlipRtl === "end" || this.iconFlipRtl === "both", icon: this.iconEnd, scale: "s" }));
  57. const Tag = childElType;
  58. const role = childElType === "span" ? "link" : null;
  59. const tabIndex = childElType === "span" ? 0 : null;
  60. return (h(Host, { role: "presentation" }, h(Tag, { class: { [CSS_UTILITY.rtl]: dir === "rtl" },
  61. /*
  62. When the 'download' property of type 'boolean | string' is set to true, the value is "".
  63. This works around that issue for now.
  64. */
  65. 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)));
  66. }
  67. //--------------------------------------------------------------------------
  68. //
  69. // Events
  70. //
  71. //--------------------------------------------------------------------------
  72. clickHandler(event) {
  73. // forwards the click() to the internal link for non user-initiated events
  74. if (!event.isTrusted) {
  75. this.childEl.click();
  76. }
  77. }
  78. //--------------------------------------------------------------------------
  79. //
  80. // Public Methods
  81. //
  82. //--------------------------------------------------------------------------
  83. /** Sets focus on the component. */
  84. async setFocus() {
  85. focusElement(this.childEl);
  86. }
  87. get el() { return getElement(this); }
  88. };
  89. Link.style = linkCss;
  90. export { Link as calcite_link };