vira 32.0.0-beta.0 → 32.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 (288) hide show
  1. package/dist/elements/color/vira-all-color-space-sliders.element.d.ts +11 -0
  2. package/dist/elements/color/vira-all-color-space-sliders.element.js +55 -0
  3. package/dist/elements/color/vira-all-spaces-color-picker.element.d.ts +15 -0
  4. package/dist/elements/color/vira-all-spaces-color-picker.element.js +73 -0
  5. package/dist/elements/color/vira-color-details.element.d.ts +14 -0
  6. package/{src/elements/color/vira-color-details.element.ts → dist/elements/color/vira-color-details.element.js} +43 -59
  7. package/dist/elements/color/vira-color-format-sliders.element.d.ts +14 -0
  8. package/dist/elements/color/vira-color-format-sliders.element.js +60 -0
  9. package/dist/elements/color/vira-color-pair-contrast-summary.element.d.ts +9 -0
  10. package/{src/elements/color/vira-color-pair-contrast-summary.element.ts → dist/elements/color/vira-color-pair-contrast-summary.element.js} +68 -100
  11. package/dist/elements/color/vira-color-pair.element.d.ts +17 -0
  12. package/{src/elements/color/vira-color-pair.element.ts → dist/elements/color/vira-color-pair.element.js} +50 -71
  13. package/dist/elements/color/vira-color-picker.element.d.ts +20 -0
  14. package/{src/elements/color/vira-color-picker.element.ts → dist/elements/color/vira-color-picker.element.js} +92 -117
  15. package/dist/elements/color/vira-color-slider.element.d.ts +14 -0
  16. package/dist/elements/color/vira-color-slider.element.js +124 -0
  17. package/dist/elements/color/vira-color-swatch.element.d.ts +20 -0
  18. package/{src/elements/color/vira-color-swatch.element.ts → dist/elements/color/vira-color-swatch.element.js} +6 -16
  19. package/dist/elements/color/vira-contrast-indicator.element.d.ts +10 -0
  20. package/{src/elements/color/vira-contrast-indicator.element.ts → dist/elements/color/vira-contrast-indicator.element.js} +13 -28
  21. package/dist/elements/index.js +39 -0
  22. package/dist/elements/pop-up/vira-menu-item.element.d.ts +38 -0
  23. package/{src/elements/pop-up/vira-menu-item.element.ts → dist/elements/pop-up/vira-menu-item.element.js} +80 -117
  24. package/dist/elements/pop-up/vira-menu-trigger.element.d.ts +45 -0
  25. package/dist/elements/pop-up/vira-menu-trigger.element.js +100 -0
  26. package/dist/elements/pop-up/vira-menu.element.d.ts +36 -0
  27. package/{src/elements/pop-up/vira-menu.element.ts → dist/elements/pop-up/vira-menu.element.js} +28 -31
  28. package/dist/elements/pop-up/vira-pop-up-trigger.element.d.ts +109 -0
  29. package/dist/elements/pop-up/vira-pop-up-trigger.element.js +408 -0
  30. package/dist/elements/vira-absolute-time.element.d.ts +35 -0
  31. package/dist/elements/vira-absolute-time.element.js +43 -0
  32. package/dist/elements/vira-bold-text.element.d.ts +9 -0
  33. package/{src/elements/vira-bold-text.element.ts → dist/elements/vira-bold-text.element.js} +11 -10
  34. package/dist/elements/vira-button.element.d.ts +44 -0
  35. package/{src/elements/vira-button.element.ts → dist/elements/vira-button.element.js} +107 -255
  36. package/dist/elements/vira-card.element.d.ts +18 -0
  37. package/{src/elements/vira-card.element.ts → dist/elements/vira-card.element.js} +19 -18
  38. package/dist/elements/vira-checkbox.element.d.ts +44 -0
  39. package/{src/elements/vira-checkbox.element.ts → dist/elements/vira-checkbox.element.js} +48 -95
  40. package/dist/elements/vira-collapsible-card.element.d.ts +36 -0
  41. package/{src/elements/vira-collapsible-card.element.ts → dist/elements/vira-collapsible-card.element.js} +44 -71
  42. package/dist/elements/vira-collapsible-wrapper.element.d.ts +30 -0
  43. package/{src/elements/vira-collapsible-wrapper.element.ts → dist/elements/vira-collapsible-wrapper.element.js} +47 -59
  44. package/dist/elements/vira-date-input.element.d.ts +47 -0
  45. package/dist/elements/vira-date-input.element.js +142 -0
  46. package/dist/elements/vira-drawer.element.d.ts +24 -0
  47. package/{src/elements/vira-drawer.element.ts → dist/elements/vira-drawer.element.js} +98 -125
  48. package/dist/elements/vira-dropdown.element.d.ts +43 -0
  49. package/dist/elements/vira-dropdown.element.js +247 -0
  50. package/dist/elements/vira-error.element.d.ts +7 -0
  51. package/{src/elements/vira-error.element.ts → dist/elements/vira-error.element.js} +7 -8
  52. package/dist/elements/vira-form.element.d.ts +56 -0
  53. package/dist/elements/vira-form.element.js +376 -0
  54. package/dist/elements/vira-icon.element.d.ts +13 -0
  55. package/{src/elements/vira-icon.element.ts → dist/elements/vira-icon.element.js} +12 -16
  56. package/dist/elements/vira-image.element.d.ts +45 -0
  57. package/{src/elements/vira-image.element.ts → dist/elements/vira-image.element.js} +50 -70
  58. package/dist/elements/vira-input.element.d.ts +64 -0
  59. package/{src/elements/vira-input.element.ts → dist/elements/vira-input.element.js} +112 -167
  60. package/dist/elements/vira-json-form.element.d.ts +35 -0
  61. package/{src/elements/vira-json-form.element.ts → dist/elements/vira-json-form.element.js} +356 -522
  62. package/dist/elements/vira-link.element.d.ts +78 -0
  63. package/{src/elements/vira-link.element.ts → dist/elements/vira-link.element.js} +24 -83
  64. package/dist/elements/vira-modal.element.d.ts +40 -0
  65. package/{src/elements/vira-modal.element.ts → dist/elements/vira-modal.element.js} +68 -104
  66. package/dist/elements/vira-progress.element.d.ts +18 -0
  67. package/{src/elements/vira-progress.element.ts → dist/elements/vira-progress.element.js} +12 -25
  68. package/dist/elements/vira-relative-time.element.d.ts +42 -0
  69. package/dist/elements/vira-relative-time.element.js +96 -0
  70. package/dist/elements/vira-select.element.d.ts +44 -0
  71. package/{src/elements/vira-select.element.ts → dist/elements/vira-select.element.js} +89 -138
  72. package/dist/elements/vira-tabs.element.d.ts +124 -0
  73. package/{src/elements/vira-tabs.element.ts → dist/elements/vira-tabs.element.js} +242 -446
  74. package/dist/elements/vira-tag.element.d.ts +40 -0
  75. package/{src/elements/vira-tag.element.ts → dist/elements/vira-tag.element.js} +152 -266
  76. package/dist/elements/vira-text-area.element.d.ts +48 -0
  77. package/{src/elements/vira-text-area.element.ts → dist/elements/vira-text-area.element.js} +52 -70
  78. package/dist/elements/vira-theme-switcher.element.d.ts +17 -0
  79. package/{src/elements/vira-theme-switcher.element.ts → dist/elements/vira-theme-switcher.element.js} +34 -49
  80. package/dist/icons/colored-icon.d.ts +11 -0
  81. package/{src/icons/colored-icon.ts → dist/icons/colored-icon.js} +17 -24
  82. package/dist/icons/icon-css-vars.d.ts +14 -0
  83. package/{src/icons/icon-css-vars.ts → dist/icons/icon-css-vars.js} +1 -2
  84. package/{src/icons/icon-svg.ts → dist/icons/icon-svg.d.ts} +3 -15
  85. package/dist/icons/icon-svg.js +12 -0
  86. package/dist/icons/icon-svgs/16/check-16.icon.d.ts +8 -0
  87. package/{src/icons/icon-svgs/16/check-16.icon.ts → dist/icons/icon-svgs/16/check-16.icon.js} +4 -5
  88. package/dist/icons/icon-svgs/16/chevron-down-16.icon.d.ts +8 -0
  89. package/{src/icons/icon-svgs/16/chevron-down-16.icon.ts → dist/icons/icon-svgs/16/chevron-down-16.icon.js} +4 -5
  90. package/dist/icons/icon-svgs/16/chevron-up-16.icon.d.ts +8 -0
  91. package/{src/icons/icon-svgs/16/chevron-up-16.icon.ts → dist/icons/icon-svgs/16/chevron-up-16.icon.js} +4 -5
  92. package/dist/icons/icon-svgs/16/dash-16.icon.d.ts +8 -0
  93. package/{src/icons/icon-svgs/16/dash-16.icon.ts → dist/icons/icon-svgs/16/dash-16.icon.js} +4 -5
  94. package/dist/icons/icon-svgs/16/element-16.icon.d.ts +8 -0
  95. package/{src/icons/icon-svgs/16/element-16.icon.ts → dist/icons/icon-svgs/16/element-16.icon.js} +4 -5
  96. package/dist/icons/icon-svgs/16/plus-16.icon.d.ts +8 -0
  97. package/{src/icons/icon-svgs/16/plus-16.icon.ts → dist/icons/icon-svgs/16/plus-16.icon.js} +4 -5
  98. package/dist/icons/icon-svgs/16/upload-16.icon.d.ts +8 -0
  99. package/{src/icons/icon-svgs/16/upload-16.icon.ts → dist/icons/icon-svgs/16/upload-16.icon.js} +4 -5
  100. package/dist/icons/icon-svgs/16/x-16.icon.d.ts +8 -0
  101. package/{src/icons/icon-svgs/16/x-16.icon.ts → dist/icons/icon-svgs/16/x-16.icon.js} +4 -5
  102. package/dist/icons/icon-svgs/24/arrow-down-24.icon.d.ts +8 -0
  103. package/{src/icons/icon-svgs/24/arrow-down-24.icon.ts → dist/icons/icon-svgs/24/arrow-down-24.icon.js} +4 -5
  104. package/dist/icons/icon-svgs/24/arrow-left-24.icon.d.ts +8 -0
  105. package/{src/icons/icon-svgs/24/arrow-left-24.icon.ts → dist/icons/icon-svgs/24/arrow-left-24.icon.js} +4 -5
  106. package/dist/icons/icon-svgs/24/arrow-right-24.icon.d.ts +8 -0
  107. package/{src/icons/icon-svgs/24/arrow-right-24.icon.ts → dist/icons/icon-svgs/24/arrow-right-24.icon.js} +4 -5
  108. package/dist/icons/icon-svgs/24/arrow-up-24.icon.d.ts +8 -0
  109. package/{src/icons/icon-svgs/24/arrow-up-24.icon.ts → dist/icons/icon-svgs/24/arrow-up-24.icon.js} +4 -5
  110. package/dist/icons/icon-svgs/24/auto-theme-24.icon.d.ts +8 -0
  111. package/{src/icons/icon-svgs/24/auto-theme-24.icon.ts → dist/icons/icon-svgs/24/auto-theme-24.icon.js} +4 -5
  112. package/dist/icons/icon-svgs/24/bell-24.icon.d.ts +8 -0
  113. package/{src/icons/icon-svgs/24/bell-24.icon.ts → dist/icons/icon-svgs/24/bell-24.icon.js} +4 -5
  114. package/dist/icons/icon-svgs/24/chat-24.icon.d.ts +8 -0
  115. package/{src/icons/icon-svgs/24/chat-24.icon.ts → dist/icons/icon-svgs/24/chat-24.icon.js} +4 -5
  116. package/dist/icons/icon-svgs/24/check-24.icon.d.ts +8 -0
  117. package/{src/icons/icon-svgs/24/check-24.icon.ts → dist/icons/icon-svgs/24/check-24.icon.js} +4 -5
  118. package/dist/icons/icon-svgs/24/chevron-down-24.icon.d.ts +8 -0
  119. package/{src/icons/icon-svgs/24/chevron-down-24.icon.ts → dist/icons/icon-svgs/24/chevron-down-24.icon.js} +4 -5
  120. package/dist/icons/icon-svgs/24/chevron-up-24.icon.d.ts +8 -0
  121. package/{src/icons/icon-svgs/24/chevron-up-24.icon.ts → dist/icons/icon-svgs/24/chevron-up-24.icon.js} +4 -5
  122. package/dist/icons/icon-svgs/24/close-x-24.icon.d.ts +8 -0
  123. package/{src/icons/icon-svgs/24/close-x-24.icon.ts → dist/icons/icon-svgs/24/close-x-24.icon.js} +4 -5
  124. package/dist/icons/icon-svgs/24/commit-24.icon.d.ts +8 -0
  125. package/{src/icons/icon-svgs/24/commit-24.icon.ts → dist/icons/icon-svgs/24/commit-24.icon.js} +4 -5
  126. package/dist/icons/icon-svgs/24/copy-24.icon.d.ts +8 -0
  127. package/{src/icons/icon-svgs/24/copy-24.icon.ts → dist/icons/icon-svgs/24/copy-24.icon.js} +4 -5
  128. package/dist/icons/icon-svgs/24/document-24.icon.d.ts +8 -0
  129. package/{src/icons/icon-svgs/24/document-24.icon.ts → dist/icons/icon-svgs/24/document-24.icon.js} +4 -5
  130. package/dist/icons/icon-svgs/24/document-search-24.icon.d.ts +8 -0
  131. package/{src/icons/icon-svgs/24/document-search-24.icon.ts → dist/icons/icon-svgs/24/document-search-24.icon.js} +4 -5
  132. package/dist/icons/icon-svgs/24/double-chevron-24.icon.d.ts +8 -0
  133. package/{src/icons/icon-svgs/24/double-chevron-24.icon.ts → dist/icons/icon-svgs/24/double-chevron-24.icon.js} +4 -5
  134. package/dist/icons/icon-svgs/24/element-24.icon.d.ts +8 -0
  135. package/{src/icons/icon-svgs/24/element-24.icon.ts → dist/icons/icon-svgs/24/element-24.icon.js} +4 -5
  136. package/dist/icons/icon-svgs/24/external-link-24.icon.d.ts +8 -0
  137. package/{src/icons/icon-svgs/24/external-link-24.icon.ts → dist/icons/icon-svgs/24/external-link-24.icon.js} +4 -5
  138. package/dist/icons/icon-svgs/24/eye-closed-24.icon.d.ts +8 -0
  139. package/{src/icons/icon-svgs/24/eye-closed-24.icon.ts → dist/icons/icon-svgs/24/eye-closed-24.icon.js} +4 -5
  140. package/dist/icons/icon-svgs/24/eye-open-24.icon.d.ts +8 -0
  141. package/{src/icons/icon-svgs/24/eye-open-24.icon.ts → dist/icons/icon-svgs/24/eye-open-24.icon.js} +4 -5
  142. package/dist/icons/icon-svgs/24/filter-24.icon.d.ts +8 -0
  143. package/{src/icons/icon-svgs/24/filter-24.icon.ts → dist/icons/icon-svgs/24/filter-24.icon.js} +4 -5
  144. package/dist/icons/icon-svgs/24/globe-24.icon.d.ts +8 -0
  145. package/{src/icons/icon-svgs/24/globe-24.icon.ts → dist/icons/icon-svgs/24/globe-24.icon.js} +4 -5
  146. package/dist/icons/icon-svgs/24/link-24.icon.d.ts +8 -0
  147. package/{src/icons/icon-svgs/24/link-24.icon.ts → dist/icons/icon-svgs/24/link-24.icon.js} +4 -5
  148. package/dist/icons/icon-svgs/24/loader-24.icon.d.ts +8 -0
  149. package/{src/icons/icon-svgs/24/loader-24.icon.ts → dist/icons/icon-svgs/24/loader-24.icon.js} +4 -5
  150. package/dist/icons/icon-svgs/24/loader-animated-24.icon.d.ts +8 -0
  151. package/{src/icons/icon-svgs/24/loader-animated-24.icon.ts → dist/icons/icon-svgs/24/loader-animated-24.icon.js} +6 -8
  152. package/dist/icons/icon-svgs/24/lock-24.icon.d.ts +8 -0
  153. package/{src/icons/icon-svgs/24/lock-24.icon.ts → dist/icons/icon-svgs/24/lock-24.icon.js} +4 -5
  154. package/dist/icons/icon-svgs/24/magnifying-glass-24.icon.d.ts +8 -0
  155. package/{src/icons/icon-svgs/24/magnifying-glass-24.icon.ts → dist/icons/icon-svgs/24/magnifying-glass-24.icon.js} +4 -5
  156. package/dist/icons/icon-svgs/24/moon-24.icon.d.ts +8 -0
  157. package/{src/icons/icon-svgs/24/moon-24.icon.ts → dist/icons/icon-svgs/24/moon-24.icon.js} +4 -5
  158. package/dist/icons/icon-svgs/24/options-24.icon.d.ts +8 -0
  159. package/{src/icons/icon-svgs/24/options-24.icon.ts → dist/icons/icon-svgs/24/options-24.icon.js} +4 -5
  160. package/dist/icons/icon-svgs/24/pencil-24.icon.d.ts +8 -0
  161. package/{src/icons/icon-svgs/24/pencil-24.icon.ts → dist/icons/icon-svgs/24/pencil-24.icon.js} +4 -5
  162. package/dist/icons/icon-svgs/24/plus-24.icon.d.ts +8 -0
  163. package/{src/icons/icon-svgs/24/plus-24.icon.ts → dist/icons/icon-svgs/24/plus-24.icon.js} +4 -5
  164. package/dist/icons/icon-svgs/24/printer-24.icon.d.ts +8 -0
  165. package/{src/icons/icon-svgs/24/printer-24.icon.ts → dist/icons/icon-svgs/24/printer-24.icon.js} +4 -5
  166. package/dist/icons/icon-svgs/24/shield-24.icon.d.ts +8 -0
  167. package/{src/icons/icon-svgs/24/shield-24.icon.ts → dist/icons/icon-svgs/24/shield-24.icon.js} +4 -5
  168. package/dist/icons/icon-svgs/24/sort-ascending-24.icon.d.ts +8 -0
  169. package/{src/icons/icon-svgs/24/sort-ascending-24.icon.ts → dist/icons/icon-svgs/24/sort-ascending-24.icon.js} +4 -5
  170. package/dist/icons/icon-svgs/24/sort-descending-24.icon.d.ts +8 -0
  171. package/{src/icons/icon-svgs/24/sort-descending-24.icon.ts → dist/icons/icon-svgs/24/sort-descending-24.icon.js} +4 -5
  172. package/dist/icons/icon-svgs/24/sparkle-24.icon.d.ts +8 -0
  173. package/{src/icons/icon-svgs/24/sparkle-24.icon.ts → dist/icons/icon-svgs/24/sparkle-24.icon.js} +4 -5
  174. package/dist/icons/icon-svgs/24/speaker-loud-24.icon.d.ts +8 -0
  175. package/{src/icons/icon-svgs/24/speaker-loud-24.icon.ts → dist/icons/icon-svgs/24/speaker-loud-24.icon.js} +4 -5
  176. package/dist/icons/icon-svgs/24/speaker-medium-24.icon.d.ts +8 -0
  177. package/{src/icons/icon-svgs/24/speaker-medium-24.icon.ts → dist/icons/icon-svgs/24/speaker-medium-24.icon.js} +4 -5
  178. package/dist/icons/icon-svgs/24/speaker-muted-24.icon.d.ts +8 -0
  179. package/{src/icons/icon-svgs/24/speaker-muted-24.icon.ts → dist/icons/icon-svgs/24/speaker-muted-24.icon.js} +4 -5
  180. package/dist/icons/icon-svgs/24/speaker-quiet-24.icon.d.ts +8 -0
  181. package/{src/icons/icon-svgs/24/speaker-quiet-24.icon.ts → dist/icons/icon-svgs/24/speaker-quiet-24.icon.js} +4 -5
  182. package/dist/icons/icon-svgs/24/star-24.icon.d.ts +8 -0
  183. package/{src/icons/icon-svgs/24/star-24.icon.ts → dist/icons/icon-svgs/24/star-24.icon.js} +4 -5
  184. package/dist/icons/icon-svgs/24/status-failure-24.icon.d.ts +8 -0
  185. package/{src/icons/icon-svgs/24/status-failure-24.icon.ts → dist/icons/icon-svgs/24/status-failure-24.icon.js} +4 -5
  186. package/dist/icons/icon-svgs/24/status-in-progress-24.icon.d.ts +8 -0
  187. package/{src/icons/icon-svgs/24/status-in-progress-24.icon.ts → dist/icons/icon-svgs/24/status-in-progress-24.icon.js} +4 -5
  188. package/dist/icons/icon-svgs/24/status-success-24.icon.d.ts +8 -0
  189. package/{src/icons/icon-svgs/24/status-success-24.icon.ts → dist/icons/icon-svgs/24/status-success-24.icon.js} +4 -5
  190. package/dist/icons/icon-svgs/24/status-unknown-24.icon.d.ts +8 -0
  191. package/{src/icons/icon-svgs/24/status-unknown-24.icon.ts → dist/icons/icon-svgs/24/status-unknown-24.icon.js} +4 -5
  192. package/dist/icons/icon-svgs/24/status-warning-24.icon.d.ts +8 -0
  193. package/{src/icons/icon-svgs/24/status-warning-24.icon.ts → dist/icons/icon-svgs/24/status-warning-24.icon.js} +4 -5
  194. package/dist/icons/icon-svgs/24/sun-24.icon.d.ts +8 -0
  195. package/{src/icons/icon-svgs/24/sun-24.icon.ts → dist/icons/icon-svgs/24/sun-24.icon.js} +4 -5
  196. package/dist/icons/icon-svgs/24/upload-24.icon.d.ts +8 -0
  197. package/{src/icons/icon-svgs/24/upload-24.icon.ts → dist/icons/icon-svgs/24/upload-24.icon.js} +4 -5
  198. package/dist/icons/icon-svgs/24/x-24.icon.d.ts +8 -0
  199. package/{src/icons/icon-svgs/24/x-24.icon.ts → dist/icons/icon-svgs/24/x-24.icon.js} +4 -5
  200. package/dist/icons/index.d.ts +197 -0
  201. package/{src/icons/index.ts → dist/icons/index.js} +60 -65
  202. package/dist/icons/lucide-icons.d.ts +15 -0
  203. package/dist/icons/lucide-icons.js +79 -0
  204. package/dist/icons/sized-icon.d.ts +8 -0
  205. package/{src/icons/sized-icon.ts → dist/icons/sized-icon.js} +1 -3
  206. package/dist/index.js +4 -0
  207. package/dist/styles/disabled.d.ts +6 -0
  208. package/{src/styles/disabled.ts → dist/styles/disabled.js} +2 -3
  209. package/dist/styles/durations.d.ts +22 -0
  210. package/{src/styles/durations.ts → dist/styles/durations.js} +1 -2
  211. package/dist/styles/focus.d.ts +26 -0
  212. package/{src/styles/focus.ts → dist/styles/focus.js} +12 -40
  213. package/dist/styles/font.d.ts +12 -0
  214. package/{src/styles/font.ts → dist/styles/font.js} +1 -3
  215. package/dist/styles/form-styles.d.ts +46 -0
  216. package/dist/styles/form-styles.js +53 -0
  217. package/dist/styles/form-variants.d.ts +117 -0
  218. package/{src/styles/form-variants.ts → dist/styles/form-variants.js} +34 -42
  219. package/{src/styles/index.ts → dist/styles/index.d.ts} +0 -1
  220. package/dist/styles/index.js +14 -0
  221. package/dist/styles/native-styles.d.ts +13 -0
  222. package/{src/styles/native-styles.ts → dist/styles/native-styles.js} +3 -5
  223. package/dist/styles/scrollbar.d.ts +6 -0
  224. package/{src/styles/scrollbar.ts → dist/styles/scrollbar.js} +3 -4
  225. package/dist/styles/shadows.d.ts +19 -0
  226. package/{src/styles/shadows.ts → dist/styles/shadows.js} +5 -7
  227. package/dist/styles/user-select.d.ts +6 -0
  228. package/{src/styles/user-select.ts → dist/styles/user-select.js} +2 -3
  229. package/dist/styles/vira-color-palette.d.ts +178 -0
  230. package/{src/styles/vira-color-palette.ts → dist/styles/vira-color-palette.js} +1 -3
  231. package/dist/styles/vira-color-theme-object.d.ts +65 -0
  232. package/dist/styles/vira-color-theme-object.js +65 -0
  233. package/dist/styles/vira-color-theme.d.ts +2785 -0
  234. package/{src/styles/vira-color-theme.ts → dist/styles/vira-color-theme.js} +1222 -1227
  235. package/dist/util/color-local-storage.client.d.ts +4 -0
  236. package/dist/util/color-local-storage.client.js +6 -0
  237. package/dist/util/define-table.d.ts +115 -0
  238. package/dist/util/define-table.js +115 -0
  239. package/dist/util/define-vira-element.d.ts +18 -0
  240. package/dist/util/define-vira-element.js +19 -0
  241. package/dist/util/dynamic-element.d.ts +62 -0
  242. package/dist/util/dynamic-element.js +61 -0
  243. package/dist/util/index.js +11 -0
  244. package/dist/util/overflow-observer.d.ts +25 -0
  245. package/{src/util/overflow-observer.ts → dist/util/overflow-observer.js} +1 -30
  246. package/dist/util/pop-up-helpers.d.ts +59 -0
  247. package/dist/util/pop-up-helpers.js +66 -0
  248. package/dist/util/pop-up-manager.d.ts +200 -0
  249. package/dist/util/pop-up-manager.js +258 -0
  250. package/dist/util/shared-text-input-logic.d.ts +69 -0
  251. package/dist/util/shared-text-input-logic.js +114 -0
  252. package/dist/util/vira-form-fields.d.ts +145 -0
  253. package/dist/util/vira-form-fields.js +66 -0
  254. package/dist/util/vira-json-schema.d.ts +206 -0
  255. package/{src/util/vira-json-schema.ts → dist/util/vira-json-schema.js} +155 -298
  256. package/{src/util/vira-select-option.ts → dist/util/vira-select-option.d.ts} +2 -9
  257. package/dist/util/vira-select-option.js +8 -0
  258. package/dist/util/vira-theme-client.d.ts +83 -0
  259. package/dist/util/vira-theme-client.js +93 -0
  260. package/package.json +13 -13
  261. package/src/elements/color/vira-all-color-space-sliders.element.ts +0 -66
  262. package/src/elements/color/vira-all-spaces-color-picker.element.ts +0 -85
  263. package/src/elements/color/vira-color-format-sliders.element.ts +0 -78
  264. package/src/elements/color/vira-color-slider.element.ts +0 -169
  265. package/src/elements/pop-up/vira-menu-trigger.element.ts +0 -135
  266. package/src/elements/pop-up/vira-pop-up-trigger.element.ts +0 -539
  267. package/src/elements/vira-absolute-time.element.ts +0 -81
  268. package/src/elements/vira-date-input.element.ts +0 -185
  269. package/src/elements/vira-dropdown.element.ts +0 -310
  270. package/src/elements/vira-form.element.ts +0 -466
  271. package/src/elements/vira-relative-time.element.ts +0 -135
  272. package/src/icons/icon-color.test-helper.ts +0 -9
  273. package/src/icons/lucide-icons.ts +0 -120
  274. package/src/styles/form-styles.ts +0 -86
  275. package/src/styles/vira-color-palette.json +0 -170
  276. package/src/styles/vira-color-theme-object.ts +0 -170
  277. package/src/util/color-local-storage.client.ts +0 -7
  278. package/src/util/define-table.ts +0 -286
  279. package/src/util/define-vira-element.ts +0 -29
  280. package/src/util/dynamic-element.ts +0 -128
  281. package/src/util/pop-up-helpers.ts +0 -133
  282. package/src/util/pop-up-manager.ts +0 -434
  283. package/src/util/shared-text-input-logic.ts +0 -192
  284. package/src/util/vira-form-fields.ts +0 -195
  285. package/src/util/vira-theme-client.ts +0 -140
  286. /package/{src/elements/index.ts → dist/elements/index.d.ts} +0 -0
  287. /package/{src/index.ts → dist/index.d.ts} +0 -0
  288. /package/{src/util/index.ts → dist/util/index.d.ts} +0 -0
