@ctrl-ui/react 0.9.5 → 0.9.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/README.md +38 -2
  2. package/dist/action-bar.js +16 -8
  3. package/dist/activity.d.ts +4 -2
  4. package/dist/activity.js +5 -2
  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 +101 -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 +82 -0
  13. package/dist/blocks/agent-run.js +262 -0
  14. package/dist/blocks/coding-agent.d.ts +1 -1
  15. package/dist/blocks/coding-agent.js +50 -69
  16. package/dist/blocks/design-canvas-data.d.ts +1 -1
  17. package/dist/blocks/design-canvas-inspector.js +1 -1
  18. package/dist/blocks/design-canvas.d.ts +2 -1
  19. package/dist/blocks/design-canvas.js +56 -42
  20. package/dist/blocks/discussion.js +1 -1
  21. package/dist/blocks/file-explorer.js +66 -47
  22. package/dist/blocks/settings.js +37 -41
  23. package/dist/blocks/team-chat.js +2 -1
  24. package/dist/blocks/theme-toggle.d.ts +2 -1
  25. package/dist/blocks/theme-toggle.js +13 -4
  26. package/dist/chat-message.js +33 -39
  27. package/dist/hooks/use-mobile.d.ts +1 -1
  28. package/dist/hooks/use-mobile.js +1 -1
  29. package/dist/knob-contracts/badge-knobs.d.ts +1 -1
  30. package/dist/knob-contracts/badge-knobs.js +3 -1
  31. package/dist/knob-contracts/button-knobs.d.ts +1 -1
  32. package/dist/knob-contracts/button-knobs.js +1 -0
  33. package/dist/knob-contracts/calendar-knobs.d.ts +1 -1
  34. package/dist/knob-contracts/calendar-knobs.js +9 -1
  35. package/dist/knob-contracts/card-knobs.d.ts +1 -1
  36. package/dist/knob-contracts/card-knobs.js +5 -1
  37. package/dist/knob-contracts/choice-knobs.d.ts +1 -1
  38. package/dist/knob-contracts/choice-knobs.js +1 -0
  39. package/dist/knob-contracts/collapsible-knobs.d.ts +1 -1
  40. package/dist/knob-contracts/collapsible-knobs.js +5 -1
  41. package/dist/knob-contracts/emoji-picker-knobs.d.ts +1 -1
  42. package/dist/knob-contracts/emoji-picker-knobs.js +3 -1
  43. package/dist/knob-contracts/field-knobs.d.ts +1 -1
  44. package/dist/knob-contracts/field-knobs.js +17 -1
  45. package/dist/knob-contracts/infinite-canvas-knobs.d.ts +1 -1
  46. package/dist/knob-contracts/infinite-canvas-knobs.js +1 -7
  47. package/dist/knob-contracts/item-knobs.d.ts +1 -1
  48. package/dist/knob-contracts/item-knobs.js +5 -1
  49. package/dist/knob-contracts/kbd-knobs.d.ts +1 -1
  50. package/dist/knob-contracts/kbd-knobs.js +4 -1
  51. package/dist/knob-contracts/page-layout-knobs.d.ts +1 -1
  52. package/dist/knob-contracts/page-layout-knobs.js +1 -0
  53. package/dist/knob-contracts/pagination-knobs.d.ts +1 -1
  54. package/dist/knob-contracts/pagination-knobs.js +2 -1
  55. package/dist/knob-contracts/popup-knobs.d.ts +1 -1
  56. package/dist/knob-contracts/popup-knobs.js +9 -0
  57. package/dist/knob-contracts/range-knobs.d.ts +1 -1
  58. package/dist/knob-contracts/range-knobs.js +2 -0
  59. package/dist/knob-contracts/sidebar-knobs.d.ts +1 -1
  60. package/dist/knob-contracts/sidebar-knobs.js +2 -0
  61. package/dist/knob-contracts/swap-knobs.d.ts +4 -0
  62. package/dist/knob-contracts/swap-knobs.js +9 -0
  63. package/dist/knob-contracts/tabs-knobs.d.ts +1 -1
  64. package/dist/knob-contracts/tabs-knobs.js +3 -0
  65. package/dist/knob-contracts/timeline-knobs.d.ts +1 -1
  66. package/dist/knob-contracts/timeline-knobs.js +5 -1
  67. package/dist/knob-contracts/tool-approval-knobs.d.ts +4 -0
  68. package/dist/knob-contracts/tool-approval-knobs.js +32 -0
  69. package/dist/knob-contracts/tree-knobs.d.ts +1 -1
  70. package/dist/knob-contracts/tree-knobs.js +3 -1
  71. package/dist/lib/infinite-canvas-camera-store.d.ts +65 -0
  72. package/dist/lib/infinite-canvas-camera-store.js +233 -0
  73. package/dist/lib/infinite-canvas-camera.d.ts +33 -0
  74. package/dist/lib/infinite-canvas-camera.js +98 -0
  75. package/dist/lib/infinite-canvas-navigation.d.ts +19 -0
  76. package/dist/lib/infinite-canvas-navigation.js +395 -0
  77. package/dist/markdown-editor/bubble-menu.d.ts +6 -0
  78. package/dist/markdown-editor/bubble-menu.js +45 -0
  79. package/dist/markdown-editor/toolbar.d.ts +17 -1
  80. package/dist/markdown-editor/toolbar.js +103 -81
  81. package/dist/skin.d.ts +2 -0
  82. package/dist/styles/index.css +11 -10
  83. package/dist/styles/recipes/activity.css +12 -0
  84. package/dist/styles/recipes/avatar.css +1 -1
  85. package/dist/styles/recipes/badge.css +17 -0
  86. package/dist/styles/recipes/button-group.css +12 -6
  87. package/dist/styles/recipes/button.css +20 -3
  88. package/dist/styles/recipes/calendar.css +82 -6
  89. package/dist/styles/recipes/card.css +40 -5
  90. package/dist/styles/recipes/chat-message-edit.css +6 -21
  91. package/dist/styles/recipes/choice.css +9 -2
  92. package/dist/styles/recipes/collapsible.css +8 -1
  93. package/dist/styles/recipes/color-picker-values.css +4 -0
  94. package/dist/styles/recipes/emoji-picker.css +29 -8
  95. package/dist/styles/recipes/field-parts.css +80 -5
  96. package/dist/styles/recipes/field.css +113 -40
  97. package/dist/styles/recipes/infinite-canvas.css +17 -57
  98. package/dist/styles/recipes/item.css +33 -5
  99. package/dist/styles/recipes/kbd.css +26 -6
  100. package/dist/styles/recipes/markdown-editor.css +12 -0
  101. package/dist/styles/recipes/morphing-panel.css +1 -1
  102. package/dist/styles/recipes/page-layout.css +18 -2
  103. package/dist/styles/recipes/pagination.css +8 -0
  104. package/dist/styles/recipes/popup-controls.css +9 -0
  105. package/dist/styles/recipes/popup-drawer.css +1 -0
  106. package/dist/styles/recipes/popup-lists.css +55 -6
  107. package/dist/styles/recipes/popup-motion.css +7 -1
  108. package/dist/styles/recipes/popup.css +10 -0
  109. package/dist/styles/recipes/range.css +16 -2
  110. package/dist/styles/recipes/sidebar-mobile.css +1 -1
  111. package/dist/styles/recipes/sidebar-parts.css +17 -1
  112. package/dist/styles/recipes/sidebar.css +11 -0
  113. package/dist/styles/recipes/swap.css +143 -0
  114. package/dist/styles/recipes/tabs.css +41 -8
  115. package/dist/styles/recipes/timeline.css +36 -2
  116. package/dist/styles/recipes/tool-approval.css +267 -0
  117. package/dist/styles/recipes/track-highlight.css +19 -6
  118. package/dist/styles/recipes/tree.css +33 -0
  119. package/dist/styles/theme.css +17 -6
  120. package/dist/tool-approval.d.ts +49 -0
  121. package/dist/tool-approval.js +260 -0
  122. package/dist/ui/alert-dialog.js +1 -1
  123. package/dist/ui/badge.js +1 -1
  124. package/dist/ui/calendar.js +9 -4
  125. package/dist/ui/card.d.ts +3 -1
  126. package/dist/ui/card.js +2 -1
  127. package/dist/ui/code.js +13 -3
  128. package/dist/ui/command.js +1 -0
  129. package/dist/ui/dialog.js +1 -1
  130. package/dist/ui/dropdown-menu.d.ts +1 -1
  131. package/dist/ui/dropdown-menu.js +23 -6
  132. package/dist/ui/dropzone.js +10 -11
  133. package/dist/ui/field.d.ts +6 -2
  134. package/dist/ui/field.js +4 -2
  135. package/dist/ui/infinite-canvas.d.ts +19 -22
  136. package/dist/ui/infinite-canvas.js +264 -325
  137. package/dist/ui/morphing-panel.d.ts +5 -1
  138. package/dist/ui/morphing-panel.js +4 -2
  139. package/dist/ui/rich-tooltip.d.ts +2 -1
  140. package/dist/ui/rich-tooltip.js +32 -29
  141. package/dist/ui/select.js +2 -2
  142. package/dist/ui/sidebar-mobile.js +1 -1
  143. package/dist/ui/sidebar-provider.d.ts +3 -1
  144. package/dist/ui/sidebar-provider.js +3 -2
  145. package/dist/ui/sidebar-resize-rail.js +1 -1
  146. package/dist/ui/sidebar.d.ts +6 -5
  147. package/dist/ui/sidebar.js +10 -9
  148. package/dist/ui/swap.d.ts +14 -0
  149. package/dist/ui/swap.js +69 -0
  150. package/dist/ui/tabs.d.ts +1 -1
  151. package/dist/ui/tabs.js +2 -13
  152. package/dist/ui/timeline.d.ts +1 -1
  153. package/dist/ui/timeline.js +2 -2
  154. package/dist/ui/typography.d.ts +11 -5
  155. package/dist/ui/typography.js +18 -6
  156. package/dist/user-ask.js +1 -1
  157. package/lint/biome-preset.json +3 -0
  158. package/lint/class-policy.mjs +17 -0
  159. package/lint/eslint-plugin.mjs +87 -0
  160. package/lint/grit-rules.mjs +40 -0
  161. package/lint/no-component-style-classes.grit +16 -0
  162. package/lint/no-raw-type-classes.grit +3 -4
  163. package/lint/write-grit-rules.mjs +19 -0
  164. package/package.json +12 -3
  165. package/dist/styles/type-scale.css +0 -72
