@tinybigui/react 0.17.0 → 0.19.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/dist/index.cjs CHANGED
@@ -8616,6 +8616,30 @@ var InteractiveStyledListItem = React.forwardRef(
8616
8616
  }
8617
8617
  );
8618
8618
  InteractiveStyledListItem.displayName = "InteractiveStyledListItem";
8619
+ var ArrowBackIcon = () => /* @__PURE__ */ jsxRuntime.jsx(
8620
+ "svg",
8621
+ {
8622
+ width: "24",
8623
+ height: "24",
8624
+ viewBox: "0 0 24 24",
8625
+ fill: "currentColor",
8626
+ "aria-hidden": "true",
8627
+ focusable: "false",
8628
+ children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z" })
8629
+ }
8630
+ );
8631
+ var CloseIcon3 = () => /* @__PURE__ */ jsxRuntime.jsx(
8632
+ "svg",
8633
+ {
8634
+ width: "24",
8635
+ height: "24",
8636
+ viewBox: "0 0 24 24",
8637
+ fill: "currentColor",
8638
+ "aria-hidden": "true",
8639
+ focusable: "false",
8640
+ children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" })
8641
+ }
8642
+ );
8619
8643
  var SearchBarHeadless = React.forwardRef(
8620
8644
  ({
8621
8645
  value,
@@ -8631,7 +8655,9 @@ var SearchBarHeadless = React.forwardRef(
8631
8655
  "aria-label": ariaLabel,
8632
8656
  className,
8633
8657
  onFocus,
8634
- onBlur
8658
+ onBlur,
8659
+ inputClassName,
8660
+ trailingActionsClassName
8635
8661
  }, forwardedRef) => {
8636
8662
  const inputRef = React.useRef(null);
8637
8663
  const internalFormRef = React.useRef(null);
@@ -8665,8 +8691,17 @@ var SearchBarHeadless = React.forwardRef(
8665
8691
  );
8666
8692
  return /* @__PURE__ */ jsxRuntime.jsxs("form", { ref: formRef, role: "search", className, onSubmit: handleFormSubmit, children: [
8667
8693
  leadingIcon && /* @__PURE__ */ jsxRuntime.jsx("span", { "data-slot": "leading-icon", children: leadingIcon }),
8668
- /* @__PURE__ */ jsxRuntime.jsx("input", { ...inputProps, ref: inputRef, role: "searchbox" }),
8669
- trailingActions && trailingActions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { "data-slot": "trailing-actions", children: trailingActions.map((action, index) => /* @__PURE__ */ jsxRuntime.jsx("span", { "data-slot": "trailing-action", children: action }, index)) }),
8694
+ /* @__PURE__ */ jsxRuntime.jsx(
8695
+ "input",
8696
+ {
8697
+ ...inputProps,
8698
+ ref: inputRef,
8699
+ role: "searchbox",
8700
+ "data-slot": "input",
8701
+ className: inputClassName
8702
+ }
8703
+ ),
8704
+ trailingActions && trailingActions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { "data-slot": "trailing-actions", className: trailingActionsClassName, children: trailingActions }),
8670
8705
  avatar && /* @__PURE__ */ jsxRuntime.jsx("span", { "data-slot": "avatar", children: avatar })
8671
8706
  ] });
8672
8707
  }
@@ -8686,32 +8721,45 @@ var SearchViewHeadless = React.forwardRef(
8686
8721
  children,
8687
8722
  leadingIcon,
8688
8723
  trailingActions,
8689
- showDivider
8724
+ showDivider,
8725
+ layout = "fullscreen",
8726
+ headerClassName,
8727
+ backButtonClassName,
8728
+ clearButtonClassName,
8729
+ inputClassName,
8730
+ trailingActionsClassName,
8731
+ dividerClassName,
8732
+ contentClassName
8690
8733
  }, forwardedRef) => {
8691
8734
  if (!isOpen) {
8692
8735
  return null;
8693
8736
  }
8694
- return reactDom.createPortal(
8695
- /* @__PURE__ */ jsxRuntime.jsx(
8696
- SearchViewPanel,
8697
- {
8698
- ref: forwardedRef,
8699
- onClose,
8700
- ariaLabel,
8701
- ...className !== void 0 ? { className } : {},
8702
- ...leadingIcon !== void 0 ? { leadingIcon } : {},
8703
- ...trailingActions !== void 0 ? { trailingActions } : {},
8704
- ...showDivider !== void 0 ? { showDivider } : {},
8705
- ...value !== void 0 ? { value } : {},
8706
- ...defaultValue !== void 0 ? { defaultValue } : {},
8707
- ...onChange !== void 0 ? { onChange } : {},
8708
- ...onSubmit !== void 0 ? { onSubmit } : {},
8709
- ...placeholder !== void 0 ? { placeholder } : {},
8710
- children
8711
- }
8712
- ),
8713
- document.body
8714
- );
8737
+ const panelProps = {
8738
+ onClose,
8739
+ ariaLabel,
8740
+ layout,
8741
+ children,
8742
+ ...className !== void 0 ? { className } : {},
8743
+ ...leadingIcon !== void 0 ? { leadingIcon } : {},
8744
+ ...trailingActions !== void 0 ? { trailingActions } : {},
8745
+ ...showDivider !== void 0 ? { showDivider } : {},
8746
+ ...value !== void 0 ? { value } : {},
8747
+ ...defaultValue !== void 0 ? { defaultValue } : {},
8748
+ ...onChange !== void 0 ? { onChange } : {},
8749
+ ...onSubmit !== void 0 ? { onSubmit } : {},
8750
+ ...placeholder !== void 0 ? { placeholder } : {},
8751
+ headerClassName,
8752
+ backButtonClassName,
8753
+ clearButtonClassName,
8754
+ inputClassName,
8755
+ trailingActionsClassName,
8756
+ dividerClassName,
8757
+ contentClassName
8758
+ };
8759
+ if (layout === "docked") {
8760
+ return /* @__PURE__ */ jsxRuntime.jsx(SearchViewPanel, { ref: forwardedRef, ...panelProps });
8761
+ }
8762
+ return reactDom.createPortal(/* @__PURE__ */ jsxRuntime.jsx(SearchViewPanel, { ref: forwardedRef, ...panelProps }), document.body);
8715
8763
  }
8716
8764
  );
8717
8765
  SearchViewHeadless.displayName = "SearchViewHeadless";
@@ -8728,12 +8776,21 @@ var SearchViewPanel = React.forwardRef(
8728
8776
  children,
8729
8777
  leadingIcon,
8730
8778
  trailingActions,
8731
- showDivider
8779
+ showDivider,
8780
+ layout,
8781
+ headerClassName,
8782
+ backButtonClassName,
8783
+ clearButtonClassName,
8784
+ inputClassName,
8785
+ trailingActionsClassName,
8786
+ dividerClassName,
8787
+ contentClassName
8732
8788
  }, forwardedRef) => {
8733
8789
  const panelRef = React.useRef(null);
8734
8790
  const inputRef = React.useRef(null);
8735
8791
  const ref = forwardedRef ?? panelRef;
8736
- reactAria.usePreventScroll();
8792
+ const isFullscreen = layout === "fullscreen";
8793
+ reactAria.usePreventScroll({ isDisabled: !isFullscreen });
8737
8794
  const { overlayProps } = reactAria.useOverlay(
8738
8795
  {
8739
8796
  isOpen: true,
@@ -8766,7 +8823,17 @@ var SearchViewPanel = React.forwardRef(
8766
8823
  const handleBackClick = React.useCallback(() => {
8767
8824
  onClose();
8768
8825
  }, [onClose]);
8769
- const defaultBackArrow = /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", "aria-label": "Back", onClick: handleBackClick, "data-slot": "back-button", children: "\u2190" });
8826
+ const defaultBackButton = /* @__PURE__ */ jsxRuntime.jsx(
8827
+ "button",
8828
+ {
8829
+ type: "button",
8830
+ "aria-label": "Back",
8831
+ onClick: handleBackClick,
8832
+ "data-slot": "back-button",
8833
+ className: backButtonClassName,
8834
+ children: /* @__PURE__ */ jsxRuntime.jsx(ArrowBackIcon, {})
8835
+ }
8836
+ );
8770
8837
  const clearButton = state.value ? /* @__PURE__ */ jsxRuntime.jsx(
8771
8838
  "button",
8772
8839
  {
@@ -8775,66 +8842,109 @@ var SearchViewPanel = React.forwardRef(
8775
8842
  type: "button",
8776
8843
  "aria-label": "Clear search",
8777
8844
  "data-slot": "clear-button",
8778
- children: "\u2715"
8845
+ className: clearButtonClassName,
8846
+ children: /* @__PURE__ */ jsxRuntime.jsx(CloseIcon3, {})
8779
8847
  }
8780
8848
  ) : null;
8781
- return /* @__PURE__ */ jsxRuntime.jsx(reactAria.FocusScope, { contain: true, restoreFocus: true, autoFocus: true, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { ...overlayProps, ref, role: "search", "aria-label": ariaLabel, className, children: [
8782
- /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-slot": "header", children: [
8783
- /* @__PURE__ */ jsxRuntime.jsx("span", { "data-slot": "leading-icon", children: leadingIcon ?? defaultBackArrow }),
8784
- /* @__PURE__ */ jsxRuntime.jsx("input", { ...inputProps, ref: inputRef, role: "searchbox" }),
8785
- clearButton,
8786
- trailingActions && trailingActions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { "data-slot": "trailing-actions", children: trailingActions.map((action, index) => /* @__PURE__ */ jsxRuntime.jsx("span", { "data-slot": "trailing-action", children: action }, index)) })
8787
- ] }),
8788
- showDivider && /* @__PURE__ */ jsxRuntime.jsx("hr", { "data-slot": "divider" }),
8789
- /* @__PURE__ */ jsxRuntime.jsx("div", { "data-slot": "content", "aria-live": "polite", children })
8790
- ] }) });
8849
+ return (
8850
+ // Focus containment only for fullscreen docked uses restoreFocus + autoFocus only
8851
+ // so tabbing can naturally leave the widget.
8852
+ /* @__PURE__ */ jsxRuntime.jsx(reactAria.FocusScope, { contain: isFullscreen, restoreFocus: true, autoFocus: true, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { ...overlayProps, ref, role: "search", "aria-label": ariaLabel, className, children: [
8853
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-slot": "header", className: headerClassName, children: [
8854
+ leadingIcon ?? defaultBackButton,
8855
+ /* @__PURE__ */ jsxRuntime.jsx(
8856
+ "input",
8857
+ {
8858
+ ...inputProps,
8859
+ ref: inputRef,
8860
+ role: "searchbox",
8861
+ "data-slot": "input",
8862
+ className: inputClassName
8863
+ }
8864
+ ),
8865
+ clearButton,
8866
+ trailingActions && trailingActions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { "data-slot": "trailing-actions", className: trailingActionsClassName, children: trailingActions })
8867
+ ] }),
8868
+ showDivider && /* @__PURE__ */ jsxRuntime.jsx("hr", { "data-slot": "divider", className: dividerClassName }),
8869
+ /* @__PURE__ */ jsxRuntime.jsx("div", { "data-slot": "content", "aria-live": "polite", className: contentClassName, children })
8870
+ ] }) })
8871
+ );
8791
8872
  }
8792
8873
  );
8793
8874
  SearchViewPanel.displayName = "SearchViewPanel";
