orbital-ds 0.7.0 → 0.9.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.
Files changed (109) hide show
  1. package/AGENTS.md +145 -80
  2. package/README.md +87 -73
  3. package/components.manifest.json +1326 -1267
  4. package/contract.json +226 -168
  5. package/dist/hooks/use-ds-messages.d.ts +36 -0
  6. package/dist/hooks/use-ds-messages.js +12 -0
  7. package/dist/hooks/use-ds-motion.d.ts +17 -0
  8. package/dist/hooks/use-ds-motion.js +50 -0
  9. package/dist/lib/i18n.d.ts +46 -0
  10. package/dist/lib/i18n.js +109 -0
  11. package/dist/lib/motion.d.ts +74 -0
  12. package/dist/lib/motion.js +97 -0
  13. package/dist/styles.css +876 -528
  14. package/dist/themes/friendly.css +362 -318
  15. package/dist/themes/friendly.meta.json +75 -14
  16. package/dist/themes/friendly.scoped.css +362 -318
  17. package/dist/themes/qratia.meta.json +42 -12
  18. package/dist/themes/tactile.css +575 -429
  19. package/dist/themes/tactile.fonts.css +3 -2
  20. package/dist/themes/tactile.guide.md +82 -49
  21. package/dist/themes/tactile.meta.json +175 -16
  22. package/dist/themes/tactile.scoped.css +575 -429
  23. package/dist/themes/twitter.css +354 -298
  24. package/dist/themes/twitter.meta.json +83 -61
  25. package/dist/themes/twitter.scoped.css +354 -298
  26. package/dist/themes/zyro.css +443 -389
  27. package/dist/themes/zyro.meta.json +67 -14
  28. package/dist/themes/zyro.scoped.css +443 -389
  29. package/dist/ui/accordion.js +5 -5
  30. package/dist/ui/alert-dialog.js +3 -3
  31. package/dist/ui/alert.d.ts +1 -1
  32. package/dist/ui/alert.js +9 -3
  33. package/dist/ui/attachment.d.ts +1 -1
  34. package/dist/ui/attachment.js +4 -4
  35. package/dist/ui/avatar.js +6 -6
  36. package/dist/ui/ayuda.js +3 -2
  37. package/dist/ui/badge.d.ts +1 -1
  38. package/dist/ui/badge.js +9 -3
  39. package/dist/ui/banner.d.ts +14 -0
  40. package/dist/ui/banner.js +88 -0
  41. package/dist/ui/breadcrumb.js +7 -3
  42. package/dist/ui/bubble.js +6 -6
  43. package/dist/ui/button-group.js +4 -4
  44. package/dist/ui/button.d.ts +1 -1
  45. package/dist/ui/button.js +5 -5
  46. package/dist/ui/calendar.js +33 -6
  47. package/dist/ui/card.js +4 -4
  48. package/dist/ui/carousel.js +15 -8
  49. package/dist/ui/chart.js +7 -3
  50. package/dist/ui/checkbox.js +1 -1
  51. package/dist/ui/combobox.js +7 -7
  52. package/dist/ui/command.js +13 -11
  53. package/dist/ui/context-menu.js +8 -8
  54. package/dist/ui/dialog.js +10 -6
  55. package/dist/ui/drawer.js +9 -9
  56. package/dist/ui/dropdown-menu.js +8 -8
  57. package/dist/ui/empty.js +3 -3
  58. package/dist/ui/field.js +2 -2
  59. package/dist/ui/hover-card.js +1 -1
  60. package/dist/ui/i18n-provider.d.ts +11 -0
  61. package/dist/ui/i18n-provider.js +18 -0
  62. package/dist/ui/icon-tile.d.ts +1 -1
  63. package/dist/ui/input-group.d.ts +1 -1
  64. package/dist/ui/input-group.js +11 -9
  65. package/dist/ui/input-otp.js +3 -3
  66. package/dist/ui/input.js +1 -1
  67. package/dist/ui/item.d.ts +1 -1
  68. package/dist/ui/item.js +3 -3
  69. package/dist/ui/kbd.js +1 -1
  70. package/dist/ui/label.js +1 -1
  71. package/dist/ui/marker.d.ts +1 -1
  72. package/dist/ui/marker.js +2 -2
  73. package/dist/ui/menubar.js +9 -9
  74. package/dist/ui/message-scroller.js +5 -2
  75. package/dist/ui/message.js +2 -2
  76. package/dist/ui/motion-provider.d.ts +11 -0
  77. package/dist/ui/motion-provider.js +16 -0
  78. package/dist/ui/native-select.js +4 -4
  79. package/dist/ui/navigation-menu.js +7 -6
  80. package/dist/ui/pagination.js +19 -11
  81. package/dist/ui/popover.js +2 -2
  82. package/dist/ui/progress.js +2 -2
  83. package/dist/ui/questionnaire.js +20 -15
  84. package/dist/ui/radio-group.js +2 -2
  85. package/dist/ui/resizable.js +2 -2
  86. package/dist/ui/scroll-area.js +3 -3
  87. package/dist/ui/select.js +6 -6
  88. package/dist/ui/separator.js +1 -1
  89. package/dist/ui/sheet.js +6 -4
  90. package/dist/ui/sidebar.js +42 -30
  91. package/dist/ui/skeleton.js +1 -1
  92. package/dist/ui/slider.js +6 -6
  93. package/dist/ui/sonner.js +25 -8
  94. package/dist/ui/spinner.js +4 -1
  95. package/dist/ui/switch.js +2 -2
  96. package/dist/ui/table.js +3 -3
  97. package/dist/ui/tabs.js +5 -5
  98. package/dist/ui/textarea.js +1 -1
  99. package/dist/ui/toast.js +15 -12
  100. package/dist/ui/toggle-group.js +2 -2
  101. package/dist/ui/toggle.js +6 -4
  102. package/dist/ui/tooltip.js +2 -2
  103. package/docs/CONTRACT.md +183 -153
  104. package/package.json +160 -142
  105. package/scripts/brand-core.mjs +153 -0
  106. package/scripts/doctor.mjs +128 -7
  107. package/scripts/i18n.mjs +111 -0
  108. package/scripts/init.mjs +294 -57
  109. package/scripts/setup.mjs +99 -0
