Skip to content
View nrps9909's full-sized avatar

Highlights

  • Pro

Block or report nrps9909

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
nrps9909/README.md

Ting-An Chen

Taiwan-based open-source developer focused on reproducible AI, data tooling, and validated Traditional Chinese localization.

來自台灣的開源開發者,關注可重現的 AI/資料工具,以及符合台灣用語的繁體中文在地化。

Recent upstream contributions

The public record below includes 37 merged PRs across 23 non-owned repositories since August 11, 2026, including 15 merged Ant Design PRs in a focused i18n/accessibility lane. In total it covers 39 different public upstream repositories and excludes projects I maintain. Every authored contribution uses a cryptographically signed commit verified by GitHub.

For clarity, I am an external Ant Design contributor—not an organization member, repository owner, or maintainer with write access. My maintenance evidence is public: scoped runtime and accessibility fixes, regression tests, reproducible issue triage, and 54 distinct current/final exact-head reviews across Ant Design and its canonical react-component dependencies.

Merged

Under review

I keep changes scoped, check for duplicate work before contributing, preserve runtime placeholders, and run each project's documented validation. AI assistance is disclosed when a project requires it, and localization is checked against the English source and established Taiwan terminology.

In Ant Design, I am also deepening the same subsystem through issue triage and review: a reproducible Table row-selection localization report led to external implementations, where I reviewed the locale and accessibility contract and later flagged a row-name identity tradeoff; the maintainer chose the existing line-information design and merged it. I also traced and reported Splitter's hardcoded English collapse-control names, then validated all 73 runtime locales and approved the resulting implementation. A separate RangePicker report led to a tested fix that hides the decorative default separator while preserving custom accessible names. I then applied the same accessibility principle to Collapse's redundant English expand-icon state, documented and tested native label association for nested complex Form controls, restored Upload focus-event callbacks across every root layout, re-enabled Rate's canonical list-item accessibility check, enforced accessible button names across all Alert demos, restored Tree connecting-line demo accessibility coverage, and validated and approved the Form vertical-label offset fix against its CSS cascade and responsive boundaries. I also approved a tested fix for Upload's asynchronous removal race, validated and approved the Dropdown menu semantic-DOM slot with the full Dropdown suite and focused merge-precedence probes, approved a state-safe Menu tooltip collapse fix after full Menu tests and controlled-state probes, validated and approved Space stretch alignment across horizontal and vertical layouts, validated and approved Spin minimum-duration state handling with timer and controlled-state probes, caught a raw-versus-mapped Anchor state regression and approved the corrected raw-identity implementation, caught a hover-induced focus-stealing regression in a proposed Dropdown keyboard fix through a red/green input-modality test, and reproduced an InputNumber data-loss regression caused by switching value ownership when allowClear is disabled at runtime. Following maintainer direction, I audited the canonical rc implementation, caught raw-input, localization, Escape-propagation, focus, and disabled-state regressions, and then approved the fully corrected implementation. I followed the locale data to Ant Design's Pagination dependency to correct the zh-TW size changer, blocked an interactive-icon regression that produced nested buttons, reviewed rc-menu's duplicate-popup-ID fix while verifying its true React compatibility boundary, caught a controlled-state callback loss in rc-trigger caused by descendant layout effects observing a stale dedup baseline, blocked an incomplete rc-picker accessibility overhaul after axe and keyboard probes exposed missing combobox relations and an unreachable grid, and caught stale expand-all eligibility in rc-table when permissions change without replacing the data array.

I revalidated the Anchor raw-identity fix on its latest head after a test refactor and master merge, approved a precise Typography editable callback clarification after source tracing, behavior probes, and the focused suite, and approved DirectoryTree range selection for the numeric key 0 after focused and full Tree suites plus independent forward, reverse, same-key, missing-key, empty-string, and nested-expanded probes. I also approved Notification stack-motion corrections after 185 focused tests, 77 snapshots, and real-Chromium checks across all six placements. In Ant Design #57345, I proved that the newly documented alwaysByViewport option was a no-op in the installed trigger implementation and requested either an upstream implementation or removal of the unsupported contract. In Segmented #59046, a real-preview click and computed-style probe showed the higher-specificity hover rule still overriding the selected-text color throughout thumb motion; I requested the selector fix and an interaction regression despite otherwise green tests and visual CI. In Splitter #59009, an independent keyboard probe showed that ArrowRight immediately committed 50/50 to 60/40 and fired onResize in lazy mode instead of deferring until the resize transaction ended. After the author restored preview-only updates and commit-on-Enter/Space/blur semantics, I approved the corrected exact head with the full 117-test, 44-snapshot Splitter suite and static checks passing. I also approved Checkbox.Group semantic styling after the complete Checkbox suite and an independent controlled-rerender probe verified dynamic root/item semantics and override precedence, then approved the parallel Radio.Group contract after verifying both regular Radio and Radio.Button propagation plus controlled value/option-type recomputation. Both Group semantic-DOM changes later merged after maintainer approval.

