vira 28.19.6 → 29.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 (192) hide show
  1. package/dist/elements/define-vira-element.d.ts +18 -0
  2. package/dist/elements/define-vira-element.js +19 -0
  3. package/dist/elements/form/vira-form-fields.d.ts +100 -0
  4. package/dist/elements/form/vira-form-fields.js +60 -0
  5. package/dist/elements/form/vira-form.element.d.ts +35 -0
  6. package/dist/elements/form/vira-form.element.js +151 -0
  7. package/dist/elements/index.js +25 -0
  8. package/dist/elements/pop-up/pop-up-helpers.d.ts +33 -0
  9. package/dist/elements/pop-up/pop-up-helpers.js +58 -0
  10. package/{src/elements/pop-up/pop-up-menu-item.ts → dist/elements/pop-up/pop-up-menu-item.d.ts} +3 -4
  11. package/dist/elements/pop-up/pop-up-menu-item.js +1 -0
  12. package/dist/elements/pop-up/vira-menu-item.element.d.ts +19 -0
  13. package/{src/elements/pop-up/vira-menu-item.element.ts → dist/elements/pop-up/vira-menu-item.element.js} +11 -28
  14. package/dist/elements/pop-up/vira-menu-trigger.element.d.ts +41 -0
  15. package/dist/elements/pop-up/vira-menu-trigger.element.js +121 -0
  16. package/dist/elements/pop-up/vira-menu.element.d.ts +38 -0
  17. package/{src/elements/pop-up/vira-menu.element.ts → dist/elements/pop-up/vira-menu.element.js} +49 -78
  18. package/dist/elements/pop-up/vira-pop-up-menu.element.d.ts +35 -0
  19. package/{src/elements/pop-up/vira-pop-up-menu.element.ts → dist/elements/pop-up/vira-pop-up-menu.element.js} +24 -37
  20. package/dist/elements/pop-up/vira-pop-up-trigger.element.d.ts +105 -0
  21. package/{src/elements/pop-up/vira-pop-up-trigger.element.ts → dist/elements/pop-up/vira-pop-up-trigger.element.js} +104 -199
  22. package/dist/elements/shared-text-input-logic.d.ts +63 -0
  23. package/dist/elements/shared-text-input-logic.js +101 -0
  24. package/dist/elements/vira-bold-text.element.d.ts +9 -0
  25. package/{src/elements/vira-bold-text.element.ts → dist/elements/vira-bold-text.element.js} +7 -8
  26. package/dist/elements/vira-button.element.d.ts +34 -0
  27. package/dist/elements/vira-button.element.js +176 -0
  28. package/dist/elements/vira-card.element.d.ts +18 -0
  29. package/dist/elements/vira-card.element.js +60 -0
  30. package/dist/elements/vira-checkbox.element.d.ts +38 -0
  31. package/{src/elements/vira-checkbox.element.ts → dist/elements/vira-checkbox.element.js} +70 -83
  32. package/dist/elements/vira-collapsible-wrapper.element.d.ts +14 -0
  33. package/{src/elements/vira-collapsible-wrapper.element.ts → dist/elements/vira-collapsible-wrapper.element.js} +16 -18
  34. package/dist/elements/vira-dropdown.element.d.ts +46 -0
  35. package/{src/elements/vira-dropdown.element.ts → dist/elements/vira-dropdown.element.js} +48 -95
  36. package/dist/elements/vira-error.element.d.ts +7 -0
  37. package/{src/elements/vira-error.element.ts → dist/elements/vira-error.element.js} +6 -7
  38. package/dist/elements/vira-icon.element.d.ts +13 -0
  39. package/{src/elements/vira-icon.element.ts → dist/elements/vira-icon.element.js} +6 -13
  40. package/dist/elements/vira-image.element.d.ts +45 -0
  41. package/{src/elements/vira-image.element.ts → dist/elements/vira-image.element.js} +43 -63
  42. package/dist/elements/vira-input.element.d.ts +62 -0
  43. package/{src/elements/vira-input.element.ts → dist/elements/vira-input.element.js} +93 -166
  44. package/dist/elements/vira-link.element.d.ts +73 -0
  45. package/{src/elements/vira-link.element.ts → dist/elements/vira-link.element.js} +17 -67
  46. package/dist/elements/vira-modal.element.d.ts +39 -0
  47. package/{src/elements/vira-modal.element.ts → dist/elements/vira-modal.element.js} +56 -97
  48. package/dist/elements/vira-overflow-switch.element.d.ts +21 -0
  49. package/dist/elements/vira-overflow-switch.element.js +110 -0
  50. package/dist/elements/vira-progress.element.d.ts +18 -0
  51. package/{src/elements/vira-progress.element.ts → dist/elements/vira-progress.element.js} +14 -30
  52. package/dist/elements/vira-select.element.d.ts +48 -0
  53. package/{src/elements/vira-select.element.ts → dist/elements/vira-select.element.js} +45 -99
  54. package/dist/icons/icon-color.test-helper.d.ts +6 -0
  55. package/dist/icons/icon-color.test-helper.js +9 -0
  56. package/dist/icons/icon-css-vars.d.ts +14 -0
  57. package/{src/icons/icon-css-vars.ts → dist/icons/icon-css-vars.js} +1 -2
  58. package/dist/icons/icon-svg.d.ts +27 -0
  59. package/dist/icons/icon-svg.js +48 -0
  60. package/dist/icons/icon-svgs/bell-24.icon.d.ts +8 -0
  61. package/{src/icons/icon-svgs/bell-24.icon.ts → dist/icons/icon-svgs/bell-24.icon.js} +4 -5
  62. package/dist/icons/icon-svgs/chat-24.icon.d.ts +8 -0
  63. package/{src/icons/icon-svgs/chat-24.icon.ts → dist/icons/icon-svgs/chat-24.icon.js} +4 -5
  64. package/dist/icons/icon-svgs/check-24.icon.d.ts +8 -0
  65. package/{src/icons/icon-svgs/check-24.icon.ts → dist/icons/icon-svgs/check-24.icon.js} +4 -5
  66. package/dist/icons/icon-svgs/chevron-down-24.icon.d.ts +8 -0
  67. package/{src/icons/icon-svgs/chevron-down-24.icon.ts → dist/icons/icon-svgs/chevron-down-24.icon.js} +4 -5
  68. package/dist/icons/icon-svgs/chevron-up-24.icon.d.ts +8 -0
  69. package/{src/icons/icon-svgs/chevron-up-24.icon.ts → dist/icons/icon-svgs/chevron-up-24.icon.js} +4 -5
  70. package/dist/icons/icon-svgs/close-x-24.icon.d.ts +8 -0
  71. package/{src/icons/icon-svgs/close-x-24.icon.ts → dist/icons/icon-svgs/close-x-24.icon.js} +4 -5
  72. package/dist/icons/icon-svgs/commit-24.icon.d.ts +8 -0
  73. package/{src/icons/icon-svgs/commit-24.icon.ts → dist/icons/icon-svgs/commit-24.icon.js} +4 -5
  74. package/dist/icons/icon-svgs/copy-24.icon.d.ts +8 -0
  75. package/{src/icons/icon-svgs/copy-24.icon.ts → dist/icons/icon-svgs/copy-24.icon.js} +4 -5
  76. package/dist/icons/icon-svgs/document-24.icon.d.ts +8 -0
  77. package/{src/icons/icon-svgs/document-24.icon.ts → dist/icons/icon-svgs/document-24.icon.js} +4 -5
  78. package/dist/icons/icon-svgs/document-search-24.icon.d.ts +8 -0
  79. package/{src/icons/icon-svgs/document-search-24.icon.ts → dist/icons/icon-svgs/document-search-24.icon.js} +4 -5
  80. package/dist/icons/icon-svgs/double-chevron-24.icon.d.ts +8 -0
  81. package/{src/icons/icon-svgs/double-chevron-24.icon.ts → dist/icons/icon-svgs/double-chevron-24.icon.js} +4 -5
  82. package/dist/icons/icon-svgs/element-16.icon.d.ts +8 -0
  83. package/{src/icons/icon-svgs/element-16.icon.ts → dist/icons/icon-svgs/element-16.icon.js} +4 -5
  84. package/dist/icons/icon-svgs/element-24.icon.d.ts +8 -0
  85. package/{src/icons/icon-svgs/element-24.icon.ts → dist/icons/icon-svgs/element-24.icon.js} +4 -5
  86. package/dist/icons/icon-svgs/external-link-24.icon.d.ts +8 -0
  87. package/{src/icons/icon-svgs/external-link-24.icon.ts → dist/icons/icon-svgs/external-link-24.icon.js} +4 -5
  88. package/dist/icons/icon-svgs/eye-closed-24.icon.d.ts +8 -0
  89. package/{src/icons/icon-svgs/eye-closed-24.icon.ts → dist/icons/icon-svgs/eye-closed-24.icon.js} +4 -5
  90. package/dist/icons/icon-svgs/eye-open-24.icon.d.ts +8 -0
  91. package/{src/icons/icon-svgs/eye-open-24.icon.ts → dist/icons/icon-svgs/eye-open-24.icon.js} +4 -5
  92. package/dist/icons/icon-svgs/filter-24.icon.d.ts +8 -0
  93. package/{src/icons/icon-svgs/filter-24.icon.ts → dist/icons/icon-svgs/filter-24.icon.js} +4 -5
  94. package/dist/icons/icon-svgs/link-24.icon.d.ts +8 -0
  95. package/{src/icons/icon-svgs/link-24.icon.ts → dist/icons/icon-svgs/link-24.icon.js} +4 -5
  96. package/dist/icons/icon-svgs/loader-24.icon.d.ts +8 -0
  97. package/{src/icons/icon-svgs/loader-24.icon.ts → dist/icons/icon-svgs/loader-24.icon.js} +4 -5
  98. package/dist/icons/icon-svgs/loader-animated-24.icon.d.ts +8 -0
  99. package/{src/icons/icon-svgs/loader-animated-24.icon.ts → dist/icons/icon-svgs/loader-animated-24.icon.js} +6 -8
  100. package/dist/icons/icon-svgs/lock-24.icon.d.ts +8 -0
  101. package/{src/icons/icon-svgs/lock-24.icon.ts → dist/icons/icon-svgs/lock-24.icon.js} +4 -5
  102. package/dist/icons/icon-svgs/options-24.icon.d.ts +8 -0
  103. package/{src/icons/icon-svgs/options-24.icon.ts → dist/icons/icon-svgs/options-24.icon.js} +4 -5
  104. package/dist/icons/icon-svgs/pencil-24.icon.d.ts +8 -0
  105. package/{src/icons/icon-svgs/pencil-24.icon.ts → dist/icons/icon-svgs/pencil-24.icon.js} +4 -5
  106. package/dist/icons/icon-svgs/shield-24.icon.d.ts +8 -0
  107. package/{src/icons/icon-svgs/shield-24.icon.ts → dist/icons/icon-svgs/shield-24.icon.js} +4 -5
  108. package/dist/icons/icon-svgs/sort-ascending-24.icon.d.ts +8 -0
  109. package/{src/icons/icon-svgs/sort-ascending-24.icon.ts → dist/icons/icon-svgs/sort-ascending-24.icon.js} +4 -5
  110. package/dist/icons/icon-svgs/sort-descending-24.icon.d.ts +8 -0
  111. package/{src/icons/icon-svgs/sort-descending-24.icon.ts → dist/icons/icon-svgs/sort-descending-24.icon.js} +4 -5
  112. package/dist/icons/icon-svgs/speaker-loud-24.icon.d.ts +8 -0
  113. package/{src/icons/icon-svgs/speaker-loud-24.icon.ts → dist/icons/icon-svgs/speaker-loud-24.icon.js} +4 -5
  114. package/dist/icons/icon-svgs/speaker-medium-24.icon.d.ts +8 -0
  115. package/{src/icons/icon-svgs/speaker-medium-24.icon.ts → dist/icons/icon-svgs/speaker-medium-24.icon.js} +4 -5
  116. package/dist/icons/icon-svgs/speaker-muted-24.icon.d.ts +8 -0
  117. package/{src/icons/icon-svgs/speaker-muted-24.icon.ts → dist/icons/icon-svgs/speaker-muted-24.icon.js} +4 -5
  118. package/dist/icons/icon-svgs/speaker-quiet-24.icon.d.ts +8 -0
  119. package/{src/icons/icon-svgs/speaker-quiet-24.icon.ts → dist/icons/icon-svgs/speaker-quiet-24.icon.js} +4 -5
  120. package/dist/icons/icon-svgs/star-24.icon.d.ts +8 -0
  121. package/{src/icons/icon-svgs/star-24.icon.ts → dist/icons/icon-svgs/star-24.icon.js} +4 -5
  122. package/dist/icons/icon-svgs/status-failure-24.icon.d.ts +8 -0
  123. package/{src/icons/icon-svgs/status-failure-24.icon.ts → dist/icons/icon-svgs/status-failure-24.icon.js} +4 -5
  124. package/dist/icons/icon-svgs/status-in-progress-24.icon.d.ts +8 -0
  125. package/{src/icons/icon-svgs/status-in-progress-24.icon.ts → dist/icons/icon-svgs/status-in-progress-24.icon.js} +4 -5
  126. package/dist/icons/icon-svgs/status-success-24.icon.d.ts +8 -0
  127. package/{src/icons/icon-svgs/status-success-24.icon.ts → dist/icons/icon-svgs/status-success-24.icon.js} +4 -5
  128. package/dist/icons/icon-svgs/status-unknown-24.icon.d.ts +8 -0
  129. package/{src/icons/icon-svgs/status-unknown-24.icon.ts → dist/icons/icon-svgs/status-unknown-24.icon.js} +4 -5
  130. package/dist/icons/icon-svgs/status-warning-24.icon.d.ts +8 -0
  131. package/{src/icons/icon-svgs/status-warning-24.icon.ts → dist/icons/icon-svgs/status-warning-24.icon.js} +4 -5
  132. package/dist/icons/icon-svgs/upload-24.icon.d.ts +8 -0
  133. package/{src/icons/icon-svgs/upload-24.icon.ts → dist/icons/icon-svgs/upload-24.icon.js} +4 -5
  134. package/dist/icons/icon-svgs/x-24.icon.d.ts +8 -0
  135. package/{src/icons/icon-svgs/x-24.icon.ts → dist/icons/icon-svgs/x-24.icon.js} +4 -5
  136. package/dist/icons/index.d.ts +86 -0
  137. package/{src/icons/index.ts → dist/icons/index.js} +39 -43
  138. package/dist/index.js +4 -0
  139. package/dist/styles/disabled.d.ts +6 -0
  140. package/{src/styles/disabled.ts → dist/styles/disabled.js} +2 -3
  141. package/dist/styles/durations.d.ts +22 -0
  142. package/{src/styles/durations.ts → dist/styles/durations.js} +1 -2
  143. package/dist/styles/focus.d.ts +21 -0
  144. package/dist/styles/focus.js +41 -0
  145. package/dist/styles/font.d.ts +9 -0
  146. package/{src/styles/font.ts → dist/styles/font.js} +1 -2
  147. package/dist/styles/form-styles.d.ts +123 -0
  148. package/dist/styles/form-styles.js +126 -0
  149. package/{src/styles/index.ts → dist/styles/index.d.ts} +0 -2
  150. package/dist/styles/index.js +12 -0
  151. package/dist/styles/native-styles.d.ts +13 -0
  152. package/{src/styles/native-styles.ts → dist/styles/native-styles.js} +3 -6
  153. package/dist/styles/scrollbar.d.ts +6 -0
  154. package/{src/styles/scrollbar.ts → dist/styles/scrollbar.js} +3 -4
  155. package/dist/styles/shadows.d.ts +20 -0
  156. package/{src/styles/shadows.ts → dist/styles/shadows.js} +6 -8
  157. package/dist/styles/user-select.d.ts +6 -0
  158. package/{src/styles/user-select.ts → dist/styles/user-select.js} +2 -3
  159. package/dist/styles/vira-color-palette.d.ts +97 -0
  160. package/dist/styles/vira-color-palette.js +98 -0
  161. package/dist/styles/vira-color-theme.d.ts +1580 -0
  162. package/dist/styles/vira-color-theme.js +1516 -0
  163. package/dist/util/define-table.d.ts +110 -0
  164. package/dist/util/define-table.js +115 -0
  165. package/dist/util/dynamic-element.d.ts +63 -0
  166. package/dist/util/dynamic-element.js +61 -0
  167. package/dist/util/index.js +3 -0
  168. package/dist/util/pop-up-manager.d.ts +186 -0
  169. package/dist/util/pop-up-manager.js +214 -0
  170. package/package.json +6 -6
  171. package/src/elements/define-vira-element.ts +0 -29
  172. package/src/elements/form/vira-form-fields.ts +0 -140
  173. package/src/elements/form/vira-form.element.ts +0 -204
  174. package/src/elements/pop-up/pop-up-helpers.ts +0 -85
  175. package/src/elements/pop-up/vira-menu-trigger.element.ts +0 -158
  176. package/src/elements/shared-text-input-logic.ts +0 -173
  177. package/src/elements/vira-button.element.ts +0 -171
  178. package/src/elements/vira-card.element.ts +0 -54
  179. package/src/elements/vira-overflow-switch.element.ts +0 -137
  180. package/src/icons/icon-color.test-helper.ts +0 -9
  181. package/src/icons/icon-svg.ts +0 -71
  182. package/src/styles/border.ts +0 -11
  183. package/src/styles/focus.ts +0 -76
  184. package/src/styles/form-styles.ts +0 -26
  185. package/src/styles/vira-color-palette.ts +0 -106
  186. package/src/styles/vira-color-theme.ts +0 -1142
  187. package/src/util/define-table.ts +0 -279
  188. package/src/util/dynamic-element.ts +0 -129
  189. package/src/util/pop-up-manager.ts +0 -380
  190. /package/{src/elements/index.ts → dist/elements/index.d.ts} +0 -0
  191. /package/{src/index.ts → dist/index.d.ts} +0 -0
  192. /package/{src/util/index.ts → dist/util/index.d.ts} +0 -0
