@fragments-sdk/ui 0.8.6 → 0.8.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.
- package/fragments.json +1 -1
- package/package.json +2 -2
- package/src/assets/fragments-logo.tsx +9 -8
- package/src/blocks/AccountSettings.block.ts +1 -1
- package/src/blocks/ActivityFeed.block.ts +1 -1
- package/src/blocks/ChatInterface.block.ts +1 -1
- package/src/blocks/ChatMessages.block.ts +1 -1
- package/src/blocks/CheckoutForm.block.ts +1 -1
- package/src/blocks/CommandPalette.block.ts +34 -0
- package/src/blocks/ContactForm.block.ts +1 -1
- package/src/blocks/DashboardLayout.block.ts +1 -1
- package/src/blocks/DashboardPage.block.ts +1 -1
- package/src/blocks/DataTable.block.ts +1 -1
- package/src/blocks/EmptyState.block.ts +1 -1
- package/src/blocks/FAQSection.block.ts +1 -1
- package/src/blocks/FeatureGrid.block.ts +1 -1
- package/src/blocks/HeroSection.block.ts +1 -1
- package/src/blocks/LoginForm.block.ts +1 -1
- package/src/blocks/NavigationHeader.block.ts +1 -1
- package/src/blocks/PaginatedTable.block.ts +36 -0
- package/src/blocks/PricingComparison.block.ts +1 -1
- package/src/blocks/ProductCard.block.ts +1 -1
- package/src/blocks/RegistrationForm.block.ts +1 -1
- package/src/blocks/SettingsDrawer.block.ts +47 -0
- package/src/blocks/SettingsPanel.block.ts +1 -1
- package/src/blocks/ShoppingCart.block.ts +1 -1
- package/src/blocks/StatsCard.block.ts +1 -1
- package/src/blocks/ThinkingStates.block.ts +1 -1
- package/src/components/Accordion/Accordion.fragment.tsx +1 -1
- package/src/components/Alert/Alert.fragment.tsx +1 -1
- package/src/components/AppShell/AppShell.fragment.tsx +11 -11
- package/src/components/Avatar/Avatar.fragment.tsx +1 -1
- package/src/components/Badge/Badge.fragment.tsx +1 -1
- package/src/components/Box/Box.fragment.tsx +1 -1
- package/src/components/Breadcrumbs/Breadcrumbs.fragment.tsx +1 -1
- package/src/components/Button/Button.fragment.tsx +1 -1
- package/src/components/ButtonGroup/ButtonGroup.fragment.tsx +1 -1
- package/src/components/Card/Card.fragment.tsx +1 -1
- package/src/components/Chart/Chart.fragment.tsx +1 -1
- package/src/components/Checkbox/Checkbox.fragment.tsx +1 -1
- package/src/components/Chip/Chip.fragment.tsx +1 -1
- package/src/components/CodeBlock/CodeBlock.fragment.tsx +1 -1
- package/src/components/Collapsible/Collapsible.fragment.tsx +1 -1
- package/src/components/ColorPicker/ColorPicker.fragment.tsx +1 -1
- package/src/components/Combobox/Combobox.fragment.tsx +1 -1
- package/src/components/Command/Command.fragment.tsx +237 -0
- package/src/components/Command/Command.module.scss +153 -0
- package/src/components/Command/Command.test.tsx +363 -0
- package/src/components/Command/index.tsx +502 -0
- package/src/components/ConversationList/ConversationList.fragment.tsx +1 -1
- package/src/components/DatePicker/DatePicker.fragment.tsx +10 -9
- package/src/components/Dialog/Dialog.fragment.tsx +1 -1
- package/src/components/Drawer/Drawer.fragment.tsx +206 -0
- package/src/components/Drawer/Drawer.module.scss +215 -0
- package/src/components/Drawer/Drawer.test.tsx +227 -0
- package/src/components/Drawer/index.tsx +239 -0
- package/src/components/EmptyState/EmptyState.fragment.tsx +1 -1
- package/src/components/Field/Field.fragment.tsx +1 -1
- package/src/components/Fieldset/Fieldset.fragment.tsx +1 -1
- package/src/components/Form/Form.fragment.tsx +1 -1
- package/src/components/Grid/Grid.fragment.tsx +1 -1
- package/src/components/Header/Header.fragment.tsx +1 -1
- package/src/components/Icon/Icon.fragment.tsx +1 -1
- package/src/components/Image/Image.fragment.tsx +1 -1
- package/src/components/Input/Input.fragment.tsx +1 -1
- package/src/components/Link/Link.fragment.tsx +1 -1
- package/src/components/List/List.fragment.tsx +1 -1
- package/src/components/Listbox/Listbox.fragment.tsx +1 -1
- package/src/components/Loading/Loading.fragment.tsx +1 -1
- package/src/components/Markdown/Markdown.fragment.tsx +1 -1
- package/src/components/Menu/Menu.fragment.tsx +55 -5
- package/src/components/Menu/Menu.module.scss +21 -10
- package/src/components/Menu/Menu.test.tsx +126 -3
- package/src/components/Menu/index.tsx +85 -11
- package/src/components/Message/Message.fragment.tsx +1 -1
- package/src/components/Message/Message.module.scss +2 -1
- package/src/components/NavigationMenu/NavigationMenu.fragment.tsx +1 -1
- package/src/components/Pagination/Pagination.fragment.tsx +152 -0
- package/src/components/Pagination/Pagination.module.scss +109 -0
- package/src/components/Pagination/Pagination.test.tsx +171 -0
- package/src/components/Pagination/index.tsx +360 -0
- package/src/components/Popover/Popover.fragment.tsx +1 -1
- package/src/components/Progress/Progress.fragment.tsx +1 -1
- package/src/components/Prompt/Prompt.fragment.tsx +1 -1
- package/src/components/RadioGroup/RadioGroup.fragment.tsx +1 -1
- package/src/components/ScrollArea/ScrollArea.fragment.tsx +1 -1
- package/src/components/Select/Select.fragment.tsx +1 -1
- package/src/components/Separator/Separator.fragment.tsx +1 -1
- package/src/components/Sidebar/Sidebar.fragment.tsx +2 -2
- package/src/components/Skeleton/Skeleton.fragment.tsx +1 -1
- package/src/components/Slider/Slider.fragment.tsx +1 -1
- package/src/components/Stack/Stack.fragment.tsx +1 -1
- package/src/components/Table/Table.fragment.tsx +1 -1
- package/src/components/TableOfContents/TableOfContents.fragment.tsx +1 -1
- package/src/components/Tabs/Tabs.fragment.tsx +1 -1
- package/src/components/Text/Text.fragment.tsx +1 -1
- package/src/components/Textarea/Textarea.fragment.tsx +1 -1
- package/src/components/Theme/Theme.fragment.tsx +1 -1
- package/src/components/ThinkingIndicator/ThinkingIndicator.fragment.tsx +1 -1
- package/src/components/Toast/Toast.fragment.tsx +1 -1
- package/src/components/Toggle/Toggle.fragment.tsx +1 -1
- package/src/components/ToggleGroup/ToggleGroup.fragment.tsx +1 -1
- package/src/components/Tooltip/Tooltip.fragment.tsx +1 -1
- package/src/components/Tooltip/index.tsx +25 -1
- package/src/components/VisuallyHidden/VisuallyHidden.fragment.tsx +1 -1
- package/src/index.ts +34 -1
- package/src/styles/globals.scss +65 -7
- package/src/tokens/_computed.scss +1 -1
- package/src/tokens/_density.scss +1 -1
- package/src/tokens/_derive.scss +1 -1
- package/src/tokens/_index.scss +1 -1
- package/src/tokens/_mixins.scss +1 -1
- package/src/tokens/_palettes.scss +1 -1
- package/src/tokens/_radius.scss +1 -1
- package/src/tokens/_seeds.scss +1 -1
- package/src/tokens/_variables.scss +2 -2
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { defineFragment } from '@fragments-sdk/cli/core';
|
|
3
|
+
import { Command } from '.';
|
|
4
|
+
import { Dialog } from '../Dialog';
|
|
5
|
+
import { Button } from '../Button';
|
|
6
|
+
|
|
7
|
+
export default defineFragment({
|
|
8
|
+
component: Command,
|
|
9
|
+
|
|
10
|
+
meta: {
|
|
11
|
+
name: 'Command',
|
|
12
|
+
description: 'A searchable command palette for quick actions. Combines an input with a filterable, keyboard-navigable list of actions.',
|
|
13
|
+
category: 'navigation',
|
|
14
|
+
status: 'stable',
|
|
15
|
+
tags: ['command', 'palette', 'search', 'spotlight', 'quick-actions', 'cmdk'],
|
|
16
|
+
since: '0.8.2',
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
usage: {
|
|
20
|
+
when: [
|
|
21
|
+
'Quick-access command palettes (Ctrl+K)',
|
|
22
|
+
'Searchable action menus',
|
|
23
|
+
'Inline command lists with filtering',
|
|
24
|
+
'Application-wide search interfaces',
|
|
25
|
+
],
|
|
26
|
+
whenNot: [
|
|
27
|
+
'Simple dropdown menus (use Menu)',
|
|
28
|
+
'Form field selection (use Select or Combobox)',
|
|
29
|
+
'Static navigation (use Sidebar or Tabs)',
|
|
30
|
+
'Search with complex result types (build custom)',
|
|
31
|
+
],
|
|
32
|
+
guidelines: [
|
|
33
|
+
'Compose inside Dialog for modal command palette usage',
|
|
34
|
+
'Use Command.Group to organize items by category',
|
|
35
|
+
'Provide Command.Empty for no-results feedback',
|
|
36
|
+
'Use keywords prop for items that should match on aliases',
|
|
37
|
+
'Keep item labels short and action-oriented',
|
|
38
|
+
],
|
|
39
|
+
accessibility: [
|
|
40
|
+
'Uses combobox + listbox ARIA pattern',
|
|
41
|
+
'Keyboard navigation with ArrowUp/ArrowDown, Enter to select',
|
|
42
|
+
'Home/End jump to first/last item',
|
|
43
|
+
'aria-activedescendant tracks focused item',
|
|
44
|
+
],
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
props: {
|
|
48
|
+
children: {
|
|
49
|
+
type: 'node',
|
|
50
|
+
description: 'Command.Input, Command.List, and other sub-components',
|
|
51
|
+
required: true,
|
|
52
|
+
},
|
|
53
|
+
search: {
|
|
54
|
+
type: 'string',
|
|
55
|
+
description: 'Controlled search value',
|
|
56
|
+
},
|
|
57
|
+
defaultSearch: {
|
|
58
|
+
type: 'string',
|
|
59
|
+
description: 'Default search value (uncontrolled)',
|
|
60
|
+
default: "''",
|
|
61
|
+
},
|
|
62
|
+
onSearchChange: {
|
|
63
|
+
type: 'function',
|
|
64
|
+
description: 'Called when search input changes',
|
|
65
|
+
},
|
|
66
|
+
filter: {
|
|
67
|
+
type: 'function',
|
|
68
|
+
description: 'Custom filter function. Return 0 to hide, >0 to show.',
|
|
69
|
+
},
|
|
70
|
+
loop: {
|
|
71
|
+
type: 'boolean',
|
|
72
|
+
description: 'Whether to loop keyboard navigation',
|
|
73
|
+
default: 'true',
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
relations: [
|
|
78
|
+
{ component: 'Dialog', relationship: 'sibling', note: 'Compose inside Dialog for modal command palette' },
|
|
79
|
+
{ component: 'Listbox', relationship: 'sibling', note: 'Command uses Listbox-like keyboard navigation internally' },
|
|
80
|
+
{ component: 'Combobox', relationship: 'alternative', note: 'Use Combobox for form field selection with search' },
|
|
81
|
+
],
|
|
82
|
+
|
|
83
|
+
contract: {
|
|
84
|
+
propsSummary: [
|
|
85
|
+
'search: string - controlled search value',
|
|
86
|
+
'onSearchChange: (search) => void - search change handler',
|
|
87
|
+
'filter: (value, search, keywords?) => number - custom filter',
|
|
88
|
+
'loop: boolean - loop keyboard navigation (default: true)',
|
|
89
|
+
'Command.Item value: string - filter match value',
|
|
90
|
+
'Command.Item keywords: string[] - extra filter terms',
|
|
91
|
+
'Command.Item onItemSelect: () => void - selection handler',
|
|
92
|
+
],
|
|
93
|
+
subComponents: [
|
|
94
|
+
{
|
|
95
|
+
name: 'Command.Input',
|
|
96
|
+
props: ['placeholder: string', 'className: string'],
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'Command.List',
|
|
100
|
+
props: ['children: ReactNode'],
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: 'Command.Item',
|
|
104
|
+
props: [
|
|
105
|
+
'value: string - filter value',
|
|
106
|
+
'keywords: string[] - extra keywords',
|
|
107
|
+
'disabled: boolean',
|
|
108
|
+
'onItemSelect: () => void',
|
|
109
|
+
],
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: 'Command.Group',
|
|
113
|
+
props: ['heading: string - group label', 'children: ReactNode'],
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
name: 'Command.Empty',
|
|
117
|
+
props: ['children: ReactNode - empty state message'],
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
name: 'Command.Separator',
|
|
121
|
+
props: [],
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
scenarioTags: [
|
|
125
|
+
'navigation.command',
|
|
126
|
+
'search.palette',
|
|
127
|
+
'action.quick',
|
|
128
|
+
],
|
|
129
|
+
a11yRules: ['A11Y_COMBOBOX_ROLE', 'A11Y_LISTBOX_ROLE', 'A11Y_ACTIVE_DESCENDANT'],
|
|
130
|
+
},
|
|
131
|
+
|
|
132
|
+
ai: {
|
|
133
|
+
compositionPattern: 'compound',
|
|
134
|
+
subComponents: ['Input', 'List', 'Item', 'Group', 'Empty', 'Separator'],
|
|
135
|
+
requiredChildren: ['Input', 'List'],
|
|
136
|
+
commonPatterns: [
|
|
137
|
+
'<Dialog><Dialog.Trigger><Button>Open Palette</Button></Dialog.Trigger><Dialog.Content size="sm"><Command><Command.Input placeholder="Search..." /><Command.List><Command.Group heading="Actions"><Command.Item onItemSelect={() => {}}>Action 1</Command.Item></Command.Group><Command.Empty>No results.</Command.Empty></Command.List></Command></Dialog.Content></Dialog>',
|
|
138
|
+
],
|
|
139
|
+
},
|
|
140
|
+
|
|
141
|
+
variants: [
|
|
142
|
+
{
|
|
143
|
+
name: 'Default',
|
|
144
|
+
description: 'Inline command list with search',
|
|
145
|
+
render: () => (
|
|
146
|
+
<div style={{ maxWidth: '400px', width: '100%' }}>
|
|
147
|
+
<Command>
|
|
148
|
+
<Command.Input placeholder="Type a command..." />
|
|
149
|
+
<Command.List>
|
|
150
|
+
<Command.Item onItemSelect={() => {}}>Open File</Command.Item>
|
|
151
|
+
<Command.Item onItemSelect={() => {}}>Save Document</Command.Item>
|
|
152
|
+
<Command.Item onItemSelect={() => {}}>Print</Command.Item>
|
|
153
|
+
<Command.Empty>No results found.</Command.Empty>
|
|
154
|
+
</Command.List>
|
|
155
|
+
</Command>
|
|
156
|
+
</div>
|
|
157
|
+
),
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
name: 'Dialog Command Palette',
|
|
161
|
+
description: 'Command palette inside a Dialog',
|
|
162
|
+
render: () => (
|
|
163
|
+
<Dialog>
|
|
164
|
+
<Dialog.Trigger asChild>
|
|
165
|
+
<Button variant="secondary">Open Command Palette</Button>
|
|
166
|
+
</Dialog.Trigger>
|
|
167
|
+
<Dialog.Content size="sm">
|
|
168
|
+
<Command>
|
|
169
|
+
<Command.Input placeholder="Search commands..." />
|
|
170
|
+
<Command.List>
|
|
171
|
+
<Command.Group heading="Actions">
|
|
172
|
+
<Command.Item onItemSelect={() => {}}>New File</Command.Item>
|
|
173
|
+
<Command.Item onItemSelect={() => {}}>Open Recent</Command.Item>
|
|
174
|
+
</Command.Group>
|
|
175
|
+
<Command.Separator />
|
|
176
|
+
<Command.Group heading="Settings">
|
|
177
|
+
<Command.Item onItemSelect={() => {}}>Preferences</Command.Item>
|
|
178
|
+
<Command.Item onItemSelect={() => {}}>Keyboard Shortcuts</Command.Item>
|
|
179
|
+
</Command.Group>
|
|
180
|
+
<Command.Empty>No results found.</Command.Empty>
|
|
181
|
+
</Command.List>
|
|
182
|
+
</Command>
|
|
183
|
+
</Dialog.Content>
|
|
184
|
+
</Dialog>
|
|
185
|
+
),
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
name: 'With Groups',
|
|
189
|
+
description: 'Organized by category groups',
|
|
190
|
+
render: () => (
|
|
191
|
+
<div style={{ maxWidth: '400px', width: '100%' }}>
|
|
192
|
+
<Command>
|
|
193
|
+
<Command.Input placeholder="Search..." />
|
|
194
|
+
<Command.List>
|
|
195
|
+
<Command.Group heading="Suggestions">
|
|
196
|
+
<Command.Item onItemSelect={() => {}}>Calendar</Command.Item>
|
|
197
|
+
<Command.Item onItemSelect={() => {}}>Calculator</Command.Item>
|
|
198
|
+
</Command.Group>
|
|
199
|
+
<Command.Separator />
|
|
200
|
+
<Command.Group heading="Settings">
|
|
201
|
+
<Command.Item onItemSelect={() => {}}>Profile</Command.Item>
|
|
202
|
+
<Command.Item onItemSelect={() => {}}>Billing</Command.Item>
|
|
203
|
+
<Command.Item disabled onItemSelect={() => {}}>
|
|
204
|
+
Team (coming soon)
|
|
205
|
+
</Command.Item>
|
|
206
|
+
</Command.Group>
|
|
207
|
+
<Command.Empty>No results found.</Command.Empty>
|
|
208
|
+
</Command.List>
|
|
209
|
+
</Command>
|
|
210
|
+
</div>
|
|
211
|
+
),
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
name: 'With Icons',
|
|
215
|
+
description: 'Items with leading icons',
|
|
216
|
+
render: () => (
|
|
217
|
+
<div style={{ maxWidth: '400px', width: '100%' }}>
|
|
218
|
+
<Command>
|
|
219
|
+
<Command.Input placeholder="What do you need?" />
|
|
220
|
+
<Command.List>
|
|
221
|
+
<Command.Item onItemSelect={() => {}}>
|
|
222
|
+
<span style={{ marginRight: '0.5rem', fontSize: '1rem' }}>+</span> New Document
|
|
223
|
+
</Command.Item>
|
|
224
|
+
<Command.Item onItemSelect={() => {}}>
|
|
225
|
+
<span style={{ marginRight: '0.5rem', fontSize: '1rem' }}>{'>'}</span> Open Folder
|
|
226
|
+
</Command.Item>
|
|
227
|
+
<Command.Item onItemSelect={() => {}}>
|
|
228
|
+
<span style={{ marginRight: '0.5rem', fontSize: '1rem' }}>?</span> Search
|
|
229
|
+
</Command.Item>
|
|
230
|
+
<Command.Empty>No results found.</Command.Empty>
|
|
231
|
+
</Command.List>
|
|
232
|
+
</Command>
|
|
233
|
+
</div>
|
|
234
|
+
),
|
|
235
|
+
},
|
|
236
|
+
],
|
|
237
|
+
});
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
@use '../../tokens/variables' as *;
|
|
2
|
+
@use '../../tokens/mixins' as *;
|
|
3
|
+
|
|
4
|
+
// ============================================
|
|
5
|
+
// Command container
|
|
6
|
+
// ============================================
|
|
7
|
+
|
|
8
|
+
.command {
|
|
9
|
+
@include surface-elevated;
|
|
10
|
+
|
|
11
|
+
display: flex;
|
|
12
|
+
flex-direction: column;
|
|
13
|
+
overflow: hidden;
|
|
14
|
+
box-shadow: var(--fui-shadow-md);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// ============================================
|
|
18
|
+
// Input area
|
|
19
|
+
// ============================================
|
|
20
|
+
|
|
21
|
+
.inputWrapper {
|
|
22
|
+
display: flex;
|
|
23
|
+
align-items: center;
|
|
24
|
+
gap: var(--fui-space-2, 0.5rem);
|
|
25
|
+
padding: var(--fui-padding-item-sm, 0.5rem) var(--fui-padding-container-md, 1rem);
|
|
26
|
+
border-bottom: 1px solid var(--fui-border);
|
|
27
|
+
|
|
28
|
+
svg {
|
|
29
|
+
flex-shrink: 0;
|
|
30
|
+
width: 1rem;
|
|
31
|
+
height: 1rem;
|
|
32
|
+
color: var(--fui-text-secondary);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.input {
|
|
37
|
+
@include text-base;
|
|
38
|
+
|
|
39
|
+
width: 100%;
|
|
40
|
+
border: none;
|
|
41
|
+
background: transparent;
|
|
42
|
+
outline: none;
|
|
43
|
+
font-size: var(--fui-font-size-sm, 0.875rem);
|
|
44
|
+
color: var(--fui-text-primary);
|
|
45
|
+
padding: var(--fui-space-1, 0.25rem) 0;
|
|
46
|
+
|
|
47
|
+
&::placeholder {
|
|
48
|
+
color: var(--fui-text-tertiary);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// ============================================
|
|
53
|
+
// List area
|
|
54
|
+
// ============================================
|
|
55
|
+
|
|
56
|
+
.list {
|
|
57
|
+
overflow-y: auto;
|
|
58
|
+
max-height: 300px;
|
|
59
|
+
padding: var(--fui-padding-item-xs, 0.25rem);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// ============================================
|
|
63
|
+
// Item
|
|
64
|
+
// ============================================
|
|
65
|
+
|
|
66
|
+
.item {
|
|
67
|
+
@include button-reset;
|
|
68
|
+
@include text-base;
|
|
69
|
+
|
|
70
|
+
display: flex;
|
|
71
|
+
align-items: center;
|
|
72
|
+
gap: var(--fui-space-2, 0.5rem);
|
|
73
|
+
width: 100%;
|
|
74
|
+
padding: var(--fui-padding-item-xs, 0.25rem) var(--fui-padding-item-md, 0.75rem);
|
|
75
|
+
border-radius: var(--fui-radius-sm, 0.25rem);
|
|
76
|
+
cursor: pointer;
|
|
77
|
+
text-align: left;
|
|
78
|
+
color: var(--fui-text-primary);
|
|
79
|
+
background: transparent;
|
|
80
|
+
border: none;
|
|
81
|
+
font-size: var(--fui-font-size-sm, 0.875rem);
|
|
82
|
+
transition: background-color 0.1s ease;
|
|
83
|
+
|
|
84
|
+
&:hover {
|
|
85
|
+
background-color: var(--fui-bg-hover);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.itemActive {
|
|
90
|
+
background-color: var(--fui-bg-hover);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.itemDisabled {
|
|
94
|
+
color: var(--fui-text-tertiary);
|
|
95
|
+
cursor: not-allowed;
|
|
96
|
+
|
|
97
|
+
&:hover {
|
|
98
|
+
background-color: transparent;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// ============================================
|
|
103
|
+
// Group
|
|
104
|
+
// ============================================
|
|
105
|
+
|
|
106
|
+
.group {
|
|
107
|
+
&:not(:first-child) {
|
|
108
|
+
margin-top: var(--fui-space-1, 0.25rem);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.groupHeading {
|
|
113
|
+
padding: var(--fui-padding-item-xs, 0.25rem) var(--fui-padding-item-md, 0.75rem);
|
|
114
|
+
font-size: var(--fui-font-size-xs, 0.75rem);
|
|
115
|
+
font-weight: var(--fui-font-weight-medium, 500);
|
|
116
|
+
color: var(--fui-text-tertiary);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// ============================================
|
|
120
|
+
// Empty state
|
|
121
|
+
// ============================================
|
|
122
|
+
|
|
123
|
+
.empty {
|
|
124
|
+
padding: var(--fui-padding-item-md, 0.75rem);
|
|
125
|
+
font-size: var(--fui-font-size-sm, 0.875rem);
|
|
126
|
+
color: var(--fui-text-secondary);
|
|
127
|
+
text-align: center;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// ============================================
|
|
131
|
+
// Separator
|
|
132
|
+
// ============================================
|
|
133
|
+
|
|
134
|
+
.separator {
|
|
135
|
+
height: 1px;
|
|
136
|
+
margin: var(--fui-space-1, 0.25rem) 0;
|
|
137
|
+
background-color: var(--fui-border);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// ============================================
|
|
141
|
+
// Accessibility: High Contrast Mode
|
|
142
|
+
// ============================================
|
|
143
|
+
|
|
144
|
+
@media (prefers-contrast: more) {
|
|
145
|
+
.command {
|
|
146
|
+
border-width: 2px;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.itemActive {
|
|
150
|
+
outline: 2px solid var(--fui-color-accent);
|
|
151
|
+
outline-offset: -2px;
|
|
152
|
+
}
|
|
153
|
+
}
|