@limetech/lime-elements 33.14.0-next.9 → 34.0.0-next.4

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 (210) hide show
  1. package/dist/cjs/{checkbox.template-c0b4c7c7.js → checkbox.template-d4423721.js} +1 -1
  2. package/dist/cjs/component-f7ef9087.js +2365 -0
  3. package/dist/cjs/{index-153dc912.js → index-e63a89d7.js} +73 -64
  4. package/dist/cjs/lime-elements.cjs.js +3 -3
  5. package/dist/cjs/limel-badge.cjs.entry.js +2 -2
  6. package/dist/cjs/limel-banner.cjs.entry.js +2 -2
  7. package/dist/cjs/limel-button-group.cjs.entry.js +16 -6
  8. package/dist/cjs/limel-button.cjs.entry.js +2 -2
  9. package/dist/cjs/limel-checkbox.cjs.entry.js +3 -3
  10. package/dist/cjs/limel-chip-set.cjs.entry.js +2 -2
  11. package/dist/cjs/limel-circular-progress.cjs.entry.js +2 -2
  12. package/dist/cjs/limel-code-editor.cjs.entry.js +2 -2
  13. package/dist/cjs/limel-collapsible-section.cjs.entry.js +2 -2
  14. package/dist/cjs/limel-config.cjs.entry.js +5 -2
  15. package/dist/cjs/limel-date-picker.cjs.entry.js +2 -2
  16. package/dist/cjs/limel-dialog.cjs.entry.js +2 -2
  17. package/dist/cjs/limel-file.cjs.entry.js +2 -2
  18. package/dist/cjs/limel-flatpickr-adapter_2.cjs.entry.js +3 -3
  19. package/dist/cjs/limel-flex-container.cjs.entry.js +2 -2
  20. package/dist/cjs/limel-form.cjs.entry.js +2 -2
  21. package/dist/cjs/limel-grid.cjs.entry.js +2 -2
  22. package/dist/cjs/limel-header.cjs.entry.js +2 -2
  23. package/dist/cjs/limel-icon-button.cjs.entry.js +2 -2
  24. package/dist/cjs/limel-icon.cjs.entry.js +2 -2
  25. package/dist/cjs/limel-linear-progress.cjs.entry.js +2 -2
  26. package/dist/cjs/limel-list_2.cjs.entry.js +484 -0
  27. package/dist/cjs/limel-menu-list.cjs.entry.js +863 -0
  28. package/dist/cjs/limel-menu.cjs.entry.js +6 -45
  29. package/dist/cjs/limel-picker.cjs.entry.js +2 -2
  30. package/dist/cjs/limel-popover-surface.cjs.entry.js +2 -2
  31. package/dist/cjs/limel-popover.cjs.entry.js +2 -2
  32. package/dist/cjs/limel-portal.cjs.entry.js +1935 -0
  33. package/dist/cjs/limel-progress-flow-item.cjs.entry.js +3 -3
  34. package/dist/cjs/limel-progress-flow.cjs.entry.js +2 -2
  35. package/dist/cjs/limel-select.cjs.entry.js +2 -2
  36. package/dist/cjs/limel-slider.cjs.entry.js +2 -2
  37. package/dist/cjs/limel-snackbar.cjs.entry.js +2 -2
  38. package/dist/cjs/limel-spinner.cjs.entry.js +2 -2
  39. package/dist/cjs/limel-switch.cjs.entry.js +2 -2
  40. package/dist/cjs/limel-tab-bar.cjs.entry.js +2 -2
  41. package/dist/cjs/limel-tab-panel.cjs.entry.js +2 -2
  42. package/dist/cjs/limel-table.cjs.entry.js +3 -3
  43. package/dist/cjs/limel-tooltip-content.cjs.entry.js +7 -4
  44. package/dist/cjs/limel-tooltip.cjs.entry.js +3 -3
  45. package/dist/cjs/loader.cjs.js +3 -3
  46. package/dist/collection/collection-manifest.json +3 -2
  47. package/dist/collection/components/button-group/button-group.js +15 -5
  48. package/dist/collection/components/chip-set/chip-set.js +2 -2
  49. package/dist/collection/components/config/config.js +3 -0
  50. package/dist/collection/components/header/header.js +0 -1
  51. package/dist/collection/components/list/list-renderer.js +151 -166
  52. package/dist/collection/components/list/list.css +0 -10
  53. package/dist/collection/components/list/list.js +77 -125
  54. package/dist/collection/components/menu/menu.js +12 -94
  55. package/dist/collection/components/menu-list/menu-list-renderer-config.js +1 -0
  56. package/dist/collection/components/menu-list/menu-list-renderer.js +150 -0
  57. package/dist/collection/components/menu-list/menu-list.css +3367 -0
  58. package/dist/collection/components/menu-list/menu-list.js +274 -0
  59. package/dist/collection/components/menu-list/menu-list.types.js +1 -0
  60. package/dist/collection/components/menu-surface/menu-surface.js +84 -87
  61. package/dist/collection/components/picker/picker.js +2 -2
  62. package/dist/collection/components/popover/popover.js +0 -1
  63. package/dist/collection/components/progress-flow/progress-flow-item/progress-flow-item.css +1 -1
  64. package/dist/collection/components/table/table.css +9 -2
  65. package/dist/collection/components/tooltip/tooltip-content.css +25 -13
  66. package/dist/collection/components/tooltip/tooltip-content.js +4 -3
  67. package/dist/collection/components/tooltip/tooltip.css +0 -6
  68. package/dist/collection/components/tooltip/tooltip.js +31 -5
  69. package/dist/esm/{checkbox.template-434214d5.js → checkbox.template-dbdd27c8.js} +1 -1
  70. package/dist/esm/component-2eb4e07b.js +2357 -0
  71. package/dist/esm/{index-dc421a6e.js → index-2316f345.js} +73 -64
  72. package/dist/esm/lime-elements.js +3 -3
  73. package/dist/esm/limel-badge.entry.js +2 -2
  74. package/dist/esm/limel-banner.entry.js +2 -2
  75. package/dist/esm/limel-button-group.entry.js +16 -6
  76. package/dist/esm/limel-button.entry.js +2 -2
  77. package/dist/esm/limel-checkbox.entry.js +3 -3
  78. package/dist/esm/limel-chip-set.entry.js +2 -2
  79. package/dist/esm/limel-circular-progress.entry.js +2 -2
  80. package/dist/esm/limel-code-editor.entry.js +2 -2
  81. package/dist/esm/limel-collapsible-section.entry.js +2 -2
  82. package/dist/esm/limel-config.entry.js +5 -2
  83. package/dist/esm/limel-date-picker.entry.js +2 -2
  84. package/dist/esm/limel-dialog.entry.js +2 -2
  85. package/dist/esm/limel-file.entry.js +2 -2
  86. package/dist/esm/limel-flatpickr-adapter_2.entry.js +3 -3
  87. package/dist/esm/limel-flex-container.entry.js +2 -2
  88. package/dist/esm/limel-form.entry.js +2 -2
  89. package/dist/esm/limel-grid.entry.js +2 -2
  90. package/dist/esm/limel-header.entry.js +2 -2
  91. package/dist/esm/limel-icon-button.entry.js +2 -2
  92. package/dist/esm/limel-icon.entry.js +2 -2
  93. package/dist/esm/limel-linear-progress.entry.js +2 -2
  94. package/dist/esm/limel-list_2.entry.js +479 -0
  95. package/dist/esm/limel-menu-list.entry.js +859 -0
  96. package/dist/esm/limel-menu.entry.js +6 -45
  97. package/dist/esm/limel-picker.entry.js +2 -2
  98. package/dist/esm/limel-popover-surface.entry.js +2 -2
  99. package/dist/esm/limel-popover.entry.js +2 -2
  100. package/dist/esm/limel-portal.entry.js +1931 -0
  101. package/dist/esm/limel-progress-flow-item.entry.js +3 -3
  102. package/dist/esm/limel-progress-flow.entry.js +2 -2
  103. package/dist/esm/limel-select.entry.js +2 -2
  104. package/dist/esm/limel-slider.entry.js +2 -2
  105. package/dist/esm/limel-snackbar.entry.js +2 -2
  106. package/dist/esm/limel-spinner.entry.js +2 -2
  107. package/dist/esm/limel-switch.entry.js +2 -2
  108. package/dist/esm/limel-tab-bar.entry.js +2 -2
  109. package/dist/esm/limel-tab-panel.entry.js +2 -2
  110. package/dist/esm/limel-table.entry.js +3 -3
  111. package/dist/esm/limel-tooltip-content.entry.js +7 -4
  112. package/dist/esm/limel-tooltip.entry.js +3 -3
  113. package/dist/esm/loader.js +3 -3
  114. package/dist/lime-elements/lime-elements.esm.js +1 -1
  115. package/dist/lime-elements/{p-af7c5b11.entry.js → p-03c28bee.entry.js} +2 -2
  116. package/dist/lime-elements/p-041ae00c.entry.js +1 -0
  117. package/dist/lime-elements/p-143705b1.entry.js +1 -0
  118. package/dist/lime-elements/{p-467c87f6.entry.js → p-1d7c7d5e.entry.js} +1 -1
  119. package/dist/lime-elements/p-1fb5340d.entry.js +1 -0
  120. package/dist/lime-elements/p-227d2c5a.entry.js +1 -0
  121. package/dist/lime-elements/p-31299106.js +126 -0
  122. package/dist/lime-elements/p-31fecf5d.entry.js +1 -0
  123. package/dist/lime-elements/p-34c7872e.entry.js +1 -0
  124. package/dist/lime-elements/p-3525d50c.entry.js +37 -0
  125. package/dist/lime-elements/p-4932c029.entry.js +1 -0
  126. package/dist/lime-elements/p-4b5af81b.entry.js +1 -0
  127. package/dist/lime-elements/p-510bb5a4.entry.js +1 -0
  128. package/dist/lime-elements/{p-67c48f98.entry.js → p-587bd6ca.entry.js} +1 -1
  129. package/dist/lime-elements/p-64549ba6.entry.js +37 -0
  130. package/dist/lime-elements/p-692f31f1.entry.js +16 -0
  131. package/dist/lime-elements/p-7476efe0.entry.js +1 -0
  132. package/dist/lime-elements/p-845e645a.entry.js +1 -0
  133. package/dist/lime-elements/{p-c636bfcf.entry.js → p-85094bfc.entry.js} +2 -2
  134. package/dist/lime-elements/p-89b5a983.js +1 -0
  135. package/dist/lime-elements/p-8d1ab246.entry.js +1 -0
  136. package/dist/lime-elements/p-8d8bd2ab.entry.js +73 -0
  137. package/dist/lime-elements/p-90f3e17c.entry.js +37 -0
  138. package/dist/lime-elements/{p-fabb836f.js → p-92146da6.js} +1 -1
  139. package/dist/lime-elements/p-9d362dd5.entry.js +1 -0
  140. package/dist/lime-elements/{p-90b2c0a2.entry.js → p-a1153d2a.entry.js} +1 -1
  141. package/dist/lime-elements/{p-5577f962.entry.js → p-a3dadae7.entry.js} +2 -2
  142. package/dist/lime-elements/p-b386bfeb.entry.js +1 -0
  143. package/dist/lime-elements/p-b5d6abc3.entry.js +126 -0
  144. package/dist/lime-elements/p-bbc1bb01.entry.js +1 -0
  145. package/dist/lime-elements/p-be56ffab.entry.js +1 -0
  146. package/dist/lime-elements/p-c35874db.entry.js +1 -0
  147. package/dist/lime-elements/p-c8c8a946.entry.js +59 -0
  148. package/dist/lime-elements/p-d070f0e7.entry.js +1 -0
  149. package/dist/lime-elements/p-d2c74396.entry.js +1 -0
  150. package/dist/lime-elements/p-df55ee67.entry.js +82 -0
  151. package/dist/lime-elements/p-e5738ec6.entry.js +1 -0
  152. package/dist/lime-elements/p-e881e98d.entry.js +1 -0
  153. package/dist/lime-elements/{p-2476f7bb.entry.js → p-f079f1fd.entry.js} +2 -2
  154. package/dist/lime-elements/p-f2df64ec.entry.js +1 -0
  155. package/dist/lime-elements/p-f4495f59.entry.js +1 -0
  156. package/dist/lime-elements/p-fc30b8e3.entry.js +1 -0
  157. package/dist/lime-elements/{p-61ecc7f1.entry.js → p-ff0217b3.entry.js} +2 -2
  158. package/dist/loader/index.d.ts +0 -1
  159. package/dist/types/components/header/header.d.ts +0 -1
  160. package/dist/types/components/list/list-item.types.d.ts +2 -1
  161. package/dist/types/components/list/list-renderer-config.d.ts +0 -1
  162. package/dist/types/components/list/list-renderer.d.ts +5 -7
  163. package/dist/types/components/list/list.d.ts +0 -7
  164. package/dist/types/components/list/list.types.d.ts +1 -1
  165. package/dist/types/components/menu/menu.d.ts +2 -20
  166. package/dist/types/components/menu/menu.types.d.ts +30 -3
  167. package/dist/types/components/menu-list/menu-list-renderer-config.d.ts +7 -0
  168. package/dist/types/components/menu-list/menu-list-renderer.d.ts +48 -0
  169. package/dist/types/components/menu-list/menu-list.d.ts +59 -0
  170. package/dist/types/components/menu-list/menu-list.types.d.ts +6 -0
  171. package/dist/types/components/menu-surface/menu-surface.d.ts +0 -1
  172. package/dist/types/components/popover/popover.d.ts +0 -1
  173. package/dist/types/components/tooltip/tooltip-content.d.ts +1 -1
  174. package/dist/types/components/tooltip/tooltip.d.ts +31 -5
  175. package/dist/types/components.d.ts +66 -25
  176. package/dist/types/interface.d.ts +1 -0
  177. package/package.json +3 -2
  178. package/dist/cjs/limel-list_3.cjs.entry.js +0 -5418
  179. package/dist/esm/limel-list_3.entry.js +0 -5412
  180. package/dist/lime-elements/p-034f336b.entry.js +0 -126
  181. package/dist/lime-elements/p-136230d6.entry.js +0 -1
  182. package/dist/lime-elements/p-16c336e8.entry.js +0 -59
  183. package/dist/lime-elements/p-191f05bc.entry.js +0 -1
  184. package/dist/lime-elements/p-1a3a9bfd.entry.js +0 -1
  185. package/dist/lime-elements/p-231f62ba.entry.js +0 -1
  186. package/dist/lime-elements/p-24c128ec.entry.js +0 -37
  187. package/dist/lime-elements/p-30c4b32a.entry.js +0 -1
  188. package/dist/lime-elements/p-3a21fa33.entry.js +0 -37
  189. package/dist/lime-elements/p-3df01502.entry.js +0 -1
  190. package/dist/lime-elements/p-63e4f918.entry.js +0 -1
  191. package/dist/lime-elements/p-6d9f679d.entry.js +0 -1
  192. package/dist/lime-elements/p-6e3b6e69.entry.js +0 -1
  193. package/dist/lime-elements/p-79541c2b.entry.js +0 -73
  194. package/dist/lime-elements/p-7be3a593.entry.js +0 -1
  195. package/dist/lime-elements/p-7c6f6b80.entry.js +0 -1
  196. package/dist/lime-elements/p-7dd9c41d.entry.js +0 -16
  197. package/dist/lime-elements/p-9b79dfe7.js +0 -1
  198. package/dist/lime-elements/p-a6a7dd00.entry.js +0 -1
  199. package/dist/lime-elements/p-aeeca058.entry.js +0 -1
  200. package/dist/lime-elements/p-b0b18dfc.entry.js +0 -1
  201. package/dist/lime-elements/p-b88e7350.entry.js +0 -1
  202. package/dist/lime-elements/p-bde1749a.entry.js +0 -1
  203. package/dist/lime-elements/p-c45238b6.entry.js +0 -1
  204. package/dist/lime-elements/p-c53695a3.entry.js +0 -37
  205. package/dist/lime-elements/p-dc5b3f45.entry.js +0 -1
  206. package/dist/lime-elements/p-e078c459.entry.js +0 -177
  207. package/dist/lime-elements/p-e9b4bdac.entry.js +0 -1
  208. package/dist/lime-elements/p-eb81fc35.entry.js +0 -1
  209. package/dist/lime-elements/p-f94cbe50.entry.js +0 -1
  210. package/dist/lime-elements/p-fa880bd6.entry.js +0 -1
