@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,101 @@
1
+ /* eslint-disable import/no-extraneous-dependencies */
2
+ /* eslint-disable import/no-relative-packages */
3
+ import { LionMenu } from '@lion/ui/menu.js';
4
+ import {
5
+ setChecked,
6
+ toggleChecked,
7
+ } from '../../../../packages/ui/components/menu/src/utils/listItemInteractions.js';
8
+
9
+ /**
10
+ * @typedef {import('../../../../packages/ui/components/menu/types/InteractiveListMixinTypes.js').InteractiveListItemRole} InteractiveListItemRole
11
+ */
12
+
13
+ // @ts-ignore - class extension properties mismatch at the OverlayWithListInvokerMixin boundary
14
+ export class DemoToolbar extends LionMenu {
15
+ constructor() {
16
+ super();
17
+
18
+ this._listRole = 'toolbar';
19
+ this.bar = true;
20
+ }
21
+
22
+ /**
23
+ * Allows groups ([role=radiogroup|checkboxgroup]) within one level.
24
+ * In case we deal with [role=checkbox], we treat it as multiple choice group
25
+ * @override InteractiveListMixin
26
+ * @param {number} index
27
+ */
28
+ setCheckedIndex(index) {
29
+ const item = this.listItems[index];
30
+ if (item) {
31
+ // @ts-ignore - InteractiveListItemRole type
32
+ const role = /** @type {InteractiveListItemRole} */ (item.getAttribute('role'));
33
+ let listItemsWithinGroup = this.listItems;
34
+ let { multiple } = this;
35
+ if (role === 'radio' || role === 'checkbox') {
36
+ /**
37
+ * If index = 1 (radio 'Red'), closest group will be div[role=radiogroup]
38
+ * @example
39
+ * <demo-toolbar>
40
+ * <div role="radiogroup" aria-label="Text Color">
41
+ * <button role="radio" aria-checked="false">Blue</button>
42
+ * <button role="radio" aria-checked="true">Red</button>
43
+ * <button role="radio" aria-checked="false">Green</button>
44
+ * </div>
45
+ * <div role="separator"></div>
46
+ * <div role="checkboxgroup" aria-label="Text Color">
47
+ * <button role="checkbox" aria-checked="false">Blue</button>
48
+ * <button role="checkbox" aria-checked="true">Red</button>
49
+ * <button role="checkbox" aria-checked="false">Green</button>
50
+ * </div>
51
+ * </demo-toolbar>
52
+ */
53
+ let closestGroup;
54
+ if (role === 'radio') {
55
+ closestGroup = item.closest('[role="radiogroup"]');
56
+ } else if (role === 'checkbox') {
57
+ closestGroup = item.closest('[role="checkboxgroup"]');
58
+ }
59
+
60
+ const group = closestGroup && this.contains(closestGroup) ? closestGroup : this;
61
+ listItemsWithinGroup = this.listItems.filter(listItem => group.contains(listItem));
62
+ multiple = role === 'checkbox';
63
+ }
64
+
65
+ if (!multiple) {
66
+ // Uncheck all
67
+ listItemsWithinGroup.forEach(listItem => {
68
+ setChecked(listItem, true);
69
+ });
70
+ setChecked(this.listItems[index]);
71
+ } else {
72
+ toggleChecked(this.listItems[index]);
73
+ }
74
+ }
75
+ }
76
+
77
+ /**
78
+ * @param {*} newItems
79
+ */
80
+ _initListItems(newItems) {
81
+ super._initListItems(newItems);
82
+
83
+ // @ts-ignore - forEach parameter
84
+ newItems.forEach(item => {
85
+ if (
86
+ item.getAttribute('role') === 'button' ||
87
+ (item.tagName === 'BUTTON' && !item.hasAttribute('role'))
88
+ ) {
89
+ const initialAriaPressed = item.getAttribute('aria-pressed');
90
+ item.setAttribute('aria-pressed', initialAriaPressed || 'false');
91
+
92
+ item.addEventListener('click', () => {
93
+ const ariaPressed = item.getAttribute('aria-pressed') === 'true';
94
+ item.setAttribute('aria-pressed', `${!ariaPressed}`);
95
+ });
96
+ }
97
+ });
98
+ }
99
+ }
100
+
101
+ customElements.define('demo-toolbar', DemoToolbar);
@@ -0,0 +1,55 @@
1
+ /* eslint-disable import/no-extraneous-dependencies */
2
+ /* eslint-disable import/no-relative-packages */
3
+ import { LitElement } from 'lit';
4
+ import { MultiLevelListMixin } from '../../../../packages/ui/components/menu/src/MultiLevelListMixin.js';
5
+
6
+ // @ts-ignore - class extension with mixin
7
+ export class DemoTree extends MultiLevelListMixin(LitElement) {
8
+ constructor() {
9
+ super();
10
+
11
+ /** @configure InteractiveListMixin */
12
+ this._listRole = 'tree';
13
+ /** @configure InteractiveListMixin */
14
+ this._activateOnTypedChars = true;
15
+ /** @configure DisclosureMixin */
16
+ this.invokerInteraction = 'click';
17
+ }
18
+
19
+ /**
20
+ * @param {*} changedProperties
21
+ */
22
+ updated(changedProperties) {
23
+ super.updated(changedProperties);
24
+
25
+ if (changedProperties.has('level')) {
26
+ if (this.level > 1) {
27
+ this._listNode.setAttribute('role', 'group');
28
+ }
29
+ this.__setAriaLevelForListItems();
30
+ }
31
+ }
32
+
33
+ /**
34
+ * @param {*} newItems
35
+ */
36
+ _initListItems(newItems) {
37
+ // @ts-ignore - parameter types
38
+ super._initListItems(newItems);
39
+
40
+ this.__setAriaLevelForListItems();
41
+ // @ts-ignore - forEach parameters
42
+ newItems.forEach((item, index) => {
43
+ item.setAttribute('aria-posinset', `${index + 1}`);
44
+ item.setAttribute('aria-setsize', `${this.listItems.length}`);
45
+ });
46
+ }
47
+
48
+ __setAriaLevelForListItems() {
49
+ this.listItems.forEach(item => {
50
+ item.setAttribute?.('aria-level', `${this.level + 1}`);
51
+ });
52
+ }
53
+ }
54
+
55
+ customElements.define('demo-tree', DemoTree);
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @typedef {'mobile' | 'desktop'} NavBarResponsiveMode
3
+ * Responsive mode for the navigation bar
4
+ */
5
+
6
+ /**
7
+ * @typedef {Object} MenuItem
8
+ * Navigation menu item
9
+ * @property {string} [id] - Optional unique identifier
10
+ * @property {string} title - Display title of the menu item
11
+ * @property {string} [link] - URL for the menu item (for leaf items)
12
+ * @property {MenuItem[]} [sub] - Submenu items (for parent items)
13
+ */
14
+
15
+ /**
16
+ * @typedef {Object} CtaLink
17
+ * Call-to-action link
18
+ * @property {string} [id] - Optional unique identifier
19
+ * @property {string} [href] - URL for the CTA
20
+ * @property {string} [text] - Display text for the CTA
21
+ * @property {string} [label] - Accessible label for the CTA
22
+ */
23
+
24
+ /**
25
+ * @typedef {Object} Logo
26
+ * Logo configuration for the navigation bar
27
+ * @property {string} type - Logo type (e.g., 'ing')
28
+ * @property {string} alt - Alternative text for the logo
29
+ * @property {string} href - URL the logo links to
30
+ * @property {string} [src] - Optional custom logo source URL
31
+ */
32
+
33
+ /**
34
+ * @typedef {Object} LevelConfig
35
+ * Configuration for a menu level
36
+ * @property {boolean} [isBar] - Whether this level is displayed as a bar
37
+ * @property {boolean} [hasFullWidthFlyout] - Whether this level has a full-width flyout
38
+ * @property {object} [openableConfig] - Configuration for the openable overlay
39
+ */
40
+
41
+ export {};
@@ -0,0 +1,74 @@
1
+ ---
2
+ title: 'Menu: Overview'
3
+ parts:
4
+ - Menu
5
+ - Use Cases
6
+ eleventyNavigation:
7
+ key: 'Menu: Use Cases'
8
+ order: 20
9
+ parent: Menu
10
+ title: Use Cases
11
+ ---
12
+
13
+ # Use Cases
14
+
15
+ ```js script
16
+ import { html } from 'lit';
17
+ import '@lion/ui/define/lion-item.js';
18
+ import '@lion/ui/define/lion-menu.js';
19
+ import { applyMenuDemoStyles } from './applyMenuDemoStyles.js';
20
+
21
+ applyMenuDemoStyles();
22
+ ```
23
+
24
+ ## Default
25
+
26
+ ```html preview-story
27
+ <nav>
28
+ <button data-invoker>Open menu</button>
29
+ <lion-menu>
30
+ <div role="menuitem">Go to Definition</div>
31
+ <div role="menuitem">Go to Type Definition</div>
32
+ <div>
33
+ <button role="menuitem" data-invoker>Peek</button>
34
+ <lion-menu>
35
+ <div role="menuitem">Peek Call Hierarchy</div>
36
+ <div role="separator"></div>
37
+ <div role="menuitem">Peek Definition</div>
38
+ </lion-menu>
39
+ </div>
40
+ <div role="separator"></div>
41
+ <div role="menuitem">Find all References</div>
42
+ </lion-menu>
43
+ </nav>
44
+ ```
45
+
46
+ ## Overflow
47
+
48
+ ## Attributes & Properties
49
+
50
+ ### Bar
51
+
52
+ By adding the `bar` attribute the axis will be set to `inline` and the role will be set to menubar.
53
+
54
+ ```html preview-story
55
+ <nav>
56
+ <lion-menu bar>
57
+ <div>
58
+ <a role="menuitem" data-invoker href="#home">home</a>
59
+ </div>
60
+ <div role="menuitem">Go to Definition</div>
61
+ <div role="menuitem">Go to Type Definition</div>
62
+ <div>
63
+ <button role="menuitem" data-invoker>Details</button>
64
+ <lion-menu>
65
+ <div role="menuitem">Peek Call Hierarchy</div>
66
+ <div role="separator"></div>
67
+ <div role="menuitem">Peek Definition</div>
68
+ </lion-menu>
69
+ </div>
70
+ <div role="separator"></div>
71
+ <div role="menuitem">Find all References</div>
72
+ </lion-menu>
73
+ </nav>
74
+ ```
@@ -32,12 +32,12 @@ export const main = () => html`
32
32
  `;
