From b720ae957e234510df83854a253359857b615de4 Mon Sep 17 00:00:00 2001 From: woksin Date: Tue, 25 Aug 2026 11:31:18 +0200 Subject: [PATCH 1/5] Honor explicit no-release pull requests --- .github/workflows/publish.yml | 27 ++++++++++++++++++++--- .github/workflows/verify-semver-label.yml | 20 +++++++---------- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index c3f12820..b8f10cea 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -39,6 +39,7 @@ on: permissions: contents: write + pull-requests: read jobs: release: @@ -116,7 +117,11 @@ jobs: - name: Publish NPM packages run: | echo "npm $(npm --version) | node $(node --version)" - echo "ACTIONS_ID_TOKEN_REQUEST_URL is $([ -n \"$ACTIONS_ID_TOKEN_REQUEST_URL\" ] && echo 'set' || echo 'NOT set')" + if [ -n "${ACTIONS_ID_TOKEN_REQUEST_URL:-}" ]; then + echo "ACTIONS_ID_TOKEN_REQUEST_URL is set" + else + echo "ACTIONS_ID_TOKEN_REQUEST_URL is NOT set" + fi echo "NODE_AUTH_TOKEN is '${NODE_AUTH_TOKEN:-(unset)}'" echo "--- .npmrc ---" cat "$NPM_CONFIG_USERCONFIG" 2>/dev/null || echo "(no .npmrc)" @@ -157,7 +162,23 @@ jobs: needs: [release] steps: - - name: Report that nothing was published + - name: Verify an intentional no-release merge + env: + GH_TOKEN: ${{ github.token }} run: | - echo "::error::Nothing was published and no release was cut (reason: ${{ needs.release.outputs.reason }}). For 'no-label', add exactly one of major, minor or patch to the merged pull request and re-run this workflow - see verify-semver-label, which is meant to catch this before the merge." + reason='${{ needs.release.outputs.reason }}' + if [ "$reason" = "error" ]; then + echo "::error::The release action failed; no-release cannot suppress a release error." + exit 1 + fi + + no_release=$(gh api "repos/${GITHUB_REPOSITORY}/commits/${GITHUB_SHA}/pulls" \ + --jq '[.[].labels[].name] | any(. == "no-release")') + + if [ "$no_release" = "true" ]; then + echo "The merged pull request explicitly selected no-release; publishing nothing is the intended result." + exit 0 + fi + + echo "::error::Nothing was published and no release was cut (reason: ${{ needs.release.outputs.reason }}). Add exactly one release-intent label before merge; use no-release when publishing nothing is intentional." exit 1 diff --git a/.github/workflows/verify-semver-label.yml b/.github/workflows/verify-semver-label.yml index cb60751f..c0c52957 100644 --- a/.github/workflows/verify-semver-label.yml +++ b/.github/workflows/verify-semver-label.yml @@ -1,12 +1,8 @@ name: Verify Semver Label -# A merged pull request with no major/minor/patch label produces a Publish run that reports success while -# skipping every publish step, because the release action resolves should-publish to false. That reads as a -# release having happened when nothing was published. Requiring the label here turns a silent non-release into -# a visible failure before the merge, where it costs nothing to fix. -# -# It also closes a race the publish workflow cannot: a label added moments after the merge may land too late -# for the release to pick it up. Demanding the label before the merge means there is nothing to race. +# Every pull request declares one release intent. major/minor/patch authorizes a package release when the +# publish workflow's path filters also match; no-release explicitly records that the change should publish +# nothing. Requiring exactly one intent prevents both accidental releases and ambiguous silent skips. # # Triggered on labeled/unlabeled as well as the usual events, so adding the label re-runs the check rather than # leaving a red cross behind that only a push would clear. @@ -31,21 +27,21 @@ jobs: runs-on: ubuntu-latest steps: - - name: Require exactly one semantic version label + - name: Require exactly one release-intent label env: LABELS: ${{ toJSON(github.event.pull_request.labels.*.name) }} run: | - count=$(printf '%s' "$LABELS" | jq '[.[] | select(. == "major" or . == "minor" or . == "patch")] | length') + count=$(printf '%s' "$LABELS" | jq '[.[] | select(. == "major" or . == "minor" or . == "patch" or . == "no-release")] | length') if [ "$count" -eq 1 ]; then - echo "Found one semantic version label." + echo "Found one release-intent label." exit 0 fi if [ "$count" -eq 0 ]; then - echo "::error::This pull request has no semantic version label. Add exactly one of major, minor or patch. Without one, merging produces a Publish run that succeeds while skipping every publish step, so no release is cut and nothing is published." + echo "::error::This pull request has no release-intent label. Add exactly one of major, minor, patch or no-release." else - echo "::error::This pull request carries $count semantic version labels. Exactly one of major, minor or patch is required, since the release version cannot be derived from more than one." + echo "::error::This pull request carries $count release-intent labels. Add exactly one of major, minor, patch or no-release." fi exit 1 From 9f04d705f6db85de76eebfe817017e8d069d1556 Mon Sep 17 00:00:00 2001 From: woksin Date: Tue, 25 Aug 2026 11:31:18 +0200 Subject: [PATCH 2/5] Align Components public entry points --- Documentation/index.mdx | 126 ++++++++++++++++++++++------------------ README.md | 105 ++++++++++++++++++++++++++++----- Source/README.md | 14 ++++- 3 files changed, 171 insertions(+), 74 deletions(-) diff --git a/Documentation/index.mdx b/Documentation/index.mdx index 98171019..edf8fb00 100644 --- a/Documentation/index.mdx +++ b/Documentation/index.mdx @@ -1,62 +1,72 @@ --- title: Components -description: The React component library for Cratis — command dialogs, forms, and data tables that consume Arc's generated proxies. +description: React components aligned with Arc application patterns. --- -import { CardGrid } from '@astrojs/starlight/components'; -import SimpleCard from '@components/SimpleCard.astro'; -import TopicHero from '@components/TopicHero.astro'; - - -Command dialogs, forms, and data tables that consume [Arc's](/arc/) generated proxies. Built on PrimeReact, fully typed, and styled the way you choose. [Get started →](/components/getting-started/) · [Why Components? →](/components/why-components/) - - -## Start here - - - - Install the package, mount the provider, and render your first proxy-driven screen. - - - What the library adds when PrimeReact meets generated Arc proxies. - - - Three paths — a PrimeReact theme, your own palette, or fully unstyled with a `pt` preset. - - - -## Recipes - - - - Collect input and execute a command with `CommandDialog` and the `CommandForm` fields. - - - Render a query or observable query with `DataPage` and the data-table wrappers. - - - Gather information across named stages with `StepperCommandDialog`. - - - A full screen: list rows, add and edit through dialogs, and react to selection. - - - -## Key components - - - - Instantiates, validates, and executes a generated command, with the footer handled for you. - - - A resizable page that lists query data with toolbar actions and detail panels. - - - Typed input fields bound to command properties — text, number, dropdown, date, and more. - - - Data-collection dialogs that return values without executing a command. - - - -Components renders [Arc's](/arc/) proxies over [Chronicle](/chronicle/) read models — see [Why developers choose Cratis](/why-cratis/) for the full stack. +Components is a React component library aligned with Arc application patterns. + +The `@cratis/components` package provides React compositions for Arc-generated +commands and queries, together with dialogs, data surfaces, editors, +notifications, styling tokens, and shared application primitives. + +## Relationship to Arc + +Arc packages provide the generated command and query contracts and React +contexts consumed by Components. Applications may use Arc without Components. +Components is not a general-purpose design-system claim and does not by itself +establish accessibility conformance or browser coverage for an application. + +## Minimal setup + +Install Components and its required rendering peers: + +```bash +npm install @cratis/components primereact @primereact/core @primereact/headless @primereact/hooks primeicons +``` + +Import the token and component styles, then mount the provider: + +```tsx +import '@cratis/components/tokens'; +import '@cratis/components/styles'; +import { CratisComponentsProvider } from '@cratis/components'; + +export const App = () => ( + + + +); +``` + +Replace the placeholder with a key supplied through the application's approved +secret/configuration boundary. Do not commit it to source. Current dependency +and licensing terms are owned by each installed package and must be reviewed for +the exact version selected. + +## Component areas + +| Area | Current package role | +| --- | --- | +| Command input | Typed fields, embedded forms, dialogs, and multi-step command flows | +| Data display | Query-backed tables, local-array tables, list pages, filters, and detail surfaces | +| Application surfaces | Dialogs, notifications, dropdowns, display primitives, page chrome, and toolbars | +| Structured editors | JSON content, JSON Schema, navigation, canvas, pivot, and time-oriented views | +| Styling boundary | Cratis tokens, component styles, a baseline theme, and pass-through hooks | + +## Current boundaries + +- Components aligns with Arc application patterns; it does not imply support for + every Arc, React, browser, runtime, or package-version combination. +- Package existence, examples, and Storybook output do not establish maturity, + accessibility conformance, support, security, or production suitability. +- Verify the exact package manifest, peer dependencies, component profile, and + application behavior before adoption. + +## Continue + +- [Components source and README](https://github.com/Cratis/Components) — package + setup, component map, contribution guidance, and current limits. +- [Components on npm](https://www.npmjs.com/package/@cratis/components) — + published package metadata and versions. +- [Arc](/arc/) — the CQRS framework whose application patterns Components + aligns with. diff --git a/README.md b/README.md index f85d488a..d224193d 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,103 @@ # Cratis Components -## Packages +Components is a React component library aligned with Arc application patterns. + +This is the owning source repository for `@cratis/components`. The package provides command forms and dialogs, query-backed data tables, page compositions, notifications, editors, and shared application surfaces for frontends built with Cratis Arc. [![NPM](https://img.shields.io/npm/v/@cratis/components?label=@cratis/components&logo=npm)](https://www.npmjs.com/package/@cratis/components) +[![Publish](https://github.com/Cratis/Components/actions/workflows/publish.yml/badge.svg)](https://github.com/Cratis/Components/actions/workflows/publish.yml) +[![Documentation](https://github.com/Cratis/Documentation/actions/workflows/docs-site.yml/badge.svg)](https://github.com/Cratis/Documentation/actions/workflows/docs-site.yml) -## Builds +## Start here -[![Publish](https://github.com/Cratis/Components/actions/workflows/publish.yml/badge.svg)](https://github.com/Cratis/Components/actions/workflows/publish.yml) -[![Documentation site](https://github.com/Cratis/Documentation/actions/workflows/pages.yml/badge.svg)](https://github.com/Cratis/Documentation/actions/workflows/pages.yml) +- [Browse the canonical Components documentation](https://cratis.io/components/) +- [Install and mount the provider](#minimal-setup) +- [Choose a component area](#what-components-owns) +- [Inspect the package source](https://github.com/Cratis/Components/tree/main/Source) + +## What Components owns + +| Area | Use it for | +| --- | --- | +| Command input | Typed command fields, embedded forms, single-step dialogs, and multi-step command flows | +| Data display | Query-backed tables, local-array tables, list pages, filters, and detail surfaces | +| Application surfaces | Dialogs, notifications, dropdowns, display primitives, page chrome, and toolbars | +| Structured editors | JSON content, JSON Schema, navigation, canvas, pivot, and time-oriented views | +| Styling boundary | Cratis tokens, component styles, a baseline theme, and pass-through hooks for application styling | + +The table above maps common screen jobs to the smallest current component area. + +## Relationship to Arc + +Components is built for Arc application frontends. Its command and query compositions consume Arc's generated TypeScript proxies and React contexts; the package manifest declares Arc packages as peer dependencies. + +That boundary is intentional: + +- **Arc packages** provide the generated command and query contracts and React contexts consumed here. +- **Components** owns the React compositions that render and execute those contracts. +- Applications still choose their own screen composition, styling, accessibility verification, and browser support profile. + +Components is not evidence of a complete design system, accessibility conformance, or browser coverage for an application. Verify those properties in the exact application and component profile you ship. + +## Minimal setup + +Install the package and its required rendering peers: + +```bash +npm install @cratis/components primereact @primereact/core @primereact/headless @primereact/hooks primeicons +``` + +Import the token and component styles once, then mount the provider around the application: + +```tsx +import '@cratis/components/tokens'; +import '@cratis/components/styles'; +import { CratisComponentsProvider } from '@cratis/components'; + +export const App = () => ( + + + +); +``` + +The [canonical Components page](https://cratis.io/components/) carries the currently admitted documentation profile. Replace the placeholder with a key supplied through your application's approved secret/configuration boundary; do not commit it to source. + +## Documentation map + +- [Canonical Components documentation](https://cratis.io/components/) +- [Product-owned documentation source](https://github.com/Cratis/Components/tree/main/Documentation) +- [Package-level requirements and licensing notes](./Source/README.md) + +The canonical documentation is maintained in this repository under [`Documentation/`](https://github.com/Cratis/Components/tree/main/Documentation) and rendered on cratis.io by the Documentation repository. + +## Contributing + +This is a framework-library repository. [Component source](https://github.com/Cratis/Components/tree/main/Source) keeps public types, stories, and specifications near each component; export and package verification lives under `Source/scripts/`. + +For root and package README changes, verify the exact files explicitly: + +```bash +npx markdownlint-cli2 README.md Source/README.md +npx linkinator README.md Source/README.md --markdown --recurse +``` -## Description +For product documentation under `Documentation/`, run its repository verification: -A collection of React components designed to work seamlessly with the constructs found in the Arc universe. These components provide a rich set of UI elements for building modern applications, including command dialogs, data tables, schema editors, and more. +```bash +cd Documentation +./verify-markdown.sh +``` -## Support +Source changes follow the repository's framework contribution rules and the applicable build, type, specification, export, and Storybook gates. -Cratis is an open community, and we are glad to help users, teams evaluating the stack, and contributors. +## Community and repository -| Channel | Details | -|---|---| -| Discord | Join the community on [Discord](https://discord.gg/kt4AMpV8WV) for questions and discussions | -| GitHub Issues | [Report bugs or request features](https://github.com/Cratis/Components/issues) | -| Documentation | Read the docs at [cratis.io](https://cratis.io) | +| Path | Destination | +| --- | --- | +| Questions and discussion | [Cratis Discord](https://discord.gg/kt4AMpV8WV) | +| Bugs and feature requests | [GitHub Issues](https://github.com/Cratis/Components/issues) | +| Releases | [GitHub Releases](https://github.com/Cratis/Components/releases) | +| Contributing | [Cratis contribution guide](https://github.com/Cratis/.github/blob/main/contributing.md) | +| Security reports | [Private security reporting](mailto:oss@cratis.io?subject=Security%3A) | +| Source license | [`LICENSE`](./LICENSE) | diff --git a/Source/README.md b/Source/README.md index 323fd6f9..227e758f 100644 --- a/Source/README.md +++ b/Source/README.md @@ -1,6 +1,14 @@ # Cratis Components -A collection of React components for building modern applications with Cratis. +Components is a React component library aligned with Arc application patterns. + +The `@cratis/components` package provides React compositions for Arc-generated commands and queries, together with dialogs, data surfaces, editors, notifications, styling tokens, and shared application primitives. + +- [Read the canonical Components documentation](https://cratis.io/components/) +- [Review this package's dependency and licensing boundary](#licensing) +- [Report security concerns privately](mailto:oss@cratis.io?subject=Security%3A) + +The package targets Arc application frontends rather than acting as a general-purpose design system. Its presence does not establish accessibility conformance or browser coverage for an application; verify those properties for the exact components and application profile you ship. ## Requirements @@ -583,7 +591,7 @@ export const App = () => ( Components 3 publishes its PrimeReact 11 slot and rendered-marker contract from `@cratis/components/compatibility`. In a DOM test, apply `primeReact11PassThroughSentinelPreset`, render the surfaces your application uses, and call `assertPrimeReact11PassThroughCompatibility(root, components)`. Additions pass; a missing or renamed contracted slot or marker produces an actionable error. The contract is major-version scoped and does not preserve PrimeReact 10 names. -The machine-readable `components3PrimeReact11PassThroughContract` is the source of truth. Contract revision 1 covers the parts rendered by Components 3's supported compositions on PrimeReact 11, rather than every optional part an application could compose directly. See the [pass-through contract documentation](https://cratis.io/Components/styling/pass-through.html) for the supported component and slot list. +The machine-readable `components3PrimeReact11PassThroughContract` is the source of truth. Contract revision 1 covers the parts rendered by the documented Components 3 compositions on PrimeReact 11, rather than every optional part an application could compose directly. See the [canonical Components documentation](https://cratis.io/components/) for the currently admitted component and slot guidance. #### A `pt` preset in plain CSS @@ -789,7 +797,7 @@ request type is owned by `@cratis/arc.react`. If you encounter errors like: -``` +```text Cannot find module '@cratis/components/TimeMachine' or its corresponding type declarations. ``` From d37721859c8a259161eed361f925649d4a77b4da Mon Sep 17 00:00:00 2001 From: woksin Date: Tue, 25 Aug 2026 12:28:39 +0200 Subject: [PATCH 3/5] Bind no-release to the exact merged pull request --- .github/workflows/publish.yml | 10 ++++++++-- .github/workflows/verify-semver-label.yml | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index b8f10cea..f0e9baac 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -172,8 +172,14 @@ jobs: exit 1 fi - no_release=$(gh api "repos/${GITHUB_REPOSITORY}/commits/${GITHUB_SHA}/pulls" \ - --jq '[.[].labels[].name] | any(. == "no-release")') + pulls=$(gh api "repos/${GITHUB_REPOSITORY}/commits/${GITHUB_SHA}/pulls") + merged_count=$(printf '%s' "$pulls" | jq --arg sha "$GITHUB_SHA" '[.[] | select(.merge_commit_sha == $sha)] | length') + if [ "$merged_count" -ne 1 ]; then + echo "::error::Expected exactly one pull request whose merge commit is $GITHUB_SHA; found $merged_count." + exit 1 + fi + no_release=$(printf '%s' "$pulls" | jq -r --arg sha "$GITHUB_SHA" \ + '[.[] | select(.merge_commit_sha == $sha) | .labels[].name] | any(. == "no-release")') if [ "$no_release" = "true" ]; then echo "The merged pull request explicitly selected no-release; publishing nothing is the intended result." diff --git a/.github/workflows/verify-semver-label.yml b/.github/workflows/verify-semver-label.yml index c0c52957..c0ec3280 100644 --- a/.github/workflows/verify-semver-label.yml +++ b/.github/workflows/verify-semver-label.yml @@ -12,7 +12,7 @@ concurrency: on: pull_request: - types: [opened, reopened, synchronize, labeled, unlabeled] + types: [opened, reopened, synchronize, labeled, unlabeled, edited] # Scoped to the same branch Publish releases from. A pull request stacked onto another one's branch cannot # cut a release, so demanding a version label of it would be asking which version a merge that publishes # nothing should carry. From 2f7dd5046b7c5f2addb98ad4204d609a0f11d8fe Mon Sep 17 00:00:00 2001 From: woksin Date: Tue, 25 Aug 2026 12:28:40 +0200 Subject: [PATCH 4/5] Align the Components 4 package README --- Source/README.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Source/README.md b/Source/README.md index bb3e103b..4154471a 100644 --- a/Source/README.md +++ b/Source/README.md @@ -17,15 +17,16 @@ interaction primitives internally; consumers do not import or style React Aria. npm install @cratis/components ``` -Supported peers: +The current package manifest declares these peer dependencies: -- React and React DOM 19 - `@cratis/arc` and `@cratis/arc.react` `>=20.3.1 <23` -- `@cratis/fundamentals` -- `reflect-metadata` -- `tsyringe` +- `@cratis/fundamentals` `^7.10.3` +- optional `pixi.js` `^8.20.0` +- `react` and `react-dom` `^19.0.0` +- `reflect-metadata` `0.2.2` +- `tsyringe` `4.10.0` -PrimeReact, PrimeIcons, PrimeUI themes, and a PrimeUI license are not required. +The current manifest does not declare PrimeReact, PrimeIcons, or PrimeUI packages as dependencies or peers. Applications retaining direct dependencies keep their own package, provider, styling, and license boundaries. ## Styles From a1e4da5b36b3ffad67ab8b2e3a67098242dbbee2 Mon Sep 17 00:00:00 2001 From: woksin Date: Tue, 25 Aug 2026 13:11:04 +0200 Subject: [PATCH 5/5] Restore the claim-safe Components MDX landing --- Documentation/index.mdx | 146 ++++++++++++++++++++++++++-------------- 1 file changed, 95 insertions(+), 51 deletions(-) diff --git a/Documentation/index.mdx b/Documentation/index.mdx index 83eeb2d2..91c3cb60 100644 --- a/Documentation/index.mdx +++ b/Documentation/index.mdx @@ -3,71 +3,115 @@ title: Components description: React components aligned with Arc application patterns. --- -Components is a React component library aligned with Arc application patterns. +import { Card, CardGrid, Steps } from '@astrojs/starlight/components'; +import SimpleCard from '@components/SimpleCard.astro'; +import TopicHero from '@components/TopicHero.astro'; + + + Components is a React component library aligned with Arc application patterns. + The current package owns its public React markup, TypeScript contracts, + semantic tokens, stable parts, and component behavior. + + +## Start here + + + + Install the package, import its structural styles, and mount the provider. + + + Start from the screen job rather than a raw component inventory. + + + Distinguish Arc-generated contracts from the React compositions that consume them. + + -The current package provides React components for Arc-generated commands and -queries, together with dialogs, data surfaces, editors, notifications, semantic -tokens, stable parts, and application primitives. +## Minimal setup -## Relationship to Arc + +1. Install the package. -Components consumes generated command and query contracts and React contexts -from Arc packages. Applications may use Arc without Components. + ```bash + npm install @cratis/components + ``` -Components does not by itself establish design-system completeness, -accessibility conformance, browser coverage, or compatibility with every -Arc/React/package-version combination. Verify those properties for the exact -application and component profile shipped. +2. Import semantic tokens and component structure. The baseline theme is + optional. -## Minimal setup + ```tsx + import '@cratis/components/tokens'; + import '@cratis/components/styles'; + import '@cratis/components/theme'; + ``` -Install the package: +3. Mount the provider. -```bash -npm install @cratis/components -``` + ```tsx + import { CratisComponentsProvider } from '@cratis/components/Common'; -Import the token and component styles, then mount the provider. The baseline -theme is optional. + export const App = () => ( + + + + ); + ``` + -```tsx -import '@cratis/components/tokens'; -import '@cratis/components/styles'; -import '@cratis/components/theme'; -import { CratisComponentsProvider } from '@cratis/components/Common'; +The current package manifest defines the exact React, Arc, Fundamentals, and +optional Pixi peer ranges. Verify those ranges for the package version selected. -export const App = () => ( - - - -); -``` +## Relationship to Arc -## Component areas +Components consumes generated command and query contracts and React contexts +from Arc packages. Applications may use Arc without Components. -| Area | Current package role | -| --- | --- | -| Command input | Typed fields, forms, dialogs, and multi-step command flows | -| Data display | Query-backed and local-array tables, list pages, filters, and detail surfaces | -| Application surfaces | Dialogs, notifications, dropdowns, display primitives, page chrome, and toolbars | -| Structured editors | JSON content, JSON Schema, navigation, canvas, pivot, and time-oriented views | -| Styling boundary | Semantic tokens, component styles, an optional baseline theme, and stable parts | +Components does not by itself establish design-system completeness, +accessibility conformance, browser coverage, or compatibility with every +Arc/React/package-version combination. -## Current boundaries +## Component areas -- Package manifests and exports define the exact React, Arc, Fundamentals, and - optional Pixi peer ranges. -- Package existence, examples, Storybook output, and passing checks do not - establish maturity, accessibility conformance, browser coverage, support, - security, or production suitability. -- Direct third-party UI dependencies retained by an application keep their own - package, provider, styling, and license boundaries. + + + Typed fields, forms, dialogs, and multi-step command flows. + + + Query-backed and local-array tables, list pages, filters, and detail surfaces. + + + Dialogs, notifications, dropdowns, display primitives, page chrome, and toolbars. + + + JSON content, JSON Schema, navigation, canvas, pivot, and time-oriented views. + + + Semantic tokens, component styles, an optional baseline theme, and stable parts. + + + +:::caution[Evaluate the exact application profile] +Package existence, examples, Storybook output, and passing checks do not +establish maturity, accessibility conformance, browser coverage, support, +security, or production suitability. Direct third-party UI dependencies retained +by an application keep their own package, provider, styling, and license +boundaries. +::: ## Continue -- [Components source and README](https://github.com/Cratis/Components) — package - setup, component map, contribution guidance, and current limits. -- [Components on npm](https://www.npmjs.com/package/@cratis/components) — - published package metadata and versions. -- [Arc](/arc/) — the CQRS framework whose application patterns Components - aligns with. + + + Package setup, migration guidance, contribution paths, and current limits. + + + Published package metadata and versions. + + + The CQRS framework whose application patterns Components aligns with. + +