@fluencypassdevs/cycle 1.33.1 → 1.34.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
@@ -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';
@@ -77,6 +77,20 @@
77
77
  --color-red-600: #8F1717;
78
78
  --color-red-700: #6B1010;
79
79
  --color-red-900: #470A0A;
80
+ --color-yellow-50: #FEF6DC;
81
+ --color-yellow-100: #FBECBB;
82
+ --color-yellow-400: #F7CE45;
83
+ --color-yellow-500: #F6C523;
84
+ --color-yellow-600: #DAAA0B;
85
+ --color-yellow-700: #795E06;
86
+ --color-yellow-900: #685103;
87
+ --color-lemon-50: #FEFBDC;
88
+ --color-lemon-100: #FBF5BB;
89
+ --color-lemon-400: #F7E545;
90
+ --color-lemon-500: #F5DF14;
91
+ --color-lemon-600: #DAC50B;
92
+ --color-lemon-700: #6F6506;
93
+ --color-lemon-900: #5E5502;
80
94
  --radius-base: 0.625rem;
81
95
  --tracking-tighter: -0.05em;
82
96
  --tracking-tight: -0.025em;
@@ -349,6 +363,8 @@
349
363
  --border: #D45558;
350
364
  --input: #ED6A6D;
351
365
  --ring: #B33E41;
366
+ --gradient-from: #940538;
367
+ --gradient-to: #D04649;
352
368
  }
353
369
 
354
370
  .theme-class {
@@ -369,8 +385,13 @@
369
385
  --border: #1A5FE0;
370
386
  --input: #2E74FF;
371
387
  --ring: #0F4BBC;
388
+ --gradient-from: #112FBE;
389
+ --gradient-to: #1A5FE0;
372
390
  }
373
391
 
392
+ /* theme-streak: laranja da sequência (streak). theme-private é alias DEPRECIADO
393
+ com os mesmos valores — na 2.0 passa a ser o amarelo do Private Talk. */
394
+ .theme-streak,
374
395
  .theme-private {
375
396
  --background: #FFEDE0;
376
397
  --foreground: #BC4818;
@@ -389,8 +410,13 @@
389
410
  --border: #E56530;
390
411
  --input: #FF8041;
391
412
  --ring: #BF4D20;
413
+ --gradient-from: #8E1F03;
414
+ --gradient-to: #CB4E1A;
392
415
  }
393
416
 
417
+ /* theme-progress: verde de avanço/acerto. theme-group é alias DEPRECIADO com os
418
+ mesmos valores — na 2.0 passa a ser o amarelo do Group Talk. */
419
+ .theme-progress,
394
420
  .theme-group {
395
421
  --background: #E0FFE9;
396
422
  --foreground: #008423;
@@ -409,6 +435,8 @@
409
435
  --border: #00C234;
410
436
  --input: #00E73E;
411
437
  --ring: #009929;
438
+ --gradient-from: #15D886;
439
+ --gradient-to: #00C234;
412
440
  }
413
441
 
414
442
  .theme-impulse {
@@ -429,6 +457,8 @@
429
457
  --border: #7D0DD4;
430
458
  --input: #9810FA;
431
459
  --ring: #6209A8;
460
+ --gradient-from: #4901A0;
461
+ --gradient-to: #7D0DD4;
432
462
  }
433
463
 
434
464
  .theme-positive {
@@ -449,6 +479,8 @@
449
479
  --border: #098A5E;
450
480
  --input: #0BA370;
451
481
  --ring: #07704C;
482
+ --gradient-from: #01682D;
483
+ --gradient-to: #09875C;
452
484
  }
453
485
 
454
486
  .theme-warning {
@@ -469,6 +501,8 @@
469
501
  --border: #D48E00;
470
502
  --input: #F5A800;
471
503
  --ring: #AA7200;
504
+ --gradient-from: #7F4F06;
505
+ --gradient-to: #A16C00;
472
506
  }
473
507
 
