vira 26.13.1 → 27.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/elements/define-vira-element.d.ts +1 -1
  2. package/dist/elements/index.d.ts +7 -7
  3. package/dist/elements/index.js +7 -7
  4. package/dist/elements/{pop-up/pop-up-helpers.d.ts → popover/popover-helpers.d.ts} +6 -6
  5. package/dist/elements/{pop-up/pop-up-helpers.js → popover/popover-helpers.js} +5 -5
  6. package/dist/elements/{pop-up → popover}/vira-menu-item.element.d.ts +3 -3
  7. package/dist/elements/{pop-up → popover}/vira-menu-item.element.js +1 -1
  8. package/dist/elements/popover/vira-menu-trigger.element.d.ts +41 -0
  9. package/dist/elements/{pop-up → popover}/vira-menu-trigger.element.js +29 -33
  10. package/dist/elements/{pop-up → popover}/vira-menu.element.d.ts +3 -3
  11. package/dist/elements/{pop-up → popover}/vira-menu.element.js +2 -2
  12. package/dist/elements/popover/vira-popover-menu.element.d.ts +35 -0
  13. package/dist/elements/{pop-up/vira-pop-up-menu.element.js → popover/vira-popover-menu.element.js} +23 -23
  14. package/dist/elements/popover/vira-popover-trigger.element.d.ts +67 -0
  15. package/dist/elements/popover/vira-popover-trigger.element.js +301 -0
  16. package/dist/elements/vira-bold-text.element.d.ts +1 -1
  17. package/dist/elements/vira-button.element.d.ts +1 -1
  18. package/dist/elements/vira-checkbox.element.d.ts +1 -1
  19. package/dist/elements/vira-collapsible-wrapper.element.d.ts +1 -1
  20. package/dist/elements/vira-dropdown.element.d.ts +7 -19
  21. package/dist/elements/vira-dropdown.element.js +8 -10
  22. package/dist/elements/vira-icon.element.d.ts +1 -1
  23. package/dist/elements/vira-image.element.d.ts +1 -1
  24. package/dist/elements/vira-input.element.d.ts +1 -1
  25. package/dist/elements/vira-input.element.js +17 -8
  26. package/dist/elements/vira-link.element.d.ts +1 -1
  27. package/dist/elements/vira-progress.element.d.ts +1 -1
  28. package/dist/util/index.d.ts +1 -1
  29. package/dist/util/index.js +1 -1
  30. package/dist/util/{pop-up-manager.d.ts → popover-manager.d.ts} +60 -39
  31. package/dist/util/{pop-up-manager.js → popover-manager.js} +42 -45
  32. package/package.json +6 -6
  33. package/dist/elements/pop-up/vira-menu-trigger.element.d.ts +0 -55
  34. package/dist/elements/pop-up/vira-pop-up-menu.element.d.ts +0 -35
  35. package/dist/elements/pop-up/vira-pop-up-trigger.element.d.ts +0 -81
  36. package/dist/elements/pop-up/vira-pop-up-trigger.element.js +0 -282
  37. /package/dist/elements/{pop-up/pop-up-menu-item.d.ts → popover/popover-menu-item.d.ts} +0 -0
  38. /package/dist/elements/{pop-up/pop-up-menu-item.js → popover/popover-menu-item.js} +0 -0
