@ctrl-ui/react 0.9.4 → 0.9.6

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/README.md +27 -0
  2. package/dist/action-bar.js +16 -8
  3. package/dist/activity.d.ts +1 -1
  4. package/dist/activity.js +3 -1
  5. package/dist/audio-visualizer.js +1 -1
  6. package/dist/blocks/agent-run-clock.d.ts +5 -0
  7. package/dist/blocks/agent-run-clock.js +52 -0
  8. package/dist/blocks/agent-run-sidebar.d.ts +13 -0
  9. package/dist/blocks/agent-run-sidebar.js +100 -0
  10. package/dist/blocks/agent-run-status.d.ts +32 -0
  11. package/dist/blocks/agent-run-status.js +27 -0
  12. package/dist/blocks/agent-run.d.ts +80 -0
  13. package/dist/blocks/agent-run.js +254 -0
  14. package/dist/blocks/coding-agent.d.ts +1 -1
  15. package/dist/blocks/coding-agent.js +1 -4
  16. package/dist/blocks/design-canvas-data.d.ts +1 -1
  17. package/dist/blocks/design-canvas.d.ts +2 -1
  18. package/dist/blocks/design-canvas.js +15 -8
  19. package/dist/blocks/file-explorer.js +14 -16
  20. package/dist/chat-message.js +33 -39
  21. package/dist/knob-contracts/infinite-canvas-knobs.d.ts +1 -1
  22. package/dist/knob-contracts/infinite-canvas-knobs.js +1 -7
  23. package/dist/knob-contracts/swap-knobs.d.ts +4 -0
  24. package/dist/knob-contracts/swap-knobs.js +9 -0
  25. package/dist/knob-contracts/timeline-knobs.d.ts +1 -1
  26. package/dist/knob-contracts/timeline-knobs.js +1 -0
  27. package/dist/knob-contracts/tool-approval-knobs.d.ts +4 -0
  28. package/dist/knob-contracts/tool-approval-knobs.js +32 -0
  29. package/dist/lib/cn.d.ts +2 -0
  30. package/dist/lib/cn.js +29 -24
  31. package/dist/lib/infinite-canvas-camera-store.d.ts +65 -0
  32. package/dist/lib/infinite-canvas-camera-store.js +233 -0
  33. package/dist/lib/infinite-canvas-camera.d.ts +33 -0
  34. package/dist/lib/infinite-canvas-camera.js +98 -0
  35. package/dist/lib/infinite-canvas-navigation.d.ts +19 -0
  36. package/dist/lib/infinite-canvas-navigation.js +395 -0
  37. package/dist/markdown-editor/bubble-menu.d.ts +6 -0
  38. package/dist/markdown-editor/bubble-menu.js +45 -0
  39. package/dist/markdown-editor/toolbar.d.ts +17 -1
  40. package/dist/markdown-editor/toolbar.js +103 -81
  41. package/dist/styles/index.css +10 -8
  42. package/dist/styles/recipes/activity.css +8 -0
  43. package/dist/styles/recipes/button-group.css +12 -6
  44. package/dist/styles/recipes/button-states.css +12 -0
  45. package/dist/styles/recipes/button.css +13 -3
  46. package/dist/styles/recipes/chat-composer-attachment.css +7 -0
  47. package/dist/styles/recipes/chat-message-edit.css +6 -21
  48. package/dist/styles/recipes/color-picker-details.css +7 -0
  49. package/dist/styles/recipes/field.css +7 -0
  50. package/dist/styles/recipes/infinite-canvas.css +17 -57
  51. package/dist/styles/recipes/inline-attachment.css +7 -0
  52. package/dist/styles/recipes/kbd.css +7 -0
  53. package/dist/styles/recipes/markdown-editor.css +12 -0
  54. package/dist/styles/recipes/pagination.css +8 -1
  55. package/dist/styles/recipes/scroll-area.css +1 -3
  56. package/dist/styles/recipes/swap.css +143 -0
  57. package/dist/styles/recipes/tabs.css +12 -0
  58. package/dist/styles/recipes/timeline.css +11 -0
  59. package/dist/styles/recipes/tool-approval.css +267 -0
  60. package/dist/styles/recipes/track-highlight.css +19 -6
  61. package/dist/styles/theme.css +6 -5
  62. package/dist/styles/type-scale.css +2 -1
  63. package/dist/tool-approval.d.ts +49 -0
  64. package/dist/tool-approval.js +260 -0
  65. package/dist/ui/code.js +13 -3
  66. package/dist/ui/command.js +1 -0
  67. package/dist/ui/infinite-canvas.d.ts +19 -22
  68. package/dist/ui/infinite-canvas.js +264 -325
  69. package/dist/ui/rich-tooltip.d.ts +2 -1
  70. package/dist/ui/rich-tooltip.js +32 -29
  71. package/dist/ui/sidebar.js +1 -1
  72. package/dist/ui/swap.d.ts +14 -0
  73. package/dist/ui/swap.js +69 -0
  74. package/dist/ui/timeline.d.ts +1 -1
  75. package/dist/ui/timeline.js +1 -1
  76. package/dist/ui/typography.d.ts +2 -0
  77. package/dist/ui/typography.js +2 -0
  78. package/dist/user-ask.js +1 -1
  79. package/lint/no-raw-type-classes.grit +7 -0
  80. package/package.json +4 -3
