vira 28.19.4 → 28.19.6

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/package.json +13 -13
  2. package/src/elements/define-vira-element.ts +29 -0
  3. package/src/elements/form/vira-form-fields.ts +140 -0
  4. package/src/elements/form/vira-form.element.ts +204 -0
  5. package/src/elements/pop-up/pop-up-helpers.ts +85 -0
  6. package/{dist/elements/pop-up/pop-up-menu-item.d.ts → src/elements/pop-up/pop-up-menu-item.ts} +4 -3
  7. package/{dist/elements/pop-up/vira-menu-item.element.js → src/elements/pop-up/vira-menu-item.element.ts} +28 -11
  8. package/src/elements/pop-up/vira-menu-trigger.element.ts +158 -0
  9. package/{dist/elements/pop-up/vira-menu.element.js → src/elements/pop-up/vira-menu.element.ts} +76 -49
  10. package/{dist/elements/pop-up/vira-pop-up-menu.element.js → src/elements/pop-up/vira-pop-up-menu.element.ts} +34 -22
  11. package/{dist/elements/pop-up/vira-pop-up-trigger.element.js → src/elements/pop-up/vira-pop-up-trigger.element.ts} +200 -91
  12. package/src/elements/shared-text-input-logic.ts +173 -0
  13. package/{dist/elements/vira-bold-text.element.js → src/elements/vira-bold-text.element.ts} +8 -7
  14. package/{dist/elements/vira-button.element.js → src/elements/vira-button.element.ts} +64 -33
  15. package/{dist/elements/vira-card.element.js → src/elements/vira-card.element.ts} +16 -13
  16. package/{dist/elements/vira-checkbox.element.js → src/elements/vira-checkbox.element.ts} +71 -28
  17. package/{dist/elements/vira-collapsible-wrapper.element.js → src/elements/vira-collapsible-wrapper.element.ts} +18 -16
  18. package/{dist/elements/vira-dropdown.element.js → src/elements/vira-dropdown.element.ts} +94 -48
  19. package/{dist/elements/vira-error.element.js → src/elements/vira-error.element.ts} +6 -5
  20. package/{dist/elements/vira-icon.element.js → src/elements/vira-icon.element.ts} +13 -6
  21. package/{dist/elements/vira-image.element.js → src/elements/vira-image.element.ts} +63 -43
  22. package/{dist/elements/vira-input.element.js → src/elements/vira-input.element.ts} +151 -85
  23. package/{dist/elements/vira-link.element.js → src/elements/vira-link.element.ts} +62 -11
  24. package/{dist/elements/vira-modal.element.js → src/elements/vira-modal.element.ts} +89 -50
  25. package/src/elements/vira-overflow-switch.element.ts +137 -0
  26. package/{dist/elements/vira-progress.element.js → src/elements/vira-progress.element.ts} +26 -11
  27. package/{dist/elements/vira-select.element.js → src/elements/vira-select.element.ts} +96 -41
  28. package/src/icons/icon-color.test-helper.ts +9 -0
  29. package/{dist/icons/icon-css-vars.js → src/icons/icon-css-vars.ts} +2 -1
  30. package/src/icons/icon-svg.ts +71 -0
  31. package/{dist/icons/icon-svgs/bell-24.icon.js → src/icons/icon-svgs/bell-24.icon.ts} +5 -4
  32. package/{dist/icons/icon-svgs/chat-24.icon.js → src/icons/icon-svgs/chat-24.icon.ts} +5 -4
  33. package/{dist/icons/icon-svgs/check-24.icon.js → src/icons/icon-svgs/check-24.icon.ts} +5 -4
  34. package/{dist/icons/icon-svgs/chevron-down-24.icon.js → src/icons/icon-svgs/chevron-down-24.icon.ts} +5 -4
  35. package/{dist/icons/icon-svgs/chevron-up-24.icon.js → src/icons/icon-svgs/chevron-up-24.icon.ts} +5 -4
  36. package/{dist/icons/icon-svgs/close-x-24.icon.js → src/icons/icon-svgs/close-x-24.icon.ts} +5 -4
  37. package/{dist/icons/icon-svgs/commit-24.icon.js → src/icons/icon-svgs/commit-24.icon.ts} +5 -4
  38. package/{dist/icons/icon-svgs/copy-24.icon.js → src/icons/icon-svgs/copy-24.icon.ts} +5 -4
  39. package/{dist/icons/icon-svgs/document-24.icon.js → src/icons/icon-svgs/document-24.icon.ts} +5 -4
  40. package/{dist/icons/icon-svgs/document-search-24.icon.js → src/icons/icon-svgs/document-search-24.icon.ts} +5 -4
  41. package/{dist/icons/icon-svgs/double-chevron-24.icon.js → src/icons/icon-svgs/double-chevron-24.icon.ts} +5 -4
  42. package/{dist/icons/icon-svgs/element-16.icon.js → src/icons/icon-svgs/element-16.icon.ts} +5 -4
  43. package/{dist/icons/icon-svgs/element-24.icon.js → src/icons/icon-svgs/element-24.icon.ts} +5 -4
  44. package/{dist/icons/icon-svgs/external-link-24.icon.js → src/icons/icon-svgs/external-link-24.icon.ts} +5 -4
  45. package/{dist/icons/icon-svgs/eye-closed-24.icon.js → src/icons/icon-svgs/eye-closed-24.icon.ts} +5 -4
  46. package/{dist/icons/icon-svgs/eye-open-24.icon.js → src/icons/icon-svgs/eye-open-24.icon.ts} +5 -4
  47. package/{dist/icons/icon-svgs/filter-24.icon.js → src/icons/icon-svgs/filter-24.icon.ts} +5 -4
  48. package/{dist/icons/icon-svgs/link-24.icon.js → src/icons/icon-svgs/link-24.icon.ts} +5 -4
  49. package/{dist/icons/icon-svgs/loader-24.icon.js → src/icons/icon-svgs/loader-24.icon.ts} +5 -4
  50. package/{dist/icons/icon-svgs/loader-animated-24.icon.js → src/icons/icon-svgs/loader-animated-24.icon.ts} +8 -6
  51. package/{dist/icons/icon-svgs/lock-24.icon.js → src/icons/icon-svgs/lock-24.icon.ts} +5 -4
  52. package/{dist/icons/icon-svgs/options-24.icon.js → src/icons/icon-svgs/options-24.icon.ts} +5 -4
  53. package/{dist/icons/icon-svgs/pencil-24.icon.js → src/icons/icon-svgs/pencil-24.icon.ts} +5 -4
  54. package/{dist/icons/icon-svgs/shield-24.icon.js → src/icons/icon-svgs/shield-24.icon.ts} +5 -4
  55. package/{dist/icons/icon-svgs/sort-ascending-24.icon.js → src/icons/icon-svgs/sort-ascending-24.icon.ts} +5 -4
  56. package/{dist/icons/icon-svgs/sort-descending-24.icon.js → src/icons/icon-svgs/sort-descending-24.icon.ts} +5 -4
  57. package/{dist/icons/icon-svgs/speaker-loud-24.icon.js → src/icons/icon-svgs/speaker-loud-24.icon.ts} +5 -4
  58. package/{dist/icons/icon-svgs/speaker-medium-24.icon.js → src/icons/icon-svgs/speaker-medium-24.icon.ts} +5 -4
  59. package/{dist/icons/icon-svgs/speaker-muted-24.icon.js → src/icons/icon-svgs/speaker-muted-24.icon.ts} +5 -4
  60. package/{dist/icons/icon-svgs/speaker-quiet-24.icon.js → src/icons/icon-svgs/speaker-quiet-24.icon.ts} +5 -4
  61. package/{dist/icons/icon-svgs/star-24.icon.js → src/icons/icon-svgs/star-24.icon.ts} +5 -4
  62. package/{dist/icons/icon-svgs/status-failure-24.icon.js → src/icons/icon-svgs/status-failure-24.icon.ts} +5 -4
  63. package/{dist/icons/icon-svgs/status-in-progress-24.icon.js → src/icons/icon-svgs/status-in-progress-24.icon.ts} +5 -4
  64. package/{dist/icons/icon-svgs/status-success-24.icon.js → src/icons/icon-svgs/status-success-24.icon.ts} +5 -4
  65. package/{dist/icons/icon-svgs/status-unknown-24.icon.js → src/icons/icon-svgs/status-unknown-24.icon.ts} +5 -4
  66. package/{dist/icons/icon-svgs/status-warning-24.icon.js → src/icons/icon-svgs/status-warning-24.icon.ts} +5 -4
  67. package/{dist/icons/icon-svgs/upload-24.icon.js → src/icons/icon-svgs/upload-24.icon.ts} +5 -4
  68. package/{dist/icons/icon-svgs/x-24.icon.js → src/icons/icon-svgs/x-24.icon.ts} +5 -4
  69. package/{dist/icons/index.js → src/icons/index.ts} +43 -39
  70. package/{dist/styles/border.js → src/styles/border.ts} +2 -1
  71. package/{dist/styles/disabled.js → src/styles/disabled.ts} +3 -2
  72. package/{dist/styles/durations.js → src/styles/durations.ts} +2 -1
  73. package/{dist/styles/focus.js → src/styles/focus.ts} +32 -8
  74. package/{dist/styles/font.js → src/styles/font.ts} +2 -1
  75. package/{dist/styles/form-styles.js → src/styles/form-styles.ts} +6 -1
  76. package/{dist/styles/index.js → src/styles/index.ts} +1 -0
  77. package/{dist/styles/native-styles.js → src/styles/native-styles.ts} +5 -3
  78. package/{dist/styles/scrollbar.js → src/styles/scrollbar.ts} +4 -3
  79. package/{dist/styles/shadows.js → src/styles/shadows.ts} +8 -6
  80. package/{dist/styles/user-select.js → src/styles/user-select.ts} +3 -2
  81. package/{dist/styles/vira-color-palette.js → src/styles/vira-color-palette.ts} +11 -1
  82. package/src/styles/vira-color-theme.ts +1142 -0
  83. package/src/util/define-table.ts +279 -0
  84. package/src/util/dynamic-element.ts +129 -0
  85. package/src/util/pop-up-manager.ts +380 -0
  86. package/dist/elements/define-vira-element.d.ts +0 -18
  87. package/dist/elements/define-vira-element.js +0 -19
  88. package/dist/elements/form/vira-form-fields.d.ts +0 -100
  89. package/dist/elements/form/vira-form-fields.js +0 -60
  90. package/dist/elements/form/vira-form.element.d.ts +0 -35
  91. package/dist/elements/form/vira-form.element.js +0 -151
  92. package/dist/elements/index.js +0 -25
  93. package/dist/elements/pop-up/pop-up-helpers.d.ts +0 -33
  94. package/dist/elements/pop-up/pop-up-helpers.js +0 -58
  95. package/dist/elements/pop-up/pop-up-menu-item.js +0 -1
  96. package/dist/elements/pop-up/vira-menu-item.element.d.ts +0 -19
  97. package/dist/elements/pop-up/vira-menu-trigger.element.d.ts +0 -41
  98. package/dist/elements/pop-up/vira-menu-trigger.element.js +0 -121
  99. package/dist/elements/pop-up/vira-menu.element.d.ts +0 -38
  100. package/dist/elements/pop-up/vira-pop-up-menu.element.d.ts +0 -35
  101. package/dist/elements/pop-up/vira-pop-up-trigger.element.d.ts +0 -105
  102. package/dist/elements/shared-text-input-logic.d.ts +0 -63
  103. package/dist/elements/shared-text-input-logic.js +0 -101
  104. package/dist/elements/vira-bold-text.element.d.ts +0 -9
  105. package/dist/elements/vira-button.element.d.ts +0 -31
  106. package/dist/elements/vira-card.element.d.ts +0 -18
  107. package/dist/elements/vira-checkbox.element.d.ts +0 -34
  108. package/dist/elements/vira-collapsible-wrapper.element.d.ts +0 -14
  109. package/dist/elements/vira-dropdown.element.d.ts +0 -46
  110. package/dist/elements/vira-error.element.d.ts +0 -7
  111. package/dist/elements/vira-icon.element.d.ts +0 -13
  112. package/dist/elements/vira-image.element.d.ts +0 -45
  113. package/dist/elements/vira-input.element.d.ts +0 -62
  114. package/dist/elements/vira-link.element.d.ts +0 -73
  115. package/dist/elements/vira-modal.element.d.ts +0 -39
  116. package/dist/elements/vira-overflow-switch.element.d.ts +0 -21
  117. package/dist/elements/vira-overflow-switch.element.js +0 -110
  118. package/dist/elements/vira-progress.element.d.ts +0 -18
  119. package/dist/elements/vira-select.element.d.ts +0 -48
  120. package/dist/icons/icon-color.test-helper.d.ts +0 -6
  121. package/dist/icons/icon-color.test-helper.js +0 -9
  122. package/dist/icons/icon-css-vars.d.ts +0 -14
  123. package/dist/icons/icon-svg.d.ts +0 -27
  124. package/dist/icons/icon-svg.js +0 -48
  125. package/dist/icons/icon-svgs/bell-24.icon.d.ts +0 -8
  126. package/dist/icons/icon-svgs/chat-24.icon.d.ts +0 -8
  127. package/dist/icons/icon-svgs/check-24.icon.d.ts +0 -8
  128. package/dist/icons/icon-svgs/chevron-down-24.icon.d.ts +0 -8
  129. package/dist/icons/icon-svgs/chevron-up-24.icon.d.ts +0 -8
  130. package/dist/icons/icon-svgs/close-x-24.icon.d.ts +0 -8
  131. package/dist/icons/icon-svgs/commit-24.icon.d.ts +0 -8
  132. package/dist/icons/icon-svgs/copy-24.icon.d.ts +0 -8
  133. package/dist/icons/icon-svgs/document-24.icon.d.ts +0 -8
  134. package/dist/icons/icon-svgs/document-search-24.icon.d.ts +0 -8
  135. package/dist/icons/icon-svgs/double-chevron-24.icon.d.ts +0 -8
  136. package/dist/icons/icon-svgs/element-16.icon.d.ts +0 -8
  137. package/dist/icons/icon-svgs/element-24.icon.d.ts +0 -8
  138. package/dist/icons/icon-svgs/external-link-24.icon.d.ts +0 -8
  139. package/dist/icons/icon-svgs/eye-closed-24.icon.d.ts +0 -8
  140. package/dist/icons/icon-svgs/eye-open-24.icon.d.ts +0 -8
  141. package/dist/icons/icon-svgs/filter-24.icon.d.ts +0 -8
  142. package/dist/icons/icon-svgs/link-24.icon.d.ts +0 -8
  143. package/dist/icons/icon-svgs/loader-24.icon.d.ts +0 -8
  144. package/dist/icons/icon-svgs/loader-animated-24.icon.d.ts +0 -8
  145. package/dist/icons/icon-svgs/lock-24.icon.d.ts +0 -8
  146. package/dist/icons/icon-svgs/options-24.icon.d.ts +0 -8
  147. package/dist/icons/icon-svgs/pencil-24.icon.d.ts +0 -8
  148. package/dist/icons/icon-svgs/shield-24.icon.d.ts +0 -8
  149. package/dist/icons/icon-svgs/sort-ascending-24.icon.d.ts +0 -8
  150. package/dist/icons/icon-svgs/sort-descending-24.icon.d.ts +0 -8
  151. package/dist/icons/icon-svgs/speaker-loud-24.icon.d.ts +0 -8
  152. package/dist/icons/icon-svgs/speaker-medium-24.icon.d.ts +0 -8
  153. package/dist/icons/icon-svgs/speaker-muted-24.icon.d.ts +0 -8
  154. package/dist/icons/icon-svgs/speaker-quiet-24.icon.d.ts +0 -8
  155. package/dist/icons/icon-svgs/star-24.icon.d.ts +0 -8
  156. package/dist/icons/icon-svgs/status-failure-24.icon.d.ts +0 -8
  157. package/dist/icons/icon-svgs/status-in-progress-24.icon.d.ts +0 -8
  158. package/dist/icons/icon-svgs/status-success-24.icon.d.ts +0 -8
  159. package/dist/icons/icon-svgs/status-unknown-24.icon.d.ts +0 -8
  160. package/dist/icons/icon-svgs/status-warning-24.icon.d.ts +0 -8
  161. package/dist/icons/icon-svgs/upload-24.icon.d.ts +0 -8
  162. package/dist/icons/icon-svgs/x-24.icon.d.ts +0 -8
  163. package/dist/icons/index.d.ts +0 -86
  164. package/dist/index.js +0 -4
  165. package/dist/styles/border.d.ts +0 -9
  166. package/dist/styles/disabled.d.ts +0 -6
  167. package/dist/styles/durations.d.ts +0 -22
  168. package/dist/styles/focus.d.ts +0 -31
  169. package/dist/styles/font.d.ts +0 -9
  170. package/dist/styles/form-styles.d.ts +0 -20
  171. package/dist/styles/index.d.ts +0 -13
  172. package/dist/styles/native-styles.d.ts +0 -13
  173. package/dist/styles/scrollbar.d.ts +0 -6
  174. package/dist/styles/shadows.d.ts +0 -20
  175. package/dist/styles/user-select.d.ts +0 -6
  176. package/dist/styles/vira-color-palette.d.ts +0 -95
  177. package/dist/styles/vira-color-theme.d.ts +0 -1184
  178. package/dist/styles/vira-color-theme.js +0 -1137
  179. package/dist/util/define-table.d.ts +0 -110
  180. package/dist/util/define-table.js +0 -115
  181. package/dist/util/dynamic-element.d.ts +0 -63
  182. package/dist/util/dynamic-element.js +0 -61
  183. package/dist/util/index.js +0 -3
  184. package/dist/util/pop-up-manager.d.ts +0 -180
  185. package/dist/util/pop-up-manager.js +0 -203
  186. /package/{dist/elements/index.d.ts → src/elements/index.ts} +0 -0
  187. /package/{dist/index.d.ts → src/index.ts} +0 -0
  188. /package/{dist/util/index.d.ts → src/util/index.ts} +0 -0