I initially revalidated Ant Design's localized clear-button accessibility update after the Select, Cascader, and TreeSelect suites passed with the declared rc-select dependency. When a later maintainer thread exposed that label-only allowClear objects dropped Ant Design's default CloseCircle icon, I superseded my approval with an exact-head change request, tracing the merge path and requesting default-icon plus explicit-override regressions without duplicating the existing inline thread. The final merged implementation restored the default icon and added regressions for both label-only and explicit-icon precedence. I also approved Cascader's explicit null empty-state handling after the full Cascader suite and five independent probes verified null, false, empty-string, zero, and inherited-default behavior. In the canonical dependency, I approved runtime checkStrictly support after 129 tests with independent parent-child, panel, and single-select state probes plus TypeScript and ESM/CJS builds. I later blocked an option-attribute forwarding patch because its closed-popup selector returned null, so every new assertion was skipped, while the public example introduced a dangling aria-labelledby; an expanded DOM probe verified the intended forwarding and reserved-attribute precedence while exposing the vacuous submitted regression.

In QRCode #59075, I approved the exact-head accessibility fix after verifying default names for canvas and SVG output, caller override precedence, undefined optional ARIA props, and empty-payload handling. The complete QRCode Jest and Vitest scopes, focused lint checks, diff validation, and all 41 applicable remote checks passed.

In Splitter #59084, an independent exact-head regression proved that controlled percentage sizes totaling 100% still bypassed the new minimum-size fitting path: 20% / 80% with min="40%" rendered as 120 / 480px in a 600px container instead of 240 / 360px. I requested the normalized path and a focused regression without duplicating the existing inline thread; the broader Splitter scope and 46 applicable remote checks otherwise passed.

In rc-tree #1069, I found that releasing a populated treeData prop to undefined did not fall back to children as the patch intended: an exact-head rerender probe still displayed the stale data node. I requested a defined-to-undefined regression and consistent next-source selection; the existing Tree suite, TypeScript, lint, diff, and remote source checks otherwise passed.

In Table #59078, I approved restoration of the full custom header onKeyDown contract after an expanded Space and arrow-key matrix verified that every key reaches the consumer callback while only Enter changes the sort order. The exact-head sorter suite passed 41 tests and 5 snapshots, with static checks and all 47 applicable remote checks green.

In Statistic #59101, I approved the numeric-zero semantic-node fix at exact head after both the complete Jest and Vitest files passed 27 tests and an independent rerender probe verified that zero-valued title, prefix, and suffix nodes are created and then removed for empty-string, false, and null values. The expanded probe passed 28 tests under each runner; focused lint and all applicable remote checks were green.

In Alert #59100, I approved the exact-head global closable type correction after tracing that ConfigProvider only supplies enablement, closeIcon, and ARIA attributes while component-level configuration owns onClose and afterClose. An independent compile-time matrix accepted booleans, empty objects, icons, and ARIA labels while rejecting onClose, afterClose, and disabled; the 86-test ConfigProvider suite, focused static checks, and all 47 applicable remote checks passed.

In Alert and Empty #59094, I approved consistent numeric-zero rendering after the complete Alert and Empty suites passed 38 tests and 5 snapshots under Jest and 38 tests under Vitest. Independent rerender probes expanded that matrix to 40 tests under both runners and verified removal of the title, description, action, footer, and with-description state for empty values; the review explicitly separates this focused verification from maintainer-triggered CI.

In CheckableTag #59087, I approved correction of the ConfigProvider/local style merge order after the official Tag semantic scope passed under both Jest and Vitest. Independent rerender probes verified the full precedence chain from context defaults through functional group item styles to per-option and component-local overrides, while preserving non-conflicting context properties; the expanded scope passed 10 tests under each runner with focused static checks green.

In Breadcrumb #59093, I approved a unified route-parameter replacement helper after the 33-test, 11-snapshot official scope passed. Three independent Jest/Vitest matrices verified regex-special parameter names, prefix collisions, repetition, replacement metacharacters, Unicode unknown-name boundaries, nullish and falsy values, and empty parameters; focused static checks and the applicable remote matrix were green.

In Transfer #59074, I approved the exact-head pagination clamp after the focused regression and an independent page-size/data-shrink probe passed under both Jest and Vitest. The expanded verification covered 116 Jest tests with 22 snapshots and all 30 Transfer Vitest tests, plus focused lint and diff checks; I separately documented a local rc-menu generated-ID snapshot mismatch while the PR's complete remote exact-head matrix remained green.

