@adatechnology/notification-ui 0.1.0-rc.5 → 0.1.0-rc.7

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/styles.css"],"sourcesContent":["/**\n * Copyright (c) 2026 Ada Technology. MIT License.\n *\n * O pacote não tem cor própria (regra de módulos plugáveis §4.1): tudo sai de custom properties\n * com fallback neutro. O host sobrescreve `--adn-*` no escopo dele e a mesma tela ganha a cara do\n * produto — sem fork, sem prop de cor, sem valor hexadecimal aqui dentro que não seja fallback.\n */\n\n.adn-bell,\n.adn-list,\n.adn-preferences,\n.adn-workspace,\n.adn-settings {\n --adn-color-surface: var(--adn-surface, #ffffff);\n --adn-color-text: var(--adn-text, #111827);\n --adn-color-muted: var(--adn-muted, #6b7280);\n --adn-color-accent: var(--adn-accent, #3b82f6);\n --adn-color-danger: var(--adn-danger, #dc2626);\n --adn-color-border: var(--adn-border, #e5e7eb);\n --adn-radius: var(--adn-radius-md, 8px);\n /* Grade base de 4px (web.md §8) — múltiplos, nunca pixel mágico. */\n --adn-space-1: 4px;\n --adn-space-2: 8px;\n --adn-space-3: 12px;\n --adn-space-4: 16px;\n /* 44px: alvo mínimo de toque em mobile (web.md §10). */\n --adn-touch-target: 44px;\n\n color: var(--adn-color-text);\n font-family: inherit;\n}\n\n/* ── Sino ─────────────────────────────────────────────────────────────────────── */\n\n.adn-bell {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: var(--adn-touch-target);\n min-height: var(--adn-touch-target);\n padding: var(--adn-space-2);\n background: transparent;\n border: none;\n border-radius: var(--adn-radius);\n cursor: pointer;\n color: inherit;\n}\n\n.adn-bell:hover {\n background: var(--adn-color-border);\n}\n\n/* Foco visível é requisito de teclado — remover outline sem repor indicador quebra navegação. */\n.adn-bell:focus-visible,\n.adn-list__bulk-action:focus-visible,\n.adn-list__retry:focus-visible,\n.adn-list__load-more:focus-visible,\n.adn-item__main:focus-visible,\n.adn-item__action:focus-visible,\n.adn-preferences__save:focus-visible {\n outline: 2px solid var(--adn-color-accent);\n outline-offset: 2px;\n}\n\n.adn-bell__icon {\n width: 20px;\n height: 20px;\n /* Herda a cor do botão, para acompanhar hover e estado desabilitado sem regra extra. */\n color: currentColor;\n}\n\n.adn-bell__badge {\n position: absolute;\n top: var(--adn-space-1);\n right: var(--adn-space-1);\n min-width: 18px;\n padding: 0 var(--adn-space-1);\n background: var(--adn-color-danger);\n color: #ffffff;\n border-radius: 9999px;\n font-size: 11px;\n line-height: 18px;\n text-align: center;\n}\n\n/* ── Lista ────────────────────────────────────────────────────────────────────── */\n\n.adn-list {\n display: flex;\n flex-direction: column;\n background: var(--adn-color-surface);\n /* Mesma borda dos painéis de configuração: sem ela a lista flutuava sobre o fundo do host e o\n cabeçalho dela parecia ser da página. */\n border: 1px solid var(--adn-color-border);\n border-radius: var(--adn-radius);\n /* A linha e o cabeçalho vão até a borda; sem isto o canto reto vaza por cima do arredondado. */\n overflow: hidden;\n}\n\n.adn-list__header {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--adn-space-2);\n padding: var(--adn-space-3);\n border-bottom: 1px solid var(--adn-color-border);\n}\n\n.adn-list__heading {\n display: flex;\n align-items: center;\n gap: var(--adn-space-2);\n}\n\n.adn-list__title {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n}\n\n/* O contador estava só no sino; quem abre a tela pelo menu não passa pelo sino. */\n.adn-list__count {\n min-width: 20px;\n padding: 0 var(--adn-space-1);\n border-radius: 9999px;\n background: color-mix(in srgb, var(--adn-color-accent) 16%, transparent);\n color: var(--adn-color-accent);\n font-size: 0.75rem;\n font-weight: 600;\n line-height: 20px;\n text-align: center;\n /* Dígito de largura fixa: sem isto o contador muda de largura ao passar de 9 para 10. */\n font-variant-numeric: tabular-nums;\n}\n\n.adn-list__bulk-action,\n.adn-list__retry,\n.adn-list__load-more {\n display: inline-flex;\n align-items: center;\n gap: var(--adn-space-2);\n min-height: var(--adn-touch-target);\n padding: var(--adn-space-2) var(--adn-space-3);\n background: transparent;\n border: 1px solid var(--adn-color-border);\n border-radius: var(--adn-radius);\n color: var(--adn-color-accent);\n cursor: pointer;\n font: inherit;\n}\n\n.adn-list__bulk-action:disabled,\n.adn-list__load-more:disabled,\n.adn-item__action:disabled,\n.adn-preferences__save:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.adn-list__bulk-icon,\n.adn-list__retry-icon,\n.adn-preferences__save-icon {\n width: 16px;\n height: 16px;\n color: currentColor;\n}\n\n.adn-list__skeleton {\n display: flex;\n flex-direction: column;\n gap: var(--adn-space-3);\n padding: var(--adn-space-3);\n}\n\n.adn-list__skeleton-row {\n height: var(--adn-touch-target);\n border-radius: var(--adn-radius);\n background: linear-gradient(\n 90deg,\n color-mix(in srgb, var(--adn-color-muted) 10%, transparent),\n color-mix(in srgb, var(--adn-color-muted) 22%, transparent),\n color-mix(in srgb, var(--adn-color-muted) 10%, transparent)\n );\n background-size: 200% 100%;\n animation: adn-skeleton 1.4s ease-in-out infinite;\n}\n\n@keyframes adn-skeleton {\n from {\n background-position: 200% 0;\n }\n\n to {\n background-position: -200% 0;\n }\n}\n\n.adn-list__footer {\n display: flex;\n justify-content: center;\n padding: var(--adn-space-3);\n border-top: 1px solid var(--adn-color-border);\n}\n\n.adn-list__items {\n display: flex;\n flex-direction: column;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.adn-list__state {\n padding: var(--adn-space-4);\n color: var(--adn-color-muted);\n text-align: center;\n}\n\n.adn-list__state--error {\n color: var(--adn-color-danger);\n}\n\n.adn-list__state--empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--adn-space-2);\n}\n\n.adn-list__empty-icon {\n width: 32px;\n height: 32px;\n color: var(--adn-color-muted);\n}\n\n/* ── Item ─────────────────────────────────────────────────────────────────────── */\n\n.adn-item {\n display: flex;\n align-items: stretch;\n gap: var(--adn-space-2);\n border-bottom: 1px solid var(--adn-color-border);\n}\n\n.adn-item:last-child {\n border-bottom: none;\n}\n\n/* A linha inteira é clicável — o ponteiro sozinho não é aviso suficiente de que ela responde. */\n.adn-item:hover {\n background: color-mix(in srgb, var(--adn-color-muted) 8%, transparent);\n}\n\n.adn-item--unread {\n background: color-mix(in srgb, var(--adn-color-accent) 6%, transparent);\n}\n\n.adn-item--unread:hover {\n background: color-mix(in srgb, var(--adn-color-accent) 12%, transparent);\n}\n\n.adn-item__main {\n position: relative;\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: var(--adn-space-1);\n min-height: var(--adn-touch-target);\n padding: var(--adn-space-3);\n background: transparent;\n border: none;\n cursor: pointer;\n font: inherit;\n color: inherit;\n text-align: left;\n}\n\n.adn-item__heading {\n display: flex;\n align-items: baseline;\n gap: var(--adn-space-2);\n width: 100%;\n}\n\n.adn-item__title {\n flex: 1;\n min-width: 0;\n font-weight: 600;\n /* Título longo empurrava o horário para fora da linha. */\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.adn-item__time {\n flex-shrink: 0;\n color: var(--adn-color-muted);\n font-size: 0.75rem;\n font-variant-numeric: tabular-nums;\n}\n\n.adn-item__body {\n color: var(--adn-color-muted);\n font-size: 0.875rem;\n /* Duas linhas e reticências: corpo de aviso longo esticava a linha e desalinhava a lista. */\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n overflow: hidden;\n}\n\n.adn-item__unread-dot {\n flex-shrink: 0;\n align-self: center;\n width: 8px;\n height: 8px;\n background: var(--adn-color-accent);\n border-radius: 9999px;\n}\n\n.adn-item__actions {\n display: flex;\n align-items: center;\n gap: var(--adn-space-1);\n padding-right: var(--adn-space-2);\n}\n\n.adn-item__action {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: var(--adn-touch-target);\n min-height: var(--adn-touch-target);\n background: transparent;\n border: none;\n border-radius: var(--adn-radius);\n color: var(--adn-color-muted);\n cursor: pointer;\n}\n\n.adn-item__action:hover {\n background: var(--adn-color-border);\n color: var(--adn-color-text);\n}\n\n.adn-item__action--danger:hover {\n color: var(--adn-color-danger);\n}\n\n.adn-item__action-icon {\n width: 18px;\n height: 18px;\n color: currentColor;\n}\n\n/* ── Preferências ─────────────────────────────────────────────────────────────── */\n\n.adn-preferences {\n display: flex;\n flex-direction: column;\n gap: var(--adn-space-3);\n padding: var(--adn-space-3);\n background: var(--adn-color-surface);\n border-radius: var(--adn-radius);\n}\n\n.adn-preferences__title {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n}\n\n.adn-preferences__description,\n.adn-preferences__state {\n margin: 0;\n color: var(--adn-color-muted);\n font-size: 0.875rem;\n}\n\n.adn-preferences__items {\n display: flex;\n flex-direction: column;\n gap: var(--adn-space-2);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.adn-preferences__item {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--adn-space-2);\n min-height: var(--adn-touch-target);\n}\n\n.adn-preferences__label {\n display: inline-flex;\n align-items: center;\n gap: var(--adn-space-2);\n cursor: pointer;\n}\n\n.adn-preferences__checkbox {\n width: 18px;\n height: 18px;\n accent-color: var(--adn-color-accent);\n}\n\n.adn-preferences__channel,\n.adn-preferences__quiet-hours {\n color: var(--adn-color-muted);\n font-size: 0.875rem;\n}\n\n.adn-preferences__footer {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--adn-space-3);\n}\n\n.adn-preferences__save {\n display: inline-flex;\n align-items: center;\n gap: var(--adn-space-2);\n min-height: var(--adn-touch-target);\n padding: var(--adn-space-2) var(--adn-space-4);\n background: var(--adn-color-accent);\n border: none;\n border-radius: var(--adn-radius);\n color: #ffffff;\n cursor: pointer;\n font: inherit;\n}\n\n.adn-preferences__feedback {\n font-size: 0.875rem;\n color: var(--adn-color-muted);\n}\n\n.adn-preferences__feedback--error {\n color: var(--adn-color-danger);\n}\n\n/* ── Responsivo ───────────────────────────────────────────────────────────────── */\n\n/* Mobile-first: `min-width` para adicionar, nunca `max-` para remover (web.md §10). */\n@media (min-width: 640px) {\n .adn-list__header {\n padding: var(--adn-space-3) var(--adn-space-4);\n }\n\n .adn-item__main {\n padding: var(--adn-space-3) var(--adn-space-4);\n }\n}\n\n@media (prefers-color-scheme: dark) {\n /* Só as peças herdam o palpite por sistema — as telas compostas herdam do host, que é quem sabe. */\n .adn-bell,\n .adn-list,\n .adn-preferences {\n --adn-color-surface: var(--adn-surface, #111827);\n --adn-color-text: var(--adn-text, #f9fafb);\n --adn-color-muted: var(--adn-muted, #9ca3af);\n --adn-color-border: var(--adn-border, #374151);\n }\n}\n\n/* Respeita quem pediu menos movimento no sistema. */\n@media (prefers-reduced-motion: reduce) {\n .adn-bell,\n .adn-item__action,\n .adn-list__bulk-action {\n transition: none;\n }\n\n .adn-list__skeleton-row {\n animation: none;\n }\n}\n\n/* ---------------------------------------------------------------------------\n Telas compostas.\n\n SUPERFÍCIE TRANSPARENTE por padrão, e a borda é que delineia o card.\n\n As peças (`adn-list`, `adn-preferences`) pintavam fundo próprio, e passava porque o host as punha\n dentro de um `Card` dele — o fundo do host vencia. O workspace É o card, então o fundo do pacote\n aparece: com o sistema em modo escuro, o pacote pintava escuro enquanto o Tailwind do host\n renderizava claro. O pacote lê `prefers-color-scheme`, o host lê o tema DELE, e os dois discordam.\n Herdar é a única resposta que funciona nos dois casos; quem quiser fundo sólido define\n `--adn-surface`.\n\n Grid mobile-first: uma coluna, e a segunda entra a partir de 1024px. Área de toque de 44px nos\n controles (`web.md` §10) — checkbox nativo mede 13px, e configuração é tela que se ajusta no\n celular tanto quanto no monitor.\n --------------------------------------------------------------------------- */\n\n.adn-workspace,\n.adn-settings {\n display: flex;\n flex-direction: column;\n gap: var(--adn-space-4, 16px);\n /* `inherit` e não o token: a cor de texto do host já está no elemento pai. */\n color: inherit;\n}\n\n.adn-workspace__header,\n.adn-settings__header,\n.adn-settings__editor-header {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--adn-space-3, 12px);\n}\n\n.adn-workspace__title,\n.adn-settings__title {\n margin: 0;\n font-size: 1.25rem;\n font-weight: 600;\n}\n\n.adn-workspace__description,\n.adn-settings__description,\n.adn-settings__hint {\n /* `block` porque o hint é <span> dentro de <label>: inline, ele colava no rótulo e a tela mostrava\n \"TítuloO que aparece na lista\". */\n display: block;\n margin: 2px 0 0;\n font-size: 0.8125rem;\n color: var(--adn-color-muted);\n}\n\n.adn-workspace__actions {\n display: flex;\n align-items: center;\n gap: var(--adn-space-2, 8px);\n}\n\n.adn-button {\n display: inline-flex;\n align-items: center;\n gap: var(--adn-space-2, 8px);\n min-height: 44px;\n padding: 0 var(--adn-space-3, 12px);\n border-radius: var(--adn-radius);\n font-size: 0.875rem;\n font-weight: 500;\n text-decoration: none;\n color: inherit;\n background: transparent;\n border: 1px solid transparent;\n cursor: pointer;\n}\n\n.adn-button--outline {\n border-color: var(--adn-color-border);\n background: var(--adn-surface, transparent);\n}\n\n.adn-workspace__grid,\n.adn-settings__templates {\n display: grid;\n grid-template-columns: 1fr;\n gap: var(--adn-space-4, 16px);\n}\n\n.adn-workspace__grid--single {\n display: grid;\n grid-template-columns: 1fr;\n}\n\n@media (min-width: 1024px) {\n .adn-workspace__grid {\n grid-template-columns: 2fr 1fr;\n }\n\n .adn-settings__templates {\n grid-template-columns: 2fr 3fr;\n }\n\n /* Botão volta ao tamanho de mouse: 44px existe para o dedo. */\n .adn-button {\n min-height: 36px;\n }\n}\n\n.adn-settings__channels,\n.adn-settings__template-list,\n.adn-settings__editor {\n background: var(--adn-surface, transparent);\n border: 1px solid var(--adn-color-border);\n border-radius: var(--adn-radius);\n padding: var(--adn-space-4, 16px);\n}\n\n.adn-settings__section-title {\n margin: 0;\n font-size: 0.9375rem;\n font-weight: 600;\n}\n\n.adn-settings__category {\n margin-top: var(--adn-space-4, 16px);\n}\n\n.adn-settings__category-label {\n margin: 0;\n font-size: 0.875rem;\n font-weight: 500;\n}\n\n.adn-settings__channel-grid {\n display: grid;\n grid-template-columns: 1fr;\n gap: var(--adn-space-2, 8px);\n margin-top: var(--adn-space-2, 8px);\n}\n\n@media (min-width: 640px) {\n .adn-settings__channel-grid {\n grid-template-columns: 1fr 1fr;\n }\n}\n\n.adn-settings__channel {\n display: flex;\n align-items: flex-start;\n gap: var(--adn-space-2, 8px);\n padding: var(--adn-space-2, 8px);\n border: 1px solid var(--adn-color-border);\n border-radius: var(--adn-radius);\n cursor: pointer;\n /* Alvo de toque inteiro na linha, não só no quadradinho. */\n min-height: 44px;\n}\n\n.adn-settings__channel input {\n width: 20px;\n height: 20px;\n flex-shrink: 0;\n margin-top: 2px;\n accent-color: var(--adn-color-accent);\n}\n\n.adn-settings__channel-label {\n display: block;\n font-size: 0.875rem;\n font-weight: 500;\n}\n\n.adn-settings__template-list ul {\n list-style: none;\n margin: var(--adn-space-3, 12px) 0 0;\n padding: 0;\n}\n\n.adn-settings__template-list li + li {\n border-top: 1px solid var(--adn-color-border);\n}\n\n.adn-settings__template-list button {\n display: flex;\n align-items: center;\n gap: var(--adn-space-2, 8px);\n width: 100%;\n min-height: 44px;\n padding: var(--adn-space-2, 8px);\n background: transparent;\n border: 0;\n text-align: left;\n color: inherit;\n cursor: pointer;\n}\n\n.adn-settings__row--active {\n background: color-mix(in srgb, var(--adn-color-accent) 8%, transparent);\n}\n\n.adn-settings__row-main {\n flex: 1;\n min-width: 0;\n}\n\n.adn-settings__row-title,\n.adn-settings__row-body {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.adn-settings__row-title {\n font-size: 0.875rem;\n font-weight: 500;\n}\n\n.adn-settings__row-body,\n.adn-settings__version {\n font-size: 0.75rem;\n color: var(--adn-color-muted);\n}\n\n.adn-settings__badge {\n flex-shrink: 0;\n padding: 2px var(--adn-space-2, 8px);\n border-radius: 999px;\n font-size: 0.75rem;\n font-weight: 500;\n background: color-mix(in srgb, var(--adn-color-accent) 12%, transparent);\n}\n\n.adn-settings__field {\n display: block;\n margin-top: var(--adn-space-3, 12px);\n}\n\n.adn-settings__field-label {\n font-size: 0.875rem;\n font-weight: 500;\n}\n\n.adn-settings__field input,\n.adn-settings__field textarea {\n display: block;\n width: 100%;\n margin-top: 4px;\n padding: var(--adn-space-2, 8px);\n font: inherit;\n font-size: 0.875rem;\n color: inherit;\n background: var(--adn-surface, transparent);\n border: 1px solid var(--adn-color-border);\n border-radius: var(--adn-radius);\n}\n\n.adn-settings__preview {\n margin-top: var(--adn-space-3, 12px);\n padding: var(--adn-space-3, 12px);\n border: 1px solid var(--adn-color-border);\n border-radius: var(--adn-radius);\n background: color-mix(in srgb, var(--adn-color-muted) 8%, transparent);\n}\n\n.adn-settings__preview-title {\n margin: 0;\n font-size: 0.6875rem;\n font-weight: 600;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--adn-color-muted);\n}\n\n.adn-settings__preview-subject {\n margin: 6px 0 0;\n font-size: 0.875rem;\n font-weight: 500;\n}\n\n.adn-settings__preview-body {\n margin: 0;\n font-size: 0.875rem;\n /* Quebra de linha do template é conteúdo: o destinatário vê os parágrafos. */\n white-space: pre-wrap;\n}\n\n.adn-settings__error {\n margin-top: var(--adn-space-2, 8px);\n font-size: 0.875rem;\n font-weight: 500;\n color: var(--adn-color-danger);\n}\n\n.adn-settings__actions {\n display: flex;\n align-items: center;\n gap: var(--adn-space-2, 8px);\n margin-top: var(--adn-space-3, 12px);\n}\n\n.adn-settings__actions button {\n min-height: 44px;\n padding: 0 var(--adn-space-4, 16px);\n font: inherit;\n font-size: 0.875rem;\n font-weight: 500;\n color: #ffffff;\n background: var(--adn-color-accent);\n border: 0;\n border-radius: var(--adn-radius);\n cursor: pointer;\n}\n\n.adn-settings__actions button:disabled {\n opacity: 0.5;\n cursor: default;\n}\n\n/* ── Painel de templates: criação, remoção, variáveis e preview em dois viewports ───────────── */\n\n.adn-settings__list-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--adn-space-3, 12px);\n}\n\n.adn-settings__row {\n display: flex;\n align-items: stretch;\n gap: var(--adn-space-2, 8px);\n}\n\n.adn-settings__row > button:first-child {\n flex: 1;\n}\n\n.adn-settings__remove {\n color: var(--adn-color-danger);\n}\n\n.adn-settings__identity {\n display: grid;\n gap: var(--adn-space-3, 12px);\n grid-template-columns: 1fr;\n}\n\n.adn-settings__variables ul {\n display: flex;\n flex-wrap: wrap;\n gap: var(--adn-space-2, 8px);\n margin: var(--adn-space-2, 8px) 0 0;\n padding: 0;\n list-style: none;\n}\n\n.adn-settings__variable {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--adn-space-1, 4px);\n padding: var(--adn-space-2, 8px);\n border: 1px solid var(--adn-color-border);\n border-radius: var(--adn-radius);\n}\n\n.adn-settings__variable-name {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 0.8125rem;\n}\n\n.adn-settings__variable--used {\n border-color: var(--adn-color-accent);\n}\n\n/* Obrigatória que o texto ainda não usa — destaque, não erro: o salvamento passa. */\n.adn-settings__variable--missing {\n border-style: dashed;\n border-color: var(--adn-color-danger);\n}\n\n.adn-settings__preview-frames {\n display: flex;\n flex-wrap: wrap;\n gap: var(--adn-space-4, 16px);\n /* Os quadros têm largura fixa por definição; o scroll fica aqui dentro para a PÁGINA nunca\n rolar na horizontal (web.md §10). */\n overflow-x: auto;\n margin: 0;\n}\n\n.adn-settings__preview-frames figure {\n margin: 0;\n}\n\n.adn-settings__preview-frame {\n max-width: 100%;\n margin-top: var(--adn-space-2, 8px);\n padding: var(--adn-space-3, 12px);\n border: 1px solid var(--adn-color-border);\n border-radius: var(--adn-radius);\n background: color-mix(in srgb, var(--adn-color-muted) 8%, transparent);\n}\n\n.adn-settings__preview-warning {\n margin: var(--adn-space-1, 4px) 0 0;\n font-size: 0.75rem;\n color: var(--adn-color-danger);\n}\n\n@media (min-width: 640px) {\n .adn-settings__identity {\n grid-template-columns: 2fr 1fr 1fr;\n }\n}\n\n.adn-settings__tabs {\n display: flex;\n gap: var(--adn-space-2, 8px);\n border-bottom: 1px solid var(--adn-color-border);\n}\n\n.adn-settings__tab {\n padding: var(--adn-space-2, 8px) var(--adn-space-3, 12px);\n border: 0;\n border-bottom: 2px solid transparent;\n background: none;\n color: var(--adn-color-muted);\n}\n\n.adn-settings__tab--active {\n border-bottom-color: var(--adn-color-accent);\n color: var(--adn-color-text);\n}\n\n.adn-settings__category-channels {\n display: flex;\n flex-wrap: wrap;\n gap: var(--adn-space-3, 12px);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/styles.css"],"sourcesContent":["/**\n * Copyright (c) 2026 Ada Technology. MIT License.\n *\n * O pacote não tem cor própria (regra de módulos plugáveis §4.1): tudo sai de custom properties\n * com fallback neutro. O host sobrescreve `--adn-*` no escopo dele e a mesma tela ganha a cara do\n * produto — sem fork, sem prop de cor, sem valor hexadecimal aqui dentro que não seja fallback.\n */\n\n.adn-bell,\n.adn-list,\n.adn-preferences,\n.adn-workspace,\n.adn-settings {\n --adn-color-surface: var(--adn-surface, #ffffff);\n --adn-color-text: var(--adn-text, #0f172a);\n --adn-color-muted: var(--adn-muted, #64748b);\n --adn-color-accent: var(--adn-accent, #2f4bd8);\n --adn-color-danger: var(--adn-danger, #b91c1c);\n /* Aviso e um terceiro estado: nao reprova como o erro, mas nao passa como o normal. */\n --adn-color-warning: var(--adn-warning, #b45309);\n --adn-color-border: var(--adn-border, #e2e8f0);\n /**\n * Tres tons derivados, e nao mais um token para o host preencher: e o que faz a tela ter\n * hierarquia sem configuracao nenhuma. `color-mix` tinge com o proprio acento do host, entao\n * quem sobrescreve `--adn-accent` ganha a familia inteira de graca.\n */\n --adn-color-canvas: var(--adn-canvas, color-mix(in srgb, var(--adn-color-accent) 4%, #ffffff));\n --adn-color-accent-soft: color-mix(in srgb, var(--adn-color-accent) 8%, #ffffff);\n --adn-color-accent-line: color-mix(in srgb, var(--adn-color-accent) 28%, #ffffff);\n --adn-color-faint: color-mix(in srgb, var(--adn-color-muted) 60%, #ffffff);\n --adn-shadow-card: 0 1px 2px color-mix(in srgb, var(--adn-color-text) 6%, transparent);\n --adn-radius: var(--adn-radius-md, 12px);\n --adn-radius-sm: 8px;\n --adn-font-mono: ui-monospace, SFMono-Regular, Menlo, monospace;\n /* Grade base de 4px (web.md §8) — múltiplos, nunca pixel mágico. */\n --adn-space-1: 4px;\n --adn-space-2: 8px;\n --adn-space-3: 12px;\n --adn-space-4: 16px;\n --adn-space-5: 20px;\n --adn-space-6: 24px;\n /* 44px: alvo mínimo de toque em mobile (web.md §10). */\n --adn-touch-target: 44px;\n\n color: var(--adn-color-text);\n font-family: inherit;\n}\n\n/* ── Sino ─────────────────────────────────────────────────────────────────────── */\n\n.adn-bell {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: var(--adn-touch-target);\n min-height: var(--adn-touch-target);\n padding: var(--adn-space-2);\n background: transparent;\n border: none;\n border-radius: var(--adn-radius);\n cursor: pointer;\n color: inherit;\n}\n\n.adn-bell:hover {\n background: var(--adn-color-border);\n}\n\n/* Foco visível é requisito de teclado — remover outline sem repor indicador quebra navegação. */\n.adn-bell:focus-visible,\n.adn-list__bulk-action:focus-visible,\n.adn-list__retry:focus-visible,\n.adn-list__load-more:focus-visible,\n.adn-item__main:focus-visible,\n.adn-item__action:focus-visible,\n.adn-preferences__save:focus-visible {\n outline: 2px solid var(--adn-color-accent);\n outline-offset: 2px;\n}\n\n.adn-bell__icon {\n width: 20px;\n height: 20px;\n /* Herda a cor do botão, para acompanhar hover e estado desabilitado sem regra extra. */\n color: currentColor;\n}\n\n.adn-bell__badge {\n position: absolute;\n top: var(--adn-space-1);\n right: var(--adn-space-1);\n min-width: 18px;\n padding: 0 var(--adn-space-1);\n background: var(--adn-color-danger);\n color: #ffffff;\n border-radius: 9999px;\n font-size: 11px;\n line-height: 18px;\n text-align: center;\n}\n\n/* ── Lista ────────────────────────────────────────────────────────────────────── */\n\n.adn-list {\n display: flex;\n flex-direction: column;\n background: var(--adn-color-surface);\n /* Mesma borda dos painéis de configuração: sem ela a lista flutuava sobre o fundo do host e o\n cabeçalho dela parecia ser da página. */\n border: 1px solid var(--adn-color-border);\n border-radius: var(--adn-radius);\n /* A linha e o cabeçalho vão até a borda; sem isto o canto reto vaza por cima do arredondado. */\n overflow: hidden;\n}\n\n.adn-list__header {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--adn-space-2);\n padding: var(--adn-space-3);\n border-bottom: 1px solid var(--adn-color-border);\n}\n\n.adn-list__heading {\n display: flex;\n align-items: center;\n gap: var(--adn-space-2);\n}\n\n.adn-list__title {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n}\n\n/* O contador estava só no sino; quem abre a tela pelo menu não passa pelo sino. */\n.adn-list__count {\n min-width: 20px;\n padding: 0 var(--adn-space-1);\n border-radius: 9999px;\n background: color-mix(in srgb, var(--adn-color-accent) 16%, transparent);\n color: var(--adn-color-accent);\n font-size: 0.75rem;\n font-weight: 600;\n line-height: 20px;\n text-align: center;\n /* Dígito de largura fixa: sem isto o contador muda de largura ao passar de 9 para 10. */\n font-variant-numeric: tabular-nums;\n}\n\n.adn-list__bulk-action,\n.adn-list__retry,\n.adn-list__load-more {\n display: inline-flex;\n align-items: center;\n gap: var(--adn-space-2);\n min-height: var(--adn-touch-target);\n padding: var(--adn-space-2) var(--adn-space-3);\n background: transparent;\n border: 1px solid var(--adn-color-border);\n border-radius: var(--adn-radius);\n color: var(--adn-color-accent);\n cursor: pointer;\n font: inherit;\n}\n\n.adn-list__bulk-action:disabled,\n.adn-list__load-more:disabled,\n.adn-item__action:disabled,\n.adn-preferences__save:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.adn-list__bulk-icon,\n.adn-list__retry-icon,\n.adn-preferences__save-icon {\n width: 16px;\n height: 16px;\n color: currentColor;\n}\n\n.adn-list__skeleton {\n display: flex;\n flex-direction: column;\n gap: var(--adn-space-3);\n padding: var(--adn-space-3);\n}\n\n.adn-list__skeleton-row {\n height: var(--adn-touch-target);\n border-radius: var(--adn-radius);\n background: linear-gradient(\n 90deg,\n color-mix(in srgb, var(--adn-color-muted) 10%, transparent),\n color-mix(in srgb, var(--adn-color-muted) 22%, transparent),\n color-mix(in srgb, var(--adn-color-muted) 10%, transparent)\n );\n background-size: 200% 100%;\n animation: adn-skeleton 1.4s ease-in-out infinite;\n}\n\n@keyframes adn-skeleton {\n from {\n background-position: 200% 0;\n }\n\n to {\n background-position: -200% 0;\n }\n}\n\n.adn-list__footer {\n display: flex;\n justify-content: center;\n padding: var(--adn-space-3);\n border-top: 1px solid var(--adn-color-border);\n}\n\n.adn-list__items {\n display: flex;\n flex-direction: column;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.adn-list__state {\n padding: var(--adn-space-4);\n color: var(--adn-color-muted);\n text-align: center;\n}\n\n.adn-list__state--error {\n color: var(--adn-color-danger);\n}\n\n.adn-list__state--empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--adn-space-2);\n}\n\n.adn-list__empty-icon {\n width: 32px;\n height: 32px;\n color: var(--adn-color-muted);\n}\n\n/* ── Item ─────────────────────────────────────────────────────────────────────── */\n\n.adn-item {\n display: flex;\n align-items: stretch;\n gap: var(--adn-space-2);\n border-bottom: 1px solid var(--adn-color-border);\n}\n\n.adn-item:last-child {\n border-bottom: none;\n}\n\n/* A linha inteira é clicável — o ponteiro sozinho não é aviso suficiente de que ela responde. */\n.adn-item:hover {\n background: color-mix(in srgb, var(--adn-color-muted) 8%, transparent);\n}\n\n.adn-item--unread {\n background: color-mix(in srgb, var(--adn-color-accent) 6%, transparent);\n}\n\n.adn-item--unread:hover {\n background: color-mix(in srgb, var(--adn-color-accent) 12%, transparent);\n}\n\n.adn-item__main {\n position: relative;\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: var(--adn-space-1);\n min-height: var(--adn-touch-target);\n padding: var(--adn-space-3);\n background: transparent;\n border: none;\n cursor: pointer;\n font: inherit;\n color: inherit;\n text-align: left;\n}\n\n.adn-item__heading {\n display: flex;\n align-items: baseline;\n gap: var(--adn-space-2);\n width: 100%;\n}\n\n.adn-item__title {\n flex: 1;\n min-width: 0;\n font-weight: 600;\n /* Título longo empurrava o horário para fora da linha. */\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.adn-item__time {\n flex-shrink: 0;\n color: var(--adn-color-muted);\n font-size: 0.75rem;\n font-variant-numeric: tabular-nums;\n}\n\n.adn-item__body {\n color: var(--adn-color-muted);\n font-size: 0.875rem;\n /* Duas linhas e reticências: corpo de aviso longo esticava a linha e desalinhava a lista. */\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n overflow: hidden;\n}\n\n.adn-item__unread-dot {\n flex-shrink: 0;\n align-self: center;\n width: 8px;\n height: 8px;\n background: var(--adn-color-accent);\n border-radius: 9999px;\n}\n\n.adn-item__actions {\n display: flex;\n align-items: center;\n gap: var(--adn-space-1);\n padding-right: var(--adn-space-2);\n}\n\n.adn-item__action {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: var(--adn-touch-target);\n min-height: var(--adn-touch-target);\n background: transparent;\n border: none;\n border-radius: var(--adn-radius);\n color: var(--adn-color-muted);\n cursor: pointer;\n}\n\n.adn-item__action:hover {\n background: var(--adn-color-border);\n color: var(--adn-color-text);\n}\n\n.adn-item__action--danger:hover {\n color: var(--adn-color-danger);\n}\n\n.adn-item__action-icon {\n width: 18px;\n height: 18px;\n color: currentColor;\n}\n\n/* ── Preferências ─────────────────────────────────────────────────────────────── */\n\n.adn-preferences {\n display: flex;\n flex-direction: column;\n gap: var(--adn-space-3);\n padding: var(--adn-space-3);\n background: var(--adn-color-surface);\n border-radius: var(--adn-radius);\n}\n\n.adn-preferences__title {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n}\n\n.adn-preferences__description,\n.adn-preferences__state {\n margin: 0;\n color: var(--adn-color-muted);\n font-size: 0.875rem;\n}\n\n.adn-preferences__items {\n display: flex;\n flex-direction: column;\n gap: var(--adn-space-2);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.adn-preferences__item {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--adn-space-2);\n min-height: var(--adn-touch-target);\n}\n\n.adn-preferences__label {\n display: inline-flex;\n align-items: center;\n gap: var(--adn-space-2);\n cursor: pointer;\n}\n\n.adn-preferences__checkbox {\n width: 18px;\n height: 18px;\n accent-color: var(--adn-color-accent);\n}\n\n.adn-preferences__channel,\n.adn-preferences__quiet-hours {\n color: var(--adn-color-muted);\n font-size: 0.875rem;\n}\n\n.adn-preferences__footer {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--adn-space-3);\n}\n\n.adn-preferences__save {\n display: inline-flex;\n align-items: center;\n gap: var(--adn-space-2);\n min-height: var(--adn-touch-target);\n padding: var(--adn-space-2) var(--adn-space-4);\n background: var(--adn-color-accent);\n border: none;\n border-radius: var(--adn-radius);\n color: #ffffff;\n cursor: pointer;\n font: inherit;\n}\n\n.adn-preferences__feedback {\n font-size: 0.875rem;\n color: var(--adn-color-muted);\n}\n\n.adn-preferences__feedback--error {\n color: var(--adn-color-danger);\n}\n\n/* ── Responsivo ───────────────────────────────────────────────────────────────── */\n\n/* Mobile-first: `min-width` para adicionar, nunca `max-` para remover (web.md §10). */\n@media (min-width: 640px) {\n .adn-list__header {\n padding: var(--adn-space-3) var(--adn-space-4);\n }\n\n .adn-item__main {\n padding: var(--adn-space-3) var(--adn-space-4);\n }\n}\n\n@media (prefers-color-scheme: dark) {\n /* Só as peças herdam o palpite por sistema — as telas compostas herdam do host, que é quem sabe. */\n .adn-bell,\n .adn-list,\n .adn-preferences {\n --adn-color-surface: var(--adn-surface, #111827);\n --adn-color-text: var(--adn-text, #f9fafb);\n --adn-color-muted: var(--adn-muted, #9ca3af);\n --adn-color-border: var(--adn-border, #374151);\n }\n}\n\n/* Respeita quem pediu menos movimento no sistema. */\n@media (prefers-reduced-motion: reduce) {\n .adn-bell,\n .adn-item__action,\n .adn-list__bulk-action {\n transition: none;\n }\n\n .adn-list__skeleton-row {\n animation: none;\n }\n}\n\n/* ---------------------------------------------------------------------------\n Telas compostas.\n\n SUPERFÍCIE TRANSPARENTE por padrão, e a borda é que delineia o card.\n\n As peças (`adn-list`, `adn-preferences`) pintavam fundo próprio, e passava porque o host as punha\n dentro de um `Card` dele — o fundo do host vencia. O workspace É o card, então o fundo do pacote\n aparece: com o sistema em modo escuro, o pacote pintava escuro enquanto o Tailwind do host\n renderizava claro. O pacote lê `prefers-color-scheme`, o host lê o tema DELE, e os dois discordam.\n Herdar é a única resposta que funciona nos dois casos; quem quiser fundo sólido define\n `--adn-surface`.\n\n Grid mobile-first: uma coluna, e a segunda entra a partir de 1024px. Área de toque de 44px nos\n controles (`web.md` §10) — checkbox nativo mede 13px, e configuração é tela que se ajusta no\n celular tanto quanto no monitor.\n --------------------------------------------------------------------------- */\n\n.adn-workspace,\n.adn-settings {\n display: flex;\n flex-direction: column;\n gap: var(--adn-space-4, 16px);\n /* `inherit` e não o token: a cor de texto do host já está no elemento pai. */\n color: inherit;\n}\n\n.adn-workspace__header,\n.adn-settings__header,\n.adn-settings__editor-header {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--adn-space-3, 12px);\n}\n\n.adn-workspace__title,\n.adn-settings__title {\n margin: 0;\n font-size: 1.25rem;\n font-weight: 600;\n}\n\n.adn-workspace__description,\n.adn-settings__description,\n.adn-settings__hint {\n /* `block` porque o hint é <span> dentro de <label>: inline, ele colava no rótulo e a tela mostrava\n \"TítuloO que aparece na lista\". */\n display: block;\n margin: 2px 0 0;\n font-size: 0.8125rem;\n color: var(--adn-color-muted);\n}\n\n.adn-workspace__actions {\n display: flex;\n align-items: center;\n gap: var(--adn-space-2, 8px);\n}\n\n.adn-button {\n display: inline-flex;\n align-items: center;\n gap: var(--adn-space-2, 8px);\n min-height: 44px;\n padding: 0 var(--adn-space-3, 12px);\n border-radius: var(--adn-radius);\n font-size: 0.875rem;\n font-weight: 500;\n text-decoration: none;\n color: inherit;\n background: transparent;\n border: 1px solid transparent;\n cursor: pointer;\n}\n\n.adn-button--outline {\n border-color: var(--adn-color-border);\n background: var(--adn-surface, transparent);\n}\n\n.adn-workspace__grid,\n.adn-settings__templates {\n display: grid;\n grid-template-columns: 1fr;\n gap: var(--adn-space-4, 16px);\n}\n\n.adn-workspace__grid--single {\n display: grid;\n grid-template-columns: 1fr;\n}\n\n@media (min-width: 1024px) {\n .adn-workspace__grid {\n grid-template-columns: 2fr 1fr;\n }\n\n /**\n * Lista com largura FIXA, e nao uma fracao.\n *\n * Com `2fr 3fr` o editor encolhia junto com a janela, e os dois quadros do preview — que tem\n * largura real, 600px e 375px — deixavam de caber lado a lado e empilhavam. Empilhados eles nao\n * comparam nada, que e a unica coisa que o preview duplo existe para fazer. A lista nao precisa\n * de mais de 320px; todo o resto vai para quem precisa.\n */\n .adn-settings__templates {\n grid-template-columns: 320px minmax(0, 1fr);\n }\n\n /* Botão volta ao tamanho de mouse: 44px existe para o dedo. */\n .adn-button {\n min-height: 36px;\n }\n}\n\n.adn-settings__channels,\n.adn-settings__template-list,\n.adn-settings__editor {\n background: var(--adn-surface, transparent);\n border: 1px solid var(--adn-color-border);\n border-radius: var(--adn-radius);\n padding: var(--adn-space-4, 16px);\n}\n\n.adn-settings__section-title {\n margin: 0;\n font-size: 0.9375rem;\n font-weight: 600;\n}\n\n.adn-settings__category {\n margin-top: var(--adn-space-4, 16px);\n}\n\n.adn-settings__category-label {\n margin: 0;\n font-size: 0.875rem;\n font-weight: 500;\n}\n\n.adn-settings__channel-grid {\n display: grid;\n grid-template-columns: 1fr;\n gap: var(--adn-space-2, 8px);\n margin-top: var(--adn-space-2, 8px);\n}\n\n@media (min-width: 640px) {\n .adn-settings__channel-grid {\n grid-template-columns: 1fr 1fr;\n }\n}\n\n.adn-settings__channel {\n display: flex;\n align-items: flex-start;\n gap: var(--adn-space-2, 8px);\n padding: var(--adn-space-2, 8px);\n border: 1px solid var(--adn-color-border);\n border-radius: var(--adn-radius);\n cursor: pointer;\n /* Alvo de toque inteiro na linha, não só no quadradinho. */\n min-height: 44px;\n}\n\n.adn-settings__channel input {\n width: 20px;\n height: 20px;\n flex-shrink: 0;\n margin-top: 2px;\n accent-color: var(--adn-color-accent);\n}\n\n.adn-settings__channel-label {\n display: block;\n font-size: 0.875rem;\n font-weight: 500;\n}\n\n.adn-settings__template-list ul {\n list-style: none;\n margin: var(--adn-space-3, 12px) 0 0;\n padding: 0;\n}\n\n.adn-settings__template-list li + li {\n border-top: 1px solid var(--adn-color-border);\n}\n\n.adn-settings__template-list button {\n display: flex;\n align-items: center;\n gap: var(--adn-space-2, 8px);\n width: 100%;\n min-height: 44px;\n padding: var(--adn-space-2, 8px);\n background: transparent;\n border: 0;\n text-align: left;\n color: inherit;\n cursor: pointer;\n}\n\n.adn-settings__row--active {\n background: color-mix(in srgb, var(--adn-color-accent) 8%, transparent);\n}\n\n.adn-settings__row-main {\n flex: 1;\n min-width: 0;\n}\n\n.adn-settings__row-title,\n.adn-settings__row-body {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.adn-settings__row-title {\n font-size: 0.875rem;\n font-weight: 500;\n}\n\n.adn-settings__row-body,\n.adn-settings__version {\n font-size: 0.75rem;\n color: var(--adn-color-muted);\n}\n\n.adn-settings__badge {\n flex-shrink: 0;\n padding: 2px var(--adn-space-2, 8px);\n border-radius: 999px;\n font-size: 0.75rem;\n font-weight: 500;\n background: color-mix(in srgb, var(--adn-color-accent) 12%, transparent);\n}\n\n.adn-settings__field {\n display: block;\n margin-top: var(--adn-space-3, 12px);\n}\n\n.adn-settings__field-label {\n font-size: 0.875rem;\n font-weight: 500;\n}\n\n.adn-settings__field input,\n.adn-settings__field textarea {\n display: block;\n width: 100%;\n margin-top: 4px;\n padding: var(--adn-space-2, 8px);\n font: inherit;\n font-size: 0.875rem;\n color: inherit;\n background: var(--adn-surface, transparent);\n border: 1px solid var(--adn-color-border);\n border-radius: var(--adn-radius);\n}\n\n.adn-settings__preview {\n margin-top: var(--adn-space-3, 12px);\n padding: var(--adn-space-3, 12px);\n border: 1px solid var(--adn-color-border);\n border-radius: var(--adn-radius);\n background: color-mix(in srgb, var(--adn-color-muted) 8%, transparent);\n}\n\n.adn-settings__preview-title {\n margin: 0;\n font-size: 0.6875rem;\n font-weight: 600;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--adn-color-muted);\n}\n\n.adn-settings__preview-subject {\n margin: 6px 0 0;\n font-size: 0.875rem;\n font-weight: 500;\n}\n\n.adn-settings__preview-body {\n margin: 0;\n font-size: 0.875rem;\n /* Quebra de linha do template é conteúdo: o destinatário vê os parágrafos. */\n white-space: pre-wrap;\n}\n\n.adn-settings__error {\n margin-top: var(--adn-space-2, 8px);\n font-size: 0.875rem;\n font-weight: 500;\n color: var(--adn-color-danger);\n}\n\n.adn-settings__actions {\n display: flex;\n align-items: center;\n gap: var(--adn-space-2, 8px);\n margin-top: var(--adn-space-3, 12px);\n}\n\n.adn-settings__actions button {\n min-height: 44px;\n padding: 0 var(--adn-space-4, 16px);\n font: inherit;\n font-size: 0.875rem;\n font-weight: 500;\n color: #ffffff;\n background: var(--adn-color-accent);\n border: 0;\n border-radius: var(--adn-radius);\n cursor: pointer;\n}\n\n.adn-settings__actions button:disabled {\n opacity: 0.5;\n cursor: default;\n}\n\n/* ── Painel de templates: criação, remoção, variáveis e preview em dois viewports ───────────── */\n\n.adn-settings__list-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--adn-space-3, 12px);\n}\n\n.adn-settings__row {\n display: flex;\n align-items: stretch;\n gap: var(--adn-space-2, 8px);\n}\n\n.adn-settings__row > button:first-child {\n flex: 1;\n}\n\n.adn-settings__remove {\n color: var(--adn-color-danger);\n}\n\n.adn-settings__identity {\n display: grid;\n gap: var(--adn-space-3, 12px);\n grid-template-columns: 1fr;\n}\n\n.adn-settings__variables ul {\n display: flex;\n flex-wrap: wrap;\n gap: var(--adn-space-2, 8px);\n margin: var(--adn-space-2, 8px) 0 0;\n padding: 0;\n list-style: none;\n}\n\n.adn-settings__variable {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--adn-space-1, 4px);\n padding: var(--adn-space-2, 8px);\n border: 1px solid var(--adn-color-border);\n border-radius: var(--adn-radius);\n}\n\n.adn-settings__variable-name {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 0.8125rem;\n}\n\n.adn-settings__variable--used {\n border-color: var(--adn-color-accent);\n}\n\n/* Obrigatória que o texto ainda não usa — destaque, não erro: o salvamento passa. */\n.adn-settings__variable--missing {\n border-style: dashed;\n border-color: var(--adn-color-danger);\n}\n\n.adn-settings__preview-frames {\n display: flex;\n flex-wrap: wrap;\n gap: var(--adn-space-4, 16px);\n /* Os quadros têm largura fixa por definição; o scroll fica aqui dentro para a PÁGINA nunca\n rolar na horizontal (web.md §10). */\n overflow-x: auto;\n margin: 0;\n}\n\n.adn-settings__preview-frames figure {\n margin: 0;\n}\n\n.adn-settings__preview-frame {\n max-width: 100%;\n margin-top: var(--adn-space-2, 8px);\n padding: var(--adn-space-3, 12px);\n border: 1px solid var(--adn-color-border);\n border-radius: var(--adn-radius);\n background: color-mix(in srgb, var(--adn-color-muted) 8%, transparent);\n}\n\n.adn-settings__preview-warning {\n margin: var(--adn-space-1, 4px) 0 0;\n font-size: 0.75rem;\n color: var(--adn-color-danger);\n}\n\n@media (min-width: 640px) {\n .adn-settings__identity {\n grid-template-columns: 2fr 1fr 1fr;\n }\n}\n\n.adn-settings__tabs {\n display: flex;\n gap: var(--adn-space-2, 8px);\n border-bottom: 1px solid var(--adn-color-border);\n}\n\n.adn-settings__tab {\n padding: var(--adn-space-2, 8px) var(--adn-space-3, 12px);\n border: 0;\n border-bottom: 2px solid transparent;\n background: none;\n color: var(--adn-color-muted);\n}\n\n.adn-settings__tab--active {\n border-bottom-color: var(--adn-color-accent);\n color: var(--adn-color-text);\n}\n\n.adn-settings__category-channels {\n display: flex;\n flex-wrap: wrap;\n gap: var(--adn-space-3, 12px);\n}\n\n/* ── Acabamento da tela de templates ─────────────────────────────────────────────────────────\n *\n * O pacote passou a trazer o visual pronto, em vez de fallback neutro que so ficava apresentavel\n * depois de o host preencher os `--adn-*`. Nenhum produto tinha preenchido, entao a tela chegava\n * sem hierarquia em todos eles — mesmo problema, tres vezes. Tudo aqui deriva do acento: quem\n * sobrescreve `--adn-accent` continua ganhando a familia inteira.\n */\n\n.adn-settings__templates {\n align-items: start;\n}\n\n/* Sem `min-width: 0` a coluna cresce com o conteudo e o botao Remover vaza para fora dela. */\n.adn-settings__template-list,\n.adn-settings__editor {\n min-width: 0;\n}\n\n.adn-settings__template-list .adn-settings__row > button:first-child {\n min-width: 0;\n flex: 1 1 auto;\n}\n\n/* O cartao do editor ganha corpo: e onde a pessoa passa o tempo. */\n.adn-settings__editor {\n box-shadow: var(--adn-shadow-card);\n padding: 0;\n overflow: hidden;\n}\n\n.adn-settings__editor > * {\n padding-left: var(--adn-space-4, 16px);\n padding-right: var(--adn-space-4, 16px);\n}\n\n.adn-settings__editor-header {\n padding-top: var(--adn-space-4, 16px);\n padding-bottom: var(--adn-space-4, 16px);\n border-bottom: 1px solid var(--adn-color-border);\n}\n\n/* Rotulo de secao: maiuscula pequena separa blocos sem precisar de mais uma borda. */\n.adn-settings__section-title {\n font-size: 0.6875rem;\n font-weight: 600;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--adn-color-muted);\n}\n\n/* Empilhado: com titulo, explicacao e botao na mesma linha, a explicacao quebrava em tres linhas\n e empurrava o botao para fora do cartao numa coluna de 320px. */\n.adn-settings__list-header {\n flex-direction: column;\n align-items: stretch;\n gap: var(--adn-space-2, 8px);\n padding-bottom: var(--adn-space-3, 12px);\n}\n\n.adn-settings__list-header-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--adn-space-3, 12px);\n}\n\n/* Linha da lista: cartao proprio, e o selecionado se anuncia pela borda do acento. */\n.adn-settings__template-list ul {\n display: flex;\n flex-direction: column;\n gap: var(--adn-space-2, 8px);\n}\n\n.adn-settings__template-list li + li {\n border-top: 0;\n}\n\n.adn-settings__row > button:first-child {\n border: 1px solid var(--adn-color-border);\n border-radius: var(--adn-radius);\n background: var(--adn-color-surface);\n padding: var(--adn-space-3, 12px);\n text-align: left;\n}\n\n.adn-settings__row > button:first-child:hover {\n border-color: var(--adn-color-accent-line);\n}\n\n.adn-settings__row--active {\n border-color: var(--adn-color-accent) !important;\n box-shadow: var(--adn-shadow-card);\n}\n\n.adn-settings__row-title {\n font-family: var(--adn-font-mono);\n font-size: 0.8125rem;\n font-weight: 600;\n}\n\n.adn-settings__row-body {\n /* Duas linhas: o suficiente para reconhecer a mensagem, sem a lista virar um paredao. */\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n line-height: 1.45;\n}\n\n.adn-settings__badge {\n border: 1px solid var(--adn-color-accent-line);\n background: var(--adn-color-accent-soft);\n color: var(--adn-color-accent);\n border-radius: 999px;\n padding: 2px 8px;\n font-size: 0.6875rem;\n font-weight: 600;\n}\n\n.adn-settings__version {\n font-size: 0.6875rem;\n color: var(--adn-color-muted);\n font-variant-numeric: tabular-nums;\n}\n\n.adn-settings__new {\n white-space: nowrap;\n border: 0;\n border-radius: var(--adn-radius-sm);\n background: var(--adn-color-accent);\n color: #ffffff;\n font-weight: 500;\n padding: 7px 12px;\n}\n\n/**\n * `width: auto` desfaz o `width: 100%` da regra generica de botao da lista, que valia para o\n * Remover tambem: ele esticava para os 286px da coluna e espremia a linha de selecao em 26px.\n */\n/* Seletor composto de proposito: `.adn-settings__template-list button` tem especificidade maior\n que uma classe sozinha, e vencia o `width: auto` toda vez. */\n.adn-settings__template-list .adn-settings__remove {\n width: auto;\n flex: 0 0 auto;\n white-space: nowrap;\n align-self: stretch;\n border: 1px solid color-mix(in srgb, var(--adn-color-danger) 30%, #ffffff);\n border-radius: var(--adn-radius-sm);\n background: transparent;\n padding: 0 var(--adn-space-3, 12px);\n}\n\n.adn-settings__template-list .adn-settings__remove:hover {\n background: color-mix(in srgb, var(--adn-color-danger) 6%, transparent);\n}\n\n/* Variavel: chip com estado, nao link solto. */\n.adn-settings__variable {\n border-radius: var(--adn-radius-sm);\n background: var(--adn-color-surface);\n flex-direction: row;\n align-items: center;\n gap: var(--adn-space-2, 8px);\n}\n\n.adn-settings__variable:hover {\n border-color: var(--adn-color-accent);\n}\n\n.adn-settings__variable-name {\n font-family: var(--adn-font-mono);\n font-weight: 600;\n color: var(--adn-color-accent);\n}\n\n.adn-settings__variable--used {\n background: var(--adn-color-accent-soft);\n}\n\n/* Campos com altura de toque e foco visivel — o default do navegador some no cartao branco. */\n.adn-settings__field input,\n.adn-settings__field textarea,\n.adn-settings__field select {\n border: 1px solid color-mix(in srgb, var(--adn-color-border) 70%, var(--adn-color-muted));\n border-radius: var(--adn-radius-sm);\n padding: 9px 12px;\n font: inherit;\n color: inherit;\n background: var(--adn-color-surface);\n}\n\n.adn-settings__field input:focus-visible,\n.adn-settings__field textarea:focus-visible,\n.adn-settings__field select:focus-visible {\n outline: 2px solid var(--adn-color-accent);\n outline-offset: -1px;\n border-color: var(--adn-color-accent);\n}\n\n/**\n * O preview reduz para caber, e o rotulo diz a medida REAL.\n *\n * 600px + 375px nao cabem lado a lado dentro de um painel que ja tem barra lateral. Sem a reducao\n * os quadros quebram para baixo e a comparacao morre — entao a escala e o que preserva a unica\n * coisa que este preview faz: mostrar o corte que so acontece num dos dois.\n */\n.adn-settings__previews {\n background: var(--adn-color-canvas);\n border-top: 1px solid var(--adn-color-border);\n padding-top: var(--adn-space-4, 16px);\n padding-bottom: var(--adn-space-4, 16px);\n}\n\n.adn-settings__preview-frames {\n /* 0.52 e nao 0.62: a 0.62 os dois quadros somavam 673px num container de 654 e quebravam para\n baixo — empilhados eles nao comparam nada, que e a unica coisa que o preview duplo faz. */\n --adn-preview-scale: 0.52;\n align-items: flex-start;\n overflow: visible;\n}\n\n.adn-settings__preview-frame {\n border-radius: var(--adn-radius-sm);\n background: var(--adn-color-surface);\n width: var(--adn-preview-width, 600px);\n /**\n * `zoom`, e nao `transform: scale()`.\n *\n * `transform` desenha menor mas nao encolhe a caixa no layout: o quadro continuava reservando\n * 600px de largura e a altura inteira, deixando um rombo branco ao lado e embaixo — foi o que\n * apareceu na primeira montagem. `zoom` reduz de verdade, e as duas medidas acompanham sem\n * margem negativa para compensar.\n */\n zoom: var(--adn-preview-scale);\n}\n\n.adn-settings__preview-subject {\n font-weight: 600;\n}\n\n.adn-settings__preview-warning {\n font-weight: 500;\n}\n\n/* Rodape: a acao e a consequencia dela no mesmo lugar. */\n.adn-settings__actions {\n border-top: 1px solid var(--adn-color-border);\n background: var(--adn-color-canvas);\n padding-top: var(--adn-space-3, 12px);\n padding-bottom: var(--adn-space-3, 12px);\n display: flex;\n align-items: center;\n gap: var(--adn-space-3, 12px);\n}\n\n.adn-settings__actions button:first-child {\n border: 0;\n border-radius: var(--adn-radius-sm);\n background: var(--adn-color-accent);\n color: #ffffff;\n font-weight: 600;\n padding: 8px 16px;\n}\n\n.adn-settings__actions button:first-child:disabled {\n background: var(--adn-color-faint);\n color: #ffffff;\n}\n\n/* Abas: sublinhado do acento em vez de dois botoes iguais. */\n.adn-settings__tab {\n font-weight: 500;\n min-height: 40px;\n}\n\n.adn-settings__tab--active {\n font-weight: 600;\n}\n\n/* Politica de canal: cada assunto e uma linha, nao um amontoado. */\n.adn-settings__policies .adn-settings__category {\n border: 1px solid var(--adn-color-border);\n border-radius: var(--adn-radius);\n background: var(--adn-color-surface);\n padding: var(--adn-space-3, 12px) var(--adn-space-4, 16px);\n}\n\n.adn-settings__category-title {\n font-weight: 500;\n margin: 0 0 var(--adn-space-2, 8px);\n}\n\n/* ── Tema escuro ──────────────────────────────────────────────────────────────────────────── */\n\n.dark .adn-bell,\n.dark .adn-list,\n.dark .adn-preferences,\n.dark .adn-workspace,\n.dark .adn-settings {\n --adn-color-surface: var(--adn-surface, #0f172a);\n --adn-color-text: var(--adn-text, #e2e8f0);\n --adn-color-muted: var(--adn-muted, #94a3b8);\n --adn-color-border: var(--adn-border, #1e293b);\n --adn-color-canvas: var(--adn-canvas, #0b1220);\n --adn-color-accent-soft: color-mix(in srgb, var(--adn-color-accent) 22%, #0f172a);\n --adn-color-accent-line: color-mix(in srgb, var(--adn-color-accent) 45%, #0f172a);\n --adn-color-faint: color-mix(in srgb, var(--adn-color-muted) 40%, #0f172a);\n --adn-shadow-card: 0 1px 2px rgba(0, 0, 0, 0.4);\n}\n\n/* ── Molduras de preview por canal ───────────────────────────────────────────────────────────\n *\n * Ver `TemplatePreview.tsx` para o porquê: o enquadramento e o corte SAO a informacao. Estes\n * tamanhos sao os reais do canal, e o `zoom` do quadro reduz o conjunto para caber no painel.\n */\n\n.adn-preview-phone {\n border: 8px solid var(--adn-preview-bezel, #1e2532);\n overflow: hidden;\n background: #ffffff;\n}\n\n/* iOS e mais arredondado e mais largo; Android e mais reto e mais estreito. Nao e enfeite: a\n largura muda onde a linha quebra, e e por isso que os dois ficam lado a lado. */\n.adn-preview-phone--ios {\n width: 375px;\n border-radius: 34px;\n}\n\n.adn-preview-phone--android {\n width: 360px;\n border-radius: 18px;\n}\n\n.adn-preview-phone--dark { background: var(--adn-preview-lockscreen, #0b1220); }\n\n.adn-preview-phone__screen { min-height: 260px; display: flex; flex-direction: column; }\n\n.adn-preview-browser {\n width: 600px;\n border: 1px solid var(--adn-color-border);\n border-radius: 10px;\n overflow: hidden;\n background: #ffffff;\n}\n\n.adn-preview-browser__bar {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n background: var(--adn-preview-chrome, #f1f5f9);\n border-bottom: 1px solid var(--adn-color-border);\n}\n\n.adn-preview-browser__dot {\n width: 9px;\n height: 9px;\n border-radius: 999px;\n background: var(--adn-preview-chrome-dot, #cbd5e1);\n}\n\n.adn-preview-browser__address {\n flex: 1;\n margin-left: 8px;\n padding: 3px 10px;\n border-radius: 999px;\n background: #ffffff;\n border: 1px solid var(--adn-color-border);\n font-size: 11px;\n color: var(--adn-color-muted);\n}\n\n.adn-preview-mail { padding: 18px 20px; display: flex; flex-direction: column; gap: 12px; }\n.adn-preview-mail--compact { padding: 14px 16px; gap: 8px; }\n\n.adn-preview-mail__subject {\n font-size: 17px;\n font-weight: 600;\n line-height: 1.3;\n /* Duas linhas: o cliente de e-mail corta o assunto, e e ai que o limite do canal aparece. */\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.adn-preview-mail__from { display: flex; align-items: center; gap: 8px; font-size: 13px; }\n.adn-preview-mail__sender { font-weight: 500; }\n.adn-preview-mail__to { color: var(--adn-color-muted); }\n\n.adn-preview-mail__body {\n font-size: 15px;\n line-height: 1.6;\n color: var(--adn-preview-mail-text, #334155);\n white-space: pre-wrap;\n}\n\n.adn-preview-avatar {\n width: 26px;\n height: 26px;\n border-radius: 999px;\n background: var(--adn-color-accent);\n color: #ffffff;\n font-size: 12px;\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n text-transform: uppercase;\n flex-shrink: 0;\n}\n\n.adn-preview-avatar--small { width: 18px; height: 18px; font-size: 10px; }\n\n/* WhatsApp: papel de parede da conversa e balao recebido, com a ponta a esquerda. */\n.adn-preview-wa {\n flex: 1;\n padding: 16px 12px;\n background: var(--adn-preview-wa-wallpaper, #efeae2);\n display: flex;\n}\n\n.adn-preview-wa__bubble {\n position: relative;\n max-width: 85%;\n background: #ffffff;\n border-radius: 8px;\n border-top-left-radius: 0;\n padding: 8px 10px 6px;\n box-shadow: 0 1px 1px var(--adn-preview-wa-shadow, rgba(11, 20, 26, 0.13));\n align-self: flex-start;\n}\n\n.adn-preview-wa__text { font-size: 15px; line-height: 1.45; color: var(--adn-preview-wa-text, #111b21); white-space: pre-wrap; }\n.adn-preview-wa__time { font-size: 11px; color: var(--adn-preview-wa-time, #667781); text-align: right; margin-top: 2px; }\n\n/* SMS: sem assunto, sem formatacao — e o canal mais cru dos cinco. */\n.adn-preview-sms { flex: 1; padding: 16px 12px; background: #ffffff; display: flex; }\n\n.adn-preview-sms__bubble {\n max-width: 85%;\n background: var(--adn-preview-sms-bubble, #e9e9eb);\n color: var(--adn-preview-sms-text, #000000);\n border-radius: 18px;\n padding: 9px 13px;\n font-size: 15px;\n line-height: 1.4;\n white-space: pre-wrap;\n align-self: flex-start;\n}\n\n/* Push: tela bloqueada, e o corte de duas linhas que o sistema aplica. */\n.adn-preview-push {\n flex: 1;\n padding: 40px 12px 16px;\n background: var(--adn-preview-lockscreen-bg, linear-gradient(160deg, #172033, #0b1220));\n display: flex;\n align-items: flex-start;\n}\n\n.adn-preview-push__card {\n width: 100%;\n border-radius: 16px;\n padding: 10px 12px;\n background: var(--adn-preview-push-card, rgba(255, 255, 255, 0.92));\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n\n.adn-preview-push__app {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n color: var(--adn-preview-push-app, #4b5563);\n text-transform: uppercase;\n letter-spacing: 0.03em;\n}\n\n.adn-preview-push__time { margin-left: auto; text-transform: none; letter-spacing: 0; }\n.adn-preview-push__title { font-size: 14px; font-weight: 600; color: var(--adn-preview-push-title, #111827); }\n\n.adn-preview-push__body {\n font-size: 14px;\n line-height: 1.35;\n color: var(--adn-preview-push-body, #374151);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* Inbox: o cartao da propria lista de notificacoes do produto. */\n.adn-preview-inbox {\n width: 480px;\n display: flex;\n gap: 10px;\n padding: 14px 16px;\n background: var(--adn-color-surface);\n border: 1px solid var(--adn-color-border);\n border-radius: var(--adn-radius);\n}\n\n.adn-preview-inbox__dot {\n width: 8px;\n height: 8px;\n border-radius: 999px;\n background: var(--adn-color-accent);\n margin-top: 6px;\n flex-shrink: 0;\n}\n\n.adn-preview-inbox__text { display: flex; flex-direction: column; gap: 3px; }\n.adn-preview-inbox__title { font-size: 14px; font-weight: 600; }\n.adn-preview-inbox__body { font-size: 13px; line-height: 1.5; color: var(--adn-color-muted); white-space: pre-wrap; }\n\n/* SMS: o balao do Android e menos arredondado e tem a ponta presa no canto. */\n.adn-preview-phone--android .adn-preview-sms__bubble {\n border-radius: 16px;\n border-bottom-left-radius: 4px;\n background: var(--adn-preview-sms-bubble-android, #e8eaed);\n}\n\n/* Push: no Android o cartao e mais reto e o nome do app vem em caixa alta menor. */\n.adn-preview-phone--android .adn-preview-push__card {\n border-radius: 24px;\n}\n\n.adn-preview-phone--ios .adn-preview-push__card {\n border-radius: 14px;\n}\n\n.adn-preview-phone--android .adn-preview-push__title {\n font-weight: 500;\n}\n\n/* WhatsApp no Android usa raio menor no balao. */\n.adn-preview-phone--android .adn-preview-wa__bubble {\n border-radius: 6px;\n border-top-left-radius: 0;\n}\n\n/* ── Alinhamento dos campos ──────────────────────────────────────────────────────────────────\n *\n * Os campos vinham cada um com a sua altura e o seu espacamento porque `label`, `fieldset` e o\n * bloco de identidade eram estilizados em lugares diferentes. Uma so regra para todos: rotulo,\n * dica e controle na mesma pilha, com a mesma distancia — e a linha de baixo do controle bate\n * entre colunas vizinhas.\n */\n\n.adn-settings__field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin: 0;\n padding: 0;\n border: 0;\n min-width: 0;\n}\n\n.adn-settings__field-label {\n font-size: 0.8125rem;\n font-weight: 500;\n padding: 0;\n}\n\n/* A dica fica presa ao rotulo, e nao flutuando com o mesmo peso do campo. */\n.adn-settings__field .adn-settings__hint {\n margin: -2px 0 2px;\n line-height: 1.4;\n}\n\n/* Altura igual nos tres controles, senao a linha de baixo nao bate entre colunas. */\n.adn-settings__field input,\n.adn-settings__field select {\n min-height: 40px;\n}\n\n.adn-settings__field textarea {\n min-height: 120px;\n resize: vertical;\n line-height: 1.55;\n}\n\n/* Identidade: chave larga, canais e idioma ao lado, alinhados pelo TOPO — com `stretch` o bloco\n de canais esticava e empurrava os vizinhos. */\n.adn-settings__identity {\n align-items: start;\n gap: var(--adn-space-3, 12px);\n}\n\n@media (min-width: 640px) {\n .adn-settings__identity {\n grid-template-columns: minmax(0, 2fr) minmax(0, 2fr) minmax(0, 1fr);\n }\n}\n\n.adn-settings__channel-picker {\n display: flex;\n flex-wrap: wrap;\n gap: var(--adn-space-2, 8px);\n}\n\n.adn-settings__channel-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n min-height: 40px;\n padding: 0 12px;\n border: 1px solid var(--adn-color-border);\n border-radius: 999px;\n font-size: 0.8125rem;\n background: var(--adn-color-surface);\n cursor: pointer;\n}\n\n.adn-settings__channel-chip:hover {\n border-color: var(--adn-color-accent-line);\n}\n\n/* O chip marcado se anuncia inteiro, e nao so pelo quadradinho. */\n.adn-settings__channel-chip:has(input:checked) {\n border-color: var(--adn-color-accent);\n background: var(--adn-color-accent-soft);\n color: var(--adn-color-accent);\n font-weight: 500;\n}\n\n.adn-settings__channel-chip input {\n width: 15px;\n height: 15px;\n margin: 0;\n accent-color: var(--adn-color-accent);\n}\n\n/* Tres quadros lado a lado (navegador, iPhone, Android) somam mais que dois: a escala desce para\n caber sem quebrar a comparacao, que e a razao de eles ficarem juntos. */\n.adn-settings__preview-frames {\n --adn-preview-scale: 0.46;\n gap: var(--adn-space-3, 12px);\n}\n\n.adn-settings__preview-group {\n display: flex;\n flex-direction: column;\n gap: var(--adn-space-2, 8px);\n padding-top: var(--adn-space-3, 12px);\n}\n\n.adn-settings__preview-group + .adn-settings__preview-group {\n border-top: 1px dashed var(--adn-color-border);\n}\n\n.adn-settings__preview-channel {\n margin: 0;\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--adn-color-accent);\n}\n\n/* ── Aparelho completo ───────────────────────────────────────────────────────────────────────\n * Barra de status, recorte de camera e barra de gesto. Aqui a barra pintada e correta: isto e o\n * RETRATO de um aparelho, nao uma tela rodando num aparelho — sem ela o quadro nao se le como\n * celular.\n */\n\n.adn-preview-phone__screen {\n min-height: 260px;\n display: flex;\n flex-direction: column;\n position: relative;\n overflow: hidden;\n}\n\n.adn-preview-phone--ios .adn-preview-phone__screen { border-radius: 26px; }\n.adn-preview-phone--android .adn-preview-phone__screen { border-radius: 10px; }\n\n.adn-preview-status {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 16px 4px;\n font-size: 11px;\n font-weight: 600;\n color: var(--adn-preview-status, #111827);\n flex-shrink: 0;\n}\n\n.adn-preview-phone--dark .adn-preview-status { color: #ffffff; }\n\n.adn-preview-status__time { min-width: 34px; }\n\n.adn-preview-status__icons {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n margin-left: auto;\n}\n\n/* Ilha central no iOS, furo a esquerda no Android — e o que identifica o aparelho de relance. */\n.adn-preview-phone__island {\n width: 62px;\n height: 16px;\n border-radius: 999px;\n background: var(--adn-preview-bezel, #1e2532);\n margin: 0 auto;\n}\n\n.adn-preview-phone__punch {\n width: 9px;\n height: 9px;\n border-radius: 999px;\n background: var(--adn-preview-bezel, #1e2532);\n margin-left: 6px;\n}\n\n.adn-preview-phone__content { flex: 1; display: flex; flex-direction: column; min-height: 0; }\n\n.adn-preview-phone__gesture {\n width: 108px;\n height: 4px;\n border-radius: 999px;\n background: var(--adn-preview-gesture, rgba(17, 24, 39, 0.35));\n margin: 6px auto 7px;\n flex-shrink: 0;\n}\n\n.adn-preview-phone--dark .adn-preview-phone__gesture { background: rgba(255, 255, 255, 0.5); }\n.adn-preview-phone--android .adn-preview-phone__gesture { width: 88px; }\n\n/* ── Cliente de e-mail ───────────────────────────────────────────────────────────────────────\n * Layout de leitor de e-mail — busca, conta, remetente, assunto, acoes. Sao convencoes que todos\n * os clientes compartilham; nenhuma marca de terceiro e reproduzida.\n */\n\n.adn-preview-mailapp { display: flex; flex-direction: column; }\n\n.adn-preview-mailapp__bar {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--adn-color-border);\n}\n\n.adn-preview-mailapp__menu { display: inline-flex; flex-direction: column; gap: 3px; }\n\n.adn-preview-mailapp__menu span {\n width: 15px;\n height: 2px;\n border-radius: 2px;\n background: var(--adn-preview-mail-text, #334155);\n display: block;\n}\n\n.adn-preview-mailapp__search {\n flex: 1;\n padding: 7px 14px;\n border-radius: 999px;\n background: var(--adn-preview-chrome, #f1f5f9);\n font-size: 12px;\n color: var(--adn-color-muted);\n}\n\n.adn-preview-mailapp__actions {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 8px 14px;\n color: var(--adn-preview-mail-text, #334155);\n border-bottom: 1px solid var(--adn-color-border);\n flex-shrink: 0;\n}\n\n.adn-preview-mailapp__spacer { flex: 1; }\n\n.adn-preview-mail__time { margin-left: auto; font-size: 12px; color: var(--adn-color-muted); }\n\n/* ── Rolagem dentro do quadro ────────────────────────────────────────────────────────────────\n *\n * O quadro tem altura fixa (e o aparelho tem altura de aparelho): mensagem longa era simplesmente\n * cortada, sem jeito de ver o resto. Quem escreve precisa chegar ao fim do texto no proprio\n * preview. A rolagem fica DENTRO do aparelho, como no aparelho de verdade.\n */\n\n.adn-preview-phone__content {\n overflow-y: auto;\n overscroll-behavior: contain;\n}\n\n.adn-preview-mailapp__body-scroll,\n.adn-preview-wa,\n.adn-preview-sms {\n overflow-y: auto;\n overscroll-behavior: contain;\n}\n\n/* Altura de aparelho: sem isto a moldura cresce com o texto e deixa de parecer um celular. */\n.adn-preview-phone--ios .adn-preview-phone__screen { height: 760px; }\n.adn-preview-phone--android .adn-preview-phone__screen { height: 740px; }\n\n.adn-preview-browser__viewport {\n height: 620px;\n overflow-y: auto;\n overscroll-behavior: contain;\n}\n\n/* A fileira de quadros rola na horizontal quando o canal tem tres — a pagina nunca rola. */\n.adn-settings__preview-frames {\n overflow-x: auto;\n padding-bottom: var(--adn-space-2, 8px);\n}\n\n/* ── Silhueta do aparelho ────────────────────────────────────────────────────────────────────\n * Moldura fina e botoes laterais, como num mockup de aparelho — sem eles a caixa preta nao se le\n * como celular por mais arredondada que seja.\n */\n\n.adn-preview-phone { position: relative; border-width: 5px; }\n\n.adn-preview-phone__btn {\n position: absolute;\n background: var(--adn-preview-bezel, #1e2532);\n border-radius: 2px;\n}\n\n.adn-preview-phone__btn--mute { left: -7px; top: 96px; width: 3px; height: 26px; }\n.adn-preview-phone__btn--up { left: -7px; top: 140px; width: 3px; height: 46px; }\n.adn-preview-phone__btn--down { left: -7px; top: 198px; width: 3px; height: 46px; }\n.adn-preview-phone__btn--power { right: -7px; top: 160px; width: 3px; height: 70px; }\n\n.adn-preview-phone--android .adn-preview-phone__btn--mute { display: none; }\n.adn-preview-phone--android .adn-preview-phone__btn--up { top: 120px; height: 40px; }\n.adn-preview-phone--android .adn-preview-phone__btn--down { top: 168px; height: 40px; }\n\n/* ── Leitor de e-mail: barra de acoes e identidade do remetente ─────────────────────────────── */\n\n.adn-preview-mailapp__toolbar {\n display: flex;\n align-items: center;\n gap: 18px;\n padding: 10px 20px;\n color: var(--adn-preview-mail-icon, #5f6368);\n border-bottom: 1px solid var(--adn-color-border);\n}\n\n.adn-preview-mailapp__search {\n display: flex;\n align-items: center;\n gap: 10px;\n color: var(--adn-color-muted);\n}\n\n.adn-preview-mail__identity { display: flex; flex-direction: column; gap: 1px; min-width: 0; }\n\n.adn-preview-mail__from { align-items: flex-start; }\n\n.adn-preview-mail__subject {\n font-size: 20px;\n font-weight: 400;\n letter-spacing: -0.01em;\n}\n\n/* Bloco por canal: cada um com o proprio texto e o proprio preview. */\n.adn-settings__channel-block {\n display: flex;\n flex-direction: column;\n gap: var(--adn-space-3, 12px);\n padding: var(--adn-space-4, 16px);\n border: 1px solid var(--adn-color-border);\n border-radius: var(--adn-radius);\n background: var(--adn-color-canvas);\n}\n\n.adn-settings__channel-block-header {\n display: flex;\n align-items: baseline;\n gap: var(--adn-space-2, 8px);\n flex-wrap: wrap;\n}\n\n.adn-settings__channel-block .adn-settings__previews {\n border-top: 1px solid var(--adn-color-border);\n background: transparent;\n padding-left: 0;\n padding-right: 0;\n}\n\n.adn-settings__channel-block input,\n.adn-settings__channel-block textarea {\n background: var(--adn-color-surface);\n}\n\n/* Abas de canal dentro do editor — o mesmo desenho das abas do topo, um nivel abaixo. */\n.adn-settings__channel-tabs {\n display: flex;\n flex-wrap: wrap;\n gap: var(--adn-space-1, 4px);\n border-bottom: 1px solid var(--adn-color-border);\n}\n\n.adn-settings__channel-tabs .adn-settings__tab {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px;\n border: 0;\n border-bottom: 2px solid transparent;\n margin-bottom: -1px;\n background: none;\n color: var(--adn-color-muted);\n min-height: 40px;\n}\n\n.adn-settings__channel-tabs .adn-settings__tab--active {\n border-bottom-color: var(--adn-color-accent);\n color: var(--adn-color-accent);\n}\n\n/* Ponto: este canal ainda nao tem texto, e e ele que segura o salvar. */\n.adn-settings__tab-dot {\n width: 6px;\n height: 6px;\n border-radius: 999px;\n background: var(--adn-color-danger);\n}\n\n/* Sem aba, o bloco perde a borda: ele ja esta dentro do painel da aba. */\n.adn-settings__channel-block {\n border: 0;\n background: transparent;\n padding: var(--adn-space-3, 12px) 0 0;\n}\n\n/* ── Leitor de e-mail: anatomia completa ─────────────────────────────────────────────────────\n * Trilho de acoes, barra de ferramentas, contador, assunto com pasta, e a linha do remetente com\n * endereco e acoes. Convencoes compartilhadas por todo cliente — nenhuma marca reproduzida.\n */\n\n.adn-preview-mailapp__account { display: inline-flex; align-items: center; gap: 12px; color: var(--adn-preview-mail-icon, #5f6368); }\n\n.adn-preview-mailapp__split { display: flex; min-height: 0; }\n\n.adn-preview-mailapp__rail {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n padding: 12px 10px;\n color: var(--adn-preview-mail-icon, #5f6368);\n flex-shrink: 0;\n}\n\n.adn-preview-mailapp__compose {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 34px;\n border-radius: 12px;\n background: var(--adn-color-accent-soft);\n color: var(--adn-color-accent);\n}\n\n.adn-preview-mailapp__rail-item {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border-radius: 999px;\n}\n\n.adn-preview-mailapp__rail-item--active {\n background: var(--adn-color-accent-soft);\n color: var(--adn-color-accent);\n}\n\n.adn-preview-mailapp__divider {\n width: 1px;\n height: 16px;\n background: var(--adn-color-border);\n}\n\n.adn-preview-mailapp__toolbar { gap: 12px; }\n\n.adn-preview-mailapp__counter {\n font-size: 11px;\n color: var(--adn-color-muted);\n font-variant-numeric: tabular-nums;\n}\n\n.adn-preview-mail__subject-row {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.adn-preview-mail__folder {\n font-size: 11px;\n padding: 2px 8px;\n border-radius: 4px;\n background: var(--adn-preview-chrome, #f1f5f9);\n color: var(--adn-color-muted);\n white-space: nowrap;\n}\n\n.adn-preview-mail__subject-actions,\n.adn-preview-mail__from-actions {\n display: inline-flex;\n align-items: center;\n gap: 12px;\n margin-left: auto;\n color: var(--adn-preview-mail-icon, #5f6368);\n flex-shrink: 0;\n}\n\n.adn-preview-mail__sender-row { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }\n.adn-preview-mail__address { font-size: 12px; color: var(--adn-color-muted); }\n\n.adn-preview-mail__unsubscribe {\n font-size: 12px;\n color: var(--adn-color-accent);\n font-weight: 500;\n}\n\n/* Celular: a barra de acoes nao rola com a mensagem. */\n.adn-preview-mailapp__actions { position: sticky; top: 0; z-index: 1; background: var(--adn-color-surface); }\n\n.adn-preview-mailapp__scroll {\n flex: 1;\n overflow-y: auto;\n overscroll-behavior: contain;\n min-height: 0;\n}\n\n/* Com a barra fixa, quem rola e o miolo — nao o conteudo inteiro do aparelho. */\n.adn-preview-phone__content { overflow: hidden; }\n\n/* ── WhatsApp: a tela da conversa ────────────────────────────────────────────────────────────\n * Cabecalho, papel de parede, balao recebido e barra de digitar. O balao sozinho nao enquadra o\n * texto no tamanho que ele ocupa de verdade.\n */\n\n.adn-preview-wa__header {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: var(--adn-preview-wa-header, #075e54);\n color: #ffffff;\n flex-shrink: 0;\n}\n\n.adn-preview-wa__avatar {\n width: 30px;\n height: 30px;\n border-radius: 999px;\n background: rgba(255, 255, 255, 0.25);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n flex-shrink: 0;\n}\n\n.adn-preview-wa__contact { display: flex; flex-direction: column; min-width: 0; }\n.adn-preview-wa__name { font-size: 14px; font-weight: 500; }\n.adn-preview-wa__status { font-size: 11px; opacity: 0.85; }\n.adn-preview-wa__header-actions { display: inline-flex; align-items: center; gap: 14px; margin-left: auto; }\n\n.adn-preview-wa {\n flex: 1;\n padding: 14px 10px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n min-height: 0;\n}\n\n.adn-preview-wa__day {\n align-self: center;\n font-size: 11px;\n padding: 3px 10px;\n border-radius: 6px;\n background: rgba(255, 255, 255, 0.85);\n color: var(--adn-preview-wa-time, #667781);\n}\n\n/* A ponta do balao: e o que faz o retangulo virar mensagem recebida. */\n.adn-preview-wa__bubble::before {\n content: '';\n position: absolute;\n left: -7px;\n top: 0;\n width: 8px;\n height: 13px;\n background: #ffffff;\n clip-path: polygon(100% 0, 100% 100%, 0 0);\n}\n\n.adn-preview-wa__composer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n background: var(--adn-preview-wa-wallpaper, #efeae2);\n flex-shrink: 0;\n}\n\n.adn-preview-wa__input {\n flex: 1;\n padding: 9px 14px;\n border-radius: 999px;\n background: #ffffff;\n font-size: 13px;\n color: var(--adn-preview-wa-time, #667781);\n}\n\n.adn-preview-wa__send {\n width: 34px;\n height: 34px;\n border-radius: 999px;\n background: var(--adn-preview-wa-send, #00a884);\n color: #ffffff;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n/* ── E-mail no celular: outra tela, nao a do navegador encolhida ─────────────────────────────── */\n\n.adn-preview-mail__reply {\n display: flex;\n gap: 10px;\n padding-top: var(--adn-space-3, 12px);\n}\n\n.adn-preview-mail__reply-button {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 16px;\n border: 1px solid var(--adn-color-border);\n border-radius: 999px;\n font-size: 13px;\n color: var(--adn-preview-mail-text, #334155);\n}\n\n/* ── Respiro interno ─────────────────────────────────────────────────────────────────────────\n * A area de preview e a de canais encostavam nas bordas do cartao.\n */\n\n.adn-settings__previews {\n padding: var(--adn-space-4, 16px);\n border-radius: var(--adn-radius);\n background: var(--adn-color-canvas);\n}\n\n.adn-settings__channel-block .adn-settings__previews {\n background: var(--adn-color-canvas);\n padding: var(--adn-space-4, 16px);\n}\n\n.adn-settings__field--channels {\n padding: var(--adn-space-3, 12px);\n border: 1px solid var(--adn-color-border);\n border-radius: var(--adn-radius);\n background: var(--adn-color-surface);\n}\n\n.adn-settings__channel-tabs {\n padding: 0 var(--adn-space-1, 4px);\n margin-top: var(--adn-space-2, 8px);\n}\n\n.adn-settings__channel-block {\n padding: var(--adn-space-4, 16px) var(--adn-space-1, 4px) 0;\n}\n\n.adn-settings__policies .adn-settings__category + .adn-settings__category {\n margin-top: var(--adn-space-2, 8px);\n}\n\n/* ── App de e-mail no aparelho ───────────────────────────────────────────────────────────────\n * Anatomia propria: assunto grande antes do remetente, avatar maior, horario e estrela na linha do\n * remetente, destinatario numa linha que expande, e as respostas no fim.\n */\n\n.adn-preview-mail--compact { padding: 16px 16px 20px; gap: 10px; }\n\n.adn-preview-mail--compact .adn-preview-mail__subject {\n font-size: 22px;\n line-height: 1.25;\n -webkit-line-clamp: 3;\n}\n\n.adn-preview-avatar--large { width: 36px; height: 36px; font-size: 15px; }\n\n.adn-preview-mail__from--mobile { gap: 12px; padding-top: 4px; }\n\n.adn-preview-mail__from--mobile .adn-preview-mail__sender-row {\n justify-content: space-between;\n gap: 10px;\n width: 100%;\n}\n\n.adn-preview-mail__from--mobile .adn-preview-mail__sender { font-size: 14px; font-weight: 600; }\n\n.adn-preview-mail__recipients {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n font-size: 12px;\n color: var(--adn-color-muted);\n}\n\n.adn-preview-mail--compact .adn-preview-mail__body { font-size: 15px; line-height: 1.65; }\n\n.adn-preview-mail__reply { flex-wrap: wrap; padding-top: var(--adn-space-4, 16px); }\n\n.adn-preview-mail--compact .adn-preview-mail__reply-button {\n padding: 8px 14px;\n font-size: 12px;\n}\n\n/* ── Lista: busca, filtros e grupos ──────────────────────────────────────────────────────────\n * Com uma notificacao a lista era um cartao; com trinta vira um paredao. Busca sobre chave e\n * texto, filtro por categoria e por canal, e grupos pela categoria da chave.\n */\n\n.adn-settings__list-filters {\n display: flex;\n flex-direction: column;\n gap: var(--adn-space-2, 8px);\n padding-bottom: var(--adn-space-3, 12px);\n}\n\n.adn-settings__search input {\n width: 100%;\n min-height: 40px;\n padding: 9px 12px;\n border: 1px solid var(--adn-color-border);\n border-radius: var(--adn-radius-sm);\n font: inherit;\n color: inherit;\n background: var(--adn-color-surface);\n}\n\n.adn-settings__search input:focus-visible {\n outline: 2px solid var(--adn-color-accent);\n outline-offset: -1px;\n}\n\n.adn-settings__filter-row { display: flex; flex-wrap: wrap; gap: 6px; }\n\n/* Composto pelo mesmo motivo do Remover: `.adn-settings__template-list button` tem especificidade\n maior e estica todo botao da coluna para 100%, empilhando os filtros um por linha. */\n.adn-settings__template-list .adn-settings__filter {\n width: auto;\n flex: 0 0 auto;\n padding: 5px 10px;\n border: 1px solid var(--adn-color-border);\n border-radius: 999px;\n background: var(--adn-color-surface);\n font-size: 0.75rem;\n color: var(--adn-color-muted);\n min-height: 30px;\n}\n\n.adn-settings__template-list .adn-settings__filter:hover { border-color: var(--adn-color-accent-line); }\n\n.adn-settings__template-list .adn-settings__filter--on {\n border-color: var(--adn-color-accent);\n background: var(--adn-color-accent-soft);\n color: var(--adn-color-accent);\n font-weight: 500;\n}\n\n.adn-settings__template-list .adn-settings__clear {\n width: auto;\n align-self: flex-start;\n border: 0;\n background: none;\n padding: 2px 0;\n font-size: 0.75rem;\n color: var(--adn-color-accent);\n text-decoration: underline;\n min-height: auto;\n}\n\n.adn-settings__group { display: flex; flex-direction: column; gap: var(--adn-space-2, 8px); }\n.adn-settings__group + .adn-settings__group { margin-top: var(--adn-space-4, 16px); }\n\n.adn-settings__group-title {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n font-size: 0.6875rem;\n font-weight: 600;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--adn-color-muted);\n}\n\n.adn-settings__group-count {\n padding: 1px 7px;\n border-radius: 999px;\n background: var(--adn-preview-chrome, #f1f5f9);\n font-size: 0.6875rem;\n letter-spacing: 0;\n font-variant-numeric: tabular-nums;\n}\n\n/* Rotulo lido por leitor de tela, invisivel na tela — o campo de busca ja tem placeholder. */\n.adn-settings__visually-hidden {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n white-space: nowrap;\n}\n\n/* ── Respiro da coluna de mensagens ──────────────────────────────────────────────────────────\n * O cartao da lista gastava 273px dos 668px em cabecalho e filtros antes da primeira mensagem, e\n * a coluna do editor reservava 688px de largura para uma linha de 20px de texto. Aqui a moldura\n * encolhe, o ritmo vertical passa a andar na grade de 4px, e o vazio do editor vira estado.\n */\n\n.adn-settings__list-header {\n padding-bottom: var(--adn-space-2, 8px);\n}\n\n/* Borda no lugar de espaco: separa a moldura do conteudo sem gastar altura. */\n.adn-settings__list-filters {\n gap: 6px;\n padding-bottom: var(--adn-space-3, 12px);\n margin-bottom: var(--adn-space-3, 12px);\n border-bottom: 1px solid var(--adn-color-border);\n}\n\n.adn-settings__search input {\n min-height: 36px;\n padding: 7px 12px;\n}\n\n.adn-settings__template-list .adn-settings__filter {\n min-height: 26px;\n padding: 3px 10px;\n}\n\n.adn-settings__template-list .adn-settings__row > button:first-child {\n padding: var(--adn-space-2, 8px) var(--adn-space-3, 12px);\n}\n\n/* ── Navegando: sem rascunho, so a lista ─────────────────────────────────────────────────────\n * A coluna do editor nao e renderizada enquanto nada esta selecionado, entao a lista fica com a\n * largura inteira e as mensagens se espalham em cartoes em vez de empilhar numa faixa de 320px.\n */\n\n.adn-settings__templates--browsing {\n grid-template-columns: 1fr;\n}\n\n@media (min-width: 1024px) {\n .adn-settings__templates--browsing {\n grid-template-columns: 1fr;\n }\n\n /* A moldura (cabecalho, busca, filtros) volta a caber numa linha so quando ha largura. */\n .adn-settings__templates--browsing .adn-settings__list-filters {\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n }\n\n .adn-settings__templates--browsing .adn-settings__search {\n flex: 1 1 260px;\n min-width: 0;\n }\n\n /* Grade de cartoes: a lista larga vira colunas, nao linhas de 1024px de ponta a ponta. */\n .adn-settings__templates--browsing .adn-settings__template-list ul {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));\n gap: var(--adn-space-2, 8px);\n }\n}\n\n/* Na grade, o Remover ficava com quase um terco do cartao. Ele e acao secundaria: encolhe. */\n@media (min-width: 1024px) {\n .adn-settings__templates--browsing .adn-settings__template-list .adn-settings__remove {\n align-self: center;\n padding: 0 var(--adn-space-2, 8px);\n font-size: 0.75rem;\n min-height: 32px;\n }\n}\n\n/* ── Tabela e lista: duas leituras da mesma colecao ──────────────────────────────────────────\n * A tabela alinha canal e versao em coluna para comparar trinta mensagens de relance; a lista\n * mostra o texto em duas linhas para reconhecer uma delas. O alternador fica no cabecalho.\n */\n\n.adn-settings__list-header-actions {\n display: flex;\n align-items: center;\n gap: var(--adn-space-2, 8px);\n}\n\n.adn-settings__view-switch {\n display: inline-flex;\n padding: 2px;\n border: 1px solid var(--adn-color-border);\n border-radius: var(--adn-radius-sm);\n background: var(--adn-color-surface);\n}\n\n.adn-settings__template-list .adn-settings__view {\n width: auto;\n flex: 0 0 auto;\n min-height: 28px;\n padding: 0 var(--adn-space-3, 12px);\n border: 0;\n border-radius: calc(var(--adn-radius-sm) - 1px);\n background: transparent;\n font-size: 0.75rem;\n color: var(--adn-color-muted);\n white-space: nowrap;\n}\n\n.adn-settings__template-list .adn-settings__view--on {\n background: var(--adn-color-accent-soft);\n color: var(--adn-color-accent);\n font-weight: 600;\n}\n\n/* O scroll horizontal mora aqui dentro; a pagina nunca rola de lado (web.md §10). */\n.adn-settings__table-scroll {\n overflow-x: auto;\n}\n\n.adn-settings__table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.8125rem;\n}\n\n.adn-settings__table th {\n padding: 0;\n text-align: left;\n border-bottom: 1px solid var(--adn-color-border);\n white-space: nowrap;\n}\n\n.adn-settings__template-list .adn-settings__table th button {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n width: auto;\n min-height: 34px;\n padding: 0 var(--adn-space-3, 12px);\n border: 0;\n background: transparent;\n font-size: 0.6875rem;\n font-weight: 600;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--adn-color-muted);\n}\n\n.adn-settings__table th > span {\n display: inline-block;\n padding: 0 var(--adn-space-3, 12px);\n}\n\n.adn-settings__sort-mark {\n font-size: 0.75rem;\n letter-spacing: 0;\n}\n\n.adn-settings__table td {\n padding: var(--adn-space-2, 8px) var(--adn-space-3, 12px);\n border-bottom: 1px solid var(--adn-color-border);\n vertical-align: middle;\n}\n\n/* Zebra por CSS, nunca estilo inline (web.md §7). */\n.adn-settings__table tbody tr:nth-child(even) {\n background: color-mix(in srgb, var(--adn-color-muted) 5%, transparent);\n}\n\n.adn-settings__table tbody tr:hover {\n background: var(--adn-color-accent-soft);\n}\n\n.adn-settings__table-row--active {\n box-shadow: inset 3px 0 0 var(--adn-color-accent);\n}\n\n.adn-settings__template-list .adn-settings__table-key {\n width: auto;\n min-height: 34px;\n padding: 0;\n border: 0;\n background: transparent;\n font-family: var(--adn-font-mono);\n font-size: 0.8125rem;\n font-weight: 600;\n color: inherit;\n text-align: left;\n}\n\n.adn-settings__table-body {\n /* Uma linha por celula: a tabela e para comparar, nao para ler o texto inteiro. */\n max-width: 42ch;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--adn-color-muted);\n}\n\n.adn-settings__table .adn-settings__version {\n white-space: nowrap;\n}\n\n.adn-settings__template-list .adn-settings__table .adn-settings__remove {\n align-self: center;\n min-height: 30px;\n padding: 0 var(--adn-space-2, 8px);\n font-size: 0.75rem;\n}\n\n/* ── Respiro interno do bloco de edicao ──────────────────────────────────────────────────────\n * O cartao dava padding LATERAL aos filhos e nada na vertical: os campos de identidade nasciam\n * colados na borda do cabecalho, os blocos entre si dependiam de um `margin-top` avulso aqui e\n * ali, e a barra de salvar terminava rente ao pe do cartao. Uma pilha com um ritmo so resolve os\n * tres — e as margens avulsas saem, senao dobram com o `gap`.\n */\n\n.adn-settings__editor {\n display: flex;\n flex-direction: column;\n gap: var(--adn-space-4, 16px);\n padding-bottom: var(--adn-space-4, 16px);\n}\n\n.adn-settings__editor > .adn-settings__channel-tabs,\n.adn-settings__editor > .adn-settings__variables,\n.adn-settings__editor > .adn-settings__identity {\n margin-top: 0;\n}\n\n/* Rodape com borda, espelhando o cabecalho: o salvar deixa de flutuar no fim do texto. */\n.adn-settings__editor > .adn-settings__actions {\n margin-top: 0;\n padding-top: var(--adn-space-4, 16px);\n border-top: 1px solid var(--adn-color-border);\n}\n\n/* O bloco do canal ja recebe o ritmo do pai; o padding-top proprio virava espaco dobrado. */\n.adn-settings__editor > .adn-settings__channel-block {\n padding-top: 0;\n}\n\n/* ── Botoes que parecem botoes ───────────────────────────────────────────────────────────────\n * `.adn-settings__template-list button` tem especificidade (0,1,1) e vencia `.adn-settings__new`\n * (0,1,0): o botao primario saia sem fundo, sem cor e sem borda — texto solto. Mesmo motivo que ja\n * obrigou o seletor composto em `__remove` e `__filter`. E o Fechar nao tinha classe nenhuma.\n */\n\n.adn-settings__button-icon {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n /* Acompanha hover, disabled e variante destrutiva sem regra extra (web.md §9). */\n color: currentColor;\n}\n\n.adn-settings__template-list .adn-settings__new,\n.adn-settings__new {\n display: inline-flex;\n align-items: center;\n gap: var(--adn-space-2, 8px);\n width: auto;\n flex: 0 0 auto;\n min-height: 34px;\n padding: 0 var(--adn-space-3, 12px);\n border: 1px solid var(--adn-color-accent);\n border-radius: var(--adn-radius-sm);\n background: var(--adn-color-accent);\n color: #ffffff;\n font-size: 0.8125rem;\n font-weight: 600;\n white-space: nowrap;\n cursor: pointer;\n}\n\n.adn-settings__template-list .adn-settings__new:hover,\n.adn-settings__new:hover {\n background: color-mix(in srgb, #000000 10%, var(--adn-color-accent));\n}\n\n/* Secundario ao lado de um primario: contorno, nao preenchimento (web.md §9). */\n.adn-settings__close {\n display: inline-flex;\n align-items: center;\n gap: var(--adn-space-2, 8px);\n min-height: 34px;\n padding: 0 var(--adn-space-3, 12px);\n border: 1px solid var(--adn-color-border);\n border-radius: var(--adn-radius-sm);\n background: var(--adn-color-surface);\n color: var(--adn-color-muted);\n font: inherit;\n font-size: 0.8125rem;\n font-weight: 500;\n cursor: pointer;\n}\n\n.adn-settings__close:hover {\n border-color: var(--adn-color-accent-line);\n color: var(--adn-color-text);\n}\n\n.adn-settings__template-list .adn-settings__remove {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.adn-settings__new:focus-visible,\n.adn-settings__close:focus-visible,\n.adn-settings__template-list .adn-settings__view:focus-visible {\n outline: 2px solid var(--adn-color-accent);\n outline-offset: 2px;\n}\n\n/* ── Fundo do preview ────────────────────────────────────────────────────────────────────────\n * `--adn-color-canvas` e acento a 4% sobre branco: contra o cartao branco do editor ficava branco\n * tambem, e os aparelhos do preview flutuavam sem chao. A mistura vai pelo TEXTO, que inverte\n * junto com o tema — escurece no claro, clareia no escuro — em vez de fixar um cinza.\n */\n\n.adn-settings__previews,\n.adn-settings__channel-block .adn-settings__previews {\n background: color-mix(in srgb, var(--adn-color-text) 7%, var(--adn-color-canvas));\n border: 1px solid var(--adn-color-border);\n}\n\n/* ── Margem lateral do bloco de edicao ───────────────────────────────────────────────────────\n * `.adn-settings__channel-block` declara `padding: 16px 4px 0` e, com a mesma especificidade da\n * regra generica `.adn-settings__editor > *`, vence por vir depois: o campo de titulo e o de texto\n * nasciam a 4px da borda do cartao enquanto o resto do editor respirava 16px. Uma medida so para\n * todos os filhos, e mais larga — o cartao ocupa 688px e 16px de cada lado somem nessa largura.\n */\n\n.adn-settings__editor > * {\n padding-left: var(--adn-space-6, 24px);\n padding-right: var(--adn-space-6, 24px);\n}\n\n.adn-settings__editor > .adn-settings__channel-block,\n.adn-settings__editor > .adn-settings__channel-tabs {\n padding-left: var(--adn-space-6, 24px);\n padding-right: var(--adn-space-6, 24px);\n}\n\n.adn-settings__editor {\n padding-bottom: var(--adn-space-6, 24px);\n}\n\n.adn-settings__editor > .adn-settings__editor-header {\n padding-top: var(--adn-space-5, 20px);\n padding-bottom: var(--adn-space-5, 20px);\n}\n\n/* A linha inteira e o alvo; o botao da chave continua sendo o foco de teclado. */\n.adn-settings__table-row {\n cursor: pointer;\n}\n\n/* ── Preview de e-mail com a moldura do produto ──────────────────────────────────────────────\n * O documento inteiro vive num `<iframe sandbox=\"\">`: sem script, sem mesma-origem, e o CSS do\n * e-mail nao vaza para o painel nem herda o dele. Altura fixa com rolagem interna porque o sandbox\n * vazio impede medir o conteudo — e medir exigiria devolver a mesma-origem.\n */\n\n.adn-preview-mail__frame {\n display: block;\n width: 100%;\n min-height: 420px;\n border: 0;\n background: #ffffff;\n}\n\n.adn-settings__email-report {\n display: flex;\n flex-direction: column;\n gap: var(--adn-space-1, 4px);\n margin: var(--adn-space-2, 8px) 0 0;\n padding: 0;\n list-style: none;\n}\n\n.adn-settings__email-problem {\n padding: var(--adn-space-2, 8px) var(--adn-space-3, 12px);\n border-radius: var(--adn-radius-sm);\n font-size: 0.75rem;\n line-height: 1.5;\n border-left: 3px solid transparent;\n}\n\n/* Erro reprova o envio; aviso so degrada. A cor diz qual e qual antes de a pessoa ler a frase. */\n.adn-settings__email-problem--error {\n border-left-color: var(--adn-color-danger);\n background: color-mix(in srgb, var(--adn-color-danger) 8%, transparent);\n color: var(--adn-color-danger);\n}\n\n.adn-settings__email-problem--warning {\n border-left-color: var(--adn-color-warning);\n background: color-mix(in srgb, var(--adn-color-warning) 8%, transparent);\n color: var(--adn-color-warning);\n}\n\n/* ── Editor de codigo ────────────────────────────────────────────────────────────────────────\n * Sobreposicao: `<pre>` colorido embaixo, `<textarea>` transparente em cima. As DUAS camadas\n * precisam da mesma metrica de texto ate o ultimo pixel — fonte, tamanho, entrelinha, quebra e\n * recuo. Qualquer divergencia e o cursor descolando da letra, que e pior que nao ter realce.\n */\n\n.adn-code {\n display: flex;\n flex-direction: column;\n gap: var(--adn-space-2, 8px);\n}\n\n.adn-code__editor {\n display: flex;\n overflow: hidden;\n border: 1px solid var(--adn-color-border);\n border-radius: var(--adn-radius);\n background: var(--adn-color-canvas);\n}\n\n.adn-code__editor:focus-within {\n border-color: var(--adn-color-accent);\n box-shadow: 0 0 0 1px var(--adn-color-accent);\n}\n\n.adn-code__gutter {\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n padding: 12px 10px;\n border-right: 1px solid var(--adn-color-border);\n font: 400 12.5px/1.6 var(--adn-font-mono);\n color: var(--adn-color-muted);\n text-align: right;\n user-select: none;\n font-variant-numeric: tabular-nums;\n}\n\n.adn-code__surface {\n position: relative;\n flex: 1;\n min-width: 0;\n}\n\n/* A metrica compartilhada. Mexer aqui sem mexer no par desalinha as duas camadas. */\n.adn-code__highlight,\n.adn-code__input {\n margin: 0;\n padding: 12px 14px;\n font: 400 12.5px/1.6 var(--adn-font-mono);\n white-space: pre-wrap;\n overflow-wrap: break-word;\n word-break: break-word;\n tab-size: 2;\n border: 0;\n}\n\n.adn-code__highlight {\n min-height: 260px;\n max-height: 420px;\n overflow: auto;\n color: var(--adn-color-text);\n}\n\n.adn-code__input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n resize: vertical;\n overflow: auto;\n background: transparent;\n /* Texto invisivel, cursor visivel: quem colore e a camada de baixo. */\n color: transparent;\n caret-color: var(--adn-color-text);\n outline: none;\n}\n\n.adn-code__input::selection {\n background: color-mix(in srgb, var(--adn-color-accent) 28%, transparent);\n}\n\n.adn-code__token--tag,\n.adn-code__token--name {\n color: var(--adn-color-accent);\n}\n\n.adn-code__token--name {\n font-weight: 600;\n}\n\n.adn-code__token--attribute {\n color: color-mix(in srgb, var(--adn-color-accent) 55%, var(--adn-color-text));\n}\n\n.adn-code__token--value {\n color: var(--adn-color-warning);\n}\n\n.adn-code__token--comment,\n.adn-code__token--doctype {\n color: var(--adn-color-muted);\n font-style: italic;\n}\n\n/* Variavel e o que o texto promete ao payload: destaque proprio, nem tag nem texto solto. */\n.adn-code__token--variable {\n padding: 0 3px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--adn-color-accent) 14%, transparent);\n color: var(--adn-color-accent);\n font-weight: 600;\n}\n\n/* ── Cabecalho da lista que nao vaza ─────────────────────────────────────────────────────────\n * Titulo, alternador de visao e \"Nova mensagem\" somam mais que os 286px uteis da coluna, e as tres\n * flex de fora estavam sem `wrap`: em vez de quebrar, a linha estourava e o botao saia POR CIMA da\n * coluna do editor. Quebrar e a resposta; o `overflow: hidden` e a rede, para nenhum conteudo\n * futuro repetir isso em silencio.\n */\n\n.adn-settings__template-list {\n overflow: hidden;\n}\n\n.adn-settings__list-header-row {\n flex-wrap: wrap;\n gap: var(--adn-space-2, 8px);\n}\n\n.adn-settings__list-header-actions {\n flex-wrap: wrap;\n justify-content: flex-end;\n min-width: 0;\n}\n\n.adn-settings__template-list .adn-settings__new {\n max-width: 100%;\n}\n\n/* ── Barra da caixa de mensagem ──────────────────────────────────────────────────────────────\n * Ela escreve marcacao no texto (`*negrito*`, `_italico_`), nao HTML: a convencao e unica para\n * todos os canais (conversation-flow.md §4).\n */\n\n.adn-message-field {\n display: flex;\n flex-direction: column;\n}\n\n.adn-toolbar {\n display: flex;\n align-items: center;\n gap: 2px;\n padding: 4px 6px;\n border: 1px solid var(--adn-color-border);\n border-bottom: 0;\n border-radius: var(--adn-radius) var(--adn-radius) 0 0;\n background: var(--adn-color-canvas);\n}\n\n.adn-message-field textarea {\n border-radius: 0 0 var(--adn-radius) var(--adn-radius);\n}\n\n.adn-toolbar__button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: 0;\n border-radius: var(--adn-radius-sm);\n background: transparent;\n color: var(--adn-color-muted);\n cursor: pointer;\n}\n\n.adn-toolbar__button:hover {\n background: var(--adn-color-surface);\n color: var(--adn-color-text);\n}\n\n.adn-toolbar__button:focus-visible {\n outline: 2px solid var(--adn-color-accent);\n outline-offset: -2px;\n}\n\n.adn-toolbar__divider {\n width: 1px;\n height: 18px;\n margin: 0 4px;\n background: var(--adn-color-border);\n}\n\n.adn-toolbar__emoji {\n position: relative;\n}\n\n.adn-toolbar__palette {\n position: absolute;\n z-index: 2;\n top: calc(100% + 4px);\n left: 0;\n display: grid;\n grid-template-columns: repeat(4, 34px);\n gap: 2px;\n padding: 6px;\n border: 1px solid var(--adn-color-border);\n border-radius: var(--adn-radius);\n background: var(--adn-color-surface);\n box-shadow: var(--adn-shadow-card);\n}\n\n.adn-toolbar__emoji-button {\n width: 34px;\n height: 34px;\n padding: 0;\n border: 0;\n border-radius: var(--adn-radius-sm);\n background: transparent;\n font-size: 17px;\n line-height: 1;\n cursor: pointer;\n}\n\n.adn-toolbar__emoji-button:hover {\n background: var(--adn-color-accent-soft);\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adatechnology/notification-ui",
3
- "version": "0.1.0-rc.5",
3
+ "version": "0.1.0-rc.7",
4
4
  "license": "MIT",
5
5
  "description": "Notification UI — headless hooks + componentes de inbox, sino e preferências",
6
6
  "publishConfig": {
@@ -26,8 +26,8 @@
26
26
  "dependencies": {
27
27
  "clsx": "^2.1.1",
28
28
  "lucide-react": "^1.21.0",
29
- "@adatechnology/notification-client": "0.1.0-rc.4",
30
- "@adatechnology/notification-contracts": "0.1.0-rc.4"
29
+ "@adatechnology/notification-client": "0.1.0-rc.6",
30
+ "@adatechnology/notification-contracts": "0.1.0-rc.6"
31
31
  },
32
32
  "peerDependencies": {
33
33
  "@tanstack/react-query": "^5",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/NotificationProvider.tsx","../src/locales/pt-BR.json","../src/locales/en.json","../src/locales/index.ts","../src/hooks/useNotifications.ts","../src/hooks/queryKeys.ts","../src/hooks/useNotificationStream.ts","../src/hooks/useCategoryPolicies.ts","../src/hooks/usePreferences.ts","../src/format/notificationTime.ts","../src/hooks/useTemplateEditor.ts"],"sourcesContent":["/**\n * Copyright (c) 2026 Ada Technology. MIT License.\n *\n * Provider do pacote. **Não instancia `QueryClient`** — usa o do host (regra de módulos\n * plugáveis §4.2). Instanciar o próprio criaria dois caches na mesma página: a inbox invalidaria\n * um, e a tela do produto continuaria lendo o outro.\n */\n\nimport { createContext, useContext, useMemo, type ReactNode } from 'react'\nimport type { NotificationClient } from '@adatechnology/notification-client'\n\nimport { DEFAULT_LOCALE, resolveMessages, type NotificationLocale, type NotificationMessages } from './locales'\n\nexport type NotificationTheme = {\n /** Classe aplicada na raiz de cada componente — é por onde o host injeta os tokens dele. */\n readonly rootClassName?: string\n readonly components?: Partial<Record<string, string>>\n}\n\nexport type NotificationContextValue = {\n readonly client: NotificationClient\n /**\n * O idioma resolvido, e não só os textos dele: data e número não vivem no arquivo de locale —\n * quem os formata é `Intl`, e `Intl` precisa da tag do idioma. Sem isto o item da lista teria de\n * chutar um locale fixo, e a inbox mostraria \"5 minutes ago\" numa tela em português.\n */\n readonly locale: NotificationLocale\n readonly messages: NotificationMessages\n readonly theme: NotificationTheme\n /** Polling de fallback quando o SSE não está disponível (segundos); `0` desliga. */\n readonly pollIntervalSeconds: number\n}\n\nconst NotificationContext = createContext<NotificationContextValue | null>(null)\n\nexport type NotificationProviderProps = {\n readonly client: NotificationClient\n readonly locale?: NotificationLocale\n /** Sobrescreve textos pontuais sem trocar o locale inteiro. */\n readonly messageOverrides?: Partial<NotificationMessages>\n readonly theme?: NotificationTheme\n readonly pollIntervalSeconds?: number\n readonly children: ReactNode\n}\n\nexport function NotificationProvider({\n client,\n locale = DEFAULT_LOCALE,\n messageOverrides,\n theme = {},\n pollIntervalSeconds = 60,\n children,\n}: NotificationProviderProps) {\n const value = useMemo<NotificationContextValue>(\n () => ({\n client,\n locale,\n messages: { ...resolveMessages(locale), ...messageOverrides },\n theme,\n pollIntervalSeconds,\n }),\n [client, locale, messageOverrides, theme, pollIntervalSeconds],\n )\n\n return <NotificationContext.Provider value={value}>{children}</NotificationContext.Provider>\n}\n\nexport function useNotificationContext(): NotificationContextValue {\n const context = useContext(NotificationContext)\n if (!context) throw new Error('notification-ui: componente usado fora de <NotificationProvider>')\n return context\n}\n","{\n \"bell.label\": \"Notificações\",\n \"bell.unreadSuffix\": \"não lidas\",\n \"list.title\": \"Caixa de entrada\",\n \"list.unread\": \"não lidas\",\n \"list.empty\": \"Nenhuma notificação por aqui.\",\n \"list.loading\": \"Carregando…\",\n \"list.error\": \"Não foi possível carregar suas notificações.\",\n \"list.retry\": \"Tentar de novo\",\n \"list.loadMore\": \"Carregar mais\",\n \"list.markAllAsRead\": \"Marcar todas como lidas\",\n \"item.markAsRead\": \"Marcar como lida\",\n \"item.delete\": \"Excluir\",\n \"item.unread\": \"Não lida\",\n \"preferences.title\": \"Preferências de notificação\",\n \"preferences.description\": \"Escolha por onde você quer ser avisado em cada assunto.\",\n \"preferences.save\": \"Salvar preferências\",\n \"preferences.saved\": \"Preferências salvas.\",\n \"preferences.error\": \"Não foi possível salvar. Tente de novo.\",\n \"preferences.empty\": \"Nenhuma preferência configurada ainda.\",\n \"preferences.quietHours\": \"Silêncio entre\",\n \"preferences.quietHoursTo\": \"e\",\n \"channel.inbox\": \"No app\",\n \"channel.push\": \"Push\",\n \"channel.email\": \"E-mail\",\n \"channel.whatsapp\": \"WhatsApp\",\n \"channel.sms\": \"SMS\",\n \"workspace.title\": \"Notificações\",\n \"workspace.description\": \"O que foi avisado, e por quais canais.\",\n \"workspace.settingsLink\": \"Configurações\",\n \"settings.title\": \"Configurações de notificação\",\n \"settings.description\": \"Por onde avisar, e o texto exato que chega.\",\n \"settings.channelsTitle\": \"Canais\",\n \"settings.channelsHint\": \"Desligar um canal não apaga o histórico — o aviso deixa de sair por ali daqui em diante.\",\n \"settings.templatesTitle\": \"Mensagens\",\n \"settings.templatesHint\": \"Uma versão nova é criada a cada gravação; a anterior fica no histórico.\",\n \"settings.templatesEmpty\": \"Nenhuma mensagem cadastrada.\",\n \"settings.pickTemplate\": \"Escolha uma mensagem para editar.\",\n \"settings.subject\": \"Título\",\n \"settings.subjectHint\": \"O que aparece na lista. Vazio, o título é derivado da primeira linha do texto.\",\n \"settings.body\": \"Texto\",\n \"settings.previewTitle\": \"Como o destinatário vê\",\n \"settings.save\": \"Salvar nova versão\",\n \"settings.saving\": \"Salvando…\",\n \"settings.unchanged\": \"Nada mudou ainda.\",\n \"settings.close\": \"Fechar\",\n \"settings.version\": \"v\",\n \"settings.newTemplate\": \"Nova mensagem\",\n \"settings.remove\": \"Remover\",\n \"settings.key\": \"Chave da notificação\",\n \"settings.keyHint\": \"Não muda depois de criada — é por ela que o envio acha a mensagem.\",\n \"settings.channel\": \"Canal\",\n \"settings.locale\": \"Idioma\",\n \"settings.variablesTitle\": \"Variáveis\",\n \"settings.variablesHint\": \"Clique para inserir no ponto onde o cursor estava.\",\n \"settings.unknownVariables\": \"Variáveis que não existem nesta notificação:\",\n \"settings.viewport.desktop\": \"Computador\",\n \"settings.viewport.mobile\": \"Celular\",\n \"settings.constraint.title\": \"Assunto passa do limite do canal:\",\n \"settings.constraint.body\": \"Texto passa do limite do canal:\",\n \"settings.tab.messages\": \"Mensagens\",\n \"settings.tab.routing\": \"Roteamento\",\n \"settings.policiesTitle\": \"Canais permitidos por assunto\",\n \"settings.policiesHint\": \"Decisão da empresa. Canal desligado aqui não sai, mesmo que o destinatário tenha pedido.\",\n \"settings.savePolicies\": \"Salvar roteamento\",\n \"settings.discard\": \"Descartar\"\n}\n","{\n \"bell.label\": \"Notifications\",\n \"bell.unreadSuffix\": \"unread\",\n \"list.title\": \"Inbox\",\n \"list.unread\": \"unread\",\n \"list.empty\": \"Nothing here yet.\",\n \"list.loading\": \"Loading…\",\n \"list.error\": \"We couldn't load your notifications.\",\n \"list.retry\": \"Try again\",\n \"list.loadMore\": \"Load more\",\n \"list.markAllAsRead\": \"Mark all as read\",\n \"item.markAsRead\": \"Mark as read\",\n \"item.delete\": \"Delete\",\n \"item.unread\": \"Unread\",\n \"preferences.title\": \"Notification preferences\",\n \"preferences.description\": \"Choose how you want to be notified about each topic.\",\n \"preferences.save\": \"Save preferences\",\n \"preferences.saved\": \"Preferences saved.\",\n \"preferences.error\": \"Couldn't save. Try again.\",\n \"preferences.empty\": \"No preferences configured yet.\",\n \"preferences.quietHours\": \"Quiet between\",\n \"preferences.quietHoursTo\": \"and\",\n \"channel.inbox\": \"In app\",\n \"channel.push\": \"Push\",\n \"channel.email\": \"Email\",\n \"channel.whatsapp\": \"WhatsApp\",\n \"channel.sms\": \"SMS\",\n \"workspace.title\": \"Notifications\",\n \"workspace.description\": \"What was sent, and through which channels.\",\n \"workspace.settingsLink\": \"Settings\",\n \"settings.title\": \"Notification settings\",\n \"settings.description\": \"Where to notify, and the exact text that arrives.\",\n \"settings.channelsTitle\": \"Channels\",\n \"settings.channelsHint\": \"Turning a channel off does not erase history — notices stop going out through it from now on.\",\n \"settings.templatesTitle\": \"Messages\",\n \"settings.templatesHint\": \"Each save creates a new version; the previous one stays in history.\",\n \"settings.templatesEmpty\": \"No messages registered.\",\n \"settings.pickTemplate\": \"Pick a message to edit.\",\n \"settings.subject\": \"Title\",\n \"settings.subjectHint\": \"Shown in the list. Empty, the title is derived from the first line of the body.\",\n \"settings.body\": \"Body\",\n \"settings.previewTitle\": \"How the recipient sees it\",\n \"settings.save\": \"Save new version\",\n \"settings.saving\": \"Saving…\",\n \"settings.unchanged\": \"Nothing changed yet.\",\n \"settings.close\": \"Close\",\n \"settings.version\": \"v\",\n \"settings.newTemplate\": \"New message\",\n \"settings.remove\": \"Remove\",\n \"settings.key\": \"Notification key\",\n \"settings.keyHint\": \"Fixed once created — sending looks the message up by it.\",\n \"settings.channel\": \"Channel\",\n \"settings.locale\": \"Language\",\n \"settings.variablesTitle\": \"Variables\",\n \"settings.variablesHint\": \"Click to insert where the cursor was.\",\n \"settings.unknownVariables\": \"Variables this notification does not have:\",\n \"settings.viewport.desktop\": \"Desktop\",\n \"settings.viewport.mobile\": \"Mobile\",\n \"settings.constraint.title\": \"Subject exceeds the channel limit:\",\n \"settings.constraint.body\": \"Body exceeds the channel limit:\",\n \"settings.tab.messages\": \"Messages\",\n \"settings.tab.routing\": \"Routing\",\n \"settings.policiesTitle\": \"Allowed channels per topic\",\n \"settings.policiesHint\": \"Company decision. A channel turned off here never sends, even if the recipient opted in.\",\n \"settings.savePolicies\": \"Save routing\",\n \"settings.discard\": \"Discard\"\n}\n","/**\n * Copyright (c) 2026 Ada Technology. MIT License.\n *\n * Nenhum texto visível vive em tag ou prop (`web.md` §6). O host sobrescreve chaves pontuais via\n * `messageOverrides` sem precisar fornecer um locale inteiro.\n */\n\nimport ptBR from './pt-BR.json'\nimport en from './en.json'\n\nexport type NotificationMessages = typeof ptBR\nexport type NotificationLocale = 'pt-BR' | 'en'\n\nexport const DEFAULT_LOCALE: NotificationLocale = 'pt-BR'\n\nconst MESSAGES_BY_LOCALE: Record<NotificationLocale, NotificationMessages> = {\n 'pt-BR': ptBR,\n en: en as NotificationMessages,\n}\n\nexport function resolveMessages(locale: NotificationLocale): NotificationMessages {\n return MESSAGES_BY_LOCALE[locale] ?? MESSAGES_BY_LOCALE[DEFAULT_LOCALE]\n}\n","/**\n * Copyright (c) 2026 Ada Technology. MIT License.\n *\n * Camada headless — a válvula de escape do item 4 da §4 da regra de módulos plugáveis: quando a\n * tela default não serve, o produto monta a própria sobre estes mesmos hooks e continua herdando\n * upgrades de lógica.\n */\n\nimport { useInfiniteQuery, useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport type { NotificationSummary } from '@adatechnology/notification-contracts'\n\nimport { useNotificationContext } from '../NotificationProvider'\nimport { NOTIFICATION_QUERY_KEYS } from './queryKeys'\n\nexport type UseNotificationsOptions = {\n readonly category?: string\n readonly read?: boolean\n readonly perPage?: number\n}\n\nexport function useNotifications(options: UseNotificationsOptions = {}) {\n const { client } = useNotificationContext()\n\n return useInfiniteQuery({\n queryKey: NOTIFICATION_QUERY_KEYS.list({ category: options.category, read: options.read }),\n initialPageParam: undefined as string | undefined,\n queryFn: ({ pageParam }) =>\n client.listNotifications({\n category: options.category,\n read: options.read,\n cursor: pageParam,\n perPage: options.perPage,\n }),\n getNextPageParam: (lastPage) => lastPage.nextCursor,\n })\n}\n\nexport function useUnreadCount() {\n const { client, pollIntervalSeconds } = useNotificationContext()\n\n return useQuery({\n queryKey: NOTIFICATION_QUERY_KEYS.unreadCount(),\n queryFn: () => client.countUnread(),\n // Polling é o fallback de quem não ligou o SSE. Com o stream ativo,\n // `useNotificationStream` invalida esta chave e o refetch acontece na hora.\n refetchInterval: pollIntervalSeconds > 0 ? pollIntervalSeconds * 1000 : false,\n })\n}\n\nexport function useMarkAsRead() {\n const { client } = useNotificationContext()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: (id: string) => client.markAsRead(id),\n async onMutate(id: string) {\n // Atualização otimista: marcar como lida é ação de um clique, e esperar o round-trip para\n // o badge cair faz a interface parecer travada.\n await queryClient.cancelQueries({ queryKey: NOTIFICATION_QUERY_KEYS.all })\n const previousCount = queryClient.getQueryData<number>(NOTIFICATION_QUERY_KEYS.unreadCount())\n\n queryClient.setQueryData<number>(NOTIFICATION_QUERY_KEYS.unreadCount(), (current) =>\n current === undefined ? current : Math.max(0, current - 1),\n )\n return { previousCount, id }\n },\n onError(_error, _id, context) {\n // Rollback: sem isto o badge ficaria mentindo até o próximo refetch.\n if (context?.previousCount !== undefined) {\n queryClient.setQueryData(NOTIFICATION_QUERY_KEYS.unreadCount(), context.previousCount)\n }\n },\n onSettled() {\n void queryClient.invalidateQueries({ queryKey: NOTIFICATION_QUERY_KEYS.all })\n },\n })\n}\n\nexport function useMarkAllAsRead() {\n const { client } = useNotificationContext()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: () => client.markAllAsRead(),\n onSettled() {\n void queryClient.invalidateQueries({ queryKey: NOTIFICATION_QUERY_KEYS.all })\n },\n })\n}\n\nexport function useDeleteNotification() {\n const { client } = useNotificationContext()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: (id: string) => client.deleteNotification(id),\n onSettled() {\n void queryClient.invalidateQueries({ queryKey: NOTIFICATION_QUERY_KEYS.all })\n },\n })\n}\n\n/** Achata as páginas do infinite query — a lista quase sempre quer o array direto. */\nexport function flattenNotificationPages(\n pages: readonly { data: readonly NotificationSummary[] }[] | undefined,\n): readonly NotificationSummary[] {\n return pages?.flatMap((page) => page.data) ?? []\n}\n","/**\n * Copyright (c) 2026 Ada Technology. MIT License.\n *\n * Chaves centralizadas: o sino e a lista leem o mesmo `unreadCount`, e uma invalidação precisa\n * atingir os dois. Chave montada inline em cada hook é como badge e lista passam a mostrar\n * números diferentes.\n */\n\nexport const NOTIFICATION_QUERY_KEYS = {\n all: ['notifications'] as const,\n list: (filters: { category?: string; read?: boolean }) => ['notifications', 'list', filters] as const,\n unreadCount: () => ['notifications', 'unread-count'] as const,\n preferences: () => ['notifications', 'preferences'] as const,\n templates: () => ['notifications', 'templates'] as const,\n templateVariables: () => ['notifications', 'template-variables'] as const,\n categoryPolicies: () => ['notifications', 'category-policies'] as const,\n} as const\n","/**\n * Copyright (c) 2026 Ada Technology. MIT License.\n */\n\nimport { useEffect } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { subscribeToNotificationStream } from '@adatechnology/notification-client'\n\nimport { useNotificationContext } from '../NotificationProvider'\nimport { NOTIFICATION_QUERY_KEYS } from './queryKeys'\n\nexport type UseNotificationStreamOptions = {\n /** Desligado por omissão: abrir SSE é decisão do host, que sabe se o backend expõe a rota. */\n readonly enabled?: boolean\n readonly onEvent?: (event: { event: string; data: unknown }) => void\n}\n\n/**\n * Liga o SSE do inbox ao cache do TanStack: cada evento invalida as chaves, e o badge e a lista\n * atualizam juntos. `useEffect` aqui é o uso correto do hook — sincronizar com um sistema externo\n * (`react.md`, \"useEffect só para sincronizar com sistemas externos\"), não transformar dado.\n */\nexport function useNotificationStream(options: UseNotificationStreamOptions = {}): void {\n const { client } = useNotificationContext()\n const queryClient = useQueryClient()\n const enabled = options.enabled ?? false\n const onEvent = options.onEvent\n\n useEffect(() => {\n if (!enabled) return\n\n let subscription: { close(): void } | undefined\n let cancelled = false\n\n void client.resolveStreamRequest().then(({ url, headers }) => {\n // A resolução do token é assíncrona; se o componente desmontou nesse meio-tempo, não abre\n // conexão nenhuma — senão sobraria um stream órfão a cada navegação rápida.\n if (cancelled) return\n\n subscription = subscribeToNotificationStream({\n url,\n headers,\n onEvent: (event) => {\n onEvent?.(event)\n void queryClient.invalidateQueries({ queryKey: NOTIFICATION_QUERY_KEYS.all })\n },\n })\n })\n\n return () => {\n cancelled = true\n subscription?.close()\n }\n }, [client, queryClient, enabled, onEvent])\n}\n","/**\n * Copyright (c) 2026 Ada Technology. MIT License.\n *\n * O roteamento: por quais canais cada categoria PODE sair, decidido pela empresa.\n *\n * É a camada que faltava. O chamador já podia enumerar canais em cada `sendNotification`, e quem\n * recebe já tinha preferência — mas \"cobrança nunca sai por SMS\" não cabia em nenhum dos dois:\n * o primeiro espalha a decisão por todo o código, o segundo deixa ela na mão do destinatário.\n *\n * O modelo aqui é de teto, não de piso: desligar barra o canal para todo mundo; ligar apenas\n * permite, e a preferência de quem recebe continua valendo por cima.\n */\n\nimport { useMemo, useState } from 'react'\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport type { NotificationCategoryPolicy } from '@adatechnology/notification-contracts'\n\nimport { useNotificationContext } from '../NotificationProvider'\nimport { NOTIFICATION_QUERY_KEYS } from './queryKeys'\n\nexport type UseCategoryPoliciesResult = {\n readonly isLoading: boolean\n readonly isSaving: boolean\n readonly error: string | undefined\n readonly isDirty: boolean\n /** Linha ausente é permitido — o mesmo default do servidor, para a tela não mentir. */\n isAllowed: (params: { category: string; channel: string }) => boolean\n toggle: (params: { category: string; channel: string }) => void\n save: () => void\n reset: () => void\n}\n\nfunction identityOf(params: { category: string; channel: string }): string {\n return `${params.category}:${params.channel}`\n}\n\nexport function useCategoryPolicies(): UseCategoryPoliciesResult {\n const { client } = useNotificationContext()\n const queryClient = useQueryClient()\n\n const policiesQuery = useQuery({\n queryKey: NOTIFICATION_QUERY_KEYS.categoryPolicies(),\n queryFn: () => client.getCategoryPolicies(),\n })\n\n const mutation = useMutation({\n mutationFn: (policies: readonly NotificationCategoryPolicy[]) => client.updateCategoryPolicies(policies),\n onSuccess() {\n void queryClient.invalidateQueries({ queryKey: NOTIFICATION_QUERY_KEYS.categoryPolicies() })\n },\n })\n\n /**\n * O rascunho guarda só o que foi TOCADO, não uma cópia do conjunto inteiro. Com a cópia, salvar\n * gravaria linha para toda combinação exibida na tela — e a ausência de linha, que é o default\n * \"permitido\", viraria centenas de registros de `enabled: true` sem significado.\n */\n const [touched, setTouched] = useState<Record<string, boolean>>({})\n\n const saved = useMemo(() => {\n const byIdentity = new Map<string, boolean>()\n for (const policy of policiesQuery.data ?? []) byIdentity.set(identityOf(policy), policy.enabled)\n return byIdentity\n }, [policiesQuery.data])\n\n function isAllowed(params: { category: string; channel: string }): boolean {\n const identity = identityOf(params)\n return touched[identity] ?? saved.get(identity) ?? true\n }\n\n return {\n isLoading: policiesQuery.isLoading,\n isSaving: mutation.isPending,\n error: mutation.error?.message,\n isDirty: Object.keys(touched).length > 0,\n isAllowed,\n\n toggle(params) {\n const identity = identityOf(params)\n setTouched((current) => ({ ...current, [identity]: !isAllowed(params) }))\n },\n\n save() {\n // Só as categorias tocadas vão no corpo: o servidor substitui categoria a categoria, e\n // mandar o conjunto inteiro apagaria e reescreveria política que ninguém editou.\n const categories = new Set(Object.keys(touched).map((identity) => identity.split(':')[0] ?? ''))\n const policies: NotificationCategoryPolicy[] = []\n for (const category of categories) {\n const channels = new Set([\n ...[...saved.keys()].filter((identity) => identity.startsWith(`${category}:`)),\n ...Object.keys(touched).filter((identity) => identity.startsWith(`${category}:`)),\n ])\n for (const identity of channels) {\n const channel = identity.slice(category.length + 1)\n policies.push({\n category,\n channel: channel as NotificationCategoryPolicy['channel'],\n enabled: isAllowed({ category, channel }),\n })\n }\n }\n mutation.mutate(policies, { onSuccess: () => setTouched({}) })\n },\n\n reset() {\n setTouched({})\n },\n }\n}\n","/**\n * Copyright (c) 2026 Ada Technology. MIT License.\n */\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport type { NotificationPreference, UpsertTemplateBody } from '@adatechnology/notification-contracts'\n\nimport { useNotificationContext } from '../NotificationProvider'\nimport { NOTIFICATION_QUERY_KEYS } from './queryKeys'\n\nexport function usePreferences() {\n const { client } = useNotificationContext()\n\n return useQuery({\n queryKey: NOTIFICATION_QUERY_KEYS.preferences(),\n queryFn: () => client.getPreferences(),\n })\n}\n\nexport function useUpdatePreferences() {\n const { client } = useNotificationContext()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: (preferences: readonly NotificationPreference[]) => client.updatePreferences(preferences),\n onSuccess(saved) {\n // A resposta já é o estado persistido — usar direto evita um refetch e o piscar do painel\n // entre o valor otimista e o confirmado.\n queryClient.setQueryData(NOTIFICATION_QUERY_KEYS.preferences(), saved)\n },\n })\n}\n\nexport function useTemplates() {\n const { client } = useNotificationContext()\n\n return useQuery({\n queryKey: NOTIFICATION_QUERY_KEYS.templates(),\n queryFn: () => client.listTemplates(),\n })\n}\n\n/**\n * Salva uma VERSÃO nova do template. É o que a tela de configuração usa para o lojista mudar a copy\n * sem deploy.\n *\n * Invalida em vez de escrever no cache: o servidor decide o número da versão, então o objeto salvo\n * traz um campo que o otimista não teria como prever — e mostrar \"versão 3\" quando o banco gravou 4\n * confunde exatamente quem está tentando conferir o que salvou.\n */\nexport function useUpsertTemplate() {\n const { client } = useNotificationContext()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: (input: UpsertTemplateBody) => client.upsertTemplate(input),\n onSuccess() {\n void queryClient.invalidateQueries({ queryKey: NOTIFICATION_QUERY_KEYS.templates() })\n },\n })\n}\n\n/**\n * O catálogo é config do host: muda com deploy, não com uso. `staleTime: Infinity` evita refetch a\n * cada foco de janela por um dado que não muda durante a sessão.\n */\nexport function useTemplateVariables() {\n const { client } = useNotificationContext()\n\n return useQuery({\n queryKey: NOTIFICATION_QUERY_KEYS.templateVariables(),\n queryFn: () => client.listTemplateVariables(),\n staleTime: Number.POSITIVE_INFINITY,\n })\n}\n\n/**\n * Desativa o template. Invalida a lista pelo mesmo motivo do upsert: o servidor derruba TODAS as\n * versões ativas da identidade, e um cache otimista que removesse só a linha clicada mostraria a\n * versão anterior de volta na tela.\n */\nexport function useDeactivateTemplate() {\n const { client } = useNotificationContext()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: (id: string) => client.deactivateTemplate(id),\n onSuccess() {\n void queryClient.invalidateQueries({ queryKey: NOTIFICATION_QUERY_KEYS.templates() })\n },\n })\n}\n","/**\n * Copyright (c) 2026 Ada Technology. MIT License.\n *\n * Quando o aviso chegou, dito do jeito que se diz em voz alta.\n *\n * `Intl` faz o trabalho de idioma — o pacote não guarda \"há\", \"ago\" nem nome de mês em lugar nenhum,\n * o que manteria `web.md` §6 de pé e ainda assim quebraria no primeiro locale novo. O que é decisão\n * nossa são as faixas: segundo, minuto, hora, dia, e a virada para data absoluta.\n */\n\nconst SECOND = 1_000\nconst MINUTE = 60 * SECOND\nconst HOUR = 60 * MINUTE\nconst DAY = 24 * HOUR\n\n/**\n * Passada uma semana, o relativo para de informar e passa a exigir conta: \"há 43 dias\" é um convite\n * a abrir o calendário. A data, o leitor lê.\n */\nconst RELATIVE_HORIZON = 7 * DAY\n\nfunction parseInstant(isoTimestamp: string): Date | undefined {\n const instant = new Date(isoTimestamp)\n return Number.isNaN(instant.getTime()) ? undefined : instant\n}\n\nexport function formatNotificationTime(isoTimestamp: string, locale: string, now: Date): string {\n const instant = parseInstant(isoTimestamp)\n if (!instant) return ''\n\n // Relógio do navegador adiantado é rotina; anunciar \"daqui a 2 minutos\" para algo que já chegou\n // não é. O piso em zero transforma o desvio em \"agora\", que é o que de fato aconteceu.\n const elapsed = Math.max(0, now.getTime() - instant.getTime())\n\n if (elapsed >= RELATIVE_HORIZON) {\n return new Intl.DateTimeFormat(locale, { day: '2-digit', month: '2-digit', year: 'numeric' }).format(instant)\n }\n\n // `numeric: 'auto'` é o que troca \"há 1 dia\" por \"ontem\" e \"há 0 segundos\" por \"agora\".\n const relative = new Intl.RelativeTimeFormat(locale, { numeric: 'auto' })\n\n if (elapsed < MINUTE) return relative.format(0, 'second')\n if (elapsed < HOUR) return relative.format(-Math.floor(elapsed / MINUTE), 'minute')\n if (elapsed < DAY) return relative.format(-Math.floor(elapsed / HOUR), 'hour')\n return relative.format(-Math.floor(elapsed / DAY), 'day')\n}\n\n/** O instante inteiro, para o `title` — é a hora que o texto relativo esconde. */\nexport function formatNotificationTimestamp(isoTimestamp: string, locale: string): string {\n const instant = parseInstant(isoTimestamp)\n if (!instant) return ''\n\n return new Intl.DateTimeFormat(locale, { dateStyle: 'short', timeStyle: 'short' }).format(instant)\n}\n","/**\n * Copyright (c) 2026 Ada Technology. MIT License.\n *\n * A lógica do editor de template, que estava reimplementada no host.\n *\n * Ela veio de `quickcart/modules/notifications/hooks/useNotificationSettings.hook.ts` — 207 linhas\n * que o segundo produto reescreveria, com as mesmas quatro decisões sutis para redescobrir. Elas\n * são o motivo de isto ser pacote e não exemplo:\n *\n * 1. **Versão ativa mais alta.** A rota devolve o histórico inteiro, correto para auditoria; na tela\n * isso faz a mesma mensagem aparecer três vezes e ninguém sabe qual está no ar.\n * 2. **Seleção pelo id, não pelo objeto.** Salvar cria versão nova no servidor; segurando o objeto,\n * o editor mostra a versão que já não é a ativa e a gravação seguinte parte de um texto velho.\n * 3. **Campo vazio é ausência.** Gravar `subject: ''` faz o renderer tratar como subject existente e\n * derivar título vazio, em vez de cair no fallback que usa o corpo.\n * 4. **Preview pelo `renderTemplate` do contracts**, o mesmo do envio. Reimplementar a interpolação\n * dá um preview que confere hoje e mente quando o renderer mudar.\n *\n * A criação de template novo trouxe uma quinta: **a identidade é imutável depois de criada**.\n * `key`+`channel`+`locale` é o que o `sendNotification` procura; deixar editar num template\n * existente não seria edição, seria criar outro e deixar o antigo órfão no ar.\n */\n\nimport { useMemo, useState } from 'react'\nimport {\n PREVIEW_VIEWPORT_BY_CHANNEL,\n buildPreviewPayload,\n diffTemplateVariables,\n renderTemplate,\n} from '@adatechnology/notification-contracts'\nimport type {\n NotificationChannel,\n NotificationTemplate,\n PreviewViewportSpec,\n RenderedTemplatePreview,\n TemplateVariableDefinition,\n TemplateVariableDiff,\n UpsertTemplateBody,\n} from '@adatechnology/notification-contracts'\n\nimport { useDeactivateTemplate, useTemplateVariables, useTemplates, useUpsertTemplate } from './usePreferences'\n\nexport type TemplateDraft = {\n readonly key: string\n readonly channel: string\n readonly locale: string\n readonly subject: string\n readonly body: string\n readonly whatsappTemplateName: string\n}\n\nexport type TemplateDraftField = 'subject' | 'body'\n\nexport type TemplatePreviewFrame = PreviewViewportSpec & {\n readonly rendered: RenderedTemplatePreview\n}\n\nfunction toDraft(template: NotificationTemplate): TemplateDraft {\n return {\n key: template.key,\n channel: template.channel,\n locale: template.locale,\n subject: template.subject ?? '',\n body: template.body,\n whatsappTemplateName: template.whatsappTemplateName ?? '',\n }\n}\n\nfunction buildEmptyDraft(params: { channel: string; locale: string }): TemplateDraft {\n return { key: '', channel: params.channel, locale: params.locale, subject: '', body: '', whatsappTemplateName: '' }\n}\n\nexport type UseTemplateEditorParams = {\n /**\n * Valores de exemplo do preview. Hoje o padrão vem do catálogo de variáveis do servidor; isto\n * continua existindo para o produto sobrescrever um exemplo pontual sem mexer no catálogo.\n */\n readonly previewPayload?: Readonly<Record<string, unknown>>\n /** Canal e locale de um template novo, antes de o operador escolher. */\n readonly defaultChannel?: string\n readonly defaultLocale?: string\n}\n\nexport type UseTemplateEditorResult = {\n readonly templates: readonly NotificationTemplate[]\n readonly isLoading: boolean\n readonly isSaving: boolean\n readonly isDeactivating: boolean\n readonly error: string | undefined\n readonly selected: NotificationTemplate | undefined\n readonly draft: TemplateDraft | undefined\n /** `true` enquanto o rascunho é um template que ainda não existe no servidor. */\n readonly isNew: boolean\n /** Identidade travada — `false` só durante a criação. */\n readonly isIdentityLocked: boolean\n /** Os dois quadros do preview, na ordem em que a tela desenha. */\n readonly previews: readonly TemplatePreviewFrame[]\n /** As variáveis que esta `key` declara. Vazio quando o catálogo não conhece a chave. */\n readonly variables: readonly TemplateVariableDefinition[]\n readonly variableDiff: TemplateVariableDiff\n readonly isDirty: boolean\n readonly canSave: boolean\n select: (template: NotificationTemplate) => void\n startNew: () => void\n update: (patch: Partial<TemplateDraft>) => void\n /** Insere `{{nome}}` na posição do cursor. O operador nunca digita o nome à mão. */\n insertVariable: (params: { name: string; field: TemplateDraftField; cursorIndex: number }) => void\n save: () => void\n deactivate: (id: string) => void\n clear: () => void\n}\n\nexport function useTemplateEditor(params: UseTemplateEditorParams = {}): UseTemplateEditorResult {\n const templatesQuery = useTemplates()\n const variablesQuery = useTemplateVariables()\n const upsert = useUpsertTemplate()\n const deactivateMutation = useDeactivateTemplate()\n\n const [selectedId, setSelectedId] = useState<string | undefined>(undefined)\n const [draft, setDraft] = useState<TemplateDraft | undefined>(undefined)\n const [isNew, setIsNew] = useState(false)\n\n /** Decisão 1: só a ativa mais alta por `key`+`channel`+`locale` — a mesma que o envio faz. */\n const templates = useMemo(() => {\n const activeByIdentity = new Map<string, NotificationTemplate>()\n for (const template of templatesQuery.data ?? []) {\n if (!template.active) continue\n const identity = `${template.key}:${template.channel}:${template.locale}`\n const current = activeByIdentity.get(identity)\n if (!current || template.version > current.version) activeByIdentity.set(identity, template)\n }\n return [...activeByIdentity.values()].sort(\n (left, right) => left.key.localeCompare(right.key) || left.channel.localeCompare(right.channel),\n )\n }, [templatesQuery.data])\n\n /** Decisão 2: derivado do id. */\n const selected = useMemo(() => templates.find((template) => template.id === selectedId), [templates, selectedId])\n\n const variables = useMemo(() => (draft ? (variablesQuery.data?.[draft.key] ?? []) : []), [variablesQuery.data, draft])\n\n const variableDiff = useMemo(\n () =>\n diffTemplateVariables({\n body: draft?.body ?? '',\n subject: draft?.subject || undefined,\n // Chave sem entrada no catálogo é catálogo não declarado, não catálogo vazio — o servidor\n // aceita qualquer variável nesse caso, e a tela não pode acusar o que a rota vai gravar.\n variables: draft && variablesQuery.data?.[draft.key] ? variables : undefined,\n }),\n [draft, variables, variablesQuery.data],\n )\n\n /** Decisão 4: o mesmo render do envio, uma vez por viewport do canal. */\n const previews = useMemo<readonly TemplatePreviewFrame[]>(() => {\n if (!draft) return []\n const payload = { ...buildPreviewPayload(variables), ...(params.previewPayload ?? {}) }\n const rendered = renderTemplate({\n channel: draft.channel,\n subject: draft.subject || undefined,\n body: draft.body,\n payload,\n })\n const viewports = PREVIEW_VIEWPORT_BY_CHANNEL[draft.channel as NotificationChannel] ?? []\n return viewports.map((viewport) => ({ ...viewport, rendered }))\n }, [draft, variables, params.previewPayload])\n\n const isDirty = useMemo(() => {\n if (!draft) return false\n if (isNew) return draft.key.length > 0 || draft.body.length > 0\n if (!selected) return false\n const original = toDraft(selected)\n return (Object.keys(original) as (keyof TemplateDraft)[]).some((field) => original[field] !== draft[field])\n }, [draft, selected, isNew])\n\n return {\n templates,\n isLoading: templatesQuery.isLoading,\n isSaving: upsert.isPending,\n isDeactivating: deactivateMutation.isPending,\n error: upsert.error?.message ?? deactivateMutation.error?.message,\n selected,\n draft,\n isNew,\n isIdentityLocked: !isNew,\n previews,\n variables,\n variableDiff,\n isDirty,\n // A variável desconhecida é recusada pelo servidor com 400; bloquear o botão evita a ida\n // perdida, sem virar a única defesa — a validação continua sendo a da rota.\n canSave: Boolean(draft?.key && draft.body) && variableDiff.unknown.length === 0,\n\n select(template) {\n setSelectedId(template.id)\n setDraft(toDraft(template))\n setIsNew(false)\n },\n\n startNew() {\n setSelectedId(undefined)\n setIsNew(true)\n setDraft(buildEmptyDraft({ channel: params.defaultChannel ?? 'email', locale: params.defaultLocale ?? 'pt-BR' }))\n },\n\n update(patch) {\n setDraft((current) => (current ? { ...current, ...patch } : current))\n },\n\n insertVariable({ name, field, cursorIndex }) {\n setDraft((current) => {\n if (!current) return current\n const text = current[field]\n const at = Math.min(Math.max(cursorIndex, 0), text.length)\n return { ...current, [field]: `${text.slice(0, at)}{{${name}}}${text.slice(at)}` }\n })\n },\n\n save() {\n if (!draft) return\n const body: UpsertTemplateBody = {\n key: draft.key,\n channel: draft.channel as UpsertTemplateBody['channel'],\n locale: draft.locale,\n active: true,\n body: draft.body,\n ...(draft.subject ? { subject: draft.subject } : {}),\n ...(draft.whatsappTemplateName ? { whatsappTemplateName: draft.whatsappTemplateName } : {}),\n }\n upsert.mutate(body, {\n onSuccess: () => {\n setSelectedId(undefined)\n setDraft(undefined)\n setIsNew(false)\n },\n })\n },\n\n deactivate(id) {\n deactivateMutation.mutate(id, {\n onSuccess: () => {\n if (selectedId !== id) return\n setSelectedId(undefined)\n setDraft(undefined)\n },\n })\n },\n\n clear() {\n setSelectedId(undefined)\n setDraft(undefined)\n setIsNew(false)\n },\n }\n}\n"],"mappings":"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","names":["useQueryClient","useQueryClient","useMemo","useMutation","useQuery","useQueryClient","useQueryClient","useQuery","useMutation","useMemo","useMutation","useQuery","useQueryClient","useQuery","useQueryClient","useMutation","useMemo","useState","useState","useMemo"]}