Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
3634917
chore: bump version to 1.1.0 and add changelog
nipsysdev May 2, 2026
6baba4c
refactor(styles): implement multi-theme system with 5 accent themes
nipsysdev May 2, 2026
a9640b7
test: add comprehensive tests for theme switching and variants
nipsysdev May 2, 2026
85ea93f
refactor(components): update all components to use new theme variable…
nipsysdev May 2, 2026
4c88e09
docs: update examples and docs for new theming system
nipsysdev May 2, 2026
e5958d5
docs(skills): update color and theme variable references
nipsysdev May 2, 2026
1305321
chore: remove console.log statements from iframe hooks
nipsysdev May 2, 2026
e6fd5bc
fix: adjust custom variants and body styling
nipsysdev May 2, 2026
524d884
fix: add color/background-color to theme variants
nipsysdev May 2, 2026
0e657f8
fix: update monochrome theme test regex pattern
nipsysdev May 2, 2026
623b60d
chore: remove unused style.css import
nipsysdev May 2, 2026
14cfc62
docs(skill): update contribute skill with dev setup and workflow impr…
nipsysdev May 2, 2026
52042d4
docs(skill): add installation guide and reorganize component matrix
nipsysdev May 2, 2026
6825b7d
docs(refs): add foreground and text semantic color tokens
nipsysdev May 2, 2026
f15d01b
fix(refs): correct component counts and import paths
nipsysdev May 2, 2026
e898c8d
docs: rename colours to colors for US English consistency
nipsysdev May 3, 2026
18a7689
docs(theming): update Nord theme colors and simplify branding
nipsysdev May 3, 2026
5cf1634
docs(typography): remove redundant About section
nipsysdev May 3, 2026
03c6e87
docs(installation): simplify branding copy
nipsysdev May 3, 2026
2bc24ef
fix(sidebar): add missing relative class
nipsysdev May 3, 2026
1842110
feat(sidebar): add triggerStyle prop for inline trigger styling
nipsysdev May 3, 2026
83fc703
feat(sidebar): support triggerStyle with cn() className merging
nipsysdev May 3, 2026
03a8522
refactor(sidebar): make SidebarTrigger classNames optional and merge …
nipsysdev May 3, 2026
f436518
docs(sidebar): use triggerStyle to position sidebar trigger
nipsysdev May 3, 2026
c9ff7db
fix: remove non-existent slate theme tests and fix CommandInput place…
nipsysdev May 3, 2026
157376e
docs(changelog): minor fix
nipsysdev May 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 65 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [1.1.0] - 2026-05-02

### Breaking Changes

**Major Theming System Refactor**

- Removed all shadcn-style theme variables in favor of pure LSD design tokens
- Removed: `--background`, `--foreground`, `--primary`, `--primary-foreground`, `--secondary`, `--secondary-foreground`, `--accent`, `--accent-foreground`, `--destructive`, `--destructive-foreground`, `--muted`, `--muted-foreground`, `--border`, `--input`, `--ring`
- Renamed design tokens for semantic clarity
- Double-prefix pattern (e.g., `text-lsd-text-secondary`) standardized to single prefix (e.g., `text-secondary`)
- Updated all component styling to use new variable naming convention
- Theme structure reorganized to support nested light/dark variants with accent themes
- Custom theme creation now requires using LSD-specific variable names

### Migration

If you have custom themes or override theme variables, you'll need to update them:

1. Replace shadcn-style variables with LSD tokens
2. Update variable names to match the new single-prefix pattern
3. Review custom theme definitions against the new theme structure

### Features

- **Improved Theme System**: Redesigned CSS custom properties for better semantic clarity and consistency
- **Enhanced Theming Architecture**: Better support for nested light/dark variants with accent theme inheritance

### Improvements

- Standardized variable naming conventions across all 40+ components
- Improved theme inheritance and scoping behavior
- Enhanced accessibility with consistent semantic token names
- Better separation of concerns between color modes and accent themes

### Deprecations

- None removed (shadcn-style variables were fully removed, not deprecated)

---

## Previous Versions

### [1.0.0] - Initial Release

- Initial release of LSD component library
- 38+ accessible UI components
- Built on React 19+ with Radix UI
- Support for light/dark modes and 4 accent themes (Teal, Nord, Terracotta, Catppuccin)
- Monochrome color palette with semantic styling
- Comprehensive documentation site
- Full TypeScript support

---

## Version Reference

