@inchurch/matcha-theme 22.26.1 → 22.27.1

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.
@@ -860,6 +860,46 @@ a[matcha-icon-button] {
860
860
  // componente não precisa reafirmar nada aqui.
861
861
  }
862
862
 
863
+ // ── matcha-button COM TEXTO: auto-size do matcha-icon projetado ──────────────
864
+ // O icon-button (acima) e o matcha-button[icon] (icon-only, no bloco &[icon]) já escalavam o
865
+ // ícone; o botão com texto não escalava nada, então o matcha-icon caía no próprio default
866
+ // (--matcha-icon-size-md, 24px) — proporcional só de MD (40px) pra cima. Num tiny (28px, texto
867
+ // 11/14) sobrava um ícone de 24px.
868
+ //
869
+ // Escala igual à do icon-button: XS/tiny → 16 · SM/small → 20 · MD+ → 24 (o default do
870
+ // matcha-icon já é 24, então MD/LG/XL não precisam de regra).
871
+ //
872
+ // Duas diferenças deliberadas em relação ao icon-button:
873
+ // 1. `matcha-icon:not([size])` — aqui o ícone divide o botão com o texto, e um `size`
874
+ // explícito do consumidor é escolha legítima que deve continuar valendo. O auto-size só
875
+ // age quando ninguém decidiu.
876
+ // 2. sem `!important`, consequência do item 1: como a regra nem casa quando há `size`, não há
877
+ // disputa de especificidade contra a classe `.i-size-*` que o componente emite.
878
+ //
879
+ // `:not([icon])` e `:not([matcha-icon-button])` preservam os dois casos que já tinham
880
+ // tratamento próprio. O bloco icon-only usa `[icon]:not([icon="false"])`, então em teoria
881
+ // `icon="false"` é botão com texto e deveria entrar aqui; não há um único uso dessa forma no
882
+ // showcase nem no painel, e um seletor extra só para ela seria ruído.
883
+ button[matcha-button]:not([matcha-icon-button]):not([icon]),
884
+ a[matcha-button]:not([matcha-icon-button]):not([icon]) {
885
+ &[size="xs"] matcha-icon:not([size]),
886
+ &[size="tiny"] matcha-icon:not([size]) {
887
+ font-size: var(--matcha-icon-size-sm, 16px);
888
+ width: var(--matcha-icon-size-sm, 16px);
889
+ height: var(--matcha-icon-size-sm, 16px);
890
+ line-height: var(--matcha-icon-size-sm, 16px);
891
+ }
892
+
893
+ // 20px não tem token (a escala de ícone vai 16/24/32) — mesmo literal que o icon-button usa.
894
+ &[size="sm"] matcha-icon:not([size]),
895
+ &[size="small"] matcha-icon:not([size]) {
896
+ font-size: 20px;
897
+ width: 20px;
898
+ height: 20px;
899
+ line-height: 20px;
900
+ }
901
+ }
902
+
863
903
  // ── Forced colors (Windows High Contrast) ──
864
904
  // Buttons precisam ser claramente acionáveis em high-contrast.
865
905
  @media (forced-colors: active) {
@@ -482,11 +482,116 @@
482
482
  // ── Command Palette: high-contrast em matcha-command-palette.scss ──
483
483
  }
484
484
 
