├── .gitignore ├── .prettierrc ├── README.md ├── app.vue ├── assets └── css │ └── tailwind.css ├── components ├── AuthPage.vue ├── CardThreads.vue ├── CardThreadsSkeleton.vue ├── Chat │ ├── Bubble.vue │ └── StatusIcon.vue ├── CommentView.vue ├── Footer │ ├── Mobile.vue │ └── MobileItem.vue ├── FooterLinks.vue ├── ListThreads.vue ├── Loading │ └── Spinner.vue ├── MoreDialog.vue ├── NimueLogo.vue ├── Observer.vue ├── ReplyForm.vue ├── ShareDialog.vue ├── SplashScreen.vue └── Ui │ ├── AlertDialog │ ├── Action.vue │ ├── AlertDialog.vue │ ├── Cancel.vue │ ├── Content.vue │ ├── Description.vue │ ├── Footer.vue │ ├── Header.vue │ ├── Overlay.vue │ ├── Portal.vue │ ├── Title.vue │ └── Trigger.vue │ ├── Avatar │ ├── Avatar.vue │ ├── Fallback.vue │ └── Image.vue │ ├── Button.vue │ ├── Card │ ├── Card.vue │ ├── Content.vue │ ├── Description.vue │ ├── Footer.vue │ ├── Header.vue │ └── Title.vue │ ├── Container.vue │ ├── Dialog │ ├── Close.vue │ ├── Content.vue │ ├── Description.vue │ ├── Dialog.vue │ ├── Footer.vue │ ├── Header.vue │ ├── Overlay.vue │ ├── Portal.vue │ ├── Title.vue │ └── Trigger.vue │ ├── Divider.vue │ ├── DropdownMenu │ ├── Arrow.vue │ ├── CheckboxItem.vue │ ├── Content.vue │ ├── DropdownMenu.vue │ ├── Group.vue │ ├── Item.vue │ ├── ItemIndicator.vue │ ├── Label.vue │ ├── Portal.vue │ ├── RadioGroup.vue │ ├── RadioItem.vue │ ├── Separator.vue │ ├── Shortcut.vue │ ├── Sub.vue │ ├── SubContent.vue │ ├── SubTrigger.vue │ └── Trigger.vue │ ├── Form │ ├── Control.vue │ ├── Description.vue │ ├── Item.vue │ ├── Label.vue │ └── Message.vue │ ├── Input.vue │ ├── Label.vue │ ├── Navbar.vue │ ├── RadioGroup │ ├── Indicator.vue │ ├── Item.vue │ └── RadioGroup.vue │ ├── Skeleton.vue │ ├── Textarea.vue │ └── Toast │ ├── Action.vue │ ├── Close.vue │ ├── Description.vue │ ├── Provider.vue │ ├── Title.vue │ ├── Toast.vue │ ├── Toaster.vue │ └── Viewport.vue ├── composables ├── defineShortcuts.ts ├── useAuth.ts ├── useCommentService.ts ├── useDevice.ts ├── useFetchApi.ts ├── useFormField.ts ├── useMessage.ts ├── useNavRoute.ts ├── usePreferencesService.ts ├── useReport.ts ├── useShortcuts.ts ├── useSocket.ts ├── useTimelineService.ts ├── useToast.ts └── useUserService.ts ├── layouts ├── chat.vue ├── default.vue └── empty.vue ├── nuxt.config.ts ├── package.json ├── pages ├── [timeline_id].vue ├── about.vue ├── chats │ ├── [chat_id].vue │ └── index.vue ├── contact-us.vue ├── index.vue ├── login.vue ├── new.vue ├── privacy-policy.vue ├── register.vue ├── report │ └── [timeline_id].vue └── user-agreement.vue ├── public ├── apple-touch-icon-180x180.png ├── favicon.ico ├── firebase-messaging-sw.js ├── logo.svg ├── maskable-icon-512x512.png ├── pwa-192x192.png ├── pwa-512x512.png └── pwa-64x64.png ├── server └── tsconfig.json ├── tailwind.config.js ├── tsconfig.json ├── types ├── Chat.ts ├── ContentChat.ts ├── Conversation.ts ├── cloudinary.ts ├── comment.ts ├── index.ts ├── preferences.ts ├── timeline.ts └── user.ts ├── ui-thing.config.ts └── utils ├── index.ts └── shared.styles.ts /.gitignore: -------------------------------------------------------------------------------- 1 | # Nuxt dev/build outputs 2 | .output 3 | .data 4 | .nuxt 5 | .nitro 6 | .cache 7 | dist 8 | 9 | # Node dependencies 10 | node_modules 11 | package-lock.json 12 | 13 | # Logs 14 | logs 15 | *.log 16 | 17 | # Misc 18 | .DS_Store 19 | .fleet 20 | .idea 21 | 22 | # Local env files 23 | .env 24 | .env.* 25 | !.env.example 26 | 27 | .vscode 28 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "arrowParens": "always", 3 | "endOfLine": "lf", 4 | "plugins": ["@ianvs/prettier-plugin-sort-imports", "prettier-plugin-tailwindcss"], 5 | "printWidth": 100, 6 | "semi": true, 7 | "singleQuote": false, 8 | "tabWidth": 2, 9 | "trailingComma": "es5", 10 | "useTabs": false, 11 | "vueIndentScriptAndStyle": true, 12 | "tailwindFunctions": ["tv"], 13 | "importOrder": ["", "", "", "", "^[.]"] 14 | } 15 | 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Nuxt 3 Minimal Starter 2 | 3 | Look at the [Nuxt 3 documentation](https://nuxt.com/docs/getting-started/introduction) to learn more. 4 | 5 | ## Setup 6 | 7 | Make sure to install the dependencies: 8 | 9 | ```bash 10 | # npm 11 | npm install 12 | 13 | # pnpm 14 | pnpm install 15 | 16 | # yarn 17 | yarn install 18 | 19 | # bun 20 | bun install 21 | ``` 22 | 23 | ## Development Server 24 | 25 | Start the development server on `http://localhost:3000`: 26 | 27 | ```bash 28 | # npm 29 | npm run dev 30 | 31 | # pnpm 32 | pnpm run dev 33 | 34 | # yarn 35 | yarn dev 36 | 37 | # bun 38 | bun run dev 39 | ``` 40 | 41 | ## Production 42 | 43 | Build the application for production: 44 | 45 | ```bash 46 | # npm 47 | npm run build 48 | 49 | # pnpm 50 | pnpm run build 51 | 52 | # yarn 53 | yarn build 54 | 55 | # bun 56 | bun run build 57 | ``` 58 | 59 | Locally preview production build: 60 | 61 | ```bash 62 | # npm 63 | npm run preview 64 | 65 | # pnpm 66 | pnpm run preview 67 | 68 | # yarn 69 | yarn preview 70 | 71 | # bun 72 | bun run preview 73 | ``` 74 | 75 | Check out the [deployment documentation](https://nuxt.com/docs/getting-started/deployment) for more information. 76 | -------------------------------------------------------------------------------- /app.vue: -------------------------------------------------------------------------------- 1 | 40 | 41 | -------------------------------------------------------------------------------- /assets/css/tailwind.css: -------------------------------------------------------------------------------- 1 | @import url("https://rsms.me/inter/inter.css"); 2 | 3 | @tailwind base; 4 | @tailwind components; 5 | @tailwind utilities; 6 | 7 | @layer base { 8 | :root { 9 | --background: 0 0% 100%; 10 | --foreground: 222.2 84% 4.9%; 11 | --card: 0 0% 100%; 12 | --card-foreground: 222.2 84% 4.9%; 13 | --popover: 0 0% 100%; 14 | --popover-foreground: 222.2 84% 4.9%; 15 | --primary: 221.2 83.2% 53.3%; 16 | --primary-foreground: 210 40% 98%; 17 | --secondary: 210 40% 96.1%; 18 | --secondary-foreground: 222.2 47.4% 11.2%; 19 | --muted: 210 40% 96.1%; 20 | --muted-foreground: 215.4 16.3% 46.9%; 21 | --accent: 210 40% 96.1%; 22 | --accent-foreground: 222.2 47.4% 11.2%; 23 | --destructive: 0 84.2% 60.2%; 24 | --destructive-foreground: 210 40% 98%; 25 | --border: 214.3 31.8% 91.4%; 26 | --input: 214.3 31.8% 91.4%; 27 | --ring: 221.2 83.2% 53.3%; 28 | --radius: 0.5rem; 29 | } 30 | 31 | .dark { 32 | --background: 222.2 84% 4.9%; 33 | --foreground: 210 40% 98%; 34 | --card: 222.2 84% 4.9%; 35 | --card-foreground: 210 40% 98%; 36 | --popover: 222.2 84% 4.9%; 37 | --popover-foreground: 210 40% 98%; 38 | --primary: 217.2 91.2% 59.8%; 39 | --primary-foreground: 222.2 47.4% 11.2%; 40 | --secondary: 217.2 32.6% 17.5%; 41 | --secondary-foreground: 210 40% 98%; 42 | --muted: 217.2 32.6% 17.5%; 43 | --muted-foreground: 215 20.2% 65.1%; 44 | --accent: 217.2 32.6% 17.5%; 45 | --accent-foreground: 210 40% 98%; 46 | --destructive: 0 62.8% 30.6%; 47 | --destructive-foreground: 210 40% 98%; 48 | --border: 217.2 32.6% 17.5%; 49 | --input: 217.2 32.6% 17.5%; 50 | --ring: 224.3 76.3% 48%; 51 | } 52 | } 53 | 54 | @layer base { 55 | * { 56 | @apply border-border; 57 | } 58 | body { 59 | @apply bg-background text-foreground; 60 | font-feature-settings: 61 | "rlig" 1, 62 | "calt" 1; 63 | } 64 | } 65 | 66 | -------------------------------------------------------------------------------- /components/AuthPage.vue: -------------------------------------------------------------------------------- 1 | 70 | 71 | 132 | 133 | -------------------------------------------------------------------------------- /components/CardThreads.vue: -------------------------------------------------------------------------------- 1 | 67 | 68 | 130 | 131 | -------------------------------------------------------------------------------- /components/CardThreadsSkeleton.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /components/Chat/Bubble.vue: -------------------------------------------------------------------------------- 1 | 44 | 45 | 119 | 120 | -------------------------------------------------------------------------------- /components/Chat/StatusIcon.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | -------------------------------------------------------------------------------- /components/CommentView.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 35 | 36 | -------------------------------------------------------------------------------- /components/Footer/Mobile.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /components/Footer/MobileItem.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | -------------------------------------------------------------------------------- /components/FooterLinks.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | -------------------------------------------------------------------------------- /components/ListThreads.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 142 | 143 | -------------------------------------------------------------------------------- /components/Loading/Spinner.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /components/MoreDialog.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 65 | -------------------------------------------------------------------------------- /components/NimueLogo.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /components/Observer.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /components/ReplyForm.vue: -------------------------------------------------------------------------------- 1 | 2 | 45 | 46 | 90 | 91 | -------------------------------------------------------------------------------- /components/ShareDialog.vue: -------------------------------------------------------------------------------- 1 | 37 | 38 | 85 | -------------------------------------------------------------------------------- /components/SplashScreen.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /components/Ui/AlertDialog/Action.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 37 | -------------------------------------------------------------------------------- /components/Ui/AlertDialog/AlertDialog.vue: -------------------------------------------------------------------------------- 1 | 36 | 37 | 59 | -------------------------------------------------------------------------------- /components/Ui/AlertDialog/Cancel.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 37 | -------------------------------------------------------------------------------- /components/Ui/AlertDialog/Content.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 36 | -------------------------------------------------------------------------------- /components/Ui/AlertDialog/Description.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 27 | -------------------------------------------------------------------------------- /components/Ui/AlertDialog/Footer.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 26 | -------------------------------------------------------------------------------- /components/Ui/AlertDialog/Header.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 27 | -------------------------------------------------------------------------------- /components/Ui/AlertDialog/Overlay.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 23 | -------------------------------------------------------------------------------- /components/Ui/AlertDialog/Portal.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 13 | -------------------------------------------------------------------------------- /components/Ui/AlertDialog/Title.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 24 | -------------------------------------------------------------------------------- /components/Ui/AlertDialog/Trigger.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 13 | -------------------------------------------------------------------------------- /components/Ui/Avatar/Avatar.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 44 | -------------------------------------------------------------------------------- /components/Ui/Avatar/Fallback.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 28 | -------------------------------------------------------------------------------- /components/Ui/Avatar/Image.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 23 | -------------------------------------------------------------------------------- /components/Ui/Button.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 50 | -------------------------------------------------------------------------------- /components/Ui/Card/Card.vue: -------------------------------------------------------------------------------- 1 | 26 | 27 | 53 | -------------------------------------------------------------------------------- /components/Ui/Card/Content.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 28 | -------------------------------------------------------------------------------- /components/Ui/Card/Description.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 30 | -------------------------------------------------------------------------------- /components/Ui/Card/Footer.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 25 | -------------------------------------------------------------------------------- /components/Ui/Card/Header.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 25 | -------------------------------------------------------------------------------- /components/Ui/Card/Title.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 31 | -------------------------------------------------------------------------------- /components/Ui/Container.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 26 | -------------------------------------------------------------------------------- /components/Ui/Dialog/Close.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 13 | -------------------------------------------------------------------------------- /components/Ui/Dialog/Content.vue: -------------------------------------------------------------------------------- 1 | 32 | 33 | 64 | -------------------------------------------------------------------------------- /components/Ui/Dialog/Description.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 27 | -------------------------------------------------------------------------------- /components/Ui/Dialog/Dialog.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /components/Ui/Dialog/Footer.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 27 | -------------------------------------------------------------------------------- /components/Ui/Dialog/Header.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 27 | -------------------------------------------------------------------------------- /components/Ui/Dialog/Overlay.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 19 | -------------------------------------------------------------------------------- /components/Ui/Dialog/Portal.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 13 | -------------------------------------------------------------------------------- /components/Ui/Dialog/Title.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 27 | -------------------------------------------------------------------------------- /components/Ui/Dialog/Trigger.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 13 | -------------------------------------------------------------------------------- /components/Ui/Divider.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 78 | -------------------------------------------------------------------------------- /components/Ui/DropdownMenu/Arrow.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 30 | -------------------------------------------------------------------------------- /components/Ui/DropdownMenu/CheckboxItem.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 36 | -------------------------------------------------------------------------------- /components/Ui/DropdownMenu/Content.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 42 | -------------------------------------------------------------------------------- /components/Ui/DropdownMenu/DropdownMenu.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | -------------------------------------------------------------------------------- /components/Ui/DropdownMenu/Group.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 13 | -------------------------------------------------------------------------------- /components/Ui/DropdownMenu/Item.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 51 | -------------------------------------------------------------------------------- /components/Ui/DropdownMenu/ItemIndicator.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 19 | -------------------------------------------------------------------------------- /components/Ui/DropdownMenu/Label.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 29 | -------------------------------------------------------------------------------- /components/Ui/DropdownMenu/Portal.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 13 | -------------------------------------------------------------------------------- /components/Ui/DropdownMenu/RadioGroup.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 17 | -------------------------------------------------------------------------------- /components/Ui/DropdownMenu/RadioItem.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 35 | -------------------------------------------------------------------------------- /components/Ui/DropdownMenu/Separator.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 23 | -------------------------------------------------------------------------------- /components/Ui/DropdownMenu/Shortcut.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 27 | -------------------------------------------------------------------------------- /components/Ui/DropdownMenu/Sub.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /components/Ui/DropdownMenu/SubContent.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 42 | -------------------------------------------------------------------------------- /components/Ui/DropdownMenu/SubTrigger.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 45 | -------------------------------------------------------------------------------- /components/Ui/DropdownMenu/Trigger.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 13 | -------------------------------------------------------------------------------- /components/Ui/Form/Control.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /components/Ui/Form/Description.vue: -------------------------------------------------------------------------------- 1 | 10 | 17 | -------------------------------------------------------------------------------- /components/Ui/Form/Item.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 25 | 26 | 44 | -------------------------------------------------------------------------------- /components/Ui/Form/Label.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 32 | -------------------------------------------------------------------------------- /components/Ui/Form/Message.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 13 | -------------------------------------------------------------------------------- /components/Ui/Input.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 28 | -------------------------------------------------------------------------------- /components/Ui/Label.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 22 | -------------------------------------------------------------------------------- /components/Ui/Navbar.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 32 | -------------------------------------------------------------------------------- /components/Ui/RadioGroup/Indicator.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 29 | -------------------------------------------------------------------------------- /components/Ui/RadioGroup/Item.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 29 | -------------------------------------------------------------------------------- /components/Ui/RadioGroup/RadioGroup.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 29 | -------------------------------------------------------------------------------- /components/Ui/Skeleton.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 35 | -------------------------------------------------------------------------------- /components/Ui/Textarea.vue: -------------------------------------------------------------------------------- 1 |