@aquera/nile-elements 0.0.79 → 0.0.81
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/README.md +8 -0
- package/demo/filenames.txt +1 -1
- package/demo/variables.css +7 -0
- package/demo/variables_v2.css +1 -0
- package/dist/fixture-6f853cbd.esm.js +569 -0
- package/dist/fixture-b1476eef.cjs.js +395 -0
- package/dist/fixture-b1476eef.cjs.js.map +1 -0
- package/dist/index.cjs.js +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.iife.js +186 -70
- package/dist/internal/drag.cjs.js +2 -0
- package/dist/internal/drag.cjs.js.map +1 -0
- package/dist/internal/drag.esm.js +1 -0
- package/dist/internal/math.cjs.js +2 -0
- package/dist/internal/math.cjs.js.map +1 -0
- package/dist/internal/math.esm.js +1 -0
- package/dist/nile-badge/index.cjs.js +1 -1
- package/dist/nile-badge/index.esm.js +1 -1
- package/dist/nile-badge/nile-badge.cjs.js +1 -1
- package/dist/nile-badge/nile-badge.cjs.js.map +1 -1
- package/dist/nile-badge/nile-badge.esm.js +1 -1
- package/dist/nile-button/index.cjs.js +1 -1
- package/dist/nile-button/index.esm.js +1 -1
- package/dist/nile-button/nile-button.cjs.js +1 -1
- package/dist/nile-button/nile-button.cjs.js.map +1 -1
- package/dist/nile-button/nile-button.esm.js +1 -1
- package/dist/nile-checkbox/nile-checkbox.test.cjs.js +1 -394
- package/dist/nile-checkbox/nile-checkbox.test.cjs.js.map +1 -1
- package/dist/nile-checkbox/nile-checkbox.test.esm.js +3 -571
- package/dist/nile-dialog/index.cjs.js +1 -1
- package/dist/nile-dialog/index.esm.js +1 -1
- package/dist/nile-dialog/nile-dialog.cjs.js +1 -1
- package/dist/nile-dialog/nile-dialog.cjs.js.map +1 -1
- package/dist/nile-dialog/nile-dialog.esm.js +1 -1
- package/dist/nile-drawer/index.cjs.js +1 -1
- package/dist/nile-drawer/index.esm.js +1 -1
- package/dist/nile-drawer/nile-drawer.cjs.js +1 -1
- package/dist/nile-drawer/nile-drawer.cjs.js.map +1 -1
- package/dist/nile-drawer/nile-drawer.esm.js +1 -1
- package/dist/nile-empty-state/nile-empty-state.test.cjs.js +2 -0
- package/dist/nile-empty-state/nile-empty-state.test.cjs.js.map +1 -0
- package/dist/nile-empty-state/nile-empty-state.test.esm.js +9 -0
- package/dist/nile-hero/index.cjs.js +1 -1
- package/dist/nile-hero/index.esm.js +1 -1
- package/dist/nile-hero/nile-hero.cjs.js +1 -1
- package/dist/nile-hero/nile-hero.cjs.js.map +1 -1
- package/dist/nile-hero/nile-hero.css.cjs.js +1 -1
- package/dist/nile-hero/nile-hero.css.cjs.js.map +1 -1
- package/dist/nile-hero/nile-hero.css.esm.js +12 -2
- package/dist/nile-hero/nile-hero.esm.js +4 -4
- package/dist/nile-hero/nile-hero.test.cjs.js +2 -0
- package/dist/nile-hero/nile-hero.test.cjs.js.map +1 -0
- package/dist/nile-hero/nile-hero.test.esm.js +14 -0
- package/dist/nile-icon/icons/svg/flow-01.cjs.js +2 -0
- package/dist/nile-icon/icons/svg/flow-01.cjs.js.map +1 -0
- package/dist/nile-icon/icons/svg/flow-01.esm.js +1 -0
- package/dist/nile-icon/icons/svg/index.cjs.js +1 -1
- package/dist/nile-icon/icons/svg/index.esm.js +1 -1
- package/dist/nile-icon/icons/svg/intersection.cjs.js +2 -0
- package/dist/nile-icon/icons/svg/intersection.cjs.js.map +1 -0
- package/dist/nile-icon/icons/svg/intersection.esm.js +1 -0
- package/dist/nile-icon/icons/svg/left-join.cjs.js +2 -0
- package/dist/nile-icon/icons/svg/left-join.cjs.js.map +1 -0
- package/dist/nile-icon/icons/svg/left-join.esm.js +1 -0
- package/dist/nile-icon/icons/svg/mapper.cjs.js +2 -0
- package/dist/nile-icon/icons/svg/mapper.cjs.js.map +1 -0
- package/dist/nile-icon/icons/svg/mapper.esm.js +1 -0
- package/dist/nile-icon/icons/svg/right-join.cjs.js +2 -0
- package/dist/nile-icon/icons/svg/right-join.cjs.js.map +1 -0
- package/dist/nile-icon/icons/svg/right-join.esm.js +1 -0
- package/dist/nile-icon/icons/svg/union.cjs.js +2 -0
- package/dist/nile-icon/icons/svg/union.cjs.js.map +1 -0
- package/dist/nile-icon/icons/svg/union.esm.js +1 -0
- package/dist/nile-icon/index.cjs.js +1 -1
- package/dist/nile-icon/index.cjs.js.map +1 -1
- package/dist/nile-icon/index.esm.js +1 -1
- package/dist/nile-icon-button/index.cjs.js +1 -1
- package/dist/nile-icon-button/index.esm.js +1 -1
- package/dist/nile-icon-button/nile-icon-button.cjs.js +1 -1
- package/dist/nile-icon-button/nile-icon-button.cjs.js.map +1 -1
- package/dist/nile-icon-button/nile-icon-button.esm.js +1 -1
- package/dist/nile-input/index.cjs.js +1 -1
- package/dist/nile-input/index.esm.js +1 -1
- package/dist/nile-input/nile-input.cjs.js +1 -1
- package/dist/nile-input/nile-input.cjs.js.map +1 -1
- package/dist/nile-input/nile-input.esm.js +1 -1
- package/dist/nile-menu/nile-menu.cjs.js +1 -1
- package/dist/nile-menu/nile-menu.cjs.js.map +1 -1
- package/dist/nile-menu/nile-menu.esm.js +1 -1
- package/dist/nile-menu-item/index.cjs.js +1 -1
- package/dist/nile-menu-item/index.esm.js +1 -1
- package/dist/nile-menu-item/nile-menu-item.cjs.js +1 -1
- package/dist/nile-menu-item/nile-menu-item.cjs.js.map +1 -1
- package/dist/nile-menu-item/nile-menu-item.esm.js +1 -1
- package/dist/nile-option/index.cjs.js +1 -1
- package/dist/nile-option/index.esm.js +1 -1
- package/dist/nile-option/nile-option.cjs.js +1 -1
- package/dist/nile-option/nile-option.cjs.js.map +1 -1
- package/dist/nile-option/nile-option.esm.js +1 -1
- package/dist/nile-select/index.cjs.js +1 -1
- package/dist/nile-select/index.esm.js +1 -1
- package/dist/nile-select/nile-select.cjs.js +1 -1
- package/dist/nile-select/nile-select.cjs.js.map +1 -1
- package/dist/nile-select/nile-select.esm.js +1 -1
- package/dist/nile-split-panel/index.cjs.js +2 -0
- package/dist/nile-split-panel/index.cjs.js.map +1 -0
- package/dist/nile-split-panel/index.esm.js +1 -0
- package/dist/nile-split-panel/nile-split-panel.cjs.js +2 -0
- package/dist/nile-split-panel/nile-split-panel.cjs.js.map +1 -0
- package/dist/nile-split-panel/nile-split-panel.css.cjs.js +2 -0
- package/dist/nile-split-panel/nile-split-panel.css.cjs.js.map +1 -0
- package/dist/nile-split-panel/nile-split-panel.css.esm.js +87 -0
- package/dist/nile-split-panel/nile-split-panel.esm.js +21 -0
- package/dist/nile-stepper/nile-stepper.cjs.js +1 -1
- package/dist/nile-stepper/nile-stepper.cjs.js.map +1 -1
- package/dist/nile-stepper/nile-stepper.esm.js +1 -1
- package/dist/nile-stepper/nile-stepper.test.cjs.js +2 -0
- package/dist/nile-stepper/nile-stepper.test.cjs.js.map +1 -0
- package/dist/nile-stepper/nile-stepper.test.esm.js +1 -0
- package/dist/nile-tab/index.cjs.js +1 -1
- package/dist/nile-tab/index.esm.js +1 -1
- package/dist/nile-tab/nile-tab.cjs.js +1 -1
- package/dist/nile-tab/nile-tab.cjs.js.map +1 -1
- package/dist/nile-tab/nile-tab.esm.js +1 -1
- package/dist/nile-tab-group/index.cjs.js +1 -1
- package/dist/nile-tab-group/index.esm.js +1 -1
- package/dist/nile-tab-group/nile-tab-group.cjs.js +1 -1
- package/dist/nile-tab-group/nile-tab-group.cjs.js.map +1 -1
- package/dist/nile-tab-group/nile-tab-group.esm.js +1 -1
- package/dist/nile-tag/index.cjs.js +1 -1
- package/dist/nile-tag/index.esm.js +1 -1
- package/dist/nile-tag/nile-tag.cjs.js +1 -1
- package/dist/nile-tag/nile-tag.cjs.js.map +1 -1
- package/dist/nile-tag/nile-tag.esm.js +1 -1
- package/dist/nile-toast/index.cjs.js +1 -1
- package/dist/nile-toast/index.esm.js +1 -1
- package/dist/nile-toast/nile-toast.cjs.js +1 -1
- package/dist/nile-toast/nile-toast.cjs.js.map +1 -1
- package/dist/nile-toast/nile-toast.esm.js +2 -2
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/internal/drag.d.ts +15 -0
- package/dist/src/internal/drag.js +28 -0
- package/dist/src/internal/drag.js.map +1 -0
- package/dist/src/internal/math.d.ts +2 -0
- package/dist/src/internal/math.js +12 -0
- package/dist/src/internal/math.js.map +1 -0
- package/dist/src/nile-empty-state/nile-empty-state.test.d.ts +1 -0
- package/dist/src/nile-empty-state/nile-empty-state.test.js +63 -0
- package/dist/src/nile-empty-state/nile-empty-state.test.js.map +1 -0
- package/dist/src/nile-hero/nile-hero.css.js +10 -0
- package/dist/src/nile-hero/nile-hero.css.js.map +1 -1
- package/dist/src/nile-hero/nile-hero.d.ts +0 -5
- package/dist/src/nile-hero/nile-hero.js +9 -36
- package/dist/src/nile-hero/nile-hero.js.map +1 -1
- package/dist/src/nile-hero/nile-hero.test.d.ts +1 -0
- package/dist/src/nile-hero/nile-hero.test.js +42 -0
- package/dist/src/nile-hero/nile-hero.test.js.map +1 -0
- package/dist/src/nile-icon/icons/svg/flow-01.d.ts +5 -0
- package/dist/src/nile-icon/icons/svg/flow-01.js +5 -0
- package/dist/src/nile-icon/icons/svg/flow-01.js.map +1 -0
- package/dist/src/nile-icon/icons/svg/index.d.ts +6 -0
- package/dist/src/nile-icon/icons/svg/index.js +6 -0
- package/dist/src/nile-icon/icons/svg/index.js.map +1 -1
- package/dist/src/nile-icon/icons/svg/intersection.d.ts +5 -0
- package/dist/src/nile-icon/icons/svg/intersection.js +5 -0
- package/dist/src/nile-icon/icons/svg/intersection.js.map +1 -0
- package/dist/src/nile-icon/icons/svg/left-join.d.ts +5 -0
- package/dist/src/nile-icon/icons/svg/left-join.js +5 -0
- package/dist/src/nile-icon/icons/svg/left-join.js.map +1 -0
- package/dist/src/nile-icon/icons/svg/mapper.d.ts +5 -0
- package/dist/src/nile-icon/icons/svg/mapper.js +5 -0
- package/dist/src/nile-icon/icons/svg/mapper.js.map +1 -0
- package/dist/src/nile-icon/icons/svg/right-join.d.ts +5 -0
- package/dist/src/nile-icon/icons/svg/right-join.js +5 -0
- package/dist/src/nile-icon/icons/svg/right-join.js.map +1 -0
- package/dist/src/nile-icon/icons/svg/union.d.ts +5 -0
- package/dist/src/nile-icon/icons/svg/union.js +5 -0
- package/dist/src/nile-icon/icons/svg/union.js.map +1 -0
- package/dist/src/nile-menu/nile-menu.js +1 -1
- package/dist/src/nile-menu/nile-menu.js.map +1 -1
- package/dist/src/nile-split-panel/index.d.ts +1 -0
- package/dist/src/nile-split-panel/index.js +2 -0
- package/dist/src/nile-split-panel/index.js.map +1 -0
- package/dist/src/nile-split-panel/nile-split-panel.css.d.ts +12 -0
- package/dist/src/nile-split-panel/nile-split-panel.css.js +99 -0
- package/dist/src/nile-split-panel/nile-split-panel.css.js.map +1 -0
- package/dist/src/nile-split-panel/nile-split-panel.d.ts +78 -0
- package/dist/src/nile-split-panel/nile-split-panel.js +251 -0
- package/dist/src/nile-split-panel/nile-split-panel.js.map +1 -0
- package/dist/src/nile-stepper/nile-stepper.js +1 -1
- package/dist/src/nile-stepper/nile-stepper.js.map +1 -1
- package/dist/src/nile-stepper/nile-stepper.test.d.ts +0 -0
- package/dist/src/nile-stepper/nile-stepper.test.js +165 -0
- package/dist/src/nile-stepper/nile-stepper.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/index.ts +2 -1
- package/src/internal/drag.ts +45 -0
- package/src/internal/math.ts +14 -0
- package/src/nile-empty-state/nile-empty-state.test.ts +69 -0
- package/src/nile-hero/nile-hero.css.ts +10 -0
- package/src/nile-hero/nile-hero.test.ts +45 -0
- package/src/nile-hero/nile-hero.ts +7 -26
- package/src/nile-icon/icons/svg/flow-01.ts +5 -0
- package/src/nile-icon/icons/svg/index.ts +6 -0
- package/src/nile-icon/icons/svg/intersection.ts +5 -0
- package/src/nile-icon/icons/svg/left-join.ts +5 -0
- package/src/nile-icon/icons/svg/mapper.ts +5 -0
- package/src/nile-icon/icons/svg/right-join.ts +5 -0
- package/src/nile-icon/icons/svg/union.ts +5 -0
- package/src/nile-menu/nile-menu.ts +1 -1
- package/src/nile-split-panel/index.ts +1 -0
- package/src/nile-split-panel/nile-split-panel.css.ts +101 -0
- package/src/nile-split-panel/nile-split-panel.ts +285 -0
- package/src/nile-stepper/nile-stepper.test.ts +174 -0
- package/src/nile-stepper/nile-stepper.ts +2 -2
@@ -0,0 +1,285 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright Aquera Inc 2023
|
3
|
+
*
|
4
|
+
* This source code is licensed under the BSD-3-Clause license found in the
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
6
|
+
*/
|
7
|
+
|
8
|
+
import {LitElement, CSSResultArray, TemplateResult} from 'lit-element';
|
9
|
+
import {styles} from './nile-split-panel.css';
|
10
|
+
import NileElement from '../internal/nile-element';
|
11
|
+
|
12
|
+
|
13
|
+
import { clamp } from '../internal/math';
|
14
|
+
import { customElement, property, query } from 'lit/decorators.js';
|
15
|
+
import { drag } from '../internal/drag';
|
16
|
+
import { html } from 'lit';
|
17
|
+
import { ifDefined } from 'lit/directives/if-defined.js';
|
18
|
+
import { watch } from '../internal/watch';
|
19
|
+
import type { CSSResultGroup } from 'lit';
|
20
|
+
|
21
|
+
/**
|
22
|
+
* @summary Split panels display two adjacent panels, allowing the user to reposition them.
|
23
|
+
*
|
24
|
+
* @event nile-reposition - Emitted when the divider's position changes.
|
25
|
+
*
|
26
|
+
* @slot start - Content to place in the start panel.
|
27
|
+
* @slot end - Content to place in the end panel.
|
28
|
+
* @slot divider - The divider. Useful for slotting in a custom icon that renders as a handle.
|
29
|
+
*
|
30
|
+
* @csspart start - The start panel.
|
31
|
+
* @csspart end - The end panel.
|
32
|
+
* @csspart panel - Targets both the start and end panels.
|
33
|
+
* @csspart divider - The divider that separates the start and end panels.
|
34
|
+
*
|
35
|
+
* @cssproperty [--divider-width=4px] - The width of the visible divider.
|
36
|
+
* @cssproperty [--divider-hit-area=12px] - The invisible region around the divider where dragging can occur. This is
|
37
|
+
* usually wider than the divider to facilitate easier dragging.
|
38
|
+
* @cssproperty [--min=0] - The minimum allowed size of the primary panel.
|
39
|
+
* @cssproperty [--max=100%] - The maximum allowed size of the primary panel.
|
40
|
+
*/
|
41
|
+
@customElement('nile-split-panel')
|
42
|
+
export class NileSplitPanel extends NileElement {
|
43
|
+
|
44
|
+
static styles: CSSResultGroup = styles;
|
45
|
+
|
46
|
+
private cachedPositionInPixels: number;
|
47
|
+
private resizeObserver: ResizeObserver;
|
48
|
+
private size: number;
|
49
|
+
|
50
|
+
@query('.divider') divider: HTMLElement;
|
51
|
+
|
52
|
+
/**
|
53
|
+
* The current position of the divider from the primary panel's edge as a percentage 0-100. Defaults to 50% of the
|
54
|
+
* container's initial size.
|
55
|
+
*/
|
56
|
+
@property({ type: Number, reflect: true }) position = 50;
|
57
|
+
|
58
|
+
/** The current position of the divider from the primary panel's edge in pixels. */
|
59
|
+
@property({ attribute: 'position-in-pixels', type: Number }) positionInPixels: number;
|
60
|
+
|
61
|
+
/** Draws the split panel in a vertical orientation with the start and end panels stacked. */
|
62
|
+
@property({ type: Boolean, reflect: true }) vertical = false;
|
63
|
+
|
64
|
+
/** Disables resizing. Note that the position may still change as a result of resizing the host element. */
|
65
|
+
@property({ type: Boolean, reflect: true }) disabled = false;
|
66
|
+
|
67
|
+
/**
|
68
|
+
* If no primary panel is designated, both panels will resize proportionally when the host element is resized. If a
|
69
|
+
* primary panel is designated, it will maintain its size and the other panel will grow or shrink as needed when the
|
70
|
+
* host element is resized.
|
71
|
+
*/
|
72
|
+
@property() primary?: 'start' | 'end';
|
73
|
+
|
74
|
+
/**
|
75
|
+
* One or more space-separated values at which the divider should snap. Values can be in pixels or percentages, e.g.
|
76
|
+
* `"100px 50%"`.
|
77
|
+
*/
|
78
|
+
@property() snap?: string;
|
79
|
+
|
80
|
+
/** How close the divider must be to a snap point until snapping occurs. */
|
81
|
+
@property({ type: Number, attribute: 'snap-threshold' }) snapThreshold = 12;
|
82
|
+
|
83
|
+
connectedCallback() {
|
84
|
+
super.connectedCallback();
|
85
|
+
this.resizeObserver = new ResizeObserver(entries => this.handleResize(entries));
|
86
|
+
this.updateComplete.then(() => this.resizeObserver.observe(this));
|
87
|
+
|
88
|
+
this.detectSize();
|
89
|
+
this.cachedPositionInPixels = this.percentageToPixels(this.position);
|
90
|
+
}
|
91
|
+
|
92
|
+
disconnectedCallback() {
|
93
|
+
super.disconnectedCallback();
|
94
|
+
this.resizeObserver.unobserve(this);
|
95
|
+
}
|
96
|
+
|
97
|
+
private detectSize() {
|
98
|
+
const { width, height } = this.getBoundingClientRect();
|
99
|
+
this.size = this.vertical ? height : width;
|
100
|
+
}
|
101
|
+
|
102
|
+
private percentageToPixels(value: number) {
|
103
|
+
return this.size * (value / 100);
|
104
|
+
}
|
105
|
+
|
106
|
+
private pixelsToPercentage(value: number) {
|
107
|
+
return (value / this.size) * 100;
|
108
|
+
}
|
109
|
+
|
110
|
+
private handleDrag(event: PointerEvent) {
|
111
|
+
const isRtl = false;
|
112
|
+
|
113
|
+
if (this.disabled) {
|
114
|
+
return;
|
115
|
+
}
|
116
|
+
|
117
|
+
// Prevent text selection when dragging
|
118
|
+
if (event.cancelable) {
|
119
|
+
event.preventDefault();
|
120
|
+
}
|
121
|
+
|
122
|
+
drag(this, {
|
123
|
+
onMove: (x, y) => {
|
124
|
+
let newPositionInPixels = this.vertical ? y : x;
|
125
|
+
|
126
|
+
// Flip for end panels
|
127
|
+
if (this.primary === 'end') {
|
128
|
+
newPositionInPixels = this.size - newPositionInPixels;
|
129
|
+
}
|
130
|
+
|
131
|
+
// Check snap points
|
132
|
+
if (this.snap) {
|
133
|
+
const snaps = this.snap.split(' ');
|
134
|
+
|
135
|
+
snaps.forEach(value => {
|
136
|
+
let snapPoint: number;
|
137
|
+
|
138
|
+
if (value.endsWith('%')) {
|
139
|
+
snapPoint = this.size * (parseFloat(value) / 100);
|
140
|
+
} else {
|
141
|
+
snapPoint = parseFloat(value);
|
142
|
+
}
|
143
|
+
|
144
|
+
if (isRtl && !this.vertical) {
|
145
|
+
snapPoint = this.size - snapPoint;
|
146
|
+
}
|
147
|
+
|
148
|
+
if (
|
149
|
+
newPositionInPixels >= snapPoint - this.snapThreshold &&
|
150
|
+
newPositionInPixels <= snapPoint + this.snapThreshold
|
151
|
+
) {
|
152
|
+
newPositionInPixels = snapPoint;
|
153
|
+
}
|
154
|
+
});
|
155
|
+
}
|
156
|
+
|
157
|
+
this.position = clamp(this.pixelsToPercentage(newPositionInPixels), 0, 100);
|
158
|
+
},
|
159
|
+
initialEvent: event
|
160
|
+
});
|
161
|
+
}
|
162
|
+
|
163
|
+
private handleKeyDown(event: KeyboardEvent) {
|
164
|
+
if (this.disabled) {
|
165
|
+
return;
|
166
|
+
}
|
167
|
+
|
168
|
+
if (['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End'].includes(event.key)) {
|
169
|
+
let newPosition = this.position;
|
170
|
+
const incr = (event.shiftKey ? 10 : 1) * (this.primary === 'end' ? -1 : 1);
|
171
|
+
|
172
|
+
event.preventDefault();
|
173
|
+
|
174
|
+
if ((event.key === 'ArrowLeft' && !this.vertical) || (event.key === 'ArrowUp' && this.vertical)) {
|
175
|
+
newPosition -= incr;
|
176
|
+
}
|
177
|
+
|
178
|
+
if ((event.key === 'ArrowRight' && !this.vertical) || (event.key === 'ArrowDown' && this.vertical)) {
|
179
|
+
newPosition += incr;
|
180
|
+
}
|
181
|
+
|
182
|
+
if (event.key === 'Home') {
|
183
|
+
newPosition = this.primary === 'end' ? 100 : 0;
|
184
|
+
}
|
185
|
+
|
186
|
+
if (event.key === 'End') {
|
187
|
+
newPosition = this.primary === 'end' ? 0 : 100;
|
188
|
+
}
|
189
|
+
|
190
|
+
this.position = clamp(newPosition, 0, 100);
|
191
|
+
}
|
192
|
+
}
|
193
|
+
|
194
|
+
private handleResize(entries: ResizeObserverEntry[]) {
|
195
|
+
const { width, height } = entries[0].contentRect;
|
196
|
+
this.size = this.vertical ? height : width;
|
197
|
+
|
198
|
+
// Resize when a primary panel is set
|
199
|
+
if (this.primary) {
|
200
|
+
this.position = this.pixelsToPercentage(this.cachedPositionInPixels);
|
201
|
+
}
|
202
|
+
}
|
203
|
+
|
204
|
+
@watch('position')
|
205
|
+
handlePositionChange() {
|
206
|
+
this.cachedPositionInPixels = this.percentageToPixels(this.position);
|
207
|
+
this.positionInPixels = this.percentageToPixels(this.position);
|
208
|
+
this.emit('nile-reposition');
|
209
|
+
}
|
210
|
+
|
211
|
+
@watch('positionInPixels')
|
212
|
+
handlePositionInPixelsChange() {
|
213
|
+
this.position = this.pixelsToPercentage(this.positionInPixels);
|
214
|
+
}
|
215
|
+
|
216
|
+
@watch('vertical')
|
217
|
+
handleVerticalChange() {
|
218
|
+
this.detectSize();
|
219
|
+
}
|
220
|
+
|
221
|
+
render() {
|
222
|
+
const gridTemplate = this.vertical ? 'gridTemplateRows' : 'gridTemplateColumns';
|
223
|
+
const gridTemplateAlt = this.vertical ? 'gridTemplateColumns' : 'gridTemplateRows';
|
224
|
+
const isRtl = false;
|
225
|
+
const primary = `
|
226
|
+
clamp(
|
227
|
+
0%,
|
228
|
+
clamp(
|
229
|
+
var(--min),
|
230
|
+
${this.position}% - var(--divider-width) / 2,
|
231
|
+
var(--max)
|
232
|
+
),
|
233
|
+
calc(100% - var(--divider-width))
|
234
|
+
)
|
235
|
+
`;
|
236
|
+
const secondary = 'auto';
|
237
|
+
|
238
|
+
if (this.primary === 'end') {
|
239
|
+
if (isRtl && !this.vertical) {
|
240
|
+
this.style[gridTemplate] = `${primary} var(--divider-width) ${secondary}`;
|
241
|
+
} else {
|
242
|
+
this.style[gridTemplate] = `${secondary} var(--divider-width) ${primary}`;
|
243
|
+
}
|
244
|
+
} else {
|
245
|
+
if (isRtl && !this.vertical) {
|
246
|
+
this.style[gridTemplate] = `${secondary} var(--divider-width) ${primary}`;
|
247
|
+
} else {
|
248
|
+
this.style[gridTemplate] = `${primary} var(--divider-width) ${secondary}`;
|
249
|
+
}
|
250
|
+
}
|
251
|
+
|
252
|
+
// Unset the alt grid template property
|
253
|
+
this.style[gridTemplateAlt] = '';
|
254
|
+
|
255
|
+
return html`
|
256
|
+
<slot name="start" part="panel start" class="start"></slot>
|
257
|
+
|
258
|
+
<div
|
259
|
+
part="divider"
|
260
|
+
class="divider"
|
261
|
+
tabindex=${ifDefined(this.disabled ? undefined : '0')}
|
262
|
+
role="separator"
|
263
|
+
aria-valuenow=${this.position}
|
264
|
+
aria-valuemin="0"
|
265
|
+
aria-valuemax="100"
|
266
|
+
aria-label="resize"
|
267
|
+
@keydown=${this.handleKeyDown}
|
268
|
+
@mousedown=${this.handleDrag}
|
269
|
+
@touchstart=${this.handleDrag}
|
270
|
+
>
|
271
|
+
<slot name="divider"></slot>
|
272
|
+
</div>
|
273
|
+
|
274
|
+
<slot name="end" part="panel end" class="end"></slot>
|
275
|
+
`;
|
276
|
+
}
|
277
|
+
}
|
278
|
+
|
279
|
+
export default NileSplitPanel;
|
280
|
+
|
281
|
+
declare global {
|
282
|
+
interface HTMLElementTagNameMap {
|
283
|
+
'nile-split-panel': NileSplitPanel;
|
284
|
+
}
|
285
|
+
}
|
@@ -0,0 +1,174 @@
|
|
1
|
+
// import { fixture, expect, html } from "@open-wc/testing"
|
2
|
+
// import './nile-stepper';
|
3
|
+
// import { NileStepper } from "./nile-stepper";
|
4
|
+
// import { NileStepperItem } from "../nile-stepper-item";
|
5
|
+
// import { NileVerticalStepperItem } from "../nile-vertical-stepper-item";
|
6
|
+
// describe('NileStepper', () => {
|
7
|
+
// it('should have default properties in NileStepper', async () => {
|
8
|
+
// const stepper = await fixture<NileStepper>(html`<nile-stepper></nile-stepper>`);
|
9
|
+
// expect(stepper.isVertical).to.be.false;
|
10
|
+
// expect(stepper.contentBelow).to.be.false;
|
11
|
+
// expect(stepper.currentStep).to.equal(0);
|
12
|
+
// expect(stepper.completedStep).to.equal(0);
|
13
|
+
// expect(stepper.size).to.equal('md');
|
14
|
+
// expect(stepper.icon).to.equal('tick');
|
15
|
+
// });
|
16
|
+
|
17
|
+
// it('should reflect properties to attributes in NileStepper', async () => {
|
18
|
+
// const stepper = await fixture<NileStepper>(html`
|
19
|
+
// <nile-stepper vertical contentBelow current-step="1" completed-step="2" size="lg" icon="check"></nile-stepper>
|
20
|
+
// `);
|
21
|
+
// expect(stepper.getAttribute('vertical')).to.equal('');
|
22
|
+
// expect(stepper.getAttribute('contentBelow')).to.equal('');
|
23
|
+
// expect(stepper.getAttribute('current-step')).to.equal('1');
|
24
|
+
// expect(stepper.getAttribute('completed-step')).to.equal('2');
|
25
|
+
// expect(stepper.getAttribute('size')).to.equal('lg');
|
26
|
+
// expect(stepper.getAttribute('icon')).to.equal('check');
|
27
|
+
// });
|
28
|
+
|
29
|
+
// it('should render vertical stepper correctly', async () => {
|
30
|
+
// const stepper = await fixture<NileStepper>(html`
|
31
|
+
// <nile-stepper vertical>
|
32
|
+
// <nile-vertical-stepper-item></nile-vertical-stepper-item>
|
33
|
+
// <nile-vertical-stepper-item></nile-vertical-stepper-item>
|
34
|
+
// </nile-stepper>
|
35
|
+
// `);
|
36
|
+
// const container = stepper.shadowRoot!.querySelector('.nile-stepper')!;
|
37
|
+
// expect(container.classList.contains('nile-stepper--vertical')).to.be.true;
|
38
|
+
// });
|
39
|
+
|
40
|
+
// it('should update NileStepperItems when NileStepper properties change', async () => {
|
41
|
+
// const stepper = await fixture<NileStepper>(html`
|
42
|
+
// <nile-stepper>
|
43
|
+
// <nile-stepper-item></nile-stepper-item>
|
44
|
+
// <nile-stepper-item></nile-stepper-item>
|
45
|
+
// <nile-stepper-item></nile-stepper-item>
|
46
|
+
// </nile-stepper>
|
47
|
+
// `);
|
48
|
+
// stepper.currentStep = 2;
|
49
|
+
// stepper.completedStep = 3;
|
50
|
+
// await stepper.updateComplete;
|
51
|
+
// const items = stepper.querySelectorAll('nile-stepper-item');
|
52
|
+
// expect(items[0].isComplete).to.be.true;
|
53
|
+
// expect(items[1].isCurrent).to.be.true;
|
54
|
+
// expect(items[2].isComplete).to.be.true;
|
55
|
+
// });
|
56
|
+
|
57
|
+
// it('should render stepper with content below items correctly', async () => {
|
58
|
+
// const stepper = await fixture<NileStepper>(html`
|
59
|
+
// <nile-stepper content-below>
|
60
|
+
// <nile-stepper-item title="Step 1" subtitle="Subtitle 1"></nile-stepper-item>
|
61
|
+
// <nile-stepper-item title="Step 2" subtitle="Subtitle 2"></nile-stepper-item>
|
62
|
+
// </nile-stepper>
|
63
|
+
// `);
|
64
|
+
// const items = stepper.querySelectorAll('nile-stepper-item');
|
65
|
+
// expect(items[0].contentBelow).to.be.true;
|
66
|
+
// expect(items[1].contentBelow).to.be.true;
|
67
|
+
// });
|
68
|
+
|
69
|
+
// // CUSTOM ICONS NOT SUPPORTED YET IGNORE TEST CASE
|
70
|
+
// // it('should render stepper items with correct icons', async () => {
|
71
|
+
// // const stepper = await fixture<NileStepper>(html`
|
72
|
+
// // <nile-stepper icon="star">
|
73
|
+
// // <nile-stepper-item></nile-stepper-item>
|
74
|
+
// // <nile-stepper-item></nile-stepper-item>
|
75
|
+
// // </nile-stepper>
|
76
|
+
// // `);
|
77
|
+
// // const items = stepper.querySelectorAll('nile-stepper-item');
|
78
|
+
// // expect(items[0].icon).to.equal('star');
|
79
|
+
// // expect(items[1].icon).to.equal('star');
|
80
|
+
// // });
|
81
|
+
|
82
|
+
// it('should emit events when currentStep changes', async () => {
|
83
|
+
// const stepper = await fixture<NileStepper>(html`
|
84
|
+
// <nile-stepper current-step="1" completed-step="4">
|
85
|
+
// <nile-stepper-item></nile-stepper-item>
|
86
|
+
// <nile-stepper-item></nile-stepper-item>
|
87
|
+
// <nile-stepper-item></nile-stepper-item>
|
88
|
+
// <nile-stepper-item></nile-stepper-item>
|
89
|
+
// </nile-stepper>
|
90
|
+
// `);
|
91
|
+
// const items = stepper.querySelectorAll('nile-stepper-item');
|
92
|
+
// let currentChangeEvent: CustomEvent | null = null;
|
93
|
+
// stepper.addEventListener('nile-current-change', (event) => {
|
94
|
+
// currentChangeEvent = event as CustomEvent;
|
95
|
+
// });
|
96
|
+
// stepper.currentStep = 2;
|
97
|
+
// await stepper.updateComplete;
|
98
|
+
// expect(currentChangeEvent).to.exist;
|
99
|
+
// expect(currentChangeEvent!.detail.value).to.equal(2);
|
100
|
+
// expect(items[1].isCurrent).to.equal(true);
|
101
|
+
// expect(items[0].isComplete).to.equal(true);
|
102
|
+
// });
|
103
|
+
|
104
|
+
// it('should emit events when completedStep changes', async () => {
|
105
|
+
// const stepper = await fixture<NileStepper>(html`
|
106
|
+
// <nile-stepper completed-step="1"></nile-stepper>
|
107
|
+
// `);
|
108
|
+
// let completedChangeEvent: CustomEvent | null = null;
|
109
|
+
// stepper.addEventListener('nile-completed-change', (event) => {
|
110
|
+
// completedChangeEvent = event as CustomEvent;
|
111
|
+
// });
|
112
|
+
// stepper.completedStep = 2;
|
113
|
+
// await stepper.updateComplete;
|
114
|
+
// expect(completedChangeEvent).to.exist;
|
115
|
+
// expect(completedChangeEvent!.detail.value).to.equal(2);
|
116
|
+
// });
|
117
|
+
|
118
|
+
// it('should render slot content inside stepper', async () => {
|
119
|
+
// const stepper = await fixture<NileStepper>(html`
|
120
|
+
// <nile-stepper current-step="2">
|
121
|
+
// <nile-stepper-item title="Step 1"></nile-stepper-item>
|
122
|
+
// <nile-stepper-item title="Step 2"></nile-stepper-item>
|
123
|
+
// </nile-stepper>
|
124
|
+
// `);
|
125
|
+
// const items = stepper.querySelectorAll('nile-stepper-item');
|
126
|
+
// expect(items.length).to.equal(2);
|
127
|
+
// expect(items[0].title).to.equal('Step 1');
|
128
|
+
// expect(items[1].title).to.equal('Step 2');
|
129
|
+
// expect(items[1].isCurrent).to.equal(true);
|
130
|
+
// });
|
131
|
+
// })
|
132
|
+
|
133
|
+
// describe('NileVerticalStepperItem', () => {
|
134
|
+
// it('should render vertical stepper correctly', async () => {
|
135
|
+
// const stepper = await fixture<NileStepper>(html`
|
136
|
+
// <nile-stepper vertical>
|
137
|
+
// <nile-stepper-item></nile-stepper-item>
|
138
|
+
// <nile-stepper-item></nile-stepper-item>
|
139
|
+
// </nile-stepper>
|
140
|
+
// `);
|
141
|
+
// const container = stepper.shadowRoot!.querySelector('.nile-stepper')!;
|
142
|
+
// expect(container.classList.contains('nile-stepper--vertical')).to.be.true;
|
143
|
+
// });
|
144
|
+
|
145
|
+
// it('should update NileVerticalStepperItems when NileStepper properties change', async () => {
|
146
|
+
// const stepper = await fixture<NileStepper>(html`
|
147
|
+
// <nile-stepper vertical>
|
148
|
+
// <nile-vertical-stepper-item></nile-vertical-stepper-item>
|
149
|
+
// <nile-vertical-stepper-item></nile-vertical-stepper-item>
|
150
|
+
// <nile-vertical-stepper-item></nile-vertical-stepper-item>
|
151
|
+
// </nile-stepper>
|
152
|
+
// `);
|
153
|
+
// stepper.currentStep = 2;
|
154
|
+
// stepper.completedStep = 3;
|
155
|
+
// await stepper.updateComplete;
|
156
|
+
// const items = stepper.querySelectorAll('nile-vertical-stepper-item');
|
157
|
+
// expect(items[0].isComplete).to.be.true;
|
158
|
+
// expect(items[1].isCurrent).to.be.true;
|
159
|
+
// expect(items[2].isComplete).to.be.true;
|
160
|
+
// });
|
161
|
+
|
162
|
+
// it('should render slot content inside vertical stepper', async () => {
|
163
|
+
// const stepper = await fixture<NileStepper>(html`
|
164
|
+
// <nile-stepper vertical>
|
165
|
+
// <nile-vertical-stepper-item title="Step 1"></nile-vertical-stepper-item>
|
166
|
+
// <nile-vertical-stepper-item title="Step 2"></nile-vertical-stepper-item>
|
167
|
+
// </nile-stepper>
|
168
|
+
// `);
|
169
|
+
// const items = stepper.querySelectorAll('nile-vertical-stepper-item');
|
170
|
+
// expect(items.length).to.equal(2);
|
171
|
+
// expect(items[0].title).to.equal('Step 1');
|
172
|
+
// expect(items[1].title).to.equal('Step 2');
|
173
|
+
// });
|
174
|
+
// })
|
@@ -115,7 +115,7 @@ export class NileStepper extends NileElement {
|
|
115
115
|
'nile-stepper':true,
|
116
116
|
'nile-stepper--horizontal':!this.isVertical,
|
117
117
|
'nile-stepper--vertical':this.isVertical
|
118
|
-
})}>
|
118
|
+
})}>
|
119
119
|
<slot
|
120
120
|
@slotchange=${this.updateItems}
|
121
121
|
></slot>
|
@@ -132,4 +132,4 @@ declare global {
|
|
132
132
|
interface HTMLElementTagNameMap {
|
133
133
|
'nile-stepper': NileStepper;
|
134
134
|
}
|
135
|
-
}
|
135
|
+
}
|