@lion/ui 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/components/core/src/SlotMixin.js +180 -42
  2. package/components/core/test/SlotMixin.test.js +355 -145
  3. package/components/core/types/SlotMixinTypes.ts +12 -1
  4. package/components/input-tel/src/LionInputTel.js +0 -9
  5. package/components/input-tel-dropdown/src/LionInputTelDropdown.js +32 -29
  6. package/components/input-tel-dropdown/test-suites/LionInputTelDropdown.suite.js +5 -6
  7. package/components/localize/src/number/parseNumber.js +15 -36
  8. package/components/localize/test/number/parseNumber.test.js +3 -12
  9. package/components/localize/types/LocalizeMixinTypes.ts +1 -1
  10. package/custom-elements.json +1435 -133
  11. package/dist-types/components/calendar/src/LionCalendar.d.ts +1 -37
  12. package/dist-types/components/calendar/src/LionCalendar.d.ts.map +1 -1
  13. package/dist-types/components/core/src/SlotMixin.d.ts +2 -0
  14. package/dist-types/components/core/src/SlotMixin.d.ts.map +1 -1
  15. package/dist-types/components/core/test/SlotMixin.test.d.ts +1 -1
  16. package/dist-types/components/core/test/SlotMixin.test.d.ts.map +1 -1
  17. package/dist-types/components/core/types/SlotMixinTypes.d.ts +9 -1
  18. package/dist-types/components/core/types/SlotMixinTypes.d.ts.map +1 -1
  19. package/dist-types/components/input-amount/src/LionInputAmount.d.ts +1 -37
  20. package/dist-types/components/input-amount/src/LionInputAmount.d.ts.map +1 -1
  21. package/dist-types/components/input-date/src/LionInputDate.d.ts +1 -37
  22. package/dist-types/components/input-date/src/LionInputDate.d.ts.map +1 -1
  23. package/dist-types/components/input-datepicker/src/LionCalendarOverlayFrame.d.ts +1 -37
  24. package/dist-types/components/input-datepicker/src/LionCalendarOverlayFrame.d.ts.map +1 -1
  25. package/dist-types/components/input-email/src/LionInputEmail.d.ts +1 -37
  26. package/dist-types/components/input-email/src/LionInputEmail.d.ts.map +1 -1
  27. package/dist-types/components/input-iban/src/LionInputIban.d.ts +1 -37
  28. package/dist-types/components/input-iban/src/LionInputIban.d.ts.map +1 -1
  29. package/dist-types/components/input-tel/src/LionInputTel.d.ts +1 -42
  30. package/dist-types/components/input-tel/src/LionInputTel.d.ts.map +1 -1
  31. package/dist-types/components/input-tel-dropdown/src/LionInputTelDropdown.d.ts +14 -8
  32. package/dist-types/components/input-tel-dropdown/src/LionInputTelDropdown.d.ts.map +1 -1
  33. package/dist-types/components/input-tel-dropdown/test-suites/LionInputTelDropdown.suite.d.ts.map +1 -1
  34. package/dist-types/components/localize/src/LocalizeMixin.d.ts +1 -37
  35. package/dist-types/components/localize/src/LocalizeMixin.d.ts.map +1 -1
  36. package/dist-types/components/localize/src/number/parseNumber.d.ts.map +1 -1
  37. package/dist-types/components/localize/types/LocalizeMixinTypes.d.ts +1 -1
  38. package/dist-types/components/localize/types/LocalizeMixinTypes.d.ts.map +1 -1
  39. package/dist-types/components/pagination/src/LionPagination.d.ts +1 -37
  40. package/dist-types/components/pagination/src/LionPagination.d.ts.map +1 -1
  41. package/dist-types/components/progress-indicator/src/LionProgressIndicator.d.ts +1 -37
  42. package/dist-types/components/progress-indicator/src/LionProgressIndicator.d.ts.map +1 -1
  43. package/dist-types/exports/core.d.ts +1 -0
  44. package/dist-types/exports/core.d.ts.map +1 -1
  45. package/dist-types/exports/form-core.d.ts +2 -0
  46. package/dist-types/exports/form-core.d.ts.map +1 -1
  47. package/dist-types/exports/input-tel-dropdown.d.ts +2 -0
  48. package/dist-types/exports/input-tel-dropdown.d.ts.map +1 -1
  49. package/dist-types/exports/input-tel.d.ts +1 -0
  50. package/dist-types/exports/input-tel.d.ts.map +1 -1
  51. package/dist-types/exports/localize.d.ts +3 -0
  52. package/dist-types/exports/localize.d.ts.map +1 -1
  53. package/dist-types/exports/overlays.d.ts +4 -0
  54. package/dist-types/exports/overlays.d.ts.map +1 -1
  55. package/dist-types/tsconfig.tsbuildinfo +1 -1
  56. package/docs/components/accordion/index.md +3 -0
  57. package/docs/components/accordion/overview.md +129 -0
  58. package/docs/components/accordion/reference.md +47 -0
  59. package/docs/components/accordion/use-cases.md +252 -0
  60. package/docs/components/button/examples.md +30 -0
  61. package/docs/components/button/index.md +3 -0
  62. package/docs/components/button/overview.md +30 -0
  63. package/docs/components/button/src/icon.svg.js +5 -0
  64. package/docs/components/button/use-cases.md +106 -0
  65. package/docs/components/calendar/index.md +3 -0
  66. package/docs/components/calendar/overview.md +49 -0
  67. package/docs/components/calendar/use-cases.md +192 -0
  68. package/docs/components/checkbox-group/index.md +3 -0
  69. package/docs/components/checkbox-group/overview.md +40 -0
  70. package/docs/components/checkbox-group/use-cases.md +256 -0
  71. package/docs/components/collapsible/assets/CustomCollapsible.js +113 -0
  72. package/docs/components/collapsible/assets/applyDemoCollapsibleStyles.js +37 -0
  73. package/docs/components/collapsible/examples.md +83 -0
  74. package/docs/components/collapsible/index.md +3 -0
  75. package/docs/components/collapsible/overview.md +39 -0
  76. package/docs/components/collapsible/use-cases.md +79 -0
  77. package/docs/components/combobox/examples.md +153 -0
  78. package/docs/components/combobox/index.md +3 -0
  79. package/docs/components/combobox/overview.md +51 -0
  80. package/docs/components/combobox/src/LinkMixin.js +60 -0
  81. package/docs/components/combobox/src/demo-selection-display.js +191 -0
  82. package/docs/components/combobox/src/gh-combobox/gh-button.js +69 -0
  83. package/docs/components/combobox/src/gh-combobox/gh-combobox.js +508 -0
  84. package/docs/components/combobox/src/google-combobox/assets/google-clear-icon.js +9 -0
  85. package/docs/components/combobox/src/google-combobox/assets/google-search-icon.js +9 -0
  86. package/docs/components/combobox/src/google-combobox/assets/google-voice-search-icon.js +19 -0
  87. package/docs/components/combobox/src/google-combobox/assets/googlelogo_color_272x92dp.png +0 -0
  88. package/docs/components/combobox/src/google-combobox/google-combobox.js +460 -0
  89. package/docs/components/combobox/src/lazyRender.js +29 -0
  90. package/docs/components/combobox/src/levenshtein.js +95 -0
  91. package/docs/components/combobox/src/md-combobox/MdFieldMixin.js +341 -0
  92. package/docs/components/combobox/src/md-combobox/md-combobox.js +89 -0
  93. package/docs/components/combobox/src/md-combobox/md-input.js +5 -0
  94. package/docs/components/combobox/src/md-combobox/style/load-roboto.js +6 -0
  95. package/docs/components/combobox/src/md-combobox/style/md-ripple.js +81 -0
  96. package/docs/components/combobox/src/wa-combobox/wa-combobox.js +368 -0
  97. package/docs/components/combobox/use-cases.md +377 -0
  98. package/docs/components/dialog/index.md +3 -0
  99. package/docs/components/dialog/overview.md +63 -0
  100. package/docs/components/dialog/src/demo-dialog-style.js +3 -0
  101. package/docs/components/dialog/src/demoStyle.js +39 -0
  102. package/docs/components/dialog/src/slots-dialog-content.js +32 -0
  103. package/docs/components/dialog/src/styled-dialog-content.js +38 -0
  104. package/docs/components/dialog/use-cases.md +154 -0
  105. package/docs/components/drawer/index.md +3 -0
  106. package/docs/components/drawer/overview.md +68 -0
  107. package/docs/components/drawer/src/demoStyle.js +71 -0
  108. package/docs/components/drawer/use-cases.md +194 -0
  109. package/docs/components/fieldset/index.md +3 -0
  110. package/docs/components/fieldset/overview.md +49 -0
  111. package/docs/components/fieldset/use-cases.md +185 -0
  112. package/docs/components/form/index.md +3 -0
  113. package/docs/components/form/overview.md +43 -0
  114. package/docs/components/form/use-cases.md +72 -0
  115. package/docs/components/icon/assets/bugs/bug01.svg.js +2 -0
  116. package/docs/components/icon/assets/bugs/bug02.svg.js +2 -0
  117. package/docs/components/icon/assets/bugs/bug05.svg.js +2 -0
  118. package/docs/components/icon/assets/bugs/bug06.svg.js +2 -0
  119. package/docs/components/icon/assets/bugs/bug08.svg.js +2 -0
  120. package/docs/components/icon/assets/bugs/bug12.svg.js +2 -0
  121. package/docs/components/icon/assets/bugs/bug19.svg.js +2 -0
  122. package/docs/components/icon/assets/bugs/bug23.svg.js +2 -0
  123. package/docs/components/icon/assets/bugs/bug24.svg.js +2 -0
  124. package/docs/components/icon/assets/iconset-bugs.js +11 -0
  125. package/docs/components/icon/assets/iconset-misc.js +3 -0
  126. package/docs/components/icon/assets/iconset-space.js +31 -0
  127. package/docs/components/icon/assets/misc/arrowLeft.svg.js +6 -0
  128. package/docs/components/icon/assets/space/aliens-spaceship.svg.js +2 -0
  129. package/docs/components/icon/assets/space/meteor.svg.js +2 -0
  130. package/docs/components/icon/assets/space/moon-flag.svg.js +2 -0
  131. package/docs/components/icon/assets/space/moon.svg.js +2 -0
  132. package/docs/components/icon/assets/space/night.svg.js +2 -0
  133. package/docs/components/icon/assets/space/orbit.svg.js +2 -0
  134. package/docs/components/icon/assets/space/planet.svg.js +2 -0
  135. package/docs/components/icon/assets/space/robot.svg.js +2 -0
  136. package/docs/components/icon/assets/space/rocket.svg.js +2 -0
  137. package/docs/components/icon/assets/space/satellite.svg.js +2 -0
  138. package/docs/components/icon/assets/space/signal.svg.js +2 -0
  139. package/docs/components/icon/assets/space/space-helmet.svg.js +2 -0
  140. package/docs/components/icon/assets/space/sun.svg.js +2 -0
  141. package/docs/components/icon/assets/space/telescope.svg.js +2 -0
  142. package/docs/components/icon/index.md +3 -0
  143. package/docs/components/icon/overview.md +40 -0
  144. package/docs/components/icon/use-cases.md +93 -0
  145. package/docs/components/index.md +7 -0
  146. package/docs/components/input/index.md +3 -0
  147. package/docs/components/input/overview.md +36 -0
  148. package/docs/components/input/use-cases.md +77 -0
  149. package/docs/components/input-amount/index.md +3 -0
  150. package/docs/components/input-amount/overview.md +49 -0
  151. package/docs/components/input-amount/use-cases.md +122 -0
  152. package/docs/components/input-date/index.md +3 -0
  153. package/docs/components/input-date/overview.md +39 -0
  154. package/docs/components/input-date/use-cases.md +83 -0
  155. package/docs/components/input-datepicker/index.md +3 -0
  156. package/docs/components/input-datepicker/overview.md +42 -0
  157. package/docs/components/input-datepicker/use-cases.md +78 -0
  158. package/docs/components/input-email/index.md +3 -0
  159. package/docs/components/input-email/overview.md +32 -0
  160. package/docs/components/input-email/use-cases.md +48 -0
  161. package/docs/components/input-iban/index.md +3 -0
  162. package/docs/components/input-iban/overview.md +37 -0
  163. package/docs/components/input-iban/use-cases.md +102 -0
  164. package/docs/components/input-range/index.md +3 -0
  165. package/docs/components/input-range/overview.md +34 -0
  166. package/docs/components/input-range/use-cases.md +108 -0
  167. package/docs/components/input-stepper/index.md +3 -0
  168. package/docs/components/input-stepper/overview.md +36 -0
  169. package/docs/components/input-stepper/use-cases.md +41 -0
  170. package/docs/components/input-tel/index.md +3 -0
  171. package/docs/components/input-tel/overview.md +62 -0
  172. package/docs/components/input-tel/src/h-region-code-table.js +109 -0
  173. package/docs/components/input-tel/use-cases.md +307 -0
  174. package/docs/components/input-tel-dropdown/examples.md +32 -0
  175. package/docs/components/input-tel-dropdown/index.md +3 -0
  176. package/docs/components/input-tel-dropdown/overview.md +38 -0
  177. package/docs/components/input-tel-dropdown/src/intl-input-tel-dropdown.js +127 -0
  178. package/docs/components/input-tel-dropdown/use-cases.md +159 -0
  179. package/docs/components/listbox/index.md +3 -0
  180. package/docs/components/listbox/overview.md +42 -0
  181. package/docs/components/listbox/src/listboxData.js +65 -0
  182. package/docs/components/listbox/use-cases.md +147 -0
  183. package/docs/components/pagination/index.md +3 -0
  184. package/docs/components/pagination/overview.md +29 -0
  185. package/docs/components/pagination/use-cases.md +99 -0
  186. package/docs/components/progress-indicator/assets/my-determinate-progress-bar.js +30 -0
  187. package/docs/components/progress-indicator/assets/my-indeterminate-progress-spinner.js +55 -0
  188. package/docs/components/progress-indicator/examples.md +125 -0
  189. package/docs/components/progress-indicator/index.md +3 -0
  190. package/docs/components/progress-indicator/overview.md +36 -0
  191. package/docs/components/radio-group/index.md +3 -0
  192. package/docs/components/radio-group/overview.md +46 -0
  193. package/docs/components/radio-group/use-cases.md +140 -0
  194. package/docs/components/select/index.md +3 -0
  195. package/docs/components/select/overview.md +44 -0
  196. package/docs/components/select/use-cases.md +55 -0
  197. package/docs/components/select-rich/examples.md +31 -0
  198. package/docs/components/select-rich/index.md +3 -0
  199. package/docs/components/select-rich/overview.md +46 -0
  200. package/docs/components/select-rich/src/flagStyles.js +1250 -0
  201. package/docs/components/select-rich/src/flags.png +0 -0
  202. package/docs/components/select-rich/src/flags@2x.png +0 -0
  203. package/docs/components/select-rich/src/intl-select-rich.js +194 -0
  204. package/docs/components/select-rich/src/regionMetaList.js +1717 -0
  205. package/docs/components/select-rich/use-cases.md +370 -0
  206. package/docs/components/steps/index.md +3 -0
  207. package/docs/components/steps/overview.md +63 -0
  208. package/docs/components/steps/use-cases.md +163 -0
  209. package/docs/components/switch/index.md +3 -0
  210. package/docs/components/switch/overview.md +75 -0
  211. package/docs/components/switch/reference.md +39 -0
  212. package/docs/components/switch/use-cases.md +76 -0
  213. package/docs/components/tabs/examples.md +23 -0
  214. package/docs/components/tabs/index.md +3 -0
  215. package/docs/components/tabs/overview.md +48 -0
  216. package/docs/components/tabs/src/lea-tab-panel.js +24 -0
  217. package/docs/components/tabs/src/lea-tab.js +45 -0
  218. package/docs/components/tabs/src/lea-tabs.js +28 -0
  219. package/docs/components/tabs/use-cases.md +219 -0
  220. package/docs/components/textarea/index.md +3 -0
  221. package/docs/components/textarea/overview.md +35 -0
  222. package/docs/components/textarea/use-cases.md +95 -0
  223. package/docs/components/tooltip/examples.md +39 -0
  224. package/docs/components/tooltip/index.md +3 -0
  225. package/docs/components/tooltip/overview.md +44 -0
  226. package/docs/components/tooltip/use-cases.md +208 -0
  227. package/docs/fundamentals/index.md +19 -0
  228. package/docs/fundamentals/node-tools/babel-plugin-extend-docs/index.md +1 -0
  229. package/docs/fundamentals/node-tools/babel-plugin-extend-docs/overview.md +233 -0
  230. package/docs/fundamentals/node-tools/index.md +1 -0
  231. package/docs/fundamentals/node-tools/providence-analytics/LocalConfiguration.md +68 -0
  232. package/docs/fundamentals/node-tools/providence-analytics/QueryResult.md +111 -0
  233. package/docs/fundamentals/node-tools/providence-analytics/analyzer.md +69 -0
  234. package/docs/fundamentals/node-tools/providence-analytics/assets/_mermaid.svg.js +1202 -0
  235. package/docs/fundamentals/node-tools/providence-analytics/dashboard.md +22 -0
  236. package/docs/fundamentals/node-tools/providence-analytics/index.md +1 -0
  237. package/docs/fundamentals/node-tools/providence-analytics/overview.md +192 -0
  238. package/docs/fundamentals/node-tools/publish-docs/index.md +1 -0
  239. package/docs/fundamentals/node-tools/publish-docs/overview.md +136 -0
  240. package/docs/fundamentals/node-tools/remark-extend/index.md +1 -0
  241. package/docs/fundamentals/node-tools/remark-extend/overview.md +274 -0
  242. package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/index.md +1 -0
  243. package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/overview.md +285 -0
  244. package/docs/fundamentals/rationales/TypeScript.md +18 -0
  245. package/docs/fundamentals/rationales/index.md +1 -0
  246. package/docs/fundamentals/rationales/side-effects.md +203 -0
  247. package/docs/fundamentals/rationales/versioning.md +35 -0
  248. package/docs/fundamentals/systems/core/index.md +3 -0
  249. package/docs/fundamentals/systems/core/overview.md +85 -0
  250. package/docs/fundamentals/systems/form/assets/FormatMixinDiagram-1.svg +1 -0
  251. package/docs/fundamentals/systems/form/assets/FormatMixinDiagram-2.svg +1 -0
  252. package/docs/fundamentals/systems/form/assets/FormatMixinDiagram-3.svg +84 -0
  253. package/docs/fundamentals/systems/form/assets/h-output.js +155 -0
  254. package/docs/fundamentals/systems/form/formatting-and-parsing.md +245 -0
  255. package/docs/fundamentals/systems/form/index.md +3 -0
  256. package/docs/fundamentals/systems/form/interaction-states.md +177 -0
  257. package/docs/fundamentals/systems/form/model-value.md +35 -0
  258. package/docs/fundamentals/systems/form/overview.md +82 -0
  259. package/docs/fundamentals/systems/form/styling.md +101 -0
  260. package/docs/fundamentals/systems/form/use-cases.md +156 -0
  261. package/docs/fundamentals/systems/form/validate.md +929 -0
  262. package/docs/fundamentals/systems/icon/index.md +3 -0
  263. package/docs/fundamentals/systems/icon/overview.md +124 -0
  264. package/docs/fundamentals/systems/index.md +1 -0
  265. package/docs/fundamentals/systems/localize/assets/all-locales.js +437 -0
  266. package/docs/fundamentals/systems/localize/assets/en-AU.js +6 -0
  267. package/docs/fundamentals/systems/localize/assets/en-GB.js +6 -0
  268. package/docs/fundamentals/systems/localize/assets/en-US.js +6 -0
  269. package/docs/fundamentals/systems/localize/assets/en.js +4 -0
  270. package/docs/fundamentals/systems/localize/assets/nl-BE.js +6 -0
  271. package/docs/fundamentals/systems/localize/assets/nl-NL.js +6 -0
  272. package/docs/fundamentals/systems/localize/assets/nl.js +4 -0
  273. package/docs/fundamentals/systems/localize/dates.md +195 -0
  274. package/docs/fundamentals/systems/localize/index.md +3 -0
  275. package/docs/fundamentals/systems/localize/numbers.md +217 -0
  276. package/docs/fundamentals/systems/localize/overview.md +48 -0
  277. package/docs/fundamentals/systems/localize/rationale.md +62 -0
  278. package/docs/fundamentals/systems/localize/text.md +125 -0
  279. package/docs/fundamentals/systems/localize/use-cases.md +319 -0
  280. package/docs/fundamentals/systems/overlays/assets/applyDemoOverlayStyles.js +22 -0
  281. package/docs/fundamentals/systems/overlays/assets/demo-overlay-backdrop.js +48 -0
  282. package/docs/fundamentals/systems/overlays/assets/demo-overlay-system.js +42 -0
  283. package/docs/fundamentals/systems/overlays/assets/umbrella-form.js +133 -0
  284. package/docs/fundamentals/systems/overlays/configuration.md +453 -0
  285. package/docs/fundamentals/systems/overlays/form-integration.md +65 -0
  286. package/docs/fundamentals/systems/overlays/index.md +3 -0
  287. package/docs/fundamentals/systems/overlays/overview.md +118 -0
  288. package/docs/fundamentals/systems/overlays/rationale.md +232 -0
  289. package/docs/fundamentals/systems/overlays/scope.md +176 -0
  290. package/docs/fundamentals/systems/overlays/use-cases.md +699 -0
  291. package/docs/fundamentals/tools/ajax/assets/naga.json +9 -0
  292. package/docs/fundamentals/tools/ajax/assets/pabu.json +9 -0
  293. package/docs/fundamentals/tools/ajax/index.md +3 -0
  294. package/docs/fundamentals/tools/ajax/overview.md +128 -0
  295. package/docs/fundamentals/tools/ajax/use-cases.md +456 -0
  296. package/docs/fundamentals/tools/helpers/action-logger.md +165 -0
  297. package/docs/fundamentals/tools/helpers/index.md +3 -0
  298. package/docs/fundamentals/tools/helpers/overview.md +30 -0
  299. package/docs/fundamentals/tools/index.md +1 -0
  300. package/docs/fundamentals/tools/singleton-manager/index.md +3 -0
  301. package/docs/fundamentals/tools/singleton-manager/overview.md +304 -0
  302. package/docs/guides/how-to/create-a-custom-field.md +200 -0
  303. package/docs/guides/how-to/extend-a-native-input.md +66 -0
  304. package/docs/guides/how-to/get-started.md +77 -0
  305. package/docs/guides/how-to/index.md +1 -0
  306. package/docs/guides/index.md +34 -0
  307. package/docs/guides/principles/definitions-and-terms.md +41 -0
  308. package/docs/guides/principles/index.md +26 -0
  309. package/docs/guides/principles/scoped-elements.md +103 -0
  310. package/docs/guides/principles/styling.md +32 -0
  311. package/docs/guides/principles/subclasser-apis.md +28 -0
  312. package/docs/override.js +15 -0
  313. package/exports/core.js +2 -0
  314. package/exports/form-core.js +3 -0
  315. package/exports/input-tel-dropdown.js +3 -0
  316. package/exports/input-tel.js +2 -0
  317. package/exports/localize.js +4 -0
  318. package/exports/overlays.js +5 -0
  319. package/package.json +3 -2
