@atomsix/design-system 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +127 -0
- package/dist/index.cjs +83 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +45 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/theme.css +45 -0
- package/package.json +66 -0
package/README.md
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# @atomsix/design-system
|
|
2
|
+
|
|
3
|
+
Design system da Atom6 Studio — componentes React tipados, estilizados com
|
|
4
|
+
**Tailwind CSS v4** (abordagem CSS-first, sem `tailwind.config.js`) e
|
|
5
|
+
distribuídos via npm.
|
|
6
|
+
|
|
7
|
+
- **Build:** tsup (ESM + CJS + `.d.ts`)
|
|
8
|
+
- **Variantes:** [cva](https://cva.style) + helper `cn()` (`clsx` + `tailwind-merge`)
|
|
9
|
+
- **Docs/dev:** Storybook (local)
|
|
10
|
+
- **Versionamento:** [Changesets](https://github.com/changesets/changesets), com publish automático via GitHub Actions
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Instalação (projeto consumidor)
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
pnpm add @atomsix/design-system
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
O projeto consumidor precisa ter **Tailwind CSS v4** instalado
|
|
21
|
+
(`tailwindcss` + o plugin do seu bundler, ex.: `@tailwindcss/vite` ou
|
|
22
|
+
`@tailwindcss/postcss`).
|
|
23
|
+
|
|
24
|
+
### Configurando o Tailwind v4
|
|
25
|
+
|
|
26
|
+
O Tailwind v4 não usa `tailwind.config.js` nem a opção `content`. Tudo é
|
|
27
|
+
feito na sua folha CSS principal:
|
|
28
|
+
|
|
29
|
+
```css
|
|
30
|
+
/* app.css (ou globals.css) do projeto consumidor */
|
|
31
|
+
@import 'tailwindcss';
|
|
32
|
+
|
|
33
|
+
/* Tokens do design system (cores primary, fonte, spacing...) */
|
|
34
|
+
@import '@atomsix/design-system/theme.css';
|
|
35
|
+
|
|
36
|
+
/* Faz o Tailwind escanear as classes usadas DENTRO do pacote publicado.
|
|
37
|
+
Ajuste o caminho relativo conforme a localização deste arquivo CSS. */
|
|
38
|
+
@source '../node_modules/@atomsix/design-system';
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
> Sem a diretiva `@source`, as classes usadas internamente pelos componentes
|
|
42
|
+
> (ex.: `bg-primary-600`) não seriam geradas no CSS final do seu app.
|
|
43
|
+
|
|
44
|
+
### Usando os componentes
|
|
45
|
+
|
|
46
|
+
```tsx
|
|
47
|
+
import { A6Button } from '@atomsix/design-system'
|
|
48
|
+
|
|
49
|
+
export function Exemplo() {
|
|
50
|
+
return (
|
|
51
|
+
<A6Button variant="outline" size="sm" className="w-full">
|
|
52
|
+
Cancelar
|
|
53
|
+
</A6Button>
|
|
54
|
+
)
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Todos os componentes aceitam `className` — os conflitos com as classes
|
|
59
|
+
padrão são resolvidos automaticamente pelo `tailwind-merge`, então a sua
|
|
60
|
+
classe sempre vence.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Desenvolvimento
|
|
65
|
+
|
|
66
|
+
> Requer **Node ≥ 20** (há um `.nvmrc` no repo — rode `nvm use`) e **pnpm**.
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
pnpm install
|
|
70
|
+
|
|
71
|
+
# Storybook local — ambiente de dev e documentação dos componentes
|
|
72
|
+
pnpm storybook
|
|
73
|
+
|
|
74
|
+
# Build da lib (dist/: ESM + CJS + tipos + theme.css)
|
|
75
|
+
pnpm build
|
|
76
|
+
|
|
77
|
+
# Checagem de tipos
|
|
78
|
+
pnpm typecheck
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
O Storybook é **apenas local** nesta fase — não há publicação da
|
|
82
|
+
documentação em nenhum serviço externo.
|
|
83
|
+
|
|
84
|
+
### Criando um componente novo
|
|
85
|
+
|
|
86
|
+
Siga o padrão do `src/components/A6Button/` (ele está comentado como modelo).
|
|
87
|
+
Todo componente público leva o prefixo `A6` — no nome do componente
|
|
88
|
+
(`A6NomeDoComponente`), nos tipos (`A6NomeDoComponenteProps`) e nas
|
|
89
|
+
variants (`a6NomeDoComponenteVariants`):
|
|
90
|
+
|
|
91
|
+
1. `A6NomeDoComponente.tsx` — variantes com `cva`, props tipadas, `className` mesclado com `cn()`
|
|
92
|
+
2. `A6NomeDoComponente.stories.tsx` — stories com controles
|
|
93
|
+
3. `index.ts` — re-export
|
|
94
|
+
4. Exportar em `src/index.ts`
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Propondo uma mudança (fluxo de release)
|
|
99
|
+
|
|
100
|
+
O versionamento é automatizado com **Changesets**:
|
|
101
|
+
|
|
102
|
+
1. Faça sua alteração numa branch.
|
|
103
|
+
2. Rode `pnpm changeset` — escolha o tipo de bump (patch/minor/major) e
|
|
104
|
+
descreva a mudança. Isso cria um arquivo em `.changeset/`, que deve ser
|
|
105
|
+
commitado junto.
|
|
106
|
+
3. Abra o PR e faça o merge na `main`.
|
|
107
|
+
4. O workflow `release.yml` abre (ou atualiza) automaticamente um PR chamado
|
|
108
|
+
**"chore: nova versão"**, acumulando os changesets pendentes.
|
|
109
|
+
5. Quando esse PR de versão for mergeado, o workflow **publica no npm
|
|
110
|
+
sozinho** e atualiza o `CHANGELOG.md`.
|
|
111
|
+
|
|
112
|
+
> Mudanças que não afetam o pacote publicado (docs, CI, stories) não
|
|
113
|
+
> precisam de changeset.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## CI/CD
|
|
118
|
+
|
|
119
|
+
Um único workflow: `.github/workflows/release.yml`, disparado em push na
|
|
120
|
+
`main`. Ele instala as dependências, builda a lib e usa a action oficial
|
|
121
|
+
`changesets/action` para versionar/publicar.
|
|
122
|
+
|
|
123
|
+
**Secret necessário no GitHub** (Settings → Secrets and variables → Actions):
|
|
124
|
+
|
|
125
|
+
| Secret | O que é |
|
|
126
|
+
| ----------- | ---------------------------------------------------------------------------------------------- |
|
|
127
|
+
| `NPM_TOKEN` | Token de **Automation** gerado em npmjs.com → Access Tokens, com permissão de publish no scope `@atomsix` |
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
A6Button: () => A6Button,
|
|
24
|
+
a6ButtonVariants: () => a6ButtonVariants,
|
|
25
|
+
cn: () => cn
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(index_exports);
|
|
28
|
+
|
|
29
|
+
// src/components/A6Button/A6Button.tsx
|
|
30
|
+
var import_react = require("react");
|
|
31
|
+
var import_class_variance_authority = require("class-variance-authority");
|
|
32
|
+
|
|
33
|
+
// src/lib/cn.ts
|
|
34
|
+
var import_clsx = require("clsx");
|
|
35
|
+
var import_tailwind_merge = require("tailwind-merge");
|
|
36
|
+
function cn(...inputs) {
|
|
37
|
+
return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// src/components/A6Button/A6Button.tsx
|
|
41
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
42
|
+
var a6ButtonVariants = (0, import_class_variance_authority.cva)(
|
|
43
|
+
// Classes base — aplicadas em todas as variantes
|
|
44
|
+
"inline-flex items-end justify-end gap-2 rounded-ds font-sans font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-orange-500 disabled:pointer-events-none disabled:opacity-50",
|
|
45
|
+
{
|
|
46
|
+
variants: {
|
|
47
|
+
/** Estilo visual do botão */
|
|
48
|
+
variant: {
|
|
49
|
+
primary: "bg-orange-600 text-violet-600 hover:bg-orange-700 active:bg-orange-800",
|
|
50
|
+
outline: "border border-orange-600 bg-transparent text-orange-600 hover:bg-orange-50 active:bg-orange-100"
|
|
51
|
+
},
|
|
52
|
+
/** Tamanho do botão */
|
|
53
|
+
size: {
|
|
54
|
+
sm: "h-8 px-3 text-sm",
|
|
55
|
+
md: "h-10 px-4 text-base"
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
defaultVariants: {
|
|
59
|
+
variant: "primary",
|
|
60
|
+
size: "md"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
);
|
|
64
|
+
var A6Button = (0, import_react.forwardRef)(
|
|
65
|
+
({ className, variant, size, ...props }, ref) => {
|
|
66
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
67
|
+
"button",
|
|
68
|
+
{
|
|
69
|
+
ref,
|
|
70
|
+
className: cn(a6ButtonVariants({ variant, size }), className),
|
|
71
|
+
...props
|
|
72
|
+
}
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
);
|
|
76
|
+
A6Button.displayName = "A6Button";
|
|
77
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
78
|
+
0 && (module.exports = {
|
|
79
|
+
A6Button,
|
|
80
|
+
a6ButtonVariants,
|
|
81
|
+
cn
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/A6Button/A6Button.tsx","../src/lib/cn.ts"],"sourcesContent":["// Componentes\nexport { A6Button, a6ButtonVariants, type A6ButtonProps } from './components/A6Button'\n\n// Utilitários\nexport { cn } from './lib/cn'\n","import { forwardRef, type ButtonHTMLAttributes } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../../lib/cn'\n\n/**\n * Variantes do A6Button definidas com cva (class-variance-authority).\n *\n * Este componente serve de MODELO para os próximos componentes do\n * design system. O padrão é sempre o mesmo:\n *\n * 1. Definir as classes base + variantes com cva()\n * 2. Tipar as props estendendo os atributos nativos + VariantProps\n * 3. Aceitar `className` e mesclar com cn() por último, para que o\n * consumidor consiga sobrescrever qualquer estilo padrão\n *\n * Todos os componentes públicos usam o prefixo `A6` (ex.: A6Button,\n * A6Input), assim como seus tipos (A6ButtonProps) e variants\n * (a6ButtonVariants).\n */\nconst a6ButtonVariants = cva(\n // Classes base — aplicadas em todas as variantes\n 'inline-flex items-end justify-end gap-2 rounded-ds font-sans font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-orange-500 disabled:pointer-events-none disabled:opacity-50',\n {\n variants: {\n /** Estilo visual do botão */\n variant: {\n primary: 'bg-orange-600 text-violet-600 hover:bg-orange-700 active:bg-orange-800',\n outline:\n 'border border-orange-600 bg-transparent text-orange-600 hover:bg-orange-50 active:bg-orange-100',\n },\n /** Tamanho do botão */\n size: {\n sm: 'h-8 px-3 text-sm',\n md: 'h-10 px-4 text-base',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'md',\n },\n },\n)\n\nexport interface A6ButtonProps\n extends ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof a6ButtonVariants> {}\n\n/**\n * Botão padrão do design system.\n *\n * @example\n * <A6Button variant=\"outline\" size=\"sm\" onClick={...}>Cancelar</A6Button>\n */\nexport const A6Button = forwardRef<HTMLButtonElement, A6ButtonProps>(\n ({ className, variant, size, ...props }, ref) => {\n return (\n <button\n ref={ref}\n className={cn(a6ButtonVariants({ variant, size }), className)}\n {...props}\n />\n )\n },\n)\n\nA6Button.displayName = 'A6Button'\n\nexport { a6ButtonVariants }\n","import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\n/**\n * Combina classes condicionalmente (clsx) e resolve conflitos de utilitários\n * Tailwind (tailwind-merge). Ex.: cn('px-4', 'px-2') → 'px-2'.\n *\n * Use em todo componente que aceita `className` como prop, para que o\n * consumidor consiga sobrescrever estilos padrão do design system.\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAAsD;AACtD,sCAAuC;;;ACDvC,kBAAsC;AACtC,4BAAwB;AASjB,SAAS,MAAM,QAAsB;AAC1C,aAAO,mCAAQ,kBAAK,MAAM,CAAC;AAC7B;;;AD4CM;AArCN,IAAM,uBAAmB;AAAA;AAAA,EAEvB;AAAA,EACA;AAAA,IACE,UAAU;AAAA;AAAA,MAER,SAAS;AAAA,QACP,SAAS;AAAA,QACT,SACE;AAAA,MACJ;AAAA;AAAA,MAEA,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAYO,IAAM,eAAW;AAAA,EACtB,CAAC,EAAE,WAAW,SAAS,MAAM,GAAG,MAAM,GAAG,QAAQ;AAC/C,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW,GAAG,iBAAiB,EAAE,SAAS,KAAK,CAAC,GAAG,SAAS;AAAA,QAC3D,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AAEA,SAAS,cAAc;","names":[]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ButtonHTMLAttributes } from 'react';
|
|
3
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
4
|
+
import { VariantProps } from 'class-variance-authority';
|
|
5
|
+
import { ClassValue } from 'clsx';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Variantes do A6Button definidas com cva (class-variance-authority).
|
|
9
|
+
*
|
|
10
|
+
* Este componente serve de MODELO para os próximos componentes do
|
|
11
|
+
* design system. O padrão é sempre o mesmo:
|
|
12
|
+
*
|
|
13
|
+
* 1. Definir as classes base + variantes com cva()
|
|
14
|
+
* 2. Tipar as props estendendo os atributos nativos + VariantProps
|
|
15
|
+
* 3. Aceitar `className` e mesclar com cn() por último, para que o
|
|
16
|
+
* consumidor consiga sobrescrever qualquer estilo padrão
|
|
17
|
+
*
|
|
18
|
+
* Todos os componentes públicos usam o prefixo `A6` (ex.: A6Button,
|
|
19
|
+
* A6Input), assim como seus tipos (A6ButtonProps) e variants
|
|
20
|
+
* (a6ButtonVariants).
|
|
21
|
+
*/
|
|
22
|
+
declare const a6ButtonVariants: (props?: ({
|
|
23
|
+
variant?: "primary" | "outline" | null | undefined;
|
|
24
|
+
size?: "sm" | "md" | null | undefined;
|
|
25
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
26
|
+
interface A6ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof a6ButtonVariants> {
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Botão padrão do design system.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* <A6Button variant="outline" size="sm" onClick={...}>Cancelar</A6Button>
|
|
33
|
+
*/
|
|
34
|
+
declare const A6Button: react.ForwardRefExoticComponent<A6ButtonProps & react.RefAttributes<HTMLButtonElement>>;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Combina classes condicionalmente (clsx) e resolve conflitos de utilitários
|
|
38
|
+
* Tailwind (tailwind-merge). Ex.: cn('px-4', 'px-2') → 'px-2'.
|
|
39
|
+
*
|
|
40
|
+
* Use em todo componente que aceita `className` como prop, para que o
|
|
41
|
+
* consumidor consiga sobrescrever estilos padrão do design system.
|
|
42
|
+
*/
|
|
43
|
+
declare function cn(...inputs: ClassValue[]): string;
|
|
44
|
+
|
|
45
|
+
export { A6Button, type A6ButtonProps, a6ButtonVariants, cn };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ButtonHTMLAttributes } from 'react';
|
|
3
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
4
|
+
import { VariantProps } from 'class-variance-authority';
|
|
5
|
+
import { ClassValue } from 'clsx';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Variantes do A6Button definidas com cva (class-variance-authority).
|
|
9
|
+
*
|
|
10
|
+
* Este componente serve de MODELO para os próximos componentes do
|
|
11
|
+
* design system. O padrão é sempre o mesmo:
|
|
12
|
+
*
|
|
13
|
+
* 1. Definir as classes base + variantes com cva()
|
|
14
|
+
* 2. Tipar as props estendendo os atributos nativos + VariantProps
|
|
15
|
+
* 3. Aceitar `className` e mesclar com cn() por último, para que o
|
|
16
|
+
* consumidor consiga sobrescrever qualquer estilo padrão
|
|
17
|
+
*
|
|
18
|
+
* Todos os componentes públicos usam o prefixo `A6` (ex.: A6Button,
|
|
19
|
+
* A6Input), assim como seus tipos (A6ButtonProps) e variants
|
|
20
|
+
* (a6ButtonVariants).
|
|
21
|
+
*/
|
|
22
|
+
declare const a6ButtonVariants: (props?: ({
|
|
23
|
+
variant?: "primary" | "outline" | null | undefined;
|
|
24
|
+
size?: "sm" | "md" | null | undefined;
|
|
25
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
26
|
+
interface A6ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof a6ButtonVariants> {
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Botão padrão do design system.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* <A6Button variant="outline" size="sm" onClick={...}>Cancelar</A6Button>
|
|
33
|
+
*/
|
|
34
|
+
declare const A6Button: react.ForwardRefExoticComponent<A6ButtonProps & react.RefAttributes<HTMLButtonElement>>;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Combina classes condicionalmente (clsx) e resolve conflitos de utilitários
|
|
38
|
+
* Tailwind (tailwind-merge). Ex.: cn('px-4', 'px-2') → 'px-2'.
|
|
39
|
+
*
|
|
40
|
+
* Use em todo componente que aceita `className` como prop, para que o
|
|
41
|
+
* consumidor consiga sobrescrever estilos padrão do design system.
|
|
42
|
+
*/
|
|
43
|
+
declare function cn(...inputs: ClassValue[]): string;
|
|
44
|
+
|
|
45
|
+
export { A6Button, type A6ButtonProps, a6ButtonVariants, cn };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// src/components/A6Button/A6Button.tsx
|
|
2
|
+
import { forwardRef } from "react";
|
|
3
|
+
import { cva } from "class-variance-authority";
|
|
4
|
+
|
|
5
|
+
// src/lib/cn.ts
|
|
6
|
+
import { clsx } from "clsx";
|
|
7
|
+
import { twMerge } from "tailwind-merge";
|
|
8
|
+
function cn(...inputs) {
|
|
9
|
+
return twMerge(clsx(inputs));
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// src/components/A6Button/A6Button.tsx
|
|
13
|
+
import { jsx } from "react/jsx-runtime";
|
|
14
|
+
var a6ButtonVariants = cva(
|
|
15
|
+
// Classes base — aplicadas em todas as variantes
|
|
16
|
+
"inline-flex items-end justify-end gap-2 rounded-ds font-sans font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-orange-500 disabled:pointer-events-none disabled:opacity-50",
|
|
17
|
+
{
|
|
18
|
+
variants: {
|
|
19
|
+
/** Estilo visual do botão */
|
|
20
|
+
variant: {
|
|
21
|
+
primary: "bg-orange-600 text-violet-600 hover:bg-orange-700 active:bg-orange-800",
|
|
22
|
+
outline: "border border-orange-600 bg-transparent text-orange-600 hover:bg-orange-50 active:bg-orange-100"
|
|
23
|
+
},
|
|
24
|
+
/** Tamanho do botão */
|
|
25
|
+
size: {
|
|
26
|
+
sm: "h-8 px-3 text-sm",
|
|
27
|
+
md: "h-10 px-4 text-base"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
defaultVariants: {
|
|
31
|
+
variant: "primary",
|
|
32
|
+
size: "md"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
);
|
|
36
|
+
var A6Button = forwardRef(
|
|
37
|
+
({ className, variant, size, ...props }, ref) => {
|
|
38
|
+
return /* @__PURE__ */ jsx(
|
|
39
|
+
"button",
|
|
40
|
+
{
|
|
41
|
+
ref,
|
|
42
|
+
className: cn(a6ButtonVariants({ variant, size }), className),
|
|
43
|
+
...props
|
|
44
|
+
}
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
);
|
|
48
|
+
A6Button.displayName = "A6Button";
|
|
49
|
+
export {
|
|
50
|
+
A6Button,
|
|
51
|
+
a6ButtonVariants,
|
|
52
|
+
cn
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/A6Button/A6Button.tsx","../src/lib/cn.ts"],"sourcesContent":["import { forwardRef, type ButtonHTMLAttributes } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../../lib/cn'\n\n/**\n * Variantes do A6Button definidas com cva (class-variance-authority).\n *\n * Este componente serve de MODELO para os próximos componentes do\n * design system. O padrão é sempre o mesmo:\n *\n * 1. Definir as classes base + variantes com cva()\n * 2. Tipar as props estendendo os atributos nativos + VariantProps\n * 3. Aceitar `className` e mesclar com cn() por último, para que o\n * consumidor consiga sobrescrever qualquer estilo padrão\n *\n * Todos os componentes públicos usam o prefixo `A6` (ex.: A6Button,\n * A6Input), assim como seus tipos (A6ButtonProps) e variants\n * (a6ButtonVariants).\n */\nconst a6ButtonVariants = cva(\n // Classes base — aplicadas em todas as variantes\n 'inline-flex items-end justify-end gap-2 rounded-ds font-sans font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-orange-500 disabled:pointer-events-none disabled:opacity-50',\n {\n variants: {\n /** Estilo visual do botão */\n variant: {\n primary: 'bg-orange-600 text-violet-600 hover:bg-orange-700 active:bg-orange-800',\n outline:\n 'border border-orange-600 bg-transparent text-orange-600 hover:bg-orange-50 active:bg-orange-100',\n },\n /** Tamanho do botão */\n size: {\n sm: 'h-8 px-3 text-sm',\n md: 'h-10 px-4 text-base',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'md',\n },\n },\n)\n\nexport interface A6ButtonProps\n extends ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof a6ButtonVariants> {}\n\n/**\n * Botão padrão do design system.\n *\n * @example\n * <A6Button variant=\"outline\" size=\"sm\" onClick={...}>Cancelar</A6Button>\n */\nexport const A6Button = forwardRef<HTMLButtonElement, A6ButtonProps>(\n ({ className, variant, size, ...props }, ref) => {\n return (\n <button\n ref={ref}\n className={cn(a6ButtonVariants({ variant, size }), className)}\n {...props}\n />\n )\n },\n)\n\nA6Button.displayName = 'A6Button'\n\nexport { a6ButtonVariants }\n","import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\n/**\n * Combina classes condicionalmente (clsx) e resolve conflitos de utilitários\n * Tailwind (tailwind-merge). Ex.: cn('px-4', 'px-2') → 'px-2'.\n *\n * Use em todo componente que aceita `className` como prop, para que o\n * consumidor consiga sobrescrever estilos padrão do design system.\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n"],"mappings":";AAAA,SAAS,kBAA6C;AACtD,SAAS,WAA8B;;;ACDvC,SAAS,YAA6B;AACtC,SAAS,eAAe;AASjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;;;AD4CM;AArCN,IAAM,mBAAmB;AAAA;AAAA,EAEvB;AAAA,EACA;AAAA,IACE,UAAU;AAAA;AAAA,MAER,SAAS;AAAA,QACP,SAAS;AAAA,QACT,SACE;AAAA,MACJ;AAAA;AAAA,MAEA,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAYO,IAAM,WAAW;AAAA,EACtB,CAAC,EAAE,WAAW,SAAS,MAAM,GAAG,MAAM,GAAG,QAAQ;AAC/C,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW,GAAG,iBAAiB,EAAE,SAAS,KAAK,CAAC,GAAG,SAAS;AAAA,QAC3D,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AAEA,SAAS,cAAc;","names":[]}
|
package/dist/theme.css
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tokens do design system — Tailwind CSS v4 (abordagem CSS-first).
|
|
3
|
+
*
|
|
4
|
+
* Este arquivo é publicado no pacote como `@atomsix/design-system/theme.css`.
|
|
5
|
+
* O projeto consumidor importa ele na folha CSS principal, logo após o Tailwind:
|
|
6
|
+
*
|
|
7
|
+
* @import "tailwindcss";
|
|
8
|
+
* @import "@atomsix/design-system/theme.css";
|
|
9
|
+
* @source "../node_modules/@atomsix/design-system";
|
|
10
|
+
*
|
|
11
|
+
* Cada variável dentro de @theme vira automaticamente utilitários Tailwind:
|
|
12
|
+
* --color-primary-600 → bg-primary-600, text-primary-600, border-primary-600...
|
|
13
|
+
* --font-sans → font-sans
|
|
14
|
+
* --spacing-18 → p-18, m-18, gap-18...
|
|
15
|
+
*/
|
|
16
|
+
@theme {
|
|
17
|
+
/* ── Cores da marca ─────────────────────────────────────────────
|
|
18
|
+
Escala de 50 (mais claro) a 950 (mais escuro).
|
|
19
|
+
Troque os valores abaixo pelas cores da sua identidade visual. */
|
|
20
|
+
--color-primary-50: oklch(0.97 0.015 260);
|
|
21
|
+
--color-primary-100: oklch(0.93 0.03 260);
|
|
22
|
+
--color-primary-200: oklch(0.87 0.06 260);
|
|
23
|
+
--color-primary-300: oklch(0.78 0.1 260);
|
|
24
|
+
--color-primary-400: oklch(0.68 0.15 260);
|
|
25
|
+
--color-primary-500: oklch(0.58 0.2 260);
|
|
26
|
+
--color-primary-600: oklch(0.51 0.22 260);
|
|
27
|
+
--color-primary-700: oklch(0.45 0.2 260);
|
|
28
|
+
--color-primary-800: oklch(0.39 0.16 260);
|
|
29
|
+
--color-primary-900: oklch(0.34 0.12 260);
|
|
30
|
+
--color-primary-950: oklch(0.25 0.09 260);
|
|
31
|
+
|
|
32
|
+
/* ── Tipografia ─────────────────────────────────────────────────
|
|
33
|
+
Fonte padrão dos componentes. Se usar uma fonte customizada
|
|
34
|
+
(ex.: via @font-face ou next/font), atualize aqui. */
|
|
35
|
+
--font-sans: 'Inter', ui-sans-serif, system-ui, sans-serif;
|
|
36
|
+
|
|
37
|
+
/* ── Spacing extra ──────────────────────────────────────────────
|
|
38
|
+
O Tailwind já gera a escala padrão a partir de --spacing (0.25rem).
|
|
39
|
+
Adicione aqui apenas valores fora da escala, se precisar. */
|
|
40
|
+
--spacing-18: 4.5rem;
|
|
41
|
+
|
|
42
|
+
/* ── Border radius ──────────────────────────────────────────────
|
|
43
|
+
Raio padrão usado nos componentes (rounded-ds). */
|
|
44
|
+
--radius-ds: 0.5rem;
|
|
45
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@atomsix/design-system",
|
|
3
|
+
"version": "0.0.2",
|
|
4
|
+
"description": "Design system da Atom6 Studio — componentes React estilizados com Tailwind CSS v4",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/JucoskiCristian/teste-design-system.git"
|
|
9
|
+
},
|
|
10
|
+
"type": "module",
|
|
11
|
+
"sideEffects": false,
|
|
12
|
+
"main": "./dist/index.cjs",
|
|
13
|
+
"module": "./dist/index.js",
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"import": "./dist/index.js",
|
|
19
|
+
"require": "./dist/index.cjs"
|
|
20
|
+
},
|
|
21
|
+
"./theme.css": "./dist/theme.css"
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist"
|
|
25
|
+
],
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public"
|
|
28
|
+
},
|
|
29
|
+
"packageManager": "pnpm@11.3.0",
|
|
30
|
+
"engines": {
|
|
31
|
+
"node": ">=20"
|
|
32
|
+
},
|
|
33
|
+
"scripts": {
|
|
34
|
+
"build": "tsup && shx cp src/styles/theme.css dist/theme.css",
|
|
35
|
+
"typecheck": "tsc --noEmit",
|
|
36
|
+
"storybook": "storybook dev -p 6006",
|
|
37
|
+
"build-storybook": "storybook build",
|
|
38
|
+
"changeset": "changeset",
|
|
39
|
+
"release": "pnpm build && changeset publish"
|
|
40
|
+
},
|
|
41
|
+
"peerDependencies": {
|
|
42
|
+
"react": "^18.0.0 || ^19.0.0",
|
|
43
|
+
"react-dom": "^18.0.0 || ^19.0.0"
|
|
44
|
+
},
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"class-variance-authority": "^0.7.1",
|
|
47
|
+
"clsx": "^2.1.1",
|
|
48
|
+
"tailwind-merge": "^3.6.0"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@changesets/cli": "^2.31.0",
|
|
52
|
+
"@storybook/addon-docs": "^10.4.6",
|
|
53
|
+
"@storybook/react-vite": "^10.4.6",
|
|
54
|
+
"@tailwindcss/vite": "^4.3.2",
|
|
55
|
+
"@types/react": "^19.2.17",
|
|
56
|
+
"@types/react-dom": "^19.2.3",
|
|
57
|
+
"react": "^19.2.7",
|
|
58
|
+
"react-dom": "^19.2.7",
|
|
59
|
+
"shx": "^0.4.0",
|
|
60
|
+
"storybook": "^10.4.6",
|
|
61
|
+
"tailwindcss": "^4.3.2",
|
|
62
|
+
"tsup": "^8.5.1",
|
|
63
|
+
"typescript": "^5.9.3",
|
|
64
|
+
"vite": "^8.1.3"
|
|
65
|
+
}
|
|
66
|
+
}
|