In Steps #59073, I requested changes because adding role="progressbar" made the internal SVG's hardcoded English <title>Progress</title> the active widget name in every locale. An independent zh-TW probe under ConfigProvider reproduced the English-only accessible name in both Jest and Vitest; the submitted role fix otherwise passed all 85 Steps tests, 64 snapshots, focused static checks, and the complete remote matrix. I requested a localized or caller-controlled name plus a regression that asserts the actual accessible name.

In Skeleton #59072, I approved hiding the always-decorative empty title placeholder from the accessibility tree after the complete Skeleton and Statistic scope passed 117 tests and 88 snapshots. An independent Jest/Vitest rerender probe verified that the physical placeholder remains visually present but exposes no false heading while loading, then disappears without hiding the real named child heading when content loads; focused static checks and the complete remote matrix were green.

In Grid #59066, I approved synchronous Row alignment derivation after all 67 Grid tests and 45 snapshots passed. An independent matchMedia transition probe passed in both Jest and Vitest, replacing xs middle/center with lg bottom/space-between in one update and removing both stale classes; the review explicitly notes that the repository excludes the official Grid index file from Vitest rather than misreporting it as covered.

I also approved rc-table's fixed-header scrollbar alignment fix after 232 tests, TypeScript, lint, documentation build, and a real-Chromium 15px scrollbar layout check. In the Tree dependency, I approved a detached-list-ref guard after two independent null-ref reproductions and the full test suite, then approved a focus-transition fix for interactive title descendants after its regressions, independent focus probes, TypeScript, and ESM/CJS builds passed. In the image dependency, I approved keyboard-navigation scroll isolation and a preview wheel-event isolation fix after full suites and independent event probes confirmed that preview navigation does not consume unrelated page input.

For Ant Design issue #59099, I traced an incorrect nested drag-and-drop result to rc-tree replacing the hovered first child with its parent before the root-only gap special case runs. The signed canonical rc-tree fix preserves the real hovered child before that fallback and adds LTR and RTL regressions for both the onDrop and allowDrop contracts. The exact base failed with parent 0-0, an inside drop, and position 0; the fixed head passed all 226 tests and 42 snapshots, TypeScript, formatting, ESM/CJS compilation, and diff validation.

For rc-tree-select issue #652, I reproduced that search traversal stopped at a disabled or selectable={false} parent and never activated its enabled matching child. The signed canonical fix excludes the parent itself while continuing through its descendants; both exact-base regressions failed before the change, while the fixed full suite passed 186 tests and 15 snapshots together with TypeScript, lint, and ESM/CJS compilation.

For rc-tree issue #931, I reproduced that rc-tree's Firefox text/plain fallback ran after the public onDragStart callback and erased the consumer's payload. The signed canonical fix initializes the fallback before the callback so consumers can override it; the exact base regression observed the custom value followed by the empty fallback, while the fixed head passed all 225 tests and 42 snapshots, TypeScript, lint, formatting, and ESM/CJS compilation.

After a maintainer clarified in Tree issue #59069 that useTree().getPath intentionally keeps a stable identity while reading the latest data at call time, I submitted a signed bilingual API documentation clarification. It shows that memoized values derived from getPath must also depend on treeData and the lookup key, making the otherwise invisible dependency boundary explicit without changing the runtime contract.

In Steps #59105, I reproduced that every visual panel separator exposed the repeated, English-only computed accessible name Arrow. The signed fix preserves the SVG separators while hiding them from assistive technology and adds a regression for both their physical presence and absent accessible names. The complete Steps scope passed 83 tests and 64 snapshots, with focused Jest/Vitest coverage and static checks green; the PR remains under review and is not counted as merged.