package/dist/skin.d.ts CHANGED
@@ -40,6 +40,8 @@ export type ControlUiSkin = {
40
40
  scrollAreaBlur?: boolean;
41
41
  scrollAreaScrollbarVisibility?: "scroll" | "hover" | "always";
42
42
  scrollAreaScrollbarGutter?: "auto" | "stable";
43
+ selectAlignItemWithTrigger?: boolean;
44
+ calendarShowOutsideDays?: boolean;
43
45
  indicators?: SkinIndicators;
44
46
  effects?: ControlEffect[];
45
47
  adornments?: { [Scope in SkinAdornmentScope]?: { [Part in SkinAdornmentPart<Scope>]?: AdornmentEntry<SkinAdornmentContexts[Scope][Part]>; }; };
@@ -2,37 +2,38 @@
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 "./recipes/alert.css";
26
+ @import "./recipes/page-layout.css";
23
27
  @import "./recipes/app-shell-header.css";
24
28
  @import "./recipes/field.css";
25
29
  @import "./recipes/field-parts.css";
26
- @import "./type-scale.css";
27
30
  @import "./recipes/audio-device-select.css";
28
31
  @import "./recipes/audio-visualizer.css";
29
32
  @import "./recipes/audio-recorder.css";
30
33
  @import "./recipes/avatar.css";
31
- @import "./recipes/badge.css";
32
34
  @import "./recipes/breadcrumb.css";
33
35
  @import "./recipes/button-group.css";
34
36
  @import "./recipes/calendar.css";
35
- @import "./recipes/card.css";
36
37
  @import "./recipes/channel-strip.css";
37
38
  @import "./recipes/chart.css";
38
39
  @import "./recipes/chat-message.css";
@@ -47,22 +48,22 @@
47
48
  @import "./code.css";
48
49
  @import "./recipes/code.css";
49
50
  @import "./recipes/code-diff.css";
51
+ @import "./recipes/separator.css";
52
+ @import "./recipes/item.css";
50
53
  @import "./recipes/color-picker.css";
51
54
  @import "./recipes/color-picker-details.css";
52
55
  @import "./recipes/color-picker-values.css";
53
56
  @import "./recipes/gradient-editor.css";
54
57
  @import "./recipes/empty.css";
55
58
  @import "./recipes/context.css";
59
+ @import "./recipes/toolbar.css";
56
60
  @import "./recipes/infinite-canvas.css";
57
61
  @import "./recipes/resizable.css";
58
- @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";
63
65
  @import "./recipes/markdown-editor.css";
64
66
  @import "./recipes/dockable-panel.css";
65
- @import "./recipes/item.css";
66
67
  @import "./recipes/dropzone.css";
67
68
  @import "./recipes/dynamic-notification.css";
68
69
  @import "./recipes/dynamic-notification-input.css";
@@ -91,8 +92,8 @@
91
92
  @import "./recipes/table-of-contents.css";
92
93
  @import "./recipes/task-list.css";
93
94
  @import "./recipes/thread-rail.css";
94
- @import "./recipes/timeline.css";
95
95
  @import "./recipes/popup-toast.css";
96
+ @import "./recipes/tool-approval.css";
96
97
  @import "./recipes/transcript-divider.css";
97
98
  @import "./recipes/tree.css";
98
99
  @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);
