Skip to content

Commit 4d59c40

Browse files
committed
feat: implement dark mode for API KEY page
1 parent eb451c7 commit 4d59c40

86 files changed

Lines changed: 385 additions & 269 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

ui/dashboard/src/components/ai-chat/chat-popover.tsx

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -78,25 +78,25 @@ const ChatPopover = memo(
7878
const isEmpty = messages.length === 0;
7979

8080
return (
81-
<div className="flex h-[500px] w-[380px] flex-col rounded-xl border border-gray-200 bg-white shadow-lg">
81+
<div className="flex h-[500px] w-[380px] flex-col rounded-xl border border-gray-200 dark:border-dark-black-700 bg-white dark:bg-dark-black-800 shadow-lg dark:shadow-dark-card">
8282
{/* Header */}
83-
<div className="flex items-center justify-between border-b border-gray-200 px-4 py-3">
84-
<h3 className="typo-para-medium font-semibold text-gray-800">
83+
<div className="flex items-center justify-between border-b border-gray-200 dark:border-dark-black-700 px-4 py-3">
84+
<h3 className="typo-para-medium font-semibold text-gray-800 dark:text-dark-gray-400">
8585
{t('ai-chat:title')}
8686
</h3>
8787
<div className="flex items-center gap-2">
8888
{messages.length > 0 && (
8989
<button
9090
type="button"
91-
className="rounded typo-para-tiny text-gray-400 hover:text-gray-600 focus:outline-none focus:ring-2 focus:ring-primary-300"
91+
className="rounded typo-para-tiny text-gray-400 dark:text-dark-gray-200 hover:text-gray-600 dark:hover:text-dark-gray-400 focus:outline-none focus:ring-2 focus:ring-primary-300"
9292
onClick={onClear}
9393
>
9494
{t('ai-chat:clear')}
9595
</button>
9696
)}
9797
<button
9898
type="button"
99-
className="rounded text-gray-400 hover:text-gray-600 focus:outline-none focus:ring-2 focus:ring-primary-300"
99+
className="rounded text-gray-400 dark:text-dark-gray-200 hover:text-gray-600 dark:hover:text-dark-gray-400 focus:outline-none focus:ring-2 focus:ring-primary-300"
100100
onClick={onClose}
101101
aria-label={t('ai-chat:close')}
102102
>
@@ -107,7 +107,7 @@ const ChatPopover = memo(
107107

108108
{/* Flag Selector */}
109109
{showFlagSelector && onSelectFlag && (
110-
<div className="border-b border-gray-200 px-4 py-2">
110+
<div className="border-b border-gray-200 dark:border-dark-black-700 px-4 py-2">
111111
<FlagSelector
112112
selectedFlagId={selectedFlagId}
113113
onSelectFlag={onSelectFlag}
@@ -119,12 +119,12 @@ const ChatPopover = memo(
119119
<ScrollArea className="flex-1 px-4 py-3">
120120
{isEmpty ? (
121121
<div className="flex flex-col gap-4">
122-
<p className="typo-para-small text-gray-500">
122+
<p className="typo-para-small text-gray-500 dark:text-dark-gray-200">
123123
{t('ai-chat:welcome')}
124124
</p>
125125
{suggestions.length > 0 && (
126126
<div className="flex flex-col gap-2">
127-
<p className="typo-para-tiny font-medium text-gray-600">
127+
<p className="typo-para-tiny font-medium text-gray-600 dark:text-dark-gray-200">
128128
{t('ai-chat:suggestions-title')}
129129
</p>
130130
{suggestions.map(s => (
@@ -152,15 +152,15 @@ const ChatPopover = memo(
152152
'max-w-[90%] rounded-lg px-3 py-2',
153153
msg.role === 'user'
154154
? 'ml-auto bg-primary-500 text-white'
155-
: 'mr-auto bg-gray-100 text-gray-700'
155+
: 'mr-auto bg-gray-100 dark:bg-dark-black-700 text-gray-700 dark:text-dark-gray-300'
156156
)}
157157
>
158158
{msg.role === 'user' ? (
159159
<p className="typo-para-small whitespace-pre-wrap">
160160
{msg.content}
161161
</p>
162162
) : msg.content ? (
163-
<div className="typo-para-small prose-sm prose-gray max-w-none [&_a]:text-primary-500 [&_a]:underline [&_ol]:list-decimal [&_ol]:pl-4 [&_ul]:list-disc [&_ul]:pl-4 [&_p]:my-1 [&_li]:my-0.5 [&_h1]:text-base [&_h1]:font-bold [&_h1]:my-2 [&_h2]:text-sm [&_h2]:font-bold [&_h2]:my-1.5 [&_h3]:text-sm [&_h3]:font-semibold [&_h3]:my-1 [&_code]:rounded [&_code]:bg-gray-200 [&_code]:px-1 [&_code]:text-xs [&_pre]:rounded [&_pre]:bg-gray-200 [&_pre]:p-2 [&_pre]:text-xs [&_pre]:overflow-x-auto [&_blockquote]:border-l-2 [&_blockquote]:border-gray-300 [&_blockquote]:pl-2 [&_blockquote]:italic">
163+
<div className="typo-para-small prose-sm prose-gray max-w-none [&_a]:text-primary-500 [&_a]:underline [&_ol]:list-decimal [&_ol]:pl-4 [&_ul]:list-disc [&_ul]:pl-4 [&_p]:my-1 [&_li]:my-0.5 [&_h1]:text-base [&_h1]:font-bold [&_h1]:my-2 [&_h2]:text-sm [&_h2]:font-bold [&_h2]:my-1.5 [&_h3]:text-sm [&_h3]:font-semibold [&_h3]:my-1 [&_code]:rounded [&_code]:bg-gray-200 dark:[&_code]:bg-dark-black-900 [&_code]:px-1 [&_code]:text-xs [&_pre]:rounded [&_pre]:bg-gray-200 dark:[&_pre]:bg-dark-black-900 [&_pre]:p-2 [&_pre]:text-xs [&_pre]:overflow-x-auto [&_blockquote]:border-l-2 [&_blockquote]:border-gray-300 dark:[&_blockquote]:border-dark-black-700 [&_blockquote]:pl-2 [&_blockquote]:italic">
164164
<Markdown>{msg.content}</Markdown>
165165
</div>
166166
) : (
@@ -180,7 +180,7 @@ const ChatPopover = memo(
180180
)}
181181
{errorKey && (
182182
<div
183-
className="mt-2 rounded-lg bg-accent-red-50 px-3 py-2"
183+
className="mt-2 rounded-lg bg-accent-red-50 dark:bg-accent-red-900/30 px-3 py-2"
184184
role="alert"
185185
>
186186
<p className="typo-para-tiny text-accent-red-500">
@@ -198,7 +198,7 @@ const ChatPopover = memo(
198198
{/* Input */}
199199
<form
200200
onSubmit={handleSubmit}
201-
className="flex items-center gap-2 border-t border-gray-200 px-4 py-3"
201+
className="flex items-center gap-2 border-t border-gray-200 dark:border-dark-black-700 px-4 py-3"
202202
>
203203
<input
204204
type="text"
@@ -210,10 +210,10 @@ const ChatPopover = memo(
210210
disabled={isStreaming}
211211
maxLength={MAX_INPUT_LENGTH}
212212
className={cn(
213-
'flex-1 rounded-lg border border-gray-200 px-3 py-2',
214-
'typo-para-small text-gray-700 placeholder:text-gray-400',
213+
'flex-1 rounded-lg border border-gray-200 dark:border-dark-black-700 dark:bg-dark-black-900 px-3 py-2',
214+
'typo-para-small text-gray-700 dark:text-dark-gray-300 placeholder:text-gray-400 dark:placeholder:text-dark-gray-200',
215215
'focus:border-primary-300 focus:outline-none focus:ring-1 focus:ring-primary-300',
216-
'disabled:cursor-not-allowed disabled:bg-gray-50'
216+
'disabled:cursor-not-allowed disabled:bg-gray-50 dark:disabled:bg-dark-black-700'
217217
)}
218218
/>
219219
<Button

ui/dashboard/src/components/ai-chat/preset-questions.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ const PresetQuestions = memo(({ onSelect }: PresetQuestionsProps) => {
2525
key={key}
2626
type="button"
2727
className={cn(
28-
'rounded-lg border border-gray-200 px-3 py-2 text-left',
29-
'typo-para-tiny text-gray-600',
30-
'transition-colors duration-200 hover:border-primary-300 hover:bg-primary-50',
28+
'rounded-lg border border-gray-200 dark:border-dark-black-700 px-3 py-2 text-left',
29+
'typo-para-tiny text-gray-600 dark:text-dark-gray-200',
30+
'transition-colors duration-200 hover:border-primary-300 hover:bg-primary-50 dark:hover:bg-dark-purple-100',
3131
'motion-reduce:transition-none',
3232
'focus:outline-none focus:ring-2 focus:ring-primary-300 focus:ring-offset-2'
3333
)}

ui/dashboard/src/components/ai-chat/suggestion-card.tsx

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,19 @@ const SuggestionCard = memo(({ suggestion, onClick }: SuggestionCardProps) => {
2121
<button
2222
type="button"
2323
className={cn(
24-
'w-full rounded-lg border border-gray-200 p-3 text-left',
25-
'transition-colors duration-200 hover:border-primary-300 hover:bg-primary-50',
24+
'w-full rounded-lg border border-gray-200 dark:border-dark-black-700 p-3 text-left',
25+
'transition-colors duration-200 hover:border-primary-300 hover:bg-primary-50 dark:hover:bg-dark-purple-100',
2626
'motion-reduce:transition-none',
2727
'focus:outline-none focus:ring-2 focus:ring-primary-300 focus:ring-offset-2'
2828
)}
2929
onClick={() => onClick(title)}
3030
>
31-
<p className="typo-para-small font-medium text-gray-700">{title}</p>
32-
<p className="typo-para-tiny mt-1 text-gray-500">{description}</p>
31+
<p className="typo-para-small font-medium text-gray-700 dark:text-dark-gray-300">
32+
{title}
33+
</p>
34+
<p className="typo-para-tiny mt-1 text-gray-500 dark:text-dark-gray-200">
35+
{description}
36+
</p>
3337
</button>
3438
);
3539
});

ui/dashboard/src/components/autocomplete-input/index.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,15 +91,15 @@ const AutocompleteInput = ({
9191
onChange={handleChange}
9292
onFocus={handleFocus}
9393
onBlur={handleBlur}
94-
className="border border-gray-400 p-2 typo-para-medium w-full px-4 py-[11px] text-gray-700"
94+
className="border border-gray-400 dark:border-dark-purple-100 dark:bg-dark-black-900 p-2 typo-para-medium w-full px-4 py-[11px] text-gray-700 dark:text-dark-gray-300"
9595
/>
9696
{showSuggestions && suggestions.length > 0 && (
97-
<ul className="absolute p-1 max-h-[252px] bg-white border rounded-lg w-full shadow-dropdown overflow-x-hidden overflow-y-auto small-scroll mt-1 z-10">
97+
<ul className="absolute p-1 max-h-[252px] bg-white dark:bg-dark-black-800 border dark:border-dark-black-700 rounded-lg w-full shadow-dropdown dark:shadow-dark-card overflow-x-hidden overflow-y-auto small-scroll mt-1 z-10">
9898
{suggestions.map((suggestion, index) => (
9999
<li
100100
key={index}
101101
onMouseDown={() => handleSelect(suggestion)}
102-
className="p-2 hover:bg-gray-100 cursor-pointer rounded-md typo-para-medium text-gray-700"
102+
className="p-2 hover:bg-gray-100 dark:hover:bg-dark-black-700 cursor-pointer rounded-md typo-para-medium text-gray-700 dark:text-dark-gray-300"
103103
>
104104
{suggestion}
105105
</li>

ui/dashboard/src/components/badge/index.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@ const badgeVariants = cva(
99
{
1010
variants: {
1111
variant: {
12-
primary: 'text-primary-500 bg-primary-100',
13-
secondary: 'text-gray-500 bg-gray-200'
12+
primary:
13+
'text-primary-500 bg-primary-100 dark:text-dark-purple-500 dark:bg-dark-purple-100',
14+
secondary:
15+
'text-gray-500 bg-gray-200 dark:text-dark-gray-200 dark:bg-dark-black-700'
1416
}
1517
},
1618
defaultVariants: {

ui/dashboard/src/components/button/index.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@ const buttonVariants = cva(
1313
'bg-primary-500 text-gray-50',
1414
'rounded-lg px-6 py-2',
1515
'hover:bg-primary-700',
16-
'disabled:bg-primary-200 disabled:text-primary-50'
16+
'disabled:bg-primary-200 disabled:text-primary-50 dark:disabled:bg-dark-black-700 dark:disabled:text-dark-gray-200'
1717
],
1818
secondary: [
1919
'text-primary-500 dark:text-dark-purple-500 shadow-border-primary-500 dark:shadow-border-primary-glow',
2020
'rounded-lg px-6 py-2',
2121
'hover:text-primary-700 dark:hover:text-dark-purple-600 hover:shadow-border-primary-700 dark:hover:shadow-border-primary-glow',
22-
'disabled:text-gray-500 dark:disabled:text-dark-gray-200 disabled:shadow-border-gray-500'
22+
'disabled:text-gray-500 dark:disabled:text-dark-gray-200 disabled:shadow-border-gray-500 dark:disabled:shadow-border-dark-black-700'
2323
],
2424
'secondary-2': [
2525
'text-gray-700 dark:text-dark-gray-300 shadow-border-gray-300 dark:shadow-border-gray-500',
@@ -31,7 +31,7 @@ const buttonVariants = cva(
3131
'bg-accent-red-500 text-gray-50 shadow-border-accent-red-500',
3232
'rounded-lg px-6 py-2',
3333
'hover:bg-accent-red-600 hover:shadow-border-accent-red-600',
34-
'disabled:bg-accent-red-50 disabled:shadow-border-gray-400 disabled:text-gray-500'
34+
'disabled:bg-accent-red-50 disabled:shadow-border-gray-400 disabled:text-gray-500 dark:disabled:bg-dark-black-700 dark:disabled:shadow-border-dark-black-700 dark:disabled:text-dark-gray-200'
3535
],
3636
text: [
3737
'text-primary-500 dark:text-dark-purple-500 px-2',

ui/dashboard/src/components/checkbox/index.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ const Checkbox = forwardRef(
3737
<div className="flex-center size-5 mt-0.5">
3838
<CheckboxPrimitive.Root
3939
className={cn(
40-
'flex-center size-5 rounded border border-gray-500 transition-colors duration-200',
40+
'flex-center size-5 rounded border border-gray-500 dark:border-dark-purple-100 transition-colors duration-200',
4141
{
4242
'border-primary-500 bg-primary-500': checked
4343
}
@@ -60,7 +60,9 @@ const Checkbox = forwardRef(
6060
</div>
6161
{title && (
6262
<label className="flex flex-col gap-y-2 text-left" htmlFor={inputId}>
63-
<span className="typo-para-medium text-gray-700">{title}</span>
63+
<span className="typo-para-medium text-gray-700 dark:text-dark-gray-300">
64+
{title}
65+
</span>
6466
{description && (
6567
<span className="typo-para-small text-additional-gray-500">
6668
{description}

ui/dashboard/src/components/dropdown/index.tsx

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -327,17 +327,19 @@ const DropdownMenuSearch = forwardRef(
327327
ref: Ref<HTMLInputElement>
328328
) => {
329329
return (
330-
<div className="sticky top-0 left-0 right-0 flex items-center w-full px-3 py-[11.5px] gap-x-2 border-b border-gray-200 dark:border-dark-black-700 bg-white dark:bg-dark-black-800 z-50">
331-
<div className="flex-center size-5">
332-
<Icon icon={IconSearch} size={'xs'} color="gray-500" />
330+
<div className="sticky top-0 left-0 right-0 w-full px-3 py-[11.5px] bg-white dark:bg-dark-black-800 z-50">
331+
<div className="flex items-center w-full gap-x-2 px-3 py-2 rounded-lg border border-gray-200 dark:border-dark-purple-100 bg-white dark:bg-dark-black-700 hover:border-gray-400 focus-within:border-primary-500 dark:hover:border-dark-purple-300 dark:focus-within:border-dark-purple-300">
332+
<div className="flex-center size-5">
333+
<Icon icon={IconSearch} size={'xs'} color="gray-500" />
334+
</div>
335+
<Input
336+
{...props}
337+
ref={ref}
338+
value={value}
339+
onChange={onChange}
340+
className="p-0 border-none rounded-none bg-white dark:bg-dark-black-700 hover:shadow-none focus:shadow-none dark:hover:shadow-none dark:focus:shadow-none focus:ring-0 focus:border-none"
341+
/>
333342
</div>
334-
<Input
335-
{...props}
336-
ref={ref}
337-
value={value}
338-
onChange={onChange}
339-
className="p-0 border-none rounded-none"
340-
/>
341343
</div>
342344
);
343345
}

ui/dashboard/src/components/list/list-item.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ const ListItem = ({
2929
id={value || urlCode}
3030
className={cn(
3131
'flex items-center justify-between cursor-default',
32-
'rounded-lg px-3 py-2 text-gray-700 dark:text-dark-gray-400 hover:bg-gray-100 dark:hover:bg-dark-black-700',
33-
selected && 'bg-gray-100 dark:bg-dark-black-700',
32+
'rounded-lg px-3 py-2 text-gray-700 dark:text-dark-gray-400 hover:bg-gray-100 dark:hover:bg-dark-purple-100',
33+
selected && 'bg-gray-100 dark:bg-dark-purple-200/20',
3434
className
3535
)}
3636
onClick={() => onSelect?.(value)}

ui/dashboard/src/components/list/list-title.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,12 @@ export type ListTitleProps = {
77

88
const ListTitle = ({ children, className }: ListTitleProps) => {
99
return (
10-
<h3 className={cn('typo-head-bold-medium text-gray-700', className)}>
10+
<h3
11+
className={cn(
12+
'typo-head-bold-medium text-gray-700 dark:text-dark-gray-300',
13+
className
14+
)}
15+
>
1116
{children}
1217
</h3>
1318
);

0 commit comments

Comments
 (0)