@lion/ui 0.15.0 → 0.15.2

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 (265) hide show
  1. package/README.md +38 -12
  2. package/components/combobox/test/lion-combobox.test.js +50 -2
  3. package/components/core/src/SlotMixin.js +52 -0
  4. package/components/core/test/SlotMixin.test.js +85 -0
  5. package/components/dialog/test/lion-dialog.integration.test.js +170 -0
  6. package/components/input-amount-dropdown/src/localizeNamespaceLoader.js +53 -0
  7. package/components/input-amount-dropdown/translations/bg.js +5 -0
  8. package/components/input-amount-dropdown/translations/cs.js +5 -0
  9. package/components/input-amount-dropdown/translations/de.js +5 -0
  10. package/components/input-amount-dropdown/translations/es.js +5 -0
  11. package/components/input-amount-dropdown/translations/fr.js +5 -0
  12. package/components/input-amount-dropdown/translations/hu.js +5 -0
  13. package/components/input-amount-dropdown/translations/id.js +5 -0
  14. package/components/input-amount-dropdown/translations/it.js +5 -0
  15. package/components/input-amount-dropdown/translations/nl.js +5 -0
  16. package/components/input-amount-dropdown/translations/pl.js +5 -0
  17. package/components/input-amount-dropdown/translations/ro.js +5 -0
  18. package/components/input-amount-dropdown/translations/ru.js +5 -0
  19. package/components/input-amount-dropdown/translations/sk.js +5 -0
  20. package/components/input-amount-dropdown/translations/uk.js +5 -0
  21. package/components/input-amount-dropdown/translations/zh.js +5 -0
  22. package/components/listbox/src/ListboxMixin.js +3 -35
  23. package/components/overlays/src/ArrowMixin.js +10 -4
  24. package/components/overlays/src/OverlayController.js +34 -7
  25. package/components/overlays/test/OverlayController.test.js +4 -1
  26. package/components/overlays/test/OverlayMixin.test.js +2 -2
  27. package/components/overlays/test-suites/OverlayMixin.suite.js +57 -0
  28. package/custom-elements.json +2969 -207
  29. package/dist-types/components/core/src/ScopedElementsMixin.d.ts.map +1 -1
  30. package/dist-types/components/core/src/SlotMixin.d.ts +35 -0
  31. package/dist-types/components/core/src/SlotMixin.d.ts.map +1 -1
  32. package/dist-types/components/core/test/SlotMixin.test.d.ts.map +1 -1
  33. package/dist-types/components/dialog/test/lion-dialog.integration.test.d.ts +3 -0
  34. package/dist-types/components/dialog/test/lion-dialog.integration.test.d.ts.map +1 -0
  35. package/dist-types/components/input-amount-dropdown/src/localizeNamespaceLoader.d.ts +1 -1
  36. package/dist-types/components/input-amount-dropdown/src/localizeNamespaceLoader.d.ts.map +1 -1
  37. package/dist-types/components/input-amount-dropdown/translations/bg.d.ts +7 -0
  38. package/dist-types/components/input-amount-dropdown/translations/bg.d.ts.map +1 -0
  39. package/dist-types/components/input-amount-dropdown/translations/cs.d.ts +7 -0
  40. package/dist-types/components/input-amount-dropdown/translations/cs.d.ts.map +1 -0
  41. package/dist-types/components/input-amount-dropdown/translations/de.d.ts +7 -0
  42. package/dist-types/components/input-amount-dropdown/translations/de.d.ts.map +1 -0
  43. package/dist-types/components/input-amount-dropdown/translations/es.d.ts +7 -0
  44. package/dist-types/components/input-amount-dropdown/translations/es.d.ts.map +1 -0
  45. package/dist-types/components/input-amount-dropdown/translations/fr.d.ts +7 -0
  46. package/dist-types/components/input-amount-dropdown/translations/fr.d.ts.map +1 -0
  47. package/dist-types/components/input-amount-dropdown/translations/hu.d.ts +7 -0
  48. package/dist-types/components/input-amount-dropdown/translations/hu.d.ts.map +1 -0
  49. package/dist-types/components/input-amount-dropdown/translations/id.d.ts +7 -0
  50. package/dist-types/components/input-amount-dropdown/translations/id.d.ts.map +1 -0
  51. package/dist-types/components/input-amount-dropdown/translations/it.d.ts +7 -0
  52. package/dist-types/components/input-amount-dropdown/translations/it.d.ts.map +1 -0
  53. package/dist-types/components/input-amount-dropdown/translations/nl.d.ts +7 -0
  54. package/dist-types/components/input-amount-dropdown/translations/nl.d.ts.map +1 -0
  55. package/dist-types/components/input-amount-dropdown/translations/pl.d.ts +7 -0
  56. package/dist-types/components/input-amount-dropdown/translations/pl.d.ts.map +1 -0
  57. package/dist-types/components/input-amount-dropdown/translations/ro.d.ts +7 -0
  58. package/dist-types/components/input-amount-dropdown/translations/ro.d.ts.map +1 -0
  59. package/dist-types/components/input-amount-dropdown/translations/ru.d.ts +7 -0
  60. package/dist-types/components/input-amount-dropdown/translations/ru.d.ts.map +1 -0
  61. package/dist-types/components/input-amount-dropdown/translations/sk.d.ts +7 -0
  62. package/dist-types/components/input-amount-dropdown/translations/sk.d.ts.map +1 -0
  63. package/dist-types/components/input-amount-dropdown/translations/uk.d.ts +7 -0
  64. package/dist-types/components/input-amount-dropdown/translations/uk.d.ts.map +1 -0
  65. package/dist-types/components/input-amount-dropdown/translations/zh.d.ts +7 -0
  66. package/dist-types/components/input-amount-dropdown/translations/zh.d.ts.map +1 -0
  67. package/dist-types/components/listbox/src/ListboxMixin.d.ts.map +1 -1
  68. package/dist-types/components/overlays/src/ArrowMixin.d.ts.map +1 -1
  69. package/dist-types/components/overlays/src/OverlayController.d.ts +13 -4
  70. package/dist-types/components/overlays/src/OverlayController.d.ts.map +1 -1
  71. package/dist-types/components/overlays/test-suites/OverlayMixin.suite.d.ts.map +1 -1
  72. package/dist-types/tsconfig.tsbuildinfo +1 -1
  73. package/docs/components/accordion/index.md +1 -1
  74. package/docs/components/accordion/overview.md +1 -1
  75. package/docs/components/accordion/reference.md +1 -1
  76. package/docs/components/accordion/use-cases.md +1 -1
  77. package/docs/components/button/{extensions/bootstrap-button.mjs → assets/bootstrap-button.js} +10 -5
  78. package/docs/components/button/examples.md +1 -1
  79. package/docs/components/button/extensions.md +2 -2
  80. package/docs/components/button/index.md +2 -2
  81. package/docs/components/button/overview.md +4 -4
  82. package/docs/components/button/use-cases.md +6 -6
  83. package/docs/components/calendar/index.md +1 -1
  84. package/docs/components/calendar/overview.md +1 -1
  85. package/docs/components/calendar/use-cases.md +2 -2
  86. package/docs/components/checkbox-group/index.md +1 -1
  87. package/docs/components/checkbox-group/overview.md +3 -3
  88. package/docs/components/checkbox-group/use-cases.md +1 -1
  89. package/docs/components/collapsible/examples.md +1 -1
  90. package/docs/components/collapsible/index.md +1 -1
  91. package/docs/components/collapsible/overview.md +2 -2
  92. package/docs/components/collapsible/use-cases.md +1 -1
  93. package/docs/components/combobox/extensions.md +2 -1
  94. package/docs/components/combobox/index.md +1 -1
  95. package/docs/components/combobox/overview.md +2 -2
  96. package/docs/components/combobox/use-cases.md +2 -2
  97. package/docs/components/dialog/index.md +1 -1
  98. package/docs/components/dialog/overview.md +2 -2
  99. package/docs/components/dialog/use-cases.md +3 -3
  100. package/docs/components/drawer/index.md +1 -1
  101. package/docs/components/drawer/overview.md +1 -1
  102. package/docs/components/drawer/use-cases.md +1 -1
  103. package/docs/components/fieldset/index.md +1 -1
  104. package/docs/components/fieldset/overview.md +6 -6
  105. package/docs/components/fieldset/use-cases.md +1 -1
  106. package/docs/components/form/index.md +1 -1
  107. package/docs/components/form/overview.md +4 -4
  108. package/docs/components/form/use-cases.md +3 -3
  109. package/docs/components/icon/index.md +1 -1
  110. package/docs/components/icon/overview.md +1 -1
  111. package/docs/components/icon/use-cases.md +2 -15
  112. package/docs/components/index.md +1 -1
  113. package/docs/components/input/index.md +1 -1
  114. package/docs/components/input/overview.md +2 -2
  115. package/docs/components/input/use-cases.md +1 -1
  116. package/docs/components/input-amount/index.md +1 -1
  117. package/docs/components/input-amount/overview.md +4 -4
  118. package/docs/components/input-amount/use-cases.md +1 -1
  119. package/docs/components/input-amount-dropdown/index.md +1 -1
  120. package/docs/components/input-amount-dropdown/use-cases.md +1 -1
  121. package/docs/components/input-date/index.md +1 -1
  122. package/docs/components/input-date/overview.md +4 -4
  123. package/docs/components/input-date/use-cases.md +1 -1
  124. package/docs/components/input-datepicker/index.md +1 -1
  125. package/docs/components/input-datepicker/overview.md +6 -6
  126. package/docs/components/input-datepicker/use-cases.md +1 -1
  127. package/docs/components/input-email/index.md +1 -1
  128. package/docs/components/input-email/overview.md +3 -3
  129. package/docs/components/input-email/use-cases.md +1 -1
  130. package/docs/components/input-file/index.md +1 -1
  131. package/docs/components/input-file/overview.md +2 -2
  132. package/docs/components/input-file/use-cases.md +1 -1
  133. package/docs/components/input-iban/index.md +1 -1
  134. package/docs/components/input-iban/overview.md +3 -3
  135. package/docs/components/input-iban/use-cases.md +1 -1
  136. package/docs/components/input-range/index.md +1 -1
  137. package/docs/components/input-range/overview.md +3 -3
  138. package/docs/components/input-range/use-cases.md +1 -1
  139. package/docs/components/input-stepper/index.md +1 -1
  140. package/docs/components/input-stepper/overview.md +2 -2
  141. package/docs/components/input-stepper/use-cases.md +1 -1
  142. package/docs/components/input-tel/index.md +1 -1
  143. package/docs/components/input-tel/overview.md +2 -2
  144. package/docs/components/input-tel/use-cases.md +7 -7
  145. package/docs/components/input-tel-dropdown/extensions.md +1 -1
  146. package/docs/components/input-tel-dropdown/index.md +1 -1
  147. package/docs/components/input-tel-dropdown/overview.md +2 -2
  148. package/docs/components/input-tel-dropdown/use-cases.md +1 -1
  149. package/docs/components/listbox/index.md +1 -1
  150. package/docs/components/listbox/overview.md +1 -1
  151. package/docs/components/listbox/use-cases.md +2 -2
  152. package/docs/components/pagination/index.md +1 -1
  153. package/docs/components/pagination/overview.md +1 -1
  154. package/docs/components/pagination/use-cases.md +1 -1
  155. package/docs/components/progress-indicator/examples.md +1 -1
  156. package/docs/components/progress-indicator/index.md +1 -1
  157. package/docs/components/progress-indicator/overview.md +1 -1
  158. package/docs/components/radio-group/index.md +1 -1
  159. package/docs/components/radio-group/overview.md +4 -4
  160. package/docs/components/radio-group/use-cases.md +1 -1
  161. package/docs/components/select/index.md +1 -1
  162. package/docs/components/select/overview.md +1 -1
  163. package/docs/components/select/use-cases.md +2 -2
  164. package/docs/components/select-rich/examples.md +1 -1
  165. package/docs/components/select-rich/index.md +1 -1
  166. package/docs/components/select-rich/overview.md +1 -1
  167. package/docs/components/select-rich/use-cases.md +3 -3
  168. package/docs/components/steps/index.md +1 -1
  169. package/docs/components/steps/overview.md +1 -1
  170. package/docs/components/steps/use-cases.md +1 -1
  171. package/docs/components/switch/index.md +1 -1
  172. package/docs/components/switch/overview.md +1 -1
  173. package/docs/components/switch/reference.md +1 -1
  174. package/docs/components/switch/use-cases.md +1 -1
  175. package/docs/components/tabs/examples.md +2 -2
  176. package/docs/components/tabs/index.md +1 -1
  177. package/docs/components/tabs/overview.md +1 -1
  178. package/docs/components/tabs/use-cases.md +1 -1
  179. package/docs/components/textarea/index.md +1 -1
  180. package/docs/components/textarea/overview.md +1 -1
  181. package/docs/components/textarea/use-cases.md +1 -1
  182. package/docs/components/tooltip/examples.md +1 -1
  183. package/docs/components/tooltip/index.md +1 -1
  184. package/docs/components/tooltip/overview.md +1 -1
  185. package/docs/components/tooltip/use-cases.md +1 -1
  186. package/docs/fundamentals/index.md +4 -4
  187. package/docs/fundamentals/node-tools/babel-plugin-extend-docs/index.md +1 -1
  188. package/docs/fundamentals/node-tools/babel-plugin-extend-docs/overview.md +1 -1
  189. package/docs/fundamentals/node-tools/index.md +1 -1
  190. package/docs/fundamentals/node-tools/providence-analytics/index.md +1 -1
  191. package/docs/fundamentals/node-tools/providence-analytics/overview.md +1 -1
  192. package/docs/fundamentals/node-tools/publish-docs/index.md +1 -1
  193. package/docs/fundamentals/node-tools/publish-docs/overview.md +4 -4
  194. package/docs/fundamentals/node-tools/remark-extend/index.md +1 -1
  195. package/docs/fundamentals/node-tools/remark-extend/overview.md +1 -1
  196. package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/index.md +1 -1
  197. package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/overview.md +3 -3
  198. package/docs/fundamentals/rationales/TypeScript.md +1 -1
  199. package/docs/fundamentals/rationales/accessibility.md +2 -2
  200. package/docs/fundamentals/rationales/index.md +1 -1
  201. package/docs/fundamentals/rationales/side-effects.md +1 -1
  202. package/docs/fundamentals/rationales/versioning.md +1 -1
  203. package/docs/fundamentals/systems/core/SlotMixin.md +2 -2
  204. package/docs/fundamentals/systems/core/index.md +1 -1
  205. package/docs/fundamentals/systems/core/overview.md +2 -2
  206. package/docs/fundamentals/systems/form/formatting-and-parsing.md +5 -5
  207. package/docs/fundamentals/systems/form/index.md +1 -1
  208. package/docs/fundamentals/systems/form/interaction-states.md +1 -1
  209. package/docs/fundamentals/systems/form/model-value.md +2 -2
  210. package/docs/fundamentals/systems/form/overview.md +29 -29
  211. package/docs/fundamentals/systems/form/styling.md +1 -1
  212. package/docs/fundamentals/systems/form/use-cases.md +1 -1
  213. package/docs/fundamentals/systems/form/validate.md +3 -3
  214. package/docs/fundamentals/systems/icon/index.md +1 -1
  215. package/docs/fundamentals/systems/icon/overview.md +1 -1
  216. package/docs/fundamentals/systems/index.md +1 -1
  217. package/docs/fundamentals/systems/localize/api-table.md +3 -0
  218. package/docs/fundamentals/systems/localize/dates.md +1 -1
  219. package/docs/fundamentals/systems/localize/index.md +1 -1
  220. package/docs/fundamentals/systems/localize/numbers.md +1 -1
  221. package/docs/fundamentals/systems/localize/overview.md +5 -5
  222. package/docs/fundamentals/systems/localize/rationale.md +1 -1
  223. package/docs/fundamentals/systems/localize/text.md +5 -4
  224. package/docs/fundamentals/systems/localize/use-cases.md +1 -1
  225. package/docs/fundamentals/systems/overlays/_configuration-positioning.md +3 -3
  226. package/docs/fundamentals/systems/overlays/_edge-cases.md +3 -3
  227. package/docs/fundamentals/systems/overlays/api-table.md +3 -0
  228. package/docs/fundamentals/systems/overlays/assets/demo-overlay-positioning.mjs +1 -1
  229. package/docs/fundamentals/systems/overlays/configuration.md +5 -5
  230. package/docs/fundamentals/systems/overlays/index.md +1 -1
  231. package/docs/fundamentals/systems/overlays/overview.md +6 -6
  232. package/docs/fundamentals/systems/overlays/rationale.md +1 -1
  233. package/docs/fundamentals/systems/overlays/use-cases.md +6 -6
  234. package/docs/fundamentals/tools/ajax/index.md +1 -1
  235. package/docs/fundamentals/tools/ajax/overview.md +2 -2
  236. package/docs/fundamentals/tools/ajax/use-cases.md +3 -3
  237. package/docs/fundamentals/tools/helpers/action-logger.md +1 -1
  238. package/docs/fundamentals/tools/helpers/index.md +2 -2
  239. package/docs/fundamentals/tools/helpers/overview.md +2 -2
  240. package/docs/fundamentals/tools/index.md +1 -1
  241. package/docs/fundamentals/tools/singleton-manager/example-complex/index.md +1 -1
  242. package/docs/fundamentals/tools/singleton-manager/example-fail/demo-app.js +4 -4
  243. package/docs/fundamentals/tools/singleton-manager/example-fail/index.md +2 -2
  244. package/docs/fundamentals/tools/singleton-manager/example-fail/node_modules/{page-a/page-a.js → page-c/page-c.js} +2 -2
  245. package/docs/fundamentals/tools/singleton-manager/example-fail/node_modules/{page-b/page-b.js → page-d/page-d.js} +2 -2
  246. package/docs/fundamentals/tools/singleton-manager/example-success/demo-app.js +4 -4
  247. package/docs/fundamentals/tools/singleton-manager/example-success/index.md +2 -2
  248. package/docs/fundamentals/tools/singleton-manager/example-success/node_modules/{page-a/page-a.js → page-e/page-e.js} +2 -3
  249. package/docs/fundamentals/tools/singleton-manager/example-success/node_modules/{page-b/page-b.js → page-f/page-f.js} +2 -2
  250. package/docs/fundamentals/tools/singleton-manager/index.md +2 -2
  251. package/docs/fundamentals/tools/singleton-manager/overview.md +5 -5
  252. package/docs/guides/how-to/create-a-custom-field.md +5 -5
  253. package/docs/guides/how-to/create-a-form.md +4 -4
  254. package/docs/guides/how-to/extend-a-native-input.md +2 -2
  255. package/docs/guides/index.md +8 -8
  256. package/docs/guides/principles/index.md +5 -5
  257. package/docs/guides/principles/styling.md +1 -1
  258. package/package.json +1 -1
  259. /package/docs/fundamentals/systems/overlays/assets/{applyDemoOverlayStyles.mjs → applyDemoOverlayStyles.js} +0 -0
  260. /package/docs/fundamentals/systems/overlays/assets/{demo-el-using-overlaymixin.mjs → demo-el-using-overlaymixin.js} +0 -0
  261. /package/docs/fundamentals/systems/overlays/assets/{demo-overlay-backdrop.mjs → demo-overlay-backdrop.js} +0 -0
  262. /package/docs/fundamentals/tools/singleton-manager/example-fail/node_modules/{page-b → page-d}/node_modules/overlays/index.js +0 -0
  263. /package/docs/fundamentals/tools/singleton-manager/example-fail/node_modules/{page-b → page-d}/node_modules/overlays/instance.js +0 -0
  264. /package/docs/fundamentals/tools/singleton-manager/example-success/node_modules/{page-b → page-f}/node_modules/overlays/index.js +0 -0
  265. /package/docs/fundamentals/tools/singleton-manager/example-success/node_modules/{page-b → page-f}/node_modules/overlays/instance.js +0 -0
