@tinybigui/react 0.16.0 → 0.18.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.js CHANGED
@@ -3139,224 +3139,102 @@ var RadioGroupHeadless = forwardRef(
3139
3139
  }
3140
3140
  );
3141
3141
  RadioGroupHeadless.displayName = "RadioGroupHeadless";
3142
+ var radioRootVariants = cva([
3143
+ "relative inline-flex items-center cursor-pointer select-none",
3144
+ // Disabled state — self-targeting so children inherit via group
3145
+ "data-[disabled]:cursor-not-allowed data-[disabled]:pointer-events-none",
3146
+ "data-[disabled]:opacity-38"
3147
+ ]);
3148
+ var radioControlVariants = cva([
3149
+ "relative flex items-center justify-center flex-shrink-0",
3150
+ "size-10"
3151
+ // 40dp touch target (MD3 spec)
3152
+ ]);
3153
+ var radioFocusRingVariants = cva([
3154
+ "pointer-events-none absolute inset-0 rounded-full",
3155
+ "outline outline-2 outline-offset-2 outline-secondary",
3156
+ // Effects transition for opacity
3157
+ "transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects",
3158
+ "opacity-0",
3159
+ "group-data-[focus-visible]/radio:opacity-100"
3160
+ ]);
3161
+ var radioTargetVariants = cva([
3162
+ "absolute inset-0 rounded-full overflow-hidden",
3163
+ "flex items-center justify-center"
3164
+ ]);
3165
+ var radioStateLayerVariants = cva([
3166
+ "absolute inset-0 rounded-full pointer-events-none opacity-0",
3167
+ // Base state-layer color (unselected)
3168
+ "bg-on-surface",
3169
+ // Effects transition for opacity + color
3170
+ "transition-[opacity,background-color] duration-spring-standard-fast-effects ease-spring-standard-fast-effects",
3171
+ // Selected state-layer color
3172
+ "group-data-[selected]/radio:bg-primary",
3173
+ // Error state-layer color (overrides selected via cascade position)
3174
+ "group-data-[invalid]/radio:bg-error",
3175
+ // Interaction opacities (MD3: hover 8%, focus/pressed 10%)
3176
+ "group-data-[hovered]/radio:opacity-8",
3177
+ "group-data-[focus-visible]/radio:opacity-10",
3178
+ "group-data-[pressed]/radio:opacity-10",
3179
+ // No state layer when disabled
3180
+ "group-data-[disabled]/radio:hidden"
3181
+ ]);
3182
+ var radioRingVariants = cva([
3183
+ "relative z-10 size-5 rounded-full border-2 flex items-center justify-center flex-shrink-0",
3184
+ // Base (unselected, enabled)
3185
+ "border-on-surface-variant",
3186
+ // Effects transition for border-color
3187
+ "transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects",
3188
+ // Selected — border becomes primary
3189
+ "group-data-[selected]/radio:border-primary",
3190
+ // Error — placed after selected so it overrides by cascade order
3191
+ "group-data-[invalid]/radio:border-error",
3192
+ // Disabled — on-surface/38 opacity value
3193
+ "group-data-[disabled]/radio:border-on-surface/38"
3194
+ ]);
3195
+ var radioDotVariants = cva([
3196
+ "size-2.5 rounded-full origin-center",
3197
+ // Spatial transition for scale — springs may overshoot (intentional)
3198
+ "transition-transform duration-spring-standard-fast-spatial ease-spring-standard-fast-spatial",
3199
+ // Base fill color (shown when selected)
3200
+ "bg-primary",
3201
+ // Hidden when unselected
3202
+ "scale-0",
3203
+ // Visible when selected
3204
+ "group-data-[selected]/radio:scale-100",
3205
+ // Error — error fill color (placed after selected by cascade)
3206
+ "group-data-[invalid]/radio:bg-error",
3207
+ // Disabled — use on-surface/38 opacity
3208
+ "group-data-[disabled]/radio:bg-on-surface/38"
3209
+ ]);
3210
+ var radioLabelVariants = cva(["text-body-medium text-on-surface select-none ml-4"]);
3142
3211
  var radioGroupVariants = cva(
3143
- [
3144
- // Base classes (always applied to group wrapper)
3145
- "flex",
3146
- "gap-4"
3147
- // 16px spacing between radios (MD3 standard)
3148
- ],
3212
+ ["flex", "gap-1"],
3213
+ // 4dp gap padding around each 40dp control handles visual spacing
3149
3214
  {
3150
3215
  variants: {
3151
3216
  /**
3152
3217
  * Layout orientation
3218
+ * @default "vertical"
3153
3219
  */
3154
3220
  orientation: {
3155
3221
  vertical: "flex-col",
3156
3222
  horizontal: "flex-row flex-wrap"
3157
- },
3158
- /**
3159
- * Disabled state
3160
- */
3161
- disabled: {
3162
- true: "",
3163
- false: ""
3164
- }
3165
- },
3166
- defaultVariants: {
3167
- orientation: "vertical",
3168
- disabled: false
3169
- }
3170
- }
3171
- );
3172
- var radioGroupLabelVariants = cva(
3173
- [
3174
- "text-sm font-medium",
3175
- // MD3: Body Medium
3176
- "text-on-surface",
3177
- "mb-3"
3178
- // Spacing below label (12px)
3179
- ],
3180
- {
3181
- variants: {
3182
- disabled: {
3183
- true: "opacity-38",
3184
- false: ""
3185
- }
3186
- },
3187
- defaultVariants: {
3188
- disabled: false
3189
- }
3190
- }
3191
- );
3192
- var radioVariants = cva(
3193
- [
3194
- // Base classes (always applied to label wrapper)
3195
- "relative inline-flex items-center cursor-pointer select-none",
3196
- "transition-opacity duration-200"
3197
- ],
3198
- {
3199
- variants: {
3200
- /**
3201
- * Disabled state
3202
- */
3203
- disabled: {
3204
- true: "opacity-38 cursor-not-allowed pointer-events-none",
3205
- false: ""
3206
- }
3207
- },
3208
- defaultVariants: {
3209
- disabled: false
3210
- }
3211
- }
3212
- );
3213
- var radioContainerVariants = cva(
3214
- [
3215
- // Base classes for radio visual container
3216
- "relative inline-flex items-center justify-center",
3217
- "w-10 h-10",
3218
- // 40x40dp touch target (MD3 spec)
3219
- "flex-shrink-0",
3220
- "transition-all duration-200",
3221
- "m-1",
3222
- // 4px margin around radio for spacing (total 8px gap between radios)
3223
- // State layer (hover, focus, active) - MD3 spec: 8%/12%/12% opacity
3224
- "before:absolute before:inset-0 before:rounded-full before:transition-opacity before:duration-200",
3225
- "before:bg-current before:opacity-0",
3226
- "hover:before:opacity-8",
3227
- "active:before:opacity-12"
3228
- ],
3229
- {
3230
- variants: {
3231
- /**
3232
- * Radio state (determines visual appearance)
3233
- */
3234
- state: {
3235
- unselected: "text-on-surface-variant",
3236
- selected: "text-primary"
3237
- },
3238
- /**
3239
- * Error/invalid state
3240
- */
3241
- isInvalid: {
3242
- true: "text-error",
3243
- false: ""
3244
- },
3245
- /**
3246
- * Disabled state
3247
- */
3248
- disabled: {
3249
- true: "text-on-surface pointer-events-none",
3250
- false: ""
3251
- }
3252
- },
3253
- compoundVariants: [
3254
- // Error state overrides normal colors for all states
3255
- {
3256
- state: "unselected",
3257
- isInvalid: true,
3258
- disabled: false,
3259
- className: "text-error"
3260
- },
3261
- {
3262
- state: "selected",
3263
- isInvalid: true,
3264
- disabled: false,
3265
- className: "text-error"
3266
- }
3267
- ],
3268
- defaultVariants: {
3269
- state: "unselected",
3270
- isInvalid: false,
3271
- disabled: false
3272
- }
3273
- }
3274
- );
3275
- var radioIconOuterVariants = cva(
3276
- [
3277
- // Base classes for the radio outer circle
3278
- "transition-all duration-200 stroke-current stroke-2 fill-transparent"
3279
- ],
3280
- {
3281
- variants: {
3282
- /**
3283
- * Radio state
3284
- */
3285
- state: {
3286
- unselected: [],
3287
- selected: []
3288
- },
3289
- /**
3290
- * Disabled state
3291
- */
3292
- disabled: {
3293
- true: ["fill-transparent", "stroke-current", "stroke-2"],
3294
- false: ""
3295
3223
  }
3296
3224
  },
3297
- compoundVariants: [
3298
- // Disabled + selected state overrides fill
3299
- {
3300
- state: "selected",
3301
- disabled: true,
3302
- className: "fill-current stroke-none"
3303
- }
3304
- ],
3305
3225
  defaultVariants: {
3306
- state: "unselected",
3307
- disabled: false
3308
- }
3309
- }
3310
- );
3311
- var radioIconInnerVariants = cva(["transition-all origin-center duration-200"], {
3312
- variants: {
3313
- /**
3314
- * Visibility based on state
3315
- */
3316
- state: {
3317
- selected: ["fill-current"],
3318
- unselected: ["fill-transparent"]
3319
- },
3320
- visible: {
3321
- true: "opacity-100 scale-100 fill-current",
3322
- false: "opacity-0 scale-0"
3323
- }
3324
- },
3325
- defaultVariants: {
3326
- visible: false
3327
- }
3328
- });
3329
- var radioLabelVariants = cva(
3330
- [
3331
- "text-sm",
3332
- // MD3: Body Medium (14px)
3333
- "text-on-surface",
3334
- "select-none"
3335
- ],
3336
- {
3337
- variants: {
3338
- disabled: {
3339
- true: "",
3340
- false: ""
3341
- }
3342
- },
3343
- defaultVariants: {
3344
- disabled: false
3226
+ orientation: "vertical"
3345
3227
  }
3346
3228
  }
3347
3229
  );