@@ -0,0 +1,158 @@
1
+ import {type PartialWithUndefined} from '@augment-vir/common';
2
+ import {type NavController} from 'device-navigation';
3
+ import {classMap, css, defineElementEvent, html, listen, nothing, testId} from 'element-vir';
4
+ import {type PopUpManager, type ShowPopUpResult} from '../../util/pop-up-manager.js';
5
+ import {defineViraElement} from '../define-vira-element.js';
6
+ import {updateSelectedItems} from './pop-up-helpers.js';
7
+ import {type MenuItem} from './pop-up-menu-item.js';
8
+ import {ViraMenu} from './vira-menu.element.js';
9
+ import {
10
+ PopUpMenuDirection,
11
+ ViraPopUpMenu,
12
+ type PopUpMenuCornerStyle,
13
+ } from './vira-pop-up-menu.element.js';
14
+ import {
15
+ HorizontalAnchor,
16
+ ViraPopUpTrigger,
17
+ type PopUpOffset,
18
+ type PopUpTriggerPosition,
19
+ } from './vira-pop-up-trigger.element.js';
20
+
21
+ /**
22
+ * Test ids for {@link ViraMenuTrigger}.
23
+ *
24
+ * @category Internal
25
+ */
26
+ export const viraMenuTriggerTestIds = {
27
+ menu: 'menu-trigger-menu',
28
+ };
29
+
30
+ /**
31
+ * A more specific wrapper of `ViraPopUpTrigger` that always opens a menu.
32
+ *
33
+ * @category PopUp
34
+ * @category Elements
35
+ */
36
+ export const ViraMenuTrigger = defineViraElement<
37
+ {
38
+ items: ReadonlyArray<Readonly<MenuItem>>;
39
+ } & PartialWithUndefined<
40
+ {
41
+ /** The selected item ids from the given `items` object. */
42
+ selected: ReadonlyArray<PropertyKey>;
43
+ isDisabled: boolean;
44
+ isMultiSelect: boolean;
45
+ z_debug_forceOpenState: boolean;
46
+ popUpOffset: PopUpOffset;
47
+ /** Hide menu item check mark icons. */
48
+ hideCheckIcons: boolean;
49
+ menuCornerStyle: PopUpMenuCornerStyle;
50
+ } & PopUpTriggerPosition
51
+ >
52
+ >()({
53
+ tagName: 'vira-menu-trigger',
54
+ styles: css`
55
+ :host {
56
+ display: inline-flex;
57
+ box-sizing: border-box;
58
+ vertical-align: middle;
59
+ max-width: 100%;
60
+ }
61
+
62
+ ${ViraPopUpTrigger} {
63
+ width: 100%;
64
+ }
65
+
66
+ .full-width-menu {
67
+ width: 100%;
68
+ }
69
+ `,
70
+ events: {
71
+ itemActivate: defineElementEvent<PropertyKey[]>(),
72
+ openChange: defineElementEvent<ShowPopUpResult | undefined>(),
73
+ },
74
+ state() {
75
+ return {
76
+ navController: undefined as undefined | NavController,
77
+ popUpManager: undefined as undefined | PopUpManager,
78
+ /** `undefined` means the pop up is not currently showing. */
79
+ showPopUpResult: undefined as ShowPopUpResult | undefined,
80
+ };
81
+ },
82
+ render({inputs, state, updateState, dispatch, events}) {
83
+ return html`
84
+ <${ViraPopUpTrigger.assign({
85
+ ...inputs,
86
+ keepOpenAfterInteraction: true,
87
+ popUpOffset: inputs.popUpOffset,
88
+ horizontalAnchor: inputs.horizontalAnchor || HorizontalAnchor.Left,
89
+ })}
90
+ class=${classMap({
91
+ open: !!state.showPopUpResult,
92
+ })}
93
+ ${listen(ViraPopUpTrigger.events.init, (event) => {
94
+ updateState({
95
+ navController: event.detail.navController,
96
+ popUpManager: event.detail.popUpManager,
97
+ });
98
+ })}
99
+ ${listen(ViraPopUpTrigger.events.openChange, (event) => {
100
+ if (!!state.showPopUpResult !== !!event.detail) {
101
+ dispatch(new events.openChange(event.detail));
102
+ }
103
+ updateState({
104
+ showPopUpResult: event.detail,
105
+ });
106
+ })}
107
+ ${listen(ViraPopUpTrigger.events.navSelect, (event) => {
108
+ const itemIndex = event.detail.x;
109
+ const item = inputs.items[itemIndex];
110
+ if (!item) {
111
+ throw new Error(`Found no dropdown option at index '${itemIndex}'`);
112
+ }
113
+
114
+ dispatch(
115
+ new events.itemActivate(
116
+ updateSelectedItems(item, inputs.selected, inputs.isMultiSelect),
117
+ ),
118
+ );
119
+ if (!inputs.isMultiSelect) {
120
+ /**
121
+ * Defer pop up removal to prevent race conditions with element-internal
122
+ * click handlers.
123
+ */
124
+ globalThis.setTimeout(() => state.popUpManager?.removePopUp());
125
+ }
126
+ })}
127
+ >
128
+ <slot slot=${ViraPopUpTrigger.slotNames.trigger}></slot>
129
+ ${state.navController && state.showPopUpResult
130
+ ? html`
131
+ <${ViraPopUpMenu.assign({
132
+ direction: state.showPopUpResult.popDown
133
+ ? PopUpMenuDirection.Downwards
134
+ : PopUpMenuDirection.Upwards,
135
+ cornerStyle: inputs.menuCornerStyle,
136
+ })}
137
+ slot=${ViraPopUpTrigger.slotNames.popUp}
138
+ class=${classMap({
139
+ 'full-width-menu':
140
+ inputs.horizontalAnchor === HorizontalAnchor.Both,
141
+ })}
142
+ >
143
+ <${ViraMenu.assign({
144
+ items: inputs.items,
145
+ selected: inputs.selected,
146
+ navController: state.navController,
147
+ isMultiSelect: !!inputs.isMultiSelect,
148
+ hideCheckIcons: inputs.hideCheckIcons,
149
+ })}
150
+ ${testId(viraMenuTriggerTestIds.menu)}
151
+ ></${ViraMenu}>
152
+ </${ViraPopUpMenu}>
153
+ `
154
+ : nothing}
155
+ </${ViraPopUpTrigger}>
156
+ `;
157
+ },
158
+ });
@@ -1,12 +1,15 @@
1
- import { check } from '@augment-vir/assert';
2
- import { nav, navAttribute, NavController, NavValue } from 'device-navigation';
3
- import { classMap, css, html, ifDefined, testId } from 'element-vir';
4
- import { viraFormCssVars } from '../../styles/form-styles.js';
5
- import { noNativeFormStyles, viraDisabledStyles } from '../../styles/index.js';
6
- import { defineViraElement } from '../define-vira-element.js';
7
- import { ViraLink } from '../vira-link.element.js';
8
- import { assertUniqueIdProps } from './pop-up-helpers.js';
9
- import { ViraMenuItem } from './vira-menu-item.element.js';
1
+ import {check} from '@augment-vir/assert';
2
+ import {type PartialWithUndefined} from '@augment-vir/common';
3
+ import {nav, navAttribute, NavController, NavValue} from 'device-navigation';
4
+ import {classMap, css, html, ifDefined, testId} from 'element-vir';
5
+ import {viraFormCssVars} from '../../styles/form-styles.js';
6
+ import {noNativeFormStyles, viraDisabledStyles} from '../../styles/index.js';
7
+ import {defineViraElement} from '../define-vira-element.js';
8
+ import {ViraLink} from '../vira-link.element.js';
9
+ import {assertUniqueIdProps} from './pop-up-helpers.js';
10
+ import {type MenuItem} from './pop-up-menu-item.js';
11
+ import {ViraMenuItem} from './vira-menu-item.element.js';
12
+
10
13
  /**
11
14
  * Test ids for {@link ViraMenu}.
12
15
  *
@@ -15,6 +18,7 @@ import { ViraMenuItem } from './vira-menu-item.element.js';
15
18
  export const viraMenuTestIds = {
16
19
  item: 'menu-item',
17
20
  };
21
+
18
22
  /**
19
23
  * A wrapper for menu items. This can be used for dropdown items or menu bar dropdowns. To detect
20
24
  * when items are selected or unselected, pass in a `NavController` instance and hook into its
@@ -23,17 +27,37 @@ export const viraMenuTestIds = {
23
27
  * @category PopUp
24
28
  * @category Elements
25
29
  */
