@ctrl-ui/react 0.8.5 → 0.8.7

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 (152) hide show
  1. package/dist/action-bar.js +1 -1
  2. package/dist/activity.js +1 -1
  3. package/dist/blocks/coding-agent.js +16 -19
  4. package/dist/blocks/design-canvas-data.d.ts +32 -0
  5. package/dist/blocks/design-canvas-data.js +100 -0
  6. package/dist/blocks/design-canvas-inspector.d.ts +8 -0
  7. package/dist/blocks/design-canvas-inspector.js +238 -0
  8. package/dist/blocks/design-canvas.d.ts +17 -0
  9. package/dist/blocks/design-canvas.js +346 -0
  10. package/dist/blocks/file-explorer.js +2 -2
  11. package/dist/blocks/settings.js +2 -2
  12. package/dist/chat-composer-attachment.d.ts +9 -3
  13. package/dist/chat-composer-attachment.js +27 -10
  14. package/dist/chat-composer-editor.js +20 -4
  15. package/dist/chat-composer.d.ts +1 -1
  16. package/dist/chat-composer.js +4 -3
  17. package/dist/chat-layout.js +32 -19
  18. package/dist/context.js +1 -1
  19. package/dist/dynamic-notification.js +1 -1
  20. package/dist/environment-variables.js +1 -1
  21. package/dist/filter-bar/context.d.ts +32 -0
  22. package/dist/filter-bar/context.js +11 -0
  23. package/dist/filter-bar/editor.d.ts +14 -0
  24. package/dist/filter-bar/editor.js +204 -0
  25. package/dist/filter-bar/model.d.ts +9 -0
  26. package/dist/filter-bar/model.js +48 -0
  27. package/dist/filter-bar/motion.d.ts +10 -0
  28. package/dist/filter-bar/motion.js +84 -0
  29. package/dist/filter-bar/parts.d.ts +19 -0
  30. package/dist/filter-bar/parts.js +233 -0
  31. package/dist/filter-bar/types.d.ts +53 -0
  32. package/dist/filter-bar/types.js +0 -0
  33. package/dist/filter-bar.d.ts +27 -0
  34. package/dist/filter-bar.js +304 -0
  35. package/dist/hooks/use-chat-composer.d.ts +3 -1
  36. package/dist/hooks/use-chat-composer.js +2 -2
  37. package/dist/hooks/use-dropzone.d.ts +7 -4
  38. package/dist/hooks/use-dropzone.js +34 -3
  39. package/dist/inline-attachment.js +8 -14
  40. package/dist/inline-citation.js +1 -1
  41. package/dist/knob-contracts/chat-layout-knobs.d.ts +1 -1
  42. package/dist/knob-contracts/chat-layout-knobs.js +2 -1
  43. package/dist/knob-contracts/choice-knobs.d.ts +1 -1
  44. package/dist/knob-contracts/choice-knobs.js +1 -0
  45. package/dist/knob-contracts/collapsible-knobs.d.ts +1 -1
  46. package/dist/knob-contracts/collapsible-knobs.js +1 -1
  47. package/dist/knob-contracts/filter-bar-knobs.d.ts +4 -0
  48. package/dist/knob-contracts/filter-bar-knobs.js +16 -0
  49. package/dist/knob-contracts/infinite-canvas-knobs.d.ts +1 -1
  50. package/dist/knob-contracts/infinite-canvas-knobs.js +3 -0
  51. package/dist/knob-contracts/page-layout-knobs.d.ts +1 -1
  52. package/dist/knob-contracts/page-layout-knobs.js +4 -1
  53. package/dist/knob-contracts/popup-knobs.d.ts +1 -1
  54. package/dist/knob-contracts/popup-knobs.js +1 -0
  55. package/dist/knob-contracts/table-of-contents-knobs.d.ts +1 -1
  56. package/dist/knob-contracts/table-of-contents-knobs.js +3 -5
  57. package/dist/lib/phone-input-format.js +1 -1
  58. package/dist/markdown-block.js +11 -7
  59. package/dist/scripts/contrast-eval.js +5 -4
  60. package/dist/styles/index.css +5 -4
  61. package/dist/styles/recipes/button-group.css +1 -1
  62. package/dist/styles/recipes/button.css +2 -2
  63. package/dist/styles/recipes/chat-composer.css +14 -6
  64. package/dist/styles/recipes/chat-layout.css +29 -2
  65. package/dist/styles/recipes/choice.css +10 -3
  66. package/dist/styles/recipes/code-diff.css +16 -4
  67. package/dist/styles/recipes/code.css +11 -5
  68. package/dist/styles/recipes/collapsible.css +37 -0
  69. package/dist/styles/recipes/color-picker.css +12 -2
  70. package/dist/styles/recipes/dockable-panel.css +11 -3
  71. package/dist/styles/recipes/field-parts.css +62 -0
  72. package/dist/styles/recipes/field.css +28 -6
  73. package/dist/styles/recipes/filter-bar.css +174 -0
  74. package/dist/styles/recipes/infinite-canvas.css +51 -3
  75. package/dist/styles/recipes/inline-attachment.css +6 -1
  76. package/dist/styles/recipes/page-layout.css +36 -2
  77. package/dist/styles/recipes/pagination.css +1 -1
  78. package/dist/styles/recipes/popup-controls.css +16 -0
  79. package/dist/styles/recipes/popup-drawer.css +34 -32
  80. package/dist/styles/recipes/popup-lists.css +11 -2
  81. package/dist/styles/recipes/popup.css +10 -12
  82. package/dist/styles/recipes/range.css +1 -1
  83. package/dist/styles/recipes/resizable.css +34 -0
  84. package/dist/styles/recipes/spinner.css +4 -0
  85. package/dist/styles/recipes/table-of-contents.css +42 -42
  86. package/dist/styles/recipes/tabs.css +21 -0
  87. package/dist/styles/recipes/track-highlight.css +2 -1
  88. package/dist/styles/recipes/transcript-divider.css +2 -2
  89. package/dist/styles/theme.css +250 -91
  90. package/dist/ui/alert-dialog.js +1 -1
  91. package/dist/ui/autocomplete.js +5 -1
  92. package/dist/ui/button.js +2 -2
  93. package/dist/ui/checkbox-group.js +1 -1
  94. package/dist/ui/code-diff.js +1 -1
  95. package/dist/ui/code.js +3 -3
  96. package/dist/ui/collapsible.js +1 -1
  97. package/dist/ui/color-picker.js +2 -2
  98. package/dist/ui/combobox-disabled-selection.d.ts +1 -1
  99. package/dist/ui/combobox-disabled-selection.js +2 -1
  100. package/dist/ui/combobox.d.ts +5 -23
  101. package/dist/ui/combobox.js +26 -14
  102. package/dist/ui/command.js +9 -1
  103. package/dist/ui/context-menu.js +1 -1
  104. package/dist/ui/dialog.js +1 -1
  105. package/dist/ui/dockable-panel.js +18 -10
  106. package/dist/ui/drawer.d.ts +7 -4
  107. package/dist/ui/drawer.js +36 -23
  108. package/dist/ui/dropdown-menu.js +1 -1
  109. package/dist/ui/dropzone.d.ts +3 -1
  110. package/dist/ui/dropzone.js +3 -1
  111. package/dist/ui/field.js +1 -1
  112. package/dist/ui/hover-card.js +1 -1
  113. package/dist/ui/infinite-canvas.d.ts +11 -0
  114. package/dist/ui/infinite-canvas.js +82 -7
  115. package/dist/ui/input-group.d.ts +2 -1
  116. package/dist/ui/input-group.js +12 -3
  117. package/dist/ui/input.js +9 -0
  118. package/dist/ui/item.js +1 -1
  119. package/dist/ui/markdown-elements.js +11 -8
  120. package/dist/ui/menubar.js +1 -1
  121. package/dist/ui/morphing-panel.js +1 -1
  122. package/dist/ui/navigation-menu.js +1 -1
  123. package/dist/ui/number-field.d.ts +1 -1
  124. package/dist/ui/number-field.js +13 -2
  125. package/dist/ui/phone-input.js +2 -2
  126. package/dist/ui/popover.js +1 -1
  127. package/dist/ui/radio-group.d.ts +1 -0
  128. package/dist/ui/radio-group.js +11 -1
  129. package/dist/ui/resizable.d.ts +18 -1
  130. package/dist/ui/resizable.js +127 -7
  131. package/dist/ui/responsive-dialog.js +6 -3
  132. package/dist/ui/rich-tooltip.js +1 -1
  133. package/dist/ui/scroll-area.d.ts +4 -1
  134. package/dist/ui/scroll-area.js +2 -1
  135. package/dist/ui/select.d.ts +2 -1
  136. package/dist/ui/select.js +58 -33
  137. package/dist/ui/sheet.js +1 -1
  138. package/dist/ui/sidebar-menu.js +1 -1
  139. package/dist/ui/sidebar-provider.js +2 -2
  140. package/dist/ui/sidebar-resize-rail.js +1 -1
  141. package/dist/ui/sidebar.js +1 -1
  142. package/dist/ui/table-of-contents.d.ts +4 -3
  143. package/dist/ui/table-of-contents.js +126 -47
  144. package/dist/ui/table.js +11 -7
  145. package/dist/ui/toast.js +1 -1
  146. package/dist/ui/toggle.d.ts +1 -1
  147. package/dist/ui/toggle.js +2 -1
  148. package/dist/ui/tooltip.js +1 -1
  149. package/dist/ui/tree.js +1 -1
  150. package/dist/ui/trigger-menu.js +7 -3
  151. package/dist/user-ask.js +1 -1
  152. package/package.json +1 -1
