@lion/ui 0.22.0 → 0.23.0

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 (218) hide show
  1. package/README.md +35 -0
  2. package/components/combobox/src/LionCombobox.js +10 -2
  3. package/components/combobox/test/lion-combobox.test.js +31 -0
  4. package/components/form-core/src/choice-group/ChoiceGroupMixin.js +7 -0
  5. package/components/form-core/types/choice-group/ChoiceGroupMixinTypes.ts +5 -0
  6. package/components/input-amount/src/LionInputAmount.js +17 -6
  7. package/components/input-amount/src/formatters.js +5 -3
  8. package/components/input-amount/test/formatters.test.js +88 -74
  9. package/components/input-amount/test/lion-input-amount.test.js +51 -36
  10. package/components/input-tel/test/validators.test.js +9 -0
  11. package/components/listbox/src/ListboxMixin.js +19 -3
  12. package/components/listbox/types/ListboxMixinTypes.ts +7 -1
  13. package/components/menu/README.md +360 -0
  14. package/components/menu/src/InteractiveListMixin.js +867 -0
  15. package/components/menu/src/LionMenu.js +436 -0
  16. package/components/menu/src/MoreButtonMenuMixin.js +295 -0
  17. package/components/menu/src/MultiLevelListMixin.js +312 -0
  18. package/components/menu/src/utils/isInView.js +26 -0
  19. package/components/menu/src/utils/listItemInteractions.js +124 -0
  20. package/components/menu/test/InteractiveListMixin.test.js +3 -0
  21. package/components/menu/test/MoreButtonMenuMixin.test.js +4 -0
  22. package/components/menu/test/MultiLevelListMixin.test.js +3 -0
  23. package/components/menu/test/lion-menu-interactions.test.js +3 -0
  24. package/components/menu/test/lion-menu.test.js +14 -0
  25. package/components/menu/test-helpers/mimicKeyPress.js +9 -0
  26. package/components/menu/test-suites/InteractiveListMixin.suite.js +537 -0
  27. package/components/menu/test-suites/LionMenu.suite.js +114 -0
  28. package/components/menu/test-suites/LionMenuInteractions.suite.js +583 -0
  29. package/components/menu/test-suites/MoreButtonMenuMixin.suite.js +372 -0
  30. package/components/menu/test-suites/MultiLevelListMixin.suite.js +309 -0
  31. package/components/menu/types/InteractiveListMixinTypes.ts +126 -0
  32. package/components/menu/types/MoreButtonMenuMixinTypes.ts +51 -0
  33. package/components/menu/types/MultiLevelListMixinTypes.ts +28 -0
  34. package/components/menu/types/OverlayWithListInvokerMixinTypes.ts +61 -0
  35. package/components/overlays/NEXT.md +49 -0
  36. package/components/overlays/src/OverlayController.js +304 -125
  37. package/components/overlays/src/OverlayMixin.js +81 -17
  38. package/components/overlays/src/utils/adopt-styles.js +1 -1
  39. package/components/overlays/src/utils/is-equal-config.js +15 -6
  40. package/components/overlays/test/OverlayController.test.js +223 -25
  41. package/components/overlays/test-suites/OverlayMixin.suite.js +8 -8
  42. package/components/overlays/types/ArrowMixinTypes.ts +1 -3
  43. package/components/overlays/types/OverlayConfig.ts +20 -5
  44. package/components/overlays/types/OverlayMixinTypes.ts +2 -0
  45. package/components/select-rich/src/LionSelectRich.js +12 -0
  46. package/components/select-rich/test/lion-select-rich-interaction.test.js +53 -0
  47. package/components/select-rich/test/lion-select-rich-upgrade.test.js +30 -0
  48. package/custom-elements.json +3120 -149
  49. package/dist-types/components/combobox/src/LionCombobox.d.ts +1 -1
  50. package/dist-types/components/combobox/src/LionCombobox.d.ts.map +1 -1
  51. package/dist-types/components/dialog/src/LionDialog.d.ts +6 -2
  52. package/dist-types/components/dialog/src/LionDialog.d.ts.map +1 -1
  53. package/dist-types/components/form-core/src/choice-group/ChoiceGroupMixin.d.ts.map +1 -1
  54. package/dist-types/components/form-core/types/choice-group/ChoiceGroupMixinTypes.d.ts +5 -0
  55. package/dist-types/components/form-core/types/choice-group/ChoiceGroupMixinTypes.d.ts.map +1 -1
  56. package/dist-types/components/input-amount/src/LionInputAmount.d.ts +3 -1
  57. package/dist-types/components/input-amount/src/LionInputAmount.d.ts.map +1 -1
  58. package/dist-types/components/input-amount/src/formatters.d.ts +6 -4
  59. package/dist-types/components/input-amount/src/formatters.d.ts.map +1 -1
  60. package/dist-types/components/input-datepicker/src/LionInputDatepicker.d.ts +1 -1
  61. package/dist-types/components/listbox/src/ListboxMixin.d.ts.map +1 -1
  62. package/dist-types/components/listbox/types/ListboxMixinTypes.d.ts +7 -1
  63. package/dist-types/components/listbox/types/ListboxMixinTypes.d.ts.map +1 -1
  64. package/dist-types/components/menu/src/InteractiveListMixin.d.ts +35 -0
  65. package/dist-types/components/menu/src/InteractiveListMixin.d.ts.map +1 -0
  66. package/dist-types/components/menu/src/LionMenu.d.ts +129 -0
  67. package/dist-types/components/menu/src/LionMenu.d.ts.map +1 -0
  68. package/dist-types/components/menu/src/MoreButtonMenuMixin.d.ts +8 -0
  69. package/dist-types/components/menu/src/MoreButtonMenuMixin.d.ts.map +1 -0
  70. package/dist-types/components/menu/src/MultiLevelListMixin.d.ts +7 -0
  71. package/dist-types/components/menu/src/MultiLevelListMixin.d.ts.map +1 -0
  72. package/dist-types/components/menu/src/utils/isInView.d.ts +9 -0
  73. package/dist-types/components/menu/src/utils/isInView.d.ts.map +1 -0
  74. package/dist-types/components/menu/src/utils/listItemInteractions.d.ts +48 -0
  75. package/dist-types/components/menu/src/utils/listItemInteractions.d.ts.map +1 -0
  76. package/dist-types/components/menu/test/InteractiveListMixin.test.d.ts +2 -0
  77. package/dist-types/components/menu/test/InteractiveListMixin.test.d.ts.map +1 -0
  78. package/dist-types/components/menu/test/MoreButtonMenuMixin.test.d.ts +2 -0
  79. package/dist-types/components/menu/test/MoreButtonMenuMixin.test.d.ts.map +1 -0
  80. package/dist-types/components/menu/test/MultiLevelListMixin.test.d.ts +2 -0
  81. package/dist-types/components/menu/test/MultiLevelListMixin.test.d.ts.map +1 -0
  82. package/dist-types/components/menu/test/lion-menu-interactions.test.d.ts +2 -0
  83. package/dist-types/components/menu/test/lion-menu-interactions.test.d.ts.map +1 -0
  84. package/dist-types/components/menu/test/lion-menu.test.d.ts +2 -0
  85. package/dist-types/components/menu/test/lion-menu.test.d.ts.map +1 -0
  86. package/dist-types/components/menu/test-helpers/mimicKeyPress.d.ts +7 -0
  87. package/dist-types/components/menu/test-helpers/mimicKeyPress.d.ts.map +1 -0
  88. package/dist-types/components/menu/test-suites/InteractiveListMixin.suite.d.ts +11 -0
  89. package/dist-types/components/menu/test-suites/InteractiveListMixin.suite.d.ts.map +1 -0
  90. package/dist-types/components/menu/test-suites/LionMenu.suite.d.ts +9 -0
  91. package/dist-types/components/menu/test-suites/LionMenu.suite.d.ts.map +1 -0
  92. package/dist-types/components/menu/test-suites/LionMenuInteractions.suite.d.ts +5 -0
  93. package/dist-types/components/menu/test-suites/LionMenuInteractions.suite.d.ts.map +1 -0
  94. package/dist-types/components/menu/test-suites/MoreButtonMenuMixin.suite.d.ts +11 -0
  95. package/dist-types/components/menu/test-suites/MoreButtonMenuMixin.suite.d.ts.map +1 -0
  96. package/dist-types/components/menu/test-suites/MultiLevelListMixin.suite.d.ts +11 -0
  97. package/dist-types/components/menu/test-suites/MultiLevelListMixin.suite.d.ts.map +1 -0
  98. package/dist-types/components/menu/types/InteractiveListMixinTypes.d.ts +72 -0
  99. package/dist-types/components/menu/types/InteractiveListMixinTypes.d.ts.map +1 -0
  100. package/dist-types/components/menu/types/MoreButtonMenuMixinTypes.d.ts +30 -0
  101. package/dist-types/components/menu/types/MoreButtonMenuMixinTypes.d.ts.map +1 -0
  102. package/dist-types/components/menu/types/MultiLevelListMixinTypes.d.ts +16 -0
  103. package/dist-types/components/menu/types/MultiLevelListMixinTypes.d.ts.map +1 -0
  104. package/dist-types/components/menu/types/OverlayWithListInvokerMixinTypes.d.ts +35 -0
  105. package/dist-types/components/menu/types/OverlayWithListInvokerMixinTypes.d.ts.map +1 -0
  106. package/dist-types/components/overlays/src/OverlayController.d.ts +22 -5
  107. package/dist-types/components/overlays/src/OverlayController.d.ts.map +1 -1
  108. package/dist-types/components/overlays/src/OverlayMixin.d.ts.map +1 -1
  109. package/dist-types/components/overlays/src/utils/is-equal-config.d.ts.map +1 -1
  110. package/dist-types/components/overlays/types/ArrowMixinTypes.d.ts.map +1 -1
  111. package/dist-types/components/overlays/types/OverlayConfig.d.ts +12 -2
  112. package/dist-types/components/overlays/types/OverlayConfig.d.ts.map +1 -1
  113. package/dist-types/components/overlays/types/OverlayMixinTypes.d.ts +1 -0
  114. package/dist-types/components/overlays/types/OverlayMixinTypes.d.ts.map +1 -1
  115. package/dist-types/components/select-rich/src/LionSelectRich.d.ts +13 -2
  116. package/dist-types/components/select-rich/src/LionSelectRich.d.ts.map +1 -1
  117. package/dist-types/components/select-rich/test/lion-select-rich-interaction.test.d.ts.map +1 -1
  118. package/dist-types/components/select-rich/test/lion-select-rich-upgrade.test.d.ts +2 -0
  119. package/dist-types/components/select-rich/test/lion-select-rich-upgrade.test.d.ts.map +1 -0
  120. package/dist-types/components/tooltip/src/LionTooltip.d.ts +1 -1
  121. package/dist-types/exports/define/lion-item.d.ts +2 -0
  122. package/dist-types/exports/define/lion-item.d.ts.map +1 -0
  123. package/dist-types/exports/define/lion-menu.d.ts +2 -0
  124. package/dist-types/exports/define/lion-menu.d.ts.map +1 -0
  125. package/dist-types/exports/define/lion-menuitem.d.ts +2 -0
  126. package/dist-types/exports/define/lion-menuitem.d.ts.map +1 -0
  127. package/dist-types/exports/menu-test-suites.d.ts +4 -0
  128. package/dist-types/exports/menu-test-suites.d.ts.map +1 -0
  129. package/dist-types/exports/menu.d.ts +3 -0
  130. package/dist-types/exports/menu.d.ts.map +1 -0
  131. package/dist-types/exports/overlays.d.ts +6 -0
  132. package/dist-types/exports/overlays.d.ts.map +1 -1
  133. package/dist-types/tsconfig.tsbuildinfo +1 -1
  134. package/docs/components/checkbox-group/overview.md +2 -2
  135. package/docs/components/collapsible/overview.md +1 -1
  136. package/docs/components/combobox/api-table.md +53 -39
  137. package/docs/components/combobox/overview.md +1 -1
  138. package/docs/components/combobox/use-cases.md +1 -1
  139. package/docs/components/dialog/api-table.md +32 -6
  140. package/docs/components/dialog/overview.md +1 -1
  141. package/docs/components/fieldset/overview.md +5 -5
  142. package/docs/components/form/overview.md +3 -3
  143. package/docs/components/form/use-cases.md +2 -2
  144. package/docs/components/icon/use-cases.md +1 -1
  145. package/docs/components/input/overview.md +1 -1
  146. package/docs/components/input-amount/api-table.md +9 -7
  147. package/docs/components/input-amount/overview.md +3 -3
  148. package/docs/components/input-amount/use-cases.md +15 -4
  149. package/docs/components/input-amount-dropdown/api-table.md +2 -0
  150. package/docs/components/input-date/overview.md +3 -3
  151. package/docs/components/input-datepicker/api-table.md +63 -45
  152. package/docs/components/input-datepicker/overview.md +5 -5
  153. package/docs/components/input-email/overview.md +2 -2
  154. package/docs/components/input-file/overview.md +1 -1
  155. package/docs/components/input-iban/overview.md +2 -2
  156. package/docs/components/input-range/overview.md +2 -2
  157. package/docs/components/input-stepper/overview.md +1 -1
  158. package/docs/components/input-tel/overview.md +1 -1
  159. package/docs/components/input-tel/use-cases.md +6 -6
  160. package/docs/components/input-tel-dropdown/overview.md +1 -1
  161. package/docs/components/listbox/use-cases.md +1 -1
  162. package/docs/components/menu/api-table.md +44 -0
  163. package/docs/components/menu/applyMenuDemoStyles.js +173 -0
  164. package/docs/components/menu/extensions.md +262 -0
  165. package/docs/components/menu/index.md +13 -0
  166. package/docs/components/menu/migration.md +129 -0
  167. package/docs/components/menu/overview.md +448 -0
  168. package/docs/components/menu/src/DemoNavigationBar.js +441 -0
  169. package/docs/components/menu/src/DemoSpinButton.js +215 -0
  170. package/docs/components/menu/src/DemoToolbar.js +101 -0
  171. package/docs/components/menu/src/DemoTree.js +55 -0
  172. package/docs/components/menu/src/navigation-bar-types.js +41 -0
  173. package/docs/components/menu/use-cases.md +74 -0
  174. package/docs/components/radio-group/overview.md +3 -3
  175. package/docs/components/select/use-cases.md +1 -1
  176. package/docs/components/select-rich/api-table.md +51 -33
  177. package/docs/components/select-rich/use-cases.md +2 -2
  178. package/docs/components/tabs/examples.md +1 -1
  179. package/docs/components/tooltip/api-table.md +33 -7
  180. package/docs/fundamentals/index.md +4 -4
  181. package/docs/fundamentals/node-tools/providence-analytics/overview.md +1 -1
  182. package/docs/fundamentals/node-tools/publish-docs/overview.md +3 -3
  183. package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/overview.md +2 -2
  184. package/docs/fundamentals/rationales/accessibility.md +1 -1
  185. package/docs/fundamentals/systems/core/SlotMixin.md +1 -1
  186. package/docs/fundamentals/systems/core/overview.md +1 -1
  187. package/docs/fundamentals/systems/form/formatting-and-parsing.md +4 -4
  188. package/docs/fundamentals/systems/form/model-value.md +1 -1
  189. package/docs/fundamentals/systems/form/overview.md +28 -28
  190. package/docs/fundamentals/systems/form/validate.md +2 -2
  191. package/docs/fundamentals/systems/localize/overview.md +4 -4
  192. package/docs/fundamentals/systems/overlays/api-table.md +46 -43
  193. package/docs/fundamentals/systems/overlays/configuration.md +2 -2
  194. package/docs/fundamentals/systems/overlays/overview.md +5 -5
  195. package/docs/fundamentals/systems/overlays/use-cases.md +2 -2
  196. package/docs/fundamentals/tools/helpers/overview.md +1 -1
  197. package/docs/fundamentals/tools/singleton-manager/overview.md +4 -4
  198. package/docs/guides/how-to/create-a-custom-field.md +5 -5
  199. package/docs/guides/how-to/create-a-form.md +4 -4
  200. package/docs/guides/how-to/extend-a-native-input.md +2 -2
  201. package/docs/guides/how-to/index.md +1 -1
  202. package/docs/guides/index.md +8 -8
  203. package/docs/guides/principles/index.md +5 -5
  204. package/docs/guides/principles/styling.md +1 -1
  205. package/exports/define/lion-item.js +3 -0
  206. package/exports/define/lion-menu.js +3 -0
  207. package/exports/define/lion-menuitem.js +3 -0
  208. package/exports/menu-test-suites.js +4 -0
  209. package/exports/menu.js +3 -0
  210. package/exports/overlays.js +6 -0
  211. package/menu-test-suites.js +4 -0
  212. package/menu.js +3 -0
  213. package/overlays.js +6 -0
  214. package/package.json +11 -4
  215. package/vendor/README.md +61 -0
  216. package/vendor/awesome-phonenumber-7.9.0-tlouisse.libphonenumber-9.0.41.tgz +0 -0
  217. package/vscode.html-custom-data.json +76 -8
  218. package/web-types.json +202 -17