485
+ // ── Nav Drawer ───────────────────────────────────────────────────────────────
486
+ // Navegação em drawer (Figma DSV3 node 19228:2014) — a forma da navegação quando
487
+ // não há espaço pro par rail + panel. Compõe matcha-drawer-container +
488
+ // matcha-drawer mode=over; aqui só a anatomia e o ritmo da árvore.
489
+
490
+ .matcha-nav-drawer {
491
+ // Cobre a viewport pra ancorar o backdrop do container (que é absolute/inset:0).
492
+ // Sem isso o scrim ficaria do tamanho do pai onde o drawer foi declarado.
493
+ position: fixed;
494
+ inset: 0;
495
+ z-index: var(--matcha-nav-drawer-z, 1000);
496
+ // Fechado não pode capturar clique da página que está por baixo.
497
+ pointer-events: none;
498
+
499
+ &.matcha-nav-drawer--opened {
500
+ pointer-events: auto;
501
+ }
502
+
503
+ // Contained — ancora no ancestral posicionado em vez da viewport. Preview e
504
+ // embed (playground da doc dentro de um frame de phone). Mesmo cenário que o
505
+ // matcha-drawer já reconhece no max-height do bottom sheet.
506
+ &.matcha-nav-drawer--contained {
507
+ position: absolute;
508
+ }
509
+
510
+ // O container tem bg opaco próprio (é feito pra envolver a app). Aqui ele é só
511
+ // âncora de posicionamento — opaco cobriria a página inteira mesmo fechado.
512
+ .matcha-drawer-container {
513
+ height: 100%;
514
+ background-color: transparent;
515
+ }
516
+
517
+ // Ritmo dos slots: a navegação define o próprio (Figma), não o padding 20/20
518
+ // genérico do drawer. As CSS vars existem pra isso — sem !important.
519
+ matcha-drawer {
520
+ --drawer-pad-x: var(--matcha-space-150, 12px);
521
+ --drawer-pad-y: var(--matcha-space-150, 12px);
522
+ }
523
+
524
+ // Header — brand à esquerda, close à direita (space-between vem do slot).
525
+ .matcha-nav-drawer__brand {
526
+ display: flex;
527
+ align-items: center;
528
+ min-width: 0;
529
+ gap: var(--matcha-space-100, 8px);
530
+ }
531
+
532
+ // Busca — largura total, logo abaixo do header e antes da árvore.
533
+ .matcha-nav-drawer__search {
534
+ display: block;
535
+ width: 100%;
536
+ flex-shrink: 0;
537
+
538
+ > * {
539
+ width: 100%;
540
+ }
541
+ }
542
+
543
+ // Árvore de navegação.
544
+ .matcha-nav-drawer__items {
545
+ display: flex;
546
+ flex-direction: column;
547
+ align-items: stretch;
548
+ gap: var(--matcha-space-050, 4px);
549
+ width: 100%;
550
+ }
551
+
552
+ // Hierarquia de 3 níveis. O matcha-nav-item só tem UM flag de indentação
553
+ // (`indented`), reservado ao nível 3 — que também é o único que o Figma
554
+ // permite sem ícone/chevron. O recuo do nível 2 vem daqui, do container,
555
+ // pra não sobrecarregar o contrato público do nav-item nem mexer no desktop.
556
+ //
557
+ // 24px = ícone (16) + gap (8) do row do módulo. Isso alinha o label do filho
558
+ // com o label do pai, formando uma coluna de texto. Com menos que isso o filho
559
+ // renderiza à ESQUERDA do label do pai (o pai tem ícone, o filho não) e a
560
+ // hierarquia lê invertida. O nível 3 soma os 24 do `indented` por cima.
561
+ .matcha-nav-drawer__items > .matcha-nav-item > .matcha-nav-item__children {
562
+ padding-inline-start: var(--matcha-space-300, 24px);
563
+ }
564
+
565
+ // Footer — lista de itens empilhada. O slot do drawer é feito pra botões de
566
+ // ação (row, alinhado à direita); a navegação precisa do oposto.
567
+ .matcha-drawer__slot--footer > * {
568
+ flex-direction: column;
569
+ align-items: stretch;
570
+ justify-content: flex-start;
571
+ gap: var(--matcha-space-025, 2px);
572
+ }
573
+
574
+ .matcha-nav-drawer__footer {
575
+ display: flex;
576
+ flex-direction: column;
577
+ align-items: stretch;
578
+ gap: var(--matcha-space-025, 2px);
579
+ width: 100%;
580
+ }
581
+
582
+ // O wrapper do slot existe sempre (é do template), então o :has() do drawer
583
+ // não consegue esconder o footer vazio sozinho — a checagem real é esta.
584
+ .matcha-drawer__slot--footer:not(:has(matcha-nav-drawer-footer)) {
585
+ display: none;
586
+ }
587
+ }
588
+
485
589
  // ── Print ──────────────────────────────────────────────────────────────────
486
590
  // Convenção DS: chrome de navegação some em impressão — conteúdo full-page.
487
591
  @media print {
488
592
  .matcha-nav-rail,
489
- .matcha-nav-panel {
593
+ .matcha-nav-panel,
594
+ .matcha-nav-drawer {
490
595
  display: none !important;
491
596
  }
492
597
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inchurch/matcha-theme",
3
- "version": "22.26.1",
3
+ "version": "22.27.1",
4
4
  "description": "Themes for matcha-design-system",
5
5
  "main": "main.scss",
6
6
  "scripts": {