@mgdis/mg-components 3.1.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. package/dist/cjs/{index-85a4a0b6.js → index-88560a66.js} +123 -48
  2. package/dist/cjs/index-a39c5567.js +233 -0
  3. package/dist/cjs/loader.cjs.js +3 -17
  4. package/dist/cjs/mg-badge_21.cjs.entry.js +3538 -0
  5. package/dist/cjs/mg-components.cjs.js +3 -7
  6. package/dist/cjs/mg-modal.cjs.entry.js +117 -0
  7. package/dist/cjs/mg-popover.cjs.entry.js +170 -0
  8. package/dist/cjs/popper-71bf3058.js +1790 -0
  9. package/dist/collection/collection-manifest.json +4 -1
  10. package/dist/collection/components/atoms/mg-badge/{mg-badge.stories.js → doc/mg-badge.stories.js} +4 -1
  11. package/dist/collection/components/atoms/mg-badge/mg-badge.conf.js +1 -1
  12. package/dist/collection/components/atoms/mg-badge/mg-badge.css +0 -2
  13. package/dist/collection/components/atoms/mg-badge/mg-badge.js +26 -10
  14. package/dist/collection/components/atoms/mg-button/{mg-button.stories.js → doc/mg-button.stories.js} +7 -2
  15. package/dist/collection/components/atoms/mg-button/mg-button.conf.js +1 -1
  16. package/dist/collection/components/atoms/mg-button/mg-button.css +46 -49
  17. package/dist/collection/components/atoms/mg-button/mg-button.js +78 -4
  18. package/dist/collection/components/atoms/mg-character-left/{mg-character-left.stories.js → doc/mg-character-left.stories.js} +8 -0
  19. package/dist/collection/components/atoms/mg-character-left/mg-character-left.js +20 -46
  20. package/dist/collection/components/atoms/mg-icon/{mg-icon.stories.js → doc/mg-icon.stories.js} +1 -1
  21. package/dist/collection/components/atoms/mg-icon/mg-icon.conf.js +104 -9
  22. package/dist/collection/components/atoms/mg-icon/mg-icon.css +9 -7
  23. package/dist/collection/components/atoms/mg-icon/mg-icon.js +33 -7
  24. package/dist/collection/components/atoms/mg-input-title/{mg-input-title.stories.js → doc/mg-input-title.stories.js} +0 -0
  25. package/dist/collection/components/atoms/mg-input-title/mg-input-title.css +4 -4
  26. package/dist/collection/components/atoms/mg-input-title/mg-input-title.js +14 -3
  27. package/dist/collection/components/atoms/mg-tag/{mg-tag.stories.js → doc/mg-tag.stories.js} +4 -1
  28. package/dist/collection/components/atoms/mg-tag/mg-tag.js +28 -6
  29. package/dist/collection/components/atoms/mg-tooltip/{mg-tooltip.stories.js → doc/mg-tooltip.stories.js} +14 -1
  30. package/dist/collection/components/atoms/mg-tooltip/mg-tooltip.conf.js +20 -0
  31. package/dist/collection/components/atoms/mg-tooltip/mg-tooltip.js +16 -2
  32. package/dist/collection/components/molecules/inputs/MgInput.conf.js +1 -7
  33. package/dist/collection/components/molecules/inputs/MgInput.js +25 -29
  34. package/dist/collection/components/molecules/inputs/mg-input-checkbox/{mg-input-checkbox.stories.js → doc/mg-input-checkbox.stories.js} +6 -1
  35. package/dist/collection/components/molecules/inputs/mg-input-checkbox/mg-input-checkbox.css +25 -11
  36. package/dist/collection/components/molecules/inputs/mg-input-checkbox/mg-input-checkbox.js +102 -52
  37. package/dist/collection/components/molecules/inputs/mg-input-date/{mg-input-date.stories.js → doc/mg-input-date.stories.js} +6 -1
  38. package/dist/collection/components/molecules/inputs/mg-input-date/mg-input-date.css +37 -9
  39. package/dist/collection/components/molecules/inputs/mg-input-date/mg-input-date.js +136 -66
  40. package/dist/collection/components/molecules/inputs/mg-input-numeric/{mg-input-numeric.stories.js → doc/mg-input-numeric.stories.js} +15 -3
  41. package/dist/collection/components/molecules/inputs/mg-input-numeric/mg-input-numeric.css +38 -10
  42. package/dist/collection/components/molecules/inputs/mg-input-numeric/mg-input-numeric.js +180 -80
  43. package/dist/collection/components/molecules/inputs/mg-input-password/{mg-input-password.stories.js → doc/mg-input-password.stories.js} +16 -2
  44. package/dist/collection/components/molecules/inputs/mg-input-password/mg-input-password.css +37 -9
  45. package/dist/collection/components/molecules/inputs/mg-input-password/mg-input-password.js +108 -47
  46. package/dist/collection/components/molecules/inputs/mg-input-radio/{mg-input-radio.stories.js → doc/mg-input-radio.stories.js} +6 -1
  47. package/dist/collection/components/molecules/inputs/mg-input-radio/mg-input-radio.css +25 -11
  48. package/dist/collection/components/molecules/inputs/mg-input-radio/mg-input-radio.js +113 -42
  49. package/dist/collection/components/molecules/inputs/mg-input-select/{mg-input-select.stories.js → doc/mg-input-select.stories.js} +22 -2
  50. package/dist/collection/components/molecules/inputs/mg-input-select/mg-input-select.css +39 -10
  51. package/dist/collection/components/molecules/inputs/mg-input-select/mg-input-select.js +145 -71
  52. package/dist/collection/components/molecules/inputs/mg-input-text/{mg-input-text.stories.js → doc/mg-input-text.stories.js} +17 -8
  53. package/dist/collection/components/molecules/inputs/mg-input-text/mg-input-text.css +69 -19
  54. package/dist/collection/components/molecules/inputs/mg-input-text/mg-input-text.js +184 -83
  55. package/dist/collection/components/molecules/inputs/mg-input-textarea/{mg-input-textarea.stories.js → doc/mg-input-textarea.stories.js} +16 -5
  56. package/dist/collection/components/molecules/inputs/mg-input-textarea/mg-input-textarea.css +69 -13
  57. package/dist/collection/components/molecules/inputs/mg-input-textarea/mg-input-textarea.js +163 -70
  58. package/dist/collection/components/molecules/inputs/mg-input-toggle/{mg-input-toggle.stories.js → doc/mg-input-toggle.stories.js} +6 -1
  59. package/dist/collection/components/molecules/inputs/mg-input-toggle/mg-input-toggle.css +22 -10
  60. package/dist/collection/components/molecules/inputs/mg-input-toggle/mg-input-toggle.js +68 -33
  61. package/dist/collection/components/molecules/mg-form/doc/mg-form.stories.js +58 -0
  62. package/dist/collection/components/molecules/mg-form/mg-form.css +19 -0
  63. package/dist/collection/components/molecules/mg-form/mg-form.js +271 -0
  64. package/dist/collection/components/molecules/mg-message/{mg-message.stories.js → doc/mg-message.stories.js} +6 -2
  65. package/dist/collection/components/molecules/mg-message/mg-message.css +1 -1
  66. package/dist/collection/components/molecules/mg-message/mg-message.js +26 -11
  67. package/dist/collection/components/molecules/mg-modal/doc/mg-modal.stories.js +51 -0
  68. package/dist/collection/components/molecules/mg-modal/mg-modal.css +52 -0
  69. package/dist/collection/components/molecules/mg-modal/mg-modal.js +240 -0
  70. package/dist/collection/components/molecules/mg-pagination/{mg-pagination.stories.js → doc/mg-pagination.stories.js} +1 -0
  71. package/dist/collection/components/molecules/mg-pagination/mg-pagination.js +47 -28
  72. package/dist/collection/components/molecules/mg-panel/doc/mg-panel.stories.js +39 -0
  73. package/dist/collection/components/molecules/mg-panel/mg-panel.css +53 -0
  74. package/dist/collection/components/molecules/mg-panel/mg-panel.js +356 -0
  75. package/dist/collection/components/molecules/mg-popover/{mg-popover.stories.js → doc/mg-popover.stories.js} +10 -0
  76. package/dist/collection/components/molecules/mg-popover/mg-popover.conf.js +20 -0
  77. package/dist/collection/components/molecules/mg-popover/mg-popover.css +2 -2
  78. package/dist/collection/components/molecules/mg-popover/mg-popover.js +37 -12
  79. package/dist/collection/components/molecules/mg-tabs/{mg-tabs.stories.js → doc/mg-tabs.stories.js} +20 -4
  80. package/dist/collection/components/molecules/mg-tabs/mg-tabs.conf.js +11 -1
  81. package/dist/collection/components/molecules/mg-tabs/mg-tabs.css +17 -3
  82. package/dist/collection/components/molecules/mg-tabs/mg-tabs.js +139 -26
  83. package/dist/collection/locales/index.js +33 -4
  84. package/dist/collection/stories/helpers.stories.js +33 -0
  85. package/dist/collection/utils/components.utils.js +16 -9
  86. package/dist/collection/utils/locale.utils.js +13 -7
  87. package/dist/collection/utils/test.utils.js +27 -15
  88. package/dist/collection/variables.css +39 -5
  89. package/dist/collection/variables.scss +39 -5
  90. package/dist/components/MgInput.js +26 -37
  91. package/dist/components/components.utils.js +16 -9
  92. package/dist/components/index.d.ts +24 -6
  93. package/dist/components/index.js +23 -0
  94. package/dist/components/index2.js +116 -17
  95. package/dist/components/locale.utils.js +13 -8
  96. package/dist/components/mg-badge2.js +25 -9
  97. package/dist/components/mg-button2.js +29 -5
  98. package/dist/components/mg-character-left2.js +14 -26
  99. package/dist/components/mg-form.d.ts +11 -0
  100. package/dist/components/mg-form.js +148 -0
  101. package/dist/components/mg-icon2.js +138 -17
  102. package/dist/components/mg-input-checkbox.js +66 -53
  103. package/dist/components/mg-input-date.js +100 -69
  104. package/dist/components/mg-input-numeric.js +125 -81
  105. package/dist/components/mg-input-password.js +69 -48
  106. package/dist/components/mg-input-radio.js +74 -46
  107. package/dist/components/mg-input-select2.js +103 -71
  108. package/dist/components/mg-input-text.js +1 -237
  109. package/dist/components/mg-input-text2.js +300 -0
  110. package/dist/components/mg-input-textarea.js +100 -46
  111. package/dist/components/mg-input-title2.js +13 -4
  112. package/dist/components/mg-input-toggle.js +39 -31
  113. package/dist/components/mg-message.js +25 -10
  114. package/dist/components/mg-modal.d.ts +11 -0
  115. package/dist/components/mg-modal.js +153 -0
  116. package/dist/components/mg-pagination.js +45 -31
  117. package/dist/components/mg-panel.d.ts +11 -0
  118. package/dist/components/mg-panel.js +244 -0
  119. package/dist/components/mg-popover.js +31 -11
  120. package/dist/components/mg-tabs.js +113 -23
  121. package/dist/components/mg-tag.js +27 -5
  122. package/dist/components/mg-tooltip2.js +10 -1
  123. package/dist/components/popper.js +6 -2
  124. package/dist/esm/{index-e3e84606.js → index-bca81100.js} +124 -46
  125. package/dist/esm/index-e51ae032.js +228 -0
  126. package/dist/esm/loader.js +3 -17
  127. package/dist/esm/mg-badge_21.entry.js +3514 -0
  128. package/dist/esm/mg-components.js +3 -7
  129. package/dist/esm/mg-modal.entry.js +113 -0
  130. package/dist/esm/mg-popover.entry.js +166 -0
  131. package/dist/esm/polyfills/css-shim.js +1 -1
  132. package/dist/esm/popper-93ecb064.js +1788 -0
  133. package/dist/index.js +1 -1
  134. package/dist/mg-components/mg-components.css +1 -1
  135. package/dist/mg-components/mg-components.esm.js +1 -1
  136. package/dist/mg-components/p-003a1344.entry.js +1 -0
  137. package/dist/mg-components/p-462d648a.entry.js +1 -0
  138. package/dist/mg-components/p-4c66f794.js +1 -0
  139. package/dist/mg-components/p-5126ab10.entry.js +1 -0
  140. package/dist/mg-components/p-780bd52d.js +1 -0
  141. package/dist/mg-components/p-b14a3443.js +2 -0
  142. package/dist/mg-components/variables.css +39 -5
  143. package/dist/mg-components/variables.scss +39 -5
  144. package/dist/types/components/atoms/mg-badge/{mg-badge.stories.d.ts → doc/mg-badge.stories.d.ts} +5 -0
  145. package/dist/types/components/atoms/mg-badge/mg-badge.d.ts +16 -5
  146. package/dist/types/components/atoms/mg-button/{mg-button.stories.d.ts → doc/mg-button.stories.d.ts} +5 -0
  147. package/dist/types/components/atoms/mg-button/mg-button.d.ts +23 -3
  148. package/dist/types/components/atoms/mg-character-left/{mg-character-left.stories.d.ts → doc/mg-character-left.stories.d.ts} +9 -0
  149. package/dist/types/components/atoms/mg-character-left/mg-character-left.d.ts +16 -13
  150. package/dist/types/components/atoms/mg-icon/{mg-icon.stories.d.ts → doc/mg-icon.stories.d.ts} +0 -0
  151. package/dist/types/components/atoms/mg-icon/mg-icon.conf.d.ts +1 -1
  152. package/dist/types/components/atoms/mg-icon/mg-icon.d.ts +14 -4
  153. package/dist/types/components/atoms/mg-input-title/{mg-input-title.stories.d.ts → doc/mg-input-title.stories.d.ts} +0 -0
  154. package/dist/types/components/atoms/mg-input-title/mg-input-title.d.ts +11 -1
  155. package/dist/types/components/atoms/mg-tag/{mg-tag.stories.d.ts → doc/mg-tag.stories.d.ts} +5 -0
  156. package/dist/types/components/atoms/mg-tag/mg-tag.d.ts +18 -4
  157. package/dist/types/components/atoms/mg-tooltip/doc/mg-tooltip.stories.d.ts +29 -0
  158. package/dist/types/components/atoms/mg-tooltip/mg-tooltip.conf.d.ts +8 -0
  159. package/dist/types/components/atoms/mg-tooltip/mg-tooltip.d.ts +13 -3
  160. package/dist/types/components/molecules/inputs/MgInput.conf.d.ts +6 -4
  161. package/dist/types/components/molecules/inputs/MgInput.d.ts +7 -8
  162. package/dist/types/components/molecules/inputs/mg-input-checkbox/{mg-input-checkbox.stories.d.ts → doc/mg-input-checkbox.stories.d.ts} +5 -0
  163. package/dist/types/components/molecules/inputs/mg-input-checkbox/mg-input-checkbox.d.ts +36 -13
  164. package/dist/types/components/molecules/inputs/mg-input-date/{mg-input-date.stories.d.ts → doc/mg-input-date.stories.d.ts} +5 -0
  165. package/dist/types/components/molecules/inputs/mg-input-date/mg-input-date.d.ts +46 -15
  166. package/dist/types/components/molecules/inputs/mg-input-numeric/{mg-input-numeric.stories.d.ts → doc/mg-input-numeric.stories.d.ts} +11 -0
  167. package/dist/types/components/molecules/inputs/mg-input-numeric/mg-input-numeric.d.ts +61 -16
  168. package/dist/types/components/molecules/inputs/mg-input-password/doc/mg-input-password.stories.d.ts +22 -0
  169. package/dist/types/components/molecules/inputs/mg-input-password/mg-input-password.d.ts +35 -11
  170. package/dist/types/components/molecules/inputs/mg-input-radio/{mg-input-radio.stories.d.ts → doc/mg-input-radio.stories.d.ts} +5 -0
  171. package/dist/types/components/molecules/inputs/mg-input-radio/mg-input-radio.conf.d.ts +1 -1
  172. package/dist/types/components/molecules/inputs/mg-input-radio/mg-input-radio.d.ts +42 -9
  173. package/dist/types/components/molecules/inputs/mg-input-select/doc/mg-input-select.stories.d.ts +34 -0
  174. package/dist/types/components/molecules/inputs/mg-input-select/mg-input-select.conf.d.ts +1 -1
  175. package/dist/types/components/molecules/inputs/mg-input-select/mg-input-select.d.ts +37 -9
  176. package/dist/types/components/molecules/inputs/mg-input-text/{mg-input-text.stories.d.ts → doc/mg-input-text.stories.d.ts} +13 -0
  177. package/dist/types/components/molecules/inputs/mg-input-text/mg-input-text.d.ts +52 -16
  178. package/dist/types/components/molecules/inputs/mg-input-textarea/doc/mg-input-textarea.stories.d.ts +19 -0
  179. package/dist/types/components/molecules/inputs/mg-input-textarea/mg-input-textarea.d.ts +45 -17
  180. package/dist/types/components/molecules/inputs/mg-input-toggle/{mg-input-toggle.stories.d.ts → doc/mg-input-toggle.stories.d.ts} +5 -0
  181. package/dist/types/components/molecules/inputs/mg-input-toggle/mg-input-toggle.conf.d.ts +1 -1
  182. package/dist/types/components/molecules/inputs/mg-input-toggle/mg-input-toggle.d.ts +29 -12
  183. package/dist/types/components/molecules/{mg-popover/mg-popover.stories.d.ts → mg-form/doc/mg-form.stories.d.ts} +3 -4
  184. package/dist/types/components/molecules/mg-form/mg-form.d.ts +83 -0
  185. package/dist/types/components/molecules/mg-message/{mg-message.stories.d.ts → doc/mg-message.stories.d.ts} +10 -0
  186. package/dist/types/components/molecules/mg-message/mg-message.d.ts +13 -4
  187. package/dist/types/components/molecules/mg-modal/doc/mg-modal.stories.d.ts +13 -0
  188. package/dist/types/components/molecules/mg-modal/mg-modal.d.ts +85 -0
  189. package/dist/types/components/molecules/mg-pagination/{mg-pagination.stories.d.ts → doc/mg-pagination.stories.d.ts} +5 -0
  190. package/dist/types/components/molecules/mg-pagination/mg-pagination.d.ts +31 -7
  191. package/dist/types/components/molecules/mg-panel/doc/mg-panel.stories.d.ts +11 -0
  192. package/dist/types/components/molecules/mg-panel/mg-panel.d.ts +139 -0
  193. package/dist/types/components/molecules/mg-popover/doc/mg-popover.stories.d.ts +25 -0
  194. package/dist/types/components/molecules/mg-popover/mg-popover.conf.d.ts +8 -0
  195. package/dist/types/components/molecules/mg-popover/mg-popover.d.ts +27 -4
  196. package/dist/types/components/molecules/mg-tabs/doc/mg-tabs.stories.d.ts +20 -0
  197. package/dist/types/components/molecules/mg-tabs/mg-tabs.conf.d.ts +11 -0
  198. package/dist/types/components/molecules/mg-tabs/mg-tabs.d.ts +70 -6
  199. package/dist/types/components.d.ts +528 -211
  200. package/dist/types/locales/index.d.ts +108 -38
  201. package/dist/types/stories/{buttons.stories.d.ts → helpers.stories.d.ts} +1 -1
  202. package/dist/types/utils/components.utils.d.ts +16 -9
  203. package/dist/types/utils/locale.utils.d.ts +13 -6
  204. package/dist/types/utils/test.utils.d.ts +13 -1
  205. package/loader/index.js +1 -1
  206. package/package.json +45 -14
  207. package/readme.md +9 -35
  208. package/dist/cjs/css-shim-a22512c4.js +0 -6
  209. package/dist/cjs/mg-badge_20.cjs.entry.js +0 -4661
  210. package/dist/cjs/shadow-css-8940f82d.js +0 -390
  211. package/dist/collection/stories/buttons.stories.js +0 -43
  212. package/dist/collection/stories/messages.stories.js +0 -44
  213. package/dist/collection/stories/tags.stories.js +0 -13
  214. package/dist/esm/css-shim-7c240feb.js +0 -4
  215. package/dist/esm/mg-badge_20.entry.js +0 -4638
  216. package/dist/esm/shadow-css-5d2d01ce.js +0 -388
  217. package/dist/esm-es5/css-shim-7c240feb.js +0 -1
  218. package/dist/esm-es5/index-e3e84606.js +0 -1
  219. package/dist/esm-es5/index.js +0 -0
  220. package/dist/esm-es5/loader.js +0 -1
  221. package/dist/esm-es5/mg-badge_20.entry.js +0 -2
  222. package/dist/esm-es5/mg-components.js +0 -1
  223. package/dist/esm-es5/shadow-css-5d2d01ce.js +0 -12
  224. package/dist/mg-components/mg-components.js +0 -132
  225. package/dist/mg-components/p-1cd24462.system.js +0 -1
  226. package/dist/mg-components/p-2e2f6b27.system.entry.js +0 -2
  227. package/dist/mg-components/p-366a224e.js +0 -1
  228. package/dist/mg-components/p-422c429b.system.js +0 -1
  229. package/dist/mg-components/p-50ea2036.system.js +0 -1
  230. package/dist/mg-components/p-62fa3797.js +0 -1
  231. package/dist/mg-components/p-71d57b8b.system.js +0 -13
  232. package/dist/mg-components/p-9a215712.system.js +0 -1
  233. package/dist/mg-components/p-cbf0464b.entry.js +0 -1
  234. package/dist/mg-components/p-f6455ab3.js +0 -12
  235. package/dist/types/components/atoms/mg-tooltip/mg-tooltip.stories.d.ts +0 -11
  236. package/dist/types/components/molecules/inputs/mg-input-password/mg-input-password.stories.d.ts +0 -9
  237. package/dist/types/components/molecules/inputs/mg-input-select/mg-input-select.stories.d.ts +0 -14
  238. package/dist/types/components/molecules/inputs/mg-input-textarea/mg-input-textarea.stories.d.ts +0 -6
  239. package/dist/types/components/molecules/mg-tabs/mg-tabs.stories.d.ts +0 -7
  240. package/dist/types/stories/messages.stories.d.ts +0 -13
  241. package/dist/types/stories/tags.stories.d.ts +0 -5
