feat(icons): extract shared workspace icon package
Create @workspace/icons as the single Hugeicons-backed Icon primitive and icon-data export surface, with size presets and inherited current color. Migrate blocks and the web app to the shared package, remove duplicated direct Hugeicons dependencies and the blocks-local Icon component, and update the lockfile.
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
# @workspace/icons
|
||||
|
||||
Workspace icon primitives backed by Hugeicons.
|
||||
|
||||
## Usage
|
||||
|
||||
```tsx
|
||||
import { Icon, Search01Icon } from "@workspace/icons"
|
||||
|
||||
export function SearchButton() {
|
||||
return <Icon data={Search01Icon} size="lg" />
|
||||
}
|
||||
```
|
||||
|
||||
`Icon` defaults to the `md` size and inherits the current text color. A
|
||||
Tailwind size class supplied through `className` overrides the size preset:
|
||||
|
||||
```tsx
|
||||
<Icon data={Search01Icon} className="size-8 text-primary" />
|
||||
```
|
||||
|
||||
Available presets are `xs`, `sm`, `md`, `lg`, and `xl`.
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"name": "@workspace/icons",
|
||||
"version": "0.0.0",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"sideEffects": false,
|
||||
"scripts": {
|
||||
"typecheck": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@hugeicons/core-free-icons": "^4.2.3",
|
||||
"@hugeicons/react": "^1.1.9",
|
||||
"react": "^19.2.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/react": "^19",
|
||||
"typescript": "~6"
|
||||
},
|
||||
"exports": {
|
||||
".": "./src/index.tsx"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
import { type HugeiconsIconProps, HugeiconsIcon } from "@hugeicons/react"
|
||||
|
||||
export * from "@hugeicons/core-free-icons"
|
||||
|
||||
export type IconData = HugeiconsIconProps["icon"]
|
||||
export type IconSize = keyof typeof sizeValues
|
||||
|
||||
export type IconProps = Omit<HugeiconsIconProps, "icon" | "size"> & {
|
||||
data: IconData
|
||||
size?: IconSize
|
||||
}
|
||||
|
||||
const sizeValues = {
|
||||
xs: 12,
|
||||
sm: 16,
|
||||
md: 20,
|
||||
lg: 24,
|
||||
xl: 28,
|
||||
}
|
||||
|
||||
export function Icon({ data, className, size = "md", ...props }: IconProps) {
|
||||
return (
|
||||
<HugeiconsIcon
|
||||
icon={data}
|
||||
size={sizeValues[size]}
|
||||
color="currentColor"
|
||||
aria-hidden="true"
|
||||
strokeWidth={1.75}
|
||||
className={className}
|
||||
{...props}
|
||||
/>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "ES2022",
|
||||
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
||||
"module": "ESNext",
|
||||
"moduleResolution": "bundler",
|
||||
"jsx": "react-jsx",
|
||||
"skipLibCheck": true,
|
||||
"strict": true,
|
||||
"noEmit": true,
|
||||
"paths": {
|
||||
"@workspace/icons": ["./src/index.tsx"]
|
||||
}
|
||||
},
|
||||
"include": ["src"],
|
||||
"exclude": ["node_modules", "dist"]
|
||||
}
|
||||
Reference in New Issue
Block a user