@viraui/react 0.0.22 → 0.0.23

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.
Files changed (165) hide show
  1. package/dist/catalog.json +20 -2
  2. package/dist/components/avatar/avatar.css +1 -1
  3. package/dist/components/avatar/avatar.module.js +3 -3
  4. package/dist/components/avatar-group/avatar-group.css +1 -1
  5. package/dist/components/avatar-group/avatar-group.module.js +5 -5
  6. package/dist/components/basic-input/basic-input.css +1 -1
  7. package/dist/components/basic-input/basic-input.js +0 -1
  8. package/dist/components/basic-input/basic-input.module.js +1 -1
  9. package/dist/components/basic-input/field-helper-copy.d.ts +1 -1
  10. package/dist/components/basic-input/field-helper-copy.js +0 -1
  11. package/dist/components/basic-input/field-label.css +1 -1
  12. package/dist/components/basic-input/field-label.js +0 -1
  13. package/dist/components/basic-input/field-label.module.js +1 -1
  14. package/dist/components/basic-input/input-control-group.js +0 -1
  15. package/dist/components/button/button.css +1 -1
  16. package/dist/components/button/button.d.ts +13 -7
  17. package/dist/components/button/button.guide.json +7 -5
  18. package/dist/components/button/button.js +11 -10
  19. package/dist/components/button/button.module.js +3 -3
  20. package/dist/components/checkbox/checkbox-group.d.ts +12 -0
  21. package/dist/components/checkbox/checkbox-group.js +15 -0
  22. package/dist/components/checkbox/checkbox.css +1 -1
  23. package/dist/components/checkbox/checkbox.d.ts +6 -21
  24. package/dist/components/checkbox/checkbox.guide.json +10 -5
  25. package/dist/components/checkbox/checkbox.js +45 -59
  26. package/dist/components/checkbox/checkbox.module.js +7 -6
  27. package/dist/components/checkbox/index.d.ts +2 -0
  28. package/dist/components/chip/chip.css +1 -1
  29. package/dist/components/chip/chip.js +0 -2
  30. package/dist/components/chip/chip.module.js +4 -4
  31. package/dist/components/clamp-text/clamp-text.css +1 -1
  32. package/dist/components/clamp-text/clamp-text.module.js +1 -1
  33. package/dist/components/dialog/dialog-close.d.ts +15 -0
  34. package/dist/components/dialog/dialog-close.js +9 -0
  35. package/dist/components/dialog/dialog-sheet.d.ts +66 -0
  36. package/dist/components/dialog/dialog-sheet.js +80 -0
  37. package/dist/components/dialog/dialog-trigger.d.ts +13 -0
  38. package/dist/components/dialog/dialog-trigger.js +9 -0
  39. package/dist/components/dialog/dialog.css +1 -0
  40. package/dist/components/dialog/dialog.d.ts +21 -0
  41. package/dist/components/dialog/dialog.guide.json +26 -0
  42. package/dist/components/dialog/dialog.js +18 -0
  43. package/dist/components/dialog/dialog.module.js +13 -0
  44. package/dist/components/dialog/index.d.ts +8 -0
  45. package/dist/components/elevator/elevator.js +4 -4
  46. package/dist/components/fieldset/fieldset.d.ts +35 -0
  47. package/dist/components/fieldset/fieldset.guide.json +28 -0
  48. package/dist/components/fieldset/fieldset.js +30 -0
  49. package/dist/components/fieldset/index.d.ts +2 -0
  50. package/dist/components/icon/icon.css +1 -1
  51. package/dist/components/icon/icon.module.js +1 -1
  52. package/dist/components/icon-button/icon-button.d.ts +1 -1
  53. package/dist/components/icon-button/icon-button.guide.json +1 -1
  54. package/dist/components/icon-button/icon-button.js +1 -1
  55. package/dist/components/index.d.ts +3 -0
  56. package/dist/components/linear-progress/linear-progress.css +1 -1
  57. package/dist/components/linear-progress/linear-progress.js +0 -1
  58. package/dist/components/linear-progress/linear-progress.module.js +4 -4
  59. package/dist/components/masonry/masonry-item.js +0 -1
  60. package/dist/components/masonry/masonry.css +1 -1
  61. package/dist/components/masonry/masonry.js +2 -3
  62. package/dist/components/masonry/masonry.module.js +2 -2
  63. package/dist/components/progressive-blur/progressive-blur.css +1 -1
  64. package/dist/components/progressive-blur/progressive-blur.module.js +2 -2
  65. package/dist/components/radio/radio-group.d.ts +5 -38
  66. package/dist/components/radio/radio-group.js +12 -50
  67. package/dist/components/radio/radio.css +1 -1
  68. package/dist/components/radio/radio.d.ts +1 -1
  69. package/dist/components/radio/radio.guide.json +12 -8
  70. package/dist/components/radio/radio.js +31 -29
  71. package/dist/components/radio/radio.module.js +3 -5
  72. package/dist/components/select/select-group.js +1 -1
  73. package/dist/components/select/select-indicator-slot.js +0 -1
  74. package/dist/components/select/select-option.d.ts +9 -2
  75. package/dist/components/select/select-option.js +32 -31
  76. package/dist/components/select/select-separator.js +0 -1
  77. package/dist/components/select/select.css +1 -1
  78. package/dist/components/select/select.guide.json +8 -3
  79. package/dist/components/select/select.js +3 -2
  80. package/dist/components/select/select.module.js +17 -16
  81. package/dist/components/skeleton/skeleton.css +1 -1
  82. package/dist/components/skeleton/skeleton.module.js +2 -2
  83. package/dist/components/slider/slider-control.js +0 -1
  84. package/dist/components/slider/slider.css +1 -1
  85. package/dist/components/slider/slider.js +1 -3
  86. package/dist/components/slider/slider.module.js +9 -8
  87. package/dist/components/spinner/spinner.css +1 -1
  88. package/dist/components/spinner/spinner.js +2 -2
  89. package/dist/components/spinner/spinner.module.js +3 -3
  90. package/dist/components/stack/stack.css +1 -1
  91. package/dist/components/stack/stack.d.ts +2 -2
  92. package/dist/components/stack/stack.js +0 -1
  93. package/dist/components/stack/stack.module.js +1 -1
  94. package/dist/components/static-noise/static-noise.css +1 -1
  95. package/dist/components/static-noise/static-noise.d.ts +1 -1
  96. package/dist/components/static-noise/static-noise.js +2 -1
  97. package/dist/components/static-noise/static-noise.module.js +2 -2
  98. package/dist/components/surface/surface-radius-context.d.ts +9 -1
  99. package/dist/components/surface/surface-radius-context.js +17 -6
  100. package/dist/components/surface/surface.css +1 -1
  101. package/dist/components/surface/surface.d.ts +9 -3
  102. package/dist/components/surface/surface.guide.json +3 -1
  103. package/dist/components/surface/surface.js +3 -3
  104. package/dist/components/surface/surface.module.js +1 -4
  105. package/dist/components/switch/switch.css +1 -1
  106. package/dist/components/switch/switch.js +31 -29
  107. package/dist/components/switch/switch.module.js +4 -3
  108. package/dist/components/tabs/index.d.ts +6 -0
  109. package/dist/components/tabs/tabs-indicator.d.ts +9 -0
  110. package/dist/components/tabs/tabs-indicator.js +16 -0
  111. package/dist/components/tabs/tabs-list.d.ts +12 -0
  112. package/dist/components/tabs/tabs-list.js +29 -0
  113. package/dist/components/tabs/tabs-panel.d.ts +11 -0
  114. package/dist/components/tabs/tabs-panel.js +13 -0
  115. package/dist/components/tabs/tabs-tab.d.ts +24 -0
  116. package/dist/components/tabs/tabs-tab.js +24 -0
  117. package/dist/components/tabs/tabs-viewport.d.ts +8 -0
  118. package/dist/components/tabs/tabs-viewport.js +11 -0
  119. package/dist/components/tabs/tabs.css +1 -0
  120. package/dist/components/tabs/tabs.d.ts +31 -0
  121. package/dist/components/tabs/tabs.guide.json +23 -0
  122. package/dist/components/tabs/tabs.js +30 -0
  123. package/dist/components/tabs/tabs.module.js +11 -0
  124. package/dist/components/text/text.css +1 -1
  125. package/dist/components/text/text.d.ts +2 -2
  126. package/dist/components/text/text.js +2 -3
  127. package/dist/components/text/text.module.js +1 -1
  128. package/dist/components/textarea/textarea.css +1 -1
  129. package/dist/components/textarea/textarea.guide.json +8 -3
  130. package/dist/components/textarea/textarea.js +1 -3
  131. package/dist/components/textarea/textarea.module.js +4 -3
  132. package/dist/components/textfield/textfield.css +1 -1
  133. package/dist/components/textfield/textfield.guide.json +9 -3
  134. package/dist/components/textfield/textfield.js +1 -3
  135. package/dist/components/textfield/textfield.module.js +6 -5
  136. package/dist/components/title/title.css +1 -1
  137. package/dist/components/title/title.js +2 -3
  138. package/dist/components/title/title.module.js +1 -1
  139. package/dist/core/elevation/get-elevation-props.js +2 -2
  140. package/dist/core/props/intrinsic-vira-props.d.ts +3 -3
  141. package/dist/index.js +8 -1
  142. package/dist/internal-icons/icon-registry.d.ts +4 -1
  143. package/dist/internal-icons/icon-registry.js +9 -0
  144. package/dist/internal-icons/icons/duo/ArrowDown.js +1 -1
  145. package/dist/internal-icons/icons/duo/ArrowDownLeft.js +1 -1
  146. package/dist/internal-icons/icons/duo/ArrowDownRight.js +1 -1
  147. package/dist/internal-icons/icons/duo/ArrowLeft.js +1 -1
  148. package/dist/internal-icons/icons/duo/ArrowRight.js +1 -1
  149. package/dist/internal-icons/icons/duo/ArrowUp.js +1 -1
  150. package/dist/internal-icons/icons/duo/ArrowUpLeft.js +1 -1
  151. package/dist/internal-icons/icons/duo/ArrowUpRight.js +1 -1
  152. package/dist/internal-icons/icons/duo/ChevronExpandY.js +2 -2
  153. package/dist/internal-icons/icons/duo/CircleCheck.d.ts +7 -0
  154. package/dist/internal-icons/icons/duo/CircleCheck.js +13 -0
  155. package/dist/internal-icons/icons/duo/Duplicate.d.ts +7 -0
  156. package/dist/internal-icons/icons/duo/Duplicate.js +13 -0
  157. package/dist/internal-icons/icons/duo/RefreshAnticlockwise.js +1 -1
  158. package/dist/internal-icons/icons/duo/ShieldCheck.d.ts +7 -0
  159. package/dist/internal-icons/icons/duo/ShieldCheck.js +13 -0
  160. package/dist/internal-icons/icons/duo/index.d.ts +3 -0
  161. package/dist/internal-icons/icons/duo/index.js +3 -0
  162. package/dist/preflight-surface.json +15 -1
  163. package/dist/preflight.css +1 -1
  164. package/dist/theme-surface.json +0 -5
  165. package/package.json +3 -3