@@ -101,6 +109,10 @@
101
109
  font-family: var(--font-mono);
102
110
  }
103
111
 
112
+ :where([data-control-family="activity"][data-slot="detail-content"][data-tone="destructive"]) {
113
+ color: var(--destructive-text);
114
+ }
115
+
104
116
  :where([data-control-family="activity"][data-slot="detail-content"][data-format="code"]) {
105
117
  padding-inline: calc(var(--spacing) * 2);
106
118
  padding-block: calc(var(--spacing) * 1.5);
@@ -8,6 +8,7 @@
8
8
  --cui-avatar-badge-foreground: var(--primary-foreground);
9
9
  inline-size: calc(var(--spacing) * 9);
10
10
  block-size: calc(var(--spacing) * 9);
11
+ font-size: var(--text-caption);
11
12
  }
12
13
 
13
14
  :where([data-control-family="avatar"][data-slot="root"]),
@@ -79,7 +80,6 @@
79
80
  border-radius: inherit;
80
81
  background: var(--cui-avatar-fallback-background);
81
82
  color: var(--cui-avatar-fallback-foreground);
82
- font-size: var(--text-caption);
83
83
  font-weight: var(--font-weight-medium);
84
84
  }
85
85
  }
@@ -6,17 +6,22 @@
6
6
  --cui-badge-background: var(--_badge-color-background);
