feat: add Button component with primary and secondary styles, including disabled state

This commit is contained in:
LOUIS POTEVIN
2026-06-04 12:09:34 +02:00
parent c585ec3266
commit 5600107e53
4 changed files with 63 additions and 1 deletions
+37
View File
@@ -0,0 +1,37 @@
@use '../../styles/tokens/typography' as *;
.button {
width: fit-content;
padding: var(--nds-spacing-sm) var(--nds-spacing-md);
border-radius: var(--nds-radius-sm);
@include text-base;
cursor: pointer;
&__primary {
background-color: var(--nds-primary);
color: var(--nds-text);
&:hover:not(.button--disabled) {
background-color: var(--nds-secondary);
}
&:active:not(.button--disabled) {
background-color: var(--nds-accent);
color: var(--nds-background);
}
}
&__secondary {
border: var(--nds-border-width-medium) solid;
border-color: var(--nds-primary);
color: var(--nds-primary);
&:hover:not(.button--disabled) {
border-color: var(--nds-secondary);
}
&:active:not(.button--disabled) {
border-color: var(--nds-accent);
color: var(--nds-accent);
}
}
&--disabled {
cursor: not-allowed;
background-color: var(--nds-disabled);
color: var(--nds-neutral);
}
}
+15
View File
@@ -0,0 +1,15 @@
---
export interface Props {
type: 'primary' | 'secondary';
disabled?: boolean;
}
const { type, disabled = false } = Astro.props;
---
<div class={`button button__${type} ${disabled ? 'button--disabled' : ''}`}>
<slot/>
</div>
<style lang="scss">
@use './_button.scss';
</style>
+2 -1
View File
@@ -5,4 +5,5 @@ export { default as Notification } from './Notifications/notification.astro';
export { default as Toggle } from './Toggle/toggle.astro'; export { default as Toggle } from './Toggle/toggle.astro';
export { default as Tab } from './Tabs/tab.astro'; export { default as Tab } from './Tabs/tab.astro';
export { default as TabItem } from './Tabs/tabItem.astro'; export { default as TabItem } from './Tabs/tabItem.astro';
export { default as TabContent } from './Tabs/tabContent.astro'; export { default as TabContent } from './Tabs/tabContent.astro';
export { default as Button } from './Button/button.astro';
+9
View File
@@ -5,6 +5,7 @@ import Toggle from '../components/Toggle/toggle.astro';
import Tab from '../components/Tabs/tab.astro'; import Tab from '../components/Tabs/tab.astro';
import TabItem from '../components/Tabs/tabItem.astro'; import TabItem from '../components/Tabs/tabItem.astro';
import TabContent from '../components/Tabs/tabContent.astro'; import TabContent from '../components/Tabs/tabContent.astro';
import Button from '../components/Button/button.astro';
import { import {
Arrow2Icon, BinIcon, BurgerIcon, CalendarIcon, CheckIcon, CloseIcon, Arrow2Icon, BinIcon, BurgerIcon, CalendarIcon, CheckIcon, CloseIcon,
CodeIcon, CubeIcon, DownloadIcon, FilterIcon, HelpIcon, HomeIcon, CodeIcon, CubeIcon, DownloadIcon, FilterIcon, HelpIcon, HomeIcon,
@@ -19,6 +20,14 @@ const initialChecked = true;
<Layout> <Layout>
<main> <main>
<h1>Nova Design System</h1> <h1>Nova Design System</h1>
<section>
<h2>Button</h2>
<div style="display: flex; flex-direction: column; gap: var(--nds-spacing-md);">
<Button type="primary">Primary Button</Button>
<Button type="secondary">Secondary Button</Button>
<Button type="primary" disabled>disabled</Button>
</div>
</section>
<section> <section>
<h2>Tabs</h2> <h2>Tabs</h2>
<div style="display: flex; flex-direction: column; gap: var(--nds-spacing-md);"> <div style="display: flex; flex-direction: column; gap: var(--nds-spacing-md);">