a1-migration
Original:🇺🇸 English
Translated
Migrate an Angular application to the One Allianz (A1) Design System. Use when: migrating to A1 design system, applying One Allianz theme, migrating circle toggles to tiles, updating small stages, updating layout to left-alignment, A1 brand kit, ngx-brand-kit, ng-aquila migration, NDBX to A1.
8installs
Sourceallianz/ng-aquila
Added on
NPX Install
npx skill4agent add allianz/ng-aquila a1-migrationTags
Translated version includes tags in frontmatterSKILL.md Content
View Translation Comparison →A1 Design System Migration
When to Use
- Migrating an Angular app from NDBX/old design system to One Allianz (A1) Design System
- Applying One Allianz theme (,
spacious, orcompact)dense - Replacing /
nx-circle-togglewithnx-circle-toggle-group/nx-tilenx-tile-group - Replacing info buttons with popovers to use the new
NxInfoIconComponent - Updating layout from center-aligned to left-aligned (A1 standard)
- Adjusting components, eyebrows and attention-color headlines
nx-small-stage
How to Apply Changes
- if css is required, add to the component's CSS file. If the component is standalone, add the CSS to the component's array in the
stylesdecorator.@Component - write style definitions into components style file. Do not use inline styles in the HTML template.
IMPORTANT: Before starting, tell the user the skill version "0.1.3" and that it's in beta phase. This is important for tracking and future updates.
Step 1: Apply A1 Theme
Important: check if package is installed.
@allianz/ngx-brand-kit- if not installed, do not try to install, do not ask the user to install and skip this step and continue with Step 2.
- if installed, continue with the Procedure as described below.
Procedure
- If theme is not specified, ask the user which theme they want: ,
spacious, orcompact.dense
- spacious for end customer-facing apps with more white space and larger touch targets
- compact for internal tools and dashboards where more information density is needed
- dense for data-heavy applications where maximum information density is required (e.g. tables, analytics)
- Run the schematic from the project root (where lives):
angular.jsonbashng g @allianz/ngx-brand-kit:apply-a1-theme --type=<THEME>
Step 2: Migrate Circle Toggles → Tiles
Stack: Angular standalone components, TypeScript,
@allianz/ng-aquilaImports
ts
import { NxTileComponent, NxTileGroupComponent } from '@allianz/ng-aquila/tile';If used in a Standalone Component, add the to the components array.
NxTileComponent, NxTileGroupComponentimportsDecision Rules
| Scenario | Action |
|---|---|
| Multi-select → use |
| Single-select → use |
| Remove it; add |
Selection / Forms Pattern
Before (checked-based):
html
<nx-circle-toggle-group>
<nx-circle-toggle
[checked]="sel==='a'"
value="a"
label="Label A"
icon="icon-name"
></nx-circle-toggle>
<nx-circle-toggle
[checked]="sel==='b'"
value="b"
label="Label B"
icon="icon-name"
></nx-circle-toggle>
</nx-circle-toggle-group>After (value-based on group):
html
<nx-tile-group [value]="sel">
<nx-tile value="a" label="Label A" icon="icon-name"></nx-tile>
<nx-tile value="b" label="Label B" icon="icon-name"></nx-tile>
</nx-tile-group>IMPORTANT: Do NOT put content inside. Use only<nx-tile>,label, andvalueattributes.icon
Layout Rules
| Layout found | What to do |
|---|---|
| No wrapper, no layout CSS | Replace group directly; no extra layout needed |
| Derive |
| Custom CSS | Translate to |
| 2–3 tiles total | Wrap |
For each occurrence found, output a short decision log: what was there, what you chose and why.
Step 3: Migrate Info Popups → new Info Icon Component
- Identify info buttons with popups: look for buttons (e.g. buttons with directive ) that trigger popovers and just have an info icon inside.
nxPopoverTrigger - Replace with : use the new component for consistent styling and behavior.
NxInfoIconComponent - Example:
html
<nx-info-icon
nxFormfieldAppendix
buttonAriaLabel="Additional information"
popoverDirection="bottom"
popoverWidth="300px"
>
<span>
This is an info icon with a popover. Click the icon to see additional information. Sadipscing
elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
voluptua.
</span>
</nx-info-icon>And the corresponding import:
ts
import { NxInfoIconComponent } from '@allianz/ng-aquila/info-icon';If used in a Standalone Component, add the to the components array.
NxInfoIconComponentimports- Important: Do not change buttons inside Formfields (). Only replace standalone info buttons that trigger popovers.
<nx-formfield>
Step 4: Update Layout — Left Alignment
A1 uses left-alignment throughout for accessibility and consistency.
Checklist
- Remove centering on rows: Change or remove → use
rowJustify="center"or remove entirely.rowJustify="start" - Remove text centering: Remove ,
class="text-center", and similar on headings and paragraphs.style="text-align: center" - Bottom navigation buttons (Back / Next):
- Must be right-aligned ()
rowJustify="end" - Must be side-by-side (same , not stacked in separate rows)
nxRow - Must use sentence case ("Back", "Next") not ALL CAPS
- only accepts numbers — warning
nxColwill break; usenxCol="auto",nxCol="12"or similarnxCol="12,12,6" - info on : breakpoints are defined as
nxColnxCol="<tiny>, <small>, <medium>, <large>, <xlarge>, <2xlarge>, <3xlarge>" - must be vertically centered within the row — if is used, add
nxRow.rowAlignItems="center"
- Must be right-aligned (
- Margins / padding: Remove , horizontal centering, and ensure content aligns to the left edge.
margin: auto
Vertical Spacing Adjustments
- Important: Skip this step if the is not installed and continue with
ngx-brand-kitbelow. The spacing values below rely on CSS variables from the A1 brand kit, so if it's not installed, leave spacing as-is.Headline Sizes - Find Dividers (,
<hr>,nx-divideror similar) divider lines that span the full width of the page and add vertical spacing above and below them. UsenxCol="12" class="section-divider"for this spacing to ensure consistency with A1 design standards.var(--semantic-gap-all-static-1600) - Headlines that are used standalone (outside of other components) should have a spacing below them. Use the mapping below
- →
nxHeadline size="3xl"var(--semantic-gap-all-static-1200) - →
nxHeadline size="2xl"var(--semantic-gap-all-static-1000) - →
nxHeadline size="xl"var(--semantic-gap-all-static-800)
- If the element underneath the headline has a top spacing (e.g. or
margin-top), remove it to avoid double spacing or subtract the headline spacing from it.padding-top
Headline Sizes
Hierarchy rule — applies after the mapping table and overrides it where needed:
The mapping table below is a starting point, not a final answer. After applying it, verify that the resulting sizes form a clear visual hierarchy on the page. If a primary section heading (e.g. an that is the main title of a page section) maps to a small size like or , override the mapped value to restore the hierarchy. A page with an at should use for its primary sections, for sub-sections, and so on — regardless of what the old assignment was.
<h2>smh1size="3xl"size="2xl"h2size="xl"- if you find with type assignments (e.g.
nxHeadline), translate to<h1 nxHeadline="page">attribute. For example,sizebecomes<h1 nxHeadline="page">. Ensure the main headline in<h1 nxHeadline size="3xl">usesnx-small-stagefor A1 consistency.size="3xl"
| old assignment | size attribute | use for |
|---|---|---|
| nxHeadline="page-bold-caps" | nxHeadline size="4xl" | huge page headlines, only for marketing pages, not for product UIs |
| nxHeadline="page" | nxHeadline size="3xl" | main page headlines |
| nxHeadline="section" | nxHeadline size="2xl" | section headlines |
| nxHeadline="subsection-large" | nxHeadline size="xl" | large subsection headlines |
| nxHeadline="subsection-medium" | nxHeadline size="l" | medium subsection headlines |
| nxHeadline="subsection-small" | nxHeadline size="m" | small subsection headlines |
| nxHeadline="subsection-xsmall" | nxHeadline size="s" | extra small subsection headlines |
After applying the table, check: does the result make sense in context? A primary section heading should never end up at just because the old code used . Promote it to the correct level in the page hierarchy.
<h2>size="s"subsection-xsmallStep 5: Adjust Small Stages
5.1 Subline → Eyebrow
Move any inside to an eyebrow above the :
<p nxCopytext="large">Subline</p>nx-small-stage<h1>html
<nx-eyebrow size="s">Subline Text</nx-eyebrow>
<h1 nxHeadline size="3xl">...</h1>Use the eyebrow size for nxHeadline size 3xl and smaller. If the user wants a nxHeadline larger than 3xl, use for the eyebrow.
size="s"size="m"ts
import { NxEyebrowComponent } from '@allianz/ng-aquila/eyebrow';If used in a Standalone Component, add the to the components array.
NxEyebrowComponentimports5.2 Partial Headline Coloring (required)
Always wrap the most meaningful word or short phrase in the with an attention-color span. This is a required A1 design standard for headlines — do not skip it. Choose the word or phrase that carries the most semantic weight (the product, the action, or the subject — not filler words like "your" or "and").
<h1>nx-small-stagehtml
<h1 nxHeadline size="3xl">Enter your <span [nx-attention-color]="'aqua'">property details</span></h1>ts
import { NxAttentionColorComponent } from '@allianz/ng-aquila/text';If used in a Standalone Component, add the to the components array.
NxAttentionColorComponentimports5.3 Headline Size
- remove assignments to in HTML headline elements (e.g.
nxHeadline) and replace with<h1 nxHeadline="page">for all small stage headlines. Ensure the main headline in<h1 nxHeadline size="3xl">usesnx-small-stagefor A1 consistency.size="3xl"
Migration Tracking
After completing each step, record the migration so adoption can be tracked across teams via GitHub search.
Project-level metadata in package.json
package.jsonAfter Step 1 (theme applied), add an key to . After each subsequent step completes, append the step name to the array:
a1Migrationpackage.jsonstepsjson
"a1Migration": {
"skillVersion": "0.1.3",
"appliedAt": "YYYY-MM-DD",
"theme": "<spacious|compact|dense>",
"steps": ["theme"]
}Append step names as they complete: , , , , .
"theme""tiles""info-icons""layout""small-stage"A fully migrated project looks like:
json
"a1Migration": {
"skillVersion": "0.1.3",
"appliedAt": "YYYY-MM-DD",
"theme": "<spacious|compact|dense>",
"steps": ["theme", "tiles", "info-icons", "layout", "small-stage"]
}tracking of additional migration runs
If already has an key, add the steps to the array for steps that ran in the current session.
package.jsona1Migration