33
33
  ```
34
34
 
35
- - Make sure that to use a name attribute as it is necessary for our [form](https://github.com/ing-bank/lion/blob/1e44a873eb492168e7e3d2f5c120371d950b9e03/docs/components/form/overview.md)'s serialization result.
36
- - If you have many options for a user to pick from, consider using our [select](https://github.com/ing-bank/lion/blob/1e44a873eb492168e7e3d2f5c120371d950b9e03/docs/components/select/overview.md) instead.
35
+ - Make sure that to use a name attribute as it is necessary for our [form](https://github.com/ing-bank/lion/blob/4649554021224763994601dd8d202c511d35013e/docs/components/form/overview.md)'s serialization result.
36
+ - If you have many options for a user to pick from, consider using our [select](https://github.com/ing-bank/lion/blob/4649554021224763994601dd8d202c511d35013e/docs/components/select/overview.md) instead.
37
37
 
38
38
  ## Features
39
39
 
40
- Since it extends from our [fieldset](https://github.com/ing-bank/lion/blob/1e44a873eb492168e7e3d2f5c120371d950b9e03/docs/components/fieldset/overview.md), it has all the features a fieldset has.
40
+ Since it extends from our [fieldset](https://github.com/ing-bank/lion/blob/4649554021224763994601dd8d202c511d35013e/docs/components/fieldset/overview.md), it has all the features a fieldset has.
41
41
 
42
42
  - Get or set the checked value of the group:
43
43
  - modelValue (default) - `checkedValue()`
@@ -65,7 +65,7 @@ Or by setting the `disabled` attribute on the entire `lion-select` field.
65
65
 
66
66
  ## Validation
67
67
 
68
- A validator can be used to make it e.g. `required`. If you want to know how to do that, please take a look at our [validation examples](https://github.com/ing-bank/lion/blob/1e44a873eb492168e7e3d2f5c120371d950b9e03/docs/fundamentals/systems/form/validate.md).
68
+ A validator can be used to make it e.g. `required`. If you want to know how to do that, please take a look at our [validation examples](https://github.com/ing-bank/lion/blob/4649554021224763994601dd8d202c511d35013e/docs/fundamentals/systems/form/validate.md).
69
69
 
70
70
  ## Rendering and updating select options
71
71
 
@@ -54,45 +54,62 @@ eleventyNavigation:
54
54
 
55
55
  ### Fields
56
56
 
57
- | Name | Privacy | Type | Default | Description | Inherited From |
58
- | ------------------------ | --------- | -------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | -------------- |
59
- | `interactionMode` | public | `'windows/linux'\|'mac'\|'auto'` | `'auto'` | Aligns behavior for 'selectionFollowFocus' and 'navigateWithinInvoker' with&#xA;platform. When 'auto' (default), platform is automatically detected | |
60
- | `navigateWithinInvoker` | public | `Boolean` | `false` | When invoker has focus, up and down arrow keys changes active state of listbox,&#xA;without opening overlay. | |
61
- | `singleOption` | public | `boolean` | `false` | | |
62
- | `slots` | public | `SlotsMap` | | | |
63
- | `_arrowWidth` | protected | `number` | `28` | | |
64
- | `_feedbackConditionMeta` | protected | | | | LionListbox |
65
- | `_focusableNode` | protected | | | | LionListbox |
66
- | `_invokerNode` | protected | `LionSelectInvoker` | | | |
67
- | `_overlayContentNode` | protected | | | | |
68
- | `_overlayInvokerNode` | protected | | | | |
69
- | `_scrollTargetNode` | protected | | | | |
57
+ | Name | Privacy | Type | Default | Description | Inherited From |
58
+ | ---------------------------- | --------- | -------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------- |
59
+ | `config` | public | `Partial<OverlayConfig>` | `{}` | Configure the many options of the \`OverlayController\` | OverlayMixin |
60
+ | `interactionMode` | public | `'windows/linux'\|'mac'\|'auto'` | `'auto'` | Aligns behavior for 'selectionFollowFocus' and 'navigateWithinInvoker' with&#xA;platform. When 'auto' (default), platform is automatically detected | |
61
+ | `navigateWithinInvoker` | public | `Boolean` | `false` | When invoker has focus, up and down arrow keys changes active state of listbox,&#xA;without opening overlay. | |
62
+ | `opened` | public | `boolean` | `false` | If you add the opened attribute a dialog will be opened on page load. The invoker can be left out&#xA;in case the user does not need to be able to reopen the dialog. | OverlayMixin |
63
+ | `singleOption` | public | `boolean` | `false` | | |
64
+ | `slots` | public | `SlotsMap` | | | |
65
+ | `_arrowWidth` | protected | `number` | `28` | | |
66
+ | `_feedbackConditionMeta` | protected | | | | LionListbox |
67
+ | `_focusableNode` | protected | | | | LionListbox |
68
+ | `_invokerNode` | protected | `LionSelectInvoker` | | | |
69
+ | `_overlayBackdropNode` | protected | | | | OverlayMixin |
70
+ | `_overlayContentNode` | protected | | | | OverlayMixin |
71
+ | `_overlayContentWrapperNode` | protected | | | | OverlayMixin |
72
+ | `_overlayInvokerNode` | protected | | | The node that opens/closes this overlay.&#xA;&#xA;Resolved in a stable, declarative way (independent of the exact DOM order)&#xA;by looking, in order, for:&#xA;1\. a child with \`\[slot="invoker"]\`&#xA;2\. any element in the same root that opts in via \`\[data-invoker]\` and&#xA; references this host by id (\`for="\<id>"\`)&#xA;3\. a preceding sibling that opts in via \`\[data-invoker]\` | OverlayMixin |
73
+ | `_overlayReferenceNode` | protected | | | | OverlayMixin |
74
+ | `_scrollTargetNode` | protected | | | | |
70
75
 
71
76
  ### Methods
72
77
 
73
- | Name | Privacy | Description | Parameters | Return | Inherited From |
74
- | --------------------------------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | ------ | -------------- |
75
- | `addFormElement` | public | | `child: LionOption & FormControlHost, indexToInsertAt: Number` | | |
76
- | `removeFormElement` | public | | `child: FormRegisteringHost` | | |
77
- | `_alignInvokerWidth` | protected | Align invoker width with content width&#xA;Make sure display is not set to "none" while calculating the content width | | | |
78
- | `_defineOverlayConfig` | protected | | | | |
79
- | `_getCheckedElements` | protected | In the select disabled options are still going to a possible value for example&#xA;when prefilling or programmatically setting it. | | | |
80
- | `_inputGroupInputTemplate` | protected | | | | |
81
- | `_listboxOnClick` | protected | | | | |
82
- | `_listboxOnKeyDown` | protected | | `ev: KeyboardEvent` | | |
83
- | `_noDefaultSelectedInheritsWidth` | protected | With no selected element, we should override the inheritsReferenceWidth in most cases.&#xA;By default, we will set it to 'min', and then set it back to what it was initially when&#xA;something is selected.&#xA;As a subclasser you can override this behavior. | | | |
84
- | `_onFormElementsChanged` | protected | | | | |
85
- | `_onLabelClick` | protected | | | | |
86
- | `_setupListboxNode` | protected | | | | |
87
- | `_setupOverlayCtrl` | protected | | | | |
88
- | `_teardownListboxNode` | protected | | | | |
89
- | `_teardownOverlayCtrl` | protected | | | | |
78
+ | Name | Privacy | Description | Parameters | Return | Inherited From |
79
+ | ---------------------------------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | ------------------- | -------------- |
80
+ | `addFormElement` | public | | `child: LionOption & FormControlHost, indexToInsertAt: Number` | | |
81
+ | `close` | public | Hides the overlay | | | OverlayMixin |
82
+ | `open` | public | Shows the overlay | | | OverlayMixin |
83
+ | `removeFormElement` | public | | `child: FormRegisteringHost` | | |
84
+ | `repositionOverlay` | public | Sometimes it's needed to recompute Popper position of an overlay, for instance when we have&#xA;an opened combobox and the surrounding context changes (the space consumed by the textbox&#xA;increases vertically) | | | OverlayMixin |
85
+ | `toggle` | public | Toggles the overlay | | | OverlayMixin |
86
+ | `_alignInvokerWidth` | protected | Align invoker width with content width&#xA;Make sure display is not set to "none" while calculating the content width | | | |
87
+ | `_defineOverlay` | protected | | `{ contentNode, invokerNode, referenceNode, backdropNode, contentWrapperNode }, config: DefineOverlayConfig` | `OverlayController` | OverlayMixin |
88
+ | `_defineOverlayConfig` | protected | | | `OverlayConfig` | OverlayMixin |
89
+ | `_getCheckedElements` | protected | In the select disabled options are still going to a possible value for example&#xA;when prefilling or programmatically setting it. | | | |
90
+ | `_getInvokerNode` | protected | | | `Element\|null` | OverlayMixin |
91
+ | `_inputGroupInputTemplate` | protected | | | | |
92
+ | `_isPermanentlyDisconnected` | protected | When we're moving around in dom, disconnectedCallback gets called.&#xA;Before we decide to teardown, let's wait to see if we were not just moving nodes around. | | `Promise<boolean>` | OverlayMixin |
93
+ | `_listboxOnClick` | protected | | | | |
94
+ | `_listboxOnKeyDown` | protected | | `ev: KeyboardEvent` | | |
95
+ | `_noDefaultSelectedInheritsWidth` | protected | With no selected element, we should override the inheritsReferenceWidth in most cases.&#xA;By default, we will set it to 'min', and then set it back to what it was initially when&#xA;something is selected.&#xA;As a subclasser you can override this behavior. | | | |
96
+ | `_onFormElementsChanged` | protected | | | | |
97
+ | `_onLabelClick` | protected | | | | |
98
+ | `_scrollIntoView` | protected | | `el: HTMLElement, scrollTargetEl: HTMLElement` | | |
99
+ | `_setOpenedWithoutPropertyEffects` | protected | When the opened state is changed by an Application Developer,cthe OverlayController is&#xA;requested to show/hide. It might happen that this request is not honoured&#xA;(intercepted in before-hide for instance), so that we need to sync the controller state&#xA;to this webcomponent again, preventing eternal loops. | `newOpened: boolean` | | OverlayMixin |
100
+ | `_setupListboxNode` | protected | | | | |
101
+ | `_setupOpenCloseListeners` | protected | | | | OverlayMixin |
102
+ | `_setupOverlayCtrl` | protected | | | | OverlayMixin |
103
+ | `_teardownListboxNode` | protected | | | | |
104
+ | `_teardownOpenCloseListeners` | protected | | | | OverlayMixin |
105
+ | `_teardownOverlayCtrl` | protected | | | | OverlayMixin |
90
106
 
91
107
  ### Events
92
108
 
93
- | Name | Type | Description | Inherited From |
94
- | ------ | ------- | ----------- | -------------- |
95
- | `blur` | `Event` | | |
109
+ | Name | Type | Description | Inherited From |
110
+ | ---------------- | ------------- | ----------- | -------------- |
111
+ | `blur` | `Event` | | |
112
+ | `opened-changed` | `CustomEvent` | | OverlayMixin |
96
113
 
97
114
  ### Attributes
98
115
 
@@ -101,5 +118,6 @@ eleventyNavigation:
101
118
  | `navigate-within-invoker` | navigateWithinInvoker | |
102
119
  | `interaction-mode` | interactionMode | |
103
120
  | `single-option` | singleOption | |
121
+ | `opened` | opened | OverlayMixin |
104
122
 
105
123
  <hr/>
@@ -29,7 +29,7 @@ You can set the full `modelValue` for each option, which includes the checked pr
29
29
  ```