@@ -2,37 +2,39 @@
2
2
  @import "./recipes/accordion.css";
3
3
  @import "./recipes/button.css";
4
4
  @import "./recipes/button-states.css";
5
+ @import "./recipes/swap.css";
5
6
  @import "./recipes/action-bar.css";
6
7
  @import "./recipes/collapsible.css";
7
8
  @import "./effects.css";
8
9
  @import "./recipes/progressive-blur.css";
9
10
  @import "./recipes/scroll-area.css";
10
11
  @import "./recipes/activity.css";
11
- @import "./recipes/alert.css";
12
+ @import "./recipes/badge.css";
13
+ @import "./recipes/card.css";
12
14
  @import "./recipes/popup.css";
13
15
  @import "./recipes/popup-controls.css";
16
+ @import "./recipes/popup-drawer.css";
14
17
  @import "./recipes/popup-lists.css";
15
18
  @import "./recipes/popup-motion.css";
16
- @import "./recipes/page-layout.css";
17
- @import "./recipes/popup-drawer.css";
18
19
  @import "./recipes/track-highlight.css";
19
20
  @import "./recipes/sidebar.css";
20
21
  @import "./recipes/sidebar-menu.css";
21
22
  @import "./recipes/sidebar-mobile.css";
22
23
  @import "./recipes/sidebar-parts.css";
24
+ @import "./recipes/timeline.css";
25
+ @import "./type-scale.css";
26
+ @import "./recipes/alert.css";
27
+ @import "./recipes/page-layout.css";
23
28
  @import "./recipes/app-shell-header.css";
24
29
  @import "./recipes/field.css";
25
30
  @import "./recipes/field-parts.css";
26
- @import "./type-scale.css";
27
31
  @import "./recipes/audio-device-select.css";
28
32
  @import "./recipes/audio-visualizer.css";
29
33
  @import "./recipes/audio-recorder.css";
30
34
  @import "./recipes/avatar.css";
31
- @import "./recipes/badge.css";
32
35
  @import "./recipes/breadcrumb.css";
33
36
  @import "./recipes/button-group.css";
34
37
  @import "./recipes/calendar.css";
35
- @import "./recipes/card.css";
36
38
  @import "./recipes/channel-strip.css";
37
39
  @import "./recipes/chart.css";
38
40
  @import "./recipes/chat-message.css";
@@ -53,10 +55,10 @@
53
55
  @import "./recipes/gradient-editor.css";
54
56
  @import "./recipes/empty.css";
55
57
  @import "./recipes/context.css";
58
+ @import "./recipes/toolbar.css";
56
59
  @import "./recipes/infinite-canvas.css";
57
60
  @import "./recipes/resizable.css";
58
61
  @import "./recipes/separator.css";
59
- @import "./recipes/toolbar.css";
60
62
  @import "./recipes/kbd.css";
61
63
  @import "./recipes/markdown.css";
62
64
  @import "./recipes/label.css";
@@ -91,8 +93,8 @@
91
93
  @import "./recipes/table-of-contents.css";
92
94
  @import "./recipes/task-list.css";
93
95
  @import "./recipes/thread-rail.css";
94
- @import "./recipes/timeline.css";
95
96
  @import "./recipes/popup-toast.css";
97
+ @import "./recipes/tool-approval.css";
96
98
  @import "./recipes/transcript-divider.css";
97
99
  @import "./recipes/tree.css";
98
100
  @import "./recipes/user-ask.css";
@@ -72,6 +72,10 @@
72
72
  color: var(--destructive-text);