3230
+ var radioGroupLabelVariants = cva([
3231
+ "text-body-medium font-medium",
3232
+ "text-on-surface",
3233
+ "mb-3",
3234
+ "data-[disabled]:opacity-38"
3235
+ ]);
3348
3236
  var Radio = forwardRef(
3349
- ({
3350
- // Content props
3351
- children,
3352
- // State props
3353
- disableRipple = false,
3354
- isDisabled = false,
3355
- // Styling
3356
- className,
3357
- // Other props
3358
- ...props
3359
- }, forwardedRef) => {
3237
+ ({ children, disableRipple = false, isDisabled = false, className, ...props }, forwardedRef) => {
3360
3238
  const state = useContext(RadioGroupContext);
3361
3239
  if (!state) {
3362
3240
  throw new Error("Radio must be used within a RadioGroup");
@@ -3371,127 +3249,57 @@ var Radio = forwardRef(
3371
3249
  "data-testid": _dataTestId,
3372
3250
  id: _htmlId,
3373
3251
  title: _htmlTitle,
3374
- ...restPropsWithoutHtmlAttrs
3252
+ ...ariaProps
3375
3253
  } = props;
3376
3254
  const {
3377
3255
  inputProps,
3378
3256
  isSelected,
3379
- isDisabled: radioIsDisabled
3257
+ isDisabled: radioIsDisabled,
3258
+ isPressed
3380
3259
  } = useRadio(
3381
- {
3382
- ...restPropsWithoutHtmlAttrs,
3383
- value: props.value
3384
- },
3260
+ { ...ariaProps, value: props.value },
3385
3261
  state,
3386
3262
  ref
3387
3263
  );
3388
3264
  const { isFocusVisible, focusProps } = useFocusRing();
3389
3265
  const finalIsDisabled = isDisabled || radioIsDisabled;
3390
- const visualState = isSelected ? "selected" : "unselected";
3266
+ const { isHovered, hoverProps } = useHover({ isDisabled: finalIsDisabled });
3267
+ const isInvalid = state.validationState === "invalid";
3391
3268
  const { onMouseDown: handleRipple, ripples } = useRipple({
3392
3269
  disabled: finalIsDisabled || disableRipple
3393
3270
  });
3394
3271
  if (process.env.NODE_ENV === "development") {
3395
- const ariaProps = restPropsWithoutHtmlAttrs;
3396
- if (!children && !ariaProps["aria-label"] && !ariaProps["aria-labelledby"]) {
3397
- console.warn(
3398
- "[Radio] Radio should have a label (children) or aria-label for accessibility."
3399
- );
3272
+ const a = ariaProps;
3273
+ if (!children && !a["aria-label"] && !a["aria-labelledby"]) {
3274
+ console.warn("[Radio] Provide a label via children or aria-label for accessibility.");
3400
3275
  }
3401
3276
  }
3402
- const isInvalid = state.validationState === "invalid";
3403
3277
  return /* @__PURE__ */ jsxs(
3404
3278
  "label",
3405
3279
  {
3406
- className: cn(
3407
- radioVariants({
3408
- disabled: finalIsDisabled
3409
- }),
3410
- className
3411
- ),
3280
+ ...mergeProps$1(hoverProps),
3281
+ className: cn(radioRootVariants(), "group/radio", className),
3412
3282
  "data-testid": dataTestId,
3413
3283
  title: htmlTitle,
3284
+ ...getInteractionDataAttributes({
3285
+ isHovered,
3286
+ isFocusVisible,
3287
+ isPressed,
3288
+ isSelected,
3289
+ isDisabled: finalIsDisabled,
3290
+ isInvalid
3291
+ }),
3414
3292
  children: [
3415
3293
  /* @__PURE__ */ jsx(VisuallyHidden, { children: /* @__PURE__ */ jsx("input", { ...mergeProps$1(inputProps, focusProps), ref, id: htmlId }) }),
3416
- /* @__PURE__ */ jsxs(
3417
- "div",
3418
- {
3419
- role: "presentation",
3420
- className: cn(
3421
- radioContainerVariants({
3422
- state: visualState,
3423
- isInvalid,
3424
- disabled: finalIsDisabled
3425
- })
3426
- ),
3427
- onMouseDown: handleRipple,
3428
- children: [
3429
- ripples,
3430
- /* @__PURE__ */ jsxs(
3431
- "svg",
3432
- {
3433
- width: "20",
3434
- height: "20",
3435
- viewBox: "0 0 20 20",
3436
- "aria-hidden": "true",
3437
- className: "relative z-10",
3438
- children: [
3439
- /* @__PURE__ */ jsx(
3440
- "circle",
3441
- {
3442
- cx: "10",
3443
- cy: "10",
3444
- r: "9",
3445
- className: cn(
3446
- radioIconOuterVariants({
3447
- state: visualState,
3448
- disabled: finalIsDisabled
3449
- })
3450
- )
3451
- }
3452
- ),
3453
- /* @__PURE__ */ jsx(
3454
- "circle",
3455
- {
3456
- cx: "10",
3457
- cy: "10",
3458
- r: "5",
3459
- className: cn(
3460
- radioIconInnerVariants({
3461
- visible: isSelected
3462
- })
3463
- )
3464
- }
3465
- ),
3466
- isFocusVisible && /* @__PURE__ */ jsx(
3467
- "circle",
3468
- {
3469
- cx: "10",
3470
- cy: "10",
3471
- r: "13",
3472
- fill: "none",
3473
- stroke: "currentColor",
3474
- strokeWidth: "2",
3475
- className: "animate-pulse"
3476
- }
3477
- )
3478
- ]
3479
- }
3480
- )
3481
- ]
3482
- }
3483
- ),
3484
- children && /* @__PURE__ */ jsx(
3485
- "span",
3486
- {
3487
- className: cn(
3488
- radioLabelVariants({
3489
- disabled: finalIsDisabled
3490
- })
3491
- ),
3492
- children
3493
- }
3494
- )
3294
+ /* @__PURE__ */ jsxs("div", { role: "presentation", className: cn(radioControlVariants()), children: [
3295
+ /* @__PURE__ */ jsx("div", { className: cn(radioFocusRingVariants()), "aria-hidden": "true" }),
3296
+ /* @__PURE__ */ jsxs("div", { role: "presentation", className: cn(radioTargetVariants()), onMouseDown: handleRipple, children: [
3297
+ ripples,
3298
+ /* @__PURE__ */ jsx("span", { className: cn(radioStateLayerVariants()), "aria-hidden": "true" }),
3299
+ /* @__PURE__ */ jsx("div", { className: cn(radioRingVariants()), "aria-hidden": "true", children: /* @__PURE__ */ jsx("div", { className: cn(radioDotVariants()), "aria-hidden": "true" }) })
3300
+ ] })
3301
+ ] }),
3302
+ children && /* @__PURE__ */ jsx("span", { className: cn(radioLabelVariants()), children })
3495
3303
  ]
3496
3304
  }
3497
3305
  );
@@ -3504,7 +3312,7 @@ var RadioGroup = forwardRef(
3504
3312
  children,
3505
3313
  // State props
3506
3314
  orientation = "vertical",
3507
- isInvalid: _isInvalid = false,
3315
+ isInvalid = false,
3508
3316
  isDisabled = false,
3509
3317
  // Styling
3510
3318
  className,
@@ -3527,6 +3335,7 @@ var RadioGroup = forwardRef(
3527
3335
  {
3528
3336
  ...restPropsWithoutHtmlAttrs,
3529
3337
  isDisabled,
3338
+ isInvalid,
3530
3339
  ref,
3531
3340
  className: cn("flex flex-col", className),
3532
3341
  "data-testid": dataTestId,
@@ -3534,11 +3343,8 @@ var RadioGroup = forwardRef(
3534
3343
  "div",
3535
3344
  {
3536
3345
  ...labelProps,
3537
- className: cn(
3538
- radioGroupLabelVariants({
3539
- disabled: isDisabled
3540
- })
3541
- ),
3346
+ "data-disabled": isDisabled ? "" : void 0,
3347
+ className: cn(radioGroupLabelVariants()),
3542
3348
  children: props.label
3543
3349
  }
3544
3350
  ),
@@ -3547,8 +3353,7 @@ var RadioGroup = forwardRef(
3547
3353
  {
3548
3354
  className: cn(
3549
3355
  radioGroupVariants({
3550
- orientation,
3551
- disabled: isDisabled
3356
+ orientation
3552
3357
  })
3553
3358
  ),
3554
3359
  children
@@ -8806,6 +8611,30 @@ var InteractiveStyledListItem = forwardRef(
8806
8611
  }
8807
8612
  );
8808
8613
  InteractiveStyledListItem.displayName = "InteractiveStyledListItem";
8614
+ var ArrowBackIcon = () => /* @__PURE__ */ jsx(
8615
+ "svg",
8616
+ {
8617
+ width: "24",
8618
+ height: "24",
8619
+ viewBox: "0 0 24 24",
8620
+ fill: "currentColor",
8621
+ "aria-hidden": "true",
8622
+ focusable: "false",
8623
+ children: /* @__PURE__ */ jsx("path", { d: "M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z" })
8624
+ }
8625
+ );
8626
+ var CloseIcon3 = () => /* @__PURE__ */ jsx(
8627
+ "svg",
8628
+ {
8629
+ width: "24",
8630
+ height: "24",
8631
+ viewBox: "0 0 24 24",
8632
+ fill: "currentColor",
8633
+ "aria-hidden": "true",
8634
+ focusable: "false",
8635
+ children: /* @__PURE__ */ 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" })
8636
+ }
8637
+ );
8809
8638
  var SearchBarHeadless = forwardRef(
8810
8639
  ({
8811
8640
  value,
@@ -8821,7 +8650,9 @@ var SearchBarHeadless = forwardRef(
8821
8650
  "aria-label": ariaLabel,
8822
8651
  className,
8823
8652
  onFocus,
8824
- onBlur
8653
+ onBlur,
8654
+ inputClassName,
8655
+ trailingActionsClassName
8825
8656
  }, forwardedRef) => {
8826
8657
  const inputRef = useRef(null);
8827
8658
  const internalFormRef = useRef(null);
@@ -8855,8 +8686,17 @@ var SearchBarHeadless = forwardRef(
8855
8686
  );
8856
8687
  return /* @__PURE__ */ jsxs("form", { ref: formRef, role: "search", className, onSubmit: handleFormSubmit, children: [
8857
8688
  leadingIcon && /* @__PURE__ */ jsx("span", { "data-slot": "leading-icon", children: leadingIcon }),
8858
- /* @__PURE__ */ jsx("input", { ...inputProps, ref: inputRef, role: "searchbox" }),
8859
- trailingActions && trailingActions.length > 0 && /* @__PURE__ */ jsx("span", { "data-slot": "trailing-actions", children: trailingActions.map((action, index) => /* @__PURE__ */ jsx("span", { "data-slot": "trailing-action", children: action }, index)) }),
8689
+ /* @__PURE__ */ jsx(
8690
+ "input",
8691
+ {
8692
+ ...inputProps,
8693
+ ref: inputRef,
8694
+ role: "searchbox",
8695
+ "data-slot": "input",
8696
+ className: inputClassName
8697
+ }
8698
+ ),
8699
+ trailingActions && trailingActions.length > 0 && /* @__PURE__ */ jsx("span", { "data-slot": "trailing-actions", className: trailingActionsClassName, children: trailingActions }),
8860
8700
  avatar && /* @__PURE__ */ jsx("span", { "data-slot": "avatar", children: avatar })
8861
8701
  ] });
8862
8702
  }
@@ -8876,32 +8716,45 @@ var SearchViewHeadless = forwardRef(
8876
8716
  children,
8877
8717
  leadingIcon,
8878
8718
  trailingActions,
8879
- showDivider
8719
+ showDivider,
8720
+ layout = "fullscreen",
8721
+ headerClassName,
8722
+ backButtonClassName,
8723
+ clearButtonClassName,
8724
+ inputClassName,
8725
+ trailingActionsClassName,
8726
+ dividerClassName,
8727
+ contentClassName
8880
8728
  }, forwardedRef) => {
8881
8729
  if (!isOpen) {
8882
8730
  return null;
8883
8731
  }
8884
- return createPortal(
8885
- /* @__PURE__ */ jsx(
8886
- SearchViewPanel,
8887
- {
8888
- ref: forwardedRef,
8889
- onClose,
8890
- ariaLabel,
8891
- ...className !== void 0 ? { className } : {},
8892
- ...leadingIcon !== void 0 ? { leadingIcon } : {},
8893
- ...trailingActions !== void 0 ? { trailingActions } : {},
8894
- ...showDivider !== void 0 ? { showDivider } : {},
8895
- ...value !== void 0 ? { value } : {},
8896
- ...defaultValue !== void 0 ? { defaultValue } : {},
8897
- ...onChange !== void 0 ? { onChange } : {},
8898
- ...onSubmit !== void 0 ? { onSubmit } : {},
8899
- ...placeholder !== void 0 ? { placeholder } : {},
8900
- children
8901
- }
8902
- ),
8903
- document.body
8904
- );
8732
+ const panelProps = {
8733
+ onClose,
8734
+ ariaLabel,
8735
+ layout,
8736
+ children,
8737
+ ...className !== void 0 ? { className } : {},
8738
+ ...leadingIcon !== void 0 ? { leadingIcon } : {},
8739
+ ...trailingActions !== void 0 ? { trailingActions } : {},
8740
+ ...showDivider !== void 0 ? { showDivider } : {},
8741
+ ...value !== void 0 ? { value } : {},
8742
+ ...defaultValue !== void 0 ? { defaultValue } : {},
8743
+ ...onChange !== void 0 ? { onChange } : {},
8744
+ ...onSubmit !== void 0 ? { onSubmit } : {},
8745
+ ...placeholder !== void 0 ? { placeholder } : {},
8746
+ headerClassName,
8747
+ backButtonClassName,
8748
+ clearButtonClassName,
8749
+ inputClassName,
8750
+ trailingActionsClassName,
8751
+ dividerClassName,
8752
+ contentClassName
8753
+ };
8754
+ if (layout === "docked") {
8755
+ return /* @__PURE__ */ jsx(SearchViewPanel, { ref: forwardedRef, ...panelProps });
8756
+ }
8757
+ return createPortal(/* @__PURE__ */ jsx(SearchViewPanel, { ref: forwardedRef, ...panelProps }), document.body);
8905
8758
  }
8906
8759
  );
8907
8760
  SearchViewHeadless.displayName = "SearchViewHeadless";
@@ -8918,12 +8771,21 @@ var SearchViewPanel = forwardRef(
8918
8771
  children,
8919
8772
  leadingIcon,
8920
8773
  trailingActions,
8921
- showDivider
8774
+ showDivider,
8775
+ layout,
8776
+ headerClassName,
8777
+ backButtonClassName,
8778
+ clearButtonClassName,
8779
+ inputClassName,
8780
+ trailingActionsClassName,
8781
+ dividerClassName,
8782
+ contentClassName
8922
8783
  }, forwardedRef) => {
8923
8784
  const panelRef = useRef(null);
8924
8785
  const inputRef = useRef(null);
8925
8786
  const ref = forwardedRef ?? panelRef;
8926
- usePreventScroll();
8787
+ const isFullscreen = layout === "fullscreen";
8788
+ usePreventScroll({ isDisabled: !isFullscreen });
8927
8789
  const { overlayProps } = useOverlay(
8928
8790
  {
8929
8791
  isOpen: true,
@@ -8956,7 +8818,17 @@ var SearchViewPanel = forwardRef(
8956
8818
  const handleBackClick = useCallback(() => {
8957
8819
  onClose();
8958
8820
  }, [onClose]);
8959
- const defaultBackArrow = /* @__PURE__ */ jsx("button", { type: "button", "aria-label": "Back", onClick: handleBackClick, "data-slot": "back-button", children: "\u2190" });
8821
+ const defaultBackButton = /* @__PURE__ */ jsx(
8822
+ "button",
8823
+ {
8824
+ type: "button",
8825
+ "aria-label": "Back",
8826
+ onClick: handleBackClick,
8827
+ "data-slot": "back-button",
8828
+ className: backButtonClassName,
8829
+ children: /* @__PURE__ */ jsx(ArrowBackIcon, {})
8830
+ }
8831
+ );
8960
8832
  const clearButton = state.value ? /* @__PURE__ */ jsx(
8961
8833
  "button",
8962
8834
  {
@@ -8965,66 +8837,109 @@ var SearchViewPanel = forwardRef(
8965
8837
  type: "button",
8966
8838
  "aria-label": "Clear search",
8967
8839
  "data-slot": "clear-button",
8968
- children: "\u2715"
8840
+ className: clearButtonClassName,
8841
+ children: /* @__PURE__ */ jsx(CloseIcon3, {})
8969
8842
  }
8970
8843
  ) : null;
8971
- return /* @__PURE__ */ jsx(FocusScope, { contain: true, restoreFocus: true, autoFocus: true, children: /* @__PURE__ */ jsxs("div", { ...overlayProps, ref, role: "search", "aria-label": ariaLabel, className, children: [
8972
- /* @__PURE__ */ jsxs("div", { "data-slot": "header", children: [
8973
- /* @__PURE__ */ jsx("span", { "data-slot": "leading-icon", children: leadingIcon ?? defaultBackArrow }),
8974
- /* @__PURE__ */ jsx("input", { ...inputProps, ref: inputRef, role: "searchbox" }),
8975
- clearButton,
8976
- trailingActions && trailingActions.length > 0 && /* @__PURE__ */ jsx("span", { "data-slot": "trailing-actions", children: trailingActions.map((action, index) => /* @__PURE__ */ jsx("span", { "data-slot": "trailing-action", children: action }, index)) })
8977
- ] }),
8978
- showDivider && /* @__PURE__ */ jsx("hr", { "data-slot": "divider" }),
8979
- /* @__PURE__ */ jsx("div", { "data-slot": "content", "aria-live": "polite", children })
8980
- ] }) });
8844
+ return (
8845
+ // Focus containment only for fullscreen docked uses restoreFocus + autoFocus only
8846
+ // so tabbing can naturally leave the widget.
8847
+ /* @__PURE__ */ jsx(FocusScope, { contain: isFullscreen, restoreFocus: true, autoFocus: true, children: /* @__PURE__ */ jsxs("div", { ...overlayProps, ref, role: "search", "aria-label": ariaLabel, className, children: [
8848
+ /* @__PURE__ */ jsxs("div", { "data-slot": "header", className: headerClassName, children: [
8849
+ leadingIcon ?? defaultBackButton,
8850
+ /* @__PURE__ */ jsx(
8851
+ "input",
8852
+ {
8853
+ ...inputProps,
8854
+ ref: inputRef,
8855
+ role: "searchbox",
8856
+ "data-slot": "input",
8857
+ className: inputClassName
8858
+ }
8859
+ ),
8860
+ clearButton,
8861
+ trailingActions && trailingActions.length > 0 && /* @__PURE__ */ jsx("span", { "data-slot": "trailing-actions", className: trailingActionsClassName, children: trailingActions })
8862
+ ] }),
8863
+ showDivider && /* @__PURE__ */ jsx("hr", { "data-slot": "divider", className: dividerClassName }),
8864
+ /* @__PURE__ */ jsx("div", { "data-slot": "content", "aria-live": "polite", className: contentClassName, children })
8865
+ ] }) })
8866
+ );
8981
8867
  }
8982
8868
  );
8983
8869
  SearchViewPanel.displayName = "SearchViewPanel";
8984
- var searchBarVariants = cva(
8870
+ var searchBarRootVariants = cva(
8985
8871
  [
8986
- "relative flex items-center h-14 rounded-full bg-surface-container-high",
8987
- "shadow-elevation-3 w-full text-body-large cursor-text"
8872
+ "relative flex items-center h-14 rounded-full",
8873
+ "bg-surface-container-high shadow-elevation-3",
8874
+ "w-full text-body-large cursor-text",
8875
+ // Disabled — self-targeting; pointer-events lets ripple/hover stop cleanly
8876
+ "data-[disabled]:opacity-38 data-[disabled]:pointer-events-none data-[disabled]:cursor-not-allowed"
8988
8877
  ],
8989
8878
  {
8990
8879
  variants: {
8880
+ /**
8881
+ * Visual style of the search bar.
8882
+ * - contained: M3 Expressive — fills container, expressive motion, adjustable spacing
8883
+ * - divided: Baseline — 16dp fixed spacing, no expressive motion
8884
+ */
8991
8885
  style: {
8992
- contained: "",
8886
+ /**
8887
+ * Contained (Expressive): spacing governed by data-[with-actions] content flag.
8888
+ * With actions: px-1 gap-1 (4dp each)
8889
+ * Without actions: px-4 (16dp each)
8890
+ */
8891
+ contained: [
8892
+ "px-4",
8893
+ // default: no-actions 16dp
8894
+ "data-[with-actions]:px-1 data-[with-actions]:gap-1"
8895
+ // with-actions: 4dp
8896
+ ],
8897
+ /**
8898
+ * Divided (Baseline): fixed 16dp side padding, 16dp icon-label gap.
8899
+ */
8993
8900
  divided: "px-4 gap-4"
8994
- },
8995
- noActions: {
8996
- true: "",
8997
- false: ""
8998
- },
8999
- focused: {
9000
- true: "",
9001
- false: ""
9002
- },
9003
- disabled: {
9004
- true: "opacity-38 pointer-events-none",
9005
- false: ""
9006
8901
  }
9007
8902
  },
9008
- compoundVariants: [
9009
- {
9010
- style: "contained",
9011
- noActions: false,
9012
- class: "px-1 gap-1"
9013
- },
9014
- {
9015
- style: "contained",
9016
- noActions: true,
9017
- class: "px-4"
9018
- }
9019
- ],
9020
- defaultVariants: {
9021
- style: "contained",
9022
- noActions: false,
9023
- focused: false,
9024
- disabled: false
9025
- }
8903
+ defaultVariants: { style: "contained" }
9026
8904
  }
9027
8905
  );
8906
+ var searchBarStateLayerVariants = cva([
8907
+ "absolute inset-0 rounded-full pointer-events-none opacity-0",
8908
+ "bg-on-surface",
8909
+ // Effects transition — no overshoot on opacity
8910
+ "transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects",
8911
+ // Hover: 8%
8912
+ "group-data-[hovered]/search:opacity-8",
8913
+ // Pressed: 10%, doubled selector wins over hover at equal cascade position
8914
+ "group-data-[pressed]/search:group-data-[pressed]/search:opacity-10",
8915
+ // No state layer when disabled
8916
+ "group-data-[disabled]/search:hidden"
8917
+ ]);
8918
+ var searchBarFocusRingVariants = cva([
8919
+ "pointer-events-none absolute inset-[-3px] rounded-full",
8920
+ "outline outline-[3px] outline-offset-0 outline-secondary",
8921
+ // Effects transition
8922
+ "transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects",
8923
+ "opacity-0",
8924
+ "group-data-[focus-visible]/search:opacity-100"
8925
+ ]);
8926
+ var searchBarLeadingIconVariants = cva([
8927
+ "flex size-12 shrink-0 items-center justify-center text-on-surface"
8928
+ ]);
8929
+ var searchBarTrailingActionVariants = cva([
8930
+ "flex size-12 shrink-0 items-center justify-center text-on-surface-variant"
8931
+ ]);
8932
+ var searchBarAvatarVariants = cva(["flex size-12 shrink-0 items-center justify-center"]);
8933
+ var searchBarTrailingActionsVariants = cva(["flex items-center"]);
8934
+ var searchBarInputVariants = cva([
8935
+ "flex-1 min-w-0 bg-transparent outline-none",
8936
+ "text-body-large text-on-surface",
8937
+ "placeholder:text-on-surface-variant",
8938
+ "focus-visible:outline-none",
8939
+ // Hide native browser search affordances — our MD3 clear button handles clearing
8940
+ "[&::-webkit-search-cancel-button]:appearance-none",
8941
+ "[&::-webkit-search-decoration]:appearance-none"
8942
+ ]);
9028
8943
  var searchViewVariants = cva(["flex flex-col shadow-elevation-3 z-50 overflow-hidden"], {
9029
8944
  variants: {
9030
8945
  style: {
@@ -9037,31 +8952,32 @@ var searchViewVariants = cva(["flex flex-col shadow-elevation-3 z-50 overflow-hi
9037
8952
  }
9038
8953
  },
9039
8954
  compoundVariants: [
8955
+ // Contained + fullscreen: surface-container-low, square corners
9040
8956
  {
9041
8957
  style: "contained",
9042
8958
  layout: "fullscreen",
9043
8959
  class: "bg-surface-container-low rounded-none"
9044
8960
  },
8961
+ // Contained + docked: surface-container-high, 12dp results rounding, 2dp gap
9045
8962
  {
9046
8963
  style: "contained",
9047
8964
  layout: "docked",
9048
8965
  class: "bg-surface-container-high rounded-xl gap-0.5"
9049
8966
  },
8967
+ // Divided + fullscreen: surface-container-high, square corners
9050
8968
  {
9051
8969
  style: "divided",
9052
8970
  layout: "fullscreen",
9053
8971
  class: "bg-surface-container-high rounded-none"
9054
8972
  },
8973
+ // Divided + docked: surface-container-high, extra-large rounding (28dp)
9055
8974
  {
9056
8975
  style: "divided",
9057
8976
  layout: "docked",
9058
8977
  class: "bg-surface-container-high rounded-[28px]"
9059
8978
  }
9060
8979
  ],
9061
- defaultVariants: {
9062
- style: "contained",
9063
- layout: "fullscreen"
9064
- }
8980
+ defaultVariants: { style: "contained", layout: "fullscreen" }
9065
8981
  });
9066
8982
  var searchViewHeaderVariants = cva(
9067
8983
  ["flex items-center w-full bg-surface-container-high gap-1"],
@@ -9072,14 +8988,50 @@ var searchViewHeaderVariants = cva(
9072
8988
  divided: "h-[72px] px-4"
9073
8989
  },
9074
8990
  layout: {
8991
+ // Docked overrides height to 56dp regardless of style
9075
8992
  docked: "h-14",
9076
8993
  fullscreen: ""
9077
8994
  }
9078
8995
  },
9079
- defaultVariants: {
9080
- style: "contained",
9081
- layout: "fullscreen"
9082
- }
8996
+ defaultVariants: { style: "contained", layout: "fullscreen" }
8997
+ }
8998
+ );
8999
+ var searchViewBackButtonVariants = cva([
9000
+ "flex size-12 shrink-0 items-center justify-center",
9001
+ "text-on-surface rounded-full",
9002
+ "cursor-pointer"
9003
+ ]);
9004
+ var searchViewClearButtonVariants = cva([
9005
+ "flex size-12 shrink-0 items-center justify-center",
9006
+ "text-on-surface-variant rounded-full",
9007
+ "cursor-pointer",
9008
+ "transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects"
9009
+ ]);
9010
+ var searchViewTrailingActionVariants = cva([
9011
+ "flex size-12 shrink-0 items-center justify-center text-on-surface-variant"
9012
+ ]);
9013
+ var searchViewTrailingActionsVariants = cva(["flex items-center"]);
9014
+ var searchViewInputVariants = cva([
9015
+ "flex-1 min-w-0 bg-transparent outline-none",
9016
+ "text-body-large text-on-surface",
9017
+ "placeholder:text-on-surface-variant",
9018
+ "focus-visible:outline-none",
9019
+ // Hide native browser search affordances
9020
+ "[&::-webkit-search-cancel-button]:appearance-none",
9021
+ "[&::-webkit-search-decoration]:appearance-none"
9022
+ ]);
9023
+ var searchViewDividerVariants = cva(["border-t border-outline w-full"]);
9024
+ var searchViewContentVariants = cva(["flex-1 overflow-y-auto"]);
9025
+ var DefaultSearchIcon = () => /* @__PURE__ */ jsx(
9026
+ "svg",
9027
+ {
9028
+ width: "24",
9029
+ height: "24",
9030
+ viewBox: "0 0 24 24",
9031
+ fill: "currentColor",
9032
+ "aria-hidden": "true",
9033
+ focusable: "false",
9034
+ children: /* @__PURE__ */ 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" })
9083
9035
  }
9084
9036
  );
9085
9037
  var SearchBar = forwardRef(
@@ -9100,7 +9052,7 @@ var SearchBar = forwardRef(
9100
9052
  onFocus,
9101
9053
  onBlur
9102
9054
  }, ref) => {
9103
- const hasNoActions = (!trailingActions || trailingActions.length === 0) && !avatar;
9055
+ const hasActions = trailingActions != null && trailingActions.length > 0 || !!avatar;
9104
9056
  const reducedMotion = useReducedMotion();
9105
9057
  const [isFocused, setIsFocused] = useState(false);
9106
9058
  const handleFocusInternal = useCallback(() => {
@@ -9111,83 +9063,85 @@ var SearchBar = forwardRef(
9111
9063
  setIsFocused(false);
9112
9064
  onBlur?.();
9113
9065
  }, [onBlur]);
9114
- const { onMouseDown: handleRipple, ripples } = useRipple({
9115
- disabled: isDisabled
9116
- });
9117
- const styledLeadingIcon = leadingIcon ? /* @__PURE__ */ jsx("span", { className: "text-on-surface flex size-12 shrink-0 items-center justify-center", children: /* @__PURE__ */ jsx("span", { className: "size-6", children: leadingIcon }) }) : void 0;
9118
- const styledTrailingActions = trailingActions?.map((action, index) => /* @__PURE__ */ jsx(
9119
- "span",
9120
- {
9121
- className: "text-on-surface-variant flex size-12 shrink-0 items-center justify-center",
9122
- children: action
9066
+ const { isHovered, hoverProps } = useHover({ isDisabled });
9067
+ const { isFocusVisible, focusProps } = useFocusRing({ within: true });
9068
+ const [isPressed, setIsPressed] = useState(false);
9069
+ const { onMouseDown: handleRipple, ripples } = useRipple({ disabled: isDisabled });
9070
+ const handleMouseDown = useCallback(
9071
+ (e) => {
9072
+ setIsPressed(true);
9073
+ handleRipple(e);
9123
9074
  },
9124
- index
9125
- ));
9126
- const styledAvatar = avatar ? /* @__PURE__ */ jsx("span", { className: "flex size-12 shrink-0 items-center justify-center", children: /* @__PURE__ */ jsx("span", { className: "size-[30px] overflow-hidden rounded-full", children: avatar }) }) : void 0;
9075
+ [handleRipple]
9076
+ );
9077
+ const handleMouseUp = useCallback(() => setIsPressed(false), []);
9078
+ const styledLeadingIcon = /* @__PURE__ */ jsx("span", { className: cn(searchBarLeadingIconVariants()), children: /* @__PURE__ */ jsx("span", { className: "size-6", children: leadingIcon ?? /* @__PURE__ */ jsx(DefaultSearchIcon, {}) }) });
9079
+ const styledTrailingActions = trailingActions?.map((action, index) => /* @__PURE__ */ jsx("span", { className: cn(searchBarTrailingActionVariants()), children: action }, index));
9080
+ const styledAvatar = avatar ? /* @__PURE__ */ jsx("span", { className: cn(searchBarAvatarVariants()), children: /* @__PURE__ */ jsx("span", { className: "size-[30px] overflow-hidden rounded-full", children: avatar }) }) : void 0;
9081
+ const paneMarginClass = searchStyle === "contained" ? isFocused ? "mx-3" : "mx-6" : "";
9082
+ const paneTransitionClass = searchStyle === "contained" && !reducedMotion ? "transition-[margin] duration-expressive-fast-spatial ease-expressive-fast-spatial" : "";
9127
9083
  return /* @__PURE__ */ jsx(
9128
9084
  "div",
9129
9085
  {
9130
- className: cn(
9131
- reducedMotion ? "" : "duration-short4 ease-standard transition-[margin]",
9132
- isFocused ? "mx-3" : "mx-6"
9133
- ),
9134
- children: /* @__PURE__ */ jsxs(
9135
- "div",
9136
- {
9137
- role: "presentation",
9138
- className: cn(
9139
- "group relative overflow-hidden rounded-full",
9140
- "has-[:focus-visible]:ring-secondary has-[:focus-visible]:ring-3",
9141
- searchBarVariants({
9142
- style: searchStyle,
9143
- noActions: hasNoActions,
9144
- disabled: isDisabled
9086
+ role: "presentation",
9087
+ ...mergeProps$1(hoverProps, focusProps),
9088
+ className: cn(paneTransitionClass, paneMarginClass),
9089
+ onMouseUp: handleMouseUp,
9090
+ children: /* @__PURE__ */ jsxs("div", { role: "presentation", className: "relative", children: [
9091
+ /* @__PURE__ */ jsx("span", { className: cn(searchBarFocusRingVariants()), "aria-hidden": "true" }),
9092
+ /* @__PURE__ */ jsxs(
9093
+ "div",
9094
+ {
9095
+ role: "presentation",
9096
+ ...getInteractionDataAttributes({
9097
+ isHovered,
9098
+ isFocusVisible,
9099
+ isPressed,
9100
+ isDisabled
9145
9101
  }),
9146
- className
9147
- ),
9148
- onMouseDown: handleRipple,
9149
- children: [
9150
- /* @__PURE__ */ jsx(
9151
- "span",
9152
- {
9153
- "data-slot": "state-layer",
9154
- className: cn(
9155
- "bg-on-surface pointer-events-none absolute inset-0 rounded-full opacity-0",
9156
- "group-hover:opacity-8 group-active:opacity-10",
9157
- "duration-spring-standard-fast-effects ease-spring-standard-fast-effects transition-opacity"
9158
- )
9159
- }
9160
- ),
9161
- /* @__PURE__ */ jsx(
9162
- SearchBarHeadless,
9163
- {
9164
- ref,
9165
- ...value !== void 0 ? { value } : {},
9166
- ...defaultValue !== void 0 ? { defaultValue } : {},
9167
- ...onChange !== void 0 ? { onChange } : {},
9168
- ...onSubmit !== void 0 ? { onSubmit } : {},
9169
- ...onClear !== void 0 ? { onClear } : {},
9170
- ...placeholder !== void 0 ? { placeholder } : {},
9171
- ...styledLeadingIcon !== void 0 ? { leadingIcon: styledLeadingIcon } : {},
9172
- ...styledTrailingActions !== void 0 ? { trailingActions: styledTrailingActions } : {},
9173
- ...styledAvatar !== void 0 ? { avatar: styledAvatar } : {},
9174
- ...isDisabled !== void 0 ? { isDisabled } : {},
9175
- ...ariaLabel !== void 0 ? { "aria-label": ariaLabel } : {},
9176
- onFocus: handleFocusInternal,
9177
- onBlur: handleBlurInternal,
9178
- className: cn(
9179
- "relative z-0 flex h-full w-full items-center",
9180
- "[&_input]:flex-1 [&_input]:bg-transparent [&_input]:outline-none",
9181
- "[&_input]:text-body-large [&_input]:text-on-surface",
9182
- "[&_input]:placeholder:text-on-surface-variant",
9183
- "[&_input]:focus-visible:outline-none"
9184
- )
9185
- }
9102
+ "data-with-actions": hasActions ? "" : void 0,
9103
+ className: cn(
9104
+ "group/search overflow-hidden",
9105
+ searchBarRootVariants({ style: searchStyle }),
9106
+ className
9186
9107
  ),
9187
- ripples
9188
- ]
9189
- }
9190
- )
9108
+ onMouseDown: (e) => handleMouseDown(e),
9109
+ children: [
9110
+ /* @__PURE__ */ jsx(
9111
+ "span",
9112
+ {
9113
+ "data-slot": "state-layer",
9114
+ className: cn(searchBarStateLayerVariants()),
9115
+ "aria-hidden": "true"
9116
+ }
9117
+ ),
9118
+ ripples,
9119
+ /* @__PURE__ */ jsx(
9120
+ SearchBarHeadless,
9121
+ {
9122
+ ref,
9123
+ ...value !== void 0 ? { value } : {},
9124
+ ...defaultValue !== void 0 ? { defaultValue } : {},
9125
+ ...onChange !== void 0 ? { onChange } : {},
9126
+ ...onSubmit !== void 0 ? { onSubmit } : {},
9127
+ ...onClear !== void 0 ? { onClear } : {},
9128
+ ...placeholder !== void 0 ? { placeholder } : {},
9129
+ leadingIcon: styledLeadingIcon,
9130
+ ...styledTrailingActions !== void 0 ? { trailingActions: styledTrailingActions } : {},
9131
+ ...styledAvatar !== void 0 ? { avatar: styledAvatar } : {},
9132
+ isDisabled,
9133
+ ...ariaLabel !== void 0 ? { "aria-label": ariaLabel } : {},
9134
+ onFocus: handleFocusInternal,
9135
+ onBlur: handleBlurInternal,
9136
+ className: "relative z-0 flex h-full w-full items-center",
9137
+ inputClassName: cn(searchBarInputVariants()),
9138
+ trailingActionsClassName: cn(searchBarTrailingActionsVariants())
9139
+ }
9140
+ )
9141
+ ]
9142
+ }
9143
+ )
9144
+ ] })
9191
9145
  }
9192
9146
  );
9193
9147
  }
@@ -9212,21 +9166,29 @@ var SearchView = forwardRef(
9212
9166
  showDivider
9213
9167
  }, ref) => {
9214
9168
  const resolvedShowDivider = showDivider ?? searchStyle === "divided";
9169
+ const enterMotionClass = layout === "docked" ? "animate-md-scale-in" : "animate-md-fade-in";
9170
+ const containerClass = cn(
9171
+ searchViewVariants({ style: searchStyle, layout }),
9172
+ enterMotionClass,
9173
+ className
9174
+ );
9175
+ const headerClass = cn(searchViewHeaderVariants({ style: searchStyle, layout }));
9176
+ const backButtonClass = cn(searchViewBackButtonVariants());
9177
+ const clearButtonClass = cn(searchViewClearButtonVariants());
9178
+ const trailingActionClass = cn(searchViewTrailingActionVariants());
9179
+ const trailingActionsGroupClass = cn(searchViewTrailingActionsVariants());
9180
+ const inputClass = cn(searchViewInputVariants());
9181
+ const dividerClass = cn(searchViewDividerVariants());
9182
+ const contentClass = cn(searchViewContentVariants());
9215
9183
  const styledLeadingIcon = leadingIcon ? /* @__PURE__ */ jsx("span", { className: "text-on-surface flex size-12 shrink-0 items-center justify-center", children: leadingIcon }) : void 0;
9216
- const styledTrailingActions = trailingActions?.map((action, index) => /* @__PURE__ */ jsx(
9217
- "span",
9218
- {
9219
- className: "text-on-surface-variant flex size-12 shrink-0 items-center justify-center",
9220
- children: action
9221
- },
9222
- index
9223
- ));
9184
+ const styledTrailingActions = trailingActions?.map((action, index) => /* @__PURE__ */ jsx("span", { className: trailingActionClass, children: action }, index));
9224
9185
  return /* @__PURE__ */ jsx(
9225
9186
  SearchViewHeadless,
9226
9187
  {
9227
9188
  ref,
9228
9189
  isOpen,
9229
9190
  onClose,
9191
+ layout,
9230
9192
  ...value !== void 0 ? { value } : {},
9231
9193
  ...defaultValue !== void 0 ? { defaultValue } : {},
9232
9194
  ...onChange !== void 0 ? { onChange } : {},
@@ -9236,53 +9198,20 @@ var SearchView = forwardRef(
9236
9198
  ...styledLeadingIcon !== void 0 ? { leadingIcon: styledLeadingIcon } : {},
9237
9199
  ...styledTrailingActions !== void 0 ? { trailingActions: styledTrailingActions } : {},
9238
9200
  showDivider: resolvedShowDivider,
9239
- className: cn(
9240
- searchViewVariants({ style: searchStyle, layout }),
9241
- "animate-md-scale-in",
9242
- getHeaderClasses(searchStyle, layout),
9243
- slotClasses,
9244
- className
9245
- ),
9201
+ className: containerClass,
9202
+ headerClassName: headerClass,
9203
+ backButtonClassName: backButtonClass,
9204
+ clearButtonClassName: clearButtonClass,
9205
+ inputClassName: inputClass,
9206
+ trailingActionsClassName: trailingActionsGroupClass,
9207
+ dividerClassName: dividerClass,
9208
+ contentClassName: contentClass,
9246
9209
  children
9247
9210
  }
9248
9211
  );
9249
9212
  }
9250
9213
  );
9251
9214
  SearchView.displayName = "SearchView";
9252
- var slotClasses = cn(
9253
- // Input styling
9254
- "[&_input]:flex-1 [&_input]:bg-transparent [&_input]:outline-none",
9255
- "[&_input]:text-body-large [&_input]:text-on-surface",
9256
- "[&_input]:placeholder:text-on-surface-variant",
9257
- // Divider
9258
- "[&>[data-slot=divider]]:border-outline",
9259
- // Content area
9260
- "[&>[data-slot=content]]:flex-1 [&>[data-slot=content]]:overflow-y-auto",
9261
- // Clear button
9262
- "[&_[data-slot=clear-button]]:size-12 [&_[data-slot=clear-button]]:flex",
9263
- "[&_[data-slot=clear-button]]:items-center [&_[data-slot=clear-button]]:justify-center",
9264
- "[&_[data-slot=clear-button]]:text-on-surface-variant",
9265
- "[&_[data-slot=clear-button]]:transition-opacity [&_[data-slot=clear-button]]:duration-short4",
9266
- "[&_[data-slot=clear-button]]:ease-standard",
9267
- // Back button
9268
- "[&_[data-slot=back-button]]:size-12 [&_[data-slot=back-button]]:flex",
9269
- "[&_[data-slot=back-button]]:items-center [&_[data-slot=back-button]]:justify-center",
9270
- "[&_[data-slot=back-button]]:text-on-surface"
9271
- );
9272
- function getHeaderClasses(style, layout) {
9273
- 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";
9274
- if (layout === "docked") {
9275
- return cn(
9276
- base,
9277
- "[&>[data-slot=header]]:h-14",
9278
- style === "contained" ? "[&>[data-slot=header]]:px-3" : "[&>[data-slot=header]]:px-4"
9279
- );
9280
- }
9281
- if (style === "contained") {
9282
- return cn(base, "[&>[data-slot=header]]:h-14 [&>[data-slot=header]]:px-3");
9283
- }
9284
- return cn(base, "[&>[data-slot=header]]:h-[72px] [&>[data-slot=header]]:px-4");
9285
- }
9286
9215
  var Search = forwardRef(
9287
9216
  ({
9288
9217
  isOpen: controlledIsOpen,
@@ -16106,6 +16035,6 @@ var DateField = forwardRef((props, forwardedRef) => {
16106
16035
  });
16107
16036
  DateField.displayName = "DateField";
16108
16037
 
16109
- export { AppBar, AppBarHeadless, Badge, BadgeContent, BadgeHeadless, BottomSheet, BottomSheetContext, BottomSheetHandle, BottomSheetHeadless, Button, ButtonGroup, ButtonGroupContext, ButtonGroupHeadless, CalendarCore, Card, CardActions, CardContent, CardHeader, CardHeadless, CardMedia, Checkbox, Chip, ChipHeadless, ChipSet, DateField, DatePicker, DatePickerDocked, DatePickerModal, DatePickerModalInput, Dialog, DialogActions, DialogContent, DialogContext, DialogHeadless, DialogHeadline, Divider, DividerHeadless, Drawer, DrawerIconOnlyContext, DrawerItem, DrawerSection, FAB, FABHeadless, FABMenu, FABMenuContext, FABMenuHeadless, FABMenuItem, HeadlessDrawer, HeadlessDrawerItem, HeadlessMenu, HeadlessMenuDivider, HeadlessMenuItem, HeadlessMenuSection, HeadlessMenuTrigger, HeadlessNavigationBar, HeadlessNavigationBarItem, HeadlessTab, HeadlessTabList, HeadlessTabPanel, IconButton, IconButtonHeadless, List, ListHeadless, ListItem, ListItemHeadless, ListItemLeading, ListItemText, ListItemTrailing, Menu, MenuContext, MenuDivider, MenuItem, MenuSection, MenuTrigger, NavigationBar, NavigationBarItem, Progress, ProgressHeadless, Radio, RadioGroup, RadioGroupHeadless, RadioHeadless, RichTooltip, STATE_LAYER_OPACITY, Search, SearchBar, SearchBarHeadless, SearchView, SearchViewHeadless, Slider, SliderHeadless, Snackbar, SnackbarContext, SnackbarHeadless, SnackbarProvider, SplitButton, SplitButtonHeadless, StyledActionButton, StyledCalendarCell, StyledCalendarTitle, StyledNavButton, StyledWeekday, StyledYearItem, Switch, TYPOGRAPHY_ELEMENT_MAP, TYPOGRAPHY_USAGE, Tab, TabList, TabPanel, Tabs, TextField, TimePicker, TimePickerDial, TimePickerInput, Tooltip, TooltipOverlayHeadless, TooltipTrigger, TooltipTriggerHeadless, actionButtonFocusRingVariants, actionButtonStateLayerVariants, actionButtonVariants, actionRowVariants, applyStateLayer, badgeVariants2 as badgeVariants, bottomSheetAnimationVariants, bottomSheetHandlePillVariants, bottomSheetHandleWrapperVariants, bottomSheetScrimVariants, bottomSheetVariants, buttonGroupFocusRingVariants, buttonGroupRootVariants, buttonGroupVariants, calendarCellFocusRingVariants, calendarCellStateLayerVariants, calendarCellVariants, calendarDividerVariants, calendarHeaderVariants, calendarTitleIconVariants, calendarTitleStateLayerVariants, calendarTitleTextVariants, calendarTitleVariants, cardVariants, chipVariants, clockDialContainerVariants, clockDialNumberVariants, clockHandCenterVariants, clockHandHandleVariants, clockHandTrackVariants, cn, dateFieldVariants, dateInputErrorVariants, dateInputFieldGroupVariants, dateInputFieldVariants, dateInputLabelVariants, datePickerContainerVariants, dateSegmentPlaceholderVariants, dividerVariants, dockedFieldGroupVariants, dockedLabelVariants, dockedTriggerStateLayerVariants, dockedTriggerVariants, fabMenuItemFocusRingVariants, fabMenuItemIconVariants, fabMenuItemLabelVariants, fabMenuItemStateLayerVariants, fabMenuItemVariants, fabMenuListVariants, fabMenuVariants, generateMD3Theme, getColorValue, getConnectedRadiusClasses, getFontFamily, getMD3Color, getResponsiveTypography, getTypographyClassName, getTypographyForElement, getTypographyStyle, getTypographyToken, headlineVariants, hexToRgb, listItemVariants, listVariants, modalDialogVariants, modalHeaderVariants, modeToggleStateLayerVariants, modeToggleVariants, navButtonFocusRingVariants, navButtonStateLayerVariants, navButtonVariants, periodSelectorContainerVariants, periodSelectorItemVariants, popoverVariants, pxToRem, remToPx, rgbToHex, richTooltipVariants, scrimVariants2 as scrimVariants, searchBarVariants, searchViewHeaderVariants, searchViewVariants, sliderActiveTrackVariants, sliderContainerVariants, sliderHandleStateLayerVariants, sliderHandleVariants, sliderInactiveTrackVariants, sliderTrackLayoutVariants, splitButtonContainerVariants, splitButtonDropdownVariants, splitButtonPrimaryVariants, splitButtonVariants, supportingTextVariants, timeInputFieldVariants, timePickerActionButtonVariants, timePickerActionRowVariants, timePickerContainerVariants, timePickerHeadlineVariants, timePickerModeToggleVariants, timeSelectorContainerVariants, timeSeparatorVariants, tooltipVariants, truncateText, useBottomSheetContext, useBottomSheetDrag, useButtonGroup, useDialogContext, useFABMenuContext, useMenuContext, useOptionalButtonGroup, useSnackbar, weekdayVariants, withOpacity, yearGridVariants, yearItemFocusRingVariants, yearItemStateLayerVariants, yearItemVariants };
16038
+ export { AppBar, AppBarHeadless, Badge, BadgeContent, BadgeHeadless, BottomSheet, BottomSheetContext, BottomSheetHandle, BottomSheetHeadless, Button, ButtonGroup, ButtonGroupContext, ButtonGroupHeadless, CalendarCore, Card, CardActions, CardContent, CardHeader, CardHeadless, CardMedia, Checkbox, Chip, ChipHeadless, ChipSet, DateField, DatePicker, DatePickerDocked, DatePickerModal, DatePickerModalInput, Dialog, DialogActions, DialogContent, DialogContext, DialogHeadless, DialogHeadline, Divider, DividerHeadless, Drawer, DrawerIconOnlyContext, DrawerItem, DrawerSection, FAB, FABHeadless, FABMenu, FABMenuContext, FABMenuHeadless, FABMenuItem, HeadlessDrawer, HeadlessDrawerItem, HeadlessMenu, HeadlessMenuDivider, HeadlessMenuItem, HeadlessMenuSection, HeadlessMenuTrigger, HeadlessNavigationBar, HeadlessNavigationBarItem, HeadlessTab, HeadlessTabList, HeadlessTabPanel, IconButton, IconButtonHeadless, List, ListHeadless, ListItem, ListItemHeadless, ListItemLeading, ListItemText, ListItemTrailing, Menu, MenuContext, MenuDivider, MenuItem, MenuSection, MenuTrigger, NavigationBar, NavigationBarItem, Progress, ProgressHeadless, Radio, RadioGroup, RadioGroupHeadless, RadioHeadless, RichTooltip, STATE_LAYER_OPACITY, Search, SearchBar, SearchBarHeadless, SearchView, SearchViewHeadless, Slider, SliderHeadless, Snackbar, SnackbarContext, SnackbarHeadless, SnackbarProvider, SplitButton, SplitButtonHeadless, StyledActionButton, StyledCalendarCell, StyledCalendarTitle, StyledNavButton, StyledWeekday, StyledYearItem, Switch, TYPOGRAPHY_ELEMENT_MAP, TYPOGRAPHY_USAGE, Tab, TabList, TabPanel, Tabs, TextField, TimePicker, TimePickerDial, TimePickerInput, Tooltip, TooltipOverlayHeadless, TooltipTrigger, TooltipTriggerHeadless, actionButtonFocusRingVariants, actionButtonStateLayerVariants, actionButtonVariants, actionRowVariants, applyStateLayer, badgeVariants2 as badgeVariants, bottomSheetAnimationVariants, bottomSheetHandlePillVariants, bottomSheetHandleWrapperVariants, bottomSheetScrimVariants, bottomSheetVariants, buttonGroupFocusRingVariants, buttonGroupRootVariants, buttonGroupVariants, calendarCellFocusRingVariants, calendarCellStateLayerVariants, calendarCellVariants, calendarDividerVariants, calendarHeaderVariants, calendarTitleIconVariants, calendarTitleStateLayerVariants, calendarTitleTextVariants, calendarTitleVariants, cardVariants, chipVariants, clockDialContainerVariants, clockDialNumberVariants, clockHandCenterVariants, clockHandHandleVariants, clockHandTrackVariants, cn, dateFieldVariants, dateInputErrorVariants, dateInputFieldGroupVariants, dateInputFieldVariants, dateInputLabelVariants, datePickerContainerVariants, dateSegmentPlaceholderVariants, dividerVariants, dockedFieldGroupVariants, dockedLabelVariants, dockedTriggerStateLayerVariants, dockedTriggerVariants, fabMenuItemFocusRingVariants, fabMenuItemIconVariants, fabMenuItemLabelVariants, fabMenuItemStateLayerVariants, fabMenuItemVariants, fabMenuListVariants, fabMenuVariants, generateMD3Theme, getColorValue, getConnectedRadiusClasses, getFontFamily, getMD3Color, getResponsiveTypography, getTypographyClassName, getTypographyForElement, getTypographyStyle, getTypographyToken, headlineVariants, hexToRgb, listItemVariants, listVariants, modalDialogVariants, modalHeaderVariants, modeToggleStateLayerVariants, modeToggleVariants, navButtonFocusRingVariants, navButtonStateLayerVariants, navButtonVariants, periodSelectorContainerVariants, periodSelectorItemVariants, popoverVariants, pxToRem, remToPx, rgbToHex, richTooltipVariants, scrimVariants2 as scrimVariants, searchBarAvatarVariants, searchBarFocusRingVariants, searchBarInputVariants, searchBarLeadingIconVariants, searchBarRootVariants, searchBarStateLayerVariants, searchBarTrailingActionVariants, searchBarTrailingActionsVariants, searchViewBackButtonVariants, searchViewClearButtonVariants, searchViewContentVariants, searchViewDividerVariants, searchViewHeaderVariants, searchViewInputVariants, searchViewTrailingActionVariants, searchViewTrailingActionsVariants, searchViewVariants, sliderActiveTrackVariants, sliderContainerVariants, sliderHandleStateLayerVariants, sliderHandleVariants, sliderInactiveTrackVariants, sliderTrackLayoutVariants, splitButtonContainerVariants, splitButtonDropdownVariants, splitButtonPrimaryVariants, splitButtonVariants, supportingTextVariants, timeInputFieldVariants, timePickerActionButtonVariants, timePickerActionRowVariants, timePickerContainerVariants, timePickerHeadlineVariants, timePickerModeToggleVariants, timeSelectorContainerVariants, timeSeparatorVariants, tooltipVariants, truncateText, useBottomSheetContext, useBottomSheetDrag, useButtonGroup, useDialogContext, useFABMenuContext, useMenuContext, useOptionalButtonGroup, useSnackbar, weekdayVariants, withOpacity, yearGridVariants, yearItemFocusRingVariants, yearItemStateLayerVariants, yearItemVariants };
16110
16039
  //# sourceMappingURL=index.js.map
16111
16040
  //# sourceMappingURL=index.js.map