diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4d38b1f2b..638d7cc2d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,7 @@ on: permissions: id-token: write # Required for OIDC - contents: read + contents: write jobs: create-release: @@ -36,25 +36,19 @@ jobs: id: latest-tag run: echo "LATEST_TAG=$(git describe --tags `git rev-list --tags --max-count=1`)" >> $GITHUB_OUTPUT + - name: Log latest tag + run: echo '${{ steps.latest-tag.outputs.LATEST_TAG }}' + - name: Check if we can patch - run: .github/workflows/version-up.sh --minor + run: pnpm semver $LATEST_TAG -i minor + env: + LATEST_TAG: ${{ steps.latest-tag.outputs.LATEST_TAG }} - name: Create new version id: new-version - run: echo "NEW_VERSION=$(.github/workflows/version-up.sh --minor)" >> $GITHUB_OUTPUT - - - name: Create change log - id: change-log - run: | - CHANGE_LOG=$(pnpm run generate:changelog --old-tag=${{ steps.latest-tag.outputs.LATEST_TAG }}) - CHANGE_LOG=$(tail -n +5 <<< $CHANGE_LOG) - echo $CHANGE_LOG - EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64) - echo "CHANGE_LOG<<$EOF" >> $GITHUB_OUTPUT - echo "$CHANGE_LOG" >> $GITHUB_OUTPUT - echo "$EOF" >> $GITHUB_OUTPUT + run: echo "NEW_VERSION=$(pnpm semver $LATEST_TAG -i minor)" >> $GITHUB_OUTPUT env: - GITHUB_API_KEY: ${{ secrets.GITHUB_TOKEN }} + LATEST_TAG: ${{ steps.latest-tag.outputs.LATEST_TAG }} - name: Check output run: | @@ -68,38 +62,6 @@ jobs: name: Version ${{ steps.new-version.outputs.NEW_VERSION }} generate_release_notes: true - test-semantic-release: - if: github.repository == 'lucide-icons/lucide' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v6 - - - name: Semantic Release - id: semantic - uses: cycjimmy/semantic-release-action@v4 - with: - tag_format: ${version} - branches: | - ['new-release-workflow'] - extends: | - semantic-release-monorepo - extra_plugins: | - @semantic-release/github - @semantic-release/git - @semantic-release/release-notes-generator - conventional-changelog-conventionalcommits - - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Log output - if: steps.semantic.outputs.new_release_published == 'true' - run: | - echo ${{ steps.semantic.outputs.new_release_version }} - echo ${{ steps.semantic.outputs.new_release_major_version }} - echo ${{ steps.semantic.outputs.new_release_minor_version }} - echo ${{ steps.semantic.outputs.new_release_patch_version }} - start-release: if: github.repository == 'lucide-icons/lucide' needs: create-release diff --git a/.github/workflows/close-issue-with-banned-phrases.yml b/.github/workflows/close-issue-with-banned-phrases.yml index e6dd40207..abd2d7c7f 100644 --- a/.github/workflows/close-issue-with-banned-phrases.yml +++ b/.github/workflows/close-issue-with-banned-phrases.yml @@ -1,4 +1,4 @@ -name: Close Issue with Banned Phrases +name: Close Icon Requests with Brand Terms on: issues: @@ -13,23 +13,36 @@ jobs: - name: Checkout repository uses: actions/checkout@v6 - - name: Check for blocked phrases in issue title + - name: Load stopwords from JSON & check issue title & body + if: contains(github.event.issue.labels.*.name, '🙌 icon request') run: | ISSUE_TITLE=$(jq -r '.issue.title' "$GITHUB_EVENT_PATH") - BLOCKED_PHRASES=("twitter" "whatsapp" "logo" "google" "tiktok" "facebook" "slack" "discord" "bluesky" "spotify" "behance" "pix" "x.com" "telegram") + ISSUE_BODY=$(jq -r '.issue.body // ""' "$GITHUB_EVENT_PATH") + ICON_NAME_SECTION=$(printf '%s\n' "$ISSUE_BODY" | awk '/### Icon name/{flag=1; next} /^### /{flag=0} flag') - # Check title and body for blocked phrases - for PHRASE in "${BLOCKED_PHRASES[@]}" - do - if echo "$ISSUE_TITLE" | grep -i "$PHRASE"; then - gh issue close ${{ github.event.issue.number }} --reason "not planned" --comment "This looks like a duplicate, use the [search](https://github.com/lucide-icons/lucide/issues?q=is%3Aissue+$PHRASE) to find similar issues. + jq -r 'to_entries[] | "\(.key) \(.value)"' brand-stopwords.json | while read -r KEY VALUE; do + SAFE_KEY=$(printf '%s\n' "$KEY" | sed 's/[][\.^$*]/\\&/g') + SAFE_VALUE=$(printf '%s\n' "$VALUE" | sed 's/[][\.^$*]/\\&/g') - Read [our official statement about brand logos in Lucide](https://github.com/lucide-icons/lucide/blob/main/BRAND_LOGOS_STATEMENT.md). + if echo "$ISSUE_TITLE" | grep -iqE "$SAFE_KEY|$SAFE_VALUE" || \ + { [ -n "$ICON_NAME_SECTION" ] && echo "$ICON_NAME_SECTION" | grep -iqE "$SAFE_KEY|$SAFE_VALUE"; }; then + + gh issue close ${{ github.event.issue.number }} \ + --reason "not_planned" \ + --comment "It looks like this request is about **${VALUE}**, which is a brand logo. + + Lucide **does not accept** brand logos, and we do not plan to add them in the future. This is due to a combination of **legal restrictions**, **design consistency concerns**, and **practical maintenance reasons**. + + [Click here to read our official statement about brand logos in Lucide.](./BRAND_LOGOS_STATEMENT.md) + + You can [search for similar issues.](https://github.com/lucide-icons/lucide/issues?q=is%3Aissue+${VALUE}) + + We’re always happy to help on [Discord](https://discord.gg/EH6nSts)." - Always happy to help on [Discord](https://discord.gg/EH6nSts)." gh issue lock ${{ github.event.issue.number }} --reason spam - exit 1 + exit 0 fi done - env: - GH_TOKEN: ${{ github.token }} + +env: + GH_TOKEN: ${{ github.token }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a00e69020..f6e76ced7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,7 +20,7 @@ on: permissions: id-token: write # Required for OIDC - contents: read + contents: write jobs: pre-release: @@ -73,9 +73,6 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile - - name: Set Auth Token - run: npm config set //registry.npmjs.org/:_authToken ${{ inputs.NPM_TOKEN || secrets.NPM_TOKEN }} - - name: Set new version run: pnpm --filter ${{ matrix.package }} version --new-version ${{ needs.pre-release.outputs.VERSION }} --no-git-tag-version @@ -110,9 +107,6 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile - - name: Set Auth Token - run: npm config set //registry.npmjs.org/:_authToken ${{ secrets.NPM_TOKEN }} - - name: Set new version run: pnpm --filter lucide-static version --new-version ${{ needs.pre-release.outputs.VERSION }} --no-git-tag-version @@ -158,7 +152,9 @@ jobs: if: github.repository == 'lucide-icons/lucide' runs-on: ubuntu-latest needs: [pre-release, lucide-font] - + permissions: + id-token: write # Required for OIDC + contents: write steps: - uses: actions/checkout@v6 - uses: actions/download-artifact@v4 diff --git a/.github/workflows/version-up.sh b/.github/workflows/version-up.sh deleted file mode 100755 index 32892478e..000000000 --- a/.github/workflows/version-up.sh +++ /dev/null @@ -1,284 +0,0 @@ -#!/usr/bin/env bash -## Copyright (C) 2017, Oleksandr Kucherenko -## Last revisit: 2017-09-29 - -## get highest version tag for all branches -function highest_tag(){ - local TAG=$(git describe --tags `git rev-list --tags --max-count=1`) - echo "$TAG" -} - -## extract current branch name -function current_branch(){ - ## expected: heads/{branch_name} - ## expected: {branch_name} - local BRANCH=$(git rev-parse --abbrev-ref HEAD | cut -d"/" -f2) - echo "$BRANCH" -} - -## get latest/head commit hash number -function head_hash(){ - local COMMIT_HASH=$(git rev-parse --verify HEAD) - echo "$COMMIT_HASH" -} - -## extract tag commit hash code, tag name provided by argument -function tag_hash(){ - local TAG_HASH=$(git log -1 --format=format:"%H" $1 2>/dev/null | tail -n1) - echo "$TAG_HASH" -} - -## get latest revision number -function latest_revision(){ - local REV=$(git rev-list --count HEAD 2>/dev/null) - echo "$REV" -} - -## parse last found tag, extract it PARTS -function parse_last(){ - local position=$(($1-1)) - - # two parts found only - local SUBS=( ${PARTS[$position]//-/ } ) - #echo ${SUBS[@]}, size: ${#SUBS} - - # found NUMBER - PARTS[$position]=${SUBS[0]} - #echo ${PARTS[@]} - - # found SUFFIX - if [[ ${#SUBS} -ge 1 ]]; then - PARTS[4]=${SUBS[1],,} #lowercase - #echo ${PARTS[@]}, ${SUBS[@]} - fi -} - -## increment REVISION part, don't touch STAGE -function increment_revision(){ - PARTS[3]=$(( PARTS[3] + 1 )) - IS_DIRTY=1 -} - -## increment PATCH part, reset all other lower PARTS, don't touch STAGE -function increment_patch(){ - PARTS[2]=$(( PARTS[2] + 1 )) - PARTS[3]=0 - IS_DIRTY=1 -} - -## increment MINOR part, reset all other lower PARTS, don't touch STAGE -function increment_minor(){ - PARTS[1]=$(( PARTS[1] + 1 )) - PARTS[2]=0 - PARTS[3]=0 - IS_DIRTY=1 -} - -## increment MAJOR part, reset all other lower PARTS, don't touch STAGE -function incremet_major(){ - PARTS[0]="v$(( PARTS[0] + 1 ))" - PARTS[1]=0 - PARTS[2]=0 - PARTS[3]=0 - IS_DIRTY=1 -} - -## increment the number only of last found PART: REVISION --> PATCH --> MINOR. don't touch STAGE -function increment_last_found(){ - if [[ "${#PARTS[3]}" == 0 || "${PARTS[3]}" == "0" ]]; then - if [[ "${#PARTS[2]}" == 0 || "${PARTS[2]}" == "0" ]]; then - increment_minor - else - increment_patch - fi - else - increment_revision - fi - - # stage part is not EMPTY - if [[ "${#PARTS[4]}" != 0 ]]; then - IS_SHIFT=1 - fi -} - -## compose version from PARTS -function compose(){ - MAJOR="${PARTS[0]}" - MINOR=".${PARTS[1]}" - PATCH=".${PARTS[2]}" - REVISION=".${PARTS[3]}" - SUFFIX="-${PARTS[4]}" - - if [[ "${#PATCH}" == 1 ]]; then # if empty {PATCH} - PATCH="" - fi - - if [[ "${#REVISION}" == 1 ]]; then # if empty {REVISION} - REVISION="" - fi - - if [[ "${PARTS[3]}" == "0" ]]; then # if revision is ZERO - REVISION="" - fi - - # shrink patch and revision - if [[ -z "${REVISION// }" ]]; then - if [[ "${PARTS[2]}" == "0" ]]; then - PATCH=".0" - fi - else # revision is not EMPTY - if [[ "${#PATCH}" == 0 ]]; then - PATCH=".0" - fi - fi - - # remove suffix if we don't have a alpha/beta/rc - if [[ "${#SUFFIX}" == 1 ]]; then - SUFFIX="" - fi - - - echo "${MAJOR}${MINOR}${PATCH}${REVISION}${SUFFIX}" #full format -} - -# initial version used for repository without tags -INIT_VERSION=0.0.0.0-alpha - -# do GIT data extracting -TAG=$(highest_tag) -REVISION=$(latest_revision) -BRANCH=$(current_branch) -TAG_HASH=$(tag_hash $TAG) -HEAD_HASH=$(head_hash) - -# if tag and branch commit hashes are different, than print info about that -#echo $HEAD_HASH vs $TAG_HASH -if [[ "$@" == "" ]]; then - if [[ "$TAG_HASH" == "$HEAD_HASH" ]]; then - echo "Tag $TAG and HEAD are aligned. We will stay on the TAG version." - echo "" - NO_ARGS_VALUE='--stay' - else - PATTERN="^[0-9]+.[0-9]+(.[0-9]+)*(-(alpha|beta|rc))*$" - - if [[ "$BRANCH" =~ $PATTERN ]]; then - echo "Detected version branch '$BRANCH'. We will auto-increment the last version PART." - echo "" - NO_ARGS_VALUE='--default' - else - echo "Detected branch name '$BRANCH' than does not match version pattern. We will increase MINOR." - echo "" - NO_ARGS_VALUE='--minor' - fi - fi -fi - -# -# {MAJOR}.{MINOR}[.{PATCH}[.{REVISION}][-(.*)] -# -# Suffix: alpha, beta, rc -# No Suffix --> {NEW_VERSION}-alpha -# alpha --> beta -# beta --> rc -# rc --> {VERSION} -# -PARTS=( ${TAG//./ } ) -parse_last ${#PARTS[@]} # array size as argument -#echo ${PARTS[@]} - -# if no parameters than emulate --default parameter -if [[ "$@" == "" ]]; then - set -- $NO_ARGS_VALUE -fi - -# parse input parameters -for i in "$@" -do - key="$i" - - case $key in - -a|--alpha) # switched to ALPHA - PARTS[4]="alpha" - IS_SHIFT=1 - ;; - -b|--beta) # switched to BETA - PARTS[4]="beta" - IS_SHIFT=1 - ;; - -c|--release-candidate) # switched to RC - PARTS[4]="rc" - IS_SHIFT=1 - ;; - -r|--release) # switched to RELEASE - PARTS[4]="" - IS_SHIFT=1 - ;; - -p|--patch) # increment of PATCH - increment_patch - ;; - -e|--revision) # increment of REVISION - increment_revision - ;; - -g|--git-revision) # use git revision number as a revision part§ - PARTS[3]=$(( REVISION )) - IS_DIRTY=1 - ;; - -i|--minor) # increment of MINOR by default - increment_minor - ;; - --default) # stay on the same stage, but increment only last found PART of version code - increment_last_found - ;; - -m|--major) # increment of MAJOR - incremet_major - ;; - -s|--stay) # extract version info - IS_DIRTY=1 - NO_APPLY_MSG=1 - ;; - -t|--tag-only) # extract version info - TAG_ONLY=1 - ;; - --apply) - DO_APPLY=1 - ;; - -h|--help) - help - ;; - esac - shift -done - -# detected shift, but no increment -if [[ "$IS_SHIFT" == "1" ]]; then - # temporary disable stage shift - stage=${PARTS[4]} - PARTS[4]='' - - # detect first run on repository, INIT_VERSION was used - if [[ "$(compose)" == "0.0" ]]; then - increment_minor - fi - - PARTS[4]=$stage -fi - -# no increment applied yet and no shift of state, do minor increase -if [[ "$IS_DIRTY$IS_SHIFT" == "" ]]; then - increment_minor -fi - -compose - -# is proposed tag in conflict with any other TAG -PROPOSED_HASH=$(tag_hash $(compose)) -if [[ "${#PROPOSED_HASH}" -gt 0 && "$NO_APPLY_MSG" == "" ]]; then - echo -e "\033[31mERROR:\033[0m " - echo -e "\033[31mERROR:\033[0m Found conflict with existing tag \033[32m$(compose)\033[0m / $PROPOSED_HASH" - echo -e "\033[31mERROR:\033[0m Only manual resolving is possible now." - echo -e "\033[31mERROR:\033[0m " - echo -e "\033[31mERROR:\033[0m To Resolve try to add --revision or --patch modifier." - echo -e "\033[31mERROR:\033[0m " - echo "" - exit 1 -fi diff --git a/.gitignore b/.gitignore index 41cb26c26..41a9f0839 100644 --- a/.gitignore +++ b/.gitignore @@ -44,7 +44,7 @@ docs/.vitepress/data/releaseMetaData docs/.vitepress/data/categoriesData.json docs/.vitepress/data/iconDetails docs/.vitepress/data/relatedIcons.json +docs/.vitepress/data/brandStopwords.json docs/.vercel docs/.nitro .gitignore - diff --git a/.npmrc b/.npmrc deleted file mode 100644 index 3e775efb0..000000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -auto-install-peers=true diff --git a/brand-stopwords.json b/brand-stopwords.json new file mode 100644 index 000000000..be5cb329a --- /dev/null +++ b/brand-stopwords.json @@ -0,0 +1,149 @@ +{ + "adobe": "Adobe", + "airplay": "AirPlay", + "amazon": "Amazon", + "angular": "Angular", + "aws": "AWS", + "azure": "Azure", + "bandcamp": "Bandcamp", + "behance": "Behance", + "bitbucket": "Bitbucket", + "blender": "Blender", + "bluesky": "BlueSky", + "bootstrap": "Bootstrap", + "brave": "Brave", + "chakra": "Chakra UI", + "chrome": "Chrome", + "codepen": "Codepen", + "codesandbox": "CodeSandbox", + "csharp": "C#", + "cypress": "Cypress", + "dart": "Dart", + "deezer": "Deezer", + "deno": "Deno", + "discord": "Discord", + "docker": "Docker", + "dribbble": "Dribbble", + "dropbox": "Dropbox", + "edge": "Edge", + "ember": "Ember", + "epic": "Epic Games", + "erlang": "Erlang", + "esbuild": "esbuild", + "eslint": "ESLint", + "facebook": "Facebook", + "figjam": "FigJam", + "figma": "Figma", + "firebase": "Firebase", + "firefox": "Firefox", + "framer": "Framer", + "gatsby": "Gatsby", + "gcp": "Google Cloud", + "github": "GitHub", + "gitlab": "GitLab", + "golang": "GoLang", + "google": "Google", + "gmail": "Gmail", + "gravatar": "Gravatar", + "haskell": "Haskell", + "instagram": "Instagram", + "java": "Java", + "javascript": "JavaScript", + "jest": "Jest", + "jira": "Jira", + "kotlin": "Kotlin", + "kubernetes": "Kubernetes", + "less": "Less", + "leetcode": "LeetCode", + "leet-code": "LeetCode", + "line": "LINE", + "linkedin": "LinkedIn", + "lua": "Lua", + "mariadb": "MariaDB", + "mcp": "MCP", + "messenger": "Messenger", + "microsoft": "Microsoft", + "mongodb": "MongoDB", + "mui": "Material UI", + "mysql": "MySQL", + "nestjs": "NestJS", + "netflix": "Netflix", + "netlify": "Netlify", + "next": "Next.js", + "nodejs": "Node.js", + "notion": "Notion", + "nostr": "Nostr", + "npm": "npm", + "nuxt": "Nuxt", + "opera": "Opera", + "oracle": "Oracle", + "patreon": "Patreon", + "paypal": "PayPal", + "perl": "Perl", + "php": "PHP", + "pinterest": "Pinterest", + "pix": "PiX", + "playstation": "PlayStation", + "playwright": "Playwright", + "pnpm": "pnpm", + "postcss": "PostCSS", + "postgresql": "PostgreSQL", + "prettier": "Prettier", + "prisma": "Prisma", + "python": "Python", + "qwik": "Qwik", + "react": "React", + "reddit": "Reddit", + "redis": "Redis", + "rollup": "Rollup", + "rust": "Rust", + "safari": "Safari", + "sass": "Sass", + "scala": "Scala", + "scss": "Sass", + "semantic": "Semantic UI", + "shopify": "Shopify", + "skype": "Skype", + "slack": "Slack", + "solid": "SolidJS", + "soundcloud": "SoundCloud", + "spotify": "Spotify", + "sqlite": "SQLite", + "squarespace": "Squarespace", + "steam": "Steam", + "stripe": "Stripe", + "substack": "Substack", + "supabase": "Supabase", + "surge": "Surge", + "svelte": "Svelte", + "swift": "Swift", + "tailwind": "Tailwind CSS", + "telegram": "Telegram", + "terraform": "Terraform", + "tesla": "Tesla", + "tidal": "Tidal", + "tiktok": "TikTok", + "trello": "Trello", + "twitch": "Twitch", + "twitter": "Twitter", + "typescript": "TypeScript", + "unity": "Unity", + "unreal": "Unreal Engine", + "vercel": "Vercel", + "vimeo": "Vimeo", + "vite": "Vite", + "vitest": "Vitest", + "vue": "Vue", + "webpack": "Webpack", + "wechat": "WeChat", + "whatsapp": "WhatsApp", + "windows": "Windows", + "wix": "Wix", + "x.com": "X.com", + "x-social": "X.com", + "xbox": "Xbox", + "yarn": "Yarn", + "youtube": "YouTube", + "zig": "Zig", + "zoom": "Zoom" +} diff --git a/docs/.vitepress/api/gh-icon/symmetry/[...data].get.ts b/docs/.vitepress/api/gh-icon/symmetry/[...data].get.ts new file mode 100644 index 000000000..573be976e --- /dev/null +++ b/docs/.vitepress/api/gh-icon/symmetry/[...data].get.ts @@ -0,0 +1,55 @@ +import { eventHandler, setResponseHeader, defaultContentType } from 'h3'; +import { renderToString } from 'react-dom/server'; +import { createElement } from 'react'; +import Diff from '../../../lib/SvgPreview/Diff.tsx'; + +export default eventHandler((event) => { + const { params } = event.context; + + const pathData = params.data.split('/'); + const data = pathData.at(-1).slice(0, -4); + const [operation] = pathData; + + const newSrc = Buffer.from(data, 'base64') + .toString('utf8') + .replaceAll('\n', '') + .replace(/]*>|<\/svg>/g, ''); + + const width = parseInt( + (newSrc.includes('${newSrc}`; + } else if (operation === 'flip-horizontal') { + oldSrc = `${newSrc}`; + } else if (operation === 'flip-vertical') { + oldSrc = `${newSrc}`; + } else if (operation === 'flip-backslash') { + oldSrc = `${newSrc}`; + } else if (operation === 'flip-slash') { + oldSrc = `${newSrc}`; + } else { + return ''; + } + + const svg = Buffer.from( + // We can't use jsx here, is not supported here by nitro. + renderToString( + createElement(Diff, { oldSrc, newSrc, showGrid: true, height, width }, children), + ), + ).toString('utf8'); + + defaultContentType(event, 'image/svg+xml'); + setResponseHeader(event, 'Cache-Control', 'public,max-age=31536000'); + + return svg; +}); diff --git a/docs/.vitepress/lib/codeExamples/createCodeExamples.ts b/docs/.vitepress/lib/codeExamples/createCodeExamples.ts index 4ecb84f24..a2edebef5 100644 --- a/docs/.vitepress/lib/codeExamples/createCodeExamples.ts +++ b/docs/.vitepress/lib/codeExamples/createCodeExamples.ts @@ -9,14 +9,20 @@ type CodeExampleType = { const getIconCodes = (): CodeExampleType => { return [ { - language: 'js', + language: 'html', title: 'Vanilla', code: `\ -import { createIcons, icons } from 'lucide'; + -document.body.append('');\ +\ `, }, { diff --git a/docs/.vitepress/lib/codeExamples/createLabCodeExamples.ts b/docs/.vitepress/lib/codeExamples/createLabCodeExamples.ts index a977cde09..a38772523 100644 --- a/docs/.vitepress/lib/codeExamples/createLabCodeExamples.ts +++ b/docs/.vitepress/lib/codeExamples/createLabCodeExamples.ts @@ -10,10 +10,11 @@ type CodeExampleType = { const getIconCodes = (): CodeExampleType => { return [ { - language: 'js', + language: 'html', title: 'Vanilla', code: `\ -import { createIcons, icons } from 'lucide'; + -document.body.append('');\ +\ `, }, { diff --git a/docs/.vitepress/lib/getFallbackZip.tsx b/docs/.vitepress/lib/getFallbackZip.tsx index 9760697e9..6f776c47b 100644 --- a/docs/.vitepress/lib/getFallbackZip.tsx +++ b/docs/.vitepress/lib/getFallbackZip.tsx @@ -1,5 +1,5 @@ import { createLucideIcon } from 'lucide-react/src/lucide-react'; -import { type LucideProps, type IconNode } from 'lucide-react/src/createLucideIcon'; +import { type LucideProps, type IconNode } from 'lucide-react/src/types'; import { IconEntity } from '../theme/types'; import { renderToStaticMarkup } from 'react-dom/server'; import { IconContent } from './generateZip'; diff --git a/docs/.vitepress/theme/components/base/ColorPicker.vue b/docs/.vitepress/theme/components/base/ColorPicker.vue index 40ded8f48..6ba8b230e 100644 --- a/docs/.vitepress/theme/components/base/ColorPicker.vue +++ b/docs/.vitepress/theme/components/base/ColorPicker.vue @@ -1,23 +1,31 @@ @@ -45,19 +54,21 @@ const value = computed({ top: -5px; left: -5px; } + .color-input-wrapper { height: 24px; width: 24px; overflow: hidden; position: relative; - border-radius: 12px; + border-radius: 4px; flex-shrink: 0; } + .color-picker { background: var(--color-picker-bg, var(--vp-c-bg-alt)); border-radius: 8px; color: var(--vp-c-text-2); - padding: 4px 8px; + padding: 3px 8px 3px 3px; height: auto; font-size: 14px; text-align: left; @@ -66,6 +77,10 @@ const value = computed({ display: flex; align-items: center; gap: 2px; + transition: + color 0.25s, + border-color 0.25s, + background-color 0.25s; } .color-input-text { @@ -79,15 +94,18 @@ const value = computed({ text-align: left; border-radius: 8px; cursor: text; - transition: border-color 0.25s, background 0.4s ease; + transition: + border-color 0.25s, + background 0.4s ease; + letter-spacing: 1px; } -.color-picker:hover, .color-picker:focus { +.color-picker:hover, +.color-picker:focus { border-color: var(--vp-c-brand); background: var(--vp-c-bg-alt); } -.color-input[value="currentColor"] { - +.color-input[value='currentColor'] { } diff --git a/docs/.vitepress/theme/components/base/FakeInput.vue b/docs/.vitepress/theme/components/base/FakeInput.vue index 26a9380b1..d86621d65 100644 --- a/docs/.vitepress/theme/components/base/FakeInput.vue +++ b/docs/.vitepress/theme/components/base/FakeInput.vue @@ -1,22 +1,27 @@ @@ -34,10 +39,14 @@ defineProps({ cursor: text; display: flex; gap: 12px; - transition: color 0.25s, border-color 0.25s, background-color 0.25s; + transition: + color 0.25s, + border-color 0.25s, + background-color 0.25s; } -.fake-input:hover, .fake-input:focus { +.fake-input:hover, +.fake-input:focus { border-color: var(--vp-c-brand); background: var(--vp-c-bg-alt); } diff --git a/docs/.vitepress/theme/components/base/IconButton.vue b/docs/.vitepress/theme/components/base/IconButton.vue index f3ac32b1f..7006803ff 100644 --- a/docs/.vitepress/theme/components/base/IconButton.vue +++ b/docs/.vitepress/theme/components/base/IconButton.vue @@ -5,7 +5,6 @@ diff --git a/docs/.vitepress/theme/components/icons/IconsCategoryOverview.vue b/docs/.vitepress/theme/components/icons/IconsCategoryOverview.vue index 355bc2685..b5b9882b2 100644 --- a/docs/.vitepress/theme/components/icons/IconsCategoryOverview.vue +++ b/docs/.vitepress/theme/components/icons/IconsCategoryOverview.vue @@ -1,19 +1,19 @@