73
73
  }
74
74
 
75
+ :where([data-control-family="activity"][data-slot="root"][data-activity-state="waiting"] [data-slot="icon"]) {
76
+ color: var(--warning-text);
77
+ }
78
+
75
79
  :where([data-control-family="activity"][data-slot="title"]) {
76
80
  color: currentColor;
77
81
  font-size: var(--text-label);
@@ -87,6 +91,10 @@
87
91
  color: var(--destructive-text);
88
92
  }
89
93
 
94
+ :where([data-control-family="activity"][data-slot="status"][data-status="waiting"]) {
95
+ color: var(--warning-text);
96
+ }
97
+
90
98
  :where([data-control-family="activity"][data-slot="detail-label"]) {
91
99
  color: var(--muted-foreground);
92
100
  font-size: var(--text-micro);
@@ -44,30 +44,36 @@
44
44
 
45
45
  :where(
46
46
  [data-control-family="button-group"][data-orientation="horizontal"]
47
- > :not([data-control-family="track-highlight"])
48
- + :not([data-control-family="track-highlight"])
47
+ > :not([data-control-family="track-highlight"], [data-base-ui-focus-guard], span[aria-owns])
48
+ ~ :not([data-control-family="track-highlight"], [data-base-ui-focus-guard], span[aria-owns])
49
49
  ) {
50
50
  margin-inline-start: -1px;
51
51
  border-start-start-radius: 0;
52
52
  border-end-start-radius: 0;
53
53
  }
54
54
 
55
- :where([data-control-family="button-group"][data-orientation="horizontal"] > :has(~ :not([data-control-family="track-highlight"]))) {
55
+ :where(
56
+ [data-control-family="button-group"][data-orientation="horizontal"]
57
+ > :has(~ :not([data-control-family="track-highlight"], [data-base-ui-focus-guard], span[aria-owns]))
58
+ ) {
56
59
  border-start-end-radius: 0;
57
60
  border-end-end-radius: 0;
58
61
  }
59
62
 
60
63
  :where(
61
64
  [data-control-family="button-group"][data-orientation="vertical"]
62
- > :not([data-control-family="track-highlight"])
63
- + :not([data-control-family="track-highlight"])
65
+ > :not([data-control-family="track-highlight"], [data-base-ui-focus-guard], span[aria-owns])
66
+ ~ :not([data-control-family="track-highlight"], [data-base-ui-focus-guard], span[aria-owns])
64
67
  ) {
65
68
  margin-block-start: -1px;
66
69
  border-start-start-radius: 0;
67
70
  border-start-end-radius: 0;
68
71
  }
69
72
 
70
- :where([data-control-family="button-group"][data-orientation="vertical"] > :has(~ :not([data-control-family="track-highlight"]))) {
73
+ :where(
74
+ [data-control-family="button-group"][data-orientation="vertical"]
75
+ > :has(~ :not([data-control-family="track-highlight"], [data-base-ui-focus-guard], span[aria-owns]))
76
+ ) {
71
77
  border-end-start-radius: 0;
72
78
  border-end-end-radius: 0;
73
79
  }
@@ -63,4 +63,16 @@
63
63
  cursor: not-allowed;
64
64
  opacity: var(--disabled-opacity);
65
65
  }
66
+
67
+ @media (forced-colors: active) {
68
+ :where([data-control-family="button"][data-control="true"]:not(:focus-visible, :has(:focus-visible))) {
69
+ outline: 1px solid currentColor;
70
+ outline-offset: -1px;
71
+ }
72
+
73
+ :where([data-control-family="button"][data-control="true"][data-active="true"]:not(:focus-visible, :has(:focus-visible))) {
74
+ outline: var(--focus-ring-width) solid Highlight;
75
+ outline-offset: calc(var(--focus-ring-width) * -1);
76
+ }
77
+ }
66
78
  }
@@ -95,7 +95,12 @@
95
95
  :where(
96
96
  [data-control-family="button"][data-control="true"][data-size]:not([data-icon-only="true"]):has(
97
97
  > :is(svg, [data-slot="icon"]):first-child:not(:only-child),
98
- > [data-slot="content"] > :is(svg, [data-slot="icon"]):first-child:not(:only-child)
98
+ > [data-slot="content"] > :is(svg, [data-slot="icon"]):first-child:not(:only-child),
99
+ > [data-control-family="swap"]:first-child > [data-state="active"] > :is(svg, [data-slot="icon"]):first-child:not(:only-child),
100
+ > [data-slot="content"]
101
+ > [data-control-family="swap"]:first-child
102
+ > [data-state="active"]
103
+ > :is(svg, [data-slot="icon"]):first-child:not(:only-child)
99
104
  )
100
105
  ) {
101
106
  padding-inline-start: var(--cui-button-icon-padding-inline);
@@ -104,7 +109,12 @@
104
109
  :where(
105
110
  [data-control-family="button"][data-control="true"][data-size]:not([data-icon-only="true"]):has(
106
111
  > :is(svg, [data-slot="icon"]):last-child:not(:only-child),
107
- > [data-slot="content"] > :is(svg, [data-slot="icon"]):last-child:not(:only-child)
112
+ > [data-slot="content"] > :is(svg, [data-slot="icon"]):last-child:not(:only-child),
113
+ > [data-control-family="swap"]:last-child > [data-state="active"] > :is(svg, [data-slot="icon"]):last-child:not(:only-child),
114
+ > [data-slot="content"]
115
+ > [data-control-family="swap"]:last-child
116
+ > [data-state="active"]
117
+ > :is(svg, [data-slot="icon"]):last-child:not(:only-child)
108
118
  )
109
119
  ) {
110
120
  padding-inline-end: var(--cui-button-icon-padding-inline);
@@ -164,7 +174,7 @@
164
174
  --cui-button-shadow: inset 0 0 0 var(--control-rim-width) var(--control-rim), var(--shadow-sm);
165
175
  --cui-button-active-background: oklch(from var(--primary) l c h / 0.08);
166
176
  --cui-button-active-foreground: var(--primary-text);
167
- --cui-button-active-shadow: inset 0 0 0 1px oklch(from var(--primary) l c h / 0.6), var(--shadow-sm);
177
+ --cui-button-active-shadow: inset 0 0 0 var(--control-rim-width) oklch(from var(--primary) l c h / 0.6), var(--shadow-sm);
168
178
  --cui-button-active-hover-background: oklch(from var(--primary) l c h / 0.1);
169
179
  }
170
180
 
@@ -25,6 +25,13 @@
25
25
  transition-timing-function: var(--ease-standard);
26
26
  }
27
27
 
28
+ @media (forced-colors: active) {
29
+ :where([data-control-family="chat-composer-attachment"][data-slot="root"][data-variant]:not(:focus-visible, :has(:focus-visible))) {
30
+ outline: 1px solid CanvasText;
31
+ outline-offset: -1px;
32
+ }
33
+ }
34
+
28
35
  :where([data-control-family="chat-composer-attachment"][data-slot="list"]) {
29
36
  gap: calc(var(--spacing) * 2);
30
37
  padding: var(--cui-chat-composer-attachment-list-padding);
@@ -5,15 +5,9 @@
5
5
  }
6
6
 
7
7
  :where([data-control-family="chat-message"][data-slot="content"][data-editable]) {
8
+ --focus-ring-offset: calc(var(--focus-ring-width) * -1);
8
9
  position: relative;
9
10
  display: grid;
10
- outline: var(--focus-ring-width) var(--focus-ring-style) transparent;
11
- outline-offset: calc(var(--focus-ring-width) * -1);
12
- transition: outline-color var(--duration-fast) var(--ease-standard);
13
- }
14
-
15
- :where([data-control-family="chat-message"][data-slot="content"][data-editable]:focus-within) {
16
- outline-color: var(--focus-ring);
17
11
  }
18
12
 
19
13
  :where([data-control-family="chat-message"][data-slot="editable"] :is([data-slot="edit-value"], [data-slot="edit-sizer"])) {
@@ -63,7 +57,6 @@
63
57
  white-space: pre-wrap;
64
58
  overflow-wrap: anywhere;
65
59
  scrollbar-width: thin;
66
- outline: none;
67
60
  visibility: hidden;
68
61
  }
69
62
 
@@ -75,21 +68,13 @@
75
68
  visibility: hidden;
76
69
  }