@@ -1,81 +1,48 @@
1
- import {assertWrap} from '@augment-vir/assert';
2
- import {type PartialWithUndefined} from '@augment-vir/common';
3
- import {css, defineElementEvent, html, listen, nothing, onDomCreated} from 'element-vir';
4
- import {listenToGlobal} from 'typed-event-target';
5
- import {X24Icon} from '../icons/icon-svgs/x-24.icon.js';
6
- import {noNativeFormStyles, noNativeSpacing} from '../styles/native-styles.js';
7
- import {viraShadows} from '../styles/shadows.js';
8
- import {defineViraElement} from './define-vira-element.js';
9
- import {ViraIcon} from './vira-icon.element.js';
10
-
1
+ import { assertWrap } from '@augment-vir/assert';
2
+ import { css, defineElementEvent, html, listen, nothing, onDomCreated } from 'element-vir';
3
+ import { listenToGlobal } from 'typed-event-target';
4
+ import { X24Icon } from '../icons/icon-svgs/x-24.icon.js';
5
+ import { viraFormCssVars } from '../styles/form-styles.js';
6
+ import { noNativeFormStyles, noNativeSpacing } from '../styles/native-styles.js';
7
+ import { viraShadows } from '../styles/shadows.js';
8
+ import { defineViraElement } from './define-vira-element.js';
9
+ import { ViraIcon } from './vira-icon.element.js';
11
10
  const globalEventsToCloseModalOn = [
12
11
  'pagehide',
13
12
  'pageshow',
14
13
  'popstate',
15
- ] as const satisfies (keyof WindowEventMap)[];
16
-
14
+ ];
17
15
  /**
18
16
  * A modal element that uses the built-in `dialog` element.
19
17
  *
20
18
  * @category Elements
21
19
  * @see https://electrovir.github.io/vira/book/elements/vira-modal
22
20
  */
