@rcarls/rc-splitter 0.2.0 → 0.3.1
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 +3 -1
- package/dist/custom-elements.json +205 -3
- package/dist/rc-splitter-BZgnDbmR.js +473 -0
- package/dist/rc-splitter-BZgnDbmR.js.map +1 -0
- package/dist/rc-splitter-define.js +1 -1
- package/dist/rc-splitter.js +1 -1
- package/dist/types/packages/rc-splitter/src/rc-splitter.d.ts +35 -4
- package/package.json +7 -10
- package/dist/demo.css +0 -85
- package/dist/demo.js +0 -40
- package/dist/rc-splitter-CkpiDBPA.js +0 -314
- package/dist/rc-splitter-CkpiDBPA.js.map +0 -1
package/package.json
CHANGED
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "0.
|
|
7
|
-
"description": "
|
|
6
|
+
"version": "0.3.1",
|
|
7
|
+
"description": "Resizable pane splitter with pointer, keyboard, and collapse/restore controls.",
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
10
10
|
"url": "git+https://github.com/richardcarls/rc-webcomponents.git",
|
|
11
11
|
"directory": "packages/rc-splitter"
|
|
12
12
|
},
|
|
13
|
-
"homepage": "https://github.
|
|
13
|
+
"homepage": "https://richardcarls.github.io/rc-webcomponents/components/rc-splitter",
|
|
14
14
|
"license": "MIT",
|
|
15
15
|
"type": "module",
|
|
16
16
|
"files": [
|
|
@@ -37,21 +37,18 @@
|
|
|
37
37
|
],
|
|
38
38
|
"customElements": "dist/custom-elements.json",
|
|
39
39
|
"scripts": {
|
|
40
|
-
"dev": "vite",
|
|
41
40
|
"build": "tsc && vite build && cem analyze",
|
|
42
41
|
"cem:analyze": "cem analyze",
|
|
43
42
|
"preview": "vite preview",
|
|
44
|
-
"test:browser": "vitest",
|
|
45
|
-
"test:browser:chrome": "vitest --project=chromium",
|
|
46
|
-
"test:browser:firefox": "vitest --project=firefox"
|
|
47
|
-
"yalc:publish": "yalc publish --push"
|
|
43
|
+
"test:browser": "vitest --run",
|
|
44
|
+
"test:browser:chrome": "vitest --run --project=chromium",
|
|
45
|
+
"test:browser:firefox": "vitest --run --project=firefox"
|
|
48
46
|
},
|
|
49
47
|
"dependencies": {
|
|
50
|
-
"@rcarls/rc-common": "workspace
|
|
48
|
+
"@rcarls/rc-common": "workspace:*"
|
|
51
49
|
},
|
|
52
50
|
"devDependencies": {
|
|
53
51
|
"@custom-elements-manifest/analyzer": "0.11.0",
|
|
54
|
-
"@guanghechen/rollup-plugin-copy": "^6.0.9",
|
|
55
52
|
"@vitest/browser-playwright": "4.1.5",
|
|
56
53
|
"lit": "^3.0.0",
|
|
57
54
|
"playwright": "^1.56.0",
|
package/dist/demo.css
DELETED
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
*, *::before, *::after {
|
|
2
|
-
box-sizing: border-box;
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
:root {
|
|
6
|
-
color-scheme: light dark;
|
|
7
|
-
--rc-accent: Highlight; /* Chrome doesn't support AccentColor on the open web */
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
@supports (color: AccentColor) {
|
|
11
|
-
:root {
|
|
12
|
-
--rc-accent: AccentColor;
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
[data-theme="light"] { color-scheme: light; }
|
|
17
|
-
[data-theme="dark"] { color-scheme: dark; }
|
|
18
|
-
|
|
19
|
-
[data-theme="solarized-light"] {
|
|
20
|
-
color-scheme: light;
|
|
21
|
-
--rc-surface: #fdf6e3;
|
|
22
|
-
--rc-text: #657b83;
|
|
23
|
-
--rc-border: 1px solid #93a1a1;
|
|
24
|
-
--rc-shadow: 0 2px 8px rgba(0, 0, 0, .12);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
[data-theme="solarized-dark"] {
|
|
28
|
-
color-scheme: dark;
|
|
29
|
-
--rc-surface: #002b36;
|
|
30
|
-
--rc-text: #839496;
|
|
31
|
-
--rc-border: 1px solid #586e75;
|
|
32
|
-
--rc-shadow: 0 2px 8px rgba(0, 0, 0, .3);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
body {
|
|
36
|
-
font-family: system-ui, sans-serif;
|
|
37
|
-
margin: 0;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
.demo-page {
|
|
41
|
-
max-width: 60rem;
|
|
42
|
-
margin: 0 auto;
|
|
43
|
-
padding: 2rem 1.5rem;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
.demo-controls {
|
|
47
|
-
display: flex;
|
|
48
|
-
align-items: center;
|
|
49
|
-
gap: 1rem;
|
|
50
|
-
margin-bottom: 2rem;
|
|
51
|
-
padding-bottom: 1rem;
|
|
52
|
-
border-bottom: 1px solid ButtonBorder;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
.demo-controls .demo-title {
|
|
56
|
-
flex: 1;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
.demo-controls h1 {
|
|
60
|
-
margin: 0 0 0.15rem;
|
|
61
|
-
font-size: 1.5rem;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
.demo-controls a {
|
|
65
|
-
font-size: 0.8rem;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
.demo-section {
|
|
69
|
-
margin-bottom: 2rem;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
.demo-section h2 {
|
|
73
|
-
margin: 0 0 0.5rem;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
.theme-picker {
|
|
77
|
-
padding: 0.35em 0.75em;
|
|
78
|
-
font-family: inherit;
|
|
79
|
-
font-size: 0.8rem;
|
|
80
|
-
cursor: pointer;
|
|
81
|
-
border: 1px solid ButtonBorder;
|
|
82
|
-
border-radius: 4px;
|
|
83
|
-
background: Canvas;
|
|
84
|
-
color: CanvasText;
|
|
85
|
-
}
|
package/dist/demo.js
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
const THEMES = ['', 'light', 'dark', 'solarized-light', 'solarized-dark'];
|
|
2
|
-
const LABELS = ['Auto', 'Light', 'Dark', 'Solarized ☀', 'Solarized ☾'];
|
|
3
|
-
|
|
4
|
-
const stored = localStorage.getItem('rc-demo-theme') ?? '';
|
|
5
|
-
applyTheme(stored);
|
|
6
|
-
|
|
7
|
-
function applyTheme(theme) {
|
|
8
|
-
if (theme) {
|
|
9
|
-
document.documentElement.dataset.theme = theme;
|
|
10
|
-
} else {
|
|
11
|
-
delete document.documentElement.dataset.theme;
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
function currentIndex() {
|
|
16
|
-
const current = document.documentElement.dataset.theme ?? '';
|
|
17
|
-
const idx = THEMES.indexOf(current);
|
|
18
|
-
return idx === -1 ? 0 : idx;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function updateButtons() {
|
|
22
|
-
const label = LABELS[currentIndex()];
|
|
23
|
-
document.querySelectorAll('.theme-picker').forEach((btn) => {
|
|
24
|
-
btn.textContent = label;
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
window.cycleTheme = function () {
|
|
29
|
-
const next = THEMES[(currentIndex() + 1) % THEMES.length];
|
|
30
|
-
applyTheme(next);
|
|
31
|
-
localStorage.setItem('rc-demo-theme', next);
|
|
32
|
-
updateButtons();
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
document.addEventListener('DOMContentLoaded', () => {
|
|
36
|
-
updateButtons();
|
|
37
|
-
document.querySelectorAll('.theme-picker').forEach((btn) => {
|
|
38
|
-
btn.addEventListener('click', window.cycleTheme);
|
|
39
|
-
});
|
|
40
|
-
});
|
|
@@ -1,314 +0,0 @@
|
|
|
1
|
-
import { css as c, LitElement as _, html as m } from "lit";
|
|
2
|
-
import { property as l, state as h, query as y, queryAssignedElements as d } from "lit/decorators.js";
|
|
3
|
-
import { keyNavigation as v, mouseMove as b } from "@rcarls/rc-common";
|
|
4
|
-
const f = c`
|
|
5
|
-
*,
|
|
6
|
-
*::before,
|
|
7
|
-
*::after {
|
|
8
|
-
box-sizing: border-box;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
:host {
|
|
12
|
-
--rc-splitter-separator-size: 6px;
|
|
13
|
-
|
|
14
|
-
position: relative;
|
|
15
|
-
display: flex;
|
|
16
|
-
flex-direction: row;
|
|
17
|
-
align-items: stretch;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
:host([orientation='vertical']) {
|
|
21
|
-
flex-direction: column;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
:host([hidden]) {
|
|
25
|
-
display: none;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/* because :has(:focus-visible) doens't work across slot boundary */
|
|
29
|
-
:host([data-interaction-mode='keyboard']):focus-within {
|
|
30
|
-
outline: auto;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
::slotted(*) {
|
|
34
|
-
width: 100%;
|
|
35
|
-
height: 100%;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
#separator {
|
|
39
|
-
grid-column: separator;
|
|
40
|
-
flex: 0 0 var(--rc-splitter-separator-size, 6px);
|
|
41
|
-
display: flex;
|
|
42
|
-
flex-direction: column;
|
|
43
|
-
justify-content: center;
|
|
44
|
-
background-color: var(--rc-splitter-separator-color, color-mix(in srgb, ButtonBorder 35%, Canvas 65%));
|
|
45
|
-
border-left: var(--rc-splitter-separator-border-inline-start, var(--rc-splitter-keyline, 1px solid ButtonBorder));
|
|
46
|
-
border-right: var(--rc-splitter-separator-border-inline-end, var(--rc-splitter-keyline, 1px solid ButtonBorder));
|
|
47
|
-
|
|
48
|
-
:host([orientation='vertical']) & {
|
|
49
|
-
flex-direction: row;
|
|
50
|
-
border-left: unset;
|
|
51
|
-
border-right: unset;
|
|
52
|
-
border-top: var(--rc-splitter-separator-border-block-start, var(--rc-splitter-keyline, 1px solid ButtonBorder));
|
|
53
|
-
border-bottom: var(--rc-splitter-separator-border-block-end, var(--rc-splitter-keyline, 1px solid ButtonBorder));
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
#separator-handle {
|
|
58
|
-
width: 100%;
|
|
59
|
-
height: var(--rc-splitter-separator-handle-size, 100%);
|
|
60
|
-
background:
|
|
61
|
-
linear-gradient(
|
|
62
|
-
to bottom,
|
|
63
|
-
transparent,
|
|
64
|
-
transparent calc(50% - 1px),
|
|
65
|
-
var(--rc-splitter-handle-color, ButtonBorder) calc(50% - 1px),
|
|
66
|
-
var(--rc-splitter-handle-color, ButtonBorder) calc(50% + 1px),
|
|
67
|
-
transparent calc(50% + 1px),
|
|
68
|
-
transparent
|
|
69
|
-
);
|
|
70
|
-
cursor: col-resize;
|
|
71
|
-
|
|
72
|
-
:host([orientation='vertical']) & {
|
|
73
|
-
width: var(--rc-splitter-separator-handle-size, 100%);
|
|
74
|
-
height: 100%;
|
|
75
|
-
background:
|
|
76
|
-
linear-gradient(
|
|
77
|
-
to right,
|
|
78
|
-
transparent,
|
|
79
|
-
transparent calc(50% - 1px),
|
|
80
|
-
var(--rc-splitter-handle-color, ButtonBorder) calc(50% - 1px),
|
|
81
|
-
var(--rc-splitter-handle-color, ButtonBorder) calc(50% + 1px),
|
|
82
|
-
transparent calc(50% + 1px),
|
|
83
|
-
transparent
|
|
84
|
-
);
|
|
85
|
-
cursor: row-resize;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
:host([fixed]) {
|
|
89
|
-
pointer-events: none;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
#primary,
|
|
94
|
-
#secondary {
|
|
95
|
-
overflow: hidden;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
#primary {
|
|
99
|
-
grid-column: primary;
|
|
100
|
-
flex: 0 0 auto;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
#secondary {
|
|
104
|
-
grid-column: secondary;
|
|
105
|
-
flex: 1;
|
|
106
|
-
}
|
|
107
|
-
`;
|
|
108
|
-
var x = Object.defineProperty, g = Object.getOwnPropertyDescriptor, i = (p, e, t, a) => {
|
|
109
|
-
for (var s = a > 1 ? void 0 : a ? g(e, t) : e, n = p.length - 1, o; n >= 0; n--)
|
|
110
|
-
(o = p[n]) && (s = (a ? o(e, t, s) : o(s)) || s);
|
|
111
|
-
return a && s && x(e, t, s), s;
|
|
112
|
-
};
|
|
113
|
-
const u = class u extends _ {
|
|
114
|
-
constructor() {
|
|
115
|
-
super(...arguments), this.label = "Splitter", this.orientation = "horizontal", this.mode = "length", this.step = 1, this._value = 0, this.fixed = !1, this._minValue = 0, this._maxValue = 0, this._lastValue = 0, this._initialMax = 0, this._resizeObserver = new ResizeObserver(() => this._onResize());
|
|
116
|
-
}
|
|
117
|
-
set value(e) {
|
|
118
|
-
const t = this._hostValue;
|
|
119
|
-
this._hostValue = e, this._initialMax && this._setValue(e, !1), this.requestUpdate("value", t);
|
|
120
|
-
}
|
|
121
|
-
/** The current splitter value, corresponding to the separator position, in either pixels or percentage points depending on `mode`. */
|
|
122
|
-
get value() {
|
|
123
|
-
return this._value;
|
|
124
|
-
}
|
|
125
|
-
set defaultValue(e) {
|
|
126
|
-
const t = this._defaultValue;
|
|
127
|
-
this._defaultValue = e, !this._initialMax && this._hostValue === void 0 && e !== void 0 && this._setValue(e, !1), this.requestUpdate("defaultValue", t);
|
|
128
|
-
}
|
|
129
|
-
/** Initial uncontrolled splitter value. */
|
|
130
|
-
get defaultValue() {
|
|
131
|
-
return this._defaultValue;
|
|
132
|
-
}
|
|
133
|
-
_setValue(e, t) {
|
|
134
|
-
const a = this._value;
|
|
135
|
-
this._lastValue = a, this._value = Math.min(
|
|
136
|
-
Math.max(Math.round(e / this.step) * this.step, this._minValue),
|
|
137
|
-
this._maxValue
|
|
138
|
-
), t && this._value !== a && this.dispatchEvent(
|
|
139
|
-
new CustomEvent("rc-splitter-change", {
|
|
140
|
-
bubbles: !0,
|
|
141
|
-
composed: !0,
|
|
142
|
-
detail: { value: this._value, valueText: this.valueText }
|
|
143
|
-
})
|
|
144
|
-
);
|
|
145
|
-
}
|
|
146
|
-
_setUserValue(e) {
|
|
147
|
-
this._hostValue = void 0, this._setValue(e, !0);
|
|
148
|
-
}
|
|
149
|
-
/** A human-readable string representation of the value. */
|
|
150
|
-
get valueText() {
|
|
151
|
-
return `${this.value}${this.mode === "length" ? "px" : "%"}`;
|
|
152
|
-
}
|
|
153
|
-
_onKeyboardResize(e) {
|
|
154
|
-
if (!this.fixed)
|
|
155
|
-
switch (e) {
|
|
156
|
-
case "next":
|
|
157
|
-
this._setUserValue(this.value + this.step);
|
|
158
|
-
break;
|
|
159
|
-
case "prev":
|
|
160
|
-
this._setUserValue(this.value - this.step);
|
|
161
|
-
break;
|
|
162
|
-
case "start":
|
|
163
|
-
this._setUserValue(0);
|
|
164
|
-
break;
|
|
165
|
-
case "end":
|
|
166
|
-
this._setUserValue(this._maxValue);
|
|
167
|
-
break;
|
|
168
|
-
case "toggle":
|
|
169
|
-
this._setUserValue(this.value === 0 ? this._lastValue : 0);
|
|
170
|
-
break;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
_onPointerResize(e) {
|
|
174
|
-
if (this.fixed)
|
|
175
|
-
return;
|
|
176
|
-
const t = this.getBoundingClientRect();
|
|
177
|
-
this.orientation === "vertical" ? this._setUserValue(
|
|
178
|
-
(e.clientY - t.top) / t.height * this._maxValue
|
|
179
|
-
) : this._setUserValue(
|
|
180
|
-
(e.clientX - t.left) / t.width * this._maxValue
|
|
181
|
-
);
|
|
182
|
-
}
|
|
183
|
-
_onPrimaryChange(e) {
|
|
184
|
-
queueMicrotask(() => {
|
|
185
|
-
this._$primaryElements.length < 2 || this._$primaryElements.slice(1).forEach((t) => t.setAttribute("slot", "secondary"));
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
_onSecondaryChange(e) {
|
|
189
|
-
queueMicrotask(() => {
|
|
190
|
-
!this._$secondaryElements.length || this._$primaryElements.length || this._$secondaryElements.at(0)?.removeAttribute("slot");
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
_measureHostSize(e) {
|
|
194
|
-
const t = this.getBoundingClientRect(), a = e === "inline" ? t.width : t.height;
|
|
195
|
-
if (a > 0)
|
|
196
|
-
return Math.ceil(a);
|
|
197
|
-
const s = getComputedStyle(this), n = e === "inline" ? s.width : s.height, o = Number.parseFloat(n);
|
|
198
|
-
return Number.isFinite(o) ? Math.ceil(o) : 0;
|
|
199
|
-
}
|
|
200
|
-
_onResize() {
|
|
201
|
-
const e = this._$primaryElements.at(0), t = this._$primary.style.getPropertyValue("display");
|
|
202
|
-
globalThis.requestAnimationFrame(() => {
|
|
203
|
-
this._$primary.style.setProperty("display", "contents");
|
|
204
|
-
const a = e?.getBoundingClientRect() ?? this.getBoundingClientRect();
|
|
205
|
-
this.mode === "length" ? this._maxValue = this.orientation === "horizontal" ? (
|
|
206
|
-
// For horizontal splitters, just take the host width...
|
|
207
|
-
this._measureHostSize("inline")
|
|
208
|
-
) : (
|
|
209
|
-
// ...otherwise try to use the first lightDOM element's auto height, and cache it
|
|
210
|
-
this._initialMax || Math.ceil(a.height) || this._measureHostSize("block")
|
|
211
|
-
) : this._maxValue = 100, this._initialMax ? this._hostValue !== void 0 ? this._setValue(this._hostValue, !1) : this._setValue(this.value, !1) : (this._initialMax = this._maxValue, this._setValue(
|
|
212
|
-
this._hostValue ?? this.defaultValue ?? this._maxValue / 2,
|
|
213
|
-
!1
|
|
214
|
-
)), t ? this._$primary.style.setProperty("display", t) : this._$primary.style.removeProperty("display");
|
|
215
|
-
});
|
|
216
|
-
}
|
|
217
|
-
connectedCallback() {
|
|
218
|
-
super.connectedCallback(), this._resizeObserver.observe(this);
|
|
219
|
-
}
|
|
220
|
-
disconnectedCallback() {
|
|
221
|
-
this._resizeObserver.disconnect(), super.disconnectedCallback();
|
|
222
|
-
}
|
|
223
|
-
firstUpdated() {
|
|
224
|
-
this._onResize();
|
|
225
|
-
}
|
|
226
|
-
render() {
|
|
227
|
-
return m`
|
|
228
|
-
<div
|
|
229
|
-
id="primary"
|
|
230
|
-
part="primary"
|
|
231
|
-
aria-label=${this.label}
|
|
232
|
-
style=${this.orientation === "horizontal" ? `width: ${this.valueText}` : `height: ${this.valueText}`}
|
|
233
|
-
?hidden=${this.value === this._minValue}
|
|
234
|
-
>
|
|
235
|
-
<slot @slotchange=${this._onPrimaryChange}></slot>
|
|
236
|
-
</div>
|
|
237
|
-
|
|
238
|
-
<div id="separator" part="separator">
|
|
239
|
-
<div
|
|
240
|
-
id="separator-handle"
|
|
241
|
-
role="separator"
|
|
242
|
-
tabindex="0"
|
|
243
|
-
part="separator-handle"
|
|
244
|
-
aria-labelledby="primary"
|
|
245
|
-
aria-controls="primary"
|
|
246
|
-
aria-orientation=${this.orientation}
|
|
247
|
-
aria-valuenow=${this.value}
|
|
248
|
-
aria-valuetext=${this.valueText}
|
|
249
|
-
aria-valuemin=${this._minValue}
|
|
250
|
-
aria-valuemax=${this._maxValue}
|
|
251
|
-
${v(this._onKeyboardResize)}
|
|
252
|
-
${b(this._onPointerResize)}
|
|
253
|
-
?hidden=${!this._$secondaryElements.length}
|
|
254
|
-
></div>
|
|
255
|
-
</div>
|
|
256
|
-
|
|
257
|
-
<aside
|
|
258
|
-
id="secondary"
|
|
259
|
-
part="secondary"
|
|
260
|
-
?hidden=${!this._$secondaryElements.length || this.value === this._maxValue}
|
|
261
|
-
>
|
|
262
|
-
<slot name="secondary" @slotchange=${this._onSecondaryChange}></slot>
|
|
263
|
-
</aside>
|
|
264
|
-
`;
|
|
265
|
-
}
|
|
266
|
-
};
|
|
267
|
-
u.styles = [f];
|
|
268
|
-
let r = u;
|
|
269
|
-
i([
|
|
270
|
-
l({ type: String })
|
|
271
|
-
], r.prototype, "label", 2);
|
|
272
|
-
i([
|
|
273
|
-
l({ type: String, reflect: !0 })
|
|
274
|
-
], r.prototype, "orientation", 2);
|
|
275
|
-
i([
|
|
276
|
-
l({ type: String })
|
|
277
|
-
], r.prototype, "mode", 2);
|
|
278
|
-
i([
|
|
279
|
-
l({ type: Number })
|
|
280
|
-
], r.prototype, "step", 2);
|
|
281
|
-
i([
|
|
282
|
-
l({ type: Number })
|
|
283
|
-
], r.prototype, "value", 1);
|
|
284
|
-
i([
|
|
285
|
-
l({ type: Number, attribute: "default-value" })
|
|
286
|
-
], r.prototype, "defaultValue", 1);
|
|
287
|
-
i([
|
|
288
|
-
h()
|
|
289
|
-
], r.prototype, "_value", 2);
|
|
290
|
-
i([
|
|
291
|
-
l({ type: Boolean })
|
|
292
|
-
], r.prototype, "fixed", 2);
|
|
293
|
-
i([
|
|
294
|
-
h()
|
|
295
|
-
], r.prototype, "_minValue", 2);
|
|
296
|
-
i([
|
|
297
|
-
h()
|
|
298
|
-
], r.prototype, "_maxValue", 2);
|
|
299
|
-
i([
|
|
300
|
-
h()
|
|
301
|
-
], r.prototype, "_lastValue", 2);
|
|
302
|
-
i([
|
|
303
|
-
y("#primary", !0)
|
|
304
|
-
], r.prototype, "_$primary", 2);
|
|
305
|
-
i([
|
|
306
|
-
d()
|
|
307
|
-
], r.prototype, "_$primaryElements", 2);
|
|
308
|
-
i([
|
|
309
|
-
d({ slot: "secondary" })
|
|
310
|
-
], r.prototype, "_$secondaryElements", 2);
|
|
311
|
-
export {
|
|
312
|
-
r as R
|
|
313
|
-
};
|
|
314
|
-
//# sourceMappingURL=rc-splitter-CkpiDBPA.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rc-splitter-CkpiDBPA.js","sources":["../src/rc-splitter.styles.ts","../src/rc-splitter.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const splitterStyles = css`\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host {\n --rc-splitter-separator-size: 6px;\n\n position: relative;\n display: flex;\n flex-direction: row;\n align-items: stretch;\n }\n\n :host([orientation='vertical']) {\n flex-direction: column;\n }\n\n :host([hidden]) {\n display: none;\n }\n\n /* because :has(:focus-visible) doens't work across slot boundary */\n :host([data-interaction-mode='keyboard']):focus-within {\n outline: auto;\n }\n\n ::slotted(*) {\n width: 100%;\n height: 100%;\n }\n\n #separator {\n grid-column: separator;\n flex: 0 0 var(--rc-splitter-separator-size, 6px);\n display: flex;\n flex-direction: column;\n justify-content: center;\n background-color: var(--rc-splitter-separator-color, color-mix(in srgb, ButtonBorder 35%, Canvas 65%));\n border-left: var(--rc-splitter-separator-border-inline-start, var(--rc-splitter-keyline, 1px solid ButtonBorder));\n border-right: var(--rc-splitter-separator-border-inline-end, var(--rc-splitter-keyline, 1px solid ButtonBorder));\n\n :host([orientation='vertical']) & {\n flex-direction: row;\n border-left: unset;\n border-right: unset;\n border-top: var(--rc-splitter-separator-border-block-start, var(--rc-splitter-keyline, 1px solid ButtonBorder));\n border-bottom: var(--rc-splitter-separator-border-block-end, var(--rc-splitter-keyline, 1px solid ButtonBorder));\n }\n }\n\n #separator-handle {\n width: 100%;\n height: var(--rc-splitter-separator-handle-size, 100%);\n background:\n linear-gradient(\n to bottom,\n transparent,\n transparent calc(50% - 1px),\n var(--rc-splitter-handle-color, ButtonBorder) calc(50% - 1px),\n var(--rc-splitter-handle-color, ButtonBorder) calc(50% + 1px),\n transparent calc(50% + 1px),\n transparent\n );\n cursor: col-resize;\n\n :host([orientation='vertical']) & {\n width: var(--rc-splitter-separator-handle-size, 100%);\n height: 100%;\n background:\n linear-gradient(\n to right,\n transparent,\n transparent calc(50% - 1px),\n var(--rc-splitter-handle-color, ButtonBorder) calc(50% - 1px),\n var(--rc-splitter-handle-color, ButtonBorder) calc(50% + 1px),\n transparent calc(50% + 1px),\n transparent\n );\n cursor: row-resize;\n }\n\n :host([fixed]) {\n pointer-events: none;\n }\n }\n\n #primary,\n #secondary {\n overflow: hidden;\n }\n\n #primary {\n grid-column: primary;\n flex: 0 0 auto;\n }\n\n #secondary {\n grid-column: secondary;\n flex: 1;\n }\n`;\n\nexport default splitterStyles;\n","import { LitElement, html } from \"lit\";\nimport {\n property,\n state,\n query,\n queryAssignedElements,\n} from \"lit/decorators.js\";\n\nimport {\n keyNavigation,\n type KeyboardNavigationAction,\n mouseMove,\n} from \"@rcarls/rc-common\";\n\nimport splitterStyles from \"./rc-splitter.styles\";\n\ntype SplitterOrientation = \"horizontal\" | \"vertical\";\n\ntype SplitterMode = \"length\" | \"percent\";\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rc-splitter\": RCSplitter;\n }\n}\n\n/**\n * An accessible splitter layout component.\n *\n * Set `orientation=\"vertical\"` for a vertical splitter\n *\n * @slot - Primary pane contents\n * @slot secondary - Secondary pane contents (optional)\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/\n * @cssprop [--rc-splitter-separator-size=6px] - Thickness of the separator bar\n * @cssprop [--rc-splitter-separator-handle-size=100%] - Length of the drag handle within the separator\n * @cssprop [--rc-splitter-separator-color=color-mix(in srgb, ButtonBorder 35%, Canvas 65%)] - Separator background color\n * @cssprop [--rc-splitter-keyline=1px solid ButtonBorder] - Shared separator keyline border\n * @cssprop [--rc-splitter-handle-color=ButtonBorder] - Visible handle line color\n * @cssprop [--rc-splitter-separator-border-inline-start=1px solid ButtonBorder] - Inline-start border\n * @cssprop [--rc-splitter-separator-border-inline-end=1px solid ButtonBorder] - Inline-end border\n * @cssprop [--rc-splitter-separator-border-block-start=1px solid ButtonBorder] - Block-start border (vertical orientation)\n * @cssprop [--rc-splitter-separator-border-block-end=1px solid ButtonBorder] - Block-end border (vertical orientation)\n * @csspart primary - Primary pane container\n * @csspart secondary - Secondary pane container\n * @csspart separator - The separator bar\n * @csspart separator-handle - The focusable drag handle\n */\nexport class RCSplitter extends LitElement {\n static styles = [splitterStyles];\n\n /** Accessible label for this splitter. Default label is 'Splitter'. */\n @property({ type: String })\n label = \"Splitter\";\n\n /** Splitter orientation, for keyboard navigation and initial sizing. */\n @property({ type: String, reflect: true })\n orientation: SplitterOrientation = \"horizontal\";\n\n /** Determines length units for min, max and step attributes, one of either `length` (default) or `percent` */\n @property({ type: String })\n mode: SplitterMode = \"length\";\n\n /** The step size for resizing, in either pixels or percentage points depending on `mode`. */\n @property({ type: Number })\n step: number = 1;\n\n private _defaultValue: number | undefined;\n private _hostValue: number | undefined;\n\n /** The current splitter value. Host writes update silently. */\n @property({ type: Number })\n set value(val: number) {\n const oldValue = this._hostValue;\n\n this._hostValue = val;\n\n if (this._initialMax) {\n this._setValue(val, false);\n }\n\n this.requestUpdate(\"value\", oldValue);\n }\n\n /** The current splitter value, corresponding to the separator position, in either pixels or percentage points depending on `mode`. */\n get value() {\n return this._value;\n }\n\n /** Initial uncontrolled splitter value. */\n @property({ type: Number, attribute: \"default-value\" })\n set defaultValue(val: number | undefined) {\n const oldValue = this._defaultValue;\n\n this._defaultValue = val;\n\n if (!this._initialMax && this._hostValue === undefined && val !== undefined) {\n this._setValue(val, false);\n }\n\n this.requestUpdate(\"defaultValue\", oldValue);\n }\n\n /** Initial uncontrolled splitter value. */\n get defaultValue() {\n return this._defaultValue;\n }\n\n private _setValue(val: number, dispatch: boolean): void {\n const oldValue = this._value;\n this._lastValue = oldValue;\n\n this._value = Math.min(\n Math.max(Math.round(val / this.step) * this.step, this._minValue),\n this._maxValue,\n );\n\n if (dispatch && this._value !== oldValue) {\n this.dispatchEvent(\n new CustomEvent(\"rc-splitter-change\", {\n bubbles: true,\n composed: true,\n detail: { value: this._value, valueText: this.valueText },\n }),\n );\n }\n }\n\n private _setUserValue(val: number): void {\n this._hostValue = undefined;\n this._setValue(val, true);\n }\n\n @state()\n private _value: number = 0;\n\n /** Toggles resizing ability */\n @property({ type: Boolean })\n fixed: boolean = false;\n\n /** A human-readable string representation of the value. */\n get valueText() {\n return `${this.value}${this.mode === \"length\" ? \"px\" : \"%\"}`;\n }\n\n @state()\n protected _minValue: number = 0;\n\n @state()\n protected _maxValue: number = 0;\n\n /** Last valid value, for collapse functionality. */\n @state()\n protected _lastValue: number = 0;\n\n @query(\"#primary\", true)\n protected _$primary!: HTMLDivElement;\n\n @queryAssignedElements()\n protected _$primaryElements!: Array<HTMLElement>;\n\n @queryAssignedElements({ slot: \"secondary\" })\n protected _$secondaryElements!: Array<HTMLElement>;\n\n protected _initialMax: number = 0;\n\n protected _resizeObserver = new ResizeObserver(() => this._onResize());\n\n protected _onKeyboardResize(action: KeyboardNavigationAction) {\n if (this.fixed) {\n return;\n }\n\n switch (action) {\n case \"next\":\n this._setUserValue(this.value + this.step);\n break;\n case \"prev\":\n this._setUserValue(this.value - this.step);\n break;\n case \"start\":\n this._setUserValue(0);\n break;\n case \"end\":\n this._setUserValue(this._maxValue);\n break;\n case \"toggle\":\n this._setUserValue(this.value === 0 ? this._lastValue : 0);\n break;\n }\n }\n\n protected _onPointerResize(e: MouseEvent) {\n if (this.fixed) {\n return;\n }\n\n const clientRect = this.getBoundingClientRect();\n\n if (this.orientation === \"vertical\") {\n this._setUserValue(\n ((e.clientY - clientRect.top) / clientRect.height) * this._maxValue,\n );\n } else {\n this._setUserValue(\n ((e.clientX - clientRect.left) / clientRect.width) * this._maxValue,\n );\n }\n }\n\n protected _onPrimaryChange(_e: Event) {\n queueMicrotask(() => {\n if (this._$primaryElements.length < 2) return;\n\n this._$primaryElements\n .slice(1)\n .forEach((el) => el.setAttribute(\"slot\", \"secondary\"));\n });\n }\n\n protected _onSecondaryChange(_e: Event) {\n queueMicrotask(() => {\n if (!this._$secondaryElements.length || this._$primaryElements.length) {\n return;\n }\n\n this._$secondaryElements.at(0)?.removeAttribute(\"slot\");\n });\n }\n\n private _measureHostSize(axis: \"inline\" | \"block\"): number {\n const clientRect = this.getBoundingClientRect();\n const measuredSize = axis === \"inline\" ? clientRect.width : clientRect.height;\n\n if (measuredSize > 0) {\n return Math.ceil(measuredSize);\n }\n\n const computedStyle = getComputedStyle(this);\n const fallbackSize =\n axis === \"inline\" ? computedStyle.width : computedStyle.height;\n const parsedFallbackSize = Number.parseFloat(fallbackSize);\n\n return Number.isFinite(parsedFallbackSize)\n ? Math.ceil(parsedFallbackSize)\n : 0;\n }\n\n protected _onResize() {\n const el = this._$primaryElements.at(0);\n const prevStyle = this._$primary.style.getPropertyValue(\"display\");\n\n // Request animation frame to prevent layout paint jank.\n globalThis.requestAnimationFrame(() => {\n // Temporarily display the first light DOM element as a direct child for measurement.\n this._$primary.style.setProperty(\"display\", \"contents\");\n\n const clientRect =\n el?.getBoundingClientRect() ?? this.getBoundingClientRect();\n\n if (this.mode === \"length\") {\n this._maxValue =\n this.orientation === \"horizontal\"\n ? // For horizontal splitters, just take the host width...\n this._measureHostSize(\"inline\")\n : // ...otherwise try to use the first lightDOM element's auto height, and cache it\n this._initialMax ||\n Math.ceil(clientRect.height) ||\n this._measureHostSize(\"block\");\n } else {\n // Percentage max is always just 100%\n this._maxValue = 100.0;\n }\n\n if (!this._initialMax) {\n this._initialMax = this._maxValue;\n this._setValue(\n this._hostValue ?? this.defaultValue ?? this._maxValue / 2,\n false,\n );\n } else if (this._hostValue !== undefined) {\n this._setValue(this._hostValue, false);\n } else {\n this._setValue(this.value, false);\n }\n\n // Restore previous display mode\n prevStyle\n ? this._$primary.style.setProperty(\"display\", prevStyle)\n : this._$primary.style.removeProperty(\"display\");\n });\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._resizeObserver.observe(this);\n }\n\n disconnectedCallback(): void {\n this._resizeObserver.disconnect();\n super.disconnectedCallback();\n }\n\n firstUpdated() {\n this._onResize();\n }\n\n render() {\n return html`\n <div\n id=\"primary\"\n part=\"primary\"\n aria-label=${this.label}\n style=${this.orientation === \"horizontal\"\n ? `width: ${this.valueText}`\n : `height: ${this.valueText}`}\n ?hidden=${this.value === this._minValue}\n >\n <slot @slotchange=${this._onPrimaryChange}></slot>\n </div>\n\n <div id=\"separator\" part=\"separator\">\n <div\n id=\"separator-handle\"\n role=\"separator\"\n tabindex=\"0\"\n part=\"separator-handle\"\n aria-labelledby=\"primary\"\n aria-controls=\"primary\"\n aria-orientation=${this.orientation}\n aria-valuenow=${this.value}\n aria-valuetext=${this.valueText}\n aria-valuemin=${this._minValue}\n aria-valuemax=${this._maxValue}\n ${keyNavigation(this._onKeyboardResize)}\n ${mouseMove(this._onPointerResize)}\n ?hidden=${!this._$secondaryElements.length}\n ></div>\n </div>\n\n <aside\n id=\"secondary\"\n part=\"secondary\"\n ?hidden=${!this._$secondaryElements.length ||\n this.value === this._maxValue}\n >\n <slot name=\"secondary\" @slotchange=${this._onSecondaryChange}></slot>\n </aside>\n `;\n }\n}\n\nexport default RCSplitter;\n"],"names":["splitterStyles","css","_RCSplitter","LitElement","val","oldValue","dispatch","action","clientRect","_e","el","axis","measuredSize","computedStyle","fallbackSize","parsedFallbackSize","prevStyle","html","keyNavigation","mouseMove","RCSplitter","__decorateClass","property","state","query","queryAssignedElements"],"mappings":"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"}
|