@lion/ui 0.0.1 → 0.0.3

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 (279) hide show
  1. package/components/core/test/SlotMixin.test.js +28 -21
  2. package/components/drawer/src/LionDrawer.js +217 -0
  3. package/components/drawer/src/drawerStyle.js +59 -0
  4. package/components/drawer/test/lion-drawer.test.js +109 -0
  5. package/components/localize/src/number/parseNumber.js +15 -36
  6. package/components/localize/test/number/parseNumber.test.js +3 -12
  7. package/custom-elements.json +743 -0
  8. package/dist-types/components/drawer/src/LionDrawer.d.ts +67 -0
  9. package/dist-types/components/drawer/src/LionDrawer.d.ts.map +1 -0
  10. package/dist-types/components/drawer/src/drawerStyle.d.ts +2 -0
  11. package/dist-types/components/drawer/src/drawerStyle.d.ts.map +1 -0
  12. package/dist-types/components/drawer/test/lion-drawer.test.d.ts +3 -0
  13. package/dist-types/components/drawer/test/lion-drawer.test.d.ts.map +1 -0
  14. package/dist-types/components/localize/src/number/parseNumber.d.ts.map +1 -1
  15. package/dist-types/exports/define/lion-drawer.d.ts +2 -0
  16. package/dist-types/exports/define/lion-drawer.d.ts.map +1 -0
  17. package/dist-types/exports/drawer.d.ts +2 -0
  18. package/dist-types/exports/drawer.d.ts.map +1 -0
  19. package/dist-types/tsconfig.tsbuildinfo +1 -1
  20. package/docs/components/accordion/index.md +3 -0
  21. package/docs/components/accordion/overview.md +129 -0
  22. package/docs/components/accordion/reference.md +47 -0
  23. package/docs/components/accordion/use-cases.md +252 -0
  24. package/docs/components/button/examples.md +30 -0
  25. package/docs/components/button/index.md +3 -0
  26. package/docs/components/button/overview.md +30 -0
  27. package/docs/components/button/src/icon.svg.js +5 -0
  28. package/docs/components/button/use-cases.md +106 -0
  29. package/docs/components/calendar/index.md +3 -0
  30. package/docs/components/calendar/overview.md +49 -0
  31. package/docs/components/calendar/use-cases.md +192 -0
  32. package/docs/components/checkbox-group/index.md +3 -0
  33. package/docs/components/checkbox-group/overview.md +40 -0
  34. package/docs/components/checkbox-group/use-cases.md +256 -0
  35. package/docs/components/collapsible/assets/CustomCollapsible.js +113 -0
  36. package/docs/components/collapsible/assets/applyDemoCollapsibleStyles.js +37 -0
  37. package/docs/components/collapsible/examples.md +83 -0
  38. package/docs/components/collapsible/index.md +3 -0
  39. package/docs/components/collapsible/overview.md +39 -0
  40. package/docs/components/collapsible/use-cases.md +79 -0
  41. package/docs/components/combobox/examples.md +153 -0
  42. package/docs/components/combobox/index.md +3 -0
  43. package/docs/components/combobox/overview.md +51 -0
  44. package/docs/components/combobox/src/LinkMixin.js +60 -0
  45. package/docs/components/combobox/src/demo-selection-display.js +191 -0
  46. package/docs/components/combobox/src/gh-combobox/gh-button.js +69 -0
  47. package/docs/components/combobox/src/gh-combobox/gh-combobox.js +508 -0
  48. package/docs/components/combobox/src/google-combobox/assets/google-clear-icon.js +9 -0
  49. package/docs/components/combobox/src/google-combobox/assets/google-search-icon.js +9 -0
  50. package/docs/components/combobox/src/google-combobox/assets/google-voice-search-icon.js +19 -0
  51. package/docs/components/combobox/src/google-combobox/assets/googlelogo_color_272x92dp.png +0 -0
  52. package/docs/components/combobox/src/google-combobox/google-combobox.js +460 -0
  53. package/docs/components/combobox/src/lazyRender.js +29 -0
  54. package/docs/components/combobox/src/levenshtein.js +95 -0
  55. package/docs/components/combobox/src/md-combobox/MdFieldMixin.js +341 -0
  56. package/docs/components/combobox/src/md-combobox/md-combobox.js +89 -0
  57. package/docs/components/combobox/src/md-combobox/md-input.js +5 -0
  58. package/docs/components/combobox/src/md-combobox/style/load-roboto.js +6 -0
  59. package/docs/components/combobox/src/md-combobox/style/md-ripple.js +81 -0
  60. package/docs/components/combobox/src/wa-combobox/wa-combobox.js +368 -0
  61. package/docs/components/combobox/use-cases.md +377 -0
  62. package/docs/components/dialog/index.md +3 -0
  63. package/docs/components/dialog/overview.md +63 -0
  64. package/docs/components/dialog/src/demo-dialog-style.js +3 -0
  65. package/docs/components/dialog/src/demoStyle.js +39 -0
  66. package/docs/components/dialog/src/slots-dialog-content.js +32 -0
  67. package/docs/components/dialog/src/styled-dialog-content.js +38 -0
  68. package/docs/components/dialog/use-cases.md +154 -0
  69. package/docs/components/drawer/index.md +3 -0
  70. package/docs/components/drawer/overview.md +68 -0
  71. package/docs/components/drawer/src/demoStyle.js +71 -0
  72. package/docs/components/drawer/use-cases.md +194 -0
  73. package/docs/components/fieldset/index.md +3 -0
  74. package/docs/components/fieldset/overview.md +49 -0
  75. package/docs/components/fieldset/use-cases.md +185 -0
  76. package/docs/components/form/index.md +3 -0
  77. package/docs/components/form/overview.md +43 -0
  78. package/docs/components/form/use-cases.md +72 -0
  79. package/docs/components/icon/assets/bugs/bug01.svg.js +2 -0
  80. package/docs/components/icon/assets/bugs/bug02.svg.js +2 -0
  81. package/docs/components/icon/assets/bugs/bug05.svg.js +2 -0
  82. package/docs/components/icon/assets/bugs/bug06.svg.js +2 -0
  83. package/docs/components/icon/assets/bugs/bug08.svg.js +2 -0
  84. package/docs/components/icon/assets/bugs/bug12.svg.js +2 -0
  85. package/docs/components/icon/assets/bugs/bug19.svg.js +2 -0
  86. package/docs/components/icon/assets/bugs/bug23.svg.js +2 -0
  87. package/docs/components/icon/assets/bugs/bug24.svg.js +2 -0
  88. package/docs/components/icon/assets/iconset-bugs.js +11 -0
  89. package/docs/components/icon/assets/iconset-misc.js +3 -0
  90. package/docs/components/icon/assets/iconset-space.js +31 -0
  91. package/docs/components/icon/assets/misc/arrowLeft.svg.js +6 -0
  92. package/docs/components/icon/assets/space/aliens-spaceship.svg.js +2 -0
  93. package/docs/components/icon/assets/space/meteor.svg.js +2 -0
  94. package/docs/components/icon/assets/space/moon-flag.svg.js +2 -0
  95. package/docs/components/icon/assets/space/moon.svg.js +2 -0
  96. package/docs/components/icon/assets/space/night.svg.js +2 -0
  97. package/docs/components/icon/assets/space/orbit.svg.js +2 -0
  98. package/docs/components/icon/assets/space/planet.svg.js +2 -0
  99. package/docs/components/icon/assets/space/robot.svg.js +2 -0
  100. package/docs/components/icon/assets/space/rocket.svg.js +2 -0
  101. package/docs/components/icon/assets/space/satellite.svg.js +2 -0
  102. package/docs/components/icon/assets/space/signal.svg.js +2 -0
  103. package/docs/components/icon/assets/space/space-helmet.svg.js +2 -0
  104. package/docs/components/icon/assets/space/sun.svg.js +2 -0
  105. package/docs/components/icon/assets/space/telescope.svg.js +2 -0
  106. package/docs/components/icon/index.md +3 -0
  107. package/docs/components/icon/overview.md +40 -0
  108. package/docs/components/icon/use-cases.md +93 -0
  109. package/docs/components/index.md +7 -0
  110. package/docs/components/input/index.md +3 -0
  111. package/docs/components/input/overview.md +36 -0
  112. package/docs/components/input/use-cases.md +77 -0
  113. package/docs/components/input-amount/index.md +3 -0
  114. package/docs/components/input-amount/overview.md +49 -0
  115. package/docs/components/input-amount/use-cases.md +122 -0
  116. package/docs/components/input-date/index.md +3 -0
  117. package/docs/components/input-date/overview.md +39 -0
  118. package/docs/components/input-date/use-cases.md +83 -0
  119. package/docs/components/input-datepicker/index.md +3 -0
  120. package/docs/components/input-datepicker/overview.md +42 -0
  121. package/docs/components/input-datepicker/use-cases.md +78 -0
  122. package/docs/components/input-email/index.md +3 -0
  123. package/docs/components/input-email/overview.md +32 -0
  124. package/docs/components/input-email/use-cases.md +48 -0
  125. package/docs/components/input-iban/index.md +3 -0
  126. package/docs/components/input-iban/overview.md +37 -0
  127. package/docs/components/input-iban/use-cases.md +102 -0
  128. package/docs/components/input-range/index.md +3 -0
  129. package/docs/components/input-range/overview.md +34 -0
  130. package/docs/components/input-range/use-cases.md +108 -0
  131. package/docs/components/input-stepper/index.md +3 -0
  132. package/docs/components/input-stepper/overview.md +36 -0
  133. package/docs/components/input-stepper/use-cases.md +41 -0
  134. package/docs/components/input-tel/index.md +3 -0
  135. package/docs/components/input-tel/overview.md +62 -0
  136. package/docs/components/input-tel/src/h-region-code-table.js +109 -0
  137. package/docs/components/input-tel/use-cases.md +307 -0
  138. package/docs/components/input-tel-dropdown/examples.md +32 -0
  139. package/docs/components/input-tel-dropdown/index.md +3 -0
  140. package/docs/components/input-tel-dropdown/overview.md +38 -0
  141. package/docs/components/input-tel-dropdown/src/intl-input-tel-dropdown.js +127 -0
  142. package/docs/components/input-tel-dropdown/use-cases.md +159 -0
  143. package/docs/components/listbox/index.md +3 -0
  144. package/docs/components/listbox/overview.md +42 -0
  145. package/docs/components/listbox/src/listboxData.js +65 -0
  146. package/docs/components/listbox/use-cases.md +147 -0
  147. package/docs/components/pagination/index.md +3 -0
  148. package/docs/components/pagination/overview.md +29 -0
  149. package/docs/components/pagination/use-cases.md +99 -0
  150. package/docs/components/progress-indicator/assets/my-determinate-progress-bar.js +30 -0
  151. package/docs/components/progress-indicator/assets/my-indeterminate-progress-spinner.js +55 -0
  152. package/docs/components/progress-indicator/examples.md +125 -0
  153. package/docs/components/progress-indicator/index.md +3 -0
  154. package/docs/components/progress-indicator/overview.md +36 -0
  155. package/docs/components/radio-group/index.md +3 -0
  156. package/docs/components/radio-group/overview.md +46 -0
  157. package/docs/components/radio-group/use-cases.md +140 -0
  158. package/docs/components/select/index.md +3 -0
  159. package/docs/components/select/overview.md +44 -0
  160. package/docs/components/select/use-cases.md +55 -0
  161. package/docs/components/select-rich/examples.md +31 -0
  162. package/docs/components/select-rich/index.md +3 -0
  163. package/docs/components/select-rich/overview.md +46 -0
  164. package/docs/components/select-rich/src/flagStyles.js +1250 -0
  165. package/docs/components/select-rich/src/flags.png +0 -0
  166. package/docs/components/select-rich/src/flags@2x.png +0 -0
  167. package/docs/components/select-rich/src/intl-select-rich.js +194 -0
  168. package/docs/components/select-rich/src/regionMetaList.js +1717 -0
  169. package/docs/components/select-rich/use-cases.md +370 -0
  170. package/docs/components/steps/index.md +3 -0
  171. package/docs/components/steps/overview.md +63 -0
  172. package/docs/components/steps/use-cases.md +163 -0
  173. package/docs/components/switch/index.md +3 -0
  174. package/docs/components/switch/overview.md +75 -0
  175. package/docs/components/switch/reference.md +39 -0
  176. package/docs/components/switch/use-cases.md +76 -0
  177. package/docs/components/tabs/examples.md +23 -0
  178. package/docs/components/tabs/index.md +3 -0
  179. package/docs/components/tabs/overview.md +48 -0
  180. package/docs/components/tabs/src/lea-tab-panel.js +24 -0
  181. package/docs/components/tabs/src/lea-tab.js +45 -0
  182. package/docs/components/tabs/src/lea-tabs.js +28 -0
  183. package/docs/components/tabs/use-cases.md +219 -0
  184. package/docs/components/textarea/index.md +3 -0
  185. package/docs/components/textarea/overview.md +35 -0
  186. package/docs/components/textarea/use-cases.md +95 -0
  187. package/docs/components/tooltip/examples.md +39 -0
  188. package/docs/components/tooltip/index.md +3 -0
  189. package/docs/components/tooltip/overview.md +44 -0
  190. package/docs/components/tooltip/use-cases.md +208 -0
  191. package/docs/fundamentals/index.md +19 -0
  192. package/docs/fundamentals/node-tools/babel-plugin-extend-docs/index.md +1 -0
  193. package/docs/fundamentals/node-tools/babel-plugin-extend-docs/overview.md +233 -0
  194. package/docs/fundamentals/node-tools/index.md +1 -0
  195. package/docs/fundamentals/node-tools/providence-analytics/LocalConfiguration.md +68 -0
  196. package/docs/fundamentals/node-tools/providence-analytics/QueryResult.md +111 -0
  197. package/docs/fundamentals/node-tools/providence-analytics/analyzer.md +69 -0
  198. package/docs/fundamentals/node-tools/providence-analytics/assets/_mermaid.svg.js +1202 -0
  199. package/docs/fundamentals/node-tools/providence-analytics/dashboard.md +22 -0
  200. package/docs/fundamentals/node-tools/providence-analytics/index.md +1 -0
  201. package/docs/fundamentals/node-tools/providence-analytics/overview.md +192 -0
  202. package/docs/fundamentals/node-tools/publish-docs/index.md +1 -0
  203. package/docs/fundamentals/node-tools/publish-docs/overview.md +136 -0
  204. package/docs/fundamentals/node-tools/remark-extend/index.md +1 -0
  205. package/docs/fundamentals/node-tools/remark-extend/overview.md +274 -0
  206. package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/index.md +1 -0
  207. package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/overview.md +285 -0
  208. package/docs/fundamentals/rationales/TypeScript.md +18 -0
  209. package/docs/fundamentals/rationales/index.md +1 -0
  210. package/docs/fundamentals/rationales/side-effects.md +203 -0
  211. package/docs/fundamentals/rationales/versioning.md +35 -0
  212. package/docs/fundamentals/systems/core/index.md +3 -0
  213. package/docs/fundamentals/systems/core/overview.md +85 -0
  214. package/docs/fundamentals/systems/form/assets/FormatMixinDiagram-1.svg +1 -0
  215. package/docs/fundamentals/systems/form/assets/FormatMixinDiagram-2.svg +1 -0
  216. package/docs/fundamentals/systems/form/assets/FormatMixinDiagram-3.svg +84 -0
  217. package/docs/fundamentals/systems/form/assets/h-output.js +155 -0
  218. package/docs/fundamentals/systems/form/formatting-and-parsing.md +245 -0
  219. package/docs/fundamentals/systems/form/index.md +3 -0
  220. package/docs/fundamentals/systems/form/interaction-states.md +177 -0
  221. package/docs/fundamentals/systems/form/model-value.md +35 -0
  222. package/docs/fundamentals/systems/form/overview.md +82 -0
  223. package/docs/fundamentals/systems/form/styling.md +101 -0
  224. package/docs/fundamentals/systems/form/use-cases.md +156 -0
  225. package/docs/fundamentals/systems/form/validate.md +929 -0
  226. package/docs/fundamentals/systems/icon/index.md +3 -0
  227. package/docs/fundamentals/systems/icon/overview.md +124 -0
  228. package/docs/fundamentals/systems/index.md +1 -0
  229. package/docs/fundamentals/systems/localize/assets/all-locales.js +437 -0
  230. package/docs/fundamentals/systems/localize/assets/en-AU.js +6 -0
  231. package/docs/fundamentals/systems/localize/assets/en-GB.js +6 -0
  232. package/docs/fundamentals/systems/localize/assets/en-US.js +6 -0
  233. package/docs/fundamentals/systems/localize/assets/en.js +4 -0
  234. package/docs/fundamentals/systems/localize/assets/nl-BE.js +6 -0
  235. package/docs/fundamentals/systems/localize/assets/nl-NL.js +6 -0
  236. package/docs/fundamentals/systems/localize/assets/nl.js +4 -0
  237. package/docs/fundamentals/systems/localize/dates.md +195 -0
  238. package/docs/fundamentals/systems/localize/index.md +3 -0
  239. package/docs/fundamentals/systems/localize/numbers.md +217 -0
  240. package/docs/fundamentals/systems/localize/overview.md +48 -0
  241. package/docs/fundamentals/systems/localize/rationale.md +62 -0
  242. package/docs/fundamentals/systems/localize/text.md +125 -0
  243. package/docs/fundamentals/systems/localize/use-cases.md +319 -0
  244. package/docs/fundamentals/systems/overlays/assets/applyDemoOverlayStyles.js +22 -0
  245. package/docs/fundamentals/systems/overlays/assets/demo-overlay-backdrop.js +48 -0
  246. package/docs/fundamentals/systems/overlays/assets/demo-overlay-system.js +42 -0
  247. package/docs/fundamentals/systems/overlays/assets/umbrella-form.js +133 -0
  248. package/docs/fundamentals/systems/overlays/configuration.md +453 -0
  249. package/docs/fundamentals/systems/overlays/form-integration.md +65 -0
  250. package/docs/fundamentals/systems/overlays/index.md +3 -0
  251. package/docs/fundamentals/systems/overlays/overview.md +118 -0
  252. package/docs/fundamentals/systems/overlays/rationale.md +232 -0
  253. package/docs/fundamentals/systems/overlays/scope.md +176 -0
  254. package/docs/fundamentals/systems/overlays/use-cases.md +699 -0
  255. package/docs/fundamentals/tools/ajax/assets/naga.json +9 -0
  256. package/docs/fundamentals/tools/ajax/assets/pabu.json +9 -0
  257. package/docs/fundamentals/tools/ajax/index.md +3 -0
  258. package/docs/fundamentals/tools/ajax/overview.md +128 -0
  259. package/docs/fundamentals/tools/ajax/use-cases.md +456 -0
  260. package/docs/fundamentals/tools/helpers/action-logger.md +165 -0
  261. package/docs/fundamentals/tools/helpers/index.md +3 -0
  262. package/docs/fundamentals/tools/helpers/overview.md +30 -0
  263. package/docs/fundamentals/tools/index.md +1 -0
  264. package/docs/fundamentals/tools/singleton-manager/index.md +3 -0
  265. package/docs/fundamentals/tools/singleton-manager/overview.md +304 -0
  266. package/docs/guides/how-to/create-a-custom-field.md +200 -0
  267. package/docs/guides/how-to/extend-a-native-input.md +66 -0
  268. package/docs/guides/how-to/get-started.md +77 -0
  269. package/docs/guides/how-to/index.md +1 -0
  270. package/docs/guides/index.md +34 -0
  271. package/docs/guides/principles/definitions-and-terms.md +41 -0
  272. package/docs/guides/principles/index.md +26 -0
  273. package/docs/guides/principles/scoped-elements.md +103 -0
  274. package/docs/guides/principles/styling.md +32 -0
  275. package/docs/guides/principles/subclasser-apis.md +28 -0
  276. package/docs/override.js +15 -0
  277. package/exports/define/lion-drawer.js +3 -0
  278. package/exports/drawer.js +1 -0
  279. package/package.json +2 -2