@@ -0,0 +1,699 @@
1
+ # Systems >> Overlays >> Use Cases ||20
2
+
3
+ ```js script
4
+ import { html, render, LitElement } from '@mdjs/mdjs-preview';
5
+ import { renderLitAsNode } from '@lion/ui/helpers.js';
6
+ import {
7
+ ArrowMixin,
8
+ OverlayMixin,
9
+ withBottomSheetConfig,
10
+ withDropdownConfig,
11
+ withModalDialogConfig,
12
+ } from '@lion/ui/overlays.js';
13
+
14
+ import './assets/demo-overlay-system.js';
15
+ import './assets/demo-overlay-backdrop.js';
16
+ import './assets/applyDemoOverlayStyles.js';
17
+ import { ref, createRef } from 'lit/directives/ref.js';
18
+ ```
19
+
20
+ The overlay system allows to create different types of overlays like dialogs, toasts, tooltips, dropdown, etc.
21
+ It's designed to be highly flexible, while still delivering sensible defaults.
22
+ On top of this, the system was built having accessibility in mind.
23
+
24
+ For a detailed rationale, please consult [Rationale](https://github.com/ing-bank/lion/blob/edc6920a90aa7658358819e7c324daf6badf7d30/docs/fundamentals/systems/overlays/rationale.md).
25
+
26
+ ```js preview-story
27
+ export const main = () => html`
28
+ <demo-overlay-system>
29
+ <button slot="invoker">Click me to open the overlay!</button>
30
+ <div slot="content" class="demo-overlay">
31
+ Hello! You can close this notification here:
32
+ <button @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}>
33
+ ⨯
34
+ </button>
35
+ </div>
36
+ </demo-overlay-system>
37
+ `;
38
+ ```
39
+
40
+ ## OverlayController
41
+
42
+ OverlayController is the single class we instantiate whenever creating an overlay instance.
43
+ Based on provided config, it will handle:
44
+
45
+ - DOM position (local vs global)
46
+ - positioning logic
47
+ - accessibility
48
+ - interaction patterns
49
+
50
+ and has the following public functions:
51
+
52
+ - **show()**, to show the overlay
53
+ - **hide()**, to hide the overlay
54
+ - **toggle()**, to toggle between show and hide
55
+
56
+ All overlays contain an invokerNode and a contentNode
57
+
58
+ - **contentNode**, the toggleable content of the overlay.
59
+ - **invokerNode**, the element toggles the visibility of the content. For local overlays, this is the relative element the content is positioned to
60
+
61
+ > Make sure you pass a DOM-connected contentNode, an offline rendered (e.g. with just `document.createElement` or `renderLitAsNode`) will not work, because then we cannot determine the renderTarget to render the content to.
62
+
63
+ For DOM position, local refers to overlays where the content is positioned next to the invokers they are related to, DOM-wise.
64
+ Global refers to overlays where the content is positioned in a global root node at the bottom of `<body>`.
65
+
66
+ ## Configuration
67
+
68
+ Overlays can be configured in many ways to suit your needs. We go in-depth into each option in the Overlay System - Configuration chapter.
69
+
70
+ We also export a few [preset configuration objects](https://github.com/ing-bank/lion/blob/edc6920a90aa7658358819e7c324daf6badf7d30/docs/fundamentals/systems/overlays/configuration.md).
71
+
72
+ - withModalDialogConfig
73
+ - withDropdownConfig
74
+ - withBottomSheetConfig
75
+
76
+ You import these using ES Modules, and then simply call them inside your `OverlayController` instantiation:
77
+
78
+ ```js
79
+ const ctrl = new OverlayController({
80
+ ...withModalDialogConfig(),
81
+ invokerNode,
82
+ contentNode,
83
+ });
84
+ ```
85
+
86
+ or in your Web Component with `OverlayMixin`, make sure you override these methods to:
87
+
88
+ - Define configuration
89
+ - Handle setting up event listeners of toggling the opened state of your overlay
90
+ - Handle the tearing down of those event listeners
91
+ - Define a template which includes:
92
+ - invoker slot for your user to provide the invoker node (the element that invokes the overlay content)
93
+ - content slot for your user to provide the content that shows when the overlay is opened,
94
+ make sure to put it inside a div with id `overlay-content-node-wrapper` which is necessary for positioning logic to work properly.
95
+
96
+ ```js
97
+ _defineOverlayConfig() {
98
+ return {
99
+ ...withModalDialogConfig
100
+ };
101
+ }
102
+
103
+ _setupOpenCloseListeners() {
104
+ super._setupOpenCloseListeners();
105
+ this.__toggle = () => {
106
+ this.opened = !this.opened;
107
+ };
108
+
109
+ if (this._overlayInvokerNode) {
110
+ this._overlayInvokerNode.addEventListener('click', this.__toggle);
111
+ }
112
+ }
113
+
114
+ _teardownOpenCloseListeners() {
115
+ super._teardownOpenCloseListeners();
116
+
117
+ if (this._overlayInvokerNode) {
118
+ this._overlayInvokerNode.removeEventListener('click', this.__toggle);
119
+ }
120
+ }
121
+
122
+ render() {
123
+ return html`
124
+ <slot name="invoker"></slot>
125
+ <div id="overlay-content-node-wrapper">
126
+ <slot name="content"></slot>
127
+ </div>
128
+ `;
129
+ }
130
+ ```
131
+
132
+ or declaratively in your template with the `.config` property
133
+
134
+ ```html
135
+ <demo-overlay-system .config=${{ ...withModalDialogConfig() }}>
136
+ <button slot="invoker">Click me to open the overlay!</button>
137
+ <div slot="content" class="demo-overlay">
138
+ Hello! You can close this notification here:
139
+ <button
140
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
141
+ >
142
+ ⨯
143
+ </button>
144
+ </div>
145
+ </demo-overlay-system>
146
+ ```
147
+
148
+ ### Backdrop
149
+
150
+ There are multiple ways to pass a backdrop node for your overlay.
151
+
152
+ The easiest way is declarative. This can be achieved by adding a `<slot name="backdrop">` to your `render` method. The component user can then insert a backdrop slottable declaratively:
153
+
154
+ ```js preview-story
155
+ export const backdrop = () => {
156
+ const responsiveModalDialogConfig = { ...withModalDialogConfig() };
157
+ return html`
158
+ <demo-overlay-system .config=${responsiveModalDialogConfig}>
159
+ <demo-overlay-backdrop slot="backdrop"></demo-overlay-backdrop>
160
+ <button slot="invoker">Click me to open the overlay!</button>
161
+ <div slot="content" class="demo-overlay">
162
+ Hello! You can close this notification here:
163
+ <button
164
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
165
+ >
166
+ ⨯
167
+ </button>
168
+ </div>
169
+ </demo-overlay-system>
170
+ `;
171
+ };
172
+ ```
173
+
174
+ You can also pass a backdropNode imperatively to the OverlayConfig. Either use `hasBackdrop: true`, which will spawn a default `backdropNode`.
175
+ For more control, pass a `backdropNode` yourself, e.g. a webcomponent so you can easily encapsulate styles.
176
+
177
+ ```js preview-story
178
+ export const backdropImperative = () => {
179
+ const backdropNode = document.createElement('demo-overlay-backdrop');
180
+ const responsiveModalDialogConfig = { ...withModalDialogConfig(), backdropNode };
181
+ return html`
182
+ <demo-overlay-system .config=${responsiveModalDialogConfig}>
183
+ <button slot="invoker">Click me to open the overlay!</button>
184
+ <div slot="content" class="demo-overlay">
185
+ Hello! You can close this notification here:
186
+ <button
187
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
188
+ >
189
+ ⨯
190
+ </button>
191
+ </div>
192
+ </demo-overlay-system>
193
+ `;
194
+ };
195
+ ```
196
+
197
+ #### Backdrop animation
198
+
199
+ By default our overlay system comes with a backdrop animation.
200
+ This will add `global-overlays__backdrop--animation-in` and `global-overlays__backdrop--animation-out` classes to your backdrop node.
201
+ If you have `placementMode: 'local'` it will replace those `global` strings in the CSS classes with `local`.
202
+
203
+ It expects from you that you act on these classes in your CSS with an animation. For example if you have your own backdrop webcomponent (to encapsulate styles):
204
+
205
+ ```css
206
+ :host(.local-overlays__backdrop--animation-in) {
207
+ animation: local-overlays-backdrop-fade-in 300ms;
208
+ }
209
+
210
+ :host(.local-overlays__backdrop--animation-out) {
211
+ animation: local-overlays-backdrop-fade-out 300ms;
212
+ opacity: 0;
213
+ }
214
+
215
+ @keyframes local-overlays-backdrop-fade-in {
216
+ from {
217
+ opacity: 0;
218
+ }
219
+ }
220
+
221
+ @keyframes local-overlays-backdrop-fade-out {
222
+ from {
223
+ opacity: 0.3;
224
+ }
225
+ }
226
+ ```
227
+
228
+ Under the hood, the OverlayController listens to `animationend` event, only then it will remove the animation-out/animation-in classes.
229
+
230
+ > If you don't intend on having a backdrop animation at all, as a subclasser you should override `transitionHide` and `transitionShow` OverlayMixin methods.
231
+ > Otherwise the `hide` will await an `animationend` event that will never happen.
232
+
233
+ ```js preview-story
234
+ export const backdropAnimation = () => {
235
+ const responsiveModalDialogConfig = { ...withModalDialogConfig() };
236
+ return html`
237
+ <demo-overlay-system .config=${responsiveModalDialogConfig}>
238
+ <button slot="invoker">Click me to open the overlay!</button>
239
+ <demo-overlay-backdrop slot="backdrop"></demo-overlay-backdrop>
240
+ <div slot="content" class="demo-overlay">
241
+ Hello! You can close this notification here:
242
+ <button
243
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
244
+ >
245
+ ⨯
246
+ </button>
247
+ </div>
248
+ </demo-overlay-system>
249
+ `;
250
+ };
251
+ ```
252
+
253
+ ### Responsive switching
254
+
255
+ Currently we support switching between overlay configurations.
256
+ Keep in mind however that we do not yet support switching between overlay configurations while the content is shown.
257
+ If you try, it will close the content if it is open, and the user will need to re-open.
258
+ Will be supported in the near future.
259
+
260
+ This can be done declaratively as shown below.
261
+ Drag the viewport under 600px and open the overlay to see the `withBottomSheetConfig` applied.
262
+
263
+ ```js preview-story
264
+ export const responsiveSwitching = () => {
265
+ const responsiveBottomSheetConfig = { ...withBottomSheetConfig() };
266
+ return html`
267
+ <demo-overlay-system
268
+ .config=${responsiveBottomSheetConfig}
269
+ @before-opened=${e => {
270
+ if (window.innerWidth >= 600) {
271
+ e.target.config = { ...withModalDialogConfig() };
272
+ } else {
273
+ e.target.config = { ...withBottomSheetConfig() };
274
+ }
275
+ }}
276
+ >
277
+ <button slot="invoker">Click me to open the overlay!</button>
278
+ <div slot="content" class="demo-overlay">
279
+ Hello! You can close this notification here:
280
+ <button
281
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
282
+ >
283
+ ⨯
284
+ </button>
285
+ </div>
286
+ </demo-overlay-system>
287
+ `;
288
+ };
289
+ ```
290
+
291
+ Alternative ways to do it is by setting the event listener manually on the `OverlayController` instance.
292
+
293
+ ```js
294
+ myOverlayCtrl.addEventListener('before-show', () => {
295
+ if (window.innerWidth >= 600) {
296
+ ctrl.updateConfig(withModalDialogConfig());
297
+ } else {
298
+ ctrl.updateConfig(withBottomSheetConfig());
299
+ }
300
+ });
301
+ ```
302
+
303
+ Or inside of a Web Component that uses the `OverlayMixin`, by overriding protected method `_defineOverlay`,
304
+ where we can access the OverlayController instance and use the `updateConfig` method on the controller:
305
+
306
+ ```js
307
+ _defineOverlay({ invokerNode, contentNode }) {
308
+
309
+ // initial
310
+ const ctrl = new OverlayController({
311
+ ...withBottomSheetConfig(),
312
+ hidesOnOutsideClick: true,
313
+ invokerNode,
314
+ contentNode,
315
+ });
316
+
317
+ // responsive
318
+ ctrl.addEventListener('before-show', () => {
319
+ if (window.innerWidth >= 600) {
320
+ ctrl.updateConfig(withModalDialogConfig());
321
+ } else {
322
+ ctrl.updateConfig(withBottomSheetConfig());
323
+ }
324
+ });
325
+
326
+ return ctrl;
327
+ ```
328
+
329
+ Below is another demo where you can toggle between configurations using buttons.
330
+
331
+ ```js preview-story
332
+ export const responsiveSwitching2 = () => html`
333
+ <style>
334
+ .demo-overlay {
335
+ background-color: white;
336
+ border: 1px solid black;
337
+ }
338
+ </style>
339
+ Change config to:
340
+ <button
341
+ @click=${e => {
342
+ e.target.parentElement.querySelector('#respSwitchOverlay').config = {
343
+ ...withModalDialogConfig(),
344
+ };
345
+ }}
346
+ >
347
+ Modal Dialog
348
+ </button>
349
+ <button
350
+ @click=${e => {
351
+ e.target.parentElement.querySelector('#respSwitchOverlay').config = {
352
+ ...withBottomSheetConfig(),
353
+ };
354
+ }}
355
+ >
356
+ Bottom Sheet
357
+ </button>
358
+ <button
359
+ @click=${e => {
360
+ e.target.parentElement.querySelector('#respSwitchOverlay').config = {
361
+ ...withDropdownConfig(),
362
+ };
363
+ }}
364
+ >
365
+ Dropdown
366
+ </button>
367
+ <br />
368
+ <demo-overlay-system id="respSwitchOverlay" .config=${{ ...withBottomSheetConfig() }}>
369
+ <button slot="invoker">Click me to open the overlay!</button>
370
+ <div slot="content" class="demo-overlay">
371
+ Hello! You can close this notification here:
372
+ <button @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}>
373
+ ⨯
374
+ </button>
375
+ </div>
376
+ </demo-overlay-system>
377
+ `;
378
+ ```
379
+
380
+ ## Opened state
381
+
382
+ For any overlay that implements the OverlayMixin, there is a Boolean property `opened` that reflects whether the overlay content is displayed or not.
383
+
384
+ You can also listen to the event `opened-changed` which is fired whenever `opened` is toggled. This can be useful e.g. if somewhere in your application you need to rely on this "state".
385
+
386
+ ```js preview-story
387
+ export const openedState = () => {
388
+ const appState = {
389
+ opened: false,
390
+ };
391
+ const myRefs = {
392
+ overlay: createRef(),
393
+ openedState: createRef(),
394
+ };
395
+ function onOpenClosed(ev) {
396
+ appState.opened = ev.target.opened;
397
+ myRefs.openedState.value.innerText = appState.opened;
398
+ }
399
+ return html`
400
+ appState.opened: <span ${ref(myRefs.openedState)}>${appState.opened}</span>
401
+ <demo-overlay-system
402
+ ${ref(myRefs.overlay)}
403
+ .opened="${appState.opened}"
404
+ @opened-changed=${onOpenClosed}
405
+ >
406
+ <button slot="invoker">Overlay</button>
407
+ <div slot="content" class="demo-overlay">
408
+ Hello! You can close this notification here:
409
+ <button
410
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
411
+ >
412
+ ⨯
413
+ </button>
414
+ </div>
415
+ </demo-overlay-system>
416
+ `;
417
+ };
418
+ ```
419
+
420
+ ## Intercepting open/close
421
+
422
+ It is possible to intercept the open/close process by calling `.preventDefault()` on
423
+ the `before-closed` or `before-opened` events.
424
+
425
+ ```js preview-story
426
+ export const interceptingOpenClose = () => {
427
+ // Application code
428
+ let blockOverlay = true;
429
+ const myRefs = {
430
+ statusButton: createRef(),
431
+ overlay: createRef(),
432
+ };
433
+ function intercept(ev) {
434
+ if (blockOverlay) {
435
+ ev.preventDefault();
436
+ }
437
+ }
438
+ return html`
439
+ Overlay blocked state:
440
+ <button
441
+ ${ref(myRefs.statusButton)}
442
+ @click="${() => {
443
+ blockOverlay = !blockOverlay;
444
+ myRefs.statusButton.value.textContent = blockOverlay;
445
+ }}"
446
+ >
447
+ ${blockOverlay}
448
+ </button>
449
+ <demo-overlay-system
450
+ ${ref(myRefs.overlay)}
451
+ @before-closed=${intercept}
452
+ @before-opened=${intercept}
453
+ >
454
+ <button
455
+ slot="invoker"
456
+ @click=${() =>
457
+ console.log('blockOverlay', blockOverlay, 'opened', myRefs.overlay.value.opened)}
458
+ >
459
+ Overlay
460
+ </button>
461
+ <div slot="content" class="demo-overlay">
462
+ Hello! You can close this notification here:
463
+ <button @click=${() => (myRefs.overlay.value.opened = false)}>⨯</button>
464
+ </div>
465
+ </demo-overlay-system>
466
+ `;
467
+ };
468
+ ```
469
+
470
+ ## OverlayMixin
471
+
472
+ OverlayMixin is a mixin anyone can use to create a Web Component which has a `content node` (`slot="content"`) and `invoker node` (`slot="invoker"`).
473
+
474
+ Under the hood, the `OverlayMixin` will instantiate an OverlayController with these nodes.
475
+
476
+ By default, there are only a few `OverlayMixin` methods you need to override to create a working Web Component using an overlay:
477
+
478
+ - `render`, the template needs to include a `<slot name="invoker">` and `<slot name="content">` inside a div with id `overlay-content-node-wrapper` (for positioning).
479
+ - `_defineOverlayConfig`, in this protected method, return an object that contains the default configuration for your Web Component's overlay. See configuration section of OverlayController.
480
+ - `_setupOpenCloseListeners`, use this lifecycle hook to setup the open and close event listeners on your `_overlayInvokerNode`.
481
+ - `_teardownOpenCloseListeners`, use this lifecycle hook to ensure that the listeners are removed when the OverlayController is tearing down. For example when the Web Component is disconnected from the DOM.
482
+
483
+ ```js
484
+ import { LitElement } from '@mdjs/mdjs-preview';
485
+ import { OverlayMixin } from '@lion/ui/overlays.js';
486
+
487
+ class MyOverlayWC extends OverlayMixin(LitElement) {
488
+ _defineOverlayConfig() {
489
+ return {
490
+ placementMode: 'global',
491
+ hasBackdrop: true,
492
+ };
493
+ }
494
+
495
+ _setupOpenCloseListeners() {
496
+ super._setupOpenCloseListeners();
497
+ this.__toggle = () => {
498
+ // opened is the public boolean property to use in the WC for opening/closing
499
+ this.opened = !this.opened;
500
+ };
501
+
502
+ // Always guard this, because your user may toggle the opened state through something else (e.g. event) and not an invoker node.
503
+ if (this._overlayInvokerNode) {
504
+ this._overlayInvokerNode.addEventListener('click', this.__toggle);
505
+ }
506
+ }
507
+
508
+ _teardownOpenCloseListeners() {
509
+ super._teardownOpenCloseListeners();
510
+
511
+ if (this._overlayInvokerNode) {
512
+ this._overlayInvokerNode.removeEventListener('click', this.__toggle);
513
+ }
514
+ }
515
+
516
+ render() {
517
+ return html`
518
+ <slot name="invoker"></slot>
519
+ <div id="overlay-content-node-wrapper">
520
+ <slot name="content"></slot>
521
+ </div>
522
+ `;
523
+ }
524
+ }
525
+ ```
526
+
527
+ ## OverlaysManager
528
+
529
+ The `OverlaysManager` is a global registry keeping track of all different types of overlays. The need for a global housekeeping mainly arises when multiple overlays are opened simultaneously.
530
+
531
+ For example, you may have a modal dialog that opens another modal dialog. The second dialog needs to block the first. When the second dialog is closed, the first one is available again.
532
+
533
+ The overlay manager keeps track of all registered overlays and controls which one to show.
534
+
535
+ Below an example is shown with the `isBlocking` option, which makes use of the OverlaysManager's capabilities.
536
+
537
+ ```js preview-story
538
+ export const overlayManager = () => {
539
+ const hasBackdropConfig = { hasBackdrop: true };
540
+ return html`
541
+ <demo-overlay-system .config=${hasBackdropConfig}>
542
+ <button slot="invoker">Click me to open the overlay!</button>
543
+ <div slot="content" class="demo-overlay">
544
+ Hello! You can close this notification here:
545
+ <button
546
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
547
+ >
548
+ ⨯
549
+ </button>
550
+ <br />
551
+ <button @click=${e => (document.querySelector('#secondOverlay').opened = true)}>
552
+ Click me to open another overlay which is blocking
553
+ </button>
554
+ </div>
555
+ </demo-overlay-system>
556
+ <demo-overlay-system id="secondOverlay" .config=${{ hasBackdrop: true, isBlocking: true }}>
557
+ <div slot="content" class="demo-overlay demo-overlay--second">
558
+ Hello! You can close this notification here:
559
+ <button
560
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
561
+ >
562
+ ⨯
563
+ </button>
564
+ </div>
565
+ </demo-overlay-system>
566
+ `;
567
+ };
568
+ ```
569
+
570
+ ## Local Backdrop
571
+
572
+ We provide a possibility to add a backdrop to a locally placed overlay.
573
+ You can pass your backdropNode as a configuration parameter and control its styling reacting upon OverlayController events.
574
+ Here is the example below
575
+
576
+ ```js preview-story
577
+ export const localBackdrop = () => {
578
+ const localBackdropConfig = { placementMode: 'local' };
579
+ return html`
580
+ <demo-overlay-system .config=${localBackdropConfig}>
581
+ <demo-overlay-backdrop slot="backdrop"></demo-overlay-backdrop>
582
+ <button slot="invoker">Click me to open the overlay!</button>
583
+ <div slot="content" class="demo-overlay">
584
+ Hello! You can close this notification here:
585
+ <button
586
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
587
+ >
588
+ ⨯
589
+ </button>
590
+ </div>
591
+ </demo-overlay-system>
592
+ `;
593
+ };
594
+ ```
595
+
596
+ ### Nested Overlays
597
+
598
+ Overlays can be nested, as the demo below shows.
599
+ It's also possible to compose a nested construction by moving around dom nodes.
600
+
601
+ ```js preview-story
602
+ export const nestedOverlays = () => {
603
+ return html`
604
+ <demo-overlay-system .config="${withModalDialogConfig()}">
605
+ <div slot="content" id="mainContent" class="demo-overlay">
606
+ open nested overlay:
607
+ <demo-overlay-system .config="${withModalDialogConfig()}">
608
+ <div slot="content" id="nestedContent" class="demo-overlay">
609
+ Nested content
610
+ <button
611
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
612
+ >
613
+ ⨯
614
+ </button>
615
+ </div>
616
+ <button slot="invoker" id="nestedInvoker">nested invoker button</button>
617
+ </demo-overlay-system>
618
+ <button
619
+ @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
620
+ >
621
+ ⨯
622
+ </button>
623
+ </div>
624
+ <button slot="invoker" id="mainInvoker">invoker button</button>
625
+ </demo-overlay-system>
626
+ `;
627
+ };
628
+ ```
629
+
630
+ ## Local overlay with an arrow
631
+
632
+ To add an arrow to the localOverlay you can add `ArrowMixin` to your component.
633
+ And add the `arrowPopperConfig` to the `_defineOverlayConfig`.
634
+
635
+ ```js preview-story
636
+ export const LocalWithArrow = () => {
637
+ const placementRightConfig = { popperConfig: { placement: 'right' } };
638
+ const placementBottomConfig = { popperConfig: { placement: 'bottom' } };
639
+ const placementLeftConfig = { popperConfig: { placement: 'left' } };
640
+ class ArrowExample extends ArrowMixin(OverlayMixin(LitElement)) {
641
+ _defineOverlayConfig() {
642
+ return {
643
+ ...super._defineOverlayConfig(),
644
+ popperConfig: {
645
+ ...super._defineOverlayConfig().popperConfig,
646
+ placement: 'top',
647
+ },
648
+ };
649
+ }
650
+
651
+ _setupOpenCloseListeners() {
652
+ super._setupOpenCloseListeners();
653
+ if (this._overlayInvokerNode) {
654
+ this._overlayInvokerNode.addEventListener('click', this.toggle);
655
+ }
656
+ }
657
+
658
+ _teardownOpenCloseListeners() {
659
+ super._teardownOpenCloseListeners();
660
+ if (this._overlayInvokerNode) {
661
+ this._overlayInvokerNode.removeEventListener('click', this.toggle);
662
+ }
663
+ }
664
+ }
665
+ if (!customElements.get('arrow-example')) {
666
+ customElements.define('arrow-example', ArrowExample);
667
+ }
668
+ return html`
669
+ <style>
670
+ .demo-box-placements {
671
+ display: flex;
672
+ flex-direction: column;
673
+ margin: 40px 0 0 200px;
674
+ }
675
+ .demo-box-placements arrow-example {
676
+ margin: 20px;
677
+ }
678
+ </style>
679
+ <div class="demo-box-placements">
680
+ <arrow-example>
681
+ <button slot="invoker">Top</button>
682
+ <div slot="content">This is a tooltip with an arrow</div>
683
+ </arrow-example>
684
+ <arrow-example .config=${placementRightConfig}>
685
+ <button slot="invoker">Right</button>
686
+ <div slot="content">This is a tooltip with an arrow</div>
687
+ </arrow-example>
688
+ <arrow-example .config=${placementBottomConfig}>
689
+ <button slot="invoker">Bottom</button>
690
+ <div slot="content">This is a tooltip with an arrow</div>
691
+ </arrow-example>
692
+ <arrow-example .config=${placementLeftConfig}>
693
+ <button slot="invoker">Left</button>
694
+ <div slot="content">This is a tooltip with an arrow</div>
695
+ </arrow-example>
696
+ </div>
697
+ `;
698
+ };
699
+ ```
@@ -0,0 +1,9 @@
1
+ {
2
+ "id": "2",
3
+ "type": "Polar Bear Dog",
4
+ "name": "Naga",
5
+ "skin": {
6
+ "type": "fur",
7
+ "color": "white"
8
+ }
9
+ }