diff --git a/.gitignore b/.gitignore index 96d1b843..ee18d284 100644 --- a/.gitignore +++ b/.gitignore @@ -37,4 +37,9 @@ yarn-error.log* vite.config.ts*.mjs -.pnpm-store/* \ No newline at end of file +.pnpm-store/* + +**/dist/* + +#Ignore vscode AI rules +.github/instructions/codacy.instructions.md diff --git a/apps/api/package.json b/apps/api/package.json index a804e0e6..ebfff36b 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -58,7 +58,7 @@ }, "devDependencies": { "@types/katex": "^0.16.7", - "@types/node": "^20.11.19", + "@types/node": "^20.19.0", "@types/nodemailer": "^6.4.17", "@typescript-eslint/eslint-plugin": "7.0.1", "@typescript-eslint/parser": "7.0.1", diff --git a/apps/api/tsconfig.json b/apps/api/tsconfig.json index f7d94198..cb1bb49c 100644 --- a/apps/api/tsconfig.json +++ b/apps/api/tsconfig.json @@ -15,7 +15,7 @@ "skipLibCheck": true, "sourceMap": true, "target": "ESNext", - "typeRoots": ["./node_modules/@types", "./src/types"], + "typeRoots": ["../../node_modules/@types", "./node_modules/@types", "./src/types"], "types": ["node"] }, "include": ["src/**/*"], diff --git a/apps/dashboard/babel.config.cjs b/apps/dashboard/babel.config.cjs deleted file mode 100644 index 619f8c1b..00000000 --- a/apps/dashboard/babel.config.cjs +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - presets: [['@babel/preset-env', { targets: { node: 'current' } }]] -}; diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index 5930cf4c..b059c888 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -21,6 +21,7 @@ "dependencies": { "@carbon/charts-svelte": "^1.13.6", "@cio/api": "workspace:*", + "@cio/ui": "workspace:*", "@lemonsqueezy/lemonsqueezy.js": "^2.2.0", "@lucide/svelte": "^0.545.0", "@polar-sh/sveltekit": "^0.2.1", @@ -34,6 +35,7 @@ "@types/pluralize": "0.0.30", "ai": "^2.1.31", "axios": "^1.8.4", + "bits-ui": "^2.14.1", "body-parser": "^1.20.2", "bufferutil": "^4.0.9", "canvas-confetti": "^1.6.0", @@ -78,8 +80,10 @@ "@babel/runtime": "^7.22.6", "@eslint/compat": "^1.4.0", "@eslint/js": "^9.36.0", + "@rollup/plugin-replace": "^6.0.2", "@sveltejs/kit": "^2.5.27", "@sveltejs/vite-plugin-svelte": "^4.0.0", + "@tailwindcss/postcss": "^4.1.14", "@tailwindcss/typography": "^0.5.9", "@testing-library/jest-dom": "^6.1.5", "@testing-library/svelte": "^4.0.5", @@ -87,7 +91,6 @@ "@types/lodash": "^4.14.196", "@types/node": "^20", "all-object-keys": "^2.2.0", - "autoprefixer": "^10.4.14", "babel-jest": "^29.7.0", "carbon-components-svelte": "^0.79.0", "diff": "^5.2.0", @@ -107,7 +110,7 @@ "svelte-jester": "^3.0.0", "svelte-loading-spinners": "^0.3.4", "svelte-preprocess": "^6.0.0", - "tailwindcss": "^3.3.2", + "tailwindcss": "^4.1.14", "ts-jest": "^29.1.1", "ts-node": "^10.9.2", "@cio/tsconfig": "workspace:*", diff --git a/apps/dashboard/postcss.config.js b/apps/dashboard/postcss.config.js index ba807304..a814fdcb 100644 --- a/apps/dashboard/postcss.config.js +++ b/apps/dashboard/postcss.config.js @@ -1,6 +1,5 @@ export default { plugins: { - tailwindcss: {}, - autoprefixer: {} + '@tailwindcss/postcss': {}, } }; diff --git a/apps/dashboard/src/app.postcss b/apps/dashboard/src/app.css similarity index 68% rename from apps/dashboard/src/app.postcss rename to apps/dashboard/src/app.css index bad4aa4d..75b67a49 100644 --- a/apps/dashboard/src/app.postcss +++ b/apps/dashboard/src/app.css @@ -1,8 +1,9 @@ /*Write your global styles here, in PostCSS syntax */ -@tailwind base; -@tailwind base; -@tailwind components; -@tailwind utilities; +@import 'tailwindcss'; + +@import '@cio/ui/output.css'; + +@custom-variant dark (&:where(.dark, .dark *)); /** Global scrollbar styles */ html { @@ -84,7 +85,7 @@ h6 { margin-bottom: 10px !important; } -.dark .prose h1, +/* .dark .prose h1, .dark .prose h2, .dark .prose h3, .dark .prose h4, @@ -95,7 +96,7 @@ h6 { .dark .prose li::marker, .dark .prose p { color: #fff !important; -} +} */ iframe.iframe { width: 100%; @@ -192,10 +193,6 @@ svg.lucide-icon:not(.custom) { } } -@tailwind components; - -@tailwind utilities; - /** Rose Theme */ @@ -710,3 +707,312 @@ svg.lucide-icon:not(.custom) { .theme-violet .border-primary-900 { border-color: #890684 !important; } + +/* Tailwind v4 Custom Animations and Keyframes */ +@theme { + --animate-shake-announcement: shakeAnnouncement 0.5s ease-in-out; + --animate-flip-book: flipBook 0.6s ease-in-out; + --animate-scroll-unroll: scrollUnroll 0.8s ease-out; + --animate-check-items: attendanceCount 0.8s ease-in-out; + --animate-task-complete: taskComplete 0.6s ease-in-out; + --animate-grade-glow: gradeGlow 1s ease-in-out; + --animate-people-wave: peopleWave 0.8s ease-in-out; + --animate-chart-grow: dataScan 1s ease-in-out; + --animate-screen-glow: screenGlow 1s ease-in-out; + --animate-library-expand: libraryExpand 0.7s ease-out; + --animate-template-morph: templateMorph 0.6s ease-in-out; + --animate-ripple: communityRipple 0.9s ease-out; + --animate-roll: quizRoll 0.8s ease-in-out; + --animate-gather: audienceGather 0.7s ease-in-out; + --animate-setup-configure: setupConfigure 1s ease-in-out; +} + +@keyframes shakeAnnouncement { + 0%, + 100% { + transform: translateX(0); + } + 10%, + 30%, + 50%, + 70%, + 90% { + transform: translateX(-2px); + } + 20%, + 40%, + 60%, + 80% { + transform: translateX(2px); + } +} + +@keyframes flipBook { + 0% { + transform: rotateY(0deg); + } + 50% { + transform: rotateY(90deg); + } + 100% { + transform: rotateY(0deg); + } +} + +@keyframes scrollUnroll { + 0% { + transform: scaleY(0) translateY(-50%); + opacity: 0.5; + } + 50% { + transform: scaleY(0.8) translateY(-25%); + opacity: 0.8; + } + 100% { + transform: scaleY(1) translateY(0); + opacity: 1; + } +} + +@keyframes attendanceCount { + 0% { + transform: scale(1); + opacity: 0.8; + } + 20% { + transform: scale(1.1); + opacity: 1; + } + 40% { + transform: scale(1.05); + opacity: 0.9; + } + 60% { + transform: scale(1.15); + opacity: 1; + } + 80% { + transform: scale(1.02); + opacity: 0.95; + } + 100% { + transform: scale(1); + opacity: 1; + } +} + +@keyframes taskComplete { + 0% { + transform: scale(1) rotate(0deg); + } + 25% { + transform: scale(1.1) rotate(-5deg); + } + 50% { + transform: scale(1.2) rotate(5deg); + } + 75% { + transform: scale(1.1) rotate(-2deg); + } + 100% { + transform: scale(1) rotate(0deg); + } +} + +@keyframes gradeGlow { + 0%, + 100% { + transform: scale(1); + filter: brightness(1) drop-shadow(0 0 0 rgba(34, 197, 94, 0)); + } + 50% { + transform: scale(1.15); + filter: brightness(1.3) drop-shadow(0 0 8px rgba(34, 197, 94, 0.6)); + } +} + +@keyframes peopleWave { + 0%, + 100% { + transform: rotate(0deg) scale(1); + } + 25% { + transform: rotate(-5deg) scale(1.05); + } + 50% { + transform: rotate(5deg) scale(1.1); + } + 75% { + transform: rotate(-3deg) scale(1.05); + } +} + +@keyframes dataScan { + 0% { + transform: scale(1); + filter: brightness(1) drop-shadow(0 0 0 rgba(99, 102, 241, 0)); + } + 25% { + transform: scale(1.05); + filter: brightness(1.1) drop-shadow(0 0 4px rgba(99, 102, 241, 0.4)); + } + 50% { + transform: scale(1.1); + filter: brightness(1.2) drop-shadow(0 0 8px rgba(99, 102, 241, 0.6)); + } + 75% { + transform: scale(1.15) rotate(2deg); + filter: brightness(1.3) drop-shadow(0 0 12px rgba(99, 102, 241, 0.8)); + } + 100% { + transform: scale(1); + filter: brightness(1) drop-shadow(0 0 0 rgba(99, 102, 241, 0)); + } +} + +@keyframes screenGlow { + 0%, + 100% { + transform: scale(1); + filter: brightness(1) drop-shadow(0 0 0 rgba(59, 130, 246, 0)); + } + 50% { + transform: scale(1.1); + filter: brightness(1.2) drop-shadow(0 0 6px rgba(59, 130, 246, 0.5)); + } +} + +@keyframes libraryExpand { + 0% { + transform: translateY(-100%) scale(0.8); + opacity: 0; + } + 30% { + transform: translateY(-20%) scale(0.9); + opacity: 0.7; + } + 60% { + transform: translateY(5%) scale(1.05); + opacity: 1; + } + 80% { + transform: translateY(-2%) scale(1.02); + opacity: 1; + } + 100% { + transform: translateY(0%) scale(1); + opacity: 1; + } +} + +@keyframes templateMorph { + 0% { + transform: scale(1) rotate(0deg); + } + 25% { + transform: scale(1.05) rotate(-2deg) skewX(2deg); + } + 50% { + transform: scale(1.1) rotate(2deg) skewX(-2deg); + } + 75% { + transform: scale(1.05) rotate(-1deg) skewX(1deg); + } + 100% { + transform: scale(1) rotate(0deg) skewX(0deg); + } +} + +@keyframes communityRipple { + 0% { + transform: translateX(-100%) scale(0.8); + opacity: 0; + } + 30% { + transform: translateX(-20%) scale(0.9); + opacity: 0.7; + } + 60% { + transform: translateX(5%) scale(1.05); + opacity: 1; + } + 80% { + transform: translateX(-2%) scale(1.02); + opacity: 1; + } + 100% { + transform: translateX(0%) scale(1); + opacity: 1; + } +} + +@keyframes quizRoll { + 0% { + transform: scale(1) rotate(0deg); + } + 20% { + transform: scale(1.05) rotate(72deg); + } + 40% { + transform: scale(1.1) rotate(144deg); + } + 60% { + transform: scale(1.15) rotate(216deg); + } + 80% { + transform: scale(1.1) rotate(288deg); + } + 100% { + transform: scale(1) rotate(360deg); + } +} + +@keyframes audienceGather { + 0% { + transform: scale(1); + filter: brightness(1) drop-shadow(0 0 0 rgba(147, 51, 234, 0)); + } + 25% { + transform: scale(0.95) scaleX(1.1); + filter: brightness(1.05) drop-shadow(0 0 2px rgba(147, 51, 234, 0.3)); + } + 50% { + transform: scale(1.1) scaleX(0.9); + filter: brightness(1.1) drop-shadow(0 0 4px rgba(147, 51, 234, 0.5)); + } + 75% { + transform: scale(1.05) scaleX(1.05); + filter: brightness(1.05) drop-shadow(0 0 2px rgba(147, 51, 234, 0.3)); + } + 100% { + transform: scale(1) scaleX(1); + filter: brightness(1) drop-shadow(0 0 0 rgba(147, 51, 234, 0)); + } +} + +@keyframes setupConfigure { + 0% { + transform: scale(1) rotate(0deg); + } + 15% { + transform: scale(1.02) rotate(15deg); + } + 30% { + transform: scale(1.04) rotate(-10deg); + } + 45% { + transform: scale(1.06) rotate(20deg); + } + 60% { + transform: scale(1.08) rotate(-15deg); + } + 75% { + transform: scale(1.06) rotate(10deg); + } + 90% { + transform: scale(1.02) rotate(-5deg); + } + 100% { + transform: scale(1) rotate(0deg); + } +} diff --git a/apps/dashboard/src/app.html b/apps/dashboard/src/app.html index baba87df..0ade6572 100644 --- a/apps/dashboard/src/app.html +++ b/apps/dashboard/src/app.html @@ -1,33 +1,31 @@ -
- - - - - - - + + + + - - - - - + + + + - + + + + - + - %sveltekit.head% - + - -