The Universal JavaScript Icon Library for Untitled UI
Full SVG Support for React, Vue, Solid, and Qwik
untitledui-js
is the officially sanctioned JavaScript implementation of the Untitled UI icon system, developed with direct approval from Jordan Hughes (Untitled UI founder). This library provides:
- Full SVG compliance with all standard attributes and methods
- Framework-specific implementations for:
- React (v17+)
- Vue (v3+)
- SolidJS (v1+)
- Qwik (v1+)
- TypeScript-first architecture
- Motion integration (React only)
- Tree-shaking support
- Semantic versioning
Official Design System: Untitled UI
# Base installation (framework-agnostic)
npm install untitledui-js
# React with motion support
npm install untitledui-js motion
Framework | Supported Versions | Motion Support |
---|---|---|
React | 17.x, 18.x, 19.x | Yes |
Vue | 3.x | No |
Solid | 1.x | No |
Qwik | 1.x | No |
All icons are pure SVG components supporting:
- Standard SVG attributes (
viewBox
,fill
,stroke
, etc.) - Direct DOM manipulation
- Class-based styling
- Inline style overrides
- Accessibility attributes (
aria-*
,role
, etc.)
Identical API surface across frameworks:
// React/Solid/Qwik
<Icon size={24} color="currentColor" />
<!-- Vue -->
<icon :size="24" color="var(--primary)" />
import { motion } from "motion/react";
<Icon
animation={{
motion: motion,
attributes: {
svg: { whileHover: { scale: 1.1 } },
path: { transition: { duration: 0.5 } },
},
}}
/>;
import { Activity } from "untitledui-js";
function App() {
return (
<Activity
pathProps={{
initial: { opacity: 0 },
animate: { opacity: 1 },
}}
/>
);
}
import { Activity } from "untitledui-js/react";
import { motion } from "motion/react";
function App() {
return (
<Activity
animation={{
motion: motion,
attributes: {
svg: {
initial: { rotate: 0 },
animate: { rotate: 360 },
transition: { duration: 1 },
},
path: {
initial: { rotate: 0 },
animate: { rotate: 360 },
transition: { duration: 1 },
},
},
}}
/>
);
}
Key Changes:
- Separate SVG/path animations
- Explicit motion library declaration
- Type-safe animation properties
- No side effects in static implementations
<template>
<Activity :size="24" class="icon-primary" />
</template>
<script setup>
import { Activity } from "untitledui-js/vue";
</script>
import { component$ } from "@builder.io/qwik";
import { Activity } from "untitledui-js/qwik";
export default component$(() => {
return <Activity style={{ color: "#3b82f6" }} />;
});
import { Activity } from "untitledui-js/solid";
function App() {
return <Activity fill="none" stroke="currentColor" stroke-width="2" />;
}
All SVG properties and methods are fully supported:
<Activity className="icon-lg text-red-500 hover:scale-110" />
<Activity
style={{
width: "2rem",
height: "2rem",
filter: "drop-shadow(0 2px 4px rgba(0,0,0,0.25))",
}}
/>
<Activity aria-label="Active indicator" role="img" data-custom="value" />
- Icon Updates: Submit SVG files through PRs to
src/raw-icons
- Version Bumps: Use
npm run version
(semantic versioning enforced) - Type Safety: All icons must pass
tsc --strict
checks - Framework Parity: Changes must be implemented across all frameworks
MIT License
Copyright (c) 2023 Untitled UI & Contributors
See LICENSE.md for full text.