@carbon/angular is the official Angular implementation of the Carbon Design System, wrapping @carbon/web-components custom elements with idiomatic Angular components. It replaces the community-maintained Carbon Components Angular (CCA) package with a first-party solution that ships inside the Carbon monorepo. This epic tracks all work required to reach a stable 1.0.0 release aligned with Carbon v12.
Why @carbon/angular?
| Metric |
CCA (previous) |
@carbon/angular v1 |
| Component count |
~35 |
87 |
| Module style |
NgModule |
Standalone (Angular 17+) |
| WC feature parity |
Partial |
Full |
| Theming API |
Per-component theme input |
CSS custom properties |
| Maintained in monorepo |
No |
Yes |
The Angular layer owns only data binding, property reflection, and event normalisation. All behaviour is delegated to @carbon/web-components, giving @carbon/angular automatic feature parity with @carbon/react as the WC layer evolves.
Package Details
| Field |
Value |
| Monorepo location |
packages/angular/ |
| Package name |
@carbon/angular |
| Selector prefix (public) |
cds-* |
| WC tag prefix (internal) |
cds-wc-* |
| Angular version |
17+ (standalone APIs required) |
| Build tool |
ng-packagr |
Versioning Milestones
| Phase |
Version |
Description |
| Prerelease |
0.0.0-prerelease.N |
Now through v12 RC; active development, no stability guarantees |
| Release Candidate |
1.0.0-rc.0 |
API frozen, bug fixes only, community testing period |
| General Availability |
1.0.0 |
Stable release, semver guarantees begin |
Dependencies
Blocker: The feat/wc-class-exports branch in @carbon/web-components must be merged and released before any component can be built. This branch exposes named class exports that enable the defineCustomElement registration pattern used throughout this package.
Tracked at: carbon-design-system/carbon#22416
No component workstream items should be marked complete until this dependency is resolved.
Workstreams
Infrastructure & Scaffolding
Pre-Implementation Test Sprint
Tier 1 - Thin Wrappers
Thin wrappers: WC element owns all behaviour; Angular component reflects properties and normalises events only.
Tier 2 - Slot Materialisation
Components that project Angular content into named WC slots.
Tier 3 - Non-Trivial Adapters
Components requiring non-trivial lifecycle coordination between Angular and WC.
Tier 4 - DataTable
Tier 5 - Pure Angular
Components with no WC counterpart; implemented entirely in Angular.
Testing
Documentation & Release
Test Strategy
| Layer |
Tool |
Scope |
| 1 - Unit |
Jest + jsdom |
API boundary: inputs, outputs, property reflection |
| 2 - Integration |
Playwright |
Real-browser WC lifecycle, slot hydration, event bubbling |
| 3 - Accessibility |
Storybook + IBM Equal Access |
a11y audit across all component stories |
TDD approach: The Pre-Implementation Test Sprint writes all Layer 1 and Layer 2 tests before any component code is written. Green tests are the definition of done for each component.
Key Technical Decisions
| Decision |
Choice |
Rationale |
| Build tool |
ng-packagr |
Required for correct Angular package format (APF); tsdown does not produce the FESM/UMD bundles Angular tooling expects |
| Module style |
Standalone components |
Angular 17+ default; removes NgModule boilerplate and enables tree-shaking at the component level |
| Internal WC tag prefix |
cds-wc-* |
Prevents collisions with externally registered cds-* elements in the consumer's document |
| WC registration pattern |
defineCustomElement(CDSModal, { name: 'cds-wc-modal' }) |
Scoped registration without polluting the global custom element registry via es-custom side-effects |
CUSTOM_ELEMENTS_SCHEMA |
Scoped per component module |
Avoids suppressing Angular template errors globally; each component opts in explicitly |
es-custom barrel |
Not used |
Registration is explicit and lazy; no silent global side-effects on import |
Intentional Breaking Changes from CCA
| # |
Area |
CCA behaviour |
@carbon/angular v1 behaviour |
| 1 |
DatePicker value type |
Date object |
string (ISO 8601) |
| 2 |
DatePicker onChange event shape |
{ date: Date } |
{ selectedDates: string[], value: string } |
| 3 |
Composition model |
Array input API |
Projected children via ng-content slots |
| 4 |
Module imports |
NgModule (e.g. CarbonModule) |
Standalone component imports |
| 5 |
Theming |
Per-component theme input |
CSS custom properties on host element |
| 6 |
flatpickr integration |
Exposed as input |
Dropped; WC layer manages date picker internally |
| 7 |
Pagination event shape |
{ page, pageSize } object |
CustomEvent detail mirroring WC spec |
| 8 |
Tabs / Accordion item API |
Declarative array of config objects |
Projected <cds-tab> / <cds-accordion-item> children |
| 9 |
DataTableModel class |
Required for all DataTable usage |
Dropped; pass plain data arrays directly |
Out of Scope for v1
ng add schematics / ng generate blueprints
- i18n / locale support beyond what the WC layer provides
- Server-Side Rendering (SSR) / Angular Universal support
- DataTable virtual scroll
TimePicker component
Open Questions
-
DatePicker onChange type: Should the emitted value be string[] (always an array, consistent with range mode) or string (scalar for single-date mode, array for range)? Decision needed before Tier 3 work begins.
-
Storybook Compodoc integration: Should the Storybook instance generate API docs via Compodoc, or rely on Storybook's built-in ArgTypes inference? Compodoc gives richer output but adds a build step.
-
Secondary entry points: Should @carbon/angular expose secondary entry points (e.g. @carbon/angular/modal) to enable finer-grained tree-shaking, or ship a single flat entry point for v1 simplicity?
Related
@carbon/angularis the official Angular implementation of the Carbon Design System, wrapping@carbon/web-componentscustom elements with idiomatic Angular components. It replaces the community-maintained Carbon Components Angular (CCA) package with a first-party solution that ships inside the Carbon monorepo. This epic tracks all work required to reach a stable1.0.0release aligned with Carbon v12.Why @carbon/angular?
@carbon/angularv1themeinputThe Angular layer owns only data binding, property reflection, and event normalisation. All behaviour is delegated to
@carbon/web-components, giving@carbon/angularautomatic feature parity with@carbon/reactas the WC layer evolves.Package Details
packages/angular/@carbon/angularcds-*cds-wc-*ng-packagrVersioning Milestones
0.0.0-prerelease.N1.0.0-rc.01.0.0Dependencies
Blocker: The
feat/wc-class-exportsbranch in@carbon/web-componentsmust be merged and released before any component can be built. This branch exposes named class exports that enable thedefineCustomElementregistration pattern used throughout this package.Tracked at: carbon-design-system/carbon#22416
No component workstream items should be marked complete until this dependency is resolved.
Workstreams
Infrastructure & Scaffolding
packages/angular/directory in the monorepong-packagrbuild pipeline andtsconfigtargetsnpm pack+ artifact upload)@carbon/angularwithin the monorepoPre-Implementation Test Sprint
Tier 1 - Thin Wrappers
Thin wrappers: WC element owns all behaviour; Angular component reflects properties and normalises events only.
CheckboxRadioButtonToggleTagLoadingInlineLoadingSkeletonText,SkeletonPlaceholder,SkeletonIcon)TooltipTextInputTextAreaNumberInputTier 2 - Slot Materialisation
Components that project Angular content into named WC slots.
SelectDropdownMultiSelectBreadcrumbNotification(inline, toast, actionable variants)PaginationTier 3 - Non-Trivial Adapters
Components requiring non-trivial lifecycle coordination between Angular and WC.
TabsAccordionComboBoxModalFileUploaderTier 4 - DataTable
DataTablecore (sort, filter, selection)DataTableModelclass dependency (see Breaking Changes)Tier 5 - Pure Angular
Components with no WC counterpart; implemented entirely in Angular.
StepperStructuredListTesting
Documentation & Release
CHANGELOG.mdwith all prerelease changesREADME.mdto reference@carbon/angular1.0.0-rc.0to npm1.0.0Test Strategy
TDD approach: The Pre-Implementation Test Sprint writes all Layer 1 and Layer 2 tests before any component code is written. Green tests are the definition of done for each component.
Key Technical Decisions
ng-packagrtsdowndoes not produce the FESM/UMD bundles Angular tooling expectscds-wc-*cds-*elements in the consumer's documentdefineCustomElement(CDSModal, { name: 'cds-wc-modal' })es-customside-effectsCUSTOM_ELEMENTS_SCHEMAes-custombarrelIntentional Breaking Changes from CCA
@carbon/angularv1 behaviourDatePickervalue typeDateobjectstring(ISO 8601)DatePickeronChangeevent shape{ date: Date }{ selectedDates: string[], value: string }ng-contentslotsNgModule(e.g.CarbonModule)themeinputflatpickrintegrationPaginationevent shape{ page, pageSize }objectCustomEventdetail mirroring WC specTabs/Accordionitem API<cds-tab>/<cds-accordion-item>childrenDataTableModelclassOut of Scope for v1
ng addschematics /ng generateblueprintsTimePickercomponentOpen Questions
DatePickeronChangetype: Should the emitted value bestring[](always an array, consistent with range mode) orstring(scalar for single-date mode, array for range)? Decision needed before Tier 3 work begins.Storybook Compodoc integration: Should the Storybook instance generate API docs via Compodoc, or rely on Storybook's built-in ArgTypes inference? Compodoc gives richer output but adds a build step.
Secondary entry points: Should
@carbon/angularexpose secondary entry points (e.g.@carbon/angular/modal) to enable finer-grained tree-shaking, or ship a single flat entry point for v1 simplicity?Related
feat/wc-class-exportsbranch tracking (blocker): Provide pure class exports for web components carbon#22416