@@ -6,13 +6,14 @@
6
6
  --cui-choice-radius: var(--radius-sm);
7
7
  --cui-choice-shadow: var(--shadow-sm);
8
8
  --cui-choice-border-color: var(--border);
9
+ --cui-choice-border-width: 1px;
9
10
  --cui-choice-checked-background: var(--primary);
10
11
  --cui-choice-checked-border-color: var(--primary);
11
- --_choice-background: oklch(from var(--card) l c h / 0.72);
12
+ --_choice-background: var(--control-fill);
12
13
  border-radius: var(--cui-choice-radius);
13
14
  background: var(--_choice-background);
14
15
  box-shadow:
15
- inset 0 0 0 1px var(--cui-choice-border-color),
16
+ inset 0 0 0 var(--cui-choice-border-width) var(--cui-choice-border-color),
16
17
  var(--cui-choice-shadow);
17
18
  color: currentColor;
18
19
  outline: none;
@@ -47,7 +48,7 @@
47
48
  :where([data-control-family="choice"][data-choice-kind="radio-group"][data-slot="item"][data-invalid]) {
48
49
  --cui-choice-border-color: var(--destructive);
49
50
  box-shadow:
50
- inset 0 0 0 1px var(--cui-choice-border-color),
51
+ inset 0 0 0 var(--cui-choice-border-width) var(--cui-choice-border-color),
51
52
  var(--shadow-sm),
52
53
  0 0 0 1px var(--destructive);
53
54
  }
