@ctrl-ui/react 0.8.11 → 0.8.13

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 (80) hide show
  1. package/dist/action-bar.js +2 -2
  2. package/dist/activity.js +1 -1
  3. package/dist/blocks/design-canvas-inspector.js +2 -2
  4. package/dist/blocks/design-canvas.js +2 -2
  5. package/dist/blocks/discussion.js +1 -1
  6. package/dist/blocks/file-explorer.js +2 -2
  7. package/dist/blocks/settings.js +3 -3
  8. package/dist/chat-composer-editor/extensions/mention.js +1 -1
  9. package/dist/chat-composer.js +1 -1
  10. package/dist/chat-layout.js +1 -1
  11. package/dist/context.js +1 -1
  12. package/dist/dynamic-notification.js +1 -1
  13. package/dist/email/theme.js +1 -1
  14. package/dist/filter-bar/parts.js +1 -1
  15. package/dist/filter-bar.js +1 -1
  16. package/dist/inline-citation.js +1 -1
  17. package/dist/knob-contracts/tabs-knobs.d.ts +1 -1
  18. package/dist/knob-contracts/tabs-knobs.js +2 -0
  19. package/dist/lib/phone-input-format.js +1 -1
  20. package/dist/styles/index.css +1 -0
  21. package/dist/styles/recipes/badge.css +1 -0
  22. package/dist/styles/recipes/button.css +21 -4
  23. package/dist/styles/recipes/code.css +0 -15
  24. package/dist/styles/recipes/field.css +15 -2
  25. package/dist/styles/recipes/resizable.css +0 -26
  26. package/dist/styles/recipes/scroll-area.css +6 -6
  27. package/dist/styles/recipes/sidebar-menu.css +22 -8
  28. package/dist/styles/recipes/sidebar-parts.css +11 -7
  29. package/dist/styles/recipes/sidebar.css +1 -1
  30. package/dist/styles/recipes/tabs-motion.css +99 -0
  31. package/dist/styles/recipes/tabs.css +36 -108
  32. package/dist/ui/alert-dialog.js +1 -1
  33. package/dist/ui/alert.js +1 -1
  34. package/dist/ui/autocomplete.js +1 -1
  35. package/dist/ui/breadcrumb.js +1 -1
  36. package/dist/ui/button.d.ts +6 -3
  37. package/dist/ui/button.js +10 -6
  38. package/dist/ui/card.js +1 -1
  39. package/dist/ui/code-diff.js +1 -1
  40. package/dist/ui/code.js +2 -2
  41. package/dist/ui/collapsible.js +1 -1
  42. package/dist/ui/color-picker.js +1 -1
  43. package/dist/ui/combobox.js +1 -1
  44. package/dist/ui/context-menu.js +1 -1
  45. package/dist/ui/dialog.js +1 -1
  46. package/dist/ui/drawer.js +1 -1
  47. package/dist/ui/dropdown-menu.js +1 -1
  48. package/dist/ui/emoji-icon-picker.js +1 -1
  49. package/dist/ui/emoji-picker.js +1 -1
  50. package/dist/ui/empty.js +1 -1
  51. package/dist/ui/hover-card.js +1 -1
  52. package/dist/ui/icon-picker.js +1 -1
  53. package/dist/ui/input-group.js +1 -1
  54. package/dist/ui/item.js +1 -1
  55. package/dist/ui/menubar.js +1 -1
  56. package/dist/ui/morphing-panel.js +1 -1
  57. package/dist/ui/navigation-menu.js +1 -1
  58. package/dist/ui/phone-input.js +2 -2
  59. package/dist/ui/popover.js +1 -1
  60. package/dist/ui/resizable.js +34 -1
  61. package/dist/ui/rich-tooltip.js +1 -1
  62. package/dist/ui/select.js +1 -1
  63. package/dist/ui/sheet.js +1 -1
  64. package/dist/ui/sidebar-menu.js +4 -3
  65. package/dist/ui/sidebar-provider.js +2 -2
  66. package/dist/ui/sidebar-resize-rail.js +1 -1
  67. package/dist/ui/sidebar.js +1 -1
  68. package/dist/ui/tabs.d.ts +4 -0
  69. package/dist/ui/tabs.js +11 -1
  70. package/dist/ui/timeline.js +1 -1
  71. package/dist/ui/toast.js +1 -1
  72. package/dist/ui/toggle.d.ts +1 -1
  73. package/dist/ui/toggle.js +2 -1
  74. package/dist/ui/toolbar.d.ts +1 -1
  75. package/dist/ui/toolbar.js +1 -1
  76. package/dist/ui/tooltip.js +1 -1
  77. package/dist/ui/tree.js +1 -1
  78. package/dist/ui/trigger-menu.js +1 -1
  79. package/dist/user-ask.js +2 -2
  80. package/package.json +1 -1
@@ -1,11 +1,11 @@
1
1
  "use client";
2
+ import { useCopyToClipboard } from "./hooks/use-copy-to-clipboard.js";
2
3
  import { cn } from "./lib/cn.js";
