@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.
@@ -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$6 = /* 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$6, "@jsenv/navi/src/text/text.jsx"];
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$5 = /* 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-block;
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$5, "@jsenv/navi/src/text/icon.jsx"];
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
- const invisibleText = baseChar.repeat(charWidth);
20882
- return jsx(SurroundingTextAligner, {
20883
- align: "center",
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
- className: "navi_icon_char_slot",
20900
- "aria-hidden": "true",
20901
- children: invisibleText
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$4 = /* 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: light-dark(#f3f4f6, #2d3748);
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$4, "@jsenv/navi/src/field/button.jsx"];
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$3 = /* 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$3, "@jsenv/navi/src/nav/link/link.jsx"];
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$2 = /* 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$2, "@jsenv/navi/src/nav/link/nav.jsx"];
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);import.meta.css = [/* css */`
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
- `, "@jsenv/navi/src/field/input_range.jsx"];
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
- row: true,
26546
+ flex: "y",
26553
26547
  ...rest,
26554
26548
  baseClassName: "navi_radio_list",
26555
- "data-radio-list": true,
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(SurroundingTextAligner, {
30694
- align: "center",
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(SurroundingTextAligner, {
30712
- align: "center",
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: "md",
31649
+ marginTop: "m",
31655
31650
  ...props,
31656
- as: "p",
31657
- ...props
31651
+ as: "p"
31658
31652
  });
31659
31653
  };
31660
31654