package/README.md CHANGED
@@ -26,33 +26,59 @@
26
26
  </p>
27
27
 
28
28
  <p align="center">
29
- <a href="https://lion.js.org">Website</a>
29
+ <a href="https://lion-web.netlify.app">Website</a>
30
30
  ·
31
- <a href="https://lion.js.org/fundamentals/">Fundamentals</a>
31
+ <a href="https://lion-web.netlify.app/fundamentals/">Fundamentals</a>
32
32
  ·
33
- <a href="https://lion.js.org/guides/">Guides</a>
33
+ <a href="https://lion-web.netlify.app/guides/">Guides</a>
34
34
  ·
35
- <a href="https://lion.js.org/components/">Components</a>
35
+ <a href="https://lion-web.netlify.app/components/">Components</a>
36
36
  ·
37
- <a href="https://lion.js.org/blog/">Blog</a>
37
+ <a href="https://lion-web.netlify.app/blog/">Blog</a>
38
38
  </p>
39
39
 
40
- **Lion is a set of highly performant, accessible, and flexible Web Components.**
40
+ **Lion is a set of highly performant, accessible and flexible Web Components.!**
41
41
 
42
42
  They provide an unopinionated, white-label layer that can be extended to your own layer of components.
43
43
 
44
44
  - **High Performance:** Focused on great performance in all relevant browsers with a minimal number of dependencies.