8794
- var searchBarVariants = classVarianceAuthority.cva(
8875
+ var searchBarRootVariants = classVarianceAuthority.cva(
8795
8876
  [
8796
- "relative flex items-center h-14 rounded-full bg-surface-container-high",
8797
- "shadow-elevation-3 w-full text-body-large cursor-text"
8877
+ "relative flex items-center h-14 rounded-full",
8878
+ "bg-surface-container-high shadow-elevation-3",
8879
+ "w-full text-body-large cursor-text",
8880
+ // Disabled — self-targeting; pointer-events lets ripple/hover stop cleanly
8881
+ "data-[disabled]:opacity-38 data-[disabled]:pointer-events-none data-[disabled]:cursor-not-allowed"
8798
8882
  ],
8799
8883
  {
8800
8884
  variants: {
8885
+ /**
8886
+ * Visual style of the search bar.
8887
+ * - contained: M3 Expressive — fills container, expressive motion, adjustable spacing
8888
+ * - divided: Baseline — 16dp fixed spacing, no expressive motion
8889
+ */
8801
8890
  style: {
8802
- contained: "",
8891
+ /**
8892
+ * Contained (Expressive): spacing governed by data-[with-actions] content flag.
8893
+ * With actions: px-1 gap-1 (4dp each)
8894
+ * Without actions: px-4 (16dp each)
8895
+ */
8896
+ contained: [
8897
+ "px-4",
8898
+ // default: no-actions 16dp
8899
+ "data-[with-actions]:px-1 data-[with-actions]:gap-1"
8900
+ // with-actions: 4dp
8901
+ ],
8902
+ /**
8903
+ * Divided (Baseline): fixed 16dp side padding, 16dp icon-label gap.
8904
+ */
8803
8905
  divided: "px-4 gap-4"
8804
- },
8805
- noActions: {
8806
- true: "",
8807
- false: ""
8808
- },
8809
- focused: {
8810
- true: "",
8811
- false: ""
8812
- },
8813
- disabled: {
8814
- true: "opacity-38 pointer-events-none",
8815
- false: ""
8816
8906
  }
8817
8907
  },
8818
- compoundVariants: [
8819
- {
8820
- style: "contained",
8821
- noActions: false,
8822
- class: "px-1 gap-1"
8823
- },
8824
- {
8825
- style: "contained",
8826
- noActions: true,
8827
- class: "px-4"
8828
- }
8829
- ],
8830
- defaultVariants: {
8831
- style: "contained",
8832
- noActions: false,
8833
- focused: false,
8834
- disabled: false
8835
- }
8908
+ defaultVariants: { style: "contained" }
8836
8909
  }
8837
8910
  );
8911
+ var searchBarStateLayerVariants = classVarianceAuthority.cva([
8912
+ "absolute inset-0 rounded-full pointer-events-none opacity-0",
8913
+ "bg-on-surface",
8914
+ // Effects transition — no overshoot on opacity
8915
+ "transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects",
8916
+ // Hover: 8%
8917
+ "group-data-[hovered]/search:opacity-8",
8918
+ // Pressed: 10%, doubled selector wins over hover at equal cascade position
8919
+ "group-data-[pressed]/search:group-data-[pressed]/search:opacity-10",
8920
+ // No state layer when disabled
8921
+ "group-data-[disabled]/search:hidden"
8922
+ ]);
8923
+ var searchBarFocusRingVariants = classVarianceAuthority.cva([
8924
+ "pointer-events-none absolute inset-[-3px] rounded-full",
8925
+ "outline outline-[3px] outline-offset-0 outline-secondary",
8926
+ // Effects transition
8927
+ "transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects",
8928
+ "opacity-0",
8929
+ "group-data-[focus-visible]/search:opacity-100"
8930
+ ]);
8931
+ var searchBarLeadingIconVariants = classVarianceAuthority.cva([
8932
+ "flex size-12 shrink-0 items-center justify-center text-on-surface"
8933
+ ]);
8934
+ var searchBarTrailingActionVariants = classVarianceAuthority.cva([
8935
+ "flex size-12 shrink-0 items-center justify-center text-on-surface-variant"
8936
+ ]);
8937
+ var searchBarAvatarVariants = classVarianceAuthority.cva(["flex size-12 shrink-0 items-center justify-center"]);
8938
+ var searchBarTrailingActionsVariants = classVarianceAuthority.cva(["flex items-center"]);
8939
+ var searchBarInputVariants = classVarianceAuthority.cva([
8940
+ "flex-1 min-w-0 bg-transparent outline-none",
8941
+ "text-body-large text-on-surface",
8942
+ "placeholder:text-on-surface-variant",
8943
+ "focus-visible:outline-none",
8944
+ // Hide native browser search affordances — our MD3 clear button handles clearing
8945
+ "[&::-webkit-search-cancel-button]:appearance-none",
8946
+ "[&::-webkit-search-decoration]:appearance-none"
8947
+ ]);
8838
8948
  var searchViewVariants = classVarianceAuthority.cva(["flex flex-col shadow-elevation-3 z-50 overflow-hidden"], {
8839
8949
  variants: {
8840
8950
  style: {
@@ -8847,31 +8957,32 @@ var searchViewVariants = classVarianceAuthority.cva(["flex flex-col shadow-eleva
8847
8957
  }
8848
8958
  },
8849
8959
  compoundVariants: [
8960
+ // Contained + fullscreen: surface-container-low, square corners
8850
8961
  {
8851
8962
  style: "contained",
8852
8963
  layout: "fullscreen",
8853
8964
  class: "bg-surface-container-low rounded-none"
8854
8965
  },
8966
+ // Contained + docked: surface-container-high, 12dp results rounding, 2dp gap
8855
8967
  {
8856
8968
  style: "contained",
8857
8969
  layout: "docked",
8858
8970
  class: "bg-surface-container-high rounded-xl gap-0.5"
8859
8971
  },
8972
+ // Divided + fullscreen: surface-container-high, square corners
8860
8973
  {
8861
8974
  style: "divided",
8862
8975
  layout: "fullscreen",
8863
8976
  class: "bg-surface-container-high rounded-none"
8864
8977
  },
8978
+ // Divided + docked: surface-container-high, extra-large rounding (28dp)
8865
8979
  {
8866
8980
  style: "divided",
8867
8981
  layout: "docked",
8868
8982
  class: "bg-surface-container-high rounded-[28px]"
8869
8983
  }
8870
8984
  ],
8871
- defaultVariants: {
8872
- style: "contained",
8873
- layout: "fullscreen"
8874
- }
8985
+ defaultVariants: { style: "contained", layout: "fullscreen" }
8875
8986
  });
8876
8987
  var searchViewHeaderVariants = classVarianceAuthority.cva(
8877
8988
  ["flex items-center w-full bg-surface-container-high gap-1"],
@@ -8882,14 +8993,50 @@ var searchViewHeaderVariants = classVarianceAuthority.cva(
8882
8993
  divided: "h-[72px] px-4"
8883
8994
  },
8884
8995
  layout: {
8996
+ // Docked overrides height to 56dp regardless of style
8885
8997
  docked: "h-14",
8886
8998
  fullscreen: ""
8887
8999
  }
8888
9000
  },
8889
- defaultVariants: {
8890
- style: "contained",
8891
- layout: "fullscreen"
8892
- }
9001
+ defaultVariants: { style: "contained", layout: "fullscreen" }
9002
+ }
9003
+ );
9004
+ var searchViewBackButtonVariants = classVarianceAuthority.cva([
9005
+ "flex size-12 shrink-0 items-center justify-center",
9006
+ "text-on-surface rounded-full",
9007
+ "cursor-pointer"
9008
+ ]);
9009
+ var searchViewClearButtonVariants = classVarianceAuthority.cva([
9010
+ "flex size-12 shrink-0 items-center justify-center",
9011
+ "text-on-surface-variant rounded-full",
9012
+ "cursor-pointer",
9013
+ "transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects"
9014
+ ]);
9015
+ var searchViewTrailingActionVariants = classVarianceAuthority.cva([
9016
+ "flex size-12 shrink-0 items-center justify-center text-on-surface-variant"
9017
+ ]);
9018
+ var searchViewTrailingActionsVariants = classVarianceAuthority.cva(["flex items-center"]);
9019
+ var searchViewInputVariants = classVarianceAuthority.cva([
9020
+ "flex-1 min-w-0 bg-transparent outline-none",
9021
+ "text-body-large text-on-surface",
9022
+ "placeholder:text-on-surface-variant",
9023
+ "focus-visible:outline-none",
9024
+ // Hide native browser search affordances
9025
+ "[&::-webkit-search-cancel-button]:appearance-none",
9026
+ "[&::-webkit-search-decoration]:appearance-none"
9027
+ ]);
9028
+ var searchViewDividerVariants = classVarianceAuthority.cva(["border-t border-outline w-full"]);
9029
+ var searchViewContentVariants = classVarianceAuthority.cva(["flex-1 overflow-y-auto"]);
9030
+ var DefaultSearchIcon = () => /* @__PURE__ */ jsxRuntime.jsx(
9031
+ "svg",
9032
+ {
9033
+ width: "24",
9034
+ height: "24",
9035
+ viewBox: "0 0 24 24",
9036
+ fill: "currentColor",
9037
+ "aria-hidden": "true",
9038
+ focusable: "false",
9039
+ children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M15.5 14h-.79l-.28-.27A6.471 6.471 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z" })
8893
9040
  }
8894
9041
  );
8895
9042
  var SearchBar = React.forwardRef(
@@ -8910,7 +9057,7 @@ var SearchBar = React.forwardRef(
8910
9057
  onFocus,
8911
9058
  onBlur
8912
9059
  }, ref) => {
8913
- const hasNoActions = (!trailingActions || trailingActions.length === 0) && !avatar;
9060
+ const hasActions = trailingActions != null && trailingActions.length > 0 || !!avatar;
8914
9061
  const reducedMotion = useReducedMotion();
8915
9062
  const [isFocused, setIsFocused] = React.useState(false);
8916
9063
  const handleFocusInternal = React.useCallback(() => {
@@ -8921,83 +9068,85 @@ var SearchBar = React.forwardRef(
8921
9068
  setIsFocused(false);
8922
9069
  onBlur?.();
8923
9070
  }, [onBlur]);
8924
- const { onMouseDown: handleRipple, ripples } = useRipple({
8925
- disabled: isDisabled
8926
- });
8927
- const styledLeadingIcon = leadingIcon ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-on-surface flex size-12 shrink-0 items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "size-6", children: leadingIcon }) }) : void 0;
8928
- const styledTrailingActions = trailingActions?.map((action, index) => /* @__PURE__ */ jsxRuntime.jsx(
8929
- "span",
8930
- {
8931
- className: "text-on-surface-variant flex size-12 shrink-0 items-center justify-center",
8932
- children: action
9071
+ const { isHovered, hoverProps } = reactAria.useHover({ isDisabled });
9072
+ const { isFocusVisible, focusProps } = reactAria.useFocusRing({ within: true });
9073
+ const [isPressed, setIsPressed] = React.useState(false);
9074
+ const { onMouseDown: handleRipple, ripples } = useRipple({ disabled: isDisabled });
9075
+ const handleMouseDown = React.useCallback(
9076
+ (e) => {
9077
+ setIsPressed(true);
9078
+ handleRipple(e);
8933
9079
  },
8934
- index
8935
- ));
8936
- const styledAvatar = avatar ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex size-12 shrink-0 items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "size-[30px] overflow-hidden rounded-full", children: avatar }) }) : void 0;
9080
+ [handleRipple]
9081
+ );
9082
+ const handleMouseUp = React.useCallback(() => setIsPressed(false), []);
9083
+ const styledLeadingIcon = /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(searchBarLeadingIconVariants()), children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "size-6", children: leadingIcon ?? /* @__PURE__ */ jsxRuntime.jsx(DefaultSearchIcon, {}) }) });
9084
+ const styledTrailingActions = trailingActions?.map((action, index) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(searchBarTrailingActionVariants()), children: action }, index));
9085
+ const styledAvatar = avatar ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(searchBarAvatarVariants()), children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "size-[30px] overflow-hidden rounded-full", children: avatar }) }) : void 0;
9086
+ const paneMarginClass = searchStyle === "contained" ? isFocused ? "mx-3" : "mx-6" : "";
9087
+ const paneTransitionClass = searchStyle === "contained" && !reducedMotion ? "transition-[margin] duration-expressive-fast-spatial ease-expressive-fast-spatial" : "";
8937
9088
  return /* @__PURE__ */ jsxRuntime.jsx(
8938
9089
  "div",
8939
9090
  {
8940
- className: cn(
8941
- reducedMotion ? "" : "duration-short4 ease-standard transition-[margin]",
8942
- isFocused ? "mx-3" : "mx-6"
8943
- ),
8944
- children: /* @__PURE__ */ jsxRuntime.jsxs(
8945
- "div",
8946
- {
8947
- role: "presentation",
8948
- className: cn(
8949
- "group relative overflow-hidden rounded-full",
8950
- "has-[:focus-visible]:ring-secondary has-[:focus-visible]:ring-3",
8951
- searchBarVariants({
8952
- style: searchStyle,
8953
- noActions: hasNoActions,
8954
- disabled: isDisabled
9091
+ role: "presentation",
9092
+ ...reactAria.mergeProps(hoverProps, focusProps),
9093
+ className: cn(paneTransitionClass, paneMarginClass),
9094
+ onMouseUp: handleMouseUp,
9095
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { role: "presentation", className: "relative", children: [
9096
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(searchBarFocusRingVariants()), "aria-hidden": "true" }),
9097
+ /* @__PURE__ */ jsxRuntime.jsxs(
9098
+ "div",
9099
+ {
9100
+ role: "presentation",
9101
+ ...getInteractionDataAttributes({
9102
+ isHovered,
9103
+ isFocusVisible,
9104
+ isPressed,
9105
+ isDisabled
8955
9106
  }),
8956
- className
8957
- ),
8958
- onMouseDown: handleRipple,
8959
- children: [
8960
- /* @__PURE__ */ jsxRuntime.jsx(
8961
- "span",
8962
- {
8963
- "data-slot": "state-layer",
8964
- className: cn(
8965
- "bg-on-surface pointer-events-none absolute inset-0 rounded-full opacity-0",
8966
- "group-hover:opacity-8 group-active:opacity-10",
8967
- "duration-spring-standard-fast-effects ease-spring-standard-fast-effects transition-opacity"
8968
- )
8969
- }
8970
- ),
8971
- /* @__PURE__ */ jsxRuntime.jsx(
8972
- SearchBarHeadless,
8973
- {
8974
- ref,
8975
- ...value !== void 0 ? { value } : {},
8976
- ...defaultValue !== void 0 ? { defaultValue } : {},
8977
- ...onChange !== void 0 ? { onChange } : {},
8978
- ...onSubmit !== void 0 ? { onSubmit } : {},
8979
- ...onClear !== void 0 ? { onClear } : {},
8980
- ...placeholder !== void 0 ? { placeholder } : {},
8981
- ...styledLeadingIcon !== void 0 ? { leadingIcon: styledLeadingIcon } : {},
8982
- ...styledTrailingActions !== void 0 ? { trailingActions: styledTrailingActions } : {},
8983
- ...styledAvatar !== void 0 ? { avatar: styledAvatar } : {},
8984
- ...isDisabled !== void 0 ? { isDisabled } : {},
8985
- ...ariaLabel !== void 0 ? { "aria-label": ariaLabel } : {},
8986
- onFocus: handleFocusInternal,
8987
- onBlur: handleBlurInternal,
8988
- className: cn(
8989
- "relative z-0 flex h-full w-full items-center",
8990
- "[&_input]:flex-1 [&_input]:bg-transparent [&_input]:outline-none",
8991
- "[&_input]:text-body-large [&_input]:text-on-surface",
8992
- "[&_input]:placeholder:text-on-surface-variant",
8993
- "[&_input]:focus-visible:outline-none"
8994
- )
8995
- }
9107
+ "data-with-actions": hasActions ? "" : void 0,
9108
+ className: cn(
9109
+ "group/search overflow-hidden",
9110
+ searchBarRootVariants({ style: searchStyle }),
9111
+ className
8996
9112
  ),
8997
- ripples
8998
- ]
8999
- }
9000
- )
9113
+ onMouseDown: (e) => handleMouseDown(e),
9114
+ children: [
9115
+ /* @__PURE__ */ jsxRuntime.jsx(
9116
+ "span",
9117
+ {
9118
+ "data-slot": "state-layer",
9119
+ className: cn(searchBarStateLayerVariants()),
9120
+ "aria-hidden": "true"
9121
+ }
9122
+ ),
9123
+ ripples,
9124
+ /* @__PURE__ */ jsxRuntime.jsx(
9125
+ SearchBarHeadless,
9126
+ {
9127
+ ref,
9128
+ ...value !== void 0 ? { value } : {},
9129
+ ...defaultValue !== void 0 ? { defaultValue } : {},
9130
+ ...onChange !== void 0 ? { onChange } : {},
9131
+ ...onSubmit !== void 0 ? { onSubmit } : {},
9132
+ ...onClear !== void 0 ? { onClear } : {},
9133
+ ...placeholder !== void 0 ? { placeholder } : {},
9134
+ leadingIcon: styledLeadingIcon,
9135
+ ...styledTrailingActions !== void 0 ? { trailingActions: styledTrailingActions } : {},
9136
+ ...styledAvatar !== void 0 ? { avatar: styledAvatar } : {},
9137
+ isDisabled,
9138
+ ...ariaLabel !== void 0 ? { "aria-label": ariaLabel } : {},
9139
+ onFocus: handleFocusInternal,
9140
+ onBlur: handleBlurInternal,
9141
+ className: "relative z-0 flex h-full w-full items-center",
9142
+ inputClassName: cn(searchBarInputVariants()),
9143
+ trailingActionsClassName: cn(searchBarTrailingActionsVariants())
9144
+ }
9145
+ )
9146
+ ]
9147
+ }
9148
+ )
9149
+ ] })
9001
9150
  }
9002
9151
  );
