Skip to content

Latest commit

 

History

History
360 lines (275 loc) · 16.4 KB

File metadata and controls

360 lines (275 loc) · 16.4 KB
name Colomin
description A minimal, data-focused CSV editor for macOS. The design language prioritises information density and legibility over decoration — every pixel earns its place by serving the data.
themes
default available
colomin-light
colomin-light
colomin-dark
github-light
github-dark
colors
background surface border gutter-bg status-bar-bg text-primary text-secondary text-tertiary accent accent-hover accent-subtle on-accent state-edited state-hover-row state-selection state-danger
#FAFAFA
#FFFFFF
#F4F4F4
#FFFFFF
#FAFAFA
#1A1A1A
#8A8A8A
#B0B0B0
#3B82F6
#2563EB
#EFF6FF
#FFFFFF
#FFF7ED
#F5F8FF
#C7DEFF
#EF4444
colors-dark
background surface border gutter-bg status-bar-bg text-primary text-secondary text-tertiary accent accent-hover accent-subtle on-accent state-edited state-hover-row state-selection state-danger
#141414
#1B1B1B
#383838
#1B1B1B
#141414
#E8E8E8
#A1A1A1
#6E6E6E
#60A5FA
#3B82F6
#172554
#08111F
#3A2410
#1E293B
#17335C
#EF4444
typography
body label-sm title heading cell row-number cell-editor-input
fontFamily fontSize fontWeight lineHeight
System UI (platform proportional)
12px
400
16px
fontFamily fontSize fontWeight lineHeight
System UI (platform proportional)
11px
400
14px
fontFamily fontSize fontWeight lineHeight
System UI (platform proportional)
13px
600
18px
fontFamily fontSize fontWeight lineHeight
System UI (platform proportional)
15px
600
20px
fontFamily fontSize fontWeight lineHeight
System Monospace (platform monospace)
12px
400
16px
fontFamily fontSize fontWeight lineHeight
System Monospace (platform monospace)
10px
400
14px
fontFamily fontSize fontWeight lineHeight
System Monospace (platform monospace)
10px
400
cell font size + 4 px
spacing
base xs sm md lg xl cell-h-padding panel-h-padding panel-v-padding row-height-default row-height-min column-width-default column-width-min column-width-max gutter-right-pad sidebar-width-default sidebar-width-range scrollbar-thumb-min scrollbar-thumb-pad-h scrollbar-thumb-pad-v
4px
4px
8px
12px
16px
24px
6px
8px
4px
30px
16px
150px
40px
800px
8px
300px
200–800 px
24px
3px
2px
rounded
none sm DEFAULT
0px
4px
4px
elevation
base raised overlay
{colors.background}
{colors.surface}
{colors.surface}
strokes
default focus text
width color
1px
{colors.border}
width color
1px
{colors.accent}
width color
1px
{colors.text-primary}
motion
scrollbar-fade-in scrollbar-fade-out scrollbar-idle-opacity selection-dash
property rate
opacity
8.0 α/s
property rate linger
opacity
1.5 α/s
600ms
0.35
property speed period
stroke-dashoffset
12 units/s
9
components
button button-hover button-active button-danger table-cell table-cell-hovered table-cell-selected table-cell-edited table-header table-header-active row-number scrollbar-thumb sidebar status-bar
backgroundColor textColor typography rounded borderColor borderWidth padding
{colors.surface}
{colors.text-primary}
{typography.body}
{rounded.sm}
{colors.border}
1px
4px 8px
backgroundColor borderColor
{colors.state-hover-row}
{colors.accent}
backgroundColor borderColor
{colors.accent-subtle}
{colors.accent}
textColor
{colors.state-danger}
backgroundColor textColor typography rounded padding height
{colors.background}
{colors.text-primary}
{typography.cell}
{rounded.none}
0px 6px
{spacing.row-height-default}
backgroundColor
{colors.state-hover-row}
backgroundColor borderColor borderStyle borderWidth
{colors.state-selection}
{colors.accent}
dashed
1px
backgroundColor
{colors.state-edited}
backgroundColor textColor typography borderBottomColor borderBottomWidth
{colors.surface}
{colors.text-primary}
{typography.body}
{colors.border}
1px
borderBottomColor
{colors.accent}
backgroundColor textColor typography borderRightColor borderRightWidth
{colors.gutter-bg}
{colors.text-tertiary}
{typography.row-number}
{colors.border}
1px
rounded paddingH paddingV color-dragging color-hover color-normal
{rounded.sm}
{spacing.scrollbar-thumb-pad-h}
{spacing.scrollbar-thumb-pad-v}
{colors.text-secondary}
blend({colors.text-secondary}, {colors.text-tertiary}, 0.5)
{colors.text-tertiary}
backgroundColor width padding
{colors.surface}
{spacing.sidebar-width-default}
8px
backgroundColor textColor typography borderTopColor borderTopWidth height
{colors.status-bar-bg}
{colors.text-secondary}
{typography.label-sm}
{colors.border}
1px
22px

Overview

Colomin is a desktop CSV editor for macOS built with the egui immediate-mode UI framework. The design language is minimal and data-first: the spreadsheet grid is the product, and every surrounding element — toolbars, sidebars, the status bar — exists only to serve the data within it.

The aesthetic is deliberately quiet. There are no drop shadows, no gradients, no decorative illustration. What remains is a precise system of flat colour, consistent 1 px strokes, and careful typographic hierarchy.

Colour Philosophy

The palette is built around two axes: surface depth and semantic state.

Surface depth uses just two levels: background (the app canvas) and surface (panels, headers, the gutter). The difference between them is intentionally subtle — a few luminance steps — enough to define structure without drawing the eye away from cell content.

