@fluencypassdevs/cycle 1.33.1 → 1.35.0

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.
@@ -2365,7 +2365,7 @@ export const COMPONENTS = [
2365
2365
  "name": "theme (BreadcrumbDot)",
2366
2366
  "type": "string",
2367
2367
  "default": "-",
2368
- "note": "classe de tema que colore o dot (ex: theme-class, theme-group)"
2368
+ "note": "classe de tema que colore o dot (ex: theme-class, theme-progress)"
2369
2369
  },
2370
2370
  {
2371
2371
  "name": "aria-label (BreadcrumbSwitcherTrigger)",
package/bin/mcp.mjs CHANGED
@@ -21,9 +21,9 @@ import { COMPONENTS } from "./components.generated.mjs"
21
21
 
22
22
  const TOKENS = {
23
23
  colors: {
24
- backgrounds: ["bg-background", "bg-card", "bg-popover", "bg-primary", "bg-secondary", "bg-muted", "bg-accent", "bg-destructive"],
25
- foregrounds: ["text-foreground", "text-card-foreground", "text-popover-foreground", "text-primary-foreground", "text-secondary-foreground", "text-muted-foreground", "text-accent-foreground", "text-destructive-foreground"],
26
- borders: ["border-border", "border-input"],
24
+ backgrounds: ["bg-background", "bg-card", "bg-popover", "bg-primary", "bg-secondary", "bg-muted", "bg-accent", "bg-destructive", "bg-surface-raised (elemento DENTRO de um card: chip, card interno — branco no light, mais claro que o card no dark)"],
25
+ foregrounds: ["text-foreground", "text-card-foreground", "text-popover-foreground", "text-primary-foreground", "text-secondary-foreground", "text-muted-foreground", "text-accent-foreground", "text-destructive-foreground", "text-surface-raised-foreground"],
26
+ borders: ["border-border (decorativa)", "border-input", "border-border-strong (borda de campo/horario selecionavel — 3:1 contra fundo, card e surface-raised)"],
27
27
  semantic: ["bg-positive", "bg-warning", "bg-critical", "bg-info"],
28
28
  },
29
29
  radius: ["rounded-sm", "rounded-md", "rounded-lg", "rounded-xl"],
@@ -31,7 +31,27 @@ const TOKENS = {
31
31
  body: ["body-xs (11px)", "body-sm (12px)", "body-md (14px)", "body-lg (16px)"],
32
32
  heading: ["heading-xs (14px/600)", "heading-sm (16px/600)", "heading-md (18px/600)", "heading-lg (20px/600)", "heading-xl (24px/600)", "heading-2xl (30px/700)", "heading-3xl (36px/700)", "heading-4xl (48px/700)"],
33
33
  },
34
- themes: [".theme-brand", ".theme-class", ".theme-private-talk", ".theme-group-talk"],
34
+ themes: [
35
+ ".theme-brand — coral da marca Fluencypass",
36
+ ".theme-class — azul (Class / aulas); tambem faz o papel de info",
37
+ ".theme-impulse — roxo (Impulse)",
38
+ ".theme-progress — verde vivo de AVANCO/ACERTO: barra de progresso, etapa concluida, resposta certa, 7/7",
39
+ ".theme-streak — laranja da SEQUENCIA (streak): chama, dias seguidos",
40
+ ".theme-positive — esmeralda de STATUS de sucesso/confirmacao (toast, alert, badge success)",
41
+ ".theme-warning — ambar de alerta",
42
+ ".theme-critical — vermelho de erro",
43
+ ".theme-group — Group Talk. DEPRECIADO na 1.x (ainda verde, alias de theme-progress); vira AMARELO (Sol) na 2.0. Use so para o PRODUTO Group Talk",
44
+ ".theme-private — Private Talk. DEPRECIADO na 1.x (ainda laranja, alias de theme-streak); vira AMARELO (Limao) na 2.0. Use so para o PRODUTO Private Talk",
45
+ ".theme-group-talk-next / .theme-private-talk-next — opt-in dos amarelos de produto na 1.x (saem na 2.0)",
46
+ ],
47
+ gradients: [
48
+ "Cada .theme-* define --gradient-from e --gradient-to (ambos passam 4,5:1 contra --primary-foreground)",
49
+ "Presets (use COM um tema no elemento ou ancestral): .gradient-linear-{b,t,r,l,br,tr,bl,tl}, .gradient-glow-{tr,br,tl,bl,c}, .gradient-spotlight, .gradient-mesh, .gradient-band",
50
+ "Pontes de familia (somar ao preset): .gradient-practice (Group Talk → Private Talk), .gradient-learning (Impulse → Class)",
51
+ "Exemplo: <div className=\"theme-class gradient-linear-br text-primary-foreground\">",
52
+ "Onde usar: cards de produto preenchidos, bloco do icone e selos de produto. NUNCA em botoes, texto, inputs ou barras de progresso",
53
+ "NUNCA escrever linear-gradient/bg-linear-* com cores proprias — sempre os presets .gradient-*",
54
+ ],
35
55
  }
36
56
 
37
57
  // ─── Tool Definitions ──────────────────────────────────────────────────────────
@@ -89,7 +109,7 @@ const TOOLS = [
89
109
  properties: {
90
110
  category: {
91
111
  type: "string",
92
- enum: ["colors", "typography", "radius", "themes", "all"],
112
+ enum: ["colors", "typography", "radius", "themes", "gradients", "all"],
93
113
  description: "Token category to retrieve",
94
114
  },
95
115
  },
@@ -252,10 +272,10 @@ Se componentes aparecem sem estilo, verifique:
252
272
  case "cycle_get_tokens": {
253
273
  const cat = args.category || "all"
254
274
  if (cat === "all") {
255
- return `# Design Tokens do Cycle\n\n## Colors\nBackgrounds: ${TOKENS.colors.backgrounds.join(", ")}\nForegrounds: ${TOKENS.colors.foregrounds.join(", ")}\nBorders: ${TOKENS.colors.borders.join(", ")}\n\n## Typography\nBody: ${TOKENS.typography.body.join(", ")}\nHeading: ${TOKENS.typography.heading.join(", ")}\n\n## Radius\n${TOKENS.radius.join(", ")}\n\n## Themes\n${TOKENS.themes.join(", ")}\n\n**NUNCA usar cores hardcoded** (bg-blue-500, #hex). Sempre usar semantic tokens.`
275
+ return `# Design Tokens do Cycle\n\n## Colors\nBackgrounds: ${TOKENS.colors.backgrounds.join(", ")}\nForegrounds: ${TOKENS.colors.foregrounds.join(", ")}\nBorders: ${TOKENS.colors.borders.join(", ")}\n\n## Typography\nBody: ${TOKENS.typography.body.join(", ")}\nHeading: ${TOKENS.typography.heading.join(", ")}\n\n## Radius\n${TOKENS.radius.join(", ")}\n\n## Themes\n- ${TOKENS.themes.join("\n- ")}\n\n## Gradients\n- ${TOKENS.gradients.join("\n- ")}\n\n**NUNCA usar cores hardcoded** (bg-blue-500, #hex). Sempre usar semantic tokens.`
256
276
  }
257
277
  const data = TOKENS[cat]
258
- if (!data) return `Unknown category "${cat}". Available: colors, typography, radius, themes, all.`
278
+ if (!data) return `Unknown category "${cat}". Available: colors, typography, radius, themes, gradients, all.`
259
279
  return `# ${cat} tokens\n\n${JSON.stringify(data, null, 2)}\n\n**NUNCA usar valores hardcoded.** Sempre usar estes semantic tokens.`
260
280
  }
261
281
 
@@ -330,6 +350,7 @@ Sempre importar de \`@fluencypassdevs/cycle\`.
330
350
  10. Usar \`cn()\` de \`@fluencypassdevs/cycle/lib/utils\` para merge de classes
331
351
  11. Dark mode via classe \`.dark\` — tokens light/dark ja estao definidos
332
352
  12. Usar variaveis de radius (rounded-sm, rounded-md, rounded-lg, rounded-xl)
353
+ 12b. Tema pelo SENTIDO, nao pela cor: progresso/acerto/etapa concluida → \`theme-progress\`; sequencia/streak → \`theme-streak\`; sucesso de status → \`theme-positive\`; produto Group Talk → \`theme-group\`; produto Private Talk → \`theme-private\`. NUNCA usar \`theme-group\`/\`theme-private\` so por querer verde/laranja — eles viram amarelo na 2.0
333
354
 
334
355
  ## Regras de Codigo
335
356
  13. TypeScript strict — tipar todas as props, nunca usar \`any\`
@@ -72,5 +72,5 @@ function ProgressDot(_a) {
72
72
  }
73
73
 
74
74
  export { ProgressDot, dotVariants, progressDotVariants };
75
- //# sourceMappingURL=chunk-E7MMJTJY.js.map
76
- //# sourceMappingURL=chunk-E7MMJTJY.js.map
75
+ //# sourceMappingURL=chunk-SQRNXYYD.js.map
76
+ //# sourceMappingURL=chunk-SQRNXYYD.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ui/progress-dot.tsx"],"names":["_a"],"mappings":";;;;;AAKA,IAAM,mBAAA,GAAsB,IAAI,mBAAA,EAAqB;AAAA,EACnD,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,EAAA,EAAI,SAAA;AAAA,MACJ,EAAA,EAAI,OAAA;AAAA,MACJ,OAAA,EAAS,OAAA;AAAA,MACT,EAAA,EAAI;AAAA;AACN,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM;AAAA;AAEV,CAAC;AAED,IAAM,WAAA,GAAc,IAAI,uBAAA,EAAyB;AAAA,EAC/C,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,EAAA,EAAI,QAAA;AAAA,MACJ,EAAA,EAAI,UAAA;AAAA,MACJ,OAAA,EAAS,QAAA;AAAA,MACT,EAAA,EAAI;AAAA;AACN,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM;AAAA;AAEV,CAAC;AAeD,SAAS,YAAY,EAAA,EAQA;AARA,EAAA,IAAA,EAAA,GAAA,EAAA,EACnB;AAAA,IAAA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA,GAAO,SAAA;AAAA,IACP,KAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GApDF,GA8CqB,EAAA,EAOhB,KAAA,GAAA,SAAA,CAPgB,EAAA,EAOhB;AAAA,IANH,QAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GAAA,CAAA;AAGA,EAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,GAAA,CAAI,CAAA,EAAG,MAAM,CAAC,CAAA;AAC9C,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,KAAA,EAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAEjD,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA,aAAA,CAAA,cAAA,CAAA;AAAA,MACC,WAAA,EAAU,cAAA;AAAA,MACV,WAAW,EAAA,CAAG,mBAAA,CAAoB,EAAE,IAAA,EAAM,GAAG,SAAS;AAAA,KAAA,EAClD,KAAA,CAAA,EAHL;AAAA,MAKE,QAAA,EAAA,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,OAAM,EAAG,CAAC,GAAG,CAAA,KAAM;AAhE/C,QAAA,IAAAA,GAAAA;AAiEQ,QAAA,MAAM,QAAA,GAAA,CAAWA,GAAAA,GAAA,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAS,CAAA,CAAA,KAAT,OAAAA,GAAAA,GAAe,KAAA;AAChC,QAAA,uBACE,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YAEC,SAAA,EAAW,EAAA;AAAA,cACT,WAAA,CAAY,EAAE,IAAA,EAAM,CAAA;AAAA,cACpB,CAAA,GAAI,MAAA,GACA,EAAA,CAAG,QAAA,EAAU,YAAY,CAAA,GACzB;AAAA;AACN,WAAA;AAAA,UANK;AAAA,SAOP;AAAA,MAEJ,CAAC;AAAA,KAAA;AAAA,GACH;AAEJ","file":"chunk-E7MMJTJY.js","sourcesContent":["import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst progressDotVariants = cva(\"flex items-center\", {\n variants: {\n size: {\n xs: \"gap-0.5\",\n sm: \"gap-1\",\n default: \"gap-1\",\n lg: \"gap-1\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n})\n\nconst dotVariants = cva(\"shrink-0 rounded-full\", {\n variants: {\n size: {\n xs: \"size-1\",\n sm: \"size-1.5\",\n default: \"size-2\",\n lg: \"size-3\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n})\n\nexport interface ProgressDotProps\n extends React.ComponentProps<\"div\">,\n VariantProps<typeof dotVariants> {\n /** Numero total de stages (2–10) */\n stages: number\n /** Quantos stages estao preenchidos (0–stages) */\n value: number\n /** Classe de tema aplicada em todos os dots preenchidos (ex: \"theme-class\") */\n theme?: string\n /** Temas individuais por dot (ex: [\"theme-class\", \"theme-brand\", undefined, \"theme-private\"]). Sobrescreve `theme` para dots que tiverem valor. */\n themes?: (string | undefined)[]\n}\n\nfunction ProgressDot({\n stages,\n value,\n size = \"default\",\n theme,\n themes,\n className,\n ...props\n}: ProgressDotProps) {\n const total = Math.min(10, Math.max(2, stages))\n const filled = Math.min(total, Math.max(0, value))\n\n return (\n <div\n data-slot=\"progress-dot\"\n className={cn(progressDotVariants({ size }), className)}\n {...props}\n >\n {Array.from({ length: total }, (_, i) => {\n const dotTheme = themes?.[i] ?? theme\n return (\n <div\n key={i}\n className={cn(\n dotVariants({ size }),\n i < filled\n ? cn(dotTheme, \"bg-primary\")\n : \"bg-neutral-input\"\n )}\n />\n )\n })}\n </div>\n )\n}\n\nexport { ProgressDot, progressDotVariants, dotVariants }\n"]}
1
+ {"version":3,"sources":["../src/components/ui/progress-dot.tsx"],"names":["_a"],"mappings":";;;;;AAKA,IAAM,mBAAA,GAAsB,IAAI,mBAAA,EAAqB;AAAA,EACnD,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,EAAA,EAAI,SAAA;AAAA,MACJ,EAAA,EAAI,OAAA;AAAA,MACJ,OAAA,EAAS,OAAA;AAAA,MACT,EAAA,EAAI;AAAA;AACN,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM;AAAA;AAEV,CAAC;AAED,IAAM,WAAA,GAAc,IAAI,uBAAA,EAAyB;AAAA,EAC/C,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,EAAA,EAAI,QAAA;AAAA,MACJ,EAAA,EAAI,UAAA;AAAA,MACJ,OAAA,EAAS,QAAA;AAAA,MACT,EAAA,EAAI;AAAA;AACN,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM;AAAA;AAEV,CAAC;AAeD,SAAS,YAAY,EAAA,EAQA;AARA,EAAA,IAAA,EAAA,GAAA,EAAA,EACnB;AAAA,IAAA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA,GAAO,SAAA;AAAA,IACP,KAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GApDF,GA8CqB,EAAA,EAOhB,KAAA,GAAA,SAAA,CAPgB,EAAA,EAOhB;AAAA,IANH,QAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GAAA,CAAA;AAGA,EAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,GAAA,CAAI,CAAA,EAAG,MAAM,CAAC,CAAA;AAC9C,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,KAAA,EAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAEjD,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA,aAAA,CAAA,cAAA,CAAA;AAAA,MACC,WAAA,EAAU,cAAA;AAAA,MACV,WAAW,EAAA,CAAG,mBAAA,CAAoB,EAAE,IAAA,EAAM,GAAG,SAAS;AAAA,KAAA,EAClD,KAAA,CAAA,EAHL;AAAA,MAKE,QAAA,EAAA,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,OAAM,EAAG,CAAC,GAAG,CAAA,KAAM;AAhE/C,QAAA,IAAAA,GAAAA;AAiEQ,QAAA,MAAM,QAAA,GAAA,CAAWA,GAAAA,GAAA,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAS,CAAA,CAAA,KAAT,OAAAA,GAAAA,GAAe,KAAA;AAChC,QAAA,uBACE,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YAEC,SAAA,EAAW,EAAA;AAAA,cACT,WAAA,CAAY,EAAE,IAAA,EAAM,CAAA;AAAA,cACpB,CAAA,GAAI,MAAA,GACA,EAAA,CAAG,QAAA,EAAU,YAAY,CAAA,GACzB;AAAA;AACN,WAAA;AAAA,UANK;AAAA,SAOP;AAAA,MAEJ,CAAC;AAAA,KAAA;AAAA,GACH;AAEJ","file":"chunk-SQRNXYYD.js","sourcesContent":["import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst progressDotVariants = cva(\"flex items-center\", {\n variants: {\n size: {\n xs: \"gap-0.5\",\n sm: \"gap-1\",\n default: \"gap-1\",\n lg: \"gap-1\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n})\n\nconst dotVariants = cva(\"shrink-0 rounded-full\", {\n variants: {\n size: {\n xs: \"size-1\",\n sm: \"size-1.5\",\n default: \"size-2\",\n lg: \"size-3\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n})\n\nexport interface ProgressDotProps\n extends React.ComponentProps<\"div\">,\n VariantProps<typeof dotVariants> {\n /** Numero total de stages (2–10) */\n stages: number\n /** Quantos stages estao preenchidos (0–stages) */\n value: number\n /** Classe de tema aplicada em todos os dots preenchidos (ex: \"theme-class\") */\n theme?: string\n /** Temas individuais por dot (ex: [\"theme-class\", \"theme-brand\", undefined, \"theme-streak\"]). Sobrescreve `theme` para dots que tiverem valor. */\n themes?: (string | undefined)[]\n}\n\nfunction ProgressDot({\n stages,\n value,\n size = \"default\",\n theme,\n themes,\n className,\n ...props\n}: ProgressDotProps) {\n const total = Math.min(10, Math.max(2, stages))\n const filled = Math.min(total, Math.max(0, value))\n\n return (\n <div\n data-slot=\"progress-dot\"\n className={cn(progressDotVariants({ size }), className)}\n {...props}\n >\n {Array.from({ length: total }, (_, i) => {\n const dotTheme = themes?.[i] ?? theme\n return (\n <div\n key={i}\n className={cn(\n dotVariants({ size }),\n i < filled\n ? cn(dotTheme, \"bg-primary\")\n : \"bg-neutral-input\"\n )}\n />\n )\n })}\n </div>\n )\n}\n\nexport { ProgressDot, progressDotVariants, dotVariants }\n"]}
package/dist/index.js CHANGED
@@ -32,7 +32,7 @@ export { Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, Ava
32
32
  export { MessageRating } from './chunk-YIOXPV2N.js';
33
33
  export { MessageBar } from './chunk-5AH2PNYW.js';
34
34
  export { ProgressStage } from './chunk-OM4W6UQG.js';
35
- export { ProgressDot, dotVariants, progressDotVariants } from './chunk-E7MMJTJY.js';
35
+ export { ProgressDot, dotVariants, progressDotVariants } from './chunk-SQRNXYYD.js';
36
36
  export { CircularProgress, circularProgressVariants } from './chunk-2NVKK7UB.js';
37
37
  export { ERROR_STATE_PRESETS, ErrorState, ErrorStateActions, ErrorStateDescription, ErrorStateMedia, ErrorStateMeta, ErrorStateTitle } from './chunk-J3QIX7EZ.js';
38
38
  export { StatusBanner, useCountdown } from './chunk-VMUNB4RA.js';
@@ -9,17 +9,20 @@
9
9
  :root {
10
10
  --color-base-white: #FFFFFF;
11
11
  --color-base-black: #000000;
12
- --color-gray-50: #FAFAFA;
13
- --color-gray-100: #F5F5F5;
14
- --color-gray-200: #E9EAEB;
15
- --color-gray-300: #D5D7DA;
16
- --color-gray-400: #A4A7AE;
12
+ --color-gray-50: #F9FAFB;
13
+ --color-gray-100: #F4F5F7;
14
+ --color-gray-200: #E9EAED;
15
+ --color-gray-300: #D5D7DB;
16
+ --color-gray-400: #A3A7AE;
17
+ --color-gray-450: #898E96;
17
18
  --color-gray-500: #717680;
18
19
  --color-gray-600: #535862;
19
- --color-gray-700: #414651;
20
- --color-gray-800: #252B37;
21
- --color-gray-900: #181D27;
22
- --color-gray-950: #0D0D12;
20
+ --color-gray-700: #414650;
21
+ --color-gray-800: #30353F;
22
+ --color-gray-850: #262A33;
23
+ --color-gray-900: #1B1F27;
24
+ --color-gray-925: #13161D;
25
+ --color-gray-950: #0B0E13;
23
26
  --color-brand-50: #FFE8E8;
24
27
  --color-brand-100: #FFD0D1;
25
28
  --color-brand-200: #FFB0B2;
@@ -77,6 +80,20 @@
77
80
  --color-red-600: #8F1717;
78
81
  --color-red-700: #6B1010;
79
82
  --color-red-900: #470A0A;
83
+ --color-yellow-50: #FEF6DC;
84
+ --color-yellow-100: #FBECBB;
85
+ --color-yellow-400: #F7CE45;
86
+ --color-yellow-500: #F6C523;
87
+ --color-yellow-600: #DAAA0B;
88
+ --color-yellow-700: #795E06;
89
+ --color-yellow-900: #685103;
90
+ --color-lemon-50: #FEFBDC;
91
+ --color-lemon-100: #FBF5BB;
92
+ --color-lemon-400: #F7E545;
93
+ --color-lemon-500: #F5DF14;
94
+ --color-lemon-600: #DAC50B;
95
+ --color-lemon-700: #6F6506;
96
+ --color-lemon-900: #5E5502;
80
97
  --radius-base: 0.625rem;
81
98
  --tracking-tighter: -0.05em;
82
99
  --tracking-tight: -0.025em;
@@ -132,6 +149,9 @@
132
149
  --color-info: var(--info);
133
150
  --color-info-foreground: var(--info-foreground);
134
151
  --color-border: var(--border);
152
+ --color-border-strong: var(--border-strong);
153
+ --color-surface-raised: var(--surface-raised);
154
+ --color-surface-raised-foreground: var(--surface-raised-foreground);
135
155
  --color-input: var(--input);
136
156
  --color-ring: var(--ring);
137
157
  --color-chart-1: var(--chart-1);
@@ -190,36 +210,42 @@
190
210
  :root {
191
211
  --base-white: #FFFFFF;
192
212
  --base-black: #000000;
193
- --gray-50: #FAFAFA;
194
- --gray-100: #F5F5F5;
195
- --gray-200: #E9EAEB;
196
- --gray-300: #D5D7DA;
197
- --gray-400: #A4A7AE;
213
+ --gray-50: #F9FAFB;
214
+ --gray-100: #F4F5F7;
215
+ --gray-200: #E9EAED;
216
+ --gray-300: #D5D7DB;
217
+ --gray-400: #A3A7AE;
218
+ --gray-450: #898E96;
198
219
  --gray-500: #717680;
199
220
  --gray-600: #535862;
200
- --gray-700: #414651;
201
- --gray-800: #252B37;
202
- --gray-900: #181D27;
203
- --gray-950: #0D0D12;
221
+ --gray-700: #414650;
222
+ --gray-800: #30353F;
223
+ --gray-850: #262A33;
224
+ --gray-900: #1B1F27;
225
+ --gray-925: #13161D;
226
+ --gray-950: #0B0E13;
204
227
  }
205
228
 
206
229
  /* === Light Mode: Neutral (global theme) === */
207
230
  :root {
208
231
  --background: var(--base-white);
209
232
  --foreground: var(--gray-950);
210
- --card: var(--base-white);
233
+ --card: var(--gray-200);
211
234
  --card-foreground: var(--gray-950);
212
235
  --popover: var(--base-white);
213
236
  --popover-foreground: var(--gray-950);
237
+ --surface-raised: var(--base-white);
238
+ --surface-raised-foreground: var(--gray-950);
214
239
  --muted: var(--gray-50);
215
240
  --muted-foreground: var(--gray-600);
216
- --accent: var(--gray-100);
241
+ --accent: var(--gray-200);
217
242
  --accent-foreground: var(--gray-900);
218
243
  --primary: var(--gray-950);
219
244
  --primary-foreground: var(--gray-100);
220
245
  --secondary: var(--gray-50);
221
246
  --secondary-foreground: var(--gray-900);
222
247
  --border: var(--gray-300);
248
+ --border-strong: var(--gray-500);
223
249
  --input: var(--gray-200);
224
250
  --ring: var(--gray-500);
225
251
  --destructive: #B32020;
@@ -269,21 +295,24 @@
269
295
 
270
296
  /* === Dark Mode: Neutral === */
271
297
  .dark {
272
- --background: var(--base-black);
298
+ --background: var(--gray-950);
273
299
  --foreground: var(--gray-50);
274
- --card: var(--gray-950);
300
+ --card: var(--gray-900);
275
301
  --card-foreground: var(--gray-50);
276
- --popover: var(--gray-950);
302
+ --popover: var(--gray-850);
277
303
  --popover-foreground: var(--gray-50);
278
- --muted: var(--gray-950);
304
+ --surface-raised: var(--gray-850);
305
+ --surface-raised-foreground: var(--gray-50);
306
+ --muted: var(--gray-900);
279
307
  --muted-foreground: var(--gray-400);
280
308
  --accent: var(--gray-800);
281
309
  --accent-foreground: var(--gray-50);
282
310
  --primary: var(--base-white);
283
311
  --primary-foreground: var(--gray-900);
284
- --secondary: var(--gray-900);
312
+ --secondary: var(--gray-850);
285
313
  --secondary-foreground: var(--gray-200);
286
314
  --border: var(--gray-700);
315
+ --border-strong: var(--gray-500);
287
316
  --input: var(--gray-800);
288
317
  --ring: var(--gray-400);
289
318
  --destructive: #D42B2B;
@@ -349,6 +378,8 @@
349
378
  --border: #D45558;
350
379
  --input: #ED6A6D;
351
380
  --ring: #B33E41;
381
+ --gradient-from: #940538;
382
+ --gradient-to: #D04649;
352
383
  }
353
384
 
354
385
  .theme-class {
@@ -369,8 +400,13 @@
369
400
  --border: #1A5FE0;
370
401
  --input: #2E74FF;
371
402
  --ring: #0F4BBC;
403
+ --gradient-from: #112FBE;
404
+ --gradient-to: #1A5FE0;
372
405
  }
373
406
 
407
+ /* theme-streak: laranja da sequência (streak). theme-private é alias DEPRECIADO
408
+ com os mesmos valores — na 2.0 passa a ser o amarelo do Private Talk. */
409
+ .theme-streak,
374
410
  .theme-private {
375
411
  --background: #FFEDE0;
376
412
  --foreground: #BC4818;
@@ -389,8 +425,13 @@
389
425
  --border: #E56530;
390
426
  --input: #FF8041;
391
427
  --ring: #BF4D20;
428
+ --gradient-from: #8E1F03;
429
+ --gradient-to: #CB4E1A;
392
430
  }
393
431
 
432
+ /* theme-progress: verde de avanço/acerto. theme-group é alias DEPRECIADO com os
433
+ mesmos valores — na 2.0 passa a ser o amarelo do Group Talk. */
434
+ .theme-progress,
394
435
  .theme-group {
395
436
  --background: #E0FFE9;
396
437
  --foreground: #008423;
@@ -409,6 +450,8 @@
409
450
  --border: #00C234;
410
451
  --input: #00E73E;
411
452
  --ring: #009929;
453
+ --gradient-from: #15D886;
454
+ --gradient-to: #00C234;
412
455
  }
413
456
 
414
457
  .theme-impulse {
@@ -429,6 +472,8 @@
429
472
  --border: #7D0DD4;
430
473
  --input: #9810FA;
431
474
  --ring: #6209A8;
475
+ --gradient-from: #4901A0;
476
+ --gradient-to: #7D0DD4;
432
477
  }
433
478
 
434
479
  .theme-positive {
@@ -449,6 +494,8 @@
449
494
  --border: #098A5E;
450
495
  --input: #0BA370;
451
496
  --ring: #07704C;
497
+ --gradient-from: #01682D;
498
+ --gradient-to: #09875C;
452
499
  }
453
500
 
454
501
  .theme-warning {
@@ -469,6 +516,8 @@
469
516
  --border: #D48E00;
470
517
  --input: #F5A800;
471
518
  --ring: #AA7200;
519
+ --gradient-from: #7F4F06;
520
+ --gradient-to: #A16C00;
472
521
  }
473
522
 
474
523
  .theme-critical {
@@ -489,6 +538,56 @@
489
538
  --border: #B32020;
490
539
  --input: #D42B2B;
491
540
  --ring: #8F1717;
541
+ --gradient-from: #87051E;
542
+ --gradient-to: #B32020;
543
+ }
544
+
545
+ /* ─── Amarelos de produto (OPT-IN da 1.x) ───
546
+ Group Talk (Sol) e Private Talk (Limão). Na 2.0 estes valores passam para
547
+ .theme-group e .theme-private e os nomes "-next" saem. Preenchimento amarelo
548
+ sempre com texto escuro: branco sobre amarelo nunca chega a 4,5:1. */
549
+ .theme-group-talk-next {
550
+ --background: #FEF6DC;
551
+ --foreground: #896A04;
552
+ --card: #FEF6DC;
553
+ --card-foreground: #896A04;
554
+ --popover: #FEF6DC;
555
+ --popover-foreground: #896A04;
556
+ --muted: #FBECBB;
557
+ --muted-foreground: #795E06;
558
+ --accent: #FEF6DC;
559
+ --accent-foreground: #685103;
560
+ --primary: #F6C523;
561
+ --primary-foreground: #1A1400;
562
+ --secondary: #FEF6DC;
563
+ --secondary-foreground: #0a0a0a;
564
+ --border: #F6C523;
565
+ --input: #F7CE45;
566
+ --ring: #DAAA0B;
567
+ --gradient-from: #FFE268;
568
+ --gradient-to: #F6C523;
569
+ }
570
+
571
+ .theme-private-talk-next {
572
+ --background: #FEFBDC;
573
+ --foreground: #7F7203;
574
+ --card: #FEFBDC;
575
+ --card-foreground: #7F7203;
576
+ --popover: #FEFBDC;
577
+ --popover-foreground: #7F7203;
578
+ --muted: #FBF5BB;
579
+ --muted-foreground: #6F6506;
580
+ --accent: #FEFBDC;
581
+ --accent-foreground: #5E5502;
582
+ --primary: #F5DF14;
583
+ --primary-foreground: #1A1400;
584
+ --secondary: #FEFBDC;
585
+ --secondary-foreground: #0a0a0a;
586
+ --border: #F5DF14;
587
+ --input: #F7E545;
588
+ --ring: #DAC50B;
589
+ --gradient-from: #FFF65C;
590
+ --gradient-to: #F5DF14;
492
591
  }
493
592
 
494
593
  /* === Theme Variations: Dark Mode === */
@@ -505,13 +604,15 @@
505
604
  --muted-foreground: #FFB0B2;
506
605
  --accent: rgba(237, 106, 109, 0.3);
507
606
  --accent-foreground: #FFE8E8;
508
- --primary: #E4272B;
607
+ --primary: #CB4B51;
509
608
  --primary-foreground: #FFFFFF;
510
609
  --secondary: rgba(237, 106, 109, 0.1);
511
610
  --secondary-foreground: #ffffff;
512
611
  --border: #ED6A6D;
513
612
  --input: #F57B7E;
514
613
  --ring: #F57B7E;
614
+ --gradient-from: #93073C;
615
+ --gradient-to: #CB4B51;
515
616
  }
516
617
 
517
618
  .dark .theme-class,
@@ -533,8 +634,12 @@
533
634
  --border: #2E74FF;
534
635
  --input: #4D8AFF;
535
636
  --ring: #4D8AFF;
637
+ --gradient-from: #1B3ADC;
638
+ --gradient-to: #226CFF;
536
639
  }
537
640
 
641
+ .dark .theme-streak,
642
+ .theme-streak:is(.dark *),
538
643
  .dark .theme-private,
539
644
  .theme-private:is(.dark *) {
540
645
  --background: rgba(255, 128, 65, 0.1);
@@ -554,8 +659,12 @@
554
659
  --border: #FF8041;
555
660
  --input: #FF9158;
556
661
  --ring: #FF9158;
662
+ --gradient-from: #911C01;
663
+ --gradient-to: #D34600;
557
664
  }
558
665
 
666
+ .dark .theme-progress,
667
+ .theme-progress:is(.dark *),
559
668
  .dark .theme-group,
560
669
  .theme-group:is(.dark *) {
561
670
  --background: rgba(0, 231, 62, 0.1);
@@ -575,6 +684,8 @@
575
684
  --border: #00E73E;
576
685
  --input: #1AFF61;
577
686
  --ring: #1AFF61;
687
+ --gradient-from: #0AFD9C;
688
+ --gradient-to: #00E73E;
578
689
  }
579
690
 
580
691
  .dark .theme-impulse,
@@ -596,6 +707,8 @@
596
707
  --border: #9810FA;
597
708
  --input: #B844FF;
598
709
  --ring: #B844FF;
710
+ --gradient-from: #5F04C7;
711
+ --gradient-to: #9810FA;
599
712
  }
600
713
 
601
714
  .dark .theme-positive,
@@ -617,6 +730,8 @@
617
730
  --border: #0BA370;
618
731
  --input: #1EC485;
619
732
  --ring: #1EC485;
733
+ --gradient-from: #086830;
734
+ --gradient-to: #09875D;
620
735
  }
621
736
 
622
737
  .dark .theme-warning,
@@ -638,6 +753,8 @@
638
753
  --border: #F5A800;
639
754
  --input: #FDC028;
640
755
  --ring: #FDC028;
756
+ --gradient-from: #FEBD2C;
757
+ --gradient-to: #F5A800;
641
758
  }
642
759
 
643
760
  .dark .theme-critical,
@@ -659,7 +776,156 @@
659
776
  --border: #D42B2B;
660
777
  --input: #ED5555;
661
778
  --ring: #ED5555;
662
- }
779
+ --gradient-from: #AA0228;
780
+ --gradient-to: #D42B2B;
781
+ }
782
+
783
+ .dark .theme-group-talk-next,
784
+ .theme-group-talk-next:is(.dark *) {
785
+ --background: rgba(250, 205, 56, 0.1);
786
+ --foreground: #FACD38;
787
+ --card: rgba(250, 205, 56, 0.1);
788
+ --card-foreground: #FACD38;
789
+ --popover: rgba(250, 205, 56, 0.1);
790
+ --popover-foreground: #FACD38;
791
+ --muted: rgba(250, 205, 56, 0.2);
792
+ --muted-foreground: #FCE69C;
793
+ --accent: rgba(250, 205, 56, 0.3);
794
+ --accent-foreground: #FEF6DC;
795
+ --primary: #FACD38;
796
+ --primary-foreground: #0a0a0a;
797
+ --secondary: rgba(250, 205, 56, 0.1);
798
+ --secondary-foreground: #ffffff;
799
+ --border: #FACD38;
800
+ --input: #FBD760;
801
+ --ring: #FBD760;
802
+ --gradient-from: #FFEA8C;
803
+ --gradient-to: #FACD38;
804
+ }
805
+
806
+ .dark .theme-private-talk-next,
807
+ .theme-private-talk-next:is(.dark *) {
808
+ --background: rgba(250, 231, 56, 0.1);
809
+ --foreground: #FAE738;
810
+ --card: rgba(250, 231, 56, 0.1);
811
+ --card-foreground: #FAE738;
812
+ --popover: rgba(250, 231, 56, 0.1);
813
+ --popover-foreground: #FAE738;
814
+ --muted: rgba(250, 231, 56, 0.2);
815
+ --muted-foreground: #FCF39C;
816
+ --accent: rgba(250, 231, 56, 0.3);
817
+ --accent-foreground: #FEFBDC;
818
+ --primary: #FAE738;
819
+ --primary-foreground: #0a0a0a;
820
+ --secondary: rgba(250, 231, 56, 0.1);
821
+ --secondary-foreground: #ffffff;
822
+ --border: #FAE738;
823
+ --input: #FBEB60;
824
+ --ring: #FBEB60;
825
+ --gradient-from: #FFFB91;
826
+ --gradient-to: #FAE738;
827
+ }
828
+
829
+ /* >>> cycle-gradients — catálogo de degradês (1.34.0)
830
+ Uso: tema + preset no mesmo elemento (ou tema num ancestral):
831
+ <div className="theme-class gradient-linear-br text-primary-foreground">…</div>
832
+ Ponte de família: some a classe da ponte (troca os dois tons):
833
+ <div className="theme-group-talk-next gradient-practice gradient-linear-r">…</div>
834
+ Regras: interpolação em OKLCH (a 1ª declaração é a reserva sem "in oklch");
835
+ os dois tons de cada tema passam 4,5:1 contra --primary-foreground, então
836
+ qualquer preset/direção é seguro para o texto do preenchimento.
837
+ Escopo: cards de produto preenchidos, bloco do ícone e selos de produto —
838
+ não usar em botões, texto, inputs ou barras de progresso.
839
+ Esta seção é IDÊNTICA em tokens.css e globals.css (travado por teste). */
840
+
841
+ /* Pontes de família */
842
+ .gradient-practice { /* Group Talk → Private Talk (Sol → Limão) */
843
+ --gradient-from: #F6C523;
844
+ --gradient-to: #F5DF14;
845
+ }
846
+ .dark .gradient-practice,
847
+ .gradient-practice:is(.dark *) {
848
+ --gradient-from: #FACD38;
849
+ --gradient-to: #FAE738;
850
+ }
851
+ .gradient-learning { /* Impulse → Class */
852
+ --gradient-from: #7D0DD4;
853
+ --gradient-to: #1A5FE0;
854
+ }
855
+ .dark .gradient-learning,
856
+ .gradient-learning:is(.dark *) {
857
+ --gradient-from: #9810FA;
858
+ --gradient-to: #226CFF;
859
+ }
860
+
861
+ /* Linear — a ponta de mais contraste (--gradient-from) sai do lado oposto à direção. */
862
+ .gradient-linear-b { /* para baixo */
863
+ background-image: linear-gradient(180deg, var(--gradient-from), var(--gradient-to));
864
+ background-image: linear-gradient(180deg in oklch, var(--gradient-from), var(--gradient-to));
865
+ }
866
+ .gradient-linear-t { /* para cima */
867
+ background-image: linear-gradient(0deg, var(--gradient-from), var(--gradient-to));
868
+ background-image: linear-gradient(0deg in oklch, var(--gradient-from), var(--gradient-to));
869
+ }
870
+ .gradient-linear-r { /* para a direita */
871
+ background-image: linear-gradient(90deg, var(--gradient-from), var(--gradient-to));
872
+ background-image: linear-gradient(90deg in oklch, var(--gradient-from), var(--gradient-to));
873
+ }
874
+ .gradient-linear-l { /* para a esquerda */
875
+ background-image: linear-gradient(270deg, var(--gradient-from), var(--gradient-to));
876
+ background-image: linear-gradient(270deg in oklch, var(--gradient-from), var(--gradient-to));
877
+ }
878
+ .gradient-linear-br { /* diagonal ↘ (padrão) */
879
+ background-image: linear-gradient(135deg, var(--gradient-from), var(--gradient-to));
880
+ background-image: linear-gradient(135deg in oklch, var(--gradient-from), var(--gradient-to));
881
+ }
882
+ .gradient-linear-tr { /* diagonal ↗ */
883
+ background-image: linear-gradient(45deg, var(--gradient-from), var(--gradient-to));
884
+ background-image: linear-gradient(45deg in oklch, var(--gradient-from), var(--gradient-to));
885
+ }
886
+ .gradient-linear-bl { /* diagonal ↙ */
887
+ background-image: linear-gradient(225deg, var(--gradient-from), var(--gradient-to));
888
+ background-image: linear-gradient(225deg in oklch, var(--gradient-from), var(--gradient-to));
889
+ }
890
+ .gradient-linear-tl { /* diagonal ↖ */
891
+ background-image: linear-gradient(315deg, var(--gradient-from), var(--gradient-to));
892
+ background-image: linear-gradient(315deg in oklch, var(--gradient-from), var(--gradient-to));
893
+ }
894
+ /* Radial — brilho na cor do tema (--gradient-to) no ponto indicado. */
895
+ .gradient-glow-tr { /* canto superior direito */
896
+ background-image: radial-gradient(120% 120% at 100% 0%, var(--gradient-to), var(--gradient-from));
897
+ background-image: radial-gradient(120% 120% at 100% 0% in oklch, var(--gradient-to), var(--gradient-from));
898
+ }
899
+ .gradient-glow-br { /* canto inferior direito */
900
+ background-image: radial-gradient(120% 120% at 100% 100%, var(--gradient-to), var(--gradient-from));
901
+ background-image: radial-gradient(120% 120% at 100% 100% in oklch, var(--gradient-to), var(--gradient-from));
902
+ }
903
+ .gradient-glow-tl { /* canto superior esquerdo */
904
+ background-image: radial-gradient(120% 120% at 0% 0%, var(--gradient-to), var(--gradient-from));
905
+ background-image: radial-gradient(120% 120% at 0% 0% in oklch, var(--gradient-to), var(--gradient-from));
906
+ }
907
+ .gradient-glow-bl { /* canto inferior esquerdo */
908
+ background-image: radial-gradient(120% 120% at 0% 100%, var(--gradient-to), var(--gradient-from));
909
+ background-image: radial-gradient(120% 120% at 0% 100% in oklch, var(--gradient-to), var(--gradient-from));
910
+ }
911
+ .gradient-glow-c { /* centro */
912
+ background-image: radial-gradient(90% 90% at 50% 50%, var(--gradient-to), var(--gradient-from));
913
+ background-image: radial-gradient(90% 90% at 50% 50% in oklch, var(--gradient-to), var(--gradient-from));
914
+ }
915
+ /* Compostos */
916
+ .gradient-spotlight { /* holofote à direita sobre a ponta de contraste (texto à esquerda) */
917
+ background-image: radial-gradient(60% 90% at 85% 55%, var(--gradient-to), transparent), linear-gradient(var(--gradient-from), var(--gradient-from));
918
+ background-image: radial-gradient(60% 90% at 85% 55% in oklch, var(--gradient-to), transparent), linear-gradient(var(--gradient-from), var(--gradient-from));
919
+ }
920
+ .gradient-mesh { /* malha com dois focos */
921
+ background-image: radial-gradient(70% 70% at 0% 0%, var(--gradient-from), transparent), radial-gradient(80% 80% at 100% 100%, var(--gradient-to), transparent), linear-gradient(135deg, var(--gradient-from), var(--gradient-to));
922
+ background-image: radial-gradient(70% 70% at 0% 0% in oklch, var(--gradient-from), transparent), radial-gradient(80% 80% at 100% 100% in oklch, var(--gradient-to), transparent), linear-gradient(135deg in oklch, var(--gradient-from), var(--gradient-to));
923
+ }
924
+ .gradient-band { /* faixa diagonal: ponta de contraste firme até 35% */
925
+ background-image: linear-gradient(135deg, var(--gradient-from) 0%, var(--gradient-from) 35%, var(--gradient-to) 100%);
926
+ background-image: linear-gradient(135deg in oklch, var(--gradient-from) 0%, var(--gradient-from) 35%, var(--gradient-to) 100%);
927
+ }
928
+ /* <<< cycle-gradients */
663
929
 
664
930
  /* === Base layer === */
665
931
  @layer base {
@@ -16,7 +16,7 @@ interface ProgressDotProps extends React.ComponentProps<"div">, VariantProps<typ
16
16
  value: number;
17
17
  /** Classe de tema aplicada em todos os dots preenchidos (ex: "theme-class") */
18
18
  theme?: string;
19
- /** Temas individuais por dot (ex: ["theme-class", "theme-brand", undefined, "theme-private"]). Sobrescreve `theme` para dots que tiverem valor. */
19
+ /** Temas individuais por dot (ex: ["theme-class", "theme-brand", undefined, "theme-streak"]). Sobrescreve `theme` para dots que tiverem valor. */
20
20
  themes?: (string | undefined)[];
21
21
  }
22
22
  declare function ProgressDot({ stages, value, size, theme, themes, className, ...props }: ProgressDotProps): react_jsx_runtime.JSX.Element;
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- export { ProgressDot, dotVariants, progressDotVariants } from '../chunk-E7MMJTJY.js';
2
+ export { ProgressDot, dotVariants, progressDotVariants } from '../chunk-SQRNXYYD.js';
3
3
  import '../chunk-LYTC7UMN.js';
4
4
  import '../chunk-W4KJCBMW.js';
5
5
  import '../chunk-2NMEKWO5.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluencypassdevs/cycle",
3
- "version": "1.33.1",
3
+ "version": "1.35.0",
4
4
  "description": "Cycle Design System — UI component library by Fluencypass (produto)",
5
5
  "license": "MIT",
6
6
  "repository": {