vira 28.19.6 → 28.19.7

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 (188) 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 -76
  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} +22 -34
  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 +31 -0
  27. package/{src/elements/vira-button.element.ts → dist/elements/vira-button.element.js} +35 -66
  28. package/dist/elements/vira-card.element.d.ts +18 -0
  29. package/{src/elements/vira-card.element.ts → dist/elements/vira-card.element.js} +13 -16
  30. package/dist/elements/vira-checkbox.element.d.ts +34 -0
  31. package/{src/elements/vira-checkbox.element.ts → dist/elements/vira-checkbox.element.js} +28 -71
  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 -94
  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} +5 -6
  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} +85 -151
  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} +11 -62
  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} +50 -89
  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} +11 -26
  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} +41 -96
  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/border.d.ts +9 -0
  140. package/{src/styles/border.ts → dist/styles/border.js} +1 -2
  141. package/dist/styles/disabled.d.ts +6 -0
  142. package/{src/styles/disabled.ts → dist/styles/disabled.js} +2 -3
  143. package/dist/styles/durations.d.ts +22 -0
  144. package/{src/styles/durations.ts → dist/styles/durations.js} +1 -2
  145. package/dist/styles/focus.d.ts +34 -0
  146. package/{src/styles/focus.ts → dist/styles/focus.js} +8 -29
  147. package/dist/styles/font.d.ts +9 -0
  148. package/{src/styles/font.ts → dist/styles/font.js} +1 -2
  149. package/dist/styles/form-styles.d.ts +20 -0
  150. package/{src/styles/form-styles.ts → dist/styles/form-styles.js} +1 -6
  151. package/{src/styles/index.ts → dist/styles/index.d.ts} +0 -1
  152. package/dist/styles/index.js +13 -0
  153. package/dist/styles/native-styles.d.ts +13 -0
  154. package/{src/styles/native-styles.ts → dist/styles/native-styles.js} +3 -5
  155. package/dist/styles/scrollbar.d.ts +6 -0
  156. package/{src/styles/scrollbar.ts → dist/styles/scrollbar.js} +3 -4
  157. package/dist/styles/shadows.d.ts +20 -0
  158. package/{src/styles/shadows.ts → dist/styles/shadows.js} +6 -8
  159. package/dist/styles/user-select.d.ts +6 -0
  160. package/{src/styles/user-select.ts → dist/styles/user-select.js} +2 -3
  161. package/dist/styles/vira-color-palette.d.ts +95 -0
  162. package/{src/styles/vira-color-palette.ts → dist/styles/vira-color-palette.js} +1 -11
  163. package/dist/styles/vira-color-theme.d.ts +1184 -0
  164. package/dist/styles/vira-color-theme.js +1138 -0
  165. package/dist/util/define-table.d.ts +110 -0
  166. package/dist/util/define-table.js +115 -0
  167. package/dist/util/dynamic-element.d.ts +63 -0
  168. package/dist/util/dynamic-element.js +61 -0
  169. package/dist/util/index.js +3 -0
  170. package/dist/util/pop-up-manager.d.ts +186 -0
  171. package/dist/util/pop-up-manager.js +214 -0
  172. package/package.json +6 -6
  173. package/src/elements/define-vira-element.ts +0 -29
  174. package/src/elements/form/vira-form-fields.ts +0 -140
  175. package/src/elements/form/vira-form.element.ts +0 -204
  176. package/src/elements/pop-up/pop-up-helpers.ts +0 -85
  177. package/src/elements/pop-up/vira-menu-trigger.element.ts +0 -158
  178. package/src/elements/shared-text-input-logic.ts +0 -173
  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/vira-color-theme.ts +0 -1142
  183. package/src/util/define-table.ts +0 -279
  184. package/src/util/dynamic-element.ts +0 -129
  185. package/src/util/pop-up-manager.ts +0 -380
  186. /package/{src/elements/index.ts → dist/elements/index.d.ts} +0 -0
  187. /package/{src/index.ts → dist/index.d.ts} +0 -0
  188. /package/{src/util/index.ts → dist/util/index.d.ts} +0 -0