@@ -0,0 +1,200 @@
1
+ import { type MaybePromise } from '@augment-vir/common';
2
+ import { type Coords, type NavController } from 'device-navigation';
3
+ import { type ExtractEventByType, type ExtractEventTypes, type ListenOptions, ListenTarget, type RemoveListenerCallback } from 'typed-event-target';
4
+ /**
5
+ * Used to prevent pop-ups from closing when a text input is active.
6
+ *
7
+ * @category Internal
8
+ */
9
+ export declare function isInputLikeElement(element: Element): boolean;
10
+ /**
11
+ * Determines if a mouse event landed on a scrollbar rather than on element content. Scrollbar
12
+ * interactions fire mouse events on the scrolling element itself (or on `<html>` for the page
13
+ * scrollbar), so an outside-click check would otherwise treat dragging a scrollbar as a click away
14
+ * from the pop-up and dismiss it mid-drag.
15
+ *
16
+ * @category Internal
17
+ */
18
+ export declare function isMouseEventOnScrollbar(event: Readonly<MouseEvent>): boolean;
19
+ /**
20
+ * A type used for representing a rectangle's position.
21
+ *
22
+ * @category Internal
23
+ */
24
+ export type PositionRect = {
25
+ top: number;
26
+ left: number;
27
+ right: number;
28
+ bottom: number;
29
+ };
30
+ /**
31
+ * The default empty {@link PositionRect}, with all values set to 0.
32
+ *
33
+ * @category Internal
34
+ */
35
+ export declare const emptyPositionRect: PositionRect;
36
+ /**
37
+ * Options for {@link PopUpManager}.
38
+ *
39
+ * @category PopUp
40
+ */
41
+ export type PopUpManagerOptions = {
42
+ /**
43
+ * The minimum number of pixels for allowing the pop-up to go downwards. If the downward
44
+ * available space is less than this, and if the upwards available space is
45
+ * `verticalDiffThreshold` more than the downwards space, the pop-up will be directed upwards.
46
+ *
47
+ * Equation:
48
+ *
49
+ * const directUpwards =
50
+ * downwardsSpace < minDownSpace &&
51
+ * upwardsSpace > DownwardsSpace + verticalDiffThreshold;
52
+ *
53
+ * @default 200
54
+ */
55
+ minDownSpace: number;
56
+ /**
57
+ * The minimum number of pixels for allowing the pop-up to go rightwards. If the rightward
58
+ * available space is less than this, and if the leftwards available space is
59
+ * `horizontalDiffThreshold` more than the rightwards space, the pop-up will be directed
60
+ * leftwards.
61
+ *
62
+ * Equation:
63
+ *
64
+ * const directLeftwards =
65
+ * rightwardsSpace < minRightSpace &&
66
+ * leftwardsSpace > rightwardsSpace + horizontalDiffThreshold;
67
+ *
68
+ * @default 400
69
+ */
70
+ minRightSpace: number;
71
+ /**
72
+ * The number of pixels required for the upwards available space to be bigger than the downwards
73
+ * available space before directing the pop-up upwards.
74
+ *
75
+ * Equation:
76
+ *
77
+ * const directUpwards =
78
+ * downwardsSpace < minDownSpace &&
79
+ * upwardsSpace > DownwardsSpace + verticalDiffThreshold;
80
+ *
81
+ * @default 20
82
+ */
83
+ verticalDiffThreshold: number;
84
+ /**
85
+ * The number of pixels required for the leftwards available space to be bigger than the
86
+ * rightwards available space before directing the pop-up leftwards.
87
+ *
88
+ * Equation:
89
+ *
90
+ * const directLeftwards =
91
+ * rightwardsSpace < minRightSpace &&
92
+ * leftwardsSpace > rightwardsSpace + horizontalDiffThreshold;
93
+ *
94
+ * @default 100
95
+ */
96
+ horizontalDiffThreshold: number;
97
+ /**
98
+ * Supports navigation of the pop up via the `device-navigation` package.
99
+ *
100
+ * @default true
101
+ */
102
+ supportNavigation: boolean;
103
+ };
104
+ /**
105
+ * Output type from `PopUpManager.showPopUp`
106
+ *
107
+ * @category PopUp
108
+ */
109
+ export type ShowPopUpResult = {
110
+ /**
111
+ * Indicates if the "pop up" should pop in the downwards direction or not. If not, it should pop
112
+ * in the upwards direction. This is determined by how much space is available on either side of
113
+ * the root element.
114
+ */
115
+ popDown: boolean;
116
+ /**
117
+ * Indicates if the "pop up" should pop in the rightwards direction or not. If not, it should
118
+ * pop in the leftwards direction. This is determined by how much space is available on either
119
+ * side of the root element.
120
+ */
121
+ popRight: boolean;
122
+ positions: Record<'root' | 'container' | 'diff', PositionRect>;
123
+ };
124
+ declare const HidePopUpEvent_base: (new (eventInitDict?: EventInit) => Event & import("typed-event-target").TypedEvent<"hide-pop-up">) & Pick<{
125
+ new (type: string, eventInitDict?: EventInit): Event;
126
+ prototype: Event;
127
+ readonly NONE: 0;
128
+ readonly CAPTURING_PHASE: 1;
129
+ readonly AT_TARGET: 2;
130
+ readonly BUBBLING_PHASE: 3;
131
+ }, "NONE" | "CAPTURING_PHASE" | "AT_TARGET" | "BUBBLING_PHASE" | "prototype"> & Pick<import("typed-event-target").TypedEvent<"hide-pop-up">, "type">;
132
+ /**
133
+ * An event fired from {@link PopUpManager} when the pop up should be hidden.
134
+ *
135
+ * @category PopUp
136
+ */
137
+ export declare class HidePopUpEvent extends HidePopUpEvent_base {
138
+ }
139
+ declare const NavSelectEvent_base: (new (eventInitDict: {
140
+ bubbles?: boolean;
141
+ cancelable?: boolean;
142
+ composed?: boolean;
143
+ detail: Coords;
144
+ }) => import("typed-event-target").TypedCustomEvent<Coords, "nav-select">) & Pick<{
145
+ new (type: string, eventInitDict?: EventInit): Event;
146
+ prototype: Event;
147
+ readonly NONE: 0;
148
+ readonly CAPTURING_PHASE: 1;
149
+ readonly AT_TARGET: 2;
150
+ readonly BUBBLING_PHASE: 3;
151
+ }, "NONE" | "CAPTURING_PHASE" | "AT_TARGET" | "BUBBLING_PHASE" | "prototype"> & Pick<import("typed-event-target").TypedCustomEvent<Coords, "nav-select">, "type">;
152
+ /**
153
+ * An event fired from {@link PopUpManager} when an individual item in the pop up has been selected
154
+ * by the user.
155
+ *
156
+ * @category PopUp
157
+ */
158
+ export declare class NavSelectEvent extends NavSelectEvent_base {
159
+ }
160
+ /**
161
+ * All events that can be emitted by {@link PopUpManager}.
162
+ *
163
+ * @category Internal
164
+ */
165
+ export type PopUpManagerEvents = HidePopUpEvent | NavSelectEvent;
166
+ /**
167
+ * A "pop up" manager for items that pop up from the HTML page, like dropdowns or menus.
168
+ *
169
+ * @category PopUp
170
+ */
171
+ export declare class PopUpManager {
172
+ readonly navController: NavController;
173
+ protected listenTarget: ListenTarget<PopUpManagerEvents>;
174
+ options: PopUpManagerOptions;
175
+ /** Callbacks that remove the global listeners attached while a pop up is shown. */
176
+ protected cleanupCallbacks: (() => void)[];
177
+ protected lastRootElement: HTMLElement | undefined;
178
+ constructor(navController: NavController, options?: Partial<PopUpManagerOptions> | undefined);
179
+ /**
180
+ * Attaches the global listeners (page activation, navigation, mousedown, and keydown) that
181
+ * control the currently shown pop up.
182
+ */
183
+ protected attachGlobalListeners(): void;
184
+ /** Listen to events emitted from a {@link PopUpManager} instance. */
185
+ listen<const EventDefinition extends Readonly<{
186
+ type: ExtractEventTypes<PopUpManagerEvents>;
187
+ }>>(event: EventDefinition, listener: (event: ExtractEventByType<PopUpManagerEvents, EventDefinition['type']>) => MaybePromise<void>, options?: ListenOptions | undefined): RemoveListenerCallback;
188
+ /** Trigger removal or hiding of the pop up. */
189
+ removePopUp(): void;
190
+ /** Trigger showing the pop up. */
191
+ showPopUp(rootElement: HTMLElement, options?: Partial<PopUpManagerOptions> | undefined): ShowPopUpResult;
192
+ /**
193
+ * Cleanup and destroy the {@link PopUpManager} instance. This:
194
+ *
195
+ * - Removes the existing pop up
196
+ * - Cleans up all internal and external listeners
197
+ */
198
+ destroy(): void;
199
+ }
200
+ export {};
@@ -0,0 +1,258 @@
1
+ import { assert } from '@augment-vir/assert';
2
+ import { mapObjectValues } from '@augment-vir/common';
3
+ import { findOverflowAncestor } from '@augment-vir/web';
4
+ import { NavActivateEvent, NavDirection } from 'device-navigation';
5
+ import { listenToPageActivation } from 'page-active';
6
+ import { ListenTarget, defineTypedCustomEvent, defineTypedEvent, listenToGlobal, } from 'typed-event-target';
7
+ /**
8
+ * Used to prevent pop-ups from closing when a text input is active.
9
+ *
10
+ * @category Internal
11
+ */
12
+ export function isInputLikeElement(element) {
13
+ return ((element instanceof HTMLInputElement &&
14
+ (element.type === 'text' ||
15
+ element.type === 'search' ||
16
+ element.type === 'email' ||
17
+ element.type === 'url' ||
18
+ element.type === 'tel' ||
19
+ element.type === 'password' ||
20
+ element.type === 'number')) ||
21
+ element instanceof HTMLTextAreaElement ||
22
+ (element instanceof HTMLElement && element.isContentEditable));
23
+ }
24
+ /**
25
+ * Determines if a mouse event landed on a scrollbar rather than on element content. Scrollbar
26
+ * interactions fire mouse events on the scrolling element itself (or on `<html>` for the page
27
+ * scrollbar), so an outside-click check would otherwise treat dragging a scrollbar as a click away
28
+ * from the pop-up and dismiss it mid-drag.
29
+ *
30
+ * @category Internal
31
+ */
32
+ export function isMouseEventOnScrollbar(event) {
33
+ const target = event.composedPath()[0];
34
+ if (!(target instanceof Element)) {
35
+ return false;
36
+ }
37
+ const rect = target.getBoundingClientRect();
38
+ /**
39
+ * `clientLeft` and `clientTop` are the border widths, which also include the scrollbar itself
40
+ * when it's rendered on the leading edge (RTL layouts).
41
+ */
42
+ const clientLeft = rect.left + target.clientLeft;
43
+ const clientTop = rect.top + target.clientTop;
44
+ const outsideHorizontally = event.clientX < clientLeft || event.clientX >= clientLeft + target.clientWidth;
45
+ const outsideVertically = event.clientY < clientTop || event.clientY >= clientTop + target.clientHeight;
46
+ return ((outsideHorizontally && target.scrollHeight > target.clientHeight) ||
47
+ (outsideVertically && target.scrollWidth > target.clientWidth));
48
+ }
49
+ /**
50
+ * The default empty {@link PositionRect}, with all values set to 0.
51
+ *
52
+ * @category Internal
53
+ */
54
+ export const emptyPositionRect = {
55
+ top: 0,
56
+ left: 0,
57
+ right: 0,
58
+ bottom: 0,
59
+ };
60
+ /**
61
+ * An event fired from {@link PopUpManager} when the pop up should be hidden.
62
+ *
63
+ * @category PopUp
64
+ */
65
+ export class HidePopUpEvent extends defineTypedEvent('hide-pop-up') {
66
+ }
67
+ /**
68
+ * An event fired from {@link PopUpManager} when an individual item in the pop up has been selected
69
+ * by the user.
70
+ *
71
+ * @category PopUp
72
+ */
73
+ export class NavSelectEvent extends defineTypedCustomEvent()('nav-select') {
74
+ }
75
+ /**
76
+ * A "pop up" manager for items that pop up from the HTML page, like dropdowns or menus.
77
+ *
78
+ * @category PopUp
79
+ */
80
+ export class PopUpManager {
81
+ navController;
82
+ listenTarget = new ListenTarget();
83
+ options = {
84
+ minDownSpace: 200,
85
+ minRightSpace: 400,
86
+ verticalDiffThreshold: 20,
87
+ horizontalDiffThreshold: 100,
88
+ supportNavigation: true,
89
+ };
90
+ /** Callbacks that remove the global listeners attached while a pop up is shown. */
91
+ cleanupCallbacks = [];
92
+ lastRootElement;
93
+ constructor(navController, options) {
94
+ this.navController = navController;
95
+ this.options = {
96
+ ...this.options,
97
+ ...options,
98
+ };
99
+ }
100
+ /**
101
+ * Attaches the global listeners (page activation, navigation, mousedown, and keydown) that
102
+ * control the currently shown pop up.
103
+ */
104
+ attachGlobalListeners() {
105
+ this.cleanupCallbacks = [
106
+ listenToPageActivation(false, (isPageActive) => {
107
+ if (!isPageActive) {
108
+ this.removePopUp();
109
+ }
110
+ }),
111
+ this.navController.listen(NavActivateEvent, (event) => {
112
+ const target = event.composedPath()[0];
113
+ if (target instanceof Element && isInputLikeElement(target)) {
114
+ return;
115
+ }
116
+ if (event.detail.success) {
117
+ this.listenTarget.dispatch(new NavSelectEvent({
118
+ detail: event.detail.coords,
119
+ }));
120
+ this.navController.currentNavEntry?.entry.focus(true);
121
+ event.stopImmediatePropagation();
122
+ event.preventDefault();
123
+ }
124
+ }),
125
+ listenToGlobal('mousedown', (event) => {
126
+ if (
127
+ /** Ignore clicks that came from the pop up host itself. */
128
+ (this.lastRootElement &&
129
+ event.composedPath().includes(this.lastRootElement)) ||
130
+ isMouseEventOnScrollbar(event)) {
131
+ return;
132
+ }
133
+ this.removePopUp();
134
+ }, {
135
+ passive: true,
136
+ }),
137
+ listenToGlobal('keydown', (event) => {
138
+ const keyCode = event.code;
139
+ if (keyCode === 'Escape') {
140
+ this.removePopUp();
141
+ }
142
+ else if (this.options.supportNavigation) {
143
+ const target = event.composedPath()[0];
144
+ if (target instanceof Element && isInputLikeElement(target)) {
145
+ return;
146
+ }
147
+ if (keyCode === 'ArrowDown') {
148
+ event.stopImmediatePropagation();
149
+ event.preventDefault();
150
+ this.navController.navigate({
151
+ direction: NavDirection.Down,
152
+ allowWrapping: false,
153
+ });
154
+ }
155
+ else if (keyCode === 'ArrowUp') {
156
+ event.stopImmediatePropagation();
157
+ event.preventDefault();
158
+ this.navController.navigate({
159
+ direction: NavDirection.Up,
160
+ allowWrapping: false,
161
+ });
162
+ }
163
+ else if (keyCode === 'ArrowLeft') {
164
+ event.stopImmediatePropagation();
165
+ event.preventDefault();
166
+ this.navController.navigate({
167
+ direction: NavDirection.Left,
168
+ allowWrapping: false,
169
+ });
170
+ }
171
+ else if (keyCode === 'ArrowRight') {
172
+ event.stopImmediatePropagation();
173
+ event.preventDefault();
174
+ this.navController.navigate({
175
+ direction: NavDirection.Right,
176
+ allowWrapping: false,
177
+ });
178
+ }
179
+ else if ((keyCode === 'Enter' || keyCode === 'Return' || keyCode === 'Space') &&
180
+ this.navController.enterInto({
181
+ fallbackToActivate: true,
182
+ }).success) {
183
+ event.stopImmediatePropagation();
184
+ event.preventDefault();
185
+ }
186
+ }
187
+ }),
188
+ ];
189
+ }
190
+ /** Listen to events emitted from a {@link PopUpManager} instance. */
191
+ listen(event, listener, options) {
192
+ return this.listenTarget.listen(event, listener, options);
193
+ }
194
+ /** Trigger removal or hiding of the pop up. */
195
+ removePopUp() {
196
+ this.cleanupCallbacks.forEach((callback) => callback());
197
+ this.listenTarget.dispatch(new HidePopUpEvent());
198
+ }
199
+ /** Trigger showing the pop up. */
200
+ showPopUp(rootElement, options) {
201
+ this.lastRootElement = rootElement;
202
+ const currentOptions = {
203
+ ...this.options,
204
+ ...options,
205
+ };
206
+ const container = findOverflowAncestor(rootElement);
207
+ assert.instanceOf(container, HTMLElement);
208
+ const rootRect = rootElement.getBoundingClientRect();
209
+ const containerRect = container.getBoundingClientRect();
210
+ const containerScrollbarWidth = container.offsetWidth - container.clientWidth;
211
+ const containerScrollbarHeight = container.offsetHeight - container.clientHeight;
212
+ const containerPosition = container === document.body
213
+ ? {
214
+ top: 0,
215
+ left: 0,
216
+ right: containerRect.width,
217
+ bottom: containerRect.height,
218
+ }
219
+ : {
220
+ top: containerRect.top,
221
+ left: containerRect.left,
222
+ right: containerRect.right - containerScrollbarWidth,
223
+ bottom: containerRect.bottom - containerScrollbarHeight,
224
+ };
225
+ const rootPosition = mapObjectValues(emptyPositionRect, (key) => {
226
+ return rootRect[key];
227
+ });
228
+ const diff = mapObjectValues(emptyPositionRect, (key) => {
229
+ const containerDimension = containerPosition[key];
230
+ const hostDimension = rootPosition[key];
231
+ return Math.abs(containerDimension - hostDimension);
232
+ });
233
+ const useUp = diff.top > diff.bottom + currentOptions.verticalDiffThreshold &&
234
+ diff.bottom < currentOptions.minDownSpace;
235
+ const useLeft = diff.left > diff.right + currentOptions.horizontalDiffThreshold &&
236
+ diff.right < currentOptions.minRightSpace;
237
+ this.attachGlobalListeners();
238
+ return {
239
+ popDown: !useUp,
240
+ popRight: !useLeft,
241
+ positions: {
242
+ container: containerPosition,
243
+ root: rootPosition,
244
+ diff,
245
+ },
246
+ };
247
+ }
248
+ /**
249
+ * Cleanup and destroy the {@link PopUpManager} instance. This:
250
+ *
251
+ * - Removes the existing pop up
252
+ * - Cleans up all internal and external listeners
253
+ */
254
+ destroy() {
255
+ this.removePopUp();
256
+ this.listenTarget.destroy();
257
+ }
258
+ }
@@ -0,0 +1,69 @@
1
+ import { type PartialWithUndefined } from '@augment-vir/common';
2
+ import { type AttributeValues } from 'element-vir';
3
+ /**
4
+ * Inputs shared between the multiple input elements.
5
+ *
6
+ * @category Internal
7
+ */
8
+ export type SharedTextInputElementInputs = {
9
+ value: string;
10
+ } & PartialWithUndefined<{
11
+ /** Shown when no other text is present. Input restrictions do not apply to this property. */
12
+ placeholder: string;
13
+ /** Set to true to trigger disabled styles and to block all user input. */
14
+ disabled: boolean;
15
+ isReadonly: boolean;
16
+ /**
17
+ * Only letters in the given string or matches to the given RegExp will be allowed.
18
+ * blockedInputs takes precedence over this input.
19
+ *
20
+ * For example: if allowedInputs is set to "abcd" and blockedInputs is set to "d", only "a",
21
+ * "b", or "c" letters will be allowed.
22
+ */
23
+ allowedInputs: string | RegExp;
24
+ /** Any letters in the given string or matches to the given RegExp will be blocked. */
25
+ blockedInputs: string | RegExp;
26
+ /** Disable all browser helps like spellchecking, autocomplete, etc. */
27
+ disableBrowserHelps: boolean;
28
+ /** Set this to true to make the whole element size to only fit the input text. */
29
+ fitText: boolean;
30
+ /** A set of attributes that will be applied to the inner native text element. */
31
+ attributePassthrough: AttributeValues;
32
+ }>;
33
+ /**
34
+ * Inputs used to check if the current input element value is allowed.
35
+ *
36
+ * @category Internal
37
+ */
38
+ export type IsAllowedInputs = {
39
+ value: string | number;
40
+ allowed: string | RegExp | undefined;
41
+ blocked: string | RegExp | undefined;
42
+ };
43
+ /**
44
+ * Filters out blocked text from an input element's value.
45
+ *
46
+ * @category Internal
47
+ */
48
+ export declare function filterTextInputValue(inputs: IsAllowedInputs): {
49
+ filtered: string;
50
+ blocked: string;
51
+ };
52
+ /**
53
+ * A function to be called when an input element's value changes.
54
+ *
55
+ * @category Internal
56
+ */
57
+ export declare function textInputListener({ inputs, previousValue, event, elementConstructor, inputBlockedCallback, newValueCallback, }: {
58
+ inputs: SharedTextInputElementInputs;
59
+ /** The value of the input element before this listener fired. */
60
+ previousValue: string;
61
+ event: Event;
62
+ /**
63
+ * The constructor for the underlying native element. Defaults to `HTMLInputElement`, but can be
64
+ * set to `HTMLTextAreaElement` for textarea-based elements.
65
+ */
66
+ elementConstructor?: typeof HTMLInputElement | typeof HTMLTextAreaElement | undefined;
67
+ inputBlockedCallback: (blockedInput: string) => void;
68
+ newValueCallback: (newValue: string) => void;
69
+ }): void;
@@ -0,0 +1,114 @@
1
+ import { check, checkWrap } from '@augment-vir/assert';
2
+ import { extractEventTarget } from '@augment-vir/web';
3
+ function doesMatch({ input, matcher }) {
4
+ if (!input || !matcher) {
5
+ return true;
6
+ }
7
+ else if (input.length > 1) {
8
+ return input.split('').every((singleInput) => {
9
+ return doesMatch({
10
+ input: singleInput,
11
+ matcher,
12
+ });
13
+ });
14
+ }
15
+ else if (matcher instanceof RegExp) {
16
+ return !!input.match(matcher);
17
+ }
18
+ else {
19
+ return matcher.includes(input);
20
+ }
21
+ }
22
+ function isAllowed({ value: rawValue, allowed, blocked }) {
23
+ const value = String(rawValue);
24
+ const isAllowedCharacter = allowed
25
+ ? doesMatch({
26
+ input: value,
27
+ matcher: allowed,
28
+ })
29
+ : true;
30
+ const isBlockedCharacter = blocked
31
+ ? doesMatch({
32
+ input: value,
33
+ matcher: blocked,
34
+ })
35
+ : false;
36
+ return isAllowedCharacter && !isBlockedCharacter;
37
+ }
38
+ /**
39
+ * Filters out blocked text from an input element's value.
40
+ *
41
+ * @category Internal
42
+ */
43
+ export function filterTextInputValue(inputs) {
44
+ const value = String(inputs.value);
45
+ if (!inputs.value) {
46
+ return {
47
+ filtered: value,
48
+ blocked: '',
49
+ };
50
+ }
51
+ const { filtered, blocked } = value.split('').reduce((accum, letter) => {
52
+ const allowed = isAllowed({
53
+ ...inputs,
54
+ value: letter,
55
+ });
56
+ if (allowed) {
57
+ accum.filtered.push(letter);
58
+ }
59
+ else {
60
+ accum.blocked.push(letter);
61
+ }
62
+ return accum;
63
+ }, {
64
+ filtered: [],
65
+ blocked: [],
66
+ });
67
+ return {
68
+ filtered: filtered.join(''),
69
+ blocked: blocked.join(''),
70
+ };
71
+ }
72
+ /**
73
+ * A function to be called when an input element's value changes.
74
+ *
75
+ * @category Internal
76
+ */
77
+ export function textInputListener({ inputs, previousValue, event, elementConstructor, inputBlockedCallback, newValueCallback, }) {
78
+ const inputElement = extractEventTarget(event, elementConstructor || HTMLInputElement);
79
+ /**
80
+ * This is usually a single character, but can be a bunch of characters in some circumstances.
81
+ * For example, when a bunch of characters are pasted, this will be the entire pasted contents.
82
+ *
83
+ * When a password manager auto fills the password, at least for Safari + iCloud Keychain, it'll
84
+ * fire a `CustomEvent` (rather than the typical `InputEvent`) and `event.data` won't be
85
+ * populated.
86
+ */
87
+ const changedText = (check.hasKey(event, 'data') && checkWrap.isString(event.data)) || '';
88
+ /**
89
+ * When changedText is falsy, that means an operation other than inserting characters happened.
90
+ * Such as: deleting, cutting the text, etc.
91
+ */
92
+ if (changedText) {
93
+ const { blocked } = filterTextInputValue({
94
+ value: changedText,
95
+ allowed: inputs.allowedInputs,
96
+ blocked: inputs.blockedInputs,
97
+ });
98
+ if (blocked.length) {
99
+ inputBlockedCallback(blocked);
100
+ }
101
+ }
102
+ const finalValue = filterTextInputValue({
103
+ value: inputElement.value,
104
+ allowed: inputs.allowedInputs,
105
+ blocked: inputs.blockedInputs,
106
+ }).filtered;
107
+ if (inputElement.value !== finalValue) {
108
+ // this prevents blocked inputs by simply overwriting them
109
+ inputElement.value = finalValue;
110
+ }
111
+ if (previousValue !== finalValue) {
112
+ newValueCallback(finalValue);
113
+ }
114
+ }