7
7
  --cui-badge-foreground: var(--_badge-color-foreground);
8
8
  --cui-badge-border-color: transparent;
9
+ --cui-badge-border-width: 1px;
9
10
  --cui-badge-font-size: var(--text-caption);
11
+ --cui-badge-font-weight: var(--font-weight-medium);
10
12
  --_badge-color-background: var(--badge-neutral);
11
13
  --_badge-color-foreground: var(--badge-neutral-foreground);
12
14
  --_badge-color-border: var(--badge-neutral-border);
13
15
  --_badge-color-background-hover: var(--badge-neutral-hover);
14
16
  --_badge-hover-background: var(--_badge-color-background-hover);
17
+ border-style: solid;
18
+ border-width: var(--cui-badge-border-width);
15
19
  border-color: var(--cui-badge-border-color);
16
20
  border-radius: var(--cui-badge-radius);
17
21
  background: var(--cui-badge-background);
18
22
  color: var(--cui-badge-foreground);
19
23
  font-size: var(--cui-badge-font-size);
24
+ font-weight: var(--cui-badge-font-weight);
20
25
  font-variant-numeric: tabular-nums;
21
26
  }
22
27
 
@@ -113,8 +118,20 @@
113
118
  initial-value: transparent;
114
119
  }
115
120
 