77
70
 
78
- :where([data-control-family="chat-message"][data-slot="editable"] [data-slot="edit-toolbars"]) {
79
- display: grid;
80
- }
81
-
82
- :where([data-control-family="chat-message"][data-slot="editable"] [data-slot="edit-toolbar"]) {
83
- grid-area: 1 / 1;
84
- min-inline-size: 0;
85
- visibility: hidden;
86
- opacity: 0;
87
- transition: opacity var(--duration-fast) var(--ease-standard);
71
+ :where([data-control-family="chat-message"][data-slot="editable"] :is([data-slot="read-actions"], [data-slot="edit-actions"])) {
72
+ contain: inline-size;
88
73
  }
89
74
 
90
- :where([data-control-family="chat-message"][data-slot="editable"] [data-slot="edit-toolbar"][data-active]) {
91
- visibility: visible;
92
- opacity: 1;
75
+ :where([data-control-family="chat-message"][data-slot="editable"][data-editing] [data-slot="read-actions"]),
76
+ :where([data-control-family="chat-message"][data-slot="editable"]:not([data-editing]) [data-slot="edit-actions"]) {
77
+ display: none;
93
78
  }
94
79
 
95
80
  :where([data-control-family="chat-message"][data-slot="editable"] [data-slot="edit-error"]) {
@@ -5,6 +5,13 @@
5
5
  box-shadow: var(--cui-color-picker-trigger-shadow);
6
6
  }
7
7
 
8
+ @media (forced-colors: active) {
9
+ :where([data-control-family="color-picker"][data-slot="trigger-color"]) {
10
+ outline: 1px solid CanvasText;
11
+ outline-offset: -1px;
12
+ }
13
+ }
14
+
8
15
  :where([data-control-family="color-picker"][data-slot="trigger"]) {
9
16
  border-radius: var(--cui-color-picker-trigger-radius);
10
17
  transition-property: transform, translate, scale, rotate;
@@ -25,6 +25,13 @@
25
25
  backdrop-filter: var(--cui-field-backdrop-filter);
26
26
  }
27
27
 
28
+ @media (forced-colors: active) {
29
+ :where([data-control-family="field"][data-control="true"]:not(:focus-visible, :has(:focus-visible))) {
30
+ outline: 1px solid CanvasText;
31
+ outline-offset: -1px;
32
+ }
33
+ }
34
+
28
35
  :where(
29
36
  [data-control-family="field"][data-control="true"]:not([data-control-family="field"][data-field-kind="autocomplete"]):not(
30
37
  [data-control-family="field"][data-field-kind="combobox"]
@@ -1,34 +1,31 @@
1
1
  @layer components {
2
2
  :where([data-control-family="infinite-canvas"][data-slot="root"]) {
3
+ --_infinite-canvas-controls-item-radius: min(var(--radius-sm), calc(var(--control-h-sm) / 2));
4
+ --_infinite-canvas-controls-radius: calc(
5
+ var(--_infinite-canvas-controls-item-radius) +
6
+ clamp(0px, calc(var(--_infinite-canvas-controls-item-radius) * 1000), var(--spacing))
7
+ );
3
8
  --cui-infinite-canvas-background: var(--canvas);
4
9
  --cui-infinite-canvas-grid-dot-color: var(--canvas-grid-dot);
5
10
  --cui-infinite-canvas-border-color: var(--border);
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
11
  --cui-infinite-canvas-radius: max(
13
12
  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
- )
13
+ calc(var(--_infinite-canvas-controls-radius) + clamp(0px, calc(var(--_infinite-canvas-controls-radius) * 1000), var(--spacing) * 2))
18
14
  );
19
15
  --cui-infinite-canvas-padding: max(
20
16
  calc(var(--spacing) * 2),
21
- calc(var(--cui-infinite-canvas-radius) - var(--cui-infinite-canvas-controls-radius))
17
+ calc(var(--cui-infinite-canvas-radius) - var(--_infinite-canvas-controls-radius))
22
18
  );
23
- --cui-infinite-canvas-controls-background: var(--card);
24
- --cui-infinite-canvas-controls-border-color: var(--border);
25
- --cui-infinite-canvas-controls-shadow: var(--shadow-sm);
26
19
  border-radius: var(--cui-infinite-canvas-radius);
27
20
  background-color: var(--cui-infinite-canvas-background);
28
21
  background-image: radial-gradient(circle at center, var(--cui-infinite-canvas-grid-dot-color) 1px, transparent 1px);
29
22
  box-shadow: 0 0 0 1px var(--cui-infinite-canvas-border-color);
30
23
  }
31
24
 
25
+ :where([data-control-family="infinite-canvas"][data-slot="root"]:focus-visible) {
26
+ --focus-ring-offset: calc(var(--focus-ring-width) * -1);
27
+ }
28
+
32
29
  :where([data-control-family="infinite-canvas"][data-slot="root"][data-easing]) {
33
30
  transition-property: background-position, background-size;
34
31
  transition-duration: var(--duration-base);
@@ -41,17 +38,15 @@
41
38
  transition: transform var(--duration-base) var(--ease-standard);
42
39
  }
43
40
 
41
+ :where(
42
+ [data-control-family="infinite-canvas"][data-slot="root"][data-moving] [data-control-family="infinite-canvas"][data-slot="content"]
43
+ ) {
44
+ will-change: transform;
45
+ }
46
+
44
47
  :where([data-control-family="infinite-canvas"][data-slot="controls"]) {
45
- --nest-radius: var(--cui-infinite-canvas-controls-item-radius);
46
48
  inset-inline-end: var(--cui-infinite-canvas-padding);
47
49
  inset-block-end: var(--cui-infinite-canvas-padding);
48
- gap: calc(var(--spacing) * 0.5);
49
- padding: var(--cui-infinite-canvas-controls-padding);
50
- border-radius: var(--cui-infinite-canvas-controls-radius);
51
- background-color: var(--cui-infinite-canvas-controls-background);
52
- box-shadow:
53
- var(--cui-infinite-canvas-controls-shadow),
54
- 0 0 0 1px var(--cui-infinite-canvas-controls-border-color);
55
50
  }
56
51
 
57
52
  :where([data-control-family="infinite-canvas"][data-slot="content"]) {
@@ -88,38 +83,3 @@
88
83
  inherits: true;
89
84
  initial-value: 0px;
90
85
  }
91
-
92
- @property --cui-infinite-canvas-controls-item-radius {
93
- syntax: "<length-percentage>";
94
- inherits: true;
95
- initial-value: 0px;
96
- }
97
-
98
- @property --cui-infinite-canvas-controls-padding {
99
- syntax: "<length-percentage>";
100
- inherits: true;
101
- initial-value: 0px;
102
- }
103
-
104
- @property --cui-infinite-canvas-controls-radius {
105
- syntax: "<length-percentage>";
106
- inherits: true;
107
- initial-value: 0px;
108
- }
109
-
110
- @property --cui-infinite-canvas-controls-background {
111
- syntax: "<color>";
112
- inherits: true;
113
- initial-value: transparent;
114
- }
115
-
116
- @property --cui-infinite-canvas-controls-border-color {
117
- syntax: "<color>";
118
- inherits: true;
119
- initial-value: transparent;
120
- }
121
-
122
- @property --cui-infinite-canvas-controls-shadow {
123
- syntax: "*";
124
- inherits: true;
125
- }
@@ -52,6 +52,13 @@
52
52
  }
53
53
  }
54
54
 
55
+ @media (forced-colors: active) {
56
+ :where([data-control-family="inline-attachment"][data-slot="root"]:not(:focus-visible)) {
57
+ outline: 1px solid CanvasText;
58
+ outline-offset: -1px;
59
+ }
60
+ }
61
+
55
62
  :where([data-control-family="inline-attachment"][data-slot="image"]) {
56
63
  border-radius: inherit;
57
64
  }
@@ -28,6 +28,13 @@
28
28
  --cui-kbd-shadow: 0 0 transparent;
29
29
  }
30
30
 
31
+ @media (forced-colors: active) {
32
+ :where([data-control-family="kbd"][data-slot="root"]:not([data-variant="ghost"])) {
33
+ outline: 1px solid CanvasText;
34
+ outline-offset: -1px;
35
+ }
36
+ }
37
+
31
38
  :where([data-control-family="kbd"][data-slot="group"]) {
32
39
  gap: calc(var(--spacing) * 1);
33
40
  }
@@ -41,6 +41,12 @@
41
41
  padding-inline: var(--cui-markdown-editor-padding);
42
42
  white-space: nowrap;
43
43
  }
