@toolr/ui-design 0.1.2 → 0.1.4
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/README.md +0 -7
- package/components/content/info-panel-primitives.tsx +3 -3
- package/components/lib/ai-tools.tsx +1 -1
- package/components/lib/form-colors.ts +3 -0
- package/components/lib/theme-engine.ts +10 -0
- package/components/sections/captured-issues/captured-issues-panel.tsx +1 -1
- package/components/sections/golden-snapshots/file-diff-viewer.tsx +2 -2
- package/components/sections/golden-snapshots/snapshot-manager.tsx +3 -3
- package/components/sections/golden-snapshots/status-overview.tsx +4 -4
- package/components/sections/golden-snapshots/version-manager.tsx +3 -3
- package/components/sections/report-bug/screenshot-uploader.tsx +2 -2
- package/components/sections/snapshot-browser/snapshot-tree.tsx +1 -1
- package/components/sections/snippets-editor/snippets-editor.tsx +5 -5
- package/components/ui/action-dialog.tsx +1 -1
- package/components/ui/badge.tsx +8 -6
- package/components/ui/breadcrumb.tsx +1 -1
- package/components/ui/confirm-badge.tsx +4 -2
- package/components/ui/file-structure-section.tsx +139 -74
- package/components/ui/file-tree.tsx +2 -2
- package/components/ui/files-panel.tsx +5 -5
- package/components/ui/filter-dropdown.tsx +3 -3
- package/components/ui/frontmatter-form-header.tsx +2 -2
- package/components/ui/icon-button.tsx +6 -2
- package/components/ui/input.tsx +1 -1
- package/components/ui/label.tsx +8 -5
- package/components/ui/modal.tsx +1 -1
- package/components/ui/nav-card.tsx +1 -1
- package/components/ui/navigation-bar.tsx +1 -1
- package/components/ui/number-input.tsx +1 -1
- package/components/ui/registry-card.tsx +7 -7
- package/components/ui/registry-detail.tsx +5 -2
- package/components/ui/resizable-textarea.tsx +2 -2
- package/components/ui/segmented-toggle.tsx +36 -18
- package/components/ui/select.tsx +3 -3
- package/components/ui/selection-grid.tsx +7 -19
- package/components/ui/settings-card.tsx +27 -0
- package/components/ui/settings-info-box.tsx +80 -0
- package/components/ui/settings-section-title.tsx +24 -0
- package/components/ui/snapshot-card.tsx +2 -2
- package/components/ui/snippets-panel.tsx +9 -9
- package/components/ui/sort-dropdown.tsx +1 -1
- package/components/ui/tab-bar.tsx +1 -1
- package/components/ui/tooltip.tsx +1 -1
- package/dist/content.js +3 -3
- package/dist/index.d.ts +93 -46
- package/dist/index.js +1452 -1236
- package/dist/tokens/primitives.css +10 -0
- package/dist/tokens/semantic.css +3 -0
- package/index.ts +4 -1
- package/package.json +1 -7
- package/tokens/primitives.css +10 -0
- package/tokens/semantic.css +3 -0
- package/dist/preset.d.ts +0 -24
- package/dist/preset.js +0 -17
- package/tailwind-preset.ts +0 -22
|
@@ -29,6 +29,7 @@ export interface RegistryDetailProps {
|
|
|
29
29
|
// File structure (rendered when files + onFetchContent are provided)
|
|
30
30
|
files?: FileStructureSectionProps['files']
|
|
31
31
|
rootName?: string
|
|
32
|
+
fileStructureVariant?: FileStructureSectionProps['variant']
|
|
32
33
|
onFetchContent?: FileStructureSectionProps['onFetchContent']
|
|
33
34
|
|
|
34
35
|
// Above header (e.g. badge row)
|
|
@@ -121,7 +122,7 @@ function CompatibleWithSection({ tools }: { tools: string[] }) {
|
|
|
121
122
|
{tools.map((tool) => (
|
|
122
123
|
<div key={tool} className="flex flex-col items-center gap-1">
|
|
123
124
|
<AiToolIcon tool={tool} size={18} />
|
|
124
|
-
<span className="text-
|
|
125
|
+
<span className="text-xss text-neutral-400">{AI_TOOL_NAMES[tool as AiToolKey] ?? tool}</span>
|
|
125
126
|
</div>
|
|
126
127
|
))}
|
|
127
128
|
</div>
|
|
@@ -145,6 +146,7 @@ export function RegistryDetail({
|
|
|
145
146
|
compatibleTools,
|
|
146
147
|
files,
|
|
147
148
|
rootName,
|
|
149
|
+
fileStructureVariant,
|
|
148
150
|
onFetchContent,
|
|
149
151
|
aboveHeader,
|
|
150
152
|
maxWidth = 'max-w-[1440px]',
|
|
@@ -160,7 +162,7 @@ export function RegistryDetail({
|
|
|
160
162
|
<div className="min-w-0">
|
|
161
163
|
<div className="flex items-center gap-3 flex-wrap">
|
|
162
164
|
<Icon className={`w-6 h-6 shrink-0 ${iconColor}`} />
|
|
163
|
-
<h2 className="text-
|
|
165
|
+
<h2 className="text-lg font-semibold text-neutral-200">{title}</h2>
|
|
164
166
|
{labels && labels.length > 0 && labels.map((labelProps, i) => (
|
|
165
167
|
<Label key={i} size="lg" {...labelProps} />
|
|
166
168
|
))}
|
|
@@ -210,6 +212,7 @@ export function RegistryDetail({
|
|
|
210
212
|
{/* File structure */}
|
|
211
213
|
{files && onFetchContent && rootName && (
|
|
212
214
|
<FileStructureSection
|
|
215
|
+
variant={fileStructureVariant}
|
|
213
216
|
files={files}
|
|
214
217
|
rootName={rootName}
|
|
215
218
|
onFetchContent={onFetchContent}
|
|
@@ -176,8 +176,8 @@ function ResizableCode({
|
|
|
176
176
|
inherit: true,
|
|
177
177
|
rules: [],
|
|
178
178
|
colors: {
|
|
179
|
-
'editor.background': variant === 'filled' ? '#
|
|
180
|
-
'editorGutter.background': variant === 'filled' ? '#
|
|
179
|
+
'editor.background': variant === 'filled' ? '#000000' : '#00000000',
|
|
180
|
+
'editorGutter.background': variant === 'filled' ? '#000000' : '#00000000',
|
|
181
181
|
'editor.lineHighlightBackground': '#00000000',
|
|
182
182
|
'editor.lineHighlightBorder': '#00000000',
|
|
183
183
|
},
|
|
@@ -12,7 +12,7 @@ export interface SegmentedToggleProps<T extends string> {
|
|
|
12
12
|
options: SegmentedToggleOption<T>[]
|
|
13
13
|
value: T
|
|
14
14
|
onChange: (value: T) => void
|
|
15
|
-
accentColor?: 'blue' | '
|
|
15
|
+
accentColor?: 'blue' | 'green' | 'red' | 'orange' | 'cyan' | 'yellow' | 'purple' | 'indigo' | 'emerald' | 'amber' | 'violet' | 'neutral' | 'sky' | 'pink' | 'teal'
|
|
16
16
|
/** Visual style: 'filled' (default) has a container background, 'outline' is transparent */
|
|
17
17
|
variant?: 'filled' | 'outline'
|
|
18
18
|
size?: 'xss' | 'xs' | 'sm' | 'md' | 'lg'
|
|
@@ -34,8 +34,8 @@ const ICON_SIZE_CLASSES = {
|
|
|
34
34
|
|
|
35
35
|
/** Text label button sizes — horizontal padding instead of fixed width */
|
|
36
36
|
const TEXT_SIZE_CLASSES = {
|
|
37
|
-
xss: 'h-[18px] px-1.5 text-
|
|
38
|
-
xs: 'h-6 px-2 text-
|
|
37
|
+
xss: 'h-[18px] px-1.5 text-xss',
|
|
38
|
+
xs: 'h-6 px-2 text-xss',
|
|
39
39
|
sm: 'h-7 px-2.5 text-xs',
|
|
40
40
|
md: 'h-8 px-3 text-xs',
|
|
41
41
|
lg: 'h-9 px-3.5 text-sm',
|
|
@@ -51,38 +51,56 @@ const ROUNDING_CLASSES = {
|
|
|
51
51
|
|
|
52
52
|
const ACTIVE_COLORS: Record<string, string> = {
|
|
53
53
|
blue: 'bg-blue-500/20 text-blue-300 border-blue-500/40',
|
|
54
|
-
purple: 'bg-purple-500/20 text-purple-300 border-purple-500/40',
|
|
55
|
-
orange: 'bg-orange-500/20 text-orange-300 border-orange-500/40',
|
|
56
54
|
green: 'bg-green-500/20 text-green-300 border-green-500/40',
|
|
57
|
-
|
|
58
|
-
|
|
55
|
+
red: 'bg-red-500/20 text-red-300 border-red-500/40',
|
|
56
|
+
orange: 'bg-orange-500/20 text-orange-300 border-orange-500/40',
|
|
57
|
+
cyan: 'bg-cyan-500/20 text-cyan-300 border-cyan-500/40',
|
|
58
|
+
yellow: 'bg-yellow-500/20 text-yellow-300 border-yellow-500/40',
|
|
59
|
+
purple: 'bg-purple-500/20 text-purple-300 border-purple-500/40',
|
|
60
|
+
indigo: 'bg-indigo-500/20 text-indigo-300 border-indigo-500/40',
|
|
59
61
|
emerald: 'bg-emerald-500/20 text-emerald-300 border-emerald-500/40',
|
|
60
|
-
|
|
62
|
+
amber: 'bg-amber-500/20 text-amber-300 border-amber-500/40',
|
|
63
|
+
violet: 'bg-violet-500/20 text-violet-300 border-violet-500/40',
|
|
64
|
+
neutral: 'bg-neutral-500/20 text-neutral-300 border-neutral-500/40',
|
|
61
65
|
sky: 'bg-sky-500/20 text-sky-300 border-sky-500/40',
|
|
66
|
+
pink: 'bg-pink-500/20 text-pink-300 border-pink-500/40',
|
|
67
|
+
teal: 'bg-teal-500/20 text-teal-300 border-teal-500/40',
|
|
62
68
|
}
|
|
63
69
|
|
|
64
70
|
const HOVER_COLORS: Record<string, string> = {
|
|
65
71
|
blue: 'hover:bg-blue-500/15 hover:text-blue-300',
|
|
66
|
-
purple: 'hover:bg-purple-500/15 hover:text-purple-300',
|
|
67
|
-
orange: 'hover:bg-orange-500/15 hover:text-orange-300',
|
|
68
72
|
green: 'hover:bg-green-500/15 hover:text-green-300',
|
|
69
|
-
|
|
70
|
-
|
|
73
|
+
red: 'hover:bg-red-500/15 hover:text-red-300',
|
|
74
|
+
orange: 'hover:bg-orange-500/15 hover:text-orange-300',
|
|
75
|
+
cyan: 'hover:bg-cyan-500/15 hover:text-cyan-300',
|
|
76
|
+
yellow: 'hover:bg-yellow-500/15 hover:text-yellow-300',
|
|
77
|
+
purple: 'hover:bg-purple-500/15 hover:text-purple-300',
|
|
78
|
+
indigo: 'hover:bg-indigo-500/15 hover:text-indigo-300',
|
|
71
79
|
emerald: 'hover:bg-emerald-500/15 hover:text-emerald-300',
|
|
72
|
-
|
|
80
|
+
amber: 'hover:bg-amber-500/15 hover:text-amber-300',
|
|
81
|
+
violet: 'hover:bg-violet-500/15 hover:text-violet-300',
|
|
82
|
+
neutral: 'hover:bg-neutral-500/15 hover:text-neutral-300',
|
|
73
83
|
sky: 'hover:bg-sky-500/15 hover:text-sky-300',
|
|
84
|
+
pink: 'hover:bg-pink-500/15 hover:text-pink-300',
|
|
85
|
+
teal: 'hover:bg-teal-500/15 hover:text-teal-300',
|
|
74
86
|
}
|
|
75
87
|
|
|
76
88
|
const OUTLINE_CONTAINER: Record<string, string> = {
|
|
77
89
|
blue: 'flex items-center border border-blue-500/50 rounded-md',
|
|
78
|
-
purple: 'flex items-center border border-purple-500/50 rounded-md',
|
|
79
|
-
orange: 'flex items-center border border-orange-500/50 rounded-md',
|
|
80
90
|
green: 'flex items-center border border-green-500/50 rounded-md',
|
|
81
|
-
|
|
82
|
-
|
|
91
|
+
red: 'flex items-center border border-red-500/50 rounded-md',
|
|
92
|
+
orange: 'flex items-center border border-orange-500/50 rounded-md',
|
|
93
|
+
cyan: 'flex items-center border border-cyan-500/50 rounded-md',
|
|
94
|
+
yellow: 'flex items-center border border-yellow-500/50 rounded-md',
|
|
95
|
+
purple: 'flex items-center border border-purple-500/50 rounded-md',
|
|
96
|
+
indigo: 'flex items-center border border-indigo-500/50 rounded-md',
|
|
83
97
|
emerald: 'flex items-center border border-emerald-500/50 rounded-md',
|
|
84
|
-
|
|
98
|
+
amber: 'flex items-center border border-amber-500/50 rounded-md',
|
|
99
|
+
violet: 'flex items-center border border-violet-500/50 rounded-md',
|
|
100
|
+
neutral: 'flex items-center border border-neutral-500/50 rounded-md',
|
|
85
101
|
sky: 'flex items-center border border-sky-500/50 rounded-md',
|
|
102
|
+
pink: 'flex items-center border border-pink-500/50 rounded-md',
|
|
103
|
+
teal: 'flex items-center border border-teal-500/50 rounded-md',
|
|
86
104
|
}
|
|
87
105
|
|
|
88
106
|
export function SegmentedToggle<T extends string>({
|
package/components/ui/select.tsx
CHANGED
|
@@ -29,7 +29,7 @@ const VARIANT_CLASSES = {
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
const SIZE_CLASSES = {
|
|
32
|
-
xss: 'h-[18px] px-1.5 text-
|
|
32
|
+
xss: 'h-[18px] px-1.5 text-xss',
|
|
33
33
|
xs: 'h-6 px-2 text-xs',
|
|
34
34
|
sm: 'h-7 px-2 text-xs',
|
|
35
35
|
md: 'h-8 px-3 text-sm',
|
|
@@ -134,7 +134,7 @@ export function Select<T extends string | number = string>({
|
|
|
134
134
|
{isOpen && menuPos && createPortal(
|
|
135
135
|
<div
|
|
136
136
|
ref={menuRef}
|
|
137
|
-
className={`fixed z-[9999] whitespace-nowrap ${v.menuBg}
|
|
137
|
+
className={`fixed z-[9999] whitespace-nowrap ${v.menuBg} border ${FORM_COLORS[color].border} rounded-lg shadow-xl overflow-hidden`}
|
|
138
138
|
style={{
|
|
139
139
|
top: menuPos.top,
|
|
140
140
|
left: align === 'right' ? undefined : menuPos.left,
|
|
@@ -154,7 +154,7 @@ export function Select<T extends string | number = string>({
|
|
|
154
154
|
onPointerEnter={() => setHighlightIdx(idx)}
|
|
155
155
|
className={`w-full flex items-center gap-2 px-3 py-1.5 text-xs text-left transition-colors cursor-pointer ${
|
|
156
156
|
isHighlighted
|
|
157
|
-
?
|
|
157
|
+
? `${FORM_COLORS[color].selectedBg} text-neutral-200`
|
|
158
158
|
: isSelected ? `${FORM_COLORS[color].selectedBg} text-neutral-200` : `text-neutral-400 ${v.hoverBg}`
|
|
159
159
|
}`}
|
|
160
160
|
>
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
} from 'lucide-react'
|
|
7
7
|
import type { LucideIcon } from 'lucide-react'
|
|
8
8
|
import type { IconName } from './icon-button.tsx'
|
|
9
|
-
import {
|
|
9
|
+
import type { ConfirmBadgeColor } from './confirm-badge.tsx'
|
|
10
10
|
import { cn } from '../lib/cn.ts'
|
|
11
11
|
import { AiToolIcon, AI_TOOL_NAMES, type AiToolKey } from '../lib/ai-tools.tsx'
|
|
12
12
|
|
|
@@ -233,23 +233,17 @@ function GridCard({ item, selected, onClick }: CardProps) {
|
|
|
233
233
|
className={cn(
|
|
234
234
|
'relative p-3 rounded-lg text-center transition-all border-2 flex flex-col items-center',
|
|
235
235
|
item.disabled
|
|
236
|
-
? 'opacity-30 cursor-not-allowed border-neutral-800 bg-
|
|
236
|
+
? 'opacity-30 cursor-not-allowed border-neutral-800 bg-[var(--background)]'
|
|
237
237
|
: selected
|
|
238
238
|
? 'cursor-pointer'
|
|
239
|
-
: 'bg-neutral-800/50 border-neutral-700 hover:bg-
|
|
239
|
+
: 'bg-neutral-800/50 border-neutral-700 hover:bg-[var(--surface-hover)] hover:border-neutral-600 cursor-pointer',
|
|
240
240
|
)}
|
|
241
241
|
style={
|
|
242
242
|
selected && !item.disabled
|
|
243
|
-
? { borderColor: color
|
|
243
|
+
? { borderColor: color }
|
|
244
244
|
: undefined
|
|
245
245
|
}
|
|
246
246
|
>
|
|
247
|
-
{selected && !item.disabled && (
|
|
248
|
-
<span className="absolute top-1 right-1">
|
|
249
|
-
<ConfirmBadge color={item.badgeColor || 'blue'} size="xs" />
|
|
250
|
-
</span>
|
|
251
|
-
)}
|
|
252
|
-
|
|
253
247
|
{Icon && (
|
|
254
248
|
<Icon
|
|
255
249
|
className="w-7 h-7 mb-1"
|
|
@@ -278,23 +272,17 @@ function ListCard({ item, selected, onClick }: CardProps) {
|
|
|
278
272
|
className={cn(
|
|
279
273
|
'relative p-3 rounded-lg transition-all border-2 flex items-center gap-3 text-left',
|
|
280
274
|
item.disabled
|
|
281
|
-
? 'opacity-30 cursor-not-allowed border-neutral-800 bg-
|
|
275
|
+
? 'opacity-30 cursor-not-allowed border-neutral-800 bg-[var(--background)]'
|
|
282
276
|
: selected
|
|
283
277
|
? 'cursor-pointer'
|
|
284
|
-
: 'bg-neutral-800/50 border-neutral-700 hover:bg-
|
|
278
|
+
: 'bg-neutral-800/50 border-neutral-700 hover:bg-[var(--surface-hover)] hover:border-neutral-600 cursor-pointer',
|
|
285
279
|
)}
|
|
286
280
|
style={
|
|
287
281
|
selected && !item.disabled
|
|
288
|
-
? { borderColor: color
|
|
282
|
+
? { borderColor: color }
|
|
289
283
|
: undefined
|
|
290
284
|
}
|
|
291
285
|
>
|
|
292
|
-
{selected && !item.disabled && (
|
|
293
|
-
<span className="absolute top-1 right-1">
|
|
294
|
-
<ConfirmBadge color={item.badgeColor || 'blue'} size="xs" />
|
|
295
|
-
</span>
|
|
296
|
-
)}
|
|
297
|
-
|
|
298
286
|
{Icon && (
|
|
299
287
|
<Icon
|
|
300
288
|
className="w-5 h-5 flex-shrink-0"
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { cn } from '../lib/cn.ts'
|
|
2
|
+
|
|
3
|
+
export interface SettingsCardProps {
|
|
4
|
+
children: React.ReactNode
|
|
5
|
+
className?: string
|
|
6
|
+
title?: string
|
|
7
|
+
description?: string
|
|
8
|
+
testId?: string
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function SettingsCard({ children, className, title, description, testId }: SettingsCardProps) {
|
|
12
|
+
return (
|
|
13
|
+
<div
|
|
14
|
+
className={cn('bg-neutral-900 border border-neutral-800 rounded-lg p-4 space-y-4', className)}
|
|
15
|
+
data-testid={testId}
|
|
16
|
+
>
|
|
17
|
+
{title && (
|
|
18
|
+
<div>
|
|
19
|
+
<h3 className="text-sm font-medium text-neutral-200">{title}</h3>
|
|
20
|
+
{description && <p className="text-sm text-neutral-500 mt-1">{description}</p>}
|
|
21
|
+
</div>
|
|
22
|
+
)}
|
|
23
|
+
{!title && description && <p className="text-sm text-neutral-500">{description}</p>}
|
|
24
|
+
{children}
|
|
25
|
+
</div>
|
|
26
|
+
)
|
|
27
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { Info, AlertTriangle, CheckCircle, AlertCircle } from 'lucide-react'
|
|
2
|
+
import { cn } from '../lib/cn.ts'
|
|
3
|
+
|
|
4
|
+
export type SettingsInfoBoxColor = 'neutral' | 'blue' | 'amber' | 'green' | 'red' | 'orange' | 'cyan' | 'yellow' | 'purple' | 'indigo' | 'emerald' | 'violet' | 'sky' | 'pink' | 'teal'
|
|
5
|
+
|
|
6
|
+
export interface SettingsInfoBoxProps {
|
|
7
|
+
children: React.ReactNode
|
|
8
|
+
color?: SettingsInfoBoxColor
|
|
9
|
+
className?: string
|
|
10
|
+
testId?: string
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const iconMap: Record<SettingsInfoBoxColor, typeof Info> = {
|
|
14
|
+
neutral: Info,
|
|
15
|
+
blue: Info,
|
|
16
|
+
amber: AlertTriangle,
|
|
17
|
+
green: CheckCircle,
|
|
18
|
+
red: AlertCircle,
|
|
19
|
+
orange: Info,
|
|
20
|
+
cyan: Info,
|
|
21
|
+
yellow: Info,
|
|
22
|
+
purple: Info,
|
|
23
|
+
indigo: Info,
|
|
24
|
+
emerald: Info,
|
|
25
|
+
violet: Info,
|
|
26
|
+
sky: Info,
|
|
27
|
+
pink: Info,
|
|
28
|
+
teal: Info,
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const iconColorMap: Record<SettingsInfoBoxColor, string> = {
|
|
32
|
+
neutral: 'text-neutral-500',
|
|
33
|
+
blue: 'text-blue-400',
|
|
34
|
+
amber: 'text-amber-400',
|
|
35
|
+
green: 'text-green-400',
|
|
36
|
+
red: 'text-red-400',
|
|
37
|
+
orange: 'text-orange-400',
|
|
38
|
+
cyan: 'text-cyan-400',
|
|
39
|
+
yellow: 'text-yellow-400',
|
|
40
|
+
purple: 'text-purple-400',
|
|
41
|
+
indigo: 'text-indigo-400',
|
|
42
|
+
emerald: 'text-emerald-400',
|
|
43
|
+
violet: 'text-violet-400',
|
|
44
|
+
sky: 'text-sky-400',
|
|
45
|
+
pink: 'text-pink-400',
|
|
46
|
+
teal: 'text-teal-400',
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const borderColorMap: Record<SettingsInfoBoxColor, string> = {
|
|
50
|
+
neutral: 'border-l-neutral-600',
|
|
51
|
+
blue: 'border-l-blue-500',
|
|
52
|
+
amber: 'border-l-amber-500',
|
|
53
|
+
green: 'border-l-green-500',
|
|
54
|
+
red: 'border-l-red-500',
|
|
55
|
+
orange: 'border-l-orange-500',
|
|
56
|
+
cyan: 'border-l-cyan-500',
|
|
57
|
+
yellow: 'border-l-yellow-500',
|
|
58
|
+
purple: 'border-l-purple-500',
|
|
59
|
+
indigo: 'border-l-indigo-500',
|
|
60
|
+
emerald: 'border-l-emerald-500',
|
|
61
|
+
violet: 'border-l-violet-500',
|
|
62
|
+
sky: 'border-l-sky-500',
|
|
63
|
+
pink: 'border-l-pink-500',
|
|
64
|
+
teal: 'border-l-teal-500',
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function SettingsInfoBox({ children, color = 'neutral', className, testId }: SettingsInfoBoxProps) {
|
|
68
|
+
const Icon = iconMap[color]
|
|
69
|
+
|
|
70
|
+
return (
|
|
71
|
+
<div
|
|
72
|
+
className={cn('flex items-start gap-3 border-l-2', borderColorMap[color], className)}
|
|
73
|
+
style={{ paddingLeft: 10 }}
|
|
74
|
+
data-testid={testId}
|
|
75
|
+
>
|
|
76
|
+
<Icon className={cn('w-4 h-4 mt-0.5 shrink-0', iconColorMap[color])} />
|
|
77
|
+
<div className="text-sm text-neutral-500">{children}</div>
|
|
78
|
+
</div>
|
|
79
|
+
)
|
|
80
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SettingsSectionTitle - Section header for settings pages
|
|
3
|
+
*
|
|
4
|
+
* Used by:
|
|
5
|
+
* - Settings pages - grouping related settings under a heading
|
|
6
|
+
* - Configuration panels - section dividers
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export interface SettingsSectionTitleProps {
|
|
10
|
+
children: React.ReactNode
|
|
11
|
+
className?: string
|
|
12
|
+
testId?: string
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function SettingsSectionTitle({ children, className = '', testId }: SettingsSectionTitleProps) {
|
|
16
|
+
return (
|
|
17
|
+
<h3
|
|
18
|
+
className={`text-xs font-medium text-neutral-400 uppercase tracking-wider ${className}`}
|
|
19
|
+
data-testid={testId}
|
|
20
|
+
>
|
|
21
|
+
{children}
|
|
22
|
+
</h3>
|
|
23
|
+
)
|
|
24
|
+
}
|
|
@@ -59,7 +59,7 @@ export function SnapshotCard({
|
|
|
59
59
|
</div>
|
|
60
60
|
|
|
61
61
|
{timestamp && (
|
|
62
|
-
<p className="mt-1 text-
|
|
62
|
+
<p className="mt-1 text-xss text-neutral-500">{timestamp}</p>
|
|
63
63
|
)}
|
|
64
64
|
|
|
65
65
|
{description && (
|
|
@@ -70,7 +70,7 @@ export function SnapshotCard({
|
|
|
70
70
|
<div className="mt-3 grid grid-cols-2 gap-x-4 gap-y-2">
|
|
71
71
|
{stats.map((stat) => (
|
|
72
72
|
<div key={stat.label}>
|
|
73
|
-
<p className="text-
|
|
73
|
+
<p className="text-xss text-neutral-500">{stat.label}</p>
|
|
74
74
|
<p className="text-xs font-medium text-neutral-200">{stat.value}</p>
|
|
75
75
|
</div>
|
|
76
76
|
))}
|
|
@@ -63,12 +63,12 @@ export function SnippetsPanel({
|
|
|
63
63
|
return (
|
|
64
64
|
<div className={cn('flex flex-col bg-neutral-800 rounded-lg overflow-hidden', className)}>
|
|
65
65
|
<div className="flex items-center justify-between px-3 py-2 border-b border-neutral-700">
|
|
66
|
-
<span className="text-
|
|
67
|
-
<span className="text-
|
|
66
|
+
<span className="text-xss font-semibold uppercase tracking-wider text-neutral-500">Snippets</span>
|
|
67
|
+
<span className="text-xss text-neutral-500">{snippets.length} snippets</span>
|
|
68
68
|
</div>
|
|
69
69
|
{showSearch && (
|
|
70
70
|
<div className="px-2 py-2 border-b border-neutral-700">
|
|
71
|
-
<div className="flex items-center gap-1.5 px-2 py-1 bg-
|
|
71
|
+
<div className="flex items-center gap-1.5 px-2 py-1 bg-[var(--background)] border border-neutral-700 rounded text-xs">
|
|
72
72
|
<Search className="w-3 h-3 text-neutral-500 shrink-0" />
|
|
73
73
|
<input
|
|
74
74
|
type="text"
|
|
@@ -90,7 +90,7 @@ export function SnippetsPanel({
|
|
|
90
90
|
/>
|
|
91
91
|
))}
|
|
92
92
|
{filteredSnippets.length === 0 && (
|
|
93
|
-
<p className="text-
|
|
93
|
+
<p className="text-xss text-neutral-500 text-center py-4">No snippets found</p>
|
|
94
94
|
)}
|
|
95
95
|
</div>
|
|
96
96
|
</div>
|
|
@@ -113,7 +113,7 @@ function SnippetCard({ snippet, onInsert, onCopy }: SnippetCardProps) {
|
|
|
113
113
|
<span className="text-xs font-medium text-neutral-200 truncate">{snippet.label}</span>
|
|
114
114
|
{snippet.language && (
|
|
115
115
|
<span
|
|
116
|
-
className="px-1.5 py-0.5 text-
|
|
116
|
+
className="px-1.5 py-0.5 text-xss font-medium rounded shrink-0"
|
|
117
117
|
style={{ color: langColor, backgroundColor: `${langColor}20` }}
|
|
118
118
|
>
|
|
119
119
|
{snippet.language}
|
|
@@ -140,17 +140,17 @@ function SnippetCard({ snippet, onInsert, onCopy }: SnippetCardProps) {
|
|
|
140
140
|
</div>
|
|
141
141
|
</div>
|
|
142
142
|
{snippet.description && (
|
|
143
|
-
<p className="px-2.5 pb-1.5 text-
|
|
143
|
+
<p className="px-2.5 pb-1.5 text-xss text-neutral-400 leading-relaxed">{snippet.description}</p>
|
|
144
144
|
)}
|
|
145
|
-
<div className="mx-2.5 mb-2 rounded bg-
|
|
146
|
-
<pre className="p-2 text-
|
|
145
|
+
<div className="mx-2.5 mb-2 rounded bg-[var(--background)] border border-neutral-700 overflow-hidden">
|
|
146
|
+
<pre className="p-2 text-xss text-neutral-400 leading-relaxed overflow-x-auto max-h-24">
|
|
147
147
|
<code>{snippet.code}</code>
|
|
148
148
|
</pre>
|
|
149
149
|
</div>
|
|
150
150
|
{snippet.tags && snippet.tags.length > 0 && (
|
|
151
151
|
<div className="flex flex-wrap gap-1 px-2.5 pb-2">
|
|
152
152
|
{snippet.tags.map((tag) => (
|
|
153
|
-
<span key={tag} className="px-1.5 py-0.5 text-
|
|
153
|
+
<span key={tag} className="px-1.5 py-0.5 text-xss rounded bg-neutral-700 text-neutral-500">
|
|
154
154
|
{tag}
|
|
155
155
|
</span>
|
|
156
156
|
))}
|
|
@@ -88,7 +88,7 @@ export function SortDropdown({
|
|
|
88
88
|
</button>
|
|
89
89
|
|
|
90
90
|
{isOpen && (
|
|
91
|
-
<div ref={menuRef} className={`absolute right-0 top-full z-50 mt-1 min-w-[140px] bg-[var(--popover)]
|
|
91
|
+
<div ref={menuRef} className={`absolute right-0 top-full z-50 mt-1 min-w-[140px] bg-[var(--popover)] border ${FORM_COLORS[color].border} rounded-lg shadow-xl overflow-hidden`}>
|
|
92
92
|
{fields.map((f, idx) => (
|
|
93
93
|
<button
|
|
94
94
|
key={f.value}
|
|
@@ -54,7 +54,7 @@ export interface TabBarProps {
|
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
const sizeConfig = {
|
|
57
|
-
xss: { text: 'text-
|
|
57
|
+
xss: { text: 'text-xss', icon: 'w-2.5 h-2.5', px: 'px-1.5', py: 'py-1', close: 'w-2.5 h-2.5', badgeSize: 'xss' as const, gap: 'gap-1' },
|
|
58
58
|
xs: { text: 'text-xs', icon: 'w-3 h-3', px: 'px-2', py: 'py-1', close: 'w-3 h-3', badgeSize: 'xs' as const, gap: 'gap-1' },
|
|
59
59
|
sm: { text: 'text-sm', icon: 'w-3.5 h-3.5', px: 'px-3', py: 'py-1.5', close: 'w-3 h-3', badgeSize: 'sm' as const, gap: 'gap-1.5' },
|
|
60
60
|
md: { text: 'text-base', icon: 'w-4 h-4', px: 'px-4', py: 'py-2', close: 'w-3.5 h-3.5', badgeSize: 'md' as const, gap: 'gap-2' },
|
|
@@ -258,7 +258,7 @@ export function Tooltip({
|
|
|
258
258
|
const tooltipContent = (
|
|
259
259
|
<div
|
|
260
260
|
ref={tooltipRef}
|
|
261
|
-
className={`fixed px-3 py-1.5 bg-[var(--popover)]
|
|
261
|
+
className={`fixed px-3 py-1.5 bg-[var(--popover)] border border-neutral-600 rounded-lg shadow-xl z-[9999] ${interactive || trigger === 'click' ? '' : 'pointer-events-none'} ${multiline ? 'whitespace-pre-line' : 'whitespace-nowrap'}`}
|
|
262
262
|
style={{
|
|
263
263
|
top: coords.top,
|
|
264
264
|
left: coords.left,
|
package/dist/content.js
CHANGED
|
@@ -65,7 +65,7 @@ function Callout({ color, children }) {
|
|
|
65
65
|
}
|
|
66
66
|
function CalloutCode({ color, children }) {
|
|
67
67
|
const c = CALLOUT_COLORS[color] ?? CALLOUT_COLORS.blue;
|
|
68
|
-
return /* @__PURE__ */ jsx("code", { className: `block bg-neutral-800/80 px-2 py-1 rounded mt-1.5 text-
|
|
68
|
+
return /* @__PURE__ */ jsx("code", { className: `block bg-neutral-800/80 px-2 py-1 rounded mt-1.5 text-sm ${c.codeText}`, children });
|
|
69
69
|
}
|
|
70
70
|
function CalloutDim({ children }) {
|
|
71
71
|
return /* @__PURE__ */ jsx("p", { className: "text-neutral-500 mt-1.5", children });
|
|
@@ -115,7 +115,7 @@ function TitledLI({ color, title, children }) {
|
|
|
115
115
|
] });
|
|
116
116
|
}
|
|
117
117
|
function CalloutDialog({ color, lines }) {
|
|
118
|
-
return /* @__PURE__ */ jsx("div", { className: "bg-neutral-800/80 rounded px-2 py-1 mt-1.5 flex flex-col gap-0.5 text-
|
|
118
|
+
return /* @__PURE__ */ jsx("div", { className: "bg-neutral-800/80 rounded px-2 py-1 mt-1.5 flex flex-col gap-0.5 text-sm", children: lines.map((line, idx) => /* @__PURE__ */ jsxs("div", { children: [
|
|
119
119
|
/* @__PURE__ */ jsxs("span", { className: `text-${color}-300 font-semibold mr-1`, children: [
|
|
120
120
|
line.speaker,
|
|
121
121
|
":"
|
|
@@ -131,7 +131,7 @@ function StatusBadge({ value, badgeColor, label, children, even }) {
|
|
|
131
131
|
DLRow,
|
|
132
132
|
{
|
|
133
133
|
term: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1.5", children: [
|
|
134
|
-
/* @__PURE__ */ jsx("span", { className: `inline-flex items-center justify-center w-5 h-5 rounded-full bg-${badgeColor}-500/20 text-${badgeColor}-400 text-
|
|
134
|
+
/* @__PURE__ */ jsx("span", { className: `inline-flex items-center justify-center w-5 h-5 rounded-full bg-${badgeColor}-500/20 text-${badgeColor}-400 text-xss font-bold shrink-0`, children: value }),
|
|
135
135
|
/* @__PURE__ */ jsx("span", { className: `text-${badgeColor}-400 font-semibold`, children: label })
|
|
136
136
|
] }),
|
|
137
137
|
even,
|