| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
chore: sync v0.6.4 release bookkeeping to main (#6869) | 1 天前 | |
chore: sync v0.6.4 release bookkeeping to main (#6869) | 1 天前 | |
[Component Audit] Code: restore complete API discovery (#6914) * docs(Code): restore component API discovery * test(Code): cover documented component surface * test(Code): cover documented component surface * test(Code): run browser contract assertions * test(Code): distinguish every color state | 7 小时前 | |
feat(DropdownMenuItem): a row that navigates is a real link (href, target, rel) (#6835) * feat(DropdownMenuItem): a row that navigates is a real link (href, target, rel) * fix(DropdownMenuItem): the menu owns the link root; close on middle click Three review rulings applied to the link-row change. The link root is no longer inferred inside shared Item. Item made its ROOT the anchor whenever a row had both a role and an href, which reaches every Item consumer and nests whatever the caller put in startContent or endContent inside an anchor — invalid, and more interactive row content is arriving. Item's rule is unchanged instead: the root is whatever `as` says it is. `as` now also accepts a component, and DropdownMenuItem passes the application's link component when its row has an address. The decision is the menu's, made at the menu's callsite, where the row's content is known. Middle click now closes the menu. A real middle click fires auxclick, never click, so the row's handler never saw it: the tab opened and the menu stayed open behind it. A right click still goes to the browser's context menu, and a disabled row carries no address so there is nothing to open. Blocked destinations are covered by a case. They work by construction here: the row's root is the application's link component, which already applies the shared destination rule, so a rejected scheme renders with no href and goes nowhere. Both behaviors are pinned by mutation-checked cases. Original change by vjeux; this commit applies the review rulings. * fix: assemble the blocked destination instead of writing it literally A literal javascript: URL is a lint error in source. The test is about what the component does with an address that arrived from data at runtime, so building the string says the same thing without tripping the rule. * fix: use the repo's convention for a blocked URL in a test Assembling the string did not help — the rule reads through it. The repository already has a convention for exactly this case, in useLinkComponent.test.tsx and useClickableContainer.test.tsx: a scoped disable naming the reason. Following it. --------- Co-authored-by: Cindy Zhang <cindyxz@meta.com> | 15 分钟前 | |
Prototype single-sheet MobileTokenizer flow (#6855) * Prototype single-sheet MobileTokenizer flow * Add progressive MobileTokenizer list rendering * Reset MobileTokenizer render window after search * Keep MobileTokenizer checkbox layout in Lab * Keep MobileTokenizer rows stable while open | 1 天前 | |
chore: sync v0.6.4 release bookkeeping to main (#6869) | 1 天前 | |
chore: sync v0.6.4 release bookkeeping to main (#6869) | 1 天前 | |
chore(deps): make node_modules strict, declare what each package imports (#5327) * chore(deps): make node_modules strict, declare what each package imports Drops `nodeLinker: hoisted` and `shamefullyHoist: true`, both inherited verbatim from the pre-pnpm-11 .npmrc (#3700). nodeLinker was annotated there as pnpm's default, which it is not -- the default is `isolated` -- and pairing it with shamefullyHoist is pnpm/pnpm#6620. shamefullyHoist is `publicHoistPattern: '*'`, which let eleven packages import modules they never declared; all eleven are now declared, at the versions the workspace already resolved. The Babel toolchain and Testing Library move into the catalog, each having been duplicated across 4-6 packages. Consolidating them surfaced an incoherent Babel pin: Dependabot had raised `@babel/cli` (#4067) and `@babel/preset-react` (#3839) to 8.x on their own while `@babel/core` and `@babel/preset-typescript` stayed on 7.x, and the 8.x releases peer on `@babel/core: ^8.0.0` -- a set no single core version can satisfy. All four now sit on ^7.29.7, matching the core that actually runs; `pnpm peers check` drops from 4 unmet peers to 2 unrelated ones. Moving to Babel 8 is a migration of its own. Also fixes a latent `astryx doctor` bug the linker change exposed: checkPeerDeps resolved peers with `require.resolve(name, {paths: [cwd]})`, but Node folds NODE_PATH in regardless, so a peer merely reachable from the ambient environment read as installed and doctor stayed silent about a missing one. It now walks the project's own node_modules and reads package.json off disk, so every peer gets range-checked. The existing test caught this unmodified. One test read a bin the same way. public-artifact-cli.test.mjs spawns tsx by absolute path out of the repo root's node_modules/.bin, which only ever held one because shamefullyHoist published every bin there; tsx is declared by internal/vibe-tests, so it now spawns that package's own bin. Scripts were never at risk -- pnpm puts both bin directories on PATH -- and the repo's only other hardcoded root bin, tsc in cli-api-types-verify.mjs, resolves because typescript is a root devDependency. Verified on a recreated node_modules: build, test, storybook:build, docsite and sandbox builds, check:repo, verify-exports, eslint, and every typecheck CI gates all pass. The local test failures that remain reproduce on main from a clean worktree -- BSD `cp` has no `--reflink`, and two story titles predate the story tree's shape rule -- and CI reported none of them. * chore(changeset): patch @astryxdesign/cli for the doctor peer-resolution fix The linker change also alters published behavior in `astryx doctor`, so the fix needs a changeset to reach users in the next release. * fix(cli): resolve packages through the project's own node_modules chain Dropping the hoisted layout removes the flat root copy that three resolutions quietly relied on. Each landed on main after this branch's previous rebase, so CI met them for the first time here. - packages/core used @heroicons/react in its Button accessibility fixtures without declaring it (#6131). Storybook's typecheck and the Button a11y suite could not resolve it. - build.packed-old-core.test.mjs staged the packed CLI's runtime dependencies from the repo root, where only a hoisted node_modules puts a package's own dependencies (#5543). - core-interception's CommonJS probe reached a core through NODE_PATH, which is where pnpm's isolated layout exposes every package and where Vitest points it. Wrapping that core fails on a require(esm) namespace, and the coverage gap it then reported rejected every theme whose lineage was unobserved (#5543). doctor's findInstalledPackage moves to foundation/fs/paths.mjs and is now the single chain walk all three share. It answers only from the caller's own node_modules, never from the ambient environment. * fix(deps): declare what the shadcn registry work reaches for The shadcn registry (#5973, #6228, #6231) landed against the hoisted layout and reaches for three things the workspace root only carries when hoisted. - apps/docsite's generate-data.mjs requires `recharts/package.json` to pin the registry's external dependency specs. docsite declares the other three of that list; recharts was missing, so `pnpm generate` failed and 14 docsite test files could not load. - generate-shadcn-registry.mjs named `@babel/preset-typescript` as a string. Babel resolves a string preset from `cwd`, and the registry-contract job runs the script from the repo root. It is now imported, the way the StyleX plugin beside it already was, so it resolves through docsite's own node_modules. - generate-shadcn-registry.test.mjs spawned `node_modules/.bin/shadcn` from the repo root, at four call sites. shadcn is a docsite dependency, so its bin lives beside that package. The test now walks up from apps/docsite to find it. * fix(cli): resolve a package through Yarn PnP when there is no chain to walk Addresses the review on #5327. `findInstalledPackage` walked the node_modules chain and stopped there, so a Yarn Plug'n'Play project — which has no node_modules at all — read as missing every Core peer. It now asks the PnP runtime when the walk comes up empty. PnP resolves from the project's own dependency graph and ignores NODE_PATH, so the lookup stays project-local, which is the property the filesystem walk was introduced for. Verified against a real Yarn 4 PnP project with @astryxdesign/core installed: declared packages resolve and their versions read off disk, an undeclared one is still reported missing, and poisoning NODE_PATH changes nothing. That is strictly better than the previous `require.resolve`, which could confirm a peer was present under PnP but never read its version, because Core does not export `./package.json`. Covers both layouts in paths.test.mjs, including a case pinning that a package reachable only from NODE_PATH is not accepted. * fix(deps): cover the shadcn variant work added since the branch base #6246 landed against the hoisted layout after this branch was last rebased, and reaches for two things the workspace root only carries when hoisted. - packages/cli/authoring/shadcn/source-variants.mjs imports `@babel/core`. cli declares the runtime package but not its types, so `sync:api-types` failed with TS7016 on two lines and took `pnpm build` down with it. `@types/babel__core` is now declared beside it, as packages/core already does for the same import. - generate-shadcn-registry.test.mjs gained a fifth call site spawning `node_modules/.bin/shadcn` from the repo root. The other four already go through shadcnBin(), which walks up from apps/docsite — the package that declares shadcn, and so the only place its bin lives. The new one now does too, and the suite is back to 24 passing. * fix(docsite): resolve playground and shadcn dependencies through Node Two places computed a path into the repo root instead of resolving a package, which only works when node_modules is hoisted. Node already walks up from the module doing the asking, so both now let it. - generate-playground-types.mjs read @heroicons/react and recharts off the root. Both degraded in silence — the heroicon loop `continue`d and the Recharts builder returned {} — so the playground shipped without the types rather than failing. Recharts arrived with #6264 and is covered by playground-scope.test.ts, which is how it surfaced; the heroicon path has been there since #2535 and nothing asserts on it, so it was quietly producing zero variants. Resolving now throws if either is missing. - generate-shadcn-registry.test.mjs spawned node_modules/.bin/shadcn. shadcn does not export ./package.json, but its bin *is* its entry, so resolving `shadcn` from apps/docsite and running it through process.execPath needs no path assumption and no NODE_PATH. Net -8 lines in the generator. findInstalledPackage is unchanged: it reads a consumer project, where there is no module of ours to resolve from and NODE_PATH must not count as installed. | 18 天前 | |
feat(charts): bootstrap @astryxdesign/charts package (canary-only) (#3570) | 2 个月前 |
/packages
Published npm packages for the Astryx design system.
| Directory | Package | Purpose |
|---|---|---|
core/ |
@astryxdesign/core |
Core UI components, theme system, and utilities |
cli/ |
@astryxdesign/cli |
CLI tooling: component docs, templates, scaffolding, codemods |
build/ |
@astryxdesign/build |
Build plugins for StyleX source builds (Babel, PostCSS, Vite) |
themes/ |
@astryxdesign/theme-* |
Visual themes (default, neutral, daily, brutalist, meta, whatsapp) |
vega/ |
@astryxdesign/vega |
Vega/Vega-Lite chart wrapper (canary only) |
charts/ |
@astryxdesign/charts |
Chart components — themeable wrappers over a peer engine (canary only) |
lab/ |
— | Experimental components (not published) |