3
4
  import { Button } from "./ui/button.js";
4
5
  import { LiveStatus } from "./ui/live-status.js";
5
- import { useCopyToClipboard } from "./hooks/use-copy-to-clipboard.js";
6
+ import { Toolbar } from "@base-ui/react/toolbar";
6
7
  import { createContext, useContext } from "react";
7
8
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
8
- import { Toolbar } from "@base-ui/react/toolbar";
9
9
  //#region src/action-bar.tsx
10
10
  const ActionBarContext = createContext({});
11
11
  async function resolveCopyValue(value) {
package/dist/activity.js CHANGED
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { cn } from "./lib/cn.js";
3
3
  import { LiveStatus } from "./ui/live-status.js";
4
- import { ScrollArea } from "./ui/scroll-area.js";
5
4
  import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "./ui/collapsible.js";
5
+ import { ScrollArea } from "./ui/scroll-area.js";
6
6
  import { createContext, useContext } from "react";
7
7
  import { jsx, jsxs } from "react/jsx-runtime";
8
8
  import { Check, ChevronRight, CircleAlert, CircleDashed, LoaderCircle } from "lucide-react";
@@ -1,11 +1,11 @@
1
1
  "use client";
2
2
  import { Button } from "../ui/button.js";
3
3
  import { InputGroup, InputGroupAddon } from "../ui/input-group.js";
4
- import { Empty, EmptyDescription, EmptyHeader, EmptyTitle } from "../ui/empty.js";
5
- import { Separator } from "../ui/separator.js";
6
4
  import { resizeDesignCanvasLayer } from "./design-canvas-data.js";
7
5
  import { NumberField, NumberFieldGroup, NumberFieldInput, NumberFieldScrubArea } from "../ui/number-field.js";
8
6
  import { ColorPicker, ColorPickerArea, ColorPickerContent, ColorPickerEyeDropper, ColorPickerHue, ColorPickerInput, ColorPickerTrigger } from "../ui/color-picker.js";
7
+ import { Empty, EmptyDescription, EmptyHeader, EmptyTitle } from "../ui/empty.js";
8
+ import { Separator } from "../ui/separator.js";
9
9
  import { Toggle } from "../ui/toggle.js";
10
10
  import { useState } from "react";
11
11
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
@@ -3,12 +3,12 @@ import { cn } from "../lib/cn.js";
3
3
  import { Button } from "../ui/button.js";
4
4
  import { ScrollArea } from "../ui/scroll-area.js";
5
5
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "../ui/tooltip.js";
6
+ import { createDesignCanvasLayer, designCanvasFillColor, drawnDesignCanvasBounds } from "./design-canvas-data.js";
7
+ import { DesignCanvasInspector } from "./design-canvas-inspector.js";
6
8
  import { Drawer, DrawerContent, DrawerTitle } from "../ui/drawer.js";
7
9
  import { InfiniteCanvas, InfiniteCanvasContent, InfiniteCanvasControls, InfiniteCanvasItem } from "../ui/infinite-canvas.js";
8
10
  import { ResizableFloatingPanel } from "../ui/resizable.js";
9
11
  import { Toolbar, ToolbarButton, ToolbarGroup, ToolbarSeparator } from "../ui/toolbar.js";
10
- import { createDesignCanvasLayer, designCanvasFillColor, drawnDesignCanvasBounds } from "./design-canvas-data.js";
11
- import { DesignCanvasInspector } from "./design-canvas-inspector.js";
12
12
  import { useRef, useState } from "react";
13
13
  import { jsx, jsxs } from "react/jsx-runtime";
14
14
  import { CircleIcon, FrameIcon, LayersIcon, MousePointer2Icon, SlidersHorizontalIcon, SquareIcon, TypeIcon } from "lucide-react";
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  import { Button } from "../ui/button.js";
3
- import { Kbd, KbdGroup } from "../ui/kbd.js";
4
3
  import { ChatComposer, ChatComposerShell, ChatComposerSubmit, ChatComposerTextarea, ChatComposerToolbar } from "../chat-composer.js";
5
4
  import { ChatMessageReplies } from "../chat-message/social.js";
6
5
  import { ChatMessage, ChatMessageActions, ChatMessageAuthor, ChatMessageAvatar, ChatMessageBody, ChatMessageContent, ChatMessageFooter, ChatMessageHeader, ChatMessageRow, ChatMessageTime } from "../chat-message.js";
6
+ import { Kbd, KbdGroup } from "../ui/kbd.js";
7
7
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
8
  import { CornerDownRightIcon } from "lucide-react";
9
9
  //#region src/blocks/discussion.tsx
@@ -5,15 +5,15 @@ import { LiveStatus } from "../ui/live-status.js";
5
5
  import { ScrollArea } from "../ui/scroll-area.js";
6
6
  import { InputGroup, InputGroupAddon } from "../ui/input-group.js";
7
7
  import { Input } from "../ui/input.js";
8
- import { Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle } from "../ui/empty.js";
9
8
  import { SidebarProvider, useSidebar } from "../ui/sidebar-provider.js";
10
9
  import { SidebarGroup, SidebarGroupLabel, SidebarMenu, SidebarMenuButton, SidebarMenuItem } from "../ui/sidebar-menu.js";
11
10
  import { Sidebar, SidebarContent, SidebarFooter, SidebarHeader, SidebarInset, SidebarRail, SidebarTrigger } from "../ui/sidebar.js";
11
+ import { Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle } from "../ui/empty.js";
12
12
  import { Drawer, DrawerBody, DrawerContent, DrawerTitle, DrawerTrigger } from "../ui/drawer.js";
13
13
  import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from "../ui/resizable.js";
14
14
  import { groupFileExplorerItems, orderFileExplorerEntries, resolveFileExplorer, searchFileExplorer } from "./file-explorer-data.js";
15
- import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from "../ui/dropdown-menu.js";
16
15
  import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator } from "../ui/breadcrumb.js";