23
- export const ViraModal = defineViraElement<
24
- Readonly<
25
- {
26
- open: boolean;
27
- } & PartialWithUndefined<{
28
- /** If this isn't set, make sure to use the modal title slot to fill it in. */
29
- modalTitle: string;
30
- /**
31
- * If `true`, the following conditions trigger the modal to close:
32
- *
33
- * - The user clicks the "x" close button
34
- * - The `open` input is set to `false`
35
- *
36
- * If set to `false` (the default), the following conditions trigger the modal to close:
37
- *
38
- * - The user clicks outside of the modal
39
- * - The user presses the "Escape" key
40
- * - The user clicks the "x" close button
41
- * - The `open` input is set to `false`
42
- *
43
- * @default false
44
- */
45
- blockLightDismissal: boolean;
46
- modalSubtitle: string;
47
- isMobileSize: boolean;
48
- }>
49
- >
50
- >()({
21
+ export const ViraModal = defineViraElement()({
51
22
  tagName: 'vira-modal',
52
23
  events: {
53
- modalClose: defineElementEvent<void>(),
24
+ modalClose: defineElementEvent(),
54
25
  },
55
26
  state() {
56
27
  return {
57
- dialogElement: undefined as HTMLDialogElement | undefined,
58
- contentElement: undefined as HTMLDivElement | undefined,
59
- previousOpenValue: undefined as undefined | boolean,
28
+ dialogElement: undefined,
29
+ contentElement: undefined,
30
+ previousOpenValue: undefined,
60
31
  /** Remove listeners. */
61
- cleanup: undefined as undefined | (() => void),
32
+ cleanup: undefined,
62
33
  };
63
34
  },
64
- cleanup({state}) {
35
+ cleanup({ state }) {
65
36
  state.cleanup?.();
66
37
  },
67
38
  hostClasses: {
68
- 'vira-modal-phone-size': ({inputs}) => !!inputs.isMobileSize,
39
+ 'vira-modal-phone-size': ({ inputs }) => !!inputs.isMobileSize,
69
40
  },
70
41
  slotNames: ['modalTitle'],
71
42
  cssVars: {
72
- 'vira-modal-backdrop-color': 'rgba(0, 0, 0, 0.35)',
73
43
  'vira-modal-backdrop-filter': 'blur(3px)',
74
- 'vira-modal-subtitle-color': '#7E7E7E',
75
- 'vira-modal-close-button-hover-radius': '8px',
76
- 'vira-modal-close-button-hover-background-color': '#E4E4E4',
77
44
  },
78
- styles: ({hostClasses, cssVars}) => css`
45
+ styles: ({ hostClasses, cssVars }) => css `
79
46
  :host {
80
47
  display: contents;
81
48
  min-width: 280px;
@@ -102,7 +69,7 @@ export const ViraModal = defineViraElement<
102
69
  display: flex;
103
70
  }
104
71
  &::backdrop {
105
- background: ${cssVars['vira-modal-backdrop-color'].value};
72
+ background: ${viraFormCssVars['vira-form-modal-backdrop-color'].value};
106
73
  backdrop-filter: ${cssVars['vira-modal-backdrop-filter'].value};
107
74
  }
108
75
 
@@ -130,7 +97,7 @@ export const ViraModal = defineViraElement<
130
97
 
131
98
  & sub {
132
99
  font-size: 16px;
133
- color: ${cssVars['vira-modal-subtitle-color'].value};
100
+ color: ${viraFormCssVars['vira-form-secondary-body-foreground'].value};
134
101
  }
135
102
  }
136
103
 
@@ -138,12 +105,11 @@ export const ViraModal = defineViraElement<
138
105
  ${noNativeFormStyles};
139
106
  cursor: pointer;
140
107
  padding: 4px;
141
- border-radius: ${cssVars['vira-modal-close-button-hover-radius'].value};
108
+ border-radius: ${viraFormCssVars['vira-form-radius'].value};
142
109
 
143
110
  &:hover {
144
- background-color: ${cssVars[
145
- 'vira-modal-close-button-hover-background-color'
146
- ].value};
111
+ background-color: ${viraFormCssVars['vira-form-selection-hover-color']
112
+ .value};
147
113
  }
148
114
 
149
115
  & ${ViraIcon} {
@@ -166,25 +132,22 @@ export const ViraModal = defineViraElement<
166
132
  }
167
133
  }
168
134
  `,
169
- render({inputs, state, updateState, events, dispatch, slotNames}) {
135
+ render({ inputs, state, updateState, events, dispatch, slotNames }) {
170
136
  if (state.dialogElement && inputs.open !== state.dialogElement.open) {
171
137
  if (inputs.open) {
172
138
  state.dialogElement.showModal();
173
- } else {
139
+ }
140
+ else {
174
141
  state.dialogElement.close();
175
142
  }
176
143
  }
177
-
178
144
  if (state.previousOpenValue !== inputs.open) {
179
145
  state.cleanup?.();
180
- updateState({previousOpenValue: inputs.open});
146
+ updateState({ previousOpenValue: inputs.open });
181
147
  if (inputs.open) {
182
- const removers = globalEventsToCloseModalOn.map((eventName) =>
183
- listenToGlobal(eventName, () => {
184
- dispatch(new events.modalClose());
185
- }),
186
- );
187
-
148
+ const removers = globalEventsToCloseModalOn.map((eventName) => listenToGlobal(eventName, () => {
149
+ dispatch(new events.modalClose());
150
+ }));
188
151
  updateState({
189
152
  cleanup: () => {
190
153
  removers.forEach((remover) => remover());
@@ -192,69 +155,65 @@ export const ViraModal = defineViraElement<
192
155
  });
193
156
  }
194
157
  }
195
-
196
158
  function close() {
197
159
  if (inputs.open) {
198
160
  state.cleanup?.();
199
161
  dispatch(new events.modalClose());
200
162
  }
201
163
  }
202
-
203
- return html`
164
+ return html `
204
165
  <dialog
205
166
  ${onDomCreated((element) => {
206
- updateState({dialogElement: assertWrap.instanceOf(element, HTMLDialogElement)});
207
- })}
167
+ updateState({ dialogElement: assertWrap.instanceOf(element, HTMLDialogElement) });
168
+ })}
208
169
  ${listen('close', () => {
209
- close();
210
- })}
211
- ${listen('click', (event) => {
212
- if (
213
- state.contentElement &&
214
- !event.composedPath().includes(state.contentElement) &&
215
- !inputs.blockLightDismissal
216
- ) {
217
- /** Background click. */
218
- close();
219
- }
220
- })}
170
+ close();
171
+ })}
172
+ ${listen('mousedown', (event) => {
173
+ if (state.contentElement &&
174
+ !event.composedPath().includes(state.contentElement) &&
175
+ !inputs.blockLightDismissal) {
176
+ /** Background click. */
177
+ close();
178
+ }
179
+ })}
221
180
  >
222
181
  <div
223
182
  class="modal-content-wrapper"
224
183
  ${onDomCreated((element) => {
225
- updateState({
226
- contentElement: assertWrap.instanceOf(element, HTMLDivElement),
227
- });
228
- })}
184
+ updateState({
185
+ contentElement: assertWrap.instanceOf(element, HTMLDivElement),
186
+ });
187
+ })}
229
188
  >
230
189
  <div class="header">
231
190
  <div class="header-text-wrapper">
232
191
  <h1><slot name=${slotNames.modalTitle}>${inputs.modalTitle}</slot></h1>
233
192
  ${inputs.modalSubtitle
234
- ? html`
193
+ ? html `
235
194
  <sub>${inputs.modalSubtitle}</sub>
236
195
  `
237
- : nothing}
196
+ : nothing}
238
197
  </div>
239
198
  <button
240
199
  class="close"
241
200
  aria-label="Close"
242
201
  ${listen('click', () => {
243
- state.dialogElement?.close();
244
- })}
202
+ state.dialogElement?.close();
203
+ })}
245
204
  >