@@ -1,7 +1,7 @@
1
1
  var spinner_module_default = {
2
- Spinner: "spinner-module_Spinner_qCQzj",
3
- Glyph: "spinner-module_Glyph_OV-cy",
4
- "spinner-bars": "spinner-module_spinner-bars_jDmaB"
2
+ Spinner: "viraui__spinner-module__Spinner_qCQzj",
3
+ Glyph: "viraui__spinner-module__Glyph_OV-cy",
4
+ "spinner-bars": "viraui__spinner-module__spinner-bars_jDmaB"
5
5
  };
6
6
  //#endregion
7
7
  export { spinner_module_default as default };
@@ -1 +1 @@
1
- .stack-module_Stack_NR-Ey{--stack-row-gap:0;--stack-column-gap:0;--stack-h-align:initial;--stack-v-align:initial;--stack-padding-inline-start:0;--stack-padding-inline-end:0;--stack-padding-block-start:0;--stack-padding-block-end:0;display:flex;gap:var(--stack-row-gap) var(--stack-column-gap);flex-direction:column;align-items:var(--stack-h-align);justify-content:var(--stack-v-align);max-inline-size:var(--stack-max-width,none);min-inline-size:var(--stack-min-width,none);&[data-stack-direction=column-reverse]{flex-direction:column-reverse}&[data-stack-direction=row-reverse],&[data-stack-direction=row]{align-items:var(--stack-v-align);justify-content:var(--stack-h-align)}&[data-stack-direction=row]{flex-direction:row}&[data-stack-direction=row-reverse]{flex-direction:row-reverse}&[data-stack-inline=true]{display:inline-flex;flex-grow:0}:where(&[data-stack-wrap=true]){flex-wrap:wrap}:where(&[data-stack-has-padding=true]){padding:var(--stack-padding-block-start) var(--stack-padding-inline-end) var(--stack-padding-block-end) var(--stack-padding-inline-start)}:where(&[data-stack-fill-children=true]>*){flex-grow:var(--vira-flex-grow,1)}}
1
+ .viraui__stack-module__Stack_NR-Ey{--stack-row-gap:0;--stack-column-gap:0;--stack-h-align:initial;--stack-v-align:initial;--stack-padding-inline-start:0;--stack-padding-inline-end:0;--stack-padding-block-start:0;--stack-padding-block-end:0;display:flex;gap:var(--stack-row-gap) var(--stack-column-gap);flex-direction:column;align-items:var(--stack-h-align);justify-content:var(--stack-v-align);max-inline-size:var(--stack-max-width,none);min-inline-size:var(--stack-min-width,none);&[data-stack-direction=column-reverse]{flex-direction:column-reverse}&[data-stack-direction=row-reverse],&[data-stack-direction=row]{align-items:var(--stack-v-align);justify-content:var(--stack-h-align)}&[data-stack-direction=row]{flex-direction:row}&[data-stack-direction=row-reverse]{flex-direction:row-reverse}&[data-stack-inline=true]{display:inline-flex;flex-grow:0}:where(&[data-stack-wrap=true]){flex-wrap:wrap}:where(&[data-stack-has-padding=true]){padding:var(--stack-padding-block-start) var(--stack-padding-inline-end) var(--stack-padding-block-end) var(--stack-padding-inline-start)}:where(&[data-stack-fill-children=true]>*){flex-grow:var(--vira-flex-grow,1)}}
@@ -53,13 +53,13 @@ export type StackProps = React.ComponentPropsWithoutRef<'div'> & IntrinsicViraPr
53
53
  /**
54
54
  * Sets the gap between flex rows using the Vira space token scale.
55
55
  *
56
- * @default 'medium'
56
+ * @default No row gap.
57
57
  */