44
+ :where([data-control-family="markdown-editor"][data-slot="bubble-menu"]) {
45
+ z-index: 1;
46
+ white-space: nowrap;
47
+ transform-origin: bottom center;
48
+ animation: cui-markdown-editor-bubble-enter var(--duration-fast) var(--ease-emphasized);
49
+ }
44
50
  :where([data-control-family="markdown-editor"] [data-markdown-drag-handle]) {
45
51
  position: absolute;
46
52
  inset-inline-start: calc(var(--cui-markdown-editor-padding) / 2);
@@ -170,6 +176,12 @@
170
176
  border: var(--cui-markdown-editor-border-width) solid var(--cui-markdown-editor-border-color);
171
177
  padding: var(--cui-markdown-editor-padding);
172
178
  }
179
+ @keyframes cui-markdown-editor-bubble-enter {
180
+ from {
181
+ opacity: 0;
182
+ scale: 0.96;
183
+ }
184
+ }
173
185
  }
174
186
 
175
187
  @property --cui-markdown-editor-background {
@@ -17,7 +17,7 @@
17
17
  border-radius: var(--cui-pagination-link-radius);
18
18
  background: var(--cui-pagination-link-background);
19
19
  box-shadow:
20
- inset 0 0 0 1px var(--_pagination-link-border-color),
20
+ inset 0 0 0 var(--control-rim-width) var(--_pagination-link-border-color),
21
21
  var(--cui-pagination-link-shadow);
22
22
  color: var(--cui-pagination-link-foreground);
23
23
  font-variant-numeric: tabular-nums;
@@ -39,6 +39,13 @@
39
39
  opacity: var(--disabled-opacity);
40
40
  }
