diff --git a/app/components/Changelog/Card.vue b/app/components/Changelog/Card.vue new file mode 100644 index 000000000..ebffcf373 --- /dev/null +++ b/app/components/Changelog/Card.vue @@ -0,0 +1,59 @@ + + + + diff --git a/app/components/Changelog/Markdown.vue b/app/components/Changelog/Markdown.vue new file mode 100644 index 000000000..e10940c46 --- /dev/null +++ b/app/components/Changelog/Markdown.vue @@ -0,0 +1,18 @@ + + diff --git a/app/components/Changelog/Releases.vue b/app/components/Changelog/Releases.vue new file mode 100644 index 000000000..1ac27a8fa --- /dev/null +++ b/app/components/Changelog/Releases.vue @@ -0,0 +1,12 @@ + + diff --git a/app/components/Readme.vue b/app/components/Readme.vue index 8cb59ee49..0d37a086b 100644 --- a/app/components/Readme.vue +++ b/app/components/Readme.vue @@ -150,7 +150,7 @@ function handleClick(event: MouseEvent) { @apply inline i-lucide:external-link rtl-flip ms-1 opacity-50; } -.readme :deep(a[href^='#']::after) { +.readme :deep(a[href^='#']:not([content-none])::after) { /* I don't know what kind of sorcery this is, but it ensures this icon can't wrap to a new line on its own. */ content: '__'; @apply inline i-lucide:link rtl-flip ms-1 opacity-0; diff --git a/app/composables/usePackageChangelog.ts b/app/composables/usePackageChangelog.ts new file mode 100644 index 000000000..7d3dcd943 --- /dev/null +++ b/app/composables/usePackageChangelog.ts @@ -0,0 +1,13 @@ +import type { ChangelogInfo } from '~~/shared/types/changelog' + +export function usePackageChangelog( + packageName: MaybeRefOrGetter, + version?: MaybeRefOrGetter, +) { + return useLazyFetch(() => { + const name = toValue(packageName) + const ver = toValue(version) + const base = `/api/changelog/info/${name}` + return ver ? `${base}/v/${ver}` : base + }) +} diff --git a/app/composables/useProviderIcon.ts b/app/composables/useProviderIcon.ts new file mode 100644 index 000000000..f5289b55e --- /dev/null +++ b/app/composables/useProviderIcon.ts @@ -0,0 +1,22 @@ +import type { IconClass } from '~/types/icon' + +const PROVIDER_ICONS: Record = { + github: 'i-simple-icons:github', + gitlab: 'i-simple-icons:gitlab', + bitbucket: 'i-simple-icons:bitbucket', + codeberg: 'i-simple-icons:codeberg', + gitea: 'i-simple-icons:gitea', + forgejo: 'i-simple-icons:forgejo', + gitee: 'i-simple-icons:gitee', + sourcehut: 'i-simple-icons:sourcehut', + tangled: 'i-custom:tangled', + radicle: 'i-lucide:network', // Radicle is a P2P network, using network icon +} + +export function useProviderIcon(provider: MaybeRefOrGetter) { + return computed((): IconClass => { + const uProvider = toValue(provider) + if (!uProvider) return 'i-simple-icons:github' + return PROVIDER_ICONS[uProvider] ?? 'i-lucide:code' + }) +} diff --git a/app/pages/org/[org].vue b/app/pages/org/[org].vue index e7ec4a649..0c6101afa 100644 --- a/app/pages/org/[org].vue +++ b/app/pages/org/[org].vue @@ -180,7 +180,7 @@ defineOgImageComponent('Default', { target="_blank" rel="noopener noreferrer" class="link-subtle font-mono text-sm inline-flex items-center gap-1.5" - :title="$t('common.view_on_npm')" + :title="$t('common.view_on', { site: 'npm' })" >