58
58
  rowGap?: StackSpace;
59
59
  /**
60
60
  * Sets the gap between flex columns using the Vira space token scale.
61
61
  *
62
- * @default 'medium'
62
+ * @default No column gap.
63
63
  */
64
64
  columnGap?: StackSpace;
65
65
  /**
@@ -1,4 +1,3 @@
1
- "use client";
2
1
  import './stack.css';
3
2
  import { clsx } from "../../core/clsx.js";
4
3
  import { extractIntrinsicViraProps } from "../../core/props/intrinsic-vira-props.js";
@@ -1,3 +1,3 @@
1
- var stack_module_default = { Stack: "stack-module_Stack_NR-Ey" };
1
+ var stack_module_default = { Stack: "viraui__stack-module__Stack_NR-Ey" };
2
2
  //#endregion
3
3
  export { stack_module_default as default };
@@ -1 +1 @@
1
- .static-noise-module_StaticNoise_ZhNxO{pointer-events:none;margin:0}.static-noise-module_FilterSvg_0CP2y{display:block}
1
+ .viraui__static-noise-module__StaticNoise_ZhNxO{pointer-events:none;margin:0}.viraui__static-noise-module__FilterSvg_0CP2y{display:block}
@@ -18,7 +18,7 @@ export type StaticNoiseProps = React.ComponentPropsWithRef<'figure'> & Intrinsic
18
18
  /**
19
19
  * Sets the rendered overlay opacity.
20
20
  *
21
- * @default 0.1
21
+ * @default 0.2
22
22
  */
23
23
  opacity?: number;