26
- export const ViraMenu = defineViraElement()({
30
+ export const ViraMenu = defineViraElement<
31
+ Readonly<
32
+ {
33
+ /**
34
+ * The parent nav controller for this menu. If none is provided, an internal nav
35
+ * controller is created (which means it can't be hooked into by external elements).
36
+ *
37
+ * It is recommended to not leave this `undefined`.
38
+ */
39
+ navController: NavController | undefined;
40
+ /** All menu items to show to the user. */
41
+ items: ReadonlyArray<Readonly<MenuItem>>;
42
+ } & PartialWithUndefined<{
43
+ /** The ids of the currently selected menu items. */
44
+ selected: ReadonlyArray<PropertyKey>;
45
+ isMultiSelect: boolean;
46
+ /** Hide menu item check mark icons. */
47
+ hideCheckIcons: boolean;
48
+ }>
49
+ >
50
+ >()({
27
51
  tagName: 'vira-menu',
28
- state({ inputs, host }) {
52
+ state({inputs, host}) {
29
53
  return {
30
54
  internalNavController: inputs.navController || new NavController(host),
31
55
  };
32
56
  },
33
57
  hostClasses: {
34
- 'vira-menu-multiselect': ({ inputs }) => !!inputs.isMultiSelect,
58
+ 'vira-menu-multiselect': ({inputs}) => !!inputs.isMultiSelect,
35
59
  },
36
- styles: ({ hostClasses }) => css `
60
+ styles: ({hostClasses}) => css`
37
61
  :host {
38
62
  display: flex;
39
63
  flex-direction: column;
@@ -58,30 +82,30 @@ export const ViraMenu = defineViraElement()({
58
82
  }
59
83
 
60
84
  ${navAttribute.css({
61
- baseSelector: '.menu-item:not(.disabled):not(.selected)',
62
- navValue: NavValue.Focused,
63
- })}, ${navAttribute.css({
64
- baseSelector: '.menu-item:not(.disabled):not(.selected)',
65
- navValue: NavValue.Active,
66
- })}, .menu-item:not(.disabled):not(.selected):hover {
85
+ baseSelector: '.menu-item:not(.disabled):not(.selected)',
86
+ navValue: NavValue.Focused,
87
+ })}, ${navAttribute.css({
88
+ baseSelector: '.menu-item:not(.disabled):not(.selected)',
89
+ navValue: NavValue.Active,
90
+ })}, .menu-item:not(.disabled):not(.selected):hover {
67
91
  background-color: ${viraFormCssVars['vira-form-selection-hover-background-color']
68
- .value};
92
+ .value};
69
93
  outline: none;
70
94
  }
71
95
 
72
96
  ${hostClasses['vira-menu-multiselect'].selector} {
73
97
  &
74
98
  ${navAttribute.css({
75
- baseSelector: '.menu-item:not(.disabled)',
76
- navValue: NavValue.Focused,
77
- })},
99
+ baseSelector: '.menu-item:not(.disabled)',
100
+ navValue: NavValue.Focused,
101
+ })},
78
102
  ${navAttribute.css({
79
- baseSelector: '.menu-item:not(.disabled)',
80
- navValue: NavValue.Active,
81
- })},
103
+ baseSelector: '.menu-item:not(.disabled)',
104
+ navValue: NavValue.Active,
105
+ })},
82
106
  .menu-item:not(.disabled):hover {
83
107
  background-color: ${viraFormCssVars['vira-form-selection-hover-background-color']
84
- .value};
108
+ .value};
85
109
  outline: none;
