vira 27.0.0 → 28.1.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.
- package/dist/elements/index.d.ts +7 -7
- package/dist/elements/index.js +7 -7
- package/dist/elements/{popover/popover-helpers.d.ts → pop-up/pop-up-helpers.d.ts} +6 -6
- package/dist/elements/{popover/popover-helpers.js → pop-up/pop-up-helpers.js} +5 -5
- package/dist/elements/{popover → pop-up}/vira-menu-item.element.d.ts +2 -2
- package/dist/elements/{popover → pop-up}/vira-menu-item.element.js +1 -1
- package/dist/elements/pop-up/vira-menu-trigger.element.d.ts +55 -0
- package/dist/elements/{popover → pop-up}/vira-menu-trigger.element.js +33 -29
- package/dist/elements/{popover → pop-up}/vira-menu.element.d.ts +2 -2
- package/dist/elements/{popover → pop-up}/vira-menu.element.js +2 -2
- package/dist/elements/pop-up/vira-pop-up-menu.element.d.ts +35 -0
- package/dist/elements/{popover/vira-popover-menu.element.js → pop-up/vira-pop-up-menu.element.js} +23 -23
- package/dist/elements/pop-up/vira-pop-up-trigger.element.d.ts +81 -0
- package/dist/elements/pop-up/vira-pop-up-trigger.element.js +282 -0
- package/dist/elements/vira-dropdown.element.d.ts +18 -6
- package/dist/elements/vira-dropdown.element.js +10 -8
- package/dist/icons/icon-svgs/status-failure-24.icon.js +8 -1
- package/dist/icons/icon-svgs/status-unknown-24.icon.d.ts +8 -0
- package/dist/icons/icon-svgs/status-unknown-24.icon.js +47 -0
- package/dist/icons/icon-svgs/status-warning-24.icon.js +15 -9
- package/dist/icons/index.d.ts +2 -0
- package/dist/icons/index.js +3 -0
- package/dist/util/index.d.ts +1 -1
- package/dist/util/index.js +1 -1
- package/dist/util/{popover-manager.d.ts → pop-up-manager.d.ts} +39 -60
- package/dist/util/{popover-manager.js → pop-up-manager.js} +45 -42
- package/package.json +7 -7
- package/dist/elements/popover/vira-menu-trigger.element.d.ts +0 -41
- package/dist/elements/popover/vira-popover-menu.element.d.ts +0 -35
- package/dist/elements/popover/vira-popover-trigger.element.d.ts +0 -67
- package/dist/elements/popover/vira-popover-trigger.element.js +0 -301
- /package/dist/elements/{popover/popover-menu-item.d.ts → pop-up/pop-up-menu-item.d.ts} +0 -0
- /package/dist/elements/{popover/popover-menu-item.js → pop-up/pop-up-menu-item.js} +0 -0
|
@@ -1,301 +0,0 @@
|
|
|
1
|
-
import { assert } from '@augment-vir/assert';
|
|
2
|
-
import { NavController } from 'device-navigation';
|
|
3
|
-
import { css, defineElementEvent, html, listen, onDomRendered, renderIf } from 'element-vir';
|
|
4
|
-
import { viraDisabledStyles } from '../../styles/disabled.js';
|
|
5
|
-
import { createFocusStyles } from '../../styles/focus.js';
|
|
6
|
-
import { noNativeFormStyles } from '../../styles/native-styles.js';
|
|
7
|
-
import { noUserSelect } from '../../styles/user-select.js';
|
|
8
|
-
import { HidePopoverEvent, NavSelectEvent, PopoverManager, } from '../../util/popover-manager.js';
|
|
9
|
-
import { defineViraElement } from '../define-vira-element.js';
|
|
10
|
-
import { triggerPopoverState } from './popover-helpers.js';
|
|
11
|
-
/**
|
|
12
|
-
* Anchor options for popovers.
|
|
13
|
-
*
|
|
14
|
-
* @category Internal
|
|
15
|
-
*/
|
|
16
|
-
export var HorizontalAnchor;
|
|
17
|
-
(function (HorizontalAnchor) {
|
|
18
|
-
/**
|
|
19
|
-
* The left side of the popover will be anchored to the left side of the trigger, allowing the
|
|
20
|
-
* popover to grow on the right side of the trigger.
|
|
21
|
-
*/
|
|
22
|
-
HorizontalAnchor["Left"] = "left";
|
|
23
|
-
/**
|
|
24
|
-
* The Right side of the popover will be anchored to the right side of the trigger, allowing the
|
|
25
|
-
* popover to grow on the left side of the trigger.
|
|
26
|
-
*/
|
|
27
|
-
HorizontalAnchor["Right"] = "right";
|
|
28
|
-
/**
|
|
29
|
-
* Restrict the popover on both sides.
|
|
30
|
-
*
|
|
31
|
-
* This is the default anchor for {@link ViraPopoverTrigger}.
|
|
32
|
-
*/
|
|
33
|
-
HorizontalAnchor["Both"] = "both";
|
|
34
|
-
})(HorizontalAnchor || (HorizontalAnchor = {}));
|
|
35
|
-
/**
|
|
36
|
-
* An element with slots for a popover trigger and popover contents.
|
|
37
|
-
*
|
|
38
|
-
* @category Popover
|
|
39
|
-
* @category Elements
|
|
40
|
-
* @see https://electrovir.github.io/vira/book/elements/vira-popover-trigger
|
|
41
|
-
*/
|
|
42
|
-
export const ViraPopoverTrigger = defineViraElement()({
|
|
43
|
-
tagName: 'vira-popover-trigger',
|
|
44
|
-
state({ host }) {
|
|
45
|
-
return {
|
|
46
|
-
/** `undefined` means the popover is not currently showing. */
|
|
47
|
-
showPopoverResult: undefined,
|
|
48
|
-
popoverManager: new PopoverManager(new NavController(host, { activateOnMouseUp: true })),
|
|
49
|
-
};
|
|
50
|
-
},
|
|
51
|
-
slotNames: [
|
|
52
|
-
'trigger',
|
|
53
|
-
'popover',
|
|
54
|
-
],
|
|
55
|
-
hostClasses: {
|
|
56
|
-
'vira-popover-trigger-disabled': ({ inputs }) => !!inputs.isDisabled,
|
|
57
|
-
},
|
|
58
|
-
styles: ({ hostClasses }) => css `
|
|
59
|
-
:host {
|
|
60
|
-
display: inline-flex;
|
|
61
|
-
box-sizing: border-box;
|
|
62
|
-
max-width: 100%;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
.wrapper {
|
|
66
|
-
max-width: 100%;
|
|
67
|
-
box-sizing: border-box;
|
|
68
|
-
position: relative;
|
|
69
|
-
/* Do not use display:flex. Doing so will break positioning for Firefox and Safari. */
|
|
70
|
-
display: block;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
.dropdown-trigger {
|
|
74
|
-
${noNativeFormStyles};
|
|
75
|
-
${noUserSelect};
|
|
76
|
-
cursor: pointer;
|
|
77
|
-
max-width: 100%;
|
|
78
|
-
position: relative;
|
|
79
|
-
flex-grow: 1;
|
|
80
|
-
box-sizing: border-box;
|
|
81
|
-
anchor-name: --popover-trigger;
|
|
82
|
-
|
|
83
|
-
${createFocusStyles({
|
|
84
|
-
elementBorderSize: 1,
|
|
85
|
-
})}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
${hostClasses['vira-popover-trigger-disabled'].selector} {
|
|
89
|
-
${viraDisabledStyles}
|
|
90
|
-
pointer-events: auto;
|
|
91
|
-
|
|
92
|
-
& .dropdown-wrapper {
|
|
93
|
-
pointer-events: none;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
[popover] {
|
|
98
|
-
/* More styles are set internally via JS. */
|
|
99
|
-
|
|
100
|
-
position: absolute;
|
|
101
|
-
box-sizing: border-box;
|
|
102
|
-
inset: auto;
|
|
103
|
-
display: flex;
|
|
104
|
-
/* Allow menu shadows to overflow. Without this they are hidden. */
|
|
105
|
-
overflow: visible;
|
|
106
|
-
pointer-events: none;
|
|
107
|
-
|
|
108
|
-
> * {
|
|
109
|
-
pointer-events: auto;
|
|
110
|
-
max-width: 100%;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
:popover-open {
|
|
115
|
-
${noNativeFormStyles}
|
|
116
|
-
}
|
|
117
|
-
`,
|
|
118
|
-
events: {
|
|
119
|
-
navSelect: defineElementEvent(),
|
|
120
|
-
/**
|
|
121
|
-
* - `undefined` indicates that the popover just closed.
|
|
122
|
-
* - {@link ShowPopoverResult} indicates that the popover just opened.
|
|
123
|
-
*/
|
|
124
|
-
openChange: defineElementEvent(),
|
|
125
|
-
init: defineElementEvent(),
|
|
126
|
-
},
|
|
127
|
-
cleanup({ state, updateState }) {
|
|
128
|
-
updateState({
|
|
129
|
-
showPopoverResult: undefined,
|
|
130
|
-
});
|
|
131
|
-
state.popoverManager.destroy();
|
|
132
|
-
},
|
|
133
|
-
init({ state, updateState, host, inputs, dispatch, events }) {
|
|
134
|
-
/** Refocus the trigger and set the result to `undefined` when the popover closes. */
|
|
135
|
-
state.popoverManager.listen(HidePopoverEvent, () => {
|
|
136
|
-
updateState({
|
|
137
|
-
showPopoverResult: undefined,
|
|
138
|
-
});
|
|
139
|
-
dispatch(new events.openChange(undefined));
|
|
140
|
-
if (!inputs.isDisabled) {
|
|
141
|
-
const dropdownWrapper = host.shadowRoot.querySelector('.dropdown-trigger');
|
|
142
|
-
assert.instanceOf(dropdownWrapper, HTMLButtonElement, 'failed to find dropdown wrapper child');
|
|
143
|
-
dropdownWrapper.focus();
|
|
144
|
-
}
|
|
145
|
-
});
|
|
146
|
-
state.popoverManager.listen(NavSelectEvent, (event) => {
|
|
147
|
-
if (!inputs.keepOpenAfterInteraction) {
|
|
148
|
-
triggerPopoverState({
|
|
149
|
-
open: false,
|
|
150
|
-
callback(showPopoverResult) {
|
|
151
|
-
updateState({
|
|
152
|
-
showPopoverResult,
|
|
153
|
-
});
|
|
154
|
-
},
|
|
155
|
-
host,
|
|
156
|
-
popoverManager: state.popoverManager,
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
dispatch(new events.navSelect(event.detail));
|
|
160
|
-
});
|
|
161
|
-
dispatch(new events.init({
|
|
162
|
-
navController: state.popoverManager.navController,
|
|
163
|
-
popoverManager: state.popoverManager,
|
|
164
|
-
}));
|
|
165
|
-
},
|
|
166
|
-
render({ dispatch, events, state, inputs, updateState, host, slotNames }) {
|
|
167
|
-
function triggerPopover({ emitEvent, open, }, event) {
|
|
168
|
-
if (state.showPopoverResult && inputs.keepOpenAfterInteraction && event) {
|
|
169
|
-
const dropdownTrigger = host.shadowRoot.querySelector('.dropdown-trigger');
|
|
170
|
-
if (dropdownTrigger && !event.composedPath().includes(dropdownTrigger)) {
|
|
171
|
-
/**
|
|
172
|
-
* Prevent closing the popover when `keepOpenAfterInteraction` is turned on and
|
|
173
|
-
* the popover was interacted with.
|
|
174
|
-
*/
|
|
175
|
-
return;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
triggerPopoverState({
|
|
179
|
-
open,
|
|
180
|
-
callback(showPopoverResult) {
|
|
181
|
-
updateState({ showPopoverResult });
|
|
182
|
-
if (emitEvent) {
|
|
183
|
-
dispatch(new events.openChange(showPopoverResult));
|
|
184
|
-
}
|
|
185
|
-
},
|
|
186
|
-
host,
|
|
187
|
-
popoverManager: state.popoverManager,
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
if (inputs.isDisabled) {
|
|
191
|
-
triggerPopover({ open: false, emitEvent: false }, undefined);
|
|
192
|
-
}
|
|
193
|
-
else if (inputs.z_debug_forceOpenState != undefined) {
|
|
194
|
-
if (!inputs.z_debug_forceOpenState && state.showPopoverResult) {
|
|
195
|
-
triggerPopover({ emitEvent: false, open: false }, undefined);
|
|
196
|
-
}
|
|
197
|
-
else if (inputs.z_debug_forceOpenState && !state.showPopoverResult) {
|
|
198
|
-
triggerPopover({ emitEvent: false, open: true }, undefined);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
const horizontalPositionStyle = state.showPopoverResult
|
|
202
|
-
? state.showPopoverResult.popRight
|
|
203
|
-
? css `
|
|
204
|
-
width: ${state.showPopoverResult.positions.diff.rootLeftToContainerRight}px;
|
|
205
|
-
left: anchor(--popover-trigger left);
|
|
206
|
-
align-items: flex-start;
|
|
207
|
-
`
|
|
208
|
-
: css `
|
|
209
|
-
width: ${state.showPopoverResult.positions.diff.rootRightToContainerLeft}px;
|
|
210
|
-
right: anchor(--popover-trigger right);
|
|
211
|
-
/* Fallback for Firefox and Safari that don't yet support anchor() */
|
|
212
|
-
right: ${state.showPopoverResult.positions.diff.right}px;
|
|
213
|
-
align-items: flex-end;
|
|
214
|
-
`
|
|
215
|
-
: css `
|
|
216
|
-
display: none;
|
|
217
|
-
`;
|
|
218
|
-
const verticalPositionStyle = state.showPopoverResult
|
|
219
|
-
? state.showPopoverResult.popDown
|
|
220
|
-
? css `
|
|
221
|
-
top: anchor(--popover-trigger bottom);
|
|
222
|
-
height: ${state.showPopoverResult.positions.diff.bottom}px;
|
|
223
|
-
flex-direction: column;
|
|
224
|
-
`
|
|
225
|
-
: css `
|
|
226
|
-
bottom: anchor(--popover-trigger top);
|
|
227
|
-
height: ${state.showPopoverResult.positions.diff.top}px;
|
|
228
|
-
flex-direction: column-reverse;
|
|
229
|
-
`
|
|
230
|
-
: css `
|
|
231
|
-
display: none;
|
|
232
|
-
`;
|
|
233
|
-
/**
|
|
234
|
-
* These styles do _not_ account for window resizing while the menu is open. I decided this
|
|
235
|
-
* was not a major enough problem to tackle. If it becomes major enough in the future,
|
|
236
|
-
* you'll need to hook into a window _or_ container resize listener inside `PopoverManager`
|
|
237
|
-
* and emit a new `ShowPopoverResult` instance when it changes.
|
|
238
|
-
*
|
|
239
|
-
* Currently, the popover will simply close when the window is resized.
|
|
240
|
-
*/
|
|
241
|
-
const positionerStyles = css `
|
|
242
|
-
${verticalPositionStyle}
|
|
243
|
-
${horizontalPositionStyle}
|
|
244
|
-
`;
|
|
245
|
-
function respondToClick(event) {
|
|
246
|
-
triggerPopover({
|
|
247
|
-
emitEvent: true,
|
|
248
|
-
open: !state.showPopoverResult,
|
|
249
|
-
}, event);
|
|
250
|
-
}
|
|
251
|
-
return html `
|
|
252
|
-
<div class="wrapper">
|
|
253
|
-
<button
|
|
254
|
-
?disabled=${!!inputs.isDisabled}
|
|
255
|
-
class="dropdown-trigger"
|
|
256
|
-
role="listbox"
|
|
257
|
-
aria-expanded=${!!state.showPopoverResult}
|
|
258
|
-
${listen('keydown', (event) => {
|
|
259
|
-
if (!state.showPopoverResult && event.code.startsWith('Arrow')) {
|
|
260
|
-
triggerPopover({ emitEvent: true, open: true }, event);
|
|
261
|
-
}
|
|
262
|
-
})}
|
|
263
|
-
${listen('click', (event) => {
|
|
264
|
-
/**
|
|
265
|
-
* Detail is 0 if it was a keyboard key (like Enter) that triggered this
|
|
266
|
-
* click.
|
|
267
|
-
*/
|
|
268
|
-
if (event.detail === 0) {
|
|
269
|
-
respondToClick(event);
|
|
270
|
-
}
|
|
271
|
-
})}
|
|
272
|
-
${listen('mousedown', (event) => {
|
|
273
|
-
/** Ignore any clicks that aren't the main button. */
|
|
274
|
-
if (event.button === 0) {
|
|
275
|
-
respondToClick(event);
|
|
276
|
-
}
|
|
277
|
-
})}
|
|
278
|
-
>
|
|
279
|
-
<slot name=${slotNames.trigger}></slot>
|
|
280
|
-
</button>
|
|
281
|
-
<div
|
|
282
|
-
popover="manual"
|
|
283
|
-
style=${positionerStyles}
|
|
284
|
-
${onDomRendered((popoverElement) => {
|
|
285
|
-
assert.instanceOf(popoverElement, HTMLElement);
|
|
286
|
-
if (state.showPopoverResult) {
|
|
287
|
-
popoverElement.showPopover();
|
|
288
|
-
}
|
|
289
|
-
else {
|
|
290
|
-
popoverElement.hidePopover();
|
|
291
|
-
}
|
|
292
|
-
})}
|
|
293
|
-
>
|
|
294
|
-
${renderIf(!!state.showPopoverResult, html `
|
|
295
|
-
<slot name=${slotNames.popover}></slot>
|
|
296
|
-
`)}
|
|
297
|
-
</div>
|
|
298
|
-
</div>
|
|
299
|
-
`;
|
|
300
|
-
},
|
|
301
|
-
});
|
|
File without changes
|
|
File without changes
|