A custom SVG icon library with dual light/dark themes
Project description
voldmark
A custom SVG icon library with a singular visual language. Not a generic icon set — every icon is authored with intent.
55 icons across 5 categories. Dual light/dark themes. Stroke-only. 24×24 grid. Available for React, Astro, and Python.
Design principles
- One grid — 24×24 with 2px safe margin (20×20 usable area)
- One weight — 1.5px stroke (±0.25px optical correction where noted)
- One language — rounded caps and joins, no fills, no effects
- Dual theme — light and dark variants are designed, not inverted
Installation
npm (React / Astro)
npm install voldmark
PyPI (Python)
pip install voldmark
Usage
React — light (default)
import { ArrowRight, UiSearch, StatusCheck } from 'voldmark/react'
<ArrowRight />
<ArrowRight size={20} />
<ArrowRight size={20} strokeWidth={2} color="#ff0000" />
<ArrowRight title="Go forward" /> // accessible: aria-label + role="img"
React — dark
import { ArrowRight } from 'voldmark/react/dark'
<ArrowRight size={24} />
Astro — light
---
import ArrowRight from 'voldmark/astro/light/ArrowRight'
import UiSearch from 'voldmark/astro/light/UiSearch'
---
<ArrowRight />
<ArrowRight size={20} color="#333" />
<ArrowRight title="Go forward" />
Astro — dark
---
import ArrowRight from 'voldmark/astro/dark/ArrowRight'
---
<ArrowRight size={24} />
Python
from voldmark import light, dark
# Returns a complete SVG string ready to embed in HTML
svg = light.arrow_right()
svg = light.arrow_right(size=20, color="#111", stroke_width=2)
svg = dark.arrow_right(title="Go right") # accessible: aria-label + role="img"
# All icons have the same signature
svg = light.status_check(size=16)
svg = light.ui_search(class_name="icon", aria_hidden=False)
Python icon function signature:
def arrow_right(
size: int | str = 24,
color: str = "currentColor",
stroke_width: float | None = None,
class_name: str | None = None,
title: str | None = None,
aria_hidden: bool | None = None,
) -> str: ...
Raw SVG strings (JS)
import arrowRight from 'voldmark/svg/light/arrow-right'
import arrowRight from 'voldmark/svg/dark/arrow-right'
Sprite sheet
<!-- In your HTML -->
<script type="module">
import 'voldmark/sprite/light'
</script>
<svg><use href="#arrow-right" /></svg>
Component API
React / Astro props
interface VoldmarkIconProps {
size?: number | string // default: 24
color?: string // default: 'currentColor'
strokeWidth?: number // default: 1.5
className?: string
style?: React.CSSProperties // React only
title?: string // accessibility label — renders <title> + aria-label
'aria-hidden'?: boolean // default: true when no title
}
Icon catalog
Arrows
arrow-right arrow-left arrow-up arrow-down
Chevrons
chevron-right chevron-left chevron-up chevron-down
UI Chrome
ui-close ui-menu ui-search ui-settings ui-plus ui-minus
ui-dots-horizontal ui-dots-vertical ui-sparkle ui-wand ui-robot ui-bolt
ui-orbit ui-mosaic ui-thread ui-broadcast
Status
status-check status-warning status-error status-info
status-lock status-unlock status-target status-trophy
status-star status-thumbs-up status-thumbs-down
User
user user-circle user-plus user-minus
File & Folder
file file-text file-plus file-minus file-download file-upload
folder folder-open
Data
data-chart-bar data-chart-line data-chart-pie data-flow
Navigation
nav-home nav-back nav-external-link nav-waypoint
Development
npm run validate # check parity + SVG rules
npm run optimize # SVGO optimization pass
npm run build # generate React + Astro + Python outputs, bundle dist/
npm run preview # visual QA at localhost:5173
npm run test # run all JS tests (Vitest)
pytest python/tests/ # run Python tests
Adding icons
- Create
src/icons/light/<name>.svg - Create
src/icons/dark/<name>.svg - Run
npm run validate— must pass before proceeding - Run
npm run build - Run
npm testandpytest python/tests/
SVG requirements: viewBox="0 0 24 24", fill="none", currentColor for all strokes, stroke-width="1.5", round caps and joins, no <title>, <style>, <desc>, no hardcoded colors, max 4KB.
Preview app
npm run preview
Opens a side-by-side light/dark grid with a live size slider (12px → 48px). Use this for visual QA before committing new icons.
Release
Releases are triggered by pushing a version tag:
git tag v0.1.0
git push origin v0.1.0
The CI/CD pipeline will:
- Build and test (Node + Python 3.11–3.13)
- Publish to npm
- Publish to PyPI
- Create a GitHub Release
Required secrets: NPM_TOKEN, PYPI_TOKEN.
License
MIT — Guilherme Almeida Zeni
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file voldmark-0.1.0.tar.gz.
File metadata
- Download URL: voldmark-0.1.0.tar.gz
- Upload date:
- Size: 6.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ee0fc2ff8c075fe9235b3c29688ab9c927ac36de8b6ff592800dfb3ca0389c25
|
|
| MD5 |
f7457c9144951ebdcb4a8a0b3fa73818
|
|
| BLAKE2b-256 |
28abff8ab3204575744b1ca5138b975763e38ff661e642c0930e6f199586f0fe
|
File details
Details for the file voldmark-0.1.0-py3-none-any.whl.
File metadata
- Download URL: voldmark-0.1.0-py3-none-any.whl
- Upload date:
- Size: 9.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9236e5904b754f9fc77860264d2e93547a0d95633128329cb9097ac8cfafbd7a
|
|
| MD5 |
5083f3fba1acb3467db5362aa71100a6
|
|
| BLAKE2b-256 |
d3759e9862b4eb14bb275187a874f04d89c2f90c722449cce65173cda1a9f8a3
|