|
import { globSync } from 'fast-glob'; |
|
import fs from 'node:fs/promises'; |
|
import { basename } from 'node:path'; |
|
import { defineConfig, presetIcons, presetUno, transformerDirectives } from 'unocss'; |
|
|
|
const iconPaths = globSync('./icons/*.svg'); |
|
|
|
const collectionName = 'bolt'; |
|
|
|
const customIconCollection = iconPaths.reduce( |
|
(acc, iconPath) => { |
|
const [iconName] = basename(iconPath).split('.'); |
|
|
|
acc[collectionName] ??= {}; |
|
acc[collectionName][iconName] = async () => fs.readFile(iconPath, 'utf8'); |
|
|
|
return acc; |
|
}, |
|
{} as Record<string, Record<string, () => Promise<string>>>, |
|
); |
|
|
|
const BASE_COLORS = { |
|
white: '#FFFFFF', |
|
gray: { |
|
50: '#FAFAFA', |
|
100: '#F5F5F5', |
|
200: '#E5E5E5', |
|
300: '#D4D4D4', |
|
400: '#A3A3A3', |
|
500: '#737373', |
|
600: '#525252', |
|
700: '#404040', |
|
800: '#262626', |
|
900: '#171717', |
|
950: '#0A0A0A', |
|
}, |
|
accent: { |
|
50: '#F8F5FF', |
|
100: '#F0EBFF', |
|
200: '#E1D6FF', |
|
300: '#CEBEFF', |
|
400: '#B69EFF', |
|
500: '#9C7DFF', |
|
600: '#8A5FFF', |
|
700: '#7645E8', |
|
800: '#6234BB', |
|
900: '#502D93', |
|
950: '#2D1959', |
|
}, |
|
green: { |
|
50: '#F0FDF4', |
|
100: '#DCFCE7', |
|
200: '#BBF7D0', |
|
300: '#86EFAC', |
|
400: '#4ADE80', |
|
500: '#22C55E', |
|
600: '#16A34A', |
|
700: '#15803D', |
|
800: '#166534', |
|
900: '#14532D', |
|
950: '#052E16', |
|
}, |
|
orange: { |
|
50: '#FFFAEB', |
|
100: '#FEEFC7', |
|
200: '#FEDF89', |
|
300: '#FEC84B', |
|
400: '#FDB022', |
|
500: '#F79009', |
|
600: '#DC6803', |
|
700: '#B54708', |
|
800: '#93370D', |
|
900: '#792E0D', |
|
}, |
|
red: { |
|
50: '#FEF2F2', |
|
100: '#FEE2E2', |
|
200: '#FECACA', |
|
300: '#FCA5A5', |
|
400: '#F87171', |
|
500: '#EF4444', |
|
600: '#DC2626', |
|
700: '#B91C1C', |
|
800: '#991B1B', |
|
900: '#7F1D1D', |
|
950: '#450A0A', |
|
}, |
|
}; |
|
|
|
const COLOR_PRIMITIVES = { |
|
...BASE_COLORS, |
|
alpha: { |
|
white: generateAlphaPalette(BASE_COLORS.white), |
|
gray: generateAlphaPalette(BASE_COLORS.gray[900]), |
|
red: generateAlphaPalette(BASE_COLORS.red[500]), |
|
accent: generateAlphaPalette(BASE_COLORS.accent[500]), |
|
}, |
|
}; |
|
|
|
export default defineConfig({ |
|
safelist: [...Object.keys(customIconCollection[collectionName] || {}).map((x) => `i-bolt:${x}`)], |
|
shortcuts: { |
|
'bolt-ease-cubic-bezier': 'ease-[cubic-bezier(0.4,0,0.2,1)]', |
|
'transition-theme': 'transition-[background-color,border-color,color] duration-150 bolt-ease-cubic-bezier', |
|
kdb: 'bg-bolt-elements-code-background text-bolt-elements-code-text py-1 px-1.5 rounded-md', |
|
'max-w-chat': 'max-w-[var(--chat-max-width)]', |
|
}, |
|
rules: [ |
|
|
|
|
|
|
|
|
|
['b', {}], |
|
], |
|
theme: { |
|
colors: { |
|
...COLOR_PRIMITIVES, |
|
bolt: { |
|
elements: { |
|
borderColor: 'var(--bolt-elements-borderColor)', |
|
borderColorActive: 'var(--bolt-elements-borderColorActive)', |
|
background: { |
|
depth: { |
|
1: 'var(--bolt-elements-bg-depth-1)', |
|
2: 'var(--bolt-elements-bg-depth-2)', |
|
3: 'var(--bolt-elements-bg-depth-3)', |
|
4: 'var(--bolt-elements-bg-depth-4)', |
|
}, |
|
}, |
|
textPrimary: 'var(--bolt-elements-textPrimary)', |
|
textSecondary: 'var(--bolt-elements-textSecondary)', |
|
textTertiary: 'var(--bolt-elements-textTertiary)', |
|
code: { |
|
background: 'var(--bolt-elements-code-background)', |
|
text: 'var(--bolt-elements-code-text)', |
|
}, |
|
button: { |
|
primary: { |
|
background: 'var(--bolt-elements-button-primary-background)', |
|
backgroundHover: 'var(--bolt-elements-button-primary-backgroundHover)', |
|
text: 'var(--bolt-elements-button-primary-text)', |
|
}, |
|
secondary: { |
|
background: 'var(--bolt-elements-button-secondary-background)', |
|
backgroundHover: 'var(--bolt-elements-button-secondary-backgroundHover)', |
|
text: 'var(--bolt-elements-button-secondary-text)', |
|
}, |
|
danger: { |
|
background: 'var(--bolt-elements-button-danger-background)', |
|
backgroundHover: 'var(--bolt-elements-button-danger-backgroundHover)', |
|
text: 'var(--bolt-elements-button-danger-text)', |
|
}, |
|
}, |
|
item: { |
|
contentDefault: 'var(--bolt-elements-item-contentDefault)', |
|
contentActive: 'var(--bolt-elements-item-contentActive)', |
|
contentAccent: 'var(--bolt-elements-item-contentAccent)', |
|
contentDanger: 'var(--bolt-elements-item-contentDanger)', |
|
backgroundDefault: 'var(--bolt-elements-item-backgroundDefault)', |
|
backgroundActive: 'var(--bolt-elements-item-backgroundActive)', |
|
backgroundAccent: 'var(--bolt-elements-item-backgroundAccent)', |
|
backgroundDanger: 'var(--bolt-elements-item-backgroundDanger)', |
|
}, |
|
actions: { |
|
background: 'var(--bolt-elements-actions-background)', |
|
code: { |
|
background: 'var(--bolt-elements-actions-code-background)', |
|
}, |
|
}, |
|
artifacts: { |
|
background: 'var(--bolt-elements-artifacts-background)', |
|
backgroundHover: 'var(--bolt-elements-artifacts-backgroundHover)', |
|
borderColor: 'var(--bolt-elements-artifacts-borderColor)', |
|
inlineCode: { |
|
background: 'var(--bolt-elements-artifacts-inlineCode-background)', |
|
text: 'var(--bolt-elements-artifacts-inlineCode-text)', |
|
}, |
|
}, |
|
messages: { |
|
background: 'var(--bolt-elements-messages-background)', |
|
linkColor: 'var(--bolt-elements-messages-linkColor)', |
|
code: { |
|
background: 'var(--bolt-elements-messages-code-background)', |
|
}, |
|
inlineCode: { |
|
background: 'var(--bolt-elements-messages-inlineCode-background)', |
|
text: 'var(--bolt-elements-messages-inlineCode-text)', |
|
}, |
|
}, |
|
icon: { |
|
success: 'var(--bolt-elements-icon-success)', |
|
error: 'var(--bolt-elements-icon-error)', |
|
primary: 'var(--bolt-elements-icon-primary)', |
|
secondary: 'var(--bolt-elements-icon-secondary)', |
|
tertiary: 'var(--bolt-elements-icon-tertiary)', |
|
}, |
|
preview: { |
|
addressBar: { |
|
background: 'var(--bolt-elements-preview-addressBar-background)', |
|
backgroundHover: 'var(--bolt-elements-preview-addressBar-backgroundHover)', |
|
backgroundActive: 'var(--bolt-elements-preview-addressBar-backgroundActive)', |
|
text: 'var(--bolt-elements-preview-addressBar-text)', |
|
textActive: 'var(--bolt-elements-preview-addressBar-textActive)', |
|
}, |
|
}, |
|
terminals: { |
|
background: 'var(--bolt-elements-terminals-background)', |
|
buttonBackground: 'var(--bolt-elements-terminals-buttonBackground)', |
|
}, |
|
dividerColor: 'var(--bolt-elements-dividerColor)', |
|
loader: { |
|
background: 'var(--bolt-elements-loader-background)', |
|
progress: 'var(--bolt-elements-loader-progress)', |
|
}, |
|
prompt: { |
|
background: 'var(--bolt-elements-prompt-background)', |
|
}, |
|
sidebar: { |
|
dropdownShadow: 'var(--bolt-elements-sidebar-dropdownShadow)', |
|
buttonBackgroundDefault: 'var(--bolt-elements-sidebar-buttonBackgroundDefault)', |
|
buttonBackgroundHover: 'var(--bolt-elements-sidebar-buttonBackgroundHover)', |
|
buttonText: 'var(--bolt-elements-sidebar-buttonText)', |
|
}, |
|
cta: { |
|
background: 'var(--bolt-elements-cta-background)', |
|
text: 'var(--bolt-elements-cta-text)', |
|
}, |
|
}, |
|
}, |
|
}, |
|
}, |
|
transformers: [transformerDirectives()], |
|
presets: [ |
|
presetUno({ |
|
dark: { |
|
light: '[data-theme="light"]', |
|
dark: '[data-theme="dark"]', |
|
}, |
|
}), |
|
presetIcons({ |
|
warn: true, |
|
collections: { |
|
...customIconCollection, |
|
}, |
|
unit: 'em', |
|
}), |
|
], |
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function generateAlphaPalette(hex: string) { |
|
return [1, 2, 3, 4, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100].reduce( |
|
(acc, opacity) => { |
|
const alpha = Math.round((opacity / 100) * 255) |
|
.toString(16) |
|
.padStart(2, '0'); |
|
|
|
acc[opacity] = `${hex}${alpha}`; |
|
|
|
return acc; |
|
}, |
|
{} as Record<number, string>, |
|
); |
|
} |
|
|