16
+ import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from "../ui/dropdown-menu.js";
17
17
  import { Fragment, useEffect, useId, useRef, useState } from "react";
18
18
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
19
19
  import { ChevronLeftIcon, ChevronRightIcon, FileIcon, FolderIcon, MoreHorizontalIcon, SearchIcon, XIcon } from "lucide-react";
@@ -2,16 +2,16 @@
2
2
  import { cn } from "../lib/cn.js";
3
3
  import { Button } from "../ui/button.js";
4
4
  import { LiveStatus } from "../ui/live-status.js";
5
- import { prefersReducedMotion } from "../lib/motion.js";
6
5
  import { ScrollArea } from "../ui/scroll-area.js";
6
+ import { prefersReducedMotion } from "../lib/motion.js";
7
7
  import { InputGroup, InputGroupAddon } from "../ui/input-group.js";
8
8
  import { Input } from "../ui/input.js";
9
- import { Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle } from "../ui/empty.js";
10
- import { Field, FieldContent, FieldDescription, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet } from "../ui/field.js";
11
9
  import { SidebarProvider, useSidebar } from "../ui/sidebar-provider.js";
12
10
  import { SidebarGroup, SidebarGroupLabel, SidebarMenu, SidebarMenuButton, SidebarMenuItem } from "../ui/sidebar-menu.js";
13
11
  import { Sidebar, SidebarContent, SidebarHeader, SidebarInset, SidebarTrigger } from "../ui/sidebar.js";
12
+ import { Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle } from "../ui/empty.js";
14
13
  import { searchSettings } from "./settings-data.js";
14
+ import { Field, FieldContent, FieldDescription, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet } from "../ui/field.js";
15
15
  import { useEffect, useId, useState } from "react";
16
16
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
17
17
  import { ArrowLeftIcon, SearchIcon, XIcon } from "lucide-react";
@@ -2,8 +2,8 @@
2
2
  import { LiveStatus } from "../../ui/live-status.js";
3
3
  import { isComposingKey, useTriggerMenu } from "../../hooks/use-trigger-menu.js";
4
4
  import { spawnExitGhost } from "../ghost.js";
5
- import { TriggerMenu, TriggerMenuEmpty, TriggerMenuIcon, TriggerMenuItem, TriggerMenuList } from "../../ui/trigger-menu.js";
6
5
  import { detectTrigger } from "../../lib/trigger-detect.js";
6
+ import { TriggerMenu, TriggerMenuEmpty, TriggerMenuIcon, TriggerMenuItem, TriggerMenuList } from "../../ui/trigger-menu.js";
7
7
  import { useEffect } from "react";
8
8
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
9
9
  //#region src/chat-composer-editor/extensions/mention.tsx
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { hasSkinAdornment, skinAdornment } from "./skin.js";
3
2
  import { cn } from "./lib/cn.js";
3
+ import { hasSkinAdornment, skinAdornment } from "./skin.js";
4
4
  import { useSkin } from "./skin-provider.js";
5
5
  import { Button } from "./ui/button.js";
6
6
  import { Spinner } from "./ui/spinner.js";
@@ -7,9 +7,9 @@ import { ScrollArea } from "./ui/scroll-area.js";
7
7
  import { ChatThreadAnnounceContext } from "./hooks/use-chat-message.js";
8
8
  import { useChatThreadScroll } from "./hooks/use-chat-thread-scroll.js";
9
9
  import { createContext, useContext, useState } from "react";
10
+ import { useRender } from "@base-ui/react/use-render";
10
11
  import { jsx, jsxs } from "react/jsx-runtime";
11
12
  import { ArrowDown } from "lucide-react";
12
- import { useRender } from "@base-ui/react/use-render";
13
13
  //#region src/chat-layout.tsx