@@ -1,12 +1,9 @@
1
1
  import { MDCList } from '@material/list';
2
- import { MDCMenu } from '@material/menu';
3
2
  import { MDCRipple } from '@material/ripple';
4
3
  import { strings as listStrings } from '@material/list/constants';
5
- import { strings as menuStrings } from '@material/menu/constants';
6
4
  import { Component, Element, Event, h, Host, Prop, Watch, } from '@stencil/core';
7
5
  import { ListRenderer } from './list-renderer';
8
6
  const { ACTION_EVENT } = listStrings;
9
- const { SELECTED_EVENT } = menuStrings;
10
7
  /**
11
8
  * @exampleComponent limel-example-list
12
9
  * @exampleComponent limel-example-list-secondary
@@ -37,8 +34,81 @@ export class List {
37
34
  // eslint-disable-next-line no-magic-numbers
38
35
  this.maxLinesSecondaryText = 3;
39
36
  this.listRenderer = new ListRenderer();
40
- this.handleAction = this.handleAction.bind(this);
41
- this.handleMenuSelect = this.handleMenuSelect.bind(this);
37
+ this.setup = () => {
38
+ this.setupList();
39
+ this.setupListeners();
40
+ };
41
+ this.setupList = () => {
42
+ const element = this.element.shadowRoot.querySelector('.mdc-deprecated-list');
43
+ if (!element) {
44
+ return;
45
+ }
46
+ this.mdcList = new MDCList(element);
47
+ this.mdcList.listElements.forEach((item) => new MDCRipple(item));
48
+ };
49
+ this.setupListeners = () => {
50
+ if (!this.mdcList) {
51
+ return;
52
+ }
53
+ this.mdcList.unlisten(ACTION_EVENT, this.handleAction);
54
+ this.selectable = ['selectable', 'radio', 'checkbox'].includes(this.type);
55
+ this.multiple = this.type === 'checkbox';
56
+ if (!this.selectable) {
57
+ return;
58
+ }
59
+ this.mdcList.listen(ACTION_EVENT, this.handleAction);
60
+ this.mdcList.singleSelection = !this.multiple;
61
+ };
62
+ this.teardown = () => {
63
+ var _a, _b;
64
+ (_a = this.mdcList) === null || _a === void 0 ? void 0 : _a.unlisten(ACTION_EVENT, this.handleAction);
65
+ (_b = this.mdcList) === null || _b === void 0 ? void 0 : _b.destroy();
66
+ };
67
+ this.handleAction = (event) => {
68
+ if (!this.multiple) {
69
+ this.handleSingleSelect(event.detail.index);
70
+ return;
71
+ }
72
+ this.handleMultiSelect(event.detail.index);
73
+ };
74
+ this.handleSingleSelect = (index) => {
75
+ const listItems = this.items.filter(this.isListItem);
76
+ if (listItems[index].disabled) {
77
+ return;
78
+ }
79
+ const selectedItem = listItems.find((item) => {
80
+ return !!item.selected;
81
+ });
82
+ if (selectedItem) {
83
+ this.change.emit(Object.assign(Object.assign({}, selectedItem), { selected: false }));
84
+ }
85
+ if (listItems[index] !== selectedItem) {
86
+ this.change.emit(Object.assign(Object.assign({}, listItems[index]), { selected: true }));
87
+ }
88
+ };
89
+ this.handleMultiSelect = (index) => {
90
+ const listItems = this.items.filter(this.isListItem);
91
+ if (listItems[index].disabled) {
92
+ return;
93
+ }
94
+ const selectedItems = listItems
95
+ .filter((item, listIndex) => {
96
+ if (listIndex === index) {
97
+ // This is the item that was selected or deselected,
98
+ // so we negate its previous selection status.
99
+ return !item.selected;
100
+ }
101
+ // This is an item that didn't change, so we keep its selection status.
102
+ return item.selected;
103
+ })
104
+ .map((item) => {
105
+ return Object.assign(Object.assign({}, item), { selected: true });
106
+ });
107
+ this.change.emit(selectedItems);
108
+ };
109
+ this.isListItem = (item) => {
110
+ return !('separator' in item);
111
+ };
42
112
  }
43
113
  connectedCallback() {
44
114
  this.setup();
@@ -61,9 +131,6 @@ export class List {
61
131
  maxLinesSecondaryText = 1;
62
132
  }
63
133
  const html = this.listRenderer.render(this.items, this.config);
64
- if (this.type === 'menu') {
65
- return h("div", { class: "mdc-menu mdc-menu-surface" }, html);
66
- }
67
134
  return (h(Host, { style: {
68
135
  '--maxLinesSecondaryText': `${maxLinesSecondaryText}`,
69
136
  } }, html));
@@ -84,121 +151,6 @@ export class List {
84
151
  .filter((item) => item.selected)
85
152
  .map((item) => listItems.indexOf(item));
86
153
  }
87
- setup() {
88
- if (this.type === 'menu') {
89
- this.setupMenu();
90
- }
91
- else {
92
- this.setupList();
93
- }
94
- this.setupListeners();
95
- }
96
- setupList() {
97
- const element = this.element.shadowRoot.querySelector('.mdc-deprecated-list');
98
- if (!element) {
99
- return;
100
- }
101
- this.mdcList = new MDCList(element);
102
- this.mdcList.listElements.forEach((item) => new MDCRipple(item));
103
- }
104
- setupMenu() {
105
- const element = this.element.shadowRoot.querySelector('.mdc-menu');
106
- if (!element) {
107
- return;
108
- }
109
- this.mdcMenu = new MDCMenu(element);
110
- this.mdcMenu.hasTypeahead = true;
111
- this.mdcMenu.wrapFocus = true;
112
- this.mdcMenu.items.forEach((item) => new MDCRipple(item));
113
- }
114
- setupListeners() {
115
- if (this.type === 'menu') {
116
- this.setupMenuListeners();
117
- }
118
- else {
119
- this.setupListListeners();
120
- }
121
- }
122
- setupListListeners() {
123
- if (!this.mdcList) {
124
- return;
125
- }
126
- this.mdcList.unlisten(ACTION_EVENT, this.handleAction);
127
- this.selectable = ['selectable', 'radio', 'checkbox', 'menu'].includes(this.type);
128
- this.multiple = this.type === 'checkbox';
129
- if (!this.selectable) {
130
- return;
131
- }
132
- this.mdcList.listen(ACTION_EVENT, this.handleAction);
133
- this.mdcList.singleSelection = !this.multiple;
134
- }
135
- setupMenuListeners() {
136
- if (!this.mdcMenu) {
137
- return;
138
- }
139
- this.mdcMenu.unlisten(SELECTED_EVENT, this.handleMenuSelect);
140
- this.selectable = true;
141
- this.mdcMenu.listen(SELECTED_EVENT, this.handleMenuSelect);
142
- }
143
- teardown() {
144
- var _a, _b, _c, _d;
145
- (_a = this.mdcList) === null || _a === void 0 ? void 0 : _a.unlisten(ACTION_EVENT, this.handleAction);
146
- (_b = this.mdcList) === null || _b === void 0 ? void 0 : _b.destroy();
147
- (_c = this.mdcMenu) === null || _c === void 0 ? void 0 : _c.unlisten(SELECTED_EVENT, this.handleMenuSelect);
148
- (_d = this.mdcMenu) === null || _d === void 0 ? void 0 : _d.destroy();
149
- }
150
- handleAction(event) {
151
- if (!this.multiple) {
152
- this.handleSingleSelect(event.detail.index);
153
- return;
154
- }
155
- this.handleMultiSelect(event.detail.index);
156
- }
157
- handleMenuSelect(event) {
158
- this.handleSingleSelect(event.detail.index);
159
- }
160
- handleSingleSelect(index) {
161
- const listItems = this.items.filter(this.isListItem);
162
- if (listItems[index].disabled) {
163
- return;
164
- }
165
- const selectedItem = listItems.find((item) => {
166
- return !!item.selected;
167
- });
168
- if (selectedItem) {
169
- this.change.emit(Object.assign(Object.assign({}, selectedItem), { selected: false }));
170
- }
171
- if (listItems[index] !== selectedItem) {
172
- if (this.type === 'menu') {
173
- this.change.emit(Object.assign(Object.assign({}, listItems[index]), { selected: false }));
174
- return;
175
- }
176
- this.change.emit(Object.assign(Object.assign({}, listItems[index]), { selected: true }));
177
- }
178
- }
179
- handleMultiSelect(index) {
180
- const listItems = this.items.filter(this.isListItem);
181
- if (listItems[index].disabled) {
182
- return;
183
- }
184
- const selectedItems = listItems
185
- .filter((item, listIndex) => {
186
- if (listIndex === index) {
187
- // This is the item that was selected or deselected,
188
- // so we negate its previous selection status.
189
- return !item.selected;
190
- }
191
- // This is an item that didn't change, so we keep its selection status.
192
- return item.selected;
193
- })
194
- .map((item) => {
195
- return Object.assign(Object.assign({}, item), { selected: true });
196
- });
197
- this.change.emit(selectedItems);
198
- }
199
- isListItem(item) {
200
- return !('separator' in item);
201
- }
202
154
  static get is() { return "limel-list"; }
203
155
  static get encapsulation() { return "shadow"; }
204
156
  static get originalStyleUrls() { return {
@@ -280,7 +232,7 @@ export class List {
280
232
  "mutable": false,
281
233
  "complexType": {
282
234
  "original": "ListType",
283
- "resolved": "\"checkbox\" | \"menu\" | \"radio\" | \"selectable\"",
235
+ "resolved": "\"checkbox\" | \"radio\" | \"selectable\"",
284
236
  "references": {
285
237
  "ListType": {
286
238
  "location": "import",
@@ -292,7 +244,7 @@ export class List {
292
244
  "optional": false,
293
245
  "docs": {
294
246
  "tags": [],
295
- "text": "The type of the list, omit to get a regular list. Available types are:\n`selectable`: regular list with single selection.\n`radio`: radio button list with single selection.\n`checkbox`: checkbox list with multiple selection.\n`menu`: menu list with single selection."
247
+ "text": "The type of the list, omit to get a regular list. Available types are:\n`selectable`: regular list with single selection.\n`radio`: radio button list with single selection.\n`checkbox`: checkbox list with multiple selection."
296
248
  },
297
249
  "attribute": "type",
298
250
  "reflect": false
@@ -14,13 +14,6 @@ import { zipObject } from 'lodash-es';
14
14
  */