@@ -0,0 +1,126 @@
1
+ import { Constructor } from '@open-wc/dedupe-mixin';
2
+ import { LitElement } from 'lit';
3
+ import { SlotHost } from '../../core/types/SlotMixinTypes.js';
4
+ import { DisabledHost } from '../../core/types/DisabledMixinTypes.js';
5
+
6
+ export type InteractiveListItemRole =
7
+ | 'menuitem'
8
+ | 'menuitemcheckbox'
9
+ | 'menuitemradio'
10
+ | 'option'
11
+ | 'treeitem'
12
+ | 'radio'
13
+ | 'checkbox';
14
+
15
+ export declare class InteractiveListHost extends LitElement {
16
+ /**
17
+ * When true, will synchronize activedescendant and selected element on
18
+ * arrow key navigation.
19
+ * This behavior can usually be seen on <select> on the Windows platform.
20
+ * Note that this behavior cannot be used when `multiple` is true.
21
+ * "Selection follows focus" is the ARIA APG term for this behaviour, see
22
+ * https://www.w3.org/WAI/ARIA/apg/practices/keyboard-interface/ (the same property exists on
23
+ * `ListboxMixin`).
24
+ */
25
+ public selectionFollowsFocus: Boolean;
26
+ /**
27
+ * Whether arrow key navigation wraps around at the first/last item: the `wrap` modifier of the
28
+ * [focusgroup](https://open-ui.org/components/focusgroup.explainer/) api.
29
+ */
30
+ public wrap: Boolean;
31
+ /**
32
+ * The axis arrow keys navigate along, in the vocabulary of the
33
+ * [focusgroup](https://open-ui.org/components/focusgroup.explainer/) api: `'block'`
34
+ * (default: up/down) or `'inline'` (left/right). Informs screen reader and affects keyboard
35
+ * navigation.
36
+ */
37
+ public axis: 'inline' | 'block';
38
+
39
+ /** Whether more than one item can be checked (the platform name in `<select multiple>`) */
40
+ public multiple: Boolean;
41
+
42
+ /** Whether items that do not fit are moved into a 'more' menu (see MoreButtonMenuMixin) */
43
+ public itemWrap: Boolean;
44
+
45
+ /**
46
+ * When true, no option is selected on initial render (`checkedIndex` stays -1). Named the same as
47
+ * on `ListboxMixin`; the platform calls the initial selectedness "default selected".
48
+ */
49
+ /** The item that currently has the active state */
50
+ public get activeItem(): HTMLElement;
51
+
52
+ public set activeItem(item: HTMLElement);
53
+
54
+ /** Element members the mixin body uses on itself (restated: `this` is resolved through this host) */
55
+ children: HTMLCollection;
56
+ shadowRoot: ShadowRoot;
57
+ childNodes: NodeListOf<ChildNode>;
58
+ localName: string;
59
+ disabled: boolean;
60
+
61
+ public hasNoDefaultSelected: boolean;
62
+
63
+ public singleOption: boolean;
64
+
65
+ public get checkedIndex(): number | number[];
66
+
67
+ public set checkedIndex(index: number | number[]);
68
+
69
+ public get activeIndex(): number;
70
+
71
+ public set activeIndex(index: number);
72
+
73
+ public get listItems(): HTMLElement[];
74
+
75
+ public setCheckedIndex(index: number): void;
76
+
77
+ protected get _scrollTargetNode(): HTMLElement;
78
+
79
+ protected get _invokerNode(): HTMLElement | null | undefined;
80
+
81
+ protected set _invokerNode(invokerNode: HTMLElement | null | undefined);
82
+
83
+ protected get _listNode(): HTMLElement;
84
+
85
+ /** One of 'activedescendant', 'roving-tabindex', 'tabbable-disclosure' or 'none' */
86
+ protected _activeMode: string;
87
+
88
+ /** The role put on the list node: 'menu' | 'menubar' | 'listbox' | 'tree' | 'toolbar' */
89
+ protected _listRole: string;
90
+
91
+ protected _initListItems(newItems: Element[]): void;
92
+
93
+ protected _syncCurrentPageWithLocationHref(location: Location): void;
94
+
95
+ // private __setupListboxNode(): void;
96
+
97
+ protected _getPreviousEnabledOption(currentIndex: number, offset?: number): number;
98
+
99
+ protected _getNextEnabledOption(currentIndex: number, offset?: number): number;
100
+
101
+ protected _onListKeyDown(ev: KeyboardEvent): void;
102
+
103
+ protected _onListKeyUp(ev: KeyboardEvent): void;
104
+
105
+ // protected _setupListboxNode(): void;
106
+
107
+ // protected _teardownListboxNode(): void;
108
+
109
+ protected _onListClick(ev: MouseEvent): void;
110
+
111
+ // protected _setupListboxInteractions(): void;
112
+
113
+ // protected _onChildActiveChanged(ev: Event): void;
114
+ }
115
+
116
+ export declare function InteractiveListMixinImplementation<T extends Constructor<LitElement>>(
117
+ superclass: T,
118
+ ): T &
119
+ Constructor<InteractiveListHost> &
120
+ Pick<typeof InteractiveListHost, keyof typeof InteractiveListHost> &
121
+ Constructor<DisabledHost> &
122
+ Pick<typeof DisabledHost, keyof typeof DisabledHost> &
123
+ Constructor<SlotHost> &
124
+ Pick<typeof SlotHost, keyof typeof SlotHost>;
125
+
126
+ export type InteractiveListMixin = typeof InteractiveListMixinImplementation;
@@ -0,0 +1,51 @@
1
+ import { Constructor } from '@open-wc/dedupe-mixin';
2
+ import { LitElement } from 'lit';
3
+ import { InteractiveListHost } from './InteractiveListMixinTypes.js';
4
+
5
+ /**
6
+ * The 'more' button pattern: items that do not fit are moved into a sub menu behind a more
7
+ * button. See `MoreButtonMenuMixin`.
8
+ */
9
+ export declare class MoreButtonMenuHost extends InteractiveListHost {
10
+ protected _initMoreButtonMenu(): void;
11
+
12
+ protected _getDeepActiveElement(): Element | null;
13
+
14
+ protected _createMoreButtonWrapper(): void;
15
+
16
+ getMoreButtonSlotProjection(): Element | null;
17
+
18
+ getMoreButtonMenu(): Element | null;
19
+
20
+ getMoreButtonMenuWrapper(): Element | null;
21
+
22
+ displayMoreButton(): void;
23
+
24
+ hideMoreButton(): void;
25
+
26
+ doItemsFit(): boolean;
27
+
28
+ getListItems(): Element[];
29
+
30
+ moveItemToMoreButtonMenuFromMainMenu(params: {
31
+ moreButtonMenuElement: HTMLElement;
32
+ listItem: HTMLElement;
33
+ }): void;
34
+
35
+ moveAllItemsToMainMenuFromMoreButtonMenu(): void;
36
+
37
+ renderAllItemsInMainMenu(): void;
38
+
39
+ hideItemsOneByOneInMainMenuUntilTheyFit(): void;
40
+
41
+ moveHiddenItemsFromMainMenuToMoreButtonMenu(hiddenItemsCount: number): void;
42
+ }
43
+
44
+ export declare function MoreButtonMenuImplementation<T extends Constructor<LitElement>>(
45
+ superclass: T,
46
+ ): T &
47
+ Constructor<MoreButtonMenuHost> &
48
+ Pick<typeof MoreButtonMenuHost, keyof typeof MoreButtonMenuHost> &
49
+ Pick<typeof LitElement, keyof typeof LitElement>;
50
+
51
+ export type MoreButtonMenuMixin = typeof MoreButtonMenuImplementation;
@@ -0,0 +1,28 @@
1
+ import { Constructor } from '@open-wc/dedupe-mixin';
2
+ import { LitElement } from 'lit';
3
+ import { InteractiveListHost } from './InteractiveListMixinTypes.js';
4
+
5
+ /** Multiple nested, collapsible levels on top of an interactive list (see `MultiLevelListMixin`) */
6
+ export declare class MultiLevelListHost extends InteractiveListHost {
7
+ /** The nesting level of this list; 1 for the top level list */
8
+ level: number;
9
+
10
+ protected _subListMap: Map<Element, MultiLevelListHost>;
11
+
12
+ protected get _invokerNode(): HTMLElement | null | undefined;
13
+
14
+ protected set _invokerNode(invokerNode: HTMLElement | null | undefined);
15
+
16
+ protected get _contentNode(): HTMLElement;
17
+
18
+ toggle(ev: Event): void;
19
+ }
20
+
21
+ export declare function MultiLevelListImplementation<T extends Constructor<LitElement>>(
22
+ superclass: T,
23
+ ): T &
24
+ Constructor<MultiLevelListHost> &
25
+ Pick<typeof MultiLevelListHost, keyof typeof MultiLevelListHost> &
26
+ Pick<typeof LitElement, keyof typeof LitElement>;
27
+
28
+ export type MultiLevelListMixin = typeof MultiLevelListImplementation;
@@ -0,0 +1,61 @@
1
+ import { Constructor } from '@open-wc/dedupe-mixin';
2
+ import { LitElement } from 'lit';
3
+ import { OverlayConfig } from '../../overlays/types/OverlayConfig.js';
4
+ import { DefineOverlayConfig } from '../../overlays/types/OverlayMixinTypes.js';
5
+ import { OverlayController } from '../../overlays/src/OverlayController.js';
6
+ import { InteractiveListHost } from './InteractiveListMixinTypes.js';
7
+
8
+ /**
9
+ * The overlay side of a list host: the members `OverlayMixin` declares, on top of the list host
10
+ * (`OverlayWithListInvokerMixin`, used by `LionMenu`).
11
+ */
12
+ export declare class OverlayWithListInvokerHost extends InteractiveListHost {
13
+ opened: Boolean;
14
+
15
+ get config(): Partial<OverlayConfig>;
16
+
17
+ set config(value: Partial<OverlayConfig>);
18
+
19
+ open(): Promise<void>;
20
+
21
+ close(): Promise<void>;
22
+
23
+ toggle(): Promise<void>;
24
+
25
+ repositionOverlay(): void;
26
+
27
+ _onOverlayShow(): void;
28
+
29
+ protected _overlayCtrl: OverlayController;
30
+
31
+ protected get _overlayInvokerNode(): HTMLElement;
32
+
33
+ protected get _overlayBackdropNode(): HTMLElement;
34
+
35
+ protected get _overlayContentNode(): HTMLElement;
36
+
37
+ protected get _overlayContentWrapperNode(): HTMLElement;
38
+
39
+ protected _defineOverlay(config: DefineOverlayConfig): OverlayController;
40
+
41
+ protected _defineOverlayConfig(): OverlayConfig;
42
+
43
+ protected _setupOpenCloseListeners(): void;
44
+
45
+ protected _teardownOpenCloseListeners(): void;
46
+
47
+ protected _setupOverlayCtrl(): void;
48
+
49
+ protected _teardownOverlayCtrl(): void;
50
+
51
+ protected _setOpenedWithoutPropertyEffects(newOpened: Boolean): Promise<undefined>;
52
+ }
53
+
54
+ export declare function OverlayWithListInvokerImplementation<T extends Constructor<LitElement>>(
55
+ superclass: T,
56
+ ): T &
57
+ Constructor<OverlayWithListInvokerHost> &
58
+ Pick<typeof OverlayWithListInvokerHost, keyof typeof OverlayWithListInvokerHost> &
59
+ Pick<typeof LitElement, keyof typeof LitElement>;
60
+
61
+ export type OverlayWithListInvokerMixin = typeof OverlayWithListInvokerImplementation;
@@ -0,0 +1,49 @@
1
+ - Redesign goals OverlayController
2
+ - Simplicity
3
+ - One primitive to (controller to) rule them all
4
+ - Aligned api with all disclosure mechanisms (openables: <https://open-ui.org/components/openable.explainer/>)
5
+ - Aligned with platform overlay primitives (popover, dialog and tooltip)
6
+ - Controller will be elegantly aligned with host
7
+ - Controller props will be mapped to a host via a mixin, w/o requiring lots of boilerplate
8
+ - No race conditions due to unaligned heart beats: both hook in to the same "tick": the reactive update cycle of lit (which can theoretically be swapped by other cycles, see <https://lit.dev/docs/frameworks/react/#usecontroller>)
9
+ - In general, all property effects / events / reactivity should be aligned as much as possible with the update cycle (for predictability and perf. We only need
10
+ - All components will just be configuration (no need to redefine a lot of logic)
11
+ - OverlayController (or OpenableController, or DisclosureController, or VisitibilityToggleController) will be the biggest common denominator. Having all logic in one place, makes it a lot easier to erase about then having it scattered across many mixin and/or controller levels
12
+ - Even though the amount of logic is large (and might feel a bit monolithic), this is just needed when we want to have a stable, battle tested abstraction around all edge cases that building accessible disclosures should handle
13
+ - However, this does not come at an extra performance cost (see performance, you will only load what you need)
14
+ - The current OverlayController is a long file that can benefit from some modularity and cleanup
15
+ - Every overlay feature can be provided in a separate file with knowledge about the overlay lifecycle
16
+ - We can provide/reuse some utils like Resettable from VisibilityToggleCtrl ()
17
+ - Flexibility
18
+ - Re-use your markup for different screen sizes and/or devices (that may have different appearances, but the same functionality/semantics)
19
+ - Think of:
20
+ - a datepicker that opens as dropdown on desktop and as centered modal dialog on mobile
21
+ - a menubutton that opens as dropdown on desktop and as bottomsheet
22
+ - A menu that opens as dropdown on desktop and a collapsible (or even a plain list) on mobile
23
+ - As explained above, controllers are the most re-usable primitives, as a web component/mixin does not always provide the flexibility we need
24
+ - Controllers can be easliy mapped to directives (giving the same flexibility as "platform attributes" like popover). Forward compatible with <https://github.com/WICG/webcomponents/issues/1029>
25
+ - Controllers can be easily mapped to web components or mixins
26
+ - Contrary to mixins, it’s easy to conditionally load a controller
27
+ - Contrary to mixins, it’s easy to “undo” a controller (which is helpful in edge cases)
28
+ - Performance
29
+ - Will leverage the platform where possible:
30
+ - Use popover
31
+ - Forward compatibility
32
+ - Aligns as much as possible with (future) platform apis
33
+ - This leverages existing dev knowledge (api familiarity)
34
+ - This allows to build drop in replacements
35
+ - This allows to rely on the platform (reducing maintenance costs, increasing performance)
36
+ - Completeness
37
+ - Supports all use cases to build every UI thinkable:
38
+ - Will have optional dependency to menu controllers and interactive list controllers
39
+ - Supports visually hidden scenarios, hides
40
+ - Backward compatibility
41
+ - Since the amount of consumers of our overlay system (directly or indirectly) is large, we should provide a compatibility mechanism where possible. At the same time, we want to create an api as clean/aligned/forward compatible as possible. We could consider an optional compat-layer (a global import at the top of an app extending OverlayController prototype). Think of:
42
+ - Mapping popper api to popover concepts
43
+ -
44
+
45
+ # Why start with OverlayController?
46
+
47
+ - there is a lot of value in cleaning it up as there are many platform improvements
48
+ - it's used by many
49
+ - It is already a controller (we created it before Lit controllers existed) and therefore impact is minimal