diff --git a/backend/.gitignore b/backend/.gitignore
new file mode 100644
index 0000000..a547bf3
--- /dev/null
+++ b/backend/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/backend/package.json b/backend/package.json
new file mode 100644
index 0000000..889633c
--- /dev/null
+++ b/backend/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "backend",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc -b && vite build",
+ "lint": "eslint .",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "react": "^19.1.1",
+ "react-dom": "^19.1.1"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.36.0",
+ "@types/node": "^24.6.0",
+ "@types/react": "^19.1.16",
+ "@types/react-dom": "^19.1.9",
+ "@vitejs/plugin-react": "^5.0.4",
+ "eslint": "^9.36.0",
+ "eslint-plugin-react-hooks": "^5.2.0",
+ "eslint-plugin-react-refresh": "^0.4.22",
+ "globals": "^16.4.0",
+ "typescript": "~5.9.3",
+ "typescript-eslint": "^8.45.0",
+ "vite": "npm:rolldown-vite@7.1.14"
+ },
+ "overrides": {
+ "vite": "npm:rolldown-vite@7.1.14"
+ }
+}
diff --git a/backend/server.ts b/backend/server.ts
new file mode 100644
index 0000000..593e406
--- /dev/null
+++ b/backend/server.ts
@@ -0,0 +1 @@
+// this is serer.js
\ No newline at end of file
diff --git a/backend/src/config/.gitkeep b/backend/src/config/.gitkeep
new file mode 100644
index 0000000..b5e94ec
--- /dev/null
+++ b/backend/src/config/.gitkeep
@@ -0,0 +1 @@
+#example file
\ No newline at end of file
diff --git a/backend/src/controllers/.gitkeep b/backend/src/controllers/.gitkeep
new file mode 100644
index 0000000..b5e94ec
--- /dev/null
+++ b/backend/src/controllers/.gitkeep
@@ -0,0 +1 @@
+#example file
\ No newline at end of file
diff --git a/backend/src/middleware/.gitkeep b/backend/src/middleware/.gitkeep
new file mode 100644
index 0000000..b5e94ec
--- /dev/null
+++ b/backend/src/middleware/.gitkeep
@@ -0,0 +1 @@
+#example file
\ No newline at end of file
diff --git a/backend/src/models/.gitkeep b/backend/src/models/.gitkeep
new file mode 100644
index 0000000..b5e94ec
--- /dev/null
+++ b/backend/src/models/.gitkeep
@@ -0,0 +1 @@
+#example file
\ No newline at end of file
diff --git a/backend/src/routes/.gitkeep b/backend/src/routes/.gitkeep
new file mode 100644
index 0000000..b5e94ec
--- /dev/null
+++ b/backend/src/routes/.gitkeep
@@ -0,0 +1 @@
+#example file
\ No newline at end of file
diff --git a/backend/src/utils/.gitkeep b/backend/src/utils/.gitkeep
new file mode 100644
index 0000000..b5e94ec
--- /dev/null
+++ b/backend/src/utils/.gitkeep
@@ -0,0 +1 @@
+#example file
\ No newline at end of file
diff --git a/backend/tsconfig.json b/backend/tsconfig.json
new file mode 100644
index 0000000..1ffef60
--- /dev/null
+++ b/backend/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "files": [],
+ "references": [
+ { "path": "./tsconfig.app.json" },
+ { "path": "./tsconfig.node.json" }
+ ]
+}
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 0000000..ea822fb
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,258 @@
+# UniLoot 🎓🛒
+*Your Campus Marketplace. Sell your legacy, find your loot.*
+
+
+
+
+
+
+
+
+
+
+
+---
+
+## Table of Contents
+
+- [Overview](#overview)
+- [Core Features](#core-features)
+- [User Roles & Journeys](#user-roles--journeys)
+- [Platform Enhancements](#platform-enhancements)
+- [Tech Stack](#tech-stack)
+- [Folder Structure](#folder-structure)
+- [Getting Started](#getting-started)
+- [Contributing](#contributing)
+- [Project Roadmap](#project-roadmap)
+- [Contact & Acknowledgments](#contact--acknowledgments)
+
+---
+
+## Overview
+
+**UniLoot** is a hyper-local, college-exclusive e-commerce platform built for seamless, secure, and affordable student-to-student selling. Graduating seniors can list used items (books, electronics, furniture, etc.), and juniors can find campus essentials either at a fixed price or by placing bids in auctions. The platform fosters trust via college email verification and reputation/rating mechanisms.
+
+---
+
+## Core Features
+
+- **Dual Product Listings**
+ - *Fixed Price ("Buy Now")*: Set by seller; juniors can purchase instantly.
+ - *Auction (Negotiable)*: 48-hour bidding, minimum increment ₹100, seller can accept highest bid early.
+- **User Authentication**
+ - Register/login with secure password protocol.
+ - Mandatory college email verification for access.
+- **Seller Dashboard**
+ - Create, edit, manage listings, track bids, finalize sales.
+- **Buyer Experience**
+ - Browse, filter, search; add fixed-price items to cart or bid in auctions.
+ - View and manage cart, bidding history.
+- **Integrated Payments**
+ - Secure payment flow using Razorpay/Stripe, with platform commission if applicable.
+- **Shopping Cart**
+ - Multi-item management and purchase.
+
+---
+
+## User Roles & Journeys
+
+### 🎓 Senior (Seller)
+- Onboards with college email.
+- Lists products for sale, chooses fixed or auction format.
+- Tracks and manages active listings and bids.
+- Can accept a bid or let the auction finish.
+- Receives funds when sale is confirmed.
+
+### 🧑🎓 Junior (Buyer)
+- Registers with college email.
+- Searches, browses, and filters all listings.
+- Adds fixed-price items to cart and makes instant purchases.
+- Places bids on auction items, receives live outbid notifications.
+- Pays for items and arranges pickup with seller.
+
+---
+
+## Platform Enhancements
+
+- **User Profiles:** Rate and review system builds trust for future transactions.
+- **Direct Messaging:** Secure in-app chat for questions, logistics, and negotiation.
+- **Advanced Categories & Search:** Find items by type, price, or sale type.
+- **Escrow System:** Funds released only after buyers confirm item receipt.
+- **Notification System:** Real-time email/app alerts for outbidding, sales, auction results, and more.
+- **Wishlist:** Buyers can save and revisit interesting listings.
+- **Admin Dashboard:** Site management, dispute resolution, and analytics.
+
+---
+
+## Tech Stack
+
+| Layer | Technology Suggestion |
+| ---------- | ------------------------------------------------ |
+| Frontend | React.js (w/ Next.js SSR), or Vue.js |
+| Backend | Node.js (Express.js), or Python (Django) |
+| Database | PostgreSQL (preferred) or MongoDB |
+| Real-time | Socket.IO or WebSockets (for bids & chat) |
+| Payments | Razorpay or Stripe (API-integrated) |
+| Email | Nodemailer, SendGrid, or similar |
+| Deployment | Docker, Vercel/Netlify for frontend, VPS/cloud |
+
+---
+
+## Folder Structure
+
+```
+UniLoot/
+├── .github/ # GitHub specific configurations
+│ ├── workflows/ # CI/CD workflows
+│ ├── ISSUE_TEMPLATE/ # Issue templates
+│ └── Contributor_Guide/ # Contribution guidelines
+├── frontend/ # Frontend application (to be created)
+├── backend/ # Backend application (to be created)
+├── docs/ # Documentation (to be created)
+├── CODE_OF_CONDUCT.md # Code of conduct
+├── README.md # This file
+└── package.json # Node.js dependencies
+```
+
+---
+
+## Getting Started
+
+### Prerequisites
+
+- Node.js (v20 or higher)
+- npm or yarn
+- Git
+
+### Installation
+
+1. **Clone the repository**
+ ```bash
+ git clone https://github.com/OPCODE-Open-Spring-Fest/UniLoot.git
+ cd UniLoot
+ ```
+
+2. **Install dependencies**
+ ```bash
+ npm install
+ ```
+
+3. **Set up commit hooks**
+ ```bash
+ npm run prepare
+ ```
+
+### Development
+
+This project uses conventional commits. Make sure your commit messages follow the [Conventional Commits](https://www.conventionalcommits.org/) specification.
+
+```bash
+# Example commit messages
+git commit -m "feat: add user authentication"
+git commit -m "fix: resolve payment gateway issue"
+git commit -m "docs: update README with setup instructions"
+```
+
+### CI/CD Workflows
+
+This project has automated CI/CD workflows that run on every push and pull request:
+
+#### 🔍 Commitlint (CI Workflow)
+- **Validates** all commit messages follow the [Conventional Commits](https://www.conventionalcommits.org/) format
+- **Runs on**: Every push and pull request
+- **Required format**: `type(scope): description`
+- **Common types**: `feat`, `fix`, `docs`, `style`, `refactor`, `test`, `chore`
+
+#### 🏷️ Label Checker
+- **Validates** that pull requests have required labels before merging
+- **Required labels** (one from each group):
+ - **Type**: `Type:Easy`, `Type:Medium`, or `Type:Hard`
+ - **Semver**: `Semver:major`, `Semver:minor`, or `Semver:patch`
+ - **Status**: `PR:Accept`
+- **Runs on**: Pull request opened, edited, synchronized, reopened, labeled, or unlabeled events
+
+All CI checks must pass before a pull request can be merged.
+
+---
+
+## Contributing
+
+We welcome contributions from the community! 🎉
+
+Please read our [Contributing Guide](.github/Contributor_Guide/Contributing.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes.
+
+### Quick Contribution Steps
+
+1. Fork the repository
+2. Create your feature branch (`git checkout -b feature/AmazingFeature`)
+3. Commit your changes following [conventional commits](.github/Contributor_Guide/commiting.md)
+4. Push to the branch (`git push origin feature/AmazingFeature`)
+5. Open a Pull Request
+
+Make sure to:
+- Follow the [Code of Conduct](CODE_OF_CONDUCT.md)
+- Write clear commit messages following the conventional commits format
+- Add appropriate labels to your PR (Type, Semver, and PR:Accept)
+- Ensure all CI checks pass
+- Update documentation as needed
+
+---
+
+## Project Roadmap
+
+### Phase 1: Foundation (Current)
+- [x] Repository setup
+- [x] CI/CD pipeline configuration
+- [ ] Database schema design
+- [ ] API architecture planning
+
+### Phase 2: Core Development
+- [ ] User authentication system
+- [ ] Product listing functionality
+- [ ] Bidding system implementation
+- [ ] Payment gateway integration
+
+### Phase 3: Enhancements
+- [ ] Real-time notifications
+- [ ] In-app messaging
+- [ ] User rating and review system
+- [ ] Admin dashboard
+
+### Phase 4: Launch
+- [ ] Beta testing
+- [ ] Bug fixes and optimization
+- [ ] Documentation completion
+- [ ] Production deployment
+
+---
+
+## Contact & Acknowledgments
+
+### Maintainers
+
+This project is maintained by the OPCODE community at IIIT Bhagalpur.
+
+### Acknowledgments
+
+- Thanks to all contributors who help make UniLoot better!
+- Built as part of the Open Spring Fest initiative
+- Special thanks to the open-source community
+
+### Support
+
+- 📧 Email: opcode@iiitbh.ac.in
+- 🌐 Website: [OPCODE IIIT Bhagalpur](https://opcode.gymkhana.iiitbh.ac.in)
+- 💬 Join our community discussions
+
+---
+
+
+
+**Made with ❤️ by the OPCODE Community**
+
+[](https://github.com/OPCODE-Open-Spring-Fest/UniLoot/stargazers)
+[](https://github.com/OPCODE-Open-Spring-Fest/UniLoot/network/members)
+[](https://github.com/OPCODE-Open-Spring-Fest/UniLoot/issues)
+[](https://github.com/OPCODE-Open-Spring-Fest/UniLoot/pulls)
+
+
diff --git a/frontend/.gitignore b/frontend/.gitignore
new file mode 100644
index 0000000..a547bf3
--- /dev/null
+++ b/frontend/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/frontend/components.json b/frontend/components.json
new file mode 100644
index 0000000..e69de29
diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js
new file mode 100644
index 0000000..b19330b
--- /dev/null
+++ b/frontend/eslint.config.js
@@ -0,0 +1,23 @@
+import js from '@eslint/js'
+import globals from 'globals'
+import reactHooks from 'eslint-plugin-react-hooks'
+import reactRefresh from 'eslint-plugin-react-refresh'
+import tseslint from 'typescript-eslint'
+import { defineConfig, globalIgnores } from 'eslint/config'
+
+export default defineConfig([
+ globalIgnores(['dist']),
+ {
+ files: ['**/*.{ts,tsx}'],
+ extends: [
+ js.configs.recommended,
+ tseslint.configs.recommended,
+ reactHooks.configs['recommended-latest'],
+ reactRefresh.configs.vite,
+ ],
+ languageOptions: {
+ ecmaVersion: 2020,
+ globals: globals.browser,
+ },
+ },
+])
diff --git a/frontend/index.html b/frontend/index.html
new file mode 100644
index 0000000..072a57e
--- /dev/null
+++ b/frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ frontend
+
+
+
+
+
+
diff --git a/frontend/package.json b/frontend/package.json
new file mode 100644
index 0000000..eecfe08
--- /dev/null
+++ b/frontend/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "frontend",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc -b && vite build",
+ "lint": "eslint .",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "react": "^19.1.1",
+ "react-dom": "^19.1.1"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.36.0",
+ "@types/node": "^24.6.0",
+ "@types/react": "^19.1.16",
+ "@types/react-dom": "^19.1.9",
+ "@vitejs/plugin-react": "^5.0.4",
+ "eslint": "^9.36.0",
+ "eslint-plugin-react-hooks": "^5.2.0",
+ "eslint-plugin-react-refresh": "^0.4.22",
+ "globals": "^16.4.0",
+ "typescript": "~5.9.3",
+ "typescript-eslint": "^8.45.0",
+ "vite": "npm:rolldown-vite@7.1.14"
+ },
+ "overrides": {
+ "vite": "npm:rolldown-vite@7.1.14"
+ }
+}
diff --git a/frontend/postcss.config.js b/frontend/postcss.config.js
new file mode 100644
index 0000000..e69de29
diff --git a/frontend/public/vite.svg b/frontend/public/vite.svg
new file mode 100644
index 0000000..e7b8dfb
--- /dev/null
+++ b/frontend/public/vite.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/frontend/src/App.css b/frontend/src/App.css
new file mode 100644
index 0000000..b9d355d
--- /dev/null
+++ b/frontend/src/App.css
@@ -0,0 +1,42 @@
+#root {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+}
+
+.logo {
+ height: 6em;
+ padding: 1.5em;
+ will-change: filter;
+ transition: filter 300ms;
+}
+.logo:hover {
+ filter: drop-shadow(0 0 2em #646cffaa);
+}
+.logo.react:hover {
+ filter: drop-shadow(0 0 2em #61dafbaa);
+}
+
+@keyframes logo-spin {
+ from {
+ transform: rotate(0deg);
+ }
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+@media (prefers-reduced-motion: no-preference) {
+ a:nth-of-type(2) .logo {
+ animation: logo-spin infinite 20s linear;
+ }
+}
+
+.card {
+ padding: 2em;
+}
+
+.read-the-docs {
+ color: #888;
+}
diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx
new file mode 100644
index 0000000..3d7ded3
--- /dev/null
+++ b/frontend/src/App.tsx
@@ -0,0 +1,35 @@
+import { useState } from 'react'
+import reactLogo from './assets/react.svg'
+import viteLogo from '/vite.svg'
+import './App.css'
+
+function App() {
+ const [count, setCount] = useState(0)
+
+ return (
+ <>
+
+ Vite + React
+
+
+
+ Edit src/App.tsx and save to test HMR
+
+
+
+ Click on the Vite and React logos to learn more
+
+ >
+ )
+}
+
+export default App
diff --git a/frontend/src/assets/react.svg b/frontend/src/assets/react.svg
new file mode 100644
index 0000000..6c87de9
--- /dev/null
+++ b/frontend/src/assets/react.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/frontend/src/components/.gitkeep b/frontend/src/components/.gitkeep
new file mode 100644
index 0000000..b5e94ec
--- /dev/null
+++ b/frontend/src/components/.gitkeep
@@ -0,0 +1 @@
+#example file
\ No newline at end of file
diff --git a/frontend/src/hooks/.gitkeep b/frontend/src/hooks/.gitkeep
new file mode 100644
index 0000000..b5e94ec
--- /dev/null
+++ b/frontend/src/hooks/.gitkeep
@@ -0,0 +1 @@
+#example file
\ No newline at end of file
diff --git a/frontend/src/index.css b/frontend/src/index.css
new file mode 100644
index 0000000..08a3ac9
--- /dev/null
+++ b/frontend/src/index.css
@@ -0,0 +1,68 @@
+:root {
+ font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
+ line-height: 1.5;
+ font-weight: 400;
+
+ color-scheme: light dark;
+ color: rgba(255, 255, 255, 0.87);
+ background-color: #242424;
+
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+a {
+ font-weight: 500;
+ color: #646cff;
+ text-decoration: inherit;
+}
+a:hover {
+ color: #535bf2;
+}
+
+body {
+ margin: 0;
+ display: flex;
+ place-items: center;
+ min-width: 320px;
+ min-height: 100vh;
+}
+
+h1 {
+ font-size: 3.2em;
+ line-height: 1.1;
+}
+
+button {
+ border-radius: 8px;
+ border: 1px solid transparent;
+ padding: 0.6em 1.2em;
+ font-size: 1em;
+ font-weight: 500;
+ font-family: inherit;
+ background-color: #1a1a1a;
+ cursor: pointer;
+ transition: border-color 0.25s;
+}
+button:hover {
+ border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+ outline: 4px auto -webkit-focus-ring-color;
+}
+
+@media (prefers-color-scheme: light) {
+ :root {
+ color: #213547;
+ background-color: #ffffff;
+ }
+ a:hover {
+ color: #747bff;
+ }
+ button {
+ background-color: #f9f9f9;
+ }
+}
diff --git a/frontend/src/lib/.gitkeep b/frontend/src/lib/.gitkeep
new file mode 100644
index 0000000..b5e94ec
--- /dev/null
+++ b/frontend/src/lib/.gitkeep
@@ -0,0 +1 @@
+#example file
\ No newline at end of file
diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx
new file mode 100644
index 0000000..bef5202
--- /dev/null
+++ b/frontend/src/main.tsx
@@ -0,0 +1,10 @@
+import { StrictMode } from 'react'
+import { createRoot } from 'react-dom/client'
+import './index.css'
+import App from './App.tsx'
+
+createRoot(document.getElementById('root')!).render(
+
+
+ ,
+)
diff --git a/frontend/src/pages/.gitkeep b/frontend/src/pages/.gitkeep
new file mode 100644
index 0000000..b5e94ec
--- /dev/null
+++ b/frontend/src/pages/.gitkeep
@@ -0,0 +1 @@
+#example file
\ No newline at end of file
diff --git a/frontend/tailwind.config.ts b/frontend/tailwind.config.ts
new file mode 100644
index 0000000..e69de29
diff --git a/frontend/tsconfig.app.json b/frontend/tsconfig.app.json
new file mode 100644
index 0000000..a9b5a59
--- /dev/null
+++ b/frontend/tsconfig.app.json
@@ -0,0 +1,28 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
+ "target": "ES2022",
+ "useDefineForClassFields": true,
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "types": ["vite/client"],
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "verbatimModuleSyntax": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+ "jsx": "react-jsx",
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "erasableSyntaxOnly": true,
+ "noFallthroughCasesInSwitch": true,
+ "noUncheckedSideEffectImports": true
+ },
+ "include": ["src"]
+}
diff --git a/package-lock.json b/package-lock.json
index 300a1b2..01f29c5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,5 +1,5 @@
{
- "name": "template",
+ "name": "UniLoot",
"lockfileVersion": 3,
"requires": true,
"packages": {
@@ -7,7 +7,10 @@
"devDependencies": {
"@commitlint/cli": "^19.1.0",
"@commitlint/config-conventional": "^19.1.0",
- "husky": "^9.0.11"
+ "autoprefixer": "^10.4.21",
+ "husky": "^9.0.11",
+ "postcss": "^8.5.6",
+ "tailwindcss": "^4.1.14"
}
},
"node_modules/@babel/code-frame": {
@@ -438,6 +441,88 @@
"integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==",
"dev": true
},
+ "node_modules/autoprefixer": {
+ "version": "10.4.21",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
+ "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.24.4",
+ "caniuse-lite": "^1.0.30001702",
+ "fraction.js": "^4.3.7",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.1.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.8.16",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.16.tgz",
+ "integrity": "sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.js"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.26.3",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz",
+ "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "baseline-browser-mapping": "^2.8.9",
+ "caniuse-lite": "^1.0.30001746",
+ "electron-to-chromium": "^1.5.227",
+ "node-releases": "^2.0.21",
+ "update-browserslist-db": "^1.1.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
"node_modules/callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -447,6 +532,27 @@
"node": ">=6"
}
},
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001750",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001750.tgz",
+ "integrity": "sha512-cuom0g5sdX6rw00qOoLNSFCJ9/mYIsuSOA+yzpDw8eopiFqcVwQvZHqov0vmEighRxX++cfC0Vg1G+1Iy/mSpQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
"node_modules/chalk": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
@@ -624,6 +730,13 @@
"node": ">=8"
}
},
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.235",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.235.tgz",
+ "integrity": "sha512-i/7ntLFwOdoHY7sgjlTIDo4Sl8EdoTjWIaKinYOVfC6bOp71bmwenyZthWHcasxgHDNWbWxvG9M3Ia116zIaYQ==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -640,10 +753,11 @@
}
},
"node_modules/escalade": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
- "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=6"
}
@@ -703,6 +817,20 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/fraction.js": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
"node_modules/get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
@@ -1077,6 +1205,42 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.23",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz",
+ "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/npm-run-path": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
@@ -1206,6 +1370,49 @@
"node": ">=8"
}
},
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/postcss": {
+ "version": "8.5.6",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -1290,6 +1497,16 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/split2": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
@@ -1349,6 +1566,13 @@
"node": ">=4"
}
},
+ "node_modules/tailwindcss": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.14.tgz",
+ "integrity": "sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/text-extensions": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz",
@@ -1399,6 +1623,37 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
"node_modules/uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
diff --git a/package.json b/package.json
index 929c798..53ab1e1 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,10 @@
"devDependencies": {
"@commitlint/cli": "^19.1.0",
"@commitlint/config-conventional": "^19.1.0",
- "husky": "^9.0.11"
+ "autoprefixer": "^10.4.21",
+ "husky": "^9.0.11",
+ "postcss": "^8.5.6",
+ "tailwindcss": "^4.1.14"
},
"scripts": {
"prepare": "husky",