@yberagroup/kaizen-ui 0.0.2 → 0.0.3

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 CHANGED
@@ -1,21 +1,87 @@
1
1
  # @yberagroup/kaizen-ui
2
2
 
3
- Componentes React do Kaizen Design System (Radix/shadcn + Tailwind).
4
- Depende de `@yberagroup/kaizen-tokens` para temas e variáveis CSS.
3
+ Componentes React do Kaizen Design System com Tailwind CSS v3.
5
4
 
6
- ## Ícones (Font Awesome Pro)
5
+ ## Requisitos no projeto consumidor
7
6
 
8
- O projeto usa **Font Awesome Pro** (conta paga). Para instalar dependências:
7
+ - Tailwind CSS `^3.4`
8
+ - PostCSS + Autoprefixer
9
+ - `@yberagroup/kaizen-tokens` instalado (dependencia ja declarada na UI)
9
10
 
10
- 1. **Obtenha seu token Pro** em [fontawesome.com/account → Pro Package Tokens](https://fontawesome.com/account#pro-package-tokens).
11
+ ## Instalacao
11
12
 
12
- 2. **Defina a variável de ambiente** antes de rodar `npm install`:
13
- - Windows (PowerShell): `$env:FONTAWESOME_PRO_TOKEN="seu-token"`
14
- - Windows (CMD): `set FONTAWESOME_PRO_TOKEN=seu-token`
15
- - Linux/macOS: `export FONTAWESOME_PRO_TOKEN=seu-token`
13
+ ```bash
14
+ npm i @yberagroup/kaizen-ui @yberagroup/kaizen-tokens
15
+ ```
16
16
 
17
- 3. Na raiz do monorepo: `npm install`
17
+ ## Setup via wizard
18
18
 
19
- O `.npmrc` na raiz já aponta o escopo `@fortawesome` para o registry Pro; o token é lido de `FONTAWESOME_PRO_TOKEN` para não precisar commitar o token no repositório.
19
+ ```bash
20
+ npx @yberagroup/kaizen-ui init
21
+ ```
20
22
 
21
- Em CI (GitHub Actions, etc.), configure `FONTAWESOME_PRO_TOKEN` como secret e use no passo de install.
23
+ O comando cria/atualiza:
24
+ - `tailwind.config.cjs` com preset Kaizen
25
+ - `postcss.config.cjs` com Tailwind + Autoprefixer
26
+ - import do tema no arquivo de entrada (`src/main.tsx`, `src/index.tsx`, `app/layout.tsx`, etc.) **ou**, no modo migracao, no seu CSS global
27
+
28
+ Temas suportados no wizard:
29
+ - `esc` — `@yberagroup/kaizen-ui/globals/esc.css`
30
+ - `group` — `@yberagroup/kaizen-ui/globals/group.css`
31
+
32
+ ### CSS global ja existente (semi-automatico)
33
+
34
+ Se o wizard encontrar alguma destas folhas (quando existirem no disco), ele pergunta como integrar:
35
+
36
+ - `src/index.css`
37
+ - `src/globals.css`, `src/global.css`
38
+ - `src/styles/globals.css`, `src/styles/index.css`
39
+ - `app/globals.css`
40
+ - `styles/globals.css`
41
+
42
+ **Opcao 1 — Manter locais:** o tema Kaizen e importado no **entry** (TS/JS). Se o seu CSS local ainda tiver `@tailwind base|components|utilities`, comente ou remova para nao duplicar as camadas do Tailwind ja incluidas no bundle Kaizen.
43
+
44
+ **Opcao 2 — Migrar:** e feito um **backup** do arquivo principal (`.kaizen-backup`, ou `.kaizen-backup.<timestamp>` se ja existir). O arquivo e substituido por um `@import` do tema escolhido e um lembrete para reaplicar regras custom do backup **sem** repetir `@tailwind`. Imports diretos do tema no entry sao removidos para evitar duplicacao; se faltar, o wizard adiciona o `import` do CSS global no entry.
45
+
46
+ Com **varios** candidatos e **nenhum** importado pelo entry, o wizard lista os arquivos e pede qual migrar.
47
+
48
+ ## Configuracao Tailwind (consumidor)
49
+
50
+ No `tailwind.config.cjs`:
51
+
52
+ ```js
53
+ module.exports = {
54
+ presets: [require("@yberagroup/kaizen-ui/tailwind-preset")],
55
+ content: ["./src/**/*.{js,ts,jsx,tsx}", "./index.html"],
56
+ darkMode: "class",
57
+ };
58
+ ```
59
+
60
+ No `postcss.config.cjs`:
61
+
62
+ ```js
63
+ module.exports = {
64
+ plugins: {
65
+ tailwindcss: {},
66
+ autoprefixer: {},
67
+ },
68
+ };
69
+ ```
70
+
71
+ No entry (ou no CSS global, apos migracao no wizard). Tema **esc**:
72
+
73
+ ```ts
74
+ import "@yberagroup/kaizen-ui/globals/esc.css";
75
+ ```
76
+
77
+ Tema **group**: `import "@yberagroup/kaizen-ui/globals/group.css"`. O export `globals.css` neste pacote segue o tema esc.
78
+
79
+ ## Exemplo
80
+
81
+ ```tsx
82
+ import { Title } from "@yberagroup/kaizen-ui/components/title";
83
+
84
+ export function App() {
85
+ return <Title size="h2">Kaizen UI</Title>;
86
+ }
87
+ ```
@@ -0,0 +1,278 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync, writeFileSync, existsSync, copyFileSync } from "node:fs";
3
+ import { dirname, join, relative, resolve } from "node:path";
4
+ import process from "node:process";
5
+ import { createInterface } from "node:readline/promises";
6
+ import { stdin as input, stdout as output } from "node:process";
7
+
8
+ const THEME_IMPORT = {
9
+ esc: "@yberagroup/kaizen-ui/globals/esc.css",
10
+ group: "@yberagroup/kaizen-ui/globals/group.css",
11
+ };
12
+
13
+ function logStep(message) {
14
+ output.write(`\n[kaizen-ui] ${message}\n`);
15
+ }
16
+
17
+ function detectEntryCandidates(cwd) {
18
+ return [
19
+ "src/main.tsx",
20
+ "src/main.jsx",
21
+ "src/index.tsx",
22
+ "src/index.jsx",
23
+ "app/layout.tsx",
24
+ "app/layout.jsx",
25
+ ]
26
+ .map((p) => resolve(cwd, p))
27
+ .filter((p) => existsSync(p));
28
+ }
29
+
30
+ /** Caminhos comuns de CSS global (existentes no disco). */
31
+ function detectGlobalCssCandidates(cwd) {
32
+ const relPaths = [
33
+ "src/index.css",
34
+ "src/globals.css",
35
+ "src/global.css",
36
+ "src/styles/globals.css",
37
+ "src/styles/index.css",
38
+ "app/globals.css",
39
+ "styles/globals.css",
40
+ ];
41
+ return relPaths
42
+ .map((p) => resolve(cwd, p))
43
+ .filter((p) => existsSync(p));
44
+ }
45
+
46
+ function findCssImportsFromEntry(entryPath) {
47
+ const source = readFileSync(entryPath, "utf-8");
48
+ const re = /import\s+["']([^"']+\.css)["']\s*;?/g;
49
+ const out = [];
50
+ let m;
51
+ while ((m = re.exec(source))) {
52
+ out.push(resolve(dirname(entryPath), m[1]));
53
+ }
54
+ return out;
55
+ }
56
+
57
+ function hasTailwindDirectives(css) {
58
+ return /@tailwind\s+(base|components|utilities)\b/.test(css);
59
+ }
60
+
61
+ function pickMigrateTarget(cwd, entryPath, candidates) {
62
+ const fromEntry = findCssImportsFromEntry(entryPath);
63
+ for (const abs of fromEntry) {
64
+ if (candidates.includes(abs)) return abs;
65
+ }
66
+ return candidates[0];
67
+ }
68
+
69
+ function backupFile(absPath) {
70
+ let bak = `${absPath}.kaizen-backup`;
71
+ if (existsSync(bak)) {
72
+ bak = `${absPath}.kaizen-backup.${Date.now()}`;
73
+ }
74
+ copyFileSync(absPath, bak);
75
+ return bak;
76
+ }
77
+
78
+ function relativeImport(fromFile, toFile) {
79
+ let rel = relative(dirname(fromFile), toFile);
80
+ if (!rel.startsWith(".")) rel = `./${rel}`;
81
+ return rel.split("\\").join("/");
82
+ }
83
+
84
+ function ensureLocalCssImportInEntry(entryPath, cssAbsPath) {
85
+ const line = `import "${relativeImport(entryPath, cssAbsPath)}";`;
86
+ const source = readFileSync(entryPath, "utf-8");
87
+ if (source.includes(line)) return false;
88
+ const altSingle = line.replace(/"/g, "'");
89
+ if (source.includes(altSingle)) return false;
90
+ writeFileSync(entryPath, `${line}\n${source}`, "utf-8");
91
+ return true;
92
+ }
93
+
94
+ function removeKaizenThemeImportsFromEntry(entryPath) {
95
+ let source = readFileSync(entryPath, "utf-8");
96
+ const lines = source.split("\n");
97
+ const themePrefixes = [
98
+ '@yberagroup/kaizen-ui/globals/esc.css',
99
+ '@yberagroup/kaizen-ui/globals/group.css',
100
+ '@yberagroup/kaizen-ui/globals.css',
101
+ ];
102
+ const filtered = lines.filter((line) => {
103
+ const t = line.trim();
104
+ if (!t.startsWith("import ")) return true;
105
+ return !themePrefixes.some((p) => t.includes(p));
106
+ });
107
+ const next = filtered.join("\n");
108
+ if (next === source) return false;
109
+ writeFileSync(entryPath, next, "utf-8");
110
+ return true;
111
+ }
112
+
113
+ function ensureImportInEntry(entryPath, importPath) {
114
+ const source = readFileSync(entryPath, "utf-8");
115
+ const importLine = `import "${importPath}";`;
116
+ if (source.includes(importLine)) return false;
117
+
118
+ const nextSource = `${importLine}\n${source}`;
119
+ writeFileSync(entryPath, nextSource, "utf-8");
120
+ return true;
121
+ }
122
+
123
+ function writeTailwindConfig(cwd) {
124
+ const file = join(cwd, "tailwind.config.cjs");
125
+ const content = `/** @type {import('tailwindcss').Config} */
126
+ module.exports = {
127
+ presets: [require("@yberagroup/kaizen-ui/tailwind-preset")],
128
+ content: [
129
+ "./index.html",
130
+ "./src/**/*.{js,ts,jsx,tsx}",
131
+ "./app/**/*.{js,ts,jsx,tsx}",
132
+ ],
133
+ darkMode: "class",
134
+ };
135
+ `;
136
+ writeFileSync(file, content, "utf-8");
137
+ }
138
+
139
+ function writePostcssConfig(cwd) {
140
+ const file = join(cwd, "postcss.config.cjs");
141
+ const content = `module.exports = {
142
+ plugins: {
143
+ tailwindcss: {},
144
+ autoprefixer: {},
145
+ },
146
+ };
147
+ `;
148
+ writeFileSync(file, content, "utf-8");
149
+ }
150
+
151
+ async function runInit() {
152
+ const cwd = process.cwd();
153
+ const rl = createInterface({ input, output });
154
+
155
+ logStep("Inicializando setup do Kaizen UI...");
156
+
157
+ const themeAnswer = (
158
+ await rl.question("Escolha o tema (esc/group) [esc]: ")
159
+ ).trim();
160
+ const theme = themeAnswer === "group" ? "group" : "esc";
161
+
162
+ const candidates = detectEntryCandidates(cwd);
163
+ const suggested = candidates[0] ?? "src/main.tsx";
164
+ const entryAnswer = (
165
+ await rl.question(`Arquivo de entrada para importar CSS [${suggested}]: `)
166
+ ).trim();
167
+ const entryPath = resolve(cwd, entryAnswer || suggested);
168
+
169
+ if (!existsSync(entryPath)) {
170
+ rl.close();
171
+ throw new Error(`Arquivo de entrada não encontrado: ${entryPath}`);
172
+ }
173
+
174
+ const cssCandidates = detectGlobalCssCandidates(cwd);
175
+ let cssStrategy = "entry"; // "entry" | "migrate"
176
+
177
+ if (cssCandidates.length > 0) {
178
+ const list = cssCandidates
179
+ .map((p) => relative(cwd, p) || p)
180
+ .join(", ");
181
+ logStep(`Folhas de estilo globais encontradas: ${list}`);
182
+ const mode = (
183
+ await rl.question(
184
+ "Integração com CSS existente:\n [1] Manter locais — adiciono só o import do tema Kaizen no entry (evite @tailwind duplicado no seu CSS).\n [2] Migrar — backup do arquivo principal e substituo por import único do tema Kaizen (revise custom no .bak).\nEscolha [1]: ",
185
+ )
186
+ ).trim();
187
+ cssStrategy = mode === "2" ? "migrate" : "entry";
188
+ }
189
+
190
+ writeTailwindConfig(cwd);
191
+ logStep("tailwind.config.cjs criado/atualizado.");
192
+
193
+ writePostcssConfig(cwd);
194
+ logStep("postcss.config.cjs criado/atualizado.");
195
+
196
+ const themeImport = THEME_IMPORT[theme];
197
+
198
+ if (cssStrategy === "migrate") {
199
+ let target = pickMigrateTarget(cwd, entryPath, cssCandidates);
200
+ const fromEntry = findCssImportsFromEntry(entryPath);
201
+ const linked = cssCandidates.filter((c) => fromEntry.includes(c));
202
+ if (linked.length === 0 && cssCandidates.length > 1) {
203
+ const lines = cssCandidates
204
+ .map((p, i) => ` [${i + 1}] ${relative(cwd, p) || p}`)
205
+ .join("\n");
206
+ const n = (
207
+ await rl.question(
208
+ `Qual arquivo migrar?\n${lines}\nNúmero [1]: `,
209
+ )
210
+ ).trim();
211
+ const idx = Math.max(0, Math.min(cssCandidates.length - 1, (parseInt(n, 10) || 1) - 1));
212
+ target = cssCandidates[idx];
213
+ }
214
+ const bak = backupFile(target);
215
+ logStep(`Backup: ${relative(cwd, bak) || bak}`);
216
+
217
+ const migratedBody = `/* kaizen-ui init: migração — tema ${theme}. Backup do conteúdo anterior: ${relative(cwd, bak) || bak} */
218
+ @import "${themeImport}";
219
+
220
+ /* Reaplique aqui regras do backup sem repetir @tailwind base/components/utilities. */
221
+ `;
222
+ writeFileSync(target, migratedBody, "utf-8");
223
+ logStep(`Arquivo atualizado: ${relative(cwd, target) || target}`);
224
+
225
+ removeKaizenThemeImportsFromEntry(entryPath);
226
+ if (ensureLocalCssImportInEntry(entryPath, target)) {
227
+ logStep(`Import do CSS global adicionado em ${entryPath}.`);
228
+ }
229
+
230
+ const prev = readFileSync(bak, "utf-8");
231
+ if (hasTailwindDirectives(prev)) {
232
+ logStep(
233
+ "O backup continha @tailwind; o novo arquivo usa só o bundle Kaizen (sem duplicar camadas).",
234
+ );
235
+ }
236
+ } else {
237
+ const changed = ensureImportInEntry(entryPath, themeImport);
238
+ if (changed) {
239
+ logStep(`Import do tema ${theme} adicionado em ${entryPath}.`);
240
+ } else {
241
+ logStep(`Import já existente em ${entryPath}.`);
242
+ }
243
+
244
+ if (cssCandidates.length > 0) {
245
+ for (const p of cssCandidates) {
246
+ const css = readFileSync(p, "utf-8");
247
+ if (hasTailwindDirectives(css)) {
248
+ logStep(
249
+ `Aviso: ${relative(cwd, p) || p} contém @tailwind — comente ou remova para não duplicar o Tailwind junto com Kaizen.`,
250
+ );
251
+ }
252
+ }
253
+ }
254
+ }
255
+
256
+ rl.close();
257
+ logStep("Concluído.");
258
+ output.write(
259
+ "\nPróximos passos:\n- npm i @yberagroup/kaizen-ui @yberagroup/kaizen-tokens tailwindcss postcss autoprefixer\n- npm run dev\n",
260
+ );
261
+ }
262
+
263
+ async function main() {
264
+ const command = process.argv[2];
265
+ if (!command || command === "init") {
266
+ await runInit();
267
+ return;
268
+ }
269
+
270
+ output.write(`Comando não suportado: ${command}\n`);
271
+ output.write("Uso: npx @yberagroup/kaizen-ui init\n");
272
+ process.exitCode = 1;
273
+ }
274
+
275
+ main().catch((error) => {
276
+ output.write(`\n[kaizen-ui] Erro: ${error.message}\n`);
277
+ process.exitCode = 1;
278
+ });
@@ -0,0 +1,15 @@
1
+ import * as React from "react";
2
+ import { type VariantProps } from "class-variance-authority";
3
+ export type TitleSize = "h1" | "h2" | "h3" | "h4" | "h5" | "h6";
4
+ export type TitleWeight = "medium" | "semibold";
5
+ declare const titleVariants: (props?: ({
6
+ size?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | null | undefined;
7
+ weight?: "medium" | "semibold" | null | undefined;
8
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
9
+ export type TitleProps = React.HTMLAttributes<HTMLHeadingElement> & VariantProps<typeof titleVariants> & {
10
+ size?: TitleSize;
11
+ weight?: TitleWeight;
12
+ };
13
+ declare function Title({ size, weight, className, ...props }: TitleProps): import("react/jsx-runtime").JSX.Element;
14
+ export { Title };
15
+ //# sourceMappingURL=title.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"title.d.ts","sourceRoot":"","sources":["../../src/components/title.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGlE,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAChE,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEhD,QAAA,MAAM,aAAa;;;8EAsBlB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,KAAK,CAAC,cAAc,CAAC,kBAAkB,CAAC,GAC/D,YAAY,CAAC,OAAO,aAAa,CAAC,GAAG;IACnC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEJ,iBAAS,KAAK,CAAC,EACb,IAAW,EACX,MAAiB,EACjB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,UAAU,2CASZ;AAED,OAAO,EAAE,KAAK,EAAE,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cva } from "class-variance-authority";
3
+ import { clsx } from "clsx";
4
+ const titleVariants = cva("typeface-kz-syne tracking-kz-0 text-text-primary-dark leading-kz-0 p-0 m-0", {
5
+ variants: {
6
+ size: {
7
+ h1: "text-kz-40 leading-kz-48",
8
+ h2: "text-kz-32 leading-kz-40",
9
+ h3: "text-kz-24 leading-kz-32",
10
+ h4: "text-kz-18 leading-kz-24",
11
+ h5: "text-kz-16 leading-kz-22",
12
+ h6: "text-kz-14 leading-kz-20",
13
+ },
14
+ weight: {
15
+ medium: "font-kz-500",
16
+ semibold: "font-kz-600",
17
+ },
18
+ },
19
+ defaultVariants: {
20
+ size: "h2",
21
+ weight: "medium",
22
+ },
23
+ });
24
+ function Title({ size = "h2", weight = "medium", className, ...props }) {
25
+ const Tag = size;
26
+ return (_jsx(Tag, { className: clsx(titleVariants({ size, weight }), className), ...props }));
27
+ }
28
+ export { Title };
29
+ //# sourceMappingURL=title.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"title.js","sourceRoot":"","sources":["../../src/components/title.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAqB,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK5B,MAAM,aAAa,GAAG,GAAG,CACvB,4EAA4E,EAC5E;IACE,QAAQ,EAAE;QACR,IAAI,EAAE;YACJ,EAAE,EAAE,0BAA0B;YAC9B,EAAE,EAAE,0BAA0B;YAC9B,EAAE,EAAE,0BAA0B;YAC9B,EAAE,EAAE,0BAA0B;YAC9B,EAAE,EAAE,0BAA0B;YAC9B,EAAE,EAAE,0BAA0B;SAC/B;QACD,MAAM,EAAE;YACN,MAAM,EAAE,aAAa;YACrB,QAAQ,EAAE,aAAa;SACxB;KACF;IACD,eAAe,EAAE;QACf,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,QAAQ;KACjB;CACF,CACF,CAAC;AAQF,SAAS,KAAK,CAAC,EACb,IAAI,GAAG,IAAI,EACX,MAAM,GAAG,QAAQ,EACjB,SAAS,EACT,GAAG,KAAK,EACG;IACX,MAAM,GAAG,GAAG,IAAI,CAAC;IAEjB,OAAO,CACL,KAAC,GAAG,IACF,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,CAAC,KACvD,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,KAAK,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Re-export de ícones Font Awesome Pro para uso no design system.
3
+ * Conta Pro: mais ícones e estilos (solid, regular, light, thin, duotone).
4
+ * Para outros ícones, importe de @fortawesome/pro-solid-svg-icons ou pro-regular-svg-icons.
5
+ */
6
+ export { faCheck, faChevronDown, faChevronLeft, faChevronRight, faChevronUp, faCircleInfo, faXmark, faPlus, faMinus, faMagnifyingGlass, faBars, faEllipsis, faEllipsisVertical, faUser, faGear, faArrowRight, faArrowLeft, faExternalLink, faTriangleExclamation, faCircleCheck, faCircleXmark, } from "@fortawesome/pro-solid-svg-icons";
7
+ export { faCircleQuestion, faUser as faUserRegular, } from "@fortawesome/pro-regular-svg-icons";
8
+ export { faFacebook, faInstagram, faLinkedin, faTwitter, faXTwitter, faYoutube, faWhatsapp, faGoogle, faGithub, faSpotify, faApple, faMicrosoft, } from "@fortawesome/free-brands-svg-icons";
9
+ //# sourceMappingURL=icons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/lib/icons.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,OAAO,EACP,aAAa,EACb,aAAa,EACb,cAAc,EACd,WAAW,EACX,YAAY,EACZ,OAAO,EACP,MAAM,EACN,OAAO,EACP,iBAAiB,EACjB,MAAM,EACN,UAAU,EACV,kBAAkB,EAClB,MAAM,EACN,MAAM,EACN,YAAY,EACZ,WAAW,EACX,cAAc,EACd,qBAAqB,EACrB,aAAa,EACb,aAAa,GACd,MAAM,kCAAkC,CAAA;AAEzC,OAAO,EACL,gBAAgB,EAChB,MAAM,IAAI,aAAa,GACxB,MAAM,oCAAoC,CAAA;AAE3C,OAAO,EACL,UAAU,EACV,WAAW,EACX,UAAU,EACV,SAAS,EACT,UAAU,EACV,SAAS,EACT,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,OAAO,EACP,WAAW,GACZ,MAAM,oCAAoC,CAAA"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Re-export de ícones Font Awesome Pro para uso no design system.
3
+ * Conta Pro: mais ícones e estilos (solid, regular, light, thin, duotone).
4
+ * Para outros ícones, importe de @fortawesome/pro-solid-svg-icons ou pro-regular-svg-icons.
5
+ */
6
+ export { faCheck, faChevronDown, faChevronLeft, faChevronRight, faChevronUp, faCircleInfo, faXmark, faPlus, faMinus, faMagnifyingGlass, faBars, faEllipsis, faEllipsisVertical, faUser, faGear, faArrowRight, faArrowLeft, faExternalLink, faTriangleExclamation, faCircleCheck, faCircleXmark, } from "@fortawesome/pro-solid-svg-icons";
7
+ export { faCircleQuestion, faUser as faUserRegular, } from "@fortawesome/pro-regular-svg-icons";
8
+ export { faFacebook, faInstagram, faLinkedin, faTwitter, faXTwitter, faYoutube, faWhatsapp, faGoogle, faGithub, faSpotify, faApple, faMicrosoft, } from "@fortawesome/free-brands-svg-icons";
9
+ //# sourceMappingURL=icons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/lib/icons.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,OAAO,EACP,aAAa,EACb,aAAa,EACb,cAAc,EACd,WAAW,EACX,YAAY,EACZ,OAAO,EACP,MAAM,EACN,OAAO,EACP,iBAAiB,EACjB,MAAM,EACN,UAAU,EACV,kBAAkB,EAClB,MAAM,EACN,MAAM,EACN,YAAY,EACZ,WAAW,EACX,cAAc,EACd,qBAAqB,EACrB,aAAa,EACb,aAAa,GACd,MAAM,kCAAkC,CAAA;AAEzC,OAAO,EACL,gBAAgB,EAChB,MAAM,IAAI,aAAa,GACxB,MAAM,oCAAoC,CAAA;AAE3C,OAAO,EACL,UAAU,EACV,WAAW,EACX,UAAU,EACV,SAAS,EACT,UAAU,EACV,SAAS,EACT,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,OAAO,EACP,WAAW,GACZ,MAAM,oCAAoC,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { type ClassValue } from "clsx";
2
+ export declare function cn(...inputs: ClassValue[]): string;
3
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,UAAU,EAAE,MAAM,MAAM,CAAA;AAG5C,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAEzC"}
@@ -0,0 +1,6 @@
1
+ import { clsx } from "clsx";
2
+ import { twMerge } from "tailwind-merge";
3
+ export function cn(...inputs) {
4
+ return twMerge(clsx(inputs));
5
+ }
6
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAmB,MAAM,MAAM,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAExC,MAAM,UAAU,EAAE,CAAC,GAAG,MAAoB;IACxC,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;AAC9B,CAAC"}
package/package.json CHANGED
@@ -1,13 +1,15 @@
1
1
  {
2
2
  "name": "@yberagroup/kaizen-ui",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "scripts": {
7
- "lint": "eslint . --max-warnings 0"
7
+ "build": "tsc -p tsconfig.build.json",
8
+ "lint": "eslint . --max-warnings 0",
9
+ "prepublishOnly": "npm run build && npm run lint"
8
10
  },
9
11
  "dependencies": {
10
- "@yberagroup/kaizen-tokens": "^0.0.2",
12
+ "@yberagroup/kaizen-tokens": "^0.0.3",
11
13
  "class-variance-authority": "^0.7.1",
12
14
  "clsx": "^2.1.1",
13
15
  "@fortawesome/fontawesome-svg-core": "^6.7.2",
@@ -15,33 +17,49 @@
15
17
  "@fortawesome/pro-solid-svg-icons": "^6.7.2",
16
18
  "@fortawesome/free-brands-svg-icons": "^6.7.2",
17
19
  "@fortawesome/react-fontawesome": "^0.2.2",
18
- "next-themes": "^0.4.6",
19
- "radix-ui": "^1.4.3",
20
- "react": "^19.2.4",
21
- "react-dom": "^19.2.4",
22
- "tailwind-merge": "^3.4.0",
23
- "tw-animate-css": "^1.4.0",
24
- "zod": "^3.25.76"
20
+ "tailwind-merge": "^3.4.0"
25
21
  },
26
22
  "devDependencies": {
27
- "@tailwindcss/postcss": "^4.1.18",
28
- "@turbo/gen": "^2.8.1",
29
23
  "@types/node": "^25.1.0",
30
24
  "@types/react": "^19.2.10",
31
25
  "@types/react-dom": "^19.2.3",
32
26
  "@workspace/eslint-config": "file:../eslint-config",
33
27
  "@workspace/typescript-config": "file:../typescript-config",
28
+ "autoprefixer": "^10.4.21",
34
29
  "eslint": "^9.39.2",
35
- "tailwindcss": "^4.1.18",
30
+ "postcss": "^8.5.6",
31
+ "tailwindcss": "^3.4.17",
32
+ "react": "^19.2.4",
33
+ "react-dom": "^19.2.4",
36
34
  "typescript": "^5.9.3"
37
35
  },
36
+ "peerDependencies": {
37
+ "react": "^18.0.0 || ^19.0.0",
38
+ "react-dom": "^18.0.0 || ^19.0.0",
39
+ "tailwindcss": "^3.4.0"
40
+ },
41
+ "bin": {
42
+ "kaizen-ui": "./bin/kaizen-ui.mjs"
43
+ },
38
44
  "exports": {
39
45
  "./globals.css": "./src/styles/globals.css",
46
+ "./globals/esc.css": "./src/styles/globals.esc.css",
47
+ "./globals/group.css": "./src/styles/globals.group.css",
40
48
  "./postcss.config": "./postcss.config.mjs",
41
- "./lib/*": "./src/lib/*.ts",
42
- "./components/*": "./src/components/*.tsx",
43
- "./hooks/*": "./src/hooks/*.ts"
49
+ "./tailwind-preset": "./tailwind-preset.cjs",
50
+ "./lib/*": "./dist/lib/*.js",
51
+ "./components/*": "./dist/components/*.js",
52
+ "./hooks/*": "./dist/hooks/*.js"
44
53
  },
54
+ "files": [
55
+ "dist",
56
+ "src/styles",
57
+ "postcss.config.mjs",
58
+ "tailwind-preset.cjs",
59
+ "bin",
60
+ "README.md",
61
+ "components.json"
62
+ ],
45
63
  "publishConfig": {
46
64
  "access": "public"
47
65
  }
@@ -1,6 +1,9 @@
1
1
  /** @type {import('postcss-load-config').Config} */
2
2
  const config = {
3
- plugins: { "@tailwindcss/postcss": {} },
3
+ plugins: {
4
+ tailwindcss: {},
5
+ autoprefixer: {},
6
+ },
4
7
  };
5
8
 
6
9
  export default config;
@@ -0,0 +1,31 @@
1
+ @import "@yberagroup/kaizen-tokens/foundations.css";
2
+ @tailwind base;
3
+ @tailwind components;
4
+ @tailwind utilities;
5
+
6
+ /*
7
+ * Typefaces: primitivos --kz-syne e --kz-nunitosans vêm de kaizen-foundations (foundations.css).
8
+ * next/font injeta --font-sans (Syne) e --font-nunito (Nunito Sans) no layout da app.
9
+ *
10
+ * Usamos classes typeface-kz-* (não font-kz-*) para não colidir com pesos tipográficos (font-kz-500/600):
11
+ * o tailwind-merge trata qualquer utilitário "font-*" como o mesmo grupo e acaba removendo a família.
12
+ */
13
+ @layer utilities {
14
+ .typeface-kz-syne {
15
+ font-family: var(--font-sans, var(--kz-syne)), "Syne", sans-serif;
16
+ }
17
+
18
+ .typeface-kz-nunitosans {
19
+ font-family:
20
+ var(--font-nunito, var(--kz-nunitosans)), "Nunito Sans", sans-serif;
21
+ }
22
+ }
23
+
24
+ @layer base {
25
+ * {
26
+ @apply border-border-primary outline-border-input-selected;
27
+ }
28
+ body {
29
+ @apply bg-background-primary text-text-primary-dark;
30
+ }
31
+ }
@@ -1,36 +1,2 @@
1
- @import "tailwindcss";
2
- @source "../../../../apps/**/*.{ts,tsx}";
3
- @source "../**/*.{ts,tsx}";
4
- @import "@yberagroup/kaizen-tokens/foundations.css";
5
- @import "@yberagroup/kaizen-tokens/themes/esc.css"; /* ou group.css */
6
- @import "@yberagroup/kaizen-tokens/tailwind-semantic-theme.css";
7
- @import "tw-animate-css";
8
-
9
- /*
10
- * Typefaces: primitivos --kz-syne e --kz-nunitosans vêm de kaizen-foundations (foundations.css).
11
- * next/font injeta --font-sans (Syne) e --font-nunito (Nunito Sans) no layout da app.
12
- *
13
- * Usamos classes typeface-kz-* (não font-kz-*) para não colidir com pesos tipográficos (font-kz-500/600):
14
- * o tailwind-merge trata qualquer utilitário "font-*" como o mesmo grupo e acaba removendo a família.
15
- */
16
- @layer utilities {
17
- .typeface-kz-syne {
18
- font-family: var(--font-sans, var(--kz-syne)), "Syne", sans-serif;
19
- }
20
-
21
- .typeface-kz-nunitosans {
22
- font-family:
23
- var(--font-nunito, var(--kz-nunitosans)), "Nunito Sans", sans-serif;
24
- }
25
- }
26
-
27
- @custom-variant dark (&:is(.dark *));
28
-
29
- @layer base {
30
- * {
31
- @apply border-border-primary outline-border-input-selected/50;
32
- }
33
- body {
34
- @apply bg-background-primary text-text-primary-dark;
35
- }
36
- }
1
+ @import "@yberagroup/kaizen-tokens/themes/esc.css";
2
+ @import "./globals.base.css";
@@ -0,0 +1,2 @@
1
+ @import "@yberagroup/kaizen-tokens/themes/esc.css";
2
+ @import "./globals.base.css";
@@ -0,0 +1,2 @@
1
+ @import "@yberagroup/kaizen-tokens/themes/group.css";
2
+ @import "./globals.base.css";
@@ -0,0 +1,96 @@
1
+ /* global module, require */
2
+ /* eslint-disable @typescript-eslint/no-require-imports */
3
+
4
+ const foundations = require("@yberagroup/kaizen-tokens/foundations");
5
+ const semanticBase = require("@yberagroup/kaizen-tokens/semantic-base");
6
+
7
+ function buildSemanticColors() {
8
+ const keys = new Set(Object.keys(semanticBase));
9
+ keys.add("background-primary");
10
+
11
+ const semanticColors = {};
12
+ for (const key of keys) {
13
+ semanticColors[key] = `var(--color-${key})`;
14
+ }
15
+
16
+ return semanticColors;
17
+ }
18
+
19
+ function buildPrimitiveKzColors() {
20
+ const kz = {};
21
+ const colors = foundations.colors ?? {};
22
+ const system = colors.system ?? {};
23
+
24
+ for (const [palette, scales] of Object.entries(system)) {
25
+ kz[palette] = {};
26
+ for (const step of Object.keys(scales)) {
27
+ kz[palette][step] = `var(--color-kz-${palette}-${step})`;
28
+ }
29
+ }
30
+
31
+ for (const palette of ["group", "club"]) {
32
+ if (!colors[palette]) continue;
33
+ kz[palette] = {};
34
+ for (const step of Object.keys(colors[palette])) {
35
+ kz[palette][step] = `var(--color-kz-${palette}-${step})`;
36
+ }
37
+ }
38
+
39
+ if (colors.escritorio) {
40
+ kz.esc = {};
41
+ for (const step of Object.keys(colors.escritorio)) {
42
+ kz.esc[step] = `var(--color-kz-esc-${step})`;
43
+ }
44
+ }
45
+
46
+ kz.alfa = {};
47
+ for (const mode of ["light", "dark"]) {
48
+ const modeValues = colors.alfa?.[mode] ?? {};
49
+ for (const step of Object.keys(modeValues)) {
50
+ kz.alfa[step] = kz.alfa[step] ?? {};
51
+ kz.alfa[step][mode] = `var(--color-kz-alfa-${step}-${mode})`;
52
+ }
53
+ }
54
+
55
+ return kz;
56
+ }
57
+
58
+ function buildPrefixedScale(values, cssVarPrefix) {
59
+ const out = {};
60
+ for (const key of Object.keys(values ?? {})) {
61
+ out[`kz-${key}`] = `var(${cssVarPrefix}${key})`;
62
+ }
63
+ return out;
64
+ }
65
+
66
+ module.exports = {
67
+ theme: {
68
+ extend: {
69
+ colors: {
70
+ ...buildSemanticColors(),
71
+ kz: buildPrimitiveKzColors(),
72
+ },
73
+ spacing: buildPrefixedScale(foundations.layout?.space, "--space-kz-"),
74
+ borderRadius: buildPrefixedScale(
75
+ foundations.layout?.border?.radius,
76
+ "--rounded-kz-",
77
+ ),
78
+ borderWidth: buildPrefixedScale(
79
+ foundations.layout?.border?.width,
80
+ "--border-kz-",
81
+ ),
82
+ fontSize: buildPrefixedScale(foundations.text?.fontsize, "--kz-text-"),
83
+ lineHeight: buildPrefixedScale(
84
+ foundations.text?.lineheight,
85
+ "--kz-leading-",
86
+ ),
87
+ fontWeight: buildPrefixedScale(
88
+ foundations.text?.weight,
89
+ "--kz-font-weight-",
90
+ ),
91
+ letterSpacing: {
92
+ "kz-0": "0",
93
+ },
94
+ },
95
+ },
96
+ };
package/eslint.config.js DELETED
@@ -1,4 +0,0 @@
1
- import { config } from "@workspace/eslint-config/react-internal"
2
-
3
- /** @type {import("eslint").Linter.Config} */
4
- export default config
File without changes
@@ -1,54 +0,0 @@
1
- import * as React from "react";
2
- import { cva, type VariantProps } from "class-variance-authority";
3
- import { clsx } from "clsx";
4
-
5
- export type TitleSize = "h1" | "h2" | "h3" | "h4" | "h5" | "h6";
6
- export type TitleWeight = "medium" | "semibold";
7
-
8
- const titleVariants = cva(
9
- "typeface-kz-syne tracking-kz-0 text-text-primary-dark leading-kz-0 p-0 m-0",
10
- {
11
- variants: {
12
- size: {
13
- h1: "text-kz-40 leading-kz-48",
14
- h2: "text-kz-32 leading-kz-40",
15
- h3: "text-kz-24 leading-kz-32",
16
- h4: "text-kz-18 leading-kz-24",
17
- h5: "text-kz-16 leading-kz-22",
18
- h6: "text-kz-14 leading-kz-20",
19
- },
20
- weight: {
21
- medium: "font-kz-500",
22
- semibold: "font-kz-600",
23
- },
24
- },
25
- defaultVariants: {
26
- size: "h2",
27
- weight: "medium",
28
- },
29
- },
30
- );
31
-
32
- export type TitleProps = React.HTMLAttributes<HTMLHeadingElement> &
33
- VariantProps<typeof titleVariants> & {
34
- size?: TitleSize;
35
- weight?: TitleWeight;
36
- };
37
-
38
- function Title({
39
- size = "h2",
40
- weight = "medium",
41
- className,
42
- ...props
43
- }: TitleProps) {
44
- const Tag = size;
45
-
46
- return (
47
- <Tag
48
- className={clsx(titleVariants({ size, weight }), className)}
49
- {...props}
50
- />
51
- );
52
- }
53
-
54
- export { Title };
File without changes
package/src/lib/icons.ts DELETED
@@ -1,48 +0,0 @@
1
- /**
2
- * Re-export de ícones Font Awesome Pro para uso no design system.
3
- * Conta Pro: mais ícones e estilos (solid, regular, light, thin, duotone).
4
- * Para outros ícones, importe de @fortawesome/pro-solid-svg-icons ou pro-regular-svg-icons.
5
- */
6
- export {
7
- faCheck,
8
- faChevronDown,
9
- faChevronLeft,
10
- faChevronRight,
11
- faChevronUp,
12
- faCircleInfo,
13
- faXmark,
14
- faPlus,
15
- faMinus,
16
- faMagnifyingGlass,
17
- faBars,
18
- faEllipsis,
19
- faEllipsisVertical,
20
- faUser,
21
- faGear,
22
- faArrowRight,
23
- faArrowLeft,
24
- faExternalLink,
25
- faTriangleExclamation,
26
- faCircleCheck,
27
- faCircleXmark,
28
- } from "@fortawesome/pro-solid-svg-icons"
29
-
30
- export {
31
- faCircleQuestion,
32
- faUser as faUserRegular,
33
- } from "@fortawesome/pro-regular-svg-icons"
34
-
35
- export {
36
- faFacebook,
37
- faInstagram,
38
- faLinkedin,
39
- faTwitter,
40
- faXTwitter,
41
- faYoutube,
42
- faWhatsapp,
43
- faGoogle,
44
- faGithub,
45
- faSpotify,
46
- faApple,
47
- faMicrosoft,
48
- } from "@fortawesome/free-brands-svg-icons"
package/src/lib/utils.ts DELETED
@@ -1,6 +0,0 @@
1
- import { clsx, type ClassValue } from "clsx"
2
- import { twMerge } from "tailwind-merge"
3
-
4
- export function cn(...inputs: ClassValue[]) {
5
- return twMerge(clsx(inputs))
6
- }
package/tsconfig.json DELETED
@@ -1,11 +0,0 @@
1
- {
2
- "extends": "@workspace/typescript-config/react-library.json",
3
- "compilerOptions": {
4
- "baseUrl": ".",
5
- "paths": {
6
- "@yberagroup/kaizen-ui/*": ["./src/*"]
7
- }
8
- },
9
- "include": ["src"],
10
- "exclude": ["node_modules", "dist"]
11
- }
@@ -1,8 +0,0 @@
1
- {
2
- "extends": "@workspace/typescript-config/react-library.json",
3
- "compilerOptions": {
4
- "outDir": "dist"
5
- },
6
- "include": ["src", "turbo"],
7
- "exclude": ["node_modules", "dist"]
8
- }