Core System

The Core module forms the foundation of Art.Works! Studio. It provides theme, UI components, settings, and logging.

Theme & Design System

All colors are centrally defined in theme/colors.ts:

// Usage in components
import { colors } from '@/theme/colors';

<Box bg={colors.bg.card} color={colors.text.primary}>
  Content
</Box>

Important: Never use direct Chakra colors like gray.800!

Color Palette

Token Usage
colors.bg.primary Main background
colors.bg.card Cards, panels
colors.bg.hover Hover states
colors.text.primary Main text
colors.text.secondary Secondary text
colors.accent.primary Accent color

Generic Components

Reusable UI components:

Component Purpose
GenericButtonBar Toolbar with search, filter, actions
GenericTabs Tab navigation
GenericGridItem Grid display
GenericListItem List display
FilterPanel Filter by labels/tags

GenericButtonBar

<GenericButtonBar
  searchTerm={search}
  onSearchChange={setSearch}
  filterOptions={filters}
  createMenuItems={[
    { label: 'New Artwork', onClick: createArtwork },
    { label: 'Import', onClick: importItem }
  ]}
/>

Settings

Settings are stored in settings.json in the workspace:

{
  "theme": "dark",
  "language": "en",
  "editor": {
    "fontSize": 14,
    "tabSize": 2
  },
  "grid": {
    "columns": 3,
    "rows": 2
  }
}

Accessing Settings

const { settings, updateSetting } = useSettings();

// Read
const fontSize = settings.editor.fontSize;

// Write
updateSetting('editor.fontSize', 16);

Logging

Centralized logging via LogService:

import { logger } from '@/services/log.service';

logger.info('Artwork loaded', { id: 'item-001' });
logger.warn('Deprecated format');
logger.error('Error saving', error);

Logs are stored in:

  • macOS: ~/Library/Application Support/Art.Works! Studio/logs/
  • Windows: %APPDATA%/Art.Works! Studio/logs/

IPC Communication

Main ↔ Renderer communication via IPC:

// Renderer (React)
const item = await window.api.catalog.getItem('item-001');

// Main Process
ipcMain.handle('catalog:get-item', async (event, itemId) => {
  return catalogService.getItem(itemId);
});