Skip to main content

UI & Styling

Design System Overview


Tailwind CSS 4 Setup

Tailwind CSS 4 uses the native Vite plugin (no PostCSS needed):

// vite.config.ts
import tailwindcss from '@tailwindcss/vite'
plugins: [react(), tailwindcss()]
/* styles/index.css */
@import "tailwindcss";
@import "./theme.css";
@import "./typography.css";

/* Cross-package source scanning */
@source "../../../../packages/ui/src/**/*.{js,ts,jsx,tsx}";

Utility function: cx() from @dtx/utils — combines clsx + tailwind-merge for safe class merging.


Color Palette

Brand Colors (Purple)

TokenValueUsage
--color-brand-25Lightest purpleSubtle backgrounds
--color-brand-50Hover states
--color-brand-100Active states
--color-brand-300Borders
--color-brand-500rgb(158 119 237)Primary brand
--color-brand-600Solid backgrounds
--color-brand-700Dark variant
--color-brand-950Deepest purpleDark mode primary

Semantic Colors

CategoryTokens
Texttext-primary (900 gray), text-secondary (700), text-tertiary (600), text-disabled (400), text-brand-primary (purple), text-error-primary (red)
Backgroundbg-primary (white), bg-secondary (50 gray), bg-brand-solid (purple-600), bg-error-primary (red-50), bg-warning-primary (orange-50), bg-success-primary (green-50)
Borderborder-primary (200 gray), border-brand (purple-300), border-error (red-300), border-disabled (300 gray)

Extended Palette

Full 25–950 shade ramps for: Gray (9 variants), Error (red), Warning (orange), Success (green), Blue, Indigo, Violet, Purple, Pink, Rose, Orange, Yellow, Teal, Cyan


Typography

Font Families

TokenStack
--font-bodyInter, system-ui, -apple-system, sans-serif
--font-displayInter, system-ui, -apple-system, sans-serif
--font-monoRoboto Mono, SFMono-Regular, Menlo, Monaco, monospace

Type Scale

NameSizeLine HeightUsage
Display 2xl72px90pxHero headings
Display xl60px72pxMajor section heads
Display lg48px60pxPage titles
Display md36px44pxSection titles
Display sm30px38pxCard headings
Display xs24px32pxSub-headings
Body xl20px30pxLarge body text
Body lg18px28pxProminent body
Body md16px24pxDefault body
Body sm14px20pxSecondary text
Body xs12px18pxCaptions, labels

Spacing & Radius

Border Radius

TokenValueUsage
--radius-xxs2pxInline badges
--radius-xs4pxSmall elements
--radius-sm6pxInputs, small cards
--radius-md8pxCards, dropdowns
--radius-lg10pxModals
--radius-xl12pxLarge cards
--radius-2xl16pxFeature cards
--radius-full9999pxAvatars, pills

Shadows

TokenUsage
--shadow-xsSubtle inputs
--shadow-smCards, dropdowns
--shadow-mdElevated cards
--shadow-lgModals
--shadow-xlPopovers
--shadow-2xlPage-level elevation
--shadow-3xlFull-screen overlays

Icons

Library: @untitledui/icons 0.0.19 + @untitledui/file-icons 0.0.9

// Via @dtx/ui re-export
import { ArrowUp, Settings } from '@dtx/ui';

// Direct import
import { Home03, Users03, Dataflow03 } from '@untitledui/icons';

// Usage
<ArrowUp className="w-4 h-4" />
<Settings size={24} />

Commonly Used Icons

CategoryIcons
NavigationHome03, BookOpen01, Settings01, LifeBuoy01
UsersUsers03, Users01, Shield01
DataDatabase01, Table, Link01, FolderCode, Cube01
PipelineDataflow03, Dataflow04, PenTool01
InfrastructureServer01, MessageCircle01, GitBranch01
ActionsPlus, Edit01, Trash01, Copy01, RefreshCcw01, SearchLg
StatusCheckSquare, ClipboardList, Clock, Key01
UIChevronSelectorVertical, HelpCircle, ArrowDown, BarChart03

Responsive Design

Approach: Desktop-first. The app is primarily designed for desktop use.

BreakpointWidthUsage
xxs320pxMobile (minimal support)
xs600pxSmall tablet
sm640pxTailwind default
md768pxTailwind default
lg1024pxTailwind default
xl1280pxTailwind default — max container

The sidebar collapses on smaller screens. Most complex UI (designers, data tables) requires desktop resolution.


Dark Mode

Status: Configured but not fully rolled out across all components.

Implementation: Class-based via .dark-mode CSS class:

@custom-variant dark (&:where(.dark-mode, .dark-mode *));

Usage in components:

<div className="bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100">

Monaco Editor: Dual themes — expression-light and expression-dark

No user-facing toggle is present in the current UI.


Animations

SourceUsage
CSS (Tailwind)animate-spin (loading), transition + duration-100 (interactions)
Custom keyframesmarquee (scrolling text, 60s), caret-blink (cursor, 1s)
MotionAvailable in deps but minimal direct usage in portal

Custom CSS Variants

VariantSelectorPurpose
dark.dark-modeDark mode styles
label[data-label]Label attribute targeting
focus-input-within:has(input:focus)Parent focus styles

Global Resets

  • Font smoothing (-webkit-font-smoothing: antialiased)
  • Number input spinner removal
  • Search input clear button removal
  • Details/summary marker hiding
  • Custom scrollbar hiding utility (scrollbar-hide)