vira 28.19.5 → 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.
- package/package.json +12 -12
- package/src/elements/define-vira-element.ts +29 -0
- package/src/elements/form/vira-form-fields.ts +140 -0
- package/src/elements/form/vira-form.element.ts +204 -0
- package/src/elements/pop-up/pop-up-helpers.ts +85 -0
- package/{dist/elements/pop-up/pop-up-menu-item.d.ts → src/elements/pop-up/pop-up-menu-item.ts} +4 -3
- package/{dist/elements/pop-up/vira-menu-item.element.js → src/elements/pop-up/vira-menu-item.element.ts} +28 -11
- package/src/elements/pop-up/vira-menu-trigger.element.ts +158 -0
- package/{dist/elements/pop-up/vira-menu.element.js → src/elements/pop-up/vira-menu.element.ts} +76 -49
- package/{dist/elements/pop-up/vira-pop-up-menu.element.js → src/elements/pop-up/vira-pop-up-menu.element.ts} +34 -22
- package/{dist/elements/pop-up/vira-pop-up-trigger.element.js → src/elements/pop-up/vira-pop-up-trigger.element.ts} +199 -104
- package/src/elements/shared-text-input-logic.ts +173 -0
- package/{dist/elements/vira-bold-text.element.js → src/elements/vira-bold-text.element.ts} +8 -7
- package/{dist/elements/vira-button.element.js → src/elements/vira-button.element.ts} +64 -33
- package/{dist/elements/vira-card.element.js → src/elements/vira-card.element.ts} +16 -13
- package/{dist/elements/vira-checkbox.element.js → src/elements/vira-checkbox.element.ts} +71 -28
- package/{dist/elements/vira-collapsible-wrapper.element.js → src/elements/vira-collapsible-wrapper.element.ts} +18 -16
- package/{dist/elements/vira-dropdown.element.js → src/elements/vira-dropdown.element.ts} +94 -48
- package/{dist/elements/vira-error.element.js → src/elements/vira-error.element.ts} +6 -5
- package/{dist/elements/vira-icon.element.js → src/elements/vira-icon.element.ts} +13 -6
- package/{dist/elements/vira-image.element.js → src/elements/vira-image.element.ts} +63 -43
- package/{dist/elements/vira-input.element.js → src/elements/vira-input.element.ts} +151 -85
- package/{dist/elements/vira-link.element.js → src/elements/vira-link.element.ts} +62 -11
- package/{dist/elements/vira-modal.element.js → src/elements/vira-modal.element.ts} +89 -50
- package/src/elements/vira-overflow-switch.element.ts +137 -0
- package/{dist/elements/vira-progress.element.js → src/elements/vira-progress.element.ts} +26 -11
- package/{dist/elements/vira-select.element.js → src/elements/vira-select.element.ts} +96 -41
- package/src/icons/icon-color.test-helper.ts +9 -0
- package/{dist/icons/icon-css-vars.js → src/icons/icon-css-vars.ts} +2 -1
- package/src/icons/icon-svg.ts +71 -0
- package/{dist/icons/icon-svgs/bell-24.icon.js → src/icons/icon-svgs/bell-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/chat-24.icon.js → src/icons/icon-svgs/chat-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/check-24.icon.js → src/icons/icon-svgs/check-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/chevron-down-24.icon.js → src/icons/icon-svgs/chevron-down-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/chevron-up-24.icon.js → src/icons/icon-svgs/chevron-up-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/close-x-24.icon.js → src/icons/icon-svgs/close-x-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/commit-24.icon.js → src/icons/icon-svgs/commit-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/copy-24.icon.js → src/icons/icon-svgs/copy-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/document-24.icon.js → src/icons/icon-svgs/document-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/document-search-24.icon.js → src/icons/icon-svgs/document-search-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/double-chevron-24.icon.js → src/icons/icon-svgs/double-chevron-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/element-16.icon.js → src/icons/icon-svgs/element-16.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/element-24.icon.js → src/icons/icon-svgs/element-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/external-link-24.icon.js → src/icons/icon-svgs/external-link-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/eye-closed-24.icon.js → src/icons/icon-svgs/eye-closed-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/eye-open-24.icon.js → src/icons/icon-svgs/eye-open-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/filter-24.icon.js → src/icons/icon-svgs/filter-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/link-24.icon.js → src/icons/icon-svgs/link-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/loader-24.icon.js → src/icons/icon-svgs/loader-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/loader-animated-24.icon.js → src/icons/icon-svgs/loader-animated-24.icon.ts} +8 -6
- package/{dist/icons/icon-svgs/lock-24.icon.js → src/icons/icon-svgs/lock-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/options-24.icon.js → src/icons/icon-svgs/options-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/pencil-24.icon.js → src/icons/icon-svgs/pencil-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/shield-24.icon.js → src/icons/icon-svgs/shield-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/sort-ascending-24.icon.js → src/icons/icon-svgs/sort-ascending-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/sort-descending-24.icon.js → src/icons/icon-svgs/sort-descending-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/speaker-loud-24.icon.js → src/icons/icon-svgs/speaker-loud-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/speaker-medium-24.icon.js → src/icons/icon-svgs/speaker-medium-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/speaker-muted-24.icon.js → src/icons/icon-svgs/speaker-muted-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/speaker-quiet-24.icon.js → src/icons/icon-svgs/speaker-quiet-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/star-24.icon.js → src/icons/icon-svgs/star-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/status-failure-24.icon.js → src/icons/icon-svgs/status-failure-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/status-in-progress-24.icon.js → src/icons/icon-svgs/status-in-progress-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/status-success-24.icon.js → src/icons/icon-svgs/status-success-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/status-unknown-24.icon.js → src/icons/icon-svgs/status-unknown-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/status-warning-24.icon.js → src/icons/icon-svgs/status-warning-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/upload-24.icon.js → src/icons/icon-svgs/upload-24.icon.ts} +5 -4
- package/{dist/icons/icon-svgs/x-24.icon.js → src/icons/icon-svgs/x-24.icon.ts} +5 -4
- package/{dist/icons/index.js → src/icons/index.ts} +43 -39
- package/{dist/styles/border.js → src/styles/border.ts} +2 -1
- package/{dist/styles/disabled.js → src/styles/disabled.ts} +3 -2
- package/{dist/styles/durations.js → src/styles/durations.ts} +2 -1
- package/{dist/styles/focus.js → src/styles/focus.ts} +32 -8
- package/{dist/styles/font.js → src/styles/font.ts} +2 -1
- package/{dist/styles/form-styles.js → src/styles/form-styles.ts} +6 -1
- package/{dist/styles/index.js → src/styles/index.ts} +1 -0
- package/{dist/styles/native-styles.js → src/styles/native-styles.ts} +5 -3
- package/{dist/styles/scrollbar.js → src/styles/scrollbar.ts} +4 -3
- package/{dist/styles/shadows.js → src/styles/shadows.ts} +8 -6
- package/{dist/styles/user-select.js → src/styles/user-select.ts} +3 -2
- package/{dist/styles/vira-color-palette.js → src/styles/vira-color-palette.ts} +11 -1
- package/src/styles/vira-color-theme.ts +1142 -0
- package/src/util/define-table.ts +279 -0
- package/src/util/dynamic-element.ts +129 -0
- package/src/util/pop-up-manager.ts +380 -0
- package/dist/elements/define-vira-element.d.ts +0 -18
- package/dist/elements/define-vira-element.js +0 -19
- package/dist/elements/form/vira-form-fields.d.ts +0 -100
- package/dist/elements/form/vira-form-fields.js +0 -60
- package/dist/elements/form/vira-form.element.d.ts +0 -35
- package/dist/elements/form/vira-form.element.js +0 -151
- package/dist/elements/index.js +0 -25
- package/dist/elements/pop-up/pop-up-helpers.d.ts +0 -33
- package/dist/elements/pop-up/pop-up-helpers.js +0 -58
- package/dist/elements/pop-up/pop-up-menu-item.js +0 -1
- package/dist/elements/pop-up/vira-menu-item.element.d.ts +0 -19
- package/dist/elements/pop-up/vira-menu-trigger.element.d.ts +0 -41
- package/dist/elements/pop-up/vira-menu-trigger.element.js +0 -121
- package/dist/elements/pop-up/vira-menu.element.d.ts +0 -38
- package/dist/elements/pop-up/vira-pop-up-menu.element.d.ts +0 -35
- package/dist/elements/pop-up/vira-pop-up-trigger.element.d.ts +0 -105
- package/dist/elements/shared-text-input-logic.d.ts +0 -63
- package/dist/elements/shared-text-input-logic.js +0 -101
- package/dist/elements/vira-bold-text.element.d.ts +0 -9
- package/dist/elements/vira-button.element.d.ts +0 -31
- package/dist/elements/vira-card.element.d.ts +0 -18
- package/dist/elements/vira-checkbox.element.d.ts +0 -34
- package/dist/elements/vira-collapsible-wrapper.element.d.ts +0 -14
- package/dist/elements/vira-dropdown.element.d.ts +0 -46
- package/dist/elements/vira-error.element.d.ts +0 -7
- package/dist/elements/vira-icon.element.d.ts +0 -13
- package/dist/elements/vira-image.element.d.ts +0 -45
- package/dist/elements/vira-input.element.d.ts +0 -62
- package/dist/elements/vira-link.element.d.ts +0 -73
- package/dist/elements/vira-modal.element.d.ts +0 -39
- package/dist/elements/vira-overflow-switch.element.d.ts +0 -21
- package/dist/elements/vira-overflow-switch.element.js +0 -110
- package/dist/elements/vira-progress.element.d.ts +0 -18
- package/dist/elements/vira-select.element.d.ts +0 -48
- package/dist/icons/icon-color.test-helper.d.ts +0 -6
- package/dist/icons/icon-color.test-helper.js +0 -9
- package/dist/icons/icon-css-vars.d.ts +0 -14
- package/dist/icons/icon-svg.d.ts +0 -27
- package/dist/icons/icon-svg.js +0 -48
- package/dist/icons/icon-svgs/bell-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/chat-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/check-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/chevron-down-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/chevron-up-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/close-x-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/commit-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/copy-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/document-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/document-search-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/double-chevron-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/element-16.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/element-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/external-link-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/eye-closed-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/eye-open-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/filter-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/link-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/loader-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/loader-animated-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/lock-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/options-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/pencil-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/shield-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/sort-ascending-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/sort-descending-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/speaker-loud-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/speaker-medium-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/speaker-muted-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/speaker-quiet-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/star-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/status-failure-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/status-in-progress-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/status-success-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/status-unknown-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/status-warning-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/upload-24.icon.d.ts +0 -8
- package/dist/icons/icon-svgs/x-24.icon.d.ts +0 -8
- package/dist/icons/index.d.ts +0 -86
- package/dist/index.js +0 -4
- package/dist/styles/border.d.ts +0 -9
- package/dist/styles/disabled.d.ts +0 -6
- package/dist/styles/durations.d.ts +0 -22
- package/dist/styles/focus.d.ts +0 -31
- package/dist/styles/font.d.ts +0 -9
- package/dist/styles/form-styles.d.ts +0 -20
- package/dist/styles/index.d.ts +0 -13
- package/dist/styles/native-styles.d.ts +0 -13
- package/dist/styles/scrollbar.d.ts +0 -6
- package/dist/styles/shadows.d.ts +0 -20
- package/dist/styles/user-select.d.ts +0 -6
- package/dist/styles/vira-color-palette.d.ts +0 -95
- package/dist/styles/vira-color-theme.d.ts +0 -1184
- package/dist/styles/vira-color-theme.js +0 -1137
- package/dist/util/define-table.d.ts +0 -110
- package/dist/util/define-table.js +0 -115
- package/dist/util/dynamic-element.d.ts +0 -63
- package/dist/util/dynamic-element.js +0 -61
- package/dist/util/index.js +0 -3
- package/dist/util/pop-up-manager.d.ts +0 -186
- package/dist/util/pop-up-manager.js +0 -214
- /package/{dist/elements/index.d.ts → src/elements/index.ts} +0 -0
- /package/{dist/index.d.ts → src/index.ts} +0 -0
- /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
|
+
});
|
package/{dist/elements/pop-up/vira-menu.element.js → src/elements/pop-up/vira-menu.element.ts}
RENAMED
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
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({
|
|
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': ({
|
|
58
|
+
'vira-menu-multiselect': ({inputs}) => !!inputs.isMultiSelect,
|
|
35
59
|
},
|
|
36
|
-
styles: ({
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
92
|
+
.value};
|
|
69
93
|
outline: none;
|
|
70
94
|
}
|
|
71
95
|
|
|
72
96
|
${hostClasses['vira-menu-multiselect'].selector} {
|
|
73
97
|
&
|
|
74
98
|
${navAttribute.css({
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
99
|
+
baseSelector: '.menu-item:not(.disabled)',
|
|
100
|
+
navValue: NavValue.Focused,
|
|
101
|
+
})},
|
|
78
102
|
${navAttribute.css({
|
|
79
|
-
|
|
80
|
-
|
|
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
|
-
|
|
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({
|
|
122
|
+
cleanup({inputs, state}) {
|
|
99
123
|
if (!inputs.navController) {
|
|
100
124
|
state.internalNavController.destroy();
|
|
101
125
|
}
|
|
102
126
|
},
|
|
103
|
-
render({
|
|
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
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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
|
-
|
|
121
|
-
|
|
147
|
+
route: item.route,
|
|
148
|
+
})}
|
|
122
149
|
class="menu-item ${classMap({
|
|
123
|
-
|
|
124
|
-
|
|
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, {
|
|
156
|
+
${nav(state.internalNavController, {disabled})}
|
|
130
157
|
>
|
|
131
158
|
${innerTemplate}
|
|
132
159
|
</${ViraLink}>
|
|
133
160
|
`;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
return html `
|
|
161
|
+
} else {
|
|
162
|
+
return html`
|
|
137
163
|
<button
|
|
138
164
|
class="menu-item ${classMap({
|
|
139
|
-
|
|
140
|
-
|
|
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, {
|
|
171
|
+
${nav(state.internalNavController, {disabled})}
|
|
146
172
|
>
|
|
147
173
|
${innerTemplate}
|
|
148
174
|
</button>
|
|
149
175
|
`;
|
|
150
176
|
}
|
|
151
177
|
});
|
|
152
|
-
|
|
178
|
+
|
|
179
|
+
return html`
|
|
153
180
|
${itemTemplates}
|
|
154
181
|
`;
|
|
155
182
|
},
|
|
@@ -1,46 +1,58 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
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
|
|
12
|
-
(function (PopUpMenuCornerStyle) {
|
|
13
|
+
export enum PopUpMenuCornerStyle {
|
|
13
14
|
/** Rounding of corners depends on the open direction of the menu. */
|
|
14
|
-
|
|
15
|
+
Directional = 'directional',
|
|
15
16
|
/** All of the menus corners should be rounded. */
|
|
16
|
-
|
|
17
|
+
AllRounded = 'all-rounded',
|
|
17
18
|
/** None of the menus corners should be rounded. */
|
|
18
|
-
|
|
19
|
-
}
|
|
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
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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': ({
|
|
40
|
-
|
|
41
|
-
'vira-pop-up-menu-
|
|
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: ({
|
|
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
|
},
|