diff --git a/.github/renovate.json5 b/.github/renovate.json5 new file mode 100644 index 0000000..f7217b0 --- /dev/null +++ b/.github/renovate.json5 @@ -0,0 +1,18 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": ["config:recommended", "schedule:weekly"], + "enabledManagers": ["github-actions"], + "packageRules": [ + { + "matchManagers": ["github-actions"], + "matchDepTypes": [ + "docker", + "container", + "service", + "github-runner", + "uses-with" + ], + "enabled": false + } + ] +} diff --git a/.github/workflows/autofix.yml b/.github/workflows/autofix.yml new file mode 100644 index 0000000..b572a58 --- /dev/null +++ b/.github/workflows/autofix.yml @@ -0,0 +1,30 @@ +name: autofix.ci + +on: + pull_request: +permissions: + contents: write + +jobs: + autofix: + runs-on: ubuntu-latest + timeout-minutes: 10 + + steps: + - uses: actions/checkout@v7 + + - name: Use Node.js lts/* + uses: actions/setup-node@v7 + with: + node-version: lts/* + + - name: Install pnpm + uses: pnpm/action-setup@v6 + + - name: Install + run: pnpm i + + - name: Lint + run: pnpm run lint:fix + + - uses: autofix-ci/action@635ffb0c9798bd160680f18fd73371e355b85f27 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..a4a14a1 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,25 @@ +name: CI + +on: + pull_request: + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + + - name: Install pnpm + uses: pnpm/action-setup@v6 + + - name: Set node + uses: actions/setup-node@v7 + with: + node-version: lts/* + cache: pnpm + + - name: Install + run: pnpm i + + - name: Lint + run: pnpm run lint diff --git a/.github/workflows/pkg.pr.new.yml b/.github/workflows/pkg.pr.new.yml new file mode 100644 index 0000000..e7e2e48 --- /dev/null +++ b/.github/workflows/pkg.pr.new.yml @@ -0,0 +1,36 @@ +name: Publish pkg.pr.new + +on: + pull_request: { } + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v7 + + - name: Use pnpm + uses: pnpm/action-setup@v6 + + - uses: actions/setup-node@v7 + with: + node-version: lts/* + cache: pnpm + + - name: Install dependencies + run: pnpm i + + - name: Build + run: pnpm build + + - name: Publish pkg.pr.new + run: npx pkg-pr-new publish diff --git a/.github/workflows/pr-contributor-welcome.yml b/.github/workflows/pr-contributor-welcome.yml new file mode 100644 index 0000000..f581b20 --- /dev/null +++ b/.github/workflows/pr-contributor-welcome.yml @@ -0,0 +1,37 @@ +name: Pull Request Contributor Welcome + +on: + pull_request_target: + types: + - closed +# paths: +# - 'components/**' + +permissions: + contents: read + +jobs: + comment: + permissions: + issues: write # for actions-cool/maintain-one-comment to modify or create issue comments + pull-requests: write # for actions-cool/maintain-one-comment to modify or create PR comments + if: github.event.pull_request.merged == true && github.repository == 'antdv-next/cli' + runs-on: ubuntu-latest + steps: + - name: get commit count + id: get_commit_count + run: | + PR_AUTHOR=$(echo "${{ github.event.pull_request.user.login }}") + RESULT_DATA=$(curl -s "https://api.github.com/repos/${{ github.repository }}/commits?author=${PR_AUTHOR}&per_page=5") + DATA_LENGTH=$(echo $RESULT_DATA | jq 'if type == "array" then length else 0 end') + echo "COUNT=$DATA_LENGTH" >> $GITHUB_OUTPUT + - name: Comment on PR + if: steps.get_commit_count.outputs.COUNT < 3 + uses: actions-cool/maintain-one-comment-backup@fbbc22ad1809c1bcf46f19b58397b6254773588c + with: + token: ${{ secrets.GITHUB_TOKEN }} + body: | + 🎉 Thx for the PR @${{ github.event.pull_request.user.login }} + + + body-include: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..206c6bf --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,25 @@ +name: Release + +permissions: + contents: write + +on: + push: + tags: + - 'v*' + +jobs: + release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + with: + fetch-depth: 0 + + - uses: actions/setup-node@v6 + with: + node-version: lts/* + + - run: npx genereleaselog + env: + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/.github/workflows/sync.yml b/.github/workflows/sync.yml new file mode 100644 index 0000000..bdbe197 --- /dev/null +++ b/.github/workflows/sync.yml @@ -0,0 +1,61 @@ +name: Sync data + +on: + schedule: + - cron: '28 * * * *' + workflow_dispatch: + +permissions: + contents: write + id-token: write + +concurrency: + group: sync-data + cancel-in-progress: false + +jobs: + sync: + runs-on: ubuntu-latest + timeout-minutes: 15 + + steps: + - name: Checkout repository + uses: actions/checkout@v7 + + - name: Install latest pnpm + uses: pnpm/action-setup@v6 + with: + version: latest + + - name: Set up Node.js + uses: actions/setup-node@v7 + with: + node-version: lts/* + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Clone antdv-next source + run: git clone --filter=tree:0 --no-checkout https://github.com/antdv-next/antdv-next.git antdv-source + + - name: Generate changelog data + run: pnpm exec tsx scripts/changelog.ts + + - name: Sync version data + run: pnpm exec tsx scripts/sync.ts + + - name: Remove antdv-next source + if: always() + run: rm -rf antdv-source + + - name: Commit data changes + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add -- data/ + + git commit --no-verify -m "chore(data): sync antdv-next metadata" + git push origin main + env: + GH_TOKEN: ${{ github.token }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cb4bf72 --- /dev/null +++ b/.gitignore @@ -0,0 +1,147 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.* +!.env.example + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist +.output + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp directory +.temp + +# Sveltekit cache directory +.svelte-kit/ + +# vitepress build output +**/.vitepress/dist + +# vitepress cache directory +**/.vitepress/cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# Firebase cache directory +.firebase/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# pnpm +.pnpm-store + +# yarn v3 +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions + +# Vite files +vite.config.js.timestamp-* +vite.config.ts.timestamp-* +.vite/ + +.idea +.tmp-npm-pack +/antdv-source/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..3761d87 --- /dev/null +++ b/README.md @@ -0,0 +1,115 @@ +
+ +
+ +Antdv Next + +