86
110
  }
87
111
  }
@@ -95,61 +119,64 @@ export const ViraMenu = defineViraElement()({
95
119
  pointer-events: auto;
96
120
  }
97
121
  `,
98
- cleanup({ inputs, state }) {
122
+ cleanup({inputs, state}) {
99
123
  if (!inputs.navController) {
100
124
  state.internalNavController.destroy();
101
125
  }
102
126
  },
103
- render({ inputs, state }) {
127
+ render({inputs, state}) {
104
128
  assertUniqueIdProps(inputs.items);
129
+
105
130
  const itemTemplates = inputs.items.map((item) => {
106
131
  const selected = !!inputs.selected?.includes(item.id);
107
132
  const innerTemplate = check.isString(item.label)
108
- ? html `
133
+ ? html`
109
134
  <${ViraMenuItem.assign({
110
- label: item.label,
111
- selected,
112
- hideCheckIcon: inputs.hideCheckIcons,
113
- })}></${ViraMenuItem}>
135
+ label: item.label,
136
+ selected,
137
+ hideCheckIcon: inputs.hideCheckIcons,
138
+ })}></${ViraMenuItem}>
114
139
  `
115
140
  : item.label;
141
+
116
142
  const disabled = item.disabled || (!inputs.isMultiSelect && selected);
143
+
117
144
  if (item.route) {
118
- return html `
145
+ return html`
119
146
  <${ViraLink.assign({
120
- route: item.route,
121
- })}
147
+ route: item.route,
148
+ })}
122
149
  class="menu-item ${classMap({
