@limetech/lime-elements 33.13.0-next.6 → 33.14.0-next.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/cjs/lime-elements.cjs.js +1 -1
  2. package/dist/cjs/limel-button-group.cjs.entry.js +14 -4
  3. package/dist/cjs/limel-dialog.cjs.entry.js +1 -1
  4. package/dist/cjs/limel-list_3.cjs.entry.js +36 -14
  5. package/dist/cjs/limel-menu.cjs.entry.js +49 -1
  6. package/dist/cjs/limel-tab-bar.cjs.entry.js +6 -1
  7. package/dist/cjs/limel-tooltip-content.cjs.entry.js +19 -0
  8. package/dist/cjs/limel-tooltip.cjs.entry.js +70 -0
  9. package/dist/cjs/loader.cjs.js +1 -1
  10. package/dist/collection/collection-manifest.json +3 -1
  11. package/dist/collection/components/button-group/button-group.js +15 -5
  12. package/dist/collection/components/dialog/dialog.css +6 -0
  13. package/dist/collection/components/list/list-renderer.js +33 -13
  14. package/dist/collection/components/list/list.css +16 -2
  15. package/dist/collection/components/list/list.js +2 -0
  16. package/dist/collection/components/menu/menu.js +56 -6
  17. package/dist/collection/components/select/select.js +1 -1
  18. package/dist/collection/components/tab-bar/tab-bar.js +6 -1
  19. package/dist/collection/components/tab-panel/tab-panel.js +2 -1
  20. package/dist/collection/components/tab-panel/tab-panel.types.js +1 -0
  21. package/dist/collection/components/tooltip/tooltip-content.css +21 -0
  22. package/dist/collection/components/tooltip/tooltip-content.js +57 -0
  23. package/dist/collection/components/tooltip/tooltip.css +12 -0
  24. package/dist/collection/components/tooltip/tooltip.js +141 -0
  25. package/dist/esm/lime-elements.js +1 -1
  26. package/dist/esm/limel-button-group.entry.js +14 -4
  27. package/dist/esm/limel-dialog.entry.js +1 -1
  28. package/dist/esm/limel-list_3.entry.js +36 -14
  29. package/dist/esm/limel-menu.entry.js +49 -1
  30. package/dist/esm/limel-tab-bar.entry.js +6 -1
  31. package/dist/esm/limel-tooltip-content.entry.js +15 -0
  32. package/dist/esm/limel-tooltip.entry.js +66 -0
  33. package/dist/esm/loader.js +1 -1
  34. package/dist/lime-elements/lime-elements.esm.js +1 -1
  35. package/dist/lime-elements/{p-9c0dc505.entry.js → p-61ecc7f1.entry.js} +2 -2
  36. package/dist/lime-elements/p-63e4f918.entry.js +1 -0
  37. package/dist/lime-elements/p-a6a7dd00.entry.js +1 -0
  38. package/dist/lime-elements/p-b0b18dfc.entry.js +1 -0
  39. package/dist/lime-elements/p-bd805195.entry.js +1 -0
  40. package/dist/lime-elements/{p-2850d435.entry.js → p-c636bfcf.entry.js} +1 -1
  41. package/dist/lime-elements/p-e078c459.entry.js +177 -0
  42. package/dist/types/components/list/list-renderer.d.ts +8 -6
  43. package/dist/types/components/menu/menu.d.ts +11 -3
  44. package/dist/types/components/menu/menu.types.d.ts +7 -0
  45. package/dist/types/components/select/select.d.ts +3 -1
  46. package/dist/types/components/tab-bar/tab-bar.d.ts +1 -0
  47. package/dist/types/components/tab-panel/tab-panel.d.ts +2 -1
  48. package/dist/types/components/tab-panel/tab-panel.types.d.ts +16 -0
  49. package/dist/types/components/tooltip/tooltip-content.d.ts +18 -0
  50. package/dist/types/components/tooltip/tooltip.d.ts +49 -0
  51. package/dist/types/components.d.ts +71 -5
  52. package/dist/types/interface.d.ts +1 -0
  53. package/package.json +1 -1
  54. package/dist/lime-elements/p-1f3b6139.entry.js +0 -1
  55. package/dist/lime-elements/p-8e8219ac.entry.js +0 -177
  56. package/dist/lime-elements/p-aeeca058.entry.js +0 -1
@@ -55,6 +55,22 @@ const Menu = class {
55
55
  * obsolete.
56
56
  */
57
57
  this.fixed = false;
58
+ this.setTriggerAttributes = (element) => {
59
+ const attributes = {
60
+ 'aria-haspopup': true,
61
+ 'aria-expanded': this.open,
62
+ disabled: this.disabled,
63
+ role: 'button',
64
+ };
65
+ for (const [key, value] of Object.entries(attributes)) {
66
+ if (!value) {
67
+ element.removeAttribute(key);
68
+ }
69
+ else {
70
+ element.setAttribute(key, String(value));
71
+ }
72
+ }
73
+ };
58
74
  this.onClose = () => {
59
75
  this.cancel.emit();
60
76
  this.open = false;
@@ -76,6 +92,18 @@ const Menu = class {
76
92
  this.select.emit(event.detail);
77
93
  this.open = false;
78
94
  };
95
+ this.setListElement = (element) => {
96
+ this.list = element;
97
+ };
98
+ this.focusMenuItem = () => {
99
+ var _a;
100
+ const activeElement = this.list.shadowRoot.activeElement;
101
+ activeElement === null || activeElement === void 0 ? void 0 : activeElement.blur();
102
+ const listItems = this.items.filter(this.isListItem);
103
+ const selectedIndex = Math.max(listItems.findIndex((item) => item.selected), 0);
104
+ const menuElements = Array.from(this.list.shadowRoot.querySelectorAll('[role="menuitem"]'));
105
+ (_a = menuElements[selectedIndex]) === null || _a === void 0 ? void 0 : _a.focus();
106
+ };
79
107
  this.portalId = randomString.createRandomString();
80
108
  }
81
109
  componentDidLoad() {
@@ -84,6 +112,16 @@ const Menu = class {
84
112
  console.warn('Using limel-menu with the default trigger is deprecated. Please provide your own trigger element.');
85
113
  }
86
114
  }
115
+ openWatcher() {
116
+ if (!this.open) {
117
+ return;
118
+ }
119
+ const observer = new IntersectionObserver(() => {
120
+ observer.unobserve(this.list);
121
+ this.focusMenuItem();
122
+ });
123
+ observer.observe(this.list);
124
+ }
87
125
  render() {
88
126
  const cssProperties = this.getCssProperties();
89
127
  const dropdownZIndex = getComputedStyle(this.host).getPropertyValue('--dropdown-z-index');
@@ -93,7 +131,11 @@ const Menu = class {
93
131
  const portalPosition = this.getPortalPosition();
94
132
  return (index.h("div", { class: "mdc-menu-surface--anchor", onClick: this.onTriggerClick }, index.h("slot", { name: "trigger" }, this.renderTrigger()), index.h("limel-portal", { class: portalClasses, style: portalPosition, visible: this.open, containerId: this.portalId, openDirection: this.openDirection, position: this.fixed ? 'fixed' : 'absolute', containerStyle: { 'z-index': dropdownZIndex } }, index.h("limel-menu-surface", { open: this.open, onDismiss: this.onClose, style: cssProperties }, index.h("limel-list", { class: {
95
133
  'has-grid-layout has-interactive-items': this.gridLayout,
96
- }, items: this.items, type: "menu", badgeIcons: this.badgeIcons, onChange: this.onListChange })))));
134
+ }, items: this.items, type: "menu", badgeIcons: this.badgeIcons, onChange: this.onListChange, ref: this.setListElement })))));
135
+ }
136
+ componentDidRender() {
137
+ const slotElement = this.host.shadowRoot.querySelector('slot');
138
+ slotElement.assignedElements().forEach(this.setTriggerAttributes);
97
139
  }