24
24
  /**
@@ -1,3 +1,4 @@
1
+ "use client";
1
2
  import './static-noise.css';
2
3
  import { clsx } from "../../core/clsx.js";
3
4
  import { extractIntrinsicViraProps } from "../../core/props/intrinsic-vira-props.js";
@@ -6,7 +7,7 @@ import { jsx } from "react/jsx-runtime";
6
7
  import { useId } from "react";
7
8
  //#region src/components/static-noise/static-noise.tsx
8
9
  var STATIC_NOISE_SEED_FRAMES = "1;5;2;9;3;7;4;11;6;13;8;15;10;17;12;19;14;16;18;20;3;8;1;13";
9
- var StaticNoise = ({ animate = false, baseFrequency = .5, className, mixBlendMode = "multiply", opacity = .15, ref, style, ...otherProps }) => {
10
+ var StaticNoise = ({ animate = false, baseFrequency = .5, className, mixBlendMode = "difference", opacity = .2, ref, style, ...otherProps }) => {
10
11
  const { componentProps, intrinsicAttributes } = extractIntrinsicViraProps(otherProps);
11
12
  const reactId = useId();
12
13
  const dynamicStyle = {
@@ -1,6 +1,6 @@
1
1
  var static_noise_module_default = {
2
- StaticNoise: "static-noise-module_StaticNoise_ZhNxO",
3
- FilterSvg: "static-noise-module_FilterSvg_0CP2y"
2
+ StaticNoise: "viraui__static-noise-module__StaticNoise_ZhNxO",
3
+ FilterSvg: "viraui__static-noise-module__FilterSvg_0CP2y"
4
4
  };
5
5
  //#endregion
6
6
  export { static_noise_module_default as default };
@@ -1,6 +1,14 @@
1
1
  import { ThemeTypes } from '@viraui/foundation/vira/types';
2
2
  import type * as React from 'react';
3
3
  export type SurfaceRadius = ThemeTypes['radius'] | 'auto';
4
+ export type SurfaceRadiusCornerInput = ThemeTypes['radius'] | 0;
5
+ export type SurfaceRadiusCornersInput = [
6
+ SurfaceRadiusCornerInput,
7
+ SurfaceRadiusCornerInput,
8
+ SurfaceRadiusCornerInput,
9
+ SurfaceRadiusCornerInput
10
+ ];
11
+ export type SurfaceRadiusInput = SurfaceRadius | SurfaceRadiusCornersInput;
4
12
  export type SurfacePadding = ThemeTypes['space'] | [ThemeTypes['space'] | 0, ThemeTypes['space'] | 0];
5
13
  export type SurfaceRadiusCorners = {
6
14
  topLeft: string;
@@ -20,7 +28,7 @@ export type SurfaceRadiusContextValue = {
20
28
  };
21
29
  export type SurfaceRadiusDefaults = {
22
30
  hPadding?: SurfacePadding | undefined;
23
- radius?: SurfaceRadius | undefined;
31
+ radius?: SurfaceRadiusInput | undefined;
24
32
  style?: React.CSSProperties | undefined;
25
33
  vPadding?: SurfacePadding | undefined;
26
34
  };
@@ -23,6 +23,14 @@ var resolveTokenRadiusCorners = (radius) => ({
23
23
  bottomRight: radius,
24
24
  bottomLeft: radius
25
25
  });
26
+ var isPerCornerRadius = (value) => Array.isArray(value);
27
+ var resolveRadiusToken = (value) => toCssLength(resolveThemeValue(value, "radius", 0));
28
+ var resolvePerCornerRadiusInput = (corners) => ({
29
+ topLeft: resolveRadiusToken(corners[0]),
30
+ topRight: resolveRadiusToken(corners[1]),
31
+ bottomRight: resolveRadiusToken(corners[2]),
32
+ bottomLeft: resolveRadiusToken(corners[3])
33
+ });
26
34
  var getSurfaceStyleRadius = (style) => style?.["--surface-border-radius"];
27
35
  var getSurfaceRadiusStyle = (radius) => ({
28
36
  "--surface-border-radius-top-left": radius.topLeft,
@@ -31,11 +39,11 @@ var getSurfaceRadiusStyle = (radius) => ({
31
39
  "--surface-border-radius-bottom-left": radius.bottomLeft
32
40
  });
33
41
  var resolveDefaultContext = ({ hPadding, radius, style, vPadding }) => {
34
- const resolvedRadius = toCssLength(resolveThemeValue(radius, "radius", 0));
35
42
  const [paddingInlineStart, paddingInlineEnd] = resolveAxisPaddingValues(hPadding);
36
43
  const [paddingBlockStart, paddingBlockEnd] = resolveAxisPaddingValues(vPadding);
44
+ const styleRadius = getSurfaceStyleRadius(style);
37
45
  return {
38
- radius: resolveTokenRadiusCorners(toCssLength(getSurfaceStyleRadius(style) ?? resolvedRadius)),
46
+ radius: isPerCornerRadius(radius) ? resolvePerCornerRadiusInput(radius) : resolveTokenRadiusCorners(toCssLength(styleRadius ?? resolveRadiusToken(radius === "auto" ? void 0 : radius))),
39
47
  padding: {
40
48
  inlineStart: paddingInlineStart,
41
49
  inlineEnd: paddingInlineEnd,
@@ -47,9 +55,12 @@ var resolveDefaultContext = ({ hPadding, radius, style, vPadding }) => {
47
55
  var useSurfaceRadius = ({ defaults, hPadding, radius, style, vPadding }) => {
48
56
  const parentContext = useSurfaceRadiusContext() ?? resolveDefaultContext(defaults);
49
57
  const hasAutoRadius = radius === "auto";
50
- const resolvedRadius = toCssLength(hasAutoRadius ? void 0 : resolveThemeValue(radius, "radius", 0));
51
- const tokenRadius = toCssLength(getSurfaceStyleRadius(style) ?? resolvedRadius);
52
- const ownRadius = hasAutoRadius ? resolveAutoRadiusCorners(parentContext) : resolveTokenRadiusCorners(tokenRadius);
58
+ const hasPerCornerRadius = isPerCornerRadius(radius);
59
+ const tokenRadius = toCssLength(getSurfaceStyleRadius(style) ?? (hasAutoRadius || hasPerCornerRadius ? void 0 : resolveRadiusToken(radius)));
60
+ let ownRadius;
61
+ if (hasAutoRadius) ownRadius = resolveAutoRadiusCorners(parentContext);
62
+ else if (hasPerCornerRadius) ownRadius = resolvePerCornerRadiusInput(radius);
63
+ else ownRadius = resolveTokenRadiusCorners(tokenRadius);
53
64
  const [paddingInlineStart, paddingInlineEnd] = resolveAxisPaddingValues(hPadding);
54
65
  const [paddingBlockStart, paddingBlockEnd] = resolveAxisPaddingValues(vPadding);
55
66
  return {
@@ -63,7 +74,7 @@ var useSurfaceRadius = ({ defaults, hPadding, radius, style, vPadding }) => {
63
74
  }
64
75
  },
65
76
  hasAutoRadius,
66
- radiusStyle: hasAutoRadius ? getSurfaceRadiusStyle(ownRadius) : { "--surface-border-radius": tokenRadius }
77
+ radiusStyle: hasAutoRadius || hasPerCornerRadius ? getSurfaceRadiusStyle(ownRadius) : { "--surface-border-radius": tokenRadius }
67
78
  };
68
79
  };
69
80
  //#endregion
@@ -1 +1 @@
1
- .surface-module_Surface_slEYq{--surface-background-hover:var(--surface-background);--surface-border-radius:0;--surface-border-radius-top-left:var(--surface-border-radius);--surface-border-radius-top-right:var(--surface-border-radius);--surface-border-radius-bottom-right:var(--surface-border-radius);--surface-border-radius-bottom-left:var(--surface-border-radius);--surface-padding-inline-start:0;--surface-padding-inline-end:0;--surface-padding-block-start:0;--surface-padding-block-end:0;--surface-vibrancy-background:var(--is-vibrancy-active) oklab(from var(--surface-background) l a b/80%);position:relative;box-sizing:border-box;background:var(--surface-vibrancy-background,var(--surface-background,transparent));border-radius:var(--surface-border-radius-top-left) var(--surface-border-radius-top-right) var(--surface-border-radius-bottom-right) var(--surface-border-radius-bottom-left);border:0;&[data-surface-radius=auto]{--surface-border-radius-top-left:0;--surface-border-radius-top-right:0;--surface-border-radius-bottom-right:0;--surface-border-radius-bottom-left:0}&[data-surface-has-padding=true]{padding:var(--surface-padding-block-start) var(--surface-padding-inline-end) var(--surface-padding-block-end) var(--surface-padding-inline-start)}&[data-surface-border]{border-style:var(--surface-border-style,solid);border-color:var(--global-contrast)}&[data-surface-border=all]{border-width:1px}&[data-surface-border=top]{border-width:1px 0 0}&[data-surface-border=right]{border-width:0 1px 0 0}&[data-surface-border=bottom]{border-width:0 0 1px}&[data-surface-border=left]{border-width:0 0 0 1px}&[data-surface-border=x]{border-width:0 1px}&[data-surface-border=y]{border-width:1px 0}@media (hover:hover) and (pointer:fine){&[data-surface-has-hover-color=true]:hover{animation:surface-module_surface-background-hover_HwH9- var(--duration-fast) var(--easing-standard);animation-fill-mode:both}}}@keyframes surface-module_surface-background-hover_HwH9-{to{background:var(--surface-background-hover)}}
1
+ .viraui__surface-module__Surface_slEYq{--surface-border-radius:0;--surface-border-radius-top-left:var(--surface-border-radius);--surface-border-radius-top-right:var(--surface-border-radius);--surface-border-radius-bottom-right:var(--surface-border-radius);--surface-border-radius-bottom-left:var(--surface-border-radius);--surface-padding-inline-start:0;--surface-padding-inline-end:0;--surface-padding-block-start:0;--surface-padding-block-end:0;--surface-background-hover:var(--surface-background);--surface-overflow:visible;--surface-vibrancy-background:var(--is-vibrancy-active) oklab(from var(--surface-background) l a b/80%);position:relative;overflow:var(--surface-overflow);box-sizing:border-box;background:var(--surface-vibrancy-background,var(--surface-background,transparent));border-radius:var(--surface-border-radius-top-left) var(--surface-border-radius-top-right) var(--surface-border-radius-bottom-right) var(--surface-border-radius-bottom-left);border:0;&[data-surface-radius=auto]{--surface-border-radius-top-left:0;--surface-border-radius-top-right:0;--surface-border-radius-bottom-right:0;--surface-border-radius-bottom-left:0}&[data-surface-has-padding=true]{padding:var(--surface-padding-block-start) var(--surface-padding-inline-end) var(--surface-padding-block-end) var(--surface-padding-inline-start)}&[data-surface-border]{border-style:var(--surface-border-style,solid);border-color:var(--global-contrast)}&[data-surface-border=all]{border-width:1px}&[data-surface-border=top]{border-width:1px 0 0}&[data-surface-border=right]{border-width:0 1px 0 0}&[data-surface-border=bottom]{border-width:0 0 1px}&[data-surface-border=left]{border-width:0 0 0 1px}&[data-surface-border=x]{border-width:0 1px}&[data-surface-border=y]{border-width:1px 0}@media (hover:hover) and (pointer:fine){&[data-surface-has-hover-color=true]:hover{background:var(--surface-background-hover)}}}
@@ -1,6 +1,6 @@
1
1
  import { useRender } from '@base-ui/react/use-render';
2
2
  import { IntrinsicViraProps } from '../../core/props/intrinsic-vira-props';
3
- import { SurfacePadding, SurfaceRadius } from './surface-radius-context';
3
+ import { SurfacePadding, SurfaceRadiusInput } from './surface-radius-context';
4
4
  import type * as React from 'react';
5
5
  /** Base ramp layer for nested surfaces; clamped to 1–3 at runtime. */
