@fragments-sdk/ui 0.18.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/dist/assets/ui.css +2700 -3256
  2. package/dist/chart.cjs +0 -1
  3. package/dist/chart.js +0 -1
  4. package/dist/codeblock.cjs +0 -1
  5. package/dist/codeblock.js +0 -1
  6. package/dist/colorpicker.cjs +0 -1
  7. package/dist/colorpicker.js +0 -1
  8. package/dist/components/Accordion/Accordion.module.scss.cjs +8 -8
  9. package/dist/components/Accordion/Accordion.module.scss.js +8 -8
  10. package/dist/components/Alert/Alert.module.scss.cjs +12 -12
  11. package/dist/components/Alert/Alert.module.scss.js +12 -12
  12. package/dist/components/AppShell/AppShell.module.scss.cjs +12 -12
  13. package/dist/components/AppShell/AppShell.module.scss.js +12 -12
  14. package/dist/components/Avatar/Avatar.module.scss.cjs +13 -13
  15. package/dist/components/Avatar/Avatar.module.scss.js +13 -13
  16. package/dist/components/Badge/Badge.module.scss.cjs +13 -13
  17. package/dist/components/Badge/Badge.module.scss.js +13 -13
  18. package/dist/components/BentoGrid/BentoGrid.module.scss.cjs +14 -14
  19. package/dist/components/BentoGrid/BentoGrid.module.scss.js +14 -14
  20. package/dist/components/Box/Box.module.scss.cjs +152 -152
  21. package/dist/components/Box/Box.module.scss.js +152 -152
  22. package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.cjs +8 -8
  23. package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.js +8 -8
  24. package/dist/components/Button/Button.module.scss.cjs +12 -12
  25. package/dist/components/Button/Button.module.scss.js +12 -12
  26. package/dist/components/Card/Card.module.scss.cjs +14 -14
  27. package/dist/components/Card/Card.module.scss.js +14 -14
  28. package/dist/components/Chart/Chart.module.scss.cjs +15 -15
  29. package/dist/components/Chart/Chart.module.scss.js +15 -15
  30. package/dist/components/Chart/index.d.ts +0 -1
  31. package/dist/components/Chart/index.d.ts.map +1 -1
  32. package/dist/components/Checkbox/Checkbox.module.scss.cjs +10 -10
  33. package/dist/components/Checkbox/Checkbox.module.scss.js +10 -10
  34. package/dist/components/Chip/Chip.module.scss.cjs +15 -15
  35. package/dist/components/Chip/Chip.module.scss.js +15 -15
  36. package/dist/components/CodeBlock/CodeBlock.module.scss.cjs +21 -21
  37. package/dist/components/CodeBlock/CodeBlock.module.scss.js +21 -21
  38. package/dist/components/CodeBlock/index.d.ts +0 -1
  39. package/dist/components/CodeBlock/index.d.ts.map +1 -1
  40. package/dist/components/Collapsible/Collapsible.module.scss.cjs +10 -10
  41. package/dist/components/Collapsible/Collapsible.module.scss.js +10 -10
  42. package/dist/components/ColorPicker/ColorPicker.module.scss.cjs +14 -14
  43. package/dist/components/ColorPicker/ColorPicker.module.scss.js +14 -14
  44. package/dist/components/ColorPicker/index.d.ts +0 -1
  45. package/dist/components/ColorPicker/index.d.ts.map +1 -1
  46. package/dist/components/Combobox/Combobox.module.scss.cjs +23 -23
  47. package/dist/components/Combobox/Combobox.module.scss.js +23 -23
  48. package/dist/components/Combobox/index.cjs +13 -10
  49. package/dist/components/Combobox/index.d.ts.map +1 -1
  50. package/dist/components/Combobox/index.js +13 -10
  51. package/dist/components/Command/Command.module.scss.cjs +11 -11
  52. package/dist/components/Command/Command.module.scss.js +11 -11
  53. package/dist/components/ConversationList/ConversationList.module.scss.cjs +10 -10
  54. package/dist/components/ConversationList/ConversationList.module.scss.js +10 -10
  55. package/dist/components/DataTable/DataTable.module.scss.cjs +26 -26
  56. package/dist/components/DataTable/DataTable.module.scss.js +26 -26
  57. package/dist/components/DataTable/index.cjs +0 -1
  58. package/dist/components/DataTable/index.d.ts +0 -1
  59. package/dist/components/DataTable/index.d.ts.map +1 -1
  60. package/dist/components/DataTable/index.js +0 -1
  61. package/dist/components/DatePicker/DatePicker.module.scss.cjs +31 -31
  62. package/dist/components/DatePicker/DatePicker.module.scss.js +31 -31
  63. package/dist/components/DatePicker/index.d.ts +0 -1
  64. package/dist/components/DatePicker/index.d.ts.map +1 -1
  65. package/dist/components/Dialog/Dialog.module.scss.cjs +14 -14
  66. package/dist/components/Dialog/Dialog.module.scss.js +14 -14
  67. package/dist/components/Drawer/Drawer.module.scss.cjs +33 -27
  68. package/dist/components/Drawer/Drawer.module.scss.js +34 -28
  69. package/dist/components/Drawer/index.cjs +36 -14
  70. package/dist/components/Drawer/index.d.ts +21 -3
  71. package/dist/components/Drawer/index.d.ts.map +1 -1
  72. package/dist/components/Drawer/index.js +36 -14
  73. package/dist/components/Editor/Editor.module.scss.cjs +17 -17
  74. package/dist/components/Editor/Editor.module.scss.js +17 -17
  75. package/dist/components/EmptyState/EmptyState.module.scss.cjs +8 -8
  76. package/dist/components/EmptyState/EmptyState.module.scss.js +8 -8
  77. package/dist/components/Field/Field.module.scss.cjs +4 -4
  78. package/dist/components/Field/Field.module.scss.js +4 -4
  79. package/dist/components/Fieldset/Fieldset.module.scss.cjs +3 -3
  80. package/dist/components/Fieldset/Fieldset.module.scss.js +3 -3
  81. package/dist/components/Header/Header.module.scss.cjs +28 -28
  82. package/dist/components/Header/Header.module.scss.js +28 -28
  83. package/dist/components/Icon/Icon.module.scss.cjs +8 -8
  84. package/dist/components/Icon/Icon.module.scss.js +8 -8
  85. package/dist/components/Image/Image.module.scss.cjs +27 -27
  86. package/dist/components/Image/Image.module.scss.js +27 -27
  87. package/dist/components/Input/Input.module.scss.cjs +19 -19
  88. package/dist/components/Input/Input.module.scss.js +19 -19
  89. package/dist/components/Link/Link.module.scss.cjs +10 -10
  90. package/dist/components/Link/Link.module.scss.js +10 -10
  91. package/dist/components/Listbox/Listbox.module.scss.cjs +8 -8
  92. package/dist/components/Listbox/Listbox.module.scss.js +8 -8
  93. package/dist/components/Loading/Loading.module.scss.cjs +30 -30
  94. package/dist/components/Loading/Loading.module.scss.js +30 -30
  95. package/dist/components/Markdown/Markdown.module.scss.cjs +1 -1
  96. package/dist/components/Markdown/Markdown.module.scss.js +1 -1
  97. package/dist/components/Markdown/index.d.ts +0 -1
  98. package/dist/components/Markdown/index.d.ts.map +1 -1
  99. package/dist/components/Menu/Menu.module.scss.cjs +16 -13
  100. package/dist/components/Menu/Menu.module.scss.js +17 -14
  101. package/dist/components/Menu/index.cjs +1 -1
  102. package/dist/components/Menu/index.d.ts.map +1 -1
  103. package/dist/components/Menu/index.js +1 -1
  104. package/dist/components/Message/Message.module.scss.cjs +18 -18
  105. package/dist/components/Message/Message.module.scss.js +18 -18
  106. package/dist/components/NavigationMenu/NavigationMenu.module.scss.cjs +28 -28
  107. package/dist/components/NavigationMenu/NavigationMenu.module.scss.js +28 -28
  108. package/dist/components/Pagination/Pagination.module.scss.cjs +7 -7
  109. package/dist/components/Pagination/Pagination.module.scss.js +7 -7
  110. package/dist/components/Popover/Popover.module.scss.cjs +10 -10
  111. package/dist/components/Popover/Popover.module.scss.js +10 -10
  112. package/dist/components/Progress/Progress.module.scss.cjs +25 -25
  113. package/dist/components/Progress/Progress.module.scss.js +25 -25
  114. package/dist/components/Prompt/Prompt.module.scss.cjs +26 -14
  115. package/dist/components/Prompt/Prompt.module.scss.js +26 -14
  116. package/dist/components/Prompt/index.cjs +16 -0
  117. package/dist/components/Prompt/index.d.ts +17 -1
  118. package/dist/components/Prompt/index.d.ts.map +1 -1
  119. package/dist/components/Prompt/index.js +16 -0
  120. package/dist/components/RadioGroup/RadioGroup.module.scss.cjs +16 -16
  121. package/dist/components/RadioGroup/RadioGroup.module.scss.js +16 -16
  122. package/dist/components/ScrollArea/ScrollArea.module.scss.cjs +10 -10
  123. package/dist/components/ScrollArea/ScrollArea.module.scss.js +10 -10
  124. package/dist/components/Select/Select.module.scss.cjs +17 -17
  125. package/dist/components/Select/Select.module.scss.js +17 -17
  126. package/dist/components/Select/index.cjs +20 -20
  127. package/dist/components/Select/index.d.ts.map +1 -1
  128. package/dist/components/Select/index.js +20 -20
  129. package/dist/components/Separator/Separator.module.scss.cjs +10 -10
  130. package/dist/components/Separator/Separator.module.scss.js +10 -10
  131. package/dist/components/Sidebar/Sidebar.module.scss.cjs +42 -42
  132. package/dist/components/Sidebar/Sidebar.module.scss.js +42 -42
  133. package/dist/components/Slider/Slider.module.scss.cjs +12 -12
  134. package/dist/components/Slider/Slider.module.scss.js +12 -12
  135. package/dist/components/Slider/index.cjs +23 -21
  136. package/dist/components/Slider/index.js +23 -21
  137. package/dist/components/Stack/Stack.module.scss.cjs +35 -35
  138. package/dist/components/Stack/Stack.module.scss.js +35 -35
  139. package/dist/components/Table/Table.module.scss.cjs +16 -16
  140. package/dist/components/Table/Table.module.scss.js +16 -16
  141. package/dist/components/Table/index.d.ts +0 -1
  142. package/dist/components/Table/index.d.ts.map +1 -1
  143. package/dist/components/TableOfContents/TableOfContents.module.scss.cjs +7 -7
  144. package/dist/components/TableOfContents/TableOfContents.module.scss.js +7 -7
  145. package/dist/components/Tabs/Tabs.module.scss.cjs +9 -9
  146. package/dist/components/Tabs/Tabs.module.scss.js +9 -9
  147. package/dist/components/Text/Text.module.scss.cjs +38 -38
  148. package/dist/components/Text/Text.module.scss.js +38 -38
  149. package/dist/components/Textarea/Textarea.module.scss.cjs +23 -23
  150. package/dist/components/Textarea/Textarea.module.scss.js +23 -23
  151. package/dist/components/Theme/ThemeToggle.module.scss.cjs +6 -6
  152. package/dist/components/Theme/ThemeToggle.module.scss.js +6 -6
  153. package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.cjs +22 -22
  154. package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.js +22 -22
  155. package/dist/components/Toast/Toast.module.scss.cjs +20 -20
  156. package/dist/components/Toast/Toast.module.scss.js +20 -20
  157. package/dist/components/Toggle/Toggle.module.scss.cjs +13 -13
  158. package/dist/components/Toggle/Toggle.module.scss.js +13 -13
  159. package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs +17 -17
  160. package/dist/components/ToggleGroup/ToggleGroup.module.scss.js +17 -17
  161. package/dist/components/Tooltip/Tooltip.module.scss.cjs +3 -3
  162. package/dist/components/Tooltip/Tooltip.module.scss.js +3 -3
  163. package/dist/components/Tooltip/index.cjs +4 -3
  164. package/dist/components/Tooltip/index.d.ts +4 -1
  165. package/dist/components/Tooltip/index.d.ts.map +1 -1
  166. package/dist/components/Tooltip/index.js +4 -3
  167. package/dist/datepicker.cjs +0 -1
  168. package/dist/datepicker.js +0 -1
  169. package/dist/index.cjs +0 -1
  170. package/dist/index.d.ts +2 -3
  171. package/dist/index.d.ts.map +1 -1
  172. package/dist/index.js +0 -1
  173. package/dist/markdown.cjs +0 -1
  174. package/dist/markdown.js +0 -1
  175. package/dist/table.cjs +0 -1
  176. package/dist/table.js +0 -1
  177. package/dist/utils/seed-derivation.cjs +29 -0
  178. package/dist/utils/seed-derivation.d.ts +1 -1
  179. package/dist/utils/seed-derivation.d.ts.map +1 -1
  180. package/dist/utils/seed-derivation.js +29 -0
  181. package/fragments.json +1 -1
  182. package/package.json +18 -14
  183. package/src/components/Button/Button.module.scss +24 -1
  184. package/src/components/Card/Card.module.scss +5 -1
  185. package/src/components/Chart/index.tsx +0 -1
  186. package/src/components/Chip/Chip.module.scss +4 -4
  187. package/src/components/CodeBlock/index.tsx +0 -1
  188. package/src/components/ColorPicker/index.tsx +0 -1
  189. package/src/components/Combobox/index.tsx +7 -8
  190. package/src/components/Command/Command.module.scss +22 -9
  191. package/src/components/DataTable/index.tsx +0 -2
  192. package/src/components/DatePicker/index.tsx +0 -2
  193. package/src/components/Drawer/Drawer.contract.json +1 -0
  194. package/src/components/Drawer/Drawer.module.scss +45 -5
  195. package/src/components/Drawer/index.tsx +66 -23
  196. package/src/components/Header/Header.contract.json +2 -0
  197. package/src/components/Input/Input.module.scss +16 -6
  198. package/src/components/Markdown/Markdown.module.scss +0 -3
  199. package/src/components/Markdown/index.tsx +0 -1
  200. package/src/components/Menu/Menu.module.scss +6 -0
  201. package/src/components/Menu/index.tsx +3 -1
  202. package/src/components/Message/Message.module.scss +2 -2
  203. package/src/components/NavigationMenu/NavigationMenu.module.scss +18 -23
  204. package/src/components/Pagination/Pagination.module.scss +1 -1
  205. package/src/components/Prompt/Prompt.module.scss +117 -3
  206. package/src/components/Prompt/index.tsx +40 -0
  207. package/src/components/Select/index.tsx +20 -25
  208. package/src/components/Sidebar/Sidebar.module.scss +1 -1
  209. package/src/components/Slider/index.tsx +10 -10
  210. package/src/components/Table/index.tsx +0 -2
  211. package/src/components/TableOfContents/TableOfContents.module.scss +19 -15
  212. package/src/components/Toggle/Toggle.module.scss +3 -3
  213. package/src/components/Tooltip/index.tsx +7 -3
  214. package/src/index.ts +8 -3
  215. package/src/styles/globals.scss +6 -1
  216. package/src/tokens/_computed.scss +3 -1
  217. package/src/tokens/_density.scss +4 -4
  218. package/src/tokens/_derive.scss +48 -55
  219. package/src/tokens/_palettes.scss +20 -1
  220. package/src/tokens/_seeds.scss +2 -2
  221. package/src/tokens/_variables.scss +45 -29
  222. package/src/utils/seed-derivation.ts +23 -1
