| 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>,
|
| );
|
| }
|
|
|