diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..97b0570 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,4 @@ +dist/ +dist-extension/ +package-lock.json +.pipeline/ diff --git a/.prettierrc.json b/.prettierrc.json index af88520..9ae7617 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -3,5 +3,8 @@ "singleQuote": true, "trailingComma": "es5", "printWidth": 100, - "tabWidth": 2 + "tabWidth": 2, + "bracketSpacing": true, + "plugins": ["prettier-plugin-tailwindcss"], + "tailwindStylesheet": "./src/style.css" } diff --git a/CLAUDE.md b/CLAUDE.md index 7cc0bcc..0ad7903 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -9,7 +9,8 @@ A cryptocurrency wallet for the Zenon Network, supporting both browser extension - **Styling**: Tailwind CSS 4 + shadcn-vue + Reka UI - **Language**: TypeScript (strict mode) - **Blockchain**: znn-typescript-sdk (Zenon Network) -- **Package Manager**: npm workspaces (monorepo) +- **Package Manager**: npm +- **UI Library**: `nom-ui` — external shadcn-vue component library (`github:digitalSloth/nom-ui`) ## Project Structure @@ -24,8 +25,6 @@ nom-webwallet/ │ ├── types/ # TypeScript type definitions │ ├── main.ts # App entry point │ └── background.ts # Extension service worker -├── packages/ -│ └── ui/ # Shared shadcn-vue component library ├── vite.config.web.ts # Web app build config ├── vite.config.extension.ts# Extension build config └── manifest.json # Chrome extension manifest (MV3) @@ -34,7 +33,7 @@ nom-webwallet/ ## Commands ```bash -npm install # Install all workspaces +npm install # Install dependencies npm run dev # Web dev server (localhost:5173) npm run dev:extension # Extension watch build npm run build # Web production build → dist/ diff --git a/README.md b/README.md index 92dbc80..35fa412 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Your keys stay on your device. Wallets are encrypted with a password you choose, ### Prerequisites - **Node.js** 20.19+ or 22.12+ (required by Vite 7) -- **npm** 7+ (required for workspaces) +- **npm** (used to install dependencies, including `nom-ui` from GitHub) ### Install @@ -64,17 +64,17 @@ Sending a transaction requires the active wallet to be unlocked — if it's lock ## Scripts -| Command | Description | -| --- | --- | -| `npm run dev` | Start the web app dev server (`localhost:5173`) | -| `npm run dev:extension` | Build the extension in watch mode | -| `npm run build` | Production build of the web app → `dist/` | +| Command | Description | +| ------------------------- | ----------------------------------------------------- | +| `npm run dev` | Start the web app dev server (`localhost:5173`) | +| `npm run dev:extension` | Build the extension in watch mode | +| `npm run build` | Production build of the web app → `dist/` | | `npm run build:extension` | Production build of the extension → `dist-extension/` | -| `npm run preview` | Preview the production web build | -| `npm run typecheck` | Type-check with `vue-tsc` | -| `npm run lint` | Run ESLint | -| `npm run lint:fix` | Run ESLint with autofix | -| `npm run format` | Format with Prettier | +| `npm run preview` | Preview the production web build | +| `npm run typecheck` | Type-check with `vue-tsc` | +| `npm run lint` | Run ESLint | +| `npm run lint:fix` | Run ESLint with autofix | +| `npm run format` | Format with Prettier | > There is no automated test suite. TypeScript strict mode, `typecheck`, and `lint` are the correctness checks. @@ -84,7 +84,7 @@ Sending a transaction requires the active wallet to be unlocked — if it's lock - **Tailwind CSS 4** with **shadcn-vue** / **Reka UI** components - **TypeScript** (strict mode) - **znn-typescript-sdk** for Zenon Network connectivity -- **npm workspaces** monorepo (`@nom/ui` shared component library) +- **nom-ui** — external shadcn-vue shared component library (`github:digitalSloth/nom-ui`) ## Project Layout @@ -96,7 +96,6 @@ nom-webwallet/ │ ├── pages/ # Routed views │ ├── App.vue / main.ts # App shell and entry point │ └── background.ts # Extension service worker -├── packages/ui/ # Shared shadcn-vue component library (@nom/ui) ├── vite.config.web.ts # Web build config ├── vite.config.extension.ts # Extension build config └── manifest.json # Chrome extension manifest (MV3) diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 6ed394b..1ca1cdd 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -9,20 +9,20 @@ NoM Wallet is a Vue 3 + TypeScript application that ships as two build targets f - a **standalone web app**, and - a **Chrome/Edge browser extension** (Manifest V3). -Both targets share the same application code under `src/` and the same shared component library under `packages/ui/` (`@nom/ui`). All blockchain and wallet logic lives in a platform-agnostic **service layer**; the differences between web and extension are confined to the storage backend and the build configuration. +Both targets share the same application code under `src/` and the same shared component library, `nom-ui` (an external package installed from GitHub). All blockchain and wallet logic lives in a platform-agnostic **service layer**; the differences between web and extension are confined to the storage backend and the build configuration. ## Build targets -The repository is an npm-workspaces monorepo (`workspaces: ["packages/*"]` in `package.json`). The only workspace package today is `packages/ui` (`@nom/ui`). +The shared shadcn-vue component library lives in a separate repository and is consumed as an external dependency: `"nom-ui": "github:digitalSloth/nom-ui"` in `package.json`. Components import it by its bare package name (`import { Button } from 'nom-ui'`). Two Vite configs drive the two targets: -| Target | Config | Output | Notes | -| --- | --- | --- | --- | -| Web | `vite.config.web.ts` | `dist/` | Vue + Tailwind + node polyfills; custom plugin copies the SDK's PoW assets (see below) | -| Extension | `vite.config.extension.ts` | `dist-extension/` | Uses `@crxjs/vite-plugin` with `manifest.json` | +| Target | Config | Output | Notes | +| --------- | -------------------------- | ----------------- | -------------------------------------------------------------------------------------- | +| Web | `vite.config.web.ts` | `dist/` | Vue + Tailwind + node polyfills; custom plugin copies the SDK's PoW assets (see below) | +| Extension | `vite.config.extension.ts` | `dist-extension/` | Uses `@crxjs/vite-plugin` with `manifest.json` | -The `@` alias maps to `src/`, and `@nom/ui` maps to `packages/ui/src` (defined in the web config's `resolve.alias`). +Both configs define a single `@` alias mapping to `src/` (`resolve.alias`). `nom-ui` is resolved from `node_modules` like any other dependency; the web config also lists it (alongside `znn-typescript-sdk`) in `optimizeDeps.exclude`. ### Proof-of-work assets @@ -32,7 +32,7 @@ The `@` alias maps to `src/`, and `@nom/ui` maps to `packages/ui/src` (defined i ``` Components / Pages (src/components, src/pages) - │ import only from @/core and @nom/ui + │ import only from @/core and nom-ui ▼ Composables (src/core/composables) ← reactive Vue wrappers │ call Service.getInstance() @@ -50,17 +50,17 @@ The boundary between layers is deliberate and enforced by the barrel file. `src/ Services hold all business logic and are the only code that talks to the SDK. Each service in `src/core/` follows the same shape: a `getInstance()` singleton accessor and an `ensureInitialized()` method that guarantees the underlying `ZenonService` connection is ready before use. -| Service | File | Responsibility (public surface) | -| --- | --- | --- | -| `WalletService` | `wallet-service.ts` | Create (`KeyStore.newRandom`) / import (`KeyStore.fromMnemonic`) wallets, encrypt & persist keystores, unlock/lock, derive accounts, rename, hide/show, delete, export mnemonic, sign data | -| `AccountService` | `account-service.ts` | `getAccountInfo`, `getPlasmaInfo`, `getPlasmaLevel`, `getUnreceivedBlocks`, `getDelegatedPillar` | -| `TransactionService` | `transaction-service.ts` | `sendTransaction`, `receiveTransaction`, `sendEmbeddedContractBlock` | -| `PlasmaService` | `plasma-service.ts` | `getFusionEntries`, `createFuseBlock`, `createCancelBlock` | -| `StakeService` | `stake-service.ts` | `getStakeEntries`, `createStakeBlock`, `createCancelStakeBlock` | -| `RewardsService` | `rewards-service.ts` | `getAllUncollectedRewards`, `getUncollectedReward`, `createCollectRewardBlock` (pillar, sentinel, stake, liquidity) | -| `PillarService` | `pillar-service.ts` | `getAllPillars` (paged), `createDelegateBlock`, `createUndelegateBlock`, `getTotalDelegatedZnn` | -| `TokenService` | `token-service.ts` | `getTokenByZts` | -| `ZenonService` | `zenon-service.ts` | Singleton SDK connection; network + PoW configuration | +| Service | File | Responsibility (public surface) | +| -------------------- | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `WalletService` | `wallet-service.ts` | Create (`KeyStore.newRandom`) / import (`KeyStore.fromMnemonic`) wallets, encrypt & persist keystores, unlock/lock, derive accounts, rename, hide/show, delete, export mnemonic, sign data | +| `AccountService` | `account-service.ts` | `getAccountInfo`, `getPlasmaInfo`, `getPlasmaLevel`, `getUnreceivedBlocks`, `getDelegatedPillar` | +| `TransactionService` | `transaction-service.ts` | `sendTransaction`, `receiveTransaction`, `sendEmbeddedContractBlock` | +| `PlasmaService` | `plasma-service.ts` | `getFusionEntries`, `createFuseBlock`, `createCancelBlock` | +| `StakeService` | `stake-service.ts` | `getStakeEntries`, `createStakeBlock`, `createCancelStakeBlock` | +| `RewardsService` | `rewards-service.ts` | `getAllUncollectedRewards`, `getUncollectedReward`, `createCollectRewardBlock` (pillar, sentinel, stake, liquidity) | +| `PillarService` | `pillar-service.ts` | `getAllPillars` (paged), `createDelegateBlock`, `createUndelegateBlock`, `getTotalDelegatedZnn` | +| `TokenService` | `token-service.ts` | `getTokenByZts` | +| `ZenonService` | `zenon-service.ts` | Singleton SDK connection; network + PoW configuration | ### Read vs. write: the block-template pattern @@ -73,10 +73,10 @@ Plain value transfers go through `TransactionService.sendTransaction`, and recei ## Proof-of-Work -Zenon requires Proof-of-Work to produce a block's nonce when the sending account lacks the plasma to cover it. The SDK computes this in the browser via a WebAssembly module; the asset-serving side (`pow.js` / `pow.wasm`, `setPowBasePath('/')`, the `copyPowFiles` plugin) is covered under [Build targets](#proof-of-work-assets) above. How the work is *scheduled* is decided in `ZenonService` (`src/core/zenon-service.ts`): +Zenon requires Proof-of-Work to produce a block's nonce when the sending account lacks the plasma to cover it. The SDK computes this in the browser via a WebAssembly module; the asset-serving side (`pow.js` / `pow.wasm`, `setPowBasePath('/')`, the `copyPowFiles` plugin) is covered under [Build targets](#proof-of-work-assets) above. How the work is _scheduled_ is decided in `ZenonService` (`src/core/zenon-service.ts`): - **Configuration is one-time and idempotent.** Static flags (`powConfigured`, `powWorkerEnabled`) guard setup so it runs once across the singleton's lifetime. -- **Web app → off-thread worker.** When *not* in an extension context and `isPowWorkerSupported()` is true, the service calls `Zenon.usePowWorker()` and registers it via `Zenon.setPowProvider(...)`. Running PoW off the main thread keeps the UI responsive and stops the long computation from starving the node WebSocket heartbeat (which previously dropped the connection mid-send). +- **Web app → off-thread worker.** When _not_ in an extension context and `isPowWorkerSupported()` is true, the service calls `Zenon.usePowWorker()` and registers it via `Zenon.setPowProvider(...)`. Running PoW off the main thread keeps the UI responsive and stops the long computation from starving the node WebSocket heartbeat (which previously dropped the connection mid-send). - **Extension → main-thread fallback.** `isExtensionContext()` (detected via `chrome.runtime?.id`) returns true inside the MV3 popup/worker, where the CSP `script-src 'self'` forbids the SDK's `blob:`-based worker. The service skips worker setup and lets the SDK use its synchronous main-thread WASM generator. - **Defensive fallback.** Worker creation is wrapped in try/catch; if it throws (e.g. a strict CSP elsewhere), the failure is logged and the SDK transparently falls back to main-thread PoW rather than breaking the send. @@ -86,7 +86,7 @@ Zenon requires Proof-of-Work to produce a block's nonce when the sending account `src/core/composables/` contains one composable per service plus a few helpers. The exported set (`src/core/composables/index.ts`): `useWallet`, `useAccount`, `useNetwork`, `useTransaction`, `usePlasma`, `useStake`, `useRewards`, `usePillar`, `useToken`, `useStorage`, and `runActivity` (from `useActivity`), along with the formatter utilities. -The composables use a **module-level singleton** pattern. Reactive state (`ref`/`computed`) is declared at module scope — *outside* the exported function — so every component that calls e.g. `useWallet()` shares the same state rather than getting its own copy. The function body wires up the methods and returns them. `useWallet` also caches a one-time `loadPromise` so the router guard and `App.vue` don't each trigger a separate initial load on startup. +The composables use a **module-level singleton** pattern. Reactive state (`ref`/`computed`) is declared at module scope — _outside_ the exported function — so every component that calls e.g. `useWallet()` shares the same state rather than getting its own copy. The function body wires up the methods and returns them. `useWallet` also caches a one-time `loadPromise` so the router guard and `App.vue` don't each trigger a separate initial load on startup. Inside the composable, the corresponding service is obtained via `Service.getInstance()` (e.g. `WalletService.getInstance()`). State changes are mediated through `window` `CustomEvent`s where cross-cutting notification is needed — for example, lock/unlock dispatches a `wallet-status-changed` event that `Home.vue` listens for to reload. @@ -127,14 +127,14 @@ Key material is handled by the SDK's `KeyStore` / `KeyFile` types: Routes are defined in `src/router.ts` using `createWebHistory`: -| Path | Page | Meta | -| --- | --- | --- | -| `/` | `Home.vue` | `requiresWallet` | -| `/setup` | `Setup.vue` | — | -| `/send` | `Send.vue` | `requiresWallet`, `requiresUnlock` | -| `/receive` | `Receive.vue` | `requiresWallet` | -| `/token/:tokenStandard` | `TokenDetails.vue` | `requiresWallet` | -| `/:pathMatch(.*)*` | → redirect `/` | — | +| Path | Page | Meta | +| ----------------------- | ------------------ | ---------------------------------- | +| `/` | `Home.vue` | `requiresWallet` | +| `/setup` | `Setup.vue` | — | +| `/send` | `Send.vue` | `requiresWallet`, `requiresUnlock` | +| `/receive` | `Receive.vue` | `requiresWallet` | +| `/token/:tokenStandard` | `TokenDetails.vue` | `requiresWallet` | +| `/:pathMatch(.*)*` | → redirect `/` | — | A global `beforeEach` guard enforces wallet state. It first calls `wallet.ensureLoaded()` (the guard can run before `App.vue`'s `onMounted` on a hard refresh), then: diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md index 059bab2..548e718 100644 --- a/docs/DEPLOYMENT.md +++ b/docs/DEPLOYMENT.md @@ -13,6 +13,7 @@ This guide explains how to deploy the web app to your server using GitHub Action Add these secrets to your GitHub repository (Settings → Secrets and variables → Actions): ### SSH Configuration + 1. **SSH_PRIVATE_KEY** - Your SSH private key for server access 2. **SSH_HOST** - Server hostname or IP address (e.g., `example.com` or `192.168.1.100`) 3. **SSH_USER** - SSH username (e.g., `deploy` or `root`) @@ -86,6 +87,7 @@ sudo certbot --nginx -d your-domain.com ## Deployment The workflow automatically deploys when: + - You push to the `main` branch - You manually trigger it via Actions tab @@ -102,20 +104,24 @@ Go to GitHub Actions → Deploy Web App → Run workflow ## Troubleshooting ### Build fails + - Check GitHub Actions logs - Ensure all dependencies are in package.json ### SSH connection fails + - Verify SSH secrets are correct - Test SSH connection manually: `ssh -i ~/.ssh/deploy_key user@host` - Check firewall allows SSH (port 22) ### nginx 502/404 errors + - Check files are in deployment directory: `ls -la /var/www/nom-wallet` - Check nginx error logs: `sudo tail -f /var/log/nginx/error.log` - Verify nginx config: `sudo nginx -t` ### CORS/COOP errors + - Ensure nginx config includes the COOP/COEP headers - Clear browser cache @@ -132,6 +138,7 @@ add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style ``` Key directives: + - `script-src 'self'` - Blocks inline scripts and third-party JS (prevents XSS) - `connect-src 'self' wss:` - Allows WebSocket connections only to same origin and WSS nodes - `img-src 'self' data: https:` - Allows inline data URIs and images served over HTTPS diff --git a/icons/icon-128.png b/icons/icon-128.png new file mode 100644 index 0000000..0736da0 Binary files /dev/null and b/icons/icon-128.png differ diff --git a/icons/icon-16.png b/icons/icon-16.png new file mode 100644 index 0000000..b6c0ed5 Binary files /dev/null and b/icons/icon-16.png differ diff --git a/icons/icon-48.png b/icons/icon-48.png new file mode 100644 index 0000000..b1eb051 Binary files /dev/null and b/icons/icon-48.png differ diff --git a/package-lock.json b/package-lock.json index 6c3fdc6..b7a03a5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,17 +7,14 @@ "": { "name": "nom-wallet", "version": "1.0.0", - "workspaces": [ - "packages/*" - ], "dependencies": { - "@nom/ui": "workspace:*", "@vueuse/core": "^14.2.0", "@zxcvbn-ts/core": "^3.0.4", "@zxcvbn-ts/language-common": "^3.0.4", "@zxcvbn-ts/language-en": "^3.0.2", "buffer": "^6.0.3", "lucide-vue-next": "^0.563.0", + "nom-ui": "github:digitalSloth/nom-ui", "vue": "^3.4.0", "vue-router": "^4.2.0", "znn-typescript-sdk": "^1.0.5" @@ -36,6 +33,7 @@ "eslint": "^9.39.2", "eslint-plugin-vue": "^10.7.0", "prettier": "^3.2.0", + "prettier-plugin-tailwindcss": "^0.8.0", "tailwindcss": "^4.0.0", "tailwindcss-animate": "^1.0.7", "typescript": "^5.3.0", @@ -91,19 +89,17 @@ } }, "node_modules/@crxjs/vite-plugin": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@crxjs/vite-plugin/-/vite-plugin-2.4.0.tgz", - "integrity": "sha512-bDLdq0W2V1SkMQDJjrcYyjK9/uKtdl4joT7GRImcootCjZdKRiRYt+cv9z8tJoU/tK3o1lX48LTqN7JMsk5AQg==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@crxjs/vite-plugin/-/vite-plugin-2.6.1.tgz", + "integrity": "sha512-0RmYlUtQGvHXCz3B/FW7P5j+RBZUc4mk3GIRPXCx5a52N8AQ0e35GvE+Pcap/TKuI09PJgcRTdXeBOavtLVyYg==", "dev": true, "license": "MIT", "dependencies": { - "@rollup/pluginutils": "^4.1.2", "@webcomponents/custom-elements": "^1.5.0", "acorn-walk": "^8.2.0", "convert-source-map": "^1.7.0", "debug": "^4.3.3", "es-module-lexer": "^0.10.0", - "fast-glob": "^3.2.11", "fs-extra": "^10.0.1", "jsesc": "^3.0.2", "magic-string": "^0.30.12", @@ -111,8 +107,9 @@ "pathe": "^2.0.1", "picocolors": "^1.1.1", "react-refresh": "^0.13.0", - "rollup": "2.79.2", - "rxjs": "7.5.7" + "rollup": "2.80.0", + "rxjs": "7.5.7", + "tinyglobby": "^0.2.15" }, "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" @@ -1050,10 +1047,6 @@ "node": ">= 8" } }, - "node_modules/@nom/ui": { - "resolved": "packages/ui", - "link": true - }, "node_modules/@open-rpc/client-js": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@open-rpc/client-js/-/client-js-2.0.0.tgz", @@ -1140,20 +1133,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@rollup/pluginutils": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.61.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.61.0.tgz", @@ -5091,6 +5070,23 @@ "dev": true, "license": "MIT" }, + "node_modules/nom-ui": { + "version": "1.0.0", + "resolved": "git+https://git@github.com/digitalSloth/nom-ui.git#48afc9a9fba0abe8525974e58f0b826e83724530", + "license": "MIT", + "dependencies": { + "@vueuse/core": "^14.2.1", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-vue-next": "^0.563.0", + "reka-ui": "^2.8.0", + "tailwind-merge": "^3.4.0", + "vue-sonner": "^2.0.9" + }, + "peerDependencies": { + "vue": "^3.4.0" + } + }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -5431,6 +5427,85 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/prettier-plugin-tailwindcss": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.8.0.tgz", + "integrity": "sha512-V8ITGH87yuBDF6JpEZTOVlUz/saAwqb8f3HRgUj8Lh+tGCcrmorhsLpYqzygwFwK0PE2Ib6Mv3M7T/uE2tZV1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.19" + }, + "peerDependencies": { + "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-hermes": "*", + "@prettier/plugin-oxc": "*", + "@prettier/plugin-pug": "*", + "@shopify/prettier-plugin-liquid": "*", + "@trivago/prettier-plugin-sort-imports": "*", + "@zackad/prettier-plugin-twig": "*", + "prettier": "^3.0", + "prettier-plugin-astro": "*", + "prettier-plugin-css-order": "*", + "prettier-plugin-jsdoc": "*", + "prettier-plugin-marko": "*", + "prettier-plugin-multiline-arrays": "*", + "prettier-plugin-organize-attributes": "*", + "prettier-plugin-organize-imports": "*", + "prettier-plugin-sort-imports": "*", + "prettier-plugin-svelte": "*" + }, + "peerDependenciesMeta": { + "@ianvs/prettier-plugin-sort-imports": { + "optional": true + }, + "@prettier/plugin-hermes": { + "optional": true + }, + "@prettier/plugin-oxc": { + "optional": true + }, + "@prettier/plugin-pug": { + "optional": true + }, + "@shopify/prettier-plugin-liquid": { + "optional": true + }, + "@trivago/prettier-plugin-sort-imports": { + "optional": true + }, + "@zackad/prettier-plugin-twig": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-css-order": { + "optional": true + }, + "prettier-plugin-jsdoc": { + "optional": true + }, + "prettier-plugin-marko": { + "optional": true + }, + "prettier-plugin-multiline-arrays": { + "optional": true + }, + "prettier-plugin-organize-attributes": { + "optional": true + }, + "prettier-plugin-organize-imports": { + "optional": true + }, + "prettier-plugin-sort-imports": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + } + } + }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -5706,9 +5781,9 @@ "license": "MIT" }, "node_modules/rollup": { - "version": "2.79.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", - "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "version": "2.80.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.80.0.tgz", + "integrity": "sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ==", "dev": true, "license": "MIT", "bin": { @@ -6801,22 +6876,6 @@ "engines": { "node": ">=20" } - }, - "packages/ui": { - "name": "@nom/ui", - "version": "1.0.0", - "dependencies": { - "@vueuse/core": "^14.2.1", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "lucide-vue-next": "^0.563.0", - "reka-ui": "^2.8.0", - "tailwind-merge": "^3.4.0", - "vue-sonner": "^2.0.9" - }, - "peerDependencies": { - "vue": "^3.4.0" - } } } } diff --git a/package.json b/package.json index 20d14fc..538884d 100644 --- a/package.json +++ b/package.json @@ -15,17 +15,14 @@ "format": "prettier --write \"**/*.{ts,vue,json,md}\"", "test": "echo \"No automated tests configured. Run 'npm run typecheck' and 'npm run lint'.\" && exit 0" }, - "workspaces": [ - "packages/*" - ], "dependencies": { - "@nom/ui": "workspace:*", "@vueuse/core": "^14.2.0", "@zxcvbn-ts/core": "^3.0.4", "@zxcvbn-ts/language-common": "^3.0.4", "@zxcvbn-ts/language-en": "^3.0.2", "buffer": "^6.0.3", "lucide-vue-next": "^0.563.0", + "nom-ui": "github:digitalSloth/nom-ui", "vue": "^3.4.0", "vue-router": "^4.2.0", "znn-typescript-sdk": "^1.0.5" @@ -44,6 +41,7 @@ "eslint": "^9.39.2", "eslint-plugin-vue": "^10.7.0", "prettier": "^3.2.0", + "prettier-plugin-tailwindcss": "^0.8.0", "tailwindcss": "^4.0.0", "tailwindcss-animate": "^1.0.7", "typescript": "^5.3.0", diff --git a/packages/ui/components.json b/packages/ui/components.json deleted file mode 100644 index 9399fe1..0000000 --- a/packages/ui/components.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://shadcn-vue.com/schema.json", - "style": "new-york", - "typescript": true, - "iconLibrary": "lucide", - "tailwind": { - "config": "", - "css": "src/style.css", - "baseColor": "neutral", - "cssVariables": true - }, - "aliases": { - "components": "@nom/ui/components", - "utils": "@nom/ui/lib/utils", - "ui": "@nom/ui/components" - } -} diff --git a/packages/ui/package.json b/packages/ui/package.json deleted file mode 100644 index 801ce85..0000000 --- a/packages/ui/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "@nom/ui", - "version": "1.0.0", - "type": "module", - "main": "./src/index.ts", - "types": "./src/index.ts", - "exports": { - ".": "./src/index.ts", - "./style.css": "./src/style.css", - "./lib/utils": "./src/lib/utils.ts" - }, - "dependencies": { - "@vueuse/core": "^14.2.1", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "lucide-vue-next": "^0.563.0", - "reka-ui": "^2.8.0", - "tailwind-merge": "^3.4.0", - "vue-sonner": "^2.0.9" - }, - "peerDependencies": { - "vue": "^3.4.0" - } -} diff --git a/packages/ui/src/components/accordion/Accordion.vue b/packages/ui/src/components/accordion/Accordion.vue deleted file mode 100644 index 58ad491..0000000 --- a/packages/ui/src/components/accordion/Accordion.vue +++ /dev/null @@ -1,18 +0,0 @@ - - - diff --git a/packages/ui/src/components/accordion/AccordionContent.vue b/packages/ui/src/components/accordion/AccordionContent.vue deleted file mode 100644 index dba6d7e..0000000 --- a/packages/ui/src/components/accordion/AccordionContent.vue +++ /dev/null @@ -1,23 +0,0 @@ - - - diff --git a/packages/ui/src/components/accordion/AccordionItem.vue b/packages/ui/src/components/accordion/AccordionItem.vue deleted file mode 100644 index 9acc5c0..0000000 --- a/packages/ui/src/components/accordion/AccordionItem.vue +++ /dev/null @@ -1,24 +0,0 @@ - - - diff --git a/packages/ui/src/components/accordion/AccordionTrigger.vue b/packages/ui/src/components/accordion/AccordionTrigger.vue deleted file mode 100644 index 30a2b7f..0000000 --- a/packages/ui/src/components/accordion/AccordionTrigger.vue +++ /dev/null @@ -1,35 +0,0 @@ - - - diff --git a/packages/ui/src/components/accordion/index.ts b/packages/ui/src/components/accordion/index.ts deleted file mode 100644 index b18018b..0000000 --- a/packages/ui/src/components/accordion/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { default as Accordion } from "./Accordion.vue" -export { default as AccordionContent } from "./AccordionContent.vue" -export { default as AccordionItem } from "./AccordionItem.vue" -export { default as AccordionTrigger } from "./AccordionTrigger.vue" diff --git a/packages/ui/src/components/alert/Alert.vue b/packages/ui/src/components/alert/Alert.vue deleted file mode 100644 index 455c5b5..0000000 --- a/packages/ui/src/components/alert/Alert.vue +++ /dev/null @@ -1,17 +0,0 @@ - - - diff --git a/packages/ui/src/components/alert/AlertDescription.vue b/packages/ui/src/components/alert/AlertDescription.vue deleted file mode 100644 index 6bf28cb..0000000 --- a/packages/ui/src/components/alert/AlertDescription.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/packages/ui/src/components/alert/AlertTitle.vue b/packages/ui/src/components/alert/AlertTitle.vue deleted file mode 100644 index 2448c53..0000000 --- a/packages/ui/src/components/alert/AlertTitle.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/packages/ui/src/components/alert/index.ts b/packages/ui/src/components/alert/index.ts deleted file mode 100644 index a668811..0000000 --- a/packages/ui/src/components/alert/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { VariantProps } from "class-variance-authority" -import { cva } from "class-variance-authority" - -export { default as Alert } from "./Alert.vue" -export { default as AlertDescription } from "./AlertDescription.vue" -export { default as AlertTitle } from "./AlertTitle.vue" - -export const alertVariants = cva( - "relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7", - { - variants: { - variant: { - default: "bg-background text-foreground", - destructive: - "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive", - info: - "bg-blue-500/10 border-blue-500/20 text-blue-600 dark:text-blue-400 [&>svg]:text-blue-600 dark:[&>svg]:text-blue-400", - }, - }, - defaultVariants: { - variant: "default", - }, - }, -) - -export type AlertVariants = VariantProps diff --git a/packages/ui/src/components/badge/Badge.vue b/packages/ui/src/components/badge/Badge.vue deleted file mode 100644 index c1d4bbc..0000000 --- a/packages/ui/src/components/badge/Badge.vue +++ /dev/null @@ -1,26 +0,0 @@ - - - diff --git a/packages/ui/src/components/badge/index.ts b/packages/ui/src/components/badge/index.ts deleted file mode 100644 index bbc0dfa..0000000 --- a/packages/ui/src/components/badge/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { VariantProps } from "class-variance-authority" -import { cva } from "class-variance-authority" - -export { default as Badge } from "./Badge.vue" - -export const badgeVariants = cva( - "inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden", - { - variants: { - variant: { - default: - "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90", - secondary: - "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90", - destructive: - "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", - outline: - "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground", - }, - }, - defaultVariants: { - variant: "default", - }, - }, -) -export type BadgeVariants = VariantProps diff --git a/packages/ui/src/components/button/Button.vue b/packages/ui/src/components/button/Button.vue deleted file mode 100644 index d707810..0000000 --- a/packages/ui/src/components/button/Button.vue +++ /dev/null @@ -1,28 +0,0 @@ - - - diff --git a/packages/ui/src/components/button/index.ts b/packages/ui/src/components/button/index.ts deleted file mode 100644 index 9e15f6c..0000000 --- a/packages/ui/src/components/button/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -import type { VariantProps } from "class-variance-authority" -import { cva } from "class-variance-authority" - -export { default as Button } from "./Button.vue" - -export const buttonVariants = cva( - "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring cursor-pointer disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", - { - variants: { - variant: { - default: "bg-primary text-primary-foreground shadow hover:bg-primary/90", - destructive: - "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", - outline: - "border border-input bg-background shadow-sm hover:border-primary hover:text-accent-foreground", - secondary: - "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", - ghost: "hover:bg-accent hover:text-accent-foreground", - link: "text-primary underline-offset-4 hover:underline", - invisible: "bg-transparent text-primary-foreground cursor-pointer hover:bg-transparent", - }, - size: { - "default": "h-9 px-4 py-2", - "xs": "h-7 rounded px-2", - "sm": "h-8 rounded-md px-3 text-xs", - "lg": "h-10 rounded-md px-8", - "icon": "h-9 w-9", - "icon-sm": "size-8", - "icon-lg": "size-10", - }, - }, - defaultVariants: { - variant: "default", - size: "default", - }, - }, -) - -export type ButtonVariants = VariantProps diff --git a/packages/ui/src/components/card/Card.vue b/packages/ui/src/components/card/Card.vue deleted file mode 100644 index 95908e1..0000000 --- a/packages/ui/src/components/card/Card.vue +++ /dev/null @@ -1,21 +0,0 @@ - - - diff --git a/packages/ui/src/components/card/CardContent.vue b/packages/ui/src/components/card/CardContent.vue deleted file mode 100644 index 304efd1..0000000 --- a/packages/ui/src/components/card/CardContent.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/packages/ui/src/components/card/CardDescription.vue b/packages/ui/src/components/card/CardDescription.vue deleted file mode 100644 index dc3f341..0000000 --- a/packages/ui/src/components/card/CardDescription.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/packages/ui/src/components/card/CardFooter.vue b/packages/ui/src/components/card/CardFooter.vue deleted file mode 100644 index 4bfd17f..0000000 --- a/packages/ui/src/components/card/CardFooter.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/packages/ui/src/components/card/CardHeader.vue b/packages/ui/src/components/card/CardHeader.vue deleted file mode 100644 index 68e82bf..0000000 --- a/packages/ui/src/components/card/CardHeader.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/packages/ui/src/components/card/CardTitle.vue b/packages/ui/src/components/card/CardTitle.vue deleted file mode 100644 index 2bac30e..0000000 --- a/packages/ui/src/components/card/CardTitle.vue +++ /dev/null @@ -1,18 +0,0 @@ - - - diff --git a/packages/ui/src/components/card/index.ts b/packages/ui/src/components/card/index.ts deleted file mode 100644 index e5c7cb2..0000000 --- a/packages/ui/src/components/card/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { default as Card } from "./Card.vue" -export { default as CardContent } from "./CardContent.vue" -export { default as CardDescription } from "./CardDescription.vue" -export { default as CardFooter } from "./CardFooter.vue" -export { default as CardHeader } from "./CardHeader.vue" -export { default as CardTitle } from "./CardTitle.vue" diff --git a/packages/ui/src/components/checkbox/Checkbox.vue b/packages/ui/src/components/checkbox/Checkbox.vue deleted file mode 100644 index 5d6ab1d..0000000 --- a/packages/ui/src/components/checkbox/Checkbox.vue +++ /dev/null @@ -1,30 +0,0 @@ - - - diff --git a/packages/ui/src/components/checkbox/index.ts b/packages/ui/src/components/checkbox/index.ts deleted file mode 100644 index 3391a85..0000000 --- a/packages/ui/src/components/checkbox/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as Checkbox } from "./Checkbox.vue" diff --git a/packages/ui/src/components/dialog/Dialog.vue b/packages/ui/src/components/dialog/Dialog.vue deleted file mode 100644 index 47b0968..0000000 --- a/packages/ui/src/components/dialog/Dialog.vue +++ /dev/null @@ -1,15 +0,0 @@ - - - diff --git a/packages/ui/src/components/dialog/DialogClose.vue b/packages/ui/src/components/dialog/DialogClose.vue deleted file mode 100644 index 0295976..0000000 --- a/packages/ui/src/components/dialog/DialogClose.vue +++ /dev/null @@ -1,12 +0,0 @@ - - - diff --git a/packages/ui/src/components/dialog/DialogContent.vue b/packages/ui/src/components/dialog/DialogContent.vue deleted file mode 100644 index bdbd785..0000000 --- a/packages/ui/src/components/dialog/DialogContent.vue +++ /dev/null @@ -1,43 +0,0 @@ - - - diff --git a/packages/ui/src/components/dialog/DialogDescription.vue b/packages/ui/src/components/dialog/DialogDescription.vue deleted file mode 100644 index 2020dc8..0000000 --- a/packages/ui/src/components/dialog/DialogDescription.vue +++ /dev/null @@ -1,22 +0,0 @@ - - - diff --git a/packages/ui/src/components/dialog/DialogFooter.vue b/packages/ui/src/components/dialog/DialogFooter.vue deleted file mode 100644 index 7dcf43d..0000000 --- a/packages/ui/src/components/dialog/DialogFooter.vue +++ /dev/null @@ -1,19 +0,0 @@ - - - diff --git a/packages/ui/src/components/dialog/DialogHeader.vue b/packages/ui/src/components/dialog/DialogHeader.vue deleted file mode 100644 index 28f6fa3..0000000 --- a/packages/ui/src/components/dialog/DialogHeader.vue +++ /dev/null @@ -1,16 +0,0 @@ - - - diff --git a/packages/ui/src/components/dialog/DialogScrollContent.vue b/packages/ui/src/components/dialog/DialogScrollContent.vue deleted file mode 100644 index 7ce5e1a..0000000 --- a/packages/ui/src/components/dialog/DialogScrollContent.vue +++ /dev/null @@ -1,55 +0,0 @@ - - - diff --git a/packages/ui/src/components/dialog/DialogTitle.vue b/packages/ui/src/components/dialog/DialogTitle.vue deleted file mode 100644 index 6255eef..0000000 --- a/packages/ui/src/components/dialog/DialogTitle.vue +++ /dev/null @@ -1,27 +0,0 @@ - - - diff --git a/packages/ui/src/components/dialog/DialogTrigger.vue b/packages/ui/src/components/dialog/DialogTrigger.vue deleted file mode 100644 index a4fc3ee..0000000 --- a/packages/ui/src/components/dialog/DialogTrigger.vue +++ /dev/null @@ -1,12 +0,0 @@ - - - diff --git a/packages/ui/src/components/dialog/index.ts b/packages/ui/src/components/dialog/index.ts deleted file mode 100644 index c9c577f..0000000 --- a/packages/ui/src/components/dialog/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export { default as Dialog } from "./Dialog.vue" -export { default as DialogClose } from "./DialogClose.vue" -export { default as DialogContent } from "./DialogContent.vue" -export { default as DialogDescription } from "./DialogDescription.vue" -export { default as DialogFooter } from "./DialogFooter.vue" -export { default as DialogHeader } from "./DialogHeader.vue" -export { default as DialogScrollContent } from "./DialogScrollContent.vue" -export { default as DialogTitle } from "./DialogTitle.vue" -export { default as DialogTrigger } from "./DialogTrigger.vue" diff --git a/packages/ui/src/components/dropdown-menu/DropdownMenu.vue b/packages/ui/src/components/dropdown-menu/DropdownMenu.vue deleted file mode 100644 index bf38258..0000000 --- a/packages/ui/src/components/dropdown-menu/DropdownMenu.vue +++ /dev/null @@ -1,15 +0,0 @@ - - - diff --git a/packages/ui/src/components/dropdown-menu/DropdownMenuCheckboxItem.vue b/packages/ui/src/components/dropdown-menu/DropdownMenuCheckboxItem.vue deleted file mode 100644 index c1edab8..0000000 --- a/packages/ui/src/components/dropdown-menu/DropdownMenuCheckboxItem.vue +++ /dev/null @@ -1,36 +0,0 @@ - - - diff --git a/packages/ui/src/components/dropdown-menu/DropdownMenuContent.vue b/packages/ui/src/components/dropdown-menu/DropdownMenuContent.vue deleted file mode 100644 index 0f8d739..0000000 --- a/packages/ui/src/components/dropdown-menu/DropdownMenuContent.vue +++ /dev/null @@ -1,34 +0,0 @@ - - - diff --git a/packages/ui/src/components/dropdown-menu/DropdownMenuGroup.vue b/packages/ui/src/components/dropdown-menu/DropdownMenuGroup.vue deleted file mode 100644 index 80c581a..0000000 --- a/packages/ui/src/components/dropdown-menu/DropdownMenuGroup.vue +++ /dev/null @@ -1,12 +0,0 @@ - - - diff --git a/packages/ui/src/components/dropdown-menu/DropdownMenuItem.vue b/packages/ui/src/components/dropdown-menu/DropdownMenuItem.vue deleted file mode 100644 index 047d459..0000000 --- a/packages/ui/src/components/dropdown-menu/DropdownMenuItem.vue +++ /dev/null @@ -1,26 +0,0 @@ - - - diff --git a/packages/ui/src/components/dropdown-menu/DropdownMenuLabel.vue b/packages/ui/src/components/dropdown-menu/DropdownMenuLabel.vue deleted file mode 100644 index a11a711..0000000 --- a/packages/ui/src/components/dropdown-menu/DropdownMenuLabel.vue +++ /dev/null @@ -1,22 +0,0 @@ - - - diff --git a/packages/ui/src/components/dropdown-menu/DropdownMenuRadioGroup.vue b/packages/ui/src/components/dropdown-menu/DropdownMenuRadioGroup.vue deleted file mode 100644 index 1c31a65..0000000 --- a/packages/ui/src/components/dropdown-menu/DropdownMenuRadioGroup.vue +++ /dev/null @@ -1,18 +0,0 @@ - - - diff --git a/packages/ui/src/components/dropdown-menu/DropdownMenuRadioItem.vue b/packages/ui/src/components/dropdown-menu/DropdownMenuRadioItem.vue deleted file mode 100644 index 2048b70..0000000 --- a/packages/ui/src/components/dropdown-menu/DropdownMenuRadioItem.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - diff --git a/packages/ui/src/components/dropdown-menu/DropdownMenuSeparator.vue b/packages/ui/src/components/dropdown-menu/DropdownMenuSeparator.vue deleted file mode 100644 index 7bf342d..0000000 --- a/packages/ui/src/components/dropdown-menu/DropdownMenuSeparator.vue +++ /dev/null @@ -1,19 +0,0 @@ - - - diff --git a/packages/ui/src/components/dropdown-menu/DropdownMenuShortcut.vue b/packages/ui/src/components/dropdown-menu/DropdownMenuShortcut.vue deleted file mode 100644 index 0d560f6..0000000 --- a/packages/ui/src/components/dropdown-menu/DropdownMenuShortcut.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/packages/ui/src/components/dropdown-menu/DropdownMenuSub.vue b/packages/ui/src/components/dropdown-menu/DropdownMenuSub.vue deleted file mode 100644 index 2a31a10..0000000 --- a/packages/ui/src/components/dropdown-menu/DropdownMenuSub.vue +++ /dev/null @@ -1,18 +0,0 @@ - - - diff --git a/packages/ui/src/components/dropdown-menu/DropdownMenuSubContent.vue b/packages/ui/src/components/dropdown-menu/DropdownMenuSubContent.vue deleted file mode 100644 index b558004..0000000 --- a/packages/ui/src/components/dropdown-menu/DropdownMenuSubContent.vue +++ /dev/null @@ -1,26 +0,0 @@ - - - diff --git a/packages/ui/src/components/dropdown-menu/DropdownMenuSubTrigger.vue b/packages/ui/src/components/dropdown-menu/DropdownMenuSubTrigger.vue deleted file mode 100644 index dbe8b7e..0000000 --- a/packages/ui/src/components/dropdown-menu/DropdownMenuSubTrigger.vue +++ /dev/null @@ -1,30 +0,0 @@ - - - diff --git a/packages/ui/src/components/dropdown-menu/DropdownMenuTrigger.vue b/packages/ui/src/components/dropdown-menu/DropdownMenuTrigger.vue deleted file mode 100644 index ada9a0a..0000000 --- a/packages/ui/src/components/dropdown-menu/DropdownMenuTrigger.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/packages/ui/src/components/dropdown-menu/index.ts b/packages/ui/src/components/dropdown-menu/index.ts deleted file mode 100644 index 955fe3a..0000000 --- a/packages/ui/src/components/dropdown-menu/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -export { default as DropdownMenu } from "./DropdownMenu.vue" - -export { default as DropdownMenuCheckboxItem } from "./DropdownMenuCheckboxItem.vue" -export { default as DropdownMenuContent } from "./DropdownMenuContent.vue" -export { default as DropdownMenuGroup } from "./DropdownMenuGroup.vue" -export { default as DropdownMenuItem } from "./DropdownMenuItem.vue" -export { default as DropdownMenuLabel } from "./DropdownMenuLabel.vue" -export { default as DropdownMenuRadioGroup } from "./DropdownMenuRadioGroup.vue" -export { default as DropdownMenuRadioItem } from "./DropdownMenuRadioItem.vue" -export { default as DropdownMenuSeparator } from "./DropdownMenuSeparator.vue" -export { default as DropdownMenuShortcut } from "./DropdownMenuShortcut.vue" -export { default as DropdownMenuSub } from "./DropdownMenuSub.vue" -export { default as DropdownMenuSubContent } from "./DropdownMenuSubContent.vue" -export { default as DropdownMenuSubTrigger } from "./DropdownMenuSubTrigger.vue" -export { default as DropdownMenuTrigger } from "./DropdownMenuTrigger.vue" -export { DropdownMenuPortal } from "reka-ui" diff --git a/packages/ui/src/components/field/Field.vue b/packages/ui/src/components/field/Field.vue deleted file mode 100644 index c548ea5..0000000 --- a/packages/ui/src/components/field/Field.vue +++ /dev/null @@ -1,25 +0,0 @@ - - - diff --git a/packages/ui/src/components/field/FieldContent.vue b/packages/ui/src/components/field/FieldContent.vue deleted file mode 100644 index 08b91ec..0000000 --- a/packages/ui/src/components/field/FieldContent.vue +++ /dev/null @@ -1,20 +0,0 @@ - - - diff --git a/packages/ui/src/components/field/FieldDescription.vue b/packages/ui/src/components/field/FieldDescription.vue deleted file mode 100644 index 90480e2..0000000 --- a/packages/ui/src/components/field/FieldDescription.vue +++ /dev/null @@ -1,22 +0,0 @@ - - - diff --git a/packages/ui/src/components/field/FieldError.vue b/packages/ui/src/components/field/FieldError.vue deleted file mode 100644 index 65b5d76..0000000 --- a/packages/ui/src/components/field/FieldError.vue +++ /dev/null @@ -1,44 +0,0 @@ - - - diff --git a/packages/ui/src/components/field/FieldGroup.vue b/packages/ui/src/components/field/FieldGroup.vue deleted file mode 100644 index 81c4cd2..0000000 --- a/packages/ui/src/components/field/FieldGroup.vue +++ /dev/null @@ -1,20 +0,0 @@ - - - diff --git a/packages/ui/src/components/field/FieldLabel.vue b/packages/ui/src/components/field/FieldLabel.vue deleted file mode 100644 index b99d0b8..0000000 --- a/packages/ui/src/components/field/FieldLabel.vue +++ /dev/null @@ -1,23 +0,0 @@ - - - diff --git a/packages/ui/src/components/field/FieldLegend.vue b/packages/ui/src/components/field/FieldLegend.vue deleted file mode 100644 index 250d2e0..0000000 --- a/packages/ui/src/components/field/FieldLegend.vue +++ /dev/null @@ -1,24 +0,0 @@ - - - diff --git a/packages/ui/src/components/field/FieldSeparator.vue b/packages/ui/src/components/field/FieldSeparator.vue deleted file mode 100644 index bd8d309..0000000 --- a/packages/ui/src/components/field/FieldSeparator.vue +++ /dev/null @@ -1,29 +0,0 @@ - - - diff --git a/packages/ui/src/components/field/FieldSet.vue b/packages/ui/src/components/field/FieldSet.vue deleted file mode 100644 index d67d658..0000000 --- a/packages/ui/src/components/field/FieldSet.vue +++ /dev/null @@ -1,21 +0,0 @@ - - - diff --git a/packages/ui/src/components/field/FieldTitle.vue b/packages/ui/src/components/field/FieldTitle.vue deleted file mode 100644 index 9f739f2..0000000 --- a/packages/ui/src/components/field/FieldTitle.vue +++ /dev/null @@ -1,20 +0,0 @@ - - - diff --git a/packages/ui/src/components/field/index.ts b/packages/ui/src/components/field/index.ts deleted file mode 100644 index 162ba14..0000000 --- a/packages/ui/src/components/field/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -import type { VariantProps } from "class-variance-authority" -import { cva } from "class-variance-authority" - -export const fieldVariants = cva( - "group/field flex w-full gap-3 data-[invalid=true]:text-destructive", - { - variants: { - orientation: { - vertical: ["flex-col [&>*]:w-full [&>.sr-only]:w-auto"], - horizontal: [ - "flex-row items-center", - "[&>[data-slot=field-label]]:flex-auto", - "has-[>[data-slot=field-content]]:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px", - ], - responsive: [ - "flex-col [&>*]:w-full [&>.sr-only]:w-auto @md/field-group:flex-row @md/field-group:items-center @md/field-group:[&>*]:w-auto", - "@md/field-group:[&>[data-slot=field-label]]:flex-auto", - "@md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px", - ], - }, - }, - defaultVariants: { - orientation: "vertical", - }, - }, -) - -export type FieldVariants = VariantProps - -export { default as Field } from "./Field.vue" -export { default as FieldContent } from "./FieldContent.vue" -export { default as FieldDescription } from "./FieldDescription.vue" -export { default as FieldError } from "./FieldError.vue" -export { default as FieldGroup } from "./FieldGroup.vue" -export { default as FieldLabel } from "./FieldLabel.vue" -export { default as FieldLegend } from "./FieldLegend.vue" -export { default as FieldSeparator } from "./FieldSeparator.vue" -export { default as FieldSet } from "./FieldSet.vue" -export { default as FieldTitle } from "./FieldTitle.vue" diff --git a/packages/ui/src/components/index.ts b/packages/ui/src/components/index.ts deleted file mode 100644 index 8879d3f..0000000 --- a/packages/ui/src/components/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -export * from './accordion' -export * from './alert' -export * from './badge' -export * from './button' -export * from './card' -export * from './checkbox' -export * from './dialog' -export * from './dropdown-menu' -export * from './field' -export * from './typography' -export * from './input' -export * from './input-group' -export * from './item' -export * from './label' -export * from './popover' -export * from './select' -export * from './separator' -export * from './sonner' -export * from './tabs' -export * from './textarea' diff --git a/packages/ui/src/components/input-group/InputGroup.vue b/packages/ui/src/components/input-group/InputGroup.vue deleted file mode 100644 index 2e805c0..0000000 --- a/packages/ui/src/components/input-group/InputGroup.vue +++ /dev/null @@ -1,32 +0,0 @@ - - - diff --git a/packages/ui/src/components/input-group/InputGroupAddon.vue b/packages/ui/src/components/input-group/InputGroupAddon.vue deleted file mode 100644 index b97d65a..0000000 --- a/packages/ui/src/components/input-group/InputGroupAddon.vue +++ /dev/null @@ -1,36 +0,0 @@ - - - diff --git a/packages/ui/src/components/input-group/InputGroupButton.vue b/packages/ui/src/components/input-group/InputGroupButton.vue deleted file mode 100644 index bb1240d..0000000 --- a/packages/ui/src/components/input-group/InputGroupButton.vue +++ /dev/null @@ -1,20 +0,0 @@ - - - diff --git a/packages/ui/src/components/input-group/InputGroupInput.vue b/packages/ui/src/components/input-group/InputGroupInput.vue deleted file mode 100644 index 8e44193..0000000 --- a/packages/ui/src/components/input-group/InputGroupInput.vue +++ /dev/null @@ -1,19 +0,0 @@ - - - diff --git a/packages/ui/src/components/input-group/InputGroupText.vue b/packages/ui/src/components/input-group/InputGroupText.vue deleted file mode 100644 index 1bb3c4d..0000000 --- a/packages/ui/src/components/input-group/InputGroupText.vue +++ /dev/null @@ -1,19 +0,0 @@ - - - diff --git a/packages/ui/src/components/input-group/InputGroupTextarea.vue b/packages/ui/src/components/input-group/InputGroupTextarea.vue deleted file mode 100644 index 97a022e..0000000 --- a/packages/ui/src/components/input-group/InputGroupTextarea.vue +++ /dev/null @@ -1,19 +0,0 @@ - - -