-
-
Notifications
You must be signed in to change notification settings - Fork 433
feat(docs): add custom badge generator #2152
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
ghostdevv
merged 22 commits into
npmx-dev:main
from
trueberryless:feature/docs-custom-badges-inputs
Mar 21, 2026
Merged
Changes from 9 commits
Commits
Show all changes
22 commits
Select commit
Hold shift + click to select a range
c062ad6
feat(docs): add custom badge generator
89d5ebf
[autofix.ci] apply automated fixes
autofix-ci[bot] 9e467d0
fix: add name type
trueberryless 3907e95
[autofix.ci] apply automated fixes
autofix-ci[bot] 8101797
feat: create parameter badge generator
trueberryless 381114c
[autofix.ci] apply automated fixes
autofix-ci[bot] a1821ff
feat: add label formatter and make clipboard robust
trueberryless ffa83af
Merge branch 'main' into feature/docs-custom-badges-inputs
trueberryless 2d41b40
[autofix.ci] apply automated fixes
autofix-ci[bot] 3eff748
refactor: simplify clipboard
trueberryless 18b79c2
fix: suggestions
trueberryless 124dada
feat: support any value
trueberryless 39be64f
Merge branch 'main' into feature/docs-custom-badges-inputs
trueberryless 761b683
[autofix.ci] apply automated fixes
autofix-ci[bot] 263bb3f
Merge remote-tracking branch 'origin/main' into feature/docs-custom-b…
ghostdevv 706b3ac
refactor: badge types constant should be shared
ghostdevv cdd74d3
refactor: use text transform to capitalise
ghostdevv 2b2deec
fix: knip
ghostdevv 0d98502
Revert "refactor: use text transform to capitalise"
ghostdevv fba0dc5
refactor: typescript
ghostdevv 850618a
refactor: reusable titleCase fn
ghostdevv a588ac1
Merge remote-tracking branch 'origin/main' into feature/docs-custom-b…
ghostdevv File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,131 @@ | ||
| <script setup> | ||
| const pkg = useState('badge-pkg', () => 'nuxt') | ||
| const type = useState('badge-type', () => 'version') | ||
| const isValid = ref(true) | ||
| const copied = ref(false) | ||
|
|
||
| const types = [ | ||
| 'version', | ||
| 'license', | ||
| 'size', | ||
| 'downloads', | ||
| 'downloads-day', | ||
| 'downloads-week', | ||
| 'downloads-month', | ||
| 'downloads-year', | ||
| 'vulnerabilities', | ||
| 'dependencies', | ||
| 'created', | ||
| 'updated', | ||
| 'engines', | ||
| 'types', | ||
| 'maintainers', | ||
| 'deprecated', | ||
| 'quality', | ||
| 'popularity', | ||
| 'maintenance', | ||
| 'score', | ||
| 'name', | ||
| ] | ||
|
|
||
| watch(pkg, () => { | ||
| isValid.value = true | ||
| }) | ||
|
trueberryless marked this conversation as resolved.
Outdated
|
||
|
|
||
| const formatLabel = str => { | ||
| if (!str || typeof str !== 'string') return '' | ||
| return str | ||
| .split('-') | ||
| .map(word => word.charAt(0).toUpperCase() + word.slice(1)) | ||
| .join(' per ') | ||
| } | ||
|
|
||
| const copyToClipboard = async () => { | ||
| const markdown = `[](https://npmx.dev/package/${pkg.value})` | ||
| try { | ||
| await navigator.clipboard.writeText(markdown) | ||
| copied.value = true | ||
| setTimeout(() => { | ||
| copied.value = false | ||
| }, 2000) | ||
| } catch { | ||
| console.error('Failed to copy to clipboard') | ||
|
trueberryless marked this conversation as resolved.
Outdated
|
||
| } | ||
| } | ||
|
coderabbitai[bot] marked this conversation as resolved.
|
||
| </script> | ||
|
|
||
| <template> | ||
| <div | ||
| class="my-8 p-5 rounded-xl border border-gray-200/60 dark:border-white/5 bg-gray-50/50 dark:bg-white/2 flex flex-col sm:flex-row items-end gap-4" | ||
| > | ||
| <div class="flex flex-col gap-1.5 flex-1 w-full"> | ||
| <label class="text-[11px] font-bold uppercase tracking-wider text-gray-400 ml-1" | ||
| >Package Name</label | ||
| > | ||
| <input | ||
| v-model="pkg" | ||
| type="text" | ||
| spellcheck="false" | ||
| class="w-full h-10.5 px-4 py-2 rounded-lg border border-gray-200 dark:border-white/10 bg-white dark:bg-black/20 focus:ring-2 focus:ring-emerald-500/20 focus:border-emerald-500 outline-none text-sm transition-all" | ||
| :class="{ 'border-red-500/50 focus:ring-red-500/10 focus:border-red-500': !isValid }" | ||
| placeholder="e.g. nuxt" | ||
| /> | ||
| </div> | ||
|
|
||
| <div class="flex flex-col gap-1.5 flex-1 w-full"> | ||
| <label class="text-[11px] font-bold uppercase tracking-wider text-gray-400 ml-1" | ||
| >Badge Type</label | ||
| > | ||
| <div class="relative"> | ||
| <select | ||
| v-model="type" | ||
| class="w-full h-10.5 px-4 py-2 rounded-lg border border-gray-200 dark:border-white/10 bg-white dark:bg-black/20 focus:ring-2 focus:ring-emerald-500/20 focus:border-emerald-500 outline-none text-sm transition-all appearance-none cursor-pointer" | ||
| > | ||
| <option v-for="t in types" :key="t" :value="t" class="dark:bg-gray-900"> | ||
| {{ formatLabel(t) }} | ||
| </option> | ||
| </select> | ||
| <span | ||
| class="absolute right-3 top-1/2 -translate-y-1/2 i-lucide-chevron-down w-4 h-4 text-gray-400 pointer-events-none" | ||
| /> | ||
| </div> | ||
| </div> | ||
|
|
||
| <div class="flex flex-col gap-1.5 flex-2 w-full"> | ||
| <label class="text-[11px] font-bold uppercase tracking-wider text-gray-400 ml-1" | ||
| >Preview & Action</label | ||
| > | ||
| <div | ||
| class="flex items-center bg-white dark:bg-black/20 border border-gray-200 dark:border-white/10 rounded-lg h-10.5 overflow-hidden" | ||
| > | ||
| <div | ||
| class="flex-1 flex items-center justify-center px-3 border-r border-gray-200 dark:border-white/10 h-full bg-gray-50/50 dark:bg-transparent" | ||
| > | ||
| <img | ||
| v-if="isValid" | ||
| :src="`https://npmx.dev/api/registry/badge/${type}/${pkg}`" | ||
| class="h-5" | ||
| alt="Badge Preview" | ||
| @error="isValid = false" | ||
| /> | ||
| <span v-else class="text-[10px] font-bold text-red-500 uppercase tracking-tighter" | ||
| >Invalid</span | ||
| > | ||
| </div> | ||
|
|
||
| <button | ||
| @click="copyToClipboard" | ||
| :disabled="!isValid" | ||
|
trueberryless marked this conversation as resolved.
Outdated
|
||
| class="px-4 h-full text-[11px] font-bold uppercase tracking-widest transition-all disabled:opacity-20 disabled:cursor-not-allowed min-w-21.25 hover:bg-gray-50 dark:hover:bg-white/5" | ||
| :class=" | ||
| copied | ||
| ? 'text-emerald-500 bg-emerald-50/50 dark:bg-emerald-500/10' | ||
| : 'text-gray-500 dark:text-gray-400' | ||
| " | ||
| > | ||
| {{ copied ? 'Done!' : 'Copy' }} | ||
| </button> | ||
| </div> | ||
| </div> | ||
| </div> | ||
| </template> | ||
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.