After the rc-menu author corrected the React peer contract I had previously flagged, I approved the exact corrected head: paired SSR-to-hydration probes on both React 19 and the minimum React 18 release produced unique, stable, resolvable popup IDs with zero hydration errors, while the exact base reproduced duplicate IDs. I also submitted a signed rc-slider drag-safety fix after reproducing the reported null-container crash on the exact base; the patch preserves the independent end/cleanup path and passes all 120 tests, 5 snapshots, TypeScript, lint, formatting, and compilation. A second signed rc-slider accessibility contribution implements the maintainer-welcomed aria-describedby request for both single and range handles without post-render DOM mutation; two exact-base regressions failed before the fix, while the final 121-test suite, TypeScript, lint, ESM/CJS declarations, CSS compilation, and diff validation passed. A third signed rc-slider drag-end fix moves document mouseup completion to the capture phase so an ancestor's stopPropagation() cannot strand the drag transaction; the exact base never called onChangeComplete and kept changing after release, while the fixed 120-test suite, TypeScript, lint, ESM/CJS declarations, CSS compilation, and diff validation passed. A signed mini-decimal fix now normalizes -0 at integer precision after an exact-base reproduction, with rounding and truncation boundaries covered by the complete suite. In a separate rc-trigger safe-polygon review, an exact-head timer probe caught a public mouseLeaveDelay={5} being clamped to about one second; I requested a fix with focused and full suites otherwise passing. I also caught a repeated-retry request-ownership bug in rc-upload: an earlier request could delete the newer request handle for the same UID, preventing later abort or unmount cleanup; an isolated probe reproduced the lost abort while the focused 55-test suite and static checks otherwise passed. In rc-mentions #307, a base/head focus probe showed the new scroll guard mistakes the showCount wrapper for the focused textarea and suppresses active-item scrolling; I requested comparison against the actual textarea ref plus a showCount regression after the full 49-test suite passed.

I also retested a stale Form accessibility report on current master and supplied focused evidence that its Select and DatePicker failure is already resolved. I similarly traced the old Tabs focus-visibility report to two merged fixes and the current DOM/style contract, helping maintainers retire obsolete backlog safely. I then revalidated Tabs keyboard activation on current master with an ArrowRight/Space/Enter interaction probe and the focused 39-test suite, tracing the resolved behavior to canonical rc-tabs #763. For a separate Tabs defect, I reproduced a critical aria-required-children violation in the extra-content DOM, revalidated the failure on current Ant Design master, and filed it at the canonical rc-tabs upstream with a focused axe reproduction, source trace, duplicate audit, and implementation boundaries. When an external contributor implemented the fix, I approved its exact corrected head after independent top/LTR and left/RTL ownership probes, axe checks, and an SSR-to-hydration test all passed; the complete plus expanded scope passed 80 tests and 3 snapshots with TypeScript and lint clean of errors. In Carousel issue #59003, I traced another hardcoded-English accessible-name path, checked every open PR for overlap, and requested maintainer direction on the locale contract before implementation rather than introducing an unreviewed public API.

I also revalidated and triaged a stale Select aria-activedescendant report against current master and the canonical rc-select fix, after which maintainer yoyo837 closed the issue as completed. I then confirmed AutoComplete's old always-false aria-selected report is fixed, tracing it to merged rc-select #1077 and verifying the matching and non-matching option states with 31 focused tests. After #59020 merged, I rechecked the older Tree aria-required-children report on current master: all 13 official Tree axe demos pass with that rule enabled, providing maintainers with current closure evidence. In rc-util #744, I approved the CSP nonce propagation at exact head after the full 173-test suite, TypeScript, focused lint, and ESM/CJS builds passed; an independent DOM-node probe verified that the temporary measurement style itself retained the nonce after cleanup, and a current-master comparison found no target-file drift. I also approved a verified CodeQL action pin update after checking the signed upstream tag, action metadata, and exact-head security workflow. In rc-util #768, I blocked an incomplete cross-frame Element predicate after exact-head probes showed plain { nodeType: 1 } objects passing isDOM/getDOM and a forged rectangle method passing isVisible; the 175-test runtime suite passed, but both new iframe tests also failed TypeScript on Window.HTMLElement. For rc-util issue #805, I reproduced that both delayed frame and timeout work remained scheduled after useDelayState unmounted, then submitted a signed cleanup fix with regression coverage. The exact base retained one timer in each new case; the fixed head passed the 10-test focused scope, all 29 suites with 184 passing tests and one skip, TypeScript, lint, formatting, ESM/CJS compilation, and diff validation. For Ant Design issue #59044, I traced a missed shouldUpdate notification to rc-util deleting from a nested object still shared with the previous store. The signed canonical immutability fix clones the child container before removal; its exact-base regression proved the input object was mutated, the fixed full suite passed 182 tests with one skip, and the downstream rc-field-form preserve reproduction passed all 13 tests with the local build.

Popular repositories Loading

  1. twstock-predictor twstock-predictor Public

    Open-source 台股量化分析:20 因子評分、Chronos/XGBoost 預測、FastAPI、Next.js 與風險控制

    Python 6

  2. 112-web-introduction 112-web-introduction Public archive

    HTML

  3. DCA DCA Public archive

    HTML

  4. 112-data-structure 112-data-structure Public archive

    Python 1

  5. 112-TAHRD-python 112-TAHRD-python Public archive

    Python

  6. LLMTwins LLMTwins Public archive

    Forked from towNingtek/LLMTwins

    A prototype for LLMTwins demo

    Python