@@ -88,8 +88,11 @@
88
88
  align-items: center;
89
89
 
90
90
  // Auto-detect shortcut kbd via :has() — replaces JS class toggle: `shortcut && styles.hasShortcut`
91
+ // Optical alignment: nudge left padding slightly to center the placeholder
92
+ // in the visible area between the left edge and the kbd badge.
91
93
  &:has(> .shortcut) .input {
92
94
  padding-right: var(--fui-space-12, 3rem);
95
+ padding-left: var(--fui-space-3, $fui-space-3);
93
96
  }
94
97
  }
95
98
 
@@ -101,6 +104,16 @@
101
104
  padding: 0 var(--fui-space-3, $fui-space-3);
102
105
  border-radius: var(--fui-radius-md, $fui-radius-md);
103
106
 
107
+ // Optical alignment: icons have built-in whitespace, so reduce padding
108
+ // on the side with an adornment to keep the content optically centered.
109
+ &:has(> .adornment:first-child) {
110
+ padding-left: var(--fui-space-2, $fui-space-2);
111
+ }
112
+
113
+ &:has(> .adornment:last-of-type:not(:first-child)) {
114
+ padding-right: var(--fui-space-2, $fui-space-2);
115
+ }
116
+
104
117
  &:focus-within {
105
118
  @include field-shell-focus;
106
119
  }