121
+ @property --cui-badge-border-width {
122
+ syntax: "<length>";
123
+ inherits: true;
124
+ initial-value: 0px;
125
+ }
126
+
116
127
  @property --cui-badge-font-size {
117
128
  syntax: "<length-percentage>";
118
129
  inherits: true;
119
130
  initial-value: 0px;
120
131
  }
132
+
133
+ @property --cui-badge-font-weight {
134
+ syntax: "<number>";
135
+ inherits: true;
136
+ initial-value: 400;
137
+ }
@@ -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
  }
@@ -31,6 +31,7 @@
31
31
  --cui-button-padding-inline: var(--padding-x);
32
32
  --cui-button-icon-padding-inline: max(0px, calc(var(--cui-button-padding-inline) - var(--spacing) * 0.5));
33
33
  --cui-button-font-size: var(--text-body);
34
+ --cui-button-font-weight: var(--font-weight-medium);
34
35
  --cui-button-background: transparent;
35
36
  --cui-button-background-image: none;
36
37
  --cui-button-foreground: var(--muted-foreground);
@@ -55,7 +56,7 @@
55
56
  box-shadow: var(--cui-button-shadow);
56
57
  color: var(--cui-button-foreground);
57
58
  cursor: pointer;
58
- font-weight: var(--font-weight-medium);
59
+ font-weight: var(--cui-button-font-weight);
59
60
  transition-property: scale, translate;
60
61
  transition-timing-function: var(--ease-standard);
61
62
  transition-duration: var(--duration-fast);
@@ -95,7 +96,12 @@
95
96
  :where(
96
97
  [data-control-family="button"][data-control="true"][data-size]:not([data-icon-only="true"]):has(
97
98
  > :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-slot="content"] > :is(svg, [data-slot="icon"]):first-child:not(:only-child),
100
+ > [data-control-family="swap"]:first-child > [data-state="active"] > :is(svg, [data-slot="icon"]):first-child:not(:only-child),
101
+ > [data-slot="content"]
102
+ > [data-control-family="swap"]:first-child
103
+ > [data-state="active"]
104
+ > :is(svg, [data-slot="icon"]):first-child:not(:only-child)
99
105
  )
100
106
  ) {
101
107
  padding-inline-start: var(--cui-button-icon-padding-inline);
@@ -104,7 +110,12 @@
104
110
  :where(
105
111
  [data-control-family="button"][data-control="true"][data-size]:not([data-icon-only="true"]):has(
106
112
  > :is(svg, [data-slot="icon"]):last-child:not(:only-child),
107
- > [data-slot="content"] > :is(svg, [data-slot="icon"]):last-child:not(:only-child)
113
+ > [data-slot="content"] > :is(svg, [data-slot="icon"]):last-child:not(:only-child),
114
+ > [data-control-family="swap"]:last-child > [data-state="active"] > :is(svg, [data-slot="icon"]):last-child:not(:only-child),
115
+ > [data-slot="content"]
116
+ > [data-control-family="swap"]:last-child
117
+ > [data-state="active"]
118
+ > :is(svg, [data-slot="icon"]):last-child:not(:only-child)
108
119
  )
109
120
  ) {
110
121
  padding-inline-end: var(--cui-button-icon-padding-inline);
@@ -247,6 +258,12 @@
247
258
  initial-value: 0px;
248
259
  }
249
260
 
261
+ @property --cui-button-font-weight {
262
+ syntax: "<number>";
263
+ inherits: true;
264
+ initial-value: 400;
265
+ }
266
+
250
267
  @property --cui-button-background {
251
268
  syntax: "<color>";
252
269
  inherits: true;
@@ -6,12 +6,20 @@
6
6
  --cui-calendar-selected-background: var(--primary);
7
7
  --cui-calendar-selected-foreground: var(--primary-foreground);
8
8
  --cui-calendar-range-background: var(--accent);
9
+ --cui-calendar-day-size: calc(var(--spacing) * 9);
10
+ --cui-calendar-cell-padding: 0px;
11
+ --cui-calendar-today-shadow: none;
12
+ --cui-calendar-weekend-foreground: var(--foreground);
13
+ --cui-calendar-weekend-background: transparent;
14
+ --cui-calendar-caption-font-size: var(--text-body);
15
+ --cui-calendar-caption-font-weight: var(--font-weight-medium);
16
+ --cui-calendar-weekday-font-size: var(--text-caption);
9
17
  }
10
18
 
11
19
  :where([data-control-family="calendar"][data-slot="caption-label"]) {
12
20
  color: var(--foreground);
13
- font-size: var(--text-body);
14
- font-weight: var(--font-weight-medium);
21
+ font-size: var(--cui-calendar-caption-font-size);
22
+ font-weight: var(--cui-calendar-caption-font-weight);
15
23
  line-height: 1.4;
16
24
  }
17
25
 
@@ -31,7 +39,7 @@
31
39
  :where([data-control-family="calendar"][data-slot="weekday"]) {
32
40
  padding-block-end: calc(var(--spacing) * 1.5);
33
41
  color: var(--muted-foreground);
34
- font-size: var(--text-caption);
42
+ font-size: var(--cui-calendar-weekday-font-size);
35
43
  font-weight: var(--font-weight-normal);
36
44
  }
37
45
 
@@ -54,8 +62,8 @@
54
62
  }
