@kitlangton/knobs 0.4.0-next.13 → 0.4.0-next.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -6
- package/dist/dev/{chunk-mbhy4jg5.js → chunk-49hkdggk.js} +199 -135
- package/dist/dev/{chunk-44r02asc.js → chunk-902v1jgd.js} +2 -2
- package/dist/dev/{chunk-pdf3zy95.js → chunk-bejz4qcg.js} +9 -2
- package/dist/dev/{chunk-7kns3qe6.js → chunk-v2g91mrm.js} +9 -1
- package/dist/dev/index.js +19 -8
- package/dist/index.js +23 -5
- package/dist/panel.js +249 -147
- package/dist/review-react.js +5 -3
- package/dist/review-solid.js +5 -3
- package/dist/review.js +5 -3
- package/dist/types/core/remote.d.ts +3 -1
- package/dist/types/core/schema.d.ts +12 -1
- package/dist/types/core/store.d.ts +30 -5
- package/dist/types/panel/gpu/renderer.d.ts +8 -0
- package/dist/types/panel/presets.d.ts +2 -0
- package/dist/types/ui/index.d.ts +1 -1
- package/dist/types/ui/palette.d.ts +15 -0
- package/dist/types/ui/tree-model.d.ts +5 -2
- package/dist/ui-react.js +5 -3
- package/dist/ui-solid.js +5 -3
- package/dist/ui.js +28 -6
- package/package.json +1 -1
package/dist/panel.js
CHANGED
|
@@ -3303,9 +3303,16 @@ ${GRAD_PROPS}
|
|
|
3303
3303
|
/* The active preset's modified mark: the values have drifted off it (a row's dot, in its corner). */
|
|
3304
3304
|
.knobs-panel .knobs-preset-chip::after{content:"";position:absolute;top:4px;right:4px;width:4px;height:4px;border-radius:50%;background:var(--_k-modified);opacity:0;transform:scale(.4);pointer-events:none;transition:opacity .16s ease-out,transform .28s cubic-bezier(.34,1.5,.64,1)}
|
|
3305
3305
|
.knobs-panel .knobs-preset-chip[data-drifted]::after{opacity:.95;transform:none}
|
|
3306
|
+
/* Digits that stay on the chips (hints: { digits: "always" }): quiet, in a column of their own. */
|
|
3307
|
+
.knobs-panel .knobs-preset-key{display:inline-block;margin-right:6px;color:var(--_k-fg-3);font-size:var(--_k-text-meta);font-weight:var(--_k-weight-label);font-variant-numeric:tabular-nums}
|
|
3308
|
+
/* A group's own presets at the top of its card: the chips sit on the card, with no tray. */
|
|
3309
|
+
.knobs-panel .knobs-card>.knobs-presets{margin:0;padding:max(4px,calc((var(--_k-row) - var(--k-button-h,var(--_k-control-h))) / 2)) var(--_k-inset);background:transparent;border-radius:0}
|
|
3310
|
+
.knobs-panel .knobs-card>.knobs-presets[data-display="list"]{padding-inline:0}
|
|
3311
|
+
.knobs-card>.knobs-presets:hover{background:transparent}
|
|
3306
3312
|
/* Naming a saved preset: a field over its chip that opens out from the middle to the chip's width;
|
|
3307
3313
|
the chip's own name hides beneath it. Leaving, it fades. */
|
|
3308
3314
|
.knobs-panel .knobs-preset-chip[data-naming]{color:transparent!important}
|
|
3315
|
+
.knobs-panel .knobs-preset-chip[data-naming] .knobs-preset-key{color:transparent}
|
|
3309
3316
|
.knobs-panel .knobs-preset-name{position:absolute;z-index:2;box-sizing:border-box;min-width:0;margin:0;padding:0 6px;border:1px solid color-mix(in srgb,var(--_k-accent) 55%,transparent);border-radius:var(--k-button-radius,var(--_k-radius-md));outline:none;background:color-mix(in srgb,var(--_k-accent) 10%,transparent);color:var(--_k-fg);caret-color:var(--_k-accent);
|
|
3310
3317
|
font-family:inherit;font-size:var(--k-button-font-size,var(--_k-text-control));font-weight:var(--_k-weight-title);letter-spacing:inherit;text-align:center;animation:knobs-name-in .25s cubic-bezier(.2,.8,.2,1);transition:opacity .11s cubic-bezier(.4,0,1,1)}
|
|
3311
3318
|
.knobs-preset-name::selection{background:color-mix(in srgb,var(--_k-accent) 24%,transparent);color:var(--_k-fg)}
|
|
@@ -3916,7 +3923,7 @@ ${POINTER_ROW} .knobs-slider.knobs-modified:not(:hover,.knobs-active) .knobs-val
|
|
|
3916
3923
|
.knobs-panel[data-gpu-active="true"] :where(header strong,header button,.knobs-tile,.knobs-section-head,.knobs-group-label,.knobs-peek,.knobs-card>*,.knobs-presets,.knobs-preset-chip,.knobs-group-head,.knobs-group-head button,.knobs-card,.knobs-row,.knobs-row>span:first-child,.knobs-slider,.knobs-track,.knobs-label,.knobs-value,.knobs-digits,.knobs-digits *,.knobs-unit,.knobs-seg,.knobs-seg button,.knobs-custom-actions button,.knobs-action,.knobs-select,.knobs-select-value,
|
|
3917
3924
|
.knobs-sub,.knobs-x-head,.knobs-x-label,.knobs-x-read,.knobs-strip-label,.knobs-strip-read,.knobs-pad,.knobs-ease,.knobs-spring-curve,.knobs-ease-chips,.knobs-ease-chip,.knobs-graph,.knobs-graph-read,
|
|
3918
3925
|
.knobs-tabs,.knobs-tab,.knobs-subhead,.knobs-subhead-label,.knobs-match,.knobs-cell,.knobs-cell-axis,.knobs-cell-read,.knobs-link,.knobs-range-read,.knobs-angle,.knobs-angle-read,.knobs-dial,
|
|
3919
|
-
.knobs-seed,.knobs-seed-read,.knobs-seed-digits,.knobs-seed-digits *,.knobs-seed-roll,.knobs-keys,.knobs-keys-text,.knobs-tool,.knobs-tool-label,.knobs-tool-key,
|
|
3926
|
+
.knobs-seed,.knobs-seed-read,.knobs-seed-digits,.knobs-seed-digits *,.knobs-seed-roll,.knobs-keys,.knobs-keys-text,.knobs-tool,.knobs-tool-label,.knobs-tool-key,.knobs-preset-key,
|
|
3920
3927
|
.knobs-section-name,.knobs-section-summary,.knobs-section-desc,.knobs-group-desc,.knobs-group-summary,.knobs-tab-count):not(.knobs-live,.knobs-live *){
|
|
3921
3928
|
background:transparent!important;color:transparent!important;border-color:transparent!important;box-shadow:none!important;
|
|
3922
3929
|
}
|
|
@@ -7057,6 +7064,7 @@ function createPresetStrip(doc, controls, showVariants, run, onAfterChange, pres
|
|
|
7057
7064
|
let initializedPill = false;
|
|
7058
7065
|
let slideUntil = 0;
|
|
7059
7066
|
let display = "auto";
|
|
7067
|
+
let digits = false;
|
|
7060
7068
|
let chipMin = 0;
|
|
7061
7069
|
let scope = null;
|
|
7062
7070
|
const at = () => scope ?? "";
|
|
@@ -7216,14 +7224,21 @@ function createPresetStrip(doc, controls, showVariants, run, onAfterChange, pres
|
|
|
7216
7224
|
}
|
|
7217
7225
|
lastVariantsRef = variantsRef;
|
|
7218
7226
|
const nextEntries = buildEntries();
|
|
7219
|
-
const nextSig = JSON.stringify([scope, nextEntries.map((e) => [e.id, e.label])]);
|
|
7227
|
+
const nextSig = JSON.stringify([scope, digits, nextEntries.map((e) => [e.id, e.label])]);
|
|
7220
7228
|
entries = nextEntries;
|
|
7221
7229
|
syncShown();
|
|
7222
7230
|
if (nextSig !== signature) {
|
|
7223
7231
|
signature = nextSig;
|
|
7224
7232
|
entries = nextEntries;
|
|
7225
7233
|
buttons = entries.map((entry, idx) => {
|
|
7226
|
-
const b = el("button", "knobs-preset-chip"
|
|
7234
|
+
const b = el("button", "knobs-preset-chip");
|
|
7235
|
+
if (digits && idx < 9) {
|
|
7236
|
+
const key = el("span", "knobs-preset-key", String(idx + 1));
|
|
7237
|
+
key.setAttribute("aria-hidden", "true");
|
|
7238
|
+
b.append(key, el("span", "knobs-preset-label", entry.label));
|
|
7239
|
+
b.setAttribute("aria-keyshortcuts", String(idx + 1));
|
|
7240
|
+
} else
|
|
7241
|
+
b.textContent = entry.label;
|
|
7227
7242
|
b.type = "button";
|
|
7228
7243
|
b.tabIndex = -1;
|
|
7229
7244
|
b.dataset.presetId = entry.id;
|
|
@@ -7521,6 +7536,16 @@ function createPresetStrip(doc, controls, showVariants, run, onAfterChange, pres
|
|
|
7521
7536
|
if (placeDisplay())
|
|
7522
7537
|
measurePill(true);
|
|
7523
7538
|
},
|
|
7539
|
+
digits(on) {
|
|
7540
|
+
if (digits === on)
|
|
7541
|
+
return;
|
|
7542
|
+
digits = on;
|
|
7543
|
+
root.toggleAttribute("data-digits", on);
|
|
7544
|
+
if (signature === "")
|
|
7545
|
+
return;
|
|
7546
|
+
signature = "";
|
|
7547
|
+
update();
|
|
7548
|
+
},
|
|
7524
7549
|
save: () => {
|
|
7525
7550
|
let message = "";
|
|
7526
7551
|
run(() => message = save());
|
|
@@ -10638,6 +10663,135 @@ class GpuOverlayManager {
|
|
|
10638
10663
|
d[b + 42] = more ? more[2] : 0;
|
|
10639
10664
|
d[b + 43] = more ? more[3] : 0;
|
|
10640
10665
|
}
|
|
10666
|
+
drawPresetStrip(ps, tokens, clip, hinting, reducedMotion, dt, tray) {
|
|
10667
|
+
let moving = false;
|
|
10668
|
+
const psHovered = this.curPanelHovered && ps.element.matches(":hover");
|
|
10669
|
+
this.curSubHovered = psHovered;
|
|
10670
|
+
const psRect = this.rectOf(ps.element);
|
|
10671
|
+
const trackRect = this.rectOf(ps.track);
|
|
10672
|
+
if (tray && !tokens.boxed)
|
|
10673
|
+
this.pushPrim({
|
|
10674
|
+
x: psRect.left,
|
|
10675
|
+
y: psRect.top,
|
|
10676
|
+
w: psRect.width,
|
|
10677
|
+
h: psRect.height,
|
|
10678
|
+
color: tokens.segBg,
|
|
10679
|
+
color2: tokens.accent,
|
|
10680
|
+
radius: tokens.radius,
|
|
10681
|
+
glowOrBlur: tokens.glowStrength * 8,
|
|
10682
|
+
kind: 1,
|
|
10683
|
+
p0: psHovered || this.isFocused(ps.element) ? 0.4 : 0
|
|
10684
|
+
});
|
|
10685
|
+
const stripClip = intersectClip(clip, [psRect.left, psRect.top, psRect.right, psRect.bottom]);
|
|
10686
|
+
const activeState = ps.getActiveState();
|
|
10687
|
+
const chipButtons = ps.getButtons();
|
|
10688
|
+
if (tokens.boxed)
|
|
10689
|
+
for (const btn of chipButtons) {
|
|
10690
|
+
const br = this.rectOf(btn);
|
|
10691
|
+
if (br.right < stripClip[0] || br.left > stripClip[2])
|
|
10692
|
+
continue;
|
|
10693
|
+
this.drawButtonBox(btn, br, this.isHovered(btn), this.missed(btn, hinting), stripClip);
|
|
10694
|
+
}
|
|
10695
|
+
const activeBtn = activeState.activeIndex >= 0 ? chipButtons[activeState.activeIndex] : undefined;
|
|
10696
|
+
const pe = ps.pillEdges;
|
|
10697
|
+
const activeBtnRect = activeBtn ? this.rectOf(activeBtn) : undefined;
|
|
10698
|
+
const panned = livePill(ps.track);
|
|
10699
|
+
if (activeBtn && activeBtnRect && !activeState.isCustom) {
|
|
10700
|
+
const left = activeBtnRect.left - trackRect.left;
|
|
10701
|
+
const right = left + Math.max(20, activeBtnRect.width);
|
|
10702
|
+
const top = activeBtnRect.top - trackRect.top;
|
|
10703
|
+
this.carry(pe, activeBtn, left, right, ps.pillY, top);
|
|
10704
|
+
if (panned) {
|
|
10705
|
+
pe.snap(panned.left, panned.right);
|
|
10706
|
+
ps.pillY.snap(panned.top);
|
|
10707
|
+
} else if (reducedMotion || pe.end.x - pe.start.x <= 1) {
|
|
10708
|
+
pe.snap(left, right);
|
|
10709
|
+
ps.pillY.snap(top);
|
|
10710
|
+
} else {
|
|
10711
|
+
pe.to(left, right, 0, trailScale(tokens.blurStrength));
|
|
10712
|
+
ps.pillY.set(top);
|
|
10713
|
+
}
|
|
10714
|
+
ps.pillAlpha.set(activeState.drifted ? DRIFTED_PILL : 1);
|
|
10715
|
+
} else {
|
|
10716
|
+
ps.pillAlpha.set(0);
|
|
10717
|
+
}
|
|
10718
|
+
for (const sp of [pe.start, pe.end, ps.pillY, ps.pillAlpha]) {
|
|
10719
|
+
if (reducedMotion)
|
|
10720
|
+
sp.snap(sp.target);
|
|
10721
|
+
else {
|
|
10722
|
+
sp.step(dt);
|
|
10723
|
+
if (!sp.resting)
|
|
10724
|
+
moving = true;
|
|
10725
|
+
}
|
|
10726
|
+
}
|
|
10727
|
+
const pillAlpha = clamp2(ps.pillAlpha.x, 0, 1);
|
|
10728
|
+
if (pillAlpha > 0.01) {
|
|
10729
|
+
this.pushPrim({
|
|
10730
|
+
x: trackRect.left + pe.start.x,
|
|
10731
|
+
y: trackRect.top + ps.pillY.x,
|
|
10732
|
+
w: Math.max(18, pe.end.x - pe.start.x),
|
|
10733
|
+
h: Math.max(16, activeBtnRect?.height ?? trackRect.height),
|
|
10734
|
+
clip: stripClip,
|
|
10735
|
+
color: withAlpha2(tokens.pillBg, pillAlpha),
|
|
10736
|
+
color2: withAlpha2(tokens.pillBorder, pillAlpha),
|
|
10737
|
+
strokeWidth: this.hairline(tokens),
|
|
10738
|
+
aux2: withAlpha2(tokens.rim, tokens.rim[3] * pillAlpha),
|
|
10739
|
+
radius: tokens.buttonRadius ?? tokens.radiusMd,
|
|
10740
|
+
glowOrBlur: tokens.glowStrength,
|
|
10741
|
+
kind: 3,
|
|
10742
|
+
blurX: reducedMotion ? 0 : clamp2(pe.velocity * 0.006 * tokens.motionBlur, -8, 8)
|
|
10743
|
+
});
|
|
10744
|
+
}
|
|
10745
|
+
for (let i = 0;i < chipButtons.length; i++) {
|
|
10746
|
+
const btn = chipButtons[i];
|
|
10747
|
+
const br = this.rectOf(btn);
|
|
10748
|
+
if (br.right < stripClip[0] || br.left > stripClip[2])
|
|
10749
|
+
continue;
|
|
10750
|
+
const isActive = i === activeState.activeIndex;
|
|
10751
|
+
const chipHovered = this.isHovered(btn);
|
|
10752
|
+
if (chipHovered)
|
|
10753
|
+
this.curSubHovered = false;
|
|
10754
|
+
const mark = this.ease(btn, "dot", btn.hasAttribute("data-drifted") ? 1 : 0);
|
|
10755
|
+
if (mark > 0.01) {
|
|
10756
|
+
const size = 4 * (0.4 + 0.6 * mark);
|
|
10757
|
+
this.pushPrim({
|
|
10758
|
+
x: br.right - 6 - size / 2,
|
|
10759
|
+
y: br.top + 6 - size / 2,
|
|
10760
|
+
w: size,
|
|
10761
|
+
h: size,
|
|
10762
|
+
clip: stripClip,
|
|
10763
|
+
color: withAlpha2(tokens.modified, 0.95 * mark),
|
|
10764
|
+
glowOrBlur: 0.5,
|
|
10765
|
+
kind: 7
|
|
10766
|
+
});
|
|
10767
|
+
}
|
|
10768
|
+
if (btn.hasAttribute("data-naming"))
|
|
10769
|
+
continue;
|
|
10770
|
+
const key = btn.querySelector(".knobs-preset-key");
|
|
10771
|
+
const name = key && btn.querySelector(".knobs-preset-label");
|
|
10772
|
+
if (key && name) {
|
|
10773
|
+
const kr = this.rectOf(key);
|
|
10774
|
+
this.drawText(key.textContent ?? "", kr.left, br.top + br.height * 0.5, withAlpha2(tokens.dim, this.missed(btn, hinting)), { px: tokens.textMeta, weight: tokens.labelWeight, clip: stripClip });
|
|
10775
|
+
}
|
|
10776
|
+
const nr = name ? this.rectOf(name) : undefined;
|
|
10777
|
+
this.drawText(name ? name.textContent ?? "" : btn.textContent ?? "", nr ? nr.left : br.left + br.width * 0.5, br.top + br.height * 0.5, withAlpha2(this.hot(btn, isActive || chipHovered, tokens.buttonColor ?? tokens.label), this.missed(btn, hinting)), {
|
|
10778
|
+
px: tokens.buttonFontSize ?? tokens.textControl,
|
|
10779
|
+
weight: isActive ? tokens.titleWeight : tokens.labelWeight,
|
|
10780
|
+
align: nr ? "left" : "center",
|
|
10781
|
+
clip: stripClip
|
|
10782
|
+
});
|
|
10783
|
+
}
|
|
10784
|
+
if (ps.saveButton && !ps.saveButton.hidden) {
|
|
10785
|
+
const sr = this.rectOf(ps.saveButton);
|
|
10786
|
+
const hot = this.isHovered(ps.saveButton);
|
|
10787
|
+
this.drawText("+", sr.left + sr.width * 0.5, sr.top + sr.height * 0.5, this.hot(ps.saveButton, hot, tokens.dim), {
|
|
10788
|
+
px: tokens.textTitle,
|
|
10789
|
+
weight: 400,
|
|
10790
|
+
align: "center"
|
|
10791
|
+
});
|
|
10792
|
+
}
|
|
10793
|
+
return moving;
|
|
10794
|
+
}
|
|
10641
10795
|
hairline(tokens) {
|
|
10642
10796
|
return Math.max(1, Math.round(tokens.rimWidth * this.curScale)) / this.curScale;
|
|
10643
10797
|
}
|
|
@@ -12851,7 +13005,6 @@ class GpuOverlayManager {
|
|
|
12851
13005
|
this.placeBackdrop(panel);
|
|
12852
13006
|
continue;
|
|
12853
13007
|
}
|
|
12854
|
-
const pillFill = tokens.pillBg;
|
|
12855
13008
|
if (pageB)
|
|
12856
13009
|
this.placeBackdrop(panel);
|
|
12857
13010
|
const covers = drawn.some((r) => r.left < card.right && r.right > card.left && r.top < card.bottom && r.bottom > card.top);
|
|
@@ -13019,129 +13172,7 @@ class GpuOverlayManager {
|
|
|
13019
13172
|
const stripAlpha = this.curAlpha;
|
|
13020
13173
|
if (!ps.element.hidden) {
|
|
13021
13174
|
this.curAlpha = stripAlpha * this.presence(ps.element);
|
|
13022
|
-
|
|
13023
|
-
this.curSubHovered = psHovered;
|
|
13024
|
-
const psRect = this.rectOf(ps.element);
|
|
13025
|
-
const trackRect = this.rectOf(ps.track);
|
|
13026
|
-
if (!tokens.boxed)
|
|
13027
|
-
this.pushPrim({
|
|
13028
|
-
x: psRect.left,
|
|
13029
|
-
y: psRect.top,
|
|
13030
|
-
w: psRect.width,
|
|
13031
|
-
h: psRect.height,
|
|
13032
|
-
color: tokens.segBg,
|
|
13033
|
-
color2: tokens.accent,
|
|
13034
|
-
radius: tokens.radius,
|
|
13035
|
-
glowOrBlur: tokens.glowStrength * 8,
|
|
13036
|
-
kind: 1,
|
|
13037
|
-
p0: psHovered || this.isFocused(ps.element) ? 0.4 : 0
|
|
13038
|
-
});
|
|
13039
|
-
const stripClip = intersectClip(bodyClip, [
|
|
13040
|
-
psRect.left,
|
|
13041
|
-
psRect.top,
|
|
13042
|
-
psRect.right,
|
|
13043
|
-
psRect.bottom
|
|
13044
|
-
]);
|
|
13045
|
-
const activeState = ps.getActiveState();
|
|
13046
|
-
const chipButtons = ps.getButtons();
|
|
13047
|
-
if (tokens.boxed)
|
|
13048
|
-
for (const btn of chipButtons) {
|
|
13049
|
-
const br = this.rectOf(btn);
|
|
13050
|
-
if (br.right < stripClip[0] || br.left > stripClip[2])
|
|
13051
|
-
continue;
|
|
13052
|
-
this.drawButtonBox(btn, br, this.isHovered(btn), this.missed(btn, hinting), stripClip);
|
|
13053
|
-
}
|
|
13054
|
-
const activeBtn = activeState.activeIndex >= 0 ? chipButtons[activeState.activeIndex] : undefined;
|
|
13055
|
-
const pe = ps.pillEdges;
|
|
13056
|
-
const activeBtnRect = activeBtn ? this.rectOf(activeBtn) : undefined;
|
|
13057
|
-
const panned = livePill(ps.track);
|
|
13058
|
-
if (activeBtn && activeBtnRect && !activeState.isCustom) {
|
|
13059
|
-
const left = activeBtnRect.left - trackRect.left;
|
|
13060
|
-
const right = left + Math.max(20, activeBtnRect.width);
|
|
13061
|
-
const top = activeBtnRect.top - trackRect.top;
|
|
13062
|
-
this.carry(pe, activeBtn, left, right, ps.pillY, top);
|
|
13063
|
-
if (panned) {
|
|
13064
|
-
pe.snap(panned.left, panned.right);
|
|
13065
|
-
ps.pillY.snap(panned.top);
|
|
13066
|
-
} else if (reducedMotion || pe.end.x - pe.start.x <= 1) {
|
|
13067
|
-
pe.snap(left, right);
|
|
13068
|
-
ps.pillY.snap(top);
|
|
13069
|
-
} else {
|
|
13070
|
-
pe.to(left, right, 0, trailScale(tokens.blurStrength));
|
|
13071
|
-
ps.pillY.set(top);
|
|
13072
|
-
}
|
|
13073
|
-
ps.pillAlpha.set(activeState.drifted ? DRIFTED_PILL : 1);
|
|
13074
|
-
} else {
|
|
13075
|
-
ps.pillAlpha.set(0);
|
|
13076
|
-
}
|
|
13077
|
-
for (const sp of [pe.start, pe.end, ps.pillY, ps.pillAlpha]) {
|
|
13078
|
-
if (reducedMotion)
|
|
13079
|
-
sp.snap(sp.target);
|
|
13080
|
-
else {
|
|
13081
|
-
sp.step(dt);
|
|
13082
|
-
if (!sp.resting)
|
|
13083
|
-
anyMoving = true;
|
|
13084
|
-
}
|
|
13085
|
-
}
|
|
13086
|
-
const pillAlpha = clamp2(ps.pillAlpha.x, 0, 1);
|
|
13087
|
-
if (pillAlpha > 0.01) {
|
|
13088
|
-
this.pushPrim({
|
|
13089
|
-
x: trackRect.left + pe.start.x,
|
|
13090
|
-
y: trackRect.top + ps.pillY.x,
|
|
13091
|
-
w: Math.max(18, pe.end.x - pe.start.x),
|
|
13092
|
-
h: Math.max(16, activeBtnRect?.height ?? trackRect.height),
|
|
13093
|
-
clip: stripClip,
|
|
13094
|
-
color: withAlpha2(pillFill, pillAlpha),
|
|
13095
|
-
color2: withAlpha2(tokens.pillBorder, pillAlpha),
|
|
13096
|
-
strokeWidth: this.hairline(tokens),
|
|
13097
|
-
aux2: withAlpha2(tokens.rim, tokens.rim[3] * pillAlpha),
|
|
13098
|
-
radius: tokens.buttonRadius ?? tokens.radiusMd,
|
|
13099
|
-
glowOrBlur: tokens.glowStrength,
|
|
13100
|
-
kind: 3,
|
|
13101
|
-
blurX: reducedMotion ? 0 : clamp2(pe.velocity * 0.006 * tokens.motionBlur, -8, 8)
|
|
13102
|
-
});
|
|
13103
|
-
}
|
|
13104
|
-
for (let i = 0;i < chipButtons.length; i++) {
|
|
13105
|
-
const btn = chipButtons[i];
|
|
13106
|
-
const br = this.rectOf(btn);
|
|
13107
|
-
if (br.right < stripClip[0] || br.left > stripClip[2])
|
|
13108
|
-
continue;
|
|
13109
|
-
const isActive = i === activeState.activeIndex;
|
|
13110
|
-
const chipHovered = this.isHovered(btn);
|
|
13111
|
-
if (chipHovered)
|
|
13112
|
-
this.curSubHovered = false;
|
|
13113
|
-
const mark = this.ease(btn, "dot", btn.hasAttribute("data-drifted") ? 1 : 0);
|
|
13114
|
-
if (mark > 0.01) {
|
|
13115
|
-
const size = 4 * (0.4 + 0.6 * mark);
|
|
13116
|
-
this.pushPrim({
|
|
13117
|
-
x: br.right - 6 - size / 2,
|
|
13118
|
-
y: br.top + 6 - size / 2,
|
|
13119
|
-
w: size,
|
|
13120
|
-
h: size,
|
|
13121
|
-
clip: stripClip,
|
|
13122
|
-
color: withAlpha2(tokens.modified, 0.95 * mark),
|
|
13123
|
-
glowOrBlur: 0.5,
|
|
13124
|
-
kind: 7
|
|
13125
|
-
});
|
|
13126
|
-
}
|
|
13127
|
-
if (btn.hasAttribute("data-naming"))
|
|
13128
|
-
continue;
|
|
13129
|
-
this.drawText(btn.textContent ?? "", br.left + br.width * 0.5, br.top + br.height * 0.5, withAlpha2(this.hot(btn, isActive || chipHovered, tokens.buttonColor ?? tokens.label), this.missed(btn, hinting)), {
|
|
13130
|
-
px: tokens.buttonFontSize ?? tokens.textControl,
|
|
13131
|
-
weight: isActive ? tokens.titleWeight : tokens.labelWeight,
|
|
13132
|
-
align: "center",
|
|
13133
|
-
clip: stripClip
|
|
13134
|
-
});
|
|
13135
|
-
}
|
|
13136
|
-
if (ps.saveButton && !ps.saveButton.hidden) {
|
|
13137
|
-
const sr = this.rectOf(ps.saveButton);
|
|
13138
|
-
const hot = this.isHovered(ps.saveButton);
|
|
13139
|
-
this.drawText("+", sr.left + sr.width * 0.5, sr.top + sr.height * 0.5, this.hot(ps.saveButton, hot, tokens.dim), {
|
|
13140
|
-
px: tokens.textTitle,
|
|
13141
|
-
weight: 400,
|
|
13142
|
-
align: "center"
|
|
13143
|
-
});
|
|
13144
|
-
}
|
|
13175
|
+
anyMoving = this.drawPresetStrip(ps, tokens, bodyClip, hinting, reducedMotion, dt, true) || anyMoving;
|
|
13145
13176
|
this.curAlpha = stripAlpha;
|
|
13146
13177
|
}
|
|
13147
13178
|
const tabs = panel.tabs;
|
|
@@ -13398,6 +13429,15 @@ class GpuOverlayManager {
|
|
|
13398
13429
|
this.drawScope(card, cr, tokens.radius, 1);
|
|
13399
13430
|
}
|
|
13400
13431
|
}
|
|
13432
|
+
for (const gs of panel.groupStrips?.() ?? []) {
|
|
13433
|
+
const card = gs.element.parentElement;
|
|
13434
|
+
if (!card || gs.element.closest("[hidden]"))
|
|
13435
|
+
continue;
|
|
13436
|
+
const cr = cardRects.get(card) ?? this.rectOf(card);
|
|
13437
|
+
this.curClip = clipToTile(card, intersectClip(bodyClip, [cr.left, cr.top, cr.right, cr.bottom]));
|
|
13438
|
+
this.curAlpha = panelAlpha * this.presence(card) * fadeOf(card);
|
|
13439
|
+
anyMoving = this.drawPresetStrip(gs, tokens, this.curClip, hinting, reducedMotion, dt, false) || anyMoving;
|
|
13440
|
+
}
|
|
13401
13441
|
this.curClip = bodyClip;
|
|
13402
13442
|
this.curAlpha = panelAlpha;
|
|
13403
13443
|
const washed = new Set;
|
|
@@ -20513,7 +20553,7 @@ function presence(el, o = {}) {
|
|
|
20513
20553
|
});
|
|
20514
20554
|
const tune = (seconds, zeta) => {
|
|
20515
20555
|
const reduced = reducedMotion(win);
|
|
20516
|
-
spring.omega = 2 * Math.PI / (reduced ? FADE.duration : seconds);
|
|
20556
|
+
spring.omega = 2 * Math.PI / (reduced ? Math.min(FADE.duration, seconds) : seconds);
|
|
20517
20557
|
spring.zeta = reduced ? 1 : zeta;
|
|
20518
20558
|
};
|
|
20519
20559
|
render();
|
|
@@ -26222,7 +26262,9 @@ function buildPanel(controls, host, options) {
|
|
|
26222
26262
|
if (helpButton?.hidden)
|
|
26223
26263
|
titleEl.title = `${titleEl.textContent ? `${titleEl.textContent}
|
|
26224
26264
|
` : ""}Press ${show("help")} for keyboard shortcuts`;
|
|
26225
|
-
const presetLabel = (id, scope = "") => options.presetLabels?.[id] ?? (id === "default" ? options.defaultLabel : undefined) ?? controls.presetLabel(id, scope);
|
|
26265
|
+
const presetLabel = (id, scope = "") => options.presetLabels?.[id] ?? (id === "default" ? typeof options.defaultLabel === "object" ? options.defaultLabel[scope] : options.defaultLabel : undefined) ?? controls.presetLabel(id, scope);
|
|
26266
|
+
const hintReach = (typeof options.hints === "object" ? options.hints.reach : options.hints) ?? "page";
|
|
26267
|
+
const stripDigitsShown = typeof options.hints === "object" && options.hints.digits === "always";
|
|
26226
26268
|
const presetStrip = createPresetStrip(doc, controls, showVariants, run, () => wakeGpu(), presetLabel, (entries) => presetsTouchTab(entries), () => stripScope());
|
|
26227
26269
|
const tabStrip = createTabStrip(doc, (id, animate) => selectTab(id, animate));
|
|
26228
26270
|
let activeTab;
|
|
@@ -26276,6 +26318,27 @@ function buildPanel(controls, host, options) {
|
|
|
26276
26318
|
reveal(header, any, () => wakeGpu());
|
|
26277
26319
|
};
|
|
26278
26320
|
presetStrip.display(page ? "chips" : options.presetDisplay ?? "auto");
|
|
26321
|
+
presetStrip.digits(stripDigitsShown);
|
|
26322
|
+
const groupStrips = new Map;
|
|
26323
|
+
const tabNamed = (id) => (options.tabs ?? []).some((t) => (typeof t === "string" ? t : t.id) === id) || Object.values(controls.schema).some((f) => f.tab === id);
|
|
26324
|
+
const groupStripFor = (group) => {
|
|
26325
|
+
if (page || !Object.hasOwn(controls.scopes, group) || tabNamed(group))
|
|
26326
|
+
return;
|
|
26327
|
+
let strip = groupStrips.get(group);
|
|
26328
|
+
if (!strip) {
|
|
26329
|
+
strip = createPresetStrip(doc, controls, showVariants, run, () => wakeGpu(), presetLabel, undefined, () => stripScope() === group ? null : group);
|
|
26330
|
+
strip.element.setAttribute("aria-label", `${groupTitle(group)} presets`);
|
|
26331
|
+
strip.display(options.presetDisplay ?? "auto");
|
|
26332
|
+
strip.digits(stripDigitsShown);
|
|
26333
|
+
groupStrips.set(group, strip);
|
|
26334
|
+
}
|
|
26335
|
+
return strip;
|
|
26336
|
+
};
|
|
26337
|
+
const updateStrips = () => {
|
|
26338
|
+
presetStrip.update();
|
|
26339
|
+
for (const strip of groupStrips.values())
|
|
26340
|
+
strip.update();
|
|
26341
|
+
};
|
|
26279
26342
|
const allActions = [
|
|
26280
26343
|
...controls.actions ?? [],
|
|
26281
26344
|
...options.actions ?? []
|
|
@@ -26734,7 +26797,7 @@ function buildPanel(controls, host, options) {
|
|
|
26734
26797
|
const specs = [];
|
|
26735
26798
|
const placed = new Set;
|
|
26736
26799
|
for (const [key, field] of entries) {
|
|
26737
|
-
if (field.kind === "choice" && field.variants &&
|
|
26800
|
+
if (field.kind === "choice" && field.variants && controls.inPresets(key))
|
|
26738
26801
|
continue;
|
|
26739
26802
|
const pair = field.kind === "knob" && field.spring ? halves.get(field.spring.id) : undefined;
|
|
26740
26803
|
if (pair?.duration && pair.bounce && field.kind === "knob" && field.spring) {
|
|
@@ -27432,6 +27495,7 @@ function buildPanel(controls, host, options) {
|
|
|
27432
27495
|
const chosen = [];
|
|
27433
27496
|
const pinnedBlocks = new Set;
|
|
27434
27497
|
const usedSubheads = new Set;
|
|
27498
|
+
const stripped = new Set;
|
|
27435
27499
|
for (const run of runs) {
|
|
27436
27500
|
const at = free.findIndex((b) => b.group === run.group);
|
|
27437
27501
|
const block = at >= 0 ? free.splice(at, 1)[0] : newBlock(run.group);
|
|
@@ -27466,7 +27530,10 @@ function buildPanel(controls, host, options) {
|
|
|
27466
27530
|
under = name;
|
|
27467
27531
|
nodes.push(r.row);
|
|
27468
27532
|
}
|
|
27469
|
-
|
|
27533
|
+
const strip = run.group !== undefined && !stripped.has(run.group) ? groupStripFor(run.group) : undefined;
|
|
27534
|
+
if (strip)
|
|
27535
|
+
stripped.add(run.group);
|
|
27536
|
+
arrange(block.card, strip ? [strip.element, ...nodes] : nodes);
|
|
27470
27537
|
if (animate && at >= 0) {
|
|
27471
27538
|
for (const r of run.rows)
|
|
27472
27539
|
if (entering.has(r))
|
|
@@ -27634,7 +27701,7 @@ function buildPanel(controls, host, options) {
|
|
|
27634
27701
|
const tab = tabOf(r);
|
|
27635
27702
|
return !pinnedRow(r) && (tab === undefined || tab === activeTab) ? r.keys.filter((k) => controls.scopeOf(k) === "") : [];
|
|
27636
27703
|
});
|
|
27637
|
-
const v = variantsOf(controls.schema, controls.
|
|
27704
|
+
const v = variantsOf(controls.schema, (key) => !controls.inPresets(key));
|
|
27638
27705
|
if (v) {
|
|
27639
27706
|
const tab = v.field.tab ?? (v.field.group !== undefined ? groupTab(v.field.group) : undefined);
|
|
27640
27707
|
if (tab === undefined || tab === activeTab)
|
|
@@ -27674,7 +27741,7 @@ function buildPanel(controls, host, options) {
|
|
|
27674
27741
|
writeSession(controls.id, { tab: id });
|
|
27675
27742
|
tabStrip.select(id, animate);
|
|
27676
27743
|
const focused = doc.activeElement;
|
|
27677
|
-
|
|
27744
|
+
updateStrips();
|
|
27678
27745
|
applyVisibility(animate ? "tab" : "instant");
|
|
27679
27746
|
if (focused && root.contains(focused) && focused.closest("[hidden],[data-leaving]"))
|
|
27680
27747
|
tabStrip.focus({ preventScroll: true, focusVisible: false });
|
|
@@ -28121,7 +28188,7 @@ function buildPanel(controls, host, options) {
|
|
|
28121
28188
|
}
|
|
28122
28189
|
const stagger = initialized ? cascade(changedCount) : 0;
|
|
28123
28190
|
const moving = initialized ? rows.filter(changed) : rows;
|
|
28124
|
-
|
|
28191
|
+
updateStrips();
|
|
28125
28192
|
batchMeasures(() => {
|
|
28126
28193
|
for (const row of moving) {
|
|
28127
28194
|
row.slider?.prime();
|
|
@@ -28291,14 +28358,15 @@ function buildPanel(controls, host, options) {
|
|
|
28291
28358
|
if (s.label?.hasAttribute("data-foldable"))
|
|
28292
28359
|
add(s.label, sectionTitle(s.name), () => s.label.focus(), s.label.firstElementChild);
|
|
28293
28360
|
}
|
|
28294
|
-
presetStrip.
|
|
28295
|
-
|
|
28296
|
-
|
|
28297
|
-
|
|
28298
|
-
|
|
28299
|
-
|
|
28300
|
-
|
|
28301
|
-
|
|
28361
|
+
for (const strip of [presetStrip, ...groupStrips.values()])
|
|
28362
|
+
strip.getEntries().forEach((entry, i) => {
|
|
28363
|
+
const chip = strip.getButtons()[i];
|
|
28364
|
+
if (chip)
|
|
28365
|
+
add(chip, entry.label, () => {
|
|
28366
|
+
strip.selectById(entry.id);
|
|
28367
|
+
strip.element.focus({ preventScroll: true });
|
|
28368
|
+
});
|
|
28369
|
+
});
|
|
28302
28370
|
for (const b of root.querySelectorAll(page ? ".knobs-head-cmd, .knobs-group-head button:not(.knobs-group-die,.knobs-group-reset,.knobs-chips button), .knobs-custom-actions button, .knobs-preset-save" : ".knobs-head-cmd, .knobs-group-head button, .knobs-custom-actions button, .knobs-preset-save, .knobs-popover button")) {
|
|
28303
28371
|
add(b, b.dataset.hint ?? b.getAttribute("aria-label") ?? b.textContent ?? "", () => b.focus());
|
|
28304
28372
|
}
|
|
@@ -28317,7 +28385,7 @@ function buildPanel(controls, host, options) {
|
|
|
28317
28385
|
}
|
|
28318
28386
|
return targets;
|
|
28319
28387
|
};
|
|
28320
|
-
const unregisterHints =
|
|
28388
|
+
const unregisterHints = hintReach === "page" && bound("hint") ? pageHints(doc).register(root, () => collectHintTargets().map((t) => ({
|
|
28321
28389
|
el: t.el,
|
|
28322
28390
|
label: t.display,
|
|
28323
28391
|
...t.labelEl ? { labelEl: t.labelEl } : {},
|
|
@@ -28383,6 +28451,9 @@ function buildPanel(controls, host, options) {
|
|
|
28383
28451
|
runs.push({ at: b.head, stops: shown([b.head]) });
|
|
28384
28452
|
for (const sh of subheads.values())
|
|
28385
28453
|
runs.push({ at: sh.el, stops: shown([sh.el]) });
|
|
28454
|
+
for (const gs of groupStrips.values())
|
|
28455
|
+
if (visible(gs.element))
|
|
28456
|
+
runs.push({ at: gs.element, stops: shown([gs.element]) });
|
|
28386
28457
|
runs.push(...strips);
|
|
28387
28458
|
runs.sort((a, b) => a.at.compareDocumentPosition(b.at) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1);
|
|
28388
28459
|
for (const run of runs)
|
|
@@ -28860,6 +28931,9 @@ function buildPanel(controls, host, options) {
|
|
|
28860
28931
|
return { el: sub, level: "row" };
|
|
28861
28932
|
return { el: r.row.closest(".knobs-card > *") ?? r.row, level: "row" };
|
|
28862
28933
|
}
|
|
28934
|
+
const strip = active.closest(".knobs-card > .knobs-presets");
|
|
28935
|
+
if (strip)
|
|
28936
|
+
return { el: strip, level: "row" };
|
|
28863
28937
|
const card = cardOf(active);
|
|
28864
28938
|
return card ? { el: card, level: "card" } : null;
|
|
28865
28939
|
};
|
|
@@ -29049,6 +29123,23 @@ function buildPanel(controls, host, options) {
|
|
|
29049
29123
|
return;
|
|
29050
29124
|
return optionsOf(r);
|
|
29051
29125
|
};
|
|
29126
|
+
const groupStripAt = (node) => node ? [...groupStrips.values()].find((s) => s.element.contains(node)) : undefined;
|
|
29127
|
+
const groupStripOptions = new Map;
|
|
29128
|
+
const optionsOfStrip = (strip) => {
|
|
29129
|
+
let o = groupStripOptions.get(strip);
|
|
29130
|
+
if (!o) {
|
|
29131
|
+
o = {
|
|
29132
|
+
get count() {
|
|
29133
|
+
return strip.getEntries().length;
|
|
29134
|
+
},
|
|
29135
|
+
choose: (i) => strip.select(i),
|
|
29136
|
+
shown: () => strip.getButtons(),
|
|
29137
|
+
anchor: strip.element
|
|
29138
|
+
};
|
|
29139
|
+
groupStripOptions.set(strip, o);
|
|
29140
|
+
}
|
|
29141
|
+
return o;
|
|
29142
|
+
};
|
|
29052
29143
|
const stripDigits = () => visible(presetStrip.element) && presetStrip.getEntries().length > 1;
|
|
29053
29144
|
const stripOptions = {
|
|
29054
29145
|
get count() {
|
|
@@ -29059,7 +29150,12 @@ function buildPanel(controls, host, options) {
|
|
|
29059
29150
|
anchor: presetStrip.element
|
|
29060
29151
|
};
|
|
29061
29152
|
const stripOptionsAt = (node) => {
|
|
29062
|
-
if (hintCtrl.isActive || !node ||
|
|
29153
|
+
if (hintCtrl.isActive || !node || stripDigitsShown)
|
|
29154
|
+
return;
|
|
29155
|
+
const own = groupStripAt(node);
|
|
29156
|
+
if (own)
|
|
29157
|
+
return visible(own.element) && own.getEntries().length > 1 && !own.nameField() ? optionsOfStrip(own) : undefined;
|
|
29158
|
+
if (!stripDigits())
|
|
29063
29159
|
return;
|
|
29064
29160
|
const at = presetStrip.element.contains(node) || focusLevel(node) === "panel";
|
|
29065
29161
|
return at && !presetStrip.nameField() ? stripOptions : undefined;
|
|
@@ -29296,9 +29392,10 @@ function buildPanel(controls, host, options) {
|
|
|
29296
29392
|
}
|
|
29297
29393
|
if (pressed("presets", event)) {
|
|
29298
29394
|
const direction = key === keys.presets[0] ? -1 : 1;
|
|
29299
|
-
const
|
|
29395
|
+
const strip = groupStripAt(target) ?? presetStrip;
|
|
29396
|
+
const presetsShown = visible(strip.element) && strip.getEntries().length > 1;
|
|
29300
29397
|
if (presetsShown)
|
|
29301
|
-
|
|
29398
|
+
strip.cycle(direction);
|
|
29302
29399
|
else if (!cycleTab(direction))
|
|
29303
29400
|
return;
|
|
29304
29401
|
event.preventDefault();
|
|
@@ -29331,6 +29428,8 @@ function buildPanel(controls, host, options) {
|
|
|
29331
29428
|
search.focus();
|
|
29332
29429
|
return;
|
|
29333
29430
|
}
|
|
29431
|
+
if (/^[1-9]$/.test(key) && groupStripAt(target))
|
|
29432
|
+
return;
|
|
29334
29433
|
if (/^[1-9]$/.test(key)) {
|
|
29335
29434
|
const group = page ? focusedGroup(target) : undefined;
|
|
29336
29435
|
const groupDigits = Boolean(group && groupChips.has(group));
|
|
@@ -29391,7 +29490,7 @@ function buildPanel(controls, host, options) {
|
|
|
29391
29490
|
}
|
|
29392
29491
|
if (pressed("save", event) && showVariants) {
|
|
29393
29492
|
event.preventDefault();
|
|
29394
|
-
presetStrip.save();
|
|
29493
|
+
(groupStripAt(target) ?? presetStrip).save();
|
|
29395
29494
|
return;
|
|
29396
29495
|
}
|
|
29397
29496
|
const index = rowAt(target);
|
|
@@ -29890,6 +29989,7 @@ function buildPanel(controls, host, options) {
|
|
|
29890
29989
|
...undock ? {} : { headerDie: { button: randomButton, die } },
|
|
29891
29990
|
locks: lockIcons,
|
|
29892
29991
|
presetStrip,
|
|
29992
|
+
groupStrips: () => groupStrips.values(),
|
|
29893
29993
|
tabs: tabStrip,
|
|
29894
29994
|
groups: gpuGroups,
|
|
29895
29995
|
cards,
|
|
@@ -30018,6 +30118,8 @@ function buildPanel(controls, host, options) {
|
|
|
30018
30118
|
for (const c of groupChips.values())
|
|
30019
30119
|
c.dispose();
|
|
30020
30120
|
presetStrip.dispose();
|
|
30121
|
+
for (const strip of groupStrips.values())
|
|
30122
|
+
strip.dispose();
|
|
30021
30123
|
tabStrip.dispose();
|
|
30022
30124
|
tabMotion.finish();
|
|
30023
30125
|
doc.removeEventListener("keydown", onGlobalKey);
|
package/dist/review-react.js
CHANGED
|
@@ -5046,7 +5046,8 @@ function ancestors(index, id) {
|
|
|
5046
5046
|
out.push(p);
|
|
5047
5047
|
return out;
|
|
5048
5048
|
}
|
|
5049
|
-
function navigate(rows, active,
|
|
5049
|
+
function navigate(rows, active, pressed, page = 10, dir = "ltr") {
|
|
5050
|
+
const key = dir === "rtl" && (pressed === "ArrowLeft" || pressed === "ArrowRight") ? pressed === "ArrowLeft" ? "ArrowRight" : "ArrowLeft" : pressed;
|
|
5050
5051
|
if (rows.length === 0)
|
|
5051
5052
|
return { active: null };
|
|
5052
5053
|
const i = active === null ? -1 : rows.findIndex((r) => r.id === active);
|
|
@@ -5929,7 +5930,8 @@ function tree(container, options) {
|
|
|
5929
5930
|
options.onMove(move);
|
|
5930
5931
|
} else if (nav.includes(e.key) && !e.metaKey && !e.ctrlKey) {
|
|
5931
5932
|
const page = Math.max(1, Math.floor(viewport() / h) - 1);
|
|
5932
|
-
const
|
|
5933
|
+
const dir = win.getComputedStyle(root).direction === "rtl" ? "rtl" : "ltr";
|
|
5934
|
+
const r = navigate(rows, active, e.key, page, dir);
|
|
5933
5935
|
if (r.toggle)
|
|
5934
5936
|
toggle(r.toggle.id, r.toggle.expanded);
|
|
5935
5937
|
else if (r.active) {
|
|
@@ -7643,7 +7645,7 @@ function presence(el, o = {}) {
|
|
|
7643
7645
|
});
|
|
7644
7646
|
const tune = (seconds, zeta) => {
|
|
7645
7647
|
const reduced = reducedMotion(win);
|
|
7646
|
-
spring.omega = 2 * Math.PI / (reduced ? FADE.duration : seconds);
|
|
7648
|
+
spring.omega = 2 * Math.PI / (reduced ? Math.min(FADE.duration, seconds) : seconds);
|
|
7647
7649
|
spring.zeta = reduced ? 1 : zeta;
|
|
7648
7650
|
};
|
|
7649
7651
|
render();
|
package/dist/review-solid.js
CHANGED
|
@@ -5045,7 +5045,8 @@ function ancestors(index, id) {
|
|
|
5045
5045
|
out.push(p);
|
|
5046
5046
|
return out;
|
|
5047
5047
|
}
|
|
5048
|
-
function navigate(rows, active,
|
|
5048
|
+
function navigate(rows, active, pressed, page = 10, dir = "ltr") {
|
|
5049
|
+
const key = dir === "rtl" && (pressed === "ArrowLeft" || pressed === "ArrowRight") ? pressed === "ArrowLeft" ? "ArrowRight" : "ArrowLeft" : pressed;
|
|
5049
5050
|
if (rows.length === 0)
|
|
5050
5051
|
return { active: null };
|
|
5051
5052
|
const i = active === null ? -1 : rows.findIndex((r) => r.id === active);
|
|
@@ -5928,7 +5929,8 @@ function tree(container, options) {
|
|
|
5928
5929
|
options.onMove(move);
|
|
5929
5930
|
} else if (nav.includes(e.key) && !e.metaKey && !e.ctrlKey) {
|
|
5930
5931
|
const page = Math.max(1, Math.floor(viewport() / h) - 1);
|
|
5931
|
-
const
|
|
5932
|
+
const dir = win.getComputedStyle(root).direction === "rtl" ? "rtl" : "ltr";
|
|
5933
|
+
const r = navigate(rows, active, e.key, page, dir);
|
|
5932
5934
|
if (r.toggle)
|
|
5933
5935
|
toggle(r.toggle.id, r.toggle.expanded);
|
|
5934
5936
|
else if (r.active) {
|
|
@@ -7642,7 +7644,7 @@ function presence(el, o = {}) {
|
|
|
7642
7644
|
});
|
|
7643
7645
|
const tune = (seconds, zeta) => {
|
|
7644
7646
|
const reduced = reducedMotion(win);
|
|
7645
|
-
spring.omega = 2 * Math.PI / (reduced ? FADE.duration : seconds);
|
|
7647
|
+
spring.omega = 2 * Math.PI / (reduced ? Math.min(FADE.duration, seconds) : seconds);
|
|
7646
7648
|
spring.zeta = reduced ? 1 : zeta;
|
|
7647
7649
|
};
|
|
7648
7650
|
render();
|