├── .npmrc ├── server └── tsconfig.json ├── app ├── app.vue ├── assets │ └── css │ │ └── main.css ├── app.config.ts └── components │ ├── ThemeToggle.vue │ ├── AnimatedIconButton.vue │ ├── Lucide │ ├── RotateCCW.vue │ ├── RotateCW.vue │ ├── Moon.vue │ ├── MoonAlt.vue │ ├── Bell.vue │ ├── ArrowBigDown.vue │ ├── ArrowBigRight.vue │ ├── ArrowBigUp.vue │ ├── ArrowBigLeft.vue │ ├── RefreshCW.vue │ ├── CircleHelp.vue │ ├── ChartSpline.vue │ ├── RefreshCCWDot.vue │ ├── SmartphoneCharging.vue │ ├── KeyCircle.vue │ ├── Vibrate.vue │ ├── Logout.vue │ ├── Cart.vue │ ├── WavesLadder.vue │ ├── CircleCheck.vue │ ├── KeySquare.vue │ ├── RefreshCWOff.vue │ ├── ArrowBigDownDash.vue │ ├── ArrowBigRightDash.vue │ ├── ArrowBigUpDash.vue │ ├── Facebook.vue │ ├── ArrowBigLeftDash.vue │ ├── Home.vue │ ├── Sun.vue │ ├── SunDim.vue │ ├── Key.vue │ ├── Waves.vue │ ├── SunMedium.vue │ ├── Twitter.vue │ ├── ArrowUp.vue │ ├── ArrowDown.vue │ ├── Users.vue │ ├── Settings.vue │ ├── Search.vue │ ├── CloudRain.vue │ ├── CloudRainWind.vue │ ├── UserRound.vue │ ├── Redo.vue │ ├── FileStack.vue │ ├── Sunset.vue │ ├── Workflow.vue │ ├── CalendarDays.vue │ ├── AirVent.vue │ ├── Menu.vue │ ├── SunMoon.vue │ ├── BluetoothSearching.vue │ ├── AArrowUp.vue │ ├── AArrowDown.vue │ ├── SquareArrowDown.vue │ ├── SquareArrowRight.vue │ ├── SquareArrowLeft.vue │ ├── SquareArrowUp.vue │ ├── CloudSun.vue │ ├── Clock.vue │ ├── SquareStack.vue │ ├── SquareActivity.vue │ ├── UndoDot.vue │ ├── RedoDot.vue │ ├── Tornado.vue │ ├── Twitch.vue │ ├── Youtube.vue │ ├── Delete.vue │ ├── Earth.vue │ ├── History.vue │ ├── WindArrowDown.vue │ ├── Dribbble.vue │ ├── AudioLines.vue │ ├── Discord.vue │ ├── Linkedin.vue │ ├── Instagram.vue │ ├── Stethoscope.vue │ ├── Connect.vue │ └── AlarmClock.vue │ └── ThemePicker.vue ├── public └── favicon.ico ├── tsconfig.json ├── eslint.config.mjs ├── .gitignore ├── nuxt.config.ts ├── README.md ├── package.json └── .cursor └── rules └── create-new-vue-motion-icon.mdc /.npmrc: -------------------------------------------------------------------------------- 1 | shamefully-hoist=true 2 | strict-peer-dependencies=false 3 | -------------------------------------------------------------------------------- /server/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../.nuxt/tsconfig.server.json" 3 | } 4 | -------------------------------------------------------------------------------- /app/app.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fayazara/animated-lucide-vue/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // https://nuxt.com/docs/guide/concepts/typescript 3 | "extends": "./.nuxt/tsconfig.json" 4 | } 5 | -------------------------------------------------------------------------------- /app/assets/css/main.css: -------------------------------------------------------------------------------- 1 | @import "tailwindcss" theme(static); 2 | @import "@nuxt/ui"; 3 | 4 | @theme { 5 | --font-sans: 'Public Sans', sans-serif; 6 | } -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | import withNuxt from './.nuxt/eslint.config.mjs' 3 | 4 | export default withNuxt( 5 | // Your custom configs here 6 | ) 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Nuxt dev/build outputs 2 | .output 3 | .data 4 | .nuxt 5 | .nitro 6 | .cache 7 | dist 8 | 9 | # Node dependencies 10 | node_modules 11 | 12 | # Logs 13 | logs 14 | *.log 15 | 16 | # Misc 17 | .DS_Store 18 | .fleet 19 | .idea 20 | 21 | # Local env files 22 | .env 23 | .env.* 24 | !.env.example 25 | -------------------------------------------------------------------------------- /app/app.config.ts: -------------------------------------------------------------------------------- 1 | export default defineAppConfig({ 2 | // https://ui3.nuxt.dev/getting-started/theme#design-system 3 | ui: { 4 | colors: { 5 | primary: 'emerald', 6 | neutral: 'neutral', 7 | }, 8 | button: { 9 | defaultVariants: { 10 | // Set default button color to neutral 11 | // color: 'neutral' 12 | } 13 | } 14 | } 15 | }) 16 | -------------------------------------------------------------------------------- /nuxt.config.ts: -------------------------------------------------------------------------------- 1 | // https://nuxt.com/docs/api/configuration/nuxt-config 2 | export default defineNuxtConfig({ 3 | devtools: { enabled: true }, 4 | 5 | modules: [ 6 | '@nuxt/ui', 7 | '@nuxt/eslint', 8 | '@nuxt/content', 9 | '@nuxt/scripts', 10 | 'motion-v/nuxt' 11 | ], 12 | 13 | css: ['~/assets/css/main.css'], 14 | 15 | future: { 16 | compatibilityVersion: 4 17 | }, 18 | 19 | compatibilityDate: '2024-11-27' 20 | }) 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | --- 2 | Build and Ship Nuxt 3 fullstack starter apps with Auth, DB, Payments, Email & File storage, Teams - All written in Typescript 3 | 4 | Try [Supersaas today](https://supersaas.dev) 5 | --- 6 | 7 | 8 | [](https://supersaas.dev?ref=github-onelink) 9 | 10 | 11 | # Lucide Animated Icons for Vue 12 | 13 | Ported from - https://icons.pqoqubbw.dev 14 | 15 | Work in progress 16 | 17 | ## Usage 18 | Install Motion Vue 19 | 20 | ```sh 21 | #pnpm 22 | pnpm i motion-v 23 | 24 | # npm 25 | npm i motion-v 26 | ``` 27 | 28 | Copy the code from the icon component file from `/app/components/Lucide` 29 | 30 | ## Contributions 31 | 1. Animate these icons 32 | 2. Build the site - Needs copy code button, maybe a show code as well 33 | -------------------------------------------------------------------------------- /app/components/ThemeToggle.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 33 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nuxt-app", 3 | "private": true, 4 | "type": "module", 5 | "scripts": { 6 | "build": "nuxt build", 7 | "dev": "nuxt dev", 8 | "generate": "nuxt generate", 9 | "preview": "nuxt preview", 10 | "postinstall": "nuxt prepare", 11 | "lint": "eslint .", 12 | "lint:fix": "eslint --fix ." 13 | }, 14 | "dependencies": { 15 | "@iconify-json/lucide": "^1.2.32", 16 | "@iconify-json/simple-icons": "^1.2.29", 17 | "@nuxt/content": "3.4.0", 18 | "@nuxt/scripts": "0.11.2", 19 | "@nuxt/ui": "^3.0.0", 20 | "@unhead/vue": "^2.0.0-rc.8", 21 | "motion-v": "^0.13.1", 22 | "nuxt": "^3.16.1" 23 | }, 24 | "devDependencies": { 25 | "@nuxt/eslint": "^1.2.0", 26 | "eslint": "^9.22.0", 27 | "typescript": "^5.8.2" 28 | }, 29 | "packageManager": "pnpm@9.15.3+sha512.1f79bc245a66eb0b07c5d4d83131240774642caaa86ef7d0434ab47c0d16f66b04e21e0c086eb61e62c77efc4d7f7ec071afad3796af64892fae66509173893a" 30 | } 31 | -------------------------------------------------------------------------------- /app/components/AnimatedIconButton.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 44 | -------------------------------------------------------------------------------- /app/components/Lucide/RotateCCW.vue: -------------------------------------------------------------------------------- 1 | 57 | 58 | -------------------------------------------------------------------------------- /app/components/Lucide/RotateCW.vue: -------------------------------------------------------------------------------- 1 | 57 | 58 | -------------------------------------------------------------------------------- /app/components/Lucide/Moon.vue: -------------------------------------------------------------------------------- 1 | 65 | 66 | 92 | -------------------------------------------------------------------------------- /app/components/Lucide/MoonAlt.vue: -------------------------------------------------------------------------------- 1 | 64 | 65 | -------------------------------------------------------------------------------- /app/components/Lucide/Bell.vue: -------------------------------------------------------------------------------- 1 | 56 | 57 | 88 | -------------------------------------------------------------------------------- /app/components/Lucide/ArrowBigDown.vue: -------------------------------------------------------------------------------- 1 | 62 | 63 | -------------------------------------------------------------------------------- /app/components/Lucide/ArrowBigRight.vue: -------------------------------------------------------------------------------- 1 | 62 | 63 | -------------------------------------------------------------------------------- /app/components/Lucide/ArrowBigUp.vue: -------------------------------------------------------------------------------- 1 | 62 | 63 | -------------------------------------------------------------------------------- /app/components/Lucide/ArrowBigLeft.vue: -------------------------------------------------------------------------------- 1 | 62 | 63 | -------------------------------------------------------------------------------- /app/components/Lucide/RefreshCW.vue: -------------------------------------------------------------------------------- 1 | 57 | 58 | -------------------------------------------------------------------------------- /app/components/Lucide/CircleHelp.vue: -------------------------------------------------------------------------------- 1 | 56 | 57 | -------------------------------------------------------------------------------- /app/components/Lucide/ChartSpline.vue: -------------------------------------------------------------------------------- 1 | 67 | 68 | -------------------------------------------------------------------------------- /app/components/Lucide/RefreshCCWDot.vue: -------------------------------------------------------------------------------- 1 | 57 | 58 | -------------------------------------------------------------------------------- /app/components/Lucide/SmartphoneCharging.vue: -------------------------------------------------------------------------------- 1 | 65 | 66 | -------------------------------------------------------------------------------- /app/components/Lucide/KeyCircle.vue: -------------------------------------------------------------------------------- 1 | 63 | 64 | -------------------------------------------------------------------------------- /app/components/Lucide/Vibrate.vue: -------------------------------------------------------------------------------- 1 | 64 | 65 | -------------------------------------------------------------------------------- /app/components/Lucide/Logout.vue: -------------------------------------------------------------------------------- 1 | 62 | 63 | -------------------------------------------------------------------------------- /app/components/ThemePicker.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 102 | -------------------------------------------------------------------------------- /app/components/Lucide/Cart.vue: -------------------------------------------------------------------------------- 1 | 64 | 65 | -------------------------------------------------------------------------------- /app/components/Lucide/WavesLadder.vue: -------------------------------------------------------------------------------- 1 | 64 | 65 | -------------------------------------------------------------------------------- /app/components/Lucide/CircleCheck.vue: -------------------------------------------------------------------------------- 1 | 70 | 71 | 101 | -------------------------------------------------------------------------------- /app/components/Lucide/KeySquare.vue: -------------------------------------------------------------------------------- 1 | 63 | 64 | -------------------------------------------------------------------------------- /app/components/Lucide/RefreshCWOff.vue: -------------------------------------------------------------------------------- 1 | 60 | 61 | -------------------------------------------------------------------------------- /app/components/Lucide/ArrowBigDownDash.vue: -------------------------------------------------------------------------------- 1 | 71 | 72 | -------------------------------------------------------------------------------- /app/components/Lucide/ArrowBigRightDash.vue: -------------------------------------------------------------------------------- 1 | 71 | 72 | -------------------------------------------------------------------------------- /app/components/Lucide/ArrowBigUpDash.vue: -------------------------------------------------------------------------------- 1 | 71 | 72 | -------------------------------------------------------------------------------- /app/components/Lucide/Facebook.vue: -------------------------------------------------------------------------------- 1 | 73 | 74 | -------------------------------------------------------------------------------- /app/components/Lucide/ArrowBigLeftDash.vue: -------------------------------------------------------------------------------- 1 | 71 | 72 | -------------------------------------------------------------------------------- /app/components/Lucide/Home.vue: -------------------------------------------------------------------------------- 1 | 67 | 68 | 100 | -------------------------------------------------------------------------------- /app/components/Lucide/Sun.vue: -------------------------------------------------------------------------------- 1 | 70 | 71 | 103 | -------------------------------------------------------------------------------- /app/components/Lucide/SunDim.vue: -------------------------------------------------------------------------------- 1 | 70 | 71 | -------------------------------------------------------------------------------- /app/components/Lucide/Key.vue: -------------------------------------------------------------------------------- 1 | 71 | 72 | -------------------------------------------------------------------------------- /app/components/Lucide/Waves.vue: -------------------------------------------------------------------------------- 1 | 59 | 60 | 98 | -------------------------------------------------------------------------------- /app/components/Lucide/SunMedium.vue: -------------------------------------------------------------------------------- 1 | 70 | 71 | -------------------------------------------------------------------------------- /app/components/Lucide/Twitter.vue: -------------------------------------------------------------------------------- 1 | 73 | 74 | -------------------------------------------------------------------------------- /app/components/Lucide/ArrowUp.vue: -------------------------------------------------------------------------------- 1 | 72 | 73 | -------------------------------------------------------------------------------- /app/components/Lucide/ArrowDown.vue: -------------------------------------------------------------------------------- 1 | 72 | 73 | -------------------------------------------------------------------------------- /app/components/Lucide/Users.vue: -------------------------------------------------------------------------------- 1 | 71 | 72 | 107 | -------------------------------------------------------------------------------- /app/components/Lucide/Settings.vue: -------------------------------------------------------------------------------- 1 | 51 | 52 | 89 | -------------------------------------------------------------------------------- /app/components/Lucide/Search.vue: -------------------------------------------------------------------------------- 1 | 73 | 74 | -------------------------------------------------------------------------------- /app/components/Lucide/CloudRain.vue: -------------------------------------------------------------------------------- 1 | 73 | 74 | -------------------------------------------------------------------------------- /app/components/Lucide/CloudRainWind.vue: -------------------------------------------------------------------------------- 1 | 73 | 74 | -------------------------------------------------------------------------------- /app/components/Lucide/UserRound.vue: -------------------------------------------------------------------------------- 1 | 73 | 74 | 113 | -------------------------------------------------------------------------------- /app/components/Lucide/Redo.vue: -------------------------------------------------------------------------------- 1 | 72 | 73 | -------------------------------------------------------------------------------- /app/components/Lucide/FileStack.vue: -------------------------------------------------------------------------------- 1 | 51 | 52 | 100 | -------------------------------------------------------------------------------- /app/components/Lucide/Sunset.vue: -------------------------------------------------------------------------------- 1 | 76 | 77 | -------------------------------------------------------------------------------- /app/components/Lucide/Workflow.vue: -------------------------------------------------------------------------------- 1 | 67 | 68 | -------------------------------------------------------------------------------- /app/components/Lucide/CalendarDays.vue: -------------------------------------------------------------------------------- 1 | 77 | 78 | 118 | -------------------------------------------------------------------------------- /app/components/Lucide/AirVent.vue: -------------------------------------------------------------------------------- 1 | 74 | 75 | -------------------------------------------------------------------------------- /app/components/Lucide/Menu.vue: -------------------------------------------------------------------------------- 1 | 69 | 70 | 120 | -------------------------------------------------------------------------------- /app/components/Lucide/SunMoon.vue: -------------------------------------------------------------------------------- 1 | 83 | 84 | -------------------------------------------------------------------------------- /app/components/Lucide/BluetoothSearching.vue: -------------------------------------------------------------------------------- 1 | 73 | 74 | 121 | -------------------------------------------------------------------------------- /app/components/Lucide/AArrowUp.vue: -------------------------------------------------------------------------------- 1 | 69 | 70 | -------------------------------------------------------------------------------- /app/components/Lucide/AArrowDown.vue: -------------------------------------------------------------------------------- 1 | 72 | 73 | 118 | -------------------------------------------------------------------------------- /app/components/Lucide/SquareArrowDown.vue: -------------------------------------------------------------------------------- 1 | 73 | 74 | -------------------------------------------------------------------------------- /app/components/Lucide/SquareArrowRight.vue: -------------------------------------------------------------------------------- 1 | 73 | 74 | -------------------------------------------------------------------------------- /app/components/Lucide/SquareArrowLeft.vue: -------------------------------------------------------------------------------- 1 | 73 | 74 | -------------------------------------------------------------------------------- /app/components/Lucide/SquareArrowUp.vue: -------------------------------------------------------------------------------- 1 | 73 | 74 | -------------------------------------------------------------------------------- /app/components/Lucide/CloudSun.vue: -------------------------------------------------------------------------------- 1 | 82 | 83 | -------------------------------------------------------------------------------- /app/components/Lucide/Clock.vue: -------------------------------------------------------------------------------- 1 | 83 | 84 | 128 | -------------------------------------------------------------------------------- /app/components/Lucide/SquareStack.vue: -------------------------------------------------------------------------------- 1 | 69 | 70 | 120 | -------------------------------------------------------------------------------- /app/components/Lucide/SquareActivity.vue: -------------------------------------------------------------------------------- 1 | 87 | 88 | 127 | -------------------------------------------------------------------------------- /app/components/Lucide/UndoDot.vue: -------------------------------------------------------------------------------- 1 | 80 | 81 | -------------------------------------------------------------------------------- /app/components/Lucide/RedoDot.vue: -------------------------------------------------------------------------------- 1 | 80 | 81 | -------------------------------------------------------------------------------- /app/components/Lucide/Tornado.vue: -------------------------------------------------------------------------------- 1 | 75 | 76 | -------------------------------------------------------------------------------- /app/components/Lucide/Twitch.vue: -------------------------------------------------------------------------------- 1 | 95 | 96 | -------------------------------------------------------------------------------- /app/components/Lucide/Youtube.vue: -------------------------------------------------------------------------------- 1 | 95 | 96 | -------------------------------------------------------------------------------- /app/components/Lucide/Delete.vue: -------------------------------------------------------------------------------- 1 | 62 | 63 | 127 | -------------------------------------------------------------------------------- /app/components/Lucide/Earth.vue: -------------------------------------------------------------------------------- 1 | 75 | 76 | 125 | -------------------------------------------------------------------------------- /app/components/Lucide/History.vue: -------------------------------------------------------------------------------- 1 | 98 | 99 | -------------------------------------------------------------------------------- /app/components/Lucide/WindArrowDown.vue: -------------------------------------------------------------------------------- 1 | 94 | 95 | -------------------------------------------------------------------------------- /app/components/Lucide/Dribbble.vue: -------------------------------------------------------------------------------- 1 | 95 | 96 | -------------------------------------------------------------------------------- /app/components/Lucide/AudioLines.vue: -------------------------------------------------------------------------------- 1 | 97 | 98 | 143 | -------------------------------------------------------------------------------- /app/components/Lucide/Discord.vue: -------------------------------------------------------------------------------- 1 | 70 | 71 | -------------------------------------------------------------------------------- /app/components/Lucide/Linkedin.vue: -------------------------------------------------------------------------------- 1 | 117 | 118 | -------------------------------------------------------------------------------- /app/components/Lucide/Instagram.vue: -------------------------------------------------------------------------------- 1 | 117 | 118 | -------------------------------------------------------------------------------- /app/components/Lucide/Stethoscope.vue: -------------------------------------------------------------------------------- 1 | 79 | 80 | -------------------------------------------------------------------------------- /app/components/Lucide/Connect.vue: -------------------------------------------------------------------------------- 1 | 82 | 83 | 158 | -------------------------------------------------------------------------------- /.cursor/rules/create-new-vue-motion-icon.mdc: -------------------------------------------------------------------------------- 1 | --- 2 | description: 3 | globs: app/components/Lucide/*.vue 4 | alwaysApply: false 5 | --- 6 | # Converting React Lucide Icons to Vue: Guide 7 | 8 | Here's a step-by-step guide for converting React animated Lucide icons to Vue components in this project: 9 | 10 | ## 1. Basic Structure 11 | 12 | ```vue 13 | 65 | 66 | 80 | ``` 81 | 82 | ## 2. Animation Pattern Conversion 83 | 84 | When converting React motion animations to Vue: 85 | 86 | | React | Vue | 87 | |-------|-----| 88 | | `animate={controls}` | `:animate="currentState"` | 89 | | `variants={...}` | `:variants="iconVariants"` | 90 | | `` | `` with `` inside | 91 | | `transition={{ ... }}` | Include in each variant or as separate prop | 92 | 93 | ## 3. Converting Animation Arrays 94 | 95 | - Keep animation arrays in the same format: `[val1, val2, val3, ...]` 96 | - Include all keyframe points from React 97 | - Use `duration` and `bounce` parameters for spring animations 98 | - For complex keyframes, use `transition` inside the variant 99 | 100 | Example: 101 | ```typescript 102 | const searchVariants = { 103 | normal: { 104 | x: 0, 105 | y: 0, 106 | transition: { 107 | duration: 0.3, 108 | type: 'spring', 109 | stiffness: 400, 110 | damping: 25 111 | } 112 | }, 113 | animate: { 114 | x: [0, 0, -3, 0], // Same array as React 115 | y: [0, -4, 0, 0], // Same array as React 116 | transition: { 117 | duration: 1, 118 | bounce: 0.3 // Same as React 119 | } 120 | } 121 | }; 122 | ``` 123 | 124 | ## 4. SVG Path Conversion 125 | 126 | - Use `motion.path`, `motion.circle`, etc. for elements that need animation 127 | - Keep all SVG attributes the same (viewBox, fill, stroke, etc.) 128 | - Add `style="overflow: visible"` to the SVG element if needed 129 | 130 | ## 5. Adding to index.vue 131 | 132 | After creating a new icon component in `app/components/Lucide/`, add it to `app/pages/index.vue`: 133 | 134 | ```vue 135 | 136 | 143 | 144 | ``` 145 | 146 | ## Common Gotchas 147 | 148 | 1. Don't use arrays with spring animations for x/y - use only two keyframes or keyframes with tween animations 149 | 2. Remember all Vue components in the Lucide directory are auto-imported with the "Lucide" prefix 150 | 3. Ignore TypeScript errors about `motion-v` - they appear in all components 151 | 4. Keep animations simple - one normal state and one animate state 152 | 5. Don't add unnecessary timers or complex logic - just toggle the state -------------------------------------------------------------------------------- /app/components/Lucide/AlarmClock.vue: -------------------------------------------------------------------------------- 1 | 111 | 112 |
121 | 133 | 139 | 145 | 151 | 157 | 163 | 169 | 170 |
171 | 172 | --------------------------------------------------------------------------------