@mintplayer/ng-bootstrap 21.29.0 → 21.31.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/fesm2022/mintplayer-ng-bootstrap-a11y.mjs +455 -0
- package/fesm2022/mintplayer-ng-bootstrap-a11y.mjs.map +1 -0
- package/fesm2022/mintplayer-ng-bootstrap-accordion.mjs +8 -5
- package/fesm2022/mintplayer-ng-bootstrap-accordion.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-breadcrumb.mjs +10 -4
- package/fesm2022/mintplayer-ng-bootstrap-breadcrumb.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-button-group.mjs +7 -4
- package/fesm2022/mintplayer-ng-bootstrap-button-group.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-calendar.mjs +131 -3
- package/fesm2022/mintplayer-ng-bootstrap-calendar.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-carousel.mjs +80 -48
- package/fesm2022/mintplayer-ng-bootstrap-carousel.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-code-snippet.mjs +4 -1
- package/fesm2022/mintplayer-ng-bootstrap-code-snippet.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-color-picker.mjs +218 -14
- package/fesm2022/mintplayer-ng-bootstrap-color-picker.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-datatable.mjs +4 -3
- package/fesm2022/mintplayer-ng-bootstrap-datatable.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-datepicker.mjs +2 -2
- package/fesm2022/mintplayer-ng-bootstrap-datepicker.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-dock.mjs +294 -3
- package/fesm2022/mintplayer-ng-bootstrap-dock.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-dropdown-menu.mjs +163 -18
- package/fesm2022/mintplayer-ng-bootstrap-dropdown-menu.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-dropdown.mjs +179 -7
- package/fesm2022/mintplayer-ng-bootstrap-dropdown.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-file-upload.mjs +14 -4
- package/fesm2022/mintplayer-ng-bootstrap-file-upload.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-has-overlay.mjs +14 -0
- package/fesm2022/mintplayer-ng-bootstrap-has-overlay.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-list-group.mjs +2 -1
- package/fesm2022/mintplayer-ng-bootstrap-list-group.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-marquee.mjs +7 -4
- package/fesm2022/mintplayer-ng-bootstrap-marquee.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-modal.mjs +70 -6
- package/fesm2022/mintplayer-ng-bootstrap-modal.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-multi-range.mjs +693 -0
- package/fesm2022/mintplayer-ng-bootstrap-multi-range.mjs.map +1 -0
- package/fesm2022/mintplayer-ng-bootstrap-multiselect.mjs +5 -4
- package/fesm2022/mintplayer-ng-bootstrap-multiselect.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-navbar-toggler.mjs +6 -6
- package/fesm2022/mintplayer-ng-bootstrap-navbar-toggler.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-navbar.mjs +45 -13
- package/fesm2022/mintplayer-ng-bootstrap-navbar.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-offcanvas.mjs +51 -5
- package/fesm2022/mintplayer-ng-bootstrap-offcanvas.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-pagination.mjs +5 -3
- package/fesm2022/mintplayer-ng-bootstrap-pagination.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-placeholder.mjs +18 -4
- package/fesm2022/mintplayer-ng-bootstrap-placeholder.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-playlist-toggler.mjs +6 -6
- package/fesm2022/mintplayer-ng-bootstrap-playlist-toggler.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-popover.mjs +61 -6
- package/fesm2022/mintplayer-ng-bootstrap-popover.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-priority-nav.mjs +19 -4
- package/fesm2022/mintplayer-ng-bootstrap-priority-nav.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-progress-bar.mjs +8 -5
- package/fesm2022/mintplayer-ng-bootstrap-progress-bar.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-range.mjs +4 -3
- package/fesm2022/mintplayer-ng-bootstrap-range.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-rating.mjs +34 -4
- package/fesm2022/mintplayer-ng-bootstrap-rating.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-reduced-motion.mjs +59 -0
- package/fesm2022/mintplayer-ng-bootstrap-reduced-motion.mjs.map +1 -0
- package/fesm2022/mintplayer-ng-bootstrap-resizable.mjs +91 -2
- package/fesm2022/mintplayer-ng-bootstrap-resizable.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-scheduler.mjs +16 -5
- package/fesm2022/mintplayer-ng-bootstrap-scheduler.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-scrollspy.mjs +2 -2
- package/fesm2022/mintplayer-ng-bootstrap-scrollspy.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-searchbox.mjs +28 -5
- package/fesm2022/mintplayer-ng-bootstrap-searchbox.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-select.mjs +4 -3
- package/fesm2022/mintplayer-ng-bootstrap-select.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-select2.mjs +18 -4
- package/fesm2022/mintplayer-ng-bootstrap-select2.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-signature-pad.mjs +4 -3
- package/fesm2022/mintplayer-ng-bootstrap-signature-pad.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-tab-control.mjs +2 -2
- package/fesm2022/mintplayer-ng-bootstrap-tab-control.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-table.mjs +10 -3
- package/fesm2022/mintplayer-ng-bootstrap-table.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-tile-manager.mjs +143 -29
- package/fesm2022/mintplayer-ng-bootstrap-tile-manager.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-timepicker.mjs +2 -2
- package/fesm2022/mintplayer-ng-bootstrap-timepicker.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-toast.mjs +7 -4
- package/fesm2022/mintplayer-ng-bootstrap-toast.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-toggle-button.mjs +42 -21
- package/fesm2022/mintplayer-ng-bootstrap-toggle-button.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-tooltip.mjs +33 -4
- package/fesm2022/mintplayer-ng-bootstrap-tooltip.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-treeview.mjs +17 -7
- package/fesm2022/mintplayer-ng-bootstrap-treeview.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-typeahead.mjs +50 -8
- package/fesm2022/mintplayer-ng-bootstrap-typeahead.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-virtual-datatable.mjs +34 -12
- package/fesm2022/mintplayer-ng-bootstrap-virtual-datatable.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-web-components-a11y.mjs +74 -0
- package/fesm2022/mintplayer-ng-bootstrap-web-components-a11y.mjs.map +1 -0
- package/fesm2022/mintplayer-ng-bootstrap-web-components-scheduler.mjs +1476 -71
- package/fesm2022/mintplayer-ng-bootstrap-web-components-scheduler.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-web-components-splitter.mjs +194 -2
- package/fesm2022/mintplayer-ng-bootstrap-web-components-splitter.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-web-components-tab-control.mjs +4 -0
- package/fesm2022/mintplayer-ng-bootstrap-web-components-tab-control.mjs.map +1 -1
- package/package.json +18 -2
- package/types/mintplayer-ng-bootstrap-a11y.d.ts +196 -0
- package/types/mintplayer-ng-bootstrap-accordion.d.ts +4 -2
- package/types/mintplayer-ng-bootstrap-breadcrumb.d.ts +2 -1
- package/types/mintplayer-ng-bootstrap-button-group.d.ts +2 -1
- package/types/mintplayer-ng-bootstrap-calendar.d.ts +32 -0
- package/types/mintplayer-ng-bootstrap-carousel.d.ts +56 -3
- package/types/mintplayer-ng-bootstrap-code-snippet.d.ts +1 -0
- package/types/mintplayer-ng-bootstrap-color-picker.d.ts +75 -4
- package/types/mintplayer-ng-bootstrap-datatable.d.ts +1 -1
- package/types/mintplayer-ng-bootstrap-dock.d.ts +51 -0
- package/types/mintplayer-ng-bootstrap-dropdown-menu.d.ts +54 -9
- package/types/mintplayer-ng-bootstrap-dropdown.d.ts +57 -2
- package/types/mintplayer-ng-bootstrap-file-upload.d.ts +4 -1
- package/types/mintplayer-ng-bootstrap-has-overlay.d.ts +14 -0
- package/types/mintplayer-ng-bootstrap-marquee.d.ts +2 -1
- package/types/mintplayer-ng-bootstrap-modal.d.ts +25 -1
- package/types/mintplayer-ng-bootstrap-multi-range.d.ts +170 -0
- package/types/mintplayer-ng-bootstrap-multiselect.d.ts +2 -1
- package/types/mintplayer-ng-bootstrap-navbar-toggler.d.ts +4 -2
- package/types/mintplayer-ng-bootstrap-navbar.d.ts +25 -1
- package/types/mintplayer-ng-bootstrap-offcanvas.d.ts +23 -1
- package/types/mintplayer-ng-bootstrap-pagination.d.ts +3 -1
- package/types/mintplayer-ng-bootstrap-placeholder.d.ts +5 -1
- package/types/mintplayer-ng-bootstrap-playlist-toggler.d.ts +4 -2
- package/types/mintplayer-ng-bootstrap-popover.d.ts +21 -1
- package/types/mintplayer-ng-bootstrap-priority-nav.d.ts +4 -1
- package/types/mintplayer-ng-bootstrap-progress-bar.d.ts +4 -2
- package/types/mintplayer-ng-bootstrap-range.d.ts +2 -1
- package/types/mintplayer-ng-bootstrap-rating.d.ts +3 -0
- package/types/mintplayer-ng-bootstrap-reduced-motion.d.ts +36 -0
- package/types/mintplayer-ng-bootstrap-resizable.d.ts +4 -0
- package/types/mintplayer-ng-bootstrap-scheduler.d.ts +42 -9
- package/types/mintplayer-ng-bootstrap-scrollspy.d.ts +1 -1
- package/types/mintplayer-ng-bootstrap-searchbox.d.ts +8 -1
- package/types/mintplayer-ng-bootstrap-select.d.ts +2 -1
- package/types/mintplayer-ng-bootstrap-select2.d.ts +3 -0
- package/types/mintplayer-ng-bootstrap-signature-pad.d.ts +2 -1
- package/types/mintplayer-ng-bootstrap-table.d.ts +8 -1
- package/types/mintplayer-ng-bootstrap-tile-manager.d.ts +21 -2
- package/types/mintplayer-ng-bootstrap-toast.d.ts +6 -1
- package/types/mintplayer-ng-bootstrap-toggle-button.d.ts +11 -0
- package/types/mintplayer-ng-bootstrap-tooltip.d.ts +5 -0
- package/types/mintplayer-ng-bootstrap-treeview.d.ts +12 -1
- package/types/mintplayer-ng-bootstrap-typeahead.d.ts +11 -3
- package/types/mintplayer-ng-bootstrap-virtual-datatable.d.ts +14 -1
- package/types/mintplayer-ng-bootstrap-web-components-a11y.d.ts +34 -0
- package/types/mintplayer-ng-bootstrap-web-components-scheduler-core.d.ts +35 -11
- package/types/mintplayer-ng-bootstrap-web-components-scheduler.d.ts +246 -0
- package/types/mintplayer-ng-bootstrap-web-components-splitter.d.ts +95 -37
|
@@ -104,6 +104,9 @@ function normalizePointerEvent(event) {
|
|
|
104
104
|
};
|
|
105
105
|
}
|
|
106
106
|
|
|
107
|
+
const RESIZE_KEYS = new Set([
|
|
108
|
+
'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End',
|
|
109
|
+
]);
|
|
107
110
|
class InputHandler {
|
|
108
111
|
constructor(callbacks) {
|
|
109
112
|
this.isActive = false;
|
|
@@ -118,6 +121,15 @@ class InputHandler {
|
|
|
118
121
|
attachDividerListeners(divider, index) {
|
|
119
122
|
divider.addEventListener('mousedown', (e) => this.handleMouseDown(e, index, divider));
|
|
120
123
|
divider.addEventListener('touchstart', (e) => this.handleTouchStart(e, index, divider), { passive: false });
|
|
124
|
+
divider.addEventListener('keydown', (e) => this.handleKeyDown(e, index, divider));
|
|
125
|
+
}
|
|
126
|
+
handleKeyDown(event, dividerIndex, dividerElement) {
|
|
127
|
+
if (!this.callbacks.onResizeKey)
|
|
128
|
+
return;
|
|
129
|
+
if (!RESIZE_KEYS.has(event.key))
|
|
130
|
+
return;
|
|
131
|
+
event.preventDefault();
|
|
132
|
+
this.callbacks.onResizeKey(event.key, event.shiftKey, dividerIndex, dividerElement);
|
|
121
133
|
}
|
|
122
134
|
handleMouseDown(event, dividerIndex, dividerElement) {
|
|
123
135
|
event.preventDefault();
|
|
@@ -305,11 +317,21 @@ const splitterStyles = unsafeCSS(`:host {
|
|
|
305
317
|
}
|
|
306
318
|
|
|
307
319
|
.divider:hover::before,
|
|
308
|
-
.divider.active::before
|
|
320
|
+
.divider.active::before,
|
|
321
|
+
.divider:focus-visible::before {
|
|
309
322
|
background-color: var(--mp-splitter-divider-hover-color);
|
|
310
323
|
border-radius: calc(var(--mp-splitter-size) / 2);
|
|
311
324
|
}
|
|
312
325
|
|
|
326
|
+
.divider:focus {
|
|
327
|
+
outline: none;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
.divider:focus-visible {
|
|
331
|
+
outline: 2px solid var(--mp-splitter-divider-hover-color);
|
|
332
|
+
outline-offset: 1px;
|
|
333
|
+
}
|
|
334
|
+
|
|
313
335
|
/* Horizontal splitter styles */
|
|
314
336
|
.splitter-container.horizontal > .divider {
|
|
315
337
|
width: calc(var(--mp-splitter-size) + 2 * var(--mp-splitter-thumb-margin));
|
|
@@ -372,8 +394,36 @@ const splitterStyles = unsafeCSS(`:host {
|
|
|
372
394
|
::slotted(*) {
|
|
373
395
|
width: 100%;
|
|
374
396
|
height: 100%;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
@media (prefers-reduced-motion: reduce) {
|
|
400
|
+
.divider {
|
|
401
|
+
transition: none !important;
|
|
402
|
+
}
|
|
375
403
|
}`);
|
|
376
404
|
|
|
405
|
+
let splitterInstanceCounter = 0;
|
|
406
|
+
/**
|
|
407
|
+
* `<mp-splitter>` — resizable panel splitter.
|
|
408
|
+
*
|
|
409
|
+
* Light-DOM children are projected into named slots (`panel-${i}`) inside a
|
|
410
|
+
* shadow-DOM flex container with auto-inserted dividers between them. Drag a
|
|
411
|
+
* divider to redistribute space; sizes survive container resize via a
|
|
412
|
+
* proportional rescale.
|
|
413
|
+
*
|
|
414
|
+
* Pointer + keyboard interactions both flow through the same path:
|
|
415
|
+
* - Pointer drag → `InputHandler` → `handleResizeStart/Move/End`.
|
|
416
|
+
* - Arrow keys ±10% (Shift = ±1%), Home/End to limits → `handleResizeKey`.
|
|
417
|
+
*
|
|
418
|
+
* ARIA: each divider is a `role="separator"` with `aria-orientation`,
|
|
419
|
+
* `aria-controls` referencing the deterministic IDs of the two adjacent
|
|
420
|
+
* panel wrappers, and percent-based `aria-valuenow / valuemin / valuemax`
|
|
421
|
+
* that update on every drag-preview frame, container resize, and keystroke.
|
|
422
|
+
*
|
|
423
|
+
* Public API: `[orientation]`, `[min-panel-size]`, `[touch-mode]`;
|
|
424
|
+
* `getPanelSizes()` / `setPanelSizes()`; events `resize-start`, `resizing`,
|
|
425
|
+
* `resize-end` carrying `{ sizes, orientation }`.
|
|
426
|
+
*/
|
|
377
427
|
class MpSplitter extends LitElement {
|
|
378
428
|
static { this.styles = [splitterStyles]; }
|
|
379
429
|
static get observedAttributes() {
|
|
@@ -393,12 +443,14 @@ class MpSplitter extends LitElement {
|
|
|
393
443
|
this.mutationObserver = null;
|
|
394
444
|
this.containerResizeObserver = null;
|
|
395
445
|
this.unsubscribeState = null;
|
|
446
|
+
this.instanceId = `mp-splitter-${++splitterInstanceCounter}`;
|
|
396
447
|
this.stateManager = new SplitterStateManager();
|
|
397
448
|
this.resizeManager = new ResizeManager();
|
|
398
449
|
this.inputHandler = new InputHandler({
|
|
399
450
|
onResizeStart: this.handleResizeStart.bind(this),
|
|
400
451
|
onResizeMove: this.handleResizeMove.bind(this),
|
|
401
452
|
onResizeEnd: this.handleResizeEnd.bind(this),
|
|
453
|
+
onResizeKey: this.handleResizeKey.bind(this),
|
|
402
454
|
});
|
|
403
455
|
}
|
|
404
456
|
render() {
|
|
@@ -486,6 +538,22 @@ class MpSplitter extends LitElement {
|
|
|
486
538
|
getPanelSizes() {
|
|
487
539
|
return this.stateManager.getState().panelSizes;
|
|
488
540
|
}
|
|
541
|
+
/**
|
|
542
|
+
* Drive a keyboard-style resize on a divider programmatically. Used by the
|
|
543
|
+
* dock manager's intersection-handle keymap so a single keystroke can
|
|
544
|
+
* resize both the horizontal and vertical dividers a 2D handle sits on,
|
|
545
|
+
* without re-implementing the percent-step + clamp math here.
|
|
546
|
+
*
|
|
547
|
+
* `key` is one of the keys handled by the divider keymap
|
|
548
|
+
* (Arrow{Left,Right,Up,Down}, Home, End); `fine` halves the step (matches
|
|
549
|
+
* Shift modifier on the keyboard path).
|
|
550
|
+
*/
|
|
551
|
+
resizeDividerBy(dividerIndex, key, fine = false) {
|
|
552
|
+
const divider = this.dividers[dividerIndex];
|
|
553
|
+
if (!divider)
|
|
554
|
+
return;
|
|
555
|
+
this.handleResizeKey(key, fine, dividerIndex, divider);
|
|
556
|
+
}
|
|
489
557
|
setPanelSizes(sizes) {
|
|
490
558
|
this.applyPanelSizes(sizes);
|
|
491
559
|
this.stateManager.setPanelSizes(sizes);
|
|
@@ -508,6 +576,42 @@ class MpSplitter extends LitElement {
|
|
|
508
576
|
else {
|
|
509
577
|
this.removeAttribute('resizing');
|
|
510
578
|
}
|
|
579
|
+
this.updateDividerAriaValues();
|
|
580
|
+
});
|
|
581
|
+
}
|
|
582
|
+
/**
|
|
583
|
+
* Mirror current panel sizes to each divider's aria-valuenow / valuemin /
|
|
584
|
+
* valuemax as percent of container. Per §10 Q3 of the WC ARIA PRD: percent
|
|
585
|
+
* is more intuitive for SR users than pixels.
|
|
586
|
+
*
|
|
587
|
+
* Per-divider math: divider i sits between panels[i] and panels[i+1] and
|
|
588
|
+
* "owns" the size of panels[i]. valuemin = minPanelSize as % of container;
|
|
589
|
+
* valuemax = (panels[i].size + panels[i+1].size - minPanelSize) as %.
|
|
590
|
+
*/
|
|
591
|
+
updateDividerAriaValues() {
|
|
592
|
+
if (this.dividers.length === 0 || !this.container)
|
|
593
|
+
return;
|
|
594
|
+
const state = this.stateManager.getState();
|
|
595
|
+
const sizes = state.previewSizes ?? state.panelSizes;
|
|
596
|
+
if (sizes.length !== this.panelWrappers.length || sizes.length === 0)
|
|
597
|
+
return;
|
|
598
|
+
const rect = this.container.getBoundingClientRect();
|
|
599
|
+
const containerSize = this.orientation === 'horizontal' ? rect.width : rect.height;
|
|
600
|
+
if (containerSize <= 0)
|
|
601
|
+
return;
|
|
602
|
+
const minPanelSize = this.resizeManager.getMinPanelSize();
|
|
603
|
+
this.dividers.forEach((divider, i) => {
|
|
604
|
+
const before = sizes[i];
|
|
605
|
+
const after = sizes[i + 1];
|
|
606
|
+
if (before === undefined || after === undefined)
|
|
607
|
+
return;
|
|
608
|
+
const valuenow = Math.round((before / containerSize) * 100);
|
|
609
|
+
const valuemin = Math.round((minPanelSize / containerSize) * 100);
|
|
610
|
+
const pairTotal = before + after;
|
|
611
|
+
const valuemax = Math.round(((pairTotal - minPanelSize) / containerSize) * 100);
|
|
612
|
+
divider.setAttribute('aria-valuenow', String(valuenow));
|
|
613
|
+
divider.setAttribute('aria-valuemin', String(valuemin));
|
|
614
|
+
divider.setAttribute('aria-valuemax', String(valuemax));
|
|
511
615
|
});
|
|
512
616
|
}
|
|
513
617
|
updatePanelsFromSlot() {
|
|
@@ -521,9 +625,12 @@ class MpSplitter extends LitElement {
|
|
|
521
625
|
this.panelWrappers = [];
|
|
522
626
|
this.dividers = [];
|
|
523
627
|
// Create panel wrappers with slots for each child
|
|
628
|
+
const panelCount = children.length;
|
|
629
|
+
const dividerAriaOrientation = this.orientation === 'horizontal' ? 'vertical' : 'horizontal';
|
|
524
630
|
children.forEach((child, index) => {
|
|
525
631
|
const wrapper = document.createElement('div');
|
|
526
632
|
wrapper.className = 'panel-wrapper flex-grow';
|
|
633
|
+
wrapper.id = `${this.instanceId}-panel-${index}`;
|
|
527
634
|
// Create a named slot for this child
|
|
528
635
|
const namedSlot = document.createElement('slot');
|
|
529
636
|
const slotName = `panel-${index}`;
|
|
@@ -533,9 +640,14 @@ class MpSplitter extends LitElement {
|
|
|
533
640
|
this.panelWrappers.push(wrapper);
|
|
534
641
|
this.container.appendChild(wrapper);
|
|
535
642
|
// Add divider between panels
|
|
536
|
-
if (index <
|
|
643
|
+
if (index < panelCount - 1) {
|
|
537
644
|
const divider = document.createElement('div');
|
|
538
645
|
divider.className = 'divider';
|
|
646
|
+
divider.setAttribute('role', 'separator');
|
|
647
|
+
divider.setAttribute('aria-orientation', dividerAriaOrientation);
|
|
648
|
+
divider.setAttribute('tabindex', '0');
|
|
649
|
+
divider.setAttribute('aria-controls', `${this.instanceId}-panel-${index} ${this.instanceId}-panel-${index + 1}`);
|
|
650
|
+
divider.setAttribute('aria-label', `Resize between panel ${index + 1} and panel ${index + 2}`);
|
|
539
651
|
this.inputHandler.attachDividerListeners(divider, index);
|
|
540
652
|
this.dividers.push(divider);
|
|
541
653
|
this.container.appendChild(divider);
|
|
@@ -652,11 +764,16 @@ class MpSplitter extends LitElement {
|
|
|
652
764
|
const newSizes = stored.map((s) => s * scale);
|
|
653
765
|
this.applyPanelSizes(newSizes);
|
|
654
766
|
this.stateManager.setPanelSizes(newSizes);
|
|
767
|
+
this.updateDividerAriaValues();
|
|
655
768
|
}
|
|
656
769
|
updateContainerOrientation() {
|
|
657
770
|
if (!this.container)
|
|
658
771
|
return;
|
|
659
772
|
this.container.className = `splitter-container ${this.orientation}`;
|
|
773
|
+
const dividerAriaOrientation = this.orientation === 'horizontal' ? 'vertical' : 'horizontal';
|
|
774
|
+
this.dividers.forEach((divider) => {
|
|
775
|
+
divider.setAttribute('aria-orientation', dividerAriaOrientation);
|
|
776
|
+
});
|
|
660
777
|
}
|
|
661
778
|
handleResizeStart(event, dividerIndex, dividerElement) {
|
|
662
779
|
const sizes = this.resizeManager.computePanelSizes(this.panelWrappers, this.orientation);
|
|
@@ -703,6 +820,81 @@ class MpSplitter extends LitElement {
|
|
|
703
820
|
},
|
|
704
821
|
}));
|
|
705
822
|
}
|
|
823
|
+
/**
|
|
824
|
+
* Keyboard-driven resize on a focused divider. ArrowKeys ±10% (Shift = ±1%)
|
|
825
|
+
* along the splitter's axis; Home/End shrink/grow panelBefore to its limit.
|
|
826
|
+
* Fires resize-start → resize-end with the new sizes so consumers don't
|
|
827
|
+
* need to special-case keyboard vs. drag.
|
|
828
|
+
*/
|
|
829
|
+
handleResizeKey(key, fine, dividerIndex, dividerElement) {
|
|
830
|
+
if (!this.container)
|
|
831
|
+
return;
|
|
832
|
+
if (this.panelWrappers.length === 0)
|
|
833
|
+
return;
|
|
834
|
+
const sizes = [...this.stateManager.getState().panelSizes];
|
|
835
|
+
if (sizes.length !== this.panelWrappers.length)
|
|
836
|
+
return;
|
|
837
|
+
const before = sizes[dividerIndex];
|
|
838
|
+
const after = sizes[dividerIndex + 1];
|
|
839
|
+
if (before === undefined || after === undefined)
|
|
840
|
+
return;
|
|
841
|
+
const rect = this.container.getBoundingClientRect();
|
|
842
|
+
const containerSize = this.orientation === 'horizontal' ? rect.width : rect.height;
|
|
843
|
+
if (containerSize <= 0)
|
|
844
|
+
return;
|
|
845
|
+
const minPanelSize = this.resizeManager.getMinPanelSize();
|
|
846
|
+
const isHorizontal = this.orientation === 'horizontal';
|
|
847
|
+
const positive = isHorizontal ? 'ArrowRight' : 'ArrowDown';
|
|
848
|
+
const negative = isHorizontal ? 'ArrowLeft' : 'ArrowUp';
|
|
849
|
+
let direction = 0;
|
|
850
|
+
if (key === positive)
|
|
851
|
+
direction = 1;
|
|
852
|
+
else if (key === negative)
|
|
853
|
+
direction = -1;
|
|
854
|
+
let newBefore;
|
|
855
|
+
let newAfter;
|
|
856
|
+
if (key === 'Home') {
|
|
857
|
+
newBefore = minPanelSize;
|
|
858
|
+
newAfter = before + after - minPanelSize;
|
|
859
|
+
}
|
|
860
|
+
else if (key === 'End') {
|
|
861
|
+
newBefore = before + after - minPanelSize;
|
|
862
|
+
newAfter = minPanelSize;
|
|
863
|
+
}
|
|
864
|
+
else if (direction !== 0) {
|
|
865
|
+
const stepPercent = fine ? 1 : 10;
|
|
866
|
+
const deltaPx = (stepPercent / 100) * containerSize * direction;
|
|
867
|
+
newBefore = before + deltaPx;
|
|
868
|
+
newAfter = after - deltaPx;
|
|
869
|
+
// Clamp to min on both sides — symmetric with the pointer path in
|
|
870
|
+
// ResizeManager.calculatePreviewSizes.
|
|
871
|
+
if (newBefore < minPanelSize) {
|
|
872
|
+
newBefore = minPanelSize;
|
|
873
|
+
newAfter = before + after - minPanelSize;
|
|
874
|
+
}
|
|
875
|
+
else if (newAfter < minPanelSize) {
|
|
876
|
+
newAfter = minPanelSize;
|
|
877
|
+
newBefore = before + after - minPanelSize;
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
else {
|
|
881
|
+
// Off-axis arrow — silently ignored.
|
|
882
|
+
return;
|
|
883
|
+
}
|
|
884
|
+
if (newBefore === before && newAfter === after)
|
|
885
|
+
return;
|
|
886
|
+
sizes[dividerIndex] = newBefore;
|
|
887
|
+
sizes[dividerIndex + 1] = newAfter;
|
|
888
|
+
this.applyPanelSizes(sizes);
|
|
889
|
+
this.stateManager.setPanelSizes(sizes);
|
|
890
|
+
this.updateDividerAriaValues();
|
|
891
|
+
dividerElement.classList.add('active');
|
|
892
|
+
queueMicrotask(() => dividerElement.classList.remove('active'));
|
|
893
|
+
this.dispatchEvent(new CustomEvent('resize-end', {
|
|
894
|
+
bubbles: true,
|
|
895
|
+
detail: { sizes, orientation: this.orientation },
|
|
896
|
+
}));
|
|
897
|
+
}
|
|
706
898
|
applyPanelSizes(sizes) {
|
|
707
899
|
const sizeProperty = this.orientation === 'horizontal' ? 'width' : 'height';
|
|
708
900
|
const resetProperty = this.orientation === 'horizontal' ? 'height' : 'width';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mintplayer-ng-bootstrap-web-components-splitter.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/src/types/resize-operation.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/src/state/splitter-state.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/src/input/pointer-event.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/src/input/input-handler.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/src/managers/resize-manager.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/src/styles/splitter.styles.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/src/components/mp-splitter.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/src/index.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/mintplayer-ng-bootstrap-web-components-splitter.ts"],"sourcesContent":["import type { Point } from './point';\n\nexport enum ResizeState {\n Idle = 'idle',\n Resizing = 'resizing',\n}\n\nexport interface ResizeOperation {\n state: ResizeState;\n startPosition: Point;\n sizes: number[];\n indexBefore: number;\n indexAfter: number;\n dividerElement: HTMLElement | null;\n}\n","import type { Direction, ResizeOperation } from '../types';\nimport { ResizeState } from '../types';\n\nexport interface SplitterState {\n orientation: Direction;\n panelSizes: number[];\n previewSizes: number[] | null;\n resizeOperation: ResizeOperation | null;\n}\n\nexport type SplitterStateListener = (state: SplitterState) => void;\n\nexport class SplitterStateManager {\n private state: SplitterState;\n private listeners: Set<SplitterStateListener> = new Set();\n\n constructor(initialState?: Partial<SplitterState>) {\n this.state = {\n orientation: 'horizontal',\n panelSizes: [],\n previewSizes: null,\n resizeOperation: null,\n ...initialState,\n };\n }\n\n getState(): SplitterState {\n return { ...this.state };\n }\n\n subscribe(listener: SplitterStateListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private notifyListeners(): void {\n const stateCopy = this.getState();\n for (const listener of this.listeners) {\n listener(stateCopy);\n }\n }\n\n setOrientation(orientation: Direction): void {\n if (this.state.orientation !== orientation) {\n this.state = { ...this.state, orientation };\n this.notifyListeners();\n }\n }\n\n setPanelSizes(sizes: number[]): void {\n this.state = { ...this.state, panelSizes: [...sizes] };\n this.notifyListeners();\n }\n\n setPreviewSizes(sizes: number[] | null): void {\n this.state = { ...this.state, previewSizes: sizes ? [...sizes] : null };\n this.notifyListeners();\n }\n\n startResize(operation: ResizeOperation): void {\n this.state = {\n ...this.state,\n resizeOperation: { ...operation },\n };\n this.notifyListeners();\n }\n\n updateResize(previewSizes: number[]): void {\n this.state = {\n ...this.state,\n previewSizes: [...previewSizes],\n };\n this.notifyListeners();\n }\n\n endResize(finalSizes: number[]): void {\n this.state = {\n ...this.state,\n panelSizes: [...finalSizes],\n previewSizes: null,\n resizeOperation: null,\n };\n this.notifyListeners();\n }\n\n cancelResize(): void {\n this.state = {\n ...this.state,\n previewSizes: null,\n resizeOperation: null,\n };\n this.notifyListeners();\n }\n\n isResizing(): boolean {\n return this.state.resizeOperation?.state === ResizeState.Resizing;\n }\n}\n","import type { Point } from '../types';\n\nexport interface NormalizedPointerEvent {\n clientX: number;\n clientY: number;\n point: Point;\n originalEvent: MouseEvent | TouchEvent;\n isTouch: boolean;\n}\n\nexport function normalizePointerEvent(\n event: MouseEvent | TouchEvent\n): NormalizedPointerEvent {\n const isTouch = 'touches' in event;\n\n let clientX: number;\n let clientY: number;\n\n if (isTouch) {\n const touch = (event as TouchEvent).touches[0] || (event as TouchEvent).changedTouches[0];\n clientX = touch.clientX;\n clientY = touch.clientY;\n } else {\n clientX = (event as MouseEvent).clientX;\n clientY = (event as MouseEvent).clientY;\n }\n\n return {\n clientX,\n clientY,\n point: { x: clientX, y: clientY },\n originalEvent: event,\n isTouch,\n };\n}\n","import type { NormalizedPointerEvent } from './pointer-event';\nimport { normalizePointerEvent } from './pointer-event';\n\nexport interface InputHandlerCallbacks {\n onResizeStart: (event: NormalizedPointerEvent, dividerIndex: number, dividerElement: HTMLElement) => void;\n onResizeMove: (event: NormalizedPointerEvent) => void;\n onResizeEnd: (event: NormalizedPointerEvent) => void;\n}\n\nexport class InputHandler {\n private isActive = false;\n private currentDividerIndex = -1;\n private currentDividerElement: HTMLElement | null = null;\n private callbacks: InputHandlerCallbacks;\n\n private boundMouseMove: (e: MouseEvent) => void;\n private boundMouseUp: (e: MouseEvent) => void;\n private boundTouchMove: (e: TouchEvent) => void;\n private boundTouchEnd: (e: TouchEvent) => void;\n\n constructor(callbacks: InputHandlerCallbacks) {\n this.callbacks = callbacks;\n\n this.boundMouseMove = this.handleMouseMove.bind(this);\n this.boundMouseUp = this.handleMouseUp.bind(this);\n this.boundTouchMove = this.handleTouchMove.bind(this);\n this.boundTouchEnd = this.handleTouchEnd.bind(this);\n }\n\n attachDividerListeners(divider: HTMLElement, index: number): void {\n divider.addEventListener('mousedown', (e) => this.handleMouseDown(e, index, divider));\n divider.addEventListener('touchstart', (e) => this.handleTouchStart(e, index, divider), { passive: false });\n }\n\n private handleMouseDown(event: MouseEvent, dividerIndex: number, dividerElement: HTMLElement): void {\n event.preventDefault();\n this.startResize(event, dividerIndex, dividerElement);\n\n document.addEventListener('mousemove', this.boundMouseMove);\n document.addEventListener('mouseup', this.boundMouseUp);\n }\n\n private handleMouseMove(event: MouseEvent): void {\n if (!this.isActive) return;\n event.preventDefault();\n this.callbacks.onResizeMove(normalizePointerEvent(event));\n }\n\n private handleMouseUp(event: MouseEvent): void {\n if (!this.isActive) return;\n this.endResize(event);\n\n document.removeEventListener('mousemove', this.boundMouseMove);\n document.removeEventListener('mouseup', this.boundMouseUp);\n }\n\n private handleTouchStart(event: TouchEvent, dividerIndex: number, dividerElement: HTMLElement): void {\n event.preventDefault();\n this.startResize(event, dividerIndex, dividerElement);\n\n document.addEventListener('touchmove', this.boundTouchMove, { passive: false });\n document.addEventListener('touchend', this.boundTouchEnd);\n document.addEventListener('touchcancel', this.boundTouchEnd);\n }\n\n private handleTouchMove(event: TouchEvent): void {\n if (!this.isActive) return;\n event.preventDefault();\n this.callbacks.onResizeMove(normalizePointerEvent(event));\n }\n\n private handleTouchEnd(event: TouchEvent): void {\n if (!this.isActive) return;\n this.endResize(event);\n\n document.removeEventListener('touchmove', this.boundTouchMove);\n document.removeEventListener('touchend', this.boundTouchEnd);\n document.removeEventListener('touchcancel', this.boundTouchEnd);\n }\n\n private startResize(event: MouseEvent | TouchEvent, dividerIndex: number, dividerElement: HTMLElement): void {\n this.isActive = true;\n this.currentDividerIndex = dividerIndex;\n this.currentDividerElement = dividerElement;\n this.callbacks.onResizeStart(normalizePointerEvent(event), dividerIndex, dividerElement);\n }\n\n private endResize(event: MouseEvent | TouchEvent): void {\n this.callbacks.onResizeEnd(normalizePointerEvent(event));\n this.isActive = false;\n this.currentDividerIndex = -1;\n this.currentDividerElement = null;\n }\n\n dispose(): void {\n document.removeEventListener('mousemove', this.boundMouseMove);\n document.removeEventListener('mouseup', this.boundMouseUp);\n\n document.removeEventListener('touchmove', this.boundTouchMove);\n document.removeEventListener('touchend', this.boundTouchEnd);\n document.removeEventListener('touchcancel', this.boundTouchEnd);\n\n this.isActive = false;\n this.currentDividerIndex = -1;\n this.currentDividerElement = null;\n }\n\n getIsActive(): boolean {\n return this.isActive;\n }\n}\n","import type { Direction, Point, ResizeOperation } from '../types';\nimport { ResizeState } from '../types';\n\nexport interface ResizeManagerOptions {\n minPanelSize?: number;\n}\n\nexport class ResizeManager {\n private options: Required<ResizeManagerOptions>;\n\n constructor(options: ResizeManagerOptions = {}) {\n this.options = {\n minPanelSize: options.minPanelSize ?? 50,\n };\n }\n\n computePanelSizes(\n panels: HTMLElement[],\n orientation: Direction\n ): number[] {\n return panels.map((panel) => {\n const rect = panel.getBoundingClientRect();\n return orientation === 'horizontal' ? rect.width : rect.height;\n });\n }\n\n createResizeOperation(\n startPoint: Point,\n currentSizes: number[],\n dividerIndex: number,\n dividerElement: HTMLElement\n ): ResizeOperation {\n return {\n state: ResizeState.Resizing,\n startPosition: { ...startPoint },\n sizes: [...currentSizes],\n indexBefore: dividerIndex,\n indexAfter: dividerIndex + 1,\n dividerElement,\n };\n }\n\n calculatePreviewSizes(\n operation: ResizeOperation,\n currentPoint: Point,\n orientation: Direction\n ): number[] {\n const { startPosition, sizes, indexBefore, indexAfter } = operation;\n const delta =\n orientation === 'horizontal'\n ? currentPoint.x - startPosition.x\n : currentPoint.y - startPosition.y;\n\n const newSizes = [...sizes];\n const sizeBefore = sizes[indexBefore];\n const sizeAfter = sizes[indexAfter];\n\n let newSizeBefore = sizeBefore + delta;\n let newSizeAfter = sizeAfter - delta;\n\n // Apply minimum size constraints\n if (newSizeBefore < this.options.minPanelSize) {\n const adjustment = this.options.minPanelSize - newSizeBefore;\n newSizeBefore = this.options.minPanelSize;\n newSizeAfter -= adjustment;\n }\n\n if (newSizeAfter < this.options.minPanelSize) {\n const adjustment = this.options.minPanelSize - newSizeAfter;\n newSizeAfter = this.options.minPanelSize;\n newSizeBefore -= adjustment;\n }\n\n // Final clamp\n newSizeBefore = Math.max(newSizeBefore, this.options.minPanelSize);\n newSizeAfter = Math.max(newSizeAfter, this.options.minPanelSize);\n\n newSizes[indexBefore] = newSizeBefore;\n newSizes[indexAfter] = newSizeAfter;\n\n return newSizes;\n }\n\n setMinPanelSize(size: number): void {\n this.options.minPanelSize = size;\n }\n\n getMinPanelSize(): number {\n return this.options.minPanelSize;\n }\n}\n","// AUTO-GENERATED — do not edit by hand.\n// Source: splitter.styles.scss\n// Regenerate with the codegen-wc Nx target.\n\nimport { unsafeCSS } from 'lit';\n\nexport const splitterStyles = unsafeCSS(`:host {\n display: block;\n width: 100%;\n height: 100%;\n --mp-splitter-size: 8px;\n --mp-splitter-thumb-margin: 3px;\n --mp-splitter-divider-color: #eee;\n --mp-splitter-divider-hover-color: #1389fd;\n}\n\n:host([touch-mode]) {\n --mp-splitter-thumb-margin: 20px;\n}\n\n* {\n box-sizing: border-box;\n}\n\n.splitter-container {\n display: flex;\n width: 100%;\n height: 100%;\n}\n\n.splitter-container.horizontal {\n flex-direction: row;\n}\n\n.splitter-container.vertical {\n flex-direction: column;\n}\n\n.panel-wrapper {\n overflow: hidden;\n position: relative;\n}\n\n.panel-wrapper.flex-grow {\n flex: 1 1 0;\n}\n\n/* Divider base styles */\n.divider {\n flex-shrink: 0;\n transition: background-color 0.15s ease-in-out;\n z-index: 3;\n touch-action: none;\n}\n\n.divider::before {\n content: \"\";\n display: block;\n background-color: var(--mp-splitter-divider-color);\n background-position: center center;\n background-repeat: no-repeat;\n}\n\n.divider:hover::before,\n.divider.active::before {\n background-color: var(--mp-splitter-divider-hover-color);\n border-radius: calc(var(--mp-splitter-size) / 2);\n}\n\n/* Horizontal splitter styles */\n.splitter-container.horizontal > .divider {\n width: calc(var(--mp-splitter-size) + 2 * var(--mp-splitter-thumb-margin));\n height: 100%;\n cursor: col-resize;\n border-left: var(--mp-splitter-thumb-margin) solid transparent;\n border-right: var(--mp-splitter-thumb-margin) solid transparent;\n}\n\n.splitter-container.horizontal > .divider::before {\n height: 100%;\n width: var(--mp-splitter-size);\n margin: 0 auto;\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==);\n}\n\n.splitter-container.horizontal > .panel-wrapper:not(:first-child) {\n margin-left: calc(-1 * var(--mp-splitter-thumb-margin));\n}\n\n.splitter-container.horizontal > .panel-wrapper:not(:last-child) {\n margin-right: calc(-1 * var(--mp-splitter-thumb-margin));\n}\n\n/* Vertical splitter styles */\n.splitter-container.vertical > .divider {\n width: 100%;\n height: calc(var(--mp-splitter-size) + 2 * var(--mp-splitter-thumb-margin));\n cursor: row-resize;\n border-top: var(--mp-splitter-thumb-margin) solid transparent;\n border-bottom: var(--mp-splitter-thumb-margin) solid transparent;\n}\n\n.splitter-container.vertical > .divider::before {\n height: var(--mp-splitter-size);\n width: 100%;\n margin: auto 0;\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFCAMAAABl/6zIAAAABlBMVEUAAADMzMzIT8AyAAAAAXRSTlMAQObYZgAAABRJREFUeAFjYGRkwIMJSeMHlBkOABP7AEGzSuPKAAAAAElFTkSuQmCC);\n}\n\n.splitter-container.vertical > .panel-wrapper:not(:first-child) {\n margin-top: calc(-1 * var(--mp-splitter-thumb-margin));\n}\n\n.splitter-container.vertical > .panel-wrapper:not(:last-child) {\n margin-bottom: calc(-1 * var(--mp-splitter-thumb-margin));\n}\n\n/* Resizing state */\n:host([resizing]) .splitter-container {\n cursor: col-resize;\n user-select: none;\n}\n\n:host([resizing]) .splitter-container.vertical {\n cursor: row-resize;\n}\n\n/* Slot content styling */\n::slotted(*) {\n width: 100%;\n height: 100%;\n}`);\nexport default splitterStyles;\n","import { LitElement, html, type TemplateResult } from 'lit';\nimport { SplitterStateManager } from '../state';\nimport { InputHandler } from '../input';\nimport { ResizeManager } from '../managers';\nimport { splitterStyles } from '../styles';\nimport type { Direction, Point } from '../types';\n\nexport interface SplitterResizeEventDetail {\n sizes: number[];\n orientation: Direction;\n}\n\nexport class MpSplitter extends LitElement {\n static override styles = [splitterStyles];\n\n static override get observedAttributes(): string[] {\n return [\n ...(super.observedAttributes ?? []),\n 'orientation',\n 'min-panel-size',\n 'touch-mode',\n ];\n }\n\n private stateManager: SplitterStateManager;\n private inputHandler: InputHandler;\n private resizeManager: ResizeManager;\n\n private container: HTMLDivElement | null = null;\n private panelWrappers: HTMLDivElement[] = [];\n private dividers: HTMLDivElement[] = [];\n private slotElement: HTMLSlotElement | null = null;\n\n private mutationObserver: MutationObserver | null = null;\n private containerResizeObserver: ResizeObserver | null = null;\n private unsubscribeState: (() => void) | null = null;\n\n constructor() {\n super();\n\n this.stateManager = new SplitterStateManager();\n this.resizeManager = new ResizeManager();\n\n this.inputHandler = new InputHandler({\n onResizeStart: this.handleResizeStart.bind(this),\n onResizeMove: this.handleResizeMove.bind(this),\n onResizeEnd: this.handleResizeEnd.bind(this),\n });\n }\n\n override render(): TemplateResult {\n return html`\n <div class=\"splitter-container\"></div>\n <slot></slot>\n `;\n }\n\n protected override firstUpdated(): void {\n this.container = this.shadowRoot!.querySelector('.splitter-container') as HTMLDivElement;\n this.container.classList.add(this.orientation);\n\n this.slotElement = this.shadowRoot!.querySelector('slot') as HTMLSlotElement;\n // Hide the default slot - we'll project content ourselves via named slots.\n this.slotElement.style.display = 'none';\n this.slotElement.addEventListener('slotchange', () => {\n this.updatePanelsFromSlot();\n });\n\n this.setupMutationObserver();\n this.subscribeToState();\n this.setupContainerResizeObserver();\n\n // Initial setup after first render\n requestAnimationFrame(() => {\n this.updatePanelsFromSlot();\n });\n }\n\n override disconnectedCallback(): void {\n this.inputHandler.dispose();\n\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n this.mutationObserver = null;\n }\n\n if (this.containerResizeObserver) {\n this.containerResizeObserver.disconnect();\n this.containerResizeObserver = null;\n }\n\n if (this.unsubscribeState) {\n this.unsubscribeState();\n this.unsubscribeState = null;\n }\n super.disconnectedCallback();\n }\n\n override attributeChangedCallback(\n name: string,\n oldValue: string | null,\n newValue: string | null\n ): void {\n super.attributeChangedCallback(name, oldValue, newValue);\n if (oldValue === newValue) return;\n\n switch (name) {\n case 'orientation':\n this.stateManager.setOrientation(\n (newValue as Direction) || 'horizontal'\n );\n this.updateContainerOrientation();\n break;\n case 'min-panel-size':\n const parsedSize = newValue ? parseInt(newValue, 10) : 50;\n this.resizeManager.setMinPanelSize(!isNaN(parsedSize) ? parsedSize : 50);\n break;\n case 'touch-mode':\n // Handled by CSS via :host([touch-mode])\n break;\n }\n }\n\n // Public API\n get orientation(): Direction {\n return (this.getAttribute('orientation') as Direction) || 'horizontal';\n }\n\n set orientation(value: Direction) {\n this.setAttribute('orientation', value);\n }\n\n get minPanelSize(): number {\n const attr = this.getAttribute('min-panel-size');\n return attr ? parseInt(attr, 10) : 50;\n }\n\n set minPanelSize(value: number) {\n this.setAttribute('min-panel-size', String(value));\n }\n\n get touchMode(): boolean {\n return this.hasAttribute('touch-mode');\n }\n\n set touchMode(value: boolean) {\n if (value) {\n this.setAttribute('touch-mode', '');\n } else {\n this.removeAttribute('touch-mode');\n }\n }\n\n getPanelSizes(): number[] {\n return this.stateManager.getState().panelSizes;\n }\n\n setPanelSizes(sizes: number[]): void {\n this.applyPanelSizes(sizes);\n this.stateManager.setPanelSizes(sizes);\n }\n\n // Private methods\n private setupMutationObserver(): void {\n this.mutationObserver = new MutationObserver(() => {\n this.updatePanelsFromSlot();\n });\n\n this.mutationObserver.observe(this, {\n childList: true,\n subtree: false,\n });\n }\n\n private subscribeToState(): void {\n this.unsubscribeState = this.stateManager.subscribe((state) => {\n if (state.resizeOperation) {\n this.setAttribute('resizing', '');\n } else {\n this.removeAttribute('resizing');\n }\n });\n }\n\n private updatePanelsFromSlot(): void {\n if (!this.container) return;\n\n const children = Array.from(this.children).filter(\n (child) => child instanceof HTMLElement\n ) as HTMLElement[];\n\n if (children.length === 0) return;\n\n // Clear existing wrappers and dividers\n this.container.innerHTML = '';\n this.panelWrappers = [];\n this.dividers = [];\n\n // Create panel wrappers with slots for each child\n children.forEach((child, index) => {\n const wrapper = document.createElement('div');\n wrapper.className = 'panel-wrapper flex-grow';\n\n // Create a named slot for this child\n const namedSlot = document.createElement('slot');\n const slotName = `panel-${index}`;\n namedSlot.name = slotName;\n child.slot = slotName;\n\n wrapper.appendChild(namedSlot);\n this.panelWrappers.push(wrapper);\n this.container!.appendChild(wrapper);\n\n // Add divider between panels\n if (index < children.length - 1) {\n const divider = document.createElement('div');\n divider.className = 'divider';\n this.inputHandler.attachDividerListeners(divider, index);\n this.dividers.push(divider);\n this.container!.appendChild(divider);\n }\n });\n\n // Re-apply previously-stored sizes when the panel count still matches.\n // Two cases where this matters:\n // 1. setPanelSizes() was called before firstUpdated's raf populated\n // the wrappers (e.g., the dock schedules its own raf inside\n // renderSplit) — without this, the early call is silently dropped.\n // 2. Slot children change after a drag (e.g., layout re-render) — the\n // wrappers get recreated with `flex: 1 1 0` (equal sizes) and would\n // otherwise discard the user's drag result.\n const storedSizes = this.stateManager.getState().panelSizes;\n if (storedSizes.length > 0 && storedSizes.length === this.panelWrappers.length) {\n this.applyPanelSizes(storedSizes);\n // Consumer-supplied sizes (e.g., from the dock's renderSplit) often\n // sum to the full container size because the consumer doesn't know\n // mp-splitter's internal divider widths. Defer one raf so dividers\n // have laid out, then rescale stored sizes against the actual panel\n // space (container - dividers). Without this step ResizeObserver\n // alone can't catch the discrepancy because the container size\n // hasn't changed — only the panel/divider split inside it has.\n requestAnimationFrame(() => this.handleContainerResize());\n return;\n }\n\n // No stored sizes (or count mismatch) — pin from the measured layout\n // once the browser has run layout for the new wrappers. A nested raf\n // is needed because the wrappers were created in this very turn and\n // their getBoundingClientRect would return 0 if read synchronously.\n requestAnimationFrame(() => {\n const current = this.stateManager.getState().panelSizes;\n if (current.length === this.panelWrappers.length && current.length > 0) {\n // A consumer (e.g., the dock) called setPanelSizes() between our\n // raf scheduling and execution. Honour their values instead of\n // overwriting with measurements.\n this.applyPanelSizes(current);\n return;\n }\n this.pinSizesFromCurrentLayout();\n });\n }\n\n /**\n * Read each panel-wrapper's measured pixel size and persist it as the\n * authoritative panel size. After this runs, every wrapper carries an\n * inline `width` (or `height`) — content intrinsic size cannot leak into\n * the parent flex container, so a nested splitter's drag does not shift\n * the parent's layout.\n */\n private pinSizesFromCurrentLayout(): void {\n if (this.panelWrappers.length === 0) return;\n const sizeProperty = this.orientation === 'horizontal' ? 'width' : 'height';\n const measured = this.panelWrappers.map(\n (wrapper) => wrapper.getBoundingClientRect()[sizeProperty]\n );\n // Layout hasn't run yet for these wrappers — bail rather than write\n // 0 px sizes that would collapse every panel.\n if (measured.every((v) => v <= 0)) return;\n this.applyPanelSizes(measured);\n this.stateManager.setPanelSizes(measured);\n }\n\n private setupContainerResizeObserver(): void {\n if (!this.container || typeof ResizeObserver === 'undefined') return;\n this.containerResizeObserver = new ResizeObserver(() => {\n this.handleContainerResize();\n });\n this.containerResizeObserver.observe(this.container);\n }\n\n /**\n * When the splitter's container resizes (window resize, parent splitter\n * pinning its sizes, etc.), scale every panel-wrapper proportionally so\n * the existing ratios are preserved. Without this we'd be stuck with the\n * original pixel sizes when the surrounding viewport changes — what\n * `flex-basis: 0` gave master \"for free\".\n */\n private handleContainerResize(): void {\n if (!this.container || this.panelWrappers.length === 0) return;\n // applyPanelSizes runs continuously during a drag; its writes can fire\n // ResizeObserver via subpixel rounding. The drag math already keeps\n // panels summing to the container — don't fight it.\n if (this.stateManager.isResizing()) return;\n\n const stored = this.stateManager.getState().panelSizes;\n if (stored.length === 0 || stored.length !== this.panelWrappers.length) return;\n\n const rect = this.container.getBoundingClientRect();\n const containerSize = this.orientation === 'horizontal' ? rect.width : rect.height;\n if (containerSize <= 0) return;\n\n const dividerProperty = this.orientation === 'horizontal' ? 'width' : 'height';\n const dividerTotal = this.dividers.reduce(\n (sum, divider) => sum + divider.getBoundingClientRect()[dividerProperty],\n 0\n );\n // Adjacent panel-wrappers carry negative margins (`margin-left` /\n // `margin-right` of `-thumb-margin`) so they visually overlap the\n // divider's transparent borders. In the flex calculation those negative\n // margins reduce a divider's effective width contribution; if we ignore\n // them we under-target by 2 * (N-1) * thumb px and the container gets\n // a gap at the trailing edge.\n const startMarginProp = this.orientation === 'horizontal' ? 'marginLeft' : 'marginTop';\n const endMarginProp = this.orientation === 'horizontal' ? 'marginRight' : 'marginBottom';\n const marginTotal = this.panelWrappers.reduce((sum, wrapper) => {\n const cs = getComputedStyle(wrapper);\n return sum + parseFloat(cs[startMarginProp]) + parseFloat(cs[endMarginProp]);\n }, 0);\n const targetPanelTotal = Math.max(0, containerSize - dividerTotal - marginTotal);\n const previousPanelTotal = stored.reduce((a, b) => a + b, 0);\n if (previousPanelTotal <= 0) return;\n\n // Below 1 px we'd be amplifying our own subpixel writes. Skip.\n if (Math.abs(targetPanelTotal - previousPanelTotal) < 1) return;\n\n const scale = targetPanelTotal / previousPanelTotal;\n const newSizes = stored.map((s) => s * scale);\n this.applyPanelSizes(newSizes);\n this.stateManager.setPanelSizes(newSizes);\n }\n\n private updateContainerOrientation(): void {\n if (!this.container) return;\n\n this.container.className = `splitter-container ${this.orientation}`;\n }\n\n private handleResizeStart(\n event: { point: Point; originalEvent: MouseEvent | TouchEvent },\n dividerIndex: number,\n dividerElement: HTMLElement\n ): void {\n const sizes = this.resizeManager.computePanelSizes(\n this.panelWrappers,\n this.orientation\n );\n\n const operation = this.resizeManager.createResizeOperation(\n event.point,\n sizes,\n dividerIndex,\n dividerElement\n );\n\n this.stateManager.startResize(operation);\n dividerElement.classList.add('active');\n\n this.dispatchEvent(\n new CustomEvent<SplitterResizeEventDetail>('resize-start', {\n bubbles: true,\n detail: {\n sizes,\n orientation: this.orientation,\n },\n })\n );\n }\n\n private handleResizeMove(event: {\n point: Point;\n originalEvent: MouseEvent | TouchEvent;\n }): void {\n const state = this.stateManager.getState();\n if (!state.resizeOperation) return;\n\n const previewSizes = this.resizeManager.calculatePreviewSizes(\n state.resizeOperation,\n event.point,\n this.orientation\n );\n\n this.stateManager.updateResize(previewSizes);\n this.applyPanelSizes(previewSizes);\n\n this.dispatchEvent(\n new CustomEvent<SplitterResizeEventDetail>('resizing', {\n bubbles: true,\n detail: {\n sizes: previewSizes,\n orientation: this.orientation,\n },\n })\n );\n }\n\n private handleResizeEnd(_event: {\n point: Point;\n originalEvent: MouseEvent | TouchEvent;\n }): void {\n const state = this.stateManager.getState();\n if (!state.resizeOperation) return;\n\n const finalSizes = state.previewSizes || state.resizeOperation.sizes;\n\n if (state.resizeOperation.dividerElement) {\n state.resizeOperation.dividerElement.classList.remove('active');\n }\n\n this.stateManager.endResize(finalSizes);\n\n this.dispatchEvent(\n new CustomEvent<SplitterResizeEventDetail>('resize-end', {\n bubbles: true,\n detail: {\n sizes: finalSizes,\n orientation: this.orientation,\n },\n })\n );\n }\n\n private applyPanelSizes(sizes: number[]): void {\n const sizeProperty = this.orientation === 'horizontal' ? 'width' : 'height';\n const resetProperty =\n this.orientation === 'horizontal' ? 'height' : 'width';\n\n this.panelWrappers.forEach((wrapper, index) => {\n if (sizes[index] !== undefined) {\n wrapper.style[sizeProperty] = `${sizes[index]}px`;\n wrapper.style[resetProperty] = '';\n wrapper.classList.remove('flex-grow');\n }\n });\n }\n}\n\n// Auto-register the custom element\nif (\n typeof customElements !== 'undefined' &&\n !customElements.get('mp-splitter')\n) {\n customElements.define('mp-splitter', MpSplitter);\n}\n","// Main component export\nexport { MpSplitter } from './components';\nexport type { SplitterResizeEventDetail } from './components';\n\n// State management\nexport { SplitterStateManager } from './state';\nexport type { SplitterState, SplitterStateListener } from './state';\n\n// Types\nexport type { Direction, Point, ResizeOperation, PanelInfo } from './types';\nexport { ResizeState } from './types';\n\n// Managers\nexport { ResizeManager } from './managers';\nexport type { ResizeManagerOptions } from './managers';\n\n// Input handling\nexport { InputHandler, normalizePointerEvent } from './input';\nexport type { InputHandlerCallbacks, NormalizedPointerEvent } from './input';\n\n// Styles (for custom styling extensions)\nexport { splitterStyles } from './styles';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;IAEY;AAAZ,CAAA,UAAY,WAAW,EAAA;AACrB,IAAA,WAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,WAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACvB,CAAC,EAHW,WAAW,KAAX,WAAW,GAAA,EAAA,CAAA,CAAA;;MCUV,oBAAoB,CAAA;AAI/B,IAAA,WAAA,CAAY,YAAqC,EAAA;AAFzC,QAAA,IAAA,CAAA,SAAS,GAA+B,IAAI,GAAG,EAAE;QAGvD,IAAI,CAAC,KAAK,GAAG;AACX,YAAA,WAAW,EAAE,YAAY;AACzB,YAAA,UAAU,EAAE,EAAE;AACd,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,eAAe,EAAE,IAAI;AACrB,YAAA,GAAG,YAAY;SAChB;IACH;IAEA,QAAQ,GAAA;AACN,QAAA,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE;IAC1B;AAEA,IAAA,SAAS,CAAC,QAA+B,EAAA;AACvC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC5B,QAAA,OAAO,MAAK;AACV,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;AACjC,QAAA,CAAC;IACH;IAEQ,eAAe,GAAA;AACrB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE;AACjC,QAAA,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE;YACrC,QAAQ,CAAC,SAAS,CAAC;QACrB;IACF;AAEA,IAAA,cAAc,CAAC,WAAsB,EAAA;QACnC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,KAAK,WAAW,EAAE;YAC1C,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE;YAC3C,IAAI,CAAC,eAAe,EAAE;QACxB;IACF;AAEA,IAAA,aAAa,CAAC,KAAe,EAAA;AAC3B,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE;QACtD,IAAI,CAAC,eAAe,EAAE;IACxB;AAEA,IAAA,eAAe,CAAC,KAAsB,EAAA;QACpC,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,EAAE;QACvE,IAAI,CAAC,eAAe,EAAE;IACxB;AAEA,IAAA,WAAW,CAAC,SAA0B,EAAA;QACpC,IAAI,CAAC,KAAK,GAAG;YACX,GAAG,IAAI,CAAC,KAAK;AACb,YAAA,eAAe,EAAE,EAAE,GAAG,SAAS,EAAE;SAClC;QACD,IAAI,CAAC,eAAe,EAAE;IACxB;AAEA,IAAA,YAAY,CAAC,YAAsB,EAAA;QACjC,IAAI,CAAC,KAAK,GAAG;YACX,GAAG,IAAI,CAAC,KAAK;AACb,YAAA,YAAY,EAAE,CAAC,GAAG,YAAY,CAAC;SAChC;QACD,IAAI,CAAC,eAAe,EAAE;IACxB;AAEA,IAAA,SAAS,CAAC,UAAoB,EAAA;QAC5B,IAAI,CAAC,KAAK,GAAG;YACX,GAAG,IAAI,CAAC,KAAK;AACb,YAAA,UAAU,EAAE,CAAC,GAAG,UAAU,CAAC;AAC3B,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,eAAe,EAAE,IAAI;SACtB;QACD,IAAI,CAAC,eAAe,EAAE;IACxB;IAEA,YAAY,GAAA;QACV,IAAI,CAAC,KAAK,GAAG;YACX,GAAG,IAAI,CAAC,KAAK;AACb,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,eAAe,EAAE,IAAI;SACtB;QACD,IAAI,CAAC,eAAe,EAAE;IACxB;IAEA,UAAU,GAAA;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,KAAK,WAAW,CAAC,QAAQ;IACnE;AACD;;ACzFK,SAAU,qBAAqB,CACnC,KAA8B,EAAA;AAE9B,IAAA,MAAM,OAAO,GAAG,SAAS,IAAI,KAAK;AAElC,IAAA,IAAI,OAAe;AACnB,IAAA,IAAI,OAAe;IAEnB,IAAI,OAAO,EAAE;AACX,QAAA,MAAM,KAAK,GAAI,KAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAK,KAAoB,CAAC,cAAc,CAAC,CAAC,CAAC;AACzF,QAAA,OAAO,GAAG,KAAK,CAAC,OAAO;AACvB,QAAA,OAAO,GAAG,KAAK,CAAC,OAAO;IACzB;SAAO;AACL,QAAA,OAAO,GAAI,KAAoB,CAAC,OAAO;AACvC,QAAA,OAAO,GAAI,KAAoB,CAAC,OAAO;IACzC;IAEA,OAAO;QACL,OAAO;QACP,OAAO;QACP,KAAK,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE;AACjC,QAAA,aAAa,EAAE,KAAK;QACpB,OAAO;KACR;AACH;;MCzBa,YAAY,CAAA;AAWvB,IAAA,WAAA,CAAY,SAAgC,EAAA;QAVpC,IAAA,CAAA,QAAQ,GAAG,KAAK;QAChB,IAAA,CAAA,mBAAmB,GAAG,CAAC,CAAC;QACxB,IAAA,CAAA,qBAAqB,GAAuB,IAAI;AAStD,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;QAE1B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;QACrD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QACjD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;QACrD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;IACrD;IAEA,sBAAsB,CAAC,OAAoB,EAAE,KAAa,EAAA;QACxD,OAAO,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACrF,OAAO,CAAC,gBAAgB,CAAC,YAAY,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC7G;AAEQ,IAAA,eAAe,CAAC,KAAiB,EAAE,YAAoB,EAAE,cAA2B,EAAA;QAC1F,KAAK,CAAC,cAAc,EAAE;QACtB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,cAAc,CAAC;QAErD,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC;QAC3D,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC;IACzD;AAEQ,IAAA,eAAe,CAAC,KAAiB,EAAA;QACvC,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;QACpB,KAAK,CAAC,cAAc,EAAE;QACtB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC3D;AAEQ,IAAA,aAAa,CAAC,KAAiB,EAAA;QACrC,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;AACpB,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAErB,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC;QAC9D,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC;IAC5D;AAEQ,IAAA,gBAAgB,CAAC,KAAiB,EAAE,YAAoB,EAAE,cAA2B,EAAA;QAC3F,KAAK,CAAC,cAAc,EAAE;QACtB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,cAAc,CAAC;AAErD,QAAA,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC/E,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC;QACzD,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC;IAC9D;AAEQ,IAAA,eAAe,CAAC,KAAiB,EAAA;QACvC,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;QACpB,KAAK,CAAC,cAAc,EAAE;QACtB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC3D;AAEQ,IAAA,cAAc,CAAC,KAAiB,EAAA;QACtC,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;AACpB,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAErB,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC;QAC9D,QAAQ,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC;QAC5D,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC;IACjE;AAEQ,IAAA,WAAW,CAAC,KAA8B,EAAE,YAAoB,EAAE,cAA2B,EAAA;AACnG,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,IAAI,CAAC,mBAAmB,GAAG,YAAY;AACvC,QAAA,IAAI,CAAC,qBAAqB,GAAG,cAAc;AAC3C,QAAA,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,cAAc,CAAC;IAC1F;AAEQ,IAAA,SAAS,CAAC,KAA8B,EAAA;QAC9C,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;AACxD,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;AACrB,QAAA,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;AAC7B,QAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;IACnC;IAEA,OAAO,GAAA;QACL,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC;QAC9D,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC;QAE1D,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC;QAC9D,QAAQ,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC;QAC5D,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC;AAE/D,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;AACrB,QAAA,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;AAC7B,QAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;IACnC;IAEA,WAAW,GAAA;QACT,OAAO,IAAI,CAAC,QAAQ;IACtB;AACD;;MCvGY,aAAa,CAAA;AAGxB,IAAA,WAAA,CAAY,UAAgC,EAAE,EAAA;QAC5C,IAAI,CAAC,OAAO,GAAG;AACb,YAAA,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,EAAE;SACzC;IACH;IAEA,iBAAiB,CACf,MAAqB,EACrB,WAAsB,EAAA;AAEtB,QAAA,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAI;AAC1B,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,qBAAqB,EAAE;AAC1C,YAAA,OAAO,WAAW,KAAK,YAAY,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM;AAChE,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,qBAAqB,CACnB,UAAiB,EACjB,YAAsB,EACtB,YAAoB,EACpB,cAA2B,EAAA;QAE3B,OAAO;YACL,KAAK,EAAE,WAAW,CAAC,QAAQ;AAC3B,YAAA,aAAa,EAAE,EAAE,GAAG,UAAU,EAAE;AAChC,YAAA,KAAK,EAAE,CAAC,GAAG,YAAY,CAAC;AACxB,YAAA,WAAW,EAAE,YAAY;YACzB,UAAU,EAAE,YAAY,GAAG,CAAC;YAC5B,cAAc;SACf;IACH;AAEA,IAAA,qBAAqB,CACnB,SAA0B,EAC1B,YAAmB,EACnB,WAAsB,EAAA;QAEtB,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,SAAS;AACnE,QAAA,MAAM,KAAK,GACT,WAAW,KAAK;AACd,cAAE,YAAY,CAAC,CAAC,GAAG,aAAa,CAAC;cAC/B,YAAY,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC;AAEtC,QAAA,MAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC;AAC3B,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC;AACrC,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;AAEnC,QAAA,IAAI,aAAa,GAAG,UAAU,GAAG,KAAK;AACtC,QAAA,IAAI,YAAY,GAAG,SAAS,GAAG,KAAK;;QAGpC,IAAI,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;YAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,GAAG,aAAa;AAC5D,YAAA,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY;YACzC,YAAY,IAAI,UAAU;QAC5B;QAEA,IAAI,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;YAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,GAAG,YAAY;AAC3D,YAAA,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY;YACxC,aAAa,IAAI,UAAU;QAC7B;;AAGA,QAAA,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;AAClE,QAAA,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;AAEhE,QAAA,QAAQ,CAAC,WAAW,CAAC,GAAG,aAAa;AACrC,QAAA,QAAQ,CAAC,UAAU,CAAC,GAAG,YAAY;AAEnC,QAAA,OAAO,QAAQ;IACjB;AAEA,IAAA,eAAe,CAAC,IAAY,EAAA;AAC1B,QAAA,IAAI,CAAC,OAAO,CAAC,YAAY,GAAG,IAAI;IAClC;IAEA,eAAe,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY;IAClC;AACD;;AC1FD;AACA;AACA;AAIO,MAAM,cAAc,GAAG,SAAS,CAAC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6HtC,CAAA,CAAA;;ACvHI,MAAO,UAAW,SAAQ,UAAU,CAAA;AACxB,IAAA,SAAA,IAAA,CAAA,MAAM,GAAG,CAAC,cAAc,CAAC,CAAC;AAE1C,IAAA,WAAoB,kBAAkB,GAAA;QACpC,OAAO;AACL,YAAA,IAAI,KAAK,CAAC,kBAAkB,IAAI,EAAE,CAAC;YACnC,aAAa;YACb,gBAAgB;YAChB,YAAY;SACb;IACH;AAeA,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;QAVD,IAAA,CAAA,SAAS,GAA0B,IAAI;QACvC,IAAA,CAAA,aAAa,GAAqB,EAAE;QACpC,IAAA,CAAA,QAAQ,GAAqB,EAAE;QAC/B,IAAA,CAAA,WAAW,GAA2B,IAAI;QAE1C,IAAA,CAAA,gBAAgB,GAA4B,IAAI;QAChD,IAAA,CAAA,uBAAuB,GAA0B,IAAI;QACrD,IAAA,CAAA,gBAAgB,GAAwB,IAAI;AAKlD,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,oBAAoB,EAAE;AAC9C,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,EAAE;AAExC,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC;YACnC,aAAa,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;YAChD,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;YAC9C,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;AAC7C,SAAA,CAAC;IACJ;IAES,MAAM,GAAA;AACb,QAAA,OAAO,IAAI,CAAA;;;KAGV;IACH;IAEmB,YAAY,GAAA;QAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAW,CAAC,aAAa,CAAC,qBAAqB,CAAmB;QACxF,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;QAE9C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAW,CAAC,aAAa,CAAC,MAAM,CAAoB;;QAE5E,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;QACvC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,YAAY,EAAE,MAAK;YACnD,IAAI,CAAC,oBAAoB,EAAE;AAC7B,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,qBAAqB,EAAE;QAC5B,IAAI,CAAC,gBAAgB,EAAE;QACvB,IAAI,CAAC,4BAA4B,EAAE;;QAGnC,qBAAqB,CAAC,MAAK;YACzB,IAAI,CAAC,oBAAoB,EAAE;AAC7B,QAAA,CAAC,CAAC;IACJ;IAES,oBAAoB,GAAA;AAC3B,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AAE3B,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,YAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE;AAClC,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;QAC9B;AAEA,QAAA,IAAI,IAAI,CAAC,uBAAuB,EAAE;AAChC,YAAA,IAAI,CAAC,uBAAuB,CAAC,UAAU,EAAE;AACzC,YAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI;QACrC;AAEA,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB,IAAI,CAAC,gBAAgB,EAAE;AACvB,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;QAC9B;QACA,KAAK,CAAC,oBAAoB,EAAE;IAC9B;AAES,IAAA,wBAAwB,CAC/B,IAAY,EACZ,QAAuB,EACvB,QAAuB,EAAA;QAEvB,KAAK,CAAC,wBAAwB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC;QACxD,IAAI,QAAQ,KAAK,QAAQ;YAAE;QAE3B,QAAQ,IAAI;AACV,YAAA,KAAK,aAAa;gBAChB,IAAI,CAAC,YAAY,CAAC,cAAc,CAC7B,QAAsB,IAAI,YAAY,CACxC;gBACD,IAAI,CAAC,0BAA0B,EAAE;gBACjC;AACF,YAAA,KAAK,gBAAgB;AACnB,gBAAA,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,EAAE;AACzD,gBAAA,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,UAAU,GAAG,EAAE,CAAC;gBACxE;AACF,YAAA,KAAK,YAAY;;gBAEf;;IAEN;;AAGA,IAAA,IAAI,WAAW,GAAA;QACb,OAAQ,IAAI,CAAC,YAAY,CAAC,aAAa,CAAe,IAAI,YAAY;IACxE;IAEA,IAAI,WAAW,CAAC,KAAgB,EAAA;AAC9B,QAAA,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,KAAK,CAAC;IACzC;AAEA,IAAA,IAAI,YAAY,GAAA;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC;AAChD,QAAA,OAAO,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE;IACvC;IAEA,IAAI,YAAY,CAAC,KAAa,EAAA;QAC5B,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACpD;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;IACxC;IAEA,IAAI,SAAS,CAAC,KAAc,EAAA;QAC1B,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,EAAE,CAAC;QACrC;aAAO;AACL,YAAA,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC;QACpC;IACF;IAEA,aAAa,GAAA;QACX,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,UAAU;IAChD;AAEA,IAAA,aAAa,CAAC,KAAe,EAAA;AAC3B,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;AAC3B,QAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC;IACxC;;IAGQ,qBAAqB,GAAA;AAC3B,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,MAAK;YAChD,IAAI,CAAC,oBAAoB,EAAE;AAC7B,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE;AAClC,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,OAAO,EAAE,KAAK;AACf,SAAA,CAAC;IACJ;IAEQ,gBAAgB,GAAA;AACtB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;AAC5D,YAAA,IAAI,KAAK,CAAC,eAAe,EAAE;AACzB,gBAAA,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,CAAC;YACnC;iBAAO;AACL,gBAAA,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC;YAClC;AACF,QAAA,CAAC,CAAC;IACJ;IAEQ,oBAAoB,GAAA;QAC1B,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;QAErB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAC/C,CAAC,KAAK,KAAK,KAAK,YAAY,WAAW,CACvB;AAElB,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE;;AAG3B,QAAA,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,EAAE;AAC7B,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;AACvB,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;;QAGlB,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;YAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC7C,YAAA,OAAO,CAAC,SAAS,GAAG,yBAAyB;;YAG7C,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;AAChD,YAAA,MAAM,QAAQ,GAAG,CAAA,MAAA,EAAS,KAAK,EAAE;AACjC,YAAA,SAAS,CAAC,IAAI,GAAG,QAAQ;AACzB,YAAA,KAAK,CAAC,IAAI,GAAG,QAAQ;AAErB,YAAA,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC;AAC9B,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;AAChC,YAAA,IAAI,CAAC,SAAU,CAAC,WAAW,CAAC,OAAO,CAAC;;YAGpC,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC/B,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC7C,gBAAA,OAAO,CAAC,SAAS,GAAG,SAAS;gBAC7B,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC,OAAO,EAAE,KAAK,CAAC;AACxD,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;AAC3B,gBAAA,IAAI,CAAC,SAAU,CAAC,WAAW,CAAC,OAAO,CAAC;YACtC;AACF,QAAA,CAAC,CAAC;;;;;;;;;QAUF,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,UAAU;AAC3D,QAAA,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;AAC9E,YAAA,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC;;;;;;;;YAQjC,qBAAqB,CAAC,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACzD;QACF;;;;;QAMA,qBAAqB,CAAC,MAAK;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,UAAU;AACvD,YAAA,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,aAAa,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;;;;AAItE,gBAAA,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;gBAC7B;YACF;YACA,IAAI,CAAC,yBAAyB,EAAE;AAClC,QAAA,CAAC,CAAC;IACJ;AAEA;;;;;;AAMG;IACK,yBAAyB,GAAA;AAC/B,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;YAAE;AACrC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,KAAK,YAAY,GAAG,OAAO,GAAG,QAAQ;QAC3E,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CACrC,CAAC,OAAO,KAAK,OAAO,CAAC,qBAAqB,EAAE,CAAC,YAAY,CAAC,CAC3D;;;AAGD,QAAA,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAAE;AACnC,QAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;AAC9B,QAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,QAAQ,CAAC;IAC3C;IAEQ,4BAA4B,GAAA;QAClC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,OAAO,cAAc,KAAK,WAAW;YAAE;AAC9D,QAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI,cAAc,CAAC,MAAK;YACrD,IAAI,CAAC,qBAAqB,EAAE;AAC9B,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;IACtD;AAEA;;;;;;AAMG;IACK,qBAAqB,GAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;YAAE;;;;AAIxD,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;YAAE;QAEpC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,UAAU;AACtD,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,aAAa,CAAC,MAAM;YAAE;QAExE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,qBAAqB,EAAE;AACnD,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,KAAK,YAAY,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM;QAClF,IAAI,aAAa,IAAI,CAAC;YAAE;AAExB,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,KAAK,YAAY,GAAG,OAAO,GAAG,QAAQ;QAC9E,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CACvC,CAAC,GAAG,EAAE,OAAO,KAAK,GAAG,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,eAAe,CAAC,EACxE,CAAC,CACF;;;;;;;AAOD,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,KAAK,YAAY,GAAG,YAAY,GAAG,WAAW;AACtF,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,KAAK,YAAY,GAAG,aAAa,GAAG,cAAc;AACxF,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,KAAI;AAC7D,YAAA,MAAM,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC;AACpC,YAAA,OAAO,GAAG,GAAG,UAAU,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;QAC9E,CAAC,EAAE,CAAC,CAAC;AACL,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,YAAY,GAAG,WAAW,CAAC;AAChF,QAAA,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5D,IAAI,kBAAkB,IAAI,CAAC;YAAE;;QAG7B,IAAI,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,kBAAkB,CAAC,GAAG,CAAC;YAAE;AAEzD,QAAA,MAAM,KAAK,GAAG,gBAAgB,GAAG,kBAAkB;AACnD,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;AAC7C,QAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;AAC9B,QAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,QAAQ,CAAC;IAC3C;IAEQ,0BAA0B,GAAA;QAChC,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;QAErB,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,sBAAsB,IAAI,CAAC,WAAW,CAAA,CAAE;IACrE;AAEQ,IAAA,iBAAiB,CACvB,KAA+D,EAC/D,YAAoB,EACpB,cAA2B,EAAA;AAE3B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAChD,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,WAAW,CACjB;AAED,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,qBAAqB,CACxD,KAAK,CAAC,KAAK,EACX,KAAK,EACL,YAAY,EACZ,cAAc,CACf;AAED,QAAA,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,SAAS,CAAC;AACxC,QAAA,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;AAEtC,QAAA,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAA4B,cAAc,EAAE;AACzD,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,MAAM,EAAE;gBACN,KAAK;gBACL,WAAW,EAAE,IAAI,CAAC,WAAW;AAC9B,aAAA;AACF,SAAA,CAAC,CACH;IACH;AAEQ,IAAA,gBAAgB,CAAC,KAGxB,EAAA;QACC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;QAC1C,IAAI,CAAC,KAAK,CAAC,eAAe;YAAE;QAE5B,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAC3D,KAAK,CAAC,eAAe,EACrB,KAAK,CAAC,KAAK,EACX,IAAI,CAAC,WAAW,CACjB;AAED,QAAA,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,YAAY,CAAC;AAC5C,QAAA,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC;AAElC,QAAA,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAA4B,UAAU,EAAE;AACrD,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,MAAM,EAAE;AACN,gBAAA,KAAK,EAAE,YAAY;gBACnB,WAAW,EAAE,IAAI,CAAC,WAAW;AAC9B,aAAA;AACF,SAAA,CAAC,CACH;IACH;AAEQ,IAAA,eAAe,CAAC,MAGvB,EAAA;QACC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;QAC1C,IAAI,CAAC,KAAK,CAAC,eAAe;YAAE;QAE5B,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,eAAe,CAAC,KAAK;AAEpE,QAAA,IAAI,KAAK,CAAC,eAAe,CAAC,cAAc,EAAE;YACxC,KAAK,CAAC,eAAe,CAAC,cAAc,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;QACjE;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC;AAEvC,QAAA,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAA4B,YAAY,EAAE;AACvD,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,MAAM,EAAE;AACN,gBAAA,KAAK,EAAE,UAAU;gBACjB,WAAW,EAAE,IAAI,CAAC,WAAW;AAC9B,aAAA;AACF,SAAA,CAAC,CACH;IACH;AAEQ,IAAA,eAAe,CAAC,KAAe,EAAA;AACrC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,KAAK,YAAY,GAAG,OAAO,GAAG,QAAQ;AAC3E,QAAA,MAAM,aAAa,GACjB,IAAI,CAAC,WAAW,KAAK,YAAY,GAAG,QAAQ,GAAG,OAAO;QAExD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,KAAI;AAC5C,YAAA,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE;AAC9B,gBAAA,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAA,EAAG,KAAK,CAAC,KAAK,CAAC,CAAA,EAAA,CAAI;AACjD,gBAAA,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE;AACjC,gBAAA,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC;YACvC;AACF,QAAA,CAAC,CAAC;IACJ;;AAGF;AACA,IACE,OAAO,cAAc,KAAK,WAAW;AACrC,IAAA,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,EAClC;AACA,IAAA,cAAc,CAAC,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC;AAClD;;ACpcA;;ACAA;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"mintplayer-ng-bootstrap-web-components-splitter.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/src/types/resize-operation.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/src/state/splitter-state.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/src/input/pointer-event.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/src/input/input-handler.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/src/managers/resize-manager.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/src/styles/splitter.styles.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/src/components/mp-splitter.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/src/index.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/mintplayer-ng-bootstrap-web-components-splitter.ts"],"sourcesContent":["import type { Point } from './point';\n\nexport enum ResizeState {\n Idle = 'idle',\n Resizing = 'resizing',\n}\n\nexport interface ResizeOperation {\n state: ResizeState;\n startPosition: Point;\n sizes: number[];\n indexBefore: number;\n indexAfter: number;\n dividerElement: HTMLElement | null;\n}\n","import type { Direction, ResizeOperation } from '../types';\nimport { ResizeState } from '../types';\n\nexport interface SplitterState {\n orientation: Direction;\n panelSizes: number[];\n previewSizes: number[] | null;\n resizeOperation: ResizeOperation | null;\n}\n\nexport type SplitterStateListener = (state: SplitterState) => void;\n\nexport class SplitterStateManager {\n private state: SplitterState;\n private listeners: Set<SplitterStateListener> = new Set();\n\n constructor(initialState?: Partial<SplitterState>) {\n this.state = {\n orientation: 'horizontal',\n panelSizes: [],\n previewSizes: null,\n resizeOperation: null,\n ...initialState,\n };\n }\n\n getState(): SplitterState {\n return { ...this.state };\n }\n\n subscribe(listener: SplitterStateListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private notifyListeners(): void {\n const stateCopy = this.getState();\n for (const listener of this.listeners) {\n listener(stateCopy);\n }\n }\n\n setOrientation(orientation: Direction): void {\n if (this.state.orientation !== orientation) {\n this.state = { ...this.state, orientation };\n this.notifyListeners();\n }\n }\n\n setPanelSizes(sizes: number[]): void {\n this.state = { ...this.state, panelSizes: [...sizes] };\n this.notifyListeners();\n }\n\n setPreviewSizes(sizes: number[] | null): void {\n this.state = { ...this.state, previewSizes: sizes ? [...sizes] : null };\n this.notifyListeners();\n }\n\n startResize(operation: ResizeOperation): void {\n this.state = {\n ...this.state,\n resizeOperation: { ...operation },\n };\n this.notifyListeners();\n }\n\n updateResize(previewSizes: number[]): void {\n this.state = {\n ...this.state,\n previewSizes: [...previewSizes],\n };\n this.notifyListeners();\n }\n\n endResize(finalSizes: number[]): void {\n this.state = {\n ...this.state,\n panelSizes: [...finalSizes],\n previewSizes: null,\n resizeOperation: null,\n };\n this.notifyListeners();\n }\n\n cancelResize(): void {\n this.state = {\n ...this.state,\n previewSizes: null,\n resizeOperation: null,\n };\n this.notifyListeners();\n }\n\n isResizing(): boolean {\n return this.state.resizeOperation?.state === ResizeState.Resizing;\n }\n}\n","import type { Point } from '../types';\n\nexport interface NormalizedPointerEvent {\n clientX: number;\n clientY: number;\n point: Point;\n originalEvent: MouseEvent | TouchEvent;\n isTouch: boolean;\n}\n\nexport function normalizePointerEvent(\n event: MouseEvent | TouchEvent\n): NormalizedPointerEvent {\n const isTouch = 'touches' in event;\n\n let clientX: number;\n let clientY: number;\n\n if (isTouch) {\n const touch = (event as TouchEvent).touches[0] || (event as TouchEvent).changedTouches[0];\n clientX = touch.clientX;\n clientY = touch.clientY;\n } else {\n clientX = (event as MouseEvent).clientX;\n clientY = (event as MouseEvent).clientY;\n }\n\n return {\n clientX,\n clientY,\n point: { x: clientX, y: clientY },\n originalEvent: event,\n isTouch,\n };\n}\n","import type { NormalizedPointerEvent } from './pointer-event';\nimport { normalizePointerEvent } from './pointer-event';\n\nexport interface InputHandlerCallbacks {\n onResizeStart: (event: NormalizedPointerEvent, dividerIndex: number, dividerElement: HTMLElement) => void;\n onResizeMove: (event: NormalizedPointerEvent) => void;\n onResizeEnd: (event: NormalizedPointerEvent) => void;\n /**\n * Keyboard-driven resize. Fires once per arrow / Home / End keystroke on a\n * focused divider. Granularity is encoded as the boolean `fine` (Shift held)\n * — translation to percent/px lives in the splitter, not the input layer.\n */\n onResizeKey?: (key: ResizeKey, fine: boolean, dividerIndex: number, dividerElement: HTMLElement) => void;\n}\n\nexport type ResizeKey = 'ArrowLeft' | 'ArrowRight' | 'ArrowUp' | 'ArrowDown' | 'Home' | 'End';\n\nconst RESIZE_KEYS: ReadonlySet<string> = new Set([\n 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End',\n]);\n\nexport class InputHandler {\n private isActive = false;\n private currentDividerIndex = -1;\n private currentDividerElement: HTMLElement | null = null;\n private callbacks: InputHandlerCallbacks;\n\n private boundMouseMove: (e: MouseEvent) => void;\n private boundMouseUp: (e: MouseEvent) => void;\n private boundTouchMove: (e: TouchEvent) => void;\n private boundTouchEnd: (e: TouchEvent) => void;\n\n constructor(callbacks: InputHandlerCallbacks) {\n this.callbacks = callbacks;\n\n this.boundMouseMove = this.handleMouseMove.bind(this);\n this.boundMouseUp = this.handleMouseUp.bind(this);\n this.boundTouchMove = this.handleTouchMove.bind(this);\n this.boundTouchEnd = this.handleTouchEnd.bind(this);\n }\n\n attachDividerListeners(divider: HTMLElement, index: number): void {\n divider.addEventListener('mousedown', (e) => this.handleMouseDown(e, index, divider));\n divider.addEventListener('touchstart', (e) => this.handleTouchStart(e, index, divider), { passive: false });\n divider.addEventListener('keydown', (e) => this.handleKeyDown(e, index, divider));\n }\n\n private handleKeyDown(event: KeyboardEvent, dividerIndex: number, dividerElement: HTMLElement): void {\n if (!this.callbacks.onResizeKey) return;\n if (!RESIZE_KEYS.has(event.key)) return;\n event.preventDefault();\n this.callbacks.onResizeKey(event.key as ResizeKey, event.shiftKey, dividerIndex, dividerElement);\n }\n\n private handleMouseDown(event: MouseEvent, dividerIndex: number, dividerElement: HTMLElement): void {\n event.preventDefault();\n this.startResize(event, dividerIndex, dividerElement);\n\n document.addEventListener('mousemove', this.boundMouseMove);\n document.addEventListener('mouseup', this.boundMouseUp);\n }\n\n private handleMouseMove(event: MouseEvent): void {\n if (!this.isActive) return;\n event.preventDefault();\n this.callbacks.onResizeMove(normalizePointerEvent(event));\n }\n\n private handleMouseUp(event: MouseEvent): void {\n if (!this.isActive) return;\n this.endResize(event);\n\n document.removeEventListener('mousemove', this.boundMouseMove);\n document.removeEventListener('mouseup', this.boundMouseUp);\n }\n\n private handleTouchStart(event: TouchEvent, dividerIndex: number, dividerElement: HTMLElement): void {\n event.preventDefault();\n this.startResize(event, dividerIndex, dividerElement);\n\n document.addEventListener('touchmove', this.boundTouchMove, { passive: false });\n document.addEventListener('touchend', this.boundTouchEnd);\n document.addEventListener('touchcancel', this.boundTouchEnd);\n }\n\n private handleTouchMove(event: TouchEvent): void {\n if (!this.isActive) return;\n event.preventDefault();\n this.callbacks.onResizeMove(normalizePointerEvent(event));\n }\n\n private handleTouchEnd(event: TouchEvent): void {\n if (!this.isActive) return;\n this.endResize(event);\n\n document.removeEventListener('touchmove', this.boundTouchMove);\n document.removeEventListener('touchend', this.boundTouchEnd);\n document.removeEventListener('touchcancel', this.boundTouchEnd);\n }\n\n private startResize(event: MouseEvent | TouchEvent, dividerIndex: number, dividerElement: HTMLElement): void {\n this.isActive = true;\n this.currentDividerIndex = dividerIndex;\n this.currentDividerElement = dividerElement;\n this.callbacks.onResizeStart(normalizePointerEvent(event), dividerIndex, dividerElement);\n }\n\n private endResize(event: MouseEvent | TouchEvent): void {\n this.callbacks.onResizeEnd(normalizePointerEvent(event));\n this.isActive = false;\n this.currentDividerIndex = -1;\n this.currentDividerElement = null;\n }\n\n dispose(): void {\n document.removeEventListener('mousemove', this.boundMouseMove);\n document.removeEventListener('mouseup', this.boundMouseUp);\n\n document.removeEventListener('touchmove', this.boundTouchMove);\n document.removeEventListener('touchend', this.boundTouchEnd);\n document.removeEventListener('touchcancel', this.boundTouchEnd);\n\n this.isActive = false;\n this.currentDividerIndex = -1;\n this.currentDividerElement = null;\n }\n\n getIsActive(): boolean {\n return this.isActive;\n }\n}\n","import type { Direction, Point, ResizeOperation } from '../types';\nimport { ResizeState } from '../types';\n\nexport interface ResizeManagerOptions {\n minPanelSize?: number;\n}\n\nexport class ResizeManager {\n private options: Required<ResizeManagerOptions>;\n\n constructor(options: ResizeManagerOptions = {}) {\n this.options = {\n minPanelSize: options.minPanelSize ?? 50,\n };\n }\n\n computePanelSizes(\n panels: HTMLElement[],\n orientation: Direction\n ): number[] {\n return panels.map((panel) => {\n const rect = panel.getBoundingClientRect();\n return orientation === 'horizontal' ? rect.width : rect.height;\n });\n }\n\n createResizeOperation(\n startPoint: Point,\n currentSizes: number[],\n dividerIndex: number,\n dividerElement: HTMLElement\n ): ResizeOperation {\n return {\n state: ResizeState.Resizing,\n startPosition: { ...startPoint },\n sizes: [...currentSizes],\n indexBefore: dividerIndex,\n indexAfter: dividerIndex + 1,\n dividerElement,\n };\n }\n\n calculatePreviewSizes(\n operation: ResizeOperation,\n currentPoint: Point,\n orientation: Direction\n ): number[] {\n const { startPosition, sizes, indexBefore, indexAfter } = operation;\n const delta =\n orientation === 'horizontal'\n ? currentPoint.x - startPosition.x\n : currentPoint.y - startPosition.y;\n\n const newSizes = [...sizes];\n const sizeBefore = sizes[indexBefore];\n const sizeAfter = sizes[indexAfter];\n\n let newSizeBefore = sizeBefore + delta;\n let newSizeAfter = sizeAfter - delta;\n\n // Apply minimum size constraints\n if (newSizeBefore < this.options.minPanelSize) {\n const adjustment = this.options.minPanelSize - newSizeBefore;\n newSizeBefore = this.options.minPanelSize;\n newSizeAfter -= adjustment;\n }\n\n if (newSizeAfter < this.options.minPanelSize) {\n const adjustment = this.options.minPanelSize - newSizeAfter;\n newSizeAfter = this.options.minPanelSize;\n newSizeBefore -= adjustment;\n }\n\n // Final clamp\n newSizeBefore = Math.max(newSizeBefore, this.options.minPanelSize);\n newSizeAfter = Math.max(newSizeAfter, this.options.minPanelSize);\n\n newSizes[indexBefore] = newSizeBefore;\n newSizes[indexAfter] = newSizeAfter;\n\n return newSizes;\n }\n\n setMinPanelSize(size: number): void {\n this.options.minPanelSize = size;\n }\n\n getMinPanelSize(): number {\n return this.options.minPanelSize;\n }\n}\n","// AUTO-GENERATED — do not edit by hand.\n// Source: splitter.styles.scss\n// Regenerate with the codegen-wc Nx target.\n\nimport { unsafeCSS } from 'lit';\n\nexport const splitterStyles = unsafeCSS(`:host {\n display: block;\n width: 100%;\n height: 100%;\n --mp-splitter-size: 8px;\n --mp-splitter-thumb-margin: 3px;\n --mp-splitter-divider-color: #eee;\n --mp-splitter-divider-hover-color: #1389fd;\n}\n\n:host([touch-mode]) {\n --mp-splitter-thumb-margin: 20px;\n}\n\n* {\n box-sizing: border-box;\n}\n\n.splitter-container {\n display: flex;\n width: 100%;\n height: 100%;\n}\n\n.splitter-container.horizontal {\n flex-direction: row;\n}\n\n.splitter-container.vertical {\n flex-direction: column;\n}\n\n.panel-wrapper {\n overflow: hidden;\n position: relative;\n}\n\n.panel-wrapper.flex-grow {\n flex: 1 1 0;\n}\n\n/* Divider base styles */\n.divider {\n flex-shrink: 0;\n transition: background-color 0.15s ease-in-out;\n z-index: 3;\n touch-action: none;\n}\n\n.divider::before {\n content: \"\";\n display: block;\n background-color: var(--mp-splitter-divider-color);\n background-position: center center;\n background-repeat: no-repeat;\n}\n\n.divider:hover::before,\n.divider.active::before,\n.divider:focus-visible::before {\n background-color: var(--mp-splitter-divider-hover-color);\n border-radius: calc(var(--mp-splitter-size) / 2);\n}\n\n.divider:focus {\n outline: none;\n}\n\n.divider:focus-visible {\n outline: 2px solid var(--mp-splitter-divider-hover-color);\n outline-offset: 1px;\n}\n\n/* Horizontal splitter styles */\n.splitter-container.horizontal > .divider {\n width: calc(var(--mp-splitter-size) + 2 * var(--mp-splitter-thumb-margin));\n height: 100%;\n cursor: col-resize;\n border-left: var(--mp-splitter-thumb-margin) solid transparent;\n border-right: var(--mp-splitter-thumb-margin) solid transparent;\n}\n\n.splitter-container.horizontal > .divider::before {\n height: 100%;\n width: var(--mp-splitter-size);\n margin: 0 auto;\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==);\n}\n\n.splitter-container.horizontal > .panel-wrapper:not(:first-child) {\n margin-left: calc(-1 * var(--mp-splitter-thumb-margin));\n}\n\n.splitter-container.horizontal > .panel-wrapper:not(:last-child) {\n margin-right: calc(-1 * var(--mp-splitter-thumb-margin));\n}\n\n/* Vertical splitter styles */\n.splitter-container.vertical > .divider {\n width: 100%;\n height: calc(var(--mp-splitter-size) + 2 * var(--mp-splitter-thumb-margin));\n cursor: row-resize;\n border-top: var(--mp-splitter-thumb-margin) solid transparent;\n border-bottom: var(--mp-splitter-thumb-margin) solid transparent;\n}\n\n.splitter-container.vertical > .divider::before {\n height: var(--mp-splitter-size);\n width: 100%;\n margin: auto 0;\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFCAMAAABl/6zIAAAABlBMVEUAAADMzMzIT8AyAAAAAXRSTlMAQObYZgAAABRJREFUeAFjYGRkwIMJSeMHlBkOABP7AEGzSuPKAAAAAElFTkSuQmCC);\n}\n\n.splitter-container.vertical > .panel-wrapper:not(:first-child) {\n margin-top: calc(-1 * var(--mp-splitter-thumb-margin));\n}\n\n.splitter-container.vertical > .panel-wrapper:not(:last-child) {\n margin-bottom: calc(-1 * var(--mp-splitter-thumb-margin));\n}\n\n/* Resizing state */\n:host([resizing]) .splitter-container {\n cursor: col-resize;\n user-select: none;\n}\n\n:host([resizing]) .splitter-container.vertical {\n cursor: row-resize;\n}\n\n/* Slot content styling */\n::slotted(*) {\n width: 100%;\n height: 100%;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .divider {\n transition: none !important;\n }\n}`);\nexport default splitterStyles;\n","import { LitElement, html, type TemplateResult } from 'lit';\nimport { SplitterStateManager } from '../state';\nimport { InputHandler, type ResizeKey } from '../input';\nimport { ResizeManager } from '../managers';\nimport { splitterStyles } from '../styles';\nimport type { Direction, Point } from '../types';\n\nexport interface SplitterResizeEventDetail {\n sizes: number[];\n orientation: Direction;\n}\n\nlet splitterInstanceCounter = 0;\n\n/**\n * `<mp-splitter>` — resizable panel splitter.\n *\n * Light-DOM children are projected into named slots (`panel-${i}`) inside a\n * shadow-DOM flex container with auto-inserted dividers between them. Drag a\n * divider to redistribute space; sizes survive container resize via a\n * proportional rescale.\n *\n * Pointer + keyboard interactions both flow through the same path:\n * - Pointer drag → `InputHandler` → `handleResizeStart/Move/End`.\n * - Arrow keys ±10% (Shift = ±1%), Home/End to limits → `handleResizeKey`.\n *\n * ARIA: each divider is a `role=\"separator\"` with `aria-orientation`,\n * `aria-controls` referencing the deterministic IDs of the two adjacent\n * panel wrappers, and percent-based `aria-valuenow / valuemin / valuemax`\n * that update on every drag-preview frame, container resize, and keystroke.\n *\n * Public API: `[orientation]`, `[min-panel-size]`, `[touch-mode]`;\n * `getPanelSizes()` / `setPanelSizes()`; events `resize-start`, `resizing`,\n * `resize-end` carrying `{ sizes, orientation }`.\n */\nexport class MpSplitter extends LitElement {\n static override styles = [splitterStyles];\n\n static override get observedAttributes(): string[] {\n return [\n ...(super.observedAttributes ?? []),\n 'orientation',\n 'min-panel-size',\n 'touch-mode',\n ];\n }\n\n private stateManager: SplitterStateManager;\n private inputHandler: InputHandler;\n private resizeManager: ResizeManager;\n\n private container: HTMLDivElement | null = null;\n private panelWrappers: HTMLDivElement[] = [];\n private dividers: HTMLDivElement[] = [];\n private slotElement: HTMLSlotElement | null = null;\n\n private mutationObserver: MutationObserver | null = null;\n private containerResizeObserver: ResizeObserver | null = null;\n private unsubscribeState: (() => void) | null = null;\n\n private readonly instanceId = `mp-splitter-${++splitterInstanceCounter}`;\n\n constructor() {\n super();\n\n this.stateManager = new SplitterStateManager();\n this.resizeManager = new ResizeManager();\n\n this.inputHandler = new InputHandler({\n onResizeStart: this.handleResizeStart.bind(this),\n onResizeMove: this.handleResizeMove.bind(this),\n onResizeEnd: this.handleResizeEnd.bind(this),\n onResizeKey: this.handleResizeKey.bind(this),\n });\n }\n\n override render(): TemplateResult {\n return html`\n <div class=\"splitter-container\"></div>\n <slot></slot>\n `;\n }\n\n protected override firstUpdated(): void {\n this.container = this.shadowRoot!.querySelector('.splitter-container') as HTMLDivElement;\n this.container.classList.add(this.orientation);\n\n this.slotElement = this.shadowRoot!.querySelector('slot') as HTMLSlotElement;\n // Hide the default slot - we'll project content ourselves via named slots.\n this.slotElement.style.display = 'none';\n this.slotElement.addEventListener('slotchange', () => {\n this.updatePanelsFromSlot();\n });\n\n this.setupMutationObserver();\n this.subscribeToState();\n this.setupContainerResizeObserver();\n\n // Initial setup after first render\n requestAnimationFrame(() => {\n this.updatePanelsFromSlot();\n });\n }\n\n override disconnectedCallback(): void {\n this.inputHandler.dispose();\n\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n this.mutationObserver = null;\n }\n\n if (this.containerResizeObserver) {\n this.containerResizeObserver.disconnect();\n this.containerResizeObserver = null;\n }\n\n if (this.unsubscribeState) {\n this.unsubscribeState();\n this.unsubscribeState = null;\n }\n super.disconnectedCallback();\n }\n\n override attributeChangedCallback(\n name: string,\n oldValue: string | null,\n newValue: string | null\n ): void {\n super.attributeChangedCallback(name, oldValue, newValue);\n if (oldValue === newValue) return;\n\n switch (name) {\n case 'orientation':\n this.stateManager.setOrientation(\n (newValue as Direction) || 'horizontal'\n );\n this.updateContainerOrientation();\n break;\n case 'min-panel-size':\n const parsedSize = newValue ? parseInt(newValue, 10) : 50;\n this.resizeManager.setMinPanelSize(!isNaN(parsedSize) ? parsedSize : 50);\n break;\n case 'touch-mode':\n // Handled by CSS via :host([touch-mode])\n break;\n }\n }\n\n // Public API\n get orientation(): Direction {\n return (this.getAttribute('orientation') as Direction) || 'horizontal';\n }\n\n set orientation(value: Direction) {\n this.setAttribute('orientation', value);\n }\n\n get minPanelSize(): number {\n const attr = this.getAttribute('min-panel-size');\n return attr ? parseInt(attr, 10) : 50;\n }\n\n set minPanelSize(value: number) {\n this.setAttribute('min-panel-size', String(value));\n }\n\n get touchMode(): boolean {\n return this.hasAttribute('touch-mode');\n }\n\n set touchMode(value: boolean) {\n if (value) {\n this.setAttribute('touch-mode', '');\n } else {\n this.removeAttribute('touch-mode');\n }\n }\n\n getPanelSizes(): number[] {\n return this.stateManager.getState().panelSizes;\n }\n\n /**\n * Drive a keyboard-style resize on a divider programmatically. Used by the\n * dock manager's intersection-handle keymap so a single keystroke can\n * resize both the horizontal and vertical dividers a 2D handle sits on,\n * without re-implementing the percent-step + clamp math here.\n *\n * `key` is one of the keys handled by the divider keymap\n * (Arrow{Left,Right,Up,Down}, Home, End); `fine` halves the step (matches\n * Shift modifier on the keyboard path).\n */\n resizeDividerBy(dividerIndex: number, key: ResizeKey, fine = false): void {\n const divider = this.dividers[dividerIndex];\n if (!divider) return;\n this.handleResizeKey(key, fine, dividerIndex, divider);\n }\n\n setPanelSizes(sizes: number[]): void {\n this.applyPanelSizes(sizes);\n this.stateManager.setPanelSizes(sizes);\n }\n\n // Private methods\n private setupMutationObserver(): void {\n this.mutationObserver = new MutationObserver(() => {\n this.updatePanelsFromSlot();\n });\n\n this.mutationObserver.observe(this, {\n childList: true,\n subtree: false,\n });\n }\n\n private subscribeToState(): void {\n this.unsubscribeState = this.stateManager.subscribe((state) => {\n if (state.resizeOperation) {\n this.setAttribute('resizing', '');\n } else {\n this.removeAttribute('resizing');\n }\n this.updateDividerAriaValues();\n });\n }\n\n /**\n * Mirror current panel sizes to each divider's aria-valuenow / valuemin /\n * valuemax as percent of container. Per §10 Q3 of the WC ARIA PRD: percent\n * is more intuitive for SR users than pixels.\n *\n * Per-divider math: divider i sits between panels[i] and panels[i+1] and\n * \"owns\" the size of panels[i]. valuemin = minPanelSize as % of container;\n * valuemax = (panels[i].size + panels[i+1].size - minPanelSize) as %.\n */\n private updateDividerAriaValues(): void {\n if (this.dividers.length === 0 || !this.container) return;\n const state = this.stateManager.getState();\n const sizes = state.previewSizes ?? state.panelSizes;\n if (sizes.length !== this.panelWrappers.length || sizes.length === 0) return;\n const rect = this.container.getBoundingClientRect();\n const containerSize = this.orientation === 'horizontal' ? rect.width : rect.height;\n if (containerSize <= 0) return;\n const minPanelSize = this.resizeManager.getMinPanelSize();\n\n this.dividers.forEach((divider, i) => {\n const before = sizes[i];\n const after = sizes[i + 1];\n if (before === undefined || after === undefined) return;\n const valuenow = Math.round((before / containerSize) * 100);\n const valuemin = Math.round((minPanelSize / containerSize) * 100);\n const pairTotal = before + after;\n const valuemax = Math.round(((pairTotal - minPanelSize) / containerSize) * 100);\n divider.setAttribute('aria-valuenow', String(valuenow));\n divider.setAttribute('aria-valuemin', String(valuemin));\n divider.setAttribute('aria-valuemax', String(valuemax));\n });\n }\n\n private updatePanelsFromSlot(): void {\n if (!this.container) return;\n\n const children = Array.from(this.children).filter(\n (child) => child instanceof HTMLElement\n ) as HTMLElement[];\n\n if (children.length === 0) return;\n\n // Clear existing wrappers and dividers\n this.container.innerHTML = '';\n this.panelWrappers = [];\n this.dividers = [];\n\n // Create panel wrappers with slots for each child\n const panelCount = children.length;\n const dividerAriaOrientation = this.orientation === 'horizontal' ? 'vertical' : 'horizontal';\n children.forEach((child, index) => {\n const wrapper = document.createElement('div');\n wrapper.className = 'panel-wrapper flex-grow';\n wrapper.id = `${this.instanceId}-panel-${index}`;\n\n // Create a named slot for this child\n const namedSlot = document.createElement('slot');\n const slotName = `panel-${index}`;\n namedSlot.name = slotName;\n child.slot = slotName;\n\n wrapper.appendChild(namedSlot);\n this.panelWrappers.push(wrapper);\n this.container!.appendChild(wrapper);\n\n // Add divider between panels\n if (index < panelCount - 1) {\n const divider = document.createElement('div');\n divider.className = 'divider';\n divider.setAttribute('role', 'separator');\n divider.setAttribute('aria-orientation', dividerAriaOrientation);\n divider.setAttribute('tabindex', '0');\n divider.setAttribute(\n 'aria-controls',\n `${this.instanceId}-panel-${index} ${this.instanceId}-panel-${index + 1}`,\n );\n divider.setAttribute(\n 'aria-label',\n `Resize between panel ${index + 1} and panel ${index + 2}`,\n );\n this.inputHandler.attachDividerListeners(divider, index);\n this.dividers.push(divider);\n this.container!.appendChild(divider);\n }\n });\n\n // Re-apply previously-stored sizes when the panel count still matches.\n // Two cases where this matters:\n // 1. setPanelSizes() was called before firstUpdated's raf populated\n // the wrappers (e.g., the dock schedules its own raf inside\n // renderSplit) — without this, the early call is silently dropped.\n // 2. Slot children change after a drag (e.g., layout re-render) — the\n // wrappers get recreated with `flex: 1 1 0` (equal sizes) and would\n // otherwise discard the user's drag result.\n const storedSizes = this.stateManager.getState().panelSizes;\n if (storedSizes.length > 0 && storedSizes.length === this.panelWrappers.length) {\n this.applyPanelSizes(storedSizes);\n // Consumer-supplied sizes (e.g., from the dock's renderSplit) often\n // sum to the full container size because the consumer doesn't know\n // mp-splitter's internal divider widths. Defer one raf so dividers\n // have laid out, then rescale stored sizes against the actual panel\n // space (container - dividers). Without this step ResizeObserver\n // alone can't catch the discrepancy because the container size\n // hasn't changed — only the panel/divider split inside it has.\n requestAnimationFrame(() => this.handleContainerResize());\n return;\n }\n\n // No stored sizes (or count mismatch) — pin from the measured layout\n // once the browser has run layout for the new wrappers. A nested raf\n // is needed because the wrappers were created in this very turn and\n // their getBoundingClientRect would return 0 if read synchronously.\n requestAnimationFrame(() => {\n const current = this.stateManager.getState().panelSizes;\n if (current.length === this.panelWrappers.length && current.length > 0) {\n // A consumer (e.g., the dock) called setPanelSizes() between our\n // raf scheduling and execution. Honour their values instead of\n // overwriting with measurements.\n this.applyPanelSizes(current);\n return;\n }\n this.pinSizesFromCurrentLayout();\n });\n }\n\n /**\n * Read each panel-wrapper's measured pixel size and persist it as the\n * authoritative panel size. After this runs, every wrapper carries an\n * inline `width` (or `height`) — content intrinsic size cannot leak into\n * the parent flex container, so a nested splitter's drag does not shift\n * the parent's layout.\n */\n private pinSizesFromCurrentLayout(): void {\n if (this.panelWrappers.length === 0) return;\n const sizeProperty = this.orientation === 'horizontal' ? 'width' : 'height';\n const measured = this.panelWrappers.map(\n (wrapper) => wrapper.getBoundingClientRect()[sizeProperty]\n );\n // Layout hasn't run yet for these wrappers — bail rather than write\n // 0 px sizes that would collapse every panel.\n if (measured.every((v) => v <= 0)) return;\n this.applyPanelSizes(measured);\n this.stateManager.setPanelSizes(measured);\n }\n\n private setupContainerResizeObserver(): void {\n if (!this.container || typeof ResizeObserver === 'undefined') return;\n this.containerResizeObserver = new ResizeObserver(() => {\n this.handleContainerResize();\n });\n this.containerResizeObserver.observe(this.container);\n }\n\n /**\n * When the splitter's container resizes (window resize, parent splitter\n * pinning its sizes, etc.), scale every panel-wrapper proportionally so\n * the existing ratios are preserved. Without this we'd be stuck with the\n * original pixel sizes when the surrounding viewport changes — what\n * `flex-basis: 0` gave master \"for free\".\n */\n private handleContainerResize(): void {\n if (!this.container || this.panelWrappers.length === 0) return;\n // applyPanelSizes runs continuously during a drag; its writes can fire\n // ResizeObserver via subpixel rounding. The drag math already keeps\n // panels summing to the container — don't fight it.\n if (this.stateManager.isResizing()) return;\n\n const stored = this.stateManager.getState().panelSizes;\n if (stored.length === 0 || stored.length !== this.panelWrappers.length) return;\n\n const rect = this.container.getBoundingClientRect();\n const containerSize = this.orientation === 'horizontal' ? rect.width : rect.height;\n if (containerSize <= 0) return;\n\n const dividerProperty = this.orientation === 'horizontal' ? 'width' : 'height';\n const dividerTotal = this.dividers.reduce(\n (sum, divider) => sum + divider.getBoundingClientRect()[dividerProperty],\n 0\n );\n // Adjacent panel-wrappers carry negative margins (`margin-left` /\n // `margin-right` of `-thumb-margin`) so they visually overlap the\n // divider's transparent borders. In the flex calculation those negative\n // margins reduce a divider's effective width contribution; if we ignore\n // them we under-target by 2 * (N-1) * thumb px and the container gets\n // a gap at the trailing edge.\n const startMarginProp = this.orientation === 'horizontal' ? 'marginLeft' : 'marginTop';\n const endMarginProp = this.orientation === 'horizontal' ? 'marginRight' : 'marginBottom';\n const marginTotal = this.panelWrappers.reduce((sum, wrapper) => {\n const cs = getComputedStyle(wrapper);\n return sum + parseFloat(cs[startMarginProp]) + parseFloat(cs[endMarginProp]);\n }, 0);\n const targetPanelTotal = Math.max(0, containerSize - dividerTotal - marginTotal);\n const previousPanelTotal = stored.reduce((a, b) => a + b, 0);\n if (previousPanelTotal <= 0) return;\n\n // Below 1 px we'd be amplifying our own subpixel writes. Skip.\n if (Math.abs(targetPanelTotal - previousPanelTotal) < 1) return;\n\n const scale = targetPanelTotal / previousPanelTotal;\n const newSizes = stored.map((s) => s * scale);\n this.applyPanelSizes(newSizes);\n this.stateManager.setPanelSizes(newSizes);\n this.updateDividerAriaValues();\n }\n\n private updateContainerOrientation(): void {\n if (!this.container) return;\n\n this.container.className = `splitter-container ${this.orientation}`;\n\n const dividerAriaOrientation = this.orientation === 'horizontal' ? 'vertical' : 'horizontal';\n this.dividers.forEach((divider) => {\n divider.setAttribute('aria-orientation', dividerAriaOrientation);\n });\n }\n\n private handleResizeStart(\n event: { point: Point; originalEvent: MouseEvent | TouchEvent },\n dividerIndex: number,\n dividerElement: HTMLElement\n ): void {\n const sizes = this.resizeManager.computePanelSizes(\n this.panelWrappers,\n this.orientation\n );\n\n const operation = this.resizeManager.createResizeOperation(\n event.point,\n sizes,\n dividerIndex,\n dividerElement\n );\n\n this.stateManager.startResize(operation);\n dividerElement.classList.add('active');\n\n this.dispatchEvent(\n new CustomEvent<SplitterResizeEventDetail>('resize-start', {\n bubbles: true,\n detail: {\n sizes,\n orientation: this.orientation,\n },\n })\n );\n }\n\n private handleResizeMove(event: {\n point: Point;\n originalEvent: MouseEvent | TouchEvent;\n }): void {\n const state = this.stateManager.getState();\n if (!state.resizeOperation) return;\n\n const previewSizes = this.resizeManager.calculatePreviewSizes(\n state.resizeOperation,\n event.point,\n this.orientation\n );\n\n this.stateManager.updateResize(previewSizes);\n this.applyPanelSizes(previewSizes);\n\n this.dispatchEvent(\n new CustomEvent<SplitterResizeEventDetail>('resizing', {\n bubbles: true,\n detail: {\n sizes: previewSizes,\n orientation: this.orientation,\n },\n })\n );\n }\n\n private handleResizeEnd(_event: {\n point: Point;\n originalEvent: MouseEvent | TouchEvent;\n }): void {\n const state = this.stateManager.getState();\n if (!state.resizeOperation) return;\n\n const finalSizes = state.previewSizes || state.resizeOperation.sizes;\n\n if (state.resizeOperation.dividerElement) {\n state.resizeOperation.dividerElement.classList.remove('active');\n }\n\n this.stateManager.endResize(finalSizes);\n\n this.dispatchEvent(\n new CustomEvent<SplitterResizeEventDetail>('resize-end', {\n bubbles: true,\n detail: {\n sizes: finalSizes,\n orientation: this.orientation,\n },\n })\n );\n }\n\n /**\n * Keyboard-driven resize on a focused divider. ArrowKeys ±10% (Shift = ±1%)\n * along the splitter's axis; Home/End shrink/grow panelBefore to its limit.\n * Fires resize-start → resize-end with the new sizes so consumers don't\n * need to special-case keyboard vs. drag.\n */\n private handleResizeKey(\n key: ResizeKey,\n fine: boolean,\n dividerIndex: number,\n dividerElement: HTMLElement,\n ): void {\n if (!this.container) return;\n if (this.panelWrappers.length === 0) return;\n\n const sizes = [...this.stateManager.getState().panelSizes];\n if (sizes.length !== this.panelWrappers.length) return;\n\n const before = sizes[dividerIndex];\n const after = sizes[dividerIndex + 1];\n if (before === undefined || after === undefined) return;\n\n const rect = this.container.getBoundingClientRect();\n const containerSize = this.orientation === 'horizontal' ? rect.width : rect.height;\n if (containerSize <= 0) return;\n const minPanelSize = this.resizeManager.getMinPanelSize();\n\n const isHorizontal = this.orientation === 'horizontal';\n const positive = isHorizontal ? 'ArrowRight' : 'ArrowDown';\n const negative = isHorizontal ? 'ArrowLeft' : 'ArrowUp';\n\n let direction: 1 | -1 | 0 = 0;\n if (key === positive) direction = 1;\n else if (key === negative) direction = -1;\n\n let newBefore: number;\n let newAfter: number;\n if (key === 'Home') {\n newBefore = minPanelSize;\n newAfter = before + after - minPanelSize;\n } else if (key === 'End') {\n newBefore = before + after - minPanelSize;\n newAfter = minPanelSize;\n } else if (direction !== 0) {\n const stepPercent = fine ? 1 : 10;\n const deltaPx = (stepPercent / 100) * containerSize * direction;\n newBefore = before + deltaPx;\n newAfter = after - deltaPx;\n // Clamp to min on both sides — symmetric with the pointer path in\n // ResizeManager.calculatePreviewSizes.\n if (newBefore < minPanelSize) {\n newBefore = minPanelSize;\n newAfter = before + after - minPanelSize;\n } else if (newAfter < minPanelSize) {\n newAfter = minPanelSize;\n newBefore = before + after - minPanelSize;\n }\n } else {\n // Off-axis arrow — silently ignored.\n return;\n }\n\n if (newBefore === before && newAfter === after) return;\n\n sizes[dividerIndex] = newBefore;\n sizes[dividerIndex + 1] = newAfter;\n\n this.applyPanelSizes(sizes);\n this.stateManager.setPanelSizes(sizes);\n this.updateDividerAriaValues();\n\n dividerElement.classList.add('active');\n queueMicrotask(() => dividerElement.classList.remove('active'));\n\n this.dispatchEvent(\n new CustomEvent<SplitterResizeEventDetail>('resize-end', {\n bubbles: true,\n detail: { sizes, orientation: this.orientation },\n }),\n );\n }\n\n private applyPanelSizes(sizes: number[]): void {\n const sizeProperty = this.orientation === 'horizontal' ? 'width' : 'height';\n const resetProperty =\n this.orientation === 'horizontal' ? 'height' : 'width';\n\n this.panelWrappers.forEach((wrapper, index) => {\n if (sizes[index] !== undefined) {\n wrapper.style[sizeProperty] = `${sizes[index]}px`;\n wrapper.style[resetProperty] = '';\n wrapper.classList.remove('flex-grow');\n }\n });\n }\n}\n\n// Auto-register the custom element\nif (\n typeof customElements !== 'undefined' &&\n !customElements.get('mp-splitter')\n) {\n customElements.define('mp-splitter', MpSplitter);\n}\n","// Main component export\nexport { MpSplitter } from './components';\nexport type { SplitterResizeEventDetail } from './components';\n\n// State management\nexport { SplitterStateManager } from './state';\nexport type { SplitterState, SplitterStateListener } from './state';\n\n// Types\nexport type { Direction, Point, ResizeOperation, PanelInfo } from './types';\nexport { ResizeState } from './types';\n\n// Managers\nexport { ResizeManager } from './managers';\nexport type { ResizeManagerOptions } from './managers';\n\n// Input handling\nexport { InputHandler, normalizePointerEvent } from './input';\nexport type { InputHandlerCallbacks, NormalizedPointerEvent } from './input';\n\n// Styles (for custom styling extensions)\nexport { splitterStyles } from './styles';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -371,6 +371,10 @@ class MpTabControl extends LitElement {
|
|
|
371
371
|
const content = html `
|
|
372
372
|
<div
|
|
373
373
|
class="tab-content flex-grow-1 overflow-auto${borderClass}"
|
|
374
|
+
role=${activeId ? 'tabpanel' : nothing}
|
|
375
|
+
id=${activeId ? `${activeId}-panel` : nothing}
|
|
376
|
+
aria-labelledby=${activeId ? `${activeId}-header-button` : nothing}
|
|
377
|
+
tabindex=${activeId ? '0' : nothing}
|
|
374
378
|
>
|
|
375
379
|
<slot name=${activeId ? `${activeId}-content` : '__none__'}></slot>
|
|
376
380
|
</div>
|