calcite-accordion-item.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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.82
  5. */
  6. import { proxyCustomElement, HTMLElement, createEvent, h, Host } from '@stencil/core/internal/client';
  7. import { g as getElementProp, a as getElementDir, C as CSS_UTILITY, t as toAriaBoolean } from './dom.js';
  8. import { g as guid } from './guid.js';
  9. import { d as defineCustomElement$2 } from './icon.js';
  10. const accordionItemCss = "@-webkit-keyframes in{0%{opacity:0}100%{opacity:1}}@keyframes in{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes in-down{0%{opacity:0;-webkit-transform:translate3D(0, -5px, 0);transform:translate3D(0, -5px, 0)}100%{opacity:1;-webkit-transform:translate3D(0, 0, 0);transform:translate3D(0, 0, 0)}}@keyframes in-down{0%{opacity:0;-webkit-transform:translate3D(0, -5px, 0);transform:translate3D(0, -5px, 0)}100%{opacity:1;-webkit-transform:translate3D(0, 0, 0);transform:translate3D(0, 0, 0)}}@-webkit-keyframes in-up{0%{opacity:0;-webkit-transform:translate3D(0, 5px, 0);transform:translate3D(0, 5px, 0)}100%{opacity:1;-webkit-transform:translate3D(0, 0, 0);transform:translate3D(0, 0, 0)}}@keyframes in-up{0%{opacity:0;-webkit-transform:translate3D(0, 5px, 0);transform:translate3D(0, 5px, 0)}100%{opacity:1;-webkit-transform:translate3D(0, 0, 0);transform:translate3D(0, 0, 0)}}@-webkit-keyframes in-scale{0%{opacity:0;-webkit-transform:scale3D(0.95, 0.95, 1);transform:scale3D(0.95, 0.95, 1)}100%{opacity:1;-webkit-transform:scale3D(1, 1, 1);transform:scale3D(1, 1, 1)}}@keyframes in-scale{0%{opacity:0;-webkit-transform:scale3D(0.95, 0.95, 1);transform:scale3D(0.95, 0.95, 1)}100%{opacity:1;-webkit-transform:scale3D(1, 1, 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;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:var(--calcite-animation-timing);animation-duration:var(--calcite-animation-timing)}.calcite-animate__in{-webkit-animation-name:in;animation-name:in}.calcite-animate__in-down{-webkit-animation-name:in-down;animation-name:in-down}.calcite-animate__in-up{-webkit-animation-name:in-up;animation-name:in-up}.calcite-animate__in-scale{-webkit-animation-name:in-scale;animation-name:in-scale}:root{--calcite-popper-transition:var(--calcite-animation-timing)}:host([hidden]){display:none}.icon-position--end,.icon-position--start{--calcite-accordion-item-icon-rotation:calc(90deg * -1);--calcite-accordion-item-active-icon-rotation:0deg;--calcite-accordion-item-icon-rotation-rtl:90deg;--calcite-accordion-item-active-icon-rotation-rtl:0deg}.icon-position--start{--calcite-accordion-item-flex-direction:row-reverse;--calcite-accordion-item-icon-spacing-start:0;--calcite-accordion-item-icon-spacing-end:var(--calcite-accordion-icon-margin)}.icon-position--end{--calcite-accordion-item-flex-direction:row;--calcite-accordion-item-icon-spacing-start:var(--calcite-accordion-icon-margin);--calcite-accordion-item-icon-spacing-end:0}.icon-position--end:not(.icon-type--plus-minus){--calcite-accordion-item-icon-rotation:0deg;--calcite-accordion-item-active-icon-rotation:180deg;--calcite-accordion-item-icon-rotation-rtl:0deg;--calcite-accordion-item-active-icon-rotation-rtl:calc(180deg * -1)}:host{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;color:var(--calcite-ui-text-3);-webkit-text-decoration-line:none;text-decoration-line:none;outline:2px solid transparent;outline-offset:2px;background-color:var(--calcite-accordion-item-background, var(--calcite-ui-foreground-1))}:host .accordion-item-header{outline-offset:0;outline-color:transparent;-webkit-transition:outline-offset 100ms ease-in-out, outline-color 100ms ease-in-out;transition:outline-offset 100ms ease-in-out, outline-color 100ms ease-in-out}:host(:focus) .accordion-item-header{outline:2px solid var(--calcite-ui-brand);outline-offset:-2px}:host([active]){color:var(--calcite-ui-text-1)}:host([active]) .accordion-item-content{display:block;color:var(--calcite-ui-text-1)}:host([active]) .accordion-item-header{border-bottom-color:transparent}:host .accordion-item-header{display:-ms-flexbox;display:flex;cursor:pointer;-ms-flex-align:center;align-items:center;-ms-flex-direction:var(--calcite-accordion-item-flex-direction);flex-direction:var(--calcite-accordion-item-flex-direction)}:host .accordion-item-icon{position:relative;margin:0px;display:-ms-inline-flexbox;display:inline-flex;color:var(--calcite-ui-text-3);-webkit-transition-duration:150ms;transition-duration:150ms;-webkit-transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);-webkit-margin-end:var(--calcite-accordion-item-icon-spacing-start);margin-inline-end:var(--calcite-accordion-item-icon-spacing-start);-webkit-margin-start:var(--calcite-accordion-item-icon-spacing-end);margin-inline-start:var(--calcite-accordion-item-icon-spacing-end)}:host .accordion-item-content,:host .accordion-item-header{padding:var(--calcite-accordion-item-padding);border-bottom:1px solid var(--calcite-accordion-item-border, var(--calcite-ui-border-2))}:host .accordion-item-header *{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;-webkit-transition-duration:150ms;transition-duration:150ms;-webkit-transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1)}:host .accordion-item-content{display:none;padding-top:0px;color:var(--calcite-ui-text-3);text-align:initial}:host .accordion-item-expand-icon{color:var(--calcite-ui-text-3);-webkit-margin-start:var(--calcite-accordion-item-icon-spacing-start);margin-inline-start:var(--calcite-accordion-item-icon-spacing-start);-webkit-margin-end:var(--calcite-accordion-item-icon-spacing-end);margin-inline-end:var(--calcite-accordion-item-icon-spacing-end);-webkit-transform:rotate(var(--calcite-accordion-item-icon-rotation));transform:rotate(var(--calcite-accordion-item-icon-rotation))}.calcite--rtl .accordion-item-expand-icon{-webkit-transform:rotate(var(--calcite-accordion-item-icon-rotation-rtl));transform:rotate(var(--calcite-accordion-item-icon-rotation-rtl))}:host([active]) .accordion-item-expand-icon{color:var(--calcite-ui-text-1);-webkit-transform:rotate(var(--calcite-accordion-item-active-icon-rotation));transform:rotate(var(--calcite-accordion-item-active-icon-rotation))}:host([active]) .calcite--rtl .accordion-item-expand-icon{-webkit-transform:rotate(var(--calcite-accordion-item-active-icon-rotation-rtl));transform:rotate(var(--calcite-accordion-item-active-icon-rotation-rtl))}:host .accordion-item-header-text{margin-top:0px;margin-bottom:0px;-ms-flex-positive:1;flex-grow:1;-ms-flex-direction:column;flex-direction:column;padding-top:0px;padding-bottom:0px;text-align:initial;-webkit-margin-end:auto;margin-inline-end:auto}:host .accordion-item-title,:host .accordion-item-subtitle{display:-ms-flexbox;display:flex;width:100%}:host .accordion-item-title{font-weight:var(--calcite-font-weight-medium);color:var(--calcite-ui-text-2)}:host .accordion-item-subtitle{margin-top:0.25rem;color:var(--calcite-ui-text-3)}:host(:focus) .accordion-item-title,:host(:hover) .accordion-item-title{color:var(--calcite-ui-text-1)}:host(:focus) .accordion-item-icon,:host(:hover) .accordion-item-icon{color:var(--calcite-ui-text-1)}:host(:focus) .accordion-item-expand-icon,:host(:hover) .accordion-item-expand-icon{color:var(--calcite-ui-text-1)}:host(:focus) .accordion-item-subtitle,:host(:hover) .accordion-item-subtitle{color:var(--calcite-ui-text-2)}:host(:focus) .accordion-item-title,:host(:active) .accordion-item-title,:host([active]) .accordion-item-title{color:var(--calcite-ui-text-1)}:host(:focus) .accordion-item-icon,:host(:active) .accordion-item-icon,:host([active]) .accordion-item-icon{color:var(--calcite-ui-text-1)}:host(:focus) .accordion-item-expand-icon,:host(:active) .accordion-item-expand-icon,:host([active]) .accordion-item-expand-icon{color:var(--calcite-ui-text-1)}:host(:focus) .accordion-item-subtitle,:host(:active) .accordion-item-subtitle,:host([active]) .accordion-item-subtitle{color:var(--calcite-ui-text-2)}";
  11. const AccordionItem = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
  12. constructor() {
  13. super();
  14. this.__registerHost();
  15. this.__attachShadow();
  16. this.calciteAccordionItemKeyEvent = createEvent(this, "calciteAccordionItemKeyEvent", 7);
  17. this.calciteAccordionItemSelect = createEvent(this, "calciteAccordionItemSelect", 7);
  18. this.calciteAccordionItemClose = createEvent(this, "calciteAccordionItemClose", 7);
  19. this.calciteAccordionItemRegister = createEvent(this, "calciteAccordionItemRegister", 7);
  20. //--------------------------------------------------------------------------
  21. //
  22. // Public Properties
  23. //
  24. //--------------------------------------------------------------------------
  25. /** Indicates whether the item is active. */
  26. this.active = false;
  27. //--------------------------------------------------------------------------
  28. //
  29. // Private State/Props
  30. //
  31. //--------------------------------------------------------------------------
  32. this.guid = guid();
  33. /** what icon position does the parent accordion specify */
  34. this.iconPosition = "end";
  35. /** handle clicks on item header */
  36. this.itemHeaderClickHandler = () => this.emitRequestedItem();
  37. }
  38. //--------------------------------------------------------------------------
  39. //
  40. // Lifecycle
  41. //
  42. //--------------------------------------------------------------------------
  43. connectedCallback() {
  44. this.parent = this.el.parentElement;
  45. this.selectionMode = getElementProp(this.el, "selection-mode", "multi");
  46. this.iconType = getElementProp(this.el, "icon-type", "chevron");
  47. this.iconPosition = getElementProp(this.el, "icon-position", this.iconPosition);
  48. }
  49. componentDidLoad() {
  50. this.itemPosition = this.getItemPosition();
  51. this.calciteAccordionItemRegister.emit({
  52. parent: this.parent,
  53. position: this.itemPosition
  54. });
  55. }
  56. render() {
  57. const dir = getElementDir(this.el);
  58. const iconEl = h("calcite-icon", { class: "accordion-item-icon", icon: this.icon, scale: "s" });
  59. const { guid } = this;
  60. const regionId = `${guid}-region`;
  61. const buttonId = `${guid}-button`;
  62. return (h(Host, { tabindex: "0" }, h("div", { class: {
  63. [`icon-position--${this.iconPosition}`]: true,
  64. [`icon-type--${this.iconType}`]: true
  65. } }, h("div", { "aria-controls": regionId, class: { "accordion-item-header": true, [CSS_UTILITY.rtl]: dir === "rtl" }, id: buttonId, onClick: this.itemHeaderClickHandler, role: "button" }, this.icon ? iconEl : null, h("div", { class: "accordion-item-header-text" }, h("span", { class: "accordion-item-title" }, this.itemTitle), this.itemSubtitle ? (h("span", { class: "accordion-item-subtitle" }, this.itemSubtitle)) : null), h("calcite-icon", { class: "accordion-item-expand-icon", icon: this.iconType === "chevron"
  66. ? "chevronDown"
  67. : this.iconType === "caret"
  68. ? "caretDown"
  69. : this.active
  70. ? "minus"
  71. : "plus", scale: "s" })), h("div", { "aria-expanded": toAriaBoolean(this.active), "aria-labelledby": buttonId, class: "accordion-item-content", id: regionId, role: "region" }, h("slot", null)))));
  72. }
  73. //--------------------------------------------------------------------------
  74. //
  75. // Event Listeners
  76. //
  77. //--------------------------------------------------------------------------
  78. keyDownHandler(e) {
  79. if (e.target === this.el) {
  80. switch (e.key) {
  81. case " ":
  82. case "Enter":
  83. this.emitRequestedItem();
  84. e.preventDefault();
  85. break;
  86. case "ArrowUp":
  87. case "ArrowDown":
  88. case "Home":
  89. case "End":
  90. this.calciteAccordionItemKeyEvent.emit({
  91. parent: this.parent,
  92. item: e
  93. });
  94. e.preventDefault();
  95. break;
  96. }
  97. }
  98. }
  99. updateActiveItemOnChange(event) {
  100. this.requestedAccordionItem = event.detail
  101. .requestedAccordionItem;
  102. if (this.el.parentNode !== this.requestedAccordionItem.parentNode) {
  103. return;
  104. }
  105. this.determineActiveItem();
  106. }
  107. //--------------------------------------------------------------------------
  108. //
  109. // Private Methods
  110. //
  111. //--------------------------------------------------------------------------
  112. determineActiveItem() {
  113. switch (this.selectionMode) {
  114. case "multi":
  115. if (this.el === this.requestedAccordionItem) {
  116. this.active = !this.active;
  117. }
  118. break;
  119. case "single":
  120. this.active = this.el === this.requestedAccordionItem ? !this.active : false;
  121. break;
  122. case "single-persist":
  123. this.active = this.el === this.requestedAccordionItem;
  124. break;
  125. }
  126. }
  127. emitRequestedItem() {
  128. this.calciteAccordionItemSelect.emit({
  129. requestedAccordionItem: this.el
  130. });
  131. }
  132. getItemPosition() {
  133. return Array.prototype.indexOf.call(this.parent.querySelectorAll("calcite-accordion-item"), this.el);
  134. }
  135. get el() { return this; }
  136. static get style() { return accordionItemCss; }
  137. }, [1, "calcite-accordion-item", {
  138. "active": [1540],
  139. "itemTitle": [1, "item-title"],
  140. "itemSubtitle": [1, "item-subtitle"],
  141. "icon": [513]
  142. }, [[0, "keydown", "keyDownHandler"], [16, "calciteAccordionChange", "updateActiveItemOnChange"]]]);
  143. function defineCustomElement$1() {
  144. if (typeof customElements === "undefined") {
  145. return;
  146. }
  147. const components = ["calcite-accordion-item", "calcite-icon"];
  148. components.forEach(tagName => { switch (tagName) {
  149. case "calcite-accordion-item":
  150. if (!customElements.get(tagName)) {
  151. customElements.define(tagName, AccordionItem);
  152. }
  153. break;
  154. case "calcite-icon":
  155. if (!customElements.get(tagName)) {
  156. defineCustomElement$2();
  157. }
  158. break;
  159. } });
  160. }
  161. defineCustomElement$1();
  162. const CalciteAccordionItem = AccordionItem;
  163. const defineCustomElement = defineCustomElement$1;
  164. export { CalciteAccordionItem, defineCustomElement };