6
6
  type SurfaceBaseLevel = 1 | 2 | 3;
@@ -51,11 +51,11 @@ export type SurfaceProps = Omit<React.ComponentPropsWithoutRef<'div'>, 'color'>
51
51
  */
52
52
  borderStyle?: 'solid' | 'dashed' | 'dotted' | 'double';
53
53
  /**
54
- * Sets the corner radius from the Vira radius token scale, or derives concentric radii from the nearest ancestor Surface.
54
+ * Sets corner radius from the Vira radius token scale, a per-corner `[top-left, top-right, bottom-right, bottom-left]` tuple (`0` for square corners), or `auto` for concentric radii from the nearest ancestor Surface.
55
55
  *
56
56
  * @default No radius.
57
57
  */
58
- radius?: SurfaceRadius;
58
+ radius?: SurfaceRadiusInput;
59
59
  /**
60
60
  * Sets inline padding using one token for both sides or a `[start, end]` tuple.
61
61
  *
@@ -68,6 +68,12 @@ export type SurfaceProps = Omit<React.ComponentPropsWithoutRef<'div'>, 'color'>
68
68
  * @default No block padding.
69
69
  */
70
70
  vPadding?: SurfacePadding;
71
+ /**
72
+ * Sets root overflow through the `--surface-overflow` custom property.
73
+ *
74
+ * @default visible
75
+ */
76
+ overflow?: React.CSSProperties['overflow'];
71
77
  };
72
78
  export declare const Surface: React.FC<SurfaceProps>;
73
79
  export {};
@@ -6,8 +6,10 @@
6
6
  "Popup or card chrome with optional hover background",
7
7
  "Compose with Elevator for animated elevation transitions",
8
8
  "Set radius to a token on the outermost Surface that needs rounded corners",
9
+ "Set radius to a four-value tuple [top-left, top-right, bottom-right, bottom-left] when corners need different token radii",
9
10
  "Set radius=\"auto\" on a nested Surface when its parent Surface has a radius so each corner subtracts the nearest ancestor padding and stays concentric",
10
- "Stack nested auto-radius Surfaces recursively; context still resolves through wrapper layout such as Stack"
11
+ "Stack nested auto-radius Surfaces recursively; context still resolves through wrapper layout such as Stack",
12
+ "Set overflow=\"hidden\" (or scroll/auto) when Surface must clip or scroll inner content with radius or padding"
11
13
  ],