@@ -0,0 +1,453 @@
1
+ # Systems >> Overlays >> Configuration ||40
2
+
3
+ ```js script
4
+ import { html } from '@mdjs/mdjs-preview';
5
+ import './assets/demo-overlay-system.js';
6
+ import './assets/applyDemoOverlayStyles.js';
7
+ ```
8
+
9
+ The `OverlayController` has many configuration options.
10
+ Using different combinations of those properties, different components like a tooltip, popover, dialog etc. can be made.
11
+ The `OverlayMixin` exposes these options via `.config`.
12
+
13
+ ## placementMode
14
+
15
+ Either `'local'` or `'global'`.
16
+ This determines the DOM position of the `contentNode`, either next to the invokerNode,
17
+ or in the `global-overlays` container at the bottom of the `<body>`.
18
+
19
+ ### Local
20
+
21
+ ```js preview-story
22
+ export const placementLocal = () => {
23
+ const placementModeLocalConfig = { placementMode: 'local' };
24
+ return html`
25
+ <style>
26
+ .demo-overlay {
27
+ background-color: white;
28
+ border: 1px solid black;
29
+ }
30
+ </style>
31
+ <demo-overlay-system .config=${placementModeLocalConfig}>
32
+ <button slot="invoker">Click me to open the local overlay!</button>
33
+ <div slot="content" class="demo-overlay">
34
+ Hello! You can close this notification here:
35
+ <button
36
+ class="close-button"
37
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
38
+ >
39
+ ⨯
40
+ </button>
41
+ </div>
42
+ </demo-overlay-system>
43
+ `;
44
+ };
45
+ ```
46
+
47
+ ### Global
48
+
49
+ ```js preview-story
50
+ export const placementGlobal = () => {
51
+ const placementModeGlobalConfig = { placementMode: 'global' };
52
+ return html`
53
+ <demo-overlay-system .config=${placementModeGlobalConfig}>
54
+ <button slot="invoker">Click me to open the global overlay!</button>
55
+ <div slot="content" class="demo-overlay">
56
+ Hello! You can close this notification here:
57
+ <button
58
+ class="close-button"
59
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
60
+ >
61
+ ⨯
62
+ </button>
63
+ </div>
64
+ </demo-overlay-system>
65
+ `;
66
+ };
67
+ ```
68
+
69
+ ## isTooltip (placementMode: 'local')
70
+
71
+ As specified in the [overlay rationale](https://github.com/ing-bank/lion/blob/fbf0bd22378e76aa4261c2a97faf8be4f5fc461e/docs/fundamentals/systems/overlays/rationale.md) there are only two official types of overlays: dialogs and tooltips. And their main differences are:
72
+
73
+ - Dialogs have a modal option, tooltips don’t
74
+ - Dialogs have interactive content, tooltips don’t
75
+ - Dialogs are opened via regular buttons (click/space/enter), tooltips act on focus/mouseover
76
+
77
+ Since most overlays have interactive content the default is set to dialogs. To get a tooltip, you can add `isTooltip` to the config object. This only works for local placement and it also needs to have `handlesAccessibility` activated to work.
78
+
79
+ ```js preview-story
80
+ export const isTooltip = () => {
81
+ function showTooltip() {
82
+ const tooltip = document.querySelector('#tooltip');
83
+ tooltip.opened = true;
84
+ }
85
+
86
+ function hideTooltip() {
87
+ const tooltip = document.querySelector('#tooltip');
88
+ tooltip.opened = false;
89
+ }
90
+
91
+ const tooltipConfig = { placementMode: 'local', isTooltip: true, handlesAccessibility: true };
92
+
93
+ return html`
94
+ <demo-overlay-system id="tooltip" .config=${tooltipConfig}>
95
+ <button slot="invoker" @mouseenter=${showTooltip} @mouseleave=${hideTooltip}>
96
+ Hover me to open the tooltip!
97
+ </button>
98
+ <div slot="content" class="demo-overlay">Hello!</div>
99
+ </demo-overlay-system>
100
+ `;
101
+ };
102
+ ```
103
+
104
+ ## trapsKeyboardFocus
105
+
106
+ Boolean property. When true, the focus will rotate through the **focusable elements** inside the `contentNode`.
107
+
108
+ For Modal Dialogs this is an important feature, since these are considered "their own page",
109
+ so especially from an accessibility point of view, trapping the focus inside the dialog is crucial.
110
+
111
+ You use the feature on any type of overlay.
112
+
113
+ ```js preview-story
114
+ export const trapsKeyboardFocus = () => {
115
+ const trapsKeyboardFocusConfig = { trapsKeyboardFocus: true };
116
+ return html`
117
+ <demo-overlay-system .config=${trapsKeyboardFocusConfig}>
118
+ <button slot="invoker">Click me to open the overlay!</button>
119
+ <div slot="content" class="demo-overlay">
120
+ <div><a href="#">A focusable anchor</a></div>
121
+ <div><a href="#">Another focusable anchor</a></div>
122
+ Hello! You can close this notification here:
123
+ <button
124
+ class="close-button"
125
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
126
+ >
127
+ ⨯
128
+ </button>
129
+ </div>
130
+ </demo-overlay-system>
131
+ `;
132
+ };
133
+ ```
134
+
135
+ ## hidesOnEsc
136
+
137
+ Boolean property. Will allow closing the overlay on ESC key when enabled.
138
+
139
+ ```js preview-story
140
+ export const hidesOnEsc = () => {
141
+ const hidesOnEscConfig = { hidesOnEsc: true };
142
+ return html`
143
+ <demo-overlay-system .config=${hidesOnEscConfig}>
144
+ <button slot="invoker">Click me to open the overlay!</button>
145
+ <div slot="content" class="demo-overlay">
146
+ Hello! You can close this notification here:
147
+ <button
148
+ class="close-button"
149
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
150
+ >
151
+ ⨯
152
+ </button>
153
+ </div>
154
+ </demo-overlay-system>
155
+ `;
156
+ };
157
+ ```
158
+
159
+ ## hidesOnOutsideEsc
160
+
161
+ Boolean property. When enabled allows closing the overlay on ESC key, even when contentNode has no focus.
162
+
163
+ ```js preview-story
164
+ export const hidesOnOutsideEsc = () => {
165
+ const hidesOnEscConfig = { hidesOnOutsideEsc: true };
166
+ return html`
167
+ <demo-overlay-system .config=${hidesOnEscConfig}>
168
+ <button slot="invoker">Click me to open the overlay!</button>
169
+ <div slot="content" class="demo-overlay">
170
+ Hello! You can close this notification here:
171
+ <button
172
+ class="close-button"
173
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
174
+ >
175
+ ⨯
176
+ </button>
177
+ </div>
178
+ </demo-overlay-system>
179
+ `;
180
+ };
181
+ ```
182
+
183
+ ## hidesOnOutsideClick
184
+
185
+ Boolean property. Will allow closing the overlay by clicking outside the `contentNode`.
186
+
187
+ ```js preview-story
188
+ export const hidesOnOutsideClick = () => {
189
+ const hidesOnOutsideClickConfig = { hidesOnOutsideClick: true };
190
+ return html`
191
+ <demo-overlay-system .config=${hidesOnOutsideClickConfig}>
192
+ <button slot="invoker">Click me to open the overlay!</button>
193
+ <div slot="content" class="demo-overlay">
194
+ <label for="myInput">Clicking this label should not trigger close</label>
195
+ <input id="myInput" />
196
+ <button
197
+ class="close-button"
198
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
199
+ >
200
+ ⨯
201
+ </button>
202
+ </div>
203
+ </demo-overlay-system>
204
+ `;
205
+ };
206
+ ```
207
+
208
+ ## elementToFocusAfterHide
209
+
210
+ HTMLElement. Will `.focus()` the HTMLElement passed to this property. By default, this is the `invokerNode`.
211
+
212
+ In the example, we focus the body instead of the `invokerNode`.
213
+
214
+ ```js preview-story
215
+ export const elementToFocusAfterHide = () => {
216
+ const elementToFocusAfterHideConfig = { elementToFocusAfterHide: document.body };
217
+ return html`
218
+ <demo-overlay-system .config=${elementToFocusAfterHideConfig}>
219
+ <button slot="invoker">Click me to open the overlay!</button>
220
+ <div slot="content" class="demo-overlay">
221
+ Hello! You can close this notification here:
222
+ <button
223
+ class="close-button"
224
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
225
+ >
226
+ ⨯
227
+ </button>
228
+ </div>
229
+ </demo-overlay-system>
230
+ `;
231
+ };
232
+ ```
233
+
234
+ ## hasBackdrop
235
+
236
+ Boolean property. When true, will add a backdrop when the overlay is opened.
237
+
238
+ > Backdrops will overlay each other if you open nested overlays with enabled backdrops.
239
+ > If this is not what you intend, you can make the overlays not nested, where opening one, closes the other.
240
+ > Fortunately, we also have a configuration option that simulates that behavior in the next section `isBlocking`.
241
+
242
+ The backdrop styling can be configured by targeting the `.global-overlays .global-overlays__backdrop` css selector.
243
+
244
+ The backdrop animation can be configured by targeting the
245
+ `.global-overlays .global-overlays__backdrop--animation-in` and
246
+ `.global-overlays .global-overlays__backdrop--animation-out` css selector.
247
+ This currently only supports CSS Animations, because it relies on the `animationend` event to add/remove classes.
248
+
249
+ ```js preview-story
250
+ export const hasBackdrop = () => {
251
+ const hasBackdropConfig = { hasBackdrop: true };
252
+ return html`
253
+ <demo-overlay-system .config=${hasBackdropConfig}>
254
+ <button slot="invoker">Click me to open the overlay!</button>
255
+ <div slot="content" class="demo-overlay">
256
+ Hello! You can close this notification here:
257
+ <button
258
+ class="close-button"
259
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
260
+ >
261
+ ⨯
262
+ </button>
263
+ </div>
264
+ </demo-overlay-system>
265
+ `;
266
+ };
267
+ ```
268
+
269
+ ## isBlocking
270
+
271
+ Boolean property. When true, will block other overlays.
272
+
273
+ ```js preview-story
274
+ export const isBlocking = () => {
275
+ const isBlockingConfig = { hasBackdrop: true, isBlocking: true };
276
+ return html`
277
+ <demo-overlay-system>
278
+ <button slot="invoker">Click me to open the overlay!</button>
279
+ <div slot="content" class="demo-overlay">
280
+ <div>
281
+ <demo-overlay-system .config=${isBlockingConfig}>
282
+ <button slot="invoker">Click me to open another overlay which is blocking</button>
283
+ <div slot="content" class="demo-overlay demo-overlay--blocking">
284
+ Hello! You can close this notification here:
285
+ <button
286
+ class="close-button"
287
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
288
+ >
289
+ ⨯
290
+ </button>
291
+ </div>
292
+ </demo-overlay-system>
293
+ </div>
294
+ Hello! You can close this notification here:
295
+ <button
296
+ class="close-button"
297
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
298
+ >
299
+ ⨯
300
+ </button>
301
+ </div>
302
+ </demo-overlay-system>
303
+ `;
304
+ };
305
+ ```
306
+
307
+ This example shows nested overlays, but they don't have to be. For example, they could be siblings, or completely unrelated.
308
+ When an overlay with `isBlocking` is opened, all other overlays are hidden by the `OverlaysManager`, which, as a global registry, is aware of all active overlays on the page.
309
+
310
+ ## preventsScroll
311
+
312
+ Boolean property. When true, prevents scrolling content that is outside of the `contentNode`.
313
+
314
+ ```js preview-story
315
+ export const preventsScroll = () => {
316
+ const preventsScrollConfig = { preventsScroll: true };
317
+ return html`
318
+ <demo-overlay-system .config=${preventsScrollConfig}>
319
+ <button slot="invoker">Click me to open the overlay!</button>
320
+ <div slot="content" class="demo-overlay">
321
+ Hello! You can close this notification here:
322
+ <button
323
+ class="close-button"
324
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
325
+ >
326
+ ⨯
327
+ </button>
328
+ </div>
329
+ </demo-overlay-system>
330
+ `;
331
+ };
332
+ ```
333
+
334
+ ## viewportConfig
335
+
336
+ Determines where the overlay is placed relative to the viewport. This can only be used in combination with a 'global' `placementMode`.
337
+
338
+ Options:
339
+
340
+ - 'top-left'
341
+ - 'top'
342
+ - 'top-right'
343
+ - 'right'
344
+ - 'bottom-left'
345
+ - 'bottom'
346
+ - 'bottom-right'
347
+ - 'left'
348
+ - 'center'
349
+
350
+ ```js preview-story
351
+ export const viewportConfig = () => {
352
+ const viewportConfig = {
353
+ placementMode: 'global',
354
+ viewportConfig: { placement: 'top-left' },
355
+ };
356
+ return html`
357
+ <demo-overlay-system .config=${viewportConfig}>
358
+ <button slot="invoker">Click me to open the overlay in the top left corner!</button>
359
+ <div slot="content" class="demo-overlay">
360
+ Hello! You can close this notification here:
361
+ <button
362
+ class="close-button"
363
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
364
+ >
365
+ ⨯
366
+ </button>
367
+ </div>
368
+ </demo-overlay-system>
369
+ `;
370
+ };
371
+ ```
372
+
373
+ ## popperConfig for local overlays (placementMode: 'local')
374
+
375
+ For locally DOM positioned overlays that position themselves relative to their invoker, we use [Popper.js](https://popper.js.org/) for positioning.
376
+
377
+ > In Popper, `contentNode` is often referred to as `popperElement`, and `invokerNode` is often referred to as the `referenceElement`.
378
+
379
+ Features:
380
+
381
+ - Everything Popper features!
382
+ - Currently eagerly loads popper if mode is local, in the constructor. Loading during idle time / using prefetch would be better, this is still WIP. PRs are welcome!
383
+
384
+ > Popper strictly is scoped on positioning. **It does not change the dimensions of the content node nor the invoker node**.
385
+ > This also means that if you use the arrow feature, you are in charge of styling it properly, use the data-popper-placement attribute for this.
386
+ > An example implementation can be found in [lion-tooltip](https://github.com/ing-bank/lion/blob/fbf0bd22378e76aa4261c2a97faf8be4f5fc461e/docs/components/tooltip/overview.md), where an arrow is set by default.
387
+
388
+ To override the default options we set for local mode, you add a `popperConfig` object to the config passed to the OverlayController.
389
+ Here's a succinct overview of some often used popper properties:
390
+
391
+ ```js preview-story
392
+ export const popperConfig = () => {
393
+ const popperConfig = {
394
+ placementMode: 'local',
395
+ popperConfig: {
396
+ /* Placement of content node, relative to invoker node */
397
+ placement: 'bottom-start',
398
+ positionFixed: true,
399
+ modifiers: [
400
+ /* When enabled, adds shifting/sliding behavior on secondary axis */
401
+ {
402
+ name: 'preventOverflow',
403
+ enabled: false,
404
+ options: {
405
+ boundariesElement: 'viewport',
406
+ /* When enabled, this is the <boundariesElement>-margin for the secondary axis */
407
+ padding: 32,
408
+ },
409
+ },
410
+ /* Use to adjust flipping behavior or constrain directions */
411
+ {
412
+ name: 'flip',
413
+ options: {
414
+ boundariesElement: 'viewport',
415
+ /* <boundariesElement>-margin for flipping on primary axis */
416
+ padding: 16,
417
+ },
418
+ },
419
+ /* When enabled, adds an offset to either primary or secondary axis */
420
+ {
421
+ name: 'offset',
422
+ options: {
423
+ /* margin between content node and invoker node */
424
+ offset: [0, 16],
425
+ },
426
+ },
427
+ ],
428
+ },
429
+ };
430
+ return html`
431
+ <style>
432
+ .demo-overlay {
433
+ background-color: white;
434
+ border: 1px solid black;
435
+ }
436
+ </style>
437
+ <demo-overlay-system .config=${popperConfig}>
438
+ <button slot="invoker">Click me to open the overlay!</button>
439
+ <div slot="content" class="demo-overlay">
440
+ Hello! You can close this notification here:
441
+ <button
442
+ class="close-button"
443
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
444
+ >
445
+ ⨯
446
+ </button>
447
+ </div>
448
+ </demo-overlay-system>
449
+ `;
450
+ };
451
+ ```
452
+
453
+ > Note: popperConfig reflects [Popper API](https://popper.js.org/docs/v2/)
@@ -0,0 +1,65 @@
1
+ # Systems >> Overlays >> Form Integrations ||60
2
+
3
+ ```js script
4
+ import { html } from '@mdjs/mdjs-preview';
5
+ import '@lion/ui/define/lion-input-datepicker.js';
6
+ import '@lion/ui/define/lion-listbox.js';
7
+ import '@lion/ui/define/lion-listbox.js';
8
+ import '@lion/ui/define/lion-select-rich.js';
9
+ import './assets/demo-overlay-system.js';
10
+ import './assets/applyDemoOverlayStyles.js';
11
+ ```
12
+
13
+ ## Select Rich
14
+
15
+ Opening a Rich Select inside a dialog.
16
+
17
+ ```js preview-story
18
+ export const selectRich = () => html`
19
+ <demo-overlay-system>
20
+ <button slot="invoker">Open Dialog</button>
21
+ <div slot="content" class="demo-overlay">
22
+ <h1>Select Rick example</h1>
23
+ <lion-select-rich name="favoriteColor" label="Favorite color">
24
+ <lion-option .choiceValue=${'red'}>Red</lion-option>
25
+ <lion-option .choiceValue=${'hotpink'} checked>Hotpink</lion-option>
26
+ <lion-option .choiceValue=${'teal'}>Teal</lion-option>
27
+ </lion-select-rich>
28
+ <p>
29
+ You can close this dialog here:
30
+ <button
31
+ class="close-button"
32
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
33
+ >
34
+ ⨯
35
+ </button>
36
+ </p>
37
+ </div>
38
+ </demo-overlay-system>
39
+ `;
40
+ ```
41
+
42
+ ## Input Datepicker
43
+
44
+ Opening an Input Datepicker inside a dialog.
45
+
46
+ ```js preview-story
47
+ export const inputDatepicker = () => html`
48
+ <demo-overlay-system>
49
+ <button slot="invoker">Open Dialog</button>
50
+ <div slot="content" class="demo-overlay">
51
+ <h1>Input Datepicker example</h1>
52
+ <lion-input-datepicker name="date" label="Date"></lion-input-datepicker>
53
+ <p>
54
+ You can close this dialog here:
55
+ <button
56
+ class="close-button"
57
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
58
+ >
59
+ ⨯
60
+ </button>
61
+ </p>
62
+ </div>
63
+ </demo-overlay-system>
64
+ `;
65
+ ```
@@ -0,0 +1,3 @@
1
+ # Systems >> Overlays ||40
2
+
3
+ -> go to Overview
@@ -0,0 +1,118 @@
1
+ # Systems >> Overlays >> Overview ||10
2
+
3
+ Supports different types of overlays like dialogs, toasts, tooltips, dropdown, etc.
4
+
5
+ Manages their position on the screen relative to other elements, including other overlays.
6
+
7
+ Its purpose is to make it easy to use our Overlay System declaratively. It can be easily extended where needed, to override event listeners and more.
8
+
9
+ See [lion-dialog](../../../components/dialog/overview.md) and [lion-tooltip](https://github.com/ing-bank/lion/blob/fbf0bd22378e76aa4261c2a97faf8be4f5fc461e/docs/components/tooltip/overview.md) for example Web Component implementations using the Overlay System.
10
+
11
+ ## Features
12
+
13
+ - local rendering (at dom location)
14
+ - positioning with popper.js
15
+ - global rendering (at body level)
16
+ - fully accessible
17
+ - flexible to build multiple overlay components
18
+ - lion-overlay web component:
19
+ - Show content when clicking the invoker
20
+ - Have a `.config` object to set or update the OverlayController's configuration
21
+ - [**OverlaysManager**](https://github.com/ing-bank/lion/blob/fbf0bd22378e76aa4261c2a97faf8be4f5fc461e/docs/fundamentals/systems/overlays/use-cases.md#overlaysmanager), a global repository keeping track of all different types of overlays
22
+ - [**OverlayController**](https://github.com/ing-bank/lion/blob/fbf0bd22378e76aa4261c2a97faf8be4f5fc461e/docs/fundamentals/systems/overlays/use-cases.md#overlaycontroller), a single controller class for handling overlays
23
+ - [**OverlayMixin**](https://github.com/ing-bank/lion/blob/fbf0bd22378e76aa4261c2a97faf8be4f5fc461e/docs/fundamentals/systems/overlays/use-cases.md#overlaymixin), a mixin that can be used to create webcomponents that use the OverlayController under the hood
24
+
25
+ Usually you will use `lion-dialog` (or `lion-tooltip` if this makes more sense).
26
+
27
+ ## Installation
28
+
29
+ ```bash
30
+ npm i --save @lion/ui
31
+ ```
32
+
33
+ ### Example
34
+
35
+ ```js
36
+ import '@lion/ui/define/lion-dialog.js';
37
+
38
+ html`
39
+ <lion-dialog .config=${{
40
+ placementMode: 'global',
41
+ viewportConfig: { placement: 'bottom-right' },
42
+ }}>
43
+ <div slot="content">
44
+ This is an overlay
45
+ <button
46
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
47
+ >x</button>
48
+ <div>
49
+ <button slot="invoker">
50
+ Click me
51
+ </button>
52
+ </lion-dialog>
53
+ `;
54
+ ```
55
+
56
+ Or by creating a controller yourself
57
+
58
+ ```js
59
+ import { OverlayController } from '@lion/ui/overlays.js';
60
+
61
+ const ctrl = new OverlayController({
62
+ ...withModalDialogConfig(),
63
+ invokerNode,
64
+ contentNode,
65
+ });
66
+ ```
67
+
68
+ Or creating your own Web Component which uses the Overlay System
69
+
70
+ ```js
71
+ import { LitElement, html } from 'lit';
72
+ import { OverlayMixin, withModalDialogConfig } from '@lion/ui/overlays.js';
73
+
74
+ class MyOverlayComponent extends OverlayMixin(LitElement) {
75
+ _defineOverlayConfig() {
76
+ return {
77
+ ...withModalDialogConfig(),
78
+ };
79
+ }
80
+
81
+ _setupOpenCloseListeners() {
82
+ super._setupOpenCloseListeners();
83
+ this.__toggle = () => {
84
+ this.opened = !this.opened;
85
+ };
86
+
87
+ if (this._overlayInvokerNode) {
88
+ this._overlayInvokerNode.addEventListener('click', this.__toggle);
89
+ }
90
+ }
91
+
92
+ _teardownOpenCloseListeners() {
93
+ super._teardownOpenCloseListeners();
94
+
95
+ if (this._overlayInvokerNode) {
96
+ this._overlayInvokerNode.removeEventListener('click', this.__toggle);
97
+ }
98
+ }
99
+
100
+ render() {
101
+ return html`
102
+ <slot name="invoker"></slot>
103
+ <div id="overlay-content-node-wrapper">
104
+ <slot name="content"></slot>
105
+ </div>
106
+ `;
107
+ }
108
+ }
109
+ ```
110
+
111
+ ## Rationales
112
+
113
+ Please check the [system rationals](https://github.com/ing-bank/lion/blob/fbf0bd22378e76aa4261c2a97faf8be4f5fc461e/docs/fundamentals/systems/overlays/rationale.md) folder, where we go more in-depth.
114
+
115
+ ### Aria roles
116
+
117
+ - No `aria-controls` as support for it is not quite there yet
118
+ - No `aria-haspopup`. People knowing the haspopup and hear about it don’t expect a dialog to open (at this moment in time) but expect a sub-menu. Until support for the dialog value has better implementation, it’s probably best to not use aria-haspopup on the element that opens the modal dialog.