Antdv Next CLI

+ +**命令行上的 Antdv Next。**
+查询组件知识、分析项目用量、指导版本迁移 — 完全离线。 + +
+ +
+ +## 🤔 为什么 + +Code Agent(Claude Code、Codex、Gemini CLI)在拥有即时 API 数据访问能力时,能写出更好的 antdv next 代码。这个 CLI +正是为此而生 — antdv next 的每个 Prop、Token、Demo 和 Changelog 条目,本地打包,毫秒级查询。 + +```bash +npx skills add antdv-next/antdv-next-cli # install as an agent skill +``` + +
+ +## ✨ 亮点 + +- 📦 **完全离线** — 所有元数据随包安装,无需网络请求,无延迟,无 API Key。 +- 🤖 **Agent 优化** — 所有命令支持 `--format json`。结构化错误码与修复建议。stdout/stderr 严格分离。 +- 🌍 **双语输出** — 每个组件名、描述和文档均有中英文。通过 `--lang zh` 切换。 +- 🔮 **智能纠错** — 输入 `Buttn`?CLI 基于 Levenshtein 距离建议 `Button`,优先匹配首字母相同的候选。 +- 🔌 **MCP 服务** — `antd mcp` 启动 stdio 服务,原生集成 Claude Desktop、Cursor 等 IDE。 + +## 📦 安装 + +```bash +npm install -g @antdv-next/cli +``` + +
+其他包管理器 + +```bash +pnpm add -g @antdv-next/cli +bun add -g @antdv-next/cli +``` + +
+ +
+ +## 🤖 Agent 集成 + +CLI 内置 [Skill 文件](./skills/antdv-next/SKILL.md),指导 Code Agent 在正确的时机调用正确的命令: + +```bash +npx skills add antdv-next/cli +``` + +或者直接告诉你的 Code Agent: + +> 安装 `@antdv-next/cli` 和 `antdv-next/cli` 的 antdv next skill + +Agent 会自动完成 `npm install`、`npx skills add`,并开始使用 CLI。 + +### MCP 服务 + +支持 [Model Context Protocol](https://modelcontextprotocol.io) 的 IDE 可直接将 CLI 作为 MCP 服务使用: + +```json +{ + "mcpServers": { + "antd": { + "command": "antd", + "args": ["mcp"] + } + } +} +``` + +如需固定 antd 版本,在 `args` 数组中添加 `"--version", "5.20.0"`。 + +提供 8 个工具(`antdv_list`、`antdv_info`、`antdv_doc`、`antdv_demo`、`antdv_token`、`antdv_design_md`、`antdv_semantic`、`antdv_changelog`)和 2 个提示词(`antdv-expert`、`antdv-page-generator`)。 + +支持 [Claude Code](https://claude.ai/code)、[Cursor](https://cursor.sh)、[Codex](https://openai.com/codex)、[Gemini CLI](https://github.com/google-gemini/gemini-cli) 等所有兼容 [skills](https://github.com/nicepkg/agent-skills) 协议的 Agent。 + +
+ +## 🚀 快速开始 + +```bash +antdv list # 所有组件及版本信息 +antdv info Button # 组件 Props、类型、默认值 +antdv doc Button # 完整 Markdown 文档 +antdv demo Select basic # 可运行的 Demo 源码 +antdv token DatePicker # Design Token 值(v5+) +antdv design.md # 设计语言文档(design.md) +antdv semantic Table # classNames / styles 结构 +antdv changelog 4.24.0 5.0.0 Select # 跨版本 API 差异对比 +antdv doctor # 诊断项目配置问题 +antdv env # 收集环境信息用于 Bug 报告 +antdv usage ./src # 分析项目中的 antd 导入 +antdv lint ./src # 检查废弃 API 和最佳实践 +antdv migrate 3 4 # v3 → v4 迁移指南 +antdv migrate 4 5 --apply ./src # 生成 Agent 迁移提示 +antdv mcp # 启动 MCP 服务,供 IDE 集成 +antdv setup --client claude # 为 AI Agent 接入 MCP/Skill +antdv upgrade # 升级 CLI 到最新版本 +``` + + +## 📄 开源协议 + +[MIT](./LICENSE) © [Antv Next](https://antdv-next.com) \ No newline at end of file diff --git a/bin/antdv.js b/bin/antdv.js new file mode 100755 index 0000000..88213af --- /dev/null +++ b/bin/antdv.js @@ -0,0 +1,2 @@ +#!/usr/bin/env node +import('../dist/index.mjs') diff --git a/data/changelog.json b/data/changelog.json new file mode 100644 index 0000000..d44112a --- /dev/null +++ b/data/changelog.json @@ -0,0 +1,2754 @@ +[ + { + "version": "1.5.1", + "date": "2026-08-14", + "changelog": [ + { + "component": "", + "type": "feat", + "description": "expose `nativeElement` refs on ~20 components — Avatar.Group, Badge.Ribbon, Breadcrumb, Calendar, Card.Grid, Card.Meta, Carousel, Descriptions, Divider, Empty, FloatButton.Group, QRCode, Result, Skeleton, Space.Compact, Spin, Splitter, Transfer and Watermark — with the ref types exported from the entry (#58627~#58667)" + }, + { + "component": "form", + "type": "feat", + "description": "rule `message` accepts a render function `() => VueNode`; it is kept as-is through validation and only invoked while rendering the error, so any reactive state it reads (locale, i18n, ...) updates the displayed message without re-running validators; works with form-level and computed `rules` as well ([#714](https://github.com/antdv-next/antdv-next/pull/714))" + }, + { + "component": "tree", + "type": "feat", + "description": "`scrollTo` supports `autoExpand`, add `Tree.useTree` and export `TreeInstance` / `UseTreeConfig` (#58841)" + }, + { + "component": "table", + "type": "feat", + "description": "support `forceRender` for expandable rows (#58860)" + }, + { + "component": "float-button", + "type": "feat", + "description": "BackTop gains `showProgress`, rendering scroll progress as a ring (#58894)" + }, + { + "component": "pagination", + "type": "feat", + "description": "add `components.sizeChanger` to customize the size changer (#58831)" + }, + { + "component": "mentions", + "type": "feat", + "description": "support `popupRender` to customize the dropdown (#58582)" + }, + { + "component": "input", + "type": "feat", + "description": "ConfigProvider variant config supports the `inputSearch` / `inputPassword` / `otp` subcomponents, each resolving its own config first (#58784)" + }, + { + "component": "tooltip, popover, popconfirm", + "type": "feat", + "description": "`mouseEnterDelay` / `mouseLeaveDelay` configurable globally via ConfigProvider (#58892)" + }, + { + "component": "theme", + "type": "feat", + "description": "add the `focusOutline` seed token for shared focus styles, honored by Input, Select, Rate, Splitter and Steps; Alert gains a `borderRadius` component token (#58647, #58708, #57765)" + }, + { + "component": "image", + "type": "feat", + "description": "preview supports `wheel` to control mouse-wheel zoom (`@v-c/image@1.1.0`, #58728)" + }, + { + "component": "border-beam", + "type": "feat", + "description": "add `count` to configure the number of beams, evenly distributed (#58691)" + }, + { + "component": "locale", + "type": "feat", + "description": "add Albanian `sq_AL`; refine Traditional Chinese terminology and use Taiwan week wording in DatePicker (#58618, #58947, #58951)" + }, + { + "component": "form", + "type": "fix", + "description": "rules combining `required` and `type` no longer run type validation twice; FormItem `required` no longer derives a validation rule and only drives the required mark, aligning with antd" + }, + { + "component": "form", + "type": "fix", + "description": "function rules resolve with the form instance as argument and are re-resolved on every validation, so they can read the latest external state" + }, + { + "component": "form", + "type": "fix", + "description": "form controls now carry `aria-required` and link help and error text via `aria-describedby`" + }, + { + "component": "table", + "type": "fix", + "description": "an explicitly placed `Table.EXPAND_COLUMN` no longer loses its identity through `ref()` / `reactive()` proxies, removing the phantom empty column (`@v-c/table@1.2.0`)" + }, + { + "component": "tree-select", + "type": "fix", + "description": "preserve the selection state of disabled child nodes (`@v-c/tree-select@1.1.2`)" + }, + { + "component": "select", + "type": "fix", + "description": "the clear icon is reachable by keyboard (`@v-c/select@1.2.1`)" + }, + { + "component": "virtual-list", + "type": "fix", + "description": "`scrollTo({ key })` resolves against the latest data and retries after a data update (`@v-c/virtual-list@1.1.1`)" + }, + { + "component": "carousel", + "type": "fix", + "description": "keep the current slide when children are added instead of resetting to the first (#58845)" + }, + { + "component": "drawer", + "type": "fix", + "description": "support a disabled close button (#58853)" + }, + { + "component": "", + "type": "fix", + "description": "correct semantic style priority — ConfigProvider's root `style` now sits between context styles and component styles across 20+ components including Badge, Calendar, ColorPicker, DatePicker, Drawer, Dropdown and Modal; also fixes Divider spreading the whole semantic styles object onto its root, Masonry dropping component-level `styles.root`, and the message Holder merge order (#58550, #58564)" + }, + { + "component": "config-provider", + "type": "fix", + "description": "the `inputSearch` component config previously never reached the context and was silently dead; it now applies" + }, + { + "component": "typography", + "type": "fix", + "description": "restore the interactive ellipsis tooltip — hovering the popup no longer dismisses it (#58661, #58722)" + }, + { + "component": "button", + "type": "fix", + "description": "align loading icon styles, dropping the redundant centering and block declarations (#58712)" + }, + { + "component": "types", + "type": "fix", + "description": "export the missing `UploadRef`, `StatisticRef` and `SliderRef` types (#58700, #58798)" + }, + { + "component": "site", + "type": "fix", + "description": "harden mainland China detection for the docs site switch" + }, + { + "component": "select, table, tree", + "type": "fix", + "description": "virtual scrollbars gain `cursor: pointer` and hover feedback (#58658, #58679)" + }, + { + "component": "", + "type": "docs", + "description": "add the design system documentation ([#707](https://github.com/antdv-next/antdv-next/pull/707)) and refresh the getting-started guide" + }, + { + "component": "docs", + "type": "feat", + "description": "support multi-file demo tabs in the code panel" + }, + { + "component": "", + "type": "docs", + "description": "add demos for Avatar `overflowInFinal`, reactive Form validation messages and Tabs `more.popupRender`; document the Image preview `wheel` prop" + }, + { + "component": "sync", + "type": "chore", + "description": "sync ant-design **6.6.0** upstream changes ([#703](https://github.com/antdv-next/antdv-next/pull/703), [#710](https://github.com/antdv-next/antdv-next/pull/710))" + }, + { + "component": "deps", + "type": "chore", + "description": "upgrade `@v-c/virtual-list@1.1.1`, `@v-c/tree@1.2.0`, `@v-c/select@1.2.1`, `@v-c/tree-select@1.1.2`, `@v-c/table@1.2.0`, `@v-c/image@1.1.0`" + }, + { + "component": "", + "type": "refactor", + "description": "Button's delayed loading, Slider's tooltip toggle, Upload's progress reveal and Typography's copy feedback all move onto the shared `useDelayState` (#58690)" + } + ] + }, + { + "version": "1.5.0", + "date": "2026-08-07", + "changelog": [ + { + "component": "listy", + "type": "feat", + "description": "add the experimental Listy component with standard and virtual lists, grouped data and sticky headers, infinite-loading scenarios, semantic `classes` / `styles`, and a `scrollTo` API for scrolling to a position, item or group ([#670](https://github.com/antdv-next/antdv-next/pull/670))" + }, + { + "component": "border-beam", + "type": "feat", + "description": "add `duration`, `lineWidth` and `size` to control animation duration, beam width and beam size respectively; add demos for these options and custom containers" + }, + { + "component": "layout", + "type": "fix", + "description": "support both a `trigger` prop and slot on Layout Sider; restore the default trigger when neither is supplied, and allow an explicit `null` to hide it" + }, + { + "component": "segmented", + "type": "fix", + "description": "in controlled mode, keep the selected item on the controlled value when the consumer does not update `value` after `change`, instead of incorrectly switching to the clicked item; upgrade the primitive to `@v-c/segmented@1.0.4`" + }, + { + "component": "alert", + "type": "fix", + "description": "an object-valued `closable` now enables closing even when it does not provide `closeIcon`" + }, + { + "component": "checkbox", + "type": "fix", + "description": "Checkbox Group ignores `null` / `undefined` options and options without a valid `value`, avoiding invalid checkbox items" + }, + { + "component": "float-button", + "type": "fix", + "description": "BackTop jumps to the top without animation when the user enables `prefers-reduced-motion`; the shared `scrollTo` utility now also supports zero-duration scrolling and cancellation of unfinished animations" + }, + { + "component": "app", + "type": "fix", + "description": "with CSS variables and `component={false}`, only warn when root classes or styles would actually be dropped (#58876)" + }, + { + "component": "border-beam", + "type": "fix", + "description": "fall back to default border information when `getComputedStyle` throws on the host element, preventing BorderBeam from breaking the component tree" + }, + { + "component": "types", + "type": "fix", + "description": "correct the DatePicker semantic return value and Tour `actionsRender` declarations to match the actual component-level APIs" + }, + { + "component": "listy", + "type": "docs", + "description": "add Chinese and English component docs with demos for basic usage, virtual scrolling, grouping, imperative scrolling, rich content, infinite loading and semantic styling" + }, + { + "component": "docs", + "type": "perf", + "description": "load component demo source only when the code panel is expanded, so the browser no longer parses every demo's source and highlighted output during page initialization; development HMR remains supported and loaded source is reused across collapse and re-expand" + }, + { + "component": "sync", + "type": "chore", + "description": "sync upstream changes from ant-design **6.5.4**" + }, + { + "component": "deps", + "type": "chore", + "description": "add `@v-c/listy@1.0.2` and upgrade `@v-c/picker` to 1.3.2 ([#684](https://github.com/antdv-next/antdv-next/pull/684)), `@v-c/segmented` to 1.0.4 and `@v-c/table` to 1.1.9" + } + ] + }, + { + "version": "1.4.6", + "date": "2026-08-03", + "changelog": [ + { + "component": "date-picker", + "type": "fix", + "description": "blur no longer submits an unconfirmed partial range when using `showTime` with `allowEmpty`. Comes from the RangePicker interaction-flow refactor in `@v-c/picker@1.3.0`, where every interaction is resolved into a single action before anything executes, so event sources no longer submit or reset values on their own ([#681](https://github.com/antdv-next/antdv-next/pull/681), #58803)" + }, + { + "component": "slider", + "type": "fix", + "description": "`onFocus` / `onBlur` no longer fire more than once. Vue's `cloneVNode` merges `on*` props into an array and invokes each one — React's `cloneElement` overwrites — so an explicit dispatch on top of that duplicated the callback. The two paths are also asymmetric: `@v-c/slider`'s `Handle` declares `onFocus` as a prop but never `onBlur` ([#681](https://github.com/antdv-next/antdv-next/pull/681), #58711)" + }, + { + "component": "table", + "type": "fix", + "description": "selecting all data no longer picks up disabled rows on other pages. It relied on `checkboxPropsMap`, which only covers the current page, so records elsewhere had no `disabled` entry and read as selectable ([#681](https://github.com/antdv-next/antdv-next/pull/681), #58843)" + }, + { + "component": "table", + "type": "fix", + "description": "keep `dataIndex` accessible on the columns union ([#673](https://github.com/antdv-next/antdv-next/pull/673))" + }, + { + "component": "transfer", + "type": "fix", + "description": "deselect-all is correct while filtering. It compared key counts, but filtering narrows the keys to the visible items, so a fully-checked list read as unchecked ([#681](https://github.com/antdv-next/antdv-next/pull/681), #58844)" + }, + { + "component": "transfer", + "type": "fix", + "description": "preserve the disabled state of custom actions ([#668](https://github.com/antdv-next/antdv-next/pull/668), #58718)" + }, + { + "component": "input", + "type": "fix", + "description": "`Input.OTP` no longer renders the original value when `mask` is a string — the mask overlay was effectively doing nothing — and an explicitly supplied `type` now wins over the mask-derived one ([#681](https://github.com/antdv-next/antdv-next/pull/681), #58805, #58835)" + }, + { + "component": "input", + "type": "fix", + "description": "hide the `Input.TextArea` resize handle on touch devices ([#681](https://github.com/antdv-next/antdv-next/pull/681), #58812)" + }, + { + "component": "select", + "type": "fix", + "description": "suffix icons and selected content no longer overlap the clear icon under custom theme colours ([#681](https://github.com/antdv-next/antdv-next/pull/681), #58581)" + }, + { + "component": "select", + "type": "fix", + "description": "the clear button is reachable by keyboard — visible and outlined on focus, and a custom suffix holding focus is no longer hidden. The clear affordance is a focusable `