474
508
  .theme-critical {
@@ -489,6 +523,56 @@
489
523
  --border: #B32020;
490
524
  --input: #D42B2B;
491
525
  --ring: #8F1717;
526
+ --gradient-from: #87051E;
527
+ --gradient-to: #B32020;
528
+ }
529
+
530
+ /* ─── Amarelos de produto (OPT-IN da 1.x) ───
531
+ Group Talk (Sol) e Private Talk (Limão). Na 2.0 estes valores passam para
532
+ .theme-group e .theme-private e os nomes "-next" saem. Preenchimento amarelo
533
+ sempre com texto escuro: branco sobre amarelo nunca chega a 4,5:1. */
534
+ .theme-group-talk-next {
535
+ --background: #FEF6DC;
536
+ --foreground: #896A04;
537
+ --card: #FEF6DC;
538
+ --card-foreground: #896A04;
539
+ --popover: #FEF6DC;
540
+ --popover-foreground: #896A04;
541
+ --muted: #FBECBB;
542
+ --muted-foreground: #795E06;
543
+ --accent: #FEF6DC;
544
+ --accent-foreground: #685103;
545
+ --primary: #F6C523;
546
+ --primary-foreground: #1A1400;
547
+ --secondary: #FEF6DC;
548
+ --secondary-foreground: #0a0a0a;
549
+ --border: #F6C523;
550
+ --input: #F7CE45;
551
+ --ring: #DAAA0B;
552
+ --gradient-from: #FFE268;
553
+ --gradient-to: #F6C523;
554
+ }
555
+
556
+ .theme-private-talk-next {
557
+ --background: #FEFBDC;
558
+ --foreground: #7F7203;
559
+ --card: #FEFBDC;
560
+ --card-foreground: #7F7203;
561
+ --popover: #FEFBDC;
562
+ --popover-foreground: #7F7203;
563
+ --muted: #FBF5BB;
564
+ --muted-foreground: #6F6506;
565
+ --accent: #FEFBDC;
566
+ --accent-foreground: #5E5502;
567
+ --primary: #F5DF14;
568
+ --primary-foreground: #1A1400;
569
+ --secondary: #FEFBDC;
570
+ --secondary-foreground: #0a0a0a;
571
+ --border: #F5DF14;
572
+ --input: #F7E545;
573
+ --ring: #DAC50B;
574
+ --gradient-from: #FFF65C;
575
+ --gradient-to: #F5DF14;
492
576
  }
493
577
 
494
578
  /* === Theme Variations: Dark Mode === */
@@ -505,13 +589,15 @@
505
589
  --muted-foreground: #FFB0B2;
506
590
  --accent: rgba(237, 106, 109, 0.3);
507
591
  --accent-foreground: #FFE8E8;
508
- --primary: #E4272B;
592
+ --primary: #CB4B51;
509
593
  --primary-foreground: #FFFFFF;
510
594
  --secondary: rgba(237, 106, 109, 0.1);
511
595
  --secondary-foreground: #ffffff;
512
596
  --border: #ED6A6D;
513
597
  --input: #F57B7E;
514
598
  --ring: #F57B7E;
599
+ --gradient-from: #93073C;
600
+ --gradient-to: #CB4B51;
515
601
  }
516
602
 
517
603
  .dark .theme-class,
@@ -533,8 +619,12 @@
533
619
  --border: #2E74FF;
534
620
  --input: #4D8AFF;
535
621
  --ring: #4D8AFF;
622
+ --gradient-from: #1B3ADC;
623
+ --gradient-to: #226CFF;
536
624
  }
537
625
 
626
+ .dark .theme-streak,
627
+ .theme-streak:is(.dark *),
538
628
  .dark .theme-private,
539
629
  .theme-private:is(.dark *) {
540
630
  --background: rgba(255, 128, 65, 0.1);
@@ -554,8 +644,12 @@
554
644
  --border: #FF8041;
555
645
  --input: #FF9158;
556
646
  --ring: #FF9158;
647
+ --gradient-from: #911C01;
648
+ --gradient-to: #D34600;
557
649
  }
558
650
 
651
+ .dark .theme-progress,
652
+ .theme-progress:is(.dark *),
559
653
  .dark .theme-group,
560
654
  .theme-group:is(.dark *) {
561
655
  --background: rgba(0, 231, 62, 0.1);
@@ -575,6 +669,8 @@
575
669
  --border: #00E73E;
576
670
  --input: #1AFF61;
577
671
  --ring: #1AFF61;
672
+ --gradient-from: #0AFD9C;
673
+ --gradient-to: #00E73E;
578
674
  }
579
675
 
580
676
  .dark .theme-impulse,
@@ -596,6 +692,8 @@
596
692
  --border: #9810FA;
597
693
  --input: #B844FF;
598
694
  --ring: #B844FF;
695
+ --gradient-from: #5F04C7;
696
+ --gradient-to: #9810FA;
599
697
  }
600
698
 
601
699
  .dark .theme-positive,
@@ -617,6 +715,8 @@
617
715
  --border: #0BA370;
618
716
  --input: #1EC485;
619
717
  --ring: #1EC485;
718
+ --gradient-from: #086830;
719
+ --gradient-to: #09875D;
620
720
  }
621
721
 
622
722
  .dark .theme-warning,
@@ -638,6 +738,8 @@
638
738
  --border: #F5A800;
639
739
  --input: #FDC028;
640
740
  --ring: #FDC028;
741
+ --gradient-from: #FEBD2C;
742
+ --gradient-to: #F5A800;
641
743
  }
642
744
 
643
745
  .dark .theme-critical,
@@ -659,7 +761,156 @@
659
761
  --border: #D42B2B;
