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
@@ -1,5 +1,4 @@
1
- import {type PartialWithUndefined} from '@augment-vir/common';
2
-
1
+ import { type PartialWithUndefined } from '@augment-vir/common';
3
2
  /**
4
3
  * Options for `ViraSelect` and `ViraDropdown`.
5
4
  *
@@ -14,7 +13,6 @@ export type ViraSelectOption = {
14
13
  } & PartialWithUndefined<{
15
14
  disabled: boolean;
16
15
  }>;
17
-
18
16
  /**
19
17
  * A group of options for `ViraSelect`, rendered as an `<optgroup>`.
20
18
  *
@@ -25,14 +23,9 @@ export type ViraSelectOptionGroup = {
25
23
  groupName: string;
26
24
  options: ReadonlyArray<Readonly<ViraSelectOption>>;
27
25
  };
28
-
29
26
  /**
30
27
  * Type guard to determine if a `ViraSelect` options entry is a group.
31
28
  *
32
29
  * @category Internal
33
30
  */
34
- export function isViraSelectOptionGroup(
35
- entry: Readonly<ViraSelectOption> | Readonly<ViraSelectOptionGroup>,
36
- ): entry is Readonly<ViraSelectOptionGroup> {
37
- return 'groupName' in entry;
38
- }
31
+ export declare function isViraSelectOptionGroup(entry: Readonly<ViraSelectOption> | Readonly<ViraSelectOptionGroup>): entry is Readonly<ViraSelectOptionGroup>;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Type guard to determine if a `ViraSelect` options entry is a group.
3
+ *
4
+ * @category Internal
5
+ */
6
+ export function isViraSelectOptionGroup(entry) {
7
+ return 'groupName' in entry;
8
+ }
@@ -0,0 +1,83 @@
1
+ import { type MaybePromise, type PartialWithUndefined } from '@augment-vir/common';
2
+ import { LocalStorageClient } from '@electrovir/local-storage-client';
3
+ /**
4
+ * A user-facing selection of which theme to display. `Auto` follows the system color scheme; the
5
+ * other values force a specific theme regardless of system preference.
6
+ *
7
+ * @category Internal
8
+ */
9
+ export declare enum ViraThemeSelection {
10
+ Light = "light",
11
+ Dark = "dark",
12
+ Auto = "auto"
13
+ }
14
+ /**
15
+ * Used by {@link ViraThemeClient} to apply themes. By default, vira themes will be applied (via
16
+ * {@link defaultApplyThemeCallback}).
17
+ *
18
+ * @category Internal
19
+ * @default `defaultApplyThemeCallback`
20
+ */
21
+ export type ApplyThemeCallback = (params: Readonly<{
22
+ useDarkTheme: boolean;
23
+ }>) => MaybePromise<void>;
24
+ /**
25
+ * Default implementation of {@link ApplyThemeCallback}, which simply applies Vira themes.
26
+ *
27
+ * @category Internal
28
+ */
29
+ export declare const defaultApplyThemeCallback: ApplyThemeCallback;
30
+ /**
31
+ * Constructor params for {@link ViraThemeClient}.
32
+ *
33
+ * @category Internal
34
+ */
35
+ export type ViraThemeClientParams = PartialWithUndefined<{
36
+ /**
37
+ * Called whenever the effective theme should change. If not provided, the default Vira themes
38
+ * will be used.
39
+ */
40
+ applyTheme: ApplyThemeCallback;
41
+ /**
42
+ * Override the LocalStorage store name used for theme persistence. Useful if a single page
43
+ * hosts multiple isolated theme clients.
44
+ *
45
+ * @default 'vira-theme'
46
+ */
47
+ storeName: string;
48
+ }>;
49
+ declare const themeStorageShapes: {
50
+ selectedTheme: import("object-shape-tester").Shape<{
51
+ theme: import("object-shape-tester").Shape<import("@sinclair/typebox").TUnion<(import("@sinclair/typebox").TLiteral<ViraThemeSelection.Light> | import("@sinclair/typebox").TLiteral<ViraThemeSelection.Dark> | import("@sinclair/typebox").TLiteral<ViraThemeSelection.Auto>)[]>>;
52
+ }>;
53
+ };
54
+ /**
55
+ * Tracks the user's {@link ViraThemeSelection} and bridges it to a consumer-supplied `applyTheme`
56
+ * callback. Persists the selection in LocalStorage via an internal `LocalStorageClient`, and
57
+ * listens for system color-scheme changes to re-apply the theme in auto mode without persisting.
58
+ *
59
+ * The initial theme is applied during construction.
60
+ *
61
+ * @category Util
62
+ */
63
+ export declare class ViraThemeClient {
64
+ /** The callback that will be called to apply a new theme. */
65
+ protected readonly applyThemeCallback: ApplyThemeCallback;
66
+ /** Contains the user's last selected theme, saving and loading it to disk for persistence. */
67
+ protected readonly localStorageClient: LocalStorageClient<typeof themeStorageShapes>;
68
+ /** A callback to remove the global theme preference listener. */
69
+ protected readonly removeThemePreferenceListener: () => void;
70
+ constructor(params?: Readonly<ViraThemeClientParams>);
71
+ /**
72
+ * The currently selected theme. If you use multiple clients to set the same theme, this might
73
+ * get out of sync.
74
+ */
75
+ get currentTheme(): ViraThemeSelection;
76
+ /** Set the selected theme. */
77
+ setSelectedTheme(selection: ViraThemeSelection): void;
78
+ /** Cleanup internal state and listeners. */
79
+ destroy(): void;
80
+ /** Apply the currently selected theme. */
81
+ protected applySelection(selection: ViraThemeSelection): void;
82
+ }
83
+ export {};
@@ -0,0 +1,93 @@
1
+ import { assert } from '@augment-vir/assert';
2
+ import { LocalStorageClient } from '@electrovir/local-storage-client';
3
+ import { defineShape, enumShape } from 'object-shape-tester';
4
+ import { applyColorThemeViaStyleElement } from 'theme-vir/dist/color-theme/apply-color-theme.js';
5
+ import { listenTo } from 'typed-event-target';
6
+ import { viraTheme, viraThemeDarkOverride } from '../styles/vira-color-theme.js';
7
+ /**
8
+ * A user-facing selection of which theme to display. `Auto` follows the system color scheme; the
9
+ * other values force a specific theme regardless of system preference.
10
+ *
11
+ * @category Internal
12
+ */
13
+ export var ViraThemeSelection;
14
+ (function (ViraThemeSelection) {
15
+ ViraThemeSelection["Light"] = "light";
16
+ ViraThemeSelection["Dark"] = "dark";
17
+ ViraThemeSelection["Auto"] = "auto";
18
+ })(ViraThemeSelection || (ViraThemeSelection = {}));
19
+ /**
20
+ * Default implementation of {@link ApplyThemeCallback}, which simply applies Vira themes.
21
+ *
22
+ * @category Internal
23
+ */
24
+ export const defaultApplyThemeCallback = ({ useDarkTheme }) => {
25
+ applyColorThemeViaStyleElement(viraTheme, useDarkTheme ? viraThemeDarkOverride : undefined);
26
+ };
27
+ const darkSchemeMediaQuery = '(prefers-color-scheme: dark)';
28
+ const themeStorageShapes = {
29
+ selectedTheme: defineShape({
30
+ theme: enumShape(ViraThemeSelection),
31
+ }),
32
+ };
33
+ /**
34
+ * Tracks the user's {@link ViraThemeSelection} and bridges it to a consumer-supplied `applyTheme`
35
+ * callback. Persists the selection in LocalStorage via an internal `LocalStorageClient`, and
36
+ * listens for system color-scheme changes to re-apply the theme in auto mode without persisting.
37
+ *
38
+ * The initial theme is applied during construction.
39
+ *
40
+ * @category Util
41
+ */
42
+ export class ViraThemeClient {
43
+ /** The callback that will be called to apply a new theme. */
44
+ applyThemeCallback = defaultApplyThemeCallback;
45
+ /** Contains the user's last selected theme, saving and loading it to disk for persistence. */
46
+ localStorageClient;
47
+ /** A callback to remove the global theme preference listener. */
48
+ removeThemePreferenceListener = listenTo(globalThis.matchMedia(darkSchemeMediaQuery), 'change', (event) => {
49
+ assert.instanceOf(event, MediaQueryListEvent);
50
+ if (this.currentTheme === ViraThemeSelection.Auto) {
51
+ void this.applyThemeCallback({
52
+ useDarkTheme: event.matches,
53
+ });
54
+ }
55
+ });
56
+ constructor(params = {}) {
57
+ if (params.applyTheme) {
58
+ this.applyThemeCallback = params.applyTheme;
59
+ }
60
+ this.localStorageClient = new LocalStorageClient(themeStorageShapes, {
61
+ storeName: params.storeName || 'vira-theme',
62
+ });
63
+ this.applySelection(this.currentTheme);
64
+ }
65
+ /**
66
+ * The currently selected theme. If you use multiple clients to set the same theme, this might
67
+ * get out of sync.
68
+ */
69
+ get currentTheme() {
70
+ return this.localStorageClient.get.selectedTheme()?.theme || ViraThemeSelection.Auto;
71
+ }
72
+ /** Set the selected theme. */
73
+ setSelectedTheme(selection) {
74
+ this.applySelection(selection);
75
+ this.localStorageClient.set.selectedTheme({
76
+ theme: selection,
77
+ });
78
+ }
79
+ /** Cleanup internal state and listeners. */
80
+ destroy() {
81
+ this.removeThemePreferenceListener();
82
+ this.localStorageClient.destroy();
83
+ }
84
+ /** Apply the currently selected theme. */
85
+ applySelection(selection) {
86
+ const useDarkTheme = selection === ViraThemeSelection.Dark ||
87
+ (selection === ViraThemeSelection.Auto &&
88
+ globalThis.matchMedia(darkSchemeMediaQuery).matches);
89
+ void this.applyThemeCallback({
90
+ useDarkTheme,
91
+ });
92
+ }
93
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vira",
3
- "version": "32.0.0-beta.0",
3
+ "version": "32.0.0",
4
4
  "description": "A simple and highly versatile design system using element-vir.",
5
5
  "keywords": [
6
6
  "design",
@@ -27,9 +27,9 @@
27
27
  },
28
28
  "sideEffects": false,
29
29
  "type": "module",
30
- "main": "src/index.ts",
31
- "module": "src/index.ts",
32
- "types": "src/index.ts",
30
+ "main": "dist/index.js",
31
+ "module": "dist/index.js",
32
+ "types": "dist/index.d.ts",
33
33
  "scripts": {
34
34
  "build": "npm run docs",
35
35
  "compile": "virmator compile",
@@ -38,13 +38,13 @@
38
38
  "test:docs": "virmator docs check"
39
39
  },
40
40
  "dependencies": {
41
- "@augment-vir/assert": "^32.3.0-beta.0",
42
- "@augment-vir/common": "^32.3.0-beta.0",
43
- "@augment-vir/web": "^32.3.0-beta.0",
44
- "@electrovir/color": "^2.0.0-beta.0",
41
+ "@augment-vir/assert": "^32.3.0",
42
+ "@augment-vir/common": "^32.3.0",
43
+ "@augment-vir/web": "^32.3.0",
44
+ "@electrovir/color": "^2.0.0",
45
45
  "@electrovir/local-storage-client": "^0.1.1",
46
46
  "date-vir": "^9.1.1",
47
- "device-navigation": "^5.0.0-beta.0",
47
+ "device-navigation": "^5.0.0",
48
48
  "json-schema-to-ts": "^3.1.1",
49
49
  "lit-css-vars": "^3.6.3",
50
50
  "object-shape-tester": "^6.15.0",
@@ -54,7 +54,7 @@
54
54
  "typed-event-target": "^4.3.3"
55
55
  },
56
56
  "devDependencies": {
57
- "@augment-vir/test": "^32.3.0-beta.0",
57
+ "@augment-vir/test": "^32.3.0",
58
58
  "@web/dev-server-esbuild": "^2.0.0",
59
59
  "@web/test-runner": "^1.0.0",
60
60
  "@web/test-runner-commands": "^1.0.1",
@@ -64,16 +64,16 @@
64
64
  "istanbul-smart-text-reporter": "^1.1.5",
65
65
  "lucide-static": "^1.42.0",
66
66
  "markdown-code-example-inserter": "^3.0.6",
67
- "theme-vir": "^29.0.0-beta.0",
67
+ "theme-vir": "^29.0.0",
68
68
  "typedoc": "^0.28.20",
69
69
  "typescript": "^6.0.3",
70
70
  "vite": "^8.2.2",
71
71
  "vite-tsconfig-paths": "^6.1.1"
72
72
  },
73
73
  "peerDependencies": {
74
- "element-vir": "^27.0.0-beta.3",
74
+ "element-vir": "^27.0.0",
75
75
  "lucide-static": ">=0.460",
76
- "theme-vir": "^29.0.0-beta.0"
76
+ "theme-vir": "^29.0.0"
77
77
  },
78
78
  "engines": {
79
79
  "node": ">=22"
@@ -1,66 +0,0 @@
1
- /* node:coverage disable */
2
-
3
- import {getObjectTypedKeys, getObjectTypedValues} from '@augment-vir/common';
4
- import {colorFormatsBySpace} from '@electrovir/color/dist/data/color-class/color-formats.js';
5
- import {type Color} from '@electrovir/color/dist/data/color-class/color.js';
6
- import {css, defineElement, defineElementEvent, html, listen} from 'element-vir';
7
- import {ViraColorFormatSliders} from './vira-color-format-sliders.element.js';
8
-
9
- /**
10
- * Color sliders for all color spaces.
11
- *
12
- * @category Elements
13
- */
14
- export const ViraAllColorSpaceSliders = defineElement<{color: Readonly<Color>}>()({
15
- tagName: 'vira-all-color-space-sliders',
16
- styles: css`
17
- :host {
18
- display: flex;
19
- flex-direction: column;
20
- gap: 16px;
21
- }
22
-
23
- .color-space {
24
- display: flex;
25
- flex-wrap: wrap;
26
- column-gap: 32px;
27
- row-gap: 8px;
28
- }
29
- `,
30
- events: {
31
- colorChange: defineElementEvent<string>(),
32
- },
33
- render({inputs, dispatch, events}) {
34
- const colorSpaceTemplates = getObjectTypedValues(colorFormatsBySpace).map(
35
- (colorSpaceFormats) => {
36
- const formatTemplates = getObjectTypedKeys(colorSpaceFormats).map(
37
- (colorFormatName) => {
38
- return html`
39
- <${ViraColorFormatSliders.assign({
40
- color: inputs.color,
41
- colorFormatName,
42
- showFormatName: true,
43
- })}
44
- ${listen(ViraColorFormatSliders.events.colorChange, (event) => {
45
- dispatch(
46
- new events.colorChange({
47
- detail: event.detail,
48
- }),
49
- );
50
- })}
51
- ></${ViraColorFormatSliders}>
52
- `;
53
- },
54
- );
55
-
56
- return html`
57
- <section class="color-space">${formatTemplates}</section>
58
- `;
59
- },
60
- );
61
-
62
- return html`
63
- ${colorSpaceTemplates}
64
- `;
65
- },
66
- });
@@ -1,85 +0,0 @@
1
- /* node:coverage disable */
2
-
3
- import {
4
- type ColorSyntaxName,
5
- getColorSyntaxFromCssString,
6
- } from '@electrovir/color/dist/data/color-class/color-formats.js';
7
- import {Color} from '@electrovir/color/dist/data/color-class/color.js';
8
- import {css, defineElement, defineElementEvent, html, listen} from 'element-vir';
9
- import {ViraAllColorSpaceSliders} from './vira-all-color-space-sliders.element.js';
10
- import {ViraColorDetails} from './vira-color-details.element.js';
11
-
12
- /**
13
- * A color picker element that shows sliders for all supported color spaces at once, as well as all
14
- * the values for all supported color spaces in a table.
15
- *
16
- * @category Elements
17
- */
18
- export const ViraAllSpacesColorPicker = defineElement<{color: string}>()({
19
- tagName: 'vira-all-spaces-color-picker',
20
- styles: css`
21
- :host {
22
- display: flex;
23
- flex-direction: column;
24
- gap: 16px;
25
- }
26
- `,
27
- events: {
28
- colorChange: defineElementEvent<string>(),
29
- },
30
- state() {
31
- return {
32
- inputColorString: undefined as undefined | string,
33
- overrideInputColor: undefined as undefined | ColorSyntaxName,
34
- };
35
- },
36
- render({inputs, dispatch, events, state, updateState}) {
37
- const color = new Color(inputs.color);
38
-
39
- if (state.overrideInputColor) {
40
- updateState({
41
- inputColorString: color.toCss()[state.overrideInputColor],
42
- });
43
- }
44
-
45
- if (state.inputColorString == undefined) {
46
- updateState({
47
- inputColorString: inputs.color,
48
- });
49
- }
50
-
51
- return html`
52
- <${ViraColorDetails.assign({
53
- color: inputs.color,
54
- showInput: true,
55
- })}
56
- ${listen(ViraColorDetails.events.colorChange, (event) => {
57
- updateState({
58
- inputColorString: event.detail,
59
- overrideInputColor: undefined,
60
- });
61
- dispatch(
62
- new events.colorChange({
63
- detail: event.detail,
64
- }),
65
- );
66
- })}
67
- ></${ViraColorDetails}>
68
- <${ViraAllColorSpaceSliders.assign({
69
- color,
70
- })}
71
- ${listen(ViraAllColorSpaceSliders.events.colorChange, (event) => {
72
- const colorSyntax = getColorSyntaxFromCssString(state.inputColorString || '#');
73
- updateState({
74
- overrideInputColor: colorSyntax,
75
- });
76
- dispatch(
77
- new events.colorChange({
78
- detail: event.detail,
79
- }),
80
- );
81
- })}
82
- ></${ViraAllColorSpaceSliders}>
83
- `;
84
- },
85
- });
@@ -1,78 +0,0 @@
1
- /* node:coverage disable */
2
-
3
- import {getObjectTypedKeys} from '@augment-vir/common';
4
- import {
5
- type ColorCoordinateName,
6
- type ColorFormatName,
7
- colorFormats,
8
- } from '@electrovir/color/dist/data/color-class/color-formats.js';
9
- import {type Color, type ColorUpdate} from '@electrovir/color/dist/data/color-class/color.js';
10
- import {css, defineElement, defineElementEvent, html, listen, nothing} from 'element-vir';
11
- import {noNativeSpacing} from '../../styles/native-styles.js';
12
- import {ViraColorSlider} from './vira-color-slider.element.js';
13
-
14
- /**
15
- * Color sliders for all coordinates within a specific color format.
16
- *
17
- * @category Elements
18
- */
19
- export const ViraColorFormatSliders = defineElement<{
20
- color: Readonly<Color>;
21
- colorFormatName: ColorFormatName;
22
- showFormatName: boolean;
23
- }>()({
24
- tagName: 'vira-color-format-sliders',
25
- styles: css`
26
- :host {
27
- display: flex;
28
- flex-direction: column;
29
- }
30
-
31
- h3 {
32
- ${noNativeSpacing};
33
- }
34
- `,
35
- events: {
36
- colorChange: defineElementEvent<string>(),
37
- },
38
- render({inputs, dispatch, events}) {
39
- const colorFormat = colorFormats[inputs.colorFormatName];
40
-
41
- const coordinateTemplates = getObjectTypedKeys(colorFormat.coords).map(
42
- (colorCoordinate: ColorCoordinateName) => {
43
- return html`
44
- <${ViraColorSlider.assign({
45
- color: inputs.color,
46
- colorCoordinateName: colorCoordinate,
47
- colorFormatName: inputs.colorFormatName,
48
- })}
49
- ${listen(ViraColorSlider.events.valueChange, (event) => {
50
- const newColor = inputs.color.clone();
51
-
52
- newColor.set({
53
- [inputs.colorFormatName]: {
54
- [colorCoordinate]: event.detail,
55
- },
56
- } as ColorUpdate);
57
- const newValue = newColor.toCss()[colorFormat.conversionFormat];
58
- dispatch(
59
- new events.colorChange({
60
- detail: newValue,
61
- }),
62
- );
63
- })}
64
- ></${ViraColorSlider}>
65
- `;
66
- },
67
- );
68
-
69
- return html`
70
- ${inputs.showFormatName
71
- ? html`
72
- <h3>${inputs.colorFormatName}</h3>
73
- `
74
- : nothing}
75
- ${coordinateTemplates}
76
- `;
77
- },
78
- });
@@ -1,169 +0,0 @@
1
- /* node:coverage disable */
2
-
3
- import {assert, assertWrap} from '@augment-vir/assert';
4
- import {createArray} from '@augment-vir/common';
5
- import {extractEventTarget} from '@augment-vir/web';
6
- import {
7
- type ColorCoordinateName,
8
- type ColorFormatDefinition,
9
- type ColorFormatName,
10
- colorFormats,
11
- } from '@electrovir/color/dist/data/color-class/color-formats.js';
12
- import {Color, type ColorUpdate} from '@electrovir/color/dist/data/color-class/color.js';
13
- import {
14
- css,
15
- defineElement,
16
- defineElementEvent,
17
- html,
18
- listen,
19
- onDomRendered,
20
- unsafeCSS,
21
- } from 'element-vir';
22
- import {viraFontCssVars} from '../../styles/font.js';
23
- import {ViraInput} from '../vira-input.element.js';
24
-
25
- /**
26
- * A slider for a specific color coordinate in a specific color space in a specific color.
27
- *
28
- * @category Elements
29
- */
30
- export const ViraColorSlider = defineElement<{
31
- color: Readonly<Color>;
32
- colorFormatName: ColorFormatName;
33
- colorCoordinateName: ColorCoordinateName;
34
- }>()({
35
- tagName: 'vira-color-slider',
36
- cssVars: {
37
- 'vira-color-slider-gradient': 'black',
38
- },
39
- styles: ({cssVars}) => {
40
- return css`
41
- :host {
42
- display: flex;
43
- align-items: center;
44
- font-family: ${viraFontCssVars['vira-monospace'].value};
45
- gap: 2px;
46
- }
47
-
48
- input[type='range'] {
49
- flex-grow: 1;
50
- appearance: none;
51
- background: ${cssVars['vira-color-slider-gradient'].value};
52
- height: 9px;
53
- border-radius: 4px;
54
- cursor: pointer;
55
- }
56
-
57
- ${ViraInput} {
58
- width: 76px;
59
- }
60
-
61
- .coordinate {
62
- font-size: 18px;
63
- margin-top: -4px;
64
- }
65
- `;
66
- },
67
- events: {
68
- valueChange: defineElementEvent<number>(),
69
- },
70
- render({inputs, events, dispatch, cssVars}) {
71
- const formatDefinition: ColorFormatDefinition = colorFormats[inputs.colorFormatName];
72
- const coordinateDefinition = formatDefinition.coords[inputs.colorCoordinateName];
73
-
74
- if (!coordinateDefinition) {
75
- throw new Error(
76
- `Invalid color coordinate '${inputs.colorCoordinateName}' for color format '${inputs.colorFormatName}'`,
77
- );
78
- }
79
-
80
- const totalStops = 10;
81
-
82
- const colorStops: string[] = createArray(totalStops, (index) => {
83
- const value =
84
- coordinateDefinition.min +
85
- (coordinateDefinition.max - coordinateDefinition.min) * (index / totalStops);
86
-
87
- const stopColor = new Color({
88
- [inputs.colorFormatName]: {
89
- ...inputs.color[inputs.colorFormatName],
90
- [inputs.colorCoordinateName]: value,
91
- },
92
- } as ColorUpdate);
93
-
94
- return stopColor.toCss()[formatDefinition.conversionFormat];
95
- });
96
-
97
- const gradient = css`linear-gradient(to right, ${unsafeCSS(colorStops.join(','))})`;
98
-
99
- const coordinateValue = assertWrap.isNumber(
100
- (
101
- inputs.color[inputs.colorFormatName] as Record<
102
- ColorCoordinateName,
103
- undefined | string | number
104
- >
105
- )[inputs.colorCoordinateName],
106
- );
107
-
108
- const displayValue = coordinateDefinition.radix
109
- ? Math.round(coordinateValue)
110
- .toString(coordinateDefinition.radix)
111
- .toUpperCase()
112
- .padStart(coordinateDefinition.radixPad || 0, '0')
113
- : String(coordinateValue);
114
-
115
- return html`
116
- <span class="coordinate">${inputs.colorCoordinateName.toUpperCase()}</span>
117
- <input
118
- type="range"
119
- style=${css`
120
- ${cssVars['vira-color-slider-gradient'].name}: ${gradient};
121
- `}
122
- step=${Math.pow(10, coordinateDefinition.digits ? -coordinateDefinition.digits : 0)}
123
- ${onDomRendered((element) => {
124
- /**
125
- * We must set these imperatively to force the input element to match the
126
- * inputs, otherwise when swapping color formats these color sliders don't
127
- * update correctly.
128
- */
129
- assert.instanceOf(element, HTMLInputElement);
130
-
131
- element.min = String(coordinateDefinition.min);
132
- element.max = String(coordinateDefinition.max);
133
- element.value = String(coordinateValue);
134
- })}
135
- ${listen('input', (event) => {
136
- const element = extractEventTarget(event, HTMLInputElement);
137
- const newValue = Number(element.value);
138
- if (isNaN(newValue)) {
139
- return;
140
- }
141
-
142
- dispatch(
143
- new events.valueChange({
144
- detail: newValue,
145
- }),
146
- );
147
- })}
148
- />
149
- <${ViraInput.assign({
150
- value: displayValue,
151
- })}
152
- ${listen(ViraInput.events.valueChange, (event) => {
153
- const newValue = coordinateDefinition.radix
154
- ? parseInt(event.detail, coordinateDefinition.radix)
155
- : Number(event.detail);
156
- if (isNaN(newValue)) {
157
- return;
158
- }
159
-
160
- dispatch(
161
- new events.valueChange({
162
- detail: newValue,
163
- }),
164
- );
165
- })}
166
- ></${ViraInput}>
167
- `;
168
- },
169
- });