@@ -10,16 +10,10 @@
10
10
  align-items: flex-start;
11
11
  min-height: var(--default-size);
12
12
  max-width: 100%;
13
- /* Style when input is not valid */
13
+ margin-bottom: var(--mg-inputs-margin-bottom, 0);
14
14
  /* Label */
15
15
  /* Label-on-top */
16
16
  }
17
- .mg-input.is-not-valid {
18
- color: hsl(var(--color-danger));
19
- }
20
- .mg-input.is-not-valid .mg-input__box {
21
- border-color: hsl(var(--color-danger));
22
- }
23
17
  .mg-input mg-input-title {
24
18
  flex-shrink: var(--mg-inputs-shrink, 1);
25
19
  width: var(--mg-inputs-title-width, auto);
@@ -73,6 +67,11 @@
73
67
  .mg-input__input-container mg-icon {
74
68
  display: flex;
75
69
  }
70
+ .mg-input__input-container .mg-input__help-text,
71
+ .mg-input__input-container .mg-input__error {
72
+ text-align: start;
73
+ font-size: 1.2rem;
74
+ }
76
75
 
77
76
  .mg-input__input {
78
77
  display: flex;
@@ -81,11 +80,22 @@
81
80
  .mg-input__input mg-tooltip {
82
81
  margin-top: calc((var(--default-size) - var(--mg-icon-regular-size)) / 2);
83
82
  }
84
- .mg-input__input + * {
85
- text-align: start;
83
+ .mg-input__input.mg-input__input--has-error .mg-input__box {
84
+ border-color: hsl(var(--color-danger));
85
+ }
86
+ .mg-input__input + .mg-input__help-text, .mg-input__input + .mg-input__error {
86
87
  margin-top: 0.5rem;
87
88
  }
88
89
 
90
+ .mg-input__error {
91
+ display: inline-block;
92
+ margin-top: 0.2rem;
93
+ padding: 0.3rem 0.8rem;
94
+ border-radius: 0.3rem;
95
+ background: hsl(var(--mg-inputs-error-bg-color));
96
+ color: hsl(var(--color-danger));
97
+ }
98
+
89
99
  /**
90
100
  * Style for input "box":
91
101
  * - input[type="text"]
@@ -106,6 +116,7 @@
106
116
  font-family: inherit;
107
117
  color: hsl(var(--color-dark));
108
118
  font-size: var(--font-size);
119
+ text-align: var(--mg-inputs-text-align, left);
109
120
  }
110
121
  .mg-input__box::placeholder {
111
122
  color: var(--mg-inputs-color);
@@ -145,6 +156,23 @@
145
156
  display: none;
146
157
  }
147
158
 
159
+ .mg-input.mg-input--label-on-top .mg-input__box {
160
+ width: auto;
161
+ max-width: 100%;
162
+ }
163
+
164
+ .mg-input.mg-input--has-buttons-group-append ::slotted([slot=append-input]) {
165
+ --mg-button-border-radius-top-right: 0;
166
+ --mg-button-border-radius-bottom-right: 0;
167
+ }
168
+ .mg-input.mg-input--has-buttons-group-append ::slotted([slot=append-input]:not(:last-of-type)) {
169
+ --mg-button-border-right-width: 0;
170
+ }
171
+ .mg-input.mg-input--has-buttons-group-append ::slotted([slot=append-input]:last-of-type) {
172
+ --mg-button-border-radius-top-right: var(--mg-inputs-border-radius);
173
+ --mg-button-border-radius-bottom-right: var(--mg-inputs-border-radius);
174
+ }
175
+
148
176
  .mg-input.mg-input--is-append-input-slot-content:not(.mg-input--readonly) ::slotted([slot=append-input]) {
149
177
  padding-top: calc((var(--default-size) - var(--mg-icon-regular-size)) / 2);
150
178
  }
@@ -195,7 +223,8 @@
195
223
  }
196
224
 
197
225
  .mg-input__box {
226
+ width: 100%;
198
227
  padding-top: 0;
199
228
  padding-bottom: 0;
200
- padding-right: 0;
229
+ padding-right: 1rem;
201
230
  }
@@ -1,31 +1,34 @@
1
- import { Component, Event, h, Prop, State, Watch } from '@stencil/core';
1
+ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
2
+ /* eslint-disable @typescript-eslint/no-explicit-any */
3
+ import { Component, Element, Event, h, Prop, State, Watch, Method } from '@stencil/core';
2
4
  import { MgInput } from '../MgInput';
3
5
  import { createID, ClassList, allItemsAreString } from '../../../../utils/components.utils';
4
- import { messages } from '../../../../locales';
5
- import { InputClass } from '../MgInput.conf';
6
+ import { initLocales } from '../../../../locales';
6
7
  /**
7
8
  * Check if item is a well configured option
8
- * @param option
9
- * @returns {boolean}
9
+ *
10
+ * @param {SelectOption} option select option
11
+ * @returns {boolean} select option type is valid
10
12
  */
11
- const isOption = (option) => typeof option === 'object' && typeof option.title === 'string' && option.value !== undefined;
13
+ const isOption = (option) => typeof option === 'object' && typeof option.title === 'string';
12
14
  /**
13
15
  * Group options
14
- * @param acc
15
- * @param {SelectOption} item
16
- * @param {string} item.group
17
- * @param {string} item.title
18
- * @param {any} item.value
19
- * @param {boolean} item.disabled
20
- * @returns {OptGroup} grouped options
16
+ *
17
+ * @param {(SelectOption | OptGroup)[]} acc reduce accumulator
18
+ * @param {SelectOption} item item to add
19
+ * @param {string} item.group item group
20
+ * @param {string} item.title item title
21
+ * @param {unknown} item.value item value
22
+ * @param {boolean} item.disabled is item disabled
23
+ * @returns {(SelectOption | OptGroup)[]} grouped options
21
24
  */
22
25
  const groupOptions = (acc, { group, title, value, disabled }) => {
23
26
  if (group !== undefined) {
24
27
  // Check if group is already created
25
- const optgroup = acc.find((grp) => grp.group === group);
28
+ const optGroup = acc.find(grp => grp.group === group);
26
29
  // Add to group
27
- if (optgroup) {
28
- optgroup.options.push({ title, value, disabled });
30
+ if (optGroup !== undefined) {
31
+ optGroup.options.push({ title, value, disabled });
29
32
  }
30
33
  // Create group
31
34
  else {
@@ -39,11 +42,8 @@ const groupOptions = (acc, { group, title, value, disabled }) => {
39
42
  };
40
43
  export class MgInputSelect {
41
44
  constructor() {
42
- /************
43
- * Internal *
44
- ************/
45
- // classes
46
- this.classError = InputClass.ERROR;
45
+ // hasError (triggered by blur event)
46
+ this.hasError = false;
47
47
  /**
48
48
  * Identifier is used for the element ID (id is a reserved prop in Stencil.js)
49
49
  * If not set, it will be created.
@@ -58,11 +58,6 @@ export class MgInputSelect {
58
58
  * Define if label is visible
59
59
  */
60
60
  this.labelHide = false;
61
- /**
62
- * Input placeholder.
63
- * It should be a word or short phrase that demonstrates the expected type of data, not a replacement for labels or help text.
64
- */
65
- this.placeholder = messages.input.select.placeholder;
66
61
  /**
67
62
  * Option to remove placeholder
68
63
  */
@@ -92,28 +87,66 @@ export class MgInputSelect {
92
87
  */
93
88
  this.handleInput = () => {
94
89
  this.checkValidity();
95
- this.value = this.input.value !== '' ? this.options[this.input.value].value : null;
96
- this.valueChange.emit(this.value);
90
+ if (this.hasError) {
91
+ this.checkError();
92
+ }
93
+ if (this.input.value !== '') {
94
+ this.value = allItemsAreString(this.items) ? this.input.value : this.items.find(item => item.title === this.input.value).value;
95
+ }
96
+ else {
97
+ this.value = null;
98
+ }
97
99
  };
98
100
  /**
99
101
  * Handle blur event
100
102
  */
101
103
  this.handleBlur = () => {
102
- this.checkValidity();
103
- this.checkError();
104
+ this.displayError();
105
+ };
106
+ /**
107
+ * Check if input is valid
108
+ */
109
+ this.checkValidity = () => {
110
+ if (!this.readonly && this.input !== undefined) {
111
+ const validity = this.input.checkValidity && this.input.checkValidity();
112
+ // Set validity
113
+ this.valid = validity;
114
+ this.invalid = !validity;
115
+ //Send event
116
+ this.inputValid.emit(validity);
117
+ }
118
+ };
119
+ /**
120
+ * Check input errors
121
+ */
122
+ this.checkError = () => {
123
+ // Set error message
124
+ this.errorMessage = undefined;
125
+ if (!this.valid && this.input.validity.valueMissing) {
126
+ this.errorMessage = this.messages.errors.required;
127
+ }
104
128
  };
105
129
  }
130
+ handleValue(newValue) {
131
+ if (newValue !== null) {
132
+ this.readonlyValue = allItemsAreString(this.items) ? this.input.value : this.items.find(item => item.value === newValue).title;
133
+ }
134
+ else {
135
+ this.readonlyValue = null;
136
+ }
137
+ this.valueChange.emit(newValue);
138
+ }
106
139
  validateItems(newValue) {
107
140
  // String array
108
141
  if (allItemsAreString(newValue)) {
109
142
  this.valueExist = newValue.includes(this.value);
110
- this.options = newValue.map(item => ({ title: item, value: item }));
143
+ this.options = newValue.map((item) => ({ title: item, value: item }));
111
144
  }
112
145
  // Object array
113
146
  else if (newValue && newValue.every(item => isOption(item))) {
114
147
  this.valueExist = newValue.map(item => item.value).includes(this.value);
115
148
  // Grouped object options
116
- if (newValue.some((item) => item.group !== undefined)) {
149
+ if (newValue.some(item => item.group !== undefined)) {
117
150
  this.options = newValue.reduce(groupOptions, []);
118
151
  }
119
152
  // Standart object options
@@ -126,49 +159,50 @@ export class MgInputSelect {
126
159
  }
127
160
  }
128
161
  /**
129
- * Check if input is valid
162
+ * Public method to display errors
163
+ *
164
+ * @returns {Promise<void>}
130
165
  */
131
- checkValidity() {
132
- if (!this.readonly && this.input !== undefined) {
133
- const validity = this.input.checkValidity && this.input.checkValidity();
134
- // Set validity
135
- this.valid = validity;
136
- this.invalid = !validity;
137
- }
138
- }
139
- /**
140
- * Check input errors
141
- */
142
- checkError() {
143
- // Set error message
144
- this.errorMessage = undefined;
145
- if (!this.valid && this.input.validity.valueMissing) {
146
- this.errorMessage = messages.errors.required;
147
- }
148
- // Update class
149
- if (this.valid) {
150
- this.classList.delete(this.classError);
151
- }
152
- else {
153
- this.classList.add(this.classError);
154
- }
166
+ async displayError() {
167
+ this.checkValidity();
168
+ this.checkError();
169
+ this.hasError = this.invalid;
155
170
  }
156
171
  /*************
157
172
  * Lifecycle *
158
173
  *************/
174
+ /**
175
+ * Check if component props are well configured on init
176
+ *
177
+ * @returns {ReturnType<typeof setTimeout>} timeout
178
+ */
159
179
  componentWillLoad() {
160
- // Check items format
180
+ // Get locales
181
+ this.messages = initLocales(this.element).messages;
182
+ // Validate
161
183
  this.validateItems(this.items);
184
+ // Set default placeholder
185
+ if (this.placeholder === undefined || this.placeholder === '') {
186
+ this.placeholder = this.messages.input.select.placeholder;
187
+ }
188
+ // Check validity when component is ready
162
189
  // return a promise to process action only in the FIRST render().
163
190
  // https://stenciljs.com/docs/component-lifecycle#componentwillload
164
- return setTimeout(() => this.checkValidity(), 0);
191
+ return setTimeout(() => {
192
+ this.checkValidity();
193
+ }, 0);
165
194
  }
195
+ /**
196
+ * Render
197
+ *
198
+ * @returns {HTMLElement} HTML Element
199
+ */
166
200
  render() {
167
- return (h(MgInput, { identifier: this.identifier, classList: this.classList, label: this.label, labelOnTop: this.labelOnTop, labelHide: this.labelHide, required: this.required, readonly: this.readonly, width: this.width, disabled: this.disabled, value: this.value, readonlyValue: undefined, tooltip: this.tooltip, displayCharacterLeft: undefined, characterLeftTemplate: undefined, maxlength: undefined, helpText: this.helpText, errorMessage: this.errorMessage, isFieldset: false },
201
+ return (h(MgInput, { identifier: this.identifier, classList: this.classList, ariaDescribedbyIDs: [], label: this.label, labelOnTop: this.labelOnTop, labelHide: this.labelHide, required: this.required, readonly: this.readonly, mgWidth: this.mgWidth, disabled: this.disabled, value: this.value, readonlyValue: this.readonlyValue, tooltip: this.tooltip, helpText: this.helpText, errorMessage: this.errorMessage, isFieldset: false },
168
202
  h("select", { class: "mg-input__box", id: this.identifier, name: this.name, title: this.placeholder, disabled: this.disabled, required: this.required, onInput: this.handleInput, onBlur: this.handleBlur, ref: el => (this.input = el) },
169
203
  (!this.placeholderHide || !this.valueExist) && ( // In case passed value does not match any option we display the placeholder
170
204
  h("option", { value: "", disabled: this.placeholderDisabled && this.valueExist }, this.placeholder)),
171
- this.options.map((option, optionIndex) => option.group !== undefined ? (h("optgroup", { label: option.group }, option.options.map((optgroup, optgroupIndex) => (h("option", { value: optgroupIndex, selected: JSON.stringify(this.value) === JSON.stringify(optgroup.value), disabled: optgroup.disabled }, optgroup.title))))) : (h("option", { value: optionIndex, selected: JSON.stringify(this.value) === JSON.stringify(option.value), disabled: option.disabled }, option.title))))));
205
+ this.options.map(option => option.group !== undefined ? (h("optgroup", { label: option.group }, option.options.map(optgroup => (h("option", { value: optgroup.title, selected: JSON.stringify(this.value) === JSON.stringify(optgroup.value), disabled: optgroup.disabled }, optgroup.title))))) : (h("option", { value: option.title, selected: JSON.stringify(this.value) === JSON.stringify(option.value), disabled: option.disabled }, option.title))))));
172
206
  }
173
207
  static get is() { return "mg-input-select"; }
174
208
  static get encapsulation() { return "shadow"; }
@@ -264,7 +298,7 @@ export class MgInputSelect {
264
298
  "optional": false,
265
299
  "docs": {
266
300
  "tags": [],
267
- "text": "Input label\nRequired"
301
+ "text": "Input label"
268
302
  },
269
303
  "attribute": "label",
270
304
  "reflect": false
@@ -306,7 +340,7 @@ export class MgInputSelect {
306
340
  },
307
341
  "placeholder": {
308
342
  "type": "string",
309
- "mutable": false,
343
+ "mutable": true,
310
344
  "complexType": {
311
345
  "original": "string",
312
346
  "resolved": "string",
@@ -319,8 +353,7 @@ export class MgInputSelect {
319
353
  "text": "Input placeholder.\nIt should be a word or short phrase that demonstrates the expected type of data, not a replacement for labels or help text."
320
354
  },
321
355
  "attribute": "placeholder",
322
- "reflect": false,
323
- "defaultValue": "messages.input.select.placeholder"
356
+ "reflect": false
324
357
  },
325
358
  "placeholderHide": {
326
359
  "type": "boolean",
@@ -412,7 +445,7 @@ export class MgInputSelect {
412
445
  "reflect": false,
413
446
  "defaultValue": "false"
414
447
  },
415
- "width": {
448
+ "mgWidth": {
416
449
  "type": "any",
417
450
  "mutable": false,
418
451
  "complexType": {
@@ -431,7 +464,7 @@ export class MgInputSelect {
431
464
  "tags": [],
432
465
  "text": "Define input width"
433
466
  },
434
- "attribute": "width",
467
+ "attribute": "mg-width",
435
468
  "reflect": false
436
469
  },
437
470
  "tooltip": {
@@ -507,7 +540,8 @@ export class MgInputSelect {
507
540
  "classList": {},
508
541
  "errorMessage": {},
509
542
  "options": {},
510
- "valueExist": {}
543
+ "valueExist": {},
544
+ "readonlyValue": {}
511
545
  }; }
512
546
  static get events() { return [{
513
547
  "method": "valueChange",
@@ -517,15 +551,55 @@ export class MgInputSelect {
517
551
  "composed": true,
518
552
  "docs": {
519
553
  "tags": [],
520
- "text": "Emmited event when value change"
554
+ "text": "Emited event when value change"
521
555
  },
522
556
  "complexType": {
523
- "original": "string",
524
- "resolved": "string",
557
+ "original": "any",
558
+ "resolved": "any",
559
+ "references": {}
560
+ }
561
+ }, {
562
+ "method": "inputValid",
563
+ "name": "input-valid",
564
+ "bubbles": true,
565
+ "cancelable": true,
566
+ "composed": true,
567
+ "docs": {
568
+ "tags": [],
569
+ "text": "Emited event when checking validity"
570
+ },
571
+ "complexType": {
572
+ "original": "boolean",
573
+ "resolved": "boolean",
525
574
  "references": {}
526
575
  }
527
576
  }]; }
577
+ static get methods() { return {
578
+ "displayError": {
579
+ "complexType": {
580
+ "signature": "() => Promise<void>",
581
+ "parameters": [],
582
+ "references": {
583
+ "Promise": {
584
+ "location": "global"
585
+ }
586
+ },
587
+ "return": "Promise<void>"
588
+ },
589
+ "docs": {
590
+ "text": "Public method to display errors",
591
+ "tags": [{
592
+ "name": "returns",
593
+ "text": undefined
594
+ }]
595
+ }
596
+ }
597
+ }; }
598
+ static get elementRef() { return "element"; }
528
599
  static get watchers() { return [{
600
+ "propName": "value",
601
+ "methodName": "handleValue"
602
+ }, {
529
603
  "propName": "items",
530
604
  "methodName": "validateItems"
531
605
  }]; }
@@ -2,12 +2,23 @@ import { h } from '@stencil/core';
2
2
  export default {
3
3
  component: 'mg-input-text',
4
4
  title: 'Molecules/Inputs/mg-input-text',
5
+ argTypes: {
6
+ mgWidth: {
7
+ options: [2, 4, 16, 'full'],
8
+ control: { type: 'select' },
9
+ },
10
+ },
11
+ parameters: { actions: { handles: ['value-change', 'input-valid'] } },
5
12
  };
6
13
  /**
7
14
  * 1. camelCase arguments must be written in the template, for exemple labelOnTop must be placed in the template as label-on-top={args.labelOnTop}
8
15
  * 2. boolean arguments with a default true value must be added like display-character-left={args.displayCharacterLeft ? 'true' : 'false'}
16
+ *
17
+ * @param {any} args component arguments
18
+ * @returns {HTMLElement} HTMLElement
9
19
  */
10
- const Template = args => {
20
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
+ const Template = (args) => {
11
22
  const labelOnTop = args.labelOnTop;
12
23
  delete args.labelOnTop;
13
24
  const labelHide = args.labelHide;
@@ -16,12 +27,12 @@ const Template = args => {
16
27
  delete args.patternErrorMessage;
17
28
  const displayCharacterLeft = args.displayCharacterLeft;
18
29
  delete args.displayCharacterLeft;
19
- const characterLeftTemplate = args.characterLeftTemplate;
20
- delete args.characterLeftTemplate;
21
30
  const helpText = args.helpText;
22
31
  delete args.helpText;
32
+ const mgWidth = args.mgWidth;
33
+ delete args.mgWidth;
23
34
  // return element
24
- return (h("mg-input-text", Object.assign({}, args, { "label-on-top": labelOnTop, "label-hide": labelHide, "pattern-error-message": patternErrorMessage, "display-character-left": displayCharacterLeft, "character-left-template": characterLeftTemplate, "help-text": helpText })));
35
+ return (h("mg-input-text", Object.assign({}, args, { "label-on-top": labelOnTop, "label-hide": labelHide, "pattern-error-message": patternErrorMessage, "display-character-left": displayCharacterLeft ? 'true' : 'false', "help-text": helpText, "mg-width": mgWidth })));
25
36
  };
26
37
  /**
27
38
  * Global use
@@ -44,11 +55,11 @@ MgInputText.args = {
44
55
  readonly: false,
45
56
  pattern: undefined,
46
57
  patternErrorMessage: undefined,
58
+ mgWidth: 'full',
47
59
  // Tooltip
48
60
  tooltip: 'This is a tooltip',
49
61
  // Nb Char Left
50
62
  displayCharacterLeft: true,
51
- characterLeftTemplate: '{counter} characters left.',
52
63
  // Help Text
53
64
  helpText: 'Help text with html <strong>bold</strong>, <em>italic</em>.',
54
65
  };
@@ -102,11 +113,9 @@ const SearchTemplate = args => {
102
113
  delete args.patternErrorMessage;
103
114
  const displayCharacterLeft = args.displayCharacterLeft;
104
115
  delete args.displayCharacterLeft;
105
- const characterLeftTemplate = args.characterLeftTemplate;
106
- delete args.characterLeftTemplate;
107
116
  // return element
108
117
  return (h("form", { role: "search" },
109
- h("mg-input-text", Object.assign({}, args, { "label-on-top": labelOnTop, "label-hide": labelHide, "pattern-error-message": patternErrorMessage, "display-character-left": displayCharacterLeft, "character-left-template": characterLeftTemplate }),
118
+ h("mg-input-text", Object.assign({}, args, { "label-on-top": labelOnTop, "label-hide": labelHide, "pattern-error-message": patternErrorMessage, "display-character-left": displayCharacterLeft }),
110
119
  h("mg-button", { slot: "append-input", label: "search" },
111
120
  h("mg-icon", { icon: "magnifying-glass" }),
112
121
  " Search"))));
@@ -10,16 +10,10 @@
10
10
  align-items: flex-start;
11
11
  min-height: var(--default-size);
12
12
  max-width: 100%;
13
- /* Style when input is not valid */
13
+ margin-bottom: var(--mg-inputs-margin-bottom, 0);
14
14
  /* Label */
15
15
  /* Label-on-top */
16
16
  }
17
- .mg-input.is-not-valid {
18
- color: hsl(var(--color-danger));
19
- }
20
- .mg-input.is-not-valid .mg-input__box {
21
- border-color: hsl(var(--color-danger));
22
- }
23
17
  .mg-input mg-input-title {
24
18
  flex-shrink: var(--mg-inputs-shrink, 1);
25
19
  width: var(--mg-inputs-title-width, auto);
@@ -73,6 +67,11 @@
73
67
  .mg-input__input-container mg-icon {
74
68
  display: flex;
75
69
  }
70
+ .mg-input__input-container .mg-input__help-text,
71
+ .mg-input__input-container .mg-input__error {
72
+ text-align: start;
73
+ font-size: 1.2rem;
74
+ }
76
75
 
77
76
  .mg-input__input {
78
77
  display: flex;
@@ -81,11 +80,22 @@
81
80
  .mg-input__input mg-tooltip {
82
81
  margin-top: calc((var(--default-size) - var(--mg-icon-regular-size)) / 2);
83
82
  }
84
- .mg-input__input + * {
85
- text-align: start;
83
+ .mg-input__input.mg-input__input--has-error .mg-input__box {
84
+ border-color: hsl(var(--color-danger));
85
+ }
86
+ .mg-input__input + .mg-input__help-text, .mg-input__input + .mg-input__error {
86
87
  margin-top: 0.5rem;
87
88
  }
88
89
 
90
+ .mg-input__error {
91
+ display: inline-block;
92
+ margin-top: 0.2rem;
93
+ padding: 0.3rem 0.8rem;
94
+ border-radius: 0.3rem;
95
+ background: hsl(var(--mg-inputs-error-bg-color));
96
+ color: hsl(var(--color-danger));
97
+ }
98
+
89
99
  /**
90
100
  * Style for input "box":
91
101
  * - input[type="text"]
@@ -106,6 +116,7 @@
106
116
  font-family: inherit;
107
117
  color: hsl(var(--color-dark));
108
118
  font-size: var(--font-size);
119
+ text-align: var(--mg-inputs-text-align, left);
109
120
  }
110
121
  .mg-input__box::placeholder {
111
122
  color: var(--mg-inputs-color);
@@ -145,6 +156,23 @@
145
156
  display: none;
146
157
  }
147
158
 
159
+ .mg-input.mg-input--label-on-top .mg-input__box {
160
+ width: auto;
161
+ max-width: 100%;
162
+ }
163
+
164
+ .mg-input.mg-input--has-buttons-group-append ::slotted([slot=append-input]) {
165
+ --mg-button-border-radius-top-right: 0;
166
+ --mg-button-border-radius-bottom-right: 0;
167
+ }
168
+ .mg-input.mg-input--has-buttons-group-append ::slotted([slot=append-input]:not(:last-of-type)) {
169
+ --mg-button-border-right-width: 0;
170
+ }
171
+ .mg-input.mg-input--has-buttons-group-append ::slotted([slot=append-input]:last-of-type) {
172
+ --mg-button-border-radius-top-right: var(--mg-inputs-border-radius);
173
+ --mg-button-border-radius-bottom-right: var(--mg-inputs-border-radius);
174
+ }
175
+
148
176
  .mg-input.mg-input--is-append-input-slot-content:not(.mg-input--readonly) ::slotted([slot=append-input]) {
149
177
  padding-top: calc((var(--default-size) - var(--mg-icon-regular-size)) / 2);
150
178
  }
@@ -174,13 +202,14 @@
174
202
  }
175
203
 
176
204
  /**
177
- * Manage display mg-character-left on focus
205
+ * Set mg-character-left with inputs
178
206
  */
179
207
  .mg-input mg-character-left {
180
- display: none;
208
+ opacity: 0.6;
209
+ font-size: 1.1rem;
181
210
  }
182
- .mg-input.is-focused mg-character-left {
183
- display: block;
211
+ .mg-input.mg-input--has-display-character-left .mg-input__input + .mg-input__help-text, .mg-input.mg-input--has-display-character-left .mg-input__input + .mg-input__error {
212
+ margin-top: 0;
184
213
  }
185
214
 
186
215
  /**
@@ -207,16 +236,37 @@
207
236
  /**
208
237
  * Icon in input
209
238
  */
210
- .mg-input.mg-input--has-icon .mg-input__input {
211
- position: relative;
212
- }
213
- .mg-input.mg-input--has-icon .mg-input__input > mg-icon {
239
+ .mg-input.mg-input--has-icon .mg-input__with-character-left > mg-icon {
214
240
  position: absolute;
215
- top: calc(var(--default-size) - var(--mg-icon-regular-size));
241
+ top: 50%;
216
242
  left: var(--mg-inputs-spacer);
217
243
  color: var(--mg-inputs-color);
218
244
  transform: translateY(-50%);
219
245
  }
220
- .mg-input.mg-input--has-icon .mg-input__input .mg-input__box {
246
+ .mg-input.mg-input--has-icon .mg-input__with-character-left .mg-input__box {
221
247
  padding-left: calc(var(--mg-icon-regular-size) + var(--mg-inputs-spacer) * 2);
248
+ }
249
+
250
+ /**
251
+ * Character left
252
+ */
253
+ .mg-input__with-character-left {
254
+ position: relative;
255
+ display: inline-flex;
256
+ width: 100%;
257
+ }
258
+ .mg-input.is-focused .mg-input__with-character-left .mg-input__box {
259
+ padding-right: calc(var(--mg-character-left-message-length) * 1ch + 0.8rem);
260
+ }
261
+ .mg-input__with-character-left mg-character-left {
262
+ position: absolute;
263
+ display: none;
264
+ top: 50%;
265
+ right: 1rem;
266
+ opacity: 0.6;
267
+ transform: translateY(-50%);
268
+ font-size: 1.1rem;
269
+ }
270
+ .mg-input.is-focused .mg-input__with-character-left mg-character-left {
271
+ display: block;
222
272
  }