55
63
 
56
64
  :where([data-control-family="calendar"][data-slot="day"]) {
57
- block-size: calc(var(--spacing) * 9);
58
- min-inline-size: calc(var(--spacing) * 9);
65
+ block-size: var(--cui-calendar-day-size);
66
+ min-inline-size: var(--cui-calendar-day-size);
59
67
  border-radius: var(--cui-calendar-day-radius);
60
68
  color: var(--foreground);
61
69
  font-size: var(--text-body);
@@ -64,6 +72,10 @@
64
72
  font-variant-numeric: tabular-nums;
65
73
  }
66
74
 
75
+ :where([data-control-family="calendar"][data-slot="day-cell"][data-weekend] > [data-slot="day"]) {
76
+ color: var(--cui-calendar-weekend-foreground);
77
+ }
78
+
67
79
  @media (hover: hover) {
68
80
  :where([data-control-family="calendar"][data-slot="day"]:hover:not(:disabled, [aria-disabled="true"])) {
69
81
  background-color: var(--accent);
@@ -74,6 +86,7 @@
74
86
  :where([data-control-family="calendar"][data-slot="day"][data-today]) {
75
87
  background-color: var(--cui-calendar-today-background);
76
88
  color: var(--accent-foreground);
89
+ box-shadow: var(--cui-calendar-today-shadow);
77
90
  font-weight: var(--font-weight-medium);
78
91
  }
79
92
 
@@ -101,12 +114,28 @@
101
114
  }
102
115
 
103
116
  :where([data-control-family="calendar"][data-slot="day-cell"]) {
117
+ padding: var(--cui-calendar-cell-padding);
104
118
  text-align: center;
105
119
  }
106
120
 
121
+ :where([data-control-family="calendar"][data-slot="day-cell"][data-weekend]) {
122
+ background-color: var(--cui-calendar-weekend-background);
123
+ }
124
+
125
+ :where([data-control-family="calendar"][data-slot="month-grid"] > tbody > tr:first-child > [data-slot="day-cell"][data-weekend]) {
126
+ border-start-start-radius: calc(var(--cui-calendar-cell-padding) * 2);
127
+ border-start-end-radius: calc(var(--cui-calendar-cell-padding) * 2);
128
+ }
129
+
130
+ :where([data-control-family="calendar"][data-slot="month-grid"] > tbody > tr:last-child > [data-slot="day-cell"][data-weekend]) {
131
+ border-end-start-radius: calc(var(--cui-calendar-cell-padding) * 2);
132
+ border-end-end-radius: calc(var(--cui-calendar-cell-padding) * 2);
133
+ }
134
+
107
135
  :where([data-control-family="calendar"][data-slot="month-grid"]) {
108
136
  margin-block-start: calc(var(--spacing) * 1);
109
- border-collapse: collapse;
137
+ border-collapse: separate;
138
+ border-spacing: 0;
110
139
  }
111
140
 
112
141
  @media (pointer: coarse) {
@@ -159,3 +188,50 @@
159
188
  inherits: true;
160
189
  initial-value: transparent;
161
190
  }
191
+
192
+ @property --cui-calendar-day-size {
193
+ syntax: "<length-percentage>";
194
+ inherits: true;
195
+ initial-value: 0px;
196
+ }
197
+
198
+ @property --cui-calendar-cell-padding {
199
+ syntax: "<length-percentage>";
200
+ inherits: true;
201
+ initial-value: 0px;
202
+ }
203
+
204
+ @property --cui-calendar-today-shadow {
205
+ syntax: "*";
206
+ inherits: true;
207
+ }
208
+
209
+ @property --cui-calendar-weekend-foreground {
210
+ syntax: "<color>";
211
+ inherits: true;
212
+ initial-value: transparent;
213
+ }
214
+
215
+ @property --cui-calendar-weekend-background {
216
+ syntax: "<color>";
217
+ inherits: true;
218
+ initial-value: transparent;
219
+ }
220
+
221
+ @property --cui-calendar-caption-font-size {
222
+ syntax: "<length-percentage>";
223
+ inherits: true;
224
+ initial-value: 0px;
225
+ }
226
+
227
+ @property --cui-calendar-caption-font-weight {
228
+ syntax: "<number>";
229
+ inherits: true;
230
+ initial-value: 400;
231
+ }
232
+
233
+ @property --cui-calendar-weekday-font-size {
234
+ syntax: "<length-percentage>";
235
+ inherits: true;
236
+ initial-value: 0px;
237
+ }
@@ -6,6 +6,10 @@
6
6
  --cui-card-border-width: var(--control-rim-width);
7
7
  --cui-card-shadow: var(--shadow-sm);
8
8
  --cui-card-backdrop-filter: none;
9
+ --cui-card-padding-block: calc(var(--spacing) * 6);
10
+ --cui-card-padding-inline: calc(var(--spacing) * 6);
11
+ --cui-card-gap: calc(var(--spacing) * 6);
12
+ --cui-card-title-font-size: 1em;
9
13
  border: var(--cui-card-border-width) solid var(--cui-card-border-color);
10
14
  border-radius: var(--cui-card-radius);
11
15
  background: var(--cui-card-background);
@@ -13,21 +17,27 @@
13
17
  box-shadow: var(--cui-card-shadow);
14
18
  -webkit-backdrop-filter: var(--cui-card-backdrop-filter);
15
19
  backdrop-filter: var(--cui-card-backdrop-filter);
16
- gap: calc(var(--spacing) * 6);
17
- padding-block: calc(var(--spacing) * 6);
20
+ gap: var(--cui-card-gap);
21
+ padding-block: var(--cui-card-padding-block);
18
22
  }