9003
9152
  }
@@ -9022,21 +9171,29 @@ var SearchView = React.forwardRef(
9022
9171
  showDivider
9023
9172
  }, ref) => {
9024
9173
  const resolvedShowDivider = showDivider ?? searchStyle === "divided";
9174
+ const enterMotionClass = layout === "docked" ? "animate-md-scale-in" : "animate-md-fade-in";
9175
+ const containerClass = cn(
9176
+ searchViewVariants({ style: searchStyle, layout }),
9177
+ enterMotionClass,
9178
+ className
9179
+ );
9180
+ const headerClass = cn(searchViewHeaderVariants({ style: searchStyle, layout }));
9181
+ const backButtonClass = cn(searchViewBackButtonVariants());
9182
+ const clearButtonClass = cn(searchViewClearButtonVariants());
9183
+ const trailingActionClass = cn(searchViewTrailingActionVariants());
9184
+ const trailingActionsGroupClass = cn(searchViewTrailingActionsVariants());
9185
+ const inputClass = cn(searchViewInputVariants());
9186
+ const dividerClass = cn(searchViewDividerVariants());
9187
+ const contentClass = cn(searchViewContentVariants());
9025
9188
  const styledLeadingIcon = leadingIcon ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-on-surface flex size-12 shrink-0 items-center justify-center", children: leadingIcon }) : void 0;
9026
- const styledTrailingActions = trailingActions?.map((action, index) => /* @__PURE__ */ jsxRuntime.jsx(
9027
- "span",
9028
- {
9029
- className: "text-on-surface-variant flex size-12 shrink-0 items-center justify-center",
9030
- children: action
9031
- },
9032
- index
9033
- ));
9189
+ const styledTrailingActions = trailingActions?.map((action, index) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: trailingActionClass, children: action }, index));
9034
9190
  return /* @__PURE__ */ jsxRuntime.jsx(
9035
9191
  SearchViewHeadless,
9036
9192
  {
9037
9193
  ref,
9038
9194
  isOpen,
9039
9195
  onClose,
9196
+ layout,
9040
9197
  ...value !== void 0 ? { value } : {},
9041
9198
  ...defaultValue !== void 0 ? { defaultValue } : {},
9042
9199
  ...onChange !== void 0 ? { onChange } : {},
@@ -9046,53 +9203,20 @@ var SearchView = React.forwardRef(
9046
9203
  ...styledLeadingIcon !== void 0 ? { leadingIcon: styledLeadingIcon } : {},
9047
9204
  ...styledTrailingActions !== void 0 ? { trailingActions: styledTrailingActions } : {},
9048
9205
  showDivider: resolvedShowDivider,
9049
- className: cn(
9050
- searchViewVariants({ style: searchStyle, layout }),
9051
- "animate-md-scale-in",
9052
- getHeaderClasses(searchStyle, layout),
9053
- slotClasses,
9054
- className
9055
- ),
9206
+ className: containerClass,
9207
+ headerClassName: headerClass,
9208
+ backButtonClassName: backButtonClass,
9209
+ clearButtonClassName: clearButtonClass,
9210
+ inputClassName: inputClass,
9211
+ trailingActionsClassName: trailingActionsGroupClass,
9212
+ dividerClassName: dividerClass,
9213
+ contentClassName: contentClass,
9056
9214
  children
9057
9215
  }
9058
9216
  );
9059
9217
  }
9060
9218
  );
9061
9219
  SearchView.displayName = "SearchView";
