Components (11)
All
✓ Ready
⚠ Partial
✕ Not started
Button
<ds-button> · .ds-btn · @ds/angular
Figma
Token Studio
Style Dict
Angular
Storybook
5/5 ready
▼
Figma
✓ Ready
4 variants, 3 sizes
Token Studio
✓ Ready
6 tokens exported
Style Dict
✓ Ready
CSS vars generated
Angular
✓ Ready
v2.1.0 stable
Storybook
✓ Ready
9 stories live
Pipeline completion5/5
Figma
Token Studio
Style Dictionary
Angular
Storybook
Variants
Primary
Secondary
Destructive
Ghost
Sizes
Small
Medium
Large
States
Disabled
Loading
Active
Figma path
Components / Button
@Input names = Figma properties
variant · size · disabled · loading
color/primary/900color/danger/600space/2space/4radius/mdtypography/basefont-weight/medium
Token values — Figma Variable → CSS output
/* Auto-generated — do not edit manually */
/* Source: tokens/tokens.json → Style Dictionary build */
:root {
--color-primary-900: #e8ff5a; /* color/primary/900 */
--color-primary-50: #f9ffe0; /* color/primary/50 */
--color-danger-600: #dd4040; /* color/danger/600 */
--space-2: 8px;
--space-4: 16px;
--radius-md: 8px;
--font-weight-medium: 600;
--text-base: 1rem;
}
Import component
Class names only
import { DsButtonComponent } from '@ds/angular';
@Component({
standalone: true,
imports: [DsButtonComponent],
template: `
<ds-button variant="primary" size="md"
[loading]="isLoading" (click)="onSave()">
Save changes
</ds-button>
<ds-button variant="secondary" size="sm">Cancel</ds-button>
<ds-button variant="destructive" [disabled]="!canDelete">Delete</ds-button>
<ds-button variant="ghost">Learn more</ds-button>
`,
}) export class YourComponent {
isLoading = false;
canDelete = true;
}
<button class="ds-btn ds-btn--primary">Primary</button>
<button class="ds-btn ds-btn--secondary ds-btn--sm">Small</button>
<button class="ds-btn ds-btn--destructive" disabled>Delete</button>
<!-- All spacing + colour from CSS vars — -->
<!-- var(--space-2), var(--color-primary-900), var(--radius-md) -->
PrimarySecondaryDestructiveGhostSmallLargeLoadingDisabledWithIcon
1
Open Storybook →
Components / Button2
Use Controls panel to toggle
variant, size, loading, disabled3
Copy generated snippet from Docs tab — uses
<ds-button> with exact prop namesComments & change requests3 comments
TM
Thabo M.2d agoChange request· Angulards-btn--ghost hover background missing — Figma shows color/primary/50.
LM
Lulamile M.1d agoApproved· AngularFixed in v2.1.0 — ghost hover now uses var(--color-primary-50). Storybook updated.
SR
Sipho R.5h agoQuestion· FigmaShould we add a full-width variant? Some onboarding flows need width:100%.
LM
Input Field
<ds-field> · .ds-input · Reactive Forms compatible
Figma
Token Studio
Style Dict
Angular
Storybook
5/5 ready
▼
Figma
✓ Ready
4 states designed
Token Studio
✓ Ready
All tokens exported
Style Dict
✓ Ready
variables.css updated
Angular
✓ Ready
v2.0.3 stable
Storybook
✓ Ready
6 stories live
Pipeline completion5/5
Figma
Angular
Style Dictionary
Default
Email address
you@example.com
We'll never share your email
Focused
Password
••••••••
Error
Username
taken_name
Username already taken
Disabled
Account ID
ACC-00482
color/primary/900color/danger/600space/2space/3radius/md
Reactive Form
Class names
<!-- @Input names match Figma property names exactly -->
<ds-field
label="Email address"
type="email"
placeholder="you@example.com"
[required]="true"
[formControl]="emailCtrl"
hint="We never share your email"
[errorMessages]="{ required: 'Required', email: 'Invalid email' }"
/>
<input class="ds-input" type="email" placeholder="you@example.com"/>
<input class="ds-input ds-input--error" type="text"/>
<input class="ds-input" type="text" disabled/>
.ds-input {
padding: var(--space-2) var(--space-3); /* Figma: space/2 space/3 */
border-radius: var(--radius-md); /* Figma: radius/md */
font-size: var(--text-base); /* Figma: typography/base */
border: 1px solid var(--border-mid);
background: var(--surface-2); color: var(--ink);
transition: border-color .15s, box-shadow .15s;
&:focus {
outline: none;
border-color: var(--color-primary-900);
box-shadow: 0 0 0 3px var(--accent-dim);
}
&.ds-input--error { border-color: var(--color-danger-600); }
&:disabled { opacity: .4; cursor: not-allowed; }
}
Comments & change requests1 comment
NK
3d agoIn review· FigmaTextarea variant isn't in Figma yet. Using .ds-input on a <textarea> but resize handle isn't spec'd. Can we add a multiline property?
LM
Select / Dropdown
<ds-select> · .ds-select · CVA compatible
Figma
Token Studio
Style Dict
Angular
Storybook
5/5 ready
▼
Figma
✓ Ready
Closed + open states
Token Studio
✓ Ready
Tokens exported
Style Dict
✓ Ready
CSS vars generated
Angular
✓ Ready
v1.3.0 stable
Storybook
✓ Ready
4 stories live
Pipeline completion5/5
Figma
Angular
Default
Selected
Disabled
<ds-select
label="Country"
placeholder="Select a country…"
[options]="countryOptions"
[formControl]="countryCtrl"
/>
<!-- options: Array<{ label: string; value: string }> -->
Badge / Chip
<ds-badge> · .ds-badge · Status + count variants
Figma
Token Studio
Style Dict
Angular
Storybook
4/5 ready
▼
Figma
✓ Ready
5 status variants
Token Studio
✓ Ready
Tokens exported
Style Dict
✓ Ready
CSS vars generated
Angular
⚠ In review
v0.9.0-beta
Storybook
✕ Not started
Backlog sprint 8
Pipeline completion4/5
Figma
Angular
Status
Active
Pending
Error
Info
Draft
Count
4
New
v1.2.0
<!-- Stable: class-name approach using generated CSS vars -->
<span class="ds-badge ds-badge--success">Active</span>
<span class="ds-badge ds-badge--warning">Pending</span>
<span class="ds-badge ds-badge--danger">Error</span>
<span class="ds-badge ds-badge--info">Info</span>
<span class="ds-badge">Neutral</span>
Comments & change requests1 comment
JD
1d agoChange request· Style DictionaryWarning variant uses --color-warning-500 in beta but Figma shows color/warning/600. Needs correction to stay consistent.
LM
Card
<ds-card> · .ds-card · Default / Elevated / Outlined
Figma
Token Studio
Style Dict
Angular
Storybook
4/5 ready
▼
Figma
✓ Ready
3 variants designed
Token Studio
✓ Ready
Tokens exported
Style Dict
✓ Ready
CSS vars ready
Angular
✓ Ready
v1.2.0 stable
Storybook
⚠ In review
PR #51 open
Pipeline completion4/5
Figma
Angular
Default Card
Used for content grouping with a subtle surface treatment.
Elevated Card
Used for featured content that needs visual hierarchy.
<ds-card variant="elevated">
<ds-card-header>Card title</ds-card-header>
<ds-card-body>Content goes here</ds-card-body>
<ds-card-footer>
<ds-button variant="primary" size="sm">Action</ds-button>
</ds-card-footer>
</ds-card>
Modal / Dialog
<ds-modal> · Angular CDK overlay
Figma
Token Studio
Style Dict
Angular
Storybook
3/5 ready
▼
Figma
✓ Ready
3 sizes, overlay
Token Studio
✓ Ready
Tokens exported
Style Dict
⚠ In review
PR #58 open
Angular
✕ Not started
Blocked by Style Dict
Storybook
✕ Not started
Blocked upstream
Pipeline completion3/5
Figma
Angular plan
// Planned service-based API — do not use yet
const ref = this.modalService.open(ConfirmComponent, {
size: 'md',
data: { message: 'Delete this project?' }
});
ref.afterClosed().subscribe(result => { /* handle result */ });
Alert / Toast
<ds-alert> · <ds-toast> · success/warning/error/info
Figma
Token Studio
Style Dict
Angular
Storybook
3/5 ready
▼
Figma
✓ Ready
4 states designed
Token Studio
✓ Ready
Tokens exported
Style Dict
✓ Ready
CSS vars ready
Angular
✕ Not started
Sprint 9 planned
Storybook
✕ Not started
Blocked upstream
Pipeline completion3/5
Figma
✓
Changes saved Your project settings have been updated.
⚠
Account expiring Your trial ends in 3 days. Upgrade to continue.
✕
Failed to save Please check your connection and try again.
ℹ
Maintenance scheduled The platform will be offline from 02:00–04:00 SAST.
Checkbox / Radio / Toggle
<ds-checkbox> · <ds-radio> · <ds-toggle>
Figma
Token Studio
Style Dict
Angular
Storybook
2/5 ready
▼
Figma
✓ Ready
All 3 controls designed
Token Studio
✓ Ready
Tokens exported
Style Dict
✕ Not started
Backlog sprint 9
Angular
✕ Not started
Blocked upstream
Storybook
✕ Not started
Blocked upstream
Pipeline completion2/5
Figma
Checkbox
Checked
Unchecked
Disabled
Radio
Selected
Unselected
Toggle
On
Off
Avatar
<ds-avatar> · <ds-avatar-group> · Image + initials
Figma
Token Studio
Style Dict
Angular
Storybook
2/5 ready
▼
Figma
✓ Ready
sm/md/lg + group
Token Studio
✓ Ready
Size tokens exported
Style Dict
✕ Not started
Sprint 9 backlog
Angular
✕ Not started
Blocked upstream
Storybook
✕ Not started
Blocked upstream
Pipeline completion2/5
Figma
Sizes
LM
TM
SR
Group
LM
TM
NK
+4
Data Table
<ds-table> · .ds-table · Sortable / Paginated
Figma
Token Studio
Style Dict
Angular
Storybook
Not started
▼
Figma
✕ Not started
Token Studio
✕ Not started
Style Dict
✕ Not started
Angular
✕ Not started
Storybook
✕ Not started
Pipeline completion0/5
What will be built
| Name | Status | Role | Last active |
|---|---|---|---|
| Lulamile M. | Active | Senior Designer | Just now |
| Thabo M. | Active | Frontend Dev | 2h ago |
| Nandi K. | Away | Product Manager | 1d ago |
| Sipho R. | Inactive | QA Engineer | 3d ago |
Sortable columnsRow selectionPaginationColumn resizeEmpty stateLoading skeleton
Comments & change requests1 comment
PW
1w agoChange requestReporting dashboard urgently needs a data table. Currently using bespoke <table> with inline styles that matches nothing in the system. Can we prioritise Sprint 8?
LM
Tabs
<ds-tabs> · <ds-tab> · Horizontal / Vertical / Pill
Figma
Token Studio
Style Dict
Angular
Storybook
Not started
▼
Figma
✕ Not started
Token Studio
✕ Not started
Style Dict
✕ Not started
Angular
✕ Not started
Storybook
✕ Not started
Pipeline completion0/5
Design target
Tab panel content area — this is what will be built.