27 | },
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/app/globals.css:
--------------------------------------------------------------------------------
1 | @import 'tailwindcss';
2 | @plugin '@tailwindcss/typography';
3 | @custom-variant dark (&:is(.dark *));
4 |
5 | /*
6 | The default border color has changed to `currentColor` in Tailwind CSS v4,
7 | so we've added these compatibility styles to make sure everything still
8 | looks the same as it did with Tailwind CSS v3.
9 |
10 | If we ever want to remove these styles, we need to add an explicit border
11 | color utility to any element that depends on these defaults.
12 | */
13 | @layer base {
14 | *,
15 | ::after,
16 | ::before,
17 | ::backdrop,
18 | ::file-selector-button {
19 | border-color: var(--color-gray-200, currentColor);
20 | }
21 | }
22 |
23 | :root {
24 | --sh-class: #7aa2f7;
25 | --sh-sign: #89ddff;
26 | --sh-string: #9ece6a;
27 | --sh-keyword: #bb9af7;
28 | --sh-comment: #565f89;
29 | --sh-jsxliterals: #7aa2f7;
30 | --sh-property: #73daca;
31 | --sh-entity: #e0af68;
32 | }
33 |
--------------------------------------------------------------------------------
/components/ui/scroll-progress.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import { motion, SpringOptions, useScroll, useSpring } from 'motion/react'
4 | import { cn } from '@/lib/utils'
5 | import { RefObject } from 'react'
6 |
7 | export type ScrollProgressProps = {
8 | className?: string
9 | springOptions?: SpringOptions
10 | containerRef?: RefObject
2 |
3 | Nim is a free and open-source personal website template built with Next.js 15, React 19, Tailwind CSS v4, and Motion. Designed for developers, designers, and founders, it combines minimalism with delightful animated components powered by [Motion-Primitives](https://motion-primitives.com).
4 |
5 | Live demo: [https://nim-fawn.vercel.app](https://nim-fawn.vercel.app)
6 |
7 | ## Features
8 |
9 | - Minimal one-page portfolio layout.
10 | - Blog support with MDX.
11 | - Responsive and accessible design.
12 | - Easy to use
13 | - [Motion-Primitives](https://motion-primitives.com) for animated components.
14 |
15 | ## Getting Started
16 |
17 | For detailed setup instructions, refer to the [Installation Guide](./INSTALLATION.md).
18 |
19 | ```bash
20 | git clone https://github.com/ibelick/nim.git
21 | cd nim
22 | npm install
23 | npm run dev
24 | ```
25 |
26 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
27 |
28 | ## Contributing
29 |
30 | Contributions are welcome! Feel free to open issues or submit pull requests to improve Nim.
31 |
32 | ## Deployment
33 |
34 | You can deploy your site to any hosting platform that supports Next.js. For the easiest deployment experience, consider using Vercel:
35 |
36 | [](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fibelick%2Fnim&env=NEXT_PUBLIC_SITE_URL&project-name=nim&repository-name=nim&redirect-url=https%3A%2F%2Ftwitter.com%2Fibelick&demo-title=Nim&demo-description=Nim%20is%20a%20free%20and%20open-source%20minimal%20personal%20website%20template%20built%20with%20Next.js%2015%2C%20React%2019%2C%20and%20Motion-Primitives.&demo-url=https%3A%2F%2Fnim.vercel.app&demo-image=https%3A%2F%2Fraw.githubusercontent.com%2Fibelick%2Fnim%2Frefs%2Fheads%2Fmain%2F.github%2Fassets%2Freadme.png&teamSlug=ibelick)
37 |
38 | ## About
39 |
40 | Nim is designed to make personal branding effortless and beautiful. If you enjoy it, consider sharing it and exploring [Motion-Primitives Pro](https://pro.motion-primitives.com/).
41 |
--------------------------------------------------------------------------------
/components/ui/text-morph.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 | import { cn } from '@/lib/utils'
3 | import { AnimatePresence, motion, Transition, Variants } from 'motion/react'
4 | import { useMemo, useId } from 'react'
5 |
6 | export type TextMorphProps = {
7 | children: string
8 | as?: React.ElementType
9 | className?: string
10 | style?: React.CSSProperties
11 | variants?: Variants
12 | transition?: Transition
13 | }
14 |
15 | export function TextMorph({
16 | children,
17 | as: Component = 'p',
18 | className,
19 | style,
20 | variants,
21 | transition,
22 | }: TextMorphProps) {
23 | const uniqueId = useId()
24 |
25 | const characters = useMemo(() => {
26 | const charCounts: Record140 | Focused on creating intuitive and performant web experiences. 141 | Bridging the gap between design and development. 142 |
143 |167 | {project.description} 168 |
169 |200 | {job.company} 201 |
202 |204 | {job.start} - {job.end} 205 |
206 |240 | {post.description} 241 |
242 |255 | Feel free to contact me at{' '} 256 | 257 | {EMAIL} 258 | 259 |
260 |