660
762
  --input: #ED5555;
661
763
  --ring: #ED5555;
662
- }
764
+ --gradient-from: #AA0228;
765
+ --gradient-to: #D42B2B;
766
+ }
767
+
768
+ .dark .theme-group-talk-next,
769
+ .theme-group-talk-next:is(.dark *) {
770
+ --background: rgba(250, 205, 56, 0.1);
771
+ --foreground: #FACD38;
772
+ --card: rgba(250, 205, 56, 0.1);
773
+ --card-foreground: #FACD38;
774
+ --popover: rgba(250, 205, 56, 0.1);
775
+ --popover-foreground: #FACD38;
776
+ --muted: rgba(250, 205, 56, 0.2);
777
+ --muted-foreground: #FCE69C;
778
+ --accent: rgba(250, 205, 56, 0.3);
779
+ --accent-foreground: #FEF6DC;
780
+ --primary: #FACD38;
781
+ --primary-foreground: #0a0a0a;
782
+ --secondary: rgba(250, 205, 56, 0.1);
783
+ --secondary-foreground: #ffffff;
784
+ --border: #FACD38;
785
+ --input: #FBD760;
786
+ --ring: #FBD760;
787
+ --gradient-from: #FFEA8C;
788
+ --gradient-to: #FACD38;
789
+ }
790
+
791
+ .dark .theme-private-talk-next,
792
+ .theme-private-talk-next:is(.dark *) {
793
+ --background: rgba(250, 231, 56, 0.1);
794
+ --foreground: #FAE738;
795
+ --card: rgba(250, 231, 56, 0.1);
796
+ --card-foreground: #FAE738;
797
+ --popover: rgba(250, 231, 56, 0.1);
798
+ --popover-foreground: #FAE738;
799
+ --muted: rgba(250, 231, 56, 0.2);
800
+ --muted-foreground: #FCF39C;
801
+ --accent: rgba(250, 231, 56, 0.3);
802
+ --accent-foreground: #FEFBDC;
803
+ --primary: #FAE738;
804
+ --primary-foreground: #0a0a0a;
805
+ --secondary: rgba(250, 231, 56, 0.1);
806
+ --secondary-foreground: #ffffff;
807
+ --border: #FAE738;
808
+ --input: #FBEB60;
809
+ --ring: #FBEB60;
810
+ --gradient-from: #FFFB91;
811
+ --gradient-to: #FAE738;
812
+ }
813
+
814
+ /* >>> cycle-gradients — catálogo de degradês (1.34.0)
815
+ Uso: tema + preset no mesmo elemento (ou tema num ancestral):
816
+ <div className="theme-class gradient-linear-br text-primary-foreground">…</div>
817
+ Ponte de família: some a classe da ponte (troca os dois tons):
818
+ <div className="theme-group-talk-next gradient-practice gradient-linear-r">…</div>
819
+ Regras: interpolação em OKLCH (a 1ª declaração é a reserva sem "in oklch");
820
+ os dois tons de cada tema passam 4,5:1 contra --primary-foreground, então
821
+ qualquer preset/direção é seguro para o texto do preenchimento.
822
+ Escopo: cards de produto preenchidos, bloco do ícone e selos de produto —
823
+ não usar em botões, texto, inputs ou barras de progresso.
824
+ Esta seção é IDÊNTICA em tokens.css e globals.css (travado por teste). */
825
+
826
+ /* Pontes de família */
827
+ .gradient-practice { /* Group Talk → Private Talk (Sol → Limão) */
828
+ --gradient-from: #F6C523;
829
+ --gradient-to: #F5DF14;
830
+ }
831
+ .dark .gradient-practice,
832
+ .gradient-practice:is(.dark *) {
833
+ --gradient-from: #FACD38;
834
+ --gradient-to: #FAE738;
835
+ }
836
+ .gradient-learning { /* Impulse → Class */
837
+ --gradient-from: #7D0DD4;
838
+ --gradient-to: #1A5FE0;
839
+ }
840
+ .dark .gradient-learning,
841
+ .gradient-learning:is(.dark *) {
842
+ --gradient-from: #9810FA;
843
+ --gradient-to: #226CFF;
844
+ }
845
+
846
+ /* Linear — a ponta de mais contraste (--gradient-from) sai do lado oposto à direção. */
847
+ .gradient-linear-b { /* para baixo */
848
+ background-image: linear-gradient(180deg, var(--gradient-from), var(--gradient-to));
849
+ background-image: linear-gradient(180deg in oklch, var(--gradient-from), var(--gradient-to));
850
+ }
851
+ .gradient-linear-t { /* para cima */
852
+ background-image: linear-gradient(0deg, var(--gradient-from), var(--gradient-to));
853
+ background-image: linear-gradient(0deg in oklch, var(--gradient-from), var(--gradient-to));
854
+ }
855
+ .gradient-linear-r { /* para a direita */
856
+ background-image: linear-gradient(90deg, var(--gradient-from), var(--gradient-to));
857
+ background-image: linear-gradient(90deg in oklch, var(--gradient-from), var(--gradient-to));
858
+ }
859
+ .gradient-linear-l { /* para a esquerda */
860
+ background-image: linear-gradient(270deg, var(--gradient-from), var(--gradient-to));
861
+ background-image: linear-gradient(270deg in oklch, var(--gradient-from), var(--gradient-to));
862
+ }
863
+ .gradient-linear-br { /* diagonal ↘ (padrão) */
864
+ background-image: linear-gradient(135deg, var(--gradient-from), var(--gradient-to));
865
+ background-image: linear-gradient(135deg in oklch, var(--gradient-from), var(--gradient-to));
866
+ }
867
+ .gradient-linear-tr { /* diagonal ↗ */
868
+ background-image: linear-gradient(45deg, var(--gradient-from), var(--gradient-to));
869
+ background-image: linear-gradient(45deg in oklch, var(--gradient-from), var(--gradient-to));
870
+ }
871
+ .gradient-linear-bl { /* diagonal ↙ */
872
+ background-image: linear-gradient(225deg, var(--gradient-from), var(--gradient-to));
873
+ background-image: linear-gradient(225deg in oklch, var(--gradient-from), var(--gradient-to));
874
+ }
875
+ .gradient-linear-tl { /* diagonal ↖ */
876
+ background-image: linear-gradient(315deg, var(--gradient-from), var(--gradient-to));
877
+ background-image: linear-gradient(315deg in oklch, var(--gradient-from), var(--gradient-to));
878
+ }
879
+ /* Radial — brilho na cor do tema (--gradient-to) no ponto indicado. */
880
+ .gradient-glow-tr { /* canto superior direito */
881
+ background-image: radial-gradient(120% 120% at 100% 0%, var(--gradient-to), var(--gradient-from));
882
+ background-image: radial-gradient(120% 120% at 100% 0% in oklch, var(--gradient-to), var(--gradient-from));
883
+ }
884
+ .gradient-glow-br { /* canto inferior direito */
885
+ background-image: radial-gradient(120% 120% at 100% 100%, var(--gradient-to), var(--gradient-from));
886
+ background-image: radial-gradient(120% 120% at 100% 100% in oklch, var(--gradient-to), var(--gradient-from));
887
+ }
888
+ .gradient-glow-tl { /* canto superior esquerdo */
889
+ background-image: radial-gradient(120% 120% at 0% 0%, var(--gradient-to), var(--gradient-from));
890
+ background-image: radial-gradient(120% 120% at 0% 0% in oklch, var(--gradient-to), var(--gradient-from));
891
+ }
892
+ .gradient-glow-bl { /* canto inferior esquerdo */
893
+ background-image: radial-gradient(120% 120% at 0% 100%, var(--gradient-to), var(--gradient-from));
894
+ background-image: radial-gradient(120% 120% at 0% 100% in oklch, var(--gradient-to), var(--gradient-from));
895
+ }
896
+ .gradient-glow-c { /* centro */
897
+ background-image: radial-gradient(90% 90% at 50% 50%, var(--gradient-to), var(--gradient-from));
898
+ background-image: radial-gradient(90% 90% at 50% 50% in oklch, var(--gradient-to), var(--gradient-from));
899
+ }
900
+ /* Compostos */
901
+ .gradient-spotlight { /* holofote à direita sobre a ponta de contraste (texto à esquerda) */
902
+ background-image: radial-gradient(60% 90% at 85% 55%, var(--gradient-to), transparent), linear-gradient(var(--gradient-from), var(--gradient-from));
903
+ background-image: radial-gradient(60% 90% at 85% 55% in oklch, var(--gradient-to), transparent), linear-gradient(var(--gradient-from), var(--gradient-from));
904
+ }
905
+ .gradient-mesh { /* malha com dois focos */
906
+ 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));
907
+ 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));
908
+ }
909
+ .gradient-band { /* faixa diagonal: ponta de contraste firme até 35% */
910
+ background-image: linear-gradient(135deg, var(--gradient-from) 0%, var(--gradient-from) 35%, var(--gradient-to) 100%);
911
+ background-image: linear-gradient(135deg in oklch, var(--gradient-from) 0%, var(--gradient-from) 35%, var(--gradient-to) 100%);
912
+ }
913
+ /* <<< cycle-gradients */
663
914
 
664
915
  /* === Base layer === */
665
916
  @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.34.0",
4
4
  "description": "Cycle Design System — UI component library by Fluencypass (produto)",
5
5
  "license": "MIT",
6
6
  "repository": {