@@ -1,282 +0,0 @@
1
- import { assert } from '@augment-vir/assert';
2
- import { NavController } from 'device-navigation';
3
- import { classMap, css, defineElementEvent, html, listen, renderIf } from 'element-vir';
4
- import { createFocusStyles } from '../../styles/focus.js';
5
- import { noNativeFormStyles, noUserSelect, viraDisabledStyles } from '../../styles/index.js';
6
- import { HidePopUpEvent, NavSelectEvent, PopUpManager, } from '../../util/pop-up-manager.js';
7
- import { defineViraElement } from '../define-vira-element.js';
8
- import { triggerPopUpState } from './pop-up-helpers.js';
9
- /**
10
- * Anchor options for pop-ups.
11
- *
12
- * @category Internal
13
- */
14
- export var HorizontalAnchor;
15
- (function (HorizontalAnchor) {
16
- /**
17
- * The left side of the pop-up will be anchored to the left side of the trigger, allowing the
18
- * pop-up to grow on the right side of the trigger.
19
- */
20
- HorizontalAnchor["Left"] = "left";
21
- /**
22
- * The Right side of the pop-up will be anchored to the right side of the trigger, allowing the
23
- * pop-up to grow on the left side of the trigger.
24
- */
25
- HorizontalAnchor["Right"] = "right";
26
- /**
27
- * Restrict the pop-up on both sides.
28
- *
29
- * This is the default anchor for {@link ViraPopUpTrigger}.
30
- */
31
- HorizontalAnchor["Both"] = "both";
32
- })(HorizontalAnchor || (HorizontalAnchor = {}));
33
- /**
34
- * An element with slots for a pop-up trigger and pop-up contents.
35
- *
36
- * @category PopUp
37
- * @category Elements
38
- * @see https://electrovir.github.io/vira/book/elements/vira-pop-up-trigger
39
- */
40
- export const ViraPopUpTrigger = defineViraElement()({
41
- tagName: 'vira-pop-up-trigger',
42
- state({ host }) {
43
- return {
44
- /** `undefined` means the pop up is not currently showing. */
45
- showPopUpResult: undefined,
46
- popUpManager: new PopUpManager(new NavController(host, { activateOnMouseUp: true })),
47
- };
48
- },
49
- slotNames: [
50
- 'trigger',
51
- 'popUp',
52
- ],
53
- hostClasses: {
54
- 'vira-pop-up-trigger-disabled': ({ inputs }) => !!inputs.isDisabled,
55
- },
56
- styles: ({ hostClasses }) => css `
57
- :host {
58
- display: inline-flex;
59
- box-sizing: border-box;
60
- vertical-align: middle;
61
- position: relative;
62
- max-width: 100%;
63
- }
64
-
65
- .dropdown-wrapper {
66
- ${noNativeFormStyles};
67
- cursor: pointer;
68
- max-width: 100%;
69
- position: relative;
70
- flex-grow: 1;
71
- box-sizing: border-box;
72
-
73
- ${createFocusStyles({
74
- elementBorderSize: 1,
75
- })}
76
- }
77
-
78
- .dropdown-trigger {
79
- box-sizing: border-box;
80
- ${noUserSelect};
81
- }
82
-
83
- ${hostClasses['vira-pop-up-trigger-disabled'].selector} {
84
- ${viraDisabledStyles}
85
- pointer-events: auto;
86
- }
87
-
88
- ${hostClasses['vira-pop-up-trigger-disabled'].selector} .dropdown-wrapper {
89
- pointer-events: none;
90
- }
91
-
92
- .pop-up-positioner {
93
- position: absolute;
94
- pointer-events: none;
95
- display: flex;
96
- box-sizing: border-box;
97
- flex-direction: column;
98
- align-items: flex-start;
99
-
100
- /* highest possible z-index */
101
- z-index: 2147483647;
102
-
103
- & > * {
104
- pointer-events: auto;
105
- max-width: 100%;
106
- }
107
-
108
- &.right-aligned {
109
- align-items: flex-end;
110
- }
111
- }
112
-
113
- .open-upwards .pop-up-positioner {
114
- flex-direction: column-reverse;
115
- }
116
- `,
117
- events: {
118
- navSelect: defineElementEvent(),
119
- /**
120
- * - `undefined` indicates that the pop-up just closed.
121
- * - {@link ShowPopUpResult} indicates that the pop-up just opened.
122
- */
123
- openChange: defineElementEvent(),
124
- init: defineElementEvent(),
125
- },
126
- cleanup({ state, updateState }) {
127
- updateState({ showPopUpResult: undefined });
128
- state.popUpManager.destroy();
129
- },
130
- init({ state, updateState, host, inputs, dispatch, events }) {
131
- /** Refocus the trigger and set the result to `undefined` when the pop up closes. */
132
- state.popUpManager.listen(HidePopUpEvent, () => {
133
- updateState({ showPopUpResult: undefined });
134
- dispatch(new events.openChange(undefined));
135
- if (!inputs.isDisabled) {
136
- const dropdownWrapper = host.shadowRoot.querySelector('.dropdown-wrapper');
137
- assert.instanceOf(dropdownWrapper, HTMLButtonElement, 'failed to find dropdown wrapper child');
138
- dropdownWrapper.focus();
139
- }
140
- });
141
- state.popUpManager.listen(NavSelectEvent, (event) => {
142
- if (!inputs.keepOpenAfterInteraction) {
143
- triggerPopUpState({
144
- open: false,
145
- callback(showPopUpResult) {
146
- updateState({
147
- showPopUpResult,
148
- });
149
- },
150
- host,
151
- popUpManager: state.popUpManager,
152
- });
153
- }
154
- dispatch(new events.navSelect(event.detail));
155
- });
156
- dispatch(new events.init({
157
- navController: state.popUpManager.navController,
158
- popUpManager: state.popUpManager,
159
- }));
160
- },
161
- render({ dispatch, events, state, inputs, updateState, host, slotNames }) {
162
- function triggerPopUp({ emitEvent, open }, event) {
163
- if (state.showPopUpResult && inputs.keepOpenAfterInteraction && event) {
164
- const dropdownTrigger = host.shadowRoot.querySelector('.dropdown-trigger');
165
- if (dropdownTrigger && !event.composedPath().includes(dropdownTrigger)) {
166
- /**
167
- * Prevent closing the pop-up when `keepOpenAfterInteraction` is turned on and
168
- * the pop-up was interacted with.
169
- */
170
- return;
171
- }
172
- }
173
- triggerPopUpState({
174
- open,
175
- callback(showPopUpResult) {
176
- updateState({ showPopUpResult });
177
- if (emitEvent) {
178
- dispatch(new events.openChange(showPopUpResult));
179
- }
180
- },
181
- host,
182
- popUpManager: state.popUpManager,
183
- });
184
- }
185
- if (inputs.isDisabled) {
186
- triggerPopUp({ open: false, emitEvent: false }, undefined);
187
- }
188
- else if (inputs.z_debug_forceOpenState != undefined) {
189
- if (!inputs.z_debug_forceOpenState && state.showPopUpResult) {
190
- triggerPopUp({ emitEvent: false, open: false }, undefined);
191
- }
192
- else if (inputs.z_debug_forceOpenState && !state.showPopUpResult) {
193
- triggerPopUp({ emitEvent: false, open: true }, undefined);
194
- }
195
- }
196
- const leftCss = inputs.horizontalAnchor === HorizontalAnchor.Right && state.showPopUpResult
197
- ? css `
198
- left: -${state.showPopUpResult.positions.diff.left}px;
199
- `
200
- : css `
201
- left: ${inputs.popUpOffset?.left || 0}px;
202
- `;
203
- const rightCss = state.showPopUpResult && inputs.horizontalAnchor === HorizontalAnchor.Left
204
- ? css `
205
- right: -${state.showPopUpResult.positions.diff.right}px;
206
- `
207
- : css `
208
- right: ${inputs.popUpOffset?.right || 0}px;
209
- `;
210
- const horizontalPositionStyle = css `
211
- ${leftCss}
212
- ${rightCss}
213
- `;
214
- /**
215
- * These styles do _not_ account for window resizing while the menu is open. I decided this
216
- * was not a major enough problem to tackle. If it becomes major enough in the future,
217
- * you'll need to hook into a window _or_ container resize listener inside `PopUpManager`
218
- * and emit a new `ShowPopUpResult` instance when it changes.
219
- */
220
- const positionerStyles = state.showPopUpResult
221
- ? state.showPopUpResult.popDown
222
- ? /** Dropdown going down position. */
223
- css `
224
- bottom: -${state.showPopUpResult.positions.diff.bottom}px;
225
- top: calc(100% + ${inputs.popUpOffset?.vertical || 0}px);
226
- ${horizontalPositionStyle}
227
- `
228
- : /** Dropdown going up position. */
229
- css `
230
- top: -${state.showPopUpResult.positions.diff.top}px;
231
- bottom: calc(100% + ${inputs.popUpOffset?.vertical || 0}px);
232
- ${horizontalPositionStyle}
233
- `
234
- : undefined;
235
- function respondToClick(event) {
236
- triggerPopUp({ emitEvent: true, open: !state.showPopUpResult }, event);
237
- }
238
- return html `
239
- <button
240
- ?disabled=${!!inputs.isDisabled}
241
- class="dropdown-wrapper ${classMap({
242
- open: !!state.showPopUpResult,
243
- 'open-upwards': !state.showPopUpResult?.popDown,
244
- })}"
245
- role="listbox"
246
- aria-expanded=${!!state.showPopUpResult}
247
- ${listen('keydown', (event) => {
248
- if (!state.showPopUpResult && event.code.startsWith('Arrow')) {
249
- triggerPopUp({ emitEvent: true, open: true }, event);
250
- }
251
- })}
252
- ${listen('click', (event) => {
253
- /** Detail is 0 if it was a keyboard key (like Enter) that triggered this click. */
254
- if (event.detail === 0) {
255
- respondToClick(event);
256
- }
257
- })}
258
- ${listen('mousedown', (event) => {
259
- /** Ignore any clicks that aren't the main button. */
260
- if (event.button === 0) {
261
- respondToClick(event);
262
- }
263
- })}
264
- >
265
- <div class="dropdown-trigger">
266
- <slot name=${slotNames.trigger}></slot>
267
- </div>
268
-
269
- <div
270
- class="pop-up-positioner ${classMap({
271
- 'right-aligned': inputs.horizontalAnchor === HorizontalAnchor.Right,
272
- })}"
273
- style=${positionerStyles}
274
- >
275
- ${renderIf(!!state.showPopUpResult, html `
276
- <slot name=${slotNames.popUp}></slot>
277
- `)}
278
- </div>
279
- </button>
280
- `;
281
- },
282
- });