12
14
  "whenNotToUse": [
13
15
  "Interactive control semantics without an appropriate render root",
@@ -20,8 +20,7 @@ var surfaceDefaultRadiusProps = {
20
20
  style: void 0,
21
21
  vPadding: void 0
22
22
  };
23
- var Surface = ({ border, borderStyle = "solid", className, color, hPadding, hoverColor, radius, ref, render, style, vPadding, ...otherProps }) => {
24
- const hasColor = color !== void 0;
23
+ var Surface = ({ border, borderStyle = "solid", className, color, hPadding, hoverColor, overflow, radius, ref, render, style, vPadding, ...otherProps }) => {
25
24
  const hasPadding = Boolean(hPadding || vPadding);
26
25
  const hasHoverColor = hoverColor !== void 0;
27
26
  const { componentProps, intrinsicAttributes } = extractIntrinsicViraProps(otherProps);
@@ -33,9 +32,10 @@ var Surface = ({ border, borderStyle = "solid", className, color, hPadding, hove
33
32
  vPadding
34
33
  });
35
34
  const dynamicStyle = {
36
- ...hasColor ? { "--surface-background": toSurfaceColor(color) } : {},
35
+ "--surface-background": toSurfaceColor(color ?? "none"),
37
36
  ...hasHoverColor ? { "--surface-background-hover": toSurfaceColor(hoverColor) } : {},
38
37
  ...border ? { "--surface-border-style": borderStyle } : {},
38
+ "--surface-overflow": overflow,
39
39
  ...radiusStyle,
40
40
  ...resolveAxisPadding(hPadding, "--surface-padding-inline-start", "--surface-padding-inline-end"),
41
41
  ...resolveAxisPadding(vPadding, "--surface-padding-block-start", "--surface-padding-block-end"),
@@ -1,6 +1,3 @@
1
- var surface_module_default = {
2
- Surface: "surface-module_Surface_slEYq",
3
- "surface-background-hover": "surface-module_surface-background-hover_HwH9-"
4
- };
1
+ var surface_module_default = { Surface: "viraui__surface-module__Surface_slEYq" };
5
2
  //#endregion
6
3
  export { surface_module_default as default };
@@ -1 +1 @@
1
- .switch-module_Switch_L86y7{--switch-track-block-size:var(--space-large);--switch-track-radius:var(--radius-small);--switch-track-background:var(--global-contrast);--switch-thumb-background:var(--global-primary);--switch-thumb-size:calc(var(--space-large) - var(--space-x-small));--switch-thumb-inset:var(--space-2x-small);--switch-thumb-radius:calc(var(--radius-x-small) + var(--switch-thumb-inset));&:has([required]) [data-field-label]:after{content:" *";color:var(--highlight-red)}}.switch-module_SwitchRoot_Zv9An{position:relative;appearance:none;border:0;box-shadow:none;inline-size:calc((var(--switch-thumb-size) * 2) + var(--switch-thumb-inset) * 2);block-size:var(--switch-track-block-size);background:var(--switch-track-background);border-radius:var(--switch-track-radius);&[data-size=small]{--switch-track-radius:var(--radius-x-small);--switch-track-block-size:var(--space-medium);--switch-thumb-size:calc(var(--space-medium) - var(--space-x-small));--switch-thumb-radius:calc(var(--radius-x-small) - var(--switch-thumb-inset))}&[data-checked]:not([data-disabled]):not([data-invalid]){--switch-track-background:var(--global-primary);--switch-thumb-background:var(--base-1)}&[data-invalid]:not([data-disabled]),.switch-module_Switch_L86y7[data-invalid]>&:not([data-disabled]){box-shadow:inset 0 0 0 1px var(--highlight-red);outline-color:oklab(from var(--highlight-red) l a b/.5)}&[data-disabled],.switch-module_Switch_L86y7[data-disabled]>&{--switch-track-background:var(--global-disabled-background);--switch-thumb-background:var(--global-disabled-foreground);box-shadow:none;cursor:not-allowed}}.switch-module_Thumb_ldwJw{position:absolute;inset-block:var(--switch-thumb-inset);inset-inline-start:var(--switch-thumb-inset);background:var(--switch-thumb-background);inline-size:var(--switch-thumb-size);block-size:var(--switch-thumb-size);border-radius:var(--switch-thumb-radius);transition:translate var(--easing-entrance) var(--duration-fast);.switch-module_SwitchRoot_Zv9An[data-checked]>&{translate:100% 0}.switch-module_SwitchRoot_Zv9An[data-checked]:dir(rtl)>&{translate:-100% 0}}
1
+ .viraui__switch-module__Switch_L86y7{--switch-track-block-size:var(--space-large);--switch-track-radius:var(--radius-small);--switch-track-background:var(--global-contrast);--switch-thumb-background:var(--base-7);--switch-thumb-size:calc(var(--space-large) - var(--space-x-small));--switch-thumb-inset:var(--space-2x-small);&:has([required]) .viraui__switch-module__Label_9R-rv:after{content:" *";color:var(--highlight-red)}}.viraui__switch-module__SwitchRoot_Zv9An{position:relative;appearance:none;border:0;box-shadow:none;inline-size:calc((var(--switch-thumb-size) * 2) + var(--switch-thumb-inset) * 2);block-size:var(--switch-track-block-size);background:var(--switch-track-background);border-radius:var(--switch-track-radius);&[data-size=small]{--switch-track-radius:var(--radius-x-small);--switch-track-block-size:var(--space-medium);--switch-thumb-size:calc(var(--space-medium) - var(--space-x-small))}&[data-checked]:not([data-disabled]):not([data-invalid]){--switch-track-background:var(--global-primary);--switch-thumb-background:contrast-color(var(--global-primary))}&[data-invalid]:not([data-disabled]),.viraui__switch-module__Switch_L86y7[data-invalid]>&:not([data-disabled]){box-shadow:inset 0 0 0 1px var(--highlight-red);outline-color:oklab(from var(--highlight-red) l a b/.5)}&[data-disabled],.viraui__switch-module__Switch_L86y7[data-disabled]>&{--switch-track-background:var(--global-disabled-background);--switch-thumb-background:var(--global-disabled-foreground);box-shadow:none;cursor:not-allowed}}.viraui__switch-module__Thumb_ldwJw{--switch-thumb-radius:calc(var(--switch-track-radius) - var(--switch-thumb-inset));position:absolute;inset-block:var(--switch-thumb-inset);inset-inline-start:var(--switch-thumb-inset);background:var(--switch-thumb-background);inline-size:var(--switch-thumb-size);block-size:var(--switch-thumb-size);border-radius:var(--switch-thumb-radius);transition:translate var(--easing-entrance) var(--duration-fast);.viraui__switch-module__SwitchRoot_Zv9An[data-checked]>&{translate:100% 0}.viraui__switch-module__SwitchRoot_Zv9An[data-checked]:dir(rtl)>&{translate:-100% 0}}
@@ -1,4 +1,3 @@
1
- "use client";
2
1
  import './switch.css';
3
2
  import { clsx } from "../../core/clsx.js";
4
3
  import { extractIntrinsicViraProps } from "../../core/props/intrinsic-vira-props.js";
@@ -30,35 +29,38 @@ var Switch$1 = ({ className, description, dirty, disabled, error, invalid, label
30
29
  fillChildren: false,
31
30
  vAlign: hasTextDescription ? "start" : "center"
32
31
  }),
33
- children: /* @__PURE__ */ jsx(Field.Label, { children: /* @__PURE__ */ jsxs(Stack, {
34
- direction: "row",
35
- columnGap: size === "small" ? "small" : "medium",
36
- fillChildren: false,
37
- vAlign: hasTextDescription ? "start" : "center",
38
- ...hPadding !== void 0 ? { hPadding } : {},
39
- ...vPadding !== void 0 ? { vPadding } : {},
40
- children: [/* @__PURE__ */ jsx(Switch.Root, {
41
- ...componentProps,
42
- className: clsx(switch_module_default.SwitchRoot, className),
43
- "data-shrink": "false",
44
- "data-size": size,
45
- disabled,
46
- name,
47
- ref,
48
- children: /* @__PURE__ */ jsx(Switch.Thumb, { className: switch_module_default.Thumb })
49
- }), label || description || error ? /* @__PURE__ */ jsxs(Stack, {
50
- direction: "column",
32
+ children: /* @__PURE__ */ jsx(Field.Label, {
33
+ className: switch_module_default.Label,
34
+ children: /* @__PURE__ */ jsxs(Stack, {
35
+ direction: "row",
36
+ columnGap: size === "small" ? "small" : "medium",
51
37
  fillChildren: false,
52
- rowGap: size === "small" ? "2x-small" : "x-small",
53
- children: [label && /* @__PURE__ */ jsx(FieldLabel, {
54
- size: size === "small" ? "small" : "medium",
55
- children: label
56
- }), /* @__PURE__ */ jsx(FieldHelperCopy, {
57
- description,
58
- error
59
- })]
60
- }) : null]
61
- }) })
38
+ vAlign: hasTextDescription ? "start" : "center",
39
+ hPadding,
40
+ vPadding,
41
+ children: [/* @__PURE__ */ jsx(Switch.Root, {
42
+ ...componentProps,
43
+ className: clsx(switch_module_default.SwitchRoot, className),
44
+ "data-shrink": "false",
45
+ "data-size": size,
46
+ disabled,
47
+ name,
48
+ ref,
49
+ children: /* @__PURE__ */ jsx(Switch.Thumb, { className: switch_module_default.Thumb })
50
+ }), label || description || error ? /* @__PURE__ */ jsxs(Stack, {
51
+ direction: "column",
52
+ fillChildren: false,
53
+ rowGap: "small",
54
+ children: [label && /* @__PURE__ */ jsx(FieldLabel, {
55
+ size: size === "small" ? "small" : "medium",
56
+ children: label
57
+ }), /* @__PURE__ */ jsx(FieldHelperCopy, {
58
+ description,
59
+ error
60
+ })]
61
+ }) : null]
62
+ })
63
+ })
62
64
  });
63
65
  };
64
66
  //#endregion
@@ -1,7 +1,8 @@
1
1
  var switch_module_default = {
2
- Switch: "switch-module_Switch_L86y7",
3
- SwitchRoot: "switch-module_SwitchRoot_Zv9An",
4
- Thumb: "switch-module_Thumb_ldwJw"
2
+ Switch: "viraui__switch-module__Switch_L86y7",
3
+ Label: "viraui__switch-module__Label_9R-rv",
4
+ SwitchRoot: "viraui__switch-module__SwitchRoot_Zv9An",
5
+ Thumb: "viraui__switch-module__Thumb_ldwJw"
5
6
  };
6
7
  //#endregion
7
8
  export { switch_module_default as default };
@@ -0,0 +1,6 @@
1
+ export { Tabs } from './tabs';
2
+ export type { TabsProps } from './tabs';
3
+ export type { TabsTabProps } from './tabs-tab';
4
+ export type { TabsListProps } from './tabs-list';
5
+ export type { TabsPanelProps } from './tabs-panel';
6
+ export type { TabsViewportProps } from './tabs-viewport';
@@ -0,0 +1,9 @@
1
+ import { TabsIndicator as TabsIndicatorPrimitive } from '@base-ui/react/tabs';
2
+ import type * as React from 'react';
3
+ /**
4
+ * Internal active tab indicator for `Tabs.List`.
5
+ *
6
+ * Positioned with Base UI `--active-tab-*` CSS variables.
7
+ */
8
+ export type TabsIndicatorProps = TabsIndicatorPrimitive.Props;
9
+ export declare const TabsIndicator: React.FC<TabsIndicatorProps>;
@@ -0,0 +1,16 @@
1
+ import { Surface } from "../surface/surface.js";
2
+ import tabs_module_default from "./tabs.module.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ import { Tabs } from "@base-ui/react/tabs";
5
+ //#region src/components/tabs/tabs-indicator.tsx
6
+ var TabsIndicator = ({ className, ref, ...props }) => /* @__PURE__ */ jsx(Tabs.Indicator, {
7
+ render: /* @__PURE__ */ jsx(Surface, {
8
+ border: "all",
9
+ radius: "auto",
10
+ color: 3
11
+ }),
12
+ className: tabs_module_default.Indicator,
13
+ ...props
14
+ });
15
+ //#endregion
16
+ export { TabsIndicator };
@@ -0,0 +1,12 @@
1
+ import { TabsList as TabsListPrimitive } from '@base-ui/react/tabs';
2
+ import type * as React from 'react';
3
+ /**
4
+ * Public Tabs.List props.
5
+ *
6
+ * Wraps Base UI `Tabs.List` in a compact `Surface`, lays out items with `Stack`,
7
+ * and renders the active tab indicator internally.
8
+ *
9
+ * @default Base UI pass-through props keep upstream defaults.
10
+ */
11
+ export type TabsListProps = TabsListPrimitive.Props;
12
+ export declare const TabsList: React.FC<TabsListProps>;
@@ -0,0 +1,29 @@
1
+ import { clsx } from "../../core/clsx.js";
2
+ import { Stack } from "../stack/stack.js";
3
+ import { Surface } from "../surface/surface.js";
4
+ import tabs_module_default from "./tabs.module.js";
5
+ import { TabsIndicator } from "./tabs-indicator.js";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ import { Tabs } from "@base-ui/react/tabs";
8
+ //#region src/components/tabs/tabs-list.tsx
9
+ var TabsList = ({ children, className, activateOnFocus = true, ref, ...props }) => /* @__PURE__ */ jsx(Tabs.List, {
10
+ className: clsx(tabs_module_default.List, className),
11
+ activateOnFocus,
12
+ render: /* @__PURE__ */ jsx(Surface, {
13
+ color: 1,
14
+ border: "all",
15
+ hPadding: "2x-small",
16
+ radius: "medium",
17
+ vPadding: "2x-small"
18
+ }),
19
+ ...props,
20
+ children: /* @__PURE__ */ jsxs(Stack, {
21
+ direction: "row",
22
+ columnGap: "small",
23
+ hAlign: "start",
24
+ vAlign: "center",
25
+ children: [/* @__PURE__ */ jsx(TabsIndicator, {}), children]
26
+ })
27
+ });
28
+ //#endregion
29
+ export { TabsList };
@@ -0,0 +1,11 @@
1
+ import { TabsPanel as TabsPanelPrimitive } from '@base-ui/react/tabs';
2
+ import type * as React from 'react';
3
+ /**
4
+ * Public Tabs.Panel props.
5
+ *
6
+ * Base UI `Tabs.Panel` with entry slide/fade animation.
7
+ *
8
+ * @default Base UI pass-through props keep upstream defaults.
9
+ */
10
+ export type TabsPanelProps = TabsPanelPrimitive.Props;
11
+ export declare const TabsPanel: React.FC<TabsPanelProps>;
@@ -0,0 +1,13 @@
1
+ import { clsx } from "../../core/clsx.js";
2
+ import tabs_module_default from "./tabs.module.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ import { Tabs } from "@base-ui/react/tabs";
5
+ //#region src/components/tabs/tabs-panel.tsx
6
+ var TabsPanel = ({ children, className, ref, ...props }) => /* @__PURE__ */ jsx(Tabs.Panel, {
7
+ ref,
8
+ className: clsx(tabs_module_default.Panel, className),
9
+ ...props,
10
+ children
11
+ });
12
+ //#endregion
13
+ export { TabsPanel };
@@ -0,0 +1,24 @@
1
+ import { TabsTab as TabsTabPrimitive } from '@base-ui/react/tabs';
2
+ import type * as React from 'react';
3
+ /**
4
+ * Public Tabs.Tab props.
5
+ *
6
+ * Wraps Base UI `Tabs.Tab` with optional decorative addon layout.
7
+ *
8
+ * @default Base UI pass-through props keep upstream defaults.
9
+ */
10
+ export type TabsTabProps = TabsTabPrimitive.Props & {
11
+ /**
12
+ * Decorative addon rendered alongside the tab label.
13
+ *
14
+ * @default No addon is rendered.
15
+ */
16
+ addon?: React.ReactNode;
17
+ /**
18
+ * Controls whether the addon appears before or after the label.
19
+ *
20
+ * @default 'start'
21
+ */
22
+ addonPosition?: 'start' | 'end';
23
+ };
24
+ export declare const TabsTab: React.FC<TabsTabProps>;
@@ -0,0 +1,24 @@
1
+ import { clsx } from "../../core/clsx.js";
2
+ import { Button } from "../button/button.js";
3
+ import { Text } from "../text/text.js";
4
+ import tabs_module_default from "./tabs.module.js";
5
+ import { jsx } from "react/jsx-runtime";
6
+ import { Tabs } from "@base-ui/react/tabs";
7
+ //#region src/components/tabs/tabs-tab.tsx
8
+ var TabsTab = ({ addon, addonPosition = "start", children, className, ...props }) => /* @__PURE__ */ jsx(Tabs.Tab, {
9
+ render: /* @__PURE__ */ jsx(Button, {
10
+ variant: "flat",
11
+ addon,
12
+ addonPosition,
13
+ className: clsx(tabs_module_default.Item, className)
14
+ }),
15
+ ...props,
16
+ children: /* @__PURE__ */ jsx(Text, {
17
+ tone: "muted",
18
+ whiteSpace: "nowrap",
19
+ className: tabs_module_default.Label,
20
+ children
21
+ })
22
+ });
23
+ //#endregion
24
+ export { TabsTab };
@@ -0,0 +1,8 @@
1
+ import type * as React from 'react';
2
+ /**
3
+ * Public Tabs.Viewport props.
4
+ *
5
+ * Grid container for animated `Tabs.Panel` children.
6
+ */
7
+ export type TabsViewportProps = React.ComponentPropsWithoutRef<'div'>;
8
+ export declare const TabsViewport: React.FC<TabsViewportProps>;
@@ -0,0 +1,11 @@
1
+ import { clsx } from "../../core/clsx.js";
2
+ import tabs_module_default from "./tabs.module.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region src/components/tabs/tabs-viewport.tsx
5
+ var TabsViewport = ({ children, className, ...props }) => /* @__PURE__ */ jsx("div", {
6
+ className: clsx(tabs_module_default.Viewport, className),
7
+ ...props,
8
+ children
9
+ });
10
+ //#endregion
11
+ export { TabsViewport };
@@ -0,0 +1 @@
1
+ .viraui__tabs-module__Tabs_AwbZZ{--tabs-translate-amount:10px;min-block-size:10rem}.viraui__tabs-module__Viewport_15X1I{display:grid;grid-template-columns:minmax(0,1fr);inline-size:100%}.viraui__tabs-module__List_XJorr{position:relative;overflow-x:auto}.viraui__tabs-module__Indicator_UyNUn{position:absolute;pointer-events:none;inset-block-start:var(--active-tab-top);inset-inline-start:var(--active-tab-left);inline-size:var(--active-tab-width);block-size:var(--active-tab-height);transition:inset-inline-start var(--duration-fast) var(--easing-standard),inset-block-start var(--duration-fast) var(--easing-standard),inline-size var(--duration-fast) var(--easing-standard),block-size var(--duration-fast) var(--easing-standard)}.viraui__tabs-module__Item_XZ86Z{position:relative;flex-shrink:0;cursor:pointer;flex-basis:0;transition:none;will-change:auto;&[data-variant]:not(:disabled):active{translate:0 0}&:hover,&[data-disabled]{background:transparent}&[data-disabled]{opacity:.5}&[data-active]{color:var(--global-foreground)}&:focus-visible{border-radius:var(--radius-small);outline-offset:0}}.viraui__tabs-module__Item_XZ86Z[data-active] .viraui__tabs-module__Label_5-8-Y{color:var(--global-foreground)}.viraui__tabs-module__Panel_vkCFI{grid-area:1/1;inline-size:100%;opacity:1;translate:0 0;transition:opacity var(--duration-fast) var(--easing-entrance),translate var(--duration-fast) var(--easing-entrance);&[data-ending-style]{pointer-events:none}&[data-ending-style],&[data-starting-style]{opacity:0}&[data-activation-direction=right][data-starting-style]{translate:var(--tabs-translate-amount) 0}&[data-activation-direction=left][data-starting-style],&[data-activation-direction=right][data-ending-style]{translate:calc(var(--tabs-translate-amount) * -1) 0}&[data-activation-direction=left][data-ending-style]{translate:var(--tabs-translate-amount) 0}&[data-activation-direction=none][data-ending-style],&[data-activation-direction=none][data-starting-style]{translate:0 var(--tabs-translate-amount)}&[hidden]{display:none}@media (prefers-reduced-motion:reduce){transition:none;&[data-ending-style],&[data-starting-style]{opacity:1;translate:0 0}}}
@@ -0,0 +1,31 @@
1
+ import { TabsRoot } from '@base-ui/react/tabs';
2
+ import { StackProps } from '..';
3
+ import { TabsListProps } from './tabs-list';
4
+ import { TabsPanelProps } from './tabs-panel';
5
+ import { TabsTabProps } from './tabs-tab';
6
+ import { TabsViewportProps } from './tabs-viewport';
7
+ import * as React from 'react';
8
+ /**
9
+ * Public Tabs root props.
10
+ *
11
+ * Includes Base UI tabs root props such as `value`, `defaultValue`, `orientation`,
12
+ * and `onValueChange`.
13
+ *
14
+ * @default Base UI pass-through props keep upstream defaults.
15
+ */
16
+ export type TabsProps = TabsRoot.Props & {
17
+ /**
18
+ * Horizontal alignment of tab list within root Stack.
19
+ *
20
+ * @default 'start'
21
+ */
22
+ listAlignment?: Extract<StackProps['hAlign'], 'start' | 'center' | 'end' | 'stretch'>;
23
+ };
24
+ type TabsComponent = React.FC<TabsProps> & {
25
+ List: React.FC<TabsListProps>;
26
+ Tab: React.FC<TabsTabProps>;
27
+ Viewport: React.FC<TabsViewportProps>;
28
+ Panel: React.FC<TabsPanelProps>;
29
+ };
30
+ export declare const Tabs: TabsComponent;
31
+ export {};
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "Tabs",
3
+ "summary": "Compound segmented tab control with Surface list chrome, moving indicator, and animated panels.",
4
+ "whenToUse": [
5
+ "Switching between related views in the same surface",
6
+ "Compact horizontal segmented navigation",
7
+ "Decorative start/end addons on tab labels without changing accessible names"
8
+ ],
9
+ "whenNotToUse": [
10
+ "Primary app navigation that should use links or routes directly",
11
+ "Vertical tab layouts in v1 styled targets"
12
+ ],
13
+ "accessibility": [
14
+ "Keep tab labels as visible text; addons are decorative and aria-hidden",
15
+ "Ensure each `Tabs.Panel` value matches a `Tabs.Tab` value",
16
+ "Disabled items cannot be activated through pointer or keyboard"
17
+ ],
18
+ "antiPatterns": [
19
+ "Using addons as the only visible label for a tab",
20
+ "Trying to compose a separate public `Tabs.Indicator`; the indicator is owned by `Tabs.List`"
21
+ ],
22
+ "related": ["Surface", "Stack", "Text"]
23
+ }
@@ -0,0 +1,30 @@
1
+ import './tabs.css';
2
+ import { clsx } from "../../core/clsx.js";
3
+ import { Stack } from "../stack/stack.js";
4
+ import tabs_module_default from "./tabs.module.js";
5
+ import { TabsList } from "./tabs-list.js";
6
+ import { TabsPanel } from "./tabs-panel.js";
7
+ import { TabsTab } from "./tabs-tab.js";
8
+ import { TabsViewport } from "./tabs-viewport.js";
9
+ import { jsx } from "react/jsx-runtime";
10
+ import "react";
11
+ import { Tabs } from "@base-ui/react/tabs";
12
+ //#region src/components/tabs/tabs.tsx
13
+ var TabsRootComponent = ({ children, className, listAlignment = "start", ...props }) => /* @__PURE__ */ jsx(Tabs.Root, {
14
+ render: /* @__PURE__ */ jsx(Stack, {
15
+ hAlign: listAlignment,
16
+ vAlign: "start",
17
+ fillChildren: false,
18
+ className: clsx(tabs_module_default.Tabs, className)
19
+ }),
20
+ ...props,
21
+ children
22
+ });
23
+ var Tabs$1 = Object.assign(TabsRootComponent, {
24
+ List: TabsList,
25
+ Tab: TabsTab,
26
+ Viewport: TabsViewport,
27
+ Panel: TabsPanel
28
+ });
29
+ //#endregion
30
+ export { Tabs$1 as Tabs };