98
140
  renderTrigger() {
99
141
  return (index.h("button", { class: `
@@ -128,7 +170,13 @@ const Menu = class {
128
170
  });
129
171
  return zipObject.zipObject(propertyNames, values);
130
172
  }
173
+ isListItem(item) {
174
+ return !('separator' in item);
175
+ }
131
176
  get host() { return index.getElement(this); }
177
+ static get watchers() { return {
178
+ "open": ["openWatcher"]
179
+ }; }
132
180
  };
133
181
  Menu.style = menuCss;
134
182
 
@@ -2255,11 +2255,16 @@ const TabBar = class {
2255
2255
  handleTabActivated(event) {
2256
2256
  const index = event.detail.index;
2257
2257
  const newTabs = setActiveTab(this.tabs, index);
2258
- difference(newTabs, this.tabs).forEach((tab) => {
2258
+ difference(newTabs, this.tabs)
2259
+ .sort(this.sortByInactive)
2260
+ .forEach((tab) => {
2259
2261
  this.changeTab.emit(tab);
2260
2262
  });
2261
2263
  this.tabs = newTabs;
2262
2264
  }
2265
+ sortByInactive(a, b) {
2266
+ return Number(a.active) - Number(b.active);
2267
+ }
2263
2268
  handleScroll() {
2264
2269
  const scrollLeft = this.scrollArea.scrollLeft;
2265
2270
  const scrollRight = Math.floor(this.scrollContent.getBoundingClientRect().width -
@@ -0,0 +1,19 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ const index = require('./index-153dc912.js');
6
+
7
+ const tooltipContentCss = ".tooltip-content{display:flex;flex-direction:row;color:rgb(var(--color-gray-default));border-radius:0.5rem;width:auto;display:flex;padding:0.75rem;transition:opacity 150ms ease-out;margin-top:0.3rem;background-color:rgb(var(--color-gray-darker))}.tooltip-content .tooltip{color:rgb(var(--color-gray-lighter))}.tooltip-content .helperLabel{padding:0 0 0 1rem}.tooltip-content .helperLabel:empty{display:none}";
8
+
9
+ const TooltipContent = class {
10
+ constructor(hostRef) {
11
+ index.registerInstance(this, hostRef);
12
+ }
13
+ render() {
14
+ return (index.h("div", { class: "tooltip-content" }, index.h("div", { class: "tooltip" }, this.label), index.h("div", { class: "helperLabel" }, this.helperLabel)));
15
+ }
16
+ };
17
+ TooltipContent.style = tooltipContentCss;
18
+
19
+ exports.limel_tooltip_content = TooltipContent;
@@ -0,0 +1,70 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ const index = require('./index-153dc912.js');
6
+ const randomString = require('./random-string-4c3b7f1c.js');
7
+
8
+ const tooltipCss = ".trigger-anchor{display:inline-block;position:relative}.tooltip-container{color:#f1f1f1;background-color:#232324}";
9
+
10
+ const Tooltip = class {
11
+ constructor(hostRef) {
12
+ index.registerInstance(this, hostRef);
13
+ this.showTooltip = () => {
14
+ const tooltipDelay = 500;
15
+ this.showTooltipTimeoutHandle = window.setTimeout(() => {
16
+ this.open = true;
17
+ }, tooltipDelay);
18
+ };
19
+ this.hideTooltip = () => {
20
+ clearTimeout(this.showTooltipTimeoutHandle);
21
+ this.open = false;
22
+ };
23
+ this.portalId = randomString.createRandomString();
24
+ this.tooltipId = randomString.createRandomString();
25
+ }
26
+ connectedCallback() {
27
+ this.setOwnerAriaLabel();
28
+ this.addListeners();
29
+ }
30
+ disconnectedCallback() {
31
+ this.removeListeners();
32
+ }
33
+ render() {
34
+ const tooltipZIndex = getComputedStyle(this.host).getPropertyValue('--tooltip-z-index');
35
+ return (index.h("div", { class: "trigger-anchor" }, index.h("limel-portal", { visible: this.open, containerId: this.portalId, containerStyle: {
36
+ 'z-index': tooltipZIndex,
37
+ 'pointer-events': 'none',
38
+ } }, index.h("limel-tooltip-content", { label: this.label, helperLabel: this.helperLabel, role: "tooltip", "aria-hidden": !this.open, id: this.tooltipId }))));
39
+ }
40
+ setOwnerAriaLabel() {
41
+ const owner = this.getOwnerElement();
42
+ owner === null || owner === void 0 ? void 0 : owner.setAttribute('aria-describedby', this.tooltipId);
43
+ }
44
+ addListeners() {
45
+ const owner = this.getOwnerElement();
46
+ owner === null || owner === void 0 ? void 0 : owner.addEventListener('mouseover', this.showTooltip);
47
+ owner === null || owner === void 0 ? void 0 : owner.addEventListener('mouseout', this.hideTooltip);
48
+ owner === null || owner === void 0 ? void 0 : owner.addEventListener('click', this.hideTooltip);
49
+ }
50
+ removeListeners() {
51
+ const owner = this.getOwnerElement();
52
+ owner === null || owner === void 0 ? void 0 : owner.removeEventListener('mouseover', this.showTooltip);
53
+ owner === null || owner === void 0 ? void 0 : owner.removeEventListener('mouseout', this.hideTooltip);
54
+ owner === null || owner === void 0 ? void 0 : owner.removeEventListener('click', this.hideTooltip);
55
+ }
56
+ getOwnerElement() {
57
+ var _a;
58
+ let element = this.host;
59
+ do {
60
+ element = element.parentNode;
61
+ } while (element &&
62
+ element.nodeType !== Node.DOCUMENT_FRAGMENT_NODE &&
63
+ element.nodeType !== Node.DOCUMENT_NODE);
64
+ return (_a = element) === null || _a === void 0 ? void 0 : _a.getElementById(this.elementId);
65
+ }
66
+ get host() { return index.getElement(this); }
67
+ };
68
+ Tooltip.style = tooltipCss;
69
+
70
+ exports.limel_tooltip = Tooltip;
@@ -14,7 +14,7 @@ const patchEsm = () => {
14
14
  const defineCustomElements = (win, options) => {
15
15
  if (typeof window === 'undefined') return Promise.resolve();
16
16
  return patchEsm().then(() => {
17
- return index.bootstrapLazy([["limel-picker.cjs",[[1,"limel-picker",{"disabled":[4],"readonly":[516],"label":[1],"searchLabel":[1,"search-label"],"leadingIcon":[1,"leading-icon"],"emptyResultMessage":[1,"empty-result-message"],"required":[4],"value":[16],"searcher":[16],"multiple":[4],"delimiter":[513],"displayFullList":[4,"display-full-list"],"actions":[16],"actionPosition":[1,"action-position"],"actionScrollBehavior":[1,"action-scroll-behavior"],"items":[32],"textValue":[32],"loading":[32],"chips":[32]}]]],["limel-date-picker.cjs",[[1,"limel-date-picker",{"disabled":[516],"readonly":[516],"invalid":[516],"label":[513],"helperText":[513,"helper-text"],"required":[516],"value":[16],"type":[513],"format":[513],"language":[513],"formattedValue":[32],"internalFormat":[32],"showPortal":[32]}]]],["limel-select.cjs",[[1,"limel-select",{"disabled":[516],"readonly":[516],"invalid":[516],"required":[516],"label":[513],"helperText":[513,"helper-text"],"value":[16],"options":[16],"multiple":[4],"menuOpen":[32]}]]],["limel-tab-panel.cjs",[[1,"limel-tab-panel",{"tabs":[1040]}]]],["limel-file.cjs",[[1,"limel-file",{"value":[16],"label":[513],"required":[516],"disabled":[516],"readonly":[516],"accept":[513],"language":[1],"isDraggingOverDropZone":[32]}]]],["limel-menu.cjs",[[1,"limel-menu",{"label":[513],"items":[16],"disabled":[516],"openDirection":[513,"open-direction"],"open":[1540],"badgeIcons":[516,"badge-icons"],"gridLayout":[516,"grid-layout"],"fixed":[4]}]]],["limel-button.cjs",[[1,"limel-button",{"label":[513],"primary":[516],"outlined":[516],"icon":[513],"disabled":[516],"loading":[516]}]]],["limel-collapsible-section.cjs",[[1,"limel-collapsible-section",{"isOpen":[1540,"is-open"],"header":[1],"actions":[16]}]]],["limel-dialog.cjs",[[1,"limel-dialog",{"heading":[1],"fullscreen":[516],"open":[1540],"closingActions":[16]}]]],["limel-popover.cjs",[[1,"limel-popover",{"open":[4]}]]],["limel-progress-flow.cjs",[[1,"limel-progress-flow",{"flowItems":[16],"disabled":[4],"readonly":[4]}]]],["limel-banner.cjs",[[1,"limel-banner",{"message":[513],"icon":[513],"isOpen":[32],"open":[64],"close":[64]}]]],["limel-button-group.cjs",[[1,"limel-button-group",{"value":[16],"disabled":[516],"selectedButtonId":[32]}]]],["limel-table.cjs",[[1,"limel-table",{"data":[16],"columns":[16],"mode":[1],"pageSize":[2,"page-size"],"totalRows":[2,"total-rows"],"sorting":[16],"activeRow":[1040],"movableColumns":[4,"movable-columns"],"loading":[4],"page":[2],"emptyMessage":[1,"empty-message"]}]]],["limel-checkbox.cjs",[[1,"limel-checkbox",{"disabled":[516],"readonly":[516],"label":[513],"checked":[516],"required":[516],"modified":[32]}]]],["limel-circular-progress.cjs",[[1,"limel-circular-progress",{"value":[2],"maxValue":[2,"max-value"],"suffix":[1],"displayPercentageColors":[4,"display-percentage-colors"],"size":[513]}]]],["limel-code-editor.cjs",[[1,"limel-code-editor",{"value":[1],"language":[1],"readonly":[4],"lineNumbers":[4,"line-numbers"],"colorScheme":[1,"color-scheme"],"random":[32]}]]],["limel-config.cjs",[[1,"limel-config",{"config":[16]}]]],["limel-flex-container.cjs",[[1,"limel-flex-container",{"direction":[513],"justify":[513],"align":[513],"reverse":[516]}]]],["limel-form.cjs",[[1,"limel-form",{"schema":[16],"value":[16],"propsFactory":[16]}]]],["limel-grid.cjs",[[1,"limel-grid"]]],["limel-linear-progress.cjs",[[1,"limel-linear-progress",{"value":[2],"indeterminate":[4]}]]],["limel-slider.cjs",[[1,"limel-slider",{"disabled":[516],"readonly":[516],"factor":[514],"label":[513],"helperText":[513,"helper-text"],"unit":[513],"value":[514],"valuemax":[514],"valuemin":[514],"step":[514],"percentageClass":[32]}]]],["limel-snackbar.cjs",[[1,"limel-snackbar",{"message":[1],"timeout":[2],"actionText":[1,"action-text"],"dismissible":[4],"multiline":[4],"language":[1],"show":[64]}]]],["limel-switch.cjs",[[1,"limel-switch",{"label":[513],"disabled":[516],"readonly":[516],"value":[516],"fieldId":[32]}]]],["limel-badge.cjs",[[1,"limel-badge",{"label":[514]}]]],["limel-icon.cjs",[[1,"limel-icon",{"size":[513],"name":[513],"badge":[516]}]]],["limel-tab-bar.cjs",[[1,"limel-tab-bar",{"tabs":[1040],"canScrollLeft":[32],"canScrollRight":[32]},[[9,"resize","handleWindowResize"]]]]],["limel-header.cjs",[[1,"limel-header",{"icon":[1],"heading":[1],"subheading":[1],"supportingText":[1,"supporting-text"]}]]],["limel-progress-flow-item.cjs",[[0,"limel-progress-flow-item",{"item":[16],"disabled":[4],"readonly":[4]}]]],["limel-popover-surface.cjs",[[1,"limel-popover-surface",{"contentCollection":[16]}]]],["limel-list_3.cjs",[[1,"limel-list",{"items":[16],"badgeIcons":[4,"badge-icons"],"iconSize":[1,"icon-size"],"type":[1],"maxLinesSecondaryText":[2,"max-lines-secondary-text"]}],[1,"limel-menu-surface",{"open":[4],"allowClicksElement":[16]}],[1,"limel-portal",{"openDirection":[1,"open-direction"],"position":[1],"containerId":[1,"container-id"],"containerStyle":[16],"parent":[16],"inheritParentWidth":[4,"inherit-parent-width"],"visible":[4]}]]],["limel-flatpickr-adapter_2.cjs",[[1,"limel-input-field",{"disabled":[516],"readonly":[516],"invalid":[516],"label":[513],"helperText":[513,"helper-text"],"required":[516],"value":[513],"trailingIcon":[513,"trailing-icon"],"leadingIcon":[513,"leading-icon"],"pattern":[513],"type":[513],"formatNumber":[516,"format-number"],"step":[520],"max":[514],"min":[514],"maxlength":[514],"minlength":[514],"completions":[16],"showLink":[516,"show-link"],"isFocused":[32],"isModified":[32],"showCompletions":[32]}],[1,"limel-flatpickr-adapter",{"value":[16],"type":[1],"format":[1],"isOpen":[4,"is-open"],"inputElement":[16],"language":[1]}]]],["limel-chip-set.cjs",[[1,"limel-chip-set",{"value":[16],"type":[513],"label":[513],"disabled":[516],"readonly":[516],"maxItems":[514,"max-items"],"required":[516],"searchLabel":[513,"search-label"],"emptyInputOnBlur":[516,"empty-input-on-blur"],"clearAllButton":[4,"clear-all-button"],"leadingIcon":[513,"leading-icon"],"delimiter":[513],"language":[1],"editMode":[32],"textValue":[32],"blurred":[32],"inputChipIndexSelected":[32],"getEditMode":[64],"setFocus":[64],"emptyInput":[64]}]]],["limel-icon-button.cjs",[[1,"limel-icon-button",{"icon":[513],"elevated":[516],"label":[513],"disabled":[516],"relayout":[64]}]]],["limel-spinner.cjs",[[1,"limel-spinner",{"size":[513],"limeBranded":[4,"lime-branded"]}]]]], options);
17
+ return index.bootstrapLazy([["limel-picker.cjs",[[1,"limel-picker",{"disabled":[4],"readonly":[516],"label":[1],"searchLabel":[1,"search-label"],"leadingIcon":[1,"leading-icon"],"emptyResultMessage":[1,"empty-result-message"],"required":[4],"value":[16],"searcher":[16],"multiple":[4],"delimiter":[513],"displayFullList":[4,"display-full-list"],"actions":[16],"actionPosition":[1,"action-position"],"actionScrollBehavior":[1,"action-scroll-behavior"],"items":[32],"textValue":[32],"loading":[32],"chips":[32]}]]],["limel-date-picker.cjs",[[1,"limel-date-picker",{"disabled":[516],"readonly":[516],"invalid":[516],"label":[513],"helperText":[513,"helper-text"],"required":[516],"value":[16],"type":[513],"format":[513],"language":[513],"formattedValue":[32],"internalFormat":[32],"showPortal":[32]}]]],["limel-button-group.cjs",[[1,"limel-button-group",{"value":[16],"disabled":[516],"selectedButtonId":[32]}]]],["limel-select.cjs",[[1,"limel-select",{"disabled":[516],"readonly":[516],"invalid":[516],"required":[516],"label":[513],"helperText":[513,"helper-text"],"value":[16],"options":[16],"multiple":[4],"menuOpen":[32]}]]],["limel-tab-panel.cjs",[[1,"limel-tab-panel",{"tabs":[1040]}]]],["limel-file.cjs",[[1,"limel-file",{"value":[16],"label":[513],"required":[516],"disabled":[516],"readonly":[516],"accept":[513],"language":[1],"isDraggingOverDropZone":[32]}]]],["limel-menu.cjs",[[1,"limel-menu",{"label":[513],"items":[16],"disabled":[516],"openDirection":[513,"open-direction"],"open":[1540],"badgeIcons":[516,"badge-icons"],"gridLayout":[516,"grid-layout"],"fixed":[4]}]]],["limel-button.cjs",[[1,"limel-button",{"label":[513],"primary":[516],"outlined":[516],"icon":[513],"disabled":[516],"loading":[516]}]]],["limel-collapsible-section.cjs",[[1,"limel-collapsible-section",{"isOpen":[1540,"is-open"],"header":[1],"actions":[16]}]]],["limel-dialog.cjs",[[1,"limel-dialog",{"heading":[1],"fullscreen":[516],"open":[1540],"closingActions":[16]}]]],["limel-popover.cjs",[[1,"limel-popover",{"open":[4]}]]],["limel-progress-flow.cjs",[[1,"limel-progress-flow",{"flowItems":[16],"disabled":[4],"readonly":[4]}]]],["limel-banner.cjs",[[1,"limel-banner",{"message":[513],"icon":[513],"isOpen":[32],"open":[64],"close":[64]}]]],["limel-table.cjs",[[1,"limel-table",{"data":[16],"columns":[16],"mode":[1],"pageSize":[2,"page-size"],"totalRows":[2,"total-rows"],"sorting":[16],"activeRow":[1040],"movableColumns":[4,"movable-columns"],"loading":[4],"page":[2],"emptyMessage":[1,"empty-message"]}]]],["limel-checkbox.cjs",[[1,"limel-checkbox",{"disabled":[516],"readonly":[516],"label":[513],"checked":[516],"required":[516],"modified":[32]}]]],["limel-circular-progress.cjs",[[1,"limel-circular-progress",{"value":[2],"maxValue":[2,"max-value"],"suffix":[1],"displayPercentageColors":[4,"display-percentage-colors"],"size":[513]}]]],["limel-code-editor.cjs",[[1,"limel-code-editor",{"value":[1],"language":[1],"readonly":[4],"lineNumbers":[4,"line-numbers"],"colorScheme":[1,"color-scheme"],"random":[32]}]]],["limel-config.cjs",[[1,"limel-config",{"config":[16]}]]],["limel-flex-container.cjs",[[1,"limel-flex-container",{"direction":[513],"justify":[513],"align":[513],"reverse":[516]}]]],["limel-form.cjs",[[1,"limel-form",{"schema":[16],"value":[16],"propsFactory":[16]}]]],["limel-grid.cjs",[[1,"limel-grid"]]],["limel-linear-progress.cjs",[[1,"limel-linear-progress",{"value":[2],"indeterminate":[4]}]]],["limel-slider.cjs",[[1,"limel-slider",{"disabled":[516],"readonly":[516],"factor":[514],"label":[513],"helperText":[513,"helper-text"],"unit":[513],"value":[514],"valuemax":[514],"valuemin":[514],"step":[514],"percentageClass":[32]}]]],["limel-snackbar.cjs",[[1,"limel-snackbar",{"message":[1],"timeout":[2],"actionText":[1,"action-text"],"dismissible":[4],"multiline":[4],"language":[1],"show":[64]}]]],["limel-switch.cjs",[[1,"limel-switch",{"label":[513],"disabled":[516],"readonly":[516],"value":[516],"fieldId":[32]}]]],["limel-icon-button.cjs",[[1,"limel-icon-button",{"icon":[513],"elevated":[516],"label":[513],"disabled":[516],"relayout":[64]}]]],["limel-badge.cjs",[[1,"limel-badge",{"label":[514]}]]],["limel-tab-bar.cjs",[[1,"limel-tab-bar",{"tabs":[1040],"canScrollLeft":[32],"canScrollRight":[32]},[[9,"resize","handleWindowResize"]]]]],["limel-tooltip.cjs",[[1,"limel-tooltip",{"label":[513],"helperLabel":[513,"helper-label"],"elementId":[513,"element-id"],"open":[32]}]]],["limel-header.cjs",[[1,"limel-header",{"icon":[1],"heading":[1],"subheading":[1],"supportingText":[1,"supporting-text"]}]]],["limel-progress-flow-item.cjs",[[0,"limel-progress-flow-item",{"item":[16],"disabled":[4],"readonly":[4]}]]],["limel-popover-surface.cjs",[[1,"limel-popover-surface",{"contentCollection":[16]}]]],["limel-icon.cjs",[[1,"limel-icon",{"size":[513],"name":[513],"badge":[516]}]]],["limel-list_3.cjs",[[1,"limel-list",{"items":[16],"badgeIcons":[4,"badge-icons"],"iconSize":[1,"icon-size"],"type":[1],"maxLinesSecondaryText":[2,"max-lines-secondary-text"]}],[1,"limel-menu-surface",{"open":[4],"allowClicksElement":[16]}],[1,"limel-portal",{"openDirection":[1,"open-direction"],"position":[1],"containerId":[1,"container-id"],"containerStyle":[16],"parent":[16],"inheritParentWidth":[4,"inherit-parent-width"],"visible":[4]}]]],["limel-flatpickr-adapter_2.cjs",[[1,"limel-input-field",{"disabled":[516],"readonly":[516],"invalid":[516],"label":[513],"helperText":[513,"helper-text"],"required":[516],"value":[513],"trailingIcon":[513,"trailing-icon"],"leadingIcon":[513,"leading-icon"],"pattern":[513],"type":[513],"formatNumber":[516,"format-number"],"step":[520],"max":[514],"min":[514],"maxlength":[514],"minlength":[514],"completions":[16],"showLink":[516,"show-link"],"isFocused":[32],"isModified":[32],"showCompletions":[32]}],[1,"limel-flatpickr-adapter",{"value":[16],"type":[1],"format":[1],"isOpen":[4,"is-open"],"inputElement":[16],"language":[1]}]]],["limel-chip-set.cjs",[[1,"limel-chip-set",{"value":[16],"type":[513],"label":[513],"disabled":[516],"readonly":[516],"maxItems":[514,"max-items"],"required":[516],"searchLabel":[513,"search-label"],"emptyInputOnBlur":[516,"empty-input-on-blur"],"clearAllButton":[4,"clear-all-button"],"leadingIcon":[513,"leading-icon"],"delimiter":[513],"language":[1],"editMode":[32],"textValue":[32],"blurred":[32],"inputChipIndexSelected":[32],"getEditMode":[64],"setFocus":[64],"emptyInput":[64]}]]],["limel-tooltip-content.cjs",[[1,"limel-tooltip-content",{"label":[513],"helperLabel":[513,"helper-label"]}]]],["limel-spinner.cjs",[[1,"limel-spinner",{"size":[513],"limeBranded":[4,"lime-branded"]}]]]], options);
18
18
  });
19
19
  };
20
20
 
@@ -38,7 +38,9 @@
38
38
  "./components/switch/switch.js",
39
39
  "./components/tab-bar/tab-bar.js",
40
40
  "./components/tab-panel/tab-panel.js",
41
- "./components/table/table.js"
41
+ "./components/table/table.js",
42
+ "./components/tooltip/tooltip-content.js",
43
+ "./components/tooltip/tooltip.js"
42
44
  ],
43
45
  "compiler": {
44
46
  "name": "@stencil/core",
@@ -65,14 +65,17 @@ export class ButtonGroup {
65
65
  return (h("div", { class: classes, role: "grid" }, this.value.map(this.renderButton)));
66
66
  }
67
67
  renderButton(button) {
68
+ // Prefix with 'b' because html IDs cannot start with a digit,
69
+ // and we need to differentiate from the ID on the limel-icon. /Ads
70
+ const buttonId = `b${button.id}`;
68
71
  const classes = {
69
72
  'mdc-chip': true,
70
73
  'mdc-chip--selected': this.isButtonChecked(button),
71
74
  };
72
75
  return (h("div", { class: classes, role: "row" },
73
76
  h("span", { role: "gridcell" },
74
- h("input", { type: "radio", name: this.radioGroupName, checked: this.isButtonChecked(button), id: button.id, onChange: this.onChange }),
75
- h("label", { htmlFor: button.id }, this.renderContent(button)))));
77
+ h("input", { type: "radio", name: this.radioGroupName, checked: this.isButtonChecked(button), id: buttonId, onChange: this.onChange }),
78
+ h("label", { htmlFor: buttonId }, this.renderContent(button)))));
76
79
  }
77
80
  renderContent(button) {
78
81
  if (button.icon) {
@@ -87,14 +90,21 @@ export class ButtonGroup {
87
90
  return h("span", { class: "mdc-chip__text" }, button.title);
88
91
  }
89
92
  renderIcon(button) {
90
- return (h("limel-icon", { class: "mdc-chip__icon", "aria-label": button.title, title: button.title, name: button.icon, size: "small", badge: true }));
93
+ // Prefix with 'i' because html IDs cannot start with a digit,
94
+ // and we need to differentiate from the "buttonId". /Ads
95
+ const iconId = `i${button.id}`;
96
+ return [
97
+ h("limel-icon", { id: iconId, class: "mdc-chip__icon", "aria-label": button.title, name: button.icon, size: "small", badge: true }),
98
+ h("limel-tooltip", { elementId: iconId, label: button.title }),
99
+ ];
91
100
  }
92
101
  onChange(event) {
93
102
  event.stopPropagation();
94
103
  const target = event.target;
95
- this.selectedButtonId = target.id;
104
+ // The ID is prefixed with `b` in the HTML, remember? /Ads
105
+ this.selectedButtonId = target.id.substr(1);
96
106
  const button = this.value.find((item) => {
97
- return `${item.id}` === target.id;
107
+ return item.id === this.selectedButtonId;
98
108
  });
99
109
  this.change.emit(button);
100
110
  }
@@ -674,4 +674,10 @@ slot[name=button] {
674
674
  gap: 0.5rem;
675
675
  width: 100%;
676
676
  justify-content: flex-end;
677
+ }
678
+
679
+ @media screen and (max-width: 760px) {
680
+ slot[name=button] {
681
+ flex-direction: column-reverse;
682
+ }
677
683
  }
@@ -16,6 +16,9 @@ export class ListRenderer {
16
16
  this.twoLines = items.some((item) => {
17
17
  return 'secondaryText' in item && !!item.secondaryText;
18
18
  });
19
+ this.commandKey = items.some((item) => {
20
+ return 'commandText' in item && !!item.commandText;
21
+ });
19
22
  this.hasIcons = items.some((item) => {
20
23
  return 'icon' in item && !!item.icon;
21
24
  });
@@ -40,6 +43,7 @@ export class ListRenderer {
40
43
  selectable: selectableListTypes.includes(this.config.type),
41
44
  'mdc-deprecated-list--avatar-list': this.avatarList,
42
45
  'list--compact': this.twoLines &&
46
+ this.commandKey &&
43
47
  ['small', 'x-small'].includes(this.config.iconSize),
44
48
  };
45
49
  return (h("ul", { class: classNames, "aria-hidden": (this.config.type === 'menu').toString(), role: role, "aria-orientation": "vertical" }, items.map(this.renderListItem)));
@@ -50,7 +54,7 @@ export class ListRenderer {
50
54
  * Returns `undefined` if no item should have the attribute set.
51
55
  * See https://github.com/material-components/material-components-web/tree/e66a43a75fef4f9179e24856649518e15e279a04/packages/mdc-list#accessibility
52
56
  *
53
- * @param {Array<ListItem | ListSeparator>} items the items of the list, including any `ListSeparator`:s
57
+ * @param {Array<ListItem | ListSeparator | MenuItems>} items the items of the list, including any `ListSeparator`:s
54
58
  * @returns {number} the index as per the description
55
59
  */
56
60
  getIndexForWhichToApplyTabIndex(items) {
@@ -77,7 +81,7 @@ export class ListRenderer {
77
81
  /**
78
82
  * Render a single list item
79
83
  *
80
- * @param {ListItem | ListSeparator} item the item to render
84
+ * @param {ListItem | ListSeparator | MenuItems} item the item to render
81
85
  * @param {number} index the index the item had in the `items` array
82
86
  * @returns {HTMLElement} the list item
83
87
  */
@@ -99,24 +103,40 @@ export class ListRenderer {
99
103
  }
100
104
  return (h("li", Object.assign({ class: classNames, role: this.config.type === 'menu' ? 'menuitem' : '', "aria-disabled": item.disabled ? 'true' : 'false', "aria-selected": item.selected ? 'true' : 'false', "data-index": index }, attributes),
101
105
  item.icon ? this.renderIcon(this.config, item) : null,
102
- this.renderText(item.text, item.secondaryText),
106
+ this.renderText(item),
103
107
  this.twoLines && this.avatarList ? this.renderDivider() : null,
104
108
  this.renderActionMenu(item.actions)));
105
109
  }
106
110
  /**
107
111
  * Render the text of the list item
108
112
  *
109
- * @param {string} text primary text for the list item
110
- * @param {string} secondaryText secondary text for the list item
113
+ * @param {ListItem | MenuItem} item the list item
111
114
  * @returns {HTMLElement | string} the text for the list item
112
115
  */
113
- renderText(text, secondaryText) {
114
- if (!secondaryText) {
115
- return h("span", { class: "mdc-deprecated-list-item__text" }, text);
116
+ renderText(item) {
117
+ if (this.isSimpleItem(item)) {
118
+ return (h("span", { class: "mdc-deprecated-list-item__text" }, item.text));
119
+ }
120
+ return (h("div", { class: "mdc-deprecated-list-item__text" },
121
+ h("div", { class: "mdc-deprecated-list-item__primary-command-text" },
122
+ h("div", { class: "mdc-deprecated-list-item__primary-text" }, item.text),
123
+ this.renderCommandText(item)),
124
+ h("div", { class: "mdc-deprecated-list-item__secondary-text" }, item.secondaryText)));
125
+ }
126
+ renderCommandText(item) {
127
+ if (!('commandText' in item)) {
128
+ return;
129
+ }
130
+ return (h("div", { class: "mdc-deprecated-list-item__command-text" }, item.commandText));
131
+ }
132
+ isSimpleItem(item) {
133
+ if ('commandText' in item) {
134
+ return false;
135
+ }
136
+ if ('secondaryText' in item) {
137
+ return false;
116
138
  }
117
- return (h("span", { class: "mdc-deprecated-list-item__text" },
118
- h("span", { class: "mdc-deprecated-list-item__primary-text" }, text),
119
- h("span", { class: "mdc-deprecated-list-item__secondary-text" }, secondaryText)));
139
+ return true;
120
140
  }
121
141
  /**
122
142
  * Render an icon for a list item
@@ -177,13 +197,13 @@ export class ListRenderer {
177
197
  if (this.hasIcons) {
178
198
  return [
179
199
  item.icon ? this.renderIcon(config, item) : null,
180
- this.renderText(item.text, item.secondaryText),
200
+ this.renderText(item),
181
201
  h("div", { class: "mdc-deprecated-list-item__meta" }, itemTemplate),
182
202
  ];
183
203
  }
184
204
  return [
185
205
  h("div", { class: "mdc-deprecated-list-item__graphic" }, itemTemplate),
186
- this.renderText(item.text, item.secondaryText),
206
+ this.renderText(item),
187
207
  ];
188
208
  }
189
209
  }
@@ -3136,16 +3136,30 @@ a.mdc-list-item {
3136
3136
  margin-bottom: 0.25rem;
3137
3137
  }
3138
3138
  .mdc-deprecated-list .mdc-deprecated-list-item__secondary-text,
3139
- .mdc-deprecated-list .mdc-deprecated-list-item__primary-text {
3139
+ .mdc-deprecated-list .mdc-deprecated-list-item__primary-text,
3140
+ .mdc-deprecated-list .mdc-deprecated-list-item__command-text {
3140
3141
  margin: 0;
3141
3142
  }
3142
3143
  .mdc-deprecated-list .mdc-deprecated-list-item__secondary-text:before, .mdc-deprecated-list .mdc-deprecated-list-item__secondary-text:after,
3143
3144
  .mdc-deprecated-list .mdc-deprecated-list-item__primary-text:before,
3144
- .mdc-deprecated-list .mdc-deprecated-list-item__primary-text:after {
3145
+ .mdc-deprecated-list .mdc-deprecated-list-item__primary-text:after,
3146
+ .mdc-deprecated-list .mdc-deprecated-list-item__command-text:before,
3147
+ .mdc-deprecated-list .mdc-deprecated-list-item__command-text:after {
3145
3148
  display: none;
3146
3149
  }
3150
+ .mdc-deprecated-list .mdc-deprecated-list-item__command-text {
3151
+ color: rgb(var(--contrast-800));
3152
+ margin-left: 0.7rem;
3153
+ }
3147
3154
  .mdc-deprecated-list .mdc-deprecated-list-item__text {
3148
3155
  align-self: center;
3156
+ width: 100%;
3157
+ }
3158
+ .mdc-deprecated-list .mdc-deprecated-list-item__primary-command-text {
3159
+ display: flex;
3160
+ flex-direction: row;
3161
+ justify-content: space-between;
3162
+ align-items: baseline;
3149
3163
  }
3150
3164
  .mdc-deprecated-list limel-icon.mdc-deprecated-list-item__graphic {
3151
3165
  display: block;
@@ -107,6 +107,8 @@ export class List {
107
107
  return;
108
108
  }
109
109
  this.mdcMenu = new MDCMenu(element);
110
+ this.mdcMenu.hasTypeahead = true;
111
+ this.mdcMenu.wrapFocus = true;
110
112
  this.mdcMenu.items.forEach((item) => new MDCRipple(item));
111
113
  }
112
114
  setupListeners() {
@@ -1,4 +1,4 @@
1
- import { Component, Event, h, Prop, Element, } from '@stencil/core';
1
+ import { Component, Event, h, Prop, Element, Watch, } from '@stencil/core';
2
2
  import { createRandomString } from '../../util/random-string';
3
3
  import { zipObject } from 'lodash-es';
4
4
  /**
@@ -10,6 +10,7 @@ import { zipObject } from 'lodash-es';
10
10
  * @exampleComponent limel-example-menu-badge-icons
11
11
  * @exampleComponent limel-example-menu-grid
12
12
  * @exampleComponent limel-example-menu-composite
13
+ * @exampleComponent limel-example-menu-hotkeys
13
14
  */
14
15
  export class Menu {
15
16
  constructor() {
@@ -52,6 +53,22 @@ export class Menu {
52
53
  * obsolete.
53
54
  */
54
55
  this.fixed = false;
56
+ this.setTriggerAttributes = (element) => {
57
+ const attributes = {
58
+ 'aria-haspopup': true,
59
+ 'aria-expanded': this.open,
60
+ disabled: this.disabled,
61
+ role: 'button',
62
+ };
63
+ for (const [key, value] of Object.entries(attributes)) {
64
+ if (!value) {
65
+ element.removeAttribute(key);
66
+ }
67
+ else {
68
+ element.setAttribute(key, String(value));
69
+ }
70
+ }
71
+ };
55
72
  this.onClose = () => {
56
73
  this.cancel.emit();
57
74
  this.open = false;
@@ -73,6 +90,18 @@ export class Menu {
73
90
  this.select.emit(event.detail);
74
91
  this.open = false;
75
92
  };
93
+ this.setListElement = (element) => {
94
+ this.list = element;
95
+ };
96
+ this.focusMenuItem = () => {
97
+ var _a;
98
+ const activeElement = this.list.shadowRoot.activeElement;
99
+ activeElement === null || activeElement === void 0 ? void 0 : activeElement.blur();
100
+ const listItems = this.items.filter(this.isListItem);
101
+ const selectedIndex = Math.max(listItems.findIndex((item) => item.selected), 0);
102
+ const menuElements = Array.from(this.list.shadowRoot.querySelectorAll('[role="menuitem"]'));
103
+ (_a = menuElements[selectedIndex]) === null || _a === void 0 ? void 0 : _a.focus();
104
+ };
76
105
  this.portalId = createRandomString();
77
106
  }
78
107
  componentDidLoad() {
@@ -81,6 +110,16 @@ export class Menu {
81
110
  console.warn('Using limel-menu with the default trigger is deprecated. Please provide your own trigger element.');
82
111
  }
83
112
  }
113
+ openWatcher() {
114
+ if (!this.open) {
115
+ return;
116
+ }
117
+ const observer = new IntersectionObserver(() => {
118
+ observer.unobserve(this.list);
119
+ this.focusMenuItem();
120
+ });
121
+ observer.observe(this.list);
122
+ }
84
123
  render() {
85
124
  const cssProperties = this.getCssProperties();
86
125
  const dropdownZIndex = getComputedStyle(this.host).getPropertyValue('--dropdown-z-index');
@@ -94,7 +133,11 @@ export class Menu {
94
133
  h("limel-menu-surface", { open: this.open, onDismiss: this.onClose, style: cssProperties },
95
134
  h("limel-list", { class: {
96
135
  'has-grid-layout has-interactive-items': this.gridLayout,
97
- }, items: this.items, type: "menu", badgeIcons: this.badgeIcons, onChange: this.onListChange })))));
136
+ }, items: this.items, type: "menu", badgeIcons: this.badgeIcons, onChange: this.onListChange, ref: this.setListElement })))));
137
+ }
138
+ componentDidRender() {
139
+ const slotElement = this.host.shadowRoot.querySelector('slot');
140
+ slotElement.assignedElements().forEach(this.setTriggerAttributes);
98
141
  }
99
142
  renderTrigger() {
100
143
  return (h("button", { class: `
@@ -130,6 +173,9 @@ export class Menu {
130
173
  });
131
174
  return zipObject(propertyNames, values);
132
175
  }
176
+ isListItem(item) {
177
+ return !('separator' in item);
178
+ }
133
179
  static get is() { return "limel-menu"; }
134
180
  static get encapsulation() { return "shadow"; }
135
181
  static get originalStyleUrls() { return {
@@ -164,15 +210,15 @@ export class Menu {
164
210
  "type": "unknown",
165
211
  "mutable": false,
166
212
  "complexType": {
167
- "original": "Array<ListItem | ListSeparator>",
168
- "resolved": "(ListItem<any> | ListSeparator)[]",
213
+ "original": "Array<MenuItem | ListSeparator>",
214
+ "resolved": "(ListSeparator | MenuItem<any>)[]",
169
215
  "references": {
170
216
  "Array": {
171
217
  "location": "global"
172
218
  },
173
- "ListItem": {
219
+ "MenuItem": {
174
220
  "location": "import",
175
- "path": "@limetech/lime-elements"
221
+ "path": "./menu.types"
176
222
  },
177
223
  "ListSeparator": {
178
224
  "location": "import",
@@ -342,4 +388,8 @@ export class Menu {
342
388
  }
343
389
  }]; }
344
390
  static get elementRef() { return "host"; }
391
+ static get watchers() { return [{
392
+ "propName": "open",
393
+ "methodName": "openWatcher"
394
+ }]; }
345
395
  }
@@ -316,7 +316,7 @@ export class Select {
316
316
  "optional": false,
317
317
  "docs": {
318
318
  "tags": [],
319
- "text": "Currently selected value or values (if `multiple` is set)."
319
+ "text": "Currently selected value or values.\nIf `multiple` is `true`, this must be an array. Otherwise it must be a\nsingle value."
320
320
  }
321
321
  },
322
322
  "options": {
@@ -117,11 +117,16 @@ export class TabBar {
117
117
  handleTabActivated(event) {
118
118
  const index = event.detail.index;
119
119
  const newTabs = setActiveTab(this.tabs, index);
120
- difference(newTabs, this.tabs).forEach((tab) => {
120
+ difference(newTabs, this.tabs)
121
+ .sort(this.sortByInactive)
122
+ .forEach((tab) => {
121
123
  this.changeTab.emit(tab);
122
124
  });
123
125
  this.tabs = newTabs;
124
126
  }
127
+ sortByInactive(a, b) {
128
+ return Number(a.active) - Number(b.active);
129
+ }
125
130
  handleScroll() {
126
131
  const scrollLeft = this.scrollArea.scrollLeft;
127
132
  const scrollRight = Math.floor(this.scrollContent.getBoundingClientRect().width -
@@ -4,7 +4,8 @@ import { dispatchResizeEvent } from '../../util/dispatch-resize-event';
4
4
  * The `limel-tab-panel` component uses the `limel-tab-bar` component together
5
5
  * with custom slotted components and will display the content for the currently
6
6
  * active tab. Each slotted component must have an id equal to the id of the
7
- * corresponding tab it belongs to.
7
+ * corresponding tab it belongs to. These components should implement the
8
+ * [TabPanelComponent](#/type/TabPanelComponent/) interface.
8
9
  *
9
10
  * The `limel-tab-panel` component will automatically set each tab configuration
10
11
  * on the corresponding slotted component as a property named `tab` so that the
@@ -0,0 +1,21 @@
1
+ .tooltip-content {
2
+ display: flex;
3
+ flex-direction: row;
4
+ color: rgb(var(--color-gray-default));
5
+ border-radius: 0.5rem;
6
+ width: auto;
7
+ display: flex;
8
+ padding: 0.75rem;
9
+ transition: opacity 150ms ease-out;
10
+ margin-top: 0.3rem;
11
+ background-color: rgb(var(--color-gray-darker));
12
+ }
13
+ .tooltip-content .tooltip {
14
+ color: rgb(var(--color-gray-lighter));
15
+ }
16
+ .tooltip-content .helperLabel {
17
+ padding: 0 0 0 1rem;
18
+ }
19
+ .tooltip-content .helperLabel:empty {
20
+ display: none;
21
+ }