@@ -165,8 +178,8 @@
165
178
  align-items: center;
166
179
  justify-content: center;
167
180
  gap: calc(var(--fui-space-px, $fui-space-px) * 2);
168
- min-width: 1.25rem;
169
- height: 1.25rem;
181
+ min-width: 24px;
182
+ height: 24px;
170
183
  padding: 0 var(--fui-space-1, $fui-space-1);
171
184
  font-size: var(--fui-font-size-2xs, $fui-font-size-2xs);
172
185
  font-family: var(--fui-font-sans, $fui-font-sans);
@@ -175,11 +188,8 @@
175
188
  letter-spacing: 0.02em;
176
189
  color: var(--fui-text-tertiary, $fui-text-tertiary);
177
190
  background: var(--fui-bg-elevated, $fui-bg-elevated);
178
- border: 1px solid var(--fui-border-default, $fui-border-default);
179
- border-bottom-width: 2px;
191
+ border: 1px solid var(--fui-field-border, $fui-border);
180
192
  border-radius: var(--fui-radius-sm, $fui-radius-sm);
181
- box-shadow:
182
- inset 0 0.5px 0 color-mix(in srgb, white 6%, transparent);
183
193
  pointer-events: none;
184
194
  white-space: nowrap;
185
195
  user-select: none;
