This release is focused on shedding legacy code and laying the foundation for our "UI Refresh" project, aligning code with our NDSv2 Figma library.
All legacy CSS variables prefixed with nds- have been removed from the design system. These variables were part of an older naming convention and have been superseded by the current design token system.
Impact: If your application uses any of these deprecated CSS variables directly in custom styles, you'll need to update them to use the standard design token variables instead.
Why this change: This removal standardizes the design token naming convention across NDS, making it easier to maintain and understand. The new token names follow a more consistent pattern that aligns with modern CSS practices.
| Legacy var | Standard var | Value |
|---|---|---|
var(--nds-black) |
var(--color-black) |
#333333 |
var(--nds-grey) |
var(--color-grey) |
#4C4C4C |
var(--nds-medium-grey) |
var(--color-mediumGrey) |
#8C8C8C |
var(--nds-lightest-grey) |
var(--color-lightGrey) |
#D9D9D9 |
var(--nds-smoke-grey) |
var(--bgColor-smokeGrey) |
#F3F3F3 |
var(--nds-red) |
var(--color-errorDark) |
#D93B3B |
var(--nds-white) |
var(--color-white) |
#FFFFFF |
var(--nds-font-family) |
var(--font-family-body) |
Mulish, Helvetica, sans-serif |
var(--nds-header-font) |
var(--font-family-heading) |
'Narmi Matiere', serif |
var(--subdued-20-opacity) |
var(--alpha-20) |
0.2 |
var(--subdued-10-opacity) |
var(--alpha-10) |
0.1 |
var(--subdued-5-opacity) |
var(--alpha-5) |
0.05 |
Before:
.my-component {
color: var(--nds-black);
border-color: rgba(0, 0, 0, var(--subdued-20-opacity));
}After (v6):
.my-component {
color: var(--rgb-black);
border-color: rgba(0, 0, 0, var(--alpha-20));
}The Dropdown component has been completely removed from the library. This component was deprecated in v4 and has now been removed in v6.
Impact: Applications using Dropdown will need to migrate to one of the modern replacement components based on their specific use case.
Why this change: The Dropdown component was an early implementation that lacked proper accessibility features and had an unclear API. The modern replacement components (Select, MultiSelect, Combobox, Popover) provide better accessibility, clearer APIs, and more specialized functionality.
| Use Case | Replacement Component | Notes |
|---|---|---|
| Single selection from a list | Select |
Standard dropdown with single selection |
| Multiple selections from a list | MultiSelect |
Dropdown with checkboxes for multiple items |
| Single selection with search/filtering | Combobox |
Dropdown with built-in search/filter |
| Custom popover content (tooltips, overflow menus) | Popover |
For custom content beyond simple list items |
Before:
import { Dropdown } from "@narmi/design_system";
<Dropdown
triggerLabel="Select an option"
onChange={(value) => handleChange(value)}
>
<div>Option 1</div>
<div>Option 2</div>
<div>Option 3</div>
</Dropdown>;After (v6):
import { Select } from "@narmi/design_system";
// Choose from: Select, MultiSelect, Combobox, or AutocompleteModa
<Select
label="Select an option"
value={selectedValue}
onChange={(value) => handleChange(value)}
>
<Select.Item value="option1" searchValue="Option 1">
Option 1
</Select.Item>
<Select.Item value="option2" searchValue="Option 2">
Option 2
</Select.Item>
<Select.Item value="option3" searchValue="Option 3">
Option 3
</Select.Item>
</Select>;The kind="menu" variant has been removed from the Button component.
Impact: Any buttons using kind="menu" will need to be updated to use kind="plain".
Why this change: The menu kind was a specialized variant used in only one location (the OLB header) and had complex, legacy-specific styling rules. The plain kind of Button is the standard variant per design.
Before:
<Button kind="menu" label="Menu action" onClick={handleClick} />After (v6):
<Button kind="plain" label="Menu action" onClick={handleClick} />The deprecations.json file has been removed from the published dist/ directory.
Impact: If your build process or tooling relied on this file, this may be breaking.
Why this change: This file was unmaintained and outdated. Deprecation warnings are now handled through TypeScript types, JSDoc comments, and proper semantic versioning practices.
The .nds-plain-button CSS class has been removed from the design system.
Impact: If you have custom HTML elements using this class for styling, you'll need to migrate to the proper Button component.
Why this change: This has never been publicly exposed, but known to be in used in some consumers.
Before:
<button className="nds-plain-button" onClick={handleClick}>
Click me
</button>After (v6):
import { Button } from "@narmi/design_system";
<Button kind="plain" label="Click me" onClick={handleClick} />;The kind="interactive" variant has been removed from ContentCard.
Impact: Cards using kind="interactive" need to be updated to use either kind="button" or kind="toggle" based on their behavior.
Why this change: The interactive kind was ambiguous about its purpose. The new approach uses more semantically correct variants that better communicate the card's behavior and improve accessibility.
| Use Case | Replacement Kind | Notes |
|---|---|---|
| Card triggers an action on click | kind="button" |
For actions that only need an onClick; renders as a button |
| Card has selected/unselected state | kind="toggle" |
For toggling selected state; renders as a checkbox |
NDS v6 requires React v18 or v19. You must upgrade your React version to use this release.
Impact: Applications using React v16 or v17 must upgrade to React v18 or v19 before adopting NDS v6.
Why this change: React 18 and 19 provide significant improvements in concurrent rendering, automatic batching, and modern APIs. Dropping support for older versions allows NDS to leverage these improvements and simplifies maintenance.
The searchValue prop is now required on all item components for Select, MultiSelect, Combobox, and AutocompleteModal.
Impact: All usages of .Item components within these selection components must now explicitly provide a searchValue prop.
Why this change: Previously, the searchValue prop was optional and would fall back to using the item's value for search filtering. This caused issues when items had complex children (icons, formatted text, etc.) or when the visual display differed from the search term. Making it required ensures predictable search behavior and prevents runtime errors.
Select.ItemMultiSelect.ItemCombobox.ItemAutocompleteModal.Item
Before:
<Select label="Choose a state">
<Select.Item value="ny">New York</Select.Item>
<Select.Item value="ca">California</Select.Item>
</Select>After (v6):
<Select label="Choose a state">
<Select.Item value="ny" searchValue="New York">
New York
</Select.Item>
<Select.Item value="ca" searchValue="California">
California
</Select.Item>
</Select>These changes are non-breaking but represent deprecations or improvements you should be aware of.
The Tag component is deprecated and will be removed in v6 of NDS. Use Chip instead.
Impact: The Tag component is being deprecated in favor of Chip with improved functionality.
Why this change: Chip provides a more modern API with better separation of concerns. Visual styling (kind) is independent of behavior (dismissibility, clickability), making it more flexible and easier to use. Most importantly, it aligns with the NDSv2 Figma library.
Chip is a direct replacement for Tag with an enhanced API.
The key difference is that behaviors like dismissibility are now decoupled from the visual style variant in Chip, providing more flexibility.
Tag Prop |
Chip Equivalent |
Notes |
|---|---|---|
label |
label |
Same usage |
kind |
kind |
Chip supports: "info", "success", "warn", "error", "primary", "secondary" |
onDismiss |
onDismiss |
Same usage - renders close button |
onClick |
onClick |
Same usage - makes entire chip clickable |
| - | startIcon |
🆕 NEW: Add icon at start of label |
| - | endIcon |
🆕 NEW: Add icon at end of label |
| - | count |
🆕 NEW: Display a count badge |
Simple Tag → Chip:
// Before
<Tag label="Status" kind="success" />
// After
<Chip label="Status" kind="success" />Clickable Tag → Chip:
// Before
<Tag
label="View details"
kind="info"
onClick={() => showDetails()}
/>
// After
<Chip
label="View details"
kind="info"
onClick={() => showDetails()}
/>Using new Chip features:
// Chip with icon and count
<Chip
label="Notifications"
kind="primary"
startIcon={<Icon name="bell" />}
count={5}
/>
// Chip with custom end icon
<Chip
label="Important"
kind="error"
endIcon={<Icon name="warning" />}
/>Storybook has been upgraded to v9. This upgrade includes improved performance, updated UI, and better developer experience.
- Faster Storybook Startup
- New development features
No action required for consumers. This change only affects the NDS build process and does not impact how you import or use NDS components.
NDS v6 no longer uses webpack for builds. Vite is now the only build tool used by this project.
- All webpack configuration has been removed
- Modern ESM modules
- FAST Builds
- Speedy Sass build via
vite, making live refresh actually useful for CSS changes
No action required for consumers. This change only affects the NDS build process and does not impact how you import or use NDS components.