diff --git a/.zed/settings.json b/.zed/settings.json index 79d04df2..047e5afd 100644 --- a/.zed/settings.json +++ b/.zed/settings.json @@ -14,11 +14,8 @@ }, "default_profile": "write" }, - "features": { - "edit_prediction_provider": "copilot" - }, "language_servers": ["!eslint", "..."], - "format_on_save": "off", + "format_on_save": "on", "autosave": { "after_delay": { "milliseconds": 1000 diff --git a/apps/app/.env.example b/apps/app/.env.example new file mode 100644 index 00000000..9b836bbd --- /dev/null +++ b/apps/app/.env.example @@ -0,0 +1,19 @@ +# +# Application +# + +NUXT_PUBLIC_BASE_URL=http://localhost:4000 + +# +# Supabase +# + +SUPABASE_URL= +SUPABASE_KEY= + +# +# Posthog +# + +NUXT_PUBLIC_POSTHOG_KEY=phc_Vu3wqbMj8M5iWzvEulIXlK5U0A3hqkb5rlVM1DLtZsb +NUXT_PUBLIC_POSTHOG_HOST= diff --git a/apps/app/.gitignore b/apps/app/.gitignore new file mode 100644 index 00000000..4a7f73a2 --- /dev/null +++ b/apps/app/.gitignore @@ -0,0 +1,24 @@ +# Nuxt dev/build outputs +.output +.data +.nuxt +.nitro +.cache +dist + +# Node dependencies +node_modules + +# Logs +logs +*.log + +# Misc +.DS_Store +.fleet +.idea + +# Local env files +.env +.env.* +!.env.example diff --git a/apps/app/CHANGELOG.md b/apps/app/CHANGELOG.md new file mode 100644 index 00000000..ccb29139 --- /dev/null +++ b/apps/app/CHANGELOG.md @@ -0,0 +1 @@ +# @styleframe/app diff --git a/apps/app/LICENSE b/apps/app/LICENSE new file mode 100644 index 00000000..a16d6bda --- /dev/null +++ b/apps/app/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Alex Grozav + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/apps/app/app/api/license.ts b/apps/app/app/api/license.ts new file mode 100644 index 00000000..c266d2e4 --- /dev/null +++ b/apps/app/app/api/license.ts @@ -0,0 +1,45 @@ +import type { SupabaseClient } from "@supabase/supabase-js"; + +export interface ActivateLicenseRequest { + label: string; + key: string; +} + +export interface ActivateLicenseResponse { + success: boolean; + message?: string; + error?: string; +} + +export async function activateLicense( + supabase: SupabaseClient, + data: ActivateLicenseRequest, +): Promise { + try { + const { data: response, error } = + await supabase.functions.invoke( + "activate-license", + { + body: { + label: data.label, + key: data.key, + }, + }, + ); + + if (error) { + return { + success: false, + error: error.message || "Failed to activate license", + }; + } + + return response || { success: false, error: "No response from server" }; + } catch (err) { + return { + success: false, + error: + err instanceof Error ? err.message : "An unexpected error occurred", + }; + } +} diff --git a/apps/app/app/app.vue b/apps/app/app/app.vue new file mode 100644 index 00000000..afb49a9a --- /dev/null +++ b/apps/app/app/app.vue @@ -0,0 +1,52 @@ + + + diff --git a/apps/app/app/components/IconMenuToggle.vue b/apps/app/app/components/IconMenuToggle.vue new file mode 100644 index 00000000..29744481 --- /dev/null +++ b/apps/app/app/components/IconMenuToggle.vue @@ -0,0 +1,79 @@ + + + diff --git a/apps/app/app/components/LanguageSelect.vue b/apps/app/app/components/LanguageSelect.vue new file mode 100644 index 00000000..0c292ae3 --- /dev/null +++ b/apps/app/app/components/LanguageSelect.vue @@ -0,0 +1,74 @@ + + + diff --git a/apps/app/app/components/LicenseActivationCard.vue b/apps/app/app/components/LicenseActivationCard.vue new file mode 100644 index 00000000..7db596f7 --- /dev/null +++ b/apps/app/app/components/LicenseActivationCard.vue @@ -0,0 +1,106 @@ + + + diff --git a/apps/app/app/components/app/AppFooter.vue b/apps/app/app/components/app/AppFooter.vue new file mode 100644 index 00000000..1d893f9a --- /dev/null +++ b/apps/app/app/components/app/AppFooter.vue @@ -0,0 +1,13 @@ + diff --git a/apps/app/app/components/app/AppFooterCenter.vue b/apps/app/app/components/app/AppFooterCenter.vue new file mode 100644 index 00000000..8f5eaf9b --- /dev/null +++ b/apps/app/app/components/app/AppFooterCenter.vue @@ -0,0 +1,20 @@ + + + diff --git a/apps/app/app/components/app/AppFooterLeft.vue b/apps/app/app/components/app/AppFooterLeft.vue new file mode 100644 index 00000000..f9ddc27d --- /dev/null +++ b/apps/app/app/components/app/AppFooterLeft.vue @@ -0,0 +1,5 @@ + diff --git a/apps/app/app/components/app/AppFooterRight.vue b/apps/app/app/components/app/AppFooterRight.vue new file mode 100644 index 00000000..758020ad --- /dev/null +++ b/apps/app/app/components/app/AppFooterRight.vue @@ -0,0 +1,33 @@ + + + diff --git a/apps/app/app/components/app/AppHeader.vue b/apps/app/app/components/app/AppHeader.vue new file mode 100644 index 00000000..9fe627cf --- /dev/null +++ b/apps/app/app/components/app/AppHeader.vue @@ -0,0 +1,79 @@ + + + diff --git a/apps/app/app/components/app/AppHeaderBody.vue b/apps/app/app/components/app/AppHeaderBody.vue new file mode 100644 index 00000000..e803f762 --- /dev/null +++ b/apps/app/app/components/app/AppHeaderBody.vue @@ -0,0 +1,9 @@ + + + diff --git a/apps/app/app/components/app/AppHeaderCTA.vue b/apps/app/app/components/app/AppHeaderCTA.vue new file mode 100644 index 00000000..04d1816d --- /dev/null +++ b/apps/app/app/components/app/AppHeaderCTA.vue @@ -0,0 +1,11 @@ + + + diff --git a/apps/app/app/components/app/AppHeaderCenter.vue b/apps/app/app/components/app/AppHeaderCenter.vue new file mode 100644 index 00000000..94fac07d --- /dev/null +++ b/apps/app/app/components/app/AppHeaderCenter.vue @@ -0,0 +1,3 @@ + diff --git a/apps/app/app/components/app/AppHeaderLogo.vue b/apps/app/app/components/app/AppHeaderLogo.vue new file mode 100644 index 00000000..9894b47f --- /dev/null +++ b/apps/app/app/components/app/AppHeaderLogo.vue @@ -0,0 +1,16 @@ + + + diff --git a/apps/app/app/composables/useAppI18n.ts b/apps/app/app/composables/useAppI18n.ts new file mode 100644 index 00000000..f39d7b44 --- /dev/null +++ b/apps/app/app/composables/useAppI18n.ts @@ -0,0 +1,38 @@ +import type { LocaleObject } from "@nuxtjs/i18n"; +import en from "~~/i18n/locales/en.json"; + +export const useAppI18n = () => { + const config = useRuntimeConfig().public; + const isEnabled = ref(!!config.i18n); + + if (!isEnabled.value) { + return { + isEnabled, + locale: ref("en"), + locales: [], + localePath: (path: string) => path, + switchLocalePath: () => {}, + t: (key: string): string => { + const path = key.split("."); + return path.reduce( + (acc: unknown, curr) => (acc as Record)?.[curr], + en, + ) as string; + }, + }; + } + + const { locale, t } = useI18n(); + const filteredLocales = + (config.docus as { filteredLocales: LocaleObject[] }) + ?.filteredLocales || []; + + return { + isEnabled, + locale, + locales: filteredLocales, + t, + localePath: useLocalePath(), + switchLocalePath: useSwitchLocalePath(), + }; +}; diff --git a/apps/app/app/error.vue b/apps/app/app/error.vue new file mode 100644 index 00000000..4bf71802 --- /dev/null +++ b/apps/app/app/error.vue @@ -0,0 +1,57 @@ + + + diff --git a/apps/app/app/layouts/auth.vue b/apps/app/app/layouts/auth.vue new file mode 100644 index 00000000..2b9c6fa1 --- /dev/null +++ b/apps/app/app/layouts/auth.vue @@ -0,0 +1,14 @@ + diff --git a/apps/app/app/layouts/default.vue b/apps/app/app/layouts/default.vue new file mode 100644 index 00000000..26a3fb6b --- /dev/null +++ b/apps/app/app/layouts/default.vue @@ -0,0 +1,51 @@ + + + diff --git a/apps/app/app/pages/confirm.vue b/apps/app/app/pages/confirm.vue new file mode 100644 index 00000000..2823ad9f --- /dev/null +++ b/apps/app/app/pages/confirm.vue @@ -0,0 +1,70 @@ + + + diff --git a/apps/app/app/pages/forgot-password.vue b/apps/app/app/pages/forgot-password.vue new file mode 100644 index 00000000..bb5c6b45 --- /dev/null +++ b/apps/app/app/pages/forgot-password.vue @@ -0,0 +1,70 @@ + + + diff --git a/apps/app/app/pages/index.vue b/apps/app/app/pages/index.vue new file mode 100644 index 00000000..988a0701 --- /dev/null +++ b/apps/app/app/pages/index.vue @@ -0,0 +1,14 @@ + + + diff --git a/apps/app/app/pages/login.vue b/apps/app/app/pages/login.vue new file mode 100644 index 00000000..71d52fd6 --- /dev/null +++ b/apps/app/app/pages/login.vue @@ -0,0 +1,107 @@ + + + diff --git a/apps/app/app/pages/logout.vue b/apps/app/app/pages/logout.vue new file mode 100644 index 00000000..ff7742fa --- /dev/null +++ b/apps/app/app/pages/logout.vue @@ -0,0 +1,60 @@ + + + diff --git a/apps/app/app/pages/reset-password.vue b/apps/app/app/pages/reset-password.vue new file mode 100644 index 00000000..204e0e13 --- /dev/null +++ b/apps/app/app/pages/reset-password.vue @@ -0,0 +1,89 @@ + + + diff --git a/apps/app/app/pages/signup.vue b/apps/app/app/pages/signup.vue new file mode 100644 index 00000000..3a5d76ca --- /dev/null +++ b/apps/app/app/pages/signup.vue @@ -0,0 +1,169 @@ + + + diff --git a/apps/app/app/schema.d.ts b/apps/app/app/schema.d.ts new file mode 100644 index 00000000..48768ebf --- /dev/null +++ b/apps/app/app/schema.d.ts @@ -0,0 +1,41 @@ +declare module "nuxt/schema" { + interface AppConfig { + seo: { + titleTemplate: string; + title: string; + description: string; + }; + header: { + title: string; + logo: { + light: string; + dark: string; + alt: string; + }; + }; + socials: Record; + toc: { + title: string; + bottom: { + title: string; + links: { + icon: string; + label: string; + to: string; + target: string; + }[]; + }; + }; + github: + | { + owner: string; + name: string; + url: string; + branch: string; + rootDir?: string; + } + | false; + } +} + +export {}; diff --git a/apps/app/app/shims.d.ts b/apps/app/app/shims.d.ts new file mode 100644 index 00000000..d10e8f77 --- /dev/null +++ b/apps/app/app/shims.d.ts @@ -0,0 +1 @@ +/// diff --git a/apps/app/app/types/database.types.ts b/apps/app/app/types/database.types.ts new file mode 100644 index 00000000..e69de29b diff --git a/apps/app/app/types/index.ts b/apps/app/app/types/index.ts new file mode 100644 index 00000000..c5d62fdf --- /dev/null +++ b/apps/app/app/types/index.ts @@ -0,0 +1 @@ +export * from "./database.types"; diff --git a/apps/app/i18n/locales/ar.json b/apps/app/i18n/locales/ar.json new file mode 100644 index 00000000..649c8f7f --- /dev/null +++ b/apps/app/i18n/locales/ar.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "أو", + "error": { + "title": "الصفحة غير موجودة", + "description": "نأسف، لكن الصفحة التي تبحث عنها غير موجودة." + } + }, + "docs": { + "copy": { + "page": "نسخ الصفحة", + "link": "نسخ صفحة Markdown", + "view": "عرض كـ Markdown", + "gpt": "فتح في ChatGPT", + "claude": "فتح في Claude" + }, + "links": "المجتمع", + "toc": "في هذه الصفحة", + "report": "الإبلاغ عن مشكلة", + "edit": "تحرير هذه الصفحة" + } +} diff --git a/apps/app/i18n/locales/be.json b/apps/app/i18n/locales/be.json new file mode 100644 index 00000000..45689ad8 --- /dev/null +++ b/apps/app/i18n/locales/be.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "або", + "error": { + "title": "Старонка не знойдзена", + "description": "Прабачце, але старонка, якую вы шукаеце, не знойдзена." + } + }, + "docs": { + "copy": { + "page": "Скапіраваць старонку", + "link": "Скапіраваць Markdown-старонку", + "view": "Праглядзець як Markdown", + "gpt": "Адкрыць у ChatGPT", + "claude": "Адкрыць у Claude" + }, + "links": "Супольнасць", + "toc": "На гэтай старонцы", + "report": "Паведаміць пра праблему", + "edit": "Рэдагаваць гэтую старонку" + } +} diff --git a/apps/app/i18n/locales/bn.json b/apps/app/i18n/locales/bn.json new file mode 100644 index 00000000..58c17a48 --- /dev/null +++ b/apps/app/i18n/locales/bn.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "অথবা", + "error": { + "title": "পেজ খুঁজে পাওয়া যায়নি", + "description": "দুঃখিত, আপনি যে পেজটি খুঁজছেন সেটি পাওয়া যায়নি।" + } + }, + "docs": { + "copy": { + "page": "পেজ কপি করুন", + "link": "Markdown পেজ কপি করুন", + "view": "Markdown হিসেবে দেখুন", + "gpt": "ChatGPT এ খুলুন", + "claude": "Claude এ খুলুন" + }, + "links": "কমিউনিটি", + "toc": "এই পেজে", + "report": "সমস্যা রিপোর্ট করুন", + "edit": "এই পেজ সম্পাদনা করুন" + } +} diff --git a/apps/app/i18n/locales/ca.json b/apps/app/i18n/locales/ca.json new file mode 100644 index 00000000..1fabc59d --- /dev/null +++ b/apps/app/i18n/locales/ca.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "o", + "error": { + "title": "Pàgina no trobada", + "description": "Ho sentim, però la pàgina que cerques no existeix." + } + }, + "docs": { + "copy": { + "page": "Copiar pàgina", + "link": "Copiar pàgina Markdown", + "view": "Veure com a Markdown", + "gpt": "Obrir a ChatGPT", + "claude": "Obrir a Claude" + }, + "links": "Comunitat", + "toc": "En aquesta pàgina", + "report": "Informar d'un problema", + "edit": "Editar aquesta pàgina" + } +} diff --git a/apps/app/i18n/locales/ckb.json b/apps/app/i18n/locales/ckb.json new file mode 100644 index 00000000..244a6cdc --- /dev/null +++ b/apps/app/i18n/locales/ckb.json @@ -0,0 +1,18 @@ +{ + "common": { + "or": "یان" + }, + "docs": { + "copy": { + "page": "کۆپیکردنی پەڕە", + "link": "کۆپیکردنی پەڕەی Markdown", + "view": "بینین وەک Markdown", + "gpt": "کردنەوە لە ChatGPT", + "claude": "کردنەوە لە Claude" + }, + "links": "کۆمەڵگا", + "toc": "لەم پەڕەدا", + "report": "ڕاپۆرتکردنی کێشە", + "edit": "دەستکاریکردنی ئەم پەڕەیە" + } +} diff --git a/apps/app/i18n/locales/cs.json b/apps/app/i18n/locales/cs.json new file mode 100644 index 00000000..bc289800 --- /dev/null +++ b/apps/app/i18n/locales/cs.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "nebo", + "error": { + "title": "Stránka nenalezena", + "description": "Je nám líto, ale stránka, kterou hledáte, nebyla nalezena." + } + }, + "docs": { + "copy": { + "page": "Kopírovat stránku", + "link": "Kopírovat Markdown stránku", + "view": "Zobrazit jako Markdown", + "gpt": "Otevřít v ChatGPT", + "claude": "Otevřít v Claude" + }, + "links": "Komunita", + "toc": "Na této stránce", + "report": "Nahlásit problém", + "edit": "Upravit tuto stránku" + } +} diff --git a/apps/app/i18n/locales/da.json b/apps/app/i18n/locales/da.json new file mode 100644 index 00000000..7b70301d --- /dev/null +++ b/apps/app/i18n/locales/da.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "eller", + "error": { + "title": "Side ikke fundet", + "description": "Vi beklager, men siden du leder efter kunne ikke findes." + } + }, + "docs": { + "copy": { + "page": "Kopier side", + "link": "Kopier Markdown side", + "view": "Vis som Markdown", + "gpt": "Åbn i ChatGPT", + "claude": "Åbn i Claude" + }, + "links": "Fællesskab", + "toc": "På denne side", + "report": "Rapporter et problem", + "edit": "Rediger denne side" + } +} diff --git a/apps/app/i18n/locales/de.json b/apps/app/i18n/locales/de.json new file mode 100644 index 00000000..982868de --- /dev/null +++ b/apps/app/i18n/locales/de.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "oder", + "error": { + "title": "Seite nicht gefunden", + "description": "Es tut uns leid, aber diese Seite konnte nicht gefunden werden." + } + }, + "docs": { + "copy": { + "page": "Seite kopieren", + "link": "Markdown-Seite kopieren", + "view": "Als Markdown anzeigen", + "gpt": "In ChatGPT öffnen", + "claude": "In Claude öffnen" + }, + "links": "Community", + "toc": "Auf dieser Seite", + "report": "Problem melden", + "edit": "Diese Seite bearbeiten" + } +} diff --git a/apps/app/i18n/locales/el.json b/apps/app/i18n/locales/el.json new file mode 100644 index 00000000..f7127575 --- /dev/null +++ b/apps/app/i18n/locales/el.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "ή", + "error": { + "title": "Η σελίδα δεν βρέθηκε", + "description": "Λυπούμαστε, αλλά η σελίδα που αναζητάτε δεν υπάρχει." + } + }, + "docs": { + "copy": { + "page": "Αντιγραφή σελίδας", + "link": "Αντιγραφή σελίδας Markdown", + "view": "Προβολή ως Markdown", + "gpt": "Άνοιγμα στο ChatGPT", + "claude": "Άνοιγμα στο Claude" + }, + "links": "Κοινότητα", + "toc": "Σε αυτή τη σελίδα", + "report": "Αναφορά προβλήματος", + "edit": "Επεξεργασία αυτής της σελίδας" + } +} diff --git a/apps/app/i18n/locales/en.json b/apps/app/i18n/locales/en.json new file mode 100644 index 00000000..cc455e01 --- /dev/null +++ b/apps/app/i18n/locales/en.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "or", + "error": { + "title": "Page not found", + "description": "We are sorry but this page could not be found." + } + }, + "docs": { + "copy": { + "page": "Copy page", + "link": "Copy Markdown page", + "view": "View as Markdown", + "gpt": "Open in ChatGPT", + "claude": "Open in Claude" + }, + "links": "Community", + "toc": "On this page", + "report": "Report an issue", + "edit": "Edit this page" + } +} diff --git a/apps/app/i18n/locales/et.json b/apps/app/i18n/locales/et.json new file mode 100644 index 00000000..b5776c4e --- /dev/null +++ b/apps/app/i18n/locales/et.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "või", + "error": { + "title": "Lehekülge ei leitud", + "description": "Vabandame, kuid otsitavat lehekülge ei leitud." + } + }, + "docs": { + "copy": { + "page": "Kopeeri lehekülg", + "link": "Kopeeri Markdown lehekülg", + "view": "Vaata Markdownina", + "gpt": "Ava ChatGPT-s", + "claude": "Ava Claude'is" + }, + "links": "Kogukond", + "toc": "Sellel lehel", + "report": "Teata probleemist", + "edit": "Muuda seda lehekülge" + } +} diff --git a/apps/app/i18n/locales/fr.json b/apps/app/i18n/locales/fr.json new file mode 100644 index 00000000..b08b7734 --- /dev/null +++ b/apps/app/i18n/locales/fr.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "ou", + "error": { + "title": "Page non trouvée", + "description": "Nous sommes désolés, mais la page que vous cherchez n'existe pas." + } + }, + "docs": { + "copy": { + "page": "Copier la page", + "link": "Copier le lien Markdown", + "view": "Voir en Markdown", + "gpt": "Ouvrir dans ChatGPT", + "claude": "Ouvrir dans Claude" + }, + "links": "Communauté", + "toc": "Sur cette page", + "report": "Signaler un problème", + "edit": "Éditer cette page" + } +} diff --git a/apps/app/i18n/locales/he.json b/apps/app/i18n/locales/he.json new file mode 100644 index 00000000..381a5b8e --- /dev/null +++ b/apps/app/i18n/locales/he.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "או", + "error": { + "title": "העמוד לא נמצא", + "description": "אנו מתנצלים, אך העמוד שאתה מחפש לא קיים." + } + }, + "docs": { + "copy": { + "page": "העתק עמוד", + "link": "העתק עמוד Markdown", + "view": "הצג כ-Markdown", + "gpt": "פתח ב-ChatGPT", + "claude": "פתח ב-Claude" + }, + "links": "קהילה", + "toc": "בעמוד זה", + "report": "דווח על בעיה", + "edit": "ערוך עמוד זה" + } +} diff --git a/apps/app/i18n/locales/hi.json b/apps/app/i18n/locales/hi.json new file mode 100644 index 00000000..4c458934 --- /dev/null +++ b/apps/app/i18n/locales/hi.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "या", + "error": { + "title": "पृष्ठ नहीं मिला", + "description": "हमें खुशी है, लेकिन आप जो पृष्ठ खोज रहे हैं वह मौजूद नहीं है।" + } + }, + "docs": { + "copy": { + "page": "पृष्ठ कॉपी करें", + "link": "Markdown पृष्ठ कॉपी करें", + "view": "Markdown के रूप में देखें", + "gpt": "ChatGPT में खोलें", + "claude": "Claude में खोलें" + }, + "links": "समुदाय", + "toc": "इस पृष्ठ पर", + "report": "समस्या की रिपोर्ट करें", + "edit": "इस पृष्ठ को संपादित करें" + } +} diff --git a/apps/app/i18n/locales/hy.json b/apps/app/i18n/locales/hy.json new file mode 100644 index 00000000..54ebe471 --- /dev/null +++ b/apps/app/i18n/locales/hy.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "կամ", + "error": { + "title": "Էջը չի գտնվել", + "description": "Ներողություն, բայց այն էջը, որը փնտրում եք, չի գտնվել:" + } + }, + "docs": { + "copy": { + "page": "Պատճենել էջը", + "link": "Պատճենել Markdown էջը", + "view": "Դիտել որպես Markdown", + "gpt": "Բացել ChatGPT-ում", + "claude": "Բացել Claude-ում" + }, + "links": "Համայնք", + "toc": "Այս էջում", + "report": "Հաղորդել խնդրի մասին", + "edit": "Խմբագրել այս էջը" + } +} diff --git a/apps/app/i18n/locales/it.json b/apps/app/i18n/locales/it.json new file mode 100644 index 00000000..98f36b9d --- /dev/null +++ b/apps/app/i18n/locales/it.json @@ -0,0 +1,18 @@ +{ + "common": { + "or": "o" + }, + "docs": { + "copy": { + "page": "Copia pagina", + "link": "Copia pagina Markdown", + "view": "Visualizza come Markdown", + "gpt": "Apri in ChatGPT", + "claude": "Apri in Claude" + }, + "links": "Comunità", + "toc": "In questa pagina", + "report": "Segnala un problema", + "edit": "Modifica questa pagina" + } +} diff --git a/apps/app/i18n/locales/ja.json b/apps/app/i18n/locales/ja.json new file mode 100644 index 00000000..bbb0e67c --- /dev/null +++ b/apps/app/i18n/locales/ja.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "または", + "error": { + "title": "ページが見つかりません", + "description": "申し訳ございませんが、お探しのページは見つかりませんでした。" + } + }, + "docs": { + "copy": { + "page": "ページをコピー", + "link": "Markdownページをコピー", + "view": "Markdownとして表示", + "gpt": "ChatGPTで開く", + "claude": "Claudeで開く" + }, + "links": "コミュニティ", + "toc": "このページの内容", + "report": "問題を報告", + "edit": "このページを編集" + } +} diff --git a/apps/app/i18n/locales/kk.json b/apps/app/i18n/locales/kk.json new file mode 100644 index 00000000..cd88bb66 --- /dev/null +++ b/apps/app/i18n/locales/kk.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "немесе", + "error": { + "title": "Бет табылмады", + "description": "Кешіріңіз, бірақ сіз іздеген бет табылмады." + } + }, + "docs": { + "copy": { + "page": "Бетті көшіру", + "link": "Markdown бетін көшіру", + "view": "Markdown ретінде көру", + "gpt": "ChatGPT-те ашу", + "claude": "Claude-те ашу" + }, + "links": "Қауымдастық", + "toc": "Осы бетте", + "report": "Мәселе туралы хабарлау", + "edit": "Осы бетті өңдеу" + } +} diff --git a/apps/app/i18n/locales/km.json b/apps/app/i18n/locales/km.json new file mode 100644 index 00000000..54aaa0c3 --- /dev/null +++ b/apps/app/i18n/locales/km.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "ឬ", + "error": { + "title": "រកមិនឃើញទំព័រ", + "description": "យើងសុំទោស ប៉ុន្តែទំព័រដែលអ្នកកំពុងស្វែងរកមិនអាចរកឃើញទេ។" + } + }, + "docs": { + "copy": { + "page": "ចម្លងទំព័រ", + "link": "ចម្លងទំព័រ Markdown", + "view": "មើលជា Markdown", + "gpt": "បើកនៅ ChatGPT", + "claude": "បើកនៅ Claude" + }, + "links": "សហគមន៍", + "toc": "នៅលើទំព័រនេះ", + "report": "រាយការណ៍បញ្ហា", + "edit": "កែសម្រួលទំព័រនេះ" + } +} diff --git a/apps/app/i18n/locales/ko.json b/apps/app/i18n/locales/ko.json new file mode 100644 index 00000000..6d67e47e --- /dev/null +++ b/apps/app/i18n/locales/ko.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "또는", + "error": { + "title": "페이지를 찾을 수 없습니다", + "description": "죄송합니다. 찾고 계신 페이지를 찾을 수 없습니다." + } + }, + "docs": { + "copy": { + "page": "페이지 복사", + "link": "Markdown 페이지 복사", + "view": "Markdown으로 보기", + "gpt": "ChatGPT에서 열기", + "claude": "Claude에서 열기" + }, + "links": "커뮤니티", + "toc": "이 페이지에서", + "report": "문제 신고", + "edit": "이 페이지 편집" + } +} diff --git a/apps/app/i18n/locales/ky.json b/apps/app/i18n/locales/ky.json new file mode 100644 index 00000000..bbe50899 --- /dev/null +++ b/apps/app/i18n/locales/ky.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "же", + "error": { + "title": "Барак табылган жок", + "description": "Кечиресиз, бирок сиз издеген барак табылган жок." + } + }, + "docs": { + "copy": { + "page": "Баракты көчүрүү", + "link": "Markdown барагын көчүрүү", + "view": "Markdown катары көрүү", + "gpt": "ChatGPT'те ачуу", + "claude": "Claude'да ачуу" + }, + "links": "Коом", + "toc": "Бул барактта", + "report": "Көйгөй туурасында кабарлоо", + "edit": "Бул баракты түзөтүү" + } +} diff --git a/apps/app/i18n/locales/lb.json b/apps/app/i18n/locales/lb.json new file mode 100644 index 00000000..9817c64c --- /dev/null +++ b/apps/app/i18n/locales/lb.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "oder", + "error": { + "title": "Säit net fonnt", + "description": "Et deet ons leed, awer d'Säit déi Dir sicht gëtt et net." + } + }, + "docs": { + "copy": { + "page": "Säit kopéieren", + "link": "Markdown Säit kopéieren", + "view": "Als Markdown kucken", + "gpt": "An ChatGPT opmaachen", + "claude": "An Claude opmaachen" + }, + "links": "Gemeinschaft", + "toc": "Op dëser Säit", + "report": "Problem mellen", + "edit": "Dës Säit änneren" + } +} diff --git a/apps/app/i18n/locales/ms.json b/apps/app/i18n/locales/ms.json new file mode 100644 index 00000000..851e80a6 --- /dev/null +++ b/apps/app/i18n/locales/ms.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "atau", + "error": { + "title": "Halaman tidak dijumpai", + "description": "Kami mohon maaf, tetapi halaman yang anda cari tidak dapat dijumpai." + } + }, + "docs": { + "copy": { + "page": "Salin halaman", + "link": "Salin halaman Markdown", + "view": "Lihat sebagai Markdown", + "gpt": "Buka di ChatGPT", + "claude": "Buka di Claude" + }, + "links": "Komuniti", + "toc": "Dalam halaman ini", + "report": "Laporkan masalah", + "edit": "Edit halaman ini" + } +} diff --git a/apps/app/i18n/locales/nb.json b/apps/app/i18n/locales/nb.json new file mode 100644 index 00000000..62f58523 --- /dev/null +++ b/apps/app/i18n/locales/nb.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "eller", + "error": { + "title": "Side ikke funnet", + "description": "Vi beklager, men siden du leter etter kunne ikke finnes." + } + }, + "docs": { + "copy": { + "page": "Kopier side", + "link": "Kopier Markdown-side", + "view": "Vis som Markdown", + "gpt": "Åpne i ChatGPT", + "claude": "Åpne i Claude" + }, + "links": "Fellesskap", + "toc": "På denne siden", + "report": "Rapporter et problem", + "edit": "Rediger denne siden" + } +} diff --git a/apps/app/i18n/locales/pl.json b/apps/app/i18n/locales/pl.json new file mode 100644 index 00000000..84e2829b --- /dev/null +++ b/apps/app/i18n/locales/pl.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "lub", + "error": { + "title": "Nie znaleziono strony", + "description": "Przepraszamy, ale nie znaleziono tej strony." + } + }, + "docs": { + "copy": { + "page": "Skopiuj stronę", + "link": "Skopiuj stronę Markdown", + "view": "Wyświetl jako Markdown", + "gpt": "Otwórz w ChatGPT", + "claude": "Otwórz w Claude" + }, + "links": "Społeczność", + "toc": "Na tej stronie", + "report": "Zgłoś problem", + "edit": "Edytuj tę stronę" + } +} diff --git a/apps/app/i18n/locales/ru.json b/apps/app/i18n/locales/ru.json new file mode 100644 index 00000000..978337e4 --- /dev/null +++ b/apps/app/i18n/locales/ru.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "или", + "error": { + "title": "Страница не найдена", + "description": "Извините, но запрашиваемая страница не найдена." + } + }, + "docs": { + "copy": { + "page": "Копировать страницу", + "link": "Копировать Markdown-страницу", + "view": "Просмотреть как Markdown", + "gpt": "Открыть в ChatGPT", + "claude": "Открыть в Claude" + }, + "links": "Сообщество", + "toc": "На этой странице", + "report": "Сообщить о проблеме", + "edit": "Редактировать эту страницу" + } +} diff --git a/apps/app/i18n/locales/sl.json b/apps/app/i18n/locales/sl.json new file mode 100644 index 00000000..5ed0ac7f --- /dev/null +++ b/apps/app/i18n/locales/sl.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "ali", + "error": { + "title": "Stran ni bila najdena", + "description": "Opravičujemo se, vendar stran, ki jo iščete, ni bila najdena." + } + }, + "docs": { + "copy": { + "page": "Kopiraj stran", + "link": "Kopiraj Markdown stran", + "view": "Prikaži kot Markdown", + "gpt": "Odpri v ChatGPT", + "claude": "Odpri v Claude" + }, + "links": "Skupnost", + "toc": "Na tej strani", + "report": "Prijavi težavo", + "edit": "Uredi to stran" + } +} diff --git a/apps/app/i18n/locales/sv.json b/apps/app/i18n/locales/sv.json new file mode 100644 index 00000000..d0e63438 --- /dev/null +++ b/apps/app/i18n/locales/sv.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "eller", + "error": { + "title": "Sidan hittades inte", + "description": "Vi ber om ursäkt, men sidan du letar efter kunde inte hittas." + } + }, + "docs": { + "copy": { + "page": "Kopiera sida", + "link": "Kopiera Markdown-sida", + "view": "Visa som Markdown", + "gpt": "Öppna i ChatGPT", + "claude": "Öppna i Claude" + }, + "links": "Gemenskap", + "toc": "På denna sida", + "report": "Rapportera ett problem", + "edit": "Redigera denna sida" + } +} diff --git a/apps/app/i18n/locales/uk.json b/apps/app/i18n/locales/uk.json new file mode 100644 index 00000000..9537c76c --- /dev/null +++ b/apps/app/i18n/locales/uk.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "або", + "error": { + "title": "Сторінку не знайдено", + "description": "Вибачте, але сторінку, яку ви шукаєте, не знайдено." + } + }, + "docs": { + "copy": { + "page": "Скопіювати сторінку", + "link": "Скопіювати Markdown сторінку", + "view": "Переглянути як Markdown", + "gpt": "Відкрити в ChatGPT", + "claude": "Відкрити в Claude" + }, + "links": "Спільнота", + "toc": "На цій сторінці", + "report": "Повідомити про проблему", + "edit": "Редагувати цю сторінку" + } +} diff --git a/apps/app/i18n/locales/ur.json b/apps/app/i18n/locales/ur.json new file mode 100644 index 00000000..873873f3 --- /dev/null +++ b/apps/app/i18n/locales/ur.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "یا", + "error": { + "title": "صفحہ نہیں ملا", + "description": "ہمیں افسوس ہے، لیکن آپ جو صفحہ تلاش کر رہے ہیں وہ موجود نہیں ہے۔" + } + }, + "docs": { + "copy": { + "page": "صفحہ کاپی کریں", + "link": "Markdown صفحہ کاپی کریں", + "view": "Markdown کے طور پر دیکھیں", + "gpt": "ChatGPT میں کھولیں", + "claude": "Claude میں کھولیں" + }, + "links": "کمیونٹی", + "toc": "اس صفحے پر", + "report": "مسئلہ کی اطلاع دیں", + "edit": "اس صفحے کو ترمیم کریں" + } +} diff --git a/apps/app/i18n/locales/vi.json b/apps/app/i18n/locales/vi.json new file mode 100644 index 00000000..6b88560d --- /dev/null +++ b/apps/app/i18n/locales/vi.json @@ -0,0 +1,22 @@ +{ + "common": { + "or": "hoặc", + "error": { + "title": "Không tìm thấy trang", + "description": "Chúng tôi xin lỗi, nhưng trang bạn đang tìm kiếm không tồn tại." + } + }, + "docs": { + "copy": { + "page": "Sao chép trang", + "link": "Sao chép trang Markdown", + "view": "Xem dưới dạng Markdown", + "gpt": "Mở trong ChatGPT", + "claude": "Mở trong Claude" + }, + "links": "Cộng đồng", + "toc": "Trên trang này", + "report": "Báo cáo sự cố", + "edit": "Chỉnh sửa trang này" + } +} diff --git a/apps/app/nuxt.config.ts b/apps/app/nuxt.config.ts new file mode 100644 index 00000000..4063344f --- /dev/null +++ b/apps/app/nuxt.config.ts @@ -0,0 +1,50 @@ +// https://nuxt.com/docs/api/configuration/nuxt-config +export default defineNuxtConfig({ + extends: ["../shared"], + compatibilityDate: "2025-07-22", + modules: ["@nuxtjs/supabase"], + css: ["../shared/app/assets/css/main.css"], + llms: { + domain: "https://app.styleframe.dev", + title: "Styleframe", + }, + supabase: { + redirect: true, + redirectOptions: { + login: "/login", + callback: "/confirm", + exclude: [ + "/login", + "/signup", + "/confirm", + "/forgot-password", + "/reset-password", + ], + saveRedirectToCookie: true, + }, + clientOptions: { + auth: { + flowType: "implicit", + detectSessionInUrl: true, + persistSession: true, + }, + }, + }, + routeRules: { + "/privacy": { + redirect: "https://www.styleframe.dev/privacy", + }, + "/terms": { + redirect: "https://www.styleframe.dev/terms", + }, + "/license": { + redirect: "https://www.styleframe.dev/license", + }, + }, + runtimeConfig: { + supabase: {}, + public: { + baseUrl: "", + }, + }, +}); diff --git a/apps/app/nuxt.schema.ts b/apps/app/nuxt.schema.ts new file mode 100644 index 00000000..a3e40dda --- /dev/null +++ b/apps/app/nuxt.schema.ts @@ -0,0 +1,236 @@ +import { field, group } from "@nuxt/content/preview"; + +export default defineNuxtSchema({ + appConfig: { + ui: group({ + title: "UI", + description: "UI Customization.", + icon: "i-lucide-palette", + fields: { + colors: group({ + title: "Colors", + description: "Manage main colors of your application", + icon: "i-lucide-palette", + fields: { + primary: field({ + type: "string", + title: "Primary", + description: "Primary color of your UI.", + icon: "i-lucide-palette", + default: "green", + required: [ + "red", + "orange", + "amber", + "yellow", + "lime", + "green", + "emerald", + "teal", + "cyan", + "sky", + "blue", + "indigo", + "violet", + "purple", + "fuchsia", + "pink", + "rose", + ], + }), + neutral: field({ + type: "string", + title: "Neutral", + description: "Neutral color of your UI.", + icon: "i-lucide-palette", + default: "slate", + required: ["slate", "gray", "zinc", "neutral", "stone"], + }), + }, + }), + icons: group({ + title: "Icons", + description: "Manage icons used in the application.", + icon: "i-lucide-settings", + fields: { + search: field({ + type: "icon", + title: "Search Bar", + description: "Icon to display in the search bar.", + icon: "i-lucide-search", + default: "i-lucide-search", + }), + dark: field({ + type: "icon", + title: "Dark mode", + description: "Icon of color mode button for dark mode.", + icon: "i-lucide-moon", + default: "i-lucide-moon", + }), + light: field({ + type: "icon", + title: "Light mode", + description: "Icon of color mode button for light mode.", + icon: "i-lucide-sun", + default: "i-lucide-sun", + }), + external: field({ + type: "icon", + title: "External Link", + description: "Icon for external link.", + icon: "i-lucide-external-link", + default: "i-lucide-external-link", + }), + chevron: field({ + type: "icon", + title: "Chevron", + description: "Icon for chevron.", + icon: "i-lucide-chevron-down", + default: "i-lucide-chevron-down", + }), + hash: field({ + type: "icon", + title: "Hash", + description: "Icon for hash anchors.", + icon: "i-lucide-hash", + default: "i-lucide-hash", + }), + }, + }), + }, + }), + seo: group({ + title: "SEO", + description: "SEO configuration.", + icon: "i-lucide-search", + fields: { + title: field({ + type: "string", + title: "Title", + description: "Title to display in the header.", + icon: "i-lucide-type", + default: "", + }), + description: field({ + type: "string", + title: "Description", + description: "Description to display in the header.", + icon: "i-lucide-type", + default: "", + }), + }, + }), + header: group({ + title: "Header", + description: "Header configuration.", + icon: "i-lucide-layout", + fields: { + title: field({ + type: "string", + title: "Title", + description: "Title to display in the header.", + icon: "i-lucide-type", + default: "", + }), + logo: group({ + title: "Logo", + description: "Header logo configuration.", + icon: "i-lucide-image", + fields: { + light: field({ + type: "media", + title: "Light Mode Logo", + description: "Pick an image from your gallery.", + icon: "i-lucide-sun", + default: "", + }), + dark: field({ + type: "media", + title: "Dark Mode Logo", + description: "Pick an image from your gallery.", + icon: "i-lucide-moon", + default: "", + }), + alt: field({ + type: "string", + title: "Alt", + description: "Alt to display for accessibility.", + icon: "i-lucide-text", + default: "", + }), + }, + }), + }, + }), + socials: field({ + type: "object", + title: "Social Networks", + description: "Social links configuration.", + icon: "i-lucide-network", + default: {}, + }), + toc: group({ + title: "Table of contents", + description: "TOC configuration.", + icon: "i-lucide-list", + fields: { + title: field({ + type: "string", + title: "Title", + description: "Title of the table of contents.", + icon: "i-lucide-heading", + default: "On this page", + }), + bottom: group({ + title: "Bottom", + description: "Bottom section of the table of contents.", + icon: "i-lucide-list", + fields: { + title: field({ + type: "string", + title: "Title", + description: "Title of the bottom section.", + icon: "i-lucide-heading", + default: "Community", + }), + links: field({ + type: "array", + title: "Links", + description: "Links to display in the bottom section.", + icon: "i-lucide-link", + default: [], + }), + }, + }), + }, + }), + github: group({ + title: "GitHub", + description: "GitHub configuration.", + icon: "i-simple-icons-github", + fields: { + url: field({ + type: "string", + title: "URL", + description: "GitHub URL.", + icon: "i-simple-icons-github", + default: "", + }), + branch: field({ + type: "string", + title: "Branch", + description: "GitHub branch.", + icon: "i-lucide-git-branch", + default: "main", + }), + rootDir: field({ + type: "string", + title: "Root Directory", + description: "Root directory of the GitHub repository.", + icon: "i-lucide-folder", + default: "", + }), + }, + }), + }, +}); diff --git a/apps/app/package.json b/apps/app/package.json new file mode 100644 index 00000000..03d004b6 --- /dev/null +++ b/apps/app/package.json @@ -0,0 +1,57 @@ +{ + "name": "@styleframe/app", + "type": "module", + "version": "0.0.1", + "scripts": { + "build": "nuxt build", + "dev": "nuxt dev --port 4000", + "generate": "nuxt generate", + "preview": "nuxt preview", + "postinstall": "nuxt prepare", + "generate:db:types": "supabase gen types --lang=typescript --project-id zkbxuglymolesrtagncn > types/database.types.ts" + }, + "dependencies": { + "@nuxt/content": "catalog:nuxt", + "@nuxt/image": "catalog:nuxt", + "@nuxt/scripts": "catalog:nuxt", + "@nuxt/ui": "catalog:nuxt", + "@nuxtjs/i18n": "catalog:nuxt", + "@nuxtjs/mdc": "catalog:nuxt", + "@nuxtjs/robots": "catalog:nuxt", + "@nuxtjs/supabase": "catalog:nuxt", + "@unhead/vue": "2.0.19", + "@vueuse/core": "13.9.0", + "@supabase/supabase-js": "catalog:nuxt", + "defu": "catalog:nuxt", + "motion-v": "1.7.2", + "nuxt": "catalog:nuxt", + "nuxt-llms": "catalog:nuxt", + "nuxt-og-image": "catalog:nuxt", + "posthog-js": "catalog:nuxt", + "scule": "1.3.0", + "ufo": "1.6.1", + "vue": "3.5.22", + "vue-router": "4.5.1", + "zod": "catalog:" + }, + "devDependencies": { + "@iconify-json/lucide": "1.2.69", + "@iconify-json/simple-icons": "1.2.54", + "@iconify-json/vscode-icons": "1.2.31", + "@nuxt/kit": "catalog:nuxt", + "@nuxt/test-utils": "catalog:nuxt", + "c12": "3.3.0", + "exsolve": "1.0.7", + "git-url-parse": "16.1.0", + "minimark": "0.2.0", + "pkg-types": "2.3.0", + "tailwindcss": "4.1.14", + "typescript": "5.9.3", + "unist-util-visit": "5.0.0" + }, + "files": [ + "LICENSE", + "utils", + "app" + ] +} diff --git a/apps/app/public/_robots.txt b/apps/app/public/_robots.txt new file mode 100644 index 00000000..0ad279c7 --- /dev/null +++ b/apps/app/public/_robots.txt @@ -0,0 +1,2 @@ +User-Agent: * +Disallow: diff --git a/apps/app/public/android-chrome-192x192.png b/apps/app/public/android-chrome-192x192.png new file mode 100644 index 00000000..1146e718 Binary files /dev/null and b/apps/app/public/android-chrome-192x192.png differ diff --git a/apps/app/public/android-chrome-512x512.png b/apps/app/public/android-chrome-512x512.png new file mode 100644 index 00000000..ccd464c0 Binary files /dev/null and b/apps/app/public/android-chrome-512x512.png differ diff --git a/apps/app/public/apple-touch-icon-precomposed.png b/apps/app/public/apple-touch-icon-precomposed.png new file mode 100644 index 00000000..4b8bafe4 Binary files /dev/null and b/apps/app/public/apple-touch-icon-precomposed.png differ diff --git a/apps/app/public/apple-touch-icon.png b/apps/app/public/apple-touch-icon.png new file mode 100644 index 00000000..4b8bafe4 Binary files /dev/null and b/apps/app/public/apple-touch-icon.png differ diff --git a/apps/app/public/assets/images/styleframe-ai.png b/apps/app/public/assets/images/styleframe-ai.png new file mode 100644 index 00000000..c3f53863 Binary files /dev/null and b/apps/app/public/assets/images/styleframe-ai.png differ diff --git a/apps/app/public/assets/images/styleframe-ai.webp b/apps/app/public/assets/images/styleframe-ai.webp new file mode 100644 index 00000000..936f46f0 Binary files /dev/null and b/apps/app/public/assets/images/styleframe-ai.webp differ diff --git a/apps/app/public/assets/images/styleframe-footer.webp b/apps/app/public/assets/images/styleframe-footer.webp new file mode 100644 index 00000000..43ddb223 Binary files /dev/null and b/apps/app/public/assets/images/styleframe-footer.webp differ diff --git a/apps/app/public/assets/video/styleframe-ai.mp4 b/apps/app/public/assets/video/styleframe-ai.mp4 new file mode 100644 index 00000000..f1e3de04 Binary files /dev/null and b/apps/app/public/assets/video/styleframe-ai.mp4 differ diff --git a/apps/app/public/favicon-16x16.png b/apps/app/public/favicon-16x16.png new file mode 100644 index 00000000..39553518 Binary files /dev/null and b/apps/app/public/favicon-16x16.png differ diff --git a/apps/app/public/favicon-32x32.png b/apps/app/public/favicon-32x32.png new file mode 100644 index 00000000..00f935c8 Binary files /dev/null and b/apps/app/public/favicon-32x32.png differ diff --git a/apps/app/public/favicon.ico b/apps/app/public/favicon.ico new file mode 100644 index 00000000..6a896952 Binary files /dev/null and b/apps/app/public/favicon.ico differ diff --git a/apps/app/public/logo.svg b/apps/app/public/logo.svg new file mode 100644 index 00000000..843c91fd --- /dev/null +++ b/apps/app/public/logo.svg @@ -0,0 +1,15 @@ + + + + + diff --git a/apps/app/public/logotype-dark.svg b/apps/app/public/logotype-dark.svg new file mode 100644 index 00000000..4fe461cb --- /dev/null +++ b/apps/app/public/logotype-dark.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/app/public/logotype-light.svg b/apps/app/public/logotype-light.svg new file mode 100644 index 00000000..88dc3b0a --- /dev/null +++ b/apps/app/public/logotype-light.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/app/public/site.webmanifest b/apps/app/public/site.webmanifest new file mode 100644 index 00000000..95911504 --- /dev/null +++ b/apps/app/public/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/apps/app/tsconfig.json b/apps/app/tsconfig.json new file mode 100644 index 00000000..9e551677 --- /dev/null +++ b/apps/app/tsconfig.json @@ -0,0 +1,17 @@ +{ + "files": [], + "references": [ + { + "path": "./.nuxt/tsconfig.app.json" + }, + { + "path": "./.nuxt/tsconfig.server.json" + }, + { + "path": "./.nuxt/tsconfig.shared.json" + }, + { + "path": "./.nuxt/tsconfig.node.json" + } + ] +} diff --git a/apps/docs/.env.example b/apps/docs/.env.example new file mode 100644 index 00000000..eae673c6 --- /dev/null +++ b/apps/docs/.env.example @@ -0,0 +1,12 @@ +# +# Application +# + +NUXT_PUBLIC_BASE_URL=http://localhost:4000 + +# +# Posthog +# + +NUXT_PUBLIC_POSTHOG_KEY=phc_Vu3wqbMj8M5iWzvEulIXlK5U0A3hqkb5rlVM1DLtZsb +NUXT_PUBLIC_POSTHOG_HOST= diff --git a/apps/docs/app/components/content/GradientPageHero.vue b/apps/docs/app/components/content/GradientPageHero.vue index 52a49656..1d63a0e0 100644 --- a/apps/docs/app/components/content/GradientPageHero.vue +++ b/apps/docs/app/components/content/GradientPageHero.vue @@ -1,6 +1,4 @@