@@ -7,9 +7,6 @@
7
7
 
8
8
  .markdown {
9
9
  @include text-base;
10
- font-size: 1.25rem;
11
- line-height: 1.7;
12
- letter-spacing: -0.01em;
13
10
  word-wrap: break-word;
14
11
  color: var(--fui-text-secondary, $fui-text-secondary);
15
12
 
@@ -2,7 +2,6 @@
2
2
 
3
3
  import * as React from 'react';
4
4
  import styles from './Markdown.module.scss';
5
- import '../../styles/globals.scss';
6
5
 
7
6
  // ============================================
8
7
  // Types
@@ -36,6 +36,12 @@
36
36
  }
37
37
  }
38
38
 
39
+ // Viewport — enables content transition animations
40
+ .viewport {
41
+ overflow: hidden;
42
+ transition: height var(--fui-transition-fast, $fui-transition-fast);
43
+ }
44
+
39
45
  // Menu item (shared base)
40
46
  .item {
41
47
  @include popup-item;
@@ -191,7 +191,9 @@ function MenuContent({
191
191
  className={styles.positioner}
192
192
  >
193
193
  <BaseMenu.Popup {...htmlProps} className={popupClasses}>
194
- {children}
194
+ <BaseMenu.Viewport className={styles.viewport}>
195
+ {children}
196
+ </BaseMenu.Viewport>
195
197
  </BaseMenu.Popup>
196
198
  </BaseMenu.Positioner>
197
199
  </BaseMenu.Portal>
@@ -36,7 +36,7 @@
36
36
 
37
37
  .content {
38
38
  background-color: var(--fui-color-accent, $fui-color-accent);
39
- color: var(--fui-text-inverse, $fui-text-inverse);
39
+ color: var(--fui-color-on-accent, $fui-color-on-accent);
40
40
  }
41
41
  }
42
42
 
@@ -99,7 +99,7 @@
99
99
 
100
100
  .avatarUser {
101
101
  background-color: var(--fui-color-accent, $fui-color-accent);
102
- color: var(--fui-text-inverse, $fui-text-inverse);
102
+ color: var(--fui-color-on-accent, $fui-color-on-accent);
103
103
  }
104
104
 
105
105
  .avatarAssistant {
@@ -56,7 +56,7 @@
56
56
  display: flex;
57
57
  align-items: center;
58
58
  gap: var(--fui-space-1, $fui-space-1);
59
- padding: var(--fui-space-1, $fui-space-1) var(--fui-space-3, $fui-space-3);
59
+ padding: var(--fui-space-1, $fui-space-1) var(--fui-space-2, $fui-space-2);
60
60
  border-radius: var(--fui-radius-md, $fui-radius-md);
61
61
  color: var(--fui-text-secondary, $fui-text-secondary);
62
62
  white-space: nowrap;
@@ -91,10 +91,14 @@
91
91
  // ============================================
92
92
 
93
93
  .content {
94
+ display: flex;
95
+ flex-direction: column;
96
+ gap: 1px;
94
97
  position: absolute;
95
98
  left: 0;
96
99
  top: 0;
97
- width: auto;
100
+ width: 100%;
101
+ min-width: 180px;
98
102
 
99
103
  // Motion direction for directional slide
100
104
  &[data-motion='from-start'] {
@@ -160,22 +164,17 @@
160
164
  // ============================================
161
165
 
162
166
  .link {
163
- @include text-base;
167
+ @include popup-item;
164
168
 
165
- display: flex;
166
- align-items: center;
167
- padding: var(--fui-space-1, $fui-space-1) var(--fui-space-3, $fui-space-3);
168
- border-radius: var(--fui-radius-md, $fui-radius-md);
169
- color: var(--fui-text-secondary, $fui-text-secondary);
169
+ color: var(--fui-text-primary, $fui-text-primary);
170
170
  text-decoration: none;
171
171
  white-space: nowrap;
172
- min-height: var(--fui-button-height-md, $fui-button-height-md);
172
+ font-size: var(--fui-font-size-sm, $fui-font-size-sm);
173
173
  transition: background-color var(--fui-transition-fast, $fui-transition-fast),
174
174
  color var(--fui-transition-fast, $fui-transition-fast);
175
175
 
176
176
  &:hover {
177
177
  background-color: var(--fui-bg-hover, $fui-bg-hover);
178
- color: var(--fui-text-primary, $fui-text-primary);
179
178
  }
180
179
 
181
180
  &:focus-visible {
@@ -184,21 +183,15 @@
184
183
  }
185
184
 
186
185
  .linkActive {
187
- color: var(--fui-text-primary, $fui-text-primary);
186
+ background-color: var(--fui-bg-hover, $fui-bg-hover);
188
187
  font-weight: var(--fui-font-weight-medium, $fui-font-weight-medium);
189
- background-color: var(--fui-bg-secondary, $fui-bg-secondary);
190
-
191
- &:hover {
192
- background-color: var(--fui-bg-secondary, $fui-bg-secondary);
193
- color: var(--fui-text-primary, $fui-text-primary);
194
- }
195
188
  }
196
189
 
197
190
  // Structured link (title + description + icon) inside content panels
198
191
  .linkStructured {
199
192
  display: flex;
200
- gap: var(--fui-space-3, $fui-space-3);
201
- padding: var(--fui-space-2, $fui-space-2) var(--fui-space-3, $fui-space-3);
193
+ gap: var(--fui-space-2, $fui-space-2);
194
+ padding: var(--fui-space-2, $fui-space-2) var(--fui-space-2, $fui-space-2);
202
195
  border-radius: var(--fui-radius-md, $fui-radius-md);
203
196
  white-space: normal;
204
197
  min-height: auto;
@@ -273,10 +266,12 @@
273
266
  @include surface-elevated;
274
267
 
275
268
  position: absolute;
276
- top: 100%;
269
+ top: calc(100% + var(--fui-space-1, #{$fui-space-1}));
277
270
  left: var(--fui-navmenu-viewport-left, 0);
278
271
  overflow: hidden;
279
- box-shadow: var(--fui-shadow-lg, $fui-shadow-lg);
272
+ padding: var(--fui-space-1, $fui-space-1);
273
+ border-color: var(--fui-border-strong, $fui-border-strong);
274
+ box-shadow: var(--fui-shadow-md, $fui-shadow-md);
280
275
  z-index: calc(var(--fui-header-z-index, $fui-header-z-index) + 1);
281
276
 
282
277
  width: var(--fui-navmenu-viewport-width);
@@ -433,7 +428,7 @@
433
428
  .drawerSectionLabel {
434
429
  @include section-label-text;
435
430
 
436
- padding: var(--fui-space-3, $fui-space-3) var(--fui-space-4, $fui-space-4)
431
+ padding: var(--fui-space-2, $fui-space-2) var(--fui-space-4, $fui-space-4)
437
432
  var(--fui-space-1, $fui-space-1);
438
433
  }
439
434
 
@@ -467,7 +462,7 @@
467
462
  }
468
463
 
469
464
  .drawerCollapsibleContent {
470
- padding-left: var(--fui-space-3, $fui-space-3);
465
+ padding-left: var(--fui-space-2, $fui-space-2);
471
466
  }
472
467
 
473
468
  // ============================================
@@ -57,7 +57,7 @@
57
57
  // Active page
58
58
  .itemActive {
59
59
  background-color: var(--fui-color-accent, $fui-color-accent);
60
- color: var(--fui-text-inverse, $fui-text-inverse);
60
+ color: var(--fui-color-on-accent, $fui-color-on-accent);
61
61
 
62
62
  &:hover:not(:disabled) {
63
63
  background-color: var(--fui-color-accent-hover, $fui-color-accent-hover);
@@ -11,13 +11,77 @@
11
11
  flex-direction: column;
12
12
  border-radius: var(--fui-radius-xl, $fui-radius-xl);
13
13
  overflow: hidden;
14
+ position: relative;
15
+
16
+ // Beam border — rotating conic gradient clipped to a 1px border
17
+ &::before,
18
+ &::after {
19
+ content: '';
20
+ position: absolute;
21
+ inset: 0;
22
+ border-radius: inherit;
23
+ pointer-events: none;
24
+ }
25
+
26
+ // Gradient layer (behind everything)
27
+ &::before {
28
+ inset: -1px;
29
+ z-index: 0;
30
+ background: conic-gradient(
31
+ from var(--beam-angle, 0deg) at 50% 50%,
32
+ transparent 0%,
33
+ transparent 25%,
34
+ var(--fui-color-accent, $fui-color-accent) 45%,
35
+ transparent 50%,
36
+ transparent 55%,
37
+ color-mix(in srgb, var(--fui-color-accent, $fui-color-accent) 40%, transparent) 70%,
38
+ transparent 75%,
39
+ transparent 100%
40
+ );
41
+ animation: beam-rotate 4s linear infinite;
42
+ opacity: 0.6;
43
+ transition: opacity 300ms ease;
44
+ }
45
+
46
+ // Mask layer — covers the interior, leaving only the 1px border visible
47
+ &::after {
48
+ inset: 1px;
49
+ z-index: 1;
50
+ background: var(--fui-bg-elevated, $fui-bg-elevated);
51
+ }
52
+
53
+ // Content must sit above the mask
54
+ > * {
55
+ position: relative;
56
+ z-index: 2;
57
+ }
58
+
59
+ &:focus-within::before {
60
+ opacity: 1;
61
+ }
14
62
 
15
63
  &[data-disabled] {
16
64
  opacity: 0.5;
17
65
  pointer-events: none;
66
+
67
+ &::before {
68
+ animation-play-state: paused;
69
+ opacity: 0.2;
70
+ }
18
71
  }
19
72
  }
20
73
 
74
+ @keyframes beam-rotate {
75
+ from { --beam-angle: 0deg; }
76
+ to { --beam-angle: 360deg; }
77
+ }
78
+
79
+ @property --beam-angle {
80
+ syntax: '<angle>';
81
+ initial-value: 0deg;
82
+ inherits: false;
83
+ }
84
+
21
85
  // Fixed variant - for viewport-fixed prompts (centered to page)
22
86
  .fixed {
23
87
  position: fixed;
@@ -71,9 +135,11 @@
71
135
  color: var(--fui-text-tertiary, $fui-text-tertiary);
72
136
  }
73
137
 
138
+ // Focus is shown on the prompt container via :focus-within instead
139
+ &:focus,
74
140
  &:focus-visible {
75
- @include focus-ring;
76
- border-radius: var(--fui-radius-md, $fui-radius-md);
141
+ outline: none;
142
+ box-shadow: none;
77
143
  }
78
144
 
79
145
  &:disabled {
@@ -81,6 +147,52 @@
81
147
  }
82
148
  }
83
149
 
150
+ // ============================================
151
+ // Tabs (floating above the prompt body)
152
+ // ============================================
153
+
154
+ .tabs {
155
+ display: flex;
156
+ justify-content: center;
157
+ margin-bottom: calc(-1 * var(--fui-space-1, $fui-space-1)); // overlap the prompt border
158
+ position: relative;
159
+ z-index: 1;
160
+ }
161
+
162
+ .tabsInner {
163
+ display: inline-flex;
164
+ gap: 1px;
165
+ background-color: var(--fui-bg-elevated, $fui-bg-elevated);
166
+ border-radius: var(--fui-radius-lg, $fui-radius-lg) var(--fui-radius-lg, $fui-radius-lg) 0 0;
167
+ padding: 3px 3px 0 3px;
168
+ border: 1px solid var(--fui-border, $fui-border);
169
+ border-bottom: none;
170
+ }
171
+
172
+ .tabButton {
173
+ @include button-reset;
174
+
175
+ display: flex;
176
+ align-items: center;
177
+ justify-content: center;
178
+ padding: var(--fui-space-1, $fui-space-1) var(--fui-space-3, $fui-space-3);
179
+ border-radius: var(--fui-radius-md, $fui-radius-md) var(--fui-radius-md, $fui-radius-md) 0 0;
180
+ font-size: var(--fui-font-size-sm, $fui-font-size-sm);
181
+ font-weight: var(--fui-font-weight-medium, $fui-font-weight-medium);
182
+ color: var(--fui-text-tertiary, $fui-text-tertiary);
183
+ transition: all 120ms ease;
184
+ white-space: nowrap;
185
+
186
+ &:hover {
187
+ color: var(--fui-text-primary, $fui-text-primary);
188
+ }
189
+ }
190
+
191
+ .tabButtonActive {
192
+ background-color: var(--fui-bg-secondary, $fui-bg-secondary);
193
+ color: var(--fui-text-primary, $fui-text-primary);
194
+ }
195
+
84
196
  // ============================================
85
197
  // Toolbar
86
198
  // ============================================
@@ -102,7 +214,9 @@
102
214
  .actions {
103
215
  display: flex;
104
216
  align-items: center;
217
+ align-self: flex-end;
105
218
  gap: var(--fui-space-1, $fui-space-1);
219
+ padding: 0 var(--fui-space-2, $fui-space-2) var(--fui-space-2, $fui-space-2) 0;
106
220
  }
107
221
 
108
222
  .info {
@@ -201,7 +315,7 @@
201
315
  height: 2rem;
202
316
  border-radius: var(--fui-radius-full, $fui-radius-full);
203
317
  background-color: var(--fui-color-accent, $fui-color-accent);
204
- color: var(--fui-text-inverse, $fui-text-inverse);
318
+ color: var(--fui-color-on-accent, $fui-color-on-accent);
205
319
 
206
320
  &:hover:not(:disabled) {
207
321
  background-color: var(--fui-color-accent-hover, $fui-color-accent-hover);
@@ -55,6 +55,20 @@ export interface PromptToolbarProps {
55
55
  className?: string;
56
56
  }
57
57
 
58
+ export interface PromptTabsProps {
59
+ children: React.ReactNode;
60
+ className?: string;
61
+ }
62
+
63
+ export interface PromptTabProps {
64
+ children: React.ReactNode;
65
+ /** Whether this tab is currently active */
66
+ active?: boolean;
67
+ /** Click handler */
68
+ onClick?: React.MouseEventHandler<HTMLButtonElement>;
69
+ className?: string;
70
+ }
71
+
58
72
  export interface PromptActionsProps {
59
73
  children?: React.ReactNode;
60
74
  className?: string;
@@ -330,6 +344,28 @@ function PromptToolbar({ children, className }: PromptToolbarProps) {
330
344
  return <div className={classes}>{children}</div>;
331
345
  }
332
346
 
347
+ function PromptTabs({ children, className }: PromptTabsProps) {
348
+ const classes = [styles.tabs, className].filter(Boolean).join(' ');
349
+ return (
350
+ <div className={classes}>
351
+ <div className={styles.tabsInner}>{children}</div>
352
+ </div>
353
+ );
354
+ }
355
+
356
+ function PromptTab({ children, active = false, onClick, className }: PromptTabProps) {
357
+ const classes = [
358
+ styles.tabButton,
359
+ active && styles.tabButtonActive,
360
+ className,
361
+ ].filter(Boolean).join(' ');
362
+ return (
363
+ <button type="button" className={classes} onClick={onClick} aria-pressed={active}>
364
+ {children}
365
+ </button>
366
+ );
367
+ }
368
+
333
369
  function PromptActions({ children, className }: PromptActionsProps) {
334
370
  if (!children) return null;
335
371
  const classes = [styles.actions, className].filter(Boolean).join(' ');
@@ -444,6 +480,8 @@ function PromptSubmit({
444
480
  export const Prompt = Object.assign(PromptRoot, {
445
481
  Textarea: PromptTextarea,
446
482
  Toolbar: PromptToolbar,
483
+ Tabs: PromptTabs,
484
+ Tab: PromptTab,
447
485
  Actions: PromptActions,
448
486
  Info: PromptInfo,
449
487
  ActionButton: PromptActionButton,
@@ -456,6 +494,8 @@ export {
456
494
  PromptRoot,
457
495
  PromptTextarea,
458
496
  PromptToolbar,
497
+ PromptTabs,
498
+ PromptTab,
459
499
  PromptActions,
460
500
  PromptInfo,
461
501
  PromptActionButton,
@@ -221,40 +221,35 @@ const SelectRoot = React.forwardRef<HTMLDivElement, SelectProps>(function Select
221
221
  [placeholder, value, internalValue, items, registerItem, unregisterItem, size]
222
222
  );
223
223
 
224
- const { labelId, helperId, errorId, hasError, errorMessage } = useFormFieldIds('select', { label, helperText, error });
224
+ const { helperId, errorId, hasError, errorMessage } = useFormFieldIds('select', { label, helperText, error });
225
225
 
226
226
  const wrapperClasses = [styles.wrapper, className].filter(Boolean).join(' ');
227
227
  const helperClasses = [styles.helper, hasError && styles.helperError]
228
228
  .filter(Boolean)
229
229
  .join(' ');
230
230
 
231
- const selectContent = (
232
- <BaseSelect.Root
233
- value={value}
234
- defaultValue={defaultValue}
235
- onValueChange={handleValueChange}
236
- open={open}
237
- defaultOpen={defaultOpen}
238
- onOpenChange={onOpenChange}
239
- disabled={disabled}
240
- required={required}
241
- name={name}
242
- aria-labelledby={labelId}
243
- aria-describedby={mergeAriaIds(errorId, helperId)}
244
- >
245
- {children ?? options?.map((option) => (
246
- <SelectItem key={option.value} value={option.value} disabled={option.disabled}>
247
- {option.label}
248
- </SelectItem>
249
- ))}
250
- </BaseSelect.Root>
251
- );
252
-
253
231
  return (
254
232
  <SelectContext.Provider value={contextValue}>
255
233
  <div ref={ref} className={wrapperClasses}>
256
- {label && <span id={labelId} className={styles.label}>{label}</span>}
257
- {selectContent}
234
+ <BaseSelect.Root
235
+ value={value}
236
+ defaultValue={defaultValue}
237
+ onValueChange={handleValueChange}
238
+ open={open}
239
+ defaultOpen={defaultOpen}
240
+ onOpenChange={onOpenChange}
241
+ disabled={disabled}
242
+ required={required}
243
+ name={name}
244
+ aria-describedby={mergeAriaIds(errorId, helperId)}
245
+ >
246
+ {label && <BaseSelect.Label className={styles.label}>{label}</BaseSelect.Label>}
247
+ {children ?? options?.map((option) => (
248
+ <SelectItem key={option.value} value={option.value} disabled={option.disabled}>
249
+ {option.label}
250
+ </SelectItem>
251
+ ))}
252
+ </BaseSelect.Root>
258
253
  {helperText && (
259
254
  <span id={helperId} className={helperClasses}>{helperText}</span>
260
255
  )}
@@ -318,7 +318,7 @@
318
318
  font-weight: var(--fui-font-weight-medium, $fui-font-weight-medium);
319
319
  // Use accent-hover for WCAG AA contrast (4.5:1 minimum)
320
320
  background-color: var(--fui-color-accent-hover, $fui-color-accent-hover);
321
- color: var(--fui-text-inverse, $fui-text-inverse);
321
+ color: var(--fui-color-on-accent, $fui-color-on-accent);
322
322
  border-radius: var(--fui-radius-full, $fui-radius-full);
323
323
  min-width: $fui-icon-lg;
324
324
  line-height: 1;
@@ -111,16 +111,6 @@ const SliderRoot = React.forwardRef<HTMLDivElement, SliderProps>(
111
111
 
112
112
  return (
113
113
  <Field.Root {...htmlProps} disabled={disabled} invalid={error} className={[styles.wrapper, className].filter(Boolean).join(' ')}>
114
- {(label || showValue) && (
115
- <div className={styles.header}>
116
- {label && <Field.Label className={styles.label}>{label}</Field.Label>}
117
- {showValue && (
118
- <span className={styles.value}>
119
- {displayValue}{valueSuffix}
120
- </span>
121
- )}
122
- </div>
123
- )}
124
114
  <BaseSlider.Root
125
115
  ref={ref}
126
116
  value={value !== undefined ? [value] : undefined}
@@ -138,6 +128,16 @@ const SliderRoot = React.forwardRef<HTMLDivElement, SliderProps>(
138
128
  className={styles.root}
139
129
  onPointerDownCapture={handleDragStart}
140
130
  >
131
+ {(label || showValue) && (
132
+ <div className={styles.header}>
133
+ {label && <BaseSlider.Label className={styles.label}>{label}</BaseSlider.Label>}
134
+ {showValue && (
135
+ <span className={styles.value}>
136
+ {displayValue}{valueSuffix}
137
+ </span>
138
+ )}
139
+ </div>
140
+ )}
141
141
  <BaseSlider.Control className={styles.control}>
142
142
  <BaseSlider.Track className={styles.track}>
143
143
  <BaseSlider.Indicator className={styles.indicator} />
@@ -1,8 +1,6 @@
1
1
  'use client';
2
2
 
3
3
  import * as React from 'react';
4
- // Import globals to ensure CSS variables are defined
5
- import '../../styles/globals.scss';
6
4
  import styles from './Table.module.scss';
7
5
 
8
6
  // ============================================
@@ -1,4 +1,5 @@
1
1
  @use '../../tokens/variables' as *;
2
+ @use '../../tokens/mixins' as *;
2
3
 
3
4
  // Root nav wrapper
4
5
  .root {
@@ -10,7 +11,7 @@
10
11
  // Title text ("On This Page")
11
12
  .title {
12
13
  margin: 0;
13
- padding: 0 0 var(--fui-space-2, $fui-space-2) 0;
14
+ padding: 0 var(--fui-space-2, $fui-space-2) var(--fui-space-2, $fui-space-2);
14
15
  }
15
16
 
16
17
  // List container
@@ -20,6 +21,7 @@
20
21
  list-style: none;
21
22
  margin: 0;
22
23
  padding: 0;
24
+ gap: var(--fui-space-0-5, $fui-space-0-5);
23
25
  }
24
26
 
25
27
  // Individual item
@@ -27,40 +29,42 @@
27
29
  display: block;
28
30
  }
29
31
 
30
- // Link styling shared by all items
32
+ // Link styling matches Sidebar.Item pattern
31
33
  .link {
32
- display: block;
33
- padding: var(--fui-space-1, $fui-space-1) 0 var(--fui-space-1, $fui-space-1) var(--fui-space-3, $fui-space-3);
34
- border-left: 2px solid transparent;
34
+ display: flex;
35
+ align-items: center;
36
+ padding: var(--fui-space-1, $fui-space-1) var(--fui-space-2, $fui-space-2);
37
+ border-radius: var(--fui-radius-md, $fui-radius-md);
35
38
  color: var(--fui-text-secondary, $fui-text-secondary);
36
39
  font-size: var(--fui-font-size-xs, $fui-font-size-xs);
37
40
  line-height: var(--fui-line-height-normal, $fui-line-height-normal);
38
41
  text-decoration: none;
39
- transition: color var(--fui-transition-fast, $fui-transition-fast),
40
- border-color var(--fui-transition-fast, $fui-transition-fast);
42
+ transition: background-color var(--fui-transition-fast, $fui-transition-fast),
43
+ color var(--fui-transition-fast, $fui-transition-fast);
41
44
 
42
45
  &:hover {
46
+ background-color: var(--fui-bg-hover, $fui-bg-hover);
43
47
  color: var(--fui-text-primary, $fui-text-primary);
44
48
  }
45
49
 
46
50
  &:focus-visible {
47
- outline: var(--fui-focus-ring-width, $fui-focus-ring-width) solid var(--fui-focus-ring-color, $fui-focus-ring-color);
48
- outline-offset: var(--fui-focus-ring-offset, $fui-focus-ring-offset);
49
- border-radius: var(--fui-radius-sm, $fui-radius-sm);
51
+ @include focus-ring;
50
52
  }
51
53
  }
52
54
 
53
55
  // Indent for depth > 2 (h3s)
54
56
  .indent {
55
- padding-left: var(--fui-space-6, $fui-space-6);
57
+ padding-left: var(--fui-space-5, $fui-space-5);
56
58
  }
57
59
 
58
- // Active state
60
+ // Active state — matches Sidebar.Item active pattern
59
61
  .active {
60
- border-left-color: var(--fui-color-accent, $fui-color-accent);
61
- color: var(--fui-color-accent, $fui-color-accent);
62
+ background-color: var(--fui-bg-secondary, $fui-bg-secondary);
63
+ color: var(--fui-text-primary, $fui-text-primary);
64
+ font-weight: var(--fui-font-weight-medium, $fui-font-weight-medium);
62
65
 
63
66
  &:hover {
64
- color: var(--fui-color-accent, $fui-color-accent);
67
+ background-color: var(--fui-bg-secondary, $fui-bg-secondary);
68
+ color: var(--fui-text-primary, $fui-text-primary);
65
69
  }
66
70
  }
@@ -62,7 +62,7 @@
62
62
  width: var(--fui-toggle-width-sm, $fui-toggle-width-sm);
63
63
  height: var(--fui-toggle-height-sm, $fui-toggle-height-sm);
64
64
  --_toggle-thumb-size: calc(var(--fui-toggle-height-sm, #{$fui-toggle-height-sm}) - 4px);
65
- --_toggle-inset: 2px;
65
+ --_toggle-inset: 1px;
66
66
  --_toggle-translate: calc(
67
67
  var(--fui-toggle-width-sm, #{$fui-toggle-width-sm}) -
68
68
  var(--_toggle-thumb-size) -
@@ -75,7 +75,7 @@
75
75
  width: var(--fui-toggle-width-lg, $fui-toggle-width-lg);
76
76
  height: var(--fui-toggle-height-lg, $fui-toggle-height-lg);
77
77
  --_toggle-thumb-size: calc(var(--fui-toggle-height-lg, #{$fui-toggle-height-lg}) - 4px);
78
- --_toggle-inset: 2px;
78
+ --_toggle-inset: 1px;
79
79
  --_toggle-translate: calc(
80
80
  var(--fui-toggle-width-lg, #{$fui-toggle-width-lg}) -
81
81
  var(--_toggle-thumb-size) -
@@ -88,7 +88,7 @@
88
88
  width: var(--fui-toggle-width-md, $fui-toggle-width-md);
89
89
  height: var(--fui-toggle-height-md, $fui-toggle-height-md);
90
90
  --_toggle-thumb-size: calc(var(--fui-toggle-height-md, #{$fui-toggle-height-md}) - 4px);
91
- --_toggle-inset: 2px;
91
+ --_toggle-inset: 1px;
92
92
  --_toggle-translate: calc(
93
93
  var(--fui-toggle-width-md, #{$fui-toggle-width-md}) -
94
94
  var(--_toggle-thumb-size) -