@jsenv/navi 0.22.1 → 0.22.3
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/dist/jsenv_navi.js +182 -188
- package/dist/jsenv_navi.js.map +40 -50
- package/package.json +1 -1
package/dist/jsenv_navi.js
CHANGED
|
@@ -2107,7 +2107,7 @@ const createActionProxyFromSignal = (
|
|
|
2107
2107
|
};
|
|
2108
2108
|
};
|
|
2109
2109
|
|
|
2110
|
-
const nameSignal = signal();
|
|
2110
|
+
const nameSignal = signal(action.name);
|
|
2111
2111
|
const callSourceSignal = signal();
|
|
2112
2112
|
let actionProxy;
|
|
2113
2113
|
{
|
|
@@ -6661,9 +6661,10 @@ const STYLE_PROP_NAME_SET = new Set(Object.keys(All_PROPS));
|
|
|
6661
6661
|
const COPIED_ON_VISUAL_CHILD_PROP_SET = new Set([
|
|
6662
6662
|
...FLOW_PROP_NAME_SET,
|
|
6663
6663
|
"expand",
|
|
6664
|
-
"shrink",
|
|
6665
6664
|
"expandX",
|
|
6666
6665
|
"expandY",
|
|
6666
|
+
"shrink",
|
|
6667
|
+
"align",
|
|
6667
6668
|
"alignX",
|
|
6668
6669
|
"alignY",
|
|
6669
6670
|
]);
|
|
@@ -20008,123 +20009,6 @@ const isSameKey = (browserEventKey, key) => {
|
|
|
20008
20009
|
return false;
|
|
20009
20010
|
};
|
|
20010
20011
|
|
|
20011
|
-
installImportMetaCssBuild(import.meta);const css$7 = /* css */`
|
|
20012
|
-
.navi_text_aligner_anchor {
|
|
20013
|
-
vertical-align: baseline;
|
|
20014
|
-
user-select: none;
|
|
20015
|
-
overflow: hidden;
|
|
20016
|
-
}
|
|
20017
|
-
`;
|
|
20018
|
-
|
|
20019
|
-
/**
|
|
20020
|
-
* Positions children vertically relative to the surrounding text, correcting for font-size differences.
|
|
20021
|
-
*
|
|
20022
|
-
* Place this component around any inline element whose font-size differs from the surrounding text.
|
|
20023
|
-
* It renders an invisible anchor that inherits the surrounding text's font metrics, then shifts
|
|
20024
|
-
* the child so that its visual position matches the requested `align` value — regardless of
|
|
20025
|
-
* font-size, display type (inline, inline-block, inline-flex…), or the active `vertical-align`.
|
|
20026
|
-
*
|
|
20027
|
-
* @param {"center"|"baseline"|"start"|"end"} [align="baseline"]
|
|
20028
|
-
* - `"center"` — child is vertically centered on the surrounding text's ink bounds
|
|
20029
|
-
* - `"baseline"` — no correction applied; child sits wherever the browser places it (default)
|
|
20030
|
-
* - `"start"` — child top aligns with the surrounding text's ink top
|
|
20031
|
-
* - `"end"` — child bottom aligns with the surrounding text's ink bottom
|
|
20032
|
-
* @param {import("ignore:preact").RefObject} childRef — ref on the child element to reposition
|
|
20033
|
-
*/
|
|
20034
|
-
const SurroundingTextAligner = ({
|
|
20035
|
-
children,
|
|
20036
|
-
align = "baseline",
|
|
20037
|
-
childRef,
|
|
20038
|
-
textSize,
|
|
20039
|
-
size
|
|
20040
|
-
}) => {
|
|
20041
|
-
import.meta.css = [css$7, "@jsenv/navi/src/text/surrounding_text_aligner.jsx"];
|
|
20042
|
-
const anchorRef = useRef();
|
|
20043
|
-
useLayoutEffect(() => {
|
|
20044
|
-
const anchorEl = anchorRef.current;
|
|
20045
|
-
const childEl = childRef.current;
|
|
20046
|
-
if (!anchorEl || !childEl) {
|
|
20047
|
-
return;
|
|
20048
|
-
}
|
|
20049
|
-
const topOffset = computeTopOffset({
|
|
20050
|
-
anchorEl,
|
|
20051
|
-
childEl,
|
|
20052
|
-
align
|
|
20053
|
-
});
|
|
20054
|
-
if (topOffset) {
|
|
20055
|
-
childEl.style.position = "relative";
|
|
20056
|
-
childEl.style.top = `${topOffset}px`;
|
|
20057
|
-
} else {
|
|
20058
|
-
childEl.style.position = "";
|
|
20059
|
-
childEl.style.top = "";
|
|
20060
|
-
}
|
|
20061
|
-
}, [size, textSize]);
|
|
20062
|
-
return jsxs(Fragment, {
|
|
20063
|
-
children: [children, jsx("span", {
|
|
20064
|
-
ref: anchorRef,
|
|
20065
|
-
className: "navi_text_aligner_anchor",
|
|
20066
|
-
children: "\u200B"
|
|
20067
|
-
})]
|
|
20068
|
-
});
|
|
20069
|
-
};
|
|
20070
|
-
const computeTopOffset = ({
|
|
20071
|
-
anchorEl,
|
|
20072
|
-
childEl,
|
|
20073
|
-
align
|
|
20074
|
-
}) => {
|
|
20075
|
-
if (align === "baseline") {
|
|
20076
|
-
return 0;
|
|
20077
|
-
}
|
|
20078
|
-
// Only correct when the anchor lives in an inline formatting context.
|
|
20079
|
-
// If the parent is a flex/grid container, inline layout rules don't apply
|
|
20080
|
-
// and our font-metrics model is invalid.
|
|
20081
|
-
const parentDisplay = getComputedStyle(anchorEl.parentElement).display;
|
|
20082
|
-
if (parentDisplay !== "inline" && parentDisplay !== "inline-block" && parentDisplay !== "block") {
|
|
20083
|
-
return 0;
|
|
20084
|
-
}
|
|
20085
|
-
const anchorStyle = getComputedStyle(anchorEl);
|
|
20086
|
-
const anchorMetrics = measureFontAscDesc("M", anchorStyle);
|
|
20087
|
-
const [anchorABA, anchorABD] = anchorMetrics.actual;
|
|
20088
|
-
const anchorActH = anchorABA + anchorABD;
|
|
20089
|
-
const [, anchorFBBD] = anchorMetrics.font;
|
|
20090
|
-
|
|
20091
|
-
// Estimate the baseline Y from the anchor's bounding rect.
|
|
20092
|
-
// For an inline span, the font cell bottom is always at the element's bottom edge
|
|
20093
|
-
// (regardless of vertical-align), so baseline = rect.bottom - fontBoundingBoxDescent.
|
|
20094
|
-
const anchorRect = anchorEl.getBoundingClientRect();
|
|
20095
|
-
const baselineY = anchorRect.bottom - anchorFBBD;
|
|
20096
|
-
const anchorInkTopY = baselineY - anchorABA;
|
|
20097
|
-
|
|
20098
|
-
// Measure the child's current rect, then subtract any previously applied top correction
|
|
20099
|
-
// to recover its natural position — avoiding a style reset + reflow.
|
|
20100
|
-
const childRect = childEl.getBoundingClientRect();
|
|
20101
|
-
const childH = childRect.height;
|
|
20102
|
-
const previousTop = parseFloat(childEl.style.top) || 0;
|
|
20103
|
-
const childNaturalTop = childRect.top - previousTop;
|
|
20104
|
-
|
|
20105
|
-
// Compute desired child top Y based on align intention.
|
|
20106
|
-
let desiredChildTopY = 0;
|
|
20107
|
-
if (align === "center") {
|
|
20108
|
-
const anchorInkCenterY = anchorInkTopY + anchorActH / 2;
|
|
20109
|
-
desiredChildTopY = anchorInkCenterY - childH / 2;
|
|
20110
|
-
} else if (align === "start") {
|
|
20111
|
-
desiredChildTopY = anchorInkTopY;
|
|
20112
|
-
} else if (align === "end") {
|
|
20113
|
-
desiredChildTopY = anchorInkTopY + anchorActH - childH;
|
|
20114
|
-
}
|
|
20115
|
-
return desiredChildTopY - childNaturalTop;
|
|
20116
|
-
};
|
|
20117
|
-
const canvas = document.createElement("canvas");
|
|
20118
|
-
const measureFontAscDesc = (text, computedStyle) => {
|
|
20119
|
-
const ctx = canvas.getContext("2d");
|
|
20120
|
-
ctx.font = `${computedStyle.fontWeight} ${computedStyle.fontSize} ${computedStyle.fontFamily}`;
|
|
20121
|
-
const metrics = ctx.measureText(text);
|
|
20122
|
-
return {
|
|
20123
|
-
actual: [metrics.actualBoundingBoxAscent, metrics.actualBoundingBoxDescent],
|
|
20124
|
-
font: [metrics.fontBoundingBoxAscent, metrics.fontBoundingBoxDescent]
|
|
20125
|
-
};
|
|
20126
|
-
};
|
|
20127
|
-
|
|
20128
20012
|
const useInitialTextSelection = (ref, textSelection) => {
|
|
20129
20013
|
const deps = [];
|
|
20130
20014
|
if (Array.isArray(textSelection)) {
|
|
@@ -20225,7 +20109,7 @@ const selectByTextStrings = (element, range, startText, endText) => {
|
|
|
20225
20109
|
};
|
|
20226
20110
|
|
|
20227
20111
|
installImportMetaCssBuild(import.meta);/* eslint-disable jsenv/no-unknown-params */
|
|
20228
|
-
const css$
|
|
20112
|
+
const css$8 = /* css */`
|
|
20229
20113
|
@layer navi {
|
|
20230
20114
|
.navi_text {
|
|
20231
20115
|
&[data-skeleton] {
|
|
@@ -20534,7 +20418,7 @@ const shouldInjectSpacingBetween = (left, right) => {
|
|
|
20534
20418
|
};
|
|
20535
20419
|
const OverflowPinnedElementContext = createContext(null);
|
|
20536
20420
|
const Text = props => {
|
|
20537
|
-
import.meta.css = [css$
|
|
20421
|
+
import.meta.css = [css$8, "@jsenv/navi/src/text/text.jsx"];
|
|
20538
20422
|
if (props.loading || props.skeleton) {
|
|
20539
20423
|
return jsx(TextSkeleton, {
|
|
20540
20424
|
...props
|
|
@@ -20730,11 +20614,140 @@ const TextBasic = ({
|
|
|
20730
20614
|
});
|
|
20731
20615
|
};
|
|
20732
20616
|
|
|
20733
|
-
installImportMetaCssBuild(import.meta);const css$
|
|
20617
|
+
installImportMetaCssBuild(import.meta);const css$7 = /* css */`
|
|
20618
|
+
.navi_text_anchor {
|
|
20619
|
+
vertical-align: baseline;
|
|
20620
|
+
user-select: none;
|
|
20621
|
+
overflow: hidden;
|
|
20622
|
+
}
|
|
20623
|
+
`;
|
|
20624
|
+
|
|
20625
|
+
/**
|
|
20626
|
+
* Positions children vertically relative to the surrounding text, correcting for font-size differences.
|
|
20627
|
+
*
|
|
20628
|
+
* Place this component around any inline element whose font-size differs from the surrounding text.
|
|
20629
|
+
* It renders an invisible anchor that inherits the surrounding text's font metrics, then shifts
|
|
20630
|
+
* the child so that its visual position matches the requested `textAnchor` value — regardless of
|
|
20631
|
+
* font-size, display type (inline, inline-block, inline-flex…), or the active `vertical-align`.
|
|
20632
|
+
*
|
|
20633
|
+
* @param {"line-top"|"char-top"|"center"|"char-bottom"|"line-bottom"} [textAnchor="char-bottom"]
|
|
20634
|
+
* - `"line-top"` — child top aligns with the top of the surrounding line box
|
|
20635
|
+
* - `"char-top"` — child top aligns with the top of visible characters (ink ascent)
|
|
20636
|
+
* - `"center"` — child is vertically centered on the surrounding line box
|
|
20637
|
+
* - `"char-bottom"` — child bottom aligns to the text baseline (no correction, browser default)
|
|
20638
|
+
* - `"line-bottom"` — child bottom aligns with the bottom of the surrounding line box
|
|
20639
|
+
* @param {{ size?: number, verticalAlign?: string }} [lineLayout]
|
|
20640
|
+
* Describes the surrounding line context. Used as layout-effect dependencies so the correction
|
|
20641
|
+
* reruns when the surrounding text's font-size or vertical-align changes.
|
|
20642
|
+
* @param {import("ignore:preact").RefObject} childRef — ref on the child element to reposition
|
|
20643
|
+
*/
|
|
20644
|
+
const TextAnchor = ({
|
|
20645
|
+
children,
|
|
20646
|
+
textAnchor = "char-bottom",
|
|
20647
|
+
childRef,
|
|
20648
|
+
lineLayout,
|
|
20649
|
+
size
|
|
20650
|
+
}) => {
|
|
20651
|
+
import.meta.css = [css$7, "@jsenv/navi/src/text/text_anchor.jsx"];
|
|
20652
|
+
const anchorRef = useRef();
|
|
20653
|
+
useLayoutEffect(() => {
|
|
20654
|
+
const anchorEl = anchorRef.current;
|
|
20655
|
+
const childEl = childRef.current;
|
|
20656
|
+
if (!anchorEl || !childEl) {
|
|
20657
|
+
return;
|
|
20658
|
+
}
|
|
20659
|
+
const topOffset = computeTopOffset({
|
|
20660
|
+
anchorEl,
|
|
20661
|
+
childEl,
|
|
20662
|
+
textAnchor
|
|
20663
|
+
});
|
|
20664
|
+
if (topOffset) {
|
|
20665
|
+
// position:relative + top shifts the element visually.
|
|
20666
|
+
// marginTop: -topOffset makes the layout box follow the visual position, so any container
|
|
20667
|
+
// (button, link, box…) computes its own padding/border/height based on the real final position
|
|
20668
|
+
// rather than the original unshifted one. This means a badge inside a button will symmetrically
|
|
20669
|
+
// expand the button height instead of overflowing or being clipped.
|
|
20670
|
+
// marginBottom: topOffset compensates the marginTop so the line height stays unchanged —
|
|
20671
|
+
// the shift is purely a repositioning, not an inflation of the line.
|
|
20672
|
+
childEl.style.position = "relative";
|
|
20673
|
+
childEl.style.top = `${topOffset}px`;
|
|
20674
|
+
childEl.style.marginTop = `${-topOffset}px`;
|
|
20675
|
+
childEl.style.marginBottom = `${topOffset}px`;
|
|
20676
|
+
} else {
|
|
20677
|
+
childEl.style.position = "";
|
|
20678
|
+
childEl.style.top = "";
|
|
20679
|
+
childEl.style.marginTop = "";
|
|
20680
|
+
childEl.style.marginBottom = "";
|
|
20681
|
+
}
|
|
20682
|
+
}, [size, textAnchor, lineLayout?.size, lineLayout?.verticalAlign]);
|
|
20683
|
+
return jsxs(Fragment, {
|
|
20684
|
+
children: [children, jsx("span", {
|
|
20685
|
+
ref: anchorRef,
|
|
20686
|
+
className: "navi_text_anchor",
|
|
20687
|
+
children: "\u200B"
|
|
20688
|
+
})]
|
|
20689
|
+
});
|
|
20690
|
+
};
|
|
20691
|
+
const computeTopOffset = ({
|
|
20692
|
+
anchorEl,
|
|
20693
|
+
childEl,
|
|
20694
|
+
textAnchor
|
|
20695
|
+
}) => {
|
|
20696
|
+
if (textAnchor === "char-bottom") {
|
|
20697
|
+
// Align child's bottom with the char's bottom = the baseline.
|
|
20698
|
+
// The CSS spec says an inline-block with no text content has its baseline at its bottom margin edge.
|
|
20699
|
+
// So the browser's default placement already puts the child's bottom at the line's baseline.
|
|
20700
|
+
// No correction needed.
|
|
20701
|
+
return 0;
|
|
20702
|
+
}
|
|
20703
|
+
// Only correct when the anchor lives in an inline formatting context.
|
|
20704
|
+
// If the parent is a flex/grid container, inline layout rules don't apply
|
|
20705
|
+
// and our font-metrics model is invalid.
|
|
20706
|
+
const parentDisplay = getComputedStyle(anchorEl.parentElement).display;
|
|
20707
|
+
if (parentDisplay !== "inline" && parentDisplay !== "inline-block" && parentDisplay !== "block") {
|
|
20708
|
+
return 0;
|
|
20709
|
+
}
|
|
20710
|
+
|
|
20711
|
+
// The anchor's rendered rect corresponds to the surrounding text's line box:
|
|
20712
|
+
// top and bottom are the visual bounds of the line (including line-height).
|
|
20713
|
+
const anchorRect = anchorEl.getBoundingClientRect();
|
|
20714
|
+
|
|
20715
|
+
// Measure the child's current rect, then subtract any previously applied top correction
|
|
20716
|
+
// to recover its natural position — avoiding a style reset + reflow.
|
|
20717
|
+
const childRect = childEl.getBoundingClientRect();
|
|
20718
|
+
const childH = childRect.height;
|
|
20719
|
+
const previousTop = parseFloat(childEl.style.top) || 0;
|
|
20720
|
+
const childNaturalTop = childRect.top - previousTop;
|
|
20721
|
+
|
|
20722
|
+
// Compute desired child top Y based on textAnchor intention.
|
|
20723
|
+
let desiredChildTopY = 0;
|
|
20724
|
+
if (textAnchor === "line-top") {
|
|
20725
|
+
desiredChildTopY = anchorRect.top;
|
|
20726
|
+
} else if (textAnchor === "char-top") {
|
|
20727
|
+
const anchorStyle = getComputedStyle(anchorEl);
|
|
20728
|
+
const ctx = charTopCanvas.getContext("2d");
|
|
20729
|
+
ctx.font = `${anchorStyle.fontWeight} ${anchorStyle.fontSize} ${anchorStyle.fontFamily}`;
|
|
20730
|
+
const m = ctx.measureText("M");
|
|
20731
|
+
const baselineY = anchorRect.bottom - m.fontBoundingBoxDescent;
|
|
20732
|
+
desiredChildTopY = baselineY - m.actualBoundingBoxAscent;
|
|
20733
|
+
} else if (textAnchor === "center") {
|
|
20734
|
+
const anchorCenterY = (anchorRect.top + anchorRect.bottom) / 2;
|
|
20735
|
+
desiredChildTopY = anchorCenterY - childH / 2;
|
|
20736
|
+
} else if (textAnchor === "char-bottom") {
|
|
20737
|
+
// Already handled above (early return 0), but guard here for completeness.
|
|
20738
|
+
return 0;
|
|
20739
|
+
} else if (textAnchor === "line-bottom") {
|
|
20740
|
+
desiredChildTopY = anchorRect.bottom - childH;
|
|
20741
|
+
}
|
|
20742
|
+
return desiredChildTopY - childNaturalTop;
|
|
20743
|
+
};
|
|
20744
|
+
const charTopCanvas = document.createElement("canvas");
|
|
20745
|
+
|
|
20746
|
+
installImportMetaCssBuild(import.meta);const css$6 = /* css */`
|
|
20734
20747
|
@layer navi {
|
|
20735
20748
|
/* Ensure data attributes from box.jsx can win to update display */
|
|
20736
20749
|
.navi_icon {
|
|
20737
|
-
display: inline-
|
|
20750
|
+
display: inline-flex;
|
|
20738
20751
|
box-sizing: border-box;
|
|
20739
20752
|
max-width: 100%;
|
|
20740
20753
|
max-height: 100%;
|
|
@@ -20745,12 +20758,14 @@ installImportMetaCssBuild(import.meta);const css$5 = /* css */`
|
|
|
20745
20758
|
white-space: nowrap;
|
|
20746
20759
|
vertical-align: inherit;
|
|
20747
20760
|
|
|
20748
|
-
&[data-flow-inline] {
|
|
20749
|
-
width: 1em;
|
|
20750
|
-
height: 1em;
|
|
20751
|
-
}
|
|
20752
20761
|
&[data-icon-char] {
|
|
20762
|
+
aspect-ratio: 1/1;
|
|
20763
|
+
min-width: 0;
|
|
20764
|
+
height: 1em;
|
|
20765
|
+
max-height: 1em;
|
|
20753
20766
|
flex-grow: 0 !important;
|
|
20767
|
+
align-items: center;
|
|
20768
|
+
justify-content: center;
|
|
20754
20769
|
|
|
20755
20770
|
svg,
|
|
20756
20771
|
img {
|
|
@@ -20761,32 +20776,15 @@ installImportMetaCssBuild(import.meta);const css$5 = /* css */`
|
|
|
20761
20776
|
overflow: visible;
|
|
20762
20777
|
}
|
|
20763
20778
|
}
|
|
20779
|
+
&[data-flow-inline] {
|
|
20780
|
+
width: 1em;
|
|
20781
|
+
height: 1em;
|
|
20782
|
+
}
|
|
20764
20783
|
&[data-interactive] {
|
|
20765
20784
|
cursor: pointer;
|
|
20766
20785
|
}
|
|
20767
20786
|
}
|
|
20768
20787
|
|
|
20769
|
-
.navi_icon_char_slot {
|
|
20770
|
-
opacity: 0;
|
|
20771
|
-
cursor: default;
|
|
20772
|
-
user-select: none;
|
|
20773
|
-
}
|
|
20774
|
-
.navi_text.navi_icon_foreground {
|
|
20775
|
-
position: absolute;
|
|
20776
|
-
inset: 0;
|
|
20777
|
-
display: inline-flex;
|
|
20778
|
-
|
|
20779
|
-
& > .navi_text {
|
|
20780
|
-
display: flex;
|
|
20781
|
-
aspect-ratio: 1 / 1;
|
|
20782
|
-
min-width: 0;
|
|
20783
|
-
height: 100%;
|
|
20784
|
-
max-height: 1em;
|
|
20785
|
-
align-items: center;
|
|
20786
|
-
justify-content: center;
|
|
20787
|
-
}
|
|
20788
|
-
}
|
|
20789
|
-
|
|
20790
20788
|
.navi_icon > svg,
|
|
20791
20789
|
.navi_icon > img {
|
|
20792
20790
|
width: 100%;
|
|
@@ -20812,16 +20810,13 @@ installImportMetaCssBuild(import.meta);const css$5 = /* css */`
|
|
|
20812
20810
|
const Icon = ({
|
|
20813
20811
|
href,
|
|
20814
20812
|
children,
|
|
20815
|
-
charWidth = 1,
|
|
20816
|
-
// 0 (zéro) is the real char width
|
|
20817
|
-
// but 2 zéros gives too big icons
|
|
20818
|
-
// while 1 "W" gives a nice result
|
|
20819
|
-
baseChar = "W",
|
|
20820
20813
|
decorative,
|
|
20821
20814
|
onClick,
|
|
20815
|
+
textAnchor = "center",
|
|
20816
|
+
lineLayout,
|
|
20822
20817
|
...props
|
|
20823
20818
|
}) => {
|
|
20824
|
-
import.meta.css = [css$
|
|
20819
|
+
import.meta.css = [css$6, "@jsenv/navi/src/text/icon.jsx"];
|
|
20825
20820
|
const innerChildren = href ? jsx("svg", {
|
|
20826
20821
|
width: "100%",
|
|
20827
20822
|
height: "100%",
|
|
@@ -20878,12 +20873,11 @@ const Icon = ({
|
|
|
20878
20873
|
children: innerChildren
|
|
20879
20874
|
});
|
|
20880
20875
|
}
|
|
20881
|
-
|
|
20882
|
-
|
|
20883
|
-
|
|
20876
|
+
return jsx(TextAnchor, {
|
|
20877
|
+
textAnchor: textAnchor,
|
|
20878
|
+
lineLayout: lineLayout,
|
|
20884
20879
|
childRef: textRef,
|
|
20885
20880
|
size: props.size,
|
|
20886
|
-
textSize: props.textSize,
|
|
20887
20881
|
children: jsxs(Text, {
|
|
20888
20882
|
...props,
|
|
20889
20883
|
...ariaProps,
|
|
@@ -20896,14 +20890,9 @@ const Icon = ({
|
|
|
20896
20890
|
onClick: onClick,
|
|
20897
20891
|
ref: textRef,
|
|
20898
20892
|
children: [jsx("span", {
|
|
20899
|
-
|
|
20900
|
-
|
|
20901
|
-
|
|
20902
|
-
}), jsx(Text, {
|
|
20903
|
-
className: "navi_icon_foreground",
|
|
20904
|
-
spacing: "pre",
|
|
20905
|
-
children: innerChildren
|
|
20906
|
-
})]
|
|
20893
|
+
style: "user-select:none",
|
|
20894
|
+
children: "\u200B"
|
|
20895
|
+
}), innerChildren]
|
|
20907
20896
|
})
|
|
20908
20897
|
});
|
|
20909
20898
|
};
|
|
@@ -21429,7 +21418,7 @@ const useUIState = (uiStateController) => {
|
|
|
21429
21418
|
return trackedUIState;
|
|
21430
21419
|
};
|
|
21431
21420
|
|
|
21432
|
-
installImportMetaCssBuild(import.meta);const css$
|
|
21421
|
+
installImportMetaCssBuild(import.meta);const css$5 = /* css */`
|
|
21433
21422
|
@layer navi {
|
|
21434
21423
|
.navi_button {
|
|
21435
21424
|
--button-outline-width: 1px;
|
|
@@ -21444,7 +21433,10 @@ installImportMetaCssBuild(import.meta);const css$4 = /* css */`
|
|
|
21444
21433
|
--button-outline-color: var(--navi-focus-outline-color);
|
|
21445
21434
|
--button-loader-color: var(--navi-loader-color);
|
|
21446
21435
|
--button-border-color: light-dark(#767676, #8e8e93);
|
|
21447
|
-
--button-background-color:
|
|
21436
|
+
--button-background-color: var(
|
|
21437
|
+
--button-background,
|
|
21438
|
+
light-dark(#f3f4f6, #2d3748)
|
|
21439
|
+
);
|
|
21448
21440
|
--button-color: currentColor;
|
|
21449
21441
|
--button-cursor: pointer;
|
|
21450
21442
|
|
|
@@ -21506,7 +21498,6 @@ installImportMetaCssBuild(import.meta);const css$4 = /* css */`
|
|
|
21506
21498
|
box-sizing: border-box;
|
|
21507
21499
|
aspect-ratio: inherit;
|
|
21508
21500
|
padding: 0;
|
|
21509
|
-
vertical-align: middle;
|
|
21510
21501
|
background: none;
|
|
21511
21502
|
border: none;
|
|
21512
21503
|
border-radius: var(--x-button-border-radius);
|
|
@@ -21681,7 +21672,7 @@ installImportMetaCssBuild(import.meta);const css$4 = /* css */`
|
|
|
21681
21672
|
}
|
|
21682
21673
|
`;
|
|
21683
21674
|
const Button = props => {
|
|
21684
|
-
import.meta.css = [css$
|
|
21675
|
+
import.meta.css = [css$5, "@jsenv/navi/src/field/button.jsx"];
|
|
21685
21676
|
return renderActionableComponent(props, {
|
|
21686
21677
|
Basic: ButtonBasic,
|
|
21687
21678
|
WithAction: ButtonWithAction,
|
|
@@ -22246,7 +22237,7 @@ const useDimColorWhen = (elementRef, shouldDim) => {
|
|
|
22246
22237
|
};
|
|
22247
22238
|
|
|
22248
22239
|
installImportMetaCssBuild(import.meta);/* eslint-disable jsenv/no-unknown-params */
|
|
22249
|
-
const css$
|
|
22240
|
+
const css$4 = /* css */`
|
|
22250
22241
|
@layer navi {
|
|
22251
22242
|
.navi_link {
|
|
22252
22243
|
--link-border-radius: unset;
|
|
@@ -22567,7 +22558,7 @@ Object.assign(PSEUDO_CLASSES, {
|
|
|
22567
22558
|
}
|
|
22568
22559
|
});
|
|
22569
22560
|
const Link = props => {
|
|
22570
|
-
import.meta.css = [css$
|
|
22561
|
+
import.meta.css = [css$4, "@jsenv/navi/src/nav/link/link.jsx"];
|
|
22571
22562
|
return renderActionableComponent(props, {
|
|
22572
22563
|
Basic: LinkBasic,
|
|
22573
22564
|
WithAction: LinkWithAction
|
|
@@ -22829,7 +22820,7 @@ installImportMetaCssBuild(import.meta);/**
|
|
|
22829
22820
|
* TabList component with support for horizontal and vertical layouts
|
|
22830
22821
|
* https://dribbble.com/search/tabs
|
|
22831
22822
|
*/
|
|
22832
|
-
const css$
|
|
22823
|
+
const css$3 = /* css */`
|
|
22833
22824
|
@layer navi {
|
|
22834
22825
|
.navi_nav {
|
|
22835
22826
|
--nav-border: none;
|
|
@@ -22866,6 +22857,8 @@ const css$2 = /* css */`
|
|
|
22866
22857
|
/* overflow-y: hidden; */
|
|
22867
22858
|
|
|
22868
22859
|
.navi_link {
|
|
22860
|
+
user-select: none;
|
|
22861
|
+
|
|
22869
22862
|
--x-nav-child-border-radius: calc(
|
|
22870
22863
|
var(--nav-border-radius) - var(--nav-padding)
|
|
22871
22864
|
);
|
|
@@ -22963,7 +22956,7 @@ const Nav = ({
|
|
|
22963
22956
|
panelBorderConnection,
|
|
22964
22957
|
...props
|
|
22965
22958
|
}) => {
|
|
22966
|
-
import.meta.css = [css$
|
|
22959
|
+
import.meta.css = [css$3, "@jsenv/navi/src/nav/link/nav.jsx"];
|
|
22967
22960
|
children = toChildArray(children);
|
|
22968
22961
|
return jsx(Box, {
|
|
22969
22962
|
as: "nav",
|
|
@@ -24852,7 +24845,7 @@ const InputRadioWithAction = () => {
|
|
|
24852
24845
|
throw new Error(`<Input type="radio" /> with an action make no sense. Use <RadioList action={something} /> instead`);
|
|
24853
24846
|
};
|
|
24854
24847
|
|
|
24855
|
-
installImportMetaCssBuild(import.meta);
|
|
24848
|
+
installImportMetaCssBuild(import.meta);const css$2 = /* css */`
|
|
24856
24849
|
@layer navi {
|
|
24857
24850
|
.navi_input_range {
|
|
24858
24851
|
--border-radius: 6px;
|
|
@@ -25059,8 +25052,9 @@ installImportMetaCssBuild(import.meta);import.meta.css = [/* css */`
|
|
|
25059
25052
|
.navi_input_range[data-callout] {
|
|
25060
25053
|
/* What can we do? */
|
|
25061
25054
|
}
|
|
25062
|
-
|
|
25055
|
+
`;
|
|
25063
25056
|
const InputRange = props => {
|
|
25057
|
+
import.meta.css = [css$2, "@jsenv/navi/src/field/input_range.jsx"];
|
|
25064
25058
|
const uiStateController = useUIStateController(props, "input");
|
|
25065
25059
|
const uiState = useUIState(uiStateController);
|
|
25066
25060
|
const input = renderActionableComponent(props, {
|
|
@@ -26549,10 +26543,10 @@ const RadioListBasic = props => {
|
|
|
26549
26543
|
const innerDisabled = disabled || contextDisabled;
|
|
26550
26544
|
return jsx(Box, {
|
|
26551
26545
|
"data-action": rest["data-action"],
|
|
26552
|
-
|
|
26546
|
+
flex: "y",
|
|
26553
26547
|
...rest,
|
|
26554
26548
|
baseClassName: "navi_radio_list",
|
|
26555
|
-
"data-radio-list":
|
|
26549
|
+
"data-radio-list": "",
|
|
26556
26550
|
onresetuistate: e => {
|
|
26557
26551
|
uiStateController.resetUIState(e);
|
|
26558
26552
|
},
|
|
@@ -30664,10 +30658,11 @@ const BadgeCount = ({
|
|
|
30664
30658
|
// so that visually the interface do not suddently switch from circle to ellipse depending on the count
|
|
30665
30659
|
circle,
|
|
30666
30660
|
max = circle ? MAX_FOR_CIRCLE : Infinity,
|
|
30667
|
-
textSize,
|
|
30668
30661
|
integer,
|
|
30669
30662
|
lang,
|
|
30670
30663
|
loading,
|
|
30664
|
+
textAnchor = "center",
|
|
30665
|
+
lineLayout,
|
|
30671
30666
|
...props
|
|
30672
30667
|
}) => {
|
|
30673
30668
|
import.meta.css = [css, "@jsenv/navi/src/text/badge_count.jsx"];
|
|
@@ -30690,11 +30685,11 @@ const BadgeCount = ({
|
|
|
30690
30685
|
circle = false;
|
|
30691
30686
|
}
|
|
30692
30687
|
if (circle) {
|
|
30693
|
-
return jsx(
|
|
30694
|
-
|
|
30688
|
+
return jsx(TextAnchor, {
|
|
30689
|
+
textAnchor: textAnchor,
|
|
30690
|
+
lineLayout: lineLayout,
|
|
30695
30691
|
childRef: ref,
|
|
30696
30692
|
size: props.size,
|
|
30697
|
-
textSize: textSize,
|
|
30698
30693
|
children: jsxs(BadgeCountCircle, {
|
|
30699
30694
|
...props,
|
|
30700
30695
|
loading: loading,
|
|
@@ -30708,11 +30703,11 @@ const BadgeCount = ({
|
|
|
30708
30703
|
const valueFormatted = typeof valueDisplayed === "number" ? formatNumber(valueDisplayed, {
|
|
30709
30704
|
lang
|
|
30710
30705
|
}) : valueDisplayed;
|
|
30711
|
-
return jsx(
|
|
30712
|
-
|
|
30706
|
+
return jsx(TextAnchor, {
|
|
30707
|
+
textAnchor: textAnchor,
|
|
30708
|
+
lineLayout: lineLayout,
|
|
30713
30709
|
childRef: ref,
|
|
30714
30710
|
size: props.size,
|
|
30715
|
-
textSize: textSize,
|
|
30716
30711
|
children: jsxs(BadgeCountEllipse, {
|
|
30717
30712
|
...props,
|
|
30718
30713
|
loading: loading,
|
|
@@ -31651,10 +31646,9 @@ const getMeterLevel = (value, min, max, low, high, optimum) => {
|
|
|
31651
31646
|
|
|
31652
31647
|
const Paragraph = props => {
|
|
31653
31648
|
return jsx(Text, {
|
|
31654
|
-
marginTop: "
|
|
31649
|
+
marginTop: "m",
|
|
31655
31650
|
...props,
|
|
31656
|
-
as: "p"
|
|
31657
|
-
...props
|
|
31651
|
+
as: "p"
|
|
31658
31652
|
});
|
|
31659
31653
|
};
|
|
31660
31654
|
|