@@ -41,7 +41,7 @@ function DropdownMenuContent({
41
41
  {
42
42
  "data-slot": "dropdown-menu-content",
43
43
  className: cn(
44
- "max-h-(--available-height) w-(--anchor-width) min-w-48 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-2xl bg-popover p-(--ds-menu-p) text-popover-foreground shadow-popover ring-1 ring-foreground/5 duration-(--ds-motion-fast) data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-closed:overflow-hidden dark:ring-foreground/10 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
44
+ "max-h-(--available-height) w-(--anchor-width) min-w-48 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-popover bg-popover p-(--ds-menu-p) text-popover-foreground shadow-popover ring-(length:--ds-layer-ring-w) ring-(--ds-layer-ring) duration-(--ds-motion-fast) data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-closed:overflow-hidden data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
45
45
  className
46
46
  ),
47
47
  ...props
@@ -66,7 +66,7 @@ function DropdownMenuItem({
66
66
  "data-inset": inset,
67
67
  "data-variant": variant,
68
68
  className: cn(
69
- "group/dropdown-menu-item relative flex cursor-default items-center gap-2.5 rounded-xl px-(--ds-menu-item-px) py-(--ds-menu-item-py) text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-9.5 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive",
69
+ "group/dropdown-menu-item relative flex cursor-default items-center gap-2.5 rounded-item px-(--ds-menu-item-px) py-(--ds-menu-item-py) text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-9.5 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-(--ds-disabled-opacity) [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive",
70
70
  className
71
71
  ),
72
72
  ...props
@@ -86,7 +86,7 @@ function DropdownMenuCheckboxItem({
86
86
  "data-slot": "dropdown-menu-checkbox-item",
87
87
  "data-inset": inset,
88
88
  className: cn(
89
- "relative flex cursor-default items-center gap-2.5 rounded-xl py-(--ds-menu-item-py) pr-8 pl-3 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-9.5 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
89
+ "relative flex cursor-default items-center gap-2.5 rounded-item py-(--ds-menu-item-py) pr-8 pl-(--ds-menu-item-px) text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-9.5 data-disabled:pointer-events-none data-disabled:opacity-(--ds-disabled-opacity) [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
90
90
  className
91
91
  ),
92
92
  checked,
@@ -128,7 +128,7 @@ function DropdownMenuRadioItem({
128
128
  "data-slot": "dropdown-menu-radio-item",
129
129
  "data-inset": inset,
130
130
  className: cn(
131
- "relative flex cursor-default items-center gap-2.5 rounded-xl py-(--ds-menu-item-py) pr-8 pl-3 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-9.5 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
131
+ "relative flex cursor-default items-center gap-2.5 rounded-item py-(--ds-menu-item-py) pr-8 pl-(--ds-menu-item-px) text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-9.5 data-disabled:pointer-events-none data-disabled:opacity-(--ds-disabled-opacity) [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
132
132
  className
133
133
  ),
134
134
  ...props,
@@ -157,7 +157,7 @@ function DropdownMenuLabel({
157
157
  "data-slot": "dropdown-menu-label",
158
158
  "data-inset": inset,
159
159
  className: cn(
160
- "px-(--ds-menu-item-px) py-(--ds-menu-item-py).5 text-xs text-muted-foreground data-inset:pl-9.5",
160
+ "px-(--ds-menu-item-px) py-(--ds-menu-item-py) text-xs text-muted-foreground data-inset:pl-9.5",
161
161
  className
162
162
  ),
163
163
  ...props
@@ -172,7 +172,7 @@ function DropdownMenuSeparator({
172
172
  DropdownMenuPrimitive.Separator,
173
173
  {
174
174
  "data-slot": "dropdown-menu-separator",
175
- className: cn("-mx-1 my-1 h-px bg-border/50", className),
175
+ className: cn("-mx-1 my-1 h-px bg-(--ds-separator)", className),
176
176
  ...props
177
177
  }
178
178
  );
@@ -216,7 +216,7 @@ function DropdownMenuSubTrigger({
216
216
  "data-slot": "dropdown-menu-sub-trigger",
217
217
  "data-inset": inset,
218
218
  className: cn(
219
- "flex cursor-default items-center gap-2 rounded-xl px-(--ds-menu-item-px) py-(--ds-menu-item-py) text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-9.5 data-popup-open:bg-accent data-popup-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
219
+ "flex cursor-default items-center gap-2 rounded-item px-(--ds-menu-item-px) py-(--ds-menu-item-py) text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-9.5 data-popup-open:bg-accent data-popup-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
220
220
  className
221
221
  ),
222
222
  ...props,
@@ -236,7 +236,7 @@ function DropdownMenuSubContent({
236
236
  {
237
237
  "data-slot": "dropdown-menu-sub-content",
238
238
  className: cn(
239
- "z-(--ds-z-overlay) min-w-36 origin-(--transform-origin) overflow-hidden rounded-2xl bg-popover p-(--ds-menu-p) text-popover-foreground shadow-popover ring-1 ring-foreground/5 duration-(--ds-motion-fast) data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
239
+ "z-(--ds-z-overlay) min-w-36 origin-(--transform-origin) overflow-hidden rounded-popover bg-popover p-(--ds-menu-p) text-popover-foreground shadow-popover ring-(length:--ds-layer-ring-w) ring-(--ds-layer-ring) duration-(--ds-motion-fast) data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
240
240
  className
241
241
  ),
242
242
  ...props
package/dist/ui/empty.js CHANGED
@@ -7,7 +7,7 @@ function Empty({ className, ...props }) {
7
7
  {
8
8
  "data-slot": "empty",
9
9
  className: cn(
10
- "flex w-full min-w-0 flex-1 flex-col items-center justify-center gap-4 rounded-lg border-dashed p-12 text-center text-balance",
10
+ "flex w-full min-w-0 flex-1 flex-col items-center justify-center gap-4 rounded-lg border-dashed p-(--ds-empty-p) text-center text-balance",
11
11
  className
12
12
  ),
13
13
  ...props
@@ -30,7 +30,7 @@ const emptyMediaVariants = cva(
30
30
  variants: {
31
31
  variant: {
32
32
  default: "bg-transparent",
33
- icon: "flex size-10 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground [&_svg:not([class*='size-'])]:size-6"
33
+ icon: "flex size-(--ds-icon-tile-md) shrink-0 items-center justify-center rounded-(--ds-icon-tile-radius) bg-muted text-foreground [&_svg:not([class*='size-'])]:size-6"
34
34
  }
35
35
  },
36
36
  defaultVariants: {
@@ -59,7 +59,7 @@ function EmptyTitle({ className, ...props }) {
59
59
  {
60
60
  "data-slot": "empty-title",
61
61
  className: cn(
62
- "text-lg font-medium tracking-tight",
62
+ "text-lg font-medium tracking-(--ds-heading-tracking)",
63
63
  className
64
64
  ),
65
65
  ...props
package/dist/ui/field.js CHANGED
@@ -101,7 +101,7 @@ function FieldLabel({
101
101
  {
102
102
  "data-slot": "field-label",
103
103
  className: cn(
104
- "group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50 has-data-checked:border-primary/30 has-data-checked:bg-primary/5 has-[>[data-slot=field]]:rounded-xl has-[>[data-slot=field]]:border has-[>[data-slot=field]]:not-has-[:disabled,[data-disabled]]:hover:bg-input/40 has-[>[data-slot=field]]:has-[:focus-visible]:border-ring has-[>[data-slot=field]]:has-[:focus-visible]:ring-(length:--ds-ring-width) has-[>[data-slot=field]]:has-[:focus-visible]:ring-ring/50 *:data-[slot=field]:p-4 dark:has-data-checked:border-primary/20 dark:has-data-checked:bg-primary/10",
104
+ "group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-(--ds-disabled-opacity) has-data-checked:border-(--ds-choice-card-border) has-data-checked:bg-(--ds-choice-card-bg) has-[>[data-slot=field]]:rounded-xl has-[>[data-slot=field]]:border has-[>[data-slot=field]]:not-has-[:disabled,[data-disabled]]:hover:bg-(--ds-field-bg-hover) has-[>[data-slot=field]]:has-[:focus-visible]:border-ring has-[>[data-slot=field]]:has-[:focus-visible]:ring-(length:--ds-ring-width) has-[>[data-slot=field]]:has-[:focus-visible]:ring-(--ds-ring-color) *:data-[slot=field]:p-4",
105
105
  "has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col",
106
106
  className
107
107
  ),
@@ -115,7 +115,7 @@ function FieldTitle({ className, ...props }) {
115
115
  {
116
116
  "data-slot": "field-label",
117
117
  className: cn(
118
- "flex w-fit items-center gap-2 text-sm font-medium group-data-[disabled=true]/field:opacity-50",
118
+ "flex w-fit items-center gap-2 text-sm font-medium group-data-[disabled=true]/field:opacity-(--ds-disabled-opacity)",
119
119
  className
120
120
  ),
121
121
  ...props
@@ -29,7 +29,7 @@ function HoverCardContent({
29
29
  {
30
30
  "data-slot": "hover-card-content",
31
31
  className: cn(
32
- "z-(--ds-z-overlay) w-72 origin-(--transform-origin) rounded-2xl bg-popover p-4 text-sm text-popover-foreground shadow-popover ring-1 ring-foreground/5 outline-hidden duration-(--ds-motion-fast) data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
32
+ "z-(--ds-z-overlay) w-(--ds-hover-card-w) origin-(--transform-origin) rounded-popover bg-popover p-(--ds-popover-p) text-sm text-popover-foreground shadow-popover ring-(length:--ds-layer-ring-w) ring-(--ds-layer-ring) outline-hidden duration-(--ds-motion-fast) data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
33
33
  className
34
34
  ),
35
35
  ...props
@@ -0,0 +1,11 @@
1
+ import * as React from 'react';
2
+ import { DsMessages } from '../lib/i18n.js';
3
+
4
+ declare function DsI18nProvider({ locale, messages, dir, children, }: {
5
+ locale?: string | null;
6
+ messages?: Partial<DsMessages>;
7
+ dir?: "ltr" | "rtl";
8
+ children: React.ReactNode;
9
+ }): React.JSX.Element;
10
+
11
+ export { DsI18nProvider };
@@ -0,0 +1,18 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { DirectionProvider } from "@base-ui/react/direction-provider";
5
+ import { DsMessagesContext } from "../hooks/use-ds-messages";
6
+ import { dsDirection, dsMessagesFor } from "../lib/i18n";
7
+ function DsI18nProvider({
8
+ locale,
9
+ messages,
10
+ dir,
11
+ children
12
+ }) {
13
+ const value = React.useMemo(() => dsMessagesFor(locale, messages), [locale, messages]);
14
+ return /* @__PURE__ */ jsx(DirectionProvider, { direction: dir ?? dsDirection(locale), children: /* @__PURE__ */ jsx(DsMessagesContext.Provider, { value, children }) });
15
+ }
16
+ export {
17
+ DsI18nProvider
18
+ };
@@ -3,7 +3,7 @@ import { VariantProps } from 'class-variance-authority';
3
3
  import * as React from 'react';
4
4
 
5
5
  declare const iconTileVariants: (props?: ({
6
- tone?: "neutral" | "primary" | "accent" | "success" | "warning" | "danger" | "info" | null | undefined;
6
+ tone?: "info" | "success" | "warning" | "danger" | "neutral" | "primary" | "accent" | null | undefined;
7
7
  size?: "sm" | "lg" | "md" | null | undefined;
8
8
  } & class_variance_authority_types.ClassProp) | undefined) => string;
9
9
  declare function IconTile({ className, tone, size, ...props }: React.ComponentProps<"div"> & VariantProps<typeof iconTileVariants>): React.JSX.Element;
@@ -10,7 +10,7 @@ declare const inputGroupAddonVariants: (props?: ({
10
10
  } & class_variance_authority_types.ClassProp) | undefined) => string;
11
11
  declare function InputGroupAddon({ className, align, ...props }: React.ComponentProps<"div"> & VariantProps<typeof inputGroupAddonVariants>): React.JSX.Element;
12
12
  declare const inputGroupButtonVariants: (props?: ({
13
- size?: "sm" | "xs" | "icon-xs" | "icon-sm" | null | undefined;
13
+ size?: "xs" | "sm" | "icon-xs" | "icon-sm" | null | undefined;
14
14
  } & class_variance_authority_types.ClassProp) | undefined) => string;
15
15
  declare function InputGroupButton({ className, type, variant, size, ...props }: Omit<React.ComponentProps<typeof Button>, "size" | "type"> & VariantProps<typeof inputGroupButtonVariants> & {
16
16
  type?: "button" | "submit" | "reset";
@@ -12,7 +12,7 @@ function InputGroup({ className, ...props }) {
12
12
  "data-slot": "input-group",
13
13
  role: "group",
14
14
  className: cn(
15
- "group/input-group relative flex h-9 w-full min-w-0 items-center rounded-control border border-input bg-input/30 transition-colors outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-data-[align=block-end]:rounded-2xl has-data-[align=block-start]:rounded-2xl has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-(length:--ds-ring-width) has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-(length:--ds-ring-width) has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[textarea]:rounded-xl has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5",
15
+ "group/input-group relative flex h-(--ds-control-h-md) w-full min-w-0 items-center rounded-control shadow-control border border-input bg-(--ds-field-bg) transition-colors duration-(--ds-motion-snap) outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-data-[align=block-end]:rounded-field-multiline has-data-[align=block-start]:rounded-field-multiline has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-(length:--ds-ring-width) has-[[data-slot=input-group-control]:focus-visible]:ring-(--ds-ring-color) has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-(length:--ds-ring-width) has-[[data-slot][aria-invalid=true]]:ring-(--ds-invalid-ring) has-[textarea]:rounded-field-multiline has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5",
16
16
  className
17
17
  ),
18
18
  ...props
@@ -20,14 +20,14 @@ function InputGroup({ className, ...props }) {
20
20
  );
21
21
  }
22
22
  const inputGroupAddonVariants = cva(
23
- "flex h-auto cursor-text items-center justify-center gap-2 py-2 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 **:data-[slot=kbd]:rounded-control **:data-[slot=kbd]:bg-muted-foreground/10 **:data-[slot=kbd]:px-1.5 [&>svg:not([class*='size-'])]:size-4",
23
+ "flex h-auto cursor-text items-center justify-center gap-2 py-2 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-(--ds-disabled-opacity) **:data-[slot=kbd]:rounded-control **:data-[slot=kbd]:bg-muted-foreground/10 **:data-[slot=kbd]:px-1.5 [&>svg:not([class*='size-'])]:size-4",
24
24
  {
25
25
  variants: {
26
26
  align: {
27
- "inline-start": "order-first pl-3 has-[>button]:-ml-1 has-[>kbd]:ml-[-0.15rem]",
28
- "inline-end": "order-last pr-3 has-[>button]:-mr-1 has-[>kbd]:mr-[-0.15rem]",
29
- "block-start": "order-first w-full justify-start px-3 pt-3 group-has-[>input]/input-group:pt-3 [.border-b]:pb-3",
30
- "block-end": "order-last w-full justify-start px-3 pb-3 group-has-[>input]/input-group:pb-3 [.border-t]:pt-3"
27
+ "inline-start": "order-first pl-(--ds-field-px) has-[>button]:-ml-1 has-[>kbd]:ml-[-0.15rem]",
28
+ "inline-end": "order-last pr-(--ds-field-px) has-[>button]:-mr-1 has-[>kbd]:mr-[-0.15rem]",
29
+ "block-start": "order-first w-full justify-start px-(--ds-field-px) pt-3 group-has-[>input]/input-group:pt-3 [.border-b]:pb-3",
30
+ "block-end": "order-last w-full justify-start px-(--ds-field-px) pb-3 group-has-[>input]/input-group:pb-3 [.border-t]:pt-3"
31
31
  }
32
32
  },
33
33
  defaultVariants: {
@@ -62,10 +62,10 @@ const inputGroupButtonVariants = cva(
62
62
  {
63
63
  variants: {
64
64
  size: {
65
- xs: "h-6 gap-1 px-1.5 [&>svg:not([class*='size-'])]:size-3.5",
65
+ xs: "h-(--ds-control-h-xs) gap-1 px-1.5 [&>svg:not([class*='size-'])]:size-3.5",
66
66
  sm: "",
67
- "icon-xs": "size-6 p-0 has-[>svg]:p-0",
68
- "icon-sm": "size-8 p-0 has-[>svg]:p-0"
67
+ "icon-xs": "size-(--ds-control-h-xs) p-0 has-[>svg]:p-0",
68
+ "icon-sm": "size-(--ds-control-h-sm) p-0 has-[>svg]:p-0"
69
69
  }
70
70
  },
71
71
  defaultVariants: {
@@ -84,6 +84,7 @@ function InputGroupButton({
84
84
  Button,
85
85
  {
86
86
  type,
87
+ "data-slot": "input-group-button",
87
88
  "data-size": size,
88
89
  variant,
89
90
  className: cn(inputGroupButtonVariants({ size }), className),
@@ -95,6 +96,7 @@ function InputGroupText({ className, ...props }) {
95
96
  return /* @__PURE__ */ jsx(
96
97
  "span",
97
98
  {
99
+ "data-slot": "input-group-text",
98
100
  className: cn(
99
101
  "flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4",
100
102
  className
@@ -13,7 +13,7 @@ function InputOTP({
13
13
  {
14
14
  "data-slot": "input-otp",
15
15
  containerClassName: cn(
16
- "cn-input-otp flex items-center has-disabled:opacity-50",
16
+ "cn-input-otp flex items-center has-disabled:opacity-(--ds-disabled-opacity)",
17
17
  containerClassName
18
18
  ),
19
19
  spellCheck: false,
@@ -28,7 +28,7 @@ function InputOTPGroup({ className, ...props }) {
28
28
  {
29
29
  "data-slot": "input-otp-group",
30
30
  className: cn(
31
- "flex items-center rounded-control has-aria-invalid:border-destructive has-aria-invalid:ring-(length:--ds-ring-width) has-aria-invalid:ring-destructive/20 dark:has-aria-invalid:ring-destructive/40",
31
+ "flex items-center rounded-control shadow-control has-aria-invalid:border-(--ds-invalid-border) has-aria-invalid:ring-(length:--ds-ring-width) has-aria-invalid:ring-(--ds-invalid-ring)",
32
32
  className
33
33
  ),
34
34
  ...props
@@ -48,7 +48,7 @@ function InputOTPSlot({
48
48
  "data-slot": "input-otp-slot",
49
49
  "data-active": isActive,
50
50
  className: cn(
51
- "relative flex size-9 items-center justify-center border-y border-r border-input bg-input/30 text-sm transition-all outline-none first:rounded-l-4xl first:border-l last:rounded-r-4xl aria-invalid:border-destructive data-[active=true]:z-(--ds-z-raised) data-[active=true]:border-ring data-[active=true]:ring-(length:--ds-ring-width) data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:border-destructive data-[active=true]:aria-invalid:ring-destructive/20 dark:data-[active=true]:aria-invalid:ring-destructive/40",
51
+ "relative flex size-(--ds-control-h-md) items-center justify-center border-y border-r border-input bg-(--ds-field-bg) text-sm transition-all duration-(--ds-motion-snap) outline-none first:rounded-l-control first:border-l last:rounded-r-control aria-invalid:border-(--ds-invalid-border) data-[active=true]:z-(--ds-z-raised) data-[active=true]:border-ring data-[active=true]:ring-(length:--ds-ring-width) data-[active=true]:ring-(--ds-ring-color) data-[active=true]:aria-invalid:border-(--ds-invalid-border) data-[active=true]:aria-invalid:ring-(--ds-invalid-ring)",
52
52
  className
53
53
  ),
54
54
  ...props,
package/dist/ui/input.js CHANGED
@@ -7,7 +7,7 @@ function Input({ className, type, ...props }) {
7
7
  type,
8
8
  "data-slot": "input",
9
9
  className: cn(
10
- "h-(--ds-control-h-md) w-full min-w-0 rounded-control shadow-control border border-input bg-input/30 px-(--ds-field-px) py-1 text-base transition-colors outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-(length:--ds-ring-width) focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-(length:--ds-ring-width) aria-invalid:ring-destructive/20 md:text-sm dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
10
+ "h-(--ds-control-h-md) w-full min-w-0 rounded-control shadow-control border border-input bg-(--ds-field-bg) px-(--ds-field-px) py-1 text-base transition-colors duration-(--ds-motion-snap) outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-(length:--ds-ring-width) focus-visible:ring-(--ds-ring-color) disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-(--ds-disabled-opacity) aria-invalid:border-(--ds-invalid-border) aria-invalid:ring-(length:--ds-ring-width) aria-invalid:ring-(--ds-invalid-ring) md:text-sm",
11
11
  className
12
12
  ),
13
13
  ...props
package/dist/ui/item.d.ts CHANGED
@@ -9,7 +9,7 @@ declare function ItemGroup({ className, ...props }: React.ComponentProps<"div">)
9
9
  declare function ItemSeparator({ className, ...props }: React.ComponentProps<typeof Separator>): React.JSX.Element;
10
10
  declare const itemVariants: (props?: ({
11
11
  variant?: "default" | "outline" | "muted" | null | undefined;
12
- size?: "default" | "sm" | "xs" | null | undefined;
12
+ size?: "default" | "xs" | "sm" | null | undefined;
13
13
  } & class_variance_authority_types.ClassProp) | undefined) => string;
14
14
  declare function Item({ className, variant, size, render, ...props }: useRender.ComponentProps<"div"> & VariantProps<typeof itemVariants>): React.ReactElement<unknown, string | React.JSXElementConstructor<any>>;
15
15
  declare const itemMediaVariants: (props?: ({
package/dist/ui/item.js CHANGED
@@ -33,16 +33,16 @@ function ItemSeparator({
33
33
  );
34
34
  }
35
35
  const itemVariants = cva(
36
- "group/item flex w-full flex-wrap items-center rounded-2xl border text-sm transition-colors duration-(--ds-motion-fast) outline-none focus-visible:border-ring focus-visible:ring-(length:--ds-ring-width) focus-visible:ring-ring/50 [a]:transition-colors [a]:hover:bg-muted",
36
+ "group/item flex w-full flex-wrap items-center rounded-panel border text-sm transition-colors duration-(--ds-motion-fast) outline-none focus-visible:border-ring focus-visible:ring-(length:--ds-ring-width) focus-visible:ring-(--ds-ring-color) [a]:transition-colors [a]:hover:bg-muted",
37
37
  {
38
38
  variants: {
39
39
  variant: {
40
40
  default: "border-transparent",
41
41
  outline: "border-border",
42
- muted: "border-transparent bg-muted/50"
42
+ muted: "border-transparent bg-(--ds-row-hover)"
43
43
  },
44
44
  size: {
45
- default: "gap-3.5 px-4 py-3.5",
45
+ default: "gap-3.5 px-(--ds-item-px) py-(--ds-item-py)",
46
46
  sm: "gap-3.5 px-3.5 py-3",
47
47
  xs: "gap-2.5 px-3 py-2.5 in-data-[slot=dropdown-menu-content]:p-0"
48
48
  }
package/dist/ui/kbd.js CHANGED
@@ -6,7 +6,7 @@ function Kbd({ className, ...props }) {
6
6
  {
7
7
  "data-slot": "kbd",
8
8
  className: cn(
9
- "pointer-events-none inline-flex h-5 w-fit min-w-5 items-center justify-center gap-1 rounded-sm bg-muted px-1 font-sans text-xs font-medium text-muted-foreground select-none in-data-[slot=tooltip-content]:bg-background/20 in-data-[slot=tooltip-content]:text-background dark:in-data-[slot=tooltip-content]:bg-background/10 [&_svg:not([class*='size-'])]:size-3",
9
+ "pointer-events-none inline-flex h-(--ds-kbd-h) w-fit min-w-(--ds-kbd-h) items-center justify-center gap-1 rounded-sm bg-muted px-1 font-sans text-xs font-medium text-muted-foreground select-none in-data-[slot=tooltip-content]:bg-background/20 in-data-[slot=tooltip-content]:text-background dark:in-data-[slot=tooltip-content]:bg-background/10 [&_svg:not([class*='size-'])]:size-3",
10
10
  className
11
11
  ),
12
12
  ...props
package/dist/ui/label.js CHANGED
@@ -7,7 +7,7 @@ function Label({ className, ...props }) {
7
7
  {
8
8
  "data-slot": "label",
9
9
  className: cn(
10
- "flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
10
+ "flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-(--ds-disabled-opacity) peer-disabled:cursor-not-allowed peer-disabled:opacity-(--ds-disabled-opacity)",
11
11
  className
12
12
  ),
13
13
  ...props
@@ -4,7 +4,7 @@ import { useRender } from '@base-ui/react/use-render';
4
4
  import { VariantProps } from 'class-variance-authority';
5
5
 
6
6
  declare const markerVariants: (props?: ({
7
- variant?: "default" | "separator" | "border" | null | undefined;
7
+ variant?: "separator" | "default" | "border" | null | undefined;
8
8
  } & class_variance_authority_types.ClassProp) | undefined) => string;
9
9
  declare function Marker({ className, variant, render, ...props }: useRender.ComponentProps<"div"> & VariantProps<typeof markerVariants>): React.ReactElement<unknown, string | React.JSXElementConstructor<any>>;
10
10
  declare function MarkerIcon({ className, ...props }: React.ComponentProps<"span">): React.JSX.Element;
package/dist/ui/marker.js CHANGED
@@ -9,8 +9,8 @@ const markerVariants = cva(
9
9
  variants: {
10
10
  variant: {
11
11
  default: "",
12
- separator: "before:mr-1 before:h-px before:min-w-0 before:flex-1 before:bg-border after:ml-1 after:h-px after:min-w-0 after:flex-1 after:bg-border",
13
- border: "border-b border-border pb-2"
12
+ separator: "before:mr-1 before:h-(--ds-rule-w) before:min-w-0 before:flex-1 before:bg-border after:ml-1 after:h-(--ds-rule-w) after:min-w-0 after:flex-1 after:bg-border",
13
+ border: "border-b-(length:--ds-rule-w) border-border pb-2"
14
14
  }
15
15
  }
16
16
  }
@@ -24,7 +24,7 @@ function Menubar({ className, ...props }) {
24
24
  MenubarPrimitive,
25
25
  {
26
26
  "data-slot": "menubar",
27
- className: cn("flex h-9 items-center rounded-control border p-1", className),
27
+ className: cn("flex h-(--ds-control-h-md) items-center rounded-control border p-1", className),
28
28
  ...props
29
29
  }
30
30
  );
@@ -51,7 +51,7 @@ function MenubarTrigger({
51
51
  {
52
52
  "data-slot": "menubar-trigger",
53
53
  className: cn(
54
- "flex items-center rounded-xl px-2 py-0.75 text-sm font-medium outline-hidden select-none hover:bg-muted aria-expanded:bg-muted",
54
+ "flex items-center rounded-item px-2 py-0.75 text-sm font-medium outline-hidden select-none hover:bg-muted aria-expanded:bg-muted",
55
55
  className
56
56
  ),
57
57
  ...props
@@ -72,7 +72,7 @@ function MenubarContent({
72
72
  align,
73
73
  alignOffset,
74
74
  sideOffset,
75
- className: cn("min-w-48 rounded-2xl bg-popover p-1 text-popover-foreground shadow-popover ring-1 ring-foreground/5 duration-(--ds-motion-fast) data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95", className),
75
+ className: cn("min-w-48 rounded-popover bg-popover p-(--ds-menu-p) text-popover-foreground shadow-popover ring-(length:--ds-layer-ring-w) ring-(--ds-layer-ring) duration-(--ds-motion-fast) data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95", className),
76
76
  ...props
77
77
  }
78
78
  );
@@ -90,7 +90,7 @@ function MenubarItem({
90
90
  "data-inset": inset,
91
91
  "data-variant": variant,
92
92
  className: cn(
93
- "group/menubar-item gap-2.5 rounded-xl px-3 py-2 text-sm focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-9.5 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:opacity-50 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive!",
93
+ "group/menubar-item gap-2.5 rounded-item px-(--ds-menu-item-px) py-(--ds-menu-item-py) text-sm focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-9.5 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:opacity-(--ds-disabled-opacity) [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive!",
94
94
  className
95
95
  ),
96
96
  ...props
@@ -110,7 +110,7 @@ function MenubarCheckboxItem({
110
110
  "data-slot": "menubar-checkbox-item",
111
111
  "data-inset": inset,
112
112
  className: cn(
113
- "relative flex cursor-default items-center gap-2.5 rounded-xl py-2 pr-3 pl-9.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-9.5 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0",
113
+ "relative flex cursor-default items-center gap-2.5 rounded-item py-(--ds-menu-item-py) pr-(--ds-menu-item-px) pl-9.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-9.5 data-disabled:pointer-events-none data-disabled:opacity-(--ds-disabled-opacity) [&_svg]:pointer-events-none [&_svg]:shrink-0",
114
114
  className
115
115
  ),
116
116
  checked,
@@ -142,7 +142,7 @@ function MenubarRadioItem({
142
142
  "data-slot": "menubar-radio-item",
143
143
  "data-inset": inset,
144
144
  className: cn(
145
- "relative flex cursor-default items-center gap-2.5 rounded-xl py-2 pr-3 pl-9.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-9.5 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
145
+ "relative flex cursor-default items-center gap-2.5 rounded-item py-(--ds-menu-item-py) pr-(--ds-menu-item-px) pl-9.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-9.5 data-disabled:pointer-events-none data-disabled:opacity-(--ds-disabled-opacity) [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
146
146
  className
147
147
  ),
148
148
  ...props,
@@ -182,7 +182,7 @@ function MenubarSeparator({
182
182
  DropdownMenuSeparator,
183
183
  {
184
184
  "data-slot": "menubar-separator",
185
- className: cn("-mx-1 my-1 h-px bg-border/50", className),
185
+ className: cn("-mx-1 my-1 h-px bg-(--ds-separator)", className),
186
186
  ...props
187
187
  }
188
188
  );
@@ -219,7 +219,7 @@ function MenubarSubTrigger({
219
219
  "data-slot": "menubar-sub-trigger",
220
220
  "data-inset": inset,
221
221
  className: cn(
222
- "gap-2 rounded-xl px-3 py-2 text-sm focus:bg-accent focus:text-accent-foreground data-inset:pl-9.5 data-open:bg-accent data-open:text-accent-foreground [&_svg:not([class*='size-'])]:size-4",
222
+ "gap-2 rounded-item px-(--ds-menu-item-px) py-(--ds-menu-item-py) text-sm focus:bg-accent focus:text-accent-foreground data-inset:pl-9.5 data-open:bg-accent data-open:text-accent-foreground [&_svg:not([class*='size-'])]:size-4",
223
223
  className
224
224
  ),
225
225
  ...props
@@ -234,7 +234,7 @@ function MenubarSubContent({
234
234
  DropdownMenuSubContent,
235
235
  {
236
236
  "data-slot": "menubar-sub-content",
237
- className: cn("min-w-32 rounded-2xl bg-popover p-1 text-popover-foreground shadow-popover ring-1 ring-foreground/5 duration-(--ds-motion-fast) data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className),
237
+ className: cn("min-w-32 rounded-popover bg-popover p-(--ds-menu-p) text-popover-foreground shadow-popover ring-(length:--ds-layer-ring-w) ring-(--ds-layer-ring) duration-(--ds-motion-fast) data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className),
238
238
  ...props
239
239
  }
240
240
  );
@@ -1,3 +1,4 @@
1
+ "use client";
1
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
3
  import {
3
4
  MessageScroller as MessageScrollerPrimitive,
@@ -8,6 +9,7 @@ import {
8
9
  import { cn } from "../lib/utils";
9
10
  import { Button } from "./button";
10
11
  import { ArrowDownIcon } from "lucide-react";
12
+ import { useDsMessages } from "../hooks/use-ds-messages";
11
13
  function MessageScrollerProvider(props) {
12
14
  return /* @__PURE__ */ jsx(MessageScrollerPrimitive.Provider, { ...props });
13
15
  }
@@ -83,6 +85,7 @@ function MessageScrollerButton({
83
85
  size = "icon-sm",
84
86
  ...props
85
87
  }) {
88
+ const t = useDsMessages();
86
89
  return /* @__PURE__ */ jsx(
87
90
  MessageScrollerPrimitive.Button,
88
91
  {
@@ -92,7 +95,7 @@ function MessageScrollerButton({
92
95
  "data-size": size,
93
96
  direction,
94
97
  className: cn(
95
- "absolute inset-s-1/2 -translate-x-1/2 border-border bg-background text-foreground transition-[translate,scale,opacity] duration-(--ds-motion-base) hover:bg-muted hover:text-foreground data-[active=false]:pointer-events-none data-[active=false]:scale-95 data-[active=false]:opacity-0 data-[active=false]:duration-(--ds-motion-slow) data-[active=false]:ease-[cubic-bezier(0.7,0,0.84,0)] data-[active=true]:translate-y-0 data-[active=true]:scale-100 data-[active=true]:opacity-100 data-[active=true]:ease-[cubic-bezier(0.23,1,0.32,1)] data-[direction=end]:bottom-4 data-[direction=end]:data-[active=false]:translate-y-full data-[direction=start]:top-4 data-[direction=start]:data-[active=false]:-translate-y-full rtl:translate-x-1/2 data-[direction=start]:[&_svg]:rotate-180",
98
+ "absolute inset-s-1/2 -translate-x-1/2 border-border bg-background text-foreground transition-[translate,scale,opacity] duration-(--ds-motion-base) hover:bg-muted hover:text-foreground data-[active=false]:pointer-events-none data-[active=false]:scale-95 data-[active=false]:opacity-0 data-[active=false]:duration-(--ds-motion-slow) data-[active=false]:ease-(--ds-ease-exit) data-[active=true]:translate-y-0 data-[active=true]:scale-100 data-[active=true]:opacity-100 data-[active=true]:ease-(--ds-ease-enter) data-[direction=end]:bottom-4 data-[direction=end]:data-[active=false]:translate-y-full data-[direction=start]:top-4 data-[direction=start]:data-[active=false]:-translate-y-full rtl:translate-x-1/2 data-[direction=start]:[&_svg]:rotate-180",
96
99
  className
97
100
  ),
98
101
  render: render ?? /* @__PURE__ */ jsx(Button, { variant, size }),
@@ -102,7 +105,7 @@ function MessageScrollerButton({
102
105
  ArrowDownIcon,
103
106
  {}
104
107
  ),
105
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: direction === "end" ? "Scroll to end" : "Scroll to start" })
108
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: direction === "end" ? t.scrollToEnd : t.scrollToStart })
106
109
  ] })
107
110
  }
108
111
  );
@@ -60,7 +60,7 @@ function MessageHeader({ className, ...props }) {
60
60
  {
61
61
  "data-slot": "message-header",
62
62
  className: cn(
63
- "flex max-w-full min-w-0 items-center px-3.5 text-xs font-medium text-muted-foreground group-has-data-[variant=ghost]/message:px-0",
63
+ "flex max-w-full min-w-0 items-center px-(--ds-bubble-px) text-xs font-medium text-muted-foreground group-has-data-[variant=ghost]/message:px-0",
64
64
  className
65
65
  ),
66
66
  ...props
@@ -73,7 +73,7 @@ function MessageFooter({ className, ...props }) {
73
73
  {
74
74
  "data-slot": "message-footer",
75
75
  className: cn(
76
- "flex max-w-full min-w-0 items-center px-3.5 text-xs font-medium text-muted-foreground group-has-data-[variant=ghost]/message:px-0 group-data-[align=end]/message:justify-end",
76
+ "flex max-w-full min-w-0 items-center px-(--ds-bubble-px) text-xs font-medium text-muted-foreground group-has-data-[variant=ghost]/message:px-0 group-data-[align=end]/message:justify-end",
77
77
  className
78
78
  ),
79
79
  ...props
@@ -0,0 +1,11 @@
1
+ import * as React from 'react';
2
+ import { DsDuration, DsEase } from '../lib/motion.js';
3
+
4
+ declare function DsMotionProvider({ children, duration, ease, reducedMotion, }: {
5
+ children: React.ReactNode;
6
+ duration?: DsDuration;
7
+ ease?: DsEase;
8
+ reducedMotion?: "user" | "always" | "never";
9
+ }): React.JSX.Element;
10
+
11
+ export { DsMotionProvider };
@@ -0,0 +1,16 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { MotionConfig } from "motion/react";
4
+ import { useDsTransition } from "../hooks/use-ds-motion";
5
+ function DsMotionProvider({
6
+ children,
7
+ duration = "base",
8
+ ease = "standard",
9
+ reducedMotion = "user"
10
+ }) {
11
+ const { duration: d, ease: e } = useDsTransition(duration, ease);
12
+ return /* @__PURE__ */ jsx(MotionConfig, { transition: { duration: d, ease: e }, reducedMotion, children });
13
+ }
14
+ export {
15
+ DsMotionProvider
16
+ };
@@ -10,7 +10,7 @@ function NativeSelect({
10
10
  "div",
11
11
  {
12
12
  className: cn(
13
- "group/native-select relative w-fit has-[select:disabled]:opacity-50",
13
+ "group/native-select relative w-fit has-[select:disabled]:opacity-(--ds-disabled-opacity)",
14
14
  className
15
15
  ),
16
16
  "data-slot": "native-select-wrapper",
@@ -21,7 +21,7 @@ function NativeSelect({
21
21
  {
22
22
  "data-slot": "native-select",
23
23
  "data-size": size,
24
- className: "h-9 w-full min-w-0 appearance-none rounded-control border border-input bg-input/30 py-1 pr-8 pl-3 text-sm transition-colors outline-none select-none selection:bg-primary selection:text-primary-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-(length:--ds-ring-width) focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed aria-invalid:border-destructive aria-invalid:ring-(length:--ds-ring-width) aria-invalid:ring-destructive/20 data-[size=sm]:h-8 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
24
+ className: "h-(--ds-control-h-md) w-full min-w-0 appearance-none rounded-control shadow-control border border-input bg-(--ds-field-bg) py-1 pr-8 pl-(--ds-field-px) text-sm transition-colors duration-(--ds-motion-snap) outline-none select-none selection:bg-primary selection:text-primary-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-(length:--ds-ring-width) focus-visible:ring-(--ds-ring-color) disabled:pointer-events-none disabled:cursor-not-allowed aria-invalid:border-(--ds-invalid-border) aria-invalid:ring-(length:--ds-ring-width) aria-invalid:ring-(--ds-invalid-ring) data-[size=sm]:h-(--ds-control-h-sm) dark:hover:bg-(--ds-field-bg-hover)",
25
25
  ...props
26
26
  }
27
27
  ),
@@ -38,7 +38,7 @@ function NativeSelectOption({
38
38
  "option",
39
39
  {
40
40
  "data-slot": "native-select-option",
41
- className: cn("bg-[Canvas] text-[CanvasText]", className),
41
+ className: cn("bg-popover text-popover-foreground", className),
42
42
  ...props
43
43
  }
44
44
  );
@@ -51,7 +51,7 @@ function NativeSelectOptGroup({
51
51
  "optgroup",
52
52
  {
53
53
  "data-slot": "native-select-optgroup",
54
- className: cn("bg-[Canvas] text-[CanvasText]", className),
54
+ className: cn("bg-popover text-popover-foreground", className),
55
55
  ...props
56
56
  }
57
57
  );