Free icons with search and categories: the Hugeicons stroke set, and Solar in six styles, from linear to bold duotone. Click any icon to copy it the way you work: straight into Figma, as HTML, React, Vue, Laravel, Flutter or React Native code, or as a file. Search matches the icon's name and its code name.
assets/fonts/, and
app_icons.dart into
lib/ — it's the whole set as
static const IconData, already generated.
pubspec.yaml:
flutter:
fonts:
- family: HugeiconsStrokeRounded
fonts:
- asset: assets/fonts/hgi-stroke-rounded.ttf
Icon(HugeIcons.callRinging01, size: 22, color: Colors.teal); IconButton( onPressed: refresh, icon: const Icon(HugeIcons.refresh), );
HugeIconSvg('moon-02', style: HugeIconStyle.duotone,
size: R.sp(22), color: CustomColors.black())
// the wrapper, in full:
SvgPicture.asset(
'assets/icons/hugeicons/duotone/moon-02.svg',
theme: SvgTheme(currentColor: color), // NOT colorFilter
);
SvgTheme(currentColor:), never
ColorFilter.mode(c, srcIn) — that repaints every path one
colour and flattens the second tone away. Hugeicons also ships
stroke="#141B34" rather than currentColor, so
run the SVGs through
svg_currentcolor.py once.
assets/icons/solar/bold/, then back on Flutter a click copies the
SvgPicture.asset(…) line for it.
Two things that will bite you.
Keep every IconData compile-time const —
IconData(lookupByName(x)) fails the release build outright.
And don't ship a name→icon Map of all 6,228: referencing
them all defeats --tree-shake-icons, which otherwise cuts the
3 MB font to about 1.4 KB.
Need a whole set? Switch to SVG file, click the icons you want, and drag the downloaded files onto the canvas together.
call-ringing-01.svg downloads — the
original file, untouched.
Assets.xcassets.
<svg>, with the
colour set to currentColor.
<button class="call"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none"> … </svg> Call </button>
.call { color: teal; }
.call svg { width: 20px; height: 20px; }
CallRinging01Icon.jsx, or .tsx from the TypeScript
choice. There is nothing to install.
<svg>:
import { CallRinging01Icon } from './icons/CallRinging01Icon';
<CallRinging01Icon width={20} height={20} className="text-teal-600" />
currentColor, so color — or a Tailwind
text-… class — paints it. It keeps no state, so in Next.js it
works in server and client components alike.
CallRinging01Icon.vue.
class, width and
the rest fall through to the <svg>:
<script setup> import CallRinging01Icon from './icons/CallRinging01Icon.vue' </script> <template> <CallRinging01Icon class="icon" width="20" height="20" /> </template>
components/ and skip the
import. Colour follows CSS color.
resources/views/components/icon/call-ringing-01.blade.php.
<svg>:
<x-icon.call-ringing-01 class="w-5 h-5 text-teal-600" />
<svg> into the template instead.
icons.js.
import { callRinging01Icon } from './icons.js';
button.innerHTML = callRinging01Icon + ' Call'; // in the browser
res.send(`<button>${callRinging01Icon} Call</button>`); // in Express
require? Change export const
to exports.callRinging01Icon =. Colour follows CSS
color.
npm install react-native-svg:
npx expo install react-native-svg
CallRinging01Icon.js.
import { CallRinging01Icon } from './icons/CallRinging01Icon';
<CallRinging01Icon size={22} color="teal" />
call-ringing-01 — for a search box, a layer name or a ticket.
Stroke is free, so it is here for everyone. Solid, Twotone, Duotone and Bulk are Pro and can't be given away, so the page reads those from your own Hugeicons download: drag the folder that holds the styles onto this page — the folder they all sit in, not one of the five — or pick it with the button, and every tab fills at once. With a key they come from your own private online library instead, and no folder is needed.
Nothing matches .
!
Marks a name that can't turn into a code name cleanly — it collides with another icon
and takes an Alt suffix, or starts with a digit and takes an
icon prefix, like 24-hours-clock. Both names show on every
tile, so trust the mono one.