Skip to content

Commit 611bb47

Browse files
committed
feat: add button preset
1 parent 393c004 commit 611bb47

File tree

16 files changed

+348
-283
lines changed

16 files changed

+348
-283
lines changed

biome.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"$schema": "https://biomejs.dev/schemas/2.2.5/schema.json",
2+
"$schema": "https://biomejs.dev/schemas/2.3.0/schema.json",
33
"vcs": {
44
"enabled": true,
55
"clientKind": "git",

examples/nextjs/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
"dev": "next dev --turbopack -p 4000",
77
"build": "next build",
88
"start": "next start",
9-
"lint": "next lint"
9+
"lint": "biome check",
10+
"format": "biome format --write"
1011
},
1112
"dependencies": {
1213
"@composify/react": "workspace:*",

packages/react/package.json

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,16 @@
3030
"default": "./dist/editor/index.js"
3131
}
3232
},
33+
"./preset": {
34+
"import": {
35+
"types": "./dist/preset/index.d.mts",
36+
"default": "./dist/preset/index.mjs"
37+
},
38+
"require": {
39+
"types": "./dist/preset/index.d.ts",
40+
"default": "./dist/preset/index.js"
41+
}
42+
},
3343
"./renderer": {
3444
"import": {
3545
"types": "./dist/renderer/index.d.mts",
@@ -51,6 +61,8 @@
5161
}
5262
},
5363
"./style.css": "./dist/index.css",
64+
"./editor/style.css": "./dist/editor/index.css",
65+
"./preset/style.css": "./dist/preset/index.css",
5466
"./package.json": "./package.json"
5567
},
5668
"files": [
@@ -74,6 +86,8 @@
7486
"acorn-jsx": "5.3.2",
7587
"css-box-model": "1.2.1",
7688
"es-toolkit": "1.40.0",
89+
"lucide-react": "0.546.0",
90+
"prettier": "3.6.2",
7791
"react-dnd": "16.0.1",
7892
"react-dnd-html5-backend": "16.0.1",
7993
"react-element-to-jsx-string": "17.0.1"
@@ -83,13 +97,11 @@
8397
"@testing-library/react": "16.3.0",
8498
"@types/react": "19.1.17",
8599
"@types/react-dom": "19.1.11",
86-
"prettier": "3.6.2",
87100
"react": "19.1.0",
88101
"react-dom": "19.1.0",
89102
"typescript": "5.9.3"
90103
},
91104
"peerDependencies": {
92-
"prettier": "*",
93105
"react": "*",
94106
"react-dom": "*"
95107
}

packages/react/src/editor/CloudEditorControl/CloudEditorControl.tsx

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { type FC, useCallback, useEffect, useRef } from 'react';
2+
import { Button } from '../../preset';
23
import { Bridge, GuestEventType, getClassNameFactory } from '../../utils';
34
import styles from './CloudEditorControl.module.css';
45

@@ -30,16 +31,12 @@ export const CloudEditorControl: FC<Props> = ({ getSource }) => {
3031

3132
return (
3233
<div className={getClassName()}>
33-
<button
34-
type="button"
35-
className={getClassName('SettingsButton')}
36-
onClick={handleClickSettings}
37-
>
34+
<Button type="button" variant="outline" size="sm" onClick={handleClickSettings}>
3835
Settings
39-
</button>
40-
<button type="button" className={getClassName('SaveButton')} onClick={handleClickSave}>
36+
</Button>
37+
<Button type="button" variant="primary" size="sm" onClick={handleClickSave}>
4138
Save
42-
</button>
39+
</Button>
4340
</div>
4441
);
4542
};

packages/react/src/editor/Editor/Editor.stories.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { type FC, type PropsWithChildren, useMemo } from 'react';
22
import { Catalog } from '../../renderer';
33
import { Editor } from './Editor';
4+
import '../../preset';
45