30
30
 
31
31
  Note, when rendering with the help of the `cache` function imported from `lit/directives/cache.js`, setting model by
32
- the `modelValue` property is not fully supported. Consider setting the model by the `choiceValue` property instead. See [Setting model by `choiceValue` property](https://github.com/ing-bank/lion/blob/1e44a873eb492168e7e3d2f5c120371d950b9e03/docs/components/select-rich/#setting-model-by-the-choicevalue-property) for more details.
32
+ the `modelValue` property is not fully supported. Consider setting the model by the `choiceValue` property instead. See [Setting model by `choiceValue` property](https://github.com/ing-bank/lion/blob/4649554021224763994601dd8d202c511d35013e/docs/components/select-rich/#setting-model-by-the-choicevalue-property) for more details.
33
33
 
34
34
  ### Setting model by the `choiceValue` property
35
35
 
@@ -328,7 +328,7 @@ LionSelectRich will give it acces to:
328
328
  - LionSelectRich itself, via `.hostElement`
329
329
 
330
330
  Code of an advanced custom invoker is shown below (this is the code for the
331
- invoker used in [IntlSelectRich](https://github.com/ing-bank/lion/blob/1e44a873eb492168e7e3d2f5c120371d950b9e03/docs/components/select-rich/examples.md)).
331
+ invoker used in [IntlSelectRich](https://github.com/ing-bank/lion/blob/4649554021224763994601dd8d202c511d35013e/docs/components/select-rich/examples.md)).
332
332
  The invoker is usually added in the invoker slot of the LionSelectRich subclass.
333
333
  However, it would also be possible for an application developer to provide the invoker
334
334
  by putting it in light dom:
@@ -21,7 +21,7 @@ import './src/lea-tab-panel.js';
21
21
 
22
22
  ## Lea Tabs
23
23
 
24
- Learn how to create the `lea tabs` in our ["introducing lion" blogpost](https://github.com/ing-bank/lion/blob/1e44a873eb492168e7e3d2f5c120371d950b9e03/docs/blog/ing-open-sources-lion.md).
24
+ Learn how to create the `lea tabs` in our ["introducing lion" blogpost](https://github.com/ing-bank/lion/blob/4649554021224763994601dd8d202c511d35013e/docs/blog/ing-open-sources-lion.md).
25
25
 
26
26
  ```js preview-story
27
27
  export const main = () => html`
@@ -16,21 +16,47 @@ eleventyNavigation:
16
16
 
17
17
  ### Fields
18
18
 
19
- | Name | Privacy | Type | Default | Description | Inherited From |
20
- | ----------------- | ------- | ------------------------ | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | -------------- |
21
- | `hasArrow` | public | `boolean` | `false` | Whether an arrow should be displayed | |
22
- | `invokerRelation` | public | `'label'\|'description'` | `'description'` | Decides whether the tooltip invoker text should be considered a description&#xA;(sets aria-describedby) or a label (sets aria-labelledby). | |
19
+ | Name | Privacy | Type | Default | Description | Inherited From |
20
+ | ---------------------------- | --------- | ------------------------ | --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------- |
21
+ | `config` | public | `Partial<OverlayConfig>` | `{}` | Configure the many options of the \`OverlayController\` | OverlayMixin |
22
+ | `hasArrow` | public | `boolean` | `false` | Whether an arrow should be displayed | |
23
+ | `invokerRelation` | public | `'label'\|'description'` | `'description'` | Decides whether the tooltip invoker text should be considered a description&#xA;(sets aria-describedby) or a label (sets aria-labelledby). | |
24
+ | `opened` | public | `boolean` | `false` | If you add the opened attribute a dialog will be opened on page load. The invoker can be left out&#xA;in case the user does not need to be able to reopen the dialog. | OverlayMixin |
25
+ | `_overlayBackdropNode` | protected | | | | OverlayMixin |
26
+ | `_overlayContentNode` | protected | | | | OverlayMixin |
27
+ | `_overlayContentWrapperNode` | protected | | | | OverlayMixin |
28
+ | `_overlayInvokerNode` | protected | | | The node that opens/closes this overlay.&#xA;&#xA;Resolved in a stable, declarative way (independent of the exact DOM order)&#xA;by looking, in order, for:&#xA;1\. a child with \`\[slot="invoker"]\`&#xA;2\. any element in the same root that opts in via \`\[data-invoker]\` and&#xA; references this host by id (\`for="\<id>"\`)&#xA;3\. a preceding sibling that opts in via \`\[data-invoker]\` | OverlayMixin |
29
+ | `_overlayReferenceNode` | protected | | | | OverlayMixin |
23
30
 
24
31
  ### Methods
25
32
 
26
- | Name | Privacy | Description | Parameters | Return | Inherited From |
27
- | ---------------------- | --------- | ----------- | ---------- | ------ | -------------- |
28
- | `_defineOverlayConfig` | protected | | | | |
33
+ | Name | Privacy | Description | Parameters | Return | Inherited From |
34
+ | ---------------------------------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | ------------------- | -------------- |
35
+ | `close` | public | Hides the overlay | | | OverlayMixin |
36
+ | `open` | public | Shows the overlay | | | OverlayMixin |
37
+ | `repositionOverlay` | public | Sometimes it's needed to recompute Popper position of an overlay, for instance when we have&#xA;an opened combobox and the surrounding context changes (the space consumed by the textbox&#xA;increases vertically) | | | OverlayMixin |
38
+ | `toggle` | public | Toggles the overlay | | | OverlayMixin |
39
+ | `_defineOverlay` | protected | | `{ contentNode, invokerNode, referenceNode, backdropNode, contentWrapperNode }, config: DefineOverlayConfig` | `OverlayController` | OverlayMixin |
40
+ | `_defineOverlayConfig` | protected | | | `OverlayConfig` | OverlayMixin |
41
+ | `_getInvokerNode` | protected | | | `Element\|null` | OverlayMixin |
42
+ | `_isPermanentlyDisconnected` | protected | When we're moving around in dom, disconnectedCallback gets called.&#xA;Before we decide to teardown, let's wait to see if we were not just moving nodes around. | | `Promise<boolean>` | OverlayMixin |
43
+ | `_setOpenedWithoutPropertyEffects` | protected | When the opened state is changed by an Application Developer,cthe OverlayController is&#xA;requested to show/hide. It might happen that this request is not honoured&#xA;(intercepted in before-hide for instance), so that we need to sync the controller state&#xA;to this webcomponent again, preventing eternal loops. | `newOpened: boolean` | | OverlayMixin |
44
+ | `_setupOpenCloseListeners` | protected | | | | OverlayMixin |
45
+ | `_setupOverlayCtrl` | protected | | | | OverlayMixin |
46
+ | `_teardownOpenCloseListeners` | protected | | | | OverlayMixin |
47
+ | `_teardownOverlayCtrl` | protected | | | | OverlayMixin |
48
+
49
+ ### Events
50
+
51
+ | Name | Type | Description | Inherited From |
52
+ | ---------------- | ------------- | ----------- | -------------- |
53
+ | `opened-changed` | `CustomEvent` | | OverlayMixin |
29
54
 
30
55
  ### Attributes
31
56
 
32
57
  | Name | Field | Inherited From |
33
58
  | ------------------ | --------------- | -------------- |
34
59
  | `invoker-relation` | invokerRelation | |
60
+ | `opened` | opened | OverlayMixin |
35
61
 
36
62
  <hr/>
@@ -9,11 +9,11 @@ Here you find more details about what we offer.
9
9
 
10
10
  Let's see what each section describes.
11
11
 
12
- 1. [Systems](https://github.com/ing-bank/lion/blob/1e44a873eb492168e7e3d2f5c120371d950b9e03/docs/fundamentals/systems/core/overview.md) <br>
12
+ 1. [Systems](https://github.com/ing-bank/lion/blob/4649554021224763994601dd8d202c511d35013e/docs/fundamentals/systems/core/overview.md) <br>
13
13
  These are the fundamental systems that power all of our components.
14
- 2. [Tools](https://github.com/ing-bank/lion/blob/1e44a873eb492168e7e3d2f5c120371d950b9e03/docs/fundamentals/tools/helpers/overview.md) <br>
14
+ 2. [Tools](https://github.com/ing-bank/lion/blob/4649554021224763994601dd8d202c511d35013e/docs/fundamentals/tools/helpers/overview.md) <br>
15
15
  Frontend Tools useful for web development but are not visual and therefore are not components.
16
- 3. [Node Tools](https://github.com/ing-bank/lion/blob/1e44a873eb492168e7e3d2f5c120371d950b9e03/docs/fundamentals/node-tools/babel-plugin-extend-docs/overview.md) <br>
16
+ 3. [Node Tools](https://github.com/ing-bank/lion/blob/4649554021224763994601dd8d202c511d35013e/docs/fundamentals/node-tools/babel-plugin-extend-docs/overview.md) <br>
17
17
  Node tools to analyse the code and for extending the documentation.
18
- 4. [Rationales](https://github.com/ing-bank/lion/blob/1e44a873eb492168e7e3d2f5c120371d950b9e03/docs/fundamentals/rationales/side-effects.md) <br>
18
+ 4. [Rationales](https://github.com/ing-bank/lion/blob/4649554021224763994601dd8d202c511d35013e/docs/fundamentals/rationales/side-effects.md) <br>
19
19
  The reasoning behind some of our decisions.
@@ -94,7 +94,7 @@ npx providence-analytics analyze match-imports -t /importing/project -r /exporti
94
94
  ## Utils
95
95
 
96
96
  Providence comes with many tools for deep traversal of identifiers,
97
- the (babel like) traversal of ast trees in oxc and swc and more.
97
+ the (babel like) traversal of ast trees in oxc and more.
98
98
  Also more generic utils for caching and performant globbing come delivered with Providence.
99
99
 
100
100
  For a better understanding, check out the utils folders (tests and code).