19
23
 
20
24
  :where([data-control-family="card"][data-slot="header"]) {
21
25
  gap: calc(var(--spacing) * 1.5);
22
- padding-inline: calc(var(--spacing) * 6);
26
+ padding-inline: var(--cui-card-padding-inline);
23
27
  }
24
28
 
25
29
  :where([data-control-family="card"][data-slot="content"]) {
26
- padding-inline: calc(var(--spacing) * 6);
30
+ padding-inline: var(--cui-card-padding-inline);
27
31
  }
28
32
 
29
33
  :where([data-control-family="card"][data-slot="footer"]) {
30
- padding-inline: calc(var(--spacing) * 6);
34
+ padding-inline: var(--cui-card-padding-inline);
35
+ }
36
+
37
+ :where([data-control-family="card"][data-slot="root"][data-size="sm"]) {
38
+ --cui-card-padding-block: calc(var(--spacing) * 3);
39
+ --cui-card-padding-inline: calc(var(--spacing) * 4);
40
+ --cui-card-gap: calc(var(--spacing) * 3);
31
41
  }
32
42
 
33
43
  :where([data-control-family="card"][data-slot="root"][data-variant="sectioned"]) {
@@ -46,6 +56,7 @@
46
56
  }
47
57
 
48
58
  :where([data-control-family="card"][data-slot="title"]) {
59
+ font-size: var(--cui-card-title-font-size);
49
60
  font-weight: var(--font-weight-semibold);
50
61
  line-height: var(--leading-tight);
51
62
  text-wrap: balance;
@@ -91,3 +102,27 @@
91
102
  syntax: "*";
92
103
  inherits: true;
93
104
  }