56
type StackProps = PropsWithChildren<{
67
flexDirection?: 'row' | 'column';

packages/react/src/editor/EditorControl/EditorControl.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { type FC, type ReactNode, useCallback } from 'react';
2+
import { Button } from '../../preset';
23
import { getClassNameFactory } from '../../utils';
34
import { useEditing } from '../EditingContext';
45
import styles from './EditorControl.module.css';
@@ -64,9 +65,9 @@ export const EditorControl: FC<Props> = ({ mode, setMode, renderControl, onSubmi
6465
{renderControl ? (
6566
renderControl(getSource)
6667
) : (
67-
<button type="button" className={getClassName('SaveButton')} onClick={handleSubmit}>
68+
<Button type="button" variant="primary" size="sm" onClick={handleSubmit}>
6869
Save
69-
</button>
70+
</Button>
7071
)}
7172
</div>
7273
);

packages/react/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
export * from './editor';
2+
export * from './preset';
23
export * from './renderer';
34
export * from './utils';
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
.container {
2+
display: inline-flex;
3+
flex-shrink: 0;
4+
align-items: center;
5+
justify-content: center;
6+
border-radius: 4px;
7+
outline: none;
8+
border: none;
9+
font-family: inherit;
10+
font-weight: 500;
11+
line-height: 1;
12+
white-space: nowrap;
13+
transition-property: background-color, opacity;
14+
transition-duration: 0.15s;
15+
}
16+
17+
.container:disabled {
18+
pointer-events: none;
19+
opacity: 0.7;
20+
}
21+
22+
.container--variant-primary {
23+
background-color: var(--composify-palette-primary);
24+
color: var(--composify-palette-on-primary);
25+
}
26+
27+
.container--variant-primary:hover {
28+
opacity: 0.9;
29+
}
30+
31+
.container--variant-secondary {
32+
background-color: var(--composify-palette-secondary);
33+
color: var(--composify-palette-on-secondary);
34+
}
35+
36+
.container--variant-secondary:hover {
37+
opacity: 0.9;
38+
}
39+
40+
.container--variant-outline {
41+
border: 1px solid var(--composify-palette-outline);
42+
background-color: var(--composify-palette-surface);
43+
color: var(--composify-palette-on-surface);
44+
}
45+
46+
.container--variant-outline:hover {
47+
background-color: var(--composify-palette-surface-container);
48+
}
49+
50+
.container--size-xs {
51+
height: 32px;
52+
padding: 0 12px;
53+
gap: 4px;
54+
font-size: 12px;
55+
}
56+
57+
.container--size-sm {
58+
height: 36px;
59+
padding: 0 12px;
60+
gap: 6px;
61+
font-size: 14px;
62+
}
63+
64+
.container--size-md {
65+
height: 42px;
66+
padding: 0 16px;
67+
gap: 8px;
68+
font-size: 14px;
69+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import type { ComponentProps, FC } from 'react';
2+
import { createVariants } from '../../utils';
3+
import styles from './Button.module.css';
4+
5+
type Props = ComponentProps<'button'> & {
6+
variant: 'primary' | 'secondary' | 'outline';
7+
size: 'xs' | 'sm' | 'md';
8+
};
9+
10+
const variants = createVariants(styles);
11+
12+
export const Button: FC<Props> = ({ className, variant, size, ...props }) => (
13+
<button className={variants('container', { className, variant, size })} {...props} />
14+
);
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { Catalog } from '../../renderer';
2+
import { Button } from './Button';
3+
4+
Catalog.register('Button', {
5+
component: Button,
6+
props: {
7+
variant: {
8+
label: 'Variant',
9+
type: 'radio',
10+
options: [
11+
{
12+
label: 'Primary',
13+
value: 'primary',
14+
},
15+
{
16+
label: 'Secondary',
17+
value: 'secondary',
18+
},
19+
{
20+
label: 'Outline',
21+
value: 'outline',
22+
},
23+
],
24+
default: 'primary',
25+
},
26+
size: {
27+
label: 'Size',
28+
type: 'radio',
29+
options: [
30+
{
31+
label: 'Extra Small',
32+
value: 'xs',
33+
},
34+
{
35+
label: 'Small',
36+
value: 'sm',
37+
},
38+
{
39+
label: 'Medium',
40+
value: 'md',
41+
},
42+
],
43+
default: 'md',
44+
},
45+
children: {
46+
label: 'Children',
47+
type: 'text',
48+
default: 'Button',
49+
},
50+
},
51+
});

0 commit comments

Comments
 (0)