@@ -108,6 +109,12 @@
108
109
  initial-value: transparent;
109
110
  }
110
111
 
112
+ @property --cui-choice-border-width {
113
+ syntax: "<length>";
114
+ inherits: true;
115
+ initial-value: 1px;
116
+ }
117
+
111
118
  @property --cui-choice-checked-background {
112
119
  syntax: "<color>";
113
120
  inherits: true;
@@ -1,10 +1,13 @@
1
1
  @layer components {
2
2
  :where([data-control-family="code-diff"][data-slot="root"]) {
3
- margin-block: calc(var(--spacing) * 4);
4
3
  --cui-code-diff-background: var(--background);
5
4
  --cui-code-diff-border-color: var(--border);
6
5
  --cui-code-diff-border-width: 1px;
7
- --cui-code-diff-radius: var(--radius-panel);
6
+ --_code-diff-corner-inset: calc(var(--spacing) * 1.5);
7
+ --cui-code-diff-radius: min(
8
+ var(--radius-panel),
9
+ calc(var(--control-h-xs) / 2 + var(--cui-code-diff-border-width) + var(--_code-diff-corner-inset))
10
+ );
8
11
  --cui-code-diff-shadow: var(--shadow-sm);
9
12
  --cui-code-diff-foreground: var(--code-foreground);
10
13
  --cui-code-diff-add-background: var(--diff-add-line);
@@ -23,21 +26,30 @@
23
26
 
24
27
  :where([data-control-family="code-diff"]:is([data-slot="header"], [data-slot="file-header"])) {
25
28
  gap: calc(var(--spacing) * 3);
26
- padding-block: calc(var(--spacing) * 1.5);
27
- padding-inline: calc(var(--spacing) * 3);
28
29
  border-bottom: 1px solid var(--border);
29
30
  background: var(--diff-gutter-bg);
30
31
  }
31
32
 
32
33
  :where([data-control-family="code-diff"][data-slot="header"]) {
33
34
  min-block-size: calc(var(--spacing) * 10);
35
+ padding-block: var(--_code-diff-corner-inset);
36
+ padding-inline: calc(var(--spacing) * 3) var(--_code-diff-corner-inset);
34
37
  }
35
38
 
36
39
  :where([data-control-family="code-diff"][data-slot="file-header"]) {
37
40
  min-block-size: calc(var(--spacing) * 9);
41
+ padding-block: calc(var(--spacing) * 1.5);
42
+ padding-inline: calc(var(--spacing) * 3);
43
+ }
44
+
45
+ :where([data-control-family="code-diff"][data-slot="root"] > [data-control-family="button"][data-code-floating="true"]) {
46
+ --nest-radius: max(0px, calc(var(--cui-code-diff-radius) - var(--cui-code-diff-border-width) - var(--_code-diff-corner-inset)));
47
+ inset-block-start: var(--_code-diff-corner-inset);
48
+ inset-inline-end: var(--_code-diff-corner-inset);
38
49
  }
39
50
 
40
51
  :where([data-control-family="code-diff"][data-slot="actions"]) {
52
+ --nest-radius: max(0px, calc(var(--cui-code-diff-radius) - var(--cui-code-diff-border-width) - var(--_code-diff-corner-inset)));
41
53
  gap: calc(var(--spacing) * 2);
42
54
  }
43
55
 
@@ -1,10 +1,10 @@
1
1
  @layer components {
2
2
  :where([data-control-family="code"][data-slot="root"]) {
3
- margin-block: calc(var(--spacing) * 4);
4
3
  --cui-code-background: var(--background);
5
4
  --cui-code-border-color: var(--control-rim);
6
5
  --cui-code-border-width: 1px;
7
- --cui-code-radius: var(--radius-panel);
6
+ --_code-corner-inset: calc(var(--spacing) * 1.5);
7
+ --cui-code-radius: min(var(--radius-panel), calc(var(--control-h-xs) / 2 + var(--cui-code-border-width) + var(--_code-corner-inset)));
8
8
  --cui-code-shadow: var(--shadow-sm);
9
9
  --cui-code-text-foreground: var(--code-foreground);
10
10
  --cui-code-title-foreground: var(--muted-foreground);
@@ -19,7 +19,6 @@
19
19
  }
20
20
 
21
21
  :where([data-control-family="code"][data-slot="root"][data-chrome="embedded"]) {
22
- margin-block: 0;
23
22
  border: 0;
24
23
  border-radius: 0;
25
24
  background: transparent;
@@ -29,12 +28,19 @@
29
28
  :where([data-control-family="code"][data-slot="header"]) {
30
29
  min-block-size: calc(var(--spacing) * 10);
31
30
  gap: calc(var(--spacing) * 3);
32
- padding-block: calc(var(--spacing) * 1.5);
33
- padding-inline: calc(var(--spacing) * 3);
31
+ padding-block: var(--_code-corner-inset);
32
+ padding-inline: calc(var(--spacing) * 3) var(--_code-corner-inset);
34
33
  border-bottom: 1px solid var(--border);
35
34
  }
36
35
 
36
+ :where([data-control-family="code"][data-slot="floating-frame"] > [data-control-family="button"][data-code-floating="true"]) {
37
+ --nest-radius: max(0px, calc(var(--cui-code-radius) - var(--cui-code-border-width) - var(--_code-corner-inset)));
38
+ inset-block-start: var(--_code-corner-inset);
39
+ inset-inline-end: var(--_code-corner-inset);
40
+ }
41
+
37
42
  :where([data-control-family="code"][data-slot="actions"]) {
43
+ --nest-radius: max(0px, calc(var(--cui-code-radius) - var(--cui-code-border-width) - var(--_code-corner-inset)));
38
44
  gap: calc(var(--spacing) * 1);
39
45
  margin-inline-start: auto;
40
46
  }
@@ -1,9 +1,34 @@
1
1
  @layer components {
2
+ :where([data-control-family="collapsible"][data-slot="root"]) {
3
+ --cui-collapsible-trigger-radius: var(--radius-control);
4
+ --cui-collapsible-trigger-hover-background: var(--hover-fill);
5
+ }
6
+
2
7
  :where([data-control-family="collapsible"][data-slot="trigger"]) {
8
+ display: flex;
9
+ width: 100%;
10
+ min-height: var(--control-h-sm);
11
+ align-items: center;
12
+ gap: calc(var(--spacing) * 2);
13
+ border-radius: var(--cui-collapsible-trigger-radius);
14
+ padding-inline: calc(var(--spacing) * 2);
15
+ color: var(--foreground);
16
+ font-size: var(--text-label);
17
+ font-weight: var(--font-weight-medium);
18
+ text-align: start;
3
19
  outline: none;
20
+ transition: background-color var(--duration-fast) var(--ease-standard);
21
+ }
22
+
23
+ :where([data-control-family="collapsible"][data-slot="trigger"]:is(:hover, :focus-visible)) {
24
+ background: var(--cui-collapsible-trigger-hover-background);
4
25
  }
5
26
 
6
27
  :where([data-control-family="collapsible"][data-slot="trigger"] > svg) {
28
+ inline-size: 1rem;
29
+ block-size: 1rem;
30
+ flex-shrink: 0;
31
+ color: var(--muted-foreground);
7
32
  transition: rotate var(--duration-base) var(--ease-standard);
8
33
  }
9
34
 
@@ -22,3 +47,15 @@
22
47
  rotate: 90deg;
23
48
  }
24
49
  }
50
+
51
+ @property --cui-collapsible-trigger-radius {
52
+ syntax: "<length-percentage>";
53
+ inherits: true;
54
+ initial-value: 0px;
55
+ }
56
+
57
+ @property --cui-collapsible-trigger-hover-background {
58
+ syntax: "<color>";
59
+ inherits: true;
60
+ initial-value: transparent;
61
+ }
@@ -4,10 +4,20 @@
4
4
  block-size: calc(var(--spacing) * 8);
5
5
  }
6
6
 
7
+ :where(
8
+ [data-control-family="field"][data-field-kind="input-group"][data-slot="addon"]
9
+ > [data-control-family="color-picker"][data-slot="trigger"]
10
+ ) {
11
+ inline-size: calc(var(--cui-field-height) * 0.5);
12
+ block-size: calc(var(--cui-field-height) * 0.5);
13
+ }
14
+
7
15
  :where([data-control-family="popup"][data-popup-kind="color-picker"][data-popup-part="surface"]) {
16
+ --_color-picker-surface-padding: calc(var(--spacing) * 3);
17
+ --_color-picker-area-radius-cap: max(var(--radius-sm), calc(var(--cui-popup-radius) - var(--_color-picker-surface-padding)));
8
18
  inline-size: calc(var(--spacing) * 64);
9
19
  gap: calc(var(--spacing) * 3);
10
- padding: calc(var(--spacing) * 3);
20
+ padding: var(--_color-picker-surface-padding);
11
21
  }
12
22
 
13
23
  :where([data-control-family="color-picker"][data-slot="hue-track"]),
@@ -122,7 +132,7 @@
122
132
 
123
133
  :where([data-control-family="color-picker"][data-slot="area"]) {
124
134
  block-size: calc(var(--spacing) * 40);
125
- border-radius: var(--cui-color-picker-area-radius);
135
+ border-radius: min(var(--cui-color-picker-area-radius), var(--_color-picker-area-radius-cap, 9999px));
126
136
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--border) 60%, transparent);
127
137
  --_color-picker-area-thumb-shadow: 0 0 0 1px oklch(from var(--foreground) l c h / 0.4);
128
138
  }
@@ -1,7 +1,11 @@
1
1
  @layer components {
2
2
  :where([data-control-family="dockable-panel"][data-slot="root"]),
3
3
  :where([data-control-family="popup"][data-popup-kind="drawer"][data-slot="content"][data-dockable-panel-root]) {
4
- --cui-dockable-panel-radius: var(--radius-panel);
4
+ --_dockable-panel-header-inset: calc(var(--spacing) * 1.5);
5
+ --cui-dockable-panel-radius: min(
6
+ var(--radius-panel),
7
+ calc(var(--control-h-sm) / 2 + var(--_dockable-panel-header-inset) + var(--cui-dockable-panel-border-width))
8
+ );
5
9
  --cui-dockable-panel-background: var(--card);
6
10
  --cui-dockable-panel-foreground: var(--card-foreground);
7
11
  --cui-dockable-panel-border-color: oklch(from var(--border) l c h / 0.8);
@@ -22,9 +26,13 @@
22
26
  }
23
27
 
24
28
  :where([data-control-family="dockable-panel"][data-slot="header"]) {
25
- min-block-size: calc(var(--spacing) * 11);
29
+ --nest-radius: max(
30
+ 0px,
31
+ calc(var(--cui-dockable-panel-radius) - var(--cui-dockable-panel-border-width) - var(--_dockable-panel-header-inset))
32
+ );
33
+ min-block-size: calc(var(--control-h-sm) + var(--_dockable-panel-header-inset) * 2);
26
34
  gap: calc(var(--spacing) * 2);
27
- padding-inline: calc(var(--spacing) * 2);
35
+ padding-inline: var(--_dockable-panel-header-inset);
28
36
  border-block-end: 1px solid oklch(from var(--border) l c h / 0.7);
29
37
  }
30
38
 
@@ -8,6 +8,16 @@
8
8
  color: var(--muted-foreground);
9
9
  }
10
10
 
11
+ :where([data-control-family="field"][data-slot="root"][data-control="true"]:is(button, a)) {
12
+ cursor: pointer;
13
+ color: var(--muted-foreground);
14
+ text-align: start;
15
+ }
16
+
17
+ :where([data-control-family="field"][data-slot="root"][data-control="true"]:is(button, a):hover) {
18
+ color: var(--foreground);
19
+ }
20
+
11
21
  :where([data-control-family="field"][data-field-kind="input-group"][data-slot="input"]),
12
22
  :where([data-control-family="field"][data-field-kind="phone-input"][data-slot="input"]),
13
23
  :where([data-control-family="field"][data-field-kind="number-field"][data-slot="input"]) {
@@ -80,6 +90,58 @@
80
90
  color: oklch(from var(--muted-foreground) l c h / 0.5);
81
91
  }
82
92
 
93
+ :where(
94
+ [data-control-family="field"][data-field-kind="number-field"][data-slot="group"]
95
+ > [data-control-family="field"][data-field-kind="number-field"][data-slot="scrub-area"]
96
+ ) {
97
+ padding-inline: calc(var(--spacing) * 2);
98
+ color: var(--muted-foreground);
99
+ }
100
+
101
+ :where(
102
+ [data-control-family="field"][data-field-kind="number-field"][data-slot="input"]:has(
103
+ + [data-control-family="field"][data-field-kind="number-field"][data-slot="scrub-area"]
104
+ )
105
+ ) {
106
+ padding-inline-end: 0;
107
+ text-align: end;
108
+ }
109
+
110
+ :where(
111
+ [data-control-family="field"][data-field-kind="number-field"][data-slot="scrub-area"]
112
+ + [data-control-family="field"][data-field-kind="number-field"][data-slot="input"]
113
+ ) {
114
+ padding-inline-start: 0;
115
+ text-align: start;
116
+ }
117
+
118
+ @media (hover: hover) {
119
+ :where(
120
+ [data-control-family="field"][data-field-kind="number-field"][data-slot="group"]
121
+ > [data-control-family="field"][data-field-kind="number-field"][data-slot="scrub-area"]:hover
122
+ ) {
123
+ color: var(--foreground);
124
+ }
125
+ }
126
+
127
+ :where(
128
+ [data-control-family="field"][data-field-kind="number-field"][data-slot="group"]:not([data-control])
129
+ > [data-control-family="field"][data-field-kind="number-field"][data-slot="input"]
130
+ ) {
131
+ inline-size: 6ch;
132
+ }
133
+
134
+ @supports (field-sizing: content) {
135
+ :where(
136
+ [data-control-family="field"][data-field-kind="number-field"][data-slot="group"]:not([data-control])
137
+ > [data-control-family="field"][data-field-kind="number-field"][data-slot="input"]
138
+ ) {
139
+ inline-size: auto;
140
+ min-inline-size: 2ch;
141
+ field-sizing: content;
142
+ }
143
+ }
144
+
83
145
  :where([data-control-family="field"][data-field-kind="number-field"][data-slot="scrub-cursor"]) {
84
146
  color: var(--foreground);
85
147
  filter: drop-shadow(0 1px 1px oklch(0 0 0 / 0.05));
@@ -2,7 +2,7 @@
2
2
  :where([data-control-family="field"][data-control="true"]) {
3
3
  gap: calc(var(--spacing) * 1.5);
4
4
  --cui-field-radius: var(--radius-control);
5
- --cui-field-background: oklch(from var(--card) l c h / 0.72);
5
+ --cui-field-background: var(--control-fill);
6
6
  --cui-field-foreground: var(--foreground);
7
7
  --cui-field-border-color: var(--control-rim);
8
8
  --cui-field-border-width: var(--control-rim-width);
@@ -13,7 +13,7 @@
13
13
  --cui-field-padding-inline: var(--padding-x);
14
14
  --cui-field-font-size: var(--text-body);
15
15
  border: var(--cui-field-border-width) solid var(--cui-field-border-color);
16
- border-radius: var(--cui-field-radius);
16
+ border-radius: var(--nest-radius, var(--cui-field-radius));
17
17
  outline: none;
18
18
  background: var(--cui-field-background);
19
19
  box-shadow: var(--cui-field-shadow);
@@ -58,19 +58,37 @@
58
58
  color: var(--muted-foreground);
59
59
  }
60
60
 
61
+ :where(input[type="search"][data-control-family="field"])::-webkit-search-cancel-button,
62
+ :where([data-control-family="field"] input[type="search"])::-webkit-search-cancel-button {
63
+ appearance: none;
64
+ }
65
+
61
66
  @media (hover: hover) {
62
67
  :where([data-control-family="field"][data-control="true"][data-field-kind="autocomplete"]:hover),
63
68
  :where([data-control-family="field"][data-control="true"][data-field-kind="combobox"]:hover),
64
69
  :where([data-control-family="field"][data-control="true"][data-field-kind="native-select"]:hover),
70
+ :where([data-control-family="field"][data-control="true"][data-field-kind="select"]:hover),
65
71
  :where([data-control-family="field"][data-control="true"][data-field-kind="number-field"]:hover) {
66
72
  background: var(--hover-fill);
67
73
  }
68
- }
69
74
 
70
- :where([data-control-family="field"][data-control="true"]:is(:focus-visible, :focus-within)) {
71
- border-color: var(--cui-field-focus-border-color);
72
- }
75
+ :where(
76
+ [data-control-family="field"][data-control="true"]:hover:has(
77
+ [data-control-family="field"]:is(
78
+ [data-slot="increment"],
79
+ [data-slot="decrement"],
80
+ [data-slot="trigger"],
81
+ [data-slot="clear"]
82
+ ):hover
83
+ )
84
+ ) {
85
+ background: var(--cui-field-background);
86
+ }
73
87
 
88
+ :where([data-control-family="field"][data-control="true"]:is(:focus-visible, :focus-within)) {
89
+ border-color: var(--cui-field-focus-border-color);
90
+ }
91
+ }
74
92
  :where([data-control-family="field"][data-control="true"][data-invalid]),
75
93
  :where([data-control-family="field"][data-control="true"][aria-invalid="true"]) {
76
94
  box-shadow:
@@ -83,6 +101,10 @@
83
101
  cursor: not-allowed;
84
102
  opacity: 0.5;
85
103
  }
104
+ :where([data-control-family="field"][data-field-kind="select"][data-slot="trigger"]) {
105
+ cursor: pointer;
106
+ font-weight: var(--font-weight-medium);
107
+ }
86
108
 
87
109
  :where([data-control-family="field"][data-field-kind="input-otp"][data-slot="slot"]) {
88
110
  text-align: center;
@@ -0,0 +1,174 @@
1
+ @layer components {
2
+ :where([data-control-family="filter-bar"][data-slot="root"]) {
3
+ --cui-filter-bar-background: var(--control-fill);
4
+ --cui-filter-bar-foreground: var(--foreground);
5
+ --cui-filter-bar-border-color: var(--control-rim);
6
+ --cui-filter-bar-border-width: var(--control-rim-width);
7
+ --cui-filter-bar-radius: var(--radius-control);
8
+ --cui-filter-bar-height: var(--control-h-sm);
9
+ --cui-filter-bar-gap: calc(var(--spacing) * 1.5);
10
+ --cui-filter-bar-padding-inline: calc(var(--spacing) * 2);
11
+ --cui-filter-bar-font-size: var(--text-label);
12
+ --cui-filter-bar-hover-background: var(--hover-fill);
13
+ --cui-filter-bar-focus-ring-color: var(--ring);
14
+ gap: var(--cui-filter-bar-gap);
15
+ border: 0;
16
+ padding: 0;
17
+ margin: 0;
18
+ }
19
+
20
+ :where([data-control-family="filter-bar"][data-slot="chip"]) {
21
+ border: var(--cui-filter-bar-border-width) solid var(--cui-filter-bar-border-color);
22
+ border-radius: var(--cui-filter-bar-radius);
23
+ background: var(--cui-filter-bar-background);
24
+ color: var(--cui-filter-bar-foreground);
25
+ block-size: var(--cui-filter-bar-height);
26
+ font-size: var(--cui-filter-bar-font-size);
27
+ }
28
+
29
+ :where([data-control-family="filter-bar"]:is([data-slot="segment"], [data-slot="remove"])) {
30
+ display: inline-flex;
31
+ align-items: center;
32
+ min-inline-size: 0;
33
+ max-inline-size: 16rem;
34
+ padding-inline: var(--cui-filter-bar-padding-inline);
35
+ border: 0;
36
+ border-radius: 0;
37
+ background: transparent;
38
+ color: inherit;
39
+ font-size: inherit;
40
+ gap: calc(var(--spacing) * 1.5);
41
+ }
42
+
43
+ :where([data-control-family="filter-bar"][data-slot="chip"] > :not(:first-child)) {
44
+ border-inline-start: var(--cui-filter-bar-border-width) solid var(--cui-filter-bar-border-color);
45
+ }
46
+
47
+ :where([data-control-family="filter-bar"]:is([data-slot="segment"], [data-slot="remove"]):focus-visible) {
48
+ outline: 2px solid var(--cui-filter-bar-focus-ring-color);
49
+ outline-offset: -2px;
50
+ }
51
+
52
+ @media (hover: hover) {
53
+ :where([data-control-family="filter-bar"]:is([data-slot="segment"], [data-slot="remove"]):enabled:hover) {
54
+ background: var(--cui-filter-bar-hover-background);
55
+ }
56
+ }
57
+
58
+ :where([data-control-family="filter-bar"][data-draft] [data-slot="segment"]) {
59
+ opacity: 1;
60
+ animation: cui-filter-segment-enter var(--duration-fast) var(--ease-emphasized);
61
+ }
62
+
63
+ :where([data-control-family="filter-bar"][data-slot="exit"]) {
64
+ pointer-events: none;
65
+ transform-origin: left center;
66
+ animation: cui-filter-chip-exit var(--duration-fast) var(--ease-standard) forwards;
67
+ }
68
+
69
+ :where([data-control-family="filter-bar"][data-slot="exit"] [data-slot="chip"]) {
70
+ block-size: 100%;
71
+ }
72
+
73
+ :where([data-control-family="filter-bar"][data-disabled]) {
74
+ opacity: 0.5;
75
+ }
76
+
77
+ @media (prefers-reduced-motion: reduce) {
78
+ :where([data-control-family="filter-bar"]),
79
+ :where([data-control-family="filter-bar"] *) {
80
+ animation: none;
81
+ transition: none;
82
+ }
83
+ }
84
+
85
+ :where([data-motion="reduced"] [data-control-family="filter-bar"]),
86
+ :where([data-motion="reduced"] [data-control-family="filter-bar"] *) {
87
+ animation: none;
88
+ transition: none;
89
+ }
90
+ }
91
+
92
+ @keyframes cui-filter-segment-enter {
93
+ from {
94
+ opacity: 0;
95
+ translate: -4px 0;
96
+ }
97
+ to {
98
+ opacity: 1;
99
+ translate: 0 0;
100
+ }
101
+ }
102
+
103
+ @keyframes cui-filter-chip-exit {
104
+ to {
105
+ opacity: 0;
106
+ transform: translateX(-4px) scale(0.97);
107
+ }
108
+ }
109
+
110
+ @property --cui-filter-bar-background {
111
+ syntax: "<color>";
112
+ inherits: true;
113
+ initial-value: transparent;
114
+ }
115
+
116
+ @property --cui-filter-bar-foreground {
117
+ syntax: "<color>";
118
+ inherits: true;
119
+ initial-value: transparent;
120
+ }
121
+
122
+ @property --cui-filter-bar-border-color {
123
+ syntax: "<color>";
124
+ inherits: true;
125
+ initial-value: transparent;
126
+ }
127
+
128
+ @property --cui-filter-bar-border-width {
129
+ syntax: "<length>";
130
+ inherits: true;
131
+ initial-value: 0px;
132
+ }
133
+
134
+ @property --cui-filter-bar-radius {
135
+ syntax: "<length>";
136
+ inherits: true;
137
+ initial-value: 0px;
138
+ }
139
+
140
+ @property --cui-filter-bar-height {
141
+ syntax: "<length>";
142
+ inherits: true;
143
+ initial-value: 0px;
144
+ }
145
+
146
+ @property --cui-filter-bar-gap {
147
+ syntax: "<length>";
148
+ inherits: true;
149
+ initial-value: 0px;
150
+ }
151
+
152
+ @property --cui-filter-bar-padding-inline {
153
+ syntax: "<length>";
154
+ inherits: true;
155
+ initial-value: 0px;
156
+ }
157
+
158
+ @property --cui-filter-bar-font-size {
159
+ syntax: "<length>";
160
+ inherits: true;
161
+ initial-value: 0px;
162
+ }
163
+
164
+ @property --cui-filter-bar-hover-background {
165
+ syntax: "<color>";
166
+ inherits: true;
167
+ initial-value: transparent;
168
+ }
169
+
170
+ @property --cui-filter-bar-focus-ring-color {
171
+ syntax: "<color>";
172
+ inherits: true;
173
+ initial-value: transparent;
174
+ }
@@ -1,10 +1,25 @@
1
1
  @layer components {
2
2
  :where([data-control-family="infinite-canvas"][data-slot="root"]) {
3
- --cui-infinite-canvas-radius: var(--radius-panel);
4
3
  --cui-infinite-canvas-background: var(--canvas);
5
4
  --cui-infinite-canvas-grid-dot-color: oklch(from var(--foreground) l c h / 0.16);
6
5
  --cui-infinite-canvas-border-color: var(--border);
7
- --cui-infinite-canvas-controls-radius: var(--radius-control);
6
+ --cui-infinite-canvas-controls-item-radius: min(var(--radius-sm), calc(var(--control-h-sm) / 2));
7
+ --cui-infinite-canvas-controls-padding: calc(var(--spacing) * 1);
8
+ --cui-infinite-canvas-controls-radius: calc(
9
+ var(--cui-infinite-canvas-controls-item-radius) +
10
+ clamp(0px, calc(var(--cui-infinite-canvas-controls-item-radius) * 1000), var(--cui-infinite-canvas-controls-padding))
11
+ );
12
+ --cui-infinite-canvas-radius: max(
13
+ var(--radius-panel),
14
+ calc(
15
+ var(--cui-infinite-canvas-controls-radius) +
16
+ clamp(0px, calc(var(--cui-infinite-canvas-controls-radius) * 1000), var(--spacing) * 2)
17
+ )
18
+ );
19
+ --cui-infinite-canvas-padding: max(
20
+ calc(var(--spacing) * 2),
21
+ calc(var(--cui-infinite-canvas-radius) - var(--cui-infinite-canvas-controls-radius))
22
+ );
8
23
  --cui-infinite-canvas-controls-background: var(--card);
9
24
  --cui-infinite-canvas-controls-border-color: var(--border);
10
25
  --cui-infinite-canvas-controls-shadow: var(--shadow-sm);
@@ -15,9 +30,24 @@
15
30
  outline-style: none;
16
31
  }
17
32
 
33
+ :where([data-control-family="infinite-canvas"][data-slot="root"][data-easing]) {
34
+ transition-property: background-position, background-size;
35
+ transition-duration: var(--duration-base);
36
+ transition-timing-function: var(--ease-standard);
37
+ }
38
+
39
+ :where(
40
+ [data-control-family="infinite-canvas"][data-slot="root"][data-easing] [data-control-family="infinite-canvas"][data-slot="content"]
41
+ ) {
42
+ transition: transform var(--duration-base) var(--ease-standard);
43
+ }
44
+
18
45
  :where([data-control-family="infinite-canvas"][data-slot="controls"]) {
46
+ --nest-radius: var(--cui-infinite-canvas-controls-item-radius);
47
+ inset-inline-end: var(--cui-infinite-canvas-padding);
48
+ inset-block-end: var(--cui-infinite-canvas-padding);
19
49
  gap: calc(var(--spacing) * 0.5);
20
- padding: calc(var(--spacing) * 1);
50
+ padding: var(--cui-infinite-canvas-controls-padding);
21
51
  border-radius: var(--cui-infinite-canvas-controls-radius);
22
52
  background-color: var(--cui-infinite-canvas-controls-background);
23
53
  box-shadow:
@@ -54,6 +84,24 @@
54
84
  initial-value: transparent;
55
85
  }
56
86
 
87
+ @property --cui-infinite-canvas-padding {
88
+ syntax: "<length-percentage>";
89
+ inherits: true;
90
+ initial-value: 0px;
91
+ }
92
+
93
+ @property --cui-infinite-canvas-controls-item-radius {
94
+ syntax: "<length-percentage>";
95
+ inherits: true;
96
+ initial-value: 0px;
97
+ }
98
+
99
+ @property --cui-infinite-canvas-controls-padding {
100
+ syntax: "<length-percentage>";
101
+ inherits: true;
102
+ initial-value: 0px;
103
+ }
104
+
57
105
  @property --cui-infinite-canvas-controls-radius {
58
106
  syntax: "<length-percentage>";
59
107
  inherits: true;
@@ -3,7 +3,11 @@
3
3
  --cui-inline-attachment-background: var(--card);
4
4
  --cui-inline-attachment-hover-shadow: var(--shadow-md);
5
5
  --cui-inline-attachment-padding: calc(var(--spacing) * 3);
6
- --cui-inline-attachment-radius: var(--radius-field);
6
+ --_inline-attachment-content-line-height: calc(var(--spacing) * 4);
7
+ --cui-inline-attachment-radius: min(
8
+ var(--radius-field),
9
+ calc(var(--cui-inline-attachment-padding) + var(--_inline-attachment-content-line-height) / 2 + var(--spacing))
10
+ );
7
11
  --cui-inline-attachment-ring-color: var(--border);
8
12
  --cui-inline-attachment-image-outline-color: oklch(from var(--foreground) l c h / 0.1);
9
13
  --cui-inline-attachment-shadow: var(--shadow-sm);
@@ -126,6 +130,7 @@
126
130
  box-shadow: var(--cui-inline-attachment-content-shadow);
127
131
  backdrop-filter: blur(var(--backdrop-blur-popover));
128
132
  font-size: var(--text-caption);
133
+ line-height: var(--_inline-attachment-content-line-height);
129
134
  font-weight: var(--font-weight-medium);
130
135
  }
131
136