9062
- var slotClasses = cn(
9063
- // Input styling
9064
- "[&_input]:flex-1 [&_input]:bg-transparent [&_input]:outline-none",
9065
- "[&_input]:text-body-large [&_input]:text-on-surface",
9066
- "[&_input]:placeholder:text-on-surface-variant",
9067
- // Divider
9068
- "[&>[data-slot=divider]]:border-outline",
9069
- // Content area
9070
- "[&>[data-slot=content]]:flex-1 [&>[data-slot=content]]:overflow-y-auto",
9071
- // Clear button
9072
- "[&_[data-slot=clear-button]]:size-12 [&_[data-slot=clear-button]]:flex",
9073
- "[&_[data-slot=clear-button]]:items-center [&_[data-slot=clear-button]]:justify-center",
9074
- "[&_[data-slot=clear-button]]:text-on-surface-variant",
9075
- "[&_[data-slot=clear-button]]:transition-opacity [&_[data-slot=clear-button]]:duration-short4",
9076
- "[&_[data-slot=clear-button]]:ease-standard",
9077
- // Back button
9078
- "[&_[data-slot=back-button]]:size-12 [&_[data-slot=back-button]]:flex",
9079
- "[&_[data-slot=back-button]]:items-center [&_[data-slot=back-button]]:justify-center",
9080
- "[&_[data-slot=back-button]]:text-on-surface"
9081
- );
9082
- function getHeaderClasses(style, layout) {
9083
- const base = "[&>[data-slot=header]]:flex [&>[data-slot=header]]:items-center [&>[data-slot=header]]:w-full [&>[data-slot=header]]:bg-surface-container-high [&>[data-slot=header]]:gap-1";
9084
- if (layout === "docked") {
9085
- return cn(
9086
- base,
9087
- "[&>[data-slot=header]]:h-14",
9088
- style === "contained" ? "[&>[data-slot=header]]:px-3" : "[&>[data-slot=header]]:px-4"
9089
- );
9090
- }
9091
- if (style === "contained") {
9092
- return cn(base, "[&>[data-slot=header]]:h-14 [&>[data-slot=header]]:px-3");
9093
- }
9094
- return cn(base, "[&>[data-slot=header]]:h-[72px] [&>[data-slot=header]]:px-4");
9095
- }
9096
9220
  var Search = React.forwardRef(
9097
9221
  ({
9098
9222
  isOpen: controlledIsOpen,
@@ -10290,9 +10414,12 @@ function SliderThumbInternal({
10290
10414
  state,
10291
10415
  trackRef,
10292
10416
  isDisabled,
10417
+ orientation,
10293
10418
  formatValue: formatValue2,
10294
10419
  className,
10295
10420
  "data-direction": dataDirection,
10421
+ renderContent,
10422
+ onDraggingChange,
10296
10423
  ...ariaProps
10297
10424
  }) {
10298
10425
  const inputRef = React.useRef(null);
@@ -10307,33 +10434,70 @@ function SliderThumbInternal({
10307
10434
  state
10308
10435
  );
10309
10436
  const { isFocusVisible, focusProps } = reactAria.useFocusRing();
10437
+ const { isHovered, hoverProps } = reactAria.useHover({ isDisabled });
10438
+ React.useEffect(() => {
10439
+ onDraggingChange?.(isDragging);
10440
+ }, [isDragging, onDraggingChange]);
10310
10441
  const currentValue = state.getThumbValue(index);
10311
10442
  const ariaValueText = formatValue2 ? formatValue2(currentValue) : void 0;
10312
- return /* @__PURE__ */ jsxRuntime.jsx(
10443
+ const thumbPercent = state.getThumbPercent(index);
10444
+ const positionStyle = orientation === "horizontal" ? {
10445
+ position: "absolute",
10446
+ left: `${thumbPercent * 100}%`,
10447
+ top: "50%",
10448
+ transform: "translate(-50%, -50%)",
10449
+ zIndex: 10
10450
+ } : {
10451
+ position: "absolute",
10452
+ bottom: `${thumbPercent * 100}%`,
10453
+ left: "50%",
10454
+ transform: "translate(-50%, 50%)",
10455
+ zIndex: 10
10456
+ };
10457
+ const renderState = {
10458
+ index,
10459
+ value: currentValue,
10460
+ isDragging,
10461
+ isFocusVisible,
10462
+ isHovered,
10463
+ isDisabled
10464
+ };
10465
+ return /* @__PURE__ */ jsxRuntime.jsxs(
10313
10466
  "div",
10314
10467
  {
10315
- ...thumbProps,
10468
+ ...reactAria.mergeProps(thumbProps, hoverProps, { style: positionStyle }),
10469
+ "data-slot": "slider-thumb",
10316
10470
  "data-dragging": isDragging || void 0,
10317
10471
  "data-focused": isFocused || void 0,
10318
- "data-focus-visible": isFocusVisible || void 0,
10319
- "data-disabled": isDisabled || void 0,
10320
10472
  ...dataDirection !== void 0 ? { "data-direction": dataDirection } : {},
10473
+ ...getInteractionDataAttributes({
10474
+ isHovered,
10475
+ isFocusVisible,
10476
+ isPressed: isDragging,
10477
+ isDisabled
10478
+ }),
10321
10479
  className: cn(
10480
+ // Group scope: interaction selectors on children target this element
10481
+ "group/slider-thumb",
10482
+ // Accessibility: remove default outline (custom focus ring via data-[focus-visible])
10322
10483
  "outline-none",
10323
- // Focus ring visible only on keyboard focus — matches project pattern (md3-design.mdc §Accessibility)
10484
+ // Focus ring visible only on keyboard focus — matches project pattern
10324
10485
  "data-[focus-visible]:ring-3",
10325
10486
  "data-[focus-visible]:ring-secondary",
10326
10487
  "data-[focus-visible]:ring-offset-2",
10327
10488
  className
10328
10489
  ),
10329
- children: /* @__PURE__ */ jsxRuntime.jsx(reactAria.VisuallyHidden, { children: /* @__PURE__ */ jsxRuntime.jsx(
10330
- "input",
10331
- {
10332
- ref: inputRef,
10333
- ...reactAria.mergeProps(inputProps, focusProps),
10334
- ...ariaValueText !== void 0 ? { "aria-valuetext": ariaValueText } : {}
10335
- }
10336
- ) })
10490
+ children: [
10491
+ /* @__PURE__ */ jsxRuntime.jsx(reactAria.VisuallyHidden, { children: /* @__PURE__ */ jsxRuntime.jsx(
10492
+ "input",
10493
+ {
10494
+ ref: inputRef,
10495
+ ...reactAria.mergeProps(inputProps, focusProps),
10496
+ ...ariaValueText !== void 0 ? { "aria-valuetext": ariaValueText } : {}
10497
+ }
10498
+ ) }),
10499
+ renderContent?.(renderState)
10500
+ ]
10337
10501
  }
10338
10502
  );
10339
10503
  }
@@ -10356,6 +10520,9 @@ var SliderHeadless = React.forwardRef(
10356
10520
  className,
10357
10521
  style,
10358
10522
  children,
10523
+ trackClassName,
10524
+ renderThumbContent,
10525
+ onThumbDraggingChange,
10359
10526
  ...ariaProps
10360
10527
  } = props;
10361
10528
  const trackRef = React.useRef(null);
@@ -10417,7 +10584,18 @@ var SliderHeadless = React.forwardRef(
10417
10584
  "data-variant": variant,
10418
10585
  ...zeroPercent !== void 0 ? { "data-zero-percent": zeroPercent } : {},
10419
10586
  children: [
10420
- label && /* @__PURE__ */ jsxRuntime.jsx("label", { ...labelProps, children: label }),
10587
+ label && /* @__PURE__ */ jsxRuntime.jsx("label", { ...labelProps, className: cn(orientation === "vertical" && "sr-only"), children: label }),
10588
+ /* @__PURE__ */ jsxRuntime.jsx(
10589
+ "output",
10590
+ {
10591
+ ...outputProps,
10592
+ className: cn(
10593
+ orientation === "horizontal" && "justify-self-end",
10594
+ orientation === "vertical" && "sr-only"
10595
+ ),
10596
+ children: isRange ? formatValue2 ? `${formatValue2(state.getThumbValue(0))} \u2013 ${formatValue2(state.getThumbValue(1))}` : `${state.getThumbValueLabel(0)} \u2013 ${state.getThumbValueLabel(1)}` : formatValue2 ? formatValue2(state.getThumbValue(0)) : state.getThumbValueLabel(0)
10597
+ }
10598
+ ),
10421
10599
  /* @__PURE__ */ jsxRuntime.jsxs(
10422
10600
  "div",
10423
10601
  {
@@ -10426,6 +10604,10 @@ var SliderHeadless = React.forwardRef(
10426
10604
  "data-orientation": orientation,
10427
10605
  "data-track": true,
10428
10606
  ...zeroPercent !== void 0 ? { "data-zero-percent": zeroPercent } : {},
10607
+ className: cn(
10608
+ trackClassName ?? "relative w-full",
10609
+ orientation === "vertical" && !trackClassName && "h-full"
10610
+ ),
10429
10611
  children: [
10430
10612
  children,
10431
10613
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -10435,9 +10617,12 @@ var SliderHeadless = React.forwardRef(
10435
10617
  state,
10436
10618
  trackRef,
10437
10619
  isDisabled,
10620
+ orientation,
10438
10621
  ...formatValue2 !== void 0 ? { formatValue: formatValue2 } : {},
10439
10622
  ...thumb0Label !== void 0 ? { "aria-label": thumb0Label } : {},
10440
- ...direction !== void 0 ? { "data-direction": direction } : {}
10623
+ ...direction !== void 0 ? { "data-direction": direction } : {},
10624
+ ...renderThumbContent !== void 0 ? { renderContent: renderThumbContent } : {},
10625
+ ...onThumbDraggingChange !== void 0 ? { onDraggingChange: (d) => onThumbDraggingChange(0, d) } : {}
10441
10626
  }
10442
10627
  ),
10443
10628
  isRange && /* @__PURE__ */ jsxRuntime.jsx(
@@ -10447,144 +10632,174 @@ var SliderHeadless = React.forwardRef(
10447
10632
  state,
10448
10633
  trackRef,
10449
10634
  isDisabled,
10635
+ orientation,
10450
10636
  ...formatValue2 !== void 0 ? { formatValue: formatValue2 } : {},
10451
- "aria-label": thumbLabels?.[1] ?? "Maximum"
10637
+ "aria-label": thumbLabels?.[1] ?? "Maximum",
10638
+ ...renderThumbContent !== void 0 ? { renderContent: renderThumbContent } : {},
10639
+ ...onThumbDraggingChange !== void 0 ? { onDraggingChange: (d) => onThumbDraggingChange(1, d) } : {}
10452
10640
  }
10453
10641
  )
10454
10642
  ]
10455
10643
  }
10456
- ),
10457
- /* @__PURE__ */ jsxRuntime.jsx("output", { ...outputProps, children: isRange ? formatValue2 ? `${formatValue2(state.getThumbValue(0))} \u2013 ${formatValue2(state.getThumbValue(1))}` : `${state.getThumbValueLabel(0)} \u2013 ${state.getThumbValueLabel(1)}` : formatValue2 ? formatValue2(state.getThumbValue(0)) : state.getThumbValueLabel(0) })
10644
+ )
10458
10645
  ]
10459
10646
  }
10460
10647
  );
10461
10648
  }
10462
10649
  );
10463
10650
  SliderHeadless.displayName = "SliderHeadless";
10464
- var sliderContainerVariants = classVarianceAuthority.cva(
10651
+ var sliderContainerVariants = classVarianceAuthority.cva(["group/slider", "relative", "select-none"], {
10652
+ variants: {
10653
+ orientation: {
10654
+ // Grid: 1fr for label, auto for output value; gap-x for label↔output spacing
10655
+ horizontal: "grid grid-cols-[1fr_auto] items-center gap-x-2 w-full",
10656
+ // Flex column: label → track → output stacked; width = handle height (per size)
10657
+ vertical: "flex flex-col items-center h-full"
10658
+ },
10659
+ size: {
10660
+ // Vertical orientation: container width = handle height (dimensions transposed)
10661
+ // Applied only for vertical via compoundVariants below
10662
+ // NOTE: measurement-derived values from MD3 spec §4.2; permitted exception
10663
+ xsmall: "",
10664
+ small: "",
10665
+ medium: "",
10666
+ large: "",
10667
+ xlarge: ""
10668
+ }
10669
+ },
10670
+ compoundVariants: [
10671
+ // Vertical: container WIDTH = handle height (MD3 §10.9 — dimensions transposed)
10672
+ // NOTE: measurement-derived values from MD3 spec §4.2; permitted exception
10673
+ { orientation: "vertical", size: "xsmall", class: "w-[44px]" },
10674
+ { orientation: "vertical", size: "small", class: "w-[44px]" },
10675
+ { orientation: "vertical", size: "medium", class: "w-[52px]" },
10676
+ { orientation: "vertical", size: "large", class: "w-[68px]" },
10677
+ { orientation: "vertical", size: "xlarge", class: "w-[108px]" }
10678
+ ],
10679
+ defaultVariants: {
10680
+ orientation: "horizontal",
10681
+ size: "xsmall"
10682
+ }
10683
+ });
10684
+ var sliderTrackRegionVariants = classVarianceAuthority.cva(["relative", "touch-none"], {
10685
+ variants: {
10686
+ orientation: {
10687
+ horizontal: "col-span-2 w-full",
10688
+ // flex-1 fills the vertical container reliably; h-full collapses when the
10689
+ // container itself is a flex item without an explicit pixel height (CSS spec).
10690
+ // min-h-0 allows the flex child to shrink below its natural size if needed.
10691
+ vertical: "flex-1 min-h-0"
10692
+ },
10693
+ size: {
10694
+ // Horizontal: size controls track region HEIGHT (= handle height)
10695
+ // Vertical: size controls track region WIDTH (= handle height, dimensions transposed)
10696
+ // Applied as compound variants below to avoid cross-orientation conflicts
10697
+ xsmall: "",
10698
+ small: "",
10699
+ medium: "",
10700
+ large: "",
10701
+ xlarge: ""
10702
+ }
10703
+ },
10704
+ compoundVariants: [
10705
+ // Horizontal: height = handle height per MD3 §4.2
10706
+ { orientation: "horizontal", size: "xsmall", class: "h-[44px]" },
10707
+ { orientation: "horizontal", size: "small", class: "h-[44px]" },
10708
+ { orientation: "horizontal", size: "medium", class: "h-[52px]" },
10709
+ { orientation: "horizontal", size: "large", class: "h-[68px]" },
10710
+ { orientation: "horizontal", size: "xlarge", class: "h-[108px]" },
10711
+ // Vertical: width = handle height (transposed per MD3 §10.9)
10712
+ { orientation: "vertical", size: "xsmall", class: "w-[44px]" },
10713
+ { orientation: "vertical", size: "small", class: "w-[44px]" },
10714
+ { orientation: "vertical", size: "medium", class: "w-[52px]" },
10715
+ { orientation: "vertical", size: "large", class: "w-[68px]" },
10716
+ { orientation: "vertical", size: "xlarge", class: "w-[108px]" }
10717
+ ],
10718
+ defaultVariants: {
10719
+ orientation: "horizontal",
10720
+ size: "xsmall"
10721
+ }
10722
+ });
10723
+ var sliderTrackLayoutVariants = classVarianceAuthority.cva(["absolute", "inset-0", "pointer-events-none"]);
10724
+ var sliderActiveTrackVariants = classVarianceAuthority.cva(
10465
10725
  [
10466
- "relative",
10467
- "flex",
10468
- "items-center",
10469
- "w-full",
10470
- "touch-none",
10471
- // NOTE: measurement-derived value from MD3 spec; permitted exception — prevents browser scroll on drag
10472
- "select-none"
10726
+ // Color
10727
+ "bg-primary",
10728
+ // Disabled — driven by root group/slider data-disabled attr
10729
+ "group-data-[disabled]/slider:bg-on-surface",
10730
+ "group-data-[disabled]/slider:opacity-38",
10731
+ // Layout absolute fill within the track region
10732
+ "absolute",
10733
+ "overflow-hidden"
10473
10734
  ],
10474
10735
  {
10475
10736
  variants: {
10476
10737
  size: {
10477
- // NOTE: measurement-derived values from MD3 spec §4.2; permitted exception
10478
- xsmall: "h-[44px]",
10479
- small: "h-[44px]",
10480
- medium: "h-[52px]",
10481
- large: "h-[68px]",
10482
- xlarge: "h-[108px]"
10738
+ // Horizontal: left (start) = outer corner, right (near handle) = 2dp inner
10739
+ // NOTE: measurement-derived values from MD3 spec §4.2, §6; permitted exception
10740
+ xsmall: "h-[16px] rounded-l-[16px] rounded-r-[2px]",
10741
+ small: "h-[16px] rounded-l-[16px] rounded-r-[2px]",
10742
+ medium: "h-[40px] rounded-l-[12px] rounded-r-[2px]",
10743
+ large: "h-[56px] rounded-l-[16px] rounded-r-[2px]",
10744
+ xlarge: "h-[96px] rounded-l-[28px] rounded-r-[2px]"
10483
10745
  },
10484
10746
  orientation: {
10485
- // Horizontal: w-full already in base; flex-row is default flex direction
10486
- horizontal: "",
10487
- // Vertical: transposed container height fills parent, width = handle height (per size)
10488
- // flex-col stacks label → track → output vertically
10489
- // NOTE: h-full requires a parent with defined height; w-[...] set via compound variants
10490
- vertical: "h-full flex-col"
10491
- },
10492
- disabled: {
10493
- true: "cursor-not-allowed pointer-events-none",
10494
- false: "cursor-pointer"
10747
+ // Horizontal: center vertically within track region
10748
+ horizontal: "top-1/2 -translate-y-1/2",
10749
+ // Vertical: center horizontally; length controlled by inline top/height styles
10750
+ vertical: "left-1/2 -translate-x-1/2"
10495
10751
  }
10496
10752
  },
10497
10753
  compoundVariants: [
10498
- // Vertical: container WIDTH = handle height (MD3 §10.9 dimensions transposed)
10499
- // Overrides w-full from base via tailwind-merge in cn()
10500
- // NOTE: measurement-derived values from MD3 spec §4.2; permitted exception
10501
- { orientation: "vertical", size: "xsmall", className: "w-[44px]" },
10502
- { orientation: "vertical", size: "small", className: "w-[44px]" },
10503
- { orientation: "vertical", size: "medium", className: "w-[52px]" },
10504
- { orientation: "vertical", size: "large", className: "w-[68px]" },
10505
- { orientation: "vertical", size: "xlarge", className: "w-[108px]" }
10506
- ],
10507
- defaultVariants: {
10508
- size: "xsmall",
10509
- orientation: "horizontal",
10510
- disabled: false
10511
- }
10512
- }
10513
- );
10514
- var sliderActiveTrackVariants = classVarianceAuthority.cva(
10515
- ["bg-primary", "flex-shrink-0", "overflow-hidden", "relative"],
10516
- {
10517
- variants: {
10518
- size: {
10519
- // NOTE: measurement-derived values from MD3 spec §4.2, §6 Corner tokens; permitted exception
10520
- // Corner classes are in compound variants to avoid conflicts with vertical orientation corners
10521
- xsmall: "h-[16px] rounded-l-[16px] rounded-r-[2px]",
10522
- // corner.large outer (16dp), 2dp inner
10523
- small: "h-[16px] rounded-l-[16px] rounded-r-[2px]",
10524
- medium: "h-[40px] rounded-l-[12px] rounded-r-[2px]",
10525
- // corner.medium outer (12dp), 2dp inner
10526
- large: "h-[56px] rounded-l-[16px] rounded-r-[2px]",
10527
- // corner.large outer (16dp), 2dp inner
10528
- xlarge: "h-[96px] rounded-l-[28px] rounded-r-[2px]"
10529
- // corner.extra-large outer (28dp), 2dp inner
10530
- },
10531
- orientation: {
10532
- horizontal: "",
10533
- // Vertical: track thickness is now width; flex-basis (inline style) controls height.
10534
- // h-[...] from size variant is overridden by flex-basis in a flex-col container.
10535
- // Individual corner classes (rounded-tl/tr/bl/br) override the horizontal rounded-l/r
10536
- // via tailwind-merge conflict resolution in cn().
10537
- vertical: ""
10538
- },
10539
- disabled: {
10540
- true: "bg-on-surface opacity-38",
10541
- false: ""
10542
- }
10543
- },
10544
- compoundVariants: [
10545
- // Vertical: width = track thickness, corners transposed (bottom = outer, top = inner near handle)
10546
- // Using individual corner utilities so tailwind-merge correctly resolves conflicts with
10547
- // the horizontal rounded-l/rounded-r classes from size variants.
10548
- // NOTE: measurement-derived values from MD3 spec §4.2, §6 Corner tokens; permitted exception
10754
+ // Vertical: width = track thickness; bottom = outer corner, top = 2dp inner (near handle)
10755
+ // NOTE: measurement-derived values from MD3 spec §4.2, §6; permitted exception
10549
10756
  {
10550
10757
  orientation: "vertical",
10551
10758
  size: "xsmall",
10552
- className: "w-[16px] rounded-tl-[2px] rounded-tr-[2px] rounded-bl-[16px] rounded-br-[16px]"
10759
+ class: "w-[16px] rounded-tl-[2px] rounded-tr-[2px] rounded-bl-[16px] rounded-br-[16px]"
10553
10760
  },
10554
10761
  {
10555
10762
  orientation: "vertical",
10556
10763
  size: "small",
10557
- className: "w-[16px] rounded-tl-[2px] rounded-tr-[2px] rounded-bl-[16px] rounded-br-[16px]"
10764
+ class: "w-[16px] rounded-tl-[2px] rounded-tr-[2px] rounded-bl-[16px] rounded-br-[16px]"
10558
10765
  },
10559
10766
  {
10560
10767
  orientation: "vertical",
10561
10768
  size: "medium",
10562
- className: "w-[40px] rounded-tl-[2px] rounded-tr-[2px] rounded-bl-[12px] rounded-br-[12px]"
10769
+ class: "w-[40px] rounded-tl-[2px] rounded-tr-[2px] rounded-bl-[12px] rounded-br-[12px]"
10563
10770
  },
10564
10771
  {
10565
10772
  orientation: "vertical",
10566
10773
  size: "large",
10567
- className: "w-[56px] rounded-tl-[2px] rounded-tr-[2px] rounded-bl-[16px] rounded-br-[16px]"
10774
+ class: "w-[56px] rounded-tl-[2px] rounded-tr-[2px] rounded-bl-[16px] rounded-br-[16px]"
10568
10775
  },
10569
10776
  {
10570
10777
  orientation: "vertical",
10571
10778
  size: "xlarge",
10572
- className: "w-[96px] rounded-tl-[2px] rounded-tr-[2px] rounded-bl-[28px] rounded-br-[28px]"
10779
+ class: "w-[96px] rounded-tl-[2px] rounded-tr-[2px] rounded-bl-[28px] rounded-br-[28px]"
10573
10780
  }
10574
10781
  ],
10575
10782
  defaultVariants: {
10576
10783
  size: "xsmall",
10577
- orientation: "horizontal",
10578
- disabled: false
10784
+ orientation: "horizontal"
10579
10785
  }
10580
10786
  }
10581
10787
  );
10582
10788
  var sliderInactiveTrackVariants = classVarianceAuthority.cva(
10583
- ["bg-secondary-container", "flex-1", "overflow-hidden", "relative"],
10789
+ [
10790
+ // Color
10791
+ "bg-secondary-container",
10792
+ // Disabled — driven by root group/slider data-disabled attr
10793
+ "group-data-[disabled]/slider:bg-on-surface/10",
10794
+ // Layout — absolute fill within the track region
10795
+ "absolute",
10796
+ "overflow-hidden"
10797
+ ],
10584
10798
  {
10585
10799
  variants: {
10586
10800
  size: {
10587
- // NOTE: measurement-derived values from MD3 spec §4.2, §6 Corner tokens; permitted exception
10801
+ // Horizontal: left (near handle) = 2dp inner, right (end) = outer corner
10802
+ // NOTE: measurement-derived values from MD3 spec §4.2, §6; permitted exception
10588
10803
  xsmall: "h-[16px] rounded-l-[2px] rounded-r-[16px]",
10589
10804
  small: "h-[16px] rounded-l-[2px] rounded-r-[16px]",
10590
10805
  medium: "h-[40px] rounded-l-[2px] rounded-r-[12px]",
@@ -10592,68 +10807,65 @@ var sliderInactiveTrackVariants = classVarianceAuthority.cva(
10592
10807
  xlarge: "h-[96px] rounded-l-[2px] rounded-r-[28px]"
10593
10808
  },
10594
10809
  orientation: {
10595
- horizontal: "",
10596
- // Vertical: track thickness is width; flex-1 controls height growth.
10597
- // Individual corner classes override horizontal rounded-l/r via tailwind-merge.
10598
- vertical: ""
10599
- },
10600
- disabled: {
10601
- true: "bg-on-surface/10",
10602
- // MD3 §8.2: 10% opacity via background alpha
10603
- false: ""
10810
+ // Horizontal: center vertically within track region
10811
+ horizontal: "top-1/2 -translate-y-1/2",
10812
+ // Vertical: center horizontally; length controlled by inline top/height styles
10813
+ vertical: "left-1/2 -translate-x-1/2"
10604
10814
  }
10605
10815
  },
10606
10816
  compoundVariants: [
10607
- // Vertical: width = track thickness, corners transposed (top = outer, bottom = inner near handle)
10608
- // NOTE: measurement-derived values from MD3 spec §4.2, §6 Corner tokens; permitted exception
10817
+ // Vertical: width = track thickness; top = outer corner, bottom = 2dp inner (near handle)
10818
+ // NOTE: measurement-derived values from MD3 spec §4.2, §6; permitted exception
10609
10819
  {
10610
10820
  orientation: "vertical",
10611
10821
  size: "xsmall",
10612
- className: "w-[16px] rounded-tl-[16px] rounded-tr-[16px] rounded-bl-[2px] rounded-br-[2px]"
10822
+ class: "w-[16px] rounded-tl-[16px] rounded-tr-[16px] rounded-bl-[2px] rounded-br-[2px]"
10613
10823
  },
10614
10824
  {
10615
10825
  orientation: "vertical",
10616
10826
  size: "small",
10617
- className: "w-[16px] rounded-tl-[16px] rounded-tr-[16px] rounded-bl-[2px] rounded-br-[2px]"
10827
+ class: "w-[16px] rounded-tl-[16px] rounded-tr-[16px] rounded-bl-[2px] rounded-br-[2px]"
10618
10828
  },
10619
10829
  {
10620
10830
  orientation: "vertical",
10621
10831
  size: "medium",
10622
- className: "w-[40px] rounded-tl-[12px] rounded-tr-[12px] rounded-bl-[2px] rounded-br-[2px]"
10832
+ class: "w-[40px] rounded-tl-[12px] rounded-tr-[12px] rounded-bl-[2px] rounded-br-[2px]"
10623
10833
  },
10624
10834
  {
10625
10835
  orientation: "vertical",
10626
10836
  size: "large",
10627
- className: "w-[56px] rounded-tl-[16px] rounded-tr-[16px] rounded-bl-[2px] rounded-br-[2px]"
10837
+ class: "w-[56px] rounded-tl-[16px] rounded-tr-[16px] rounded-bl-[2px] rounded-br-[2px]"
10628
10838
  },
10629
10839
  {
10630
10840
  orientation: "vertical",
10631
10841
  size: "xlarge",
10632
- className: "w-[96px] rounded-tl-[28px] rounded-tr-[28px] rounded-bl-[2px] rounded-br-[2px]"
10842
+ class: "w-[96px] rounded-tl-[28px] rounded-tr-[28px] rounded-bl-[2px] rounded-br-[2px]"
10633
10843
  }
10634
10844
  ],
10635
10845
  defaultVariants: {
10636
10846
  size: "xsmall",
10637
- orientation: "horizontal",
10638
- disabled: false
10847
+ orientation: "horizontal"
10639
10848
  }
10640
10849
  }
10641
10850
  );
10642
10851
  var sliderHandleVariants = classVarianceAuthority.cva(
10643
10852
  [
10853
+ // Color
10644
10854
  "bg-primary",
10855
+ // Disabled — driven by thumb group/slider-thumb data-disabled attr
10856
+ "group-data-[disabled]/slider-thumb:bg-on-surface",
10857
+ "group-data-[disabled]/slider-thumb:opacity-38",
10858
+ // Pressed width (MD3: 4dp → 2dp on press, spatial spring)
10859
+ "group-data-[pressed]/slider-thumb:w-[2px]",
10860
+ // Shape
10645
10861
  "rounded-[2px]",
10646
- // NOTE: measurement-derived value from MD3 spec §10.3 (2dp handle border-radius); permitted exception
10862
+ // Layout
10647
10863
  "flex-shrink-0",
10648
- "relative",
10649
- "z-10",
10650
- "outline-none"
10651
- // Motion classes applied conditionally in Slider.tsx via useReducedMotion guard
10864
+ "pointer-events-none"
10652
10865
  ],
10653
10866
  {
10654
10867
  variants: {
10655
10868
  size: {
10656
- // NOTE: measurement-derived values from MD3 spec §4.2, §10.3; permitted exception
10657
10869
  xsmall: "w-[4px] h-[44px]",
10658
10870
  small: "w-[4px] h-[44px]",
10659
10871
  medium: "w-[4px] h-[52px]",
@@ -10662,79 +10874,99 @@ var sliderHandleVariants = classVarianceAuthority.cva(
10662
10874
  },
10663
10875
  orientation: {
10664
10876
  horizontal: "",
10665
- // Vertical: dimensions transposed. h-[4px] overrides size-variant h-[...] via tailwind-merge;
10666
- // w-full overrides size-variant w-[4px] via tailwind-merge (both in cn() call at styled layer).
10667
- // NOTE: measurement-derived value from MD3 spec §10.3 (4dp handle width); permitted exception
10668
- vertical: "h-[4px] w-full"
10669
- },
10670
- pressed: {
10671
- true: "w-[2px]",
10672
- // NOTE: measurement-derived value from MD3 spec §10.3 (2dp pressed width); permitted exception
10673
- false: ""
10674
- },
10675
- disabled: {
10676
- true: "bg-on-surface opacity-38",
10677
- false: ""
10877
+ // Vertical: handle is a thin horizontal bar. h-[4px] overrides the base
10878
+ // h-[44px..108px]. Width is explicitly set per size below so the RA thumb
10879
+ // (which is shrink-to-fit) assumes the correct measured width this also
10880
+ // fixes the hit-area (w-full) and state-layer (inset-0) widths.
10881
+ vertical: "h-[4px]"
10678
10882
  }
10679
10883
  },
10884
+ compoundVariants: [
10885
+ // Vertical: override to height-based narrowing on press
10886
+ {
10887
+ orientation: "vertical",
10888
+ class: "group-data-[pressed]/slider-thumb:h-[2px]"
10889
+ },
10890
+ // Vertical per-size widths (transposed handle length = track region width per MD3 §10.9)
10891
+ // NOTE: measurement-derived values from MD3 spec §4.2; permitted exception
10892
+ { orientation: "vertical", size: "xsmall", class: "w-[44px]" },
10893
+ { orientation: "vertical", size: "small", class: "w-[44px]" },
10894
+ { orientation: "vertical", size: "medium", class: "w-[52px]" },
10895
+ { orientation: "vertical", size: "large", class: "w-[68px]" },
10896
+ { orientation: "vertical", size: "xlarge", class: "w-[108px]" }
10897
+ ],
10680
10898
  defaultVariants: {
10681
10899
  size: "xsmall",
10682
- orientation: "horizontal",
10683
- pressed: false,
10684
- disabled: false
10685
- }
10686
- }
10687
- );
10688
- var sliderHandleStateLayerVariants = classVarianceAuthority.cva(
10689
- [
10690
- "absolute",
10691
- "inset-0",
10692
- "rounded-[4px]",
10693
- // NOTE: measurement-derived value from MD3 spec §10.3 (4dp state layer border-radius); permitted exception
10694
- "bg-on-primary",
10695
- "pointer-events-none"
10696
- // Motion classes applied conditionally in Slider.tsx via useReducedMotion guard
10697
- ],
10698
- {
10699
- variants: {
10700
- state: {
10701
- enabled: "opacity-0",
10702
- hovered: "opacity-8",
10703
- // MD3 §8.3: 8% hover
10704
- pressed: "opacity-10",
10705
- // MD3 §8.3: 10% pressed
10706
- focused: "opacity-10",
10707
- // MD3 §8.3: 10% focus
10708
- disabled: "opacity-0"
10709
- }
10710
- },
10711
- defaultVariants: {
10712
- state: "enabled"
10900
+ orientation: "horizontal"
10713
10901
  }
10714
10902
  }
10715
10903
  );
10716
- var sliderTrackLayoutVariants = classVarianceAuthority.cva(
10717
- [
10718
- "relative",
10719
- "flex",
10720
- "items-center",
10721
- "gap-[6px]"
10722
- // NOTE: measurement-derived value from MD3 spec §2, §6 (thumbTrackGapSize: 6dp); permitted exception
10723
- ],
10724
- {
10725
- variants: {
10726
- orientation: {
10727
- // Horizontal: full width, left-to-right fill
10728
- horizontal: "flex-row w-full",
10729
- // Vertical: full height, bottom-to-top fill (flex-col-reverse places active track at bottom)
10730
- vertical: "flex-col-reverse h-full"
10731
- }
10904
+ var sliderHandleStateLayerVariants = classVarianceAuthority.cva([
10905
+ // Color
10906
+ "bg-primary",
10907
+ // Positioning — covers the handle
10908
+ "absolute",
10909
+ "inset-0",
10910
+ "rounded-[2px]",
10911
+ // Interaction: hidden by default
10912
+ "opacity-0",
10913
+ "pointer-events-none",
10914
+ // State opacities — driven by group/slider-thumb data attrs
10915
+ "group-data-[hovered]/slider-thumb:opacity-8",
10916
+ "group-data-[focus-visible]/slider-thumb:opacity-10",
10917
+ "group-data-[pressed]/slider-thumb:opacity-10",
10918
+ // Disabled: hide state layer (no interaction feedback)
10919
+ "group-data-[disabled]/slider-thumb:hidden",
10920
+ // Motion: effects spring (opacity transition only)
10921
+ "transition-opacity",
10922
+ "duration-spring-standard-fast-effects",
10923
+ "ease-spring-standard-fast-effects"
10924
+ ]);
10925
+ var sliderValueIndicatorVariants = classVarianceAuthority.cva([
10926
+ // Positioning: float above handle center
10927
+ "absolute",
10928
+ "left-1/2",
10929
+ "-translate-x-1/2",
10930
+ "bottom-[calc(100%+4px)]",
10931
+ // Shape & color
10932
+ "bg-inverse-surface",
10933
+ "rounded-full",
10934
+ "px-[12px]",
10935
+ "py-[6px]",
10936
+ "min-w-[48px]",
10937
+ "text-center",
10938
+ // Hidden by default; revealed when thumb group has data-pressed
10939
+ "opacity-0",
10940
+ "scale-0",
10941
+ "group-data-[pressed]/slider-thumb:opacity-100",
10942
+ "group-data-[pressed]/slider-thumb:scale-100",
10943
+ // Prevent interaction (value display only)
10944
+ "pointer-events-none",
10945
+ // Z-index above track overlays
10946
+ "z-10",
10947
+ // In Tailwind v4, scale-* maps to the CSS `scale` property (not `transform`),
10948
+ // so we must list `scale` here — not `transform` — to animate the reveal.
10949
+ "will-change-[scale,opacity]"
10950
+ ]);
10951
+ var sliderStopDotVariants = classVarianceAuthority.cva(["rounded-full", "flex-shrink-0", "pointer-events-none"], {
10952
+ variants: {
10953
+ region: {
10954
+ active: "bg-on-primary",
10955
+ inactive: "bg-on-secondary-container"
10732
10956
  },
10733
- defaultVariants: {
10734
- orientation: "horizontal"
10957
+ size: {
10958
+ xsmall: "w-[4px] h-[4px]",
10959
+ small: "w-[4px] h-[4px]",
10960
+ medium: "w-[6px] h-[6px]",
10961
+ large: "w-[6px] h-[6px]",
10962
+ xlarge: "w-[8px] h-[8px]"
10735
10963
  }
10964
+ },
10965
+ defaultVariants: {
10966
+ region: "inactive",
10967
+ size: "xsmall"
10736
10968
  }
10737
- );
10969
+ });
10738
10970
  var sliderStopsContainerVariants = classVarianceAuthority.cva([
10739
10971
  "absolute",
10740
10972
  "inset-0",
@@ -10742,58 +10974,22 @@ var sliderStopsContainerVariants = classVarianceAuthority.cva([
10742
10974
  "items-center",
10743
10975
  "justify-between",
10744
10976
  "px-[4px]",
10745
- // NOTE: measurement-derived value from MD3 spec §10.5 (stopPadding: 4dp); permitted exception
10746
10977
  "pointer-events-none",
10747
- "z-0"
10978
+ "z-10"
10748
10979
  ]);
10749
- var sliderStopDotVariants = classVarianceAuthority.cva(
10750
- [
10751
- "rounded-full",
10752
- "flex-shrink-0",
10753
- "w-[4px]",
10754
- // NOTE: measurement-derived value from MD3 spec §10.5 (stopIndicatorSize: 4dp); permitted exception
10755
- "h-[4px]"
10756
- ],
10757
- {
10758
- variants: {
10759
- /**
10760
- * Whether this dot is positioned on the active track portion.
10761
- * Determines the dot color per MD3 spec §5.2.
10762
- */
10763
- onActiveTrack: {
10764
- true: "bg-on-primary",
10765
- // Light dots on primary background
10766
- false: "bg-on-secondary-container"
10767
- // Dark dots on secondary-container background
10768
- },
10769
- disabled: {
10770
- true: "opacity-38",
10771
- false: ""
10772
- }
10773
- },
10774
- defaultVariants: {
10775
- onActiveTrack: false,
10776
- disabled: false
10777
- }
10778
- }
10779
- );
10780
10980
  var sliderTrackStopVariants = classVarianceAuthority.cva(
10781
10981
  [
10782
10982
  "absolute",
10783
- "top-1/2",
10784
- "-translate-y-1/2",
10785
- "w-[4px]",
10786
- // NOTE: measurement-derived value from MD3 spec §10.6 (trackStopDiameter: 4dp); permitted exception
10787
- "h-[4px]",
10788
10983
  "rounded-full",
10789
10984
  "bg-on-secondary-container",
10790
- "pointer-events-none"
10985
+ "pointer-events-none",
10986
+ "w-[4px]",
10987
+ "h-[4px]"
10791
10988
  ],
10792
10989
  {
10793
10990
  variants: {
10794
10991
  position: {
10795
10992
  start: "left-[4px]",
10796
- // NOTE: measurement-derived (trackStopOffset: 4dp); permitted exception
10797
10993
  end: "right-[4px]"
10798
10994
  }
10799
10995
  },
@@ -10802,64 +10998,23 @@ var sliderTrackStopVariants = classVarianceAuthority.cva(
10802
10998
  }
10803
10999
  }
10804
11000
  );
10805
- var sliderValueIndicatorVariants = classVarianceAuthority.cva(
10806
- [
10807
- "absolute",
10808
- "left-1/2",
10809
- "-translate-x-1/2",
10810
- "bottom-[calc(100%+4px)]",
10811
- // NOTE: measurement-derived (4dp gap above handle); permitted exception
10812
- "bg-inverse-surface",
10813
- "rounded-full",
10814
- // pill shape (1000dp radius)
10815
- "px-[16px]",
10816
- // NOTE: measurement-derived (valueIndicatorPaddingH: 16dp); permitted exception
10817
- "py-[12px]",
10818
- // NOTE: measurement-derived (valueIndicatorPaddingV: 12dp); permitted exception
10819
- "min-w-[48px]",
10820
- // NOTE: measurement-derived (valueIndicatorWidth: 48dp); permitted exception
10821
- "flex",
10822
- "items-center",
10823
- "justify-center",
10824
- "pointer-events-none",
10825
- "z-20"
10826
- // Motion classes (transition-[transform,opacity] with directional easing) applied
10827
- // conditionally in SliderValueIndicator.tsx via useReducedMotion guard.
10828
- ],
10829
- {
10830
- variants: {
10831
- visible: {
10832
- true: "opacity-100 scale-100",
10833
- false: "opacity-0 scale-0"
10834
- }
10835
- },
10836
- defaultVariants: {
10837
- visible: false
10838
- }
10839
- }
10840
- );
10841
11001
  var sliderValueIndicatorTextVariants = classVarianceAuthority.cva([
10842
11002
  "text-inverse-on-surface",
10843
11003
  "text-label-large",
10844
- // MD3 Label Large typescale token
10845
- "whitespace-nowrap",
10846
- "text-center"
11004
+ "select-none",
11005
+ "whitespace-nowrap"
10847
11006
  ]);
10848
11007
  var sliderInsetIconVariants = classVarianceAuthority.cva(
10849
11008
  ["absolute", "text-on-primary", "pointer-events-none", "flex", "items-center", "justify-center"],
10850
11009
  {
10851
11010
  variants: {
10852
11011
  size: {
10853
- // NOTE: measurement-derived values from MD3 spec §10.7 (icon sizes); permitted exception
10854
11012
  medium: "w-[24px] h-[24px]",
10855
11013
  large: "w-[24px] h-[24px]",
10856
11014
  xlarge: "w-[32px] h-[32px]"
10857
11015
  },
10858
11016
  orientation: {
10859
- // Horizontal: 8dp from active track left edge, vertically centered
10860
- // NOTE: measurement-derived value from MD3 spec §10.7 (iconOffset: 8dp); permitted exception
10861
11017
  horizontal: "left-[8px] top-1/2 -translate-y-1/2",
10862
- // Vertical: 8dp from active track bottom edge (outer end), horizontally centered
10863
11018
  vertical: "bottom-[8px] left-1/2 -translate-x-1/2"
10864
11019
  }
10865
11020
  },
@@ -10890,7 +11045,7 @@ function SliderStops({
10890
11045
  step,
10891
11046
  values,
10892
11047
  variant,
10893
- isDisabled,
11048
+ size = "xsmall",
10894
11049
  className
10895
11050
  }) {
10896
11051
  const stopCount = Math.floor((maxValue - minValue) / step) + 1;
@@ -10908,7 +11063,10 @@ function SliderStops({
10908
11063
  {
10909
11064
  "data-slot": "stop-dot",
10910
11065
  className: cn(
10911
- sliderStopDotVariants({ onActiveTrack: isOnActive, disabled: isDisabled })
11066
+ sliderStopDotVariants({
11067
+ region: isOnActive ? "active" : "inactive",
11068
+ size
11069
+ })
10912
11070
  )
10913
11071
  },
10914
11072
  i
@@ -10919,27 +11077,19 @@ function SliderStops({
10919
11077
  }
10920
11078
  function SliderValueIndicator({
10921
11079
  value,
10922
- isVisible,
10923
11080
  formatValue: formatValue2,
10924
11081
  className
10925
11082
  }) {
10926
11083
  const displayValue = formatValue2 ? formatValue2(value) : `${Math.round(value)}`;
10927
11084
  const reducedMotion = useReducedMotion();
10928
- const transitionClasses = reducedMotion ? "" : cn(
10929
- "transition-[transform,opacity]",
10930
- isVisible ? "duration-short3 ease-standard-decelerate" : "duration-short2 ease-standard-accelerate"
10931
- );
11085
+ const transitionClasses = reducedMotion ? "" : "transition-[scale,opacity] duration-spring-standard-fast-spatial ease-spring-standard-fast-spatial";
10932
11086
  return /* @__PURE__ */ jsxRuntime.jsx(
10933
11087
  "div",
10934
11088
  {
10935
11089
  "data-slot": "value-indicator",
10936
- className: cn(
10937
- sliderValueIndicatorVariants({ visible: isVisible }),
10938
- transitionClasses,
10939
- className
10940
- ),
11090
+ className: cn(sliderValueIndicatorVariants(), transitionClasses, className),
10941
11091
  role: "tooltip",
10942
- "aria-hidden": !isVisible,
11092
+ "aria-hidden": "true",
10943
11093
  children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: sliderValueIndicatorTextVariants(), children: displayValue })
10944
11094
  }
10945
11095
  );
@@ -10952,6 +11102,16 @@ function resolveDefaultValue(variant, minValue) {
10952
11102
  if (variant === "centered") return [0];
10953
11103
  return [minValue];
10954
11104
  }
11105
+ var GAP_PX = 3;
11106
+ function segmentStyle(orientation, opts) {
11107
+ const { start, end, startGap = 0, endGap = 0 } = opts;
11108
+ const startVal = start !== null ? `calc(${start}% + ${startGap}px)` : `${startGap}px`;
11109
+ const endVal = end !== null ? `calc(${100 - end}% + ${endGap}px)` : `${endGap}px`;
11110
+ if (orientation === "horizontal") {
11111
+ return { left: startVal, right: endVal };
11112
+ }
11113
+ return { bottom: startVal, top: endVal };
11114
+ }
10955
11115
  var Slider = React.forwardRef(
10956
11116
  ({
10957
11117
  size = "xsmall",
@@ -10985,103 +11145,75 @@ var Slider = React.forwardRef(
10985
11145
  },
10986
11146
  [value, onChange]
10987
11147
  );
10988
- const thumbCount = variant === "range" ? 2 : 1;
10989
- const [thumbStates, setThumbStates] = React.useState(
10990
- () => Array(thumbCount).fill("enabled")
10991
- );
10992
- const isDragging = thumbStates.some((s) => s === "pressed");
10993
- const trackTransition = reducedMotion || isDragging ? "" : "transition-[flex-basis] duration-spring-standard-fast-spatial ease-spring-standard-fast-spatial";
10994
- const handleMotion = reducedMotion ? "" : "transition-[width] duration-short2 ease-standard";
10995
- const stateLayerMotion = reducedMotion ? "" : "transition-opacity duration-short1 ease-standard";
11148
+ const [anyThumbDragging, setAnyThumbDragging] = React.useState(false);
11149
+ const handleThumbDraggingChange = React.useCallback((_index, isDragging) => {
11150
+ setAnyThumbDragging(isDragging);
11151
+ }, []);
11152
+ const springTokens = "duration-spring-standard-fast-spatial ease-spring-standard-fast-spatial";
11153
+ const trackTransition = reducedMotion || anyThumbDragging ? "" : orientation === "vertical" ? `transition-[top,bottom,height] ${springTokens}` : `transition-[left,width,right] ${springTokens}`;
11154
+ const handleMotion = reducedMotion ? "" : "transition-[width] duration-spring-standard-fast-spatial ease-spring-standard-fast-spatial";
10996
11155
  const isRange = variant === "range";
10997
11156
  const isCentered = variant === "centered";
10998
11157
  const showIcon = icon !== void 0 && variant === "standard" && (size === "medium" || size === "large" || size === "xlarge");
11158
+ const renderThumbContent = React.useCallback(
11159
+ ({ value: thumbValue }) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
11160
+ /* @__PURE__ */ jsxRuntime.jsx(
11161
+ "div",
11162
+ {
11163
+ "aria-hidden": "true",
11164
+ className: cn(
11165
+ "absolute",
11166
+ "left-1/2",
11167
+ "top-1/2",
11168
+ "-translate-x-1/2",
11169
+ "-translate-y-1/2",
11170
+ orientation === "vertical" ? "h-[20px] w-full" : "h-full w-[20px]"
11171
+ )
11172
+ }
11173
+ ),
11174
+ /* @__PURE__ */ jsxRuntime.jsx(
11175
+ "div",
11176
+ {
11177
+ "data-slot": "handle",
11178
+ className: cn(sliderHandleVariants({ size, orientation }), handleMotion)
11179
+ }
11180
+ ),
11181
+ /* @__PURE__ */ jsxRuntime.jsx("div", { "data-slot": "state-layer", className: cn(sliderHandleStateLayerVariants()) }),
11182
+ showValueIndicator && /* @__PURE__ */ jsxRuntime.jsx(
11183
+ SliderValueIndicator,
11184
+ {
11185
+ value: thumbValue,
11186
+ ...formatValue2 !== void 0 ? { formatValue: formatValue2 } : {}
11187
+ }
11188
+ )
11189
+ ] }),
11190
+ [size, orientation, showValueIndicator, formatValue2, handleMotion]
11191
+ );
10999
11192
  const renderStandardTrack = () => {
11000
11193
  const pct = clampPercent(currentValues[0] ?? minValue, minValue, maxValue);
11001
- const thumb0State = isDisabled ? "disabled" : thumbStates[0] ?? "enabled";
11002
11194
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
11003
11195
  /* @__PURE__ */ jsxRuntime.jsx(
11004
11196
  "div",
11005
11197
  {
11006
11198
  "data-slot": "active-track",
11007
- className: cn(
11008
- sliderActiveTrackVariants({ size, disabled: isDisabled, orientation }),
11009
- trackTransition
11010
- ),
11011
- style: { flexBasis: `${pct}%` },
11199
+ className: cn(sliderActiveTrackVariants({ size, orientation }), trackTransition),
11200
+ style: segmentStyle(orientation, { start: null, end: pct, endGap: GAP_PX }),
11012
11201
  children: showIcon && /* @__PURE__ */ jsxRuntime.jsx(
11013
11202
  "span",
11014
11203
  {
11015
11204
  "data-slot": "inset-icon",
11016
- className: cn(
11017
- sliderInsetIconVariants({
11018
- size,
11019
- orientation
11020
- })
11021
- ),
11205
+ className: cn(sliderInsetIconVariants({ size, orientation })),
11022
11206
  children: icon
11023
11207
  }
11024
11208
  )
11025
11209
  }
11026
11210
  ),
11027
- /* @__PURE__ */ jsxRuntime.jsxs(
11028
- "div",
11029
- {
11030
- "data-slot": "handle",
11031
- className: cn(
11032
- sliderHandleVariants({
11033
- size,
11034
- disabled: isDisabled,
11035
- pressed: thumb0State === "pressed",
11036
- orientation
11037
- }),
11038
- handleMotion
11039
- ),
11040
- onPointerEnter: () => {
11041
- if (!isDisabled) setThumbStates(["hovered"]);
11042
- },
11043
- onPointerLeave: () => {
11044
- if (!isDisabled) setThumbStates(["enabled"]);
11045
- },
11046
- onPointerDown: (e) => {
11047
- e.stopPropagation();
11048
- if (!isDisabled) setThumbStates(["pressed"]);
11049
- },
11050
- onPointerUp: (e) => {
11051
- e.stopPropagation();
11052
- if (!isDisabled) setThumbStates(["enabled"]);
11053
- },
11054
- children: [
11055
- /* @__PURE__ */ jsxRuntime.jsx(
11056
- "div",
11057
- {
11058
- "data-slot": "state-layer",
11059
- className: cn(
11060
- sliderHandleStateLayerVariants({ state: thumb0State }),
11061
- stateLayerMotion
11062
- )
11063
- }
11064
- ),
11065
- showValueIndicator && /* @__PURE__ */ jsxRuntime.jsx(
11066
- SliderValueIndicator,
11067
- {
11068
- value: currentValues[0] ?? minValue,
11069
- isVisible: thumb0State === "pressed",
11070
- ...formatValue2 !== void 0 ? { formatValue: formatValue2 } : {}
11071
- }
11072
- )
11073
- ]
11074
- }
11075
- ),
11076
11211
  /* @__PURE__ */ jsxRuntime.jsx(
11077
11212
  "div",
11078
11213
  {
11079
11214
  "data-slot": "inactive-track",
11080
- className: cn(
11081
- sliderInactiveTrackVariants({ size, disabled: isDisabled, orientation }),
11082
- trackTransition
11083
- ),
11084
- style: { flexBasis: `${100 - pct}%` },
11215
+ className: cn(sliderInactiveTrackVariants({ size, orientation }), trackTransition),
11216
+ style: segmentStyle(orientation, { start: pct, startGap: GAP_PX, end: null }),
11085
11217
  children: showStops && /* @__PURE__ */ jsxRuntime.jsx(
11086
11218
  "span",
11087
11219
  {
@@ -11096,20 +11228,13 @@ var Slider = React.forwardRef(
11096
11228
  const renderRangeTrack = () => {
11097
11229
  const leftPct = clampPercent(currentValues[0] ?? minValue, minValue, maxValue);
11098
11230
  const rightPct = clampPercent(currentValues[1] ?? maxValue, minValue, maxValue);
11099
- const thumb0State = isDisabled ? "disabled" : thumbStates[0] ?? "enabled";
11100
- const thumb1State = isDisabled ? "disabled" : thumbStates[1] ?? "enabled";
11101
- const setThumb0 = (next) => setThumbStates((s) => [next, s[1] ?? "enabled"]);
11102
- const setThumb1 = (next) => setThumbStates((s) => [s[0] ?? "enabled", next]);
11103
11231
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
11104
11232
  /* @__PURE__ */ jsxRuntime.jsx(
11105
11233
  "div",
11106
11234
  {
11107
11235
  "data-slot": "inactive-track-left",
11108
- className: cn(
11109
- sliderInactiveTrackVariants({ size, disabled: isDisabled, orientation }),
11110
- trackTransition
11111
- ),
11112
- style: { flexBasis: `${leftPct}%` },
11236
+ className: cn(sliderInactiveTrackVariants({ size, orientation }), trackTransition),
11237
+ style: segmentStyle(orientation, { start: null, end: leftPct, endGap: GAP_PX }),
11113
11238
  children: showStops && /* @__PURE__ */ jsxRuntime.jsx(
11114
11239
  "span",
11115
11240
  {
@@ -11119,128 +11244,30 @@ var Slider = React.forwardRef(
11119
11244
  )
11120
11245
  }
11121
11246
  ),
11122
- /* @__PURE__ */ jsxRuntime.jsxs(
11123
- "div",
11124
- {
11125
- "data-slot": "handle",
11126
- "data-index": "0",
11127
- className: cn(
11128
- sliderHandleVariants({
11129
- size,
11130
- disabled: isDisabled,
11131
- pressed: thumb0State === "pressed",
11132
- orientation
11133
- }),
11134
- handleMotion
11135
- ),
11136
- onPointerEnter: () => {
11137
- if (!isDisabled) setThumb0("hovered");
11138
- },
11139
- onPointerLeave: () => {
11140
- if (!isDisabled) setThumb0("enabled");
11141
- },
11142
- onPointerDown: (e) => {
11143
- e.stopPropagation();
11144
- if (!isDisabled) setThumb0("pressed");
11145
- },
11146
- onPointerUp: (e) => {
11147
- e.stopPropagation();
11148
- if (!isDisabled) setThumb0("enabled");
11149
- },
11150
- children: [
11151
- /* @__PURE__ */ jsxRuntime.jsx(
11152
- "div",
11153
- {
11154
- "data-slot": "state-layer",
11155
- className: cn(
11156
- sliderHandleStateLayerVariants({ state: thumb0State }),
11157
- stateLayerMotion
11158
- )
11159
- }
11160
- ),
11161
- showValueIndicator && /* @__PURE__ */ jsxRuntime.jsx(
11162
- SliderValueIndicator,
11163
- {
11164
- value: currentValues[0] ?? minValue,
11165
- isVisible: thumb0State === "pressed",
11166
- ...formatValue2 !== void 0 ? { formatValue: formatValue2 } : {}
11167
- }
11168
- )
11169
- ]
11170
- }
11171
- ),
11172
11247
  /* @__PURE__ */ jsxRuntime.jsx(
11173
11248
  "div",
11174
11249
  {
11175
11250
  "data-slot": "active-track",
11176
11251
  className: cn(
11177
- sliderActiveTrackVariants({ size, disabled: isDisabled, orientation }),
11252
+ sliderActiveTrackVariants({ size, orientation }),
11178
11253
  "rounded-[2px]",
11179
- // Both ends near handles: 2dp (MD3 §10.2)
11254
+ // Both ends near handles: 2dp inner (MD3 §10.2)
11180
11255
  trackTransition
11181
11256
  ),
11182
- style: { flexBasis: `${rightPct - leftPct}%` }
11183
- }
11184
- ),
11185
- /* @__PURE__ */ jsxRuntime.jsxs(
11186
- "div",
11187
- {
11188
- "data-slot": "handle",
11189
- "data-index": "1",
11190
- className: cn(
11191
- sliderHandleVariants({
11192
- size,
11193
- disabled: isDisabled,
11194
- pressed: thumb1State === "pressed",
11195
- orientation
11196
- }),
11197
- handleMotion
11198
- ),
11199
- onPointerEnter: () => {
11200
- if (!isDisabled) setThumb1("hovered");
11201
- },
11202
- onPointerLeave: () => {
11203
- if (!isDisabled) setThumb1("enabled");
11204
- },
11205
- onPointerDown: (e) => {
11206
- e.stopPropagation();
11207
- if (!isDisabled) setThumb1("pressed");
11208
- },
11209
- onPointerUp: (e) => {
11210
- e.stopPropagation();
11211
- if (!isDisabled) setThumb1("enabled");
11212
- },
11213
- children: [
11214
- /* @__PURE__ */ jsxRuntime.jsx(
11215
- "div",
11216
- {
11217
- "data-slot": "state-layer",
11218
- className: cn(
11219
- sliderHandleStateLayerVariants({ state: thumb1State }),
11220
- stateLayerMotion
11221
- )
11222
- }
11223
- ),
11224
- showValueIndicator && /* @__PURE__ */ jsxRuntime.jsx(
11225
- SliderValueIndicator,
11226
- {
11227
- value: currentValues[1] ?? maxValue,
11228
- isVisible: thumb1State === "pressed",
11229
- ...formatValue2 !== void 0 ? { formatValue: formatValue2 } : {}
11230
- }
11231
- )
11232
- ]
11257
+ style: segmentStyle(orientation, {
11258
+ start: leftPct,
11259
+ startGap: GAP_PX,
11260
+ end: rightPct,
11261
+ endGap: GAP_PX
11262
+ })
11233
11263
  }
11234
11264
  ),
11235
11265
  /* @__PURE__ */ jsxRuntime.jsx(
11236
11266
  "div",
11237
11267
  {
11238
11268
  "data-slot": "inactive-track-right",
11239
- className: cn(
11240
- sliderInactiveTrackVariants({ size, disabled: isDisabled, orientation }),
11241
- trackTransition
11242
- ),
11243
- style: { flexBasis: `${100 - rightPct}%` },
11269
+ className: cn(sliderInactiveTrackVariants({ size, orientation }), trackTransition),
11270
+ style: segmentStyle(orientation, { start: rightPct, startGap: GAP_PX, end: null }),
11244
11271
  children: showStops && /* @__PURE__ */ jsxRuntime.jsx(
11245
11272
  "span",
11246
11273
  {
@@ -11255,126 +11282,65 @@ var Slider = React.forwardRef(
11255
11282
  const renderCenteredTrack = () => {
11256
11283
  const thumbPct = clampPercent(currentValues[0] ?? minValue, minValue, maxValue);
11257
11284
  const zeroPct = minValue >= 0 ? 0 : maxValue <= 0 ? 100 : (0 - minValue) / (maxValue - minValue) * 100;
11258
- const thumb0State = isDisabled ? "disabled" : thumbStates[0] ?? "enabled";
11259
- const handleEl = /* @__PURE__ */ jsxRuntime.jsxs(
11260
- "div",
11261
- {
11262
- "data-slot": "handle",
11263
- className: cn(
11264
- sliderHandleVariants({
11265
- size,
11266
- disabled: isDisabled,
11267
- pressed: thumb0State === "pressed",
11268
- orientation
11269
- }),
11270
- handleMotion
11271
- ),
11272
- onPointerEnter: () => {
11273
- if (!isDisabled) setThumbStates(["hovered"]);
11274
- },
11275
- onPointerLeave: () => {
11276
- if (!isDisabled) setThumbStates(["enabled"]);
11277
- },
11278
- onPointerDown: (e) => {
11279
- e.stopPropagation();
11280
- if (!isDisabled) setThumbStates(["pressed"]);
11281
- },
11282
- onPointerUp: (e) => {
11283
- e.stopPropagation();
11284
- if (!isDisabled) setThumbStates(["enabled"]);
11285
- },
11286
- children: [
11287
- /* @__PURE__ */ jsxRuntime.jsx(
11288
- "div",
11289
- {
11290
- "data-slot": "state-layer",
11291
- className: cn(sliderHandleStateLayerVariants({ state: thumb0State }), stateLayerMotion)
11292
- }
11293
- ),
11294
- showValueIndicator && /* @__PURE__ */ jsxRuntime.jsx(
11295
- SliderValueIndicator,
11296
- {
11297
- value: currentValues[0] ?? minValue,
11298
- isVisible: thumb0State === "pressed",
11299
- ...formatValue2 !== void 0 ? { formatValue: formatValue2 } : {}
11300
- }
11301
- )
11302
- ]
11303
- }
11304
- );
11305
11285
  if (thumbPct >= zeroPct) {
11306
- const activePct = thumbPct - zeroPct;
11307
11286
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
11308
11287
  /* @__PURE__ */ jsxRuntime.jsx(
11309
11288
  "div",
11310
11289
  {
11311
11290
  "data-slot": "inactive-track-left",
11312
- className: cn(
11313
- sliderInactiveTrackVariants({ size, disabled: isDisabled, orientation }),
11314
- trackTransition
11315
- ),
11316
- style: { flexBasis: `${zeroPct}%` }
11291
+ className: cn(sliderInactiveTrackVariants({ size, orientation }), trackTransition),
11292
+ style: segmentStyle(orientation, { start: null, end: zeroPct })
11317
11293
  }
11318
11294
  ),
11319
- handleEl,
11320
11295
  /* @__PURE__ */ jsxRuntime.jsx(
11321
11296
  "div",
11322
11297
  {
11323
11298
  "data-slot": "active-track",
11324
- className: cn(
11325
- sliderActiveTrackVariants({ size, disabled: isDisabled, orientation }),
11326
- trackTransition
11327
- ),
11328
- style: { flexBasis: `${activePct}%` }
11299
+ className: cn(sliderActiveTrackVariants({ size, orientation }), trackTransition),
11300
+ style: segmentStyle(orientation, {
11301
+ start: zeroPct,
11302
+ end: thumbPct,
11303
+ endGap: GAP_PX
11304
+ })
11329
11305
  }
11330
11306
  ),
11331
11307
  /* @__PURE__ */ jsxRuntime.jsx(
11332
11308
  "div",
11333
11309
  {
11334
11310
  "data-slot": "inactive-track-right",
11335
- className: cn(
11336
- sliderInactiveTrackVariants({ size, disabled: isDisabled, orientation }),
11337
- trackTransition
11338
- ),
11339
- style: { flexBasis: `${100 - zeroPct - activePct}%` }
11311
+ className: cn(sliderInactiveTrackVariants({ size, orientation }), trackTransition),
11312
+ style: segmentStyle(orientation, { start: thumbPct, startGap: GAP_PX, end: null })
11340
11313
  }
11341
11314
  )
11342
11315
  ] });
11343
11316
  } else {
11344
- const activePct = zeroPct - thumbPct;
11345
11317
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
11346
11318
  /* @__PURE__ */ jsxRuntime.jsx(
11347
11319
  "div",
11348
11320
  {
11349
11321
  "data-slot": "inactive-track-left",
11350
- className: cn(
11351
- sliderInactiveTrackVariants({ size, disabled: isDisabled, orientation }),
11352
- trackTransition
11353
- ),
11354
- style: { flexBasis: `${thumbPct}%` }
11322
+ className: cn(sliderInactiveTrackVariants({ size, orientation }), trackTransition),
11323
+ style: segmentStyle(orientation, { start: null, end: thumbPct, endGap: GAP_PX })
11355
11324
  }
11356
11325
  ),
11357
11326
  /* @__PURE__ */ jsxRuntime.jsx(
11358
11327
  "div",
11359
11328
  {
11360
11329
  "data-slot": "active-track",
11361
- className: cn(
11362
- sliderActiveTrackVariants({ size, disabled: isDisabled, orientation }),
11363
- trackTransition
11364
- ),
11365
- style: { flexBasis: `${activePct}%` }
11330
+ className: cn(sliderActiveTrackVariants({ size, orientation }), trackTransition),
11331
+ style: segmentStyle(orientation, {
11332
+ start: thumbPct,
11333
+ startGap: GAP_PX,
11334
+ end: zeroPct
11335
+ })
11366
11336
  }
11367
11337
  ),
11368
- handleEl,
11369
11338
  /* @__PURE__ */ jsxRuntime.jsx(
11370
11339
  "div",
11371
11340
  {
11372
11341
  "data-slot": "inactive-track-right",
11373
- className: cn(
11374
- sliderInactiveTrackVariants({ size, disabled: isDisabled, orientation }),
11375
- trackTransition
11376
- ),
11377
- style: { flexBasis: `${100 - zeroPct}%` }
11342
+ className: cn(sliderInactiveTrackVariants({ size, orientation }), trackTransition),
11343
+ style: segmentStyle(orientation, { start: zeroPct, end: null })
11378
11344
  }
11379
11345
  )
11380
11346
  ] });
@@ -11397,11 +11363,11 @@ var Slider = React.forwardRef(
11397
11363
  ...value !== void 0 ? { value } : {},
11398
11364
  ...defaultValue !== void 0 ? { defaultValue } : {},
11399
11365
  ...onChangeEnd !== void 0 ? { onChangeEnd } : {},
11400
- className: cn(
11401
- sliderContainerVariants({ size, disabled: isDisabled, orientation }),
11402
- className
11403
- ),
11404
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-slot": "track-layout", className: cn(sliderTrackLayoutVariants({ orientation })), children: [
11366
+ renderThumbContent,
11367
+ onThumbDraggingChange: handleThumbDraggingChange,
11368
+ className: cn(sliderContainerVariants({ size, orientation }), className),
11369
+ trackClassName: sliderTrackRegionVariants({ size, orientation }),
11370
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-slot": "track-layout", className: cn(sliderTrackLayoutVariants()), children: [
11405
11371
  isRange ? renderRangeTrack() : isCentered ? renderCenteredTrack() : renderStandardTrack(),
11406
11372
  canShowStops && /* @__PURE__ */ jsxRuntime.jsx(
11407
11373
  SliderStops,
@@ -11411,7 +11377,7 @@ var Slider = React.forwardRef(
11411
11377
  step,
11412
11378
  values: currentValues,
11413
11379
  variant,
11414
- isDisabled
11380
+ size
11415
11381
  }
11416
11382
  )
11417
11383
  ] })
@@ -16121,8 +16087,22 @@ exports.remToPx = remToPx;
16121
16087
  exports.rgbToHex = rgbToHex;
16122
16088
  exports.richTooltipVariants = richTooltipVariants;
16123
16089
  exports.scrimVariants = scrimVariants2;
16124
- exports.searchBarVariants = searchBarVariants;
16090
+ exports.searchBarAvatarVariants = searchBarAvatarVariants;
16091
+ exports.searchBarFocusRingVariants = searchBarFocusRingVariants;
16092
+ exports.searchBarInputVariants = searchBarInputVariants;
16093
+ exports.searchBarLeadingIconVariants = searchBarLeadingIconVariants;
16094
+ exports.searchBarRootVariants = searchBarRootVariants;
16095
+ exports.searchBarStateLayerVariants = searchBarStateLayerVariants;
16096
+ exports.searchBarTrailingActionVariants = searchBarTrailingActionVariants;
16097
+ exports.searchBarTrailingActionsVariants = searchBarTrailingActionsVariants;
16098
+ exports.searchViewBackButtonVariants = searchViewBackButtonVariants;
16099
+ exports.searchViewClearButtonVariants = searchViewClearButtonVariants;
16100
+ exports.searchViewContentVariants = searchViewContentVariants;
16101
+ exports.searchViewDividerVariants = searchViewDividerVariants;
16125
16102
  exports.searchViewHeaderVariants = searchViewHeaderVariants;
16103
+ exports.searchViewInputVariants = searchViewInputVariants;
16104
+ exports.searchViewTrailingActionVariants = searchViewTrailingActionVariants;
16105
+ exports.searchViewTrailingActionsVariants = searchViewTrailingActionsVariants;
16126
16106
  exports.searchViewVariants = searchViewVariants;
16127
16107
  exports.sliderActiveTrackVariants = sliderActiveTrackVariants;
16128
16108
  exports.sliderContainerVariants = sliderContainerVariants;