45
45
  - **Accessibility:** Aimed at compliance with the WCAG 2.2 AA standard to create components that are accessible for everybody.
46
46
  - **Flexibility:** Provides solutions through Web Components and JavaScript classes which can be used, adopted and extended to fit all needs.
47
- - **Modern Code:** Lion is distributed as pure ES modules.
48
- - **Exposes functions/classes and Web Components:** Ships a functionality in its most appropriate form.
47
+ - **Modern Code:** Lion is distributes as pure es modules.
48
+ - **Exposes functions/classes and Web Components:** Ships a functionality in it's most appropriate form.
49
49
 
50
- > Note: Our demo examples might look simple and not very stylish. This is on purpose. They are designed to be basic so you can easily add your own styles to them to match your intended design, without dealing with styles that are already there.
50
+ > Note: Our demos may look a little bland but that is on purpose. They only come with functional stylings.
51
+ > This makes sense as the main use case is to extend those components and if you do you do not want to override existing stylings.
51
52
 
52
53
  <p align="center">
53
- <a href="https://lion.js.org/guides/"><strong>Explore the Lion Guides&nbsp;&nbsp;▶</strong></a>
54
+ <a href="https://lion-web.netlify.app/guides/"><strong>Explore the Lion Guides&nbsp;&nbsp;▶</strong></a>
54
55
  </p>
