diff --git a/apps/dimentorin/vite.config.ts b/apps/dimentorin/vite.config.ts index 8c3fedf..2394546 100644 --- a/apps/dimentorin/vite.config.ts +++ b/apps/dimentorin/vite.config.ts @@ -8,11 +8,11 @@ export default defineConfig(() => ({ root: __dirname, cacheDir: '../../node_modules/.vite/apps/dimentorin', server: { - port: 4200, + port: 3000, host: 'localhost', }, preview: { - port: 4300, + port: 3001, host: 'localhost', }, plugins: [react(), nxViteTsPaths(), nxCopyAssetsPlugin(['*.md'])], diff --git a/apps/gacha/index.html b/apps/gacha/index.html index c62f016..41120c1 100644 --- a/apps/gacha/index.html +++ b/apps/gacha/index.html @@ -7,7 +7,7 @@ - +
diff --git a/apps/gacha/public/logos/simple.svg b/apps/gacha/public/logos/simple.svg new file mode 100644 index 0000000..ba9aca1 --- /dev/null +++ b/apps/gacha/public/logos/simple.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/gacha/src/styles.css b/apps/gacha/src/styles.css deleted file mode 100644 index 90d4ee0..0000000 --- a/apps/gacha/src/styles.css +++ /dev/null @@ -1 +0,0 @@ -/* You can add global styles to this file, and also import other style files */ diff --git a/apps/gacha/vite.config.ts b/apps/gacha/vite.config.ts index 7d9ccb4..6c7dca5 100644 --- a/apps/gacha/vite.config.ts +++ b/apps/gacha/vite.config.ts @@ -8,11 +8,11 @@ export default defineConfig(() => ({ root: __dirname, cacheDir: '../../node_modules/.vite/apps/gacha', server: { - port: 4200, + port: 3000, host: 'localhost', }, preview: { - port: 4300, + port: 3001, host: 'localhost', }, plugins: [react(), nxViteTsPaths(), nxCopyAssetsPlugin(['*.md'])], diff --git a/libs/ui/package.json b/libs/ui/package.json index 8cf0dd4..3db6f0a 100644 --- a/libs/ui/package.json +++ b/libs/ui/package.json @@ -3,6 +3,11 @@ "version": "0.0.1", "main": "./index.js", "types": "./index.d.ts", + "devDependencies": { + "tailwindcss": "^4.0.13", + "postcss": "^8.5.3", + "@tailwindcss/postcss": "^4.0.13" + }, "exports": { ".": { "import": "./index.mjs", diff --git a/libs/ui/postcss.config.mjs b/libs/ui/postcss.config.mjs new file mode 100644 index 0000000..a34a3d5 --- /dev/null +++ b/libs/ui/postcss.config.mjs @@ -0,0 +1,5 @@ +export default { + plugins: { + '@tailwindcss/postcss': {}, + }, +}; diff --git a/libs/ui/src/atoms/index.ts b/libs/ui/src/atoms/index.ts index eaf5eea..f526c51 100644 --- a/libs/ui/src/atoms/index.ts +++ b/libs/ui/src/atoms/index.ts @@ -1 +1,2 @@ +import '../index.css'; export * from './button'; diff --git a/libs/ui/src/index.css b/libs/ui/src/index.css new file mode 100644 index 0000000..6d48aaa --- /dev/null +++ b/libs/ui/src/index.css @@ -0,0 +1,120 @@ +@import url('https://fonts.googleapis.com/css2?family=Bai+Jamjuree:ital,wght@0,200;0,300;0,400;0,500;0,600;0,700;1,200;1,300;1,400;1,500;1,600;1,700&display=swap'); +@import 'tailwindcss'; + +@theme { + --color-primary-50: #f0f8ff; + --color-primary-100: #e1f0fd; + --color-primary-200: #b8e1f8; + --color-primary-300: #a1d4f0; + --color-primary-400: #4aa4da; + --color-primary-500: #1a8ce6; + --color-primary-600: #1673c7; + --color-primary-700: #0f5ca5; + --color-primary-800: #0a4780; + --color-primary-900: #04305d; + + --color-neutral-50: #f7f7f7; + --color-neutral-100: #e7e7e7; + --color-neutral-200: #d0d0d0; + --color-neutral-300: #b7b7b7; + --color-neutral-400: #9f9f9f; + --color-neutral-500: #7e7e7e; + --color-neutral-600: #5d5d5d; + --color-neutral-700: #4a4a4a; + --color-neutral-800: #3a3a3a; + --color-neutral-900: #2f2f2f; + + --color-success-50: #e7f2ee; + --color-success-100: #cde6dd; + --color-success-200: #9bccbc; + --color-success-300: #78bdab; + --color-success-400: #4ca88f; + --color-success-500: #349078; + --color-success-600: #2f7c66; + --color-success-700: #26624f; + --color-success-800: #1e4a3b; + --color-success-900: #1b513b; + + --color-info-50: #e7f4f5; + --color-info-100: #cce9ea; + --color-info-200: #99d3d5; + --color-info-300: #78c4c7; + --color-info-400: #3aa9ad; + --color-info-500: #279599; + --color-info-600: #207d82; + --color-info-700: #1a666b; + --color-info-800: #124c52; + --color-info-900: #093d43; + + --color-warning-50: #fffce6; + --color-warning-100: #fff8cc; + --color-warning-200: #fef39b; + --color-warning-300: #fde967; + --color-warning-400: #fbd93d; + --color-warning-500: #f3c215; + --color-warning-600: #d7a20f; + --color-warning-700: #aa7e0c; + --color-warning-800: #805c07; + --color-warning-900: #665c00; + + --color-danger-50: #ffe7e7; + --color-danger-100: #ffcece; + --color-danger-200: #ff9f9f; + --color-danger-300: #ff6e6e; + --color-danger-400: #fa4646; + --color-danger-500: #ef1f1f; + --color-danger-600: #d11515; + --color-danger-700: #a51111; + --color-danger-800: #7f0c0c; + --color-danger-900: #5d2d2d; + + --radius-none: 0px; + --radius-sm: 2px; + --radius-md: 4px; + --radius-lg: 8px; + --radius-xl: 12px; + --radius-2xl: 16px; + --radius-3xl: 24px; + --radius-full: 50%; + + --font-bai-jamjuree: 'Bai Jamjuree', sans-serif; + + --text-h1: 3rem; /* ~48px */ + --text-h2: 2.4rem; /* ~38.4px */ + --text-h3: 1.92rem; /* ~30.72px */ + --text-p1: 1.54rem; /* ~24.58px */ + --text-p2: 1.23rem; /* ~19.68px */ + --text-label1: 0.98rem; /* ~15.74px */ + --text-label2: 0.78rem; /* ~12.59px */ +} + +@layer base { + *, + ::after, + ::before, + ::backdrop, + ::file-selector-button { + border-color: var(--color-neutral-200, currentColor); + } + + /* Custom scrollbar */ + ::-webkit-scrollbar { + width: 6px; + height: 6px; + } + ::-webkit-scrollbar-track { + background: var(--color-neutral-50); + } + ::-webkit-scrollbar-thumb { + background: #cccccc; + border-radius: 3px; + } + ::-webkit-scrollbar-thumb:hover { + background: var(--color-neutral-300); + } + + html { + font-family: 'Bai Jamjuree', sans-serif; + font-weight: 400; + } +} diff --git a/libs/ui/src/molecules/index.ts b/libs/ui/src/molecules/index.ts new file mode 100644 index 0000000..d5137ab --- /dev/null +++ b/libs/ui/src/molecules/index.ts @@ -0,0 +1,2 @@ +import '../index.css'; +export {}; diff --git a/libs/ui/src/organisms/index.ts b/libs/ui/src/organisms/index.ts index f5899d0..466e608 100644 --- a/libs/ui/src/organisms/index.ts +++ b/libs/ui/src/organisms/index.ts @@ -1 +1,2 @@ +import '../index.css'; export * from './navbar'; diff --git a/libs/ui/src/organisms/navbar/navbar.spec.tsx b/libs/ui/src/organisms/navbar/navbar.spec.tsx new file mode 100644 index 0000000..9c075c2 --- /dev/null +++ b/libs/ui/src/organisms/navbar/navbar.spec.tsx @@ -0,0 +1,206 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import { + render, + screen, + fireEvent, + RenderResult, +} from '@testing-library/react'; +import { BrowserRouter } from 'react-router-dom'; +import { Navbar } from './navbar'; + +// Interface untuk hasil matchMedia +interface MatchMediaResult { + matches: boolean; + media: string; + onchange: null; + addListener: ReturnType; + removeListener: ReturnType; + addEventListener: ReturnType; + removeEventListener: ReturnType; + dispatchEvent: ReturnType; +} + +// Fungsi untuk mock matchMedia dengan tipe yang tepat +function mockMatchMedia(width: { matches: boolean }): void { + Object.defineProperty(window, 'matchMedia', { + writable: true, + value: vi.fn().mockImplementation( + (query: string): MatchMediaResult => ({ + matches: width.matches, + media: query, + onchange: null, + addListener: vi.fn(), + removeListener: vi.fn(), + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + dispatchEvent: vi.fn(), + }) + ), + }); +} + +describe('Navbar', () => { + // Setup dan cleanup untuk setiap test + beforeEach(() => { + // Reset DOM sebelum setiap test + document.body.innerHTML = ''; + }); + + afterEach(() => { + // Cleanup setelah setiap test + vi.restoreAllMocks(); + }); + + // Test yang sudah ada sebelumnya + it('renders the logo', () => { + render( + + + + ); + const logo: HTMLElement = screen.getByAltText(/IMPHNEN Logo/i); + expect(logo).toBeInTheDocument(); + }); + + it('renders the Home link', () => { + render( + + + + ); + const homeLink: HTMLElement = screen.getByRole('link', { name: /home/i }); + expect(homeLink).toBeInTheDocument(); + }); + + it('renders the Merch Gacha link', () => { + render( + + + + ); + const merchLink: HTMLElement = screen.getByRole('link', { + name: /merch gacha/i, + }); + expect(merchLink).toBeInTheDocument(); + }); + + // Test tambahan untuk responsifitas + + // Untuk Desktop Screen + it('displays horizontal menu on desktop screens', () => { + // Set viewport untuk desktop (di atas 768px) + mockMatchMedia({ matches: true }); + + // Setup + global.innerWidth = 1024; + global.dispatchEvent(new Event('resize')); + + render( + + + + ); + + // Cek apakah menu horizontal ditampilkan + const navItems: HTMLElement = screen.getByRole('list'); + expect(navItems).toHaveClass('md:flex'); + + // Hamburger menu tidak terlihat di desktop + const hamburgerButton: HTMLElement = screen.getByRole('button'); + expect(hamburgerButton).toHaveClass('md:hidden'); + }); + + // Untuk Mobile Screen + it('displays hamburger menu on mobile screens and can toggle dropdown', () => { + // Set viewport untuk mobile (di bawah 768px) + mockMatchMedia({ matches: false }); + + // Setup + global.innerWidth = 375; + global.dispatchEvent(new Event('resize')); + + render( + + + + ); + + // Hamburger menu harus terlihat + const hamburgerButton: HTMLElement = screen.getByRole('button'); + expect(hamburgerButton).toBeVisible(); + + // Klik hamburger menu untuk membuka dropdown + fireEvent.click(hamburgerButton); + + // Dropdown menu harus terlihat setelah diklik + const dropdownMenu: HTMLElement[] = screen.getAllByRole('list'); + expect(dropdownMenu[1]).toBeVisible(); + + // Klik lagi untuk menutup dropdown + fireEvent.click(hamburgerButton); + + // Dropdown tidak lagi terlihat (karena state berubah) + const updatedDropdownMenus: HTMLElement[] = screen.getAllByRole('list'); + expect(updatedDropdownMenus.length).toBe(1); // Hanya menu horizontal yang tersisa + }); + + // Untuk Tablet Screen + it('has correct height on tablet screens', () => { + // Set viewport untuk tablet (antara mobile dan desktop) + mockMatchMedia({ matches: true }); + + // Setup + global.innerWidth = 768; + global.dispatchEvent(new Event('resize')); + + const { container }: RenderResult = render( + + + + ); + + // Navbar harus memiliki kelas height untuk tablet + const header: HTMLElement | null = container.querySelector('header'); + expect(header).not.toBeNull(); + if (header) { + expect(header).toHaveClass('md:min-h-[60px]'); + expect(header).toHaveClass('md:max-h-[60px]'); + } + }); + + // Untuk Max Width pada 4K Screen + it('has max width constraint on large screens', () => { + // Set viewport untuk layar besar + mockMatchMedia({ matches: true }); + + // Setup + global.innerWidth = 3840; // 4K resolution + global.dispatchEvent(new Event('resize')); + + const { container }: RenderResult = render( + + + + ); + + // Navbar harus memiliki max-width dan posisi tengah + const header: HTMLElement | null = container.querySelector('header'); + expect(header).not.toBeNull(); + if (header) { + expect(header).toHaveClass('max-w-[1280px]'); + expect(header).toHaveClass('xl:mx-auto'); + } + }); + + // Test tambahan untuk memeriksa peran dan aksesibilitas + it('has correct ARIA role for navigation', () => { + const { container }: RenderResult = render( + + + + ); + + const header: HTMLElement | null = container.querySelector('header'); + expect(header).toHaveAttribute('role', 'navigation'); + }); +}); diff --git a/libs/ui/vite.config.ts b/libs/ui/vite.config.ts index 8b64057..38b2f39 100644 --- a/libs/ui/vite.config.ts +++ b/libs/ui/vite.config.ts @@ -5,12 +5,14 @@ import dts from 'vite-plugin-dts'; import * as path from 'path'; import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin'; import { nxCopyAssetsPlugin } from '@nx/vite/plugins/nx-copy-assets.plugin'; +import tailwindcss from '@tailwindcss/vite'; export default defineConfig(() => ({ root: __dirname, cacheDir: '../../node_modules/.vite/libs/ui', plugins: [ react(), + tailwindcss(), nxViteTsPaths(), nxCopyAssetsPlugin(['*.md']), dts({ diff --git a/package-lock.json b/package-lock.json index 36d4c86..af5d1b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,6 +34,7 @@ "@swc/core": "~1.5.7", "@swc/helpers": "~0.5.11", "@tailwindcss/postcss": "^4.0.13", + "@tailwindcss/vite": "^4.0.14", "@testing-library/dom": "10.4.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.1.0", @@ -6274,6 +6275,251 @@ "tailwindcss": "4.0.13" } }, + "node_modules/@tailwindcss/vite": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.0.14.tgz", + "integrity": "sha512-y69ztPTRFy+13EPS/7dEFVl7q2Goh1pQueVO8IfGeyqSpcx/joNJXFk0lLhMgUbF0VFJotwRSb9ZY7Xoq3r26Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.0.14", + "@tailwindcss/oxide": "4.0.14", + "lightningcss": "1.29.2", + "tailwindcss": "4.0.14" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6" + } + }, + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/node": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.14.tgz", + "integrity": "sha512-Ux9NbFkKWYE4rfUFz6M5JFLs/GEYP6ysxT8uSyPn6aTbh2K3xDE1zz++eVK4Vwx799fzMF8CID9sdHn4j/Ab8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "tailwindcss": "4.0.14" + } + }, + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.14.tgz", + "integrity": "sha512-M8VCNyO/NBi5vJ2cRcI9u8w7Si+i76a7o1vveoGtbbjpEYJZYiyc7f2VGps/DqawO56l3tImIbq2OT/533jcrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.0.14", + "@tailwindcss/oxide-darwin-arm64": "4.0.14", + "@tailwindcss/oxide-darwin-x64": "4.0.14", + "@tailwindcss/oxide-freebsd-x64": "4.0.14", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.14", + "@tailwindcss/oxide-linux-arm64-gnu": "4.0.14", + "@tailwindcss/oxide-linux-arm64-musl": "4.0.14", + "@tailwindcss/oxide-linux-x64-gnu": "4.0.14", + "@tailwindcss/oxide-linux-x64-musl": "4.0.14", + "@tailwindcss/oxide-win32-arm64-msvc": "4.0.14", + "@tailwindcss/oxide-win32-x64-msvc": "4.0.14" + } + }, + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.14.tgz", + "integrity": "sha512-VBFKC2rFyfJ5J8lRwjy6ub3rgpY186kAcYgiUr8ArR8BAZzMruyeKJ6mlsD22Zp5ZLcPW/FXMasJiJBx0WsdQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.14.tgz", + "integrity": "sha512-U3XOwLrefGr2YQZ9DXasDSNWGPZBCh8F62+AExBEDMLDfvLLgI/HDzY8Oq8p/JtqkAY38sWPOaNnRwEGKU5Zmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.14.tgz", + "integrity": "sha512-V5AjFuc3ndWGnOi1d379UsODb0TzAS2DYIP/lwEbfvafUaD2aNZIcbwJtYu2DQqO2+s/XBvDVA+w4yUyaewRwg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.14.tgz", + "integrity": "sha512-tXvtxbaZfcPfqBwW3f53lTcyH6EDT+1eT7yabwcfcxTs+8yTPqxsDUhrqe9MrnEzpNkd+R/QAjJapfd4tjWdLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.14.tgz", + "integrity": "sha512-cSeLNWWqIWeSTmBntQvyY2/2gcLX8rkPFfDDTQVF8qbRcRMVPLxBvFVJyfSAYRNch6ZyVH2GI6dtgALOBDpdNA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.14.tgz", + "integrity": "sha512-bwDWLBalXFMDItcSXzFk6y7QKvj6oFlaY9vM+agTlwFL1n1OhDHYLZkSjaYsh6KCeG0VB0r7H8PUJVOM1LRZyg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.14.tgz", + "integrity": "sha512-gVkJdnR/L6iIcGYXx64HGJRmlme2FGr/aZH0W6u4A3RgPMAb+6ELRLi+UBiH83RXBm9vwCfkIC/q8T51h8vUJQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.14.tgz", + "integrity": "sha512-EE+EQ+c6tTpzsg+LGO1uuusjXxYx0Q00JE5ubcIGfsogSKth8n8i2BcS2wYTQe4jXGs+BQs35l78BIPzgwLddw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.14.tgz", + "integrity": "sha512-KCCOzo+L6XPT0oUp2Jwh233ETRQ/F6cwUnMnR0FvMUCbkDAzHbcyOgpfuAtRa5HD0WbTbH4pVD+S0pn1EhNfbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.14.tgz", + "integrity": "sha512-AHObFiFL9lNYcm3tZSPqa/cHGpM5wOrNmM2uOMoKppp+0Hom5uuyRh0QkOp7jftsHZdrZUpmoz0Mp6vhh2XtUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.14.tgz", + "integrity": "sha512-rNXXMDJfCJLw/ZaFTOLOHoGULxyXfh2iXTGiChFiYTSgKBKQHIGEpV0yn5N25WGzJJ+VBnRjHzlmDqRV+d//oQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite/node_modules/tailwindcss": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.14.tgz", + "integrity": "sha512-92YT2dpt671tFiHH/e1ok9D987N9fHD5VWoly1CdPD/Cd1HMglvZwP3nx2yTj2lbXDAHt8QssZkxTLCCTNL+xw==", + "dev": true, + "license": "MIT" + }, "node_modules/@tanstack/query-core": { "version": "5.67.3", "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.67.3.tgz", diff --git a/package.json b/package.json index a111efb..f3fc322 100644 --- a/package.json +++ b/package.json @@ -2,12 +2,14 @@ "name": "@imphnen-frontend-service/source", "version": "0.0.0", "license": "MIT", + "type": "module", "scripts": { "gacha:dev": "nx serve gacha", "gacha:build": "nx build gacha", "dimentorin:dev": "nx serve dimentorin", "dimentorin:build": "nx build dimentorin", - "ui:test": "nx test ui" + "ui:test": "nx test ui", + "ui:build": "nx test ui" }, "private": true, "dependencies": { @@ -36,6 +38,7 @@ "@swc/core": "~1.5.7", "@swc/helpers": "~0.5.11", "@tailwindcss/postcss": "^4.0.13", + "@tailwindcss/vite": "^4.0.14", "@testing-library/dom": "10.4.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.1.0",