@@ -1,71 +1,41 @@
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 { noNativeFormStyles, noNativeSpacing } from '../styles/native-styles.js';
6
+ import { viraShadows } from '../styles/shadows.js';
7
+ import { defineViraElement } from './define-vira-element.js';
8
+ import { ViraIcon } from './vira-icon.element.js';
11
9
  const globalEventsToCloseModalOn = [
12
10
  'pagehide',
13
11
  'pageshow',
14
12
  'popstate',
15
- ] as const satisfies (keyof WindowEventMap)[];
16
-
13
+ ];
17
14
  /**
18
15
  * A modal element that uses the built-in `dialog` element.
19
16
  *
20
17
  * @category Elements
21
18
  * @see https://electrovir.github.io/vira/book/elements/vira-modal
22
19
  */
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
- >()({
20
+ export const ViraModal = defineViraElement()({
51
21
  tagName: 'vira-modal',
52
22
  events: {
53
- modalClose: defineElementEvent<void>(),
23
+ modalClose: defineElementEvent(),
54
24
  },
55
25
  state() {
56
26
  return {
57
- dialogElement: undefined as HTMLDialogElement | undefined,
58
- contentElement: undefined as HTMLDivElement | undefined,
59
- previousOpenValue: undefined as undefined | boolean,
27
+ dialogElement: undefined,
28
+ contentElement: undefined,
29
+ previousOpenValue: undefined,
60
30
  /** Remove listeners. */
61
- cleanup: undefined as undefined | (() => void),
31
+ cleanup: undefined,
62
32
  };
63
33
  },
64
- cleanup({state}) {
34
+ cleanup({ state }) {
65
35
  state.cleanup?.();
66
36
  },
67
37
  hostClasses: {
68
- 'vira-modal-phone-size': ({inputs}) => !!inputs.isMobileSize,
38
+ 'vira-modal-phone-size': ({ inputs }) => !!inputs.isMobileSize,
69
39
  },
70
40
  slotNames: ['modalTitle'],
71
41
  cssVars: {
@@ -75,7 +45,7 @@ export const ViraModal = defineViraElement<
75
45
  'vira-modal-close-button-hover-radius': '8px',
76
46
  'vira-modal-close-button-hover-background-color': '#E4E4E4',
77
47
  },
78
- styles: ({hostClasses, cssVars}) => css`
48
+ styles: ({ hostClasses, cssVars }) => css `
79
49
  :host {
80
50
  display: contents;
81
51
  min-width: 280px;
@@ -141,9 +111,7 @@ export const ViraModal = defineViraElement<
141
111
  border-radius: ${cssVars['vira-modal-close-button-hover-radius'].value};
142
112
 
143
113
  &:hover {
144
- background-color: ${cssVars[
145
- 'vira-modal-close-button-hover-background-color'
146
- ].value};
114
+ background-color: ${cssVars['vira-modal-close-button-hover-background-color'].value};
147
115
  }
148
116
 
149
117
  & ${ViraIcon} {
@@ -166,25 +134,22 @@ export const ViraModal = defineViraElement<
166
134
  }
167
135
  }
168
136
  `,
169
- render({inputs, state, updateState, events, dispatch, slotNames}) {
137
+ render({ inputs, state, updateState, events, dispatch, slotNames }) {
170
138
  if (state.dialogElement && inputs.open !== state.dialogElement.open) {
171
139
  if (inputs.open) {
172
140
  state.dialogElement.showModal();
173
- } else {
141
+ }
142
+ else {
174
143
  state.dialogElement.close();
175
144
  }
176
145
  }
177
-
178
146
  if (state.previousOpenValue !== inputs.open) {
179
147
  state.cleanup?.();
180
- updateState({previousOpenValue: inputs.open});
148
+ updateState({ previousOpenValue: inputs.open });
181
149
  if (inputs.open) {
182
- const removers = globalEventsToCloseModalOn.map((eventName) =>
183
- listenToGlobal(eventName, () => {
184
- dispatch(new events.modalClose());
185
- }),
186
- );
187
-
150
+ const removers = globalEventsToCloseModalOn.map((eventName) => listenToGlobal(eventName, () => {
151
+ dispatch(new events.modalClose());
152
+ }));
188
153
  updateState({
189
154
  cleanup: () => {
190
155
  removers.forEach((remover) => remover());
@@ -192,69 +157,65 @@ export const ViraModal = defineViraElement<
192
157
  });
193
158
  }
194
159
  }
195
-
196
160
  function close() {
197
161
  if (inputs.open) {
198
162
  state.cleanup?.();
199
163
  dispatch(new events.modalClose());
200
164
  }
201
165
  }
202
-
203
- return html`
166
+ return html `
204
167
  <dialog
205
168
  ${onDomCreated((element) => {
206
- updateState({dialogElement: assertWrap.instanceOf(element, HTMLDialogElement)});
207
- })}
169
+ updateState({ dialogElement: assertWrap.instanceOf(element, HTMLDialogElement) });
170
+ })}
208
171
  ${listen('close', () => {
209
- close();
210
- })}
172
+ close();
173
+ })}
211
174
  ${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
- })}
175
+ if (state.contentElement &&
176
+ !event.composedPath().includes(state.contentElement) &&
177
+ !inputs.blockLightDismissal) {
178
+ /** Background click. */
179
+ close();
180
+ }
181
+ })}
221
182
  >
222
183
  <div
223
184
  class="modal-content-wrapper"
224
185
  ${onDomCreated((element) => {
225
- updateState({
226
- contentElement: assertWrap.instanceOf(element, HTMLDivElement),
227
- });
228
- })}
186
+ updateState({
187
+ contentElement: assertWrap.instanceOf(element, HTMLDivElement),
188
+ });
189
+ })}
229
190
  >
230
191
  <div class="header">
231
192
  <div class="header-text-wrapper">
232
193
  <h1><slot name=${slotNames.modalTitle}>${inputs.modalTitle}</slot></h1>
233
194
  ${inputs.modalSubtitle
234
- ? html`
195
+ ? html `
235
196
  <sub>${inputs.modalSubtitle}</sub>
236
197
  `
237
- : nothing}
198
+ : nothing}
238
199
  </div>
239
200
  <button
240
201
  class="close"
241
202
  aria-label="Close"
242
203
  ${listen('click', () => {
243
- state.dialogElement?.close();
244
- })}
204
+ state.dialogElement?.close();
205
+ })}
245
206
  >
