dropdown.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755
  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 { Component, Element, Event, h, Host, Listen, Method, Prop, Watch } from "@stencil/core";
  7. import { focusElement, toAriaBoolean } from "../../utils/dom";
  8. import { createPopper, CSS as PopperCSS, updatePopper, popperMenuComputedPlacements, defaultMenuPlacement, filterComputedPlacements } from "../../utils/popper";
  9. import { SLOTS } from "./resources";
  10. import { createObserver } from "../../utils/observers";
  11. import { updateHostInteraction } from "../../utils/interactive";
  12. /**
  13. * @slot - A slot for adding `calcite-dropdown-group`s or `calcite-dropdown-item`s.
  14. * @slot dropdown-trigger - A slot for the element that triggers the dropdown.
  15. */
  16. export class Dropdown {
  17. constructor() {
  18. //--------------------------------------------------------------------------
  19. //
  20. // Public Properties
  21. //
  22. //--------------------------------------------------------------------------
  23. /** Opens or closes the dropdown */
  24. this.active = false;
  25. /**
  26. allow the dropdown to remain open after a selection is made
  27. if the selection-mode of the selected item's containing group is "none", the dropdown will always close
  28. */
  29. this.disableCloseOnSelect = false;
  30. /** is the dropdown disabled */
  31. this.disabled = false;
  32. /**
  33. specify the maximum number of calcite-dropdown-items to display before showing the scroller, must be greater than 0 -
  34. this value does not include groupTitles passed to calcite-dropdown-group
  35. */
  36. this.maxItems = 0;
  37. /** Describes the type of positioning to use for the overlaid content. If your element is in a fixed container, use the 'fixed' value. */
  38. this.overlayPositioning = "absolute";
  39. /**
  40. * Determines where the dropdown will be positioned relative to the button.
  41. * @default "bottom-leading"
  42. */
  43. this.placement = defaultMenuPlacement;
  44. /** specify the scale of dropdown, defaults to m */
  45. this.scale = "m";
  46. /**
  47. * **read-only** The currently selected items
  48. *
  49. * @readonly
  50. */
  51. this.selectedItems = [];
  52. /** specify whether the dropdown is opened by hover or click of a trigger element */
  53. this.type = "click";
  54. /** specify the width of dropdown, defaults to m */
  55. this.width = "m";
  56. this.items = [];
  57. this.groups = [];
  58. this.activeTransitionProp = "visibility";
  59. this.mutationObserver = createObserver("mutation", () => this.updateItems());
  60. this.resizeObserver = createObserver("resize", () => this.setMaxScrollerHeight());
  61. //--------------------------------------------------------------------------
  62. //
  63. // Private Methods
  64. //
  65. //--------------------------------------------------------------------------
  66. this.setFilteredPlacements = () => {
  67. const { el, flipPlacements } = this;
  68. this.filteredFlipPlacements = flipPlacements
  69. ? filterComputedPlacements(flipPlacements, el)
  70. : null;
  71. };
  72. this.updateTriggers = (event) => {
  73. this.triggers = event.target.assignedElements({
  74. flatten: true
  75. });
  76. this.reposition();
  77. };
  78. this.updateItems = () => {
  79. this.items = this.groups
  80. .map((group) => Array.from(group === null || group === void 0 ? void 0 : group.querySelectorAll("calcite-dropdown-item")))
  81. .reduce((previousValue, currentValue) => [...previousValue, ...currentValue], []);
  82. this.updateSelectedItems();
  83. this.reposition();
  84. };
  85. this.updateGroups = (event) => {
  86. const groups = event.target
  87. .assignedElements({ flatten: true })
  88. .filter((el) => el === null || el === void 0 ? void 0 : el.matches("calcite-dropdown-group"));
  89. this.groups = groups;
  90. this.updateItems();
  91. };
  92. this.setMaxScrollerHeight = () => {
  93. const { active, scrollerEl } = this;
  94. if (!scrollerEl || !active) {
  95. return;
  96. }
  97. this.reposition();
  98. const maxScrollerHeight = this.getMaxScrollerHeight();
  99. scrollerEl.style.maxHeight = maxScrollerHeight > 0 ? `${maxScrollerHeight}px` : "";
  100. this.reposition();
  101. };
  102. this.setScrollerEl = (scrollerEl) => {
  103. this.resizeObserver.observe(scrollerEl);
  104. this.scrollerEl = scrollerEl;
  105. };
  106. this.transitionEnd = (event) => {
  107. if (event.propertyName === this.activeTransitionProp) {
  108. this.active ? this.calciteDropdownOpen.emit() : this.calciteDropdownClose.emit();
  109. }
  110. };
  111. this.setReferenceEl = (el) => {
  112. this.referenceEl = el;
  113. };
  114. this.setMenuEl = (el) => {
  115. this.menuEl = el;
  116. };
  117. this.keyDownHandler = (e) => {
  118. const target = e.target;
  119. if (target !== this.referenceEl) {
  120. return;
  121. }
  122. const key = e.key;
  123. if (this.active && (key === "Escape" || (e.shiftKey && key === "Tab"))) {
  124. this.closeCalciteDropdown();
  125. return;
  126. }
  127. switch (key) {
  128. case " ":
  129. case "Enter":
  130. this.openCalciteDropdown();
  131. break;
  132. case "Escape":
  133. this.closeCalciteDropdown();
  134. break;
  135. }
  136. };
  137. this.focusOnFirstActiveOrFirstItem = () => {
  138. this.getFocusableElement(this.items.find((item) => item.active) || this.items[0]);
  139. };
  140. this.toggleOpenEnd = () => {
  141. this.focusOnFirstActiveOrFirstItem();
  142. this.el.removeEventListener("calciteDropdownOpen", this.toggleOpenEnd);
  143. };
  144. this.openCalciteDropdown = () => {
  145. this.active = !this.active;
  146. if (this.active) {
  147. this.el.addEventListener("calciteDropdownOpen", this.toggleOpenEnd);
  148. }
  149. };
  150. }
  151. activeHandler() {
  152. if (!this.disabled) {
  153. this.reposition();
  154. return;
  155. }
  156. this.active = false;
  157. }
  158. handleDisabledChange(value) {
  159. if (!value) {
  160. this.active = false;
  161. }
  162. }
  163. flipPlacementsHandler() {
  164. this.setFilteredPlacements();
  165. }
  166. maxItemsHandler() {
  167. this.setMaxScrollerHeight();
  168. }
  169. placementHandler() {
  170. this.reposition();
  171. }
  172. //--------------------------------------------------------------------------
  173. //
  174. // Lifecycle
  175. //
  176. //--------------------------------------------------------------------------
  177. connectedCallback() {
  178. var _a;
  179. (_a = this.mutationObserver) === null || _a === void 0 ? void 0 : _a.observe(this.el, { childList: true, subtree: true });
  180. this.createPopper();
  181. this.setFilteredPlacements();
  182. }
  183. componentDidLoad() {
  184. this.reposition();
  185. }
  186. componentDidRender() {
  187. updateHostInteraction(this);
  188. }
  189. disconnectedCallback() {
  190. var _a, _b;
  191. (_a = this.mutationObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
  192. (_b = this.resizeObserver) === null || _b === void 0 ? void 0 : _b.disconnect();
  193. this.destroyPopper();
  194. }
  195. render() {
  196. const { active } = this;
  197. return (h(Host, null,
  198. h("div", { class: "calcite-dropdown-trigger-container", onClick: this.openCalciteDropdown, onKeyDown: this.keyDownHandler, ref: this.setReferenceEl },
  199. h("slot", { "aria-expanded": toAriaBoolean(active), "aria-haspopup": "true", name: SLOTS.dropdownTrigger, onSlotchange: this.updateTriggers })),
  200. h("div", { "aria-hidden": toAriaBoolean(!active), class: "calcite-dropdown-wrapper", ref: this.setMenuEl },
  201. h("div", { class: {
  202. ["calcite-dropdown-content"]: true,
  203. [PopperCSS.animation]: true,
  204. [PopperCSS.animationActive]: active
  205. }, onTransitionEnd: this.transitionEnd, ref: this.setScrollerEl },
  206. h("div", { hidden: !this.active },
  207. h("slot", { onSlotchange: this.updateGroups }))))));
  208. }
  209. //--------------------------------------------------------------------------
  210. //
  211. // Public Methods
  212. //
  213. //--------------------------------------------------------------------------
  214. /** Updates the position of the component. */
  215. async reposition() {
  216. const { popper, menuEl, placement } = this;
  217. const modifiers = this.getModifiers();
  218. popper
  219. ? await updatePopper({
  220. el: menuEl,
  221. modifiers,
  222. placement,
  223. popper
  224. })
  225. : this.createPopper();
  226. }
  227. closeCalciteDropdownOnClick(e) {
  228. if (!this.active || e.composedPath().includes(this.el)) {
  229. return;
  230. }
  231. this.closeCalciteDropdown(false);
  232. }
  233. closeCalciteDropdownOnEvent() {
  234. this.closeCalciteDropdown();
  235. }
  236. closeCalciteDropdownOnOpenEvent(e) {
  237. if (e.composedPath().includes(this.el)) {
  238. return;
  239. }
  240. this.active = false;
  241. }
  242. mouseEnterHandler() {
  243. if (this.type === "hover") {
  244. this.openCalciteDropdown();
  245. }
  246. }
  247. mouseLeaveHandler() {
  248. if (this.type === "hover") {
  249. this.closeCalciteDropdown();
  250. }
  251. }
  252. calciteDropdownItemKeyEvent(e) {
  253. const { keyboardEvent } = e.detail;
  254. // handle edge
  255. const target = keyboardEvent.target;
  256. const itemToFocus = target.nodeName !== "A" ? target : target.parentNode;
  257. const isFirstItem = this.itemIndex(itemToFocus) === 0;
  258. const isLastItem = this.itemIndex(itemToFocus) === this.items.length - 1;
  259. switch (keyboardEvent.key) {
  260. case "Tab":
  261. if (isLastItem && !keyboardEvent.shiftKey) {
  262. this.closeCalciteDropdown();
  263. }
  264. else if (isFirstItem && keyboardEvent.shiftKey) {
  265. this.closeCalciteDropdown();
  266. }
  267. else if (keyboardEvent.shiftKey) {
  268. this.focusPrevItem(itemToFocus);
  269. }
  270. else {
  271. this.focusNextItem(itemToFocus);
  272. }
  273. break;
  274. case "ArrowDown":
  275. this.focusNextItem(itemToFocus);
  276. break;
  277. case "ArrowUp":
  278. this.focusPrevItem(itemToFocus);
  279. break;
  280. case "Home":
  281. this.focusFirstItem();
  282. break;
  283. case "End":
  284. this.focusLastItem();
  285. break;
  286. }
  287. e.stopPropagation();
  288. }
  289. handleItemSelect(event) {
  290. this.updateSelectedItems();
  291. event.stopPropagation();
  292. this.calciteDropdownSelect.emit();
  293. if (!this.disableCloseOnSelect ||
  294. event.detail.requestedDropdownGroup.selectionMode === "none") {
  295. this.closeCalciteDropdown();
  296. }
  297. }
  298. getModifiers() {
  299. const flipModifier = {
  300. name: "flip",
  301. enabled: true
  302. };
  303. flipModifier.options = {
  304. fallbackPlacements: this.filteredFlipPlacements || popperMenuComputedPlacements
  305. };
  306. const eventListenerModifier = {
  307. name: "eventListeners",
  308. enabled: this.active
  309. };
  310. return [flipModifier, eventListenerModifier];
  311. }
  312. createPopper() {
  313. this.destroyPopper();
  314. const { menuEl, referenceEl, placement, overlayPositioning } = this;
  315. const modifiers = this.getModifiers();
  316. this.popper = createPopper({
  317. el: menuEl,
  318. modifiers,
  319. overlayPositioning,
  320. placement,
  321. referenceEl
  322. });
  323. }
  324. destroyPopper() {
  325. const { popper } = this;
  326. if (popper) {
  327. popper.destroy();
  328. }
  329. this.popper = null;
  330. }
  331. updateSelectedItems() {
  332. this.selectedItems = this.items.filter((item) => item.active);
  333. }
  334. getMaxScrollerHeight() {
  335. const { maxItems } = this;
  336. let itemsToProcess = 0;
  337. let maxScrollerHeight = 0;
  338. let groupHeaderHeight;
  339. this.groups.forEach((group) => {
  340. if (maxItems > 0 && itemsToProcess < maxItems) {
  341. Array.from(group.children).forEach((item, index) => {
  342. if (index === 0) {
  343. if (isNaN(groupHeaderHeight)) {
  344. groupHeaderHeight = item.offsetTop;
  345. }
  346. maxScrollerHeight += groupHeaderHeight;
  347. }
  348. if (itemsToProcess < maxItems) {
  349. maxScrollerHeight += item.offsetHeight;
  350. itemsToProcess += 1;
  351. }
  352. });
  353. }
  354. });
  355. return maxScrollerHeight;
  356. }
  357. closeCalciteDropdown(focusTrigger = true) {
  358. this.active = false;
  359. if (focusTrigger) {
  360. focusElement(this.triggers[0]);
  361. }
  362. }
  363. focusFirstItem() {
  364. const firstItem = this.items[0];
  365. this.getFocusableElement(firstItem);
  366. }
  367. focusLastItem() {
  368. const lastItem = this.items[this.items.length - 1];
  369. this.getFocusableElement(lastItem);
  370. }
  371. focusNextItem(e) {
  372. const index = this.itemIndex(e);
  373. const nextItem = this.items[index + 1] || this.items[0];
  374. this.getFocusableElement(nextItem);
  375. }
  376. focusPrevItem(e) {
  377. const index = this.itemIndex(e);
  378. const prevItem = this.items[index - 1] || this.items[this.items.length - 1];
  379. this.getFocusableElement(prevItem);
  380. }
  381. itemIndex(e) {
  382. return this.items.indexOf(e);
  383. }
  384. getFocusableElement(item) {
  385. if (!item) {
  386. return;
  387. }
  388. const target = item.attributes.isLink
  389. ? item.shadowRoot.querySelector("a")
  390. : item;
  391. focusElement(target);
  392. }
  393. static get is() { return "calcite-dropdown"; }
  394. static get encapsulation() { return "shadow"; }
  395. static get originalStyleUrls() { return {
  396. "$": ["dropdown.scss"]
  397. }; }
  398. static get styleUrls() { return {
  399. "$": ["dropdown.css"]
  400. }; }
  401. static get properties() { return {
  402. "active": {
  403. "type": "boolean",
  404. "mutable": true,
  405. "complexType": {
  406. "original": "boolean",
  407. "resolved": "boolean",
  408. "references": {}
  409. },
  410. "required": false,
  411. "optional": false,
  412. "docs": {
  413. "tags": [],
  414. "text": "Opens or closes the dropdown"
  415. },
  416. "attribute": "active",
  417. "reflect": true,
  418. "defaultValue": "false"
  419. },
  420. "disableCloseOnSelect": {
  421. "type": "boolean",
  422. "mutable": false,
  423. "complexType": {
  424. "original": "boolean",
  425. "resolved": "boolean",
  426. "references": {}
  427. },
  428. "required": false,
  429. "optional": false,
  430. "docs": {
  431. "tags": [],
  432. "text": "allow the dropdown to remain open after a selection is made\nif the selection-mode of the selected item's containing group is \"none\", the dropdown will always close"
  433. },
  434. "attribute": "disable-close-on-select",
  435. "reflect": true,
  436. "defaultValue": "false"
  437. },
  438. "disabled": {
  439. "type": "boolean",
  440. "mutable": false,
  441. "complexType": {
  442. "original": "boolean",
  443. "resolved": "boolean",
  444. "references": {}
  445. },
  446. "required": false,
  447. "optional": false,
  448. "docs": {
  449. "tags": [],
  450. "text": "is the dropdown disabled"
  451. },
  452. "attribute": "disabled",
  453. "reflect": true,
  454. "defaultValue": "false"
  455. },
  456. "flipPlacements": {
  457. "type": "unknown",
  458. "mutable": false,
  459. "complexType": {
  460. "original": "ComputedPlacement[]",
  461. "resolved": "ComputedPlacement[]",
  462. "references": {
  463. "ComputedPlacement": {
  464. "location": "import",
  465. "path": "../../utils/popper"
  466. }
  467. }
  468. },
  469. "required": false,
  470. "optional": true,
  471. "docs": {
  472. "tags": [],
  473. "text": "Defines the available placements that can be used when a flip occurs."
  474. }
  475. },
  476. "maxItems": {
  477. "type": "number",
  478. "mutable": false,
  479. "complexType": {
  480. "original": "number",
  481. "resolved": "number",
  482. "references": {}
  483. },
  484. "required": false,
  485. "optional": false,
  486. "docs": {
  487. "tags": [],
  488. "text": "specify the maximum number of calcite-dropdown-items to display before showing the scroller, must be greater than 0 -\nthis value does not include groupTitles passed to calcite-dropdown-group"
  489. },
  490. "attribute": "max-items",
  491. "reflect": false,
  492. "defaultValue": "0"
  493. },
  494. "overlayPositioning": {
  495. "type": "string",
  496. "mutable": false,
  497. "complexType": {
  498. "original": "OverlayPositioning",
  499. "resolved": "\"absolute\" | \"fixed\"",
  500. "references": {
  501. "OverlayPositioning": {
  502. "location": "import",
  503. "path": "../../utils/popper"
  504. }
  505. }
  506. },
  507. "required": false,
  508. "optional": false,
  509. "docs": {
  510. "tags": [],
  511. "text": "Describes the type of positioning to use for the overlaid content. If your element is in a fixed container, use the 'fixed' value."
  512. },
  513. "attribute": "overlay-positioning",
  514. "reflect": false,
  515. "defaultValue": "\"absolute\""
  516. },
  517. "placement": {
  518. "type": "string",
  519. "mutable": false,
  520. "complexType": {
  521. "original": "MenuPlacement",
  522. "resolved": "\"bottom\" | \"bottom-end\" | \"bottom-leading\" | \"bottom-start\" | \"bottom-trailing\" | \"top\" | \"top-end\" | \"top-leading\" | \"top-start\" | \"top-trailing\"",
  523. "references": {
  524. "MenuPlacement": {
  525. "location": "import",
  526. "path": "../../utils/popper"
  527. }
  528. }
  529. },
  530. "required": false,
  531. "optional": false,
  532. "docs": {
  533. "tags": [{
  534. "name": "default",
  535. "text": "\"bottom-leading\""
  536. }],
  537. "text": "Determines where the dropdown will be positioned relative to the button."
  538. },
  539. "attribute": "placement",
  540. "reflect": true,
  541. "defaultValue": "defaultMenuPlacement"
  542. },
  543. "scale": {
  544. "type": "string",
  545. "mutable": false,
  546. "complexType": {
  547. "original": "Scale",
  548. "resolved": "\"l\" | \"m\" | \"s\"",
  549. "references": {
  550. "Scale": {
  551. "location": "import",
  552. "path": "../interfaces"
  553. }
  554. }
  555. },
  556. "required": false,
  557. "optional": false,
  558. "docs": {
  559. "tags": [],
  560. "text": "specify the scale of dropdown, defaults to m"
  561. },
  562. "attribute": "scale",
  563. "reflect": true,
  564. "defaultValue": "\"m\""
  565. },
  566. "selectedItems": {
  567. "type": "unknown",
  568. "mutable": true,
  569. "complexType": {
  570. "original": "HTMLCalciteDropdownItemElement[]",
  571. "resolved": "HTMLCalciteDropdownItemElement[]",
  572. "references": {
  573. "HTMLCalciteDropdownItemElement": {
  574. "location": "global"
  575. }
  576. }
  577. },
  578. "required": false,
  579. "optional": false,
  580. "docs": {
  581. "tags": [{
  582. "name": "readonly",
  583. "text": undefined
  584. }],
  585. "text": "**read-only** The currently selected items"
  586. },
  587. "defaultValue": "[]"
  588. },
  589. "type": {
  590. "type": "string",
  591. "mutable": false,
  592. "complexType": {
  593. "original": "\"hover\" | \"click\"",
  594. "resolved": "\"click\" | \"hover\"",
  595. "references": {}
  596. },
  597. "required": false,
  598. "optional": false,
  599. "docs": {
  600. "tags": [],
  601. "text": "specify whether the dropdown is opened by hover or click of a trigger element"
  602. },
  603. "attribute": "type",
  604. "reflect": true,
  605. "defaultValue": "\"click\""
  606. },
  607. "width": {
  608. "type": "string",
  609. "mutable": false,
  610. "complexType": {
  611. "original": "Scale",
  612. "resolved": "\"l\" | \"m\" | \"s\"",
  613. "references": {
  614. "Scale": {
  615. "location": "import",
  616. "path": "../interfaces"
  617. }
  618. }
  619. },
  620. "required": false,
  621. "optional": false,
  622. "docs": {
  623. "tags": [],
  624. "text": "specify the width of dropdown, defaults to m"
  625. },
  626. "attribute": "width",
  627. "reflect": true,
  628. "defaultValue": "\"m\""
  629. }
  630. }; }
  631. static get events() { return [{
  632. "method": "calciteDropdownSelect",
  633. "name": "calciteDropdownSelect",
  634. "bubbles": true,
  635. "cancelable": true,
  636. "composed": true,
  637. "docs": {
  638. "tags": [],
  639. "text": "fires when a dropdown item has been selected or deselected *"
  640. },
  641. "complexType": {
  642. "original": "void",
  643. "resolved": "void",
  644. "references": {}
  645. }
  646. }, {
  647. "method": "calciteDropdownOpen",
  648. "name": "calciteDropdownOpen",
  649. "bubbles": true,
  650. "cancelable": true,
  651. "composed": true,
  652. "docs": {
  653. "tags": [],
  654. "text": "fires when a dropdown has been opened *"
  655. },
  656. "complexType": {
  657. "original": "void",
  658. "resolved": "void",
  659. "references": {}
  660. }
  661. }, {
  662. "method": "calciteDropdownClose",
  663. "name": "calciteDropdownClose",
  664. "bubbles": true,
  665. "cancelable": true,
  666. "composed": true,
  667. "docs": {
  668. "tags": [],
  669. "text": "fires when a dropdown has been closed *"
  670. },
  671. "complexType": {
  672. "original": "void",
  673. "resolved": "void",
  674. "references": {}
  675. }
  676. }]; }
  677. static get methods() { return {
  678. "reposition": {
  679. "complexType": {
  680. "signature": "() => Promise<void>",
  681. "parameters": [],
  682. "references": {
  683. "Promise": {
  684. "location": "global"
  685. }
  686. },
  687. "return": "Promise<void>"
  688. },
  689. "docs": {
  690. "text": "Updates the position of the component.",
  691. "tags": []
  692. }
  693. }
  694. }; }
  695. static get elementRef() { return "el"; }
  696. static get watchers() { return [{
  697. "propName": "active",
  698. "methodName": "activeHandler"
  699. }, {
  700. "propName": "disabled",
  701. "methodName": "handleDisabledChange"
  702. }, {
  703. "propName": "flipPlacements",
  704. "methodName": "flipPlacementsHandler"
  705. }, {
  706. "propName": "maxItems",
  707. "methodName": "maxItemsHandler"
  708. }, {
  709. "propName": "placement",
  710. "methodName": "placementHandler"
  711. }]; }
  712. static get listeners() { return [{
  713. "name": "click",
  714. "method": "closeCalciteDropdownOnClick",
  715. "target": "window",
  716. "capture": false,
  717. "passive": false
  718. }, {
  719. "name": "calciteDropdownCloseRequest",
  720. "method": "closeCalciteDropdownOnEvent",
  721. "target": undefined,
  722. "capture": false,
  723. "passive": false
  724. }, {
  725. "name": "calciteDropdownOpen",
  726. "method": "closeCalciteDropdownOnOpenEvent",
  727. "target": "window",
  728. "capture": false,
  729. "passive": false
  730. }, {
  731. "name": "mouseenter",
  732. "method": "mouseEnterHandler",
  733. "target": undefined,
  734. "capture": false,
  735. "passive": true
  736. }, {
  737. "name": "mouseleave",
  738. "method": "mouseLeaveHandler",
  739. "target": undefined,
  740. "capture": false,
  741. "passive": true
  742. }, {
  743. "name": "calciteDropdownItemKeyEvent",
  744. "method": "calciteDropdownItemKeyEvent",
  745. "target": undefined,
  746. "capture": false,
  747. "passive": false
  748. }, {
  749. "name": "calciteDropdownItemSelect",
  750. "method": "handleItemSelect",
  751. "target": undefined,
  752. "capture": false,
  753. "passive": false
  754. }]; }
  755. }