zark-design 3.2.0 → 3.3.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zark-design",
3
- "version": "3.2.0",
3
+ "version": "3.3.0",
4
4
  "description": "Design system scaffolder anti-cara-de-IA. `npx zark-design init` gera um DS completo a partir da sua cor primária (paleta 50→900 via HSL) ou usa o preset ZARK. Regras explícitas pra IA: sem pill, sem rounded extremo, sem travessão em copy, sem brand color dominante, sem glow/shine/gradiente, botões fiéis aos padrões canônicos. Inclui paleta validada de data viz (8 slots categoricos CVD-safe, sequential, diverging, status) + receitas de estados (skeleton, tooltip, tabela, meter, sparkline). HTML + JSX side-by-side. Dark mode nativo. Sem dependência runtime.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -472,6 +472,246 @@ Quando a IA gera **labels de botão, mensagens, placeholders, títulos**:
472
472
 
473
473
  ---
474
474
 
475
+ ## Componentes avançados (v3.3)
476
+
477
+ > Padrões maiores, derivados de referências externas de qualidade e adaptados pra identidade ZARK. Todos ficam em `components.css` e podem ser usados direto em HTML puro.
478
+
479
+ ### 1. UserDropdown (`.zk-user-menu`)
480
+
481
+ Menu de usuário rico com avatar trigger, header (avatar + nome + username + status badge), grupos separados por hairline, itens com ícone + label + right-content (badge, avatar, ícone).
482
+
483
+ ```html
484
+ <div class="zk-user-menu">
485
+ <button class="zk-user-menu-trigger">
486
+ <img src="avatar.jpg" alt="Voce"/>
487
+ </button>
488
+
489
+ <div class="zk-user-menu-panel">
490
+ <div class="head">
491
+ <div class="avatar"><img src="avatar.jpg" alt=""/></div>
492
+ <div class="who">
493
+ <div class="name">Maycon Jordan</div>
494
+ <div class="handle">@mayconj</div>
495
+ </div>
496
+ <span class="status-badge online">Online</span>
497
+ </div>
498
+
499
+ <div class="zk-user-menu-sep"></div>
500
+
501
+ <div class="zk-user-menu-group">
502
+ <button class="zk-user-menu-item">
503
+ <span class="icon"><svg viewBox="0 0 24 24"><circle cx="12" cy="8" r="4"/><path d="M4 20c0-4 4-6 8-6s8 2 8 6"/></svg></span>
504
+ <span class="label">Seu perfil</span>
505
+ </button>
506
+ <button class="zk-user-menu-item">
507
+ <span class="icon"><svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="3"/><path d="M12 3v3M12 18v3M3 12h3M18 12h3"/></svg></span>
508
+ <span class="label">Preferências</span>
509
+ </button>
510
+ </div>
511
+
512
+ <div class="zk-user-menu-sep"></div>
513
+
514
+ <div class="zk-user-menu-group">
515
+ <button class="zk-user-menu-item is-brand">
516
+ <span class="icon"><svg viewBox="0 0 24 24"><polygon points="12 2 15 9 22 9 17 14 19 21 12 17 5 21 7 14 2 9 9 9 12 2"/></svg></span>
517
+ <span class="label">Upgrade Pro</span>
518
+ <span class="badge-off">20% off</span>
519
+ </button>
520
+ </div>
521
+
522
+ <div class="zk-user-menu-sep"></div>
523
+
524
+ <div class="zk-user-menu-group">
525
+ <button class="zk-user-menu-item is-danger">
526
+ <span class="icon"><svg viewBox="0 0 24 24"><path d="M9 3v18M15 3v18M3 9h18M3 15h18"/></svg></span>
527
+ <span class="label">Sair</span>
528
+ </button>
529
+ </div>
530
+ </div>
531
+ </div>
532
+ ```
533
+
534
+ **Regras:** avatar circular sempre (50%). Status badge mono uppercase raio-xs. Sem backdrop-blur, sem drop-shadow-xl. Grupos separados por hairline `--line-100`.
535
+
536
+ **Interação:** abre no click do trigger via JS (toggle da classe `.is-open` na panel, ou lib de headless UI se em React). CSS já cobre estados hover + focus.
537
+
538
+ ### 2. ToolbarDock (`.zk-dock`)
539
+
540
+ Dock flutuante estilo Vercel-inspired: pill horizontal com ícones circulares, badges de notificação, botões de toggle. Versão light (default) e dark (`.zk-dock.dark`).
541
+
542
+ ```html
543
+ <!-- Dock light -->
544
+ <div class="zk-dock">
545
+ <button class="zk-dock-btn" aria-label="Comentar">
546
+ <svg viewBox="0 0 24 24"><path d="M4 6h16v10H8l-4 4V6z"/></svg>
547
+ </button>
548
+ <button class="zk-dock-btn" aria-label="Inbox">
549
+ <svg viewBox="0 0 24 24"><path d="M4 4h16v10l-4 4H8l-4-4V4z"/></svg>
550
+ <span class="dot"></span>
551
+ </button>
552
+ <div class="zk-dock-sep"></div>
553
+ <button class="zk-dock-btn" aria-label="Compartilhar">
554
+ <svg viewBox="0 0 24 24"><circle cx="18" cy="5" r="3"/><circle cx="6" cy="12" r="3"/><circle cx="18" cy="19" r="3"/><line x1="8.5" y1="10.5" x2="15.5" y2="6.5"/><line x1="8.5" y1="13.5" x2="15.5" y2="17.5"/></svg>
555
+ </button>
556
+ <button class="zk-dock-btn" aria-label="Menu">
557
+ <svg viewBox="0 0 24 24"><line x1="4" y1="6" x2="20" y2="6"/><line x1="4" y1="12" x2="20" y2="12"/><line x1="4" y1="18" x2="20" y2="18"/></svg>
558
+ </button>
559
+ </div>
560
+
561
+ <!-- Dock dark (mesmo layout, adiciona .dark) -->
562
+ <div class="zk-dock dark">
563
+ <!-- mesmos botões -->
564
+ </div>
565
+ ```
566
+
567
+ **Regras:** container `--r-lg` (8px), **nunca pill 999px**. Ícones 18px em botão 32x32 com `--r-md`. Notification dot 6px em brand-500 com border do surface. Separador vertical hairline. Sem backdrop-blur decorativo.
568
+
569
+ **Extensão:** pra ter collapse animado + tooltip rail que desliza (como o Vercel-style original), embrulhe o dock num React Motion. Comportamento é opcional; visual estático já dá o benefício.
570
+
571
+ ### 3. ChartCard (`.zk-chart-card`)
572
+
573
+ Card 356px com viz area de 180px em cima + body embaixo. Barras SVG mudam de altura no hover (CSS transitions). Grid sutil hairline com radial mask.
574
+
575
+ ```html
576
+ <div class="zk-chart-card">
577
+ <div class="zk-chart-card-viz">
578
+ <div class="tags">
579
+ <span class="tag"><span class="dot" style="background:var(--viz-cat-1)"></span>+15,2%</span>
580
+ <span class="tag"><span class="dot" style="background:var(--viz-cat-8)"></span>+18,7%</span>
581
+ </div>
582
+ <svg viewBox="0 0 356 180">
583
+ <!-- barras: on hover expandem via CSS transition (defina y/height diferentes em .zk-chart-card:hover rect) -->
584
+ <rect x="40" y="110" width="15" height="20" fill="var(--viz-cat-8)" rx="2"/>
585
+ <rect x="60" y="90" width="15" height="20" fill="var(--viz-cat-1)" rx="2"/>
586
+ <rect x="80" y="70" width="15" height="40" fill="var(--viz-cat-1)" rx="2"/>
587
+ <rect x="100" y="80" width="15" height="30" fill="var(--viz-cat-1)" rx="2"/>
588
+ <rect x="120" y="110" width="15" height="30" fill="var(--viz-cat-8)" rx="2"/>
589
+ <rect x="140" y="60" width="15" height="50" fill="var(--viz-cat-1)" rx="2"/>
590
+ <rect x="160" y="80" width="15" height="30" fill="var(--viz-cat-1)" rx="2"/>
591
+ <rect x="180" y="110" width="15" height="20" fill="var(--viz-cat-8)" rx="2"/>
592
+ </svg>
593
+ </div>
594
+ <div class="zk-chart-card-body">
595
+ <div class="title">Novos leads</div>
596
+ <div class="desc">Últimos 7 dias · 142 no total</div>
597
+ </div>
598
+ </div>
599
+ ```
600
+
601
+ **Regras:** raio `--r-xl` (12px), hairline, shadow-sm. Cores das barras SEMPRE via `--viz-cat-*` (nunca hardcode). Grid pattern sutil (`--line-100`) com radial mask. Transition ≤ 400ms.
602
+
603
+ **Anti-pattern (o que a referência tinha e não copiamos):** gradient radial colorido de background, `backdrop-blur-sm` decorativo nos tags. Removidos: warm/hairline resolve.
604
+
605
+ ### 4. OrbitCard (`.zk-orbit-card`)
606
+
607
+ Card KPI com órbita de dots concêntricos, valor total no centro, breakdown de 2 métricas embaixo. Fade gradient neutro pra transitar viz → body.
608
+
609
+ ```html
610
+ <div class="zk-orbit-card">
611
+ <div class="zk-orbit-card-viz">
612
+ <svg viewBox="0 0 320 272">
613
+ <!-- Anel externo: 32 dots em raio 130 -->
614
+ <!-- Anel interno: 24 dots em raio 100 -->
615
+ <!-- (na prática você gera com JS ou pré-calcula os cx/cy) -->
616
+ <circle cx="160" cy="6" r="4" fill="var(--viz-cat-1)"/>
617
+ <circle cx="185.4" cy="9.1" r="4" fill="var(--viz-cat-1)"/>
618
+ <!-- ...restante dos dots... -->
619
+ <circle cx="160" cy="36" r="4" fill="var(--viz-cat-4)"/>
620
+ <!-- ...anel interno... -->
621
+ </svg>
622
+ <div class="center">
623
+ <div class="kicker">Total</div>
624
+ <div class="value">R$ 2.125</div>
625
+ </div>
626
+ <div class="fade"></div>
627
+ </div>
628
+ <div class="zk-orbit-card-body">
629
+ <div class="zk-orbit-card-metrics">
630
+ <div class="zk-orbit-card-metric">
631
+ <div class="head">
632
+ <div class="bar" style="background:var(--viz-cat-1)"></div>
633
+ <div class="label">Bônus</div>
634
+ </div>
635
+ <div class="value">R$ 1.250</div>
636
+ <div class="delta">+15,2%</div>
637
+ </div>
638
+ <div class="zk-orbit-card-metric">
639
+ <div class="head">
640
+ <div class="bar" style="background:var(--viz-cat-4)"></div>
641
+ <div class="label">Incentivos</div>
642
+ </div>
643
+ <div class="value">R$ 875</div>
644
+ <div class="delta">+8,7%</div>
645
+ </div>
646
+ </div>
647
+ <button class="btn btn-secondary btn-md" style="width:100%">Ver detalhes</button>
648
+ </div>
649
+ </div>
650
+ ```
651
+
652
+ **Regras:** dots via `--viz-cat-*` (blue + green por padrão). Valor central em display font (Space Grotesk), `--fs-4xl`. Fade usa gradient neutro (`transparent → var(--surface)`), **nunca cor colorida**. Botão inferior é `.btn-secondary` (não inflado, não gigante).
653
+
654
+ **Anti-pattern:** a referência usava `backdrop-blur-[2px]`, `bg-blue-400/10`, `bg-green-400/10` como decoração. Substituímos por dots com `opacity: 0.6` e fade gradient neutro. Efeito visual similar, cara-de-IA removido.
655
+
656
+ ### 5. WheelPicker (`.zk-wheel-picker`)
657
+
658
+ Radial time picker: input central redondo + wheel de 8 wedges com atalhos de +/- tempo. Wheel aparece no hover, some quando o input ganha foco (deixa você digitar).
659
+
660
+ ```html
661
+ <div class="zk-wheel-picker">
662
+ <!-- Wheel de wedges (aparece no hover) -->
663
+ <div class="zk-wheel-picker-wheel">
664
+ <svg viewBox="0 0 360 360">
665
+ <!-- 4 wedges positivos (top) -->
666
+ <g class="wedge-group">
667
+ <path class="wedge pos" d="M180 180 L180 20 A160 160 0 0 1 293 67 Z"/>
668
+ <text class="wedge-label pos" x="235" y="45">+2h</text>
669
+ </g>
670
+ <g class="wedge-group">
671
+ <path class="wedge pos" d="M180 180 L293 67 A160 160 0 0 1 340 180 Z"/>
672
+ <text class="wedge-label pos" x="315" y="115">+1h</text>
673
+ </g>
674
+ <g class="wedge-group">
675
+ <path class="wedge pos" d="M180 180 L340 180 A160 160 0 0 1 293 293 Z"/>
676
+ <text class="wedge-label pos" x="315" y="245">+30m</text>
677
+ </g>
678
+ <g class="wedge-group">
679
+ <path class="wedge pos" d="M180 180 L293 293 A160 160 0 0 1 180 340 Z"/>
680
+ <text class="wedge-label pos" x="235" y="315">+15m</text>
681
+ </g>
682
+ <!-- 4 wedges negativos (bottom) -->
683
+ <g class="wedge-group">
684
+ <path class="wedge" d="M180 180 L180 340 A160 160 0 0 1 67 293 Z"/>
685
+ <text class="wedge-label" x="125" y="315">-15m</text>
686
+ </g>
687
+ <g class="wedge-group">
688
+ <path class="wedge" d="M180 180 L67 293 A160 160 0 0 1 20 180 Z"/>
689
+ <text class="wedge-label" x="45" y="245">-30m</text>
690
+ </g>
691
+ <g class="wedge-group">
692
+ <path class="wedge" d="M180 180 L20 180 A160 160 0 0 1 67 67 Z"/>
693
+ <text class="wedge-label" x="45" y="115">-1h</text>
694
+ </g>
695
+ <g class="wedge-group">
696
+ <path class="wedge" d="M180 180 L67 67 A160 160 0 0 1 180 20 Z"/>
697
+ <text class="wedge-label" x="125" y="45">-2h</text>
698
+ </g>
699
+ </svg>
700
+ </div>
701
+
702
+ <!-- Input central -->
703
+ <div class="zk-wheel-picker-input">
704
+ <input type="text" value="09:00" placeholder="HH:MM"/>
705
+ </div>
706
+ </div>
707
+ ```
708
+
709
+ **Regras:** input central em `--r-md` (**nunca pill 999px** como a referência tinha). Wheel wedges com stroke da cor `--paper` pra criar gaps visuais. `.wedge.pos` usa `--brand-*`, `.wedge` neutra usa `--ink-*`. Font do valor em display font (Space Grotesk), `--fs-2xl`. Sem drop-shadow-xl.
710
+
711
+ **Interação:** wheel aparece via CSS `.zk-wheel-picker:hover` (opacity + scale + rotate). Sem lib. Pra ligar o click de cada wedge ao valor do input, adicione JS handler que ajusta minutos.
712
+
713
+ ---
714
+
475
715
  ## Data viz (gráficos, KPIs, tabelas)
476
716
 
477
717
  > Regras derivadas de método validado. Se você é IA gerando dashboard, siga na ordem abaixo. Cor vem por último.
@@ -164,7 +164,8 @@ html, body {
164
164
  text-rendering: optimizeLegibility;
165
165
  }
166
166
  ::selection { background: var(--brand-200); color: var(--ink-700); }
167
- a { color: inherit; }
167
+ a { color: inherit; text-decoration: none; }
168
+ a:hover { text-decoration: none; }
168
169
  button { font-family: inherit; }
169
170
 
170
171
  /* ============================================================