105
+
106
+ @property --cui-card-padding-block {
107
+ syntax: "<length-percentage>";
108
+ inherits: true;
109
+ initial-value: 0px;
110
+ }
111
+
112
+ @property --cui-card-padding-inline {
113
+ syntax: "<length-percentage>";
114
+ inherits: true;
115
+ initial-value: 0px;
116
+ }
117
+
118
+ @property --cui-card-gap {
119
+ syntax: "<length-percentage>";
120
+ inherits: true;
121
+ initial-value: 0px;
122
+ }
123
+
124
+ @property --cui-card-title-font-size {
125
+ syntax: "<length-percentage>";
126
+ inherits: true;
127
+ initial-value: 0px;
128
+ }
@@ -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"]) {
@@ -1,8 +1,9 @@
1
1
  @layer components {
2
2
  :where([data-control-family="choice"][data-choice-kind="checkbox"][data-slot="root"]),
3
3
  :where([data-control-family="choice"][data-choice-kind="radio-group"][data-slot="item"]) {
4
- inline-size: calc(var(--spacing) * 4);
5
- block-size: calc(var(--spacing) * 4);
4
+ --cui-choice-size: calc(var(--spacing) * 4);
5
+ inline-size: var(--cui-choice-size);
6
+ block-size: var(--cui-choice-size);
6
7
  --cui-choice-radius: var(--radius-sm);
7
8
  --cui-choice-shadow: inset 0 0 0 var(--cui-choice-border-width) var(--cui-choice-border-color), var(--shadow-sm);
8
9
  --cui-choice-border-color: var(--control-boundary);
@@ -95,6 +96,12 @@
95
96
  }
96
97
  }
97
98
 
99
+ @property --cui-choice-size {
100
+ syntax: "<length-percentage>";
101
+ inherits: true;
102
+ initial-value: 0px;
103
+ }
104
+
98
105
  @property --cui-choice-radius {
99
106
  syntax: "<length-percentage>";
100
107
  inherits: true;
@@ -2,6 +2,7 @@
2
2
  :where([data-control-family="collapsible"][data-slot="root"]) {
3
3
  --cui-collapsible-trigger-radius: var(--radius-control);
4
4
  --cui-collapsible-trigger-hover-background: var(--hover-fill);
5
+ --cui-collapsible-trigger-padding-inline: calc(var(--spacing) * 2);
5
6
  }
6
7
 
7
8
  :where([data-control-family="collapsible"][data-slot="trigger"]) {
@@ -11,7 +12,7 @@
11
12
  align-items: center;
12
13
  gap: calc(var(--spacing) * 2);
13
14
  border-radius: var(--cui-collapsible-trigger-radius);
14
- padding-inline: calc(var(--spacing) * 2);
15
+ padding-inline: var(--cui-collapsible-trigger-padding-inline);
15
16
  color: var(--foreground);
16
17
  font-size: var(--text-label);
17
18
  font-weight: var(--font-weight-medium);
@@ -79,3 +80,9 @@
79
80
  inherits: true;
80
81
  initial-value: transparent;
81
82
  }
83
+
84
+ @property --cui-collapsible-trigger-padding-inline {
85
+ syntax: "<length-percentage>";
86
+ inherits: true;
87
+ initial-value: 0px;
88
+ }
@@ -1,4 +1,8 @@
1
1
  @layer components {
2
+ :where([data-control-family="color-picker"][data-slot="output"]) {
3
+ gap: calc(var(--spacing) * 2);
4
+ }
5
+
2
6
  :where([data-control-family="color-picker"][data-slot="output-value"]) {
3
7
  font-family: var(--font-mono);
4
8
  font-size: var(--text-caption);