123
- disabled: !!item.disabled,
124
- selected,
125
- })}"
150
+ disabled: !!item.disabled,
151
+ selected,
152
+ })}"
126
153
  ${testId(viraMenuTestIds.item)}
127
154
  title=${ifDefined(item.titleText || undefined)}
128
155
  role="option"
129
- ${nav(state.internalNavController, { disabled })}
156
+ ${nav(state.internalNavController, {disabled})}
130
157
  >
131
158
  ${innerTemplate}
132
159
  </${ViraLink}>
133
160
  `;
134
- }
135
- else {
136
- return html `
161
+ } else {
162
+ return html`
137
163
  <button
138
164
  class="menu-item ${classMap({
139
- disabled: !!item.disabled,
140
- selected,
141
- })}"
165
+ disabled: !!item.disabled,
166
+ selected,
167
+ })}"
142
168
  ${testId(viraMenuTestIds.item)}
143
169
  title=${ifDefined(item.titleText || undefined)}
144
170
  role="option"
145
- ${nav(state.internalNavController, { disabled })}
171
+ ${nav(state.internalNavController, {disabled})}
146
172
  >
147
173
  ${innerTemplate}
148
174
  </button>
149
175
  `;
150
176
  }
151
177
  });
152
- return html `
178
+
179
+ return html`
153
180
  ${itemTemplates}