55
56
 
57
+ ## Astro migration
58
+
59
+ - Keep using `/docs` on the root level as we used it in the `master` branch. The documentation is copied into Astro related directories on `npm run start` and when when anything in `/docs` is updated.
60
+ - Replace manually all references to assets in all `md` files so that we imply that the path is produced from the directory where the md file is located. F.e. `new URL('../src/wa-combobox/assets/obama.jpeg', import.meta.url).href;` should `new URL('./src/wa-combobox/assets/obama.jpeg', import.meta.url).href;`. Note double dot is replaced with one dot. See [this PR](https://github.com/ing-bank/lion/pull/2125/files#diff-403b1e0ab54d51dcfe54248e847498e492da00383d8b33a4087994ab9035a22c) for the reference.
61
+ - Rename all `*.mjs` files to `*.js` ones if they are used by `mdjs` examples
62
+
63
+ ### Astro how to
64
+
65
+ - To start in dev mode run `nmm run start`
66
+ - To start in production mode:
67
+ - Run `npm run build`
68
+ - Run `npm run preview`
69
+
70
+ ### Issues which are not caused by the migration (not to be fixed now)
71
+
72
+ - There is a browser console error on [collapsible page](http://localhost:4321/components/collapsible):
73
+
74
+ ```
75
+ __mdjs-stories--use-cases.js:40 Uncaught TypeError: shadowRoot.getElementById is not a function
76
+ ```
77
+
78
+ Note. There is the same error on master. This issue is not caused by the migration
79
+
80
+ ### TODO
81
+
56
82
  ## How to install
57
83
 
58
84
  ```bash
@@ -113,7 +139,7 @@ You can also use the lion elements directly, although this is likely not a commo
113
139
 
114
140
  ## Issues
115
141
 
116
- If you encounter an issue with any of the packages we are offering please open a [new bug issue](https://github.com/ing-bank/lion/issues/new?assignees=&labels=&template=bug_report.md&title=). Be sure to include a description of the expected and the current behavior - additionally adding a [reproduction](https://webcomponents.dev/edit/kpZmz1CJN580OaXsk56f?pm=1) always helps.
142
+ If you encounter an issue with any of the packages we are offering please open a [new bug issue](https://github.com/ing-bank/lion/issues/new?assignees=&labels=&template=bug_report.md&title=). Be sure to include a description of the expected and the current behavior - additional adding a [reproduction](https://webcomponents.dev/edit/kpZmz1CJN580OaXsk56f?pm=1) always helps.
117
143
 
118
144
  ## Feature requests
119
145
 
@@ -158,7 +184,7 @@ This means you only have to apply your own Design System: by delivering styles,
158
184
 
159
185
  ## Coding guidelines
160
186
 
161
- Check out our [coding guidelines](https://lion.js.org/guides/principles/definitions-and-terms/) for more detailed information.
187
+ Check out our [coding guidelines](https://lion-web.netlify.app/guides/principles/definitions-and-terms/) for more detailed information.
162
188
 
163
189
  ## How to contribute
164
190
 
@@ -2,11 +2,11 @@ import { defineCE, expect, fixture, html, unsafeStatic, waitUntil } from '@open-
2
2
  import { Required, Unparseable } from '@lion/ui/form-core.js';
3
3
  import { sendKeys } from '@web/test-runner-commands';
4
4
  import { LionCombobox } from '@lion/ui/combobox.js';
5
- import { browserDetection } from '@lion/ui/core.js';
5
+ import { browserDetection, SlotMixin } from '@lion/ui/core.js';
6
6
  import '@lion/ui/define/lion-combobox.js';
7
7
  import '@lion/ui/define/lion-listbox.js';
8
8
  import '@lion/ui/define/lion-option.js';
9
- import { LitElement } from 'lit';
9
+ import { LitElement, nothing } from 'lit';
10
10
  import sinon from 'sinon';
11
11
  import {
12
12
  getFilteredOptionValues,
@@ -413,6 +413,54 @@ describe('lion-combobox', () => {
413
413
  expect(el.validationStates).to.have.property('error');
414
414
  expect(el.validationStates.error).to.have.property('MatchesOption');
415
415
  });
416
+
417
+ it('keeps slottable provided in `slots` getter as direct host child', async () => {
418
+ class MyEl extends SlotMixin(LionCombobox) {
419
+ // @ts-ignore
420
+ get slots() {
421
+ return {
422
+ ...super.slots,
423
+ _lazyRenderedSlot: () => ({
424
+ template: this.renderSlot
425
+ ? html`<span id="lazyRenderedSlotId">(Optional)</span>`
426
+ : html`${nothing}`,
427
+ renderAsDirectHostChild: true,
428
+ }),
429
+ };
430
+ }
431
+
432
+ _labelTemplate() {
433
+ return html`
434
+ <div class="form-field__label">
435
+ <slot name="label"></slot>
436
+ <slot name="_lazyRenderedSlot"></slot>
437
+ <slot></slot>
438
+ </div>
439
+ `;
440
+ }
441
+
442
+ constructor() {
443
+ super();
444
+ this.renderSlot = false;
445
+ }
446
+ }
447
+ const tagName = defineCE(MyEl);
448
+ const wrappingTag = unsafeStatic(tagName);
449
+
450
+ const el = /** @type {MyEl} */ (
451
+ await fixture(html`
452
+ <${wrappingTag} label="my label">
453
+ <lion-option .choiceValue="${'1'}">${'one'}</lion-option>
454
+ </${wrappingTag}>
455
+ `)
456
+ );
457
+ await el.registrationComplete;
458
+
459
+ el.renderSlot = true;
460
+ await el.updateComplete;
461
+ const lazyRenderedSlot = el.querySelector('#lazyRenderedSlotId');
462
+ expect(lazyRenderedSlot?.parentElement === el).to.be.true;
463
+ });
416
464
  });
417
465
 
418
466
  describe('Values', () => {
@@ -12,6 +12,58 @@ import { render } from 'lit';
12
12
  * @typedef {import('lit').LitElement} LitElement
13
13
  */
14
14
 
15
+ /**
16
+ * Sometimes, we want to provide best DX (direct slottables) and be accessible
17
+ * at the same time.
18
+ * In the first example below, we need to wrap our options in light dom in an element with
19
+ * [role=listbox]. We could achieve this via the second example, but it would affect our
20
+ * public api negatively. not allowing us to be forward compatible with the AOM spec:
21
+ * https://wicg.github.io/aom/explainer.html
22
+ * With this method, it's possible to watch elements in the default slot and move them
23
+ * to the desired target (the element with [role=listbox]) in light dom.
24
+ *
25
+ * @example
26
+ * # desired api
27
+ * <sel-ect>
28
+ * <opt-ion></opt-ion>
29
+ * </sel-ect>
30
+ * # desired end state
31
+ * <sel-ect>
32
+ * <div role="listbox" slot="lisbox">
33
+ * <opt-ion></opt-ion>
34
+ * </div>
35
+ * </sel-ect>
36
+ *
37
+ * Note, the function does not move the nodes specified by a subclasser in the `slots` getter
38
+ * @param {HTMLElement} source host of ShadowRoot with default <slot>
39
+ * @param {HTMLElement} target the desired target in light dom
40
+ */
41
+ export function moveUserProvidedDefaultSlottablesToTarget(source, target) {
42
+ /**
43
+ * Nodes injected via `slots` getter are going to be added as host's children
44
+ * starting by a comment node like <!--_start_slot_*-->
45
+ * and ending by a comment node like <!--_end_slot_*-->
46
+ * So we ignore everything that comes between those `start_slot` and `end_slot` comments
47
+ */
48
+ let isInsideSlotSection = false;
49
+ Array.from(source.childNodes).forEach((/** @type {* & Element} */ c) => {
50
+ const isNamedSlottable = c.hasAttribute && c.hasAttribute('slot');
51
+ const isComment = c.nodeType === Node.COMMENT_NODE;
52
+ if (isComment && !isInsideSlotSection) {
53
+ isInsideSlotSection = c.textContent.includes('_start_slot_');
54
+ }
55
+ if (isInsideSlotSection) {
56
+ if (c.textContent.includes('_end_slot_')) {
57
+ isInsideSlotSection = false;
58
+ }
59
+ return;
60
+ }
61
+ if (!isNamedSlottable) {
62
+ target.appendChild(c);
63
+ }
64
+ });
65
+ }
66
+
15
67
  /**
16
68
  * @param {SlotFunctionResult} slotFunctionResult
17
69
  * @returns {'template-result'|'node'|'slot-rerender-object'|null}
@@ -2,6 +2,7 @@ import { defineCE, expect, fixture, fixtureSync, unsafeStatic, html } from '@ope
2
2
  import { SlotMixin } from '@lion/ui/core.js';
3
3
  import { LitElement } from 'lit';
4
4
  import sinon from 'sinon';
5
+ import { moveUserProvidedDefaultSlottablesToTarget } from '../src/SlotMixin.js';
5
6
 
6
7
  import { ScopedElementsMixin, supportsScopedRegistry } from '../src/ScopedElementsMixin.js';
7
8
  import { isActiveElement } from '../test-helpers/isActiveElement.js';
@@ -134,6 +135,90 @@ describe('SlotMixin', () => {
134
135
  expect(elNoSlot.didCreateConditionalSlot()).to.be.false;
135
136
  });
136
137
 
138
+ it('should move default slots to target', async () => {
139
+ const target = document.createElement('div');
140
+ const source = document.createElement('div');
141
+ /**
142
+ * Exmple of usage:
143
+ * get slots() {
144
+ * return {
145
+ * _nothing: () => ({
146
+ * template: html`${nothing}`,
147
+ * renderAsDirectHostChild: true,
148
+ * }),
149
+ * }
150
+ * }
151
+ */
152
+ const variableNothing = `
153
+ <!--_start_slot_lit-el-->
154
+ <!-- {lit-el} -->
155
+ <!--_end_slot_lit-el-->`;
156
+
157
+ /**
158
+ * Exmple of usage:
159
+ * get slots() {
160
+ * return {
161
+ * '': () => ({
162
+ * template: html`<div>text<div>`,
163
+ * renderAsDirectHostChild: true,
164
+ * }),
165
+ * }
166
+ * }
167
+ */
168
+ const defaultSlottableProvidedViaSlotsGetter = `
169
+ <!--_start_slot_-->
170
+ <div>text</div>
171
+ <!--_end_slot_-->
172
+ `;
173
+
174
+ /**
175
+ * Exmple of usage:
176
+ * get slots() {
177
+ * return {
178
+ * label: () => ({
179
+ * template: html`<div>text<div>`,
180
+ * renderAsDirectHostChild: true,
181
+ * }),
182
+ * }
183
+ * }
184
+ */
185
+ const namedSlottable = `
186
+ <!--_start_slot_label-->
187
+ <div slot="label">text</div>
188
+ <!--_end_slot_label-->
189
+ `;
190
+
191
+ /**
192
+ * Here we assume .test1, .test2 and .test3 are the ones provided as content projection f.e.:
193
+ * <my-comp>
194
+ * <div class="test1"><div>
195
+ * <div class="test2"><div>
196
+ * <div class="test3"><div>
197
+ * </my-comp>
198
+ *
199
+ * And the rest of content is added via `slots` getter by SlotMixin
200
+ * The function should move only content projection and ignore the rest
201
+ * */
202
+
203
+ source.innerHTML = `
204
+ <div class="test1"></div>
205
+ ${variableNothing}
206
+ <div class="test2"></div>
207
+ ${defaultSlottableProvidedViaSlotsGetter}
208
+ <div class="test3"></div>
209
+ ${namedSlottable}
210
+ `;
211
+
212
+ moveUserProvidedDefaultSlottablesToTarget(source, target);
213
+ expect(target.children.length).to.equal(3);
214
+ const test1Element = target.querySelector('.test1');
215
+ const test2Element = target.querySelector('.test2');
216
+ const test3Element = target.querySelector('.test3');
217
+ expect(test1Element?.parentElement === target).to.equal(true);
218
+ expect(test2Element?.parentElement === target).to.equal(true);
219
+ expect(test3Element?.parentElement === target).to.equal(true);
220
+ });
221
+
137
222
  describe('Rerender', () => {
138
223
  it('supports rerender when SlotRerenderObject provided', async () => {
139
224
  const tag = defineCE(
@@ -0,0 +1,170 @@
1
+ /* eslint-disable lit-a11y/no-autofocus */
2
+ import { expect, fixture as _fixture, html, waitUntil } from '@open-wc/testing';
3
+ import { sendKeys } from '@web/test-runner-commands';
4
+
5
+ import '@lion/ui/define/lion-button.js';
6
+ import '@lion/ui/define/lion-combobox.js';
7
+ import '@lion/ui/define/lion-select-rich.js';
8
+ import '@lion/ui/define/lion-option.js';
9
+ import '@lion/ui/define/lion-dialog.js';
10
+ import '@lion/ui/define/lion-tooltip.js';
11
+
12
+ import { mimicUserTyping } from '@lion/ui/combobox-test-helpers.js';
13
+ import sinon from 'sinon';
14
+
15
+ /**
16
+ * @typedef {import('../src/LionDialog.js').LionDialog} LionDialog
17
+ * @typedef {import('lit').TemplateResult} TemplateResult
18
+ */
19
+ const fixture = /** @type {(arg: TemplateResult) => Promise<LionDialog>} */ (_fixture);
20
+
21
+ const dropDownEntries = ['Apple', 'Banana'];
22
+
23
+ describe('lion-dialog', () => {
24
+ describe('lion-combobox integration', () => {
25
+ it('should close lion-combobox dropdown on Escape and should not close the parent lion-dialog', async () => {
26
+ const el = await fixture(html`
27
+ <lion-dialog has-close-button>
28
+ <lion-button slot="invoker">Open Dialog</lion-button>
29
+ <div slot="header">Combobox example</div>
30
+ <div slot="content">
31
+ <lion-combobox name="combo" label="Select a fruit">
32
+ ${dropDownEntries.map(
33
+ (/** @type { string } */ entry) =>
34
+ html` <lion-option .choiceValue="${entry}">${entry}</lion-option>`,
35
+ )}
36
+ </lion-combobox>
37
+ </div>
38
+ </lion-dialog>
39
+ `);
40
+ const dialogInvoker = /** @type {HTMLElement} */ (el.querySelector('[slot="invoker"]'));
41
+ dialogInvoker.click();
42
+ const combobox = /** @type {HTMLElement} */ el.querySelector('lion-combobox');
43
+ const isComboboxRendered = () => !!combobox?.shadowRoot?.childNodes.length;
44
+ await waitUntil(isComboboxRendered);
45
+ // @ts-ignore
46
+ await mimicUserTyping(combobox, 'a');
47
+ const firstOption = /** @type { HTMLElement | undefined } */ (
48
+ el.querySelectorAll('lion-option')?.[0]
49
+ );
50
+ // @ts-ignore
51
+ const isComboboxFirstOptionInDropdownVisible = () => firstOption?.checkVisibility();
52
+ await waitUntil(isComboboxFirstOptionInDropdownVisible);
53
+ const comboboxDialog = combobox?.shadowRoot?.querySelector('dialog');
54
+ // Note, do not remove `console.log` down below. There is a bug in test engine.
55
+ // Referring dialog.close from the test environement fixes the bug
56
+ console.log(sinon.spy(comboboxDialog?.close));
57
+ const comboboxInput = combobox?.querySelector('input');
58
+ comboboxInput?.focus();
59
+ const dropdownDialog = combobox?.shadowRoot?.querySelector('dialog');
60
+ // @ts-ignore
61
+ const dropdownDialogCloseSpy = sinon.spy(dropdownDialog, 'close');
62
+ await sendKeys({
63
+ press: 'Escape',
64
+ });
65
+ // @ts-ignore
66
+ const isDialogVisible = () => el?.shadowRoot?.querySelector('dialog')?.checkVisibility();
67
+ await waitUntil(() => dropdownDialogCloseSpy.called);
68
+ expect(isDialogVisible()).to.equal(true);
69
+ });
70
+ });
71
+
72
+ describe('lion-select-rich integration', () => {
73
+ it('should close lion-select-rich dropdown on Escape and should not close the parent lion-dialog', async () => {
74
+ const el = await fixture(html`
75
+ <lion-dialog has-close-button>
76
+ <lion-button slot="invoker">Open Dialog</lion-button>
77
+ <div slot="header">Select rich example</div>
78
+ <div slot="content">
79
+ <lion-select-rich label="Select a fruit">
80
+ ${dropDownEntries.map(
81
+ (/** @type { string } */ entry) =>
82
+ html` <lion-option .choiceValue="${entry}">${entry}</lion-option>`,
83
+ )}
84
+ </lion-select-rich>
85
+ </div>
86
+ </lion-dialog>
87
+ `);
88
+ const dialogInvoker = /** @type {HTMLElement} */ (el.querySelector('[slot="invoker"]'));
89
+ dialogInvoker.click();
90
+ const selectRichInvoker = /** @type {HTMLElement} */ (
91
+ el.querySelector('lion-select-invoker')
92
+ );
93
+ const isSelectRichInvokerRendered = () => !!selectRichInvoker?.shadowRoot?.childNodes.length;
94
+ await waitUntil(isSelectRichInvokerRendered);
95
+ const selectRich = el?.querySelector('lion-select-rich');
96
+ const selectRichDialog = selectRich?.shadowRoot?.querySelector('dialog');
97
+ // Note, do not remove `console.log` down below. There is a bug in test engine.
98
+ // Referring dialog.close from the test environement fixes the bug
99
+ console.log(selectRichDialog?.close);
100
+
101
+ selectRichInvoker?.click();
102
+ const dropdownDialog = el
103
+ ?.querySelector('lion-select-rich')
104
+ ?.shadowRoot?.querySelector('dialog');
105
+ // @ts-ignore
106
+ const dropdownDialogCloseSpy = sinon.spy(dropdownDialog, 'close');
107
+ const isDropdownVisible = () =>
108
+ el
109
+ ?.querySelector('lion-select-rich')
110
+ ?.shadowRoot?.querySelector('dialog')
111
+ // @ts-ignore
112
+ ?.checkVisibility();
113
+ await waitUntil(isDropdownVisible);
114
+ const lionOptions = /** @type {HTMLElement} */ (el.querySelector('lion-options'));
115
+ lionOptions?.focus();
116
+ await sendKeys({
117
+ press: 'Escape',
118
+ });
119
+ // @ts-ignore
120
+ const isDialogVisible = () => el?.shadowRoot?.querySelector('dialog')?.checkVisibility();
121
+ await waitUntil(() => dropdownDialogCloseSpy.called);
122
+ expect(isDialogVisible()).to.equal(true);
123
+ });
124
+ });
125
+
126
+ describe('lion-tooltip integration', () => {
127
+ it('should close lion-tooltip on first Escape and should close the parent lion-dialog on the second Escape', async () => {
128
+ const el = await fixture(html`
129
+ <lion-dialog has-close-button>
130
+ <lion-button slot="invoker" class="dialog-invoker">Open Dialog</lion-button>
131
+ <div slot="header">Tooltip example</div>
132
+ <div slot="content">
133
+ <lion-tooltip has-arrow>
134
+ <button slot="invoker" class="demo-tooltip-invoker">Focus on me</button>
135
+ <div slot="content">This is a tooltip</div>
136
+ </lion-tooltip>
137
+ </div>
138
+ </lion-dialog>
139
+ `);
140
+
141
+ await el.updateComplete;
142
+ const dialogInvoker = /** @type {HTMLElement} */ (el.querySelector('.dialog-invoker'));
143
+ dialogInvoker.click();
144
+ const tooltip = /** @type {HTMLElement} */ el.querySelector('lion-tooltip');
145
+ const isTooltipRendered = () => !!tooltip?.shadowRoot?.childNodes.length;
146
+ await waitUntil(isTooltipRendered);
147
+ const tooltipButton = /** @type {HTMLElement} */ (el.querySelector('.demo-tooltip-invoker'));
148
+ tooltipButton?.focus();
149
+ const getTooltipContent = () =>
150
+ el
151
+ .querySelector('lion-tooltip')
152
+ ?.shadowRoot?.querySelector('#overlay-content-node-wrapper');
153
+ // @ts-ignore
154
+ const isTooltipContentVisible = () => getTooltipContent()?.checkVisibility();
155
+ await waitUntil(isTooltipContentVisible);
156
+ await sendKeys({
157
+ press: 'Escape',
158
+ });
159
+ // @ts-ignore
160
+ const isDialogVisible = () => el?.shadowRoot?.querySelector('dialog')?.checkVisibility();
161
+ expect(isTooltipContentVisible()).to.equal(false);
162
+ expect(isDialogVisible()).to.equal(true);
163
+ await sendKeys({
164
+ press: 'Escape',
165
+ });
166
+ expect(isTooltipContentVisible()).to.equal(false);
167
+ expect(isDialogVisible()).to.equal(false);
168
+ });
169
+ });
170
+ });
@@ -1,6 +1,59 @@
1
1
  /* eslint-disable import/no-extraneous-dependencies */
2
2
  export const localizeNamespaceLoader = /** @param {string} locale */ locale => {
3
3
  switch (locale) {
4
+ case 'bg-BG':
5
+ case 'bg':
6
+ return import('@lion/ui/input-amount-dropdown-translations/bg.js');
7
+ case 'cs-CZ':
8
+ case 'cs':
9
+ return import('@lion/ui/input-amount-dropdown-translations/cs.js');
10
+ case 'de-DE':
11
+ case 'de':
12
+ return import('@lion/ui/input-amount-dropdown-translations/de.js');
13
+ case 'en-AU':
14
+ case 'en-GB':
15
+ case 'en-US':
16
+ case 'en-PH':
17
+ case 'en':
18
+ return import('@lion/ui/input-amount-dropdown-translations/en.js');
19
+ case 'es-ES':
20
+ case 'es':
21
+ return import('@lion/ui/input-amount-dropdown-translations/es.js');
22
+ case 'fr-FR':
23
+ case 'fr-BE':
24
+ case 'fr':
25
+ return import('@lion/ui/input-amount-dropdown-translations/fr.js');
26
+ case 'hu-HU':
27
+ case 'hu':
28
+ return import('@lion/ui/input-amount-dropdown-translations/hu.js');
29
+ case 'id-ID':
30
+ case 'id':
31
+ return import('@lion/ui/input-amount-dropdown-translations/id.js');
32
+ case 'it-IT':
33
+ case 'it':
34
+ return import('@lion/ui/input-amount-dropdown-translations/it.js');
35
+ case 'nl-BE':
36
+ case 'nl-NL':
37
+ case 'nl':
38
+ return import('@lion/ui/input-amount-dropdown-translations/nl.js');
39
+ case 'pl-PL':
40
+ case 'pl':
41
+ return import('@lion/ui/input-amount-dropdown-translations/pl.js');
42
+ case 'ro-RO':
43
+ case 'ro':
44
+ return import('@lion/ui/input-amount-dropdown-translations/ro.js');
45
+ case 'ru-RU':
46
+ case 'ru':
47
+ return import('@lion/ui/input-amount-dropdown-translations/ru.js');
48
+ case 'sk-SK':
49
+ case 'sk':
50
+ return import('@lion/ui/input-amount-dropdown-translations/sk.js');
51
+ case 'uk-UA':
52
+ case 'uk':
53
+ return import('@lion/ui/input-amount-dropdown-translations/uk.js');
54
+ case 'zh-CN':
55
+ case 'zh':
56
+ return import('@lion/ui/input-amount-dropdown-translations/zh.js');
4
57
  default:
5
58
  return import('@lion/ui/input-amount-dropdown-translations/en.js');
6
59
  }
@@ -0,0 +1,5 @@
1
+ export default {
2
+ allCurrencies: 'Всички валути',
3
+ selectCurrency: 'Избор на валута',
4
+ suggestedCurrencies: 'Предпочитани валути',
5
+ };
@@ -0,0 +1,5 @@
1
+ export default {
2
+ allCurrencies: 'Všechny měny',
3
+ selectCurrency: 'Vybrat měnu',
4
+ suggestedCurrencies: 'Preferované měny',
5
+ };
@@ -0,0 +1,5 @@
1
+ export default {
2
+ allCurrencies: 'Alle Währungen',
3
+ selectCurrency: 'Währung auswählen',
4
+ suggestedCurrencies: 'Bevorzugte Währungen',
5
+ };
@@ -0,0 +1,5 @@
1
+ export default {
2
+ allCurrencies: 'Todas las divisas',
3
+ selectCurrency: 'Seleccione divisa',
4
+ suggestedCurrencies: 'Divisas preferidas',
5
+ };
@@ -0,0 +1,5 @@
1
+ export default {
2
+ allCurrencies: 'Toutes les devises',
3
+ selectCurrency: 'Sélectionner une devise',
4
+ suggestedCurrencies: 'Devises préférées',
5
+ };
@@ -0,0 +1,5 @@
1
+ export default {
2
+ allCurrencies: 'Minden pénznem',
3
+ selectCurrency: 'Pénznem kiválasztása',
4
+ suggestedCurrencies: 'Előnyben részesített pénznemek',
5
+ };
@@ -0,0 +1,5 @@
1
+ export default {
2
+ allCurrencies: 'Semua mata uang',
3
+ selectCurrency: 'Pilih mata uang',
4
+ suggestedCurrencies: 'Mata uang pilihan',
5
+ };
@@ -0,0 +1,5 @@
1
+ export default {
2
+ allCurrencies: 'Tutte le valute',
3
+ selectCurrency: 'Seleziona valuta',
4
+ suggestedCurrencies: 'Valute preferite',
5
+ };
@@ -0,0 +1,5 @@
1
+ export default {
2
+ allCurrencies: "Alle valuta's",
3
+ selectCurrency: 'Selecteer valuta',
4
+ suggestedCurrencies: "Voorkeurs valuta's",
5
+ };
@@ -0,0 +1,5 @@
1
+ export default {
2
+ allCurrencies: 'Wszystkie waluty',
3
+ selectCurrency: 'Wybierz walutę',
4
+ suggestedCurrencies: 'Preferowane waluty',
5
+ };
@@ -0,0 +1,5 @@
1
+ export default {
2
+ allCurrencies: 'Toate valutele',
3
+ selectCurrency: 'Selectare valută',
4
+ suggestedCurrencies: 'Valute preferate',
5
+ };
@@ -0,0 +1,5 @@
1
+ export default {
2
+ allCurrencies: 'Все валюты',
3
+ selectCurrency: 'Выбрать валюту',
4
+ suggestedCurrencies: 'Предпочтительные валюты',
5
+ };
@@ -0,0 +1,5 @@
1
+ export default {
2
+ allCurrencies: 'Všetky meny',
3
+ selectCurrency: 'Zvoliť menu',
4
+ suggestedCurrencies: 'Uprednostňované meny',
5
+ };
@@ -0,0 +1,5 @@
1
+ export default {
2
+ allCurrencies: 'Усі валюти',
3
+ selectCurrency: 'Вибрати валюту',
4
+ suggestedCurrencies: 'Обрані валюти',
5
+ };
@@ -0,0 +1,5 @@
1
+ export default {
2
+ allCurrencies: '所有货币',
3
+ selectCurrency: '选择货币',
4
+ suggestedCurrencies: '首选货币',
5
+ };