41
41
 
42
+ @media (forced-colors: active) {
43
+ :where([data-control-family="pagination"][data-slot="link"][data-active="true"]:not(:focus-visible)) {
44
+ outline: var(--focus-ring-width) solid Highlight;
45
+ outline-offset: calc(var(--focus-ring-width) * -1);
46
+ }
47
+ }
48
+
42
49
  :where([data-control-family="pagination"][data-slot="link"]:has(> svg:first-child)) {
43
50
  padding-inline-start: calc(var(--spacing) * 2);
44
51
  }
@@ -39,14 +39,12 @@
39
39
  :where(
40
40
  [data-control-family="scroll-area"][data-slot="root"][data-scrollbar-gutter="stable"]
41
41
  > [data-slot="scrollbar"][data-orientation="vertical"]:not([data-has-overflow-y])
42
- > [data-slot="thumb"]
43
42
  ),
44
43
  :where(
45
44
  [data-control-family="scroll-area"][data-slot="root"][data-scrollbar-gutter="stable"]
46
45
  > [data-slot="scrollbar"][data-orientation="horizontal"]:not([data-has-overflow-x])
47
- > [data-slot="thumb"]
48
46
  ) {
49
- display: none;
47
+ visibility: hidden;
50
48
  }
51
49
 
52
50
  @supports (corner-shape: squircle) {
@@ -0,0 +1,143 @@
1
+ @layer components {
2
+ :where([data-control-family="swap"][data-slot="root"]) {
3
+ --cui-swap-animation-duration: var(--duration-slow);
4
+ --cui-swap-easing: var(--ease-emphasized);
5
+ --cui-swap-label-inset: 60%;
6
+ --cui-swap-icon-scale: 0.5;
7
+ position: relative;
8
+ display: inline-flex;
9
+ align-items: center;
10
+ gap: inherit;
11
+ inline-size: var(--_swap-inline-size, auto);
12
+ transition: inline-size var(--cui-swap-animation-duration) var(--cui-swap-easing);
13
+ }
14
+
15
+ :where([data-control-family="swap"][data-slot="item"]) {
16
+ display: inline-flex;
17
+ flex: none;
18
+ align-items: center;
19
+ gap: inherit;
20
+ white-space: nowrap;
21
+ }
22
+
23
+ :where([data-control-family="swap"][data-slot="item"]:not([data-state="active"])) {
24
+ position: absolute;
25
+ inset-block: 0;
26
+ inset-inline-start: 0;
27
+ opacity: 0;
28
+ pointer-events: none;
29
+ }
30
+
31
+ :where([data-control-family="swap"][data-slot="item"][data-state="inactive"]) {
32
+ visibility: hidden;
33
+ }
34
+
35
+ :where([data-control-family="swap"][data-slot="label"]) {
36
+ display: inline-block;
37
+ }
38
+
39
+ :where([data-control-family="swap"][data-swapped] > [data-slot="item"][data-state="active"]) {
40
+ animation: cui-swap-item-enter var(--cui-swap-animation-duration) var(--cui-swap-easing) both;
41
+ }
42
+
43
+ :where([data-control-family="swap"][data-swapped] > [data-slot="item"][data-state="exiting"]) {
44
+ animation: cui-swap-item-exit var(--cui-swap-animation-duration) var(--cui-swap-easing) both;
45
+ }
46
+
47
+ :where(
48
+ [data-control-family="swap"][data-swapped]
49
+ > [data-slot="item"][data-state="active"]
50
+ > :not(svg, [data-slot="icon"], [data-control-family="spinner"])
51
+ ) {
52
+ animation: cui-swap-label-enter var(--cui-swap-animation-duration) var(--cui-swap-easing) both;
53
+ }
54
+
55
+ :where(
56
+ [data-control-family="swap"][data-swapped]
57
+ > [data-slot="item"][data-state="exiting"]
58
+ > :not(svg, [data-slot="icon"], [data-control-family="spinner"])
59
+ ) {
60
+ animation: cui-swap-label-exit var(--cui-swap-animation-duration) var(--cui-swap-easing) both;
61
+ }
62
+
63
+ :where(
64
+ [data-control-family="swap"][data-swapped]
65
+ > [data-slot="item"][data-state="active"]
66
+ > :is(svg, [data-slot="icon"], [data-control-family="spinner"])
67
+ ) {
68
+ animation: cui-swap-icon-enter var(--cui-swap-animation-duration) var(--cui-swap-easing) both;
69
+ }
70
+
71
+ :where(
72
+ [data-control-family="swap"][data-swapped]
73
+ > [data-slot="item"][data-state="exiting"]
74
+ > :is(svg, [data-slot="icon"], [data-control-family="spinner"])
75
+ ) {
76
+ animation: cui-swap-icon-exit var(--cui-swap-animation-duration) var(--cui-swap-easing) both;
77
+ }
78
+ }
79
+
80
+ @keyframes cui-swap-item-enter {
81
+ from {
82
+ opacity: 0;
83
+ filter: blur(var(--blur-xs));
84
+ }
85
+ }
86
+
87
+ @keyframes cui-swap-item-exit {
88
+ from {
89
+ opacity: 1;
90
+ filter: blur(0);
91
+ }
92
+ to {
93
+ opacity: 0;
94
+ filter: blur(var(--blur-xs));
95
+ }
96
+ }
97
+
98
+ @keyframes cui-swap-label-enter {
99
+ from {
100
+ translate: 0 var(--cui-swap-label-inset);
101
+ }
102
+ }
103
+
104
+ @keyframes cui-swap-label-exit {
105
+ to {
106
+ translate: 0 calc(var(--cui-swap-label-inset) * -1);
107
+ }
108
+ }
109
+
110
+ @keyframes cui-swap-icon-enter {
111
+ from {
112
+ scale: var(--cui-swap-icon-scale);
113
+ }
114
+ }
115
+
116
+ @keyframes cui-swap-icon-exit {
117
+ to {
118
+ scale: var(--cui-swap-icon-scale);
119
+ }
120
+ }
121
+
122
+ @property --cui-swap-animation-duration {
123
+ syntax: "<time>";
124
+ inherits: true;
125
+ initial-value: 0s;
126
+ }
127
+
128
+ @property --cui-swap-easing {
129
+ syntax: "*";
130
+ inherits: true;
131
+ }
132
+
133
+ @property --cui-swap-label-inset {
134
+ syntax: "<length-percentage>";
135
+ inherits: true;
136
+ initial-value: 0px;
137
+ }
138
+
139
+ @property --cui-swap-icon-scale {
140
+ syntax: "<number>";
141
+ inherits: true;
142
+ initial-value: 1;
143
+ }
@@ -114,6 +114,18 @@
114
114
  opacity: var(--disabled-opacity);
115
115
  }
116
116
 
117
+ @media (forced-colors: active) {
118
+ :where([data-control-family="tabs"][data-slot="list"]:not([data-variant="browser"], [data-single="true"])) {
119
+ outline: 1px solid CanvasText;
120
+ outline-offset: -1px;
121
+ }
122
+
123
+ :where([data-control-family="tabs"][data-slot="list"]:not([data-variant="browser"]) [data-slot="indicator"]) {
124
+ outline: var(--focus-ring-width) solid Highlight;
125
+ outline-offset: calc(var(--focus-ring-width) * -1);
126
+ }
127
+ }
128
+
117
129
  :where([data-control-family="tabs"][data-slot="list"][data-variant="browser"]) {
118
130
  --_tabs-browser-corner-double: calc(var(--_tabs-trigger-radius-fit) + var(--_tabs-trigger-radius-fit));
119
131
  --_tabs-browser-inset: calc(var(--_tabs-trigger-radius-fit) + var(--cui-tabs-surface-radius));