154
181
  `;
155
182
  },
@@ -1,46 +1,58 @@
1
- import { css, html } from 'element-vir';
2
- import { viraBorders } from '../../styles/border.js';
3
- import { viraFormCssVars } from '../../styles/form-styles.js';
4
- import { viraShadows } from '../../styles/shadows.js';
5
- import { defineViraElement } from '../define-vira-element.js';
1
+ import {type PartialWithUndefined} from '@augment-vir/common';
2
+ import {css, html} from 'element-vir';
3
+ import {viraBorders} from '../../styles/border.js';
4
+ import {viraFormCssVars} from '../../styles/form-styles.js';
5
+ import {viraShadows} from '../../styles/shadows.js';
6
+ import {defineViraElement} from '../define-vira-element.js';
7
+
6
8
  /**
7
9
  * Possible corner styles for {@link ViraPopUpMenu}.
8
10
  *
9
11
  * @category Internal
10
12
  */
11
- export var PopUpMenuCornerStyle;
12
- (function (PopUpMenuCornerStyle) {
13
+ export enum PopUpMenuCornerStyle {
13
14
  /** Rounding of corners depends on the open direction of the menu. */
14
- PopUpMenuCornerStyle["Directional"] = "directional";
15
+ Directional = 'directional',
15
16
  /** All of the menus corners should be rounded. */
16
- PopUpMenuCornerStyle["AllRounded"] = "all-rounded";
17
+ AllRounded = 'all-rounded',
17
18
  /** None of the menus corners should be rounded. */
18
- PopUpMenuCornerStyle["AllSquare"] = "all-square";
19
- })(PopUpMenuCornerStyle || (PopUpMenuCornerStyle = {}));
19
+ AllSquare = 'all-square',
20
+ }
21
+
20
22
  /**
21
23
  * Menu pop-up directions available for {@link ViraPopUpMenu}.
22
24
  *
23
25
  * @category Internal
24
26
  */
25
- export var PopUpMenuDirection;
26
- (function (PopUpMenuDirection) {
27
- PopUpMenuDirection["Downwards"] = "downwards";
28
- PopUpMenuDirection["Upwards"] = "upwards";
29
- })(PopUpMenuDirection || (PopUpMenuDirection = {}));
27
+ export enum PopUpMenuDirection {
28
+ Downwards = 'downwards',
29
+ Upwards = 'upwards',
30
+ }
31
+
30
32
  /**
31
33
  * A simple default style wrapper for pop-up menus.
32
34
  *
33
35
  * @category PopUp
34
36
  * @category Elements
35
37
  */
36
- export const ViraPopUpMenu = defineViraElement()({
38
+ export const ViraPopUpMenu = defineViraElement<
39
+ PartialWithUndefined<{
40
+ /** @default PopUpMenuDirection.Downwards */
41
+ direction: PopUpMenuDirection;
42
+ /** @default PopUpMenuCornerStyle.Directional */
43
+ cornerStyle: PopUpMenuCornerStyle;
44
+ }>
45
+ >()({
37
46
  tagName: 'vira-pop-up-menu',
38
47
  hostClasses: {
39
- 'vira-pop-up-menu-open-upwards': ({ inputs }) => inputs.direction === PopUpMenuDirection.Upwards,
40
- 'vira-pop-up-menu-rounded': ({ inputs }) => inputs.cornerStyle === PopUpMenuCornerStyle.AllRounded,
41
- 'vira-pop-up-menu-square': ({ inputs }) => inputs.cornerStyle === PopUpMenuCornerStyle.AllSquare,
48
+ 'vira-pop-up-menu-open-upwards': ({inputs}) =>
49
+ inputs.direction === PopUpMenuDirection.Upwards,
50
+ 'vira-pop-up-menu-rounded': ({inputs}) =>
51
+ inputs.cornerStyle === PopUpMenuCornerStyle.AllRounded,
52
+ 'vira-pop-up-menu-square': ({inputs}) =>
53
+ inputs.cornerStyle === PopUpMenuCornerStyle.AllSquare,
42
54
  },
43
- styles: ({ hostClasses }) => css `
55
+ styles: ({hostClasses}) => css`
44
56
  :host {
45
57
  display: flex;
46
58
  max-width: 100%;
@@ -73,7 +85,7 @@ export const ViraPopUpMenu = defineViraElement()({
73
85
  }
74
86
  `,
75
87
  render() {
76
- return html `
88
+ return html`
77
89
  <slot></slot>
78
90
  `;
79
91
  },