Install the icons in React or shadcn/ui
The set is drawn on the exact same 24×24 grid and 2px keyline that shadcn/ui's defaults assume, so it drops in without any adjustment to your components or styling tokens.
Uses currentColor for fills and strokes, inheriting any text-* class seamlessly.
1,000 Keyline grid glyphs, 2,242 Extended UI icons, and 467 interactive Motion icons.
Add source components directly with npx shadcn add @flux/name without dependency lock-in.
Identical 24×24 keyline construction: swap imports without touching component JSX markup.
Installation Methods
Install
Add it with the shadcn CLI, or copy the source manually.
Install React Icon Package
Add Individual Icons Via shadcn Registry
$ npx shadcn add @flux/bellQuickstart with React
Import glyphs directly by name from @flux-icons/react. All components accept standard SVG props, including className, size, and strokeWidth:
Vue, Svelte, Angular and HTML
The complete set is mirrored on Iconify (opens in a new tab) under the flux-icons prefix, covering all 8,000 drawings across Vue, Svelte, and non-React stacks.
For plain HTML or projects without a build step, the official web component and Tailwind CSS mask plugin are available:
Sizing inside shadcn components
shadcn/ui primitives size their own icons automatically. Button applies the rule [&_svg:not([class*='size-'])]:size-4, which defaults any nested icon to 16px unless an explicit size-* class is applied.
Interactive preview of icons nested inside shadcn button variants:
Stroke width at small sizes
The library is authored on a strict 24×24 grid with a 2px keyline. At 16px, this matches standard UI text density without clogging apertures or blurring on high-DPI displays.
Coming from Lucide
Because both icon suites share an identical 24×24 boundary box, 2px stroke weight, and currentColor fill/stroke logic, switching is a one-line import replacement:
Names follow consistent semantic standards. Where compound names differ, the family base word leads: mail-check rather than check-mail.
Four styles, two corner treatments
Every icon is crafted in four distinct weights and two corner treatments (Regular rounded and Sharp square caps).
Each style is exported from its own entry point in the package, guaranteeing dead-code elimination:
Inspect the drawings directly in SVG format on the GitHub repository (opens in a new tab).
API Reference
Component prop specifications for @flux-icons/react icons and the interactive ScrollProgress navigation pill:
Flux Icon Props
| Property | Type | Default | Description |
|---|---|---|---|
size | number | string | 24 | Rendered boundary box in pixels. Scales width and height proportionally. |
strokeWidth | number | string | 2 | Keyline stroke width on the 24×24 coordinate grid. Scales cleanly without hairline fracturing. |
color | string | currentColor | Fill or stroke color. Inherits surrounding text color by default. |
corner | "regular" | "sharp" | "regular" | Corner cap geometry: standard rounded caps or architectural square caps. |
className | string | — | Tailwind CSS utility classes or custom styles applied to the root SVG element. |
ScrollProgress Props
| Property | Type | Default | Description |
|---|---|---|---|
sections | ScrollProgressSection[] | [] | List of { id, label } sections observed for viewport scrolling and popout navigation. |
offset | number | 120 | Vertical viewport offset in pixels before switching to the subsequent active section. |
containerRef | RefObject<HTMLElement | null> | undefined | Optional custom scroll container reference. Falls back to the global window scroller. |
className | string | — | Custom classes applied to the fixed root container. |
Component Composition
Nest and compose components cleanly inside your application tree without runtime overhead:
FluxIcon Architecture
Atomic SVG rendering with currentColor inheritance and keyline stroke alignment.
FluxIconProvider (optional global defaults)
└── FluxIcon (stroke | two-tone | duotone | fill)
└── SVG (24×24 keyline geometric canvas)
├── paths (currentColor stroke / plate)
└── title / desc (accessible metadata)ScrollProgress Architecture
Physics-based spring surface with circular pathLength indicator and layoutId pill selection.
ScrollProgress (fixed viewport root)
└── Surface (motion.div with squircle physics)
├── ProgressCircle (circular SVG path meter)
│ ├── BackgroundRing
│ └── ActivePath (pathLength linked to scroll progress)
└── SectionMenu (motion.ul popout list)
└── SectionItem (motion.li button)
└── ActiveIndicator (layoutId="active")Frequently asked questions
Concise answers to common integration questions across React and shadcn stacks:
- Do I need to install anything to use one icon?
- No. The icon browser copies any drawing as SVG or JSX at the size and stroke width you set, and pasting that into a component is the whole install. Every drawing colours from currentColor, so it needs no fill or stroke attribute of your own.
- Which package do I install for React?
- @flux-icons/react, which generates one component per icon from the same SVGs, so the two cannot disagree. Each style is its own entry point, and the drawings are also in icons/ in the repository at github.com/codewithevilxd/flux-icons if you would rather copy them than install anything.
- Why does each style have its own import path?
- So an app ships only the styles it imports. Every name is in all four, and the import path picks the look: @flux-icons/react/two-tone for the outline over a plate, @flux-icons/react/duotone for the grey body with black detail. Code that imported /duotone before 1.0.0 and wants the old look changes the path to /two-tone.
- How do I size an icon inside a shadcn/ui Button?
- Button sizes nested SVGs itself, with [&_svg:not([class*='size-'])]:size-4, which reads: make any nested icon 16px unless it already carries a size- class. So a bare icon is 16px, a size prop is overridden by that class, and className="size-6" is what actually changes it. Sidebar and DropdownMenu use the same rule without the exception clause, so there your own class will not win.
- What stroke width should I use?
- Two, which is what the set is drawn and tested at on the 24 grid, including at 16px where the tighter drawings had to be opened up to survive. Lighter weights are for large decorative use; below 16px they break the drawings up rather than refine them, because the gaps between elements were measured against a 2-unit keyline.
- How do I switch from lucide?
- Change the import. Both sets are 24×24 with a 2px keyline and a currentColor stroke, so the markup stays as it is. One prop has no equivalent here: lucide's absoluteStrokeWidth. The stroke scales with the icon instead, which is what keeps an enlarged keyline looking drawn rather than hairline.
- Can I use the set without React?
- Yes, two ways. The set is on Iconify as flux-icons, so @iconify/vue, @iconify/svelte and the iconify-icon web component cover Vue, Svelte, Angular, Solid and plain HTML between them, none of them a package of ours. Or take the files: icons/<style>/<name>.svg in the repository are plain normalised SVGs with no wrapper, no ids and no classes to strip out. Treat those as build output: to change a drawing, change it in raw/ and rebuild.
- Is the set free for commercial use?
- Yes. It is released under the MIT License, which covers commercial and client work. The licence asks that its notice travels with copies of the set itself rather than with a product that happens to use an icon; the LICENSE file in the repository is the actual grant.