14
14
  const chromeSizing = {
15
15
  panel: "mx-auto min-h-[640px] max-w-3xl",
package/dist/context.js CHANGED
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  import { cn } from "./lib/cn.js";
3
3
  import { Button } from "./ui/button.js";
4
- import { Popover, PopoverClose, PopoverContent, PopoverDescription, PopoverTitle, PopoverTrigger } from "./ui/popover.js";
5
4
  import { ScrollArea } from "./ui/scroll-area.js";
6
5
  import { deriveContextModel } from "./context-model.js";
6
+ import { Popover, PopoverClose, PopoverContent, PopoverDescription, PopoverTitle, PopoverTrigger } from "./ui/popover.js";
7
7
  import { createContext, useContext, useId, useMemo } from "react";
8
8
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
9
9
  import { X } from "lucide-react";
@@ -2,8 +2,8 @@
2
2
  import { cn } from "./lib/cn.js";
3
3
  import { Button } from "./ui/button.js";
4
4
  import { LiveStatus } from "./ui/live-status.js";
5
- import { createDynamicNotificationLiquid } from "./dynamic-notification-liquid.js";
6
5
  import { createDynamicNotificationGlass } from "./dynamic-notification-glass.js";
6
+ import { createDynamicNotificationLiquid } from "./dynamic-notification-liquid.js";
7
7
  import { useDynamicNotification } from "./hooks/use-dynamic-notification.js";
8
8
  import { createContext, useContext, useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from "react";
9
9
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -1,5 +1,5 @@
1
- import { composite, resolveColor, tokenMaps } from "../scripts/contrast-eval.js";
2
1
  import { emailLengthPixels } from "./length.js";
2
+ import { composite, resolveColor, tokenMaps } from "../scripts/contrast-eval.js";
3
3
  //#region src/email/theme.ts
4
4
  function resolveVariables(value, tokens, chain = []) {
5
5
  if (chain.length > 16) throw new Error(`Email theme: token chain exceeds 16 references (${chain.join(" → ")}).`);
@@ -5,9 +5,9 @@ import { useFilterBarContext } from "./context.js";
5
5
  import { describeFilter, formatFilterValue } from "./model.js";
6
6
  import { FilterBarEditor, FilterBarInlineInput } from "./editor.js";
7
7
  import { useEffect, useId, useRef } from "react";
8
+ import { useRender } from "@base-ui/react/use-render";
8
9
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
9
10
  import { PlusIcon, XIcon } from "lucide-react";
10
- import { useRender } from "@base-ui/react/use-render";
11
11
  //#region src/filter-bar/parts.tsx
12
12
  function chipSegments(item, field, operator, draft) {
13
13
  const segments = [{
@@ -6,8 +6,8 @@ import { describeFilter, fieldOperators, filterNavigationKeys } from "./filter-b
6
6
  import { filterMotionEnabled, useFilterBarMotion } from "./filter-bar/motion.js";
7
7
  import { FilterBarAddButton, FilterBarChip, FilterBarChips, FilterBarClear, FilterBarInput } from "./filter-bar/parts.js";
8
8
  import { useState } from "react";
9
- import { jsx, jsxs } from "react/jsx-runtime";
10
9
  import { useRender } from "@base-ui/react/use-render";
10
+ import { jsx, jsxs } from "react/jsx-runtime";
11
11
  //#region src/filter-bar.tsx
12
12
  function valueStatusMessage(field) {
13
13
  if (field?.error) return typeof field.error === "string" ? field.error : "Couldn’t load values.";
@@ -2,8 +2,8 @@
2
2
  import { cn } from "./lib/cn.js";
3
3
  import { Button } from "./ui/button.js";
4
4
  import { LiveStatus } from "./ui/live-status.js";
5
- import { SourceFavicon, sourceHostname } from "./source-badge.js";
6
5
  import { Popover, PopoverContent, PopoverTrigger } from "./ui/popover.js";
6
+ import { SourceFavicon, sourceHostname } from "./source-badge.js";
7
7
  import { createContext, useContext, useRef, useState } from "react";
8
8
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
9
9
  import { ArrowLeft, ArrowRight, ExternalLink } from "lucide-react";
@@ -1,4 +1,4 @@
1
1
  //#region src/knob-contracts/tabs-knobs.d.ts
2
- export declare const tabsKnobs: readonly ["--cui-tabs-trigger-radius", "--cui-tabs-list-padding", "--cui-tabs-list-radius", "--cui-tabs-list-background", "--cui-tabs-list-backdrop-filter", "--cui-tabs-indicator-background", "--cui-tabs-foreground", "--cui-tabs-active-foreground", "--cui-tabs-hover-foreground", "--cui-tabs-indicator-shadow", "--cui-tabs-list-shadow", "--cui-tabs-border-color", "--cui-tabs-border-width"];
2
+ export declare const tabsKnobs: readonly ["--cui-tabs-surface-background", "--cui-tabs-surface-radius", "--cui-tabs-trigger-radius", "--cui-tabs-list-padding", "--cui-tabs-list-radius", "--cui-tabs-list-background", "--cui-tabs-list-backdrop-filter", "--cui-tabs-indicator-background", "--cui-tabs-foreground", "--cui-tabs-active-foreground", "--cui-tabs-hover-foreground", "--cui-tabs-indicator-shadow", "--cui-tabs-list-shadow", "--cui-tabs-border-color", "--cui-tabs-border-width"];
3
3
  export type TabsKnobStyle = Partial<Record<(typeof tabsKnobs)[number], string>>;
4
4
  //#endregion
@@ -1,5 +1,7 @@
1
1
  //#region src/knob-contracts/tabs-knobs.ts
2
2
  const tabsKnobs = [
3
+ "--cui-tabs-surface-background",
4
+ "--cui-tabs-surface-radius",
3
5
  "--cui-tabs-trigger-radius",
4
6
  "--cui-tabs-list-padding",
5
7
  "--cui-tabs-list-radius",
@@ -1,5 +1,5 @@
1
- import { getCountryCallingCode } from "react-phone-number-input/max";
2
1
  import { AsYouType } from "libphonenumber-js/max";
2
+ import { getCountryCallingCode } from "react-phone-number-input/max";
3
3
  //#region src/lib/phone-input-format.ts
4
4
  function normalizePhoneInputText(value, country) {
5
5
  if (!country) return value;
@@ -60,6 +60,7 @@
60
60
  @import "./recipes/emoji-picker.css";
61
61
  @import "./recipes/icon-picker.css";
62
62
  @import "./recipes/tabs.css";
63
+ @import "./recipes/tabs-motion.css";
63
64
  @import "./recipes/environment-variables.css";
64
65
  @import "./recipes/filter-bar.css";
65
66
  @import "./recipes/gradient-editor.css";
@@ -17,6 +17,7 @@
17
17
  background: var(--cui-badge-background);
18
18
  color: var(--cui-badge-foreground);
19
19
  font-size: var(--cui-badge-font-size);
20
+ font-variant-numeric: tabular-nums;
20
21
  }
21
22
 
22
23
  :where([data-control-family="badge"][data-slot="root"][data-size="sm"]) {
@@ -9,17 +9,22 @@
9
9
  }
10
10
 
11
11
  @media (pointer: coarse) {
12
- :where([data-control-family="button"][data-size="xs"])::after {
12
+ :where([data-control-family="button"][data-size])::after {
13
+ content: "";
14
+ position: absolute;
15
+ inset: 50%;
16
+ translate: -50% -50%;
17
+ inline-size: 100%;
13
18
  block-size: max(100%, var(--touch-target));
14
19
  }
15
20
 
16
- :where([data-control-family="button"][data-size="xs"][data-icon-only="true"])::after {
21
+ :where([data-control-family="button"][data-size][data-icon-only="true"])::after {
17
22
  inline-size: max(100%, var(--touch-target));
18
23
  }
19
24
  }
20
25
 
21
26
  :where([data-control-family="button"][data-control="true"]) {
22
- --cui-button-radius: var(--radius-control);
27
+ --cui-button-radius: var(--nest-radius, var(--radius-control));
23
28
  --cui-button-gap: calc(var(--spacing) * 1.5);
24
29
  --cui-button-icon: 1rem;
25
30
  --cui-button-height: var(--control-h-md);
@@ -44,7 +49,7 @@
44
49
  --cui-button-open-background: var(--cui-button-hover-background);
45
50
  --cui-button-open-foreground: var(--cui-button-hover-foreground);
46
51
  --cui-button-open-shadow: var(--cui-button-shadow);
47
- border-radius: var(--nest-radius, var(--cui-button-radius));
52
+ border-radius: var(--cui-button-radius);
48
53
  background-color: var(--cui-button-background);
49
54
  background-image: var(--cui-button-background-image);
50
55
  box-shadow: var(--cui-button-shadow);
@@ -110,6 +115,18 @@
110
115
  padding-inline: 0;
111
116
  }
112
117
 
118
+ :where([data-control-family="button"][data-layout="tile"]) {
119
+ --cui-button-radius: var(--nest-radius, min(var(--radius-control), var(--radius-field)));
120
+ flex-direction: column;
121
+ block-size: auto;
122
+ padding-block: calc(var(--spacing) * 1.5);
123
+ padding-inline: var(--cui-button-padding-inline);
124
+ }
125
+
126
+ :where([data-control-family="button"][data-layout="tile"] > [data-slot="content"]) {
127
+ flex-direction: column;
128
+ }
129
+
113
130
  :where([data-control-family="button"][data-control="true"] svg) {
114
131
  pointer-events: none;
115
132
  flex-shrink: 0;
@@ -137,21 +137,6 @@
137
137
  :where(:is([data-control-family="code"], [data-control-family="code-diff"])[data-slot="header"]) {
138
138
  min-block-size: var(--touch-target);
139
139
  }
140
-
141
- :where(:is([data-control-family="code"], [data-control-family="code-diff"])[data-slot="actions"] [data-control-family="button"]),
142
- :where([data-control-family="button"][data-code-copy="true"]) {
143
- position: relative;
144
- }
145
-
146
- :where(:is([data-control-family="code"], [data-control-family="code-diff"])[data-slot="actions"] [data-control-family="button"])::after,
147
- :where([data-control-family="button"][data-code-copy="true"])::after {
148
- content: "";
149
- position: absolute;
150
- inset: 50% 50%;
151
- translate: -50% -50%;
152
- inline-size: 100%;
153
- block-size: max(100%, var(--touch-target));
154
- }
155
140
  }
156
141
  }
157
142
 
@@ -1,7 +1,7 @@
1
1
  @layer components {
2
2
  :where([data-control-family="field"][data-control="true"]) {
3
3
  gap: calc(var(--spacing) * 1.5);
4
- --cui-field-radius: var(--radius-control);
4
+ --cui-field-radius: var(--nest-radius, var(--radius-control));
5
5
  --cui-field-background: var(--control-fill);
6
6
  --cui-field-hover-background: var(--hover-fill);
7
7
  --cui-field-affordance-background: transparent;
@@ -18,7 +18,7 @@
18
18
  --cui-field-padding-inline: var(--padding-x);
19
19
  --cui-field-font-size: var(--text-body);
20
20
  border: var(--cui-field-border-width) solid var(--cui-field-border-color);
21
- border-radius: var(--nest-radius, var(--cui-field-radius));
21
+ border-radius: var(--cui-field-radius);
22
22
  background: var(--cui-field-background);
23
23
  box-shadow: var(--cui-field-shadow);
24
24
  color: var(--cui-field-foreground);
@@ -58,6 +58,19 @@
58
58
  font-size: var(--cui-field-font-size);
59
59
  }
60
60
 
61
+ :where(
62
+ input[data-control-family="field"]:is(
63
+ [type="number"],
64
+ [type="date"],
65
+ [type="time"],
66
+ [type="datetime-local"],
67
+ [inputmode="numeric"],
68
+ [inputmode="decimal"]
69
+ )
70
+ ) {
71
+ font-variant-numeric: tabular-nums;
72
+ }
73
+
61
74
  :where([data-control-family="field"][data-control="true"])::placeholder {
62
75
  color: var(--muted-foreground);
63
76
  }
@@ -37,32 +37,6 @@
37
37
  cursor: row-resize;
38
38
  }
39
39
 
40
- /* biome-ignore-start lint/complexity/noImportantStyles: Resize drag cursor must beat every cursor under the pointer. */
41
- :where(
42
- :root:has(
43
- [data-control-family="resizable"][data-slot="handle"][data-axis="vertical"]:not([data-cursor="none"]):is(
44
- [data-separator="hover"],
45
- [data-separator="active"]
46
- )
47
- )
48
- *
49
- ) {
50
- cursor: col-resize !important;
51
- }
52
-
53
- :where(
54
- :root:has(
55
- [data-control-family="resizable"][data-slot="handle"][data-axis="horizontal"]:not([data-cursor="none"]):is(
56
- [data-separator="hover"],
57
- [data-separator="active"]
58
- )
59
- )
60
- *
61
- ) {
62
- cursor: row-resize !important;
63
- }
64
- /* biome-ignore-end lint/complexity/noImportantStyles: Resize drag cursor must beat every cursor under the pointer. */
65
-
66
40
  :where([data-control-family="resizable"][data-slot="handle"][data-variant="solid"]) {
67
41
  background-color: var(--border);
68
42
  }
@@ -11,10 +11,8 @@
11
11
  grid-template-rows: minmax(0, 1fr) auto;
12
12
  }
13
13
 
14
- :where(
15
- [data-control-family="scroll-area"][data-slot="root"][data-scrollbar-gutter="stable"] > [data-scroll-area-viewport],
16
- [data-control-family="scroll-area"][data-slot="root"][data-scrollbar-gutter="stable"] > [data-control-family="progressive-blur"]
17
- ) {
14
+ :where([data-control-family="scroll-area"][data-slot="root"][data-scrollbar-gutter="stable"] > [data-scroll-area-viewport]),
15
+ :where([data-control-family="scroll-area"][data-slot="root"][data-scrollbar-gutter="stable"] > [data-control-family="progressive-blur"]) {
18
16
  grid-area: 1 / 1;
19
17
  min-inline-size: 0;
20
18
  min-block-size: 0;
@@ -41,7 +39,9 @@
41
39
  :where(
42
40
  [data-control-family="scroll-area"][data-slot="root"][data-scrollbar-gutter="stable"]
43
41
  > [data-slot="scrollbar"][data-orientation="vertical"]:not([data-has-overflow-y])
44
- > [data-slot="thumb"],
42
+ > [data-slot="thumb"]
43
+ ),
44
+ :where(
45
45
  [data-control-family="scroll-area"][data-slot="root"][data-scrollbar-gutter="stable"]
46
46
  > [data-slot="scrollbar"][data-orientation="horizontal"]:not([data-has-overflow-x])
47
47
  > [data-slot="thumb"]
@@ -170,7 +170,7 @@
170
170
  :where([data-control-family="scroll-area"][data-slot="scrollbar"][data-visibility="always"]),
171
171
  :where([data-control-family="scroll-area"][data-slot="scrollbar"][data-visibility="hover"]:is([data-hovering], [data-scrolling])),
172
172
  :where([data-control-family="scroll-area"][data-slot="scrollbar"][data-visibility="scroll"][data-scrolling]),
173
- :where([data-control-family="scroll-area"][data-slot="root"]:has(> [data-scroll-area-viewport]:focus-visible) > [data-slot="scrollbar"]) {
173
+ :where([data-control-family="scroll-area"][data-slot="root"] > [data-scroll-area-viewport]:focus-visible ~ [data-slot="scrollbar"]) {
174
174
  opacity: 1;
175
175
  }
176
176
 
@@ -58,8 +58,7 @@
58
58
  }
59
59
 
60
60
  :where(
61
- [data-control-family="sidebar"]:is([data-indicator="slide"], [data-indicator="hover"])
62
- [data-control-family="sidebar"][data-slot="menu-button"][data-active]
61
+ [data-control-family="sidebar"][data-slot="menu-button"]:is([data-indicator="slide"], [data-indicator="hover"])[data-active]
63
62
  ~ [data-slot="menu-action"]
64
63
  ) {
65
64
  color: var(--cui-sidebar-menu-button-track-active-foreground);
@@ -134,21 +133,36 @@
134
133
  }
135
134
 
136
135
  :where(
137
- [data-control-family="sidebar"][data-indicator="slide"]
138
- [data-control-family="sidebar"][data-slot="menu-button"]:is(:hover, :active, [data-active], [data-popup-open])
136
+ [data-control-family="sidebar"][data-slot="menu-button"][data-indicator="slide"]:is(:hover, :active, [data-active], [data-popup-open])
139
137
  ) {
140
138
  background-color: transparent;
141
139
  }
142
140
 
141
+ :where([data-control-family="sidebar"][data-slot="menu-button"]:is([data-indicator="slide"], [data-indicator="hover"])[data-active]) {
142
+ color: var(--cui-sidebar-menu-button-track-active-foreground);
143
+ }
144
+
143
145
  :where(
144
- [data-control-family="sidebar"]:is([data-indicator="slide"], [data-indicator="hover"])
145
- [data-control-family="sidebar"][data-slot="menu-button"][data-active]
146
+ [data-control-family="sidebar"][data-slot="menu-button"][data-indicator="hover"]:focus-visible:not(
147
+ [data-active],
148
+ :disabled,
149
+ [data-disabled],
150
+ [aria-disabled="true"]
151
+ )
146
152
  ) {
147
- color: var(--cui-sidebar-menu-button-track-active-foreground);
153
+ background-color: var(--cui-sidebar-menu-button-hover-background);
154
+ color: var(--cui-sidebar-menu-button-hover-foreground);
155
+ box-shadow: var(--cui-sidebar-menu-button-hover-shadow);
148
156
  }
149
157
 
150
158
  @media (hover: hover) {
151
- :where([data-control-family="sidebar"][data-indicator="hover"] [data-slot="menu-button"]:hover:not([data-active])) {
159
+ :where(
160
+ [data-control-family="sidebar"][data-slot="menu"][data-indicator="hover"]:has(
161
+ > [data-slot="menu-item"] > [data-slot="menu-button"]:focus-visible
162
+ )
163
+ > [data-slot="menu-item"]
164
+ > [data-slot="menu-button"][data-indicator="hover"]:hover:not([data-active], :focus-visible)
165
+ ) {
152
166
  background-color: transparent;
153
167
  box-shadow: none;
154
168
  }
@@ -1,13 +1,21 @@
1
1
  @layer components {
2
+ :where([data-control-family="sidebar"][data-slot="root"]) {
3
+ --_sidebar-transition-duration: var(--duration-base);
4
+ }
5
+
6
+ :where([data-control-family="sidebar"][data-slot="root"]:has(> [data-slot="container"] > div > [data-slot="rail"]:focus-visible)) {
7
+ --_sidebar-transition-duration: 0s;
8
+ }
9
+
2
10
  :where([data-control-family="sidebar"][data-slot="container"]) {
3
11
  translate: 0;
4
12
  transition:
5
- width var(--duration-base) var(--ease-standard),
6
- translate var(--duration-base) var(--ease-standard);
13
+ width var(--_sidebar-transition-duration) var(--ease-standard),
14
+ translate var(--_sidebar-transition-duration) var(--ease-standard);
7
15
  }
8
16
 
9
17
  :where([data-control-family="sidebar"][data-slot="inner"]) {
10
- transition: padding var(--duration-base) var(--ease-standard);
18
+ transition: padding var(--_sidebar-transition-duration) var(--ease-standard);
11
19
  }
12
20
 
13
21
  :where([data-control-family="sidebar"][data-collapsible="offcanvas"][data-side="left"]:dir(ltr) [data-slot="container"]),
@@ -23,10 +31,6 @@
23
31
  :where(
24
32
  [data-control-family="sidebar"][data-slot="wrapper"][data-resizing]
25
33
  [data-control-family="sidebar"]:is([data-slot="container"], [data-slot="gap"], [data-slot="inner"])
26
- ),
27
- :where(
28
- [data-control-family="sidebar"][data-slot="wrapper"]:has([data-control-family="sidebar"][data-slot="rail"]:focus-visible)
29
- [data-control-family="sidebar"]:is([data-slot="container"], [data-slot="gap"], [data-slot="inner"])
30
34
  ) {
31
35
  transition: none;
32
36
  }
@@ -96,7 +96,7 @@
96
96
 
97
97
  :where([data-control-family="sidebar"][data-slot="gap"]) {
98
98
  background-color: transparent;
99
- transition: width var(--duration-base) var(--ease-standard);
99
+ transition: width var(--_sidebar-transition-duration) var(--ease-standard);
100
100
  }
101
101
 
102
102
  :where([data-control-family="sidebar"][data-slot="root"][data-variant="sidebar"][data-side="left"] [data-slot="container"]) {
@@ -0,0 +1,99 @@
1
+ @layer components {
2
+ @supports ((anchor-name: --aui-slide-panel) and (anchor-scope: --aui-slide-panel)) {
3
+ :where([data-control-family="tabs"][data-slot="panel"][data-slide="panel"][inert][data-slide-exiting][data-ending-style]) {
4
+ display: block;
5
+ position: absolute;
6
+ top: var(--_tabs-panel-top);
7
+ left: var(--_tabs-panel-left);
8
+ right: auto;
9
+ bottom: auto;
10
+ width: var(--_tabs-panel-width);
11
+ height: var(--_tabs-panel-height);
12
+ margin: 0;
13
+ overflow: clip;
14
+ animation: aui-slide-exit-hold var(--duration-slow) var(--ease-emphasized) both;
15
+ }
16
+
17
+ @supports (height: anchor-size(height)) {
18
+ :where([data-control-family="tabs"][data-slot="panel"][data-slide="panel"][inert][data-slide-exiting][data-ending-style]) {
19
+ height: anchor-size(height);
20
+ }
21
+ }
22
+
23
+ :where(
24
+ [data-control-family="tabs"][data-slot="panel"][data-slide="panel"][inert][data-ending-style][data-activation-direction="right"]
25
+ ) {
26
+ translate: -100% 0;
27
+ }
28
+
29
+ :where(
30
+ [data-control-family="tabs"][data-slot="panel"][data-slide="panel"][inert][data-ending-style][data-activation-direction="left"]
31
+ ) {
32
+ translate: 100% 0;
33
+ }
34
+
35
+ :where(
36
+ [data-control-family="tabs"][data-slot="panel"][data-slide="panel"][inert][data-ending-style][data-activation-direction="down"]
37
+ ) {
38
+ translate: 0 -100%;
39
+ }
40
+
41
+ :where([data-control-family="tabs"][data-slot="panel"][data-slide="panel"][inert][data-ending-style][data-activation-direction="up"]) {
42
+ translate: 0 100%;
43
+ }
44
+
45
+ :where(
46
+ [data-control-family="tabs"][data-slot="root"]:has(> [data-slot="panel"][data-starting-style])
47
+ > [data-slot="panel"][inert][data-ending-style]
48
+ ) {
49
+ translate: 0 0;
50
+ transition: none;
51
+ }
52
+
53
+ :where([data-control-family="tabs"][data-slot="panel"][data-slide="panel"][data-starting-style]) {
54
+ transition: none;
55
+ }
56
+
57
+ :where([data-control-family="tabs"][data-slot="root"][data-slide-starting] > [data-slot="panel"][data-slide="panel"]) {
58
+ transition: none;
59
+ }
60
+
61
+ :where([data-control-family="tabs"][data-slot="root"][data-slide-starting] > [data-slot="panel"][inert]) {
62
+ translate: 0 0;
63
+ }
64
+
65
+ :where(
66
+ [data-control-family="tabs"][data-slot="root"][data-slide-starting]
67
+ > [data-slot="panel"]:not([inert])[data-activation-direction="right"]
68
+ ) {
69
+ translate: 100% 0;
70
+ }
71
+
72
+ :where(
73
+ [data-control-family="tabs"][data-slot="root"][data-slide-starting]
74
+ > [data-slot="panel"]:not([inert])[data-activation-direction="left"]
75
+ ) {
76
+ translate: -100% 0;
77
+ }
78
+
79
+ :where(
80
+ [data-control-family="tabs"][data-slot="root"][data-slide-starting]
81
+ > [data-slot="panel"]:not([inert])[data-activation-direction="down"]
82
+ ) {
83
+ translate: 0 100%;
84
+ }
85
+
86
+ :where(
87
+ [data-control-family="tabs"][data-slot="root"][data-slide-starting]
88
+ > [data-slot="panel"]:not([inert])[data-activation-direction="up"]
89
+ ) {
90
+ translate: 0 -100%;
91
+ }
92
+
93
+ @supports (height: calc-size(auto, size)) {
94
+ :where([data-control-family="tabs"][data-slot="root"][data-slide-starting] > [data-slot="panel"][data-slide="panel"]:not([inert])) {
95
+ height: var(--aui-slide-prev-height, calc-size(auto, size));
96
+ }
97
+ }
98
+ }
99
+ }