246
205
  <${ViraIcon.assign({
247
- icon: X24Icon,
248
- })}></${ViraIcon}>
206
+ icon: X24Icon,
207
+ })}></${ViraIcon}>
249
208
  </button>
250
209
  </div>
251
210
  ${inputs.open
252
- ? html`
211
+ ? html `
253
212
  <div class="body">
254
213
  <slot></slot>
255
214
  </div>
256
215
  `
257
- : nothing}
216
+ : nothing}
258
217
  </div>
259
218
  </dialog>
260
219
  `;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * An element switches between two slots based on their overflow.
3
+ *
4
+ * @category Elements
5
+ * @see https://electrovir.github.io/vira/book/elements/vira-overflow-switch
6
+ */
7
+ export declare const ViraOverflowSwitch: import("element-vir").DeclarativeElementDefinition<"vira-overflow-switch", Readonly<((Required<Pick<{
8
+ automaticallySwitch: boolean;
9
+ useSmall: boolean;
10
+ }, "automaticallySwitch">> & Partial<Record<"useSmall", never>>) | (Required<Pick<{
11
+ automaticallySwitch: boolean;
12
+ useSmall: boolean;
13
+ }, "useSmall">> & Partial<Record<"automaticallySwitch", never>>)) & Omit<{
14
+ automaticallySwitch: boolean;
15
+ useSmall: boolean;
16
+ }, "automaticallySwitch" | "useSmall">>, {
17
+ isOverflowing: boolean;
18
+ resizeObserver: undefined | ResizeObserver;
19
+ /** Called on cleanup to clear all listeners. */
20
+ cleanup: undefined | (() => void);
21
+ }, {}, "vira-overflow-switch-show-small", "vira-overflow-switch-", readonly ["large", "small"], readonly []>;
@@ -0,0 +1,110 @@
1
+ import { css, html, onDomCreated } from 'element-vir';
2
+ import { listenTo } from 'typed-event-target';
3
+ import { defineViraElement } from './define-vira-element.js';
4
+ /**
5
+ * An element switches between two slots based on their overflow.
6
+ *
7
+ * @category Elements
8
+ * @see https://electrovir.github.io/vira/book/elements/vira-overflow-switch
9
+ */
10
+ export const ViraOverflowSwitch = defineViraElement()({
11
+ tagName: 'vira-overflow-switch',
12
+ slotNames: [
13
+ /** The child to render, if it fits. */
14
+ 'large',
15
+ /** The child to render if the large one does not fit. */
16
+ 'small',
17
+ ],
18
+ state() {
19
+ return {
20
+ isOverflowing: false,
21
+ resizeObserver: undefined,
22
+ /** Called on cleanup to clear all listeners. */
23
+ cleanup: undefined,
24
+ };
25
+ },
26
+ hostClasses: {
27
+ 'vira-overflow-switch-show-small': ({ state, inputs }) => state.isOverflowing || !!inputs.useSmall,
28
+ },
29
+ styles: ({ hostClasses }) => css `
30
+ :host {
31
+ display: inline-block;
32
+ max-width: 100%;
33
+ }
34
+
35
+ .large,
36
+ .small {
37
+ display: inline-block;
38
+ }
39
+
40
+ .small {
41
+ display: none;
42
+ }
43
+
44
+ /**
45
+ * When the large content overflows, hide it but keep it in layout so we can measure it.
46
+ * The small content is then shown instead.
47
+ */
48
+ ${hostClasses['vira-overflow-switch-show-small'].selector} .large {
49
+ visibility: hidden;
50
+ position: absolute;
51
+ top: 0;
52
+ left: 0;
53
+ }
54
+
55
+ ${hostClasses['vira-overflow-switch-show-small'].selector} .small {
56
+ display: inline-block;
57
+ }
58
+ `,
59
+ cleanup({ state, updateState }) {
60
+ state.cleanup?.();
61
+ updateState({
62
+ cleanup: undefined,
63
+ });
64
+ },
65
+ render({ slotNames, updateState, inputs, host, state }) {
66
+ return html `
67
+ <div
68
+ class="large"
69
+ ${onDomCreated((largeElement) => {
70
+ if (!inputs.automaticallySwitch) {
71
+ return;
72
+ }
73
+ const overflowParams = {
74
+ elementToTest: largeElement,
75
+ host,
76
+ updateState,
77
+ };
78
+ const resizeObserver = new ResizeObserver(() => {
79
+ updateOverflowing(overflowParams);
80
+ });
81
+ resizeObserver.observe(host);
82
+ /**
83
+ * Also observe the large slot wrapper itself in case its own layout changes
84
+ * without host resizing.
85
+ */
86
+ resizeObserver.observe(largeElement);
87
+ const removeSlotChangeListener = listenTo(largeElement, 'slotchange', () => {
88
+ updateOverflowing(overflowParams);
89
+ });
90
+ /** Initial measurement: defer until after first layout. */
91
+ updateOverflowing(overflowParams);
92
+ state.cleanup?.();
93
+ updateState({
94
+ cleanup() {
95
+ resizeObserver.disconnect();
96
+ removeSlotChangeListener();
97
+ },
98
+ });
99
+ })}
100
+ >
101
+ <slot name=${slotNames.large}></slot>
102
+ </div>
103
+ <div class="small"><slot name=${slotNames.small}></slot></div>
104
+ `;
105
+ },
106
+ });
107
+ function updateOverflowing({ elementToTest, host, updateState, }) {
108
+ const isOverflowing = elementToTest.scrollWidth > host.clientWidth;
109
+ updateState({ isOverflowing });
110
+ }
@@ -0,0 +1,18 @@
1
+ import { type PartialWithUndefined } from '@augment-vir/common';
2
+ /**
3
+ * A [`<progress>`](https://developer.mozilla.org/docs/Web/HTML/Reference/Elements/progress)
4
+ * alternative that supports custom styling in _all_ browsers via CSS vars _and_ prevents background
5
+ * bleed.
6
+ *
7
+ * @category Progress
8
+ * @category Elements
9
+ * @see https://electrovir.github.io/vira/book/elements/vira-progress
10
+ */
11
+ export declare const ViraProgress: import("element-vir").DeclarativeElementDefinition<"vira-progress", Readonly<{
12
+ value: number;
13
+ } & PartialWithUndefined<{
14
+ /** @default 0 */
15
+ min: number;
16
+ /** @default 100 */
17
+ max: number;
18
+ }>>, {}, {}, "vira-progress-", "vira-progress-border-radius", readonly [], readonly []>;
@@ -1,8 +1,8 @@
1
- import {clamp, type PartialWithUndefined} from '@augment-vir/common';
2
- import {applyAttributes} from 'device-navigation';
3
- import {css, html} from 'element-vir';
4
- import {defineViraElement} from './define-vira-element.js';
5
-
1
+ import { clamp } from '@augment-vir/common';
2
+ import { applyAttributes } from 'device-navigation';
3
+ import { css, html } from 'element-vir';
4
+ import { viraFormCssVars } from '../styles/form-styles.js';
5
+ import { defineViraElement } from './define-vira-element.js';
6
6
  /**
7
7
  * A [`<progress>`](https://developer.mozilla.org/docs/Web/HTML/Reference/Elements/progress)
8
8
  * alternative that supports custom styling in _all_ browsers via CSS vars _and_ prevents background
@@ -12,18 +12,7 @@ import {defineViraElement} from './define-vira-element.js';
12
12
  * @category Elements
13
13
  * @see https://electrovir.github.io/vira/book/elements/vira-progress
14
14
  */
15
- export const ViraProgress = defineViraElement<
16
- Readonly<
17
- {
18
- value: number;
19
- } & PartialWithUndefined<{
20
- /** @default 0 */
21
- min: number;
22
- /** @default 100 */
23
- max: number;
24
- }>
25
- >
26
- >()({
15
+ export const ViraProgress = defineViraElement()({
27
16
  tagName: 'vira-progress',
28
17
  cssVars: {
29
18
  /**
@@ -31,10 +20,8 @@ export const ViraProgress = defineViraElement<
31
20
  * dimension which creates a perfect pill border radius.
32
21
  */
33
22
  'vira-progress-border-radius': '99999999px',
34
- 'vira-progress-background-color': '#eee',
35
- 'vira-progress-foreground-color': 'dodgerblue',
36
23
  },
37
- styles: ({cssVars}) => css`
24
+ styles: ({ cssVars }) => css `
38
25
  :host {
39
26
  /* Default width that can easily be overridden because it's applied on the host. */
40
27
  width: 100px;
@@ -43,7 +30,7 @@ export const ViraProgress = defineViraElement<
43
30
  display: inline-flex;
44
31
  align-items: center;
45
32
  border-radius: ${cssVars['vira-progress-border-radius'].value};
46
- color: ${cssVars['vira-progress-foreground-color'].value};
33
+ color: ${viraFormCssVars['vira-form-accent-primary-color'].value};
47
34
  overflow: hidden;
48
35
  }
49
36
 
@@ -53,34 +40,31 @@ export const ViraProgress = defineViraElement<
53
40
  }
54
41
 
55
42
  .background-bar {
56
- background-color: ${cssVars['vira-progress-background-color'].value};
43
+ background-color: ${viraFormCssVars['vira-form-filled-background-color'].value};
57
44
  height: 100%;
58
45
  flex-grow: 1;
59
46
  }
60
47
  `,
61
- render({inputs, host}) {
48
+ render({ inputs, host }) {
62
49
  const min = inputs.min || 0;
63
50
  const max = inputs.max || 100;
64
51
  const totalRange = max - min;
65
52
  const value = inputs.value - min;
66
-
67
- const percentFull = clamp(Math.round((value / totalRange) * 100), {min: 0, max: 100});
68
-
53
+ const percentFull = clamp(Math.round((value / totalRange) * 100), { min: 0, max: 100 });
69
54
  applyAttributes(host, {
70
55
  'aria-valuemin': inputs.min,
71
56
  'aria-valuemax': inputs.max,
72
57
  'aria-valuenow': inputs.value,
73
58
  'aria-role': 'progressbar',
74
59
  });
75
-
76
- return html`
60
+ return html `
77
61
  <div
78
62
  class="progress-bar"
79
63
  style=${percentFull
80
- ? css`
64
+ ? css `
81
65
  width: ${percentFull}%;
82
66
  `
83
- : css`
67
+ : css `
84
68
  display: none;
85
69
  `}
86
70
  ></div>
@@ -0,0 +1,48 @@
1
+ import { type PartialWithUndefined } from '@augment-vir/common';
2
+ import { type AttributeValues } from 'element-vir';
3
+ import { type ViraIconSvg } from '../icons/index.js';
4
+ /**
5
+ * Options for {@link ViraSelect}.
6
+ *
7
+ * @category Dropdown
8
+ * @category Elements
9
+ * @see https://electrovir.github.io/vira/book/elements/vira-select
10
+ */
11
+ export type ViraSelectOption = {
12
+ /** A value or id, used to keep track of which option is selected. */
13
+ value: string;
14
+ label: string;
15
+ } & PartialWithUndefined<{
16
+ disabled: boolean;
17
+ }>;
18
+ /**
19
+ * Similar to {@link ViraDropdown} but is, instead, simply a wrapper for `<select>` and nothing more.
20
+ *
21
+ * @category Dropdown
22
+ * @category Elements
23
+ * @see https://electrovir.github.io/vira/book/elements/vira-select
24
+ */
25
+ export declare const ViraSelect: import("element-vir").DeclarativeElementDefinition<"vira-select", Readonly<{
26
+ options: ReadonlyArray<Readonly<ViraSelectOption>>;
27
+ /** The currently selected option value. */
28
+ value: undefined | string;
29
+ } & PartialWithUndefined<{
30
+ icon: Readonly<ViraIconSvg>;
31
+ placeholder: string;
32
+ label: string;
33
+ disabled: boolean;
34
+ attributePassthrough: Readonly<PartialWithUndefined<{
35
+ label: AttributeValues;
36
+ select: AttributeValues;
37
+ option: AttributeValues;
38
+ }>>;
39
+ hasError: boolean;
40
+ }>>, {
41
+ /**
42
+ * Used to couple the label and select together. This is not applied if no label is
43
+ * provided.
44
+ */
45
+ randomId: string;
46
+ }, {
47
+ valueChange: import("element-vir").DefineEvent<string>;
48
+ }, "vira-select-disabled" | "vira-select-error", "vira-select-padding-horizontal" | "vira-select-padding-vertical" | "vira-select-icon-padding", readonly [], readonly []>;