diff --git a/frontend/AGENTS.md b/frontend/AGENTS.md index f118e233..a4f2bce8 100644 --- a/frontend/AGENTS.md +++ b/frontend/AGENTS.md @@ -179,6 +179,11 @@ Every "business state → color" mapping goes through `use-status-tone.js` no section is highlighted off Home. - The link row collapses to the hamburger + Sheet when `use-nav-overflow.js` measures it doesn't fit (no breakpoint); `isMobile` only drives phone behaviour. +- **Footer** — four columns on the Advanced Tools grid: brand / Project / Docs + & Support / Clients (only the CLI entry is gated, on the curl domains); + never repeats on-page content (tools, sections); About / Changelog / + Acknowledgement open in its About sheet, the CLI in its own dialog + (`Footer.vue`). - **Page breadcrumb** — every page but Home opens its body with `` above the `

` (← Home / … / current page): real links, Home via `resolveBackTarget()`, section crumbs via the Nav's diff --git a/frontend/components/Additional.vue b/frontend/components/Additional.vue deleted file mode 100644 index c5008b04..00000000 --- a/frontend/components/Additional.vue +++ /dev/null @@ -1,108 +0,0 @@ - - - - - diff --git a/frontend/components/Footer.vue b/frontend/components/Footer.vue index 04c7a8bc..d308eaf7 100644 --- a/frontend/components/Footer.vue +++ b/frontend/components/Footer.vue @@ -1,65 +1,141 @@ + @@ -164,28 +285,31 @@ import { useMainStore } from '@/store'; import { useI18n } from 'vue-i18n'; import changelogData from '@/data/changelog.json'; import { trackEvent } from '@/utils/analytics'; +import { docsUrl } from '@/utils/docs-url.js'; import { formatIsoDate } from '@/utils/time-utils'; import { fallbackChain } from '@/utils/locale-registry.js'; import { Sheet, SheetContent, SheetClose } from '@/components/ui/sheet'; -import { JnTooltip } from '@/components/ui/tooltip'; +import { Dialog, DialogContent, DialogHeader } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/tabs'; import { Badge } from '@/components/ui/badge'; import { Separator } from '@/components/ui/separator'; -import { Compass, ExternalLink, CircleFadingArrowUp, CirclePlus, BugOff, Smile } from '@lucide/vue'; +import { Compass, ExternalLink, CircleFadingArrowUp, CirclePlus, BugOff, Smile, Terminal, Feather } from '@lucide/vue'; +import brandIcon from './svgicons/Brand.vue'; import { Icon } from '@iconify/vue'; -import { useRoute } from 'vue-router'; import { useRouteActive } from '@/composables/use-route-active.js'; const { t, tm, rt, locale } = useI18n(); const store = useMainStore(); -const isMobile = computed(() => store.isMobile); const configs = computed(() => store.configs); -const route = useRoute(); -const isInHomePage = computed(() => route.path === '/'); +const curl = computed(() => store.curl); +const curlDomainsHadSet = computed(() => store.curlDomainsHadSet); const tabs = ['about', 'changelog', 'acknowledgement']; const content = ref('about'); + +const headingClass = 'mb-3 text-xs font-semibold uppercase tracking-wide text-muted-foreground'; +const linkClass = 'inline-flex items-center gap-1 text-sm text-muted-foreground no-underline transition-colors hover:text-foreground cursor-pointer'; // Static data from JSON — reverse once via computed so the template stays tidy. const changelogReversed = computed(() => changelogData.slice().reverse()); @@ -266,6 +390,12 @@ const openAboutTab = (tab, trackLabel) => { trackEvent('Footer', 'FooterClick', trackLabel); }; +const isCurlOpen = ref(false); +const openCurl = () => { + isCurlOpen.value = true; + trackEvent('Footer', 'FooterClick', 'Curl'); +}; + watch(content, () => { nextTick(() => { if (sheetBody.value) sheetBody.value.scrollTop = 0; @@ -273,3 +403,20 @@ watch(content, () => { }); + + diff --git a/frontend/components/Home.vue b/frontend/components/Home.vue index 05240831..e608e91e 100644 --- a/frontend/components/Home.vue +++ b/frontend/components/Home.vue @@ -18,7 +18,6 @@ -