246
207
  <${ViraIcon.assign({
247
- icon: X24Icon,
248
- })}></${ViraIcon}>
208
+ icon: X24Icon,
209
+ })}></${ViraIcon}>
249
210
  </button>
250
211
  </div>
251
212
  ${inputs.open
252
- ? html`
213
+ ? html `
253
214
  <div class="body">
254
215
  <slot></slot>
255
216
  </div>
256
217
  `
257
- : nothing}
218
+ : nothing}
258
219
  </div>
259
220
  </dialog>
260
221
  `;
@@ -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" | "vira-progress-background-color" | "vira-progress-foreground-color", readonly [], readonly []>;
@@ -1,8 +1,7 @@
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 { defineViraElement } from './define-vira-element.js';
6
5
  /**
7
6
  * A [`<progress>`](https://developer.mozilla.org/docs/Web/HTML/Reference/Elements/progress)
8
7
  * alternative that supports custom styling in _all_ browsers via CSS vars _and_ prevents background
@@ -12,18 +11,7 @@ import {defineViraElement} from './define-vira-element.js';
12
11
  * @category Elements
13
12
  * @see https://electrovir.github.io/vira/book/elements/vira-progress
14
13
  */
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
- >()({
14
+ export const ViraProgress = defineViraElement()({
27
15
  tagName: 'vira-progress',
28
16
  cssVars: {
29
17
  /**
@@ -34,7 +22,7 @@ export const ViraProgress = defineViraElement<
34
22
  'vira-progress-background-color': '#eee',
35
23
  'vira-progress-foreground-color': 'dodgerblue',
36
24
  },
37
- styles: ({cssVars}) => css`
25
+ styles: ({ cssVars }) => css `
38
26
  :host {
39
27
  /* Default width that can easily be overridden because it's applied on the host. */
40
28
  width: 100px;
@@ -58,29 +46,26 @@ export const ViraProgress = defineViraElement<
58
46
  flex-grow: 1;
59
47
  }
60
48
  `,
61
- render({inputs, host}) {
49
+ render({ inputs, host }) {
62
50
  const min = inputs.min || 0;
63
51
  const max = inputs.max || 100;
64
52
  const totalRange = max - min;
65
53
  const value = inputs.value - min;
66
-
67
- const percentFull = clamp(Math.round((value / totalRange) * 100), {min: 0, max: 100});
68
-
54
+ const percentFull = clamp(Math.round((value / totalRange) * 100), { min: 0, max: 100 });
69
55
  applyAttributes(host, {
70
56
  'aria-valuemin': inputs.min,
71
57
  'aria-valuemax': inputs.max,
72
58
  'aria-valuenow': inputs.value,
73
59
  'aria-role': 'progressbar',
74
60
  });
75
-
76
- return html`
61
+ return html `
77
62
  <div
78
63
  class="progress-bar"
79
64
  style=${percentFull
80
- ? css`
65
+ ? css `
81
66
  width: ${percentFull}%;
82
67
  `
83
- : css`
68
+ : css `
84
69
  display: none;
85
70
  `}
86
71
  ></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 []>;