- **1.1.0** - Current release (theming refactor)
- **1.0.0** - Initial release
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@nipsys/lsd-monorepo",
"version": "1.0.1",
"version": "1.1.0",
"private": true,
"description": "Monorepo for the @nipsys/lsd component library and documentation",
"license": "MIT",
Expand Down
4 changes: 2 additions & 2 deletions packages/lsd-docs/app/components/SidebarWrapper.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ interface SidebarWrapperProps {
export default function SidebarWrapper({ currentPath, children }: SidebarWrapperProps) {
return (
<SidebarProvider>
<Sidebar>
<Sidebar triggerStyle={{ top: '10px' }}>
<SidebarHeader>
<SidebarMenu>
<SidebarMenuItem>
Expand All @@ -39,7 +39,7 @@ export default function SidebarWrapper({ currentPath, children }: SidebarWrapper
</div>
<div className="flex flex-col gap-(--lsd-spacing-smaller) leading-none">
<span className="font-semibold">@nipsys/lsd</span>
<span className="text-xs">v1.0.1</span>
<span className="text-xs">v1.1.0</span>
</div>
</Link>
</SidebarMenuButton>
Expand Down
2 changes: 1 addition & 1 deletion packages/lsd-docs/app/components/docs/IframeExample.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export const IframeExample = forwardRef<HTMLIFrameElement, IframeExampleProps>(
({ src, title, size = 'md', className, ...props }, ref) => {
const heightClass = {
sm: 'min-h-[128px]',
md: 'min-h-[256px]',
md: 'min-h-[280px]',
lg: 'min-h-[450px]',
xl: 'min-h-[600px]',
}[size];
Expand Down
6 changes: 0 additions & 6 deletions packages/lsd-docs/app/components/docs/useSendIframes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,6 @@ export function useSendThemeToIframes(...iframeRefs: React.RefObject<HTMLIFrameE
// Send params to iframes when theme, accent, or font changes
React.useEffect(() => {
const params: ExampleParams = { theme, accent, font };
console.log(
'[useSendThemeToIframes] Sending params on change:',
params,
'to iframes:',
iframeRefs.length
);
iframeRefs.forEach(ref => void sendToIframe(ref.current, 'example-params', params));
}, [theme, accent, font, iframeRefs]);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,9 @@ import { type ExampleParams, useIframeMessageListener } from './useIframeSync';

export function useSendThemeToIframes() {
useIframeMessageListener('example-params', (params: ExampleParams) => {
console.log('[IFRAME] Received theme params:', params);
const root = document.documentElement;

if (params.theme) {
console.log('[IFRAME] Applying theme:', params.theme);
if (params.theme === 'dark') {
root.classList.add('dark');
} else {
Expand All @@ -17,7 +15,6 @@ export function useSendThemeToIframes() {
}

if (params.accent) {
console.log('[IFRAME] Applying accent:', params.accent);
if (params.accent === 'monochrome') {
root.removeAttribute('data-theme');
} else {
Expand All @@ -26,7 +23,6 @@ export function useSendThemeToIframes() {
}

if (params.font) {
console.log('[IFRAME] Applying font:', params.font);
root.classList.remove('font-serif', 'font-sans', 'font-mono');
if (params.font === 'serif') {
root.classList.add('font-serif');
Expand Down
2 changes: 1 addition & 1 deletion packages/lsd-docs/app/config/navigation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ export const navItems: NavGroup[] = [
{
title: 'Design Tokens',
items: [
{ title: 'Colours', url: '/design-tokens/colours', icon: PaletteIcon },
{ title: 'Colors', url: '/design-tokens/colors', icon: PaletteIcon },
{
title: 'Typography',
url: '/design-tokens/typography',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,23 +12,12 @@ export default function ColorsPage() {
return (
<DocsLayout>
<PageHeader
title="Colours"
description="Explore the colour palette used throughout LSD components."
title="Colors"
description="Explore the color palette used throughout LSD components."
/>

<PageContent>
<PageSection title="About the Colour Palette">
<Typography variant="body1" className="block">
Colours are tools for signalling, not branding. LSD's palette is chosen for maximum
contrast and accessibility across all conditions.
</Typography>

<Typography variant="body1" className="mt-(--lsd-spacing-base)">
High contrast isn't a design choice — it's a commitment to inclusivity.
</Typography>
</PageSection>

<PageSection title="Primary Colours">
<PageSection title="Primary Colors">
<Typography variant="body1" className="block">
Primary marks essential actions and focal points — where the user needs to look to move
forward.
Expand All @@ -54,36 +43,37 @@ export default function ColorsPage() {
<CardContent className="pt-(--lsd-spacing-large)">
<div
className="h-24 mb-(--lsd-spacing-base)"
style={{ backgroundColor: 'var(--lsd-primary-foreground)' }}
style={{ backgroundColor: 'var(--lsd-primary-content)' }}
/>
<Typography variant="h5" className="mb-(--lsd-spacing-smallest)">
Primary Foreground
Primary Content
</Typography>
<Typography variant="label1" className="text-nowrap">
--lsd-primary-foreground: <ColorValue variable="--lsd-primary-foreground" />
--lsd-primary-content: <ColorValue variable="--lsd-primary-content" />
</Typography>
</CardContent>
</Card>
</div>
</PageSection>

<PageSection title="Text Colours">
<PageSection title="Text Colors">
<Typography variant="body1" className="block">
Text colours for primary content and supporting information, optimized for readability.
Text colors for primary content and supporting information, optimized for readability.
These same colors are used for icons to maintain visual consistency.
</Typography>

<div className="inline-grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-(--lsd-spacing-base) mt-(--lsd-spacing-base)">
<Card className="min-w-fit max-w-[250px]">
<CardContent className="pt-(--lsd-spacing-large)">
<div
className="h-24 mb-(--lsd-spacing-base)"
style={{ backgroundColor: 'var(--lsd-text-primary)' }}
style={{ backgroundColor: 'var(--lsd-text-neutral)' }}
/>
<Typography variant="h5" className="mb-(--lsd-spacing-smallest)">
Text Primary
Text Neutral
</Typography>
<Typography variant="label1" className="text-nowrap">
--lsd-text-primary: <ColorValue variable="--lsd-text-primary" />
--lsd-text-neutral: <ColorValue variable="--lsd-text-neutral" />
</Typography>
</CardContent>
</Card>
Expand All @@ -105,61 +95,38 @@ export default function ColorsPage() {
</div>
</PageSection>

<PageSection title="Surface & Border Colours">
<PageSection title="Background & Border Colors">
<Typography variant="body1" className="block">
Surface and border colours define structure and hierarchy across the interface.
Background and border colors define structure and hierarchy across the interface.
</Typography>

<div className="inline-grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-(--lsd-spacing-base) mt-(--lsd-spacing-base)">
<Card className="min-w-fit max-w-[250px]">
<CardContent className="pt-(--lsd-spacing-large)">
<div
className="h-24 mb-(--lsd-spacing-base) border"
style={{ backgroundColor: 'var(--lsd-surface)' }}
/>
<Typography variant="h5" className="mb-(--lsd-spacing-smallest)">
Surface
</Typography>
<Typography variant="label1" className="text-nowrap">
--lsd-surface: <ColorValue variable="--lsd-surface" />
</Typography>
</CardContent>
</Card>

<Card className="min-w-fit max-w-[250px]">
<CardContent className="pt-(--lsd-spacing-large)">
<div
className="h-24 mb-(--lsd-spacing-base)"
style={{ backgroundColor: 'var(--lsd-border)' }}
style={{ backgroundColor: 'var(--lsd-background)' }}
/>
<Typography variant="h5" className="mb-(--lsd-spacing-smallest)">
Border
Background
</Typography>
<Typography variant="label1" className="text-nowrap">
--lsd-border: <ColorValue variable="--lsd-border" />
--lsd-background: <ColorValue variable="--lsd-background" />
</Typography>
</CardContent>
</Card>
</div>
</PageSection>

<PageSection title="Icon Colours">
<Typography variant="body1" className="block">
Icon colours maintain visual consistency across all interactive and decorative elements.
</Typography>

<div className="inline-grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-(--lsd-spacing-base) mt-(--lsd-spacing-base)">
<Card className="min-w-fit max-w-[250px]">
<CardContent className="pt-(--lsd-spacing-large)">
<div
className="h-24 mb-(--lsd-spacing-base)"
style={{ backgroundColor: 'var(--lsd-icon-primary)' }}
className="h-24 mb-(--lsd-spacing-base) border"
style={{ backgroundColor: 'var(--lsd-foreground)' }}
/>
<Typography variant="h5" className="mb-(--lsd-spacing-smallest)">
Icon Primary
Foreground
</Typography>
<Typography variant="label1" className="text-nowrap">
--lsd-icon-primary: <ColorValue variable="--lsd-icon-primary" />
--lsd-foreground: <ColorValue variable="--lsd-foreground" />
</Typography>
</CardContent>
</Card>
Expand All @@ -168,22 +135,22 @@ export default function ColorsPage() {
<CardContent className="pt-(--lsd-spacing-large)">
<div
className="h-24 mb-(--lsd-spacing-base)"
style={{ backgroundColor: 'var(--lsd-icon-secondary)' }}
style={{ backgroundColor: 'var(--lsd-border)' }}
/>
<Typography variant="h5" className="mb-(--lsd-spacing-smallest)">
Icon Secondary
Border
</Typography>
<Typography variant="label1" className="text-nowrap">
--lsd-icon-secondary: <ColorValue variable="--lsd-icon-secondary" />
--lsd-border: <ColorValue variable="--lsd-border" />
</Typography>
</CardContent>
</Card>
</div>
</PageSection>

<PageSection title="Semantic Colours">
<PageSection title="Semantic Colors">
<Typography variant="body1" className="block">
Semantic colours communicate state — success, warning, destructive actions, and
Semantic colors communicate state — success, warning, destructive actions, and
information.
</Typography>

Expand Down Expand Up @@ -250,23 +217,23 @@ export default function ColorsPage() {
</div>
</PageSection>

<PageSection title="Semantic Text Colours">
<PageSection title="Semantic Text Colors">
<Typography variant="body1" className="block">
Text colours for semantic states.
Text colors for semantic states.
</Typography>

<div className="inline-grid grid-cols-1 md:grid-cols-2 gap-(--lsd-spacing-base) mt-(--lsd-spacing-base)">
<Card className="min-w-fit max-w-[250px]">
<CardContent className="pt-(--lsd-spacing-large)">
<div
className="h-24 mb-(--lsd-spacing-base)"
style={{ backgroundColor: 'var(--lsd-success-text)' }}
style={{ backgroundColor: 'var(--lsd-text-success)' }}
/>
<Typography variant="h5" className="mb-(--lsd-spacing-smallest)">
Success Text
</Typography>
<Typography variant="label1" className="text-nowrap">
--lsd-success-text: <ColorValue variable="--lsd-success-text" />
--lsd-text-success: <ColorValue variable="--lsd-text-success" />
</Typography>
</CardContent>
</Card>
Expand All @@ -275,13 +242,13 @@ export default function ColorsPage() {
<CardContent className="pt-(--lsd-spacing-large)">
<div
className="h-24 mb-(--lsd-spacing-base)"
style={{ backgroundColor: 'var(--lsd-destructive-text)' }}
style={{ backgroundColor: 'var(--lsd-text-destructive)' }}
/>
<Typography variant="h5" className="mb-(--lsd-spacing-smallest)">
Destructive Text
</Typography>
<Typography variant="label1" className="text-nowrap">
--lsd-destructive-text: <ColorValue variable="--lsd-destructive-text" />
--lsd-text-destructive: <ColorValue variable="--lsd-text-destructive" />
</Typography>
</CardContent>
</Card>
Expand All @@ -290,13 +257,13 @@ export default function ColorsPage() {
<CardContent className="pt-(--lsd-spacing-large)">
<div
className="h-24 mb-(--lsd-spacing-base)"
style={{ backgroundColor: 'var(--lsd-warning-text)' }}
style={{ backgroundColor: 'var(--lsd-text-warning)' }}
/>
<Typography variant="h5" className="mb-(--lsd-spacing-smallest)">
Warning Text
</Typography>
<Typography variant="label1" className="text-nowrap">
--lsd-warning-text: <ColorValue variable="--lsd-warning-text" />
--lsd-text-warning: <ColorValue variable="--lsd-text-warning" />
</Typography>
</CardContent>
</Card>
Expand All @@ -305,13 +272,13 @@ export default function ColorsPage() {
<CardContent className="pt-(--lsd-spacing-large)">
<div
className="h-24 mb-(--lsd-spacing-base)"
style={{ backgroundColor: 'var(--lsd-info-text)' }}
style={{ backgroundColor: 'var(--lsd-text-info)' }}
/>
<Typography variant="h5" className="mb-(--lsd-spacing-smallest)">
Info Text
</Typography>
<Typography variant="label1" className="text-nowrap">
--lsd-info-text: <ColorValue variable="--lsd-info-text" />
--lsd-text-info: <ColorValue variable="--lsd-text-info" />
</Typography>
</CardContent>
</Card>
Expand Down
Loading
Loading