15
15
  export class Menu {
16
16
  constructor() {
17
- /**
18
- * Is displayed on the default trigger button.
19
- *
20
- * @deprecated Use with default trigger has been deprecated.
21
- * Please supply your own trigger element.
22
- */
23
- this.label = '';
24
17
  /**
25
18
  * A list of items and separators to show in the menu.
26
19
  */
@@ -45,14 +38,6 @@ export class Menu {
45
38
  * Renders list items in a grid layout, rather than a vertical list
46
39
  */
47
40
  this.gridLayout = false;
48
- /**
49
- * Defines whether the menu should have a fixed position on the screen.
50
- *
51
- * @deprecated Fixed position was used to get around a bug in the placement
52
- * of the menu. This bug has since been fixed, which makes this attribute
53
- * obsolete.
54
- */
55
- this.fixed = false;
56
41
  this.setTriggerAttributes = (element) => {
57
42
  const attributes = {
58
43
  'aria-haspopup': true,
@@ -97,8 +82,8 @@ export class Menu {
97
82
  var _a;
98
83
  const activeElement = this.list.shadowRoot.activeElement;
99
84
  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);
85
+ const MenuItems = this.items.filter(this.isMenuItem);
86
+ const selectedIndex = Math.max(MenuItems.findIndex((item) => item.selected), 0);
102
87
  const menuElements = Array.from(this.list.shadowRoot.querySelectorAll('[role="menuitem"]'));
103
88
  (_a = menuElements[selectedIndex]) === null || _a === void 0 ? void 0 : _a.focus();
104
89
  };
@@ -123,15 +108,11 @@ export class Menu {
123
108
  render() {
124
109
  const cssProperties = this.getCssProperties();
125
110
  const dropdownZIndex = getComputedStyle(this.host).getPropertyValue('--dropdown-z-index');
126
- const portalClasses = {
127
- 'limel-portal--fixed': this.fixed,
128
- };
129
- const portalPosition = this.getPortalPosition();
130
111
  return (h("div", { class: "mdc-menu-surface--anchor", onClick: this.onTriggerClick },
131
- h("slot", { name: "trigger" }, this.renderTrigger()),
132
- 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 } },
112
+ h("slot", { name: "trigger" }),
113
+ h("limel-portal", { visible: this.open, containerId: this.portalId, openDirection: this.openDirection, position: "absolute", containerStyle: { 'z-index': dropdownZIndex } },
133
114
  h("limel-menu-surface", { open: this.open, onDismiss: this.onClose, style: cssProperties },
134
- h("limel-list", { class: {
115
+ h("limel-menu-list", { class: {
135
116
  'has-grid-layout has-interactive-items': this.gridLayout,
136
117
  }, items: this.items, type: "menu", badgeIcons: this.badgeIcons, onChange: this.onListChange, ref: this.setListElement })))));
137
118
  }
@@ -139,27 +120,6 @@ export class Menu {
139
120
  const slotElement = this.host.shadowRoot.querySelector('slot');
140
121
  slotElement.assignedElements().forEach(this.setTriggerAttributes);
141
122
  }
142
- renderTrigger() {
143
- return (h("button", { class: `
144
- menu__trigger
145
- ${this.disabled ? '' : 'menu__trigger-enabled'}
146
- `, disabled: this.disabled },
147
- h("span", null, this.label)));
148
- }
149
- getPortalPosition() {
150
- if (!this.fixed) {
151
- return {};
152
- }
153
- const rect = this.host.getBoundingClientRect();
154
- const portalPosition = {
155
- top: `${rect.y + rect.height}px`,
156
- left: `${rect.x}px`,
157
- };
158
- if (this.openDirection === 'left') {
159
- portalPosition.left = `${rect.x + rect.width}px`;
160
- }
161
- return portalPosition;
162
- }
163
123
  getCssProperties() {
164
124
  const propertyNames = [
165
125
  '--menu-surface-width',
@@ -173,7 +133,7 @@ export class Menu {
173
133
  });
174
134
  return zipObject(propertyNames, values);
175
135
  }
176
- isListItem(item) {
136
+ isMenuItem(item) {
177
137
  return !('separator' in item);
178
138
  }
179
139
  static get is() { return "limel-menu"; }
@@ -185,40 +145,19 @@ export class Menu {
185
145
  "$": ["menu.css"]
186
146
  }; }
187
147
  static get properties() { return {
188
- "label": {
189
- "type": "string",
190
- "mutable": false,
191
- "complexType": {
192
- "original": "string",
193
- "resolved": "string",
194
- "references": {}
195
- },
196
- "required": false,
197
- "optional": false,
198
- "docs": {
199
- "tags": [{
200
- "text": "Use with default trigger has been deprecated.\nPlease supply your own trigger element.",
201
- "name": "deprecated"
202
- }],
203
- "text": "Is displayed on the default trigger button."
204
- },
205
- "attribute": "label",
206
- "reflect": true,
207
- "defaultValue": "''"
208
- },
209
148
  "items": {
210
149
  "type": "unknown",
211
150
  "mutable": false,
212
151
  "complexType": {
213
152
  "original": "Array<MenuItem | ListSeparator>",
214
- "resolved": "(ListSeparator | MenuItem)[]",
153
+ "resolved": "(ListSeparator | MenuItem<any>)[]",
215
154
  "references": {
216
155
  "Array": {
217
156
  "location": "global"
218
157
  },
219
158
  "MenuItem": {
220
159
  "location": "import",
221
- "path": "./menu.types"
160
+ "path": "@limetech/lime-elements"
222
161
  },
223
162
  "ListSeparator": {
224
163
  "location": "import",
@@ -261,7 +200,7 @@ export class Menu {
261
200
  "references": {
262
201
  "OpenDirection": {
263
202
  "location": "import",
264
- "path": "./menu.types"
203
+ "path": "@limetech/lime-elements"
265
204
  }
266
205
  }
267
206
  },
@@ -328,27 +267,6 @@ export class Menu {
328
267
  "attribute": "grid-layout",
329
268
  "reflect": true,
330
269
  "defaultValue": "false"
331
- },
332
- "fixed": {
333
- "type": "boolean",
334
- "mutable": false,
335
- "complexType": {
336
- "original": "boolean",
337
- "resolved": "boolean",
338
- "references": {}
339
- },
340
- "required": false,
341
- "optional": false,
342
- "docs": {
343
- "tags": [{
344
- "text": "Fixed position was used to get around a bug in the placement\nof the menu. This bug has since been fixed, which makes this attribute\nobsolete.",
345
- "name": "deprecated"
346
- }],
347
- "text": "Defines whether the menu should have a fixed position on the screen."
348
- },
349
- "attribute": "fixed",
350
- "reflect": false,
351
- "defaultValue": "false"
352
270
  }
353
271
  }; }
354
272
  static get events() { return [{
@@ -377,10 +295,10 @@ export class Menu {
377
295
  "text": "Is emitted when a menu item is selected."
378
296
  },
379
297
  "complexType": {
380
- "original": "ListItem | ListItem[]",
381
- "resolved": "ListItem<any> | ListItem<any>[]",
298
+ "original": "MenuItem | MenuItem[]",
299
+ "resolved": "MenuItem<any> | MenuItem<any>[]",
382
300
  "references": {
383
- "ListItem": {
301
+ "MenuItem": {
384
302
  "location": "import",
385
303
  "path": "@limetech/lime-elements"
386
304
  }
@@ -0,0 +1,150 @@
1
+ import { h } from '@stencil/core';
2
+ export class MenuListRenderer {
3
+ constructor() {
4
+ this.defaultConfig = {
5
+ isOpen: true,
6
+ badgeIcons: false,
7
+ };
8
+ /**
9
+ * Determine which MenuItem should have the `tab-index` attribute set,
10
+ * and return the index at which that MenuItem is located in `items`.
11
+ * Returns `undefined` if no item should have the attribute set.
12
+ * See https://github.com/material-components/material-components-web/tree/e66a43a75fef4f9179e24856649518e15e279a04/packages/mdc-list#accessibility
13
+ *
14
+ * @param {Array<MenuItem | ListSeparator>} items the items of the list, including any `ListSeparator`:s
15
+ * @returns {number} the index as per the description
16
+ */
17
+ this.getIndexForWhichToApplyTabIndex = (items) => {
18
+ let result;
19
+ for (let i = 0, max = items.length; i < max; i += 1) {
20
+ if ('separator' in items[i]) {
21
+ // Ignore ListSeparator
22
+ }
23
+ else {
24
+ const item = items[i];
25
+ if (item.selected) {
26
+ result = i;
27
+ break;
28
+ }
29
+ if (result === undefined && !item.disabled) {
30
+ result = i;
31
+ // Do NOT break, as any later item with
32
+ // `selected=true` should get the tab-index instead!
33
+ }
34
+ }
35
+ }
36
+ return result;
37
+ };
38
+ /**
39
+ * Render a single list item
40
+ *
41
+ * @param {MenuItem | ListSeparator} item the item to render
42
+ * @param {number} index the index the item had in the `items` array
43
+ * @returns {HTMLElement} the list item
44
+ */
45
+ this.renderMenuItem = (item, index) => {
46
+ if ('separator' in item) {
47
+ return h("li", { class: "mdc-deprecated-list-divider", role: "separator" });
48
+ }
49
+ const classNames = {
50
+ 'mdc-deprecated-list-item': true,
51
+ 'mdc-deprecated-list-item--disabled': item.disabled,
52
+ 'mdc-deprecated-list-item--selected': item.selected,
53
+ };
54
+ const attributes = {};
55
+ if (index === this.applyTabIndexToItemAtIndex) {
56
+ attributes.tabindex = '0';
57
+ }
58
+ return (h("li", Object.assign({ class: classNames, role: "menuitem", "aria-disabled": item.disabled ? 'true' : 'false', "aria-selected": item.selected ? 'true' : 'false', "data-index": index }, attributes),
59
+ item.icon ? this.renderIcon(this.config, item) : null,
60
+ this.renderText(item),
61
+ this.twoLines && this.avatarList ? this.renderDivider() : null));
62
+ };
63
+ /**
64
+ * Render the text of the list item
65
+ *
66
+ * @param {MenuItem} item the list item
67
+ * @returns {HTMLElement | string} the text for the list item
68
+ */
69
+ this.renderText = (item) => {
70
+ if (this.isSimpleItem(item)) {
71
+ return (h("span", { class: "mdc-deprecated-list-item__text" }, item.text));
72
+ }
73
+ return (h("div", { class: "mdc-deprecated-list-item__text" },
74
+ h("div", { class: "mdc-deprecated-list-item__primary-command-text" },
75
+ h("div", { class: "mdc-deprecated-list-item__primary-text" }, item.text),
76
+ this.renderCommandText(item)),
77
+ h("div", { class: "mdc-deprecated-list-item__secondary-text" }, item.secondaryText)));
78
+ };
79
+ this.renderCommandText = (item) => {
80
+ if (!('commandText' in item)) {
81
+ return;
82
+ }
83
+ return (h("div", { class: "mdc-deprecated-list-item__command-text" }, item.commandText));
84
+ };
85
+ this.isSimpleItem = (item) => {
86
+ if ('commandText' in item) {
87
+ return false;
88
+ }
89
+ if ('secondaryText' in item) {
90
+ return false;
91
+ }
92
+ return true;
93
+ };
94
+ /**
95
+ * Render an icon for a list item
96
+ *
97
+ * @param {MenuListRendererConfig} config the config object, passed on from the `renderMenuItem` function
98
+ * @param {MenuItem} item the list item
99
+ * @returns {HTMLElement} the icon element
100
+ */
101
+ this.renderIcon = (config, item) => {
102
+ const style = {};
103
+ if (item.iconColor) {
104
+ if (config.badgeIcons) {
105
+ style['--icon-background-color'] = item.iconColor;
106
+ }
107
+ else {
108
+ style.color = item.iconColor;
109
+ }
110
+ }
111
+ return (h("limel-icon", { badge: config.badgeIcons, class: "mdc-deprecated-list-item__graphic", name: item.icon, style: style, size: config.iconSize }));
112
+ };
113
+ this.renderDivider = () => {
114
+ const classes = {
115
+ 'mdc-deprecated-list-divider': true,
116
+ 'mdc-deprecated-list-divider--inset': true,
117
+ };
118
+ if (this.config.iconSize) {
119
+ classes[this.config.iconSize] = true;
120
+ }
121
+ return h("hr", { class: classes });
122
+ };
123
+ }
124
+ render(items, config = {}) {
125
+ items = items || [];
126
+ this.config = Object.assign(Object.assign({}, this.defaultConfig), config);
127
+ this.twoLines = items.some((item) => {
128
+ return 'secondaryText' in item && !!item.secondaryText;
129
+ });
130
+ this.commandKey = items.some((item) => {
131
+ return 'commandText' in item && !!item.commandText;
132
+ });
133
+ this.hasIcons = items.some((item) => {
134
+ return 'icon' in item && !!item.icon;
135
+ });
136
+ this.avatarList = this.config.badgeIcons && this.hasIcons;
137
+ this.applyTabIndexToItemAtIndex =
138
+ this.getIndexForWhichToApplyTabIndex(items);
139
+ const classNames = {
140
+ 'mdc-deprecated-list': true,
141
+ 'mdc-deprecated-list--two-line': this.twoLines,
142
+ selectable: true,
143
+ 'mdc-deprecated-list--avatar-list': this.avatarList,
144
+ 'list--compact': this.twoLines &&
145
+ this.commandKey &&
146
+ ['small', 'x-small'].includes(this.config.iconSize),
147
+ };
148
+ return (h("ul", { class: classNames, "aria-hidden": true, role: "menu", "aria-orientation": "vertical" }, items.map(this.renderMenuItem)));
149
+ }
150
+ }