forked from
npmx.dev/npmx.dev
[READ-ONLY]
a fast, modern browser for the npm registry
1import {
2 defineConfig,
3 presetIcons,
4 presetWind4,
5 transformerDirectives,
6 transformerVariantGroup,
7} from 'unocss'
8import type { Theme } from '@unocss/preset-wind4/theme'
9import { presetRtl } from './uno-preset-rtl'
10import { presetA11y } from './uno-preset-a11y'
11
12const customIcons = {
13 'agent-skills':
14 '<svg viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M16 0.5L29.4234 8.25V23.75L16 31.5L2.57661 23.75V8.25L16 0.5Z" fill="currentColor"/><path d="M16 6L24.6603 11V21L16 26L7.33975 21V11L16 6Z" fill="none" stroke="currentColor" stroke-width="3"/></svg>',
15 'tangled':
16 '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 25 25"><path fill="currentColor" d="M16.346 24.11c-.785-.007-1.384-.235-2.034-.632-.932-.49-1.643-1.314-2.152-2.222-.808 1.003-1.888 1.611-3.097 1.955-.515.15-1.416.301-2.911-.24-2.154-.724-3.723-2.965-3.545-5.25-.033-.946.313-1.875.802-2.674-1.305-.7-2.37-1.876-2.777-3.318-.248-.79-.237-1.64-.146-2.452.327-1.916 1.764-3.582 3.615-4.182.738-1.683 2.35-2.938 4.176-3.193a5.54 5.54 0 0 1 3.528.7C13.351.89 16.043.383 18.1 1.436c1.568.75 2.69 2.312 2.962 4.015 1.492.598 2.749 1.817 3.242 3.365.33.958.34 2.013.127 2.997-.382 1.536-1.465 2.842-2.868 3.557.003.273.901 2.243.751 3.73-.033 1.858-1.211 3.62-2.846 4.475-.954.557-2.085.546-3.12.535m-4.47-5.35c1.322-.148 2.19-1.3 2.862-2.339.319-.473.562-1.002.803-1.506.314.287.58.828 1.075.957.522.163 1.133.03 1.453-.443.611-1.14.31-2.517-.046-3.699-.22-.679-.507-1.375-1.054-1.856.116-.823-.372-1.66-1.065-2.09-.592.47-1.491.468-2.061-.037-1.093 1.115-2.095 1.078-3.063.195-.217-.199-.632 1.212-2.088.413-.837.7-1.485 1.375-2.06 2.346-.559 1.046-1.143 1.976-1.194 3.113-.024.664.495 1.36 1.198 1.306.703.063 1.182-.63 1.714-.917.08.928.169 1.924.482 2.829.36 1.171 1.627 1.916 2.825 1.745zm.687-3.498c-.644-.394-.334-1.25-.36-1.871.064-.75.115-1.538.453-2.221.356-.487 1.226-.3 1.265.326-.026.628-.314 1.254-.28 1.905-.075.544.054 1.155-.186 1.653-.198.275-.6.355-.892.208m-2.81-.358c-.605-.329-.413-1.156-.508-1.73.08-.666.014-1.51.571-1.978.545-.38 1.287.271 1.03.869-.276.755-.096 1.58-.09 2.346a.712.712 0 0 1-1.002.493"/></svg>',
17 'vlt':
18 '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9991 5.03666C7.9991 5.46387 7.93211 5.87545 7.80808 6.26145C7.45933 7.34674 7.1975 8.58253 7.7669 9.57009L10.389 14.1177C10.7072 14.6697 11.3617 14.9108 11.9989 14.9108V14.9108V14.9108C12.6352 14.9108 13.2886 14.6699 13.6064 14.1187L16.2301 9.5682C16.7993 8.58097 16.5379 7.34565 16.1895 6.26064C16.0656 5.87488 15.9987 5.46358 15.9987 5.03666C15.9987 2.82777 17.7894 1.03711 19.9983 1.03711C22.2071 1.03711 23.9978 2.82777 23.9978 5.03666C23.9978 7.24555 22.2071 9.03621 19.9983 9.03621V9.03621C19.3609 9.03621 18.7062 9.27733 18.3878 9.82951L15.7661 14.3766C15.1967 15.3642 15.4586 16.6001 15.8074 17.6854C15.9314 18.0715 15.9984 18.4831 15.9984 18.9104C15.9984 21.1193 14.2078 22.9099 11.9989 22.9099C9.79001 22.9099 7.99935 21.1193 7.99935 18.9104C7.99935 18.4834 8.06626 18.072 8.19016 17.6862C8.53863 16.6012 8.80017 15.3657 8.23092 14.3785L5.60752 9.8285C5.28961 9.27712 4.63601 9.03621 3.99955 9.03621V9.03621C1.79066 9.03621 0 7.24555 0 5.03666C0 2.82777 1.79066 1.03711 3.99955 1.03711C6.20844 1.03711 7.9991 2.82777 7.9991 5.03666Z" fill="currentColor"></path></svg>',
19}
20
21export default defineConfig({
22 presets: [
23 presetWind4(),
24 presetIcons({
25 extraProperties: {
26 'display': 'inline-block',
27 'forced-color-adjust': 'preserve-parent-color',
28 },
29 warn: true,
30 scale: 1.2,
31 collections: {
32 custom: customIcons,
33 },
34 }),
35 // keep this preset last
36 ...(process.env.CI ? [] : [presetRtl(), presetA11y()]),
37 ].filter(Boolean),
38 transformers: [transformerDirectives(), transformerVariantGroup()],
39 theme: {
40 spacing: { DEFAULT: '4px' },
41 font: {
42 mono: "'Geist Mono', monospace",
43 sans: "'Geist', system-ui, -apple-system, sans-serif",
44 },
45 text: {
46 '2xs': { fontSize: '0.6875rem' }, // 11px
47 '3xs': { fontSize: '0.625rem' }, // 10px
48 '4xs': { fontSize: '0.5625rem' }, // 9px
49 '5xs': { fontSize: '0.5rem' }, // 8px
50 },
51 colors: {
52 // Minimal black & white palette with subtle grays
53 bg: {
54 DEFAULT: 'var(--bg)',
55 subtle: 'var(--bg-subtle)',
56 muted: 'var(--bg-muted)',
57 elevated: 'var(--bg-elevated)',
58 },
59 fg: {
60 DEFAULT: 'var(--fg)',
61 muted: 'var(--fg-muted)',
62 subtle: 'var(--fg-subtle)',
63 },
64 border: {
65 DEFAULT: 'var(--border)',
66 subtle: 'var(--border-subtle)',
67 hover: 'var(--border-hover)',
68 },
69 accent: {
70 DEFAULT: 'var(--accent)',
71 fallback: 'var(--accent-muted)',
72 },
73 // Syntax highlighting colors (inspired by GitHub Dark)
74 syntax: {
75 fn: 'var(--syntax-fn)',
76 str: 'var(--syntax-str)',
77 kw: 'var(--syntax-kw)',
78 comment: 'var(--syntax-comment)',
79 },
80 badge: {
81 orange: 'var(--badge-orange)',
82 yellow: 'var(--badge-yellow)',
83 green: 'var(--badge-green)',
84 cyan: 'var(--badge-cyan)',
85 blue: 'var(--badge-blue)',
86 indigo: 'var(--badge-indigo)',
87 purple: 'var(--badge-purple)',
88 pink: 'var(--badge-pink)',
89 },
90 // Playground provider brand colors
91 provider: {
92 stackblitz: '#1389FD',
93 codesandbox: '#FFCC00',
94 codepen: '#47CF73',
95 replit: '#F26207',
96 gitpod: '#FFAE33',
97 vue: '#4FC08D',
98 nuxt: '#00DC82',
99 vite: '#646CFF',
100 jsfiddle: '#0084FF',
101 },
102 },
103 animation: {
104 keyframes: {
105 'skeleton-pulse': '{0%, 100% { opacity: 0.4 } 50% { opacity: 0.7 }}',
106 'fade-in': '{from { opacity: 0 } to { opacity: 1 }}',
107 'slide-up':
108 '{from { opacity: 0; transform: translateY(8px) } to { opacity: 1; transform: translateY(0) }}',
109 'scale-in':
110 '{from { opacity: 0; transform: scale(0.95) } to { opacity: 1; transform: scale(1) }}',
111 },
112 durations: {
113 'skeleton-pulse': '2s',
114 'fade-in': '0.3s',
115 'slide-up': '0.4s',
116 'scale-in': '0.2s',
117 },
118 timingFns: {
119 'skeleton-pulse': 'ease-in-out',
120 'fade-in': 'ease-out',
121 'slide-up': 'cubic-bezier(0.22, 1, 0.36, 1)',
122 'scale-in': 'cubic-bezier(0.22, 1, 0.36, 1)',
123 },
124 counts: {
125 'skeleton-pulse': 'infinite',
126 },
127 },
128 } satisfies Theme,
129 shortcuts: [
130 // Layout
131 ['container', 'max-w-6xl mx-auto px-4 sm:px-6'],
132 ['container-sm', 'max-w-5xl mx-auto px-4 sm:px-6'],
133
134 // Focus states - subtle but accessible
135 ['focus-ring', 'outline-none focus-visible:(ring-2 ring-fg/50 ring-offset-2)'],
136
137 ['link-subtle', 'text-fg-muted hover:text-fg transition-colors duration-200 focus-ring'],
138
139 // badges
140 ['badge-orange', 'bg-badge-orange/10 text-badge-orange'],
141 ['badge-yellow', 'bg-badge-yellow/10 text-badge-yellow'],
142 ['badge-green', 'bg-badge-green/10 text-badge-green'],
143 ['badge-cyan', 'bg-badge-cyan/10 text-badge-cyan'],
144 ['badge-blue', 'bg-badge-blue/10 text-badge-blue'],
145 ['badge-indigo', 'bg-badge-indigo/10 text-badge-indigo'],
146 ['badge-purple', 'bg-badge-purple/10 text-badge-purple'],
147 ['badge-pink', 'bg-badge-pink/10 text-badge-pink'],
148 ['badge-subtle', 'bg-bg-subtle text-fg-subtle'],
149 ],
150 rules: [
151 // Custom scale for active states
152 ['scale-98', { transform: 'scale(0.98)' }],
153
154 // Subtle text gradient for headings
155 [
156 'text-gradient',
157 {
158 'background': 'linear-gradient(to right, #fafafa, #a1a1a1)',
159 '-webkit-background-clip': 'text',
160 '-webkit-text-fill-color': 'transparent',
161 'background-clip': 'text',
162 },
163 ],
164
165 // Ensures elements start in initial state during delay
166 ['animate-fill-both', { 'animation-fill-mode': 'both' }],
167 ],
168})