Semantic state colours communicate interactive meaning:

Token Light Purpose
accent #3B82F6 Focus rings, selected column headers, interactive affordances
state-selection #C7DEFF Highlighted cell range
state-hover-row #F5F8FF Row under the pointer
state-edited #FFF7ED Unsaved edit (warm amber wash)
state-danger #EF4444 Destructive actions

The state-edited warm amber tint is the only warm hue in an otherwise cool-neutral palette. Its job is to make unsaved work impossible to miss — it reads immediately, even in peripheral vision.

Themes ship in four variants — Colomin Light, Colomin Dark, GitHub Light, GitHub Dark — all following the same semantic token structure. The accent shifts from #3B82F6 (light) to #60A5FA (dark) to maintain sufficient contrast on dark surfaces while preserving the same blue identity.

Typography

Two font families divide the interface by function:

  • Proportional (system UI font) — menus, labels, sidebar controls, status bar. Text here supports navigation and commands.
  • Monospace (system monospace font) — data cells, row numbers, the cell editor's input area. Monospace alignment lets column values scan vertically at a glance, the way a spreadsheet user expects.

The default cell size is 12 px, user-adjustable from 10 to 18 px. Row-number text is always cell size − 2 px (min 8 px) to sit visually subordinate to cell content. The cell editor footer line height expands to cell size + 4 px to provide comfortable reading in the multiline view.

Weights stay at 400 for data and labels; 600 (semi-bold) for section headings and active column headers only. Restraint in weight keeps the grid readable under high density.

Shape Language

Colomin uses almost no rounding. Table cells and row backgrounds are perfectly rectangular — border-radius: 0. The only rounded element is the 4 px corner on buttons and scrollbar thumbs.

This is deliberate: rounded corners imply containment and card-like groupings. In a dense grid, unnecessary rounding would create visual noise. Flat edges let rows and columns read as the continuous, scannable bands they are.

Spacing and Density

The grid is designed for information density:

  • Default row height: 30 px
  • Cell horizontal padding: 6 px each side (12 px total)
  • Border strokes: 1 px throughout

This is compact but not cramped. The 30 px row height provides enough vertical whitespace for legibility at 12 px font size while keeping more rows visible without scrolling. The 6 px cell padding gives cell text room to breathe without wasting horizontal space.

The layout follows a 4 px base unit. All spacing values are multiples of 4.

Elevation and Depth

There are no shadows anywhere in the interface. Depth is expressed through colour only: the background is slightly darker than the surface layer above it. This keeps the aesthetic flat and direct — consistent with a tool where the data is the focus.

The row-number gutter sits visually behind the table body, reinforced by its tertiary text colour. The sidebar uses the surface colour to read as a distinct panel without a drop shadow separating it.

Motion

Motion in Colomin is functional, not decorative. Two animated systems exist:

Overlay scrollbars behave like macOS native scrollbars: invisible at rest, fading in at 8 α/s when the user scrolls, then lingering for 600 ms before fading out at 1.5 α/s. While the cursor is inside the table area, the thumbs remain faintly visible at 35 % opacity. This keeps the scroll affordance discoverable without cluttering the view.

Marching ants selection — the dashed border around the selected cell range animates at 12 units/s with a 9-unit dash period, matching spreadsheet conventions (Excel, Numbers) and communicating "active selection" unambiguously.

No other motion is used. Hover state changes are instantaneous.

Components

Table Grid

The table is the primary surface. Headers use the surface background with a 1 px border bottom rule. When a column is sorted or focused, that rule recolours to accent. Rows alternate between background (default) and state-hover-row (pointer contact). The selected range fills with state-selection and gains a 1 px dashed accent border (animated).

Column resize handles occupy the bottom 4 px of each header cell. They are border-coloured at rest and accent-coloured on hover — a thin but discoverable affordance.

Gutter (Row Numbers)

The gutter is a fixed-width column on the left, permanently visible. It uses text-tertiary for the row numbers and a 1 px right border to separate it from cell content. On row-resize hover, its bottom border recolours to accent, consistent with the column resize treatment.

Sidebar (Cell Editor)

The cell editor opens as a right-hand sidebar. Its default width is 300 px, freely draggable between 200 and 800 px. The background is surface — the same level as the table header — which visually places it "above" the app canvas. The input area uses monospace type matching the table cells for visual consistency.

Buttons

Buttons use a minimal outlined style: surface fill, 1 px border, 4 px radius. Hover promotes the border to accent and shifts fill to state-hover-row. Active state uses accent-subtle fill. Destructive buttons recolour their label to state-danger; the border and shape remain identical to avoid jarring contrast.

Scrollbars

Custom overlay scrollbars match the macOS idiom: translucent thumbs, no visible track, no scrollbar arrows. Thumb colour progresses from text-tertiary (normal) through a blend of text-secondary/text-tertiary (hover) to text-secondary (dragging). The 4 px thumb radius softens the only moving element on screen.

Status Bar

A 22 px bar at the bottom of the window. label-sm typography, text-secondary colour, separated from the table by a 1 px border top rule. Used for row/column counts and cursor position — reference information, never controls.

Design Principles

  1. Data first. The grid occupies maximum available space. Chrome elements are narrow and static.
  2. Flat, not lifeless. No shadows or gradients, but colour and stroke provide clear hierarchy.
  3. Semantic colour. Every colour token has one job. No colour is used decoratively.
  4. Monospace for data. All user-entered values render in monospace. Proportional type is reserved for UI.
  5. Motion as signal. The two animated systems (scrollbars, marching ants) communicate affordance and state — not brand personality.
  6. Theme-agnostic tokens. The